/* =====================================================================
   CTRL RyS: estilos personalizados
   (Tailwind CSS se carga por CDN en index.html; aquí van los componentes,
   los tokens de color de los modos claro/oscuro y las animaciones)

   PALETA OFICIAL RyS
   ┌──────────────────────────┬──────────────┬──────────┐
   │ Uso                      │ Color        │ Código   │
   ├──────────────────────────┼──────────────┼──────────┤
   │ Cara de la tecla         │ Grafito      │ #18181B  │
   │ Faldón (lateral tecla)   │ Zinc         │ #3F3F46  │
   │ Acento (fondo claro)     │ Ámbar        │ #F59E0B  │
   │ Acento (fondo oscuro)    │ Ámbar claro  │ #FBBF24  │
   │ Texto                    │ Blanco       │ #FAFAFA  │
   │ Texto secundario         │ Gris         │ #71717A  │
   └──────────────────────────┴──────────────┴──────────┘

   TONOS DERIVADOS (misma familia, solo donde la paleta no alcanza)
   - #09090B  fondo modo oscuro (un paso más oscuro que el grafito, para
              que las teclas grafito se distingan del fondo)
   - #27272A  superficie secundaria oscura
   - #A1A1AA  texto secundario en modo oscuro (#71717A no llega al
              contraste AA sobre fondos casi negros)
   - #D4D4D8  faldón de las teclas blancas en modo claro
   - #FCD34D  brillo superior de las teclas ámbar
   - #D97706  faldón de la tecla ámbar en modo oscuro
   - #B45309  faldón de la tecla ámbar en modo claro y texto de acento
              sobre fondo claro (#F59E0B como texto no es legible)
   ===================================================================== */

/* ---------- Colores de marca (no cambian con el tema) ---------- */
:root {
  --brand-graphite: 24 24 27;      /* #18181B cara de la tecla */
  --brand-zinc: 63 63 70;          /* #3F3F46 faldón */
  --brand-amber: 245 158 11;       /* #F59E0B ámbar */
  --brand-amber-light: 251 191 36; /* #FBBF24 ámbar claro */
  --brand-white: 250 250 250;      /* #FAFAFA blanco */
  --brand-gray: 113 113 122;       /* #71717A gris */
  --brand-amber-300: 252 211 77;   /* derivado: brillo de tecla ámbar */
  --brand-amber-600: 217 119 6;    /* derivado: faldón ámbar (oscuro) */
  --brand-amber-700: 180 83 9;     /* derivado: faldón ámbar (claro) */
  --nav-h: 80px;        /* altura de la barra (móvil y PC con scroll) */
  --nav-h-top: 104px;   /* altura de la barra en PC, arriba de la página */
}

/* ---------- Tokens del tema claro ---------- */
:root {
  --c-bg: 250 250 250;             /* #FAFAFA */
  --c-bg-deep: 244 244 245;        /* #F4F4F5 */
  --c-surface: 255 255 255;
  --c-surface-2: 244 244 245;
  --c-text: var(--brand-graphite); /* texto principal grafito */
  --c-muted: var(--brand-gray);    /* #71717A: AA sobre blanco */
  --c-subtle: 161 161 170;
  --c-line: var(--brand-graphite);
  --c-accent: var(--brand-amber);              /* relleno ámbar */
  --c-accent-hover: var(--brand-amber-light);
  --c-accent-strong: var(--brand-amber-700);   /* faldón ámbar */
  --c-accent-text: var(--brand-amber-700);     /* texto ámbar legible */
  --c-ember: var(--brand-amber-600);           /* acento secundario */
  --c-on-accent: var(--brand-graphite);        /* texto sobre ámbar */
  --c-danger: 200 30 30;
  --c-success: 21 128 61;
  --grad-1: var(--brand-amber-700);
  --grad-2: var(--brand-amber-600);
  --grad-3: var(--brand-amber-600);

  /* Teclas neutras: blancas con faldón zinc claro */
  --key-face-rgb: 255 255 255;
  --key-face-top-rgb: 255 255 255;
  --key-skirt-rgb: 212 212 216;
  --key-fg-rgb: var(--brand-graphite);
  --key-highlight: rgb(255 255 255 / 0);
  --shadow-rgb: 24 24 27;
  color-scheme: light;
}

/* ---------- Tokens del tema oscuro (por defecto) ---------- */
html.dark {
  --c-bg: 9 9 11;                  /* #09090B */
  --c-bg-deep: 5 5 6;
  --c-surface: var(--brand-graphite);
  --c-surface-2: 39 39 42;         /* #27272A */
  --c-text: var(--brand-white);
  --c-muted: 161 161 170;          /* #A1A1AA: AA sobre fondo oscuro */
  --c-subtle: var(--brand-gray);
  --c-line: 161 161 170;
  --c-accent: var(--brand-amber-light);
  --c-accent-hover: var(--brand-amber-300);
  --c-accent-strong: var(--brand-amber-600);
  --c-accent-text: var(--brand-amber-light);
  --c-ember: var(--brand-amber);
  --c-danger: 248 113 113;
  --c-success: 74 222 128;
  --grad-1: var(--brand-amber-300);
  --grad-2: var(--brand-amber-light);
  --grad-3: var(--brand-amber);

  /* Teclas neutras: cara grafito + faldón zinc (paleta oficial) */
  --key-face-rgb: var(--brand-graphite);
  --key-face-top-rgb: 34 34 38;
  --key-skirt-rgb: var(--brand-zinc);
  --key-fg-rgb: var(--brand-white);
  --key-highlight: rgb(255 255 255 / .07);
  --shadow-rgb: 0 0 0;
  color-scheme: dark;
}

/* ---------- Base ---------- */
html { scroll-behavior: smooth; }
body {
  background: rgb(var(--c-bg));
  color: rgb(var(--c-text));
  font-family: Inter, system-ui, sans-serif;
  -webkit-font-smoothing: antialiased;
  transition: background-color .3s ease, color .3s ease;
}
/* Grano sutil sobre toda la página (textura "física", como el plástico de una tecla) */
body::after {
  content: ""; position: fixed; inset: 0; z-index: 70; pointer-events: none;
  opacity: .035;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
}
html:not(.dark) body::after { opacity: .025; }

[hidden] { display: none !important; }
section[id] { scroll-margin-top: calc(var(--nav-h) + 8px); }
::selection { background: rgb(var(--c-accent) / .35); color: rgb(var(--c-text)); }

