/* ============================================================
   MONTVUMBA — website institucional

   Linguagem editorial: tipografia grande em Manrope leve, com a
   palavra que importa a negrito; filetes finos e índices numerados a
   organizar a página; e o relevo — curvas de nível, a montanha do nome —
   como assinatura gráfica. Sem cartões arredondados nem faixas em
   degradê: o desenho vem da grelha, da tipografia e da fotografia.
   ============================================================ */

/* As fontes vêm do próprio site (fonts/, licença em fonts/OFL.txt): nenhuma
   página pede nada ao Google. São fontes variáveis, só nos alfabetos latinos.
   O português e o inglês usam apenas os ficheiros «latin»; os «latin-ext» só
   se descarregam se a página tiver letras como Ł, Ő ou Š. */
@font-face {
    font-family: 'Manrope';
    font-style: normal;
    font-weight: 300 800;
    font-display: swap;
    src: url('fonts/manrope-latin-ext.woff2') format('woff2');
    unicode-range:
        U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329,
        U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113,
        U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
    font-family: 'Manrope';
    font-style: normal;
    font-weight: 300 800;
    font-display: swap;
    src: url('fonts/manrope-latin.woff2') format('woff2');
    unicode-range:
        U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308,
        U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
    font-family: 'Inter';
    font-style: normal;
    font-weight: 400 700;
    font-display: swap;
    src: url('fonts/inter-latin-ext.woff2') format('woff2');
    unicode-range:
        U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329,
        U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113,
        U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
    font-family: 'Inter';
    font-style: normal;
    font-weight: 400 700;
    font-display: swap;
    src: url('fonts/inter-latin.woff2') format('woff2');
    unicode-range:
        U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308,
        U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

:root {
    --ink: #0b1b2b;
    --text: #2e3d4f;
    --muted: #5b6b7f;
    --navy: #082b50;
    --deep: #05182c;
    --blue: #087cc8;
    --link: #0a6cb0;
    --sky: #12a0e8;
    --paper: #ffffff;
    --mist: #f2f5f9;
    --line: rgba(11, 27, 43, 0.13);
    --line-strong: rgba(11, 27, 43, 0.3);
    --line-dark: rgba(255, 255, 255, 0.16);
    --on-dark: rgba(255, 255, 255, 0.76);
    --display: 'Manrope', 'Segoe UI', Arial, sans-serif;
    --body: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
    --ease: cubic-bezier(0.2, 0.75, 0.25, 1);
    --gutter: clamp(20px, 4vw, 56px);
    --header: 84px;
    --section: clamp(88px, 11vw, 168px);
}

* {
    box-sizing: border-box;
}
html {
    scroll-behavior: smooth;
}
/* Uma âncora (#proposta) não fica escondida debaixo do cabeçalho fixo. */
[id] {
    scroll-margin-top: calc(var(--header) + 16px);
}
body {
    margin: 0;
    font-family: var(--body);
    font-size: 17px;
    line-height: 1.65;
    color: var(--text);
    background: var(--paper);
    -webkit-font-smoothing: antialiased;
    text-rendering: optimizeLegibility;
}
.menu-open {
    overflow: hidden;
}
img {
    max-width: 100%;
    display: block;
}
a {
    color: var(--link);
    text-decoration: none;
}
p {
    margin: 0 0 1em;
}
h1,
h2,
h3,
h4 {
    font-family: var(--display);
    color: var(--ink);
    font-weight: 300;
    letter-spacing: -0.03em;
    line-height: 1.04;
    margin: 0 0 0.5em;
    text-wrap: balance;
}
h1 {
    font-size: clamp(42px, 6.2vw, 100px);
}
h2 {
    font-size: clamp(34px, 4.4vw, 68px);
}
h3 {
    font-size: clamp(20px, 1.6vw, 24px);
    font-weight: 600;
    letter-spacing: -0.01em;
    line-height: 1.25;
}
/* A palavra em destaque dos títulos (*assim*, no portal). */
:is(h1, h2, .display) strong {
    font-weight: 700;
    color: var(--blue);
}
.dark :is(h1, h2, .display) strong,
.hero :is(h1, h2) strong {
    color: inherit;
}
:focus-visible {
    outline: 2px solid var(--sky);
    outline-offset: 3px;
}
.skip {
    position: absolute;
    left: 16px;
    top: -60px;
    z-index: 100;
    padding: 10px 16px;
    background: var(--ink);
    color: var(--paper);
}
.skip:focus {
    top: 12px;
}
.container {
    width: min(1360px, 100% - 2 * var(--gutter));
    margin-inline: auto;
}
.lead {
    font-size: clamp(18px, 1.5vw, 21px);
    line-height: 1.55;
    color: var(--text);
    max-width: 46ch;
}
.display {
    font-family: var(--display);
    font-weight: 300;
    font-size: clamp(24px, 2.4vw, 36px);
    line-height: 1.22;
    letter-spacing: -0.02em;
    color: var(--ink);
    text-wrap: pretty;
}
.meta {
    font-size: 14px;
    color: var(--muted);
}
.kicker {
    display: block;
    font-size: 14px;
    font-weight: 500;
    color: var(--muted);
    margin-bottom: 18px;
}

/* --- Ligações e botões ------------------------------------------
   Uma ligação de texto com seta para o que é secundário; um botão
   rectangular para a acção principal de cada bloco. */
.link {
    display: inline-flex;
    align-items: center;
    gap: 10px;
    padding: 6px 0;
    font-weight: 600;
    font-size: 15px;
    color: var(--ink);
    background: linear-gradient(currentColor, currentColor) left bottom / 100% 1px no-repeat;
    transition:
        background-size 0.45s var(--ease),
        color 0.25s var(--ease);
}
.link::after {
    content: '→';
    transition: transform 0.35s var(--ease);
}
.link:hover {
    color: var(--blue);
    background-size: 0 1px;
}
.link:hover::after {
    transform: translateX(5px);
}
.link.back::after {
    content: none;
}
.link.back::before {
    content: '←';
    transition: transform 0.35s var(--ease);
}
.link.back:hover::before {
    transform: translateX(-5px);
}
.link.out::after {
    content: '↗';
}
.dark .link,
.hero .link {
    color: var(--paper);
}
.dark .link:hover,
.hero .link:hover {
    color: var(--sky);
}
.btn {
    display: inline-flex;
    align-items: center;
    gap: 14px;
    padding: 17px 26px;
    font: 600 15px/1 var(--body);
    border: 1px solid var(--ink);
    color: var(--ink);
    background: transparent;
    cursor: pointer;
    transition:
        background-color 0.3s var(--ease),
        color 0.3s var(--ease),
        border-color 0.3s var(--ease);
}
.btn::after {
    content: '→';
    transition: transform 0.35s var(--ease);
}
.btn:hover {
    background: var(--ink);
    color: var(--paper);
    text-decoration: none;
}
.btn:hover::after {
    transform: translateX(5px);
}
.btn-solid {
    background: var(--navy);
    border-color: var(--navy);
    color: var(--paper);
}
.btn-solid:hover {
    background: var(--blue);
    border-color: var(--blue);
}
.btn-light {
    background: var(--paper);
    border-color: var(--paper);
    color: var(--ink);
}
.btn-light:hover {
    background: transparent;
    color: var(--paper);
}
.btn.out::after {
    content: '↗';
}

/* --- Cabeçalho --------------------------------------------------
   Fixo. Na página inicial começa transparente sobre o banner e ganha
   fundo ao descer; nas outras páginas tem fundo desde o início. */
.site-header {
    position: fixed;
    inset: 0 0 auto 0;
    z-index: 50;
    color: var(--ink);
    background: rgba(255, 255, 255, 0.96);
    border-bottom: 1px solid var(--line);
    backdrop-filter: blur(14px);
    transition:
        background-color 0.4s var(--ease),
        border-color 0.4s var(--ease),
        color 0.4s var(--ease);
}
.is-home .site-header:not(.is-scrolled):not(.open) {
    background: transparent;
    border-bottom-color: transparent;
    backdrop-filter: none;
    color: var(--paper);
}
.is-home .site-header:not(.is-scrolled):not(.open) .brand-word {
    filter: brightness(0) invert(1);
}
.header-bar {
    display: flex;
    align-items: center;
    gap: 28px;
    height: var(--header);
    transition: height 0.4s var(--ease);
}
.site-header.is-scrolled .header-bar {
    height: 68px;
}
/* O logótipo do cabeçalho tem o seu zoom: entra a crescer ao abrir a
   página (no bloco do movimento, mais abaixo), a montanha aproxima-se ao
   passar o rato, e o conjunto encolhe um pouco quando o cabeçalho encolhe
   ao descer. */
.brand {
    display: flex;
    align-items: center;
    gap: 10px;
    flex-shrink: 0;
    transform-origin: left center;
    transition: transform 0.5s var(--ease);
}
.site-header.is-scrolled:not(.open) .brand {
    transform: scale(0.9);
}
.brand-symbol {
    height: 32px;
    width: auto;
    transform-origin: center bottom;
    transition: transform 0.6s var(--ease);
}
.brand:is(:hover, :focus-visible) .brand-symbol {
    transform: scale(1.14);
}
.brand-word {
    height: 14px;
    width: auto;
    transition: filter 0.4s var(--ease);
}
.site-nav {
    display: flex;
    align-items: center;
    gap: 26px;
    margin-left: auto;
}
.site-nav > a {
    position: relative;
    padding: 8px 0;
    font-size: 15px;
    font-weight: 500;
    color: inherit;
    white-space: nowrap;
}
.site-nav > a::after {
    content: '';
    position: absolute;
    left: 0;
    right: 0;
    bottom: 2px;
    height: 1px;
    background: currentColor;
    transform: scaleX(0);
    transform-origin: right;
    transition: transform 0.4s var(--ease);
}
.site-nav > a:hover::after,
.site-nav > a[aria-current='page']::after {
    transform: scaleX(1);
    transform-origin: left;
}
.header-tools {
    display: flex;
    align-items: center;
    gap: 26px;
    padding-left: 26px;
    border-left: 1px solid currentColor;
    border-left-color: color-mix(in srgb, currentColor 22%, transparent);
}
.lang-switch {
    padding: 8px 0;
    font-size: 14px;
    font-weight: 600;
    color: inherit;
    white-space: nowrap;
}
.lang-switch:hover {
    color: var(--blue);
}
.is-home .site-header:not(.is-scrolled):not(.open) .lang-switch:hover,
.site-header.open .lang-switch:hover {
    color: var(--sky);
}
/* Duas linhas, a de baixo mais curta; ao passar o rato ficam iguais, e ao
   abrir cruzam-se num X. */
.menu-toggle {
    display: inline-flex;
    align-items: center;
    gap: 12px;
    padding: 10px 0;
    background: none;
    border: 0;
    font: 600 14px var(--body);
    color: inherit;
    cursor: pointer;
}
.menu-icon {
    position: relative;
    width: 26px;
    height: 12px;
}
.menu-icon i {
    position: absolute;
    left: 0;
    height: 1.5px;
    border-radius: 2px;
    background: currentColor;
    transition:
        top 0.35s var(--ease),
        width 0.35s var(--ease),
        transform 0.45s var(--ease);
}
.menu-icon i:first-child {
    top: 0;
    width: 26px;
}
.menu-icon i:last-child {
    top: 10px;
    width: 16px;
}
.menu-toggle:hover .menu-icon i:last-child {
    width: 26px;
}
.site-header.open .menu-icon i {
    top: 5px;
    width: 24px;
}
.site-header.open .menu-icon i:first-child {
    transform: rotate(45deg);
}
.site-header.open .menu-icon i:last-child {
    transform: rotate(-45deg);
}
.menu-label .when-open,
.site-header.open .menu-label .when-closed {
    display: none;
}
.site-header.open .menu-label .when-open {
    display: inline;
}
/* Com o menu aberto, o cabeçalho fica por cima dele, claro sobre escuro, e
   as ligações principais saem: estão todas no menu. Sem desfoque, que faria
   do cabeçalho a referência do menu fixo. */
.site-header.open {
    background: transparent;
    border-bottom-color: var(--line-dark);
    backdrop-filter: none;
    color: var(--paper);
}
.site-header.open .brand-word {
    filter: brightness(0) invert(1);
}
.site-header.open .site-nav {
    visibility: hidden;
}

/* --- Menu de ecrã inteiro -----------------------------------------
   As páginas em letra grande e numeradas; ao lado, os contactos, a língua
   e a área corporativa. Desce como uma cortina e as ligações entram uma a
   uma. Fechado, fica escondido e inerte. */
.site-menu {
    position: fixed;
    inset: 0;
    z-index: 49;
    display: flex;
    align-items: center;
    padding: calc(var(--header) + 32px) 0 48px;
    overflow-y: auto;
    background: var(--deep) url('/site/relevo-claro.svg') right center / cover no-repeat;
    color: var(--paper);
    visibility: hidden;
    clip-path: inset(0 0 100% 0);
    transition:
        clip-path 0.7s var(--ease),
        visibility 0s linear 0.7s;
}
.menu-open .site-menu {
    visibility: visible;
    clip-path: inset(0);
    transition:
        clip-path 0.7s var(--ease),
        visibility 0s;
}
.menu-grid {
    display: grid;
    grid-template-columns: minmax(0, 7fr) minmax(0, 4fr);
    gap: clamp(40px, 6vw, 96px);
    align-items: end;
}
.menu-nav ol {
    margin: 0;
    padding: 0;
    list-style: none;
}
.menu-nav li {
    opacity: 0;
    transform: translateY(28px);
    transition:
        opacity 0.5s var(--ease),
        transform 0.7s var(--ease);
}
.menu-open .menu-nav li {
    opacity: 1;
    transform: none;
    transition-delay: calc(0.2s + var(--i) * 0.05s);
}
.menu-nav a {
    display: flex;
    align-items: baseline;
    gap: 18px;
    padding: 4px 0;
    font-family: var(--display);
    font-size: clamp(30px, 4.4vw, 60px);
    font-weight: 300;
    line-height: 1.12;
    letter-spacing: -0.03em;
    color: var(--paper);
}
.menu-n {
    min-width: 2ch;
    font-size: 13px;
    font-weight: 700;
    letter-spacing: 0;
    color: var(--sky);
    transform: translateY(-0.9em);
}
.menu-text {
    transition:
        color 0.3s var(--ease),
        transform 0.45s var(--ease);
}
.menu-nav a:hover .menu-text,
.menu-nav a:focus-visible .menu-text {
    color: var(--sky);
    transform: translateX(10px);
}
.menu-nav a[aria-current='page'] .menu-text {
    color: var(--sky);
}
.menu-side {
    display: grid;
    gap: 36px;
    padding-bottom: 10px;
    opacity: 0;
    transform: translateY(20px);
    transition:
        opacity 0.5s var(--ease),
        transform 0.7s var(--ease);
}
.menu-open .menu-side {
    opacity: 1;
    transform: none;
    transition-delay: 0.45s;
}
.menu-kicker {
    display: block;
    margin-bottom: 6px;
    font-size: 13px;
    font-weight: 700;
    color: var(--sky);
}
.menu-block {
    display: grid;
    justify-items: start;
    gap: 10px;
    font-size: 16px;
    color: var(--on-dark);
}
.menu-block a {
    color: var(--paper);
}
.menu-block a:hover {
    color: var(--sky);
}
.menu-langs {
    display: flex;
    gap: 22px;
}
.menu-langs a[aria-current] {
    text-decoration: underline;
    text-underline-offset: 6px;
}
/* A barra do progresso de leitura, no fundo do cabeçalho. */
.scroll-progress {
    display: none;
    position: absolute;
    left: 0;
    right: 0;
    bottom: -1px;
    height: 2px;
    background: var(--blue);
    transform-origin: 0 50%;
}
body:not(.is-home) main {
    padding-top: var(--header);
}

/* --- Secções ----------------------------------------------------- */
.section {
    position: relative;
    padding: var(--section) 0;
}
.section.mist {
    background: var(--mist);
}
/* A secção que continua o cabeçalho da página começa sem espaço extra. */
.section.flush {
    padding-top: 0;
}
.section.dark,
.dark {
    background: var(--deep);
    color: var(--on-dark);
}
.dark :is(h2, h3) {
    color: var(--paper);
}
/* O relevo por trás: curvas de nível, subtis. */
.relevo {
    isolation: isolate;
}
.relevo::before {
    content: '';
    position: absolute;
    inset: 0;
    z-index: -1;
    background: url('/site/relevo-escuro.svg') right center / cover no-repeat;
    pointer-events: none;
}
.dark.relevo::before,
.relevo.dark::before {
    background-image: url('/site/relevo-claro.svg');
}
/* O índice que abre cada secção: número, nome e um filete. */
.index {
    display: flex;
    align-items: center;
    gap: 16px;
    margin-bottom: clamp(40px, 6vw, 84px);
    font-size: 14px;
    font-weight: 500;
    color: var(--muted);
}
.index-n {
    font-family: var(--display);
    font-weight: 700;
    color: var(--blue);
    font-variant-numeric: tabular-nums;
}
.index-rule {
    flex: 1;
    height: 1px;
    background: var(--line);
    transform-origin: left;
}
.dark .index {
    color: rgba(255, 255, 255, 0.6);
}
.dark .index-n {
    color: var(--sky);
}
.dark .index-rule {
    background: var(--line-dark);
}
.section-title {
    display: flex;
    align-items: flex-end;
    justify-content: space-between;
    gap: 32px;
    margin-bottom: clamp(36px, 5vw, 72px);
}
.section-title h2 {
    margin: 0;
    max-width: 16ch;
}
.section-title .link {
    flex-shrink: 0;
}

/* --- Banner da página inicial -------------------------------------
   Fotografia ou vídeo a toda a página, o título grande em baixo à
   esquerda e uma barra de factos a fechar. Sem imagem, o relevo. */
.hero {
    position: relative;
    isolation: isolate;
    min-height: 100vh;
    min-height: 100svh;
    display: flex;
    flex-direction: column;
    justify-content: flex-end;
    padding-top: calc(var(--header) + 48px);
    overflow: hidden;
    background: var(--deep);
    color: var(--on-dark);
}
.hero:not(:has(.hero-media))::before {
    content: '';
    position: absolute;
    inset: 0;
    z-index: -1;
    background: url('/site/relevo-claro.svg') right center / cover no-repeat;
}
.hero-media,
.hero-shade {
    position: absolute;
    inset: 0;
    z-index: -1;
}
.hero-media img,
.hero-media video {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
}
/* Profundidade no banner, sem 3D pesado nem scroll alheio ao do browser: a
   fotografia, duas camadas de nevoeiro e o texto movem-se a velocidades
   diferentes — com o scroll e, num ecrã com rato, com o ponteiro (--px e
   --py, de -0,5 a 0,5, postos pelo site.js). Só transform, translate e
   opacity: tudo corre na placa gráfica. */
.hero {
    --px: 0;
    --py: 0;
}
.hero .hero-media {
    /* Uma margem escondida, para o ponteiro não destapar as arestas. */
    inset: -28px;
    translate: calc(var(--px) * -16px) calc(var(--py) * -10px);
    transition: translate 0.9s var(--ease);
}
.hero-fog,
.hero-descend {
    position: absolute;
    z-index: -1;
    pointer-events: none;
}
.hero-fog {
    inset: 0;
    overflow: hidden;
}
.fog-depth {
    position: absolute;
    right: -60px;
    left: -60px;
    transition: translate 0.9s var(--ease);
}
/* Leve: dá ar sem esconder as imagens, que agora mudam. */
.fog-far {
    bottom: 16%;
    height: 50%;
    opacity: 0.26;
    translate: calc(var(--px) * -26px) calc(var(--py) * -12px);
}
.fog-near {
    bottom: -8%;
    height: 62%;
    opacity: 0.42;
    translate: calc(var(--px) * -52px) calc(var(--py) * -22px);
}
/* A textura liga o fim ao princípio: com o dobro da largura e a deslizar
   metade, o nevoeiro passa sem costura. */
.fog {
    position: absolute;
    inset: 0 auto 0 0;
    width: 200%;
    background: url('/site/nevoa.webp') repeat-x left bottom / 50% 100%;
    animation: fog-drift 150s linear infinite;
}
.fog-near .fog {
    animation-duration: 95s;
    animation-direction: reverse;
}
/* Fora do ecrã, o nevoeiro e a imagem param. */
.hero.is-away :is(.fog, .hero-photo) {
    animation-play-state: paused;
}
@keyframes fog-drift {
    to {
        transform: translateX(-50%);
    }
}
/* Ao descer, a névoa sobe e o banner desfaz-se no branco do «Quem somos». */
.hero-descend {
    /* Dois píxeis abaixo da aresta, escondidos: o arredondamento não deixa
       espreitar a fotografia por uma linha. */
    inset: auto 0 -2px;
    height: 90%;
    background:
        url('/site/nevoa.webp') repeat-x left bottom / 1200px 100%,
        linear-gradient(
            to top,
            var(--paper) 24%,
            rgba(255, 255, 255, 0.8) 54%,
            rgba(255, 255, 255, 0)
        );
    /* Presa à base do banner e sempre branca na aresta de baixo: cresce para
       cima sem deixar linha entre o banner e o «Quem somos». */
    transform: scaleY(0);
    transform-origin: bottom;
}
/* O vídeo só aparece quando já está a tocar: até lá vê-se a imagem. */
.hero-media video {
    opacity: 0;
    transition: opacity 0.9s var(--ease);
}
.hero-media video.is-playing {
    opacity: 1;
}
/* Escuro que chegue para o título branco se ler sobre qualquer das imagens
   (paredes de mármore, janelas, um céu ao nascer do sol): mais forte em
   baixo e do lado do título, mais leve à direita, onde a imagem respira. */
.hero-shade {
    background:
        linear-gradient(180deg, rgba(5, 24, 44, 0.62) 0%, rgba(5, 24, 44, 0) 28%),
        linear-gradient(
            90deg,
            rgba(5, 24, 44, 0.5) 0%,
            rgba(5, 24, 44, 0.12) 60%,
            rgba(5, 24, 44, 0) 85%
        ),
        linear-gradient(
            0deg,
            rgba(5, 24, 44, 0.9) 0%,
            rgba(5, 24, 44, 0.5) 50%,
            rgba(5, 24, 44, 0.3) 100%
        );
}
.hero-inner {
    padding-bottom: clamp(48px, 7vw, 96px);
}
/* Uma frase por linha: largura para a frase inteira caber. */
.hero-title {
    font-size: clamp(44px, 6.6vw, 112px);
    line-height: 0.98;
    letter-spacing: -0.045em;
    color: var(--paper);
    max-width: 24ch;
    margin: 0;
    text-shadow: 0 2px 30px rgba(5, 24, 44, 0.25);
}
.hero-title .line {
    display: block;
}
.hero-bar .container {
    display: flex;
    align-items: center;
    min-height: 86px;
}
.hero-tools {
    display: flex;
    align-items: center;
    gap: 22px;
    margin-left: auto;
}
.scroll-cue {
    display: inline-flex;
    align-items: center;
    gap: 10px;
    font-size: 14px;
    font-weight: 500;
    color: rgba(255, 255, 255, 0.82);
}
.scroll-cue::after {
    content: '↓';
    animation: nudge 2.4s var(--ease) infinite;
}
@keyframes nudge {
    50% {
        transform: translateY(4px);
    }
}
/* Os botões de pausa das imagens e do vídeo. */
.hero-toggle {
    width: 44px;
    height: 44px;
    border-radius: 50%;
    border: 1px solid rgba(255, 255, 255, 0.5);
    background: transparent;
    color: var(--paper);
    display: grid;
    place-items: center;
    cursor: pointer;
    transition: border-color 0.25s var(--ease);
}
.hero-toggle:hover {
    border-color: var(--paper);
}
.hero-toggle[hidden],
.hero-toggle .icon-pause,
.hero-toggle[data-state='playing'] .icon-play {
    display: none;
}
.hero-toggle[data-state='playing'] .icon-pause {
    display: block;
}
/* Os números do grupo, em «Quem somos», quando a administração os liga. */
.facts {
    grid-column: 1 / -1;
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
    margin: clamp(56px, 7vw, 104px) 0 0;
    border-top: 1px solid var(--line);
}
.fact {
    display: flex;
    flex-direction: column;
    padding: 24px 24px 0 0;
}
.fact dt {
    order: 2;
    margin-top: 6px;
    font-size: 14px;
    color: var(--muted);
}
.fact dd {
    margin: 0;
    font-family: var(--display);
    font-size: clamp(40px, 4.2vw, 64px);
    font-weight: 300;
    line-height: 1;
    color: var(--ink);
    font-variant-numeric: tabular-nums;
}

/* --- Cabeçalho das páginas interiores ------------------------------
   Claro, com o título grande e, se a página tiver fotografia, uma faixa
   larga logo abaixo — a imagem não fica atrás do texto. */
.page-head {
    padding: clamp(64px, 9vw, 132px) 0 clamp(48px, 6vw, 88px);
}
.page-kicker {
    display: flex;
    gap: 10px;
    margin-bottom: clamp(24px, 3vw, 40px);
    font-size: 14px;
    font-weight: 500;
    color: var(--muted);
}
.page-kicker a {
    color: inherit;
}
.page-kicker a:hover {
    color: var(--blue);
}
.page-head h1 {
    max-width: 18ch;
    margin-bottom: 0;
}
.page-head .page-lead {
    max-width: 52ch;
    margin: clamp(28px, 3.5vw, 48px) 0 0 auto;
    font-size: clamp(18px, 1.5vw, 21px);
    line-height: 1.55;
}
.page-band {
    position: relative;
    margin: 0;
    height: clamp(280px, 52vw, 680px);
    overflow: hidden;
    background: var(--deep);
}
.page-band img {
    position: absolute;
    inset: -8% 0;
    width: 100%;
    height: 116%;
    object-fit: cover;
}

/* --- Página inicial: quem somos ---------------------------------- */
.manifesto {
    display: grid;
    grid-template-columns: repeat(12, minmax(0, 1fr));
    column-gap: clamp(20px, 3vw, 40px);
}
.manifesto-title {
    grid-column: 1 / span 9;
    margin-bottom: clamp(48px, 7vw, 104px);
}
/* Horizontal, como as fotografias de equipa e de escritório: numa reunião
   cabem as pessoas todas. Acaba à altura do fim do texto ao lado. */
.manifesto-media {
    grid-column: 1 / span 6;
    align-self: end;
    margin: 0;
    aspect-ratio: 16 / 10;
    overflow: hidden;
    background: var(--mist) url('/site/relevo-escuro.svg') center / cover no-repeat;
}
.manifesto-media img {
    width: 100%;
    height: 100%;
    object-fit: cover;
}
/* Faixa de fotografia a toda a largura, entre o título e o conteúdo de uma
   secção: começa com as margens do texto e, ao passar, abre-se até às da
   página (no bloco do movimento, mais abaixo). */
.band {
    height: clamp(260px, 44vw, 600px);
    margin: 0 0 clamp(48px, 6vw, 88px);
    overflow: hidden;
    background: var(--deep);
}
.band img {
    width: 100%;
    height: 100%;
    object-fit: cover;
}
.manifesto-body {
    grid-column: 8 / span 5;
    align-self: end;
}
.manifesto-body .display {
    margin-bottom: clamp(36px, 4vw, 56px);
}
.pillars {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 32px;
    margin: 0 0 clamp(36px, 4vw, 56px);
    padding-top: 28px;
    border-top: 1px solid var(--line);
}
.pillars dt {
    margin-bottom: 8px;
    font-size: 14px;
    font-weight: 600;
    color: var(--blue);
}
.pillars dd {
    margin: 0;
    color: var(--text);
}

/* --- Página inicial: as empresas ----------------------------------
   Uma parede de logótipos em grelha de filetes, não cartões. */
.logo-wall {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
    margin: 0;
    padding: 0;
    list-style: none;
    border-top: 1px solid var(--line);
    border-left: 1px solid var(--line);
}
.logo-wall li {
    border-right: 1px solid var(--line);
    border-bottom: 1px solid var(--line);
}
.logo-cell {
    display: grid;
    grid-template-rows: 1fr auto auto;
    gap: 6px;
    min-height: 260px;
    padding: 28px;
    color: var(--ink);
    transition: background-color 0.35s var(--ease);
}
.logo-cell:hover {
    background: var(--paper);
}
.logo-mark {
    display: grid;
    place-items: center start;
    min-height: 96px;
}
/* Os logótipos das empresas nas suas cores: a cinzento pareciam apagados. */
.logo-mark img {
    max-width: 150px;
    max-height: 72px;
    object-fit: contain;
}
.initials {
    font-family: var(--display);
    font-size: 40px;
    font-weight: 300;
    color: var(--navy);
}
.logo-name {
    font-family: var(--display);
    font-weight: 600;
    font-size: 18px;
}
.logo-meta {
    font-size: 14px;
    color: var(--muted);
}

/* --- Listas-índice: áreas e serviços ------------------------------
   Uma linha por entrada, separadas por filetes, com o número, o título
   grande, o texto e a fotografia, se houver. */
.index-list {
    margin: 0;
    padding: 0;
    list-style: none;
    border-bottom: 1px solid var(--line);
}
.index-item {
    display: grid;
    grid-template-columns: 72px minmax(0, 5fr) minmax(0, 4fr) 180px;
    gap: 28px;
    align-items: start;
    padding: clamp(26px, 3vw, 40px) 0;
    border-top: 1px solid var(--line);
}
.item-n {
    padding-top: 0.55em;
    font-family: var(--display);
    font-weight: 700;
    font-size: 14px;
    color: var(--blue);
    font-variant-numeric: tabular-nums;
}
.item-title {
    margin: 0;
    font-size: clamp(26px, 2.6vw, 40px);
    font-weight: 300;
    letter-spacing: -0.02em;
    line-height: 1.12;
    transition:
        transform 0.45s var(--ease),
        color 0.3s var(--ease);
}
.index-item:hover .item-title {
    transform: translateX(8px);
    color: var(--blue);
}
.item-text {
    margin: 0.4em 0 0;
    color: var(--text);
}
.item-tag {
    display: block;
    margin-top: 12px;
    font-size: 14px;
    color: var(--muted);
}
.item-companies {
    display: flex;
    flex-wrap: wrap;
    gap: 6px 18px;
    margin-top: 16px;
    font-size: 15px;
}
.item-companies a {
    font-weight: 600;
}
.item-media {
    aspect-ratio: 4 / 3;
    overflow: hidden;
    background: var(--mist);
}
.item-media img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    filter: grayscale(0.85);
    transition:
        filter 0.5s var(--ease),
        transform 0.8s var(--ease);
}
.index-item:hover .item-media img {
    filter: none;
    transform: scale(1.04);
}
.dark .index-list,
.dark .index-item {
    border-color: var(--line-dark);
}
.dark .item-n {
    color: var(--sky);
}
.dark .item-title {
    color: var(--paper);
}
.dark .item-text {
    color: var(--on-dark);
}

