/* ===========================================================================
   luizguedes.pt — camada propria, por cima do template Bostami.
   Nao editar main.css: e do template e sera substituido numa actualizacao.

   Ambito: correcoes ao template e suporte ao bilingue. Nao redesenha o site.
   =========================================================================== */

:root {
  --lg-primaria: #1b74e4;
  --lg-primaria-escura: #1560c4;
  --lg-transicao: 180ms ease;
  /* Dimensao dos controlos do cabecalho (bandeira e tema). Num so sitio
     para os dois nao poderem divergir. */
  --ctrl: 50px;
  --ctrl-icone: 21px;
}

@media (max-width: 480px) {
  :root { --ctrl: 44px; --ctrl-icone: 19px; }
}

/* --- Fundo da pagina ------------------------------------------------------
   Estava a ser definido por JavaScript (document.body.style.backgroundColor),
   o que so acontecia depois de a pagina pintar -- daí o flash branco antes de
   escurecer. Em CSS resolve-se antes do primeiro paint.
   So o <body> leva a cor: quando o <html> nao tem fundo proprio, o do body
   propaga-se para toda a tela, incluindo a zona de overscroll. */
body {
  background-color: #37424d;
}
body.dark-theme {
  background-color: #1a1a1a;
}

/* --- Elementos que ficam fixos ao rolar -----------------------------------
   O scroll nao acontece no documento: o template poe .page-wrapper em
   position:fixed com height:100vh e overflow-y:auto, e e la dentro que a
   pagina rola. Os `position: sticky` colam-se a essa caixa -- funcionam, mas
   os valores de `top` tem de ser lidos nesse referencial.

   Estado medido antes desta alteracao (scroll de 0 a 1200px):
   - foto:     docava aos 110px  (correcto, ja vinha do template)
   - menu:     docava aos -35px  (top:-45px do template -- ficava cortado)
   - cabecalho: nao docava, subia ate sair do ecra */

/* Controlos (bandeira, tema, menu mobile): flutuam fixos no canto superior
   direito. NAO fixar o cabecalho inteiro -- foi a versao anterior e cortava
   a foto e o texto: era uma barra opaca de largura total, quase vazia, com
   dois botoes na ponta. Os botoes ja tem superficie propria e podem flutuar
   sozinhos sobre o conteudo.
   position:fixed refere-se a janela; funciona aqui porque o .page-wrapper
   (o contentor que rola) e ele proprio fixed a ocupar a janela toda. */
.bostami-header-menu-btn {
  position: fixed;
  top: 20px;
  right: 24px;
  z-index: 40;
}

/* Abaixo de 1400px o menu lateral esconde-se e aparece o botao de 3 tracos.
   Nesse modo os controlos empilham-se em coluna, com o hamburger no topo e
   o idioma e o tema por baixo dele (order:-1 poe o hamburger primeiro sem
   mexer no HTML). Alinhados a direita, encostados a margem do ecra. */
@media (max-width: 1399px) {
  .bostami-header-menu-btn {
    flex-direction: column;
    align-items: flex-end;
    gap: 10px;
  }
  .bostami-header-menu-btn .menu-btn {
    order: -1;
  }
  /* As margens laterais da fila horizontal (6px da bandeira, 10px do tema no
     template) desalinhavam as bordas direitas na coluna. Seletor composto
     para ganhar a regra base da bandeira, que vem mais abaixo no ficheiro. */
  .bostami-header-menu-btn .btn-idioma,
  .bostami-header-menu-btn .dark-btn {
    margin: 0;
  }

  /* O menu abria em position:absolute dentro do cabecalho. Como o cabecalho
     ja rolou para fora ao chegar a meio da pagina, o menu aparecia acima do
     ecra (medido: -750px) e nao se via nada.
     Passa a position:fixed: abre sempre no ecra actual, como um painel a
     esquerda da coluna de controlos. z-index abaixo dos controlos (40) para o
     X e a bandeira ficarem sempre por cima e clicaveis. */
  .mobile-menu-wrap .mobile-menu {
    position: fixed;
    top: 20px;
    right: 84px;
    left: auto;
    width: min(280px, calc(100vw - 120px));
    max-height: calc(100vh - 40px);
    overflow-y: auto;
    z-index: 39;
  }
  .mobile-menu-wrap .mobile-menu .mean-bar .mean-nav ul li a {
    padding: 8px 24px;
  }
}

/* Menu lateral: alinhado com a foto, em vez de colar acima da area visivel
   (o template dava-lhe top:-45px e ficava com o topo cortado ao docar) */
.bostami-main-menu-wrap {
  top: 100px;
}

/* NOTA: a foto NAO doca abaixo de 1200px, de proposito. Foi experimentado
   (aside sticky) e revertido: nesses tamanhos o cartao esta empilhado acima
   do conteudo e ocupa ~77% do ecra -- docado, tapava a pagina e o conteudo
   rolava escondido por tras. So doca no desktop, onde e barra lateral. */

/* --- Acessibilidade ------------------------------------------------------ */

/* Salto para o conteudo: primeiro elemento focavel da pagina */
.salta-conteudo {
  position: absolute;
  left: -9999px;
  top: 0;
  z-index: 999;
  padding: 12px 20px;
  background: var(--lg-primaria);
  color: #fff;
  font-weight: 600;
}
.salta-conteudo:focus {
  left: 0;
}

/* Indicador de foco visivel. O template nao tinha nenhum: quem navega por
   teclado nao sabia onde estava. Restrito a controlos com area visivel --
   um contorno sobre um elemento de altura zero desenha-se como uma linha
   atravessada no ecra. */
a:focus-visible,
button:focus-visible,
input:focus-visible,
textarea:focus-visible,
.fillter-btn:focus-visible {
  outline: 3px solid var(--lg-primaria);
  outline-offset: 3px;
}

/* Os controlos do cabecalho passaram de <div> para <button> */
.dark-btn,
.menu-btn {
  border: 0;
  padding: 0;
  cursor: pointer;
}
.menu-btn {
  background: none;
}

/* Superficie partilhada pela bandeira, botao de tema e hamburger.
   Os controlos sao position:fixed e flutuam sobre a pagina inteira -- nao so
   sobre o cabecalho. A versao anterior usava branco translucido, pensado para
   o cabecalho escuro; sobre conteudo claro (cartoes brancos) desaparecia, e
   so a bandeira se via porque tem imagem.
   Passa a "vidro" escuro OPACO o suficiente para contrastar sobre qualquer
   fundo -- branco ou escuro, tema claro ou escuro -- com um anel claro e uma
   sombra a destaca-lo. O icone do tema e as barras do menu sao claros
   (#e2e8f0), logo leem-se sobre esta superficie escura. */
.btn-idioma,
.bostami-header-menu-btn .dark-btn,
.home-1 .bostami-header-menu-btn .menu-btn {
  background: rgba(30, 38, 46, 0.86);
  border: 1px solid rgba(255, 255, 255, 0.55);
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.35);
  -webkit-backdrop-filter: blur(4px);
  backdrop-filter: blur(4px);
}
.btn-idioma:hover,
.bostami-header-menu-btn .dark-btn:hover,
.home-1 .bostami-header-menu-btn .menu-btn:hover {
  background: rgba(45, 55, 66, 0.94);
  border-color: rgba(255, 255, 255, 0.75);
}

/* O hamburger acompanha o tamanho e o aspecto dos botoes de idioma e tema:
   mesma caixa (--ctrl), mesmo raio, mesma superficie -- substitui o circulo
   rosa de 26px do template. As barras crescem de 12px para 18px para nao se
   perderem na caixa maior; os offsets e o X do estado activo ficam como o
   template os define, para nao partir a animacao de abrir/fechar. */
.home-1 .bostami-header-menu-btn .menu-btn {
  width: var(--ctrl);
  height: var(--ctrl);
  border-radius: 8px;
  flex: 0 0 auto;
}
.menu-btn span {
  width: 18px;
  /* cor fixa: o template usa var(--common-white), que no tema escuro vira
     #000 e tornava as barras invisiveis sobre a superficie escura */
  background-color: #e2e8f0;
}

