デザイントークンリゾルバーモジュール 2025.10

最終コミュニティグループレポート

このバージョン:
https://www.w3.org/community/reports/design-tokens/2025.10/
最新版:
https://www.designtokens.org/TR/2025.10/resolver/
編集者:
Joren Broekema
Esther Cheran
Mike Kamminga
Andrew L’Homme
Drew Powers
Matthew Ström-Awn
Lilith Wittmann
著者:
Louis Chenais
James Nash
フィードバック:
GitHub design-tokens/community-group (プルリクエスト, 新規課題, 未解決課題)

要約

この仕様はフォーマットを拡張し、 複数のコンテキスト(例えば「ライトモード」や「ダークモード」などのカラーテーマ)で デザイントークンを扱う方法について記述します。

この文書の位置付け

この仕様は デザイントークン・コミュニティグループによって公開されました。 これは W3C 標準ではなく、また W3C 標準トラックにもありません。 W3C コミュニティ最終仕様合意書(FSA) の下で他の条件が適用されることにご注意ください。 W3C コミュニティおよびビジネスグループについて詳しくはそちらをご覧ください。

このセクションでは、公開時点でのこの文書のステータスについて説明します。 他の文書がこの文書に取って代わる場合があります。 現在の W3C コミュニティグループのレポート一覧や、本レポートの最新版は W3C コミュニティグループ レポートインデックス https://www.w3.org/community/reports/ でご覧いただけます。

この文書は DTCG より 候補勧告 として W3C プロセスで定義された説明に従い公開されました。 このドラフトへの貢献は コミュニティ貢献者ライセンス契約(CLA) に従って管理されており、 W3C コミュニティグループプロセス で規定されています。

これは W3C 勧告ではありませんが、 この分類は徹底的な合意形成の後、この仕様が実装を意図していることを明確にするものです。

この仕様は安定と見なされています。 今後の更新は後続の仕様で提供されます。

この仕様についての議論には GitHub Issues の利用が推奨されます。

1. はじめに

このセクションは規範的ではありません。

デザイントークンの利用者は、異なるコンテキストで適用される代替値を表現する必要がよくあります。例として、以下に挙げるものに限定されませんが:

しかし、これらの代替コンテキストは組合せ爆発の影響を受けやすく、保存や管理が扱いにくくなります。

このフォーマットは、すべてのコンテキストにわたるトークンの重複する値を排除する仕組みと、すべてのコンテキストの順列を列挙する方法を記述します。

2. 用語

2.1 直交性

このセクションは規範的ではありません。

各々が排他的なトークン上で動作する、2つ以上のコンテキストを記述する特性、すなわち重なりがないこと。修飾子は直交してもよいですが、必須ではありません。

修飾子を可能な限り直交化することで、認知的負荷を減らし、ユーザーのエラーを減らします。

2.2 順列

順列とは、リゾルバードキュメントの単一の可能な配置のことです。順列は input と 1:1 で対応しますが、「input」は使用される修飾子コンテキストを強調し、「順列」は最終的なトークン集合を強調します。

3. ファイルタイプ

3.1 フォーマット

リゾルバードキュメントは標準の JSON 構文([RFC8259])を必ず使用しなければなりません。

ツールは、JSONC や JSON5 といった拡張をサポートしてもよいですが、ドキュメントが通常の JSON に変換でき、トークン値に影響しないことが条件です。

3.2 ファイル拡張子

ユーザーはリゾルバードキュメントの名前に .resolver.json というファイル拡張子を使用すべきです。

3.3 MIME タイプ

リゾルバードキュメントを HTTP 経由で送信する際、ユーザーは Content-Type ヘッダー([RFC1341])に期待される application/json の MIME タイプ([RFC6838])を使用すべきです。 ユーザーは、カスタムまたは予期しない MIME タイプを使用してはなりません。

4. 構文

4.1 ルートレベルのプロパティ

リゾルバードキュメントは、ルートレベルで以下のプロパティを含みます:

Name Type Required Description
name string ドキュメントの短い人間可読の名前。
version YYYY.MM Y バージョン。2025.10でなければなりません。
description string このドキュメントの人間可読の説明。
sets Map[string, Set] セットの定義。
modifiers Map[`string, Modifier] 修飾子の定義。
resolutionOrder (ReferenceObject | Set | Modifier)[] Y セットと修飾子の解決順。

4.1.1 名前

ドキュメントはルートレベルに人間可読の name を提供してもよいです。これは、ファイル名だけでは十分でない場合に、別のリゾルバードキュメントと区別するのに役立ちます。

4.1.2 バージョン

ドキュメントはルートレベルにバージョンを必ず提供しなければならず、必ず2025.10 である必要があります。これは、将来破壊的変更が導入された場合に備えた予約です。

4.1.3 説明

ドキュメントはルートレベルに description を提供してもよいです。これは name に存在しない追加の説明やコンテキストを加えるために使用できます。

4.1.4 セット

セットは、DTCG フォーマットのデザイントークンの集合です。セットは、直接宣言されたトークンを含む sources 配列、またはデザイントークンを含む JSON ファイルを指す参照オブジェクト、あるいはその両方の組み合わせを必ず含まなければなりません。

セットは、セットの目的を説明する description を含めてもよいです。

配列が複数のソースを宣言する場合、それらは配列順にマージされます。つまり、トークンが複数回宣言されている場合、配列内の最後の出現が最終値になります。ツールは配列の順序を必ず尊重しなければなりません。

4.1.5 修飾子

修飾子は set に似ていますが、contexts マップを通じて条件付きの取り込みを可能にします。

4.1.5.1 コンテキスト

修飾子は、string 値からトークンソースの配列への contexts マップを必ず宣言しなければなりません。トークンソースの配列は、ReferenceObject、インライントークン、またはその両方の組み合わせでなければなりません。

修飾子は 2 つ以上の contexts を持つべきです。1 つだけだと set と同等になるためです。修飾子は空の contexts マップを持ってはなりません。ツールはコンテキストが 1 つしかない修飾子に対してエラーを投げるべきです。コンテキストが 0 の修飾子に対しては必ずエラーを投げなければなりません。

sets と同様に、配列の順序は必ず尊重され、競合がある場合には配列内の最後のトークンの出現が最終値を生成します。

修飾子はコンテキスト値の中で set を参照してもよいです。ただし、修飾子は他の修飾子、同じ修飾子内の別コンテキストを含め、参照してはなりません。

4.1.5.2 説明

修飾子は人間可読の description を宣言してもよいです。

4.1.5.3 デフォルト

修飾子は contexts のキーのいずれかに必ず一致する default 値を宣言してもよいです。値が contexts に存在しない場合、ツールは必ずエラーを投げなければなりません。

4.1.5.4 解決数

ドキュメントが生成し得る解決の数は、すべての修飾子にわたる contexts の総数の積で予測できます。

4.1.6 解決順

resolutionOrder キーは、最終的なトークンの結果を生成するために順序付けられた sets と modifiers の配列です。順序は重要で、競合がある場合には配列の後方のトークンが前方のトークンを上書きします。

4.1.6.1 インラインセットと修飾子

resolutionOrder において、set または modifier は、name と type キーがオブジェクトに追加される限り、インラインで宣言してもよいです:

Property Type Required Description
name string Y 他のresolutionOrder 内のいかなる name とも衝突してはならない一意な名前。
type "set" | "modifier" Y タイプに応じて "set" または "modifier" でなければなりません。

ツールは、インラインオブジェクトから name または type が欠落している場合、または name がいずれかのオブジェクト間で重複している場合には、必ずエラーを投げなければなりません。

Editor's note: Name

インラインセットと修飾子は、いかなる方法でも参照してはなりません。参照オブジェクトが解決順の項目を指している場合、ツールはエラーを投げるべきです。

4.1.6.2 セットと修飾子の順序

このセクションは規範的ではありません。

resolutionOrder 配列は、ユーザーの選択による任意のセットと修飾子の順序付けを可能にします。しかし、多くのセットが競合解決のために修飾子の後に置かれなければならないような状況では、予測不能で壊れやすいトークン構成のコードスメルである可能性が高いです。理想的には、修飾子は条件付きの値を十分に扱い、上書きがほとんど(あるいは全く)不要となります(直交性参照)。実務的には、これは次を意味します

4.2 参照オブジェクト

別の JSON ドキュメントや同一ドキュメント内の構造を参照する場合、参照オブジェクトを使用しなければなりません。これは JSON Schema 2020-12 において、$ref キーを持ち、その文字列が [RFC6901] に記述された有効な JSON ポインタであるオブジェクトとして説明されています。

ツールはリゾルバードキュメント内のすべての参照オブジェクトを必ず解決しなければなりません。

参照オブジェクトは循環してはなりません。すなわち、自身を参照する他のポインタを参照したり、参照オブジェクトの親ノードを参照したりしてはなりません。

ツールは同一ドキュメント内参照オブジェクトを必ずサポートしなければなりません。これはこのリゾルバーモジュールをサポートするための最小要件です。それ以外については、ツールはローカルファイルシステム上のファイルのインポートや TCP/IP 経由のリモート URI など、いくつかの URI タイプをサポートしないという個別の判断を行っても構いません。

4.2.1 無効なポインタ

ポインタは同一ドキュメント内のどこを指してもよいですが、次の例外があります:

  1. resolutionOrder のみが修飾子(#/modifiers/…)を参照できます。セットおよび修飾子は他の修飾子を参照してはなりません。
    • セットから修飾子を参照すると、inputs が条件ロジックを、対応できない構造に適用してしまう可能性があり、許可されません。
    • 修飾子から他の修飾子を参照すると、単一の入力が予期しない修飾子に適用されることになり、許可されません。
  2. resolutionOrder 配列(#/resolutionOrder/…)内のいかなるものも、参照オブジェクトが指してはなりません。解決順はその性質上、ドキュメントの多くの部分を参照します。これのいかなる部分を複製しても、複雑で予測困難な連鎖を生じます。

ツールは、無効なポインタに遭遇した場合、必ずエラーを投げなければなりません。

4.2.2 拡張

JSON Schema 2020-12 が許すように、参照オブジェクトには $ref と並んで他のキーが存在してもよいです。このような場合、$ref と並ぶローカルキーは上書きとして扱わなければなりません。

$ref と並ぶキーがオブジェクトまたは配列を宣言している場合、ツールはこれらを浅くフラット化しなければなりません。つまり、オブジェクトや配列はマージされません。

4.3 $extensions

$extensions オブジェクトは、任意の set、modifier、または インラインの set/modifier に追加してもよいもので、個々のツールが使用するか無視するかは任意のメタデータを宣言します。

提供される場合、$extensions はベンダー固有の名前空間をキーとするオブジェクトでなければなりません。これにより、複数のツールがこのメタデータを衝突なく使用できます。

4.4 $defs

ツールは JSON Schema の $defs で構造を定義することを許可してもよいですが、必須ではありません。ただし、ツールは $defs に遭遇した際にエラーを投げてはなりません。未対応の場合はそのキーを無視しなければなりません。

Editor's note: $defs

5. 入力

リゾルバードキュメントは、条件付きトークン値が生成されてもよい方法のみを記述します。しかし、その条件はどこかで依然として提供される必要があります。「入力」という用語は、ツールに渡されるコンテキスト値の任意の選択を指します。

ツールは、JSON シリアライズ可能なオブジェクト(例えば、JavaScript のオブジェクトや Python の辞書)としての入力を必ず受け付けなければなりません。

修飾子を宣言するリゾルバを読み込むツールは、付随する入力が提供されない場合、エラーを投げるべきです。

5.1 大文字・小文字の区別

入力は大文字・小文字を区別しないべきです。例えば、 { "theme": "dark" }、{ "Theme": "Dark" }、{ "THEME": "DARK" } は 同等であるべきです。ただし、ツールは大文字・小文字の区別について個別の判断をしてもよいです。

5.2 文字列の強制

入力の値は必ず文字列でなければなりません。入力に { "beta": true } や { "size": 100 } のような非文字列の値が含まれている場合、ツールは必ずエラーを投げなければなりません。

6. 解決ロジック

ツールは正しい出力を得るために、解決の段階を必ず処理しなければなりません。

  1. 入力の検証:与えられたリゾルバードキュメントに対して入力が有効であることの検証。
  2. 順序付け:最終的なトークン構造を生成するための resolutionOrder 配列の追跡。
  3. エイリアス:最終的なトークン構造の中のトークンエイリアスの解決。
  4. 解決:最終的な結果

6.1 入力の検証

ツールは、すべての入力が、提供された修飾子のコンテキストに一致することを必ず要求しなければなりません。

リゾルバが修飾子を宣言していない場合は、このステップをスキップして順序付けに進みます。

  1. 入力オブジェクトのすべてのキーに対して:
    1. それが有効な修飾子に対応しているか検証します。対応していない場合はエラーを投げます。
    2. そのキーの値が、その修飾子の許容値に対応しているか検証します。対応していない場合はエラーを投げます。
  2. リゾルバ内のすべての修飾子に対して:
    1. そのリゾルバがデフォルト値を宣言していない場合は、入力でキーが提供されているか検証します。提供されていない場合はエラーを投げます。

6.2 順序付け

ツールはresolutionOrder 配列を順番に反復処理しなければなりません。

  1. 配列内の各項目について、それがsetかmodifierかを判定し、配列順に単一のトークン構造へフラット化します。

    1. 項目がセットの場合、配列順に sources を結合して単一のトークン構造を生成します。
    2. それ以外で項目が修飾子の場合は、入力に一致するcontextのみを選択し、配列を順に結合して単一のトークン構造を生成します。
    3. 競合が発生した場合は、配列中で最も最近の出現を採用します。
  2. resolutionOrder 配列の最後まで到達するまで繰り返します。

最終結果は、最初から単一のソースであったかのように動作するトークン構造になります。

6.3 エイリアス

エイリアスはこのステップまで解決してはなりません。

順序付けが単一のトークン構造にフラット化された後、残る唯一のステップはエイリアスの解決です。エイリアスは フォーマットで概説されているのと全く同じ方法で解決されます:

6.4 解決

7. バンドル

このセクションは規範的ではありません。

リゾルバードキュメントは、整理のためにトークンの使用を複数の JSON ファイルに分散させることを許可します。しかし、移植性の観点からは、単一の JSON ドキュメントのみを扱う方が有利な場合があります。

「バンドル」は、リゾルバードキュメントを単一ファイルにまで縮約するプロセスを指します。これを達成する戦略は複数あり、本ドキュメントで概説する以上のものがあります。しかし、説明のために、ここでは多数ある可能なアプローチのうち 2 つを概説します:

7.1 ファイルのインライン化

インライン化とは、リモートファイルへのすべての参照オブジェクトを取り出して、その内容に置き換えることです。これは最終目標を達成する単純な戦略ですが、同じファイルが複数回参照される場合には重複が発生します。ツールは重複したトークンに問題を抱えないかもしれませんが、このドキュメントを読む人間は、おそらく生成されるコード行数の多さに苦労するでしょう。

7.2 ファイルに $defs を使用する

$defs で説明されているように、$defs はリゾルバードキュメントにおいて定義済みの挙動を持ちません。JSON Schema のこの機能をサポートすることをツールが決定した場合にのみ使用できます。

この戦略は、トップレベルに $defs キーを作成し、各トップレベルキーにそのファイルの内容を含めることを伴います。

$defs を使用する唯一の欠点は、リゾルバードキュメントの最小要件ではないため、一部のツールがそれを無視することを選ぶ場合がある点です。

8. 適合性

非規範的とマークされたセクションに加えて、本仕様のすべての執筆ガイドライン、図表、例、および注記は非規範的です。それ以外の本仕様のすべては規範的です。

この文書におけるキーワード MAY、MUST、MUST NOT、SHOULD、SHOULD NOT は、 BCP 14 [RFC2119] [RFC8174] に記載されているとおり、ここに示すように全面大文字で現れる場合にのみ、解釈されます。

リゾルバ仕様を実装するツールは必ず次を行わなければなりません:

A. 謝辞

このセクションは規範的ではありません。

このリゾルバ仕様は、Hyma チーム(Mike Kamminga、Andrew L’Homme、Lilith などを含むがこれらに限定されない)の支えなしには実現しませんでした。 また、Joren Broekema、Louis Chenais による重要な貢献がありました。Design Tokens Community Group のメンバーによる 貢献とフィードバックに感謝いたします。

B. 参考文献

B.1 規範的参照文献

[html]
HTML Standard。Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters。WHATWG。Living Standard。URL: https://html.spec.whatwg.org/multipage/
[RFC1341]
MIME (Multipurpose Internet Mail Extensions): Mechanisms for Specifying and Describing the Format of Internet Message Bodies。 N. Borenstein; N. Freed。IETF。1992年6月。提案標準。URL: https://www.rfc-editor.org/rfc/rfc1341
[RFC2119]
RFCで要求レベルを示すためのキーワード。S. Bradner。IETF。1997年3月。Best Current Practice。URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC6838]
Media Type Specifications and Registration Procedures。N. Freed; J. Klensin; T. Hansen。IETF。2013年1月。Best Current Practice。URL: https://www.rfc-editor.org/rfc/rfc6838
[RFC6901]
JavaScript Object Notation (JSON) Pointer。P. Bryan, Ed.; K. Zyp; M. Nottingham, Ed.。IETF。2013年4月。提案標準。URL: https://www.rfc-editor.org/rfc/rfc6901
[RFC8174]
RFC 2119 キーワードにおける大文字と小文字の曖昧さ。B. Leiba。IETF。2017年5月。Best Current Practice。URL: https://www.rfc-editor.org/rfc/rfc8174
[RFC8259]
The JavaScript Object Notation (JSON) Data Interchange Format。T. Bray, Ed.。IETF。2017年12月。インターネット標準。URL: https://www.rfc-editor.org/rfc/rfc8259
[w3c-process]
W3C Process Document。Elika J. Etemad (fantasai); Florian Rivoal。W3C。2025年8月18日。URL: https://www.w3.org/policies/process/