/* --- Página inicial: investimentos e parcerias --------------------
   Uma secção escura a toda a largura, com o relevo ou a fotografia. */
.invest {
    isolation: isolate;
    overflow: hidden;
}
.invest .hero-media,
.invest .hero-shade {
    z-index: -1;
}
/* Opaca do lado do título, para apagar o que a fotografia tenha escrito
   (um ecrã, um cartaz), e mais leve à direita, onde ficam as pessoas. */
.invest .hero-shade {
    background: linear-gradient(
        90deg,
        rgb(5, 24, 44) 0%,
        rgba(5, 24, 44, 0.97) 45%,
        rgba(5, 24, 44, 0.75) 75%,
        rgba(5, 24, 44, 0.6) 100%
    );
}
.invest-grid {
    display: grid;
    grid-template-columns: minmax(0, 7fr) minmax(0, 5fr);
    column-gap: clamp(32px, 6vw, 96px);
}
.invest-grid .index {
    grid-column: 1 / -1;
}
.invest-title {
    margin: 0;
    max-width: 14ch;
}
.invest-body p {
    margin-bottom: 36px;
    font-size: 18px;
}
.modal-list {
    margin: 0 0 40px;
    padding: 0;
    list-style: none;
    border-bottom: 1px solid var(--line-dark);
}
.modal-list a {
    display: grid;
    grid-template-columns: 44px 1fr auto;
    gap: 16px;
    align-items: baseline;
    padding: 20px 0;
    border-top: 1px solid var(--line-dark);
    color: var(--paper);
    transition: color 0.3s var(--ease);
}
.modal-list a::after {
    content: '→';
    transition: transform 0.35s var(--ease);
}
.modal-list a:hover {
    color: var(--sky);
}
.modal-list a:hover::after {
    transform: translateX(5px);
}
.modal-n {
    font-family: var(--display);
    font-weight: 700;
    font-size: 14px;
    color: var(--sky);
}
.modal-name {
    font-family: var(--display);
    font-size: 22px;
    font-weight: 400;
}