/* O template pintava o icone do tema com a cor de texto corrente, que no tema
   claro e escura (#44566c) sobre um cabecalho tambem escuro: 1.36:1,
   praticamente invisivel. Cor fixa e clara resolve nos dois temas (o
   cabecalho e #37424d no claro e #1a1a1a no escuro).
   As barras do menu ja eram brancas e ficam como estao. */
/* O icone era `fa-light` (peso 300, traco de cabelo): mesmo com a cor
   corrigida continuava a ler-se apagado a 25px. Passou a `fa-solid` no
   header.php; aqui fica o tamanho e a caixa, iguais aos da bandeira, para os
   dois controlos terem o mesmo peso visual. */
.bostami-header-menu-btn .dark-btn {
  display: inline-flex;
  flex: 0 0 auto;
  align-items: center;
  justify-content: center;
  width: var(--ctrl);
  height: var(--ctrl);
  border-radius: 8px;
  vertical-align: middle;
  transition: background var(--lg-transicao);
}
.bostami-header-menu-btn .dark-btn i {
  font-size: var(--ctrl-icone);
  color: #e2e8f0;
  transition: color var(--lg-transicao);
}
.bostami-header-menu-btn .dark-btn:hover i,
.bostami-header-menu-btn .dark-btn:focus-visible i {
  color: #ffffff;
}

.honeypot {
  position: absolute;
  left: -9999px;
  top: -9999px;
  width: 1px;
  height: 1px;
  overflow: hidden;
}

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    transition-duration: 0.01ms !important;
  }
}

/* --- Cartao lateral: email ------------------------------------------------
   Um endereco de email nao tem espacos, logo com `overflow-wrap: normal` nao
   tem UM unico ponto de quebra: a 16px precisa de 208px e transborda em
   qualquer coluna mais estreita.
   `anywhere` garante que nunca sai da caixa, seja qual for a largura; o
   tamanho ligeiramente menor faz com que na pratica raramente precise de
   quebrar. */
.bostami-parsonal-info-contact-item .text p,
.bostami-parsonal-info-contact-item .text p a {
  overflow-wrap: anywhere;
  word-break: break-word; /* browsers antigos */
  hyphens: none;
}

/* Um item flex nao encolhe abaixo do seu conteudo por omissao
   (min-width: auto). Sem isto, o bloco de texto parava de encolher aos 33px e
   saia do cartao em colunas muito estreitas, mesmo com o email a quebrar. */
.bostami-parsonal-info-contact-item {
  min-width: 0;
}
.bostami-parsonal-info-contact-item .text {
  min-width: 0;
  flex: 1 1 auto;
}
/* O email fica SEMPRE numa linha; e a fonte que cede, nao o texto que parte.
   Medido: o endereco ocupa 13x a altura da fonte em largura (208px a 16px),
   logo 7.2cqw deixa-o com ~94% da caixa e uma folga confortavel.
   cqw e nao vw: a coluna lateral e larga no telemovel (ocupa o ecra todo) e
   estreita no desktop (25%), portanto a largura da JANELA nao serve de guia --
   so a do proprio cartao. */
/* Com o minimo do clamp a 12px, o endereco precisa de ~155px e a coluna mais
   estreita (janela de 1200px) so dava 150px ao texto. Estes 5px vem de
   estreitar o padding lateral do bloco de contactos de 15px para 10px --
   devolve 10px ao texto e e visualmente impercetivel. */
.bostami-parsonal-info-contact {
  padding-left: 10px;
  padding-right: 10px;
}

.bostami-parsonal-info-contact-item.email .text {
  container-type: inline-size;
}
.bostami-parsonal-info-contact-item.email .text p,
.bostami-parsonal-info-contact-item.email .text p a {
  font-size: clamp(12px, 7.2cqw, 15px);
  line-height: 1.45;
  white-space: nowrap;
  overflow-wrap: normal;
  word-break: normal;
}

/* Browsers sem container queries (anteriores a 2022/23): tamanho fixo mais
   pequeno, e volta a poder quebrar em vez de sair da caixa. */
@supports not (container-type: inline-size) {
  .bostami-parsonal-info-contact-item.email .text p,
  .bostami-parsonal-info-contact-item.email .text p a {
    font-size: 13px;
    white-space: normal;
    overflow-wrap: anywhere;
  }
}

/* --- Selector de idioma (bandeira, ao lado do botao de tema) -------------- */

/* A caixa iguala a do botao de tema (50x50), para os dois controlos terem o
   mesmo peso visual e a mesma area de toque. */
.btn-idioma {
  display: inline-flex;
  flex: 0 0 auto;
  align-items: center;
  justify-content: center;
  vertical-align: middle;
  width: var(--ctrl);
  height: var(--ctrl);
  margin-right: 6px;
  border-radius: 8px;
  line-height: 0;
  transition: transform var(--lg-transicao), background var(--lg-transicao);
}
.btn-idioma:hover {
  transform: scale(1.08);
}
.btn-idioma svg {
  display: block;
  width: 34px;
  height: 24px;
  border-radius: 3px;
  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.18);
}

@media (max-width: 480px) {
  .btn-idioma svg { width: 30px; height: 21px; }
}

/* --- text-transform ------------------------------------------------------
   O template aplica `capitalize` a titulos, etiquetas e botoes. Em ingles
   passa despercebido; em portugues capitaliza preposicoes e produz
   "Desenvolvimento De Websites" ou "Faturacao E Integracoes".
   Anulado: o texto de origem ja tem a capitalizacao correcta. */
.bostami-what-do-item .title,
.bostami-parsonal-info-bio,
.bostami-parsonal-info-name,
.item-title,
.item-subtitle,
.input-lebel,
.fillter-btn,
.form-btn,
.page-title,
.section-title {
  text-transform: none;
}

/* --- Cartoes "O que faco" -------------------------------------------------
   O template traz min-height:350px, dimensionado para o conteudo da
   demonstracao, o que deixa espaco vazio a mais.
   ATENCAO: nao usar `height:100%` aqui. O cartao passaria a ocupar a coluna
   inteira, a sua margin-bottom:30px ficaria fora da caixa e as duas linhas
   de cartoes colavam-se (medido: 0px entre linhas).
   `calc(100% - 30px)` iguala as alturas dentro da linha E preserva o
   intervalo de 30px. */
.bostami-what-do-item {
  min-height: 0;
  height: calc(100% - 30px);
}

/* --- Portfolio ------------------------------------------------------------
   As imagens vem de origens diferentes e com proporcoes diferentes: as
   og:image dos sites sao 1200x630 (1.90) e a captura antiga e 310x266 (1.17).
   Sem normalizar, os cartoes ficam com alturas desencontradas.
   aspect-ratio + object-fit:cover da a todos a mesma janela, cortando em vez
   de deformar. */
.fillter-item .img {
  display: block;
  overflow: hidden;
  border-radius: 8px;
  margin-bottom: 16px;
}
.fillter-item .img img {
  display: block;
  width: 100%;
  height: 100%;
  aspect-ratio: 16 / 10;
  object-fit: cover;
  object-position: center top;
  transition: transform 300ms ease;
}
.fillter-item .img:hover img {
  transform: scale(1.04);
}

/* Cartao sem imagem: sem isto ficaria achatado, com o titulo colado ao topo */
.fillter-item:not(:has(.img)) {
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  min-height: 190px;
}
@supports not selector(:has(*)) {
  .fillter-item { min-height: 190px; }
}

.item-subtitle {
  display: block;
  font-size: 12px;
  letter-spacing: 0.6px;
  opacity: 0.75;
  margin-bottom: 4px;
}
.item-title {
  font-size: 17px;
  line-height: 1.35;
  margin: 0;
}

/* Botoes de loja (App Store / Google Play).
   Icones de marca do Font Awesome em vez dos badges oficiais: evita imagens
   externas e as regras de utilizacao das marcas registadas. */
.lojas {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin-top: 14px;
}
.btn-loja {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  padding: 8px 14px;
  border: 1px solid currentColor;
  border-radius: 8px;
  font-size: 13px;
  font-weight: 500;
  line-height: 1;
  text-decoration: none;
  opacity: 0.85;
  transition: opacity var(--lg-transicao), transform var(--lg-transicao);
}
.btn-loja:hover {
  opacity: 1;
  transform: translateY(-2px);
}
.btn-loja i {
  font-size: 16px;
}

@media (max-width: 380px) {
  .lojas { flex-direction: column; align-items: flex-start; }
}

/* --- Formulario ----------------------------------------------------------- */

.obrigatorio { color: #fa5252; }

/* O `.form-btn` do template tem padding 1px 6px e ~133px de largura, medida
   para a palavra "submit". Com "Enviar mensagem" o texto partia-se em duas
   linhas. */
.form-btn {
  width: auto;
  height: auto;
  min-width: 190px;
  padding: 15px 32px;
  background: var(--lg-primaria);
  color: #fff;
  border: 0;
  border-radius: 8px;
  font-size: 15px;
  font-weight: 600;
  line-height: 1.2;
  white-space: nowrap;
  cursor: pointer;
  transition: background var(--lg-transicao);
}
.form-btn:hover:not(:disabled) {
  background: var(--lg-primaria-escura);
  color: #fff;
}
.form-btn:disabled {
  opacity: 0.6;
  cursor: not-allowed;
}

@media (max-width: 575px) {
  .form-btn {
    width: 100%;
    min-width: 0;
    padding: 16px 24px;
    font-size: 16px;
  }
}

/* --- Campos do formulario -------------------------------------------------
   O template da a .input-box height:15px e padding 1px 2px -- desenha os
   campos como uma linha fina. Funciona para uma caixa de uma linha, mas
   esmaga o textarea: com rows="8" ficava na mesma com 15px de altura e o
   texto cortado.
   Aqui os campos passam a caixas com area de toque real. */

:root {
  --campo-fundo: #ffffff;
  --campo-borda: #dfe7ee;
  --campo-texto: #0f172a;
  --campo-etiqueta: #5a6b7d;
  --campo-placeholder: #9aa8b6;
}
.dark-theme {
  --campo-fundo: #191d21;
  --campo-borda: #333b43;
  --campo-texto: #e6edf3;
  --campo-etiqueta: #9fb0c0;
  --campo-placeholder: #6b7885;
}

.contact-area {
  padding: 44px 40px;
}

.contact-area .contact-form .form-input-item {
  margin-bottom: 22px;
}

.contact-area .contact-form .input-lebel {
  display: block;
  margin-bottom: 9px;
  font-size: 14px;
  font-weight: 500;
  color: var(--campo-etiqueta);
  transition: color var(--lg-transicao);
}

.contact-area .contact-form .input-box {
  display: block;
  width: 100%;
  height: auto;
  min-height: 0;
  padding: 13px 16px;
  background: var(--campo-fundo);
  border: 1px solid var(--campo-borda);
  border-color: var(--campo-borda);
  border-radius: 10px;
  color: var(--campo-texto);
  font-size: 15px;
  line-height: 1.5;
  font-family: inherit;
  transition: border-color var(--lg-transicao), box-shadow var(--lg-transicao);
}
.contact-area .contact-form .input-box::placeholder { color: var(--campo-placeholder); }

.contact-area .contact-form textarea.input-box {
  min-height: 165px;
  resize: vertical;
}

/* Cor por campo, herdada do template. Antes era pintada por quatro blocos de
   jQuery ao clique; :focus-within funciona tambem por teclado e reverte so.

   A variavel tem de ficar no ITEM e nao no campo: a etiqueta e IRMA do campo,
   e as variaveis CSS herdam para baixo, nunca de lado. Definida so no campo,
   a etiqueta lia sempre o valor de recurso (azul) em vez da cor respectiva. */
.form-input-item:has(.input-box.name)    { --cor-foco: #fe7878; }
.form-input-item:has(.input-box.gmail)   { --cor-foco: #1b74e4; }
.form-input-item:has(.input-box.subject) { --cor-foco: #1be472; }
.form-input-item:has(.input-box.message) { --cor-foco: #ce65f3; }

/* Browsers sem :has(): o campo continua a ter a sua cor, so a etiqueta e que
   fica no azul de recurso. */
.input-box.name    { --cor-foco: #fe7878; }
.input-box.gmail   { --cor-foco: #1b74e4; }
.input-box.subject { --cor-foco: #1be472; }
.input-box.message { --cor-foco: #ce65f3; }

.contact-area .contact-form .input-box:focus {
  /* transparente e nao `none`: no modo de alto contraste do Windows as
     sombras sao descartadas, e sem contorno o campo focado ficaria sem
     qualquer indicacao. Assim o sistema pinta-o com a sua propria cor. */
  outline: 2px solid transparent;
  outline-offset: 0;
  border-color: var(--cor-foco, var(--lg-primaria));
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--cor-foco, var(--lg-primaria)) 22%, transparent);
}
/* Fallback para browsers sem color-mix */
@supports not (color: color-mix(in srgb, red 50%, blue)) {
  .contact-area .contact-form .input-box:focus {
    box-shadow: 0 0 0 3px rgba(27, 116, 228, 0.22);
  }
}
.form-input-item:focus-within .input-lebel {
  color: var(--cor-foco, var(--lg-primaria));
}

/* Campo invalido, so depois de o utilizador tentar submeter */
.contact-area .contact-form.foi-validado .input-box:invalid {
  border-color: #e5484d;
}

.form-btn-wrap {
  margin-top: 4px;
}

/* --- Formulario em ecras pequenos -----------------------------------------
   Num ecra de 375px o cartao gastava 80px so em padding lateral, deixando
   campos de 225px. Com 20px sobram 265px de area util.

   font-size 16px nos campos e obrigatorio: o Safari do iOS amplia a pagina
   sozinho ao focar um campo com fonte menor que 16px, e o utilizador fica com
   o site desalinhado e sem forma obvia de voltar atras. */
@media (max-width: 575px) {
  .contact-area {
    padding: 26px 20px;
    border-radius: 14px;
  }

  .contact-area .contact-form .input-box {
    font-size: 16px;
    padding: 14px 14px;
  }

  .contact-area .contact-form textarea.input-box {
    min-height: 140px;
  }

  .contact-area .contact-form .form-input-item {
    margin-bottom: 18px;
  }

  .contact-area .contact-form .input-lebel {
    font-size: 14px;
    margin-bottom: 7px;
  }
}

.loading { text-align: center; padding: 12px 0; }
.spinner {
  width: 26px;
  height: 26px;
  margin: 0 auto 9px;
  border: 3px solid rgba(127, 127, 127, 0.25);
  border-top-color: var(--lg-primaria);
  border-radius: 50%;
  animation: lg-roda 800ms linear infinite;
}
@keyframes lg-roda { to { transform: rotate(360deg); } }

.sent-message,
.error-message {
  padding: 15px 18px;
  border-radius: 8px;
  font-size: 15px;
  margin-top: 14px;
}
.sent-message  { background: #e7f8ee; color: #1a7f43; border: 1px solid #b8e6cb; }
.error-message { background: #fdecec; color: #b42318; border: 1px solid #f5c6c3; }

/* --- Paginas de servico ---------------------------------------------------- */

.trilho {
  font-size: 13px;
  color: var(--lg-esbatido, #7c8b9a);
  margin-bottom: 14px;
}
.trilho a { color: var(--lg-primaria); text-decoration: none; }
.trilho a:hover { text-decoration: underline; }

.lista-simples {
  list-style: none;
  padding: 0;
  margin: 0;
}
.lista-simples li {
  position: relative;
  padding-left: 26px;
  margin-bottom: 10px;
  line-height: 1.6;
}
.lista-simples li::before {
  content: "";
  position: absolute;
  left: 2px;
  top: 7px;
  width: 6px;
  height: 11px;
  border: solid var(--lg-primaria);
  border-width: 0 2px 2px 0;
  transform: rotate(45deg);
}

.nota-servico {
  margin-top: 8px;
  font-weight: 500;
}
.link-cta,
.link-servico {
  display: inline-block;
  color: var(--lg-primaria);
  font-weight: 600;
  text-decoration: none;
  white-space: nowrap;
}
.link-cta:hover,
.link-servico:hover { text-decoration: underline; }

/* --- Imagens --------------------------------------------------------------- */

img { max-width: 100%; height: auto; }
