Desenvolvimento moderno

O browser de hoje faz sozinho muito mais do que pensas.

Menos JavaScript e mais plataforma: o que usar hoje, como medir a velocidade, porque é que a acessibilidade passou a ser obrigatória e como trabalhar com a IA sem perder o controlo.

Coisas que antes precisavam de JavaScript

Muitos componentes que escrevíamos à mão são hoje HTML e CSS nativos, suportados por todos os principais browsers. Menos código significa menos bugs, menos coisas para manter e páginas mais leves.

Janelas modais com <dialog>

showModal() trata sozinho do fundo, do foco e da tecla Esc, e torna inerte o resto da página. A janela de fim de jogo na página inicial deste site é feita exatamente assim.

Antes JavaScript

// Fundo, foco e tecla Esc: tudo à mão
modal.classList.add('is-open');
document.body.style.overflow = 'hidden';
lastFocus = document.activeElement;
modal.querySelector('button').focus();
document.addEventListener('keydown', onEsc);
// ...mais uma "focus trap" para não sair com Tab

Hoje HTML

<dialog id="conferma">
  <p>Queres mesmo sair?</p>
  <form method="dialog">
    <button>Fechar</button>
  </form>
</dialog>

<script>conferma.showModal();</script>

Menus e tooltips com o atributo popover

O browser fecha o menu com um clique fora ou com Esc, e mostra-o por cima de tudo o resto sem lutas com o z-index. Zero linhas de JavaScript.

Antes JavaScript

button.addEventListener('click', () => {
  menu.classList.toggle('open');
});
document.addEventListener('click', (e) => {
  if (!menu.contains(e.target) && e.target !== button) {
    menu.classList.remove('open');
  }
});
// ...e outro listener para a tecla Esc

Hoje HTML

<button popovertarget="menu">Menu</button>

<div id="menu" popover>
  <a href="/">Início</a>
  <a href="/radar/">Jogos e notícias</a>
</div>

Componentes que se adaptam ao seu espaço

Com as container queries, um componente responde ao espaço que tem e não à largura do ecrã: o mesmo bloco funciona numa coluna estreita e em página inteira. O overlay dos jogos deste site usa-as.

Antes JavaScript

new ResizeObserver(([entry]) => {
  card.classList.toggle(
    'is-wide',
    entry.contentRect.width > 480
  );
}).observe(card);

Hoje CSS

.card-wrap {
  container-type: inline-size;
}

@container (width > 30rem) {
  .card { grid-template-columns: 1fr 2fr; }
}

O «seletor de pai» :has()

:has() seleciona um elemento com base no que ele contém. Menos um estado para manter sincronizado em JavaScript, e menos um bug quando te esqueces de o fazer.

Antes JavaScript

checkbox.addEventListener('change', () => {
  card.classList.toggle(
    'is-selected',
    checkbox.checked
  );
});

Hoje CSS

.card:has(input:checked) {
  border-color: var(--accent);
}

CSS aninhado, sem pré-processadores

O aninhamento é nativo: em muitos projetos, o Sass já não faz falta. Menos uma dependência e menos um passo de build, com a mesma comodidade.

Antes Sass

// era preciso um pré-processador
.card {
  padding: 1rem;
  &:hover { border-color: violet; }
  .title { font-weight: 700; }
}

Hoje CSS

/* funciona assim no browser */
.card {
  padding: 1rem;
  &:hover { border-color: violet; }
  & .title { font-weight: 700; }
}

Velocidade: mede-se, não se adivinha

A Google mede a experiência real dos utilizadores com três métricas, os Core Web Vitals. Estes são os valores considerados «bons», a atingir em pelo menos 75% das visitas.

Como lá chegar

Acessibilidade: já não é um extra

Desde 28 de junho de 2025 aplica-se na União Europeia o European Accessibility Act: comércio eletrónico, serviços bancários, e-books, transportes, smartphones e computadores colocados no mercado têm de ser acessíveis a pessoas com deficiência. Ficam excluídas as microempresas de serviços (menos de 10 trabalhadores e menos de 2 milhões de volume de negócios), mas a direção é clara.

E para lá da lei: um site acessível funciona melhor para todos, desde quem navega com o teclado até quem lê o telemóvel ao sol.

Experimenta agora

Põe o rato de lado e navega neste site só com Tab, Enter e as setas. Os jogos também.

As bases que resolvem a maior parte dos problemas

  • HTML semântico. button para as ações, a para os links, um só h1, títulos por ordem.
  • Tudo utilizável com o teclado, com o foco sempre visível.
  • Contraste do texto de pelo menos 4,5:1 para texto normal (WCAG nível AA).
  • Textos alternativos para as imagens que transmitem informação.
  • Etiquetas a sério nos campos dos formulários, não só o placeholder.
  • Respeito por prefers-reduced-motion: menos animações para quem as desativou.

A caixa de ferramentas

Não é preciso ir atrás de todas as novidades. Estas ferramentas cobrem o fluxo completo, do primeiro ficheiro ao lançamento.

Trabalhar com a IA sem perder o controlo

Os assistentes de código aceleram muito o trabalho. Mas o código que vai para o ar continua a ser teu, com os seus bugs e as suas vulnerabilidades.