/* --- Página inicial: onde estamos ---------------------------------
   Moçambique em curvas de nível, com os locais do grupo marcados pelo
   mesmo número na lista e no mapa. */
.presence-grid {
    display: grid;
    grid-template-columns: minmax(0, 6fr) minmax(0, 5fr);
    column-gap: clamp(32px, 6vw, 96px);
    align-items: start;
}
.presence-grid .index {
    grid-column: 1 / -1;
}
.presence-text h2 {
    max-width: 14ch;
}
.presence-lead {
    max-width: 44ch;
    margin: 0 0 clamp(32px, 4vw, 48px);
    font-size: 18px;
}
.place-list {
    margin: 0;
    padding: 0;
    list-style: none;
    border-top: 1px solid var(--line);
}
.place {
    display: grid;
    grid-template-columns: 44px minmax(0, 1fr);
    gap: 16px;
    padding: 22px 0;
    border-bottom: 1px solid var(--line);
}
.place-n {
    padding-top: 3px;
    font-family: var(--display);
    font-size: 14px;
    font-weight: 700;
    color: var(--link);
}
.place-name {
    display: block;
    margin-bottom: 4px;
    font-size: 14px;
    font-weight: 600;
    color: var(--muted);
}
.place-title {
    margin: 0;
    font-size: 22px;
    font-weight: 400;
    transition: color 0.3s var(--ease);
}
.place-text {
    margin: 6px 0 0;
    font-size: 15px;
}
.place.is-active .place-title {
    color: var(--link);
}
.presence-map {
    position: relative;
    justify-self: end;
    width: 100%;
    max-width: 440px;
    margin: 0;
}
.presence-map img {
    display: block;
    width: 100%;
    height: auto;
}
.map-points {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    overflow: visible;
}
.map-dot {
    fill: var(--navy);
}
.map-halo {
    fill: var(--sky);
    opacity: 0.2;
    transform-box: fill-box;
    transform-origin: center;
    transition:
        transform 0.35s var(--ease),
        opacity 0.35s var(--ease);
}
.map-point text {
    fill: var(--paper);
    font: 700 9px var(--display);
    text-anchor: middle;
    dominant-baseline: central;
}
.map-point.is-active .map-halo {
    opacity: 0.35;
    transform: scale(1.6);
}
/* A rede do grupo: da sede (o primeiro local) a cada um dos outros. */
.map-link {
    fill: none;
    stroke: var(--link);
    stroke-width: 1.4;
    stroke-linecap: round;
    stroke-dasharray: 1;
    stroke-dashoffset: 0;
    opacity: 0.75;
}
.map-ripple {
    fill: none;
    stroke: var(--link);
    stroke-width: 1.2;
    opacity: 0;
    transform-box: fill-box;
    transform-origin: center;
}
.map-pin {
    transform-box: fill-box;
    transform-origin: center;
}
/* De cada vez que o mapa chega ao ecrã, a animação repete-se: o site.js
   prepara-o (is-armed) e marca-o enquanto se vê (is-playing). A sede emite
   duas ondas, os pontos aparecem um a um e as ligações desenham-se; ao fim
   de uns 4 segundos, tudo pára. Sem JavaScript, ou com menos movimento,
   o mapa fica completo e quieto. */
