Serviços públicos e educação · Novo recurso

Sistema de design Amsterdam.

Use o contrato real de Switch de código aberto da Amsterdam, com um tema neutro completo, rótulos acessíveis e preferências de leitura aplicadas imediatamente.

Guia OpenDesign8 capítulos25 entradas de referênciaGuia de aplicação original
01

Prévia da interface do sistema de design Amsterdam

Ative o texto maior, o contraste reforçado e a redução de movimento na prévia; restaure os padrões.

Ajuste uma prévia de leituraAbrir exemplo completo
Switch nativo do Amsterdam, CSS4.4.0, tema neutro original e comportamento da aplicação; sem recursos proprietários. · Referência de implementação
02

Referência de design do sistema de design Amsterdam

Implementação de CSS e React4.4.0 analisada; limite entre tokens/recursos proprietários verificado. Todos os valores do tema da prévia são originais.

Contrato do componente de código aberto

Fonte
Nome / RegraValor / ConfiguraçãoUso
CSS package@amsterdam/design-system-css 4.4.0Folha de estilos do Switch nativo usada sem alterações.
Class anatomyams-switch; ams-switch__input; ams-switch__labelO input vem imediatamente antes do label correspondente.
Input semanticstype=checkbox; role=switchO estado nativo marcado representa ligado/desligado.
Native behaviorImmediate binary settingO código-fonte de React informa que não é necessário enviar o formulário.
React propsInputHTMLAttributes<HTMLInputElement>As propriedades checked, defaultChecked, onChange, disabled e ARIA são repassadas ao input.
FocusInput focus styles the following labelNão oculte o input real com display:none.

Tema neutro original completo do controle Switch

Fonte
Nome / RegraValor / ConfiguraçãoUso
--ams-switch-inline-size50pxLargura original da trilha do Switch.
--ams-switch-thumb-inline-size / block-size22px / 22pxGeometria original do indicador circular.
--ams-switch-label-border-width3pxRecuo da trilha; a translação no estado marcado usa este valor.
--ams-switch-background-color#666Cor original da trilha no estado desligado.
--ams-switch-checked-background-color#286044 Cor original da trilha no estado ligado; não é um token de marca do Amsterdam.
--ams-switch-thumb-background-color#fffCor original do indicador.
--ams-switch-disabled-background-color#aaaAparência desativada; a propriedade nativa disabled fornece o comportamento.
--ams-switch-outline-offset4pxSeparação do indicador de foco.
--ams-switch-cursor / disabled-cursorpointer / not-allowedConfiguração explícita da interação.
--ams-switch-thumb-hover-box-shadow0 0 0 2px #fffTratamento original ao passar o cursor.

Tipografia e layout da aplicação

Fonte
Nome / RegraValor / ConfiguraçãoUso
Font / bodyArial / 18px with 1.5 leadingConfiguração neutra original; sem recurso Amsterdam Sans.
Heading36px; 30px below700pxEscolha da aplicação, não uma escala oficial de Amsterdam.
Layout900px maximum; two columns with32px gapEscolha da aplicação; uma coluna abaixo de 700px.
Larger reading mode22px article textPreferência local, não substitui o zoom global do navegador.
Reduced motionOS preference plus local preview settingO componente CSS já respeita prefers-reduced-motion em suas transições.

Limites de reutilização e identidade

Fonte
Nome / RegraValor / ConfiguraçãoUso
Component codeEUPL-1.2 or laterMantenha a licença e os avisos aplicáveis.
DocumentationCC0-1.0Mantenha separado dos recursos proprietários.
Token package4.3.0Proprietary assetsA licença própria o exclui da licença de código aberto.
Amsterdam Sans / icons / logoRestricted institutional assetsNão foi copiado para este exemplo independente.
03

Guia completo do sistema de design Amsterdam

Um guia prático para escolher, aplicar e avaliar este sistema em uma interface real.

DESIGN-amsterdam.md

Orientações completas, um ponto de partida para a implementação e links para o código-fonte.

