Administración pública y servicios públicos · Nuevo recurso

Sistema de diseño B.C..

Crea un formulario de preferencias de recordatorios al estilo de B.C. con tokens semánticos reales, controles Aria nativos de React, campos de contacto condicionales y validación completa.

Guía de OpenDesign6 capítulos36 entradas de referenciaGuía de aplicación original
01

Vista previa de interfaz de sistema de diseño B.C.

Alterna entre correo electrónico y teléfono conservando los datos ingresados; luego valida y revisa una preferencia local.

Elige y revisa una preferencia de contactoAbrir ejemplo completo
@bcgov/design-system-react-components 0.8.1 nativo, tokens de diseño 5.0.0 y BC Sans 2.1.2. · Referencia de implementación
02

Sistema de diseño B.C. Referencia de diseño

@bcgov/design-system-react-components 0.8.1 nativo, tokens de diseño 5.0.0 y BC Sans 2.1.2.

Roles de superficie y texto

Fuente
Nombre / ReglaValor / ConfiguraciónUso
--surface-color-primary-button-default#013366 Rol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.
--surface-color-primary-button-hover#1e5189 Rol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.
--surface-color-primary-button-disabled#edebe9 Rol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.
--surface-color-background-white#ffffff Rol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.
--surface-color-background-light-gray#faf9f8 Rol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.
--surface-color-background-light-blue#f1f8fe Rol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.
--surface-color-border-default#d8d8d8 Rol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.
--surface-color-border-medium#898785 Rol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.
--surface-color-border-active#2e5dd7 Rol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.
--typography-color-primary#2d2d2d Rol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.
--typography-color-secondary#474543 Rol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.
--typography-color-link#255a90 Rol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.
--typography-color-danger#ce3e39 Rol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.
--typography-color-primary-invert#ffffff Rol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.

Ritmo de la composición

Fuente
Nombre / ReglaValor / ConfiguraciónUso
--layout-padding-hair0.125remRol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.
--layout-padding-xsmall0.25remRol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.
--layout-padding-small0.5remRol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.
--layout-padding-medium1remRol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.
--layout-padding-large1.5remRol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.
--layout-padding-xlarge2remRol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.
--layout-margin-medium1remRol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.
--layout-margin-large1.5remRol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.
--layout-margin-xlarge2remRol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.
--layout-margin-xxxlarge3remRol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.
--layout-border-radius-small2pxRol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.
--layout-border-radius-medium4pxRol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.
--layout-border-radius-large6pxRol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.

Escala tipográfica

Fuente
Nombre / ReglaValor / ConfiguraciónUso
--typography-font-size-small-body0.875remRol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.
--typography-font-size-body1remRol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.
--typography-font-size-large-body1.125remRol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.
--typography-font-size-h51.25remRol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.
--typography-font-size-h41.5remRol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.
--typography-font-size-h31.75remRol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.
--typography-font-size-h22remRol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.
--typography-font-size-h12.25remRol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.
--typography-font-size-display3remRol publicado de B.C.; úsalo según su propósito en lugar de sustituirlo por un color o una dimensión sin más.
03

Sistema de diseño B.C. Guía completa

Una guía práctica para elegir, aplicar y revisar este sistema en una interfaz real.

DESIGN-british-columbia.md

Orientación completa, un punto de partida para la implementación y enlaces al código fuente.

Descargar la guía

Sistema de diseño B.C.: biblioteca actual de React y tokens

Elige la implementación mantenida

La versión actual de B.C. Design System ofrece componentes React basados en React Aria. Este ejemplo fija react-components 0.8.1 y su dependencia design-tokens 5.0.0. El antiguo repositorio B.C. Web Components es una implementación heredada independiente; importarlo no reproduce la biblioteca actual de React. Antes de copiar un ejemplo, asegúrate de que la implementación coincida con la documentación.

De esta guía de OpenDesign

Importa la tipografía correcta

Los componentes esperan que el nombre de la familia tipográfica incluya un espacio: BC Sans. La versión 2.1.2 incluye css/BC_Sans.css; la antigua entrada BCSans.css está marcada como obsoleta y declara un nombre de familia diferente. Tener BC Sans instalada en el equipo de desarrollo puede ocultar que falta importar la fuente. Este ejemplo incluye la fuente publicada para que el resultado no dependa de una instalación local.

Sistema de diseño B.C. Roles semánticos de color y espaciado

Lee el rol antes de elegir el valor

Los botones principales usan el relleno azul oscuro para botones principales, mientras que el contenido complementario usa typography-color-secondary. Los mensajes de error usan typography-color-danger. La tabla registra los nombres de exportación actuales de CSS; cada nombre expresa una intención estable, aunque un tema futuro cambie el valor subyacente. No confundas el color de un control inactivo con el del texto complementario habitual.

Aplica una geometría deliberada

El formulario usa un espaciado de 24px entre campos y una separación mayor, de 48px, entre la tarea principal y la explicación complementaria. Estos valores corresponden al ritmo de la biblioteca, mientras que la composición general en dos columnas está diseñada específicamente para este ejemplo. En móviles, las columnas se apilan sin reducir el tamaño de las etiquetas del formulario ni convertir el texto explicativo en información sobre herramientas.

Sistema de diseño B.C. Campos condicionales y valores conservados

Valida únicamente el método de contacto elegido

Un RadioGroup nativo controla si se muestra el TextField de correo electrónico o el de número de teléfono. Los dos valores se conservan en el estado de React al cambiar de método, pero solo el campo seleccionado se valida durante la revisión. Así se conservan los datos útiles y se evita que un campo oculto impida completar la tarea actual.

Muestra errores locales útiles

El campo de correo electrónico comprueba un formato sencillo de dirección y el ejemplo de teléfono exige al menos diez dígitos. Se trata explícitamente de reglas de ejemplo, no de un validador internacional completo de datos de contacto. Si la revisión detecta datos no válidos, establece isInvalid y proporciona un mensaje de error específico para el campo mediante errorMessage. Si falta la aceptación, se muestra un mensaje; el foco pasa al primer control no válido.

Contratos de componentes de sistema de diseño B.C. React Aria

Usa valores controlados y los controladores documentados

TextField recibe value y onChange; RadioGroup recibe value y onChange; Checkbox usa isSelected y onChange. Estos controladores reciben los valores documentados, no un objeto de evento del navegador que siempre haya que leer mediante event.target. Button usa type=submit y el evento de envío del formulario nativo para que el envío con el teclado siga la misma ruta de validación.

Mantén sincronizados los comentarios de revisión

Sistema de diseño B.C. Nombres accesibles y composición adaptable

Mantén vinculadas las etiquetas, descripciones y errores

Los componentes nativos proporcionan las relaciones de React Aria entre las etiquetas, el texto de ayuda y los mensajes de error. La aplicación sigue teniendo que proporcionar etiquetas significativas, una descripción clara del grupo y mensajes de validación comprensibles. Las pruebas deben hacer clic en las etiquetas de radio visibles y usar el teclado; el campo de entrada interno oculto visualmente no es el objetivo visible.

Separa las indicaciones complementarias del formulario

El recuadro contiguo explica el flujo de trabajo local e incluye un elemento details nativo que revela información sobre la implementación. En pantallas estrechas, aparece después del formulario en el orden de lectura. El símbolo de información es decorativo porque el encabezado comunica el significado. No hace falta un logotipo oficial de B.C. ni afirmar que se trata de un servicio gubernamental para estudiar los componentes.

Sistema de diseño B.C. Implementación completa de React

Reproduce la fuente verificada

Crea un proyecto de Vite React e instala los paquetes fijados de componentes, tokens y tipografía. Usa los archivos main.jsx y bc.css proporcionados junto con un elemento raíz para el montaje. El paquete incluye el comportamiento nativo de radio, campo, casilla y botón, además de la validación local completa y las transiciones de estado. No necesitas ningún API privado ni credenciales.

  1. Instala los paquetes fijados e importa css/BC_Sans.css.
  2. Guarda main.jsx y bc.css, y conserva el elemento raíz para el montaje.
  3. Envía el formulario vacío y, luego, corrige el campo visible.
  4. Cambia de método y confirma que se conserve el valor anterior.

Ajusta la validación condicional al método seleccionado

Los controladores onChange de RadioGroup y TextField reciben valores, mientras que el de Checkbox recibe el booleano seleccionado. Guarda esos valores directamente en lugar de aplicar un controlador genérico event.target.value a todos los componentes. Las etiquetas visibles siguen siendo los objetivos de interacción, incluso cuando React Aria oculta visualmente un campo de entrada nativo.

Cuando cambie el método de contacto, conserva ambos valores del borrador, pero borra la revisión anterior y valida solo el método elegido. Después del envío, mueve el foco al primer control visible no válido. Así, la persona puede comparar las opciones de contacto sin perder una dirección de correo electrónico ni quedar bloqueada por un campo de teléfono invisible. La regla de diez dígitos del teléfono de este ejemplo es deliberadamente local y debe sustituirse por los requisitos internacionales reales del servicio.

  • Solo se valida el campo de contacto seleccionado.
  • Al editar cualquier opción, se borra la retroalimentación de la revisión anterior.
  • El resultado no afirma que se haya programado un recordatorio.

Ejemplos de componentes del sistema de diseño sistema de diseño B.C.

main.jsx — ejemplo completo y funcional

Elige una preferencia de contacto y revísala. El código siguiente es la entrada completa de React, incluidos todos los estados y la validación.

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 />);

Referencia de código

  • Crea un proyecto Vite React, conserva <div id="root"></div> y cárgalo como src/main.jsx.

bc.css — composición adaptable original

Diseño de la aplicación con capas alrededor de los 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;
  }
}

Referencia de código

  • Guárdalo junto a main.jsx. Estas reglas de composición personalizadas se distinguen de la referencia de tokens de la biblioteca.
04

Configuración del agente sistema de diseño B.C.

Punto de partida para la implementación

El ejemplo nativo fijado se empaquetó y se comprobó localmente en el navegador. El ejemplo utiliza únicamente el estado local de la aplicación.

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

Una instrucción para tu proyecto

Instrucción para el agente
Crea el formulario de recordatorio con componentes B.C. React 0.8.1 y BC Sans 2.1.2. Conserva la validación condicional, los datos introducidos, los errores visibles y la eliminación de resultados obsoletos. Usa los nombres actuales de los tokens y el nombre de familia tipográfica con los espacios correctos. Mantén el ejemplo local hasta que exista un contrato de notificación real.
05

Fuentes y alcance de sistema de diseño B.C.

Estudio de una aplicación OpenDesign que utiliza la biblioteca pública actual B.C. React. Este es un formulario local original, no un servicio oficial del gobierno; usa datos de contacto ficticios.