.presence-map.is-armed:not(.is-playing) :is(.map-pin, .map-link) {
    opacity: 0;
}
.presence-map.is-playing img {
    animation: map-settle 1s var(--ease) both;
}
.presence-map.is-playing .map-pin {
    animation: pin-pop 0.7s var(--ease) both;
    animation-delay: calc(0.35s + var(--i) * 0.18s);
}
.presence-map.is-playing .map-link {
    animation: link-draw 1.3s var(--ease) both;
    animation-delay: calc(0.75s + var(--i) * 0.2s);
}
.presence-map.is-playing .map-ripple {
    animation: map-ripple 1.8s ease-out 2 both;
    animation-delay: 0.2s;
}
.presence-map.is-playing .map-ripple + .map-ripple {
    animation-delay: 1.1s;
}
@keyframes map-settle {
    from {
        opacity: 0.35;
        transform: scale(0.97);
    }
}
@keyframes pin-pop {
    0% {
        opacity: 0;
        transform: scale(0);
    }
    60% {
        opacity: 1;
        transform: scale(1.2);
    }
    100% {
        opacity: 1;
        transform: scale(1);
    }
}
@keyframes link-draw {
    from {
        stroke-dashoffset: 1;
    }
    to {
        stroke-dashoffset: 0;
    }
}
@keyframes map-ripple {
    from {
        opacity: 0.55;
        transform: scale(1);
    }
    to {
        opacity: 0;
        transform: scale(5.5);
    }
}
@media (max-width: 980px) {
    .presence-grid {
        grid-template-columns: 1fr;
    }
    .presence-map {
        justify-self: center;
        max-width: 360px;
        margin-top: clamp(40px, 8vw, 64px);
    }
}

