Copyright © 2025 the Contributors to the Design Tokens Resolver Module 2025.10 Specification, published by the Design Tokens Community Group under the W3C Community Final Specification Agreement (FSA). A human-readable summary is available.
本書は、異なるツール間でデザイントークンを交換するためのファイルフォーマットに関する技術仕様について記載しています。
本仕様は デザイントークン コミュニティグループ によって公開されました。W3C標準ではなく、W3C標準トラックにもありません。 W3C Community Final Specification Agreement(FSA) の下で、他の条件が適用される場合がありますのでご注意ください。 W3Cコミュニティ・ビジネスグループについてご確認ください。
このセクションは、本書が公開された時点での文書ステータスを説明しています。 他の文書が本書に取って代わることがあります。W3Cコミュニティグループレポートの一覧と本レポートの最新版は https://www.w3.org/community/reports/ で確認できます。
本書はW3Cプロセスの定義に従いDTCGによって 候補勧告として公開されています。本草案への貢献は Community Contributor License Agreement (CLA)および W3Cコミュニティグループプロセス で規定されています。
W3Cでの勧告ではありませんが、広範な合意形成を経た上で実装を目的とする仕様であることを明確にするため、この分類としています。
本仕様は安定版と見なされます。今後の更新は追って発行される仕様で提供されます。
本仕様に関する議論はGitHub Issuesをご利用ください。
非規範と明記されたセクションに加えて、本仕様に記載されているすべての執筆ガイドライン、図、例、注意書きは非規範です。それ以外の本仕様の内容はすべて規範的です。
この文書におけるキーワードMAY、MUST、MUST NOT、SHOULD、SHOULD NOTは、 BCP 14 [RFC2119] [RFC8174] に記載されている通り、すべて大文字で表示されている場合のみ、その意味で解釈されます。
このセクションは非規範です。
デザイントークンとは、設計上の意思決定をプラットフォーム非依存な方法で表現する手法であり、異なる分野、ツール、技術間で共有することができます。これにより組織全体で共通の語彙を確立するのに役立ちます。
デザインシステムの管理者や利用者向けのツールエコシステムは拡大しており、デザイントークン機能を組み込んだり、その導入が有益となるケースも増えています:
デザインシステムチームは、こうしたツールを統合し、デザイントークンデータがデザイン・開発ツール間でシームレスに流れるようにすることが望まれることが多いです。
例えば:
現在、多くのツールがデザイントークンへのAPIアクセスや、ファイルとしてエクスポートする機能を提供していますが、それらはすべてツール固有です。したがって、デザインシステムチームは独自の「つなぎ」コードやワークフローを作成・維持する負担を負っています。また、異なるツールに移行する場合、その統合部分も更新が必要になります。
本仕様は、デザイントークンデータを記述する標準ファイルフォーマットを定義することで、ツール間の相互運用性を高め、デザインシステムチームの統合作業の負担を軽減することを目的としています。
これらの定義は、本仕様の技術的側面に焦点を当てており、デザインツールのベンダーなど実装者を対象としています。デザイナーや開発者向けの定義は、designtokens.orgで公開されています。
(デザイン)トークンとは、人が認識できる名前に関連付けられた情報で、最低限名前と値のペアです。
例:
color-text-primary: #000000;font-size-heading-level-1: 44px;名前には追加のトークンプロパティを関連付けることができます。
トークン名に関連付けられる情報。
例:
必要に応じ、ツールやデザインシステムによってフォーマットを拡張するための追加メタデータを付与できます。
デザインツールとは、ビジュアルデザインの作成や編集を行うためのツールです。
例:
デザイントークンの変換ツールは、トークンデータをある形式から別の形式に変換します。
例:
ドキュメンテーションツールとは、デザイントークンの利用方法を記述するためのツールです。
例:
トークンの「型」は、その値に適用される予め定義された分類です。
例:
トークンツールは型を使って、そのトークンの用途を推論することができます。
例:
グループとは、特定のカテゴリに属するトークンの集合です。
例:
グループは任意のものとし、ツールはSHOULD NOT(すべきではない)グループからトークンの型や目的を推論するべきではありません。
デザイントークンの値は、他のトークンを参照することができます。同じ値に対して複数の名前、すなわちエイリアスを持つことが可能です。
以下のSass例はこの概念を表しています:
$color-palette-black: #000000;
$color-text-primary: $color-palette-black;
$color-text-primaryの値は#000000です。なぜなら
$color-text-primaryは$color-palette-blackを参照しているからです。この場合、$color-text-primaryは$color-palette-blackのエイリアスとも言えます。
複合デザイントークンとは、複数の名前付き子値で構成される値を持つトークンです。複合トークンは、常に一緒に適用される関連性の高いスタイルプロパティをまとめるのに役立ちます。例えば、タイポグラフィスタイルは、フォント名、フォントサイズ、行間、高さ、色などで構成できます。
こちらは複合シャドウトークンの例です:
{
"shadow-token": {
"$type": "shadow",
"$value": {
"color": {
"$type": "color",
"$value": {
"colorSpace": "srgb",
"components": [0, 0, 0],
"alpha": 0.5,
"hex": "#000000"
}
},
"offsetX": { "value": 0.5, "unit": "rem" },
"offsetY": { "value": 0.5, "unit": "rem" },
"blur": { "value": 1.5, "unit": "rem" },
"spread": { "value": 0, "unit": "rem" }
}
}
}
デザイントークンファイルは、https://www.json.org/ の構造に準拠したJSONファイルです。
交換フォーマットとしてJSONを採用した理由:
デザイントークンファイルをHTTP/HTTPSで配信する場合や、メディアタイプ(旧称MIMEタイプ)の指定が必要な状況では、デザイントークンファイル用には次のMIMEタイプをSHOULDとして使用します:
application/design-tokens+jsonただし、すべてのデザイントークンファイルは有効なJSONファイルであるため、JSONのメディアタイプapplication/jsonとして配信MAYです。上記の、より具体的なメディアタイプが推奨され、可能な限りSHOULDとして使われます。
デザイントークンファイルを開くことのできるツールは両方のメディアタイプをMUSTサポートしなければなりません。
デザイントークンファイルをローカルファイルシステムに保存する場合、専用のファイル拡張子を付けることで、ファイルブラウザなどで見分けやすくなります。また、ファイルアイコンや既定のアプリとの関連付けにも役立ちます。本仕様が推奨するファイル拡張子は次の通りです:
.tokens.tokens.json前者はより短く簡潔です。しかし、このフォーマットが広く採用・サポートされるまでの間は、後者を使うことでユーザーのお気に入りのJSONエディタでデザイントークンファイルを開きやすくなるかもしれません。
デザイントークンファイルを開けるツールは、利用可能なファイルを(たとえばファイルを開くダイアログ内で)これらの拡張子のみを表示するようMAYです。また「すべてのファイルを表示」など、これら以外も開ける選択肢を提供することが推奨されます。
デザイントークンファイルの保存に対応するツールは、保存時に推奨拡張子のいずれかをファイル名末尾にSHOULDで追加してください。
グループ内では、仕様を支援するためにJSON Schema追加について検討中です。
JSONファイルサイズ制限に関する懸念が一部ベンダーから寄せられています。ワーキンググループは、JSON形式による制約について引き続きフィードバックを収集しています。
$value プロパティを持つオブジェクトはトークンです。したがって、$value
はこの仕様における予約語となり、"$value" という名前のトークンは作成できません。親オブジェクトのキーがトークン名です。
トークン名は [RFC8259] で定義されている有効なJSON文字列である MUST です。
上記の例は、次のプロパティを持つデザイントークンを1つ定義しています:
名前と値はどちらも必須です。
トークン名は大文字小文字を区別します。そのため、同じグループ内で名前の大文字小文字だけが異なる2つのトークンが存在する次の例も有効です:
ただし、一部のツールでは他言語への書き出しやユーザーへの表示時に名前を変換する MAY があります。そのため、名前が大文字小文字だけ異なるトークンがあると、出力結果で同一の重複が発生することがあります。たとえば、これらのトークンをSassコードに変換する変換ツールでは、以下のような問題となる出力が生成されます:
ツールは名前の大文字小文字だけが異なるトークンがある場合、警告を表示する MAY です。
このフォーマットで定義されているすべてのプロパティはドル記号($)で始まります。この慣例は、将来バージョンで新しく導入されるプロパティにも適用されます。したがって、トークンおよびグループ名は $ で始めては MUST NOT いけません。
さらに、トークンエイリアスで使用される構文上の理由から、次の文字はトークン名やグループ名のいかなる場所にも MUST NOT で含めてはいけません:
{(左中括弧)}(右中括弧).(ピリオド)$value はトークンで唯一必須のプロパティですが、その他にもいくつかの追加プロパティを MAY 追加できます:
トークンの用途を説明するプレーンテキストをオプションの $description プロパティで指定できます。ツールは MAY
さまざまな形で説明を利用します。
例:
$descriptionプロパティの値はプレーンなJSON文字列で MUST です。例:
デザイントークンは常に明確な型を持ち、ツールはその値を確実に解釈できます。
トークンの型はオプションの $type プロパティで指定できます。$type が指定されていない場合、トークンの型は次のように MUST 判断します:
$type があれば、もっとも近い親グループの $type を継承します。$type がない場合、トークンの型は不明となり、そのトークンは MUST 無効とみなされます。
ツールが値の中身を検査して型を推測しては MUST NOT いけません。
$type プロパティは複数の階層で指定可能です:
$type の値は本仕様の型定義で指定された値のいずれかであり、プレーンなJSON文字列で MUST
です。値は大文字小文字を区別します。
例:
オプションの $extensions
プロパティは、ツールが独自やユーザー・チーム・ベンダー固有のデータを追加するためのオブジェクトです。各ツールはベンダー固有のキーを MUST
で使い、その値は任意のJSONデータ MAY とできます。
このフォーマット対応間の相互運用性を保つため、チームやツールは拡張データ用途をトークンの値理解に必須ではない任意のメタデータに限定する SHOULD です。
ベンダーは拡張仕様をできる限り公開するのが望ましいです。他ツールでも逆コンパイルなしで対応できるからです。普及した拡張は今後の仕様で標準機能入りする可能性があります。
拡張セクションはベンダー専用に限りません。すべてのトークン利用者が自身の用途で追加データをこのセクションに入れられます。
$deprecated プロパティはトークンを非推奨としてマークする際、および理由の説明(任意)に MAY 使えます。非推奨の理由例:
| 値 | 説明 |
|---|---|
true |
このトークンは非推奨(理由なし)。 |
String |
このトークンは非推奨、かつその理由が説明されている。 |
false |
このトークンは非推奨でない(グループのデフォルトを上書きする場合もある)。 |
ツール開発者は、{button.activeBorder} のようなエイリアスを含む場合、文字列を拡張する MAY です。ツールはトークン解決や、ドキュメントやコードへのリンク、もしくはUI内で新しいトークンへのリンクやビジュアル表現をレンダリングできるかもしれません。例:「今後は {button.activeBorder} をご利用ください」は、JSでは次のように出力できます:
または
グループはデザイントークンを論理的なコレクションに整理し、トークンファイルに階層構造を提供します。グループは任意のものであり、ツールはグループからデザイントークンの型や用途を推測しては SHOULD NOT なりません。
グループは $value プロパティを含まない JSON
オブジェクトとして識別されます。グループは次のものを MAY 含むことができます:
$value プロパティを持つオブジェクト$value プロパティを持たないオブジェクト$ で始まるプロパティ(例:$description,
$type)
重要: $value プロパティが存在することは、そのオブジェクトがトークンであることを決定的に示します。もしオブジェクトが
$value と子トークン/子グループの両方を含む場合、そのオブジェクトは同時にトークンとグループであることはできず、無効な構造になります。ツールはこれをエラーとして MUST 報告しなければなりません。
グループは子トークンやネストされたグループとともに ルートトークン を含めることが MAY あります。ルートトークンはグループの基底値を提供し、バリアントや拡張を可能にします。
グループは予約名 $root をトークン名として使用することでルートトークンをサポートします:
根拠:予約トークン名として $root
を使用することで、グループ参照とトークン参照の間の曖昧さを排除し、明確で一貫した構文を維持できます。$
プレフィックスはユーザー定義トークンとの命名衝突を防ぎ、仕様内の他の予約プロパティと整合します。
グループは次のプロパティを MAY 含むことができます:
| プロパティ | 必須 | 説明 |
|---|---|---|
$description |
No | グループの目的を説明するプレーンな JSON 文字列 |
$type |
No | グループ内で明示的に型を宣言していないトークンに対するデフォルトの型として機能します。型の継承はネストされたグループおよびそのトークンにも適用されます |
$extends |
No | 別のグループからトークンとプロパティを継承します。詳細は グループの拡張 を参照 |
$deprecated |
No | グループを非推奨としてマークします。値は true、false、または説明の文字列にできます |
$extensions |
No | ツールが独自データを追加できるベンダー固有の拡張 |
グループは $deprecated プロパティをオプションで含めてグループ全体を非推奨とマークすることが MAY
あります。これは子トークンにも明示的に上書きされない限り適用されます。
| 値 | 説明 |
|---|---|
true |
このグループは非推奨(説明なし) |
string |
このグループは非推奨であり、説明が付与されている |
false |
このグループは非推奨ではない(親グループのデフォルトを上書きする可能性あり) |
グループは $extensions
プロパティをオプションで含め、ツールが独自のユーザー・チーム・ベンダー固有のデータを追加することが MAY
あります。各ツールはベンダー固有のキーを使用し、その値は任意の有効な JSON データである MAY です。
グループは別のグループからトークンやプロパティを継承するためのオプション $extends プロパティを含めることが MAY
あります。$extends はトークンを参照しては MUST NOT いけません。$extends
プロパティは JSON Schema の $ref キーワードの構文糖衣であり、[json-schema-2020-12]
に定義される同じ意味論的動作に従います。
$extends プロパティは [json-schema-2020-12]
に規定された JSON Schema の $ref キーワードと意味論的に等価です。次の 2 つのグループ定義は機能的に同一です:
$extends を使う(Design Token 構文):
{
"button-primary": {
"$extends": "{button}",
"background": {
"$value": {
"colorSpace": "srgb",
"components": [0.8, 0, 0.4],
"hex": "#cc0066"
}
},
"focus": {
"$value": {
"colorSpace": "srgb",
"components": [1, 0.2, 0.6],
"hex": "#ff3399"
}
}
}
}
$ref を使う(JSON Schema 構文):
{
"button-primary": {
"$ref": "#/button",
"background": {
"$value": {
"colorSpace": "srgb",
"components": [0.8, 0, 0.4],
"hex": "#cc0066"
}
},
"focus": {
"$value": {
"colorSpace": "srgb",
"components": [1, 0.2, 0.6],
"hex": "#ff3399"
}
}
}
}
拡張の解決は次の簡潔な手順に従います:
$extends 参照を解決してターゲットグループを特定するこれにより、継承とローカルの内容を上記の上書きルールに従って組み合わせた新しい解決済みグループが作成されます。
グループ拡張はローカルのプロパティが同一パスの継承プロパティを上書きするという 深いマージ の振る舞いに従います:
上書きルール:
input-amount の結果:
| トークン | 最終値 |
|---|---|
field.width |
"100px"(ローカル上書きが勝つ) |
field.background |
{"colorSpace": "srgb", "components": [1, 1, 1], "hex": "#ffffff"}
(継承され、ローカル上書きなし)
|
多段階上書きの例:
extended の結果:
| トークン | 最終値 | 由来 |
|---|---|---|
color |
"#red" |
上書き |
spacing |
"16px" |
継承 |
border |
"1px solid" |
追加 |
グループは循環的な継承チェーンを作成しては MUST NOT いけません。次のパターンは 無効 です:
有効な継承パターン:
$extends は デザイントークンのエイリアス
と同じ参照形式をサポートします。
$extends のエラー処理は JSON Schema の $ref のエラーパターンに従います:
ツールは MUST JSON Schema バリデータが $ref
解決で使用するのと同様のエラー検出および報告パターンを実装しなければなりません。
デザイントークン解析を実装するツールは次のいずれかを MAY 選択できます:
$ref へ変換: $extends を標準 JSON Schema の
$ref 構文に変換し、既存の JSON Schema ライブラリで検証を行う
$extends を直接実装し、JSON Schema の $ref
処理と同じアルゴリズムを使用する実装手法にかかわらず、意味論的な振る舞いは JSON Schema 2020-12 以降に規定される $ref と等価であることが MUST です。
本仕様は $extends を JSON Schema の $ref
キーワードの構文糖衣として定義しており、デザイントークン固有の参照構文を提供しつつ等価な振る舞いを維持します。上記の深いマージ意味論は JSON Schema 2020-12 が兄弟プロパティとともに
$ref を扱う方法と整合します。
JSON Schema に馴染みのある実装者向けには、$extends の動作は次と等価です:
"$extends": "{group}" を "$ref": "#/group" に変換する$ref 解決を兄弟プロパティ評価とともに適用するツールは MAY 次のいずれかを選択できます:
$extends を $ref に変換して JSON Schema ライブラリを使用する
実装手法にかかわらず、ユーザーに見える振る舞いは本仕様で説明される深いマージ意味論と一致することが MUST です。
グループは空(トークンやネストグループを含まない)であっても MAY かまいません。即時の目的がないように見えても、次の利点があります:
$description, $extensions)経由でメタデータを含められる中括弧構文({group.token})を使った現行のトークン参照構文は後方互換性と開発者の使いやすさのために維持されます。しかし、ツールは高度なユースケース向けに JSON
Pointer 表記も MAY サポートできます。
ツールは [rfc6901] で定義される JSON Pointer
参照を MUST サポートし、$ref プロパティを使用する必要があります:
グループを処理する際、ツールは次の解決順序に従うことが MUST です:
$value プロパティを持つ直接の子$root 名のトークン$extends を通じて継承されたトークン(上書きされていない場合)トークンパスはグループ名とトークン名をピリオド(.)で連結して構築します。予約トークン名 $root
は明示的かつ曖昧さのない参照を維持するためパスに含まれます。
例:
| 場所 | パス | 注記 |
|---|---|---|
/color/accent/$root |
color.accent.$root |
トークンパス |
/color/accent/light |
color.accent.light |
トークンパス |
/color/accent |
— | トークン解決には無効だが、グループには有効 |
型の解決は次の優先順に従います:
$type プロパティ
(最優先)$type プロパティ$type プロパティ(階層を上って検索)拡張を伴う型解決:
$extends は JSON Schema の $ref
意味論に従うため、型継承の振る舞いは明示的なマージ規則ではなく制約検証によって決定されます。ローカルの型制約は継承された制約とともに JSON Schema の検証パターンに従って評価されます。
この例では、グループ extended はローカルの $type: "dimension" 制約と、参照された base
グループからの適用可能な制約の両方を満たす必要があり、JSON Schema の制約解決ルールに従います。
ツールは次での循環参照を検出してエラーを投げることが MUST です:
{token})
$extends 参照)$ref プロパティ)$extends の循環参照検出は JSON Schema の $ref の要件と同じです。ツールは循環検出のために JSON Schema
バリデータが使うアルゴリズムを実装することを SHOULD 推奨します。
ツールはこの循環参照をグループ a、b、c に影響するエラーとして MUST 報告しなければなりません。
本仕様は既存のデザイントークンファイルとの後方互換性を考慮して設計されています。本仕様を実装するツールは:
解決済みトークン:
{input-amount.field.width} → { "value": 100, "unit": "px" }
(上書き){input-amount.field.background} → #ffffff(input から継承)これはコンポーネントが基底コンポーネントを拡張しつつ、特定のトークンを上書きし他を継承する主要なユースケースを示します。
この構造は次のトークン参照でアクセス可能なトークンを生成します:
| トークン参照 | 解決済み値 |
|---|---|
{color.brand.$root} |
{"colorSpace": "srgb", "components": [0, 0.4, 0.8], "hex": "#0066cc"}
|
{color.brand.light} |
{"colorSpace": "srgb", "components": [0.2, 0.533, 0.867], "hex": "#3388dd"}
|
{color.semantic.success.$root} |
{"colorSpace": "srgb", "components": [0, 0.8, 0.4], "hex": "#00cc66"}
|
{color.semantic.error.dark} |
{"colorSpace": "srgb", "components": [0.6, 0, 0], "hex": "#990000"}
|
GUI を介してトークンを選択・編集させるツールはグルーピング構造を使って、折りたたみ可能なツリービューのような段階的な開示(progressive disclosure)を表示することが MAY あります。
トークン名は同一ファイル内で一意であることが保証されません。同じ名前が異なるグループで使われることがあります。また、変換ツールはコード内の変数のように一意に識別可能な方法でデザイントークンを出力する必要がある MAY あります。したがって、変換ツールはファイル内で一意であるためデザイントークンのパスを使用することを SHOULD です。
例えば、変換ツール のような Style Dictionary は、次のようなデザイントークンファイルを使用することがあります:
...そしてパスを連結して変数名を作成することで、次のようにSass変数として出力できます:
明示的な値を持つ代わりに、トークンは別のトークンの値を参照することができます。言い換えれば、あるトークンが別のトークンのエイリアスである場合があります。本仕様では「エイリアス」と「参照」を同義語と見なし、互換的に使用します。
エイリアスは次のような用途で有用です:
デザイントークンは、トークンファイル内のコンテンツを参照するために異なる 2 つの構文をサポートします:
中括弧構文は完全なトークン値を参照するために設計されており、常にターゲットトークンの$valueプロパティに解決されます。
この例では、{colors.blue} は完全な色オブジェクト
{"colorSpace": "srgb", "components": [0, 0.4, 0.8], "hex": "#0066cc"} に解決されます。
重要:中括弧参照は完全なトークン($value
プロパティを持つオブジェクト)のみをターゲットにでき、トークン値内の個々のプロパティや任意のドキュメント位置を指すことはできません。
トークン値内の特定のプロパティやドキュメント構造の他の部分にアクセスする高度なユースケースでは、トークンは [rfc6901] で定義される JSON Pointer
表記を $ref プロパティを使ってサポートすることが MUST です。本仕様を実装するツールは JSON Pointer
構文を MUST サポートします。
この例では:
"$ref": "#/colors/blue/$value" は "{colors.blue}" と同等です"$ref": "#/colors/blue/$value/components/0" は blue 色の赤成分(0)だけにアクセスします主な違い:
| 側面 | 中括弧 {token} |
JSON Pointer $ref |
|---|---|---|
| ターゲット | 完全なトークンのみ | ドキュメント内の任意の位置 |
| 暗黙のパス | 常に /$value を付加する |
明示的なフルパスが必要 |
| ユースケース | トークン間の参照 | プロパティレベルの参照 |
| 構文 | {group.token} |
#/group/token/$value |
ツールがトークンの実際の値を必要とする場合、参照を解決する(参照先トークンを検索してその値を取得する)ことが MUST です。ツールは参照を保持し、実際の値が必要なときのみ解決することを SHOULD です。例えば、デザインツール では、エイリアスで参照されているトークンの値が変更された場合、そのエイリアスが使用されているすべての場所に変更が反映されるべきです(SHOULD)。
中括弧参照の場合:
{group.token} からトークンパスを抽出する["group", "token"] に変換する$value プロパティを持つことを確認する$value の内容を抽出して返すJSON Pointer 参照の場合:
#/path/to/target からパスセグメントを抽出する~0, ~1)を処理するエイリアスは他のエイリアスを参照することが MAY あります。その場合、ツールは明示的な値を持つトークンが見つかるまで各参照をたどることが MUST です。
この例では、{semantic.link} はチェーン semantic.link → semantic.brand →
base.primary をたどって、{base.primary} と同じ色値に解決されます。
参照は循環しては MUST NOT です。デザイントークンファイルに循環参照が含まれる場合、そのチェーン内のすべてのトークンの値は不明となり、適切なエラーまたは警告メッセージをユーザーに表示することが SHOULD です。
ツールはこの循環参照を検出し、循環チェーン内のすべてのトークンに影響するエラーとして報告することが MUST です。
JSON Pointer 構文は、複合トークン内の完全な値だけでなく特定のプロパティへの参照を可能にし、トークンの構成要素の細かい再利用をセマンティックな関係を保ちながら実現します。
重要:プロパティレベルの参照は JSON Pointer 構文($ref)を必要とし、中括弧構文では表現できません。
この例では:
layout.small は base.spacing と同じ数値(16)を使い、単位は異なり rem を使います
layout.large は base.spacing と同じ単位(px)を使い、数値は異なり 32 を使います
この例では:
base.text から fontFamily と lineHeight を継承しますfontSize と fontWeight を定義しますJSON Pointer 構文は、デザイントークンドキュメント構造内の任意の位置に直接アクセスする手段を提供し、[rfc6901] に定義された標準の JSON Pointer ルールに従います。
#/(ドキュメントルートを指す)/ は各レベルを分離する(例:#/group/token/$value)
#/color/$value/components/0)~ は ~0 に/ は ~1 にデザイントークンは値を $value プロパティに格納するため、トークン値への JSON Pointer パスは予測可能なパターンに従います:
| JSON Pointer | 等価な中括弧参照 | 説明 |
|---|---|---|
#/colors/blue/$value |
{colors.blue} |
完全なトークン値 |
#/colors/blue/$value/hex |
N/A | 色の hex プロパティ |
#/colors/blue/$value/components/0 |
N/A | 色の最初のコンポーネント |
#/colors/blue/$type |
N/A | トークンの型メタデータ |
#/path/to/target からパスセグメントを抽出する~0, ~1)を処理する{group.token} からトークンパスを抽出する["group", "token"] に変換する$value プロパティを持つことを確認する$value の内容を抽出して返すツールは次のエラーを報告することが MUST です:
| トークンパス | JSON Pointer | 中括弧構文 |
|---|---|---|
| ルートトークン "primary" | #/primary |
{primary} |
| ネストされたトークン | #/colors/blue |
{colors.blue} |
| 配列要素 | #/color/components/0 |
サポートされていません |
| スペースを含むプロパティ | #/brand colors/primary |
{brand colors.primary} |
| スラッシュを含むプロパティ | #/my~1group/token |
{my/group.token} |
明確な解決:
| 参照 | 結果 | 注記 |
|---|---|---|
#/ambiguous/data/0 |
10 |
JSON Pointer の配列インデックス |
{ambiguous.metadata.0} |
"Info about first item" |
中括弧によるオブジェクトプロパティ参照 |
{ambiguous.data.0} |
エラー | 中括弧は配列インデックスにアクセスできない |
{ambiguous.metadata.2} |
エラー | プロパティ "2" は存在しない |
ツールは次のエラーを報告することが MUST です:
本仕様で定義された参照構文は、JSON Schema のパターンと互換性を持ちながらデザイントークンの作成ニーズに対応します:
重要:デザイントークン内の JSON Pointer 参照($ref)は JSON Schema の $ref
と同じ構文に従いますが、中括弧参照({token})はトークン専用で自動的に $value を解決し、トークンのみをターゲットとする点で標準の JSON
Schema 参照とは異なる意味論を持ちます。
この仕様は、単純なトークンエイリアスから高度なプロパティレベルの関係まで、作成者の使いやすさと技術的精度のバランスを実現する柔軟で標準ベースの参照手法を提供します。
多くのツールは、与えられたトークンがどのような種類の値を表すかを知る必要があり、それによって適切に処理できます。翻訳ツールはトークンの型に応じてトークンを異なる方法で変換またはフォーマットする必要がある MAY ことがあります。デザインツール は、特定の型のトークンを編集するときに色選択やスライダー、テキスト入力など異なる種類の入力 UI を提示することが MAY あります。スタイルガイド生成ツールは、トークンの型に応じて異なる種類のプレビューを使うことが MAY あります。
本仕様はデザインに特化した多数の型を定義しており、すべてのデザイントークンはこれらのいずれかの型を MUST 使用しなければなりません。さらに、そのトークンの値は本仕様で定義された選択された型のルールと構文に従うことが MUST です。
トークンの型は、選択した型を指定する $type
プロパティを直接与えることで設定できます。あるいは、親グループのいずれかから型を継承するか、望ましい型を持つトークンのエイリアスである場合もあります。
トークンに明示的な型が設定されていない場合、ツールはそのトークンを無効として扱い、値から他の型を推測しようとしては MUST なりません。
明示的な型が設定されているが、値が期待される構文と一致しない場合、そのトークンは無効であり、適切なエラーをユーザーに表示することが SHOULD
です。言い換えれば、$type プロパティはトークンに許容される値の種類を宣言するものです。(これは Java や TypeScript
のようなプログラミング言語での型付けに似ており、宣言された型と互換性のない値はコンパイルエラーになります。)
UI の色を表します。色の表現方法の詳細は Color モジュールを参照してください。
位置、幅、高さ、半径、厚さなど、UI における一方向の距離量を表します。$type プロパティは文字列 dimension に設定されていることが MUST です。値は数値の value(整数または浮動小数点)と測定の
unit("px" または "rem")を含むオブジェクトであることが MUST
です。
| キー | 型 | 必須 | 説明 |
|---|---|---|---|
value |
number |
Y | 数値を表す整数または浮動小数点値。 |
unit |
string |
Y | 距離の単位。サポートされる値: "px", "rem"。 |
例:
$value.unit は "px" または "rem" のみ許容されます。dp、iOS では
pt に相当します。翻訳ツールは必要に応じてこれらや他の同等単位へ変換することを SHOULD
です。
$value.value が 0 の場合でも $value.unit は必須です。以下のような単純なアプローチは仕様の初期段階では適切かもしれませんが、プラットフォームや OS、ブラウザの制約により想像以上に複雑になる可能性があります。
フォント名、または優先順(最も優先されるものから順)で並べたフォント名の配列を表します。$type プロパティは文字列 fontFamily
に設定されていることが MUST です。値は単一のフォント名を含む文字列、または各要素が単一フォント名である文字列の配列のいずれかであることが MUST です。
例:
フォントの太さを表します。$type プロパティは文字列 fontWeight に設定されていることが MUST です。値は [1, 1000] の範囲の数値、または下表に定義された事前定義された文字列値のいずれかである必要があります。
小さい数値はより細いウェイトを、大きい数値はより太いウェイトを表します(OpenType の wght
タグ仕様に従う)。事前定義された文字列値は特定の数値へのエイリアスです。例えば 100、"thin"、"hairline"
は同一の値を表します。
| 数値 | 文字列エイリアス |
|---|---|
100 |
thin, hairline |
200 |
extra-light, ultra-light |
300 |
light |
400 |
normal, regular, book |
500 |
medium |
600 |
semi-bold, demi-bold |
700 |
bold |
800 |
extra-bold, ultra-bold |
900 |
black, heavy |
950 |
extra-black, ultra-black |
[1, 1000] の範囲外の数値および大文字小文字の違いのみを伴うものを含むその他の文字列値は無効であり、ツールはこれらを拒否することが MUST です。
例:
アニメーションやアニメーションサイクルが完了するまでにかかる時間(ミリ秒単位)を表します。$type プロパティは文字列 duration
に設定されていることが MUST です。値は数値の value(整数または浮動小数点)と時間の
unit("ms" または "s")を含むオブジェクトであることが MUST
です。ミリ秒は 1 秒の千分の一です。
| キー | 型 | 必須 | 説明 |
|---|---|---|---|
value |
number |
Y | 数値を表す整数または浮動小数点値。 |
unit |
string |
Y | 時間の単位。サポートされる値: "ms"(ミリ秒)、"s"(秒)。 |
例:
$value.unit は "ms" または "s" のみ許容されます。アニメーションの期間中にプロパティの値がどのように進行するかを表し、加速、減速、バウンスのような視覚効果を作ります。$type プロパティは文字列
cubicBezier に設定されていることが MUST です。値は 4 つの数値を含む配列であることが MUST です。これらの数値は 2 点(P1, P2)を表し、それぞれ x 座標と y 座標を持ちます [P1x, P1y, P2x, P2y]。P1 と
P2 の y 座標は任意の実数(範囲 [-∞, ∞])を取り得ますが、x 座標は [0, 1] の範囲に制限されます。
例:
数値を表します。正の数、負の数、小数を含むことができます。数値トークンの用途例としては グラデーション停止位置
や単位を伴わない行の高さなどがあります。$type プロパティは文字列 number に設定されていることが MUST です。値は JSON の数値であることが MUST です。
このセクションは規範的ではありません。
ここにまだ文書化されていない型としては次のようなものが含まれる可能性があります:
前章で定義された color や dimension のような型はすべて単一の値を持ちます。たとえば、色トークンの値は「1つの」色です。しかし、UI デザインには複数の値の組み合わせとなる側面もあります。たとえばシャドウスタイルは、色、X と Y のオフセット、ブラー半径、スプレッド半径の組み合わせです。
すべてのシャドウスタイルは同じ要素(色、X/Y オフセットなど)を持ちますが、それぞれの値は異なります。さらに、各要素の値(「サブ値」とも呼ばれる)は常に同じ型になります。シャドウの色は常にcolor 型でなければならず、X オフセットは常にdimension 型でなければなりません。したがってシャドウスタイルはあらかじめ定義された構造に従う複数の値の組み合わせ、つまりそれ自体が「型」であり、このような型を複合型(composite types)と呼びます。
具体的には、複合型は次の特徴を持ちます:
color
値)であったり、サブ値の型を持つ別のデザイントークンへの参照(例:"{some.other.token}")であったりできます。複合型が配列プロパティを含む場合、配列内の各要素は明示的な値か適切な型のトークンへの参照のいずれかになります。配列内の参照は単一の値に解決され、配列の展開やフラット化は行われません。これにより、配列要素の一部が参照で他が明示値であるような柔軟な構成が可能になります。
配列のエイリアスは次の原則に従います:
たとえば、配列値を持つシャドウトークンは、別のシャドウトークンへの参照と明示的なシャドウオブジェクトを混在させることができます:
{
"layered-shadow": {
"$type": "shadow",
"$value": [
"{base.shadow}",
{
"color": "{brand.accent}",
"offsetX": { "value": 4, "unit": "px" },
"offsetY": { "value": 4, "unit": "px" },
"blur": { "value": 8, "unit": "px" },
"spread": { "value": 0, "unit": "px" }
}
]
}
}
型が複合型であるデザイントークンは「複合(design)トークン」と呼ばれることもあります。型以外に複合トークンは他のプロパティ($description や $extensions など)を持つことができ、他のデザイントークンから参照されることもあります。
一見すると、グループと複合トークンは非常に似て見えますが、解決しようとする問題が異なるため重要な違いがあります:
線やボーダーに適用されるスタイルを表します。$type プロパティは文字列 strokeStyle に設定されていることが MUST です。値は次のいずれかであることが MUST です:
stroke-linejoin、stroke-miterlimit、stroke-dashoffset
と同等のサブ値が必要ですか?
文字列のストロークスタイル値は次の事前定義値のいずれかであることが MUST です:
soliddasheddotteddoublegrooveridgeoutsetinsetこれらの値は CSS の同等の「line style」値と同じ意味を持ちます。CSS 仕様に従い、正確なレンダリングは実装依存です。たとえば dashed
スタイルでのダッシュとギャップの長さはツールによって異なる場合があります。
オブジェクトとして表されるストロークスタイル値は、次のプロパティを持つことが MUST です:
dashArray: dimension 値 および/または dimension
トークンへの参照の配列。交互に現れるダッシュとギャップの長さを指定します。配列の各要素は明示的な dimension 値か dimension
トークンへの参照でなければなりません。要素数が奇数の場合は、その値のリストを繰り返して偶数にします。lineCap:
次のいずれかの事前定義文字列値のいずれかである必要があります:"round"、"butt"、"square"。これらは
SVG の stroke-linecap
と同じ意味を持ちます。文字列値とオブジェクト値は相互排他的な表現手段です。たとえば inset や groove
のような文字列値は、ボーダーの一部の領域で色を明るく/暗くする実装固有の手段を必要とするため、単純に dashArray と
lineCap で表現できない場合があります。逆に、正確に定義された dashArray と lineCap
の組合せは、実装依存であるため dashed や dotted キーワードと完全に同一の見た目を保証しません。
さらに、一部のツールやプラットフォームはこの型が表現できるすべてのストロークスタイルをサポートしていない場合があります。そのため、ツールはネイティブにサポートしていない
strokeStyle トークンを表示またはエクスポートする際に、サポートされている最も近い近似にフォールバックするべきです。
「最も近い近似」の選択方法は実装依存ですが、以下の例はツールがいくつかの状況で採用しうるフォールバックを示します。
ボーダースタイルを表します。$type プロパティは文字列 border に設定されていることが MUST
です。値は次のプロパティを持つオブジェクトであることが MUST です:
color: ボーダーの色。このプロパティの値は有効なcolor 値か、color トークンへの参照であることが MUST です。width: ボーダーの幅・太さ。このプロパティの値は有効なdimension 値か、dimension
トークンへの参照であることが MUST です。style: ボーダーのスタイル。このプロパティの値は有効な stroke style 値 か、stroke
style トークンへの参照であることが MUST です。2 つの状態の間のアニメーション遷移を表します。$type プロパティは文字列 transition に設定されていることが MUST です。値は次のプロパティを持つオブジェクトであることが MUST です:
duration: 遷移の継続時間。このプロパティの値は有効なduration 値か duration
トークンへの参照であることが MUST です。delay: 遷移が開始される前の待ち時間。このプロパティの値は有効なduration 値か duration
トークンへの参照であることが MUST です。timingFunction: トランジションのタイミング関数。このプロパティの値は有効なcubic
Bézier 値か cubic Bézier トークンへの参照であることが MUST です。シャドウスタイルを表します。$type プロパティは文字列 shadow に設定されていることが MUST
です。値は次のいずれかであることが MUST です:
値が配列の場合、各要素は明示的なシャドウオブジェクトか別のシャドウトークンへの参照のいずれかでなければなりません。配列内の参照は単一のシャドウオブジェクトに解決され、配列のフラット化は発生しません。
各シャドウオブジェクト(明示的か参照によるものかを問わず)は次のプロパティを MUST 持ちます:
color: シャドウの色。このプロパティの値は有効な color 値 か color トークンへの参照であることが
MUST です。
offsetX: シャドウの水平方向のオフセット。このプロパティの値は有効な dimension 値 か
dimension トークンへの参照であることが MUST です。offsetY: シャドウの垂直方向のオフセット。このプロパティの値は有効な dimension 値 か
dimension トークンへの参照であることが MUST です。blur: シャドウに適用されるブラー半径。このプロパティの値は有効な dimension 値 か
dimension トークンへの参照であることが MUST です。spread: シャドウを拡張または収縮する量。このプロパティの値は有効な dimension 値 か
dimension トークンへの参照であることが MUST です。inset:(オプション)このシャドウがコンテナの内側(「インナーシャドウ」)かどうか。デフォルトは外側に描画されるドロップシャドウ(false)。
色のグラデーションを表します。$type プロパティは文字列 gradient に設定されていることが MUST です。値はグラデーションストップオブジェクトおよび/またはグラデーショントークンへの参照の配列であることが MUST
です。配列の各要素は明示的なグラデーションストップオブジェクトかグラデーショントークンへの参照でなければなりません。参照は単一のグラデーションオブジェクトに解決され、配列のフラット化は行われません。
各グラデーションストップオブジェクト(明示的または参照)は次の構造を MUST 持ちます:
color: そのストップ位置での色。このプロパティの値は有効な color 値 か color
トークンへの参照であることが MUST です。position: ストップがグラデーション軸上で占める位置。このプロパティの値は有効な数値値か number トークンへの参照であることが MUST です。数値は [0, 1] の範囲でなければなり、0 が軸の開始、1 が軸の終了を表します。範囲外の数値が与えられた場合は [0, 1]
にクランプされたものとして扱われます(例:42 は 1 として扱う)。グラデーション軸の始点または終点(それぞれ position が 0 または 1)にストップがない場合、各端に最も近いストップの色をその端まで延長します。
タイポグラフィスタイルを表します。$type プロパティは文字列 typography に設定されていることが MUST です。値は次のプロパティを持つオブジェクトであることが MUST です:
fontFamily: フォントファミリー。このプロパティの値は有効な font family 値
かフォントファミリートークンへの参照であることが MUST です。fontSize: タイポグラフィのサイズ。このプロパティの値は有効な dimension 値 か
dimension トークンへの参照であることが MUST です。fontWeight: タイポグラフィのウェイト。このプロパティの値は有効な font weight か
font weight トークンへの参照であることが MUST です。letterSpacing: 文字間の水平間隔。このプロパティの値は有効な dimension 値 か
dimension トークンへの参照であることが MUST です。lineHeight: 行間の垂直間隔。このプロパティの値は有効な number 値 か number
トークンへの参照であることが MUST です。数値は fontSize の乗数として解釈されることが SHOULD です。現在のタイポグラフィ仕様は目的に適していますか?lineHeight サブ値に number、dimension、または新しい lineHeight 型のどれを使うべきか といった議論があります。
Referenced in: