Governo e serviços públicos · Novo recurso

Sistema de design B.C..

Crie um formulário de preferências de lembrete no estilo B.C., com tokens semânticos reais, controles Aria nativos de React, campos de contato condicionais e comportamento completo de validação.

Guia OpenDesign6 capítulos36 itens de referênciaGuia de aplicação original
01

Prévia da interface de sistema de design B.C.

Alterne entre e-mail e telefone sem perder os dados digitados; depois, valide e revise uma preferência local.

Escolha e revise uma preferência de contatoAbrir exemplo completo
Componentes nativos de @bcgov/design-system-react-components 0.8.1, tokens 5.0.0 e BC Sans 2.1.2. · Referência de implementação
02

Sistema de design B.C. Referência de design

Componentes nativos de @bcgov/design-system-react-components 0.8.1, tokens 5.0.0 e BC Sans 2.1.2.

Papéis de superfície e texto

Fonte
Nome / RegraValor / ConfiguraçãoUso
--surface-color-primary-button-default#013366 Papel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.
--surface-color-primary-button-hover#1e5189 Papel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.
--surface-color-primary-button-disabled#edebe9 Papel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.
--surface-color-background-white#ffffff Papel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.
--surface-color-background-light-gray#faf9f8 Papel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.
--surface-color-background-light-blue#f1f8fe Papel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.
--surface-color-border-default#d8d8d8 Papel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.
--surface-color-border-medium#898785 Papel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.
--surface-color-border-active#2e5dd7 Papel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.
--typography-color-primary#2d2d2d Papel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.
--typography-color-secondary#474543 Papel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.
--typography-color-link#255a90 Papel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.
--typography-color-danger#ce3e39 Papel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.
--typography-color-primary-invert#ffffff Papel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.

Ritmo do layout

Fonte
Nome / RegraValor / ConfiguraçãoUso
--layout-padding-hair0.125remPapel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.
--layout-padding-xsmall0.25remPapel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.
--layout-padding-small0.5remPapel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.
--layout-padding-medium1remPapel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.
--layout-padding-large1.5remPapel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.
--layout-padding-xlarge2remPapel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.
--layout-margin-medium1remPapel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.
--layout-margin-large1.5remPapel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.
--layout-margin-xlarge2remPapel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.
--layout-margin-xxxlarge3remPapel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.
--layout-border-radius-small2pxPapel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.
--layout-border-radius-medium4pxPapel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.
--layout-border-radius-large6pxPapel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.

Escala tipográfica

Fonte
Nome / RegraValor / ConfiguraçãoUso
--typography-font-size-small-body0.875remPapel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.
--typography-font-size-body1remPapel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.
--typography-font-size-large-body1.125remPapel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.
--typography-font-size-h51.25remPapel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.
--typography-font-size-h41.5remPapel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.
--typography-font-size-h31.75remPapel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.
--typography-font-size-h22remPapel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.
--typography-font-size-h12.25remPapel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.
--typography-font-size-display3remPapel publicado da B.C.; use conforme a finalidade, em vez de substituí-lo por uma cor ou dimensão bruta.
03

Sistema de design B.C. Guia completo

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

DESIGN-british-columbia.md

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

Baixar o guia

Biblioteca e tokens atuais de sistema de design B.C. React

Escolha a implementação mantida

A versão atual de B.C. Design System oferece componentes React criados com base em React Aria. Este exemplo fixa react-components 0.8.1 e sua dependência design-tokens 5.0.0. O antigo repositório B.C. Web Components é uma implementação legada independente; importá-lo não reproduz a biblioteca React atual. Confira se a implementação corresponde à documentação antes de copiar um exemplo.

Com base neste guia de OpenDesign

Importe a fonte correta

Os componentes esperam o nome de família BC Sans, com espaço. A versão 2.1.2 fornece css/BC_Sans.css; a entrada antiga BCSans.css está marcada como obsoleta e declara um nome de família diferente. Ter BC Sans instalada na máquina de desenvolvimento pode ocultar a falta de uma importação da fonte. O exemplo inclui a fonte publicada para que o resultado não dependa de uma instalação local.

Sistema de design B.C. Papéis semânticos de cor e espaçamento

Consulte o papel antes de escolher o valor

Os botões primários usam o preenchimento azul-escuro de botão primário, enquanto o conteúdo complementar usa typography-color-secondary. As mensagens de erro usam typography-color-danger. A tabela registra os nomes de exportação atuais de CSS; o nome expressa uma intenção estável, mesmo que um tema futuro altere o valor subjacente. Não confunda a cor de um controle inativo com a de um texto complementar comum.

Defina a geometria com intenção

O formulário usa um espaçamento de 24px entre campos e uma distância maior, de 48px, entre a tarefa principal e a explicação complementar. Esses valores correspondem ao ritmo da biblioteca, enquanto a composição geral em duas colunas foi criada especificamente para este exemplo. No layout para dispositivos móveis, as colunas se empilham sem reduzir os rótulos do formulário nem transformar o texto explicativo em uma dica de ferramenta.

Sistema de design B.C. Campos condicionais e valores preservados

Valide somente o método de contato escolhido

Um RadioGroup nativo controla se o TextField de endereço de e-mail ou o de número de telefone fica visível. Os dois valores permanecem no estado de React quando o método muda, mas somente o campo selecionado participa da validação da revisão. Assim, os dados úteis são preservados e um campo invisível não impede a conclusão da tarefa atual.

Exiba erros locais úteis

O campo de e-mail verifica um formato básico de endereço, e o exemplo de telefone exige pelo menos dez dígitos. Essas são regras ilustrativas, não um validador internacional completo de contatos. Ao revisar dados inválidos, defina isInvalid e forneça um errorMessage específico para o campo. A falta de consentimento exibe uma mensagem visível; o foco vai para o primeiro controle inválido.

Sistema de design B.C. Contratos dos componentes React Aria

Use valores controlados e manipuladores documentados

TextField recebe value e onChange; RadioGroup recebe value e onChange; Checkbox usa isSelected e onChange. Esses manipuladores recebem os valores documentados, não um objeto de evento do navegador que sempre precise ser lido por meio de event.target. Button usa type=submit e o evento de envio do formulário nativo, para que o envio pelo teclado siga o mesmo fluxo de validação.

Mantenha o feedback da revisão sincronizado

Sistema de design B.C. Nomes acessíveis e composição responsiva

Mantenha rótulos, descrições e erros associados

Os componentes nativos fornecem as relações de React Aria entre rótulos, textos de ajuda e mensagens de erro. Ainda cabe à aplicação fornecer rótulos claros, uma descrição compreensível do grupo e mensagens de validação fáceis de entender. Nos testes, clique nos rótulos visíveis dos botões de opção e use o teclado; a entrada interna, visualmente oculta, não é o alvo visível.

Separe as orientações complementares do formulário

O painel adjacente explica o fluxo de trabalho local e inclui um elemento details nativo com contexto de implementação. Em telas estreitas, ele aparece depois do formulário na ordem de leitura. O símbolo de informação é decorativo, pois o título já transmite o significado. Não é necessário usar um logotipo oficial da B.C. nem alegar que se trata de um serviço governamental para estudar os componentes.

Sistema de design B.C. Implementação completa de React

Reproduza a implementação verificada

Crie um projeto Vite React e instale os pacotes fixados de componentes, tokens e fontes. Use os arquivos main.jsx e bc.css fornecidos com um elemento raiz de montagem. O pacote inclui o comportamento nativo de botões de opção, campos, caixas de seleção e botões, além de toda a validação local e das transições de estado. Não é necessário ter um API privado nem credenciais.

  1. Instale os pacotes fixados e importe css/BC_Sans.css.
  2. Salve main.jsx e bc.css, mantendo o elemento raiz de montagem.
  3. Envie o formulário vazio e, em seguida, corrija o campo visível.
  4. Alterne os métodos e confirme que o valor anterior foi preservado.

Mantenha a validação condicional alinhada ao método selecionado

Os manipuladores onChange de RadioGroup e TextField recebem valores, enquanto o onChange de Checkbox recebe o valor booleano selecionado. Armazene esses valores diretamente, em vez de aplicar a todos os componentes um manipulador genérico que use event.target.value. Os rótulos visíveis continuam sendo os alvos de interação, mesmo quando React Aria oculta visualmente uma entrada nativa.

