行政・公共サービス · 新しいリソース

Singapore Government デザインシステム.

現行のSGDS Web Componentsを使い、実際のレスポンシブトークン、昼夜のテーマ、ローカルのプランと同期する標準の範囲指定数量を実装します。

OpenDesign ガイド8章参考項目33件オリジナルアプリケーションガイド
01

Singapore Government デザインシステムインターフェースプレビュー

数量を増やし、無効な値を入力して検証し、リセットします。値を保持したまま、ネイティブの昼・夜トークンを切り替えられます。

小規模なワークショップのグループを計画する完全な例を開く
ネイティブのSGDS 3.29.0 Webコンポーネントとテーマを使用。プランナー、ローカル状態、明示的なArialフォールバックはオリジナルです。· 実装リファレンス
02

Singapore Government デザインシステムデザインリファレンス

Singapore SGDS Webコンポーネント3.29.0、公開済みのテーマファイル、レスポンシブトークン、custom-elements manifest。プレビューでは、オリジナルのindex.umd.min.jsバンドルをローカルのテーマインポートとともに実行します。Arialを明示的なフォールバックとして使用し、Tailwindユーティリティのコンパイルや公式マストヘッドは使用していません。v3パッケージは、v2のBootstrapを基盤とするSGDSとは別のものです。

実際のレスポンシブ文字サイズトークン

ソース
名前 / ルール値 / 設定用途
--sgds-font-size-heading-xl32→36→40pxベース、1024px、1440pxの各範囲。対応するline-height-xlは40→44→48px。
--sgds-font-size-heading-md24→26→28px対応するline-height-mdは28→32→32px。
--sgds-font-size-heading-sm20→22→24pxコンパクトなセクションタイトルの役割。
--sgds-font-size-body-md16px in all three rangesbody-lgは18→20→20px、body-smは14px。
--sgds-font-family-brandInter,system-ui,sans-serifフォントファイルは個別に読み込まれます。プレビューではArialで上書きしています。
--sgds-font-weight-*300,400,600,700ライト、レギュラー、セミボールド、ボールド。
--sgds-letter-spacing-tight-0.4pxroot.cssの見出し字間。

プリミティブとセマンティックなテーマの役割

ソース
名前 / ルール値 / 設定用途
--sgds-color-defaultDay#1a1a1a;night#f3f3f3gray1000→gray100にマッピング。本文の色をハードコードしていません。
--sgds-bg-defaultDay#ffffff;night#0e0e0esgds-night-themeに応じてルートのサーフェスが変化します。
--sgds-color-subtleDay#525252;night#a5a5a5補助テキスト。対応するサーフェス上で十分なコントラストを保ちます。
--sgds-primary-surface-default#6b4feb 現在の両テーマファイルでproduct-primary600を使用。
--sgds-primary-color-defaultDay#6b4feb;night#a999f3テキストの役割は、塗りつぶしサーフェスの役割とは異なります。
--sgds-border-color-defaultDay#868686夜間テーマのすべてのボーダーで、同じプリミティブを再利用しないでください。

スペーシング、ボーダー、レスポンシブな変化

ソース
名前 / ルール値 / 設定用途
--sgds-spacer-0…120,2,4,8,12,16,20,24,32,48,64,96,128pxルートを16pxとしてremで表した値。これらはプリミティブです。
--sgds-gap-md / --sgds-gap-2-xl16px /32px固定されたセマンティックな間隔。
--sgds-layout-gap-md16→24→32px実際のパッケージでは1024/1440pxでレスポンシブに変化します。512/768のグリッドブレークポイントとは異なります。
--sgds-text-gap-md12→16→16pxテキストの間隔には、独自のレスポンシブな役割があります。
--sgds-form-border-radius-md8pxborder-radius-mdのエイリアス。
--sgds-form-border-width-default1pxborder-width-1のエイリアス。

標準グリッドの参照値

ソース
名前 / ルール値 / 設定用途
xs / sm320–511 /512–767px4/8カラム、ガター16px、固定マージン20/24px。
md768–1023px8カラム、ガター24px、固定マージン28px。
lg1024–1279px12カラム、コンテナ幅888px、ガター24px。
xl1280–1439px12カラム、コンテナ幅1168px、ガター32px。
2xl1440px+12カラム、コンテナ幅1312px、ガター32px。
Preview composition888px maximum;two columns→one below768px意図的に小さく構成したプランナーであり、標準グリッドのすべてのプリセットを実装したものではありません。

