/* ===============================================================
   Nextcodes — camada de identidade e responsivo
   Carregada por todas as paginas, depois do Tailwind.
   Regras aditivas: nada aqui depende de mudar o HTML existente.
   =============================================================== */

:root {
  --ink:        #18181b;
  --ink-soft:   #52525b;
  --muted:      #a1a1aa;
  --line:       #e4e4e7;
  --paper:      #ffffff;
  --paper-warm: #fafaf9;

  /* respiro que acompanha a largura da tela */
  --gutter: clamp(1.25rem, 5vw, 2.5rem);
  --section-y: clamp(3.5rem, 9vw, 7rem);

  --ease-out: cubic-bezier(.22, 1, .36, 1);
  --dur: .7s;
}

/* --------------------------------------------------------------
   Base
   -------------------------------------------------------------- */

html { scroll-behavior: smooth; }

body {
  /* nenhuma pagina deve rolar na horizontal */
  overflow-x: hidden;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}

/* respeita quem pediu menos movimento no sistema */
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation-duration: .001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .001ms !important;
  }
}

::selection {
  background: var(--ink);
  color: #fff;
}

/* foco visivel de verdade — navegacao por teclado deixa de ser adivinhacao */
:focus-visible {
  outline: 2px solid var(--ink);
  outline-offset: 3px;
  border-radius: 2px;
}
.bg-zinc-900 :focus-visible,
.bg-black :focus-visible { outline-color: #fff; }

/* barra de rolagem discreta, no tom da marca */
@supports (scrollbar-width: thin) {
  html { scrollbar-width: thin; scrollbar-color: var(--muted) transparent; }
}
::-webkit-scrollbar { width: 10px; height: 10px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb {
  background: #d4d4d8;
  border: 3px solid var(--paper);
  border-radius: 99px;
}
::-webkit-scrollbar-thumb:hover { background: var(--muted); }

/* ancoras nao ficam escondidas atras do header fixo */
[id] { scroll-margin-top: 6rem; }

/* --------------------------------------------------------------
   Textura — o graozinho que tira o ar de "template"
   -------------------------------------------------------------- */

body::after {
  content: "";
  position: fixed;
  inset: 0;
  z-index: 9998;
  pointer-events: none;
  opacity: .022;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
}

/* --------------------------------------------------------------
   Progresso de leitura
   -------------------------------------------------------------- */

.soul-progress {
  position: fixed;
  top: 0; left: 0;
  height: 2px;
  width: 100%;
  transform: scaleX(0);
  transform-origin: 0 50%;
  background: var(--ink);
  z-index: 9999;
  pointer-events: none;
  transition: transform .1s linear, opacity .3s ease;
}

/* --------------------------------------------------------------
   Header vivo: encolhe ao descer, some ao rolar para baixo
   -------------------------------------------------------------- */

#siteHeader {
  transition: transform .55s var(--ease-out), background-color .35s ease,
              box-shadow .3s ease, backdrop-filter .3s ease;
  will-change: transform;
}
#siteHeader.is-stuck {
  background-color: rgba(255,255,255,.86);
  backdrop-filter: saturate(180%) blur(14px);
  box-shadow: 0 1px 0 rgba(24,24,27,.08), 0 12px 32px -24px rgba(24,24,27,.5);
}
#siteHeader.is-hidden { transform: translateY(-100%); }

/* alvos de toque decentes no mobile */
@media (max-width: 1023px) {
  #siteHeader nav a,
  #mobileMenu a,
  #menuToggle { min-height: 44px; display: flex; align-items: center; }
  #mobileMenu a { padding-block: .35rem; }
}

/* --------------------------------------------------------------
   Revelacao em cascata
   O estado inicial so existe quando o JS assume (.soul-js),
   entao sem JS a pagina continua legivel.
   -------------------------------------------------------------- */

.soul-js [data-soul-reveal] {
  opacity: 0;
  transform: translateY(18px);
  transition: opacity var(--dur) var(--ease-out), transform var(--dur) var(--ease-out);
}
.soul-js [data-soul-reveal].is-visible {
  opacity: 1;
  transform: none;
}

/* --------------------------------------------------------------
   Micro-interacoes
   -------------------------------------------------------------- */