:focus-visible {
  outline: 2px solid rgb(var(--c-accent));
  outline-offset: 3px;
  border-radius: 6px;
}

.skip-link {
  position: absolute; left: 1rem; top: -100px; z-index: 100;
  padding: .6rem 1rem; border-radius: .6rem;
  background: rgb(var(--c-accent)); color: rgb(var(--c-on-accent)); font-weight: 600;
  transition: top .2s;
}
.skip-link:focus { top: 1rem; }

/* ---------- Fondos: grilla y puntos tenues ---------- */
.bg-grid {
  background-image:
    linear-gradient(rgb(var(--c-line) / .06) 1px, transparent 1px),
    linear-gradient(90deg, rgb(var(--c-line) / .06) 1px, transparent 1px);
  background-size: 56px 56px;
  -webkit-mask-image: radial-gradient(ellipse 80% 70% at 50% 40%, #000 30%, transparent 75%);
          mask-image: radial-gradient(ellipse 80% 70% at 50% 40%, #000 30%, transparent 75%);
}
.bg-dots {
  background-image: radial-gradient(rgb(var(--c-line) / .13) 1px, transparent 1px);
  background-size: 22px 22px;
  -webkit-mask-image: linear-gradient(to bottom, transparent, #000 20%, #000 80%, transparent);
          mask-image: linear-gradient(to bottom, transparent, #000 20%, #000 80%, transparent);
}
.glow-blob { position: absolute; border-radius: 9999px; filter: blur(90px); pointer-events: none; }
html:not(.dark) .glow-blob { opacity: .45; }

/* Texto con degradado ámbar (palabra "control" del título) */
.text-gradient {
  background-image: linear-gradient(100deg, rgb(var(--grad-1)) 0%, rgb(var(--grad-2)) 35%, rgb(var(--grad-3)) 65%, rgb(var(--grad-1)) 100%);
  background-size: 250% 100%;
  -webkit-background-clip: text; background-clip: text; color: transparent;
  animation: gradientShift 8s ease-in-out infinite alternate;
}

/* =====================================================================
   TECLAS (botones estilo teclado)
   Cada tecla tiene: cara (degradado sutil), brillo superior y faldón
   (sombra inferior sólida). Al presionar, la cara baja y el faldón se acorta.
   ===================================================================== */
.key {
  --key-face: rgb(var(--key-face-rgb));
  --key-face-top: rgb(var(--key-face-top-rgb));
  --key-border: rgb(var(--c-line) / .16);
  --key-depth: rgb(var(--key-skirt-rgb));
  --key-fg: rgb(var(--key-fg-rgb));
  --key-glow: rgb(var(--shadow-rgb) / .35);
  --key-hl: var(--key-highlight);
  position: relative;
  display: inline-flex; align-items: center; justify-content: center; gap: .55rem;
  min-height: 46px; padding: .7rem 1.2rem;
  font-family: "Space Grotesk", system-ui, sans-serif; font-weight: 600; font-size: .95rem; line-height: 1.1;
  color: var(--key-fg);
  background: linear-gradient(180deg, var(--key-face-top), var(--key-face));
  border: 1px solid var(--key-border); border-radius: .8rem;
  box-shadow: inset 0 1px 0 var(--key-hl), 0 4px 0 0 var(--key-depth), 0 12px 24px -14px var(--key-glow);
  transform: translateY(0);
  transition: transform .12s ease, box-shadow .12s ease, color .2s ease, border-color .2s ease, filter .2s ease;
  cursor: pointer; user-select: none; white-space: nowrap; text-decoration: none;
}
.key svg { width: 1.1em; height: 1.1em; flex-shrink: 0; }
.key:hover {
  transform: translateY(-1px);
  box-shadow: inset 0 1px 0 var(--key-hl), 0 5px 0 0 var(--key-depth), 0 16px 30px -12px var(--key-glow);
}
.key:active, .key.is-pressed {
  transform: translateY(3px);
  box-shadow: inset 0 1px 0 var(--key-hl), 0 1px 0 0 var(--key-depth), 0 4px 10px -6px var(--key-glow);
}

/* Tecla ámbar (acción principal) */
.key-primary {
  --key-face: rgb(var(--c-accent));
  --key-face-top: rgb(var(--c-accent-hover));
  --key-border: rgb(var(--c-accent-strong) / .55);
  --key-depth: rgb(var(--c-accent-strong));
  --key-fg: rgb(var(--c-on-accent));
  --key-glow: rgb(var(--c-accent) / .5);
  --key-hl: rgb(255 255 255 / .4);
}
.key-primary:hover { filter: brightness(1.06); }

/* Tecla de contorno (acción secundaria) */
.key-ghost {
  --key-face: rgb(var(--key-face-rgb) / .6);
  --key-face-top: rgb(var(--key-face-top-rgb) / .6);
  --key-border: rgb(var(--c-accent) / .5);
  --key-glow: rgb(var(--c-accent) / .2);
}
.key-ghost:hover { --key-border: rgb(var(--c-accent) / .9); }

.key-sm { min-height: 38px; padding: .45rem .85rem; font-size: .85rem; border-radius: .65rem; box-shadow: inset 0 1px 0 var(--key-hl), 0 3px 0 0 var(--key-depth); }
.key-sm:hover { box-shadow: inset 0 1px 0 var(--key-hl), 0 4px 0 0 var(--key-depth), 0 10px 20px -12px var(--key-glow); }
.key-sm:active, .key-sm.is-pressed { transform: translateY(2px); box-shadow: inset 0 1px 0 var(--key-hl), 0 1px 0 0 var(--key-depth); }
.key-icon { min-width: 46px; padding: .6rem; }

/* Filtros: la pestaña activa queda "presionada" y en ámbar */
.filter-key[aria-pressed="true"] {
  --key-face: rgb(var(--c-accent));
  --key-face-top: rgb(var(--c-accent-hover));
  --key-border: rgb(var(--c-accent-strong) / .6);
  --key-depth: rgb(var(--c-accent-strong));
  --key-fg: rgb(var(--c-on-accent));
  --key-hl: rgb(255 255 255 / .4);
  transform: translateY(2px);
  box-shadow: inset 0 1px 0 var(--key-hl), 0 1px 0 0 var(--key-depth), 0 0 24px -6px rgb(var(--c-accent) / .6);
}

/* Teclas deshabilitadas (botones PENDIENTES) */
.key.is-disabled, .key[aria-disabled="true"], .key:disabled { opacity: .45; cursor: not-allowed; }
.key.is-disabled:hover, .key.is-disabled:active,
.key[aria-disabled="true"]:hover, .key[aria-disabled="true"]:active,
.key:disabled:hover, .key:disabled:active {
  transform: none; filter: none;
  box-shadow: inset 0 1px 0 var(--key-hl), 0 4px 0 0 var(--key-depth), 0 12px 24px -14px var(--key-glow);
  --key-border: rgb(var(--c-line) / .16);
}
.badge-soon {
  position: absolute; top: -.6rem; right: -.4rem; z-index: 1; pointer-events: none;
  padding: .15rem .45rem; border-radius: .4rem;
  font-family: "JetBrains Mono", monospace; font-size: .62rem; font-weight: 700; letter-spacing: .04em; text-transform: uppercase;
  color: rgb(var(--brand-amber-light)); background: rgb(var(--brand-graphite));
  border: 1px solid rgb(var(--brand-zinc));
  box-shadow: 0 2px 0 0 rgb(var(--brand-zinc));
}

/* Tecla pequeña para atajos de texto (kbd) */
.kbd {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 1.9rem; padding: .18rem .5rem;
  font-family: "JetBrains Mono", monospace; font-size: .74rem; font-weight: 500; line-height: 1.3;
  color: rgb(var(--key-fg-rgb));
  background: linear-gradient(180deg, rgb(var(--key-face-top-rgb)), rgb(var(--key-face-rgb)));
  border: 1px solid rgb(var(--c-line) / .18); border-bottom: 3px solid rgb(var(--key-skirt-rgb)); border-radius: .45rem;
}
.kbd-accent {
  color: rgb(var(--c-on-accent));
  background: linear-gradient(180deg, rgb(var(--c-accent-hover)), rgb(var(--c-accent)));
  border-color: rgb(var(--c-accent-strong) / .5); border-bottom-color: rgb(var(--c-accent-strong));
}

/* =====================================================================
   LOGO Ctrl+RyS (símbolo #logo-rys en index.html)
   Colores tomados del paquete oficial rys-logo-final:
   - versión "color"  → fondos claros
   - versión "oscuro" → fondos oscuros
   Tamaño mínimo recomendado por la marca: 96 px de ancho en pantalla.
   ===================================================================== */
:root {                       /* versión "color" (modo claro) */
  --logo-falda: #3F3F46;
  --logo-borde: none;
  --logo-borde-w: 0;
  --logo-cara: #18181B;
  --logo-acento: #F59E0B;
  --logo-texto: #FAFAFA;
}
html.dark {                   /* versión "oscuro" (modo oscuro) */
  --logo-falda: #09090B;
  --logo-borde: #52525B;
  --logo-borde-w: 1.5;
  --logo-cara: #27272A;
  --logo-acento: #FBBF24;
  --logo-texto: #FAFAFA;
}
.logo { display: inline-flex; align-items: center; flex-shrink: 0; border-radius: .9rem; }
.logo-svg { display: block; height: auto; overflow: visible; }
/* Tamaños del logo:
   - Móvil: 96 px (mínimo de la marca), barra de 80 px.
   - PC arriba de la página: barra de 104 px y logo de 136 px (primera impresión).
   - PC al hacer scroll: la barra se compacta a 80 px y el logo a 108 px. */
.navbar-fila { height: 80px; transition: height .3s ease; }
.logo-nav .logo-svg { width: 96px; transition: width .3s ease; }
.logo-footer .logo-svg { width: 160px; }
@media (min-width: 1024px) {
  .navbar:not(.is-scrolled) .navbar-fila { height: var(--nav-h-top); }
  .navbar:not(.is-scrolled) .logo-nav .logo-svg { width: 136px; }
  .navbar.is-scrolled .logo-nav .logo-svg { width: 108px; }
}
/* Al pasar el mouse la tecla se "presiona": la cara baja sobre el faldón.
   (Se hace con una variable porque el CSS no alcanza el interior de <use>.) */
.logo:hover { --logo-press: 3px; }
.logo:active { --logo-press: 5px; }
.logo:hover .logo-svg { filter: drop-shadow(0 0 14px rgb(var(--c-accent) / .28)); }

/* ---------- Navbar ---------- */
.navbar { transition: background-color .3s ease, box-shadow .3s ease, border-color .3s ease, backdrop-filter .3s ease; border-bottom: 1px solid transparent; }
.navbar.is-scrolled, .navbar.menu-open {
  background: rgb(var(--c-bg) / .8);
  -webkit-backdrop-filter: blur(14px) saturate(140%);
          backdrop-filter: blur(14px) saturate(140%);
  border-bottom-color: rgb(var(--c-line) / .1);
  box-shadow: 0 10px 30px -18px rgb(var(--shadow-rgb) / .5);
}
.nav-link { position: relative; padding: .5rem .8rem; border-radius: .6rem; font-size: .93rem; font-weight: 500; color: rgb(var(--c-muted)); transition: color .2s ease, background-color .2s ease; }
.nav-link:hover { color: rgb(var(--c-text)); background: rgb(var(--c-line) / .07); }
.nav-link.is-active { color: rgb(var(--c-accent-text)); }
.nav-link.is-active::after {
  content: ""; position: absolute; left: 50%; bottom: .1rem; width: 5px; height: 5px; border-radius: 9999px;
  background: rgb(var(--c-accent)); box-shadow: 0 0 10px rgb(var(--c-accent)); transform: translateX(-50%);
}

/* Tema: mostrar sol en oscuro, luna en claro */
.icon-sun { display: none; }
html.dark .icon-sun { display: block; }
html.dark .icon-moon { display: none; }

/* Hamburguesa animada */
.burger .bars > span { display: block; width: 20px; height: 2px; border-radius: 2px; background: currentColor; transition: transform .3s ease, opacity .2s ease; }
.burger .bars > span + span { margin-top: 5px; }
.burger[aria-expanded="true"] .bars > span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
.burger[aria-expanded="true"] .bars > span:nth-child(2) { opacity: 0; transform: scaleX(.2); }
.burger[aria-expanded="true"] .bars > span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }

.mobile-menu {
  visibility: hidden; opacity: 0; transform: translateY(-10px);
  transition: opacity .25s ease, transform .25s ease, visibility 0s linear .25s;
}
.mobile-menu.is-open {
  visibility: visible; opacity: 1; transform: none;
  transition: opacity .25s ease, transform .25s ease, visibility 0s;
}
.mobile-link { display: flex; align-items: center; justify-content: space-between; padding: .9rem 1rem; border-radius: .75rem; font-weight: 500; color: rgb(var(--c-text)); }
.mobile-link:hover { background: rgb(var(--c-line) / .07); }
.mobile-link.is-active { color: rgb(var(--c-accent-text)); background: rgb(var(--c-accent) / .08); }

/* =====================================================================
   HERO
   El editor y las teclas flotantes son "objetos de marca": siempre
   grafito/zinc/ámbar, en ambos temas.
   ===================================================================== */
.hero { min-height: 100vh; min-height: 100svh; padding-top: var(--nav-h); }
@media (min-width: 1024px) { .hero { padding-top: var(--nav-h-top); } }
.hero-dot { box-shadow: 0 0 10px rgb(var(--c-accent)); }

.editor {
  position: relative; z-index: 1;
  border-radius: 1rem; overflow: hidden;
  background: rgb(var(--brand-graphite)); color: rgb(var(--brand-white));
  border: 1px solid rgb(var(--brand-zinc) / .8);
  box-shadow:
    inset 0 1px 0 rgb(255 255 255 / .05),
    0 6px 0 0 rgb(var(--brand-zinc) / .55),
    0 30px 60px -25px rgb(0 0 0 / .7),
    0 0 70px -25px rgb(var(--brand-amber-light) / .35);
  animation: floatY 7s ease-in-out infinite;
}
.editor-bar { display: flex; align-items: center; gap: .45rem; padding: .7rem 1rem; background: #111113; border-bottom: 1px solid rgb(var(--brand-zinc) / .6); }
.editor-dot { width: 11px; height: 11px; border-radius: 9999px; background: rgb(var(--brand-zinc)); }
.editor-dot:first-child { background: rgb(var(--brand-amber-light)); box-shadow: 0 0 8px rgb(var(--brand-amber-light) / .6); }
.editor-file { color: rgb(161 161 170); }
.editor-brand { color: rgb(var(--brand-gray)); }
.editor-code {
  padding: 1rem 1rem 1.2rem 0;
  font-family: "JetBrains Mono", monospace; font-size: .74rem; line-height: 1.75;
  min-height: calc(10 * 1.75em + 2.2rem);
  white-space: pre; overflow: hidden;
}
@media (min-width: 640px) { .editor-code { font-size: .82rem; } }
.code-line { display: flex; }
.code-ln { width: 2.6rem; flex-shrink: 0; padding-right: 1rem; text-align: right; color: rgb(var(--brand-zinc)); user-select: none; }
/* Resaltado de sintaxis en tonos de la marca */
.tk-c { color: rgb(var(--brand-gray)); font-style: italic; }
.tk-k { color: rgb(var(--brand-amber-light)); }
.tk-s { color: #FDE68A; }
.tk-f { color: rgb(var(--brand-white)); font-weight: 700; }
.tk-a { color: #D4D4D8; }
.tk-v { color: rgb(var(--brand-white)); }
.tk-p { color: rgb(161 161 170); }
.caret { display: inline-block; width: .55em; height: 1.15em; margin-left: 1px; vertical-align: -0.2em; background: rgb(var(--brand-amber-light)); box-shadow: 0 0 8px rgb(var(--brand-amber-light)); animation: blink 1s steps(1) infinite; }

/* Contenedor de cada tecla flotante: posición + parallax con el mouse (--px/--py desde JS) */
.fk-wrap {
  position: absolute; z-index: 2;
  transform: translate3d(calc(var(--px, 0) * var(--depth, 0) * 1px), calc(var(--py, 0) * var(--depth, 0) * 1px), 0);
  transition: transform .35s cubic-bezier(.2,.7,.2,1);
}
/* Tecla flotante: cara grafito + faldón zinc (paleta oficial) */
.float-key {
  position: relative;
  display: inline-flex; align-items: center; justify-content: center; gap: .45rem;
  padding: .75rem 1.05rem; min-width: 66px;
  font-family: "JetBrains Mono", monospace; font-weight: 700; font-size: .95rem;
  color: rgb(var(--brand-white));
  background: linear-gradient(180deg, rgb(36 36 40), rgb(var(--brand-graphite)));
  border: 1px solid rgb(var(--brand-zinc)); border-radius: .85rem;
  box-shadow: inset 0 1px 0 rgb(255 255 255 / .08), 0 6px 0 0 rgb(var(--brand-zinc)), 0 22px 38px -16px rgb(0 0 0 / .65);
  transition: transform .1s ease, box-shadow .1s ease, filter .1s ease;
  animation: floatY 6s ease-in-out infinite;
}
.float-key svg { width: 1em; height: 1em; color: rgb(var(--brand-amber-light)); }
.float-key.is-accent {
  color: rgb(var(--brand-graphite));
  background: linear-gradient(180deg, rgb(var(--brand-amber-300)), rgb(var(--brand-amber-light)));
  border-color: rgb(var(--brand-amber-600));
  box-shadow: inset 0 1px 0 rgb(255 255 255 / .45), 0 6px 0 0 rgb(var(--brand-amber-600)), 0 0 44px -8px rgb(var(--brand-amber-light) / .75);
  animation: floatY 6s ease-in-out infinite, keyPress 6s ease-in-out infinite;
}
.fk-ctrl  { top: .25rem; left: -.25rem; }
.fk-alt   { top: 38%; right: -.5rem; }
.fk-enter { bottom: .25rem; left: 14%; }
.fk-enter .float-key { padding-inline: 1.25rem; }
/* Tecla presionada con el teclado real */
.float-key.is-down { transform: translateY(5px) !important; box-shadow: inset 0 1px 0 rgb(255 255 255 / .08), 0 1px 0 0 rgb(var(--brand-zinc)), 0 0 30px -6px rgb(var(--brand-amber-light) / .55); filter: brightness(1.2); }
.float-key.is-accent.is-down { box-shadow: inset 0 1px 0 rgb(255 255 255 / .45), 0 1px 0 0 rgb(var(--brand-amber-600)), 0 0 60px -2px rgb(var(--brand-amber-light) / .95); }
.key-hint {
  position: absolute; left: 50%; bottom: -1.4rem; transform: translateX(-50%);
  display: none; align-items: center; gap: .35rem; white-space: nowrap;
  font-family: "JetBrains Mono", monospace; font-size: .7rem; color: rgb(var(--c-muted));
}
.key-hint .kbd { min-width: 0; font-size: .65rem; padding: .05rem .4rem; }
@media (hover: hover) and (pointer: fine) { .key-hint { display: inline-flex; } }

/* Editor con inclinación 3D según el mouse (--rx/--ry desde JS) */
.hero-visual .editor {
  transform: perspective(1100px) rotateX(var(--rx, 0deg)) rotateY(var(--ry, 0deg));
  transition: transform .35s cubic-bezier(.2,.7,.2,1);
}
@media (min-width: 1024px) {
  .fk-ctrl { left: -1.75rem; top: -.5rem; }
  .fk-alt { right: -1.5rem; }
}

.scroll-hint { width: 26px; height: 42px; border: 2px solid rgb(var(--c-line) / .4); border-radius: 14px; display: flex; justify-content: center; padding-top: 7px; }
.scroll-hint span { width: 4px; height: 8px; border-radius: 4px; background: rgb(var(--c-accent)); animation: scrollDot 1.8s ease-in-out infinite; }

/* ---------- Tarjetas ---------- */
.card {
  background: rgb(var(--c-surface) / .75);
  border: 1px solid rgb(var(--c-line) / .12);
  border-radius: 1.25rem;
}
html.dark .card { box-shadow: inset 0 1px 0 rgb(255 255 255 / .03); }
html:not(.dark) .card { box-shadow: 0 1px 2px rgb(24 24 27 / .04), 0 8px 24px -16px rgb(24 24 27 / .14); }

.service-card { position: relative; transition: transform .3s ease, border-color .3s ease, box-shadow .3s ease; }
.service-card::before {
  content: ""; position: absolute; inset: 0; z-index: 3; border-radius: inherit; padding: 1px; pointer-events: none;
  background: linear-gradient(135deg, rgb(var(--c-accent) / .95), transparent 40%, transparent 62%, rgb(var(--c-ember) / .7));
  -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite: xor; mask-composite: exclude;
  opacity: 0; transition: opacity .3s ease;
}
.service-card:hover, .service-card:focus-within {
  transform: translateY(-6px);
  border-color: rgb(var(--c-accent) / .4);
  box-shadow: 0 0 0 1px rgb(var(--c-accent) / .12), 0 26px 50px -26px rgb(var(--c-accent) / .5);
}
.service-card:hover::before, .service-card:focus-within::before { opacity: 1; }
.svc-icon {
  display: inline-flex; align-items: center; justify-content: center;
  width: 3rem; height: 3rem; border-radius: .85rem;
  color: rgb(var(--c-accent-text));
  background: rgb(var(--c-accent) / .12);
  border: 1px solid rgb(var(--c-accent) / .32);
  box-shadow: 0 3px 0 0 rgb(var(--c-accent-strong) / .45);
}
.svc-icon svg { width: 1.45rem; height: 1.45rem; }
.service-card:hover .svc-icon, .service-card:focus-within .svc-icon { animation: iconPop .55s ease; }
.svc-link { display: inline-flex; align-items: center; gap: .35rem; font-weight: 600; font-size: .92rem; color: rgb(var(--c-accent-text)); }
.svc-link svg { width: 1rem; height: 1rem; transition: transform .2s ease; }
.svc-link:hover svg { transform: translateX(4px); }
/* El enlace cubre toda la tarjeta para facilitar el clic */
.svc-link::after { content: ""; position: absolute; inset: 0; border-radius: 1.25rem; }

/* ---------- Tecnologías ---------- */
.tech-card { transition: opacity .28s ease, transform .28s ease, border-color .25s ease, box-shadow .25s ease; }
.tech-card:hover { border-color: rgb(var(--c-accent) / .4); box-shadow: 0 14px 30px -20px rgb(var(--c-accent) / .55); transform: translateY(-3px); }
.tech-card.is-out { opacity: 0; transform: scale(.88); }
.tech-logo { width: 28px; height: 28px; object-fit: contain; opacity: .9; }
html.dark .tech-logo { filter: invert(1); }
/* Cada logo va sobre una mini tecla */
.tech-badge {
  display: flex; align-items: center; justify-content: center;
  width: 52px; height: 52px; border-radius: .9rem;
  background: linear-gradient(180deg, rgb(var(--key-face-top-rgb)), rgb(var(--key-face-rgb)));
  border: 1px solid rgb(var(--c-line) / .14);
  box-shadow: inset 0 1px 0 var(--key-highlight), 0 3px 0 0 rgb(var(--key-skirt-rgb));
}
html.dark .tech-badge { background: linear-gradient(180deg, rgb(44 44 48), rgb(39 39 42)); }
.tech-initial { font-family: "JetBrains Mono", monospace; font-weight: 700; font-size: 1.05rem; color: rgb(var(--c-accent-text)); }

/* ---------- FAQ (acordeón) ---------- */
.faq-item { transition: border-color .25s ease, box-shadow .25s ease; }
.faq-item.is-open { border-color: rgb(var(--c-accent) / .4); box-shadow: 0 16px 40px -28px rgb(var(--c-accent) / .65); }
.faq-icon {
  display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0;
  width: 2rem; height: 2rem; border-radius: .55rem;
  color: rgb(var(--c-accent-text));
  background: linear-gradient(180deg, rgb(var(--key-face-top-rgb)), rgb(var(--key-face-rgb)));
  border: 1px solid rgb(var(--c-line) / .18); border-bottom: 3px solid rgb(var(--key-skirt-rgb));
  transition: transform .3s ease, background .25s ease, color .25s ease, border-color .25s ease;
}
.faq-icon svg { width: 1rem; height: 1rem; transition: transform .3s ease; }
/* Abierta: la tecla queda presionada (ámbar) y el "+" gira hasta formar "×" */
.faq-trigger[aria-expanded="true"] .faq-icon svg { transform: rotate(45deg); }
.faq-trigger[aria-expanded="true"] .faq-icon {
  transform: translateY(2px); border-bottom-width: 1px;
  background: rgb(var(--c-accent)); color: rgb(var(--c-on-accent));
  border-color: rgb(var(--c-accent-strong) / .6); border-bottom-color: rgb(var(--c-accent-strong));
}
.faq-panel {
  display: grid; grid-template-rows: 0fr; visibility: hidden;
  transition: grid-template-rows .32s ease, visibility 0s linear .32s;
}
.faq-panel.is-open { grid-template-rows: 1fr; visibility: visible; transition: grid-template-rows .32s ease, visibility 0s; }
.faq-panel > div { overflow: hidden; }

/* ---------- Formulario ---------- */
.field-label { display: block; margin-bottom: .4rem; font-size: .88rem; font-weight: 500; color: rgb(var(--c-text)); }
.field-label .req { color: rgb(var(--c-accent-text)); }
.field-input {
  width: 100%; min-height: 48px; padding: .75rem 1rem;
  font-size: .95rem; color: rgb(var(--c-text));
  background: rgb(var(--c-bg));
  border: 1px solid rgb(var(--c-line) / .2); border-radius: .8rem;
  transition: border-color .2s ease, box-shadow .2s ease, background-color .2s ease;
}
html:not(.dark) .field-input { background: rgb(var(--c-surface)); }
.field-input::placeholder { color: rgb(var(--c-muted) / .8); }
.field-input:hover { border-color: rgb(var(--c-line) / .38); }
.field-input:focus { outline: none; border-color: rgb(var(--c-accent)); box-shadow: 0 0 0 4px rgb(var(--c-accent) / .18); }
.field-input[aria-invalid="true"] { border-color: rgb(var(--c-danger)); }
.field-input[aria-invalid="true"]:focus { box-shadow: 0 0 0 4px rgb(var(--c-danger) / .18); }
.field-input.is-valid { border-color: rgb(var(--c-success) / .55); }
select.field-input { appearance: none; -webkit-appearance: none; padding-right: 2.6rem; cursor: pointer; }
select.field-input option { background: rgb(var(--c-surface)); color: rgb(var(--c-text)); }
textarea.field-input { min-height: 140px; resize: vertical; }
.field-error { display: flex; align-items: flex-start; gap: .35rem; margin-top: .4rem; font-size: .82rem; color: rgb(var(--c-danger)); }
.field-error:empty { display: none; }
.field-error svg { width: .95rem; height: .95rem; margin-top: .1rem; flex-shrink: 0; }
.flash { animation: flash 1.2s ease; }
.checkbox { width: 1.2rem; height: 1.2rem; margin-top: .15rem; accent-color: rgb(var(--c-accent)); cursor: pointer; flex-shrink: 0; }

.spinner { width: 1.05em; height: 1.05em; border: 2px solid currentColor; border-right-color: transparent; border-radius: 9999px; animation: spin .7s linear infinite; }
.btn-submit .spinner, .btn-submit .label-loading { display: none; }
.btn-submit.is-loading .spinner, .btn-submit.is-loading .label-loading { display: inline-block; }
.btn-submit.is-loading .label-idle { display: none; }
.btn-submit.is-loading { cursor: progress; opacity: .85; }

/* ---------- Verificación anti-bots (Cloudflare Turnstile) ---------- */
.seguridad {
  border: 1px dashed rgb(var(--c-line) / .22); border-radius: .9rem;
  padding: .7rem .9rem;
  background: rgb(var(--c-line) / .03);
  transition: border-color .25s ease, background-color .25s ease;
}
.seguridad-fila { display: flex; align-items: center; gap: .6rem; }
.seguridad-icono {
  display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0;
  width: 1.9rem; height: 1.9rem; border-radius: .55rem;
  color: rgb(var(--c-muted));
  background: linear-gradient(180deg, rgb(var(--key-face-top-rgb)), rgb(var(--key-face-rgb)));
  border: 1px solid rgb(var(--c-line) / .16); border-bottom: 2px solid rgb(var(--key-skirt-rgb));
}
.seguridad-icono svg { width: 1rem; height: 1rem; }
.seguridad-icono .spinner { width: .85rem; height: .85rem; border-width: 2px; }
.seguridad-icono > * { display: none; }
.seguridad[data-estado="cargando"] .icono-cargando,
.seguridad[data-estado="interaccion"] .icono-cargando { display: inline-block; }
.seguridad[data-estado="ok"] .icono-ok { display: block; }
.seguridad[data-estado="error"] .icono-error { display: block; }
.seguridad-texto { flex: 1; font-size: .84rem; color: rgb(var(--c-muted)); }
.seguridad-marca { flex-shrink: 0; font-family: "JetBrains Mono", monospace; font-size: .62rem; letter-spacing: .03em; color: rgb(var(--c-subtle)); }
@media (max-width: 479px) { .seguridad-marca { display: none; } }
/* Estados */
.seguridad[data-estado="ok"] { border-style: solid; border-color: rgb(var(--c-success) / .35); background: rgb(var(--c-success) / .05); }
.seguridad[data-estado="ok"] .seguridad-icono { color: rgb(var(--c-success)); }
.seguridad[data-estado="interaccion"] { border-style: solid; border-color: rgb(var(--c-accent) / .55); background: rgb(var(--c-accent) / .06); }
.seguridad[data-estado="interaccion"] .seguridad-texto { color: rgb(var(--c-text)); }
.seguridad[data-estado="error"] { border-style: solid; border-color: rgb(var(--c-danger) / .45); background: rgb(var(--c-danger) / .06); }
.seguridad[data-estado="error"] .seguridad-icono, .seguridad[data-estado="error"] .seguridad-texto { color: rgb(var(--c-danger)); }
/* El widget de Cloudflare solo ocupa espacio cuando pide un clic */
.seguridad[data-estado="interaccion"] .turnstile-box { margin-top: .6rem; }
.turnstile-box iframe { max-width: 100%; }

.contact-card { transition: border-color .25s ease, transform .25s ease; }
.contact-card:hover { border-color: rgb(var(--c-accent) / .4); }
.contact-icon { display: inline-flex; align-items: center; justify-content: center; width: 2.75rem; height: 2.75rem; flex-shrink: 0; border-radius: .8rem; color: rgb(var(--c-accent-text)); background: rgb(var(--c-accent) / .1); border: 1px solid rgb(var(--c-accent) / .28); box-shadow: 0 3px 0 0 rgb(var(--c-accent-strong) / .35); }
.contact-icon svg { width: 1.25rem; height: 1.25rem; }

/* ---------- Footer ---------- */
.site-footer { position: relative; background: rgb(var(--c-bg-deep)); }
.site-footer::before {
  content: ""; position: absolute; top: 0; left: 0; right: 0; height: 1px;
  background: linear-gradient(90deg, transparent, rgb(var(--c-accent)) 20%, rgb(var(--c-accent)) 80%, transparent);
  box-shadow: 0 0 18px 1px rgb(var(--c-accent) / .5);
}
.footer-link { color: rgb(var(--c-muted)); font-size: .92rem; transition: color .2s ease; }
.footer-link:hover { color: rgb(var(--c-accent-text)); }
.social-key {
  display: inline-flex; align-items: center; justify-content: center; width: 2.6rem; height: 2.6rem; border-radius: .7rem;
  color: rgb(var(--c-muted));
  background: linear-gradient(180deg, rgb(var(--key-face-top-rgb)), rgb(var(--key-face-rgb)));
  border: 1px solid rgb(var(--c-line) / .16);
  box-shadow: inset 0 1px 0 var(--key-highlight), 0 3px 0 0 rgb(var(--key-skirt-rgb));
  transition: transform .12s ease, box-shadow .12s ease, color .2s ease;
}
.social-key:hover { color: rgb(var(--c-accent-text)); }
.social-key:active { transform: translateY(2px); box-shadow: inset 0 1px 0 var(--key-highlight), 0 1px 0 0 rgb(var(--key-skirt-rgb)); }
.social-key svg { width: 1.15rem; height: 1.15rem; }

/* ---------- Elementos flotantes ---------- */
.to-top {
  position: fixed; right: 1.25rem; bottom: 1.25rem; z-index: 40;
  opacity: 0; visibility: hidden; transform: translateY(12px);
  transition: opacity .25s ease, transform .25s ease, visibility 0s linear .25s, bottom .3s ease;
}
.to-top.is-visible { opacity: 1; visibility: visible; transform: none; transition: opacity .25s ease, transform .25s ease, visibility 0s, bottom .3s ease; }
body.has-wa-float .to-top { bottom: 5.75rem; } /* PENDIENTE: se desplaza encima del botón de WhatsApp */

/* PENDIENTE: botón flotante de WhatsApp (oculto mientras no haya número).
   Mantiene el verde de WhatsApp para que se reconozca al instante. */
.wa-float {
  position: fixed; right: 1.25rem; bottom: 1.25rem; z-index: 40;
  display: inline-flex; align-items: center; justify-content: center;
  width: 3.5rem; height: 3.5rem; border-radius: 9999px;
  color: #fff; background: #25D366;
  box-shadow: 0 4px 0 0 #128C7E, 0 12px 28px -10px rgb(37 211 102 / .7);
  transition: transform .15s ease, box-shadow .15s ease;
}
.wa-float[hidden] { display: none; }
.wa-float::after { content: ""; position: absolute; inset: 0; border-radius: inherit; box-shadow: 0 0 0 0 rgb(37 211 102 / .55); animation: pulse 2.4s ease-out infinite; }
.wa-float:hover { transform: translateY(-2px); }
.wa-float:active { transform: translateY(3px); box-shadow: 0 1px 0 0 #128C7E; }
.wa-float svg { width: 1.7rem; height: 1.7rem; }

/* ---------- Aparición al hacer scroll ---------- */
.js .reveal { opacity: 0; transform: translateY(16px); transition: opacity .45s ease, transform .45s cubic-bezier(.2,.7,.2,1); transition-delay: var(--d, 0ms); }
.js .reveal.is-visible { opacity: 1; transform: none; }

/* =====================================================================
   IMÁGENES Y EFECTOS
   ===================================================================== */

/* ---------- Barra de progreso de lectura ---------- */
.scroll-progress { position: fixed; inset: 0 0 auto 0; height: 3px; z-index: 60; pointer-events: none; }
.scroll-progress span {
  display: block; height: 100%; transform-origin: 0 50%; transform: scaleX(var(--progress, 0));
  background: linear-gradient(90deg, rgb(var(--brand-amber-300)), rgb(var(--brand-amber-light)) 50%, rgb(var(--brand-amber)));
  box-shadow: 0 0 12px rgb(var(--brand-amber-light) / .7);
}

/* ---------- Hero: foto de fondo + foco que sigue al mouse ---------- */
.hero-photo {
  position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; pointer-events: none;
  opacity: .24; filter: grayscale(.35) sepia(.3) saturate(1.25) contrast(1.05);
  -webkit-mask-image: radial-gradient(ellipse 75% 85% at 70% 45%, #000 20%, transparent 75%);
          mask-image: radial-gradient(ellipse 75% 85% at 70% 45%, #000 20%, transparent 75%);
  animation: slowZoom 30s ease-in-out infinite alternate;
}
/* En modo claro la foto oscura ensucia el fondo: queda apenas como textura cálida */
html:not(.dark) .hero-photo { opacity: .05; filter: grayscale(1) sepia(.6) contrast(1.1); mix-blend-mode: multiply; }
.hero-spot {
  position: absolute; inset: 0; pointer-events: none; opacity: 0; transition: opacity .4s ease;
  background: radial-gradient(520px circle at var(--hx, 50%) var(--hy, 50%), rgb(var(--c-accent) / .1), transparent 60%);
}
.hero:hover .hero-spot { opacity: 1; }

/* ---------- Botón principal: destello ---------- */
.key-primary { overflow: hidden; isolation: isolate; }
.key-primary::after {
  content: ""; position: absolute; inset: 0; z-index: -1; pointer-events: none;
  background: linear-gradient(110deg, transparent 30%, rgb(255 255 255 / .55) 50%, transparent 70%);
  transform: translateX(-130%);
}
.key-primary > * { position: relative; }
.key-primary:hover::after { transform: translateX(130%); transition: transform .75s ease; }
.key-shine::after { animation: shine 5s ease-in-out 2s infinite; }

/* ---------- Foco que sigue al mouse en tarjetas (--mx/--my desde JS) ---------- */
.spotlight { position: relative; }
.spotlight::after {
  content: ""; position: absolute; inset: 0; border-radius: inherit; pointer-events: none; z-index: 2;
  background: radial-gradient(380px circle at var(--mx, -500px) var(--my, -500px), rgb(var(--c-accent) / .09), transparent 45%);
  opacity: 0; transition: opacity .3s ease;
}
.spotlight:hover::after { opacity: 1; }
/* Las tarjetas de servicio usan ::after para el enlace que cubre la tarjeta */
.service-card.spotlight .svc-link::after { z-index: 4; }

/* ---------- Fotos: monocromo cálido de marca; color real al pasar el mouse ---------- */
.svc-media { position: relative; aspect-ratio: 16 / 9; overflow: hidden; margin: 0; background: rgb(var(--c-surface-2)); }
.svc-img, .photo-img {
  width: 100%; height: 100%; object-fit: cover; display: block;
  transform: scale(1.03); filter: grayscale(1) contrast(1.08) brightness(.92);
  transition: transform .8s cubic-bezier(.2,.7,.2,1), filter .6s ease;
}
html:not(.dark) .svc-img, html:not(.dark) .photo-img { filter: grayscale(1) contrast(1.05) brightness(1.02); }
/* Tinte ámbar sobre la foto en blanco y negro */
.svc-media::before, .photo-media::before {
  content: ""; position: absolute; inset: 0; z-index: 1; pointer-events: none;
  background: linear-gradient(135deg, rgb(var(--brand-amber-light) / .55), rgb(var(--brand-amber-600) / .45));
  mix-blend-mode: color; opacity: .55; transition: opacity .6s ease;
}
/* La foto se desvanece hacia la tarjeta con una máscara en la propia imagen
   (un degradado superpuesto deja una línea visible: la imagen transformada
   se pinta por encima de él) */
.svc-media { background: transparent; }
.svc-img {
  -webkit-mask-image: linear-gradient(to bottom, #000 45%, rgb(0 0 0 / .35) 75%, transparent 94%);
          mask-image: linear-gradient(to bottom, #000 45%, rgb(0 0 0 / .35) 75%, transparent 94%);
}
.svc-media::before {
  -webkit-mask-image: linear-gradient(to bottom, #000 45%, transparent 94%);
          mask-image: linear-gradient(to bottom, #000 45%, transparent 94%);
}
.service-card:hover .svc-img, .photo-media:hover .photo-img { transform: scale(1.08); filter: grayscale(0) contrast(1.04) brightness(1); }
.service-card:hover .svc-media::before, .photo-media:hover::before { opacity: 0; }
/* Fondo sólido para que la foto se funda sin costura con la tarjeta */
.service-card.card { background: rgb(var(--c-surface)); }

/* Atajo sobre la foto: mini tecla grafito */
.svc-shortcut {
  position: absolute; top: .9rem; right: .9rem; z-index: 2;
  padding: .25rem .55rem; border-radius: .5rem;
  font-family: "JetBrains Mono", monospace; font-size: .68rem; color: rgb(var(--brand-white));
  background: rgb(var(--brand-graphite) / .78);
  border: 1px solid rgb(var(--brand-zinc)); border-bottom-width: 3px;
  -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px);
}
.svc-icon-lifted {
  position: relative; z-index: 2; margin-top: -1.6rem;
  background: linear-gradient(rgb(var(--c-accent) / .14), rgb(var(--c-accent) / .14)), rgb(var(--c-surface));
}

/* ---------- Fotos en FAQ y Contacto ---------- */
.photo-media { position: relative; overflow: hidden; margin: 0; background: rgb(var(--c-surface-2)); }
.photo-media::after {
  content: ""; position: absolute; inset: 0; z-index: 1; pointer-events: none;
  background: linear-gradient(to top, rgb(9 9 11 / .78), transparent 55%);
}
.photo-caption { position: absolute; left: 0; right: 0; bottom: 0; z-index: 2; display: flex; flex-wrap: wrap; gap: .5rem; padding: 1rem; }
.photo-chip {
  display: inline-flex; align-items: center; gap: .4rem;
  padding: .4rem .7rem; border-radius: .6rem;
  font-size: .78rem; font-weight: 500; color: rgb(var(--brand-white));
  background: rgb(var(--brand-graphite) / .72);
  border: 1px solid rgb(var(--brand-zinc)); border-bottom-width: 3px;
  -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px);
}
.photo-chip svg { width: .95rem; height: .95rem; color: rgb(var(--brand-amber-light)); }

/* ---------- Tecnologías: la mini tecla se inclina al pasar el mouse ---------- */
.tech-card .tech-badge { transition: transform .35s cubic-bezier(.2,.7,.2,1); }
.tech-card:hover .tech-badge { transform: translateY(-2px) rotate(-6deg) scale(1.06); }

/* ---------- Animaciones ---------- */
@keyframes floatY { 0%, 100% { translate: 0 0; } 50% { translate: 0 -12px; } }
@keyframes keyPress {
  0%, 82%, 92%, 100% { transform: translateY(0); }
  87% { transform: translateY(5px); box-shadow: inset 0 1px 0 rgb(255 255 255 / .45), 0 1px 0 0 rgb(var(--brand-amber-600)), 0 0 60px -4px rgb(var(--brand-amber-light) / .95); }
}
@keyframes blink { 50% { opacity: 0; } }
@keyframes scrollDot { 0% { transform: translateY(0); opacity: 1; } 70% { transform: translateY(14px); opacity: 0; } 100% { transform: translateY(0); opacity: 0; } }
@keyframes iconPop { 0% { transform: scale(1) rotate(0); } 35% { transform: scale(1.14) rotate(-8deg); } 65% { transform: scale(.96) rotate(5deg); } 100% { transform: scale(1) rotate(0); } }
@keyframes spin { to { transform: rotate(360deg); } }
@keyframes pulse { 0% { box-shadow: 0 0 0 0 rgb(37 211 102 / .5); } 70%, 100% { box-shadow: 0 0 0 16px rgb(37 211 102 / 0); } }
@keyframes flash { 0% { box-shadow: 0 0 0 0 rgb(var(--c-accent) / 0); } 30% { box-shadow: 0 0 0 5px rgb(var(--c-accent) / .45); border-color: rgb(var(--c-accent)); } 100% { box-shadow: 0 0 0 0 rgb(var(--c-accent) / 0); } }
@keyframes slowZoom { from { transform: scale(1); } to { transform: scale(1.12); } }
@keyframes gradientShift { from { background-position: 0% 50%; } to { background-position: 100% 50%; } }
@keyframes shine { 0%, 70% { transform: translateX(-130%); } 85%, 100% { transform: translateX(130%); } }

/* ---------- Movimiento reducido ---------- */
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .01ms !important;
    transition-delay: 0ms !important;
  }
  .js .reveal { opacity: 1; transform: none; }
}
