Files
Laucha1312 fdd0fef3f0 2354
2026-06-04 15:19:42 -03:00

1686 lines
49 KiB
CSS
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* =====================================================================
ONAPB — Kinetic Arena v3
Capa de innovación visual sobre kinetic-arena.css (sin tocar colores).
Carga DESPUÉS de base.css y kinetic-arena.css.
===================================================================== */
/* ─────────────────────────────────────────────────────────────────────
01. TOKENS DE MOTION
───────────────────────────────────────────────────────────────────── */
:root {
--ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
--ease-out-soft: cubic-bezier(0.16, 1, 0.3, 1);
--ease-power: cubic-bezier(0.83, 0, 0.17, 1);
--ease-arc: cubic-bezier(0.65, 0.05, 0.36, 1);
--dur-snap: 140ms;
--dur-quick: 220ms;
--dur-base: 360ms;
--dur-soft: 560ms;
--dur-stage: 900ms;
--primary-glow: 0 0 0 0 rgba(194, 0, 0, 0.45);
--primary-shadow-soft: 0 18px 40px -22px rgba(194, 0, 0, 0.55);
--kinetic-shadow-deep: 0 40px 80px -30px rgba(26, 18, 8, 0.35);
--kinetic-shadow-card: 0 22px 45px -28px rgba(26, 18, 8, 0.28);
--grain-mix: multiply;
}
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.001ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.001ms !important;
scroll-behavior: auto !important;
}
}
/* ─────────────────────────────────────────────────────────────────────
02. SCROLLBAR PERSONALIZADA
───────────────────────────────────────────────────────────────────── */
* {
scrollbar-width: thin;
scrollbar-color: var(--primary) transparent;
}
::-webkit-scrollbar {
width: 10px;
height: 10px;
}
::-webkit-scrollbar-track {
background: var(--surface-container-low);
}
::-webkit-scrollbar-thumb {
background: linear-gradient(180deg, var(--primary), var(--primary-deep));
border-radius: 999px;
border: 2px solid var(--surface-container-low);
}
::-webkit-scrollbar-thumb:hover {
background: var(--primary-deep);
}
/* ─────────────────────────────────────────────────────────────────────
03. BARRA DE PROGRESO DE LECTURA (top)
───────────────────────────────────────────────────────────────────── */
#kinetic-reading-bar {
position: fixed;
top: 0;
left: 0;
height: 3px;
width: 0%;
background: linear-gradient(90deg, var(--primary), #ff3232, var(--primary-deep));
background-size: 200% 100%;
animation: barShimmer 3s linear infinite;
z-index: 2000;
transition: width 0.12s linear;
box-shadow: 0 0 12px rgba(194, 0, 0, 0.6);
pointer-events: none;
}
@keyframes barShimmer {
from {
background-position: 0% 0;
}
to {
background-position: 200% 0;
}
}
/* ─────────────────────────────────────────────────────────────────────
04. CURSOR PERSONALIZADO (sólo desktop con puntero fino)
───────────────────────────────────────────────────────────────────── */
@media (hover: hover) and (pointer: fine) {
body.kinetic-cursor-on,
body.kinetic-cursor-on * {
cursor: none;
}
body.kinetic-cursor-on input,
body.kinetic-cursor-on textarea,
body.kinetic-cursor-on select {
cursor: text;
}
.kinetic-cursor-dot,
.kinetic-cursor-ring {
position: fixed;
top: 0;
left: 0;
pointer-events: none;
z-index: 9999;
will-change: transform;
/* sin mix-blend-mode: era el responsable de "perder" el cursor en fondos cálidos */
}
.kinetic-cursor-dot {
width: 10px;
height: 10px;
background: var(--primary);
border-radius: 50%;
transform: translate(-50%, -50%);
/* Doble anillo: borde negro fino para alto contraste sobre cualquier fondo */
border: 2px solid #111;
box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.6),
0 2px 8px rgba(0, 0, 0, 0.45);
transition: transform var(--dur-snap) var(--ease-spring),
width var(--dur-quick), height var(--dur-quick),
background var(--dur-quick), border-color var(--dur-quick);
}
.kinetic-cursor-ring {
width: 38px;
height: 38px;
/* Anillo rojo grueso con outline negro para que se vea sobre claro y oscuro */
border: 3px solid var(--primary);
outline: 2px solid #111;
outline-offset: -1px;
border-radius: 50%;
background: rgba(255, 255, 255, 0.05);
box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.5),
0 4px 14px rgba(0, 0, 0, 0.35);
transform: translate(-50%, -50%);
transition: transform 0.18s var(--ease-out-soft),
width var(--dur-quick), height var(--dur-quick),
border-color var(--dur-quick),
opacity var(--dur-quick);
}
.kinetic-cursor-ring.is-hover {
width: 60px;
height: 60px;
border-color: var(--primary-deep);
background: rgba(194, 0, 0, 0.18);
outline-color: #000;
}
.kinetic-cursor-dot.is-hover {
width: 6px;
height: 6px;
background: #fff;
border-color: var(--primary-deep);
}
}
/* ─────────────────────────────────────────────────────────────────────
05. NAVBAR — efecto glass kinético + indicador animado
───────────────────────────────────────────────────────────────────── */
.custom-navbar {
transition: background-color 0.4s var(--ease-out-soft),
border-color 0.4s var(--ease-out-soft),
box-shadow 0.4s var(--ease-out-soft),
padding 0.3s var(--ease-out-soft) !important;
}
.custom-navbar.is-scrolled {
background-color: rgba(245, 243, 239, 0.78) !important;
backdrop-filter: blur(28px) saturate(200%);
-webkit-backdrop-filter: blur(28px) saturate(200%);
border-bottom-color: rgba(194, 0, 0, 0.15) !important;
box-shadow: 0 8px 30px -20px rgba(26, 18, 8, 0.18) !important;
padding: 6px 0 !important;
}
.custom-navbar .navbar-logo {
transition: transform 0.45s var(--ease-spring), filter 0.4s ease;
}
.custom-navbar .navbar-brand:hover .navbar-logo {
transform: rotate(-6deg) scale(1.06);
filter: drop-shadow(0 6px 14px rgba(194, 0, 0, 0.35));
}
.custom-navbar .nav-link {
overflow: hidden;
}
.custom-navbar .nav-link::before {
content: '';
position: absolute;
left: 14px;
right: 14px;
bottom: 4px;
height: 2px;
background: var(--primary);
transform: scaleX(0);
transform-origin: right center;
transition: transform 0.42s var(--ease-arc);
}
.custom-navbar .nav-link:hover::before,
.custom-navbar .nav-link.active::before {
transform: scaleX(1);
transform-origin: left center;
}
/* Cuadrito decorativo en active */
.custom-navbar .nav-link.active::after {
content: '';
position: absolute;
top: 6px;
left: 6px;
width: 4px;
height: 4px;
background: var(--primary);
display: block !important;
animation: kineticBlink 1.6s steps(2, jump-none) infinite;
}
@keyframes kineticBlink {
50% {
opacity: 0.2;
}
}
/* Bell de notificaciones */
#notif-bell .bi-bell-fill {
transition: transform 0.35s var(--ease-spring);
}
#notif-bell:hover .bi-bell-fill {
animation: bellShake 0.6s var(--ease-out-soft);
}
@keyframes bellShake {
0%,
100% {
transform: rotate(0);
}
20% {
transform: rotate(15deg);
}
40% {
transform: rotate(-12deg);
}
60% {
transform: rotate(8deg);
}
80% {
transform: rotate(-4deg);
}
}
#notif-badge {
box-shadow: 0 0 0 0 rgba(194, 0, 0, 0.7);
animation: badgeRing 1.8s var(--ease-out-soft) infinite;
}
@keyframes badgeRing {
0% {
box-shadow: 0 0 0 0 rgba(194, 0, 0, 0.6);
}
70% {
box-shadow: 0 0 0 12px rgba(194, 0, 0, 0);
}
100% {
box-shadow: 0 0 0 0 rgba(194, 0, 0, 0);
}
}
/* ─────────────────────────────────────────────────────────────────────
06. CARDS KINÉTICAS — tilt + spotlight + reveal
───────────────────────────────────────────────────────────────────── */
.kinetic-card {
position: relative;
overflow: hidden;
transform-style: preserve-3d;
transition:
transform 0.55s var(--ease-out-soft),
box-shadow 0.55s var(--ease-out-soft),
border-color 0.45s ease;
}
.kinetic-card::before {
content: '';
position: absolute;
inset: 0;
background: radial-gradient(420px circle at var(--mx, 50%) var(--my, 50%),
rgba(194, 0, 0, 0.08),
transparent 55%);
opacity: 0;
transition: opacity 0.45s ease;
pointer-events: none;
z-index: 1;
}
.kinetic-card::after {
content: '';
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: 3px;
background: linear-gradient(180deg, var(--primary), var(--primary-deep));
transform: scaleY(0);
transform-origin: top center;
transition: transform 0.5s var(--ease-arc);
z-index: 2;
}
.kinetic-card:hover {
transform: translateY(-6px);
box-shadow: var(--kinetic-shadow-card);
border-color: rgba(194, 0, 0, 0.3);
}
.kinetic-card:hover::before {
opacity: 1;
}
.kinetic-card:hover::after {
transform: scaleY(1);
}
.kinetic-card>* {
position: relative;
z-index: 3;
}
/* Variante 3D tilt (activado vía JS con [data-tilt]) */
[data-tilt] {
transform: perspective(900px) rotateX(var(--rx, 0deg)) rotateY(var(--ry, 0deg));
transition: transform 0.25s var(--ease-out-soft);
will-change: transform;
}
[data-tilt].is-tilting {
transition: transform 0.05s linear;
}
/* ─────────────────────────────────────────────────────────────────────
07. BOTONES KINÉTICOS — magnético + ripple + sweep
───────────────────────────────────────────────────────────────────── */
.btn-kinetic-primary,
.btn,
.btn-admin-primary {
position: relative;
isolation: isolate;
overflow: hidden;
}
.btn-kinetic-primary {
transition:
background-color var(--dur-quick) ease,
color var(--dur-quick) ease,
transform var(--dur-quick) var(--ease-spring),
box-shadow var(--dur-base) var(--ease-out-soft),
letter-spacing var(--dur-quick) ease !important;
}
.btn-kinetic-primary::after {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(120deg,
transparent 0%,
rgba(255, 255, 255, 0.28) 40%,
rgba(255, 255, 255, 0.55) 50%,
rgba(255, 255, 255, 0.28) 60%,
transparent 100%);
transform: translateX(-110%) skewX(-15deg);
transition: transform 0.65s var(--ease-arc);
z-index: 1;
pointer-events: none;
}
.btn-kinetic-primary:hover {
box-shadow: var(--primary-shadow-soft);
letter-spacing: 0.16em !important;
transform: translateY(-2px) !important;
}
.btn-kinetic-primary:hover::after {
transform: translateX(110%) skewX(-15deg);
}
.btn-kinetic-primary>* {
position: relative;
z-index: 2;
}
/* Ripple universal: agrega clase .kinetic-ripple */
.kinetic-ripple-wave {
position: absolute;
border-radius: 50%;
background: rgba(255, 255, 255, 0.45);
transform: translate(-50%, -50%) scale(0);
animation: ripple 0.6s var(--ease-out-soft);
pointer-events: none;
z-index: 0;
}
@keyframes ripple {
to {
transform: translate(-50%, -50%) scale(4);
opacity: 0;
}
}
/* Botón magnético */
[data-magnetic] {
transition: transform 0.22s var(--ease-out-soft);
will-change: transform;
}
/* ─────────────────────────────────────────────────────────────────────
08. HERO — text-reveal mask + parallax + CTA elevation
───────────────────────────────────────────────────────────────────── */
.hero-title {
/* Sin overflow: hidden global — el clipping del reveal lo hace cada .word.
Además agregamos padding-bottom para dar lugar a descenders (p, q, j, g, y). */
display: inline-block;
padding-bottom: 0.18em;
line-height: 1.02 !important;
}
.hero-title .word,
.kinetic-reveal-text .word {
display: inline-block;
overflow: hidden;
vertical-align: bottom;
/* Espacio para que los descenders no queden cortados por el overflow:hidden */
padding-bottom: 0.22em;
line-height: 1.05;
}
.hero-title .word>span,
.kinetic-reveal-text .word>span {
display: inline-block;
/* 130% > 100% + descender (~22%), garantiza ocultarlo completamente al inicio */
transform: translateY(130%);
transition: transform 0.95s var(--ease-arc);
}
/* Wrapper general del reveal-text */
.kinetic-reveal-text {
display: inline-block;
padding-bottom: 0.18em;
line-height: 1.05 !important;
}
/* Override global para todos los displays/headings: relajar line-height
demasiado ajustado del sistema base que recorta descenders. */
h1, h2, h3, h4, h5, h6,
.display-1, .display-2, .display-3,
.display-4, .display-5, .display-6,
.hero-title {
line-height: 1.05 !important;
padding-bottom: 0.08em;
}
/* Caso especial Antonio (font display) — necesita un poco más de aire */
.display-1, .display-2, .display-3, .hero-title {
padding-bottom: 0.12em;
}
.hero-title.is-in .word>span,
.kinetic-reveal-text.is-in .word>span {
transform: translateY(0);
}
.hero-title.is-in .word:nth-child(2)>span {
transition-delay: 0.08s;
}
.hero-title.is-in .word:nth-child(3)>span {
transition-delay: 0.16s;
}
.hero-title.is-in .word:nth-child(4)>span {
transition-delay: 0.24s;
}
.hero-title.is-in .word:nth-child(5)>span {
transition-delay: 0.32s;
}
.hero-title.is-in .word:nth-child(6)>span {
transition-delay: 0.40s;
}
.hero-title.is-in .word:nth-child(7)>span {
transition-delay: 0.48s;
}
.hero-title.is-in .word:nth-child(8)>span {
transition-delay: 0.56s;
}
/* Highlight con barrido tras el texto */
.kinetic-highlight {
position: relative;
display: inline-block;
color: var(--primary);
isolation: isolate;
}
.kinetic-highlight::before {
content: '';
position: absolute;
inset: 8% -4% 8% -4%;
background: rgba(194, 0, 0, 0.12);
transform: scaleX(0);
transform-origin: left center;
transition: transform 0.7s var(--ease-arc) 0.4s;
z-index: -1;
border-radius: 2px;
}
.kinetic-highlight.is-in::before {
transform: scaleX(1);
}
/* Hero parallax (clip-path) */
.hero-clip,
img.hero-clip {
transition: clip-path 1.2s var(--ease-arc), transform 6s var(--ease-out-soft);
will-change: transform;
}
.carousel-item.active img.hero-clip {
transform: scale(1.04);
}
/* ─────────────────────────────────────────────────────────────────────
09. REVEAL ON SCROLL — variantes
───────────────────────────────────────────────────────────────────── */
.kfx-reveal {
opacity: 0;
transition: opacity 0.7s var(--ease-out-soft),
transform 0.7s var(--ease-out-soft),
filter 0.7s var(--ease-out-soft),
clip-path 0.9s var(--ease-arc);
will-change: transform, opacity;
}
.kfx-reveal[data-fx="up"] {
transform: translateY(28px);
}
.kfx-reveal[data-fx="down"] {
transform: translateY(-28px);
}
.kfx-reveal[data-fx="left"] {
transform: translateX(-28px);
}
.kfx-reveal[data-fx="right"] {
transform: translateX(28px);
}
.kfx-reveal[data-fx="zoom"] {
transform: scale(0.92);
}
.kfx-reveal[data-fx="blur"] {
filter: blur(14px);
transform: translateY(12px);
}
.kfx-reveal[data-fx="curtain"] {
clip-path: inset(0 100% 0 0);
}
.kfx-reveal[data-fx="rise"] {
clip-path: inset(100% 0 0 0);
transform: translateY(20px);
}
.kfx-reveal.is-in {
opacity: 1;
transform: none;
filter: none;
clip-path: inset(0 0 0 0);
}
/* Stagger para hijos */
[data-stagger]>* {
opacity: 0;
transform: translateY(22px);
transition: opacity 0.65s var(--ease-out-soft), transform 0.65s var(--ease-out-soft);
}
[data-stagger].is-in>* {
opacity: 1;
transform: none;
}
[data-stagger].is-in>*:nth-child(1) {
transition-delay: 0.04s;
}
[data-stagger].is-in>*:nth-child(2) {
transition-delay: 0.10s;
}
[data-stagger].is-in>*:nth-child(3) {
transition-delay: 0.16s;
}
[data-stagger].is-in>*:nth-child(4) {
transition-delay: 0.22s;
}
[data-stagger].is-in>*:nth-child(5) {
transition-delay: 0.28s;
}
[data-stagger].is-in>*:nth-child(6) {
transition-delay: 0.34s;
}
[data-stagger].is-in>*:nth-child(7) {
transition-delay: 0.40s;
}
[data-stagger].is-in>*:nth-child(8) {
transition-delay: 0.46s;
}
[data-stagger].is-in>*:nth-child(9) {
transition-delay: 0.52s;
}
[data-stagger].is-in>*:nth-child(10) {
transition-delay: 0.58s;
}
/* Compatibilidad con animate-on-scroll original (mejorado) */
.animate-on-scroll {
transition:
opacity 0.75s var(--ease-out-soft),
transform 0.75s var(--ease-out-soft) !important;
}
/* ─────────────────────────────────────────────────────────────────────
10. CONTADORES Y MARCADOR LIVE
───────────────────────────────────────────────────────────────────── */
.kfx-counter {
font-family: var(--font-display) !important;
font-feature-settings: "tnum" 1, "lnum" 1;
font-variant-numeric: tabular-nums lining-nums;
display: inline-block;
}
.kfx-live-pill {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 6px 12px;
background: rgba(194, 0, 0, 0.08);
border: 1px solid rgba(194, 0, 0, 0.3);
border-radius: 999px;
color: var(--primary);
font-family: var(--font-body);
font-size: 0.7rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.18em;
}
.kfx-live-pill::before {
content: '';
width: 7px;
height: 7px;
border-radius: 50%;
background: var(--primary);
box-shadow: 0 0 0 0 rgba(194, 0, 0, 0.6);
animation: livePulseRing 1.8s ease-out infinite;
}
@keyframes livePulseRing {
0% {
box-shadow: 0 0 0 0 rgba(194, 0, 0, 0.6);
}
70% {
box-shadow: 0 0 0 12px rgba(194, 0, 0, 0);
}
100% {
box-shadow: 0 0 0 0 rgba(194, 0, 0, 0);
}
}
/* ─────────────────────────────────────────────────────────────────────
11. MARQUEE / TICKER (ej: sponsors, headlines)
───────────────────────────────────────────────────────────────────── */
.kfx-marquee {
overflow: hidden;
position: relative;
--marquee-speed: 40s;
-webkit-mask-image: linear-gradient(90deg, transparent, black 8%, black 92%, transparent);
mask-image: linear-gradient(90deg, transparent, black 8%, black 92%, transparent);
}
.kfx-marquee__track {
display: inline-flex;
gap: 4rem;
white-space: nowrap;
animation: marqueeSlide var(--marquee-speed) linear infinite;
}
.kfx-marquee:hover .kfx-marquee__track {
animation-play-state: paused;
}
@keyframes marqueeSlide {
from {
transform: translateX(0);
}
to {
transform: translateX(-50%);
}
}
/* ─────────────────────────────────────────────────────────────────────
12. INPUTS — focus glow + label flotante (opcional)
───────────────────────────────────────────────────────────────────── */
.form-control,
.form-select {
transition:
border-color 0.25s ease,
box-shadow 0.3s ease,
background-color 0.25s ease,
transform 0.2s ease !important;
}
.form-control:focus,
.form-select:focus {
box-shadow: 0 0 0 4px rgba(194, 0, 0, 0.10),
0 8px 22px -16px rgba(194, 0, 0, 0.6) !important;
transform: translateY(-1px);
}
/* Floating label compatible (envolver con .kfx-float) */
.kfx-float {
position: relative;
}
.kfx-float>.form-control {
padding-top: 1.4rem;
padding-bottom: 0.5rem;
}
.kfx-float>label {
position: absolute;
top: 0.85rem;
left: 0.95rem;
color: var(--on-surface-muted);
pointer-events: none;
transition: transform 0.2s var(--ease-out-soft), color 0.2s ease, font-size 0.2s ease;
font-size: 0.95rem;
transform-origin: left center;
}
.kfx-float>.form-control:focus+label,
.kfx-float>.form-control:not(:placeholder-shown)+label {
transform: translateY(-12px) scale(0.78);
color: var(--primary);
}
/* ─────────────────────────────────────────────────────────────────────
13. DIVIDERS Y SECCIONES KINÉTICAS
───────────────────────────────────────────────────────────────────── */
.kfx-section-tag {
display: inline-flex;
align-items: center;
gap: 0.75rem;
font-family: var(--font-body) !important;
font-size: 0.72rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.22em;
color: var(--primary);
margin-bottom: 0.75rem;
}
.kfx-section-tag::before {
content: '';
width: 32px;
height: 2px;
background: var(--primary);
transform-origin: left;
transform: scaleX(0);
transition: transform 0.7s var(--ease-arc);
}
.kfx-section-tag.is-in::before,
.kfx-reveal.is-in .kfx-section-tag::before {
transform: scaleX(1);
}
.kfx-divider-sweep {
position: relative;
height: 1px;
background: var(--outline-variant);
overflow: hidden;
margin: 3rem 0;
}
.kfx-divider-sweep::after {
content: '';
position: absolute;
inset: 0;
width: 60%;
background: linear-gradient(90deg, transparent, var(--primary), transparent);
animation: sweep 3.5s ease-in-out infinite;
}
@keyframes sweep {
0% {
transform: translateX(-110%);
}
100% {
transform: translateX(220%);
}
}
/* ─────────────────────────────────────────────────────────────────────
14. TABLAS — hover slide + zebra suave
───────────────────────────────────────────────────────────────────── */
.table tbody tr {
transition: background 0.2s ease, transform 0.25s var(--ease-out-soft);
}
.table tbody tr:hover {
background: rgba(194, 0, 0, 0.04);
}
.table tbody tr:hover td:first-child {
box-shadow: inset 3px 0 0 var(--primary);
}
.table-dark tbody tr:hover {
background: rgba(194, 0, 0, 0.18) !important;
}
/* Standings rank top-3 con resaltado */
#standingsCarousel tbody tr:nth-child(1) td:first-child {
color: #ffd34a !important;
font-weight: 800;
}
#standingsCarousel tbody tr:nth-child(2) td:first-child {
color: #d8d8d8 !important;
font-weight: 700;
}
#standingsCarousel tbody tr:nth-child(3) td:first-child {
color: #d28a4a !important;
font-weight: 700;
}
/* ─────────────────────────────────────────────────────────────────────
15. BADGES MEJORADOS
───────────────────────────────────────────────────────────────────── */
.badge {
transition: transform 0.2s var(--ease-spring), box-shadow 0.2s ease;
}
.badge:hover {
transform: scale(1.06);
}
.badge.bg-primary {
background: linear-gradient(135deg, var(--primary), var(--primary-deep)) !important;
box-shadow: 0 4px 12px -6px rgba(194, 0, 0, 0.45);
}
/* ─────────────────────────────────────────────────────────────────────
16. MODALES — entrada elegante
───────────────────────────────────────────────────────────────────── */
.modal.fade .modal-dialog {
transform: translateY(40px) scale(0.96);
transition: transform 0.45s var(--ease-spring), opacity 0.4s ease !important;
}
.modal.show .modal-dialog {
transform: translateY(0) scale(1);
}
.modal-backdrop.show {
backdrop-filter: blur(6px);
-webkit-backdrop-filter: blur(6px);
}
.modal-content {
border: 1px solid var(--outline-variant);
border-radius: var(--radius) !important;
box-shadow: 0 30px 80px -20px rgba(0, 0, 0, 0.45);
animation: modalGlow 0.6s ease;
}
@keyframes modalGlow {
from {
box-shadow: 0 0 0 rgba(194, 0, 0, 0);
}
to {
box-shadow: 0 30px 80px -20px rgba(0, 0, 0, 0.45);
}
}
.nav-tabs .nav-link {
position: relative;
transition: color 0.25s ease;
}
.nav-tabs .nav-link::after {
content: '';
position: absolute;
left: 10%;
right: 10%;
bottom: -1px;
height: 3px;
background: var(--primary);
transform: scaleX(0);
transform-origin: left center;
transition: transform 0.4s var(--ease-arc);
}
.nav-tabs .nav-link.active::after {
transform: scaleX(1);
}
/* ─────────────────────────────────────────────────────────────────────
17. SPLASH — cinemático
───────────────────────────────────────────────────────────────────── */
#splash-screen {
background: radial-gradient(ellipse at center, #1a1a18 0%, #0a0a0a 100%);
}
#splash-screen::before {
content: '';
position: absolute;
inset: -50%;
background:
repeating-linear-gradient(45deg,
rgba(194, 0, 0, 0.04) 0,
rgba(194, 0, 0, 0.04) 1px,
transparent 1px,
transparent 12px);
animation: splashSweep 8s linear infinite;
pointer-events: none;
}
@keyframes splashSweep {
from {
transform: translate(-25%, -25%) rotate(0deg);
}
to {
transform: translate(-25%, -25%) rotate(360deg);
}
}
#splash-logo {
position: relative;
filter: drop-shadow(0 12px 30px rgba(194, 0, 0, 0.55));
}
/* ─────────────────────────────────────────────────────────────────────
18. PWA banner — refinado
───────────────────────────────────────────────────────────────────── */
#pwa-install-banner {
border-top: 1px solid var(--outline-variant) !important;
background: rgba(255, 255, 255, 0.96) !important;
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
animation: bannerRise 0.5s var(--ease-spring);
}
@keyframes bannerRise {
from {
transform: translateY(110%);
}
to {
transform: translateY(0);
}
}
#pwa-install-btn {
background: linear-gradient(135deg, var(--primary), var(--primary-deep)) !important;
color: white !important;
border: none !important;
box-shadow: 0 8px 24px -10px rgba(194, 0, 0, 0.55);
transition: transform 0.25s var(--ease-spring), box-shadow 0.25s ease !important;
}
#pwa-install-btn:hover {
transform: translateY(-2px);
box-shadow: 0 14px 30px -10px rgba(194, 0, 0, 0.65);
}
/* ─────────────────────────────────────────────────────────────────────
19. SKELETON / SHIMMER
───────────────────────────────────────────────────────────────────── */
.kfx-skeleton {
position: relative;
overflow: hidden;
background: var(--surface-container);
border-radius: var(--radius-sm);
}
.kfx-skeleton::after {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(90deg,
transparent,
rgba(255, 255, 255, 0.5),
transparent);
animation: shimmer 1.6s linear infinite;
}
@keyframes shimmer {
from {
transform: translateX(-100%);
}
to {
transform: translateX(100%);
}
}
/* ─────────────────────────────────────────────────────────────────────
20. SPONSORS CAROUSEL — fade edges + hover lift
───────────────────────────────────────────────────────────────────── */
.sponsor-carousel-container {
-webkit-mask-image: linear-gradient(90deg, transparent, black 6%, black 94%, transparent);
mask-image: linear-gradient(90deg, transparent, black 6%, black 94%, transparent);
}
.sponsor-item {
transition: transform 0.4s var(--ease-out-soft);
}
.sponsor-item:hover {
transform: translateY(-3px);
}
/* ─────────────────────────────────────────────────────────────────────
21. FOOTER — refinado
───────────────────────────────────────────────────────────────────── */
footer.footer {
position: relative;
overflow: hidden;
background: var(--arena-dark) !important;
color: rgba(255, 255, 255, 0.65) !important;
}
footer.footer::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 2px;
background: linear-gradient(90deg, transparent, var(--primary), transparent);
animation: sweep 5s ease-in-out infinite;
}
/* ─────────────────────────────────────────────────────────────────────
22. UTILIDADES INNOVADORAS
───────────────────────────────────────────────────────────────────── */
/* Texto con gradiente animado */
.kfx-text-gradient {
background: linear-gradient(120deg, var(--primary) 0%, #ff3232 35%, var(--primary-deep) 70%, var(--primary) 100%);
background-size: 250% 100%;
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
color: transparent;
animation: textShift 6s ease-in-out infinite;
}
@keyframes textShift {
0%,
100% {
background-position: 0% 50%;
}
50% {
background-position: 100% 50%;
}
}
/* Borde animado */
.kfx-border-glow {
position: relative;
isolation: isolate;
}
.kfx-border-glow::before {
content: '';
position: absolute;
inset: -1px;
border-radius: inherit;
background: conic-gradient(from 0deg, transparent 0%, var(--primary) 25%, transparent 50%);
animation: borderSpin 4s linear infinite;
z-index: -1;
}
.kfx-border-glow::after {
content: '';
position: absolute;
inset: 1px;
background: var(--surface-container-lowest);
border-radius: inherit;
z-index: -1;
}
@keyframes borderSpin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
/* Underline kinético en links */
.kfx-link {
position: relative;
text-decoration: none;
color: inherit;
background-image: linear-gradient(currentColor, currentColor);
background-position: 0% 100%;
background-repeat: no-repeat;
background-size: 0% 1.5px;
transition: background-size 0.45s var(--ease-arc), color 0.25s ease;
}
.kfx-link:hover {
background-size: 100% 1.5px;
color: var(--primary);
}
/* Imagen con zoom suave en hover y mask reveal */
.kfx-img-cover {
overflow: hidden;
position: relative;
}
.kfx-img-cover img {
transition: transform 0.9s var(--ease-out-soft), filter 0.5s ease;
will-change: transform;
}
.kfx-img-cover:hover img {
transform: scale(1.06);
filter: saturate(1.1) contrast(1.05);
}
.kfx-img-cover::after {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(180deg, transparent 50%, rgba(0, 0, 0, 0.45));
opacity: 0;
transition: opacity 0.45s ease;
pointer-events: none;
}
.kfx-img-cover:hover::after {
opacity: 1;
}
/* Spotlight: contenido sobre imagen */
.kfx-img-spotlight {
position: relative;
overflow: hidden;
}
.kfx-img-spotlight::before {
content: '';
position: absolute;
inset: 0;
background: radial-gradient(500px circle at var(--mx, 50%) var(--my, 50%),
rgba(194, 0, 0, 0.18),
transparent 60%);
opacity: 0;
transition: opacity 0.4s ease;
z-index: 1;
pointer-events: none;
}
.kfx-img-spotlight:hover::before {
opacity: 1;
}
/* Etiqueta numerada estilo deportivo */
.kfx-jersey {
display: inline-flex;
align-items: center;
justify-content: center;
width: 36px;
height: 36px;
background: var(--arena-dark);
color: var(--primary);
font-family: var(--font-display);
font-weight: 800;
font-size: 1.1rem;
border-radius: 4px;
box-shadow: inset 0 0 0 2px var(--primary);
transition: transform 0.3s var(--ease-spring);
}
.kfx-jersey:hover {
transform: rotate(-4deg) scale(1.05);
}
/* Badge dot pulsante */
.kfx-dot {
display: inline-block;
width: 8px;
height: 8px;
border-radius: 50%;
background: var(--primary);
box-shadow: 0 0 0 0 rgba(194, 0, 0, 0.7);
animation: badgeRing 1.6s ease-out infinite;
vertical-align: middle;
}
/* No-grain (en superficies oscuras) */
.no-grain::after {
display: none !important;
}
/* Página entrada */
@keyframes pageIn {
from {
opacity: 0;
transform: translateY(8px);
}
to {
opacity: 1;
transform: none;
}
}
.content {
animation: pageIn 0.5s var(--ease-out-soft);
}
/* Fix para evitar que las letras con "pancita" (p, g, y, q) se corten abajo */
.texto-sin-cortar,
h1,
h2,
h3,
h4,
h5,
h6,
.fc-toolbar-title {
line-height: 1.3 !important;
padding-bottom: 2px !important;
}
/* ─────────────────────────────────────────────────────────────────────
23. ADMIN — sidebar premium e interacciones
───────────────────────────────────────────────────────────────────── */
.admin-sidebar {
background:
linear-gradient(180deg, rgba(194, 0, 0, 0.05), transparent 30%),
var(--admin-sidebar-bg, #0A0A0A) !important;
}
.admin-sidebar::before {
content: '';
position: absolute;
top: 0;
right: 0;
width: 1px;
height: 100%;
background: linear-gradient(180deg, transparent, rgba(194, 0, 0, 0.3) 50%, transparent);
pointer-events: none;
}
.sidebar-link {
position: relative;
overflow: hidden;
}
.sidebar-link::before {
content: '';
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: 3px;
background: var(--primary);
transform: scaleY(0);
transition: transform 0.35s var(--ease-arc);
}
.sidebar-link:hover::before,
.sidebar-link.active::before {
transform: scaleY(1);
}
.sidebar-link i {
transition: transform 0.35s var(--ease-spring), color 0.25s ease;
}
.sidebar-link:hover i {
transform: translateX(3px) scale(1.08);
color: var(--primary);
}
.sidebar-link.active {
background:
linear-gradient(90deg,
rgba(194, 0, 0, 0.95),
rgba(138, 0, 0, 0.85)) !important;
box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.06);
}
.sidebar-link.active i {
color: white !important;
transform: none;
}
/* Stat-card admin: número con tick + glow */
.stat-card {
background: linear-gradient(135deg, #0a0a0a, #1a1a1a) !important;
transition: transform 0.45s var(--ease-out-soft), box-shadow 0.45s ease;
overflow: hidden;
position: relative;
}
.stat-card::before {
content: '';
position: absolute;
inset: 0;
background: radial-gradient(circle at 100% 0%, rgba(194, 0, 0, 0.25), transparent 60%);
opacity: 0;
transition: opacity 0.4s ease;
}
.stat-card:hover {
transform: translateY(-4px);
box-shadow: 0 24px 40px -20px rgba(0, 0, 0, 0.55);
}
.stat-card:hover::before {
opacity: 1;
}
.stat-card .stat-value {
background: linear-gradient(135deg, #fff, #ffb4b4);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
}
/* Admin card hover */
.admin-card {
border-radius: 4px !important;
transition: transform 0.35s var(--ease-out-soft), box-shadow 0.35s ease;
}
.admin-card:hover {
transform: translateY(-2px);
box-shadow: 0 18px 40px -22px rgba(0, 0, 0, 0.18);
}
/* Botones admin con sweep */
.btn-admin-primary {
position: relative;
overflow: hidden;
transition: transform 0.25s var(--ease-spring), box-shadow 0.3s ease, background 0.25s ease !important;
}
.btn-admin-primary::after {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(120deg, transparent, rgba(255, 255, 255, 0.25), transparent);
transform: translateX(-110%) skewX(-15deg);
transition: transform 0.6s var(--ease-arc);
}
.btn-admin-primary:hover::after {
transform: translateX(110%) skewX(-15deg);
}
.btn-admin-primary:hover {
box-shadow: 0 14px 28px -12px rgba(194, 0, 0, 0.55);
transform: translateY(-2px);
}
/* Topbar admin con glass */
.admin-topbar {
background: rgba(255, 255, 255, 0.85) !important;
backdrop-filter: blur(18px) saturate(180%);
-webkit-backdrop-filter: blur(18px) saturate(180%);
position: sticky;
top: 0;
z-index: 100;
}
/* Avatar con anillo */
.admin-topbar .bg-primary {
background: linear-gradient(135deg, var(--primary), var(--primary-deep)) !important;
box-shadow:
0 0 0 3px rgba(194, 0, 0, 0.15),
0 6px 18px -6px rgba(194, 0, 0, 0.5);
transition: transform 0.3s var(--ease-spring);
}
.admin-topbar .bg-primary:hover {
transform: rotate(-6deg) scale(1.05);
}
/* Mejor scroll en sidebar (móvil overlay) */
.sidebar-overlay {
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.5);
backdrop-filter: blur(4px);
-webkit-backdrop-filter: blur(4px);
opacity: 0;
visibility: hidden;
transition: opacity 0.3s ease, visibility 0.3s ease;
z-index: 999;
}
.sidebar-overlay.show {
opacity: 1;
visibility: visible;
}
/* Tablas admin con accent */
.kinetic-table tr {
transition: background 0.2s ease;
}
.kinetic-table tr:hover td {
background: rgba(194, 0, 0, 0.04);
box-shadow: inset 3px 0 0 var(--primary);
}
/* ─────────────────────────────────────────────────────────────────────
24. NOTICIAS / EVENTOS — micro UI
───────────────────────────────────────────────────────────────────── */
.kinetic-news-item {
position: relative;
transition: background 0.3s var(--ease-out-soft), padding-left 0.3s var(--ease-out-soft);
}
.kinetic-news-item::before {
content: '';
position: absolute;
left: 0;
top: 50%;
width: 0;
height: 2px;
background: var(--primary);
transition: width 0.4s var(--ease-arc);
transform: translateY(-50%);
}
.kinetic-news-item:hover {
background: rgba(194, 0, 0, 0.03);
padding-left: 12px;
}
.kinetic-news-item:hover::before {
width: 8px;
}
/* Eventos tarjeta con flecha animada */
.kfx-event-cta {
display: inline-flex;
align-items: center;
gap: 8px;
overflow: hidden;
}
.kfx-event-cta::after {
content: '→';
transition: transform 0.35s var(--ease-arc);
display: inline-block;
}
.kinetic-card:hover .kfx-event-cta::after {
transform: translateX(6px);
}
/* ─────────────────────────────────────────────────────────────────────
25. RESPONSIVE — desactivar efectos pesados en móvil
───────────────────────────────────────────────────────────────────── */
@media (max-width: 768px) {
.kinetic-card:hover {
transform: none;
}
.kinetic-card::before {
display: none;
}
[data-tilt] {
transform: none !important;
}
.kinetic-cursor-dot,
.kinetic-cursor-ring {
display: none !important;
}
body.kinetic-cursor-on,
body.kinetic-cursor-on * {
cursor: auto;
}
}
/* ─────────────────────────────────────────────────────────────────────
26. SELECCIÓN DE TEXTO Y FOCUS GLOBAL
───────────────────────────────────────────────────────────────────── */
/* IMPORTANTE: ::selection sólo soporta `color` y `background-color`,
NO el shorthand `background`. Usar shorthand causa que la regla se ignore
silenciosamente en Chrome/Edge → quedaba selección invisible (blanco/blanco). */
::selection {
background-color: var(--primary) !important;
color: #ffffff !important;
}
::-moz-selection {
background-color: var(--primary) !important;
color: #ffffff !important;
}
/* Override específico para que la selección dentro de modales SweetAlert
también respete los colores de marca (algunas reglas internas del SWAL
quedan más específicas y pisan la global). */
.swal2-popup ::selection,
.swal2-popup *::selection {
background-color: var(--primary) !important;
color: #ffffff !important;
}
.swal2-popup ::-moz-selection,
.swal2-popup *::-moz-selection {
background-color: var(--primary) !important;
color: #ffffff !important;
}
:focus-visible {
outline: 2px solid var(--primary);
outline-offset: 2px;
border-radius: 2px;
}
/* ─────────────────────────────────────────────────────────────────────
27. SWEETALERT2 — afinado de marca
───────────────────────────────────────────────────────────────────── */
.swal2-popup {
border-radius: var(--radius) !important;
font-family: var(--font-body) !important;
border: 1px solid var(--outline-variant);
box-shadow: 0 25px 60px -25px rgba(26, 18, 8, 0.4) !important;
}
.swal2-title {
font-family: var(--font-display) !important;
text-transform: uppercase;
letter-spacing: 0.04em;
}
.swal2-toast {
border-left: 4px solid var(--primary) !important;
}
/* Botón CONFIRMAR de SweetAlert.
SWAL aplica `style="background-color: rgb(...)"` inline desde JS
(vía confirmButtonColor). Usamos background-color + background-image por
separado con !important para que el inline NO gane. Antes usábamos
shorthand `background:` que en algunos casos no se aplicaba como esperado. */
.swal2-styled.swal2-confirm,
.swal2-popup .swal2-actions .swal2-styled.swal2-confirm,
button.swal2-confirm.swal2-styled {
background-color: var(--primary) !important;
background-image: linear-gradient(135deg, var(--primary), var(--primary-deep)) !important;
color: #ffffff !important;
border: none !important;
border-radius: var(--radius-sm) !important;
text-transform: uppercase !important;
letter-spacing: 0.08em !important;
font-weight: 700 !important;
box-shadow: 0 6px 18px -8px rgba(194, 0, 0, 0.55);
transition: transform 0.2s var(--ease-spring), box-shadow 0.25s ease, filter 0.2s ease;
}
.swal2-styled.swal2-confirm:hover,
.swal2-popup .swal2-actions .swal2-styled.swal2-confirm:hover,
button.swal2-confirm.swal2-styled:hover {
background-color: var(--primary-deep) !important;
background-image: linear-gradient(135deg, var(--primary-deep), var(--primary)) !important;
color: #ffffff !important;
transform: translateY(-1px);
box-shadow: 0 10px 24px -10px rgba(194, 0, 0, 0.65);
filter: brightness(1.05);
}
.swal2-styled.swal2-confirm:focus,
button.swal2-confirm.swal2-styled:focus {
box-shadow: 0 0 0 3px rgba(194, 0, 0, 0.35),
0 6px 18px -8px rgba(194, 0, 0, 0.55) !important;
outline: none !important;
}
/* Botón CANCELAR de SweetAlert: gris consistente, texto blanco legible. */
.swal2-styled.swal2-cancel,
.swal2-popup .swal2-actions .swal2-styled.swal2-cancel,
button.swal2-cancel.swal2-styled {
background-color: #6c757d !important;
background-image: none !important;
color: #ffffff !important;
border: none !important;
border-radius: var(--radius-sm) !important;
text-transform: uppercase !important;
letter-spacing: 0.08em !important;
font-weight: 700 !important;
}
.swal2-styled.swal2-cancel:hover,
button.swal2-cancel.swal2-styled:hover {
background-color: #5a6268 !important;
color: #ffffff !important;
}
/* Botón DENY (cuando exista) */
.swal2-styled.swal2-deny,
button.swal2-deny.swal2-styled {
background-color: #b91c1c !important;
background-image: none !important;
color: #ffffff !important;
border: none !important;
border-radius: var(--radius-sm) !important;
text-transform: uppercase !important;
letter-spacing: 0.08em !important;
font-weight: 700 !important;
}