Baixar o guia

Componente e tema separados do sistema de design Amsterdam

Use a camada de código aberto com transparência

Amsterdam publica o componente CSS separadamente, permitindo implementar seu contrato de classes fora de React. A folha de estilos depende das propriedades personalizadas de CSS; importá-la sem um tema completo deixa dimensões e cores importantes sem definição. Por isso, a folha de estilos nativa de Switch neste exemplo vem acompanhada de uma configuração neutra original e completa.

Com base neste guia de OpenDesign

O repositório separa os pacotes de código aberto dos recursos proprietários. O pacote de tokens inspecionado, na versão 4.3.0, tem um aviso de licença próprio que o exclui da licença de código aberto. Amsterdam Sans, os ícones e o logotipo da cidade também estão sujeitos a restrições específicas. Este guia menciona sua existência como contexto, mas não os redistribui nem afirma que um download público pelo npm concede direitos irrestritos de uso da marca.

Consulte a especificação de apoio

Uma configuração neutra completa do sistema de design Amsterdam

Forneça todas as propriedades necessárias ao componente

A tabela de referência identifica todas as variáveis usadas pela folha de estilos Switch selecionada. Largura, dimensões do botão deslizante, largura da borda, cores, deslocamento do contorno, cursor e tratamento ao passar o mouse têm valores explícitos. Esses são valores originais deste exemplo, não tokens de design de Amsterdam copiados. Essa distinção permite reproduzir o exemplo sem precisar adivinhar valores ausentes no tema.

A trilha tem 50px de largura, com um botão deslizante de 22px e uma borda de 3px. A transformação nativa do estado marcado calcula o deslocamento com base na largura do botão e na largura da borda. Alterar apenas a largura da trilha pode deixar o botão desalinhado; ajuste as dimensões relacionadas em conjunto e verifique os dois estados.

css
:root {
  --ams-switch-label-border-width:3px;
  --ams-switch-background-color:#666;
  --ams-switch-thumb-background-color:#fff;
  --ams-switch-thumb-inline-size:22px;
  --ams-switch-thumb-block-size:22px;
  --ams-switch-inline-size:50px;
  --ams-switch-checked-background-color:#286044;
  --ams-switch-disabled-background-color:#aaa;
  --ams-switch-disabled-cursor:not-allowed;
  --ams-switch-cursor:pointer;
  --ams-switch-outline-offset:4px;
  --ams-switch-thumb-hover-box-shadow:0 0 0 2px #fff;
}

Referência de código

Consulte a especificação de apoio

Anatomia do Switch nativo do sistema de design Amsterdam

O rótulo deve vir depois do input

A implementação de React renderiza um contêiner, um input e um label associado sem texto. O CSS usa seletores de irmãos adjacentes para estilizar o label conforme os estados de foco, marcado e desativado do input. Mantenha essa ordem em uma implementação simples de HTML; inserir uma descrição entre o input e o label interrompe esses seletores.

O input real é um checkbox com role="switch". Ele mantém a propriedade checked nativa e o comportamento de teclado. Como o label visual não tem texto, forneça um nome acessível usando aria-label ou aria-labelledby. O exemplo referencia um título de configuração visível e associa sua explicação por meio de aria-describedby.

html
<strong id="reading-label">Larger text</strong>
<p id="reading-hint">Increase the article text size immediately.</p>
<div class="ams-switch">
  <input class="ams-switch__input" id="reading" type="checkbox" role="switch"
    aria-labelledby="reading-label" aria-describedby="reading-hint">
  <label class="ams-switch__label" for="reading"></label>
</div>

Referência de código

Consulte a especificação de apoio

Configurações imediatas do sistema de design Amsterdam

Um switch altera a visualização atual

O código-fonte do componente define Switch como uma configuração binária imediata. A demonstração segue esse contrato: o texto maior altera o tamanho do artigo, o contraste reforçado altera o texto e o contorno, e a opção de movimento reduzido remove o breve efeito de aparição do aviso. Não há um botão Salvar que finja enviar essas escolhas locais a um serviço de conta.