QuantityToggleの公開API

ソース
名前 / ルール値 / 設定用途
value / stepNumber;defaults0 /1ネイティブイベントの後に要素の値を読み取る。
min / maxNumber constraintshintTextで設定したサービス上限の理由を説明する。
label / hintTextString properties/attributesアクセシブルなフィールド名と、範囲を示すヘルプを表示する。
hasFeedbackstyle | text | both文字列値をとるフィードバックモード。Boolean属性だけで指定するものではありません。
invalidFeedback / invalidMessage /Boolean state無関係な赤いボーダーではなく、コンポーネントのフィードバックを使用する。
Eventssgds-input;sgds-change;sgds-invalid;sgds-valid入力とボタンによる編集の両方を概要に反映するため、input/changeの両方を監視する。
Validation methodscheckValidity();reportValidity()制約の結果をBooleanで返す。reportValidityでフィードバックを表示する。
readonly versus disabledVisible fixed value versus unavailable controldisabledは送信対象から除外されますが、readonlyは値を保持します。
03

Singapore Government デザインシステム完全ガイド

実際のインターフェースで、このデザインシステムを選び、適用し、レビューするための実践ガイドです。

DESIGN-singapore-sgds.md

詳しいガイダンス、実装の出発点、ソースへのリンクをまとめています。

ガイドをダウンロード

Singapore Government デザインシステム現在のSGDSファミリーを選ぶ

Webコンポーネントと旧Bootstrapページ

SGDS v 3では@ govtechsg/sgds-web-componentを使用します。カスタム要素、テーマトークン、現在のユーティリティ連携は、旧@ govtechsg/sgds Bootstrapスタイルシートとは異なる実装方法です。v 2のJavaScriptの手順とv 3のタグを混在させても、新しいコントロールが初期化されるとは限りません。

この OpenDesign ガイドから

このサンプルでは、実際の3.29.0ブラウザーバンドルを使って数量切り替えとボタンを登録します。シンガポール政府のマストヘッドや政府との関係を示す主張は含めず、コミュニティワークショップのプランナーを独自に作成しました。コントロールが変更するのはローカルの値だけで、予約や決済のフローはありません。

関連する仕様を確認する

Singapore Government デザインシステムテーマトークンは階層化されている

プリミティブカラーとセマンティックな用途

ルートファイルでは、プリミティブのグレー、製品のプライマリーパープル、その他のパレットファミリーを定義します。昼・夜のテーマファイルでは、これらのプリミティブをデフォルトのテキスト、補助テキスト、塗りつぶしサーフェス、ボーダーなどの役割に割り当てます。夜間モードでは、プライマリーテキストの役割に使うプリミティブが変わる一方、プライマリーの塗りつぶしサーフェスは同じプリミティブのままになることがあります。

プレビューでは、ドキュメントの背景、テキスト、ボーダー、控えめなパネルにセマンティックプロパティを使用しています。そのため、ルートでsgds-night-themeを切り替えると、カスタム要素とその周囲の構成の両方が更新されます。コントロールが正しく切り替わる場合でも、段落の色を黒でハードコードすると、この連動が損なわれます。

紫のパレットは公開されている製品のデフォルトであり、政府機関になりすます理由にはなりません。機関のアイデンティティや承認済みマストヘッドの使用には、それぞれ別途承認が必要です。

関連する仕様を確認する

Singapore Government デザインシステム 実際の値で見るレスポンシブな文字サイズ

略式の比率ではなく、提供されているトークンを確認します

現在のresponsive.cssでは、heading-xlは3つの範囲でそれぞれ32、36、40pxに設定され、行の高さは40、44、48pxです。値は1024pxと1440pxで切り替わります。グリッドのより小さいレイアウト境界である512pxと768pxとは独立しています。Body-mdは16pxのままです。

