Behörden und öffentliche Dienste · Neue Ressource

B.C. Designsystem.

Erstellen Sie ein Erinnerungsformular nach dem Vorbild von British Columbia mit echten semantischen Tokens, nativen React-Aria-Steuerelementen, bedingten Kontaktfeldern und vollständigem Validierungsverhalten.

OpenDesign-Leitfaden6 Kapitel36 ReferenzeinträgeOriginaler Anwendungsleitfaden
01

B.C. Designsystem-Oberflächenvorschau

Wechsle zwischen E-Mail und Telefon, ohne Eingaben zu verlieren. Prüfe anschließend eine lokale Einstellung und sieh sie dir an.

Kontaktpräferenz auswählen und prüfenVollständiges Beispiel öffnen
Native @bcgov/design-system-react-components 0.8.1, Tokens 5.0.0 und BC Sans 2.1.2. · Implementierungsreferenz
02

B.C. Designsystem-Designreferenz

Native @bcgov/design-system-react-components 0.8.1, Tokens 5.0.0 und BC Sans 2.1.2.

Rollen für Oberflächen und Text

Quelle
Name / RegelWert / KonfigurationVerwendung
--surface-color-primary-button-default#013366 Veröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.
--surface-color-primary-button-hover#1e5189 Veröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.
--surface-color-primary-button-disabled#edebe9 Veröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.
--surface-color-background-white#ffffff Veröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.
--surface-color-background-light-gray#faf9f8 Veröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.
--surface-color-background-light-blue#f1f8fe Veröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.
--surface-color-border-default#d8d8d8 Veröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.
--surface-color-border-medium#898785 Veröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.
--surface-color-border-active#2e5dd7 Veröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.
--typography-color-primary#2d2d2d Veröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.
--typography-color-secondary#474543 Veröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.
--typography-color-link#255a90 Veröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.
--typography-color-danger#ce3e39 Veröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.
--typography-color-primary-invert#ffffff Veröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.

Abstandsrhythmus

Quelle
Name / RegelWert / KonfigurationVerwendung
--layout-padding-hair0.125remVeröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.
--layout-padding-xsmall0.25remVeröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.
--layout-padding-small0.5remVeröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.
--layout-padding-medium1remVeröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.
--layout-padding-large1.5remVeröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.
--layout-padding-xlarge2remVeröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.
--layout-margin-medium1remVeröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.
--layout-margin-large1.5remVeröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.
--layout-margin-xlarge2remVeröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.
--layout-margin-xxxlarge3remVeröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.
--layout-border-radius-small2pxVeröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.
--layout-border-radius-medium4pxVeröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.
--layout-border-radius-large6pxVeröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.

Typografieskala

Quelle
Name / RegelWert / KonfigurationVerwendung
--typography-font-size-small-body0.875remVeröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.
--typography-font-size-body1remVeröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.
--typography-font-size-large-body1.125remVeröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.
--typography-font-size-h51.25remVeröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.
--typography-font-size-h41.5remVeröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.
--typography-font-size-h31.75remVeröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.
--typography-font-size-h22remVeröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.
--typography-font-size-h12.25remVeröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.
--typography-font-size-display3remVeröffentlichte B.C.-Rolle; nach ihrem Zweck verwenden, statt sie durch einen unveränderten Farb- oder Maßwert zu ersetzen.
03

B.C. Designsystem – Vollständiger Leitfaden

Ein praktischer Leitfaden zur Auswahl, Anwendung und Überprüfung dieses Systems für ein echtes Interface.

DESIGN-british-columbia.md

Umfassende Anleitung, Einstieg in die Implementierung und Links zu den Quellen.

Leitfaden herunterladen

Aktuelle Bibliothek und Design-Tokens für B.C. Designsystem und React

Wähle die gepflegte Implementierung

Das aktuelle B.C. Design System stellt React-Komponenten bereit, die auf React Aria aufbauen. In diesem Beispiel sind react-components 0.8.1 und die zugehörige Abhängigkeit design-tokens 5.0.0 festgelegt. Das ältere Repository für B.C. Web Components ist eine separate Legacy-Implementierung; durch seinen Import wird die aktuelle React-Bibliothek nicht nachgebildet. Vergleiche die Implementierung mit der Dokumentation, bevor du ein Beispiel übernimmst.

Aus diesem OpenDesign-Leitfaden

Die tatsächliche Schriftart einbinden