/* links de navegacao e rodape ganham um traco que cresce */
#siteHeader nav a:not([class*="bg-zinc-900"]),
footer a:not([class*="bg-"]) {
  position: relative;
}
#siteHeader nav a:not([class*="bg-zinc-900"])::after,
footer a:not([class*="bg-"])::after {
  content: "";
  position: absolute;
  left: 0; bottom: -3px;
  height: 1px; width: 100%;
  background: currentColor;
  transform: scaleX(0);
  transform-origin: 100% 50%;
  transition: transform .4s var(--ease-out);
}
#siteHeader nav a:hover::after,
footer a:hover::after {
  transform: scaleX(1);
  transform-origin: 0 50%;
}

/* botoes solidos: sobem 1px e afundam ao clicar */
a[class*="bg-zinc-900"],
button[class*="bg-zinc-900"],
a[class*="bg-white"][class*="text-zinc-900"] {
  transition: transform .25s var(--ease-out), background-color .25s ease, box-shadow .25s var(--ease-out);
}
a[class*="bg-zinc-900"]:hover,
button[class*="bg-zinc-900"]:hover {
  transform: translateY(-1px);
  box-shadow: 0 10px 24px -14px rgba(24,24,27,.9);
}
a[class*="bg-zinc-900"]:active,
button[class*="bg-zinc-900"]:active { transform: translateY(0); }

/* cartoes de plano respiram no hover (so onde ha mouse) */
@media (hover: hover) and (min-width: 768px) {
  [data-animate]:has(> ul),
  .plan-card {
    transition: transform .5s var(--ease-out);
  }
  [data-animate]:has(> ul):hover { transform: translateY(-4px); }
}

/* imagens de trabalho com leve zoom */
.work-thumb, .work-thumb img { transition: transform .6s var(--ease-out), filter .6s ease; }
a:hover > .work-thumb, .work-thumb:hover { transform: scale(1.04); }

/* --------------------------------------------------------------
   Foco luminoso nas secoes escuras (ligado pelo JS no desktop)
   -------------------------------------------------------------- */

.soul-spotlight { position: relative; isolation: isolate; }
.soul-spotlight::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  opacity: 0;
  transition: opacity .5s ease;
  background: radial-gradient(
    420px circle at var(--mx, 50%) var(--my, 50%),
    rgba(255,255,255,.07),
    transparent 65%
  );
}
.soul-spotlight:hover::before { opacity: 1; }
.soul-spotlight > * { position: relative; z-index: 1; }

/* --------------------------------------------------------------
   Responsivo — correcoes gerais
   -------------------------------------------------------------- */

/* qualquer bloco largo demais rola dentro de si, nunca a pagina inteira */
.soul-scroll-x {
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  scrollbar-width: thin;
}

/* nunca deixa midia estourar a coluna */
img, svg, video, canvas { max-width: 100%; height: auto; }

/* palavras longas (e-mails, URLs) quebram em vez de empurrar o layout */
p, li, h1, h2, h3, td, th, span { overflow-wrap: break-word; }

/* titulos gigantes nao encostam nas bordas no celular */
@media (max-width: 640px) {
  h1, h2 { letter-spacing: -.02em; }
  .max-w-\[1200px\] { padding-inline: max(var(--gutter), env(safe-area-inset-left)); }
}

/* widget de contato acima da barra de gestos do iOS */
#contactWidget {
  bottom: calc(1.5rem + env(safe-area-inset-bottom));
  right: calc(1.5rem + env(safe-area-inset-right));
}

/* --------------------------------------------------------------
   Troca de pagina — o site deixa de "piscar" branco entre telas
   O estado inicial so existe com .soul-js: sem JS, nada some.
   -------------------------------------------------------------- */

.soul-js body {
  animation: soulEntrada .5s var(--ease-out) both;
}

@keyframes soulEntrada {
  from { opacity: 0; transform: translateY(8px); }
  to   { opacity: 1; transform: none; }
}

.soul-js body.is-leaving {
  opacity: 0;
  transform: translateY(-6px);
  transition: opacity .18s ease-in, transform .18s ease-in;
}

/* o header nao acompanha o fade da saida: some junto e fica estranho */
.soul-js body.is-leaving #siteHeader { opacity: 1; }

@media (prefers-reduced-motion: reduce) {
  .soul-js body,
  .soul-js body.is-leaving { animation: none; opacity: 1; transform: none; }
}