公開されているタイポグラフィの概要では、一般的な比率や組み合わせの原則を説明しています。一方、提供されているトークンシートには、各役割に対応する正確なピクセル値のエイリアスがあります。このリファレンスでは、実装値を示す際に実際に使用できるエイリアスを使います。HTMLでは見出しの意味的な階層を保ち、適切な視覚トークンを適用してください。小さなセクションタイトルのために、見出しレベルを不自然に下げる必要はありません。

ブランド書体としてInterを使用し、セットアップでは300、400、600、700のウェイトを記載しています。ローカルの見本では明示的にArialに置き換えており、リモートフォントは読み込みません。導入するサービスでは、CSSのファミリー名だけに頼らず、選択したフォントを読み込んでテストしてください。

関連する仕様を確認する

Singapore Government デザインシステム 役割ごとに異なる間隔

すべての間隔を1つのスケールにまとめない

基本スペーサーのスケールには、4、8、12、16px以上の値だけでなく、2pxも含まれます。固定の間隔エイリアスと、レスポンシブなレイアウト・コンポーネント・テキストの間隔は、これらの基本値をもとに定義されています。たとえば、layout-gap-mdは16→24→32pxに変化しますが、text-gap-mdは12→16→16pxです。したがって、どちらも「medium」と呼ばれていても、用途によって値は異なります。

このプランナーでは、控えめな幅のコンテンツ領域2つ(数量コントロールと現在のプラン)を並べて配置できるよう、最大幅を888pxにしています。768px未満では縦に並べます。これはアプリケーション内のレイアウト構成であり、SGDS標準グリッド全体が常に888pxで止まるという意味ではありません。より広範な標準コンテナのルールは、別途リファレンスに記載しています。

関連する仕様を確認する

Singapore Government デザインシステム 上限のある数量コントロール

識別子ではなく、件数には数量を使います

数量トグルは、1単位ずつ調整できる少量の数量に適しています。この見本では、参加者を1~5人、共有キットを0~3個に設定しています。これらはデモ用の制約です。実際のサービスでは、実際の在庫状況やポリシーに基づいて制約を設定し、ヒントに明記する必要があります。郵便番号、識別子、正確な通貨額には、別の入力方法を使用してください。

ネイティブコンポーネントでは、数値入力欄の前後に減少・増加アイコンボタンを配置します。min、max、stepには数値を指定し、valueには現在の数量を設定します。labelとhintTextで入力内容を説明します。上限または下限に達すると、該当するボタンは使用できなくなります。直接入力に対する制約の検証も必要です。

hasFeedbackには、文字列のstyle、text、またはその両方を指定します。この例では両方に加えて、invalidFeedbackに具体的なメッセージを指定しています。別のコンポーネントのAPIからhasFeedbackをBooleanとしてコピーすると、この設定が正確に反映されません。

html
<sgds-quantity-toggle
  id="people" name="people" label="Participants"
  hintText="Choose 1 to 5 participants"
  min="1" max="5" step="1" value="1"
  hasFeedback="both"
  invalidFeedback="Enter a whole number from 1 to 5">
</sgds-quantity-toggle>
<output id="participant-total">1</output>
<script>
  customElements.whenDefined('sgds-quantity-toggle').then(() => {
    const quantity = document.querySelector('#people');
    const update = () => {
      document.querySelector('#participant-total').textContent = String(quantity.value);
    };
    ['sgds-input', 'sgds-change'].forEach(name => {
      quantity.addEventListener(name, update);
    });
  });
</script>

コードリファレンス

関連する仕様を確認する

Singapore Government デザインシステム 概要の表示を同期する

2つのイベント経路と1つのデータソース

概要は、各ホスト要素のvalueを読み取ります。入力による編集とボタンによる確定変更では、同じイベント経路が使われるとは限らないため、sgds-inputとsgds-changeの両方を監視します。最初のローカル見本では、入力だけをテストしたため、増加ボタンによる更新を検出できませんでした。最終例では両方に対応しています。

「プランを確認」では、両方のネイティブ要素に対してreportValidityを呼び出し、ローカルのステータスメッセージを表示します。不正な数値をもっともらしい合計に変換することはありません。「リセット」では、ホスト要素に初期値を設定し、setInvalid(false)でアプリケーションから確認できる無効状態を解除してから、updateCompleteの後に概要を更新します。