/* --- Notícias ----------------------------------------------------
   Na página inicial, uma em destaque e as outras em lista; na página
   das notícias, uma grelha sem caixas. */
.news-layout {
    display: grid;
    grid-template-columns: minmax(0, 7fr) minmax(0, 5fr);
    gap: clamp(32px, 5vw, 80px);
}
.news-lead,
.news-entry {
    display: block;
    color: inherit;
}
.news-media {
    aspect-ratio: 16 / 10;
    margin-bottom: 26px;
    overflow: hidden;
    background: var(--mist) url('/site/relevo-escuro.svg') center / cover no-repeat;
}
.news-media img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    transition: transform 0.9s var(--ease);
}
:is(.news-lead, .news-entry):hover .news-media img {
    transform: scale(1.04);
}
.news-meta {
    display: block;
    margin-bottom: 10px;
    font-size: 14px;
    color: var(--muted);
}
.news-title {
    display: block;
    margin: 0 0 12px;
    font-family: var(--display);
    font-weight: 400;
    font-size: clamp(22px, 2vw, 30px);
    line-height: 1.2;
    letter-spacing: -0.015em;
    color: var(--ink);
    transition: color 0.3s var(--ease);
}
.news-lead .news-title {
    font-size: clamp(28px, 2.8vw, 42px);
    font-weight: 300;
}
:is(.news-lead, .news-entry, .news-list a):hover .news-title {
    color: var(--blue);
}
.news-excerpt {
    color: var(--text);
}
.news-list {
    margin: 0;
    padding: 0;
    list-style: none;
    border-bottom: 1px solid var(--line);
}
.news-list a {
    display: block;
    padding: 26px 0;
    border-top: 1px solid var(--line);
    color: inherit;
}
.news-list .news-title {
    margin: 0;
    font-size: 22px;
}
.news-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
    gap: clamp(40px, 5vw, 64px) clamp(24px, 3vw, 40px);
}

/* --- Directório de empresas e lista de vagas --------------------- */
.filters {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-end;
    gap: 20px 28px;
    margin-bottom: 40px;
    padding-bottom: 32px;
    border-bottom: 1px solid var(--line);
}
.filters label {
    display: grid;
    gap: 6px;
    flex: 1 1 180px;
    font-size: 13px;
    font-weight: 600;
    color: var(--muted);
}
.filters .btn {
    flex: 0 0 auto;
}
.filters input,
.filters select {
    font: 16px var(--body);
    padding: 12px 0;
    border: 0;
    border-bottom: 1px solid var(--line-strong);
    border-radius: 0;
    background: transparent;
    color: var(--ink);
}
.filters input:focus-visible,
.filters select:focus-visible {
    outline: none;
    border-bottom-color: var(--blue);
    box-shadow: 0 1px 0 var(--blue);
}
.count {
    margin-bottom: 18px;
    font-size: 14px;
    color: var(--muted);
}
.directory,
.job-list {
    margin: 0;
    padding: 0;
    list-style: none;
    border-bottom: 1px solid var(--line);
}
.directory-row,
.job-row {
    display: grid;
    align-items: center;
    gap: 28px;
    padding: 26px 0;
    border-top: 1px solid var(--line);
    color: inherit;
}
.directory-row {
    grid-template-columns: 120px minmax(0, 4fr) minmax(0, 3fr) minmax(0, 2fr) 24px;
}
.job-row {
    grid-template-columns: minmax(0, 5fr) minmax(0, 3fr) minmax(0, 2fr) 24px;
}
:is(.directory-row, .job-row)::after {
    content: '→';
    color: var(--muted);
    transition:
        transform 0.35s var(--ease),
        color 0.3s var(--ease);
}
:is(.directory-row, .job-row):hover::after {
    transform: translateX(5px);
    color: var(--blue);
}
.dir-logo {
    display: grid;
    place-items: center start;
    height: 56px;
}
.dir-logo img {
    max-width: 110px;
    max-height: 48px;
    object-fit: contain;
}
.dir-logo .initials {
    font-size: 28px;
}
.dir-name,
.job-title {
    font-family: var(--display);
    font-size: clamp(20px, 1.8vw, 26px);
    font-weight: 400;
    letter-spacing: -0.015em;
    color: var(--ink);
    transition: color 0.3s var(--ease);
}
:is(.directory-row, .job-row):hover :is(.dir-name, .job-title) {
    color: var(--blue);
}
.dir-meta,
.job-meta {
    font-size: 15px;
    color: var(--text);
}
.dir-meta small,
.job-meta small {
    display: block;
    font-size: 13px;
    color: var(--muted);
}
.tabs {
    display: flex;
    flex-wrap: wrap;
    gap: 6px 28px;
    margin-bottom: 48px;
    padding-bottom: 18px;
    border-bottom: 1px solid var(--line);
}
.tabs a {
    position: relative;
    padding: 6px 0;
    font-size: 15px;
    font-weight: 500;
    color: var(--muted);
}
.tabs a:hover,
.tabs a[aria-current='true'] {
    color: var(--ink);
}
.tabs a[aria-current='true']::after {
    content: '';
    position: absolute;
    left: 0;
    right: 0;
    bottom: -19px;
    height: 2px;
    background: var(--blue);
}
.pagination {
    display: flex;
    justify-content: space-between;
    gap: 16px;
    margin-top: 64px;
    padding-top: 28px;
    border-top: 1px solid var(--line);
}
.empty {
    padding: 48px 0;
    border-top: 1px solid var(--line);
    border-bottom: 1px solid var(--line);
    color: var(--muted);
}
.dark .empty {
    border-color: var(--line-dark);
    color: var(--on-dark);
}
.tags {
    display: flex;
    flex-wrap: wrap;
    gap: 8px 20px;
    margin-bottom: 18px;
    font-size: 14px;
    font-weight: 500;
    color: var(--muted);
}