Die Komponenten erwarten den Familiennamen BC Sans mit Leerzeichen. Version 2.1.2 enthält css/BC_Sans.css; der alte Eintrag BCSans.css ist als veraltet gekennzeichnet und deklariert einen anderen Familiennamen. Ist BC Sans auf dem Entwicklungsrechner installiert, kann das einen fehlenden Schriftimport verschleiern. Dieses Beispiel enthält die veröffentlichte Schriftart, damit das Ergebnis nicht von einer lokalen Installation abhängt.

B.C. Designsystem – Semantische Farb- und Abstandsrollen

Vor der Wahl des Werts die Rolle prüfen

Primäre Schaltflächen verwenden die dunkelblaue Füllfarbe für primäre Schaltflächen; ergänzende Inhalte verwenden typography-color-secondary. Fehlermeldungen verwenden typography-color-danger. Die Tabelle hält die aktuellen Exportnamen von CSS fest. Der Name vermittelt eine stabile Bedeutung, selbst wenn ein zukünftiges Theme den zugrunde liegenden Wert ändert. Verwechsle die Farbe eines inaktiven Steuerelements nicht mit gewöhnlichem ergänzendem Text.

Abstände bewusst gestalten

Das Formular verwendet zwischen den Feldern einen Abstand von 24px und zwischen der Hauptaufgabe und der ergänzenden Erläuterung einen größeren Abstand von 48px. Diese Werte entsprechen dem Rhythmus der Bibliothek, während die zweispaltige Gesamtanordnung speziell für dieses Beispiel gestaltet wurde. Auf Mobilgeräten werden die Spalten zusammengeführt, ohne die Formularbeschriftungen zu verkleinern oder Erläuterungen in Tooltips umzuwandeln.

B.C. Designsystem – Bedingte Felder und beibehaltene Werte

Nur die gewählte Kontaktmethode validieren

Eine native RadioGroup steuert, ob das TextField für die E-Mail-Adresse oder die Telefonnummer angezeigt wird. Beim Wechsel der Methode bleiben beide Werte im Status von React erhalten, doch bei der Prüfung wird nur das ausgewählte Feld validiert. So bleiben nützliche Eingaben erhalten, ohne dass ein unsichtbares Feld die aktuelle Aufgabe blockiert.

Nützliche lokale Fehlermeldungen anzeigen

Das E-Mail-Feld prüft ein einfaches Adressformat; beim Telefonbeispiel sind mindestens zehn Ziffern erforderlich. Dabei handelt es sich ausdrücklich um Beispielregeln und nicht um eine vollständige internationale Kontaktvalidierung. Bei einer ungültigen Prüfung wird isInvalid gesetzt und eine feldspezifische errorMessage angezeigt. Für eine fehlende Zustimmung wird eine sichtbare Meldung ausgegeben; das erste ungültige Steuerelement erhält den Fokus.

B.C. Designsystem – Komponentenverträge von React Aria

Kontrollierte Werte und dokumentierte Handler verwenden

TextField erhält value und onChange; RadioGroup erhält value und onChange; Checkbox verwendet isSelected und onChange. Diese Handler erhalten die dokumentierten Werte und kein Browser-Ereignisobjekt, dessen Wert stets über event.target ausgelesen werden muss. Button verwendet type=submit und das submit-Ereignis des nativen Formulars, sodass die Tastatureingabe denselben Validierungspfad durchläuft.

Rückmeldungen bei der Prüfung synchron halten

B.C. Designsystem – Zugängliche Namen und responsives Layout

Beschriftungen, Beschreibungen und Fehlermeldungen miteinander verknüpfen

Die nativen Komponenten stellen ihre React-Aria-Beziehungen für Beschriftungen, Hilfetexte und Fehlermeldungen bereit. Die Anwendung muss weiterhin aussagekräftige Beschriftungen, eine klare Gruppenbeschreibung und verständliche Validierungstexte bereitstellen. Beim Testen solltest du auf sichtbare Radiobeschriftungen klicken und die Tastatur verwenden; das intern visuell ausgeblendete Eingabeelement ist nicht das sichtbare Ziel.

Ergänzende Hinweise vom Formular abgrenzen

Der danebenstehende Hinweis erläutert den lokalen Ablauf und enthält ein natives Details-Element mit Umsetzungskontext. Bei schmalen Ansichten folgt er in der Lesereihenfolge auf das Formular. Das Informationssymbol ist dekorativ, da die Überschrift die Bedeutung vermittelt. Für die Untersuchung der Komponenten sind weder ein offizielles B.C.-Logo noch ein Anspruch auf einen Regierungsdienst erforderlich.