Restaurar padrões desmarca os três controles nativos e reaplica as classes padrão do artigo. Uma mensagem de status descreve as configurações ativadas. Nada é mantido após a navegação ou o recarregamento. Um serviço de preferências de produção poderia acrescentar persistência, mas deveria informar se a configuração afeta esta página, um dispositivo ou uma conta.

  1. Ative Texto maior e observe o tamanho do parágrafo no artigo ao lado.
  2. Dê foco a Contraste reforçado e pressione Espaço para ativá-lo ou desativá-lo pelo teclado.
  3. Restaure os padrões e confirme que os três switches e o artigo voltam ao estado inicial em conjunto.

Consulte a especificação de apoio

Teclado, foco e movimento no sistema de design Amsterdam

Mantenha o input nativo disponível

A folha de estilos reduz a largura visual do input, mas mantém o controle real. Seu seletor de foco aplica o contorno ao label seguinte. Substituir o input por uma div decorativa descartaria a semântica nativa de formulário e exigiria uma implementação separada para o teclado. Não aplique display:none ao input.

A folha de estilos nativa limita as transições a prefers-reduced-motion:no-preference. O efeito no artigo também respeita a preferência do sistema operacional, independentemente do controle local. Quem solicita menos movimento no nível do sistema não deveria precisar descobrir um switch adicional para que o exemplo se comporte de maneira mais tranquila.

  • Use a propriedade checked como fonte da verdade; não invente um estado visual ativo sem relação com ela.
  • Forneça um nome estável para cada configuração e associe sua explicação ao input.
  • Teste os estados desativado, ativado, em foco e indisponível após alterar as dimensões ou as cores do tema.

Consulte a especificação de apoio

Composição da demonstração de leitura do sistema de design Amsterdam

Demonstre o efeito ao lado do controle

O exemplo usa uma composição em duas colunas para que cada configuração tenha um efeito visível no artigo. Abaixo do ponto de interrupção de 700px, específico da aplicação, os controles são empilhados antes da demonstração. A largura máxima de 900px e o espaçamento de 32px são decisões originais de layout, não evidências de um token de grade usado em toda a cidade.

A fonte neutra é Arial. O texto do corpo tem 18px e entrelinha de 1.5; o modo de texto maior altera apenas o artigo para 22px. Este é um exemplo de configuração da aplicação, não um substituto para o zoom do navegador nem uma afirmação de que esses tamanhos são prescritos por Amsterdam. Rótulos longos quebram linha sem reduzir a largura do switch nativo.

Consulte a especificação de apoio

Integração de CSS ou React ao sistema de design Amsterdam

Escolha a camada de implementação

Em uma aplicação existente de React, o Switch verificado aceita atributos padrão do input e encaminha a ref ao input. Para uso controlado, informe checked e onChange; para uso não controlado, é possível informar defaultChecked. O componente não fornece armazenamento para a aplicação nem um API de preferências da conta.

Para este exemplo independente de HTML, é necessário apenas o Switch de código aberto CSS. As instruções de configuração e o código completo incluem a configuração de tema ausente e o gerenciamento do estado local. O instalador de pacotes pode baixar recursos proprietários como dependências; a presença deles no disco não autoriza sua importação nem distribuição. O exemplo incluído contém apenas o CSS selecionado e sua licença de código aberto.

Consulte a especificação de apoio

Adoção e limitações do sistema de design Amsterdam

Não confunda semelhança visual com afiliação

O sistema da cidade foi criado para tornar os produtos municipais consistentes e acessíveis. Seu código reutilizável pode ser estudado e adaptado nos termos de sua licença, mas o logotipo, a fonte proprietária e os ícones têm condições de uso próprias. A prévia usa uma identidade visual original e conteúdo neutro para não ser confundida com um serviço de Amsterdam.