disabledフィールドとreadonlyフィールドは同じではありません。前者はフォーム送信の対象になりませんが、後者は値を保持します。実際のサービスで確認済みの数量をレビュー用に固定する場合は、灰色に見せる目的だけで無効化せず、適切な状態を使用してください。

  • 概要で入力と増加ボタンの両方に対応するには、sgds-inputとsgds-changeを使います。
  • Shadow DOMの内部に触れず、カスタム要素のホストからvalueを読み取ります。
  • ローカルの入力検証フィードバックと、予約や送信の成功表示を区別します。

関連する仕様を確認する

Singapore Government デザインシステム 要素の登録前にスタイルを読み込む

テーマの依存関係を読み込む

バンドルするアプリケーションでは、day.css、night.css、css/sgds.cssの順にインポートし、その後でコンポーネントライブラリを一度だけインポートします。day.cssとnight.cssはroot.cssをインポートし、root.cssはresponsive.cssをインポートします。基盤ファイルはreboot.cssとgrid.cssをインポートします。静的ファイルとして配布する場合も、最初の3ファイルだけでなく、これらの相対パスの依存関係を維持してください。

公式のutility.cssは、Tailwind CSS v 4の設定エントリです。設定済みのTailwindビルドを通す必要があります。通常のブラウザ用スタイルシートとして追加しても、すべてのsgds:ユーティリティクラスは生成されません。この見本では一般的なレイアウトCSSと意味的なカスタムプロパティを使っているため、ユーティリティのビルドは必要ありません。

単独で動作するブラウザーの例では、公開されているファイルはindex.umd.min.jsです。パッケージのメタデータにはindex.umd.jsの記載が残っていますが、確認した配布物にはそのファイルがありません。ローカルプレビューでは実際に存在する圧縮済みバンドルを使い、npmのセットアップではバンドラー向けにドキュメントで案内されているパッケージインポートを使います。

  1. バージョンを3.29.0に固定し、基盤ルールより先にテーマトークンをインポートします。
  2. Interを用意するか、十分にテストした代替フォントを意図的に選択してください。
  3. カスタム要素は一度だけ登録します。必要に応じて定義を待ってから、アプリケーションのイベントリスナーを追加してください。

関連する仕様を確認する

Singapore Government デザインシステム 上限・下限とテーマを併せてテストする

境界値のテストで連携ミスを見つける

「参加者」を2回増やし、コントロールと概要の両方が3と表示されることを確認します。9を直接入力して「プランを確認」を実行してください。コンポーネントに範囲外のフィードバックが表示され、ステータスに修正を促すメッセージが表示される必要があります。値を5に修正し、値が有効なまま増加ボタンが無効になることを確認してください。

数量を入力した後に夜間テーマへ切り替え、値が保持されること、概要が読みやすいこと、境界値が正しく機能することを確認します。リセットして、今度はキーボードで操作します。Tabキーで入力欄とボタンに適切な順序で移動でき、フォーカス中のボタンをEnterキーまたはSpaceキーで実行できることを確認してください。

ローカルテストでは、1440、768、390pxでのコンポーネントの動作を検証し、テーマの依存関係がローカルから配信されることを確認します。将来の行政サービスにおけるブラウザー対応やアクセシビリティ認証を保証するものではありません。実際のサービスでは、全体のフロー、文言、テーマのカスタマイズ、データの取り扱いをテストする必要があります。

関連する仕様を確認する

Singapore Government デザインシステムのコンポーネント例

上限・下限のある数量と2種類のイベント経路

ネイティブコントロールと連動する出力を備えた完全な例。

html
<sgds-quantity-toggle
  id="people" name="people" label="Participants"
  hintText="Choose 1 to 5 participants"
  min="1" max="5" step="1" value="1"
  hasFeedback="both"
  invalidFeedback="Enter a whole number from 1 to 5">
</sgds-quantity-toggle>
<output id="participant-total">1</output>
<script>
  customElements.whenDefined('sgds-quantity-toggle').then(() => {
    const quantity = document.querySelector('#people');
    const update = () => {
      document.querySelector('#participant-total').textContent = String(quantity.value);
    };
    ['sgds-input', 'sgds-change'].forEach(name => {
      quantity.addEventListener(name, update);
    });
  });
</script>

コードリファレンス

v3のバンドル設定

正しいテーマの読み込み順、ライブラリの登録、明示的なTailwindユーティリティの境界。

bash / css / javascript
npm install --save-exact @govtechsg/[email protected]

/* globals.css — tokens before foundation rules */
@import "@govtechsg/sgds-web-component/themes/day.css";
@import "@govtechsg/sgds-web-component/themes/night.css";
@import "@govtechsg/sgds-web-component/css/sgds.css";
/* Only for a configured Tailwind CSS v4 build: */
/* @import "@govtechsg/sgds-web-component/css/utility.css"; */

// main.js — register custom elements once
import '@govtechsg/sgds-web-component';

// Enable the published night theme; omit class for day.
document.documentElement.classList.toggle('sgds-night-theme');

コードリファレンス

単体で動作するサンプル一式

レイアウト、操作要素、初期化処理を含むドキュメント全体です。リンク先のサンプルアーカイブを展開すると、このプレビューで使用する正確な相対パスのベンダーアセットが得られます。その後、HTTP経由で配信してください。

html
<!doctype html><html lang="en"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>SGDS quantity specimen</title><link rel="stylesheet" href="vendor/sgds-3.29.0/themes/day.css"><link rel="stylesheet" href="vendor/sgds-3.29.0/themes/night.css"><link rel="stylesheet" href="vendor/sgds-3.29.0/css/sgds.css"><style>:root{--sgds-font-family-brand:Arial,sans-serif}*{box-sizing:border-box}body{margin:0;background:var(--sgds-bg-default);color:var(--sgds-color-default);font-family:var(--sgds-font-family-brand)}main{max-width:888px;margin:auto;padding:32px 20px}h1{font-size:var(--sgds-font-size-heading-xl);line-height:var(--sgds-line-height-xl);letter-spacing:var(--sgds-letter-spacing-tight)}h2{font-size:var(--sgds-font-size-heading-sm);line-height:var(--sgds-line-height-sm)}p{max-width:60ch;line-height:1.5}.eyebrow{color:var(--sgds-color-subtle);font-size:14px}.layout{display:grid;grid-template-columns:1fr 1fr;gap:var(--sgds-layout-gap-md);margin:32px 0}.control{border:1px solid var(--sgds-border-color-default);border-radius:var(--sgds-border-radius-md);padding:24px;background:var(--sgds-bg-alternate)}sgds-quantity-toggle{display:block;max-width:100%}dl{margin:24px 0}dt{color:var(--sgds-color-subtle)}dd{margin:0 0 16px;font-weight:600}.actions{display:flex;flex-wrap:wrap;gap:16px}#status{min-height:24px}button.native{font:inherit;background:transparent;border:1px solid var(--sgds-border-color-default);color:inherit;padding:8px 12px;border-radius:8px}button.native:focus-visible{outline:3px solid var(--sgds-primary-border-color-default);outline-offset:3px}@media(max-width:767px){.layout{grid-template-columns:1fr}.control{padding:20px}}</style><main><p class="eyebrow">Independent specimen · Community workshop planning</p><h1>Plan a small workshop group</h1><p>Adjust two bounded quantities and inspect the local summary. This example does not reserve places or equipment.</p><button class="native" id="theme" aria-pressed="false">Night theme</button><div class="layout"><section class="control"><h2>People and materials</h2><form id="planner"><sgds-quantity-toggle id="people" name="people" label="Participants" hintText="Choose 1 to 5 participants" min="1" max="5" step="1" value="1" hasFeedback="both" invalidFeedback="Enter a whole number from 1 to 5"></sgds-quantity-toggle><div style="height:24px"></div><sgds-quantity-toggle id="kits" name="kits" label="Shared material kits" hintText="Choose 0 to 3 kits" min="0" max="3" step="1" value="0" hasFeedback="both" invalidFeedback="Enter a whole number from 0 to 3"></sgds-quantity-toggle></form></section><section><h2>Current plan</h2><dl><dt>Participants</dt><dd id="p-value">1</dd><dt>Material kits</dt><dd id="k-value">0</dd></dl><p>These are demonstration limits. A real service should explain its own availability and eligibility rules.</p><div class="actions"><sgds-button id="review">Check plan</sgds-button><sgds-button id="reset" variant="outline">Reset</sgds-button></div><p id="status" role="status" aria-live="polite"></p></section></div></main><script src="vendor/sgds-3.29.0/index.umd.min.js"></script><script type="module">await Promise.all(['sgds-quantity-toggle','sgds-button'].map(x=>customElements.whenDefined(x)));const p=document.querySelector('#people'),k=document.querySelector('#kits'),status=document.querySelector('#status');await Promise.all([p.updateComplete,k.updateComplete]);const update=()=>{document.querySelector('#p-value').textContent=String(p.value);document.querySelector('#k-value').textContent=String(k.value);status.textContent=''};[p,k].forEach(x=>['sgds-input','sgds-change'].forEach(name=>x.addEventListener(name,update)));document.querySelector('#review').onclick=()=>{const validP=p.reportValidity(),validK=k.reportValidity();status.textContent=validP&&validK?'The quantities are within the demo limits. Nothing has been reserved.':'Correct the highlighted quantity before continuing.'};document.querySelector('#reset').onclick=async()=>{p.value=1;k.value=0;p.setInvalid(false);k.setInvalid(false);await Promise.all([p.updateComplete,k.updateComplete]);update()};document.querySelector('#theme').onclick=e=>{const night=document.documentElement.classList.toggle('sgds-night-theme');e.currentTarget.setAttribute('aria-pressed',String(night));e.currentTarget.textContent=night?'Day theme':'Night theme'};window.demoReady=true;</script></html>

コードリファレンス

  • 完全なサンプルは「ソース」からダウンロードできます。READMEに正確なローカル起動コマンドが記載されています。
  • ベンダーのパスはこのドキュメントからの相対パスのままにしてください。アーカイブには、このプレビューで使用するアセット一式が含まれています。
04

Singapore Government デザインシステム エージェント設定

実装の出発点

単体プレビューでは、検証済みのオリジナルのindex.umd.min.jsバンドルとローカルのCSS依存関係を使用します。npmの手順はバンドラー向けです。utility.cssにはTailwind v4が必要なため、この静的プレビューでは意図的に省略しています。Sourcesにある完全な動作例のZIPには、プレビューに必要な依存関係一式とドキュメント全体も含まれています。展開して、そのディレクトリでpython3 -m http.server 8080を実行し、http://localhost:8080/singapore-sgds.htmlを開いてください。モジュールを使う例をfile://経由で開かないでください。

bash / css / javascript
npm install --save-exact @govtechsg/[email protected]

/* globals.css — tokens before foundation rules */
@import "@govtechsg/sgds-web-component/themes/day.css";
@import "@govtechsg/sgds-web-component/themes/night.css";
@import "@govtechsg/sgds-web-component/css/sgds.css";
/* Only for a configured Tailwind CSS v4 build: */
/* @import "@govtechsg/sgds-web-component/css/utility.css"; */

// main.js — register custom elements once
import '@govtechsg/sgds-web-component';

// Enable the published night theme; omit class for day.
document.documentElement.classList.toggle('sgds-night-theme');

あなたのプロジェクト向けプロンプト

AI エージェント用プロンプト
実際の3.29.0 sgds-quantity-toggleおよびsgds-button要素を使って、シンガポールSGDS v3のプランナーを作成します。day/night/root/responsiveのトークン一式と基盤スタイルをインポートしてから、ネイティブコンポーネントを登録します。参加人数と資材キット数には上限・下限を設定し、hasFeedback="both"、正確なラベルとヒント、型付きの検証を適用します。また、sgds-inputとsgds-changeの両方を監視する、連動した概要を用意します。テーマ切り替えでは、値をリセットせずにルート要素のsgds-night-themeを切り替えます。ローカルでの入力チェックと予約の違いを明確にしてください。v2のBootstrapコードを読み込んだり、Tailwindクラスが生のutility.cssから生成されるように見せたりしないでください。
05

Singapore Government デザインシステム ソースと対象範囲

MITライセンスのコードとオリジナルのワークショップコンテンツを使った独立した実装例です。政府機関のヘッダー、提携、予約、ネットワーク経由の送信、公式の方針による上限を示すものではありません。