Quando o método de contato mudar, mantenha os dois valores em rascunho, mas limpe a revisão anterior e valide apenas o método escolhido. Após o envio, mova o foco para o primeiro controle visível inválido. Assim, a pessoa pode comparar as opções de contato sem perder um endereço de e-mail nem ser impedida por um campo de telefone invisível. A regra de telefone com dez dígitos deste exemplo é intencionalmente local e deve ser substituída pelos requisitos internacionais reais do serviço.

  • Somente o campo de contato selecionado é validado.
  • Alterar qualquer opção limpa as mensagens de revisão anteriores.
  • O resultado não afirma que um lembrete foi agendado.

Exemplos de componentes do sistema de design sistema de design B.C.

main.jsx — exemplo funcional completo

Escolha e revise uma preferência de contato. O código-fonte abaixo é a entrada completa de React, incluindo todo o estado e a validação.

jsx
import React, { useState, useRef } from "react";
import { createRoot } from "react-dom/client";
import {
  Button,
  Radio,
  RadioGroup,
  TextField,
  Checkbox,
} from "@bcgov/design-system-react-components";
import "@bcgov/bc-sans/css/BC_Sans.css";
import "./bc.css";
function App() {
  const [method, setMethod] = useState("email"),
    [email, setEmail] = useState(""),
    [phone, setPhone] = useState(""),
    [consent, setConsent] = useState(false),
    [submitted, setSubmitted] = useState(false),
    [result, setResult] = useState("");
  const panel = useRef(null);
  const invalidEmail = !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email),
    invalidPhone = phone.replace(/\D/g, "").length < 10;
  function change(fn, value) {
    fn(value);
    setResult("");
    setSubmitted(false);
  }
  function review(e) {
    e.preventDefault();
    setSubmitted(true);
    if ((method === "email" ? invalidEmail : invalidPhone) || !consent) {
      requestAnimationFrame(() =>
        panel.current
          .querySelector(
            '[aria-invalid="true"] input,input[aria-invalid="true"],input[type=checkbox]:not(:checked)',
          )
          ?.focus(),
      );
      return;
    }
    setResult(
      `Local preference ready: ${method === "email" ? "Email to " + email : "Phone call to " + phone}. No reminder has been scheduled.`,
    );
  }
  return (
    <main>
      <header>
        <div className="eyebrow">
          SERVICE REMINDER / ORIGINAL APPLICATION STUDY
        </div>
        <h1>Choose how to hear from us</h1>
        <p>
          Set a sample reminder preference. Use fictional contact details in
          this local example.
        </p>
      </header>
      <div className="columns">
        <form onSubmit={review} noValidate ref={panel}>
          <RadioGroup
            label="Contact method"
            value={method}
            onChange={(v) => change(setMethod, v)}
            description="Choose one way to receive a reminder."
          >
            <Radio value="email">Email</Radio>
            <Radio value="phone">Phone call</Radio>
          </RadioGroup>
          <div className="field">
            {method === "email" ? (
              <TextField
                label="Email address"
                type="email"
                value={email}
                onChange={(v) => change(setEmail, v)}
                isRequired
                isInvalid={submitted && invalidEmail}
                errorMessage="Enter an email address in the format [email protected]."
                description="Use a sample address, such as [email protected]."
              />
            ) : (
              <TextField
                label="Phone number"
                type="tel"
                value={phone}
                onChange={(v) => change(setPhone, v)}
                isRequired
                isInvalid={submitted && invalidPhone}
                errorMessage="Enter a phone number with at least 10 digits."
                description="Sample validation only; a real service needs a jurisdiction-aware phone rule."
              />
            )}
          </div>
          <div className="field">
            <Checkbox
              isSelected={consent}
              onChange={(v) => change(setConsent, v)}
              isInvalid={submitted && !consent}
            >
              I agree to use these details for this sample reminder
            </Checkbox>
            {submitted && !consent && (
              <p className="error" role="alert">
                Confirm the reminder preference before continuing.
              </p>
            )}
          </div>
          <Button type="submit" variant="primary">
            Review preference
          </Button>
          <p className="result" role="status">
            {result}
          </p>
        </form>
        <aside>
          <div className="status-mark" aria-hidden="true">
            i
          </div>
          <h2>What happens next</h2>
          <ol>
            <li>Choose a contact method.</li>
            <li>Review the sample details.</li>
            <li>Connect a real notification service before scheduling.</li>
          </ol>
          <p>
            This example keeps both fields while switching methods, but only
            reviews the selected method.
          </p>
          <details>
            <summary>About this specimen</summary>
            <p>
              Native B.C. React Aria components with BC Sans. The form is
              original and is not an official government service.
            </p>
          </details>
        </aside>
      </div>
    </main>
  );
}
createRoot(document.getElementById("root")).render(<App />);

Referência de código

  • Crie um projeto Vite React, mantenha <div id="root"></div> e carregue este arquivo como src/main.jsx.

bc.css — composição responsiva original

Layout da aplicação organizado em torno dos componentes nativos.

css
* {
  box-sizing: border-box;
}
body {
  margin: 0;
  font:
    16px/1.5 "BC Sans",
    sans-serif;
  color: var(--typography-color-primary, #2d2d2d);
  background: white;
}
main {
  padding: 32px;
}
header {
  border-top: 6px solid #fcba19;
  border-bottom: 1px solid #d8d8d8;
  padding: 24px 0;
  margin-bottom: 32px;
}
.eyebrow {
  font-size: 13px;
  color: #474543;
}
h1 {
  font-size: 32px;
  line-height: 1.25;
  margin: 8px 0 16px;
}
h2 {
  font-size: 24px;
  margin: 0 0 16px;
}
p {
  margin: 8px 0 16px;
}
.columns {
  display: grid;
  grid-template-columns: 1.4fr 1fr;
  gap: 48px;
}
form {
  max-width: 620px;
}
.field {
  margin: 24px 0;
}
aside {
  padding: 24px;
  background: #f1f8fe;
  border-left: 4px solid #1a5a96;
  align-self: start;
}
.status-mark {
  background: #1a5a96;
  color: white;
  border-radius: 50%;
  width: 32px;
  height: 32px;
  display: grid;
  place-items: center;
  font-weight: bold;
  margin-bottom: 16px;
}
ol {
  padding-left: 24px;
}
li {
  padding-left: 4px;
  margin: 12px 0;
}
.error {
  color: #ce3e39;
  font-size: 14px;
}
.result {
  margin-top: 24px;
  color: #24613b;
}
summary {
  cursor: pointer;
  text-decoration: underline;
  color: #1a5a96;
}
details {
  margin-top: 24px;
}
details p {
  font-size: 14px;
}
@media (max-width: 767px) {
  main {
    padding: 16px;
  }
  .columns {
    grid-template-columns: 1fr;
    gap: 24px;
  }
  h1 {
    font-size: 28px;
  }
  aside {
    padding: 16px;
  }
}

Referência de código

  • Salve junto de main.jsx. Estas regras de composição personalizadas são distintas da referência de tokens da biblioteca.
04

Configuração do agente de IA sistema de design B.C.

Ponto de partida para implementação

O exemplo nativo com versões fixadas foi empacotado e verificado localmente no navegador. O exemplo usa apenas o estado local da aplicação.

sh
npm create vite@latest bc-reminder -- --template react
cd bc-reminder
npm install
npm install @bcgov/[email protected] @bcgov/[email protected] @bcgov/[email protected]
# Replace src/main.jsx and add src/bc.css using the complete examples.
npm run dev

Um prompt para seu projeto

Prompt para agente de IA
Crie o formulário de lembrete com os componentes B.C. React 0.8.1 e BC Sans 2.1.2. Preserve a validação condicional, os dados mantidos, os erros visíveis e a limpeza de resultados desatualizados. Use os nomes atuais dos tokens e o nome correto da família tipográfica, com espaços. Mantenha o exemplo local até que exista um contrato de notificação real.
05

Fontes e escopo de sistema de design B.C.

Um estudo de aplicação de OpenDesign que usa a biblioteca pública atual B.C. React. Este é um formulário local original, não um serviço oficial do governo; use dados de contato fictícios.