/* --- Perfis: empresa e vaga ---------------------------------------
   O texto numa coluna de leitura e, ao lado, uma ficha em filetes. */
.profile {
    display: grid;
    grid-template-columns: minmax(0, 7fr) minmax(0, 4fr);
    gap: clamp(40px, 7vw, 112px);
    align-items: start;
}
.profile-side {
    position: sticky;
    top: calc(var(--header) + 24px);
}
.profile-logo {
    display: grid;
    place-items: center start;
    height: 96px;
    margin-bottom: 28px;
}
.profile-logo img {
    max-width: 180px;
    max-height: 80px;
    object-fit: contain;
}
.ficha {
    margin: 0 0 32px;
    border-top: 1px solid var(--line);
}
.ficha div {
    display: grid;
    grid-template-columns: minmax(0, 2fr) minmax(0, 3fr);
    gap: 16px;
    padding: 16px 0;
    border-bottom: 1px solid var(--line);
}
.ficha dt {
    font-size: 14px;
    color: var(--muted);
}
.ficha dd {
    margin: 0;
    font-weight: 500;
    color: var(--ink);
    overflow-wrap: anywhere;
}
.prose {
    max-width: 68ch;
    font-size: 18px;
    line-height: 1.75;
}
.prose h2 {
    margin: 2em 0 0.7em;
    font-size: clamp(26px, 2.4vw, 36px);
}
.prose > :first-child {
    margin-top: 0;
}
.figure {
    margin: 0 0 40px;
    overflow: hidden;
    background: var(--mist);
}
.figure img {
    width: 100%;
    height: auto;
}
.article-cover {
    margin-bottom: clamp(40px, 5vw, 72px);
}
/* A coluna de leitura de um artigo, ao centro. */
.reading {
    margin-inline: auto;
}
.numbered {
    margin: 0 0 1.5em;
    padding: 0;
    list-style: none;
    counter-reset: item;
    border-bottom: 1px solid var(--line);
}
.numbered li {
    counter-increment: item;
    display: grid;
    grid-template-columns: 48px 1fr;
    gap: 12px;
    padding: 14px 0;
    border-top: 1px solid var(--line);
}
.numbered li::before {
    content: counter(item, decimal-leading-zero);
    font-family: var(--display);
    font-weight: 700;
    font-size: 14px;
    line-height: 1.9;
    color: var(--blue);
}
.notice {
    padding: 18px 22px;
    margin-bottom: 32px;
    border-left: 2px solid var(--blue);
    background: var(--mist);
    color: var(--ink);
}
.notice.closed {
    border-left-color: #b4443b;
    background: #fbf1ef;
    color: #8f342c;
}

/* --- Sobre nós --------------------------------------------------- */
.about-intro {
    display: grid;
    grid-template-columns: repeat(12, minmax(0, 1fr));
    column-gap: clamp(20px, 3vw, 40px);
    row-gap: clamp(40px, 5vw, 72px);
    align-items: end;
}
.about-intro .manifesto-media {
    grid-column: 1 / span 6;
}
.about-intro .pillars {
    grid-column: 8 / span 5;
    grid-template-columns: 1fr;
    margin: 0;
}
.about-intro .pillars dd {
    font-family: var(--display);
    font-size: clamp(20px, 1.8vw, 26px);
    font-weight: 300;
    line-height: 1.35;
    color: var(--ink);
}
.about-intro.no-media .pillars {
    grid-column: 1 / -1;
    grid-template-columns: repeat(2, minmax(0, 1fr));
}
.values-list {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
    margin: 0;
    padding: 0;
    list-style: none;
    counter-reset: valor;
    border-top: 1px solid var(--line);
}
.values-list li {
    counter-increment: valor;
    padding: 28px 28px 28px 0;
    border-bottom: 1px solid var(--line);
    font-family: var(--display);
    font-size: clamp(22px, 2vw, 30px);
    font-weight: 300;
    color: var(--ink);
}
.values-list li::before {
    content: counter(valor, decimal-leading-zero);
    display: block;
    margin-bottom: 14px;
    font-size: 14px;
    font-weight: 700;
    color: var(--blue);
}
.chapter {
    display: grid;
    grid-template-columns: minmax(0, 4fr) minmax(0, 7fr);
    gap: clamp(32px, 6vw, 96px);
}
.chapter h2 {
    font-size: clamp(30px, 3.4vw, 52px);
}

/* --- Formulários ------------------------------------------------- */
.form-layout {
    display: grid;
    grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
    gap: clamp(40px, 6vw, 96px);
    align-items: start;
}
.form-intro h2 {
    font-size: clamp(32px, 3.6vw, 56px);
}
.site-form {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 26px 28px;
}
.site-form .wide {
    grid-column: 1 / -1;
}
.site-form .notice {
    margin: 0;
}
.form-field {
    display: grid;
    gap: 8px;
    align-content: start;
}
.form-field > label:not(.check) {
    font-size: 14px;
    font-weight: 600;
    color: var(--ink);
}
.form-field input,
.form-field select,
.form-field textarea {
    width: 100%;
    font: 16px var(--body);
    padding: 15px 16px;
    border: 1px solid var(--line-strong);
    border-radius: 0;
    background: var(--paper);
    color: var(--ink);
    transition:
        border-color 0.2s var(--ease),
        box-shadow 0.2s var(--ease);
}
.form-field textarea {
    resize: vertical;
    min-height: 150px;
}
.form-field input[type='file'] {
    padding: 13px 14px;
    background: var(--mist);
    cursor: pointer;
}
.form-field input:focus-visible,
.form-field select:focus-visible,
.form-field textarea:focus-visible {
    outline: none;
    border-color: var(--blue);
    box-shadow: 0 0 0 3px rgba(8, 124, 200, 0.18);
}
.form-field small {
    font-size: 13px;
    color: var(--muted);
}
.form-field .field-error {
    color: #a33a31;
    font-weight: 600;
}
.form-field.has-error input,
.form-field.has-error select,
.form-field.has-error textarea {
    border-color: #b4443b;
}
.check {
    display: flex;
    gap: 12px;
    align-items: flex-start;
    font-size: 15px;
    color: var(--text);
    cursor: pointer;
}
.form-field .check input {
    width: 20px;
    height: 20px;
    margin: 2px 0 0;
    flex: 0 0 auto;
    accent-color: var(--navy);
    box-shadow: none;
}
.form-actions {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 16px;
    flex-wrap: wrap;
    padding-top: 8px;
}
.form-actions .meta {
    margin: 0;
}
/* O campo armadilha: fora do ecrã, não escondido — alguns robôs saltam os escondidos. */
.hp {
    position: absolute;
    left: -10000px;
    width: 1px;
    height: 1px;
    overflow: hidden;
}