O escopo verificado abrange um componente nativo com um tema personalizado completo e comportamento local significativo. Não é uma reimplementação completa do tema da cidade. Um produto real que adote o pacote mais amplo de CSS deve definir e testar todas as variáveis exigidas pelos componentes adicionais, em vez de extrapolar a configuração deste Switch para controles não relacionados.

Consulte a especificação de apoio

Exemplos de componentes do sistema de design Amsterdam

Tema neutro completo para Switch

Todas as variáveis exigidas pela folha de estilos nativa estão definidas; todos os valores são originais.

css
:root {
  --ams-switch-label-border-width:3px;
  --ams-switch-background-color:#666;
  --ams-switch-thumb-background-color:#fff;
  --ams-switch-thumb-inline-size:22px;
  --ams-switch-thumb-block-size:22px;
  --ams-switch-inline-size:50px;
  --ams-switch-checked-background-color:#286044;
  --ams-switch-disabled-background-color:#aaa;
  --ams-switch-disabled-cursor:not-allowed;
  --ams-switch-cursor:pointer;
  --ams-switch-outline-offset:4px;
  --ams-switch-thumb-hover-box-shadow:0 0 0 2px #fff;
}

Referência de código

Estrutura nativa acessível

Entrada de caixa de seleção real, função de switch e rótulo visual adjacente.

html
<strong id="reading-label">Larger text</strong>
<p id="reading-hint">Increase the article text size immediately.</p>
<div class="ams-switch">
  <input class="ams-switch__input" id="reading" type="checkbox" role="switch"
    aria-labelledby="reading-label" aria-describedby="reading-hint">
  <label class="ams-switch__label" for="reading"></label>
</div>

Referência de código

Preferências de leitura completas e imediatas

Switch nativo CSS, tema personalizado e efeitos locais visíveis.

html
<!doctype html><html lang="en"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Reading preferences</title><link rel="stylesheet" href="vendor/amsterdam-switch-4.4.0/switch.css"><style>:root{--ams-switch-label-border-width:3px;--ams-switch-background-color:#666;--ams-switch-thumb-background-color:#fff;--ams-switch-thumb-inline-size:22px;--ams-switch-thumb-block-size:22px;--ams-switch-inline-size:50px;--ams-switch-checked-background-color:#286044;--ams-switch-disabled-background-color:#aaa;--ams-switch-disabled-cursor:not-allowed;--ams-switch-cursor:pointer;--ams-switch-outline-offset:4px;--ams-switch-thumb-hover-box-shadow:0 0 0 2px #fff;}*{box-sizing:border-box}body{margin:0;padding:32px 24px;font:18px/1.5 Arial,sans-serif;color:#242b28;background:#fafbf9}main{max-width:900px;margin:auto}h1{font-size:36px;line-height:1.2;margin:8px 0 16px}h2{font-size:24px;line-height:1.3}.layout{display:grid;grid-template-columns:1fr 1fr;gap:32px}.setting{display:flex;justify-content:space-between;gap:20px;border-top:1px solid #d5ddd7;padding:20px 0}.setting p{margin:4px 0;font-size:16px}.ams-switch{flex-shrink:0}.sample{background:white;border:1px solid #d5ddd7;padding:24px}.sample.large{font-size:22px}.sample.high{color:#000;border:3px solid #000}.sample .meta{font-size:.85em;color:inherit}.badge{display:inline-block;background:#e7eee8;padding:4px 8px}.sample:not(.quiet) .badge{animation:appear .3s ease}@keyframes appear{from{opacity:.2}to{opacity:1}}button{font:inherit;border:1px solid #286044;background:#fff;color:#286044;padding:10px 16px;cursor:pointer}button:focus-visible{outline:3px solid #286044;outline-offset:3px}footer{font-size:14px;margin-top:32px;border-top:1px solid #d5ddd7;padding-top:20px}#status{min-height:1.5em}@media(max-width:700px){body{padding:24px 16px}.layout{grid-template-columns:1fr}h1{font-size:30px}}@media(prefers-reduced-motion:reduce){.sample .badge{animation:none!important}}</style><main><small>PERSONAL READING VIEW</small><h1>Make this page easier to read</h1><p>Settings apply immediately to the preview. They are not saved after you leave.</p><div class="layout"><section aria-label="Reading preferences"><div class="setting"><div><strong id="large-label">Larger text</strong><p id="large-hint">Increase the article text size.</p></div><div class="ams-switch"><input class="ams-switch__input" type="checkbox" role="switch" id="large" aria-labelledby="large-label" aria-describedby="large-hint"><label class="ams-switch__label" for="large"></label></div></div><div class="setting"><div><strong id="high-label">Stronger contrast</strong><p id="high-hint">Use black text and a stronger outline.</p></div><div class="ams-switch"><input class="ams-switch__input" type="checkbox" role="switch" id="high" aria-labelledby="high-label" aria-describedby="high-hint"><label class="ams-switch__label" for="high"></label></div></div><div class="setting"><div><strong id="quiet-label">Reduce preview motion</strong><p id="quiet-hint">Remove the short badge appearance effect.</p></div><div class="ams-switch"><input class="ams-switch__input" type="checkbox" role="switch" id="quiet" aria-labelledby="quiet-label" aria-describedby="quiet-hint"><label class="ams-switch__label" for="quiet"></label></div></div><button id="reset">Restore defaults</button><p id="status" role="status">Default reading settings.</p></section><article class="sample" id="sample"><span class="badge">Reading preview</span><h2>A quieter place to read</h2><p>A community reading room offers shared tables, individual seats and a small collection of reference books.</p><p>Before visiting, check opening hours and ask about any facilities you need.</p><p class="meta">Original example content · no external service</p></article></div><footer>Native Amsterdam Switch CSS 4.4.0 with an original neutral token configuration. No proprietary Amsterdam fonts, icons, logos or theme tokens. Original local preference behavior.</footer></main><script>const ids=['large','high','quiet'];function apply(){const enabled=[];ids.forEach(id=>{const on=document.getElementById(id).checked;document.querySelector('#sample').classList.toggle(id,on);if(on)enabled.push(document.querySelector('#'+id+'-label').textContent)});document.querySelector('#status').textContent=enabled.length?enabled.join(', ')+'.':'Default reading settings.'}ids.forEach(id=>document.getElementById(id).onchange=apply);document.querySelector('#reset').onclick=()=>{ids.forEach(id=>document.getElementById(id).checked=false);apply()};</script></html>

Referência de código

04

Configuração do agente do sistema de design Amsterdam

Ponto de partida para implementação

Apenas o CSS de código aberto; tema original completo e HTML funcional a seguir. Nenhum pacote proprietário de tokens ou recursos é distribuído. O ZIP completo do exemplo funcional, disponível em Fontes, também inclui as dependências exatas da prévia e o documento completo. Extraia os arquivos, execute python3 -m http.server 8080 nesse diretório e abra http://localhost:8080/amsterdam.html. Não abra exemplos baseados em módulos usando file://.

bash
npm install @amsterdam/[email protected]
# Copy dist/switch/switch.css into your public assets.
# Load it before the complete original theme configuration below.
# Do not import the proprietary assets or tokens for this neutral example.

Um prompt para seu projeto

Prompt para agente de IA
Use o Switch de código aberto CSS de Amsterdam com um tema original completo. Preserve a estrutura de contêiner, entrada e rótulo adjacente, a função role=switch e um nome acessível. Aplique as configurações binárias imediatamente e use checked como estado. Respeite a preferência por movimento reduzido e diferencie preferências locais das configurações salvas na conta. Não importe tokens, fontes, logotipos ou ícones proprietários sem os direitos correspondentes.
05

Fontes e escopo do sistema de design Amsterdam

Exemplo independente de OpenDesign. Os tokens de marca de Amsterdam, a fonte Amsterdam Sans, os ícones oficiais e o logotipo não estão incluídos.