B.C. Designsystem Vollständige Umsetzung React

Die geprüfte Vorlage nachbilden

Erstellen Sie ein Vite-Projekt React und installieren Sie die festgelegten Komponenten-, Token- und Schriftpakete. Verwenden Sie die bereitgestellten Dateien main.jsx und bc.css sowie ein Root-Mount-Element. Das Bundle umfasst natives Verhalten für Optionsfelder, Eingabefelder, Kontrollkästchen und Schaltflächen sowie die vollständige lokale Validierung und die Zustandsübergänge. Eine private API oder ein Zugangsschlüssel ist nicht erforderlich.

  1. Installieren Sie die festgelegten Pakete und importieren Sie css/BC_Sans.css.
  2. Speichern Sie main.jsx und bc.css und behalten Sie das Root-Mount-Element bei.
  3. Senden Sie ein leeres Formular ab und korrigieren Sie anschließend das angezeigte Feld.
  4. Wechseln Sie die Methode und prüfen Sie, ob der vorherige Wert erhalten bleibt.

Bedingte Validierung an die ausgewählte Methode anpassen

Die onChange-Handler von RadioGroup und TextField erhalten Werte, während Checkbox.onChange den ausgewählten booleschen Wert erhält. Speichern Sie diese Werte direkt, statt auf alle Komponenten einen allgemeinen event.target.value-Handler anzuwenden. Die sichtbaren Beschriftungen bleiben die Interaktionsziele, auch wenn React Aria ein natives Eingabeelement visuell ausblendet.

Wenn sich die Kontaktmethode ändert, behalten Sie beide Entwurfswerte bei, löschen Sie jedoch die alte Rückmeldung und validieren Sie nur die ausgewählte Methode. Verschieben Sie nach dem Absenden den Fokus auf das erste sichtbare ungültige Steuerelement. So kann eine Person die Kontaktoptionen vergleichen, ohne eine E-Mail-Adresse zu verlieren oder durch ein unsichtbares Telefonfeld blockiert zu werden. Die zehnstellige Telefonnummernregel im Beispiel gilt bewusst nur lokal und muss durch die tatsächlichen Anforderungen des Dienstes an internationale Telefonnummern ersetzt werden.

  • Validiert wird nur das ausgewählte Kontaktfeld.
  • Beim Bearbeiten einer Auswahl wird die alte Rückmeldung gelöscht.
  • Das Ergebnis behauptet nicht, dass eine Erinnerung geplant wurde.

B.C. Designsystem Komponentenbeispiele für das Design-System

main.jsx — vollständiges, funktionsfähiges Beispiel

Wählen Sie eine Kontaktpräferenz aus und prüfen Sie sie. Der folgende Quellcode enthält den vollständigen React-Eintrag einschließlich aller Zustände und der Validierung.

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

Code-Referenz

  • Erstellen Sie ein Vite-Projekt React, behalten Sie <div id="root"></div> bei und laden Sie diese Datei als src/main.jsx.

bc.css — ursprüngliches responsives Layout

Anwendungslayout, das um die nativen Komponenten herum aufgebaut ist.

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;
  }
}

Code-Referenz

  • Speichern Sie die Datei neben main.jsx. Diese benutzerdefinierten Layoutregeln sind von der Token-Referenz der Bibliothek getrennt.
04

B.C. Designsystem Einrichtung des Agenten

Ausgangspunkt für die Implementierung

Das Beispiel mit den festgelegten nativen Komponenten wurde gebündelt und lokal im Browser geprüft. Das Beispiel verwendet ausschließlich den lokalen Anwendungszustand.

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

Ein Prompt für dein Projekt

Agenten-Prompt
Erstellen Sie das Erinnerungsformular mit den B.C.-React-Komponenten 0.8.1 und BC Sans 2.1.2. Behalten Sie die bedingte Validierung, erhaltene Eingaben, sichtbare Fehlermeldungen und das Löschen veralteter Ergebnisse bei. Verwenden Sie die aktuellen Token-Namen und den korrekt geschriebenen Schriftnamen mit Leerzeichen. Lassen Sie das Beispiel lokal, bis ein echter Benachrichtigungsvertrag vorliegt.
05

B.C. Designsystem Quellen und Geltungsbereich

Eine Anwendungsstudie zu OpenDesign mit der aktuellen öffentlichen B.C.-React-Bibliothek. Dies ist ein eigens erstelltes lokales Formular, kein offizieller Regierungsdienst. Verwenden Sie fiktive Kontaktdaten.