/* --- Recibo e acompanhamento ------------------------------------- */
.narrow {
    max-width: 820px;
}
.receipt-data {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
    margin: 32px 0 20px;
    border-top: 1px solid var(--line);
}
.receipt-data div {
    padding: 20px 20px 20px 0;
    border-bottom: 1px solid var(--line);
}
.receipt-data dt {
    font-size: 14px;
    color: var(--muted);
}
.receipt-data dd {
    margin: 6px 0 0;
    font-family: var(--display);
    font-size: clamp(24px, 2.4vw, 34px);
    font-weight: 300;
    color: var(--ink);
    overflow-wrap: anywhere;
}
.receipt-data .code {
    font-weight: 600;
    letter-spacing: 0.08em;
}
.status-box {
    margin: 32px 0;
    padding: 28px 0 28px 28px;
    border-left: 3px solid var(--blue);
}
.status-box .meta {
    display: block;
    margin-bottom: 4px;
}
.status-box strong {
    display: block;
    margin-bottom: 8px;
    font-family: var(--display);
    font-size: clamp(28px, 3vw, 40px);
    font-weight: 300;
    color: var(--ink);
}
.status-box p {
    margin: 0;
}
.status-accepted,
.status-selected {
    border-left-color: #1f7a4c;
}
.status-declined,
.status-not_selected {
    border-left-color: #b4443b;
}
.status-info_requested,
.status-interview {
    border-left-color: #b77a12;
}
.actions-row {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 28px;
    margin-top: 40px;
}
.statement {
    padding-left: 22px;
    border-left: 2px solid var(--blue);
}
.statement h3 {
    font-size: 14px;
    font-weight: 600;
    color: var(--blue);
}

/* --- Contactos --------------------------------------------------- */
.contact-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
    margin: 0;
    border-top: 1px solid var(--line);
}
.contact-grid div {
    padding: 28px 28px 32px 0;
    border-bottom: 1px solid var(--line);
}
.contact-grid dt {
    margin-bottom: 12px;
    font-size: 14px;
    color: var(--muted);
}
.contact-grid dd {
    margin: 0;
    font-family: var(--display);
    font-size: clamp(20px, 1.9vw, 28px);
    font-weight: 300;
    line-height: 1.3;
    color: var(--ink);
    overflow-wrap: anywhere;
}
.contact-grid dd a {
    color: inherit;
}
.contact-grid dd a:hover {
    color: var(--blue);
}
.contact-grid small {
    display: block;
    margin-top: 10px;
    font-family: var(--body);
    font-size: 14px;
    color: var(--muted);
}
.whatsapp-float {
    position: fixed;
    right: 22px;
    bottom: 22px;
    z-index: 60;
    width: 56px;
    height: 56px;
    border-radius: 50%;
    display: grid;
    place-items: center;
    background: #25d366;
    color: var(--paper);
    box-shadow: 0 10px 28px rgba(5, 24, 44, 0.28);
    transition: transform 0.25s var(--ease);
}
.whatsapp-float:hover {
    transform: translateY(-3px);
}

/* --- Rodapé ------------------------------------------------------ */
.site-footer {
    position: relative;
    isolation: isolate;
    overflow: hidden;
    background: var(--deep);
    color: var(--on-dark);
    font-size: 15px;
}
.site-footer::before {
    content: '';
    position: absolute;
    inset: 0;
    z-index: -1;
    background: url('/site/relevo-claro.svg') right top / cover no-repeat;
    opacity: 0.8;
}
.footer-call {
    padding: clamp(88px, 11vw, 160px) 0 clamp(64px, 8vw, 112px);
    border-bottom: 1px solid var(--line-dark);
}
.footer-kicker {
    display: block;
    margin-bottom: 24px;
    font-size: 14px;
    font-weight: 500;
    color: var(--sky);
}
.footer-title {
    max-width: 18ch;
    margin: 0 0 clamp(36px, 4vw, 56px);
    color: var(--paper);
}
.footer-title strong {
    color: inherit;
}
.footer-actions {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 22px 36px;
}
.footer-actions .link {
    color: var(--paper);
}
.footer-grid {
    display: grid;
    grid-template-columns: minmax(0, 4fr) repeat(3, minmax(0, 2fr));
    gap: 40px;
    padding: 64px 0;
}
.footer-brand {
    display: flex;
    align-items: center;
    gap: 10px;
    margin-bottom: 20px;
}
.footer-brand .brand-word {
    filter: brightness(0) invert(1);
}
.site-footer h4 {
    margin-bottom: 18px;
    font-family: var(--body);
    font-size: 14px;
    font-weight: 600;
    letter-spacing: 0;
    color: var(--paper);
}
.site-footer ul {
    margin: 0;
    padding: 0;
    list-style: none;
    display: grid;
    gap: 4px;
}
/* Cada ligação com pelo menos 24 px de altura para o toque. */
.site-footer ul a {
    display: inline-block;
    padding: 4px 0;
    color: var(--on-dark);
}
.site-footer a:hover {
    color: var(--paper);
}
.footer-bottom {
    display: flex;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 12px 24px;
    padding: 26px 0 34px;
    border-top: 1px solid var(--line-dark);
    font-size: 13px;
    color: rgba(255, 255, 255, 0.55);
}
.footer-bottom a {
    display: inline-block;
    padding: 4px 0;
    color: rgba(255, 255, 255, 0.72);
}

/* --- Página de erro ---------------------------------------------- */
.error-screen {
    position: relative;
    isolation: isolate;
    min-height: 100vh;
    display: grid;
    align-content: center;
    padding: 64px var(--gutter);
    background: var(--deep);
    color: var(--on-dark);
}
.error-screen::before {
    content: '';
    position: absolute;
    inset: 0;
    z-index: -1;
    background: url('/site/relevo-claro.svg') right center / cover no-repeat;
}
.error-screen h1 {
    color: var(--paper);
    max-width: 16ch;
}
.error-screen p {
    max-width: 52ch;
    margin-bottom: 36px;
    font-size: 18px;
}

/* --- Movimento ---------------------------------------------------
   Discreto, como pede o parecer. As secções entram com o scroll; os
   filetes dos índices desenham-se; o título do banner sobe linha a
   linha. Só com JavaScript (a classe .motion vem do <head>) e só para
   quem não pediu menos movimento: sem isso, tudo está no lugar. */
@media (prefers-reduced-motion: no-preference) {
    .motion [data-reveal]:not(.revealed),
    .motion [data-reveal-group] > :not(.revealed) {
        transition:
            opacity 0.9s var(--ease) var(--reveal-delay, 0ms),
            transform 0.9s var(--ease) var(--reveal-delay, 0ms);
    }
    .motion [data-reveal]:not(.is-visible),
    .motion [data-reveal-group] > :not(.is-visible) {
        opacity: 0;
        transform: translateY(32px);
    }
    /* O filete do índice desenha-se da esquerda para a direita. */
    .motion .index .index-rule {
        transition: transform 1.4s var(--ease) 0.15s;
    }
    .motion .index:not(.is-visible) .index-rule {
        transform: scaleX(0);
    }
    /* As fotografias assentam: entram ligeiramente ampliadas. */
    .motion :is([data-reveal], [data-reveal-group] > *) :is(.manifesto-media, .news-media) img,
    .motion .manifesto-media[data-reveal] img {
        transition: transform 1.8s var(--ease);
    }
    .motion
        :is([data-reveal], [data-reveal-group] > *):not(.is-visible)
        :is(.manifesto-media, .news-media)
        img,
    .motion .manifesto-media[data-reveal]:not(.is-visible) img {
        transform: scale(1.1);
    }
}
.hero-title .line,
.page-head :is(.page-kicker, h1, .page-lead) {
    animation: rise 1s var(--ease) both;
}
/* O logótipo entra a crescer; acabada a entrada, o zoom do rato e o do
   scroll voltam a mandar. */
.site-header .brand {
    animation: brand-in 1.1s var(--ease) backwards;
}
@keyframes brand-in {
    from {
        opacity: 0;
        transform: scale(0.82);
    }
}
.hero-title .line:nth-child(2) {
    animation-delay: 0.08s;
}
.hero-title .line:nth-child(3) {
    animation-delay: 0.16s;
}
.hero-title .line:nth-child(n + 4) {
    animation-delay: 0.24s;
}
.page-head h1 {
    animation-delay: 0.06s;
}
.page-head .page-lead {
    animation-delay: 0.14s;
}
.hero-media img {
    animation: settle 2.6s var(--ease) both;
}
/* A imagem do banner aproxima-se e desloca-se devagar, para lá e para cá,
   sem parar: com o nevoeiro por cima, parece um vídeo. */
.hero .hero-photo {
    animation: kenburns 26s ease-in-out infinite alternate;
}
.hero.is-still :is(.hero-photo, .fog) {
    animation-play-state: paused;
}
@keyframes kenburns {
    from {
        transform: scale(1.02) translate(0, 0);
    }
    to {
        transform: scale(1.14) translate(-2%, -1.5%);
    }
}

@keyframes rise {
    from {
        opacity: 0;
        transform: translateY(26px);
    }
}
@keyframes settle {
    from {
        transform: scale(1.08);
    }
}

/* O que acompanha o scroll — as imagens que deslizam mais devagar do
   que a página, o banner a recuar, a barra de leitura — corre no
   próprio browser, onde houver suporte. Nos outros, fica quieto. */
@supports (animation-timeline: scroll()) {
    @media (prefers-reduced-motion: no-preference) {
        .hero .hero-media {
            animation: drift linear both;
            animation-timeline: scroll(root);
            animation-range: 0 100vh;
        }
        .hero-inner {
            animation: lift-away linear both;
            animation-timeline: scroll(root);
            animation-range: 0 80vh;
        }
        /* O nevoeiro sobe mais depressa do que a fotografia desce: fica à
           frente dela, como numa encosta vista de perto. */
        .hero-fog {
            animation: fog-rise linear both;
            animation-timeline: scroll(root);
            animation-range: 0 100vh;
        }
        .hero-descend {
            animation: descend linear both;
            animation-timeline: scroll(root);
            animation-range: 10vh 95vh;
        }
        .page-band img,
        .invest .hero-media img {
            animation: drift-through linear both;
            animation-timeline: view();
        }
        /* As fotografias das secções mexem-se com o scroll, como os capítulos
           de um filme: a de «Quem somos» abre-se como uma janela, a faixa do
           grupo alarga-se até às margens da página, e a imagem dentro de cada
           uma aproxima-se enquanto passa. */
        .manifesto-media {
            animation: window-open linear both;
            animation-timeline: view();
            animation-range: entry 0% cover 45%;
        }
        .band {
            animation: band-open linear both;
            animation-timeline: view();
            animation-range: entry 0% cover 50%;
        }
        .manifesto-media img,
        .band img {
            animation: window-drift linear both;
            animation-timeline: view();
        }
        .scroll-progress {
            display: block;
            animation: grow-progress linear both;
            animation-timeline: scroll(root);
        }
    }
}
@keyframes drift {
    to {
        transform: translateY(14%) scale(1.06);
    }
}
@keyframes fog-rise {
    to {
        transform: translateY(-22%);
    }
}
@keyframes descend {
    from {
        transform: scaleY(0);
    }
    to {
        transform: scaleY(1);
    }
}
@keyframes lift-away {
    to {
        opacity: 0.15;
        transform: translateY(-64px);
    }
}
@keyframes drift-through {
    from {
        transform: translateY(-6%) scale(1.1);
    }
    to {
        transform: translateY(6%) scale(1.02);
    }
}
@keyframes window-open {
    from {
        clip-path: inset(14% 10%);
    }
    to {
        clip-path: inset(0);
    }
}
@keyframes band-open {
    from {
        clip-path: inset(8% max(var(--gutter), calc((100% - 1360px) / 2)));
    }
    to {
        clip-path: inset(0);
    }
}
@keyframes window-drift {
    from {
        transform: scale(1.2) translateY(-5%);
    }
    to {
        transform: scale(1.04) translateY(5%);
    }
}
@keyframes grow-progress {
    from {
        transform: scaleX(0);
    }
    to {
        transform: scaleX(1);
    }
}

/* Entre páginas: o conteúdo troca com um esbatido curto; o cabeçalho e o
   botão do WhatsApp ficam onde estão. */
@view-transition {
    navigation: auto;
}
.site-header {
    view-transition-name: site-header;
}
.whatsapp-float {
    view-transition-name: whatsapp;
}
::view-transition-old(root) {
    animation: 0.2s var(--ease) both fade-out;
}
::view-transition-new(root) {
    animation: 0.45s var(--ease) both fade-in-up;
}
@keyframes fade-out {
    to {
        opacity: 0;
    }
}
@keyframes fade-in-up {
    from {
        opacity: 0;
        transform: translateY(12px);
    }
}
@media (prefers-reduced-motion: reduce) {
    @view-transition {
        navigation: none;
    }
    *,
    *::before,
    *::after {
        animation: none !important;
        transition: none !important;
        scroll-behavior: auto !important;
    }
}

/* O número que conta é só visual: o leitor de ecrã lê o valor final. */
.sr-only {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}

@media print {
    .motion [data-reveal],
    .motion [data-reveal-group] > * {
        opacity: 1 !important;
        transform: none !important;
    }
    .site-header,
    .site-menu,
    .scroll-progress,
    .whatsapp-float,
    .hero-toggle {
        display: none !important;
    }
}

/* --- Responsivo -------------------------------------------------- */
@media (max-width: 1180px) {
    /* As ligações principais só no menu; no cabeçalho, a língua e o botão. */
    .site-nav {
        display: none;
    }
    .header-tools {
        margin-left: auto;
        padding-left: 0;
        border-left: 0;
    }
}
@media (max-width: 980px) {
    .site-menu {
        align-items: flex-start;
    }
    .menu-grid {
        grid-template-columns: 1fr;
        align-items: start;
    }
}
@media (max-width: 980px) {
    .manifesto-title,
    .manifesto-media,
    .manifesto-body,
    .about-intro .manifesto-media,
    .about-intro .pillars {
        grid-column: 1 / -1;
    }
    .manifesto-media {
        margin-bottom: 40px;
    }
    .invest-grid,
    .news-layout,
    .profile,
    .form-layout,
    .chapter {
        grid-template-columns: 1fr;
    }
    .invest-title {
        margin-bottom: 40px;
    }
    .profile-side {
        position: static;
    }
    .index-item {
        grid-template-columns: 52px minmax(0, 1fr) 140px;
    }
    .index-item .item-text,
    .index-item .item-extra {
        grid-column: 2 / 3;
    }
    .item-media {
        grid-row: 1 / span 2;
        grid-column: 3;
    }
    .directory-row {
        grid-template-columns: 88px minmax(0, 1fr) 24px;
    }
    .directory-row .dir-meta {
        grid-column: 2;
    }
    .job-row {
        grid-template-columns: minmax(0, 1fr) 24px;
        gap: 8px 20px;
    }
    .job-row .job-meta {
        grid-column: 1;
    }
    /* A seta fica na primeira linha, à direita. */
    :is(.directory-row, .job-row)::after {
        grid-row: 1;
        grid-column: -2;
    }
    .footer-grid {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }
}
@media (max-width: 700px) {
    :root {
        --header: 68px;
    }
    /* O logótipo, a língua e o botão do menu cabem lado a lado num ecrã de
       telemóvel: logótipo mais pequeno e espaços mais curtos. */
    .header-bar {
        gap: 12px;
    }
    .brand {
        gap: 8px;
    }
    .brand-symbol {
        height: 26px;
    }
    .brand-word {
        height: 12px;
    }
    .header-tools {
        gap: 16px;
    }
    .menu-toggle {
        gap: 10px;
    }
    .facts {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }
    .section-title {
        flex-direction: column;
        align-items: flex-start;
    }
    .pillars,
    .about-intro.no-media .pillars,
    .site-form {
        grid-template-columns: 1fr;
    }
    .index-item {
        grid-template-columns: 40px minmax(0, 1fr);
        gap: 14px;
    }
    .item-media {
        grid-row: auto;
        grid-column: 1 / -1;
        order: -1;
        aspect-ratio: 16 / 9;
    }
    .directory-row {
        grid-template-columns: 64px minmax(0, 1fr) 20px;
        gap: 16px;
    }
    .directory-row .dir-meta:last-of-type {
        display: none;
    }
    .ficha div {
        grid-template-columns: 1fr;
        gap: 4px;
    }
    .footer-grid {
        grid-template-columns: 1fr;
    }
    .whatsapp-float {
        right: 16px;
        bottom: 16px;
        width: 52px;
        height: 52px;
    }
}
