# Adobe Spectrum デザインシステム

## Adobe Spectrum デザインシステム インターフェースプレビュー

3 つの独自アートワークバリエーションを検査し、エクスポートバッチを選択して、ローカル用の PNG または JPEG レシピを準備します。

## Adobe Spectrum デザインシステム デザインリファレンス

React Spectrum v3 の API とディメンションマッピング。数値のディメンション列は、Adobe の移行表におけるベース変換を記録しています。スケールに依存する size-* の値はタッチ向けに適応できます。これは Spectrum 2 のトークンエクスポートではありません。プレビューの色とカスタムアートワークはアプリケーション側の選択です。

### Provider とテーマの設定

| 名前 / ルール | 値 / 設定 | 用途 |
| --- | --- | --- |
| theme | defaultTheme | @adobe/react-spectrum からインポートする必須のルートテーマオブジェクト。 |
| colorScheme | light \| dark | オペレーティングシステムの設定を明示的に上書きします。 |
| scale | medium \| large | ファインポインターとコースポインターのスケール。通常は Provider に選択させます。 |
| locale | BCP 47 language tag | ロケールと書字方向のコンテキスト。 |
| breakpoints | custom name → pixel width | このガイドでは tablet: 640 と desktop: 1024 を明示的に設定し、リファレンスページ内の競合するデフォルトを回避しています。 |
| isDisabled / isReadOnly | boolean group defaults | ネストされた Provider と個々のプロップは、グループの動作を上書きできます。 |
### ベースディメンションのマッピング

| 名前 / ルール | 値 / 設定 | 用途 |
| --- | --- | --- |
| size-50 | 4px base | 小さな間隔。 |
| size-100 | 8px base | 関連するコントロール。 |
| size-150 | 12px base | ツールバーの間隔。 |
| size-200 | 16px base | インスペクターグループの間隔。 |
| size-250 | 20px base | 中間のスペーシング。 |
| size-300 | 24px base | パネルの内側の余白。 |
| size-400 | 32px base | より大きなグループ化。 |
| size-500 | 40px base | セクションの区切り。 |
| size-600 | 48px base | 大きな構造。 |
| size-1000 | 80px base | 固定サイズのイラスト領域。 |
| size-2400 | 192px base | インスペクターの幅の例。 |
| size-6000 | 480px base | 大きな境界付きの界面表面。 |
### スタイルプロップと適応値

| 名前 / ルール | 値 / 設定 | 用途 |
| --- | --- | --- |
| marginStart / marginEnd | DimensionValue | 論理的なスペーシング。書字方向をサポートするため、left/right よりも優先します。 |
| padding / backgroundColor | View style props | ネイティブコントロールの内部を上書きするのではなく、カスタムの外側の界面表面を構築します。 |
| width | size-* \| CSS length \| calc(...) | 例: calc(100% - size-2000)。 |
| responsive value | {base: value, tablet: value} | キーは明示的な Provider のブレークポイントに対応します。 |
| UNSAFE_style / UNSAFE_className | last-resort escape hatch | コンポーネントのプライベートな DOM やスタイルに依存しないでください。 |
| single-line-height | 32 base mapping | すべてのコントロールが常に 32px であると主張するのではなく、セマンティックなディメンションを使用してください。 |
### コレクション選択の契約

| 名前 / ルール | 値 / 設定 | 用途 |
| --- | --- | --- |
| selectionMode | none \| single \| multiple | サンプルではバッチに multiple を使用します。 |
| selectedKeys | Set of row keys \| all | 制御された状態では all センチネルを処理する必要があります。 |
| onSelectionChange | callback with selection | 選択を承認やエクスポートの成功と解釈しないでください。 |
| disallowEmptySelection | boolean | 必須の単一選択に有用です。任意のエクスポートバッチでは省略します。 |
| TableHeader → Column | column anatomy | 動的レンダリングのために、列に安定したキーを付与します。 |
| TableBody → Row → Cell | row anatomy | レコードの id が安定したコレクションの識別子を確立します。 |
### Picker とテキストの構成

| 名前 / ルール | 値 / 設定 | 用途 |
| --- | --- | --- |
| label | persistent text | エクスポート形式セレクターに名前を付けます。 |
| selectedKey | one item key | png や jpeg などの制御された形式。 |
| onSelectionChange | key callback | DOMイベントハンドラーとは異なる契約です。 |
| Item key | stable key | 表示ラベルとは独立した値の識別情報です。 |
| Heading level | 1–6 | 意味に基づく見出しレベルで、ネイティブのスタイルはコンテキストに応じて適用されます。 |
| Button onPress | press callback | マウス専用の独自操作ではなく、複数の入力方法に対応した操作です。 |
## Adobe Spectrum デザインシステム完全ガイド

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

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

## Adobe Spectrum デザインシステム v3を意図的に選び、Spectrumの世代を混在させない

### この例で導入するもの

> Adobeは現在、v3ライブラリと並行してSpectrum 2のドキュメントも公開しています。このページでは、Provider、コレクション、スタイルプロップの仕様により、アセットレビューの例をひととおり構成できる@adobe/react-spectrum@3を選びます。v3のレシピは既存のv3アプリケーションには役立ちますが、最新のSpectrum実装として説明すべきではありません。新たに採用する場合は、世代を選ぶ前に、リンク先の移行リファレンスを確認してください。

実際の違いはコードを見るとわかります。v3ではスタイルプロップにsize-300を渡し、ProviderにdefaultThemeを指定します。移行ガイドでは、こうした規約が別のスタイリングAPIに移行する方法を説明しています。パッケージ名だけを置き換えても、この例の移行にはなりません。コンポーネントのインポート、スタイリング、対応プロパティをあわせて見直す必要があります。

関連する仕様を確認する

## Adobe Spectrum デザインシステムのProviderで外観、スケール、ロケールを調整する

### 1つのルートで複数の独立した設定を管理

Providerは、テーブル、ピッカー、ボタンが利用する環境を設定します。テーマオブジェクトには、配色モードとスケールの定義が含まれます。colorSchemeでOSの設定を上書きでき、scaleでは入力デバイスの特性に対応できます。これらは別々の設定です。デスクトップの背景をダークにしても大きなタッチターゲットが必要になるとは限らず、明るいタッチスクリーンにマウス向けの高密度なレイアウトを誤って適用する必要もありません。

通常の本番環境では、scaleを自動設定のままにしてください。コンポーネントを検証する際にmediumやlargeを明示すると、各コントロールを比較しやすくなりますが、これは検証用の設定として説明するべきです。localeは言語コンテキストを設定するもので、プロジェクトのデータを翻訳するものではありません。キャンペーン名、レビューコメント、レシピのラベルは、引き続きアプリケーション側のコンテンツです。

関連する仕様を確認する

## Adobe Spectrum デザインシステム 対応するサイズ指定と外部レイアウト用プロップを使う

### 名前付きのスケールは、単なるピクセル値の略記ではない

基本のsize-100は8、size-200は16、size-300は24に対応します。リファレンステーブルには、ほかにも便利な段階が示されています。size-*の寸法はプラットフォームのスケールに合わせて変化しますが、static-size-*の値は意図的に変化しません。インスペクターや操作ターゲットのサイズを決める際は、この違いを保ってください。デスクトップで解決された値をすべてCSSにコピーすると、コンポーネント環境がもたらす適応性が失われます。

FlexとViewを使うと、TableViewの内部構造を変更せずに、例の外側に安定したレイアウトを作れます。テーブルはflexで拡張し、minWidth={0}で縮小できます。インスペクターは基本の画面幅では縦に並び、明示したタブレットのブレークポイントで幅が制限されます。パディングは、その背景を所有するViewに設定します。ドキュメントでは、安全でない回避策によって内部の色、境界線、タイポグラフィを上書きすることは推奨されていません。

関連する仕様を確認する

## Adobe Spectrum デザインシステム ネイティブの色とタイポグラフィはテーマに任せる

### サンプルの配色とトークンの値を区別する

プレビューには控えめなグレーのキャンバス、中立的なコントロール、オリジナルのカラフルなアートワークを使っています。イラストの色は、Spectrumのトークン値として認定されたものではありません。ネイティブの例では、対応するコンポーネントの外観はdefaultThemeから取得されます。独自のネイティブな背景には、サポート対象としてドキュメントに記載されたbackgroundColorの値を使ってください。サンプリングした単一の16進数値が、どちらの配色モードでも使えると思い込んではいけません。

Headingは、コンテキストに応じたSpectrumの見た目だけでなく、意味上の構造も提供します。ページタイトルにはlevel={1}を使い、選択数などの通常のコンテンツにはTextを使います。カスタムのHTMLプレビューでは、アプリケーションが選んだシステムフォントのフォールバックと文字サイズを使っています。これはワークフローと相対的な階層を示すものであり、周囲のOpenDesignのフォントやイラスト内のタイポグラフィがSpectrumのフォント仕様だと主張するものではありません。

関連する仕様を確認する

## Adobe Spectrum デザインシステムのコレクションテーブルでキー、列、選択の仕様を定義する

### 選択はデータの契約

テーブルはTableHeaderとColumnに加え、TableBody、Row、Cellで構成されます。各アセットには安定したidがあります。selectedKeysとonSelectionChangeで選択を制御するため、エクスポート用インスペクターの選択数も同じ状態から算出できます。アセット名を変更しても、その識別情報は変わりません。行の位置を識別情報にすると、並べ替えの後に選択が不安定になります。

選択値にはallというセンチネル値を指定できます。レシピを作成する前に、セットアップ処理でその値を現在のすべてのアセットに展開します。バッチ処理は任意なので、空のSetも有効です。disallowEmptySelectionは意図的に有効にしていません。リモートデータやページネーションを使うアプリケーションでは、現在表示されている行がコレクション全体だと決めつけず、データソースにおけるallの意味を定義してください。

- アセットの識別情報：コレクションで使う安定したキー。

- プレビュー：単独のサンプルで拡大表示するアートワーク。

- バッチ選択：作成するレシピに含めるキー。

関連する仕様を確認する

## Adobe Spectrum デザインシステムのピッカーとボタンでエクスポート用インスペクターを構成する

### 形式はバッチ選択と独立して管理する

Pickerには表示ラベルと安定したItemキーを使います。selectedKeyにはpngまたはjpegを指定し、onSelectionChangeから選択されたキーを受け取ります。これは、ネイティブのselectからevent.target.valueを読み取る方法とは異なります。バッチをクリアしても形式の選択は維持されるため、レビュー担当者はプリセットを作り直さずに選択内容を調整できます。

Buttonでは操作にonPressを使い、選択されたアセットがない場合はisDisabledを指定します。ネイティブの例では、IDと形式をシリアライズしてローカルのレシピを作成します。画像データの変換、実際のエクスポートファイルの生成、アセットサービスへの接続は行いません。これは、デザインシステムの範囲外に変換エンジンがあっても、操作とその入力が具体的に定義されていることを示す、わかりやすい実装境界です。

関連する仕様を確認する

## Adobe Spectrum デザインシステム アートワークを無理に縮小せず、構成を画面に合わせる

### ブレークポイントの仕様を定義する

この例では tablet:640 と desktop:1024 を宣言しています。この選択が明示的である理由は、Provider ページの現状で、説明文と生成された API メタデータの間でデフォルト値が食い違っているためです。レスポンシブ値は、まさにこれらのキーを参照します。インスペクターはベースでは全幅で、その後フレキシブルなテー���ルの横へ移動します。これらのブレークポイントはアプリケーションが所有するものであり、Spectrum の新しい普遍的な標準ではありません。

スタンドアロンのイラストは、サイドインスペクターとサムネイルレールを備えた大きなキャンバスを使用します。小さな画面では、インスペクターは通常のフローに移り、アートワークはアスペクト比を保ちます。寸法やフォーマットといったテキストはアートの外側にあるため、読みやすさが保たれ、検査対象のアートワークを変化させません。

関連する仕様を確認する

## Adobe Spectrum デザインシステム 検査・選択・準備はそれぞれ別の操作です

### デモを検証可能にする

アートワークのサムネイルをクリックすると、大きなイラストとその説明メタデータが切り替わります。チェックボックスはエクスポートバッチを変更します。これらを独立させておくことで、選択されていないアセットを、意図せずエクスポートすることなく検査できます。プレビューは選択件数を表示し、レビュー担当者がバッチを変更している間もフォーマットを保持します。

ネイティブの TableView は自身のコレクション操作を提供します。HTML の見本は通常のボタンとチェックボックスを使用しており、グリッドの完全なキーボードモデルを再現するものではありません。どちらも、実演する操作へのキーボード経路を備えています。レシピの結果はテキストであり、一時的な視覚効果だけではないため、レビュー担当者はどの id とフォーマットが準備されたのかを正確に検査できます。

関連する仕様を確認する

## Adobe Spectrum デザインシステム ツールを拡張する前にネイティブのスライスを統合する

### 明示的な境界で実際のエクスポートサービスを接続する

既存の React アプリに v3 スイートをインストールし、以下の完全なエントリを使用します。この例には、プロバイダー、インポート、コレクションデータ、選択状態、フォーマット状態、結果状態が含まれます。実運用の統合では、レシピの準備をエクスポートリクエストに置き換え、アセットごとに確定した結果を表示します。そのサービスが存在するようになるまで、ローカルの応答を「エクスポート完了」に改名しないでください。

Spectrum 2 へ移行する際は、寸法、ブレークポイント、コンポーネントの変更について Adobe のマッピングを使用してください。選択の挙動とフォーマットの保持を改めて確認してください。見た目が似ていても、異なるコントラクトを公開しているテーブルはあります。ソースの世代を明示しておけば、将来のコントリビューターが v3 の Provider と互換性のない例を組み合わせてしまうことを防げます。

1. 1 つのアセットを選択し、その id がローカルレシピに現れることを確認します。

2. すべて選択し、PNG を JPEG に変更して、選択されたセット全体を検査します。

3. 選択を解除し、フォーマットが選択されたままの状態でアクションが無効になることを確認します。

4. ビューポートを狭め、検査・選択・レシピ出力に引き続き到達できることを確認します。

関連する仕様を確認する

## Adobe Spectrum デザインシステム コンポーネントの例

### 完全なスタンドアロンのインタラクティブ見本

完全なドキュメントを index.html として保存し、ブラウザで開きます。文書化された v3 のコレクションとインスペクターのワークフローに対する独自の HTML/CSS 解釈です。パレットとアートワークは例示用であり、ネイティブの Spectrum ランタイムや画像変換はありません。

```
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Spectrum asset inspector study</title><style>*{box-sizing:border-box}body{margin:0;font:14px/1.5 -apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;color:#2c2c2c;background:#f5f5f5}button,input,select{font:inherit}button{cursor:pointer;border:1px solid #999;border-radius:16px;background:white;color:inherit;padding:5px 16px;font-weight:600}button:focus-visible,input:focus-visible,select:focus-visible{outline:3px solid #1473e6;outline-offset:3px}button:disabled{opacity:.45;cursor:not-allowed}header{padding:16px 24px;background:white;border-bottom:1px solid #ddd;display:flex;justify-content:space-between;gap:16px;align-items:center}header b{font-size:16px}header span{font-size:12px;color:#666}.workspace{display:grid;grid-template-columns:160px minmax(0,1fr) 230px;min-height:540px}.rail{padding:20px 16px;border-right:1px solid #ddd}.rail h2,.inspector h2{font-size:14px;margin:0 0 16px}.thumb{margin-bottom:20px}.thumb button{width:100%;border-radius:4px;padding:6px;background:transparent;border:2px solid transparent}.thumb button[aria-pressed=true]{border-color:#1473e6;background:#e7f1ff}.thumb label{display:flex;align-items:center;gap:6px;font-size:12px;margin-top:6px}.thumb input{accent-color:#1473e6}.mini{height:70px;display:grid;place-items:center;font-size:26px;font-weight:800;letter-spacing:-2px;background:linear-gradient(125deg,#fcab64,#ee6e63);color:#472c52;border-radius:2px}.thumb:nth-of-type(2) .mini{background:linear-gradient(125deg,#c4bdff,#8b7ddd)}.thumb:nth-of-type(3) .mini{background:linear-gradient(125deg,#9ed5c8,#449c8c)}.canvas-wrap{padding:24px;display:flex;flex-direction:column;align-items:center;justify-content:center;min-width:0}.canvas-meta{align-self:stretch;display:flex;justify-content:space-between;margin-bottom:20px;font-size:12px;color:#666;gap:12px}.art{width:min(100%,540px);aspect-ratio:4/3;background:linear-gradient(130deg,#ffbd7c,#ed8178);color:#412754;position:relative;overflow:hidden;display:flex;align-items:center;justify-content:center;text-align:center;isolation:isolate}.art:before{content:'';position:absolute;z-index:-1;width:70%;aspect-ratio:1;border:45px solid rgba(255,240,197,.65);border-radius:50%;left:-24%;bottom:-25%}.art:after{content:'';position:absolute;z-index:-1;width:60%;aspect-ratio:1;background:rgba(217,69,117,.32);border-radius:50%;right:-25%;top:-25%}.art small{letter-spacing:3px;font-size:11px;font-weight:700}.art h1{font-size:clamp(28px,5vw,64px);line-height:.96;margin:16px 0 18px;letter-spacing:-3px;font-weight:800}.art p{font-size:12px;margin:0}.art[data-art=square]{aspect-ratio:1;background:linear-gradient(130deg,#d8d0ff,#9588dd)}.art[data-art=story]{aspect-ratio:9/16;max-height:470px;width:auto;min-width:210px;background:linear-gradient(130deg,#caeee2,#69b7a5)}.art[data-art=story] h1{font-size:40px;letter-spacing:-2px}.canvas-note{font-size:12px;color:#666;margin-top:16px}.inspector{background:white;padding:24px 20px;border-left:1px solid #ddd}.inspector dl{margin:0 0 24px}.inspector dt{font-size:12px;color:#666;margin-top:16px}.inspector dd{margin:4px 0 0;overflow-wrap:anywhere}.inspector hr{border:0;border-top:1px solid #ddd;margin:24px 0}.inspector label{display:block;font-size:12px;font-weight:600;margin-bottom:6px}.inspector select{width:100%;border:1px solid #999;border-radius:4px;padding:8px;background:white}.selected-count{font-size:12px;margin:16px 0}.primary{background:#1473e6;border-color:#1473e6;color:white;width:100%}.primary:hover{background:#0d66d0}.result{margin:0 24px 20px;padding:16px;background:white;border:1px solid #ddd;border-radius:4px}.result[hidden]{display:none}.result h2{font-size:16px;margin:0 0 8px}.result pre{white-space:pre-wrap;font:12px/1.5 ui-monospace,monospace}.result p{font-size:12px;margin:0}footer{padding:12px 24px;color:#666;font-size:12px;border-top:1px solid #ddd;background:white}@media(max-width:760px){.workspace{grid-template-columns:110px minmax(0,1fr)}.rail{padding:16px 8px}.inspector{grid-column:1/-1;border-left:0;border-top:1px solid #ddd;display:grid;grid-template-columns:1fr 1fr;gap:12px 24px}.inspector h2{grid-column:1/-1;margin:0}.inspector dl{margin:0}.inspector hr{display:none}.canvas-wrap{padding:16px}.art h1{letter-spacing:-1px}.art p{padding:0 12px}.canvas-meta{display:block}.art:before{border-width:24px}header span{display:none}.inspector dt:first-child{margin-top:0}}@media(max-width:440px){.workspace{grid-template-columns:1fr}.rail{border-right:0;border-bottom:1px solid #ddd;display:flex;gap:8px}.rail h2{display:none}.thumb{flex:1;min-width:0;margin:0}.mini{height:44px;font-size:20px}.thumb label{font-size:11px}.art[data-art=story]{max-height:390px}.canvas-meta{display:flex}.inspector{grid-template-columns:1fr 1fr;padding:20px 16px}header{padding:16px}.result{margin:0 16px 16px}}
</style></head><body><header><b>Campaign library <span>/ Autumn collection</span></b><button id="select-all">Select all</button></header><main><div class="workspace"><nav class="rail" aria-label="Artwork variants"><h2>Assets</h2><div class="thumb"><button data-id="hero" aria-label="Inspect campaign master" aria-pressed="true"><div class="mini" aria-hidden="true">Made.</div></button><label><input type="checkbox" value="hero" checked>Master</label></div><div class="thumb"><button data-id="square" aria-label="Inspect social square" aria-pressed="false"><div class="mini" aria-hidden="true">Made.</div></button><label><input type="checkbox" value="square">Square</label></div><div class="thumb"><button data-id="story" aria-label="Inspect vertical story" aria-pressed="false"><div class="mini" aria-hidden="true">Made.</div></button><label><input type="checkbox" value="story">Story</label></div></nav><section class="canvas-wrap" aria-label="Selected artwork"><div class="canvas-meta"><span id="art-name">Campaign master</span><span id="dimensions">1600 × 1200</span></div><div class="art" id="art" data-art="hero" role="img" aria-label="Original orange campaign artwork with the words Made for what comes next"><div><small>AUTUMN COLLECTION</small><h1>Made for<br>what comes<br>next.</h1><p>Small ideas. A different perspective.</p></div></div><p class="canvas-note">Original artwork · illustrative preview</p></section><aside class="inspector"><h2>Export inspector</h2><dl><dt>Selected artwork</dt><dd id="detail-name">Campaign master</dd><dt>Source dimensions</dt><dd id="detail-dimensions">1600 × 1200 px</dd><dt>Review</dt><dd>Draft artwork</dd></dl><hr><div><label for="format">Export format</label><select id="format"><option value="png">PNG</option><option value="jpeg">JPEG</option></select><p class="selected-count" id="selected-count">1 asset selected</p><button class="primary" id="prepare">Prepare recipe</button><p style="font-size:12px;color:#666">Creates a local recipe only. No files are converted.</p></div></aside></div><section class="result" id="result" hidden><h2>Local export recipe</h2><pre id="recipe"></pre><p role="status" id="status"></p></section></main><footer>React Spectrum v3 collection study · HTML/CSS interpretation with illustrative colors. Inspecting an artwork and selecting it for export are independent.</footer><script>
const assets={hero:{name:'Campaign master',dimensions:'1600 × 1200',color:'orange'},square:{name:'Social square',dimensions:'1080 × 1080',color:'purple'},story:{name:'Vertical story',dimensions:'1080 × 1920',color:'green'}};const boxes=[...document.querySelectorAll('.thumb input')],$=id=>document.getElementById(id);document.querySelectorAll('[data-id]').forEach(button=>button.onclick=()=>{document.querySelectorAll('[data-id]').forEach(b=>b.setAttribute('aria-pressed',String(b===button)));const id=button.dataset.id,a=assets[id];$('art').dataset.art=id;$('art').setAttribute('aria-label','Original '+a.color+' campaign artwork with the words Made for what comes next');$('art-name').textContent=$('detail-name').textContent=a.name;$('dimensions').textContent=a.dimensions;$('detail-dimensions').textContent=a.dimensions+' px';});function update(){let n=boxes.filter(b=>b.checked).length;$('selected-count').textContent=n+' asset'+(n===1?'':'s')+' selected';$('prepare').disabled=n===0;$('select-all').textContent=n===boxes.length?'Clear selection':'Select all';$('result').hidden=true;}boxes.forEach(b=>b.onchange=update);$('format').onchange=()=>{$('result').hidden=true;};$('select-all').onclick=()=>{const all=boxes.every(b=>b.checked);boxes.forEach(b=>b.checked=!all);update();};$('prepare').onclick=()=>{const ids=boxes.filter(b=>b.checked).map(b=>b.value);$('recipe').textContent=JSON.stringify({format:$('format').value,assets:ids},null,2);$('status').textContent='Recipe prepared for '+ids.length+' assets. No image files were converted.';$('result').hidden=false;};
</script></body></html>
```

コードリファレンス

- アートワークは独自のサンプルコンテンツです。レシピの準備で生成されるのは選択メタデータであり、変換された画像ファイルではありません。このドキュメントは Spectrum v3 も Spectrum 2 も読み込みません。

### 完全なネイティブ実装のエントリ

セットアップの完全な実装を、焦点を絞った API の解説とあわせてここにまとめています。セットアップに記載されたパッケージとビルドの前提条件に従ってください。

```
// Terminal: npm install @adobe/react-spectrum@3
// Existing React app with <div id="root"></div>; entry: src/main.jsx
import * as React from 'react';
import {createRoot} from 'react-dom/client';
import {Provider, defaultTheme, Flex, View, Heading, Text, Button,
  TableView, TableHeader, Column, TableBody, Row, Cell, Picker, Item}
  from '@adobe/react-spectrum';
const assets = [
  {id: 'hero', name: 'Campaign master', dimensions: '1600 × 1200'},
  {id: 'square', name: 'Social square', dimensions: '1080 × 1080'},
  {id: 'story', name: 'Vertical story', dimensions: '1080 × 1920'}
];
function AssetReview() {
  const [keys, setKeys] = React.useState(new Set(['hero']));
  const [format, setFormat] = React.useState('png');
  const [recipe, setRecipe] = React.useState('');
  const selected = keys === 'all' ? assets : assets.filter(a => keys.has(a.id));
  return <Provider theme={defaultTheme} breakpoints={{tablet: 640, desktop: 1024}}>
    <View padding="size-300">
      <Heading level={1}>Campaign exports</Heading>
      <Flex direction={{base: 'column', tablet: 'row'}} gap="size-300">
        <TableView aria-label="Campaign assets" selectionMode="multiple"
          selectedKeys={keys} onSelectionChange={setKeys} flex minWidth={0}>
          <TableHeader><Column key="name">Asset</Column><Column key="dimensions">Dimensions</Column></TableHeader>
          <TableBody items={assets}>{asset => <Row key={asset.id}>
            <Cell>{asset.name}</Cell><Cell>{asset.dimensions}</Cell>
          </Row>}</TableBody>
        </TableView>
        <Flex direction="column" gap="size-200" width={{base:'100%',tablet:'size-2400'}}>
          <Picker label="Export format" selectedKey={format} onSelectionChange={setFormat}>
            <Item key="png">PNG</Item><Item key="jpeg">JPEG</Item>
          </Picker>
          <Text>{selected.length} assets selected</Text>
          <Button variant="accent" isDisabled={!selected.length} onPress={() =>
            setRecipe(JSON.stringify({format, assets:selected.map(a=>a.id)}, null, 2))}>
            Prepare recipe
          </Button>
        </Flex>
      </Flex>
      <p role="status">{recipe ? 'Local recipe prepared. No image files were converted.' : ''}</p>
      {recipe && <pre style={{whiteSpace:'pre-wrap'}}>{recipe}</pre>}
    </View>
  </Provider>;
}
createRoot(document.getElementById('root')).render(<AssetReview />);
```

コードリファレンス

- 既存の React アプリ向けの、完全な v3 コレクションおよびインスペクターの例です。ローカル状態にエクスポートレシピを作成するものであり、画像ファイルではありません。解決済みのパッケージバージョンはロックファイルに保持し、このエントリを Spectrum 2 のインポートと混在させないでください。

### 選択は Set だけでなく all になることもあります

バッチを計算したりアクションを有効にしたりする前に、コレクションのコントラクトを正規化します。このフラグメントは、完全なセットアップのアセットとキーを使用します。

```
const selected = keys === 'all'
  ? assets
  : assets.filter(asset => keys.has(asset.id));
<Button variant="accent" isDisabled={selected.length === 0}
  onPress={() => setRecipe(JSON.stringify({format, assets: selected.map(a => a.id)}))}>
  Prepare recipe
</Button>
```

コードリファレンス

- 安定した id は並べ替えや名前変更にも耐えます。

- 空のバッチが無効にするのはレシピのアクションだけで、現在のフォーマットは消去しません。

### 明示的なブレークポイント名を使ったレスポンシブなインスペクター

Provider とレスポンシブプロップで同じキーを使用します。これらの数値は意図的に設定されたアプリケーション構成です。

```
<Provider theme={defaultTheme} breakpoints={{tablet:640, desktop:1024}}>
  <Flex direction={{base:"column", tablet:"row"}} gap="size-300">
    <View flex minWidth={0}>Asset table</View>
    <View width={{base:"100%",tablet:"size-2400"}}>Export inspector</View>
  </Flex>
</Provider>
```

コードリファレンス

- Provider リファレンスの説明文と生成されたデフォルト値の表では、デフォルトのブレークポイントについて見解が一致していません。明示的なマップを用意すれば曖昧さがなくなります。

- 論理的な marginStart と marginEnd は、物理的な left と right のマージンよりもよく適応します。

## Adobe Spectrum デザインシステム AI エージェントのセットアップ

### 実装の出発点

既存の React アプリ向けの、完全な v3 コレクションおよびインスペクターの例です。ローカル状態にエクスポートレシピを作成するものであり、画像ファイルではありません。解決済みのパッケージバージョンはロックファイルに保持し、このエントリを Spectrum 2 のインポートと混在させないでください。

```
// Terminal: npm install @adobe/react-spectrum@3
// Existing React app with <div id="root"></div>; entry: src/main.jsx
import * as React from 'react';
import {createRoot} from 'react-dom/client';
import {Provider, defaultTheme, Flex, View, Heading, Text, Button,
  TableView, TableHeader, Column, TableBody, Row, Cell, Picker, Item}
  from '@adobe/react-spectrum';
const assets = [
  {id: 'hero', name: 'Campaign master', dimensions: '1600 × 1200'},
  {id: 'square', name: 'Social square', dimensions: '1080 × 1080'},
  {id: 'story', name: 'Vertical story', dimensions: '1080 × 1920'}
];
function AssetReview() {
  const [keys, setKeys] = React.useState(new Set(['hero']));
  const [format, setFormat] = React.useState('png');
  const [recipe, setRecipe] = React.useState('');
  const selected = keys === 'all' ? assets : assets.filter(a => keys.has(a.id));
  return <Provider theme={defaultTheme} breakpoints={{tablet: 640, desktop: 1024}}>
    <View padding="size-300">
      <Heading level={1}>Campaign exports</Heading>
      <Flex direction={{base: 'column', tablet: 'row'}} gap="size-300">
        <TableView aria-label="Campaign assets" selectionMode="multiple"
          selectedKeys={keys} onSelectionChange={setKeys} flex minWidth={0}>
          <TableHeader><Column key="name">Asset</Column><Column key="dimensions">Dimensions</Column></TableHeader>
          <TableBody items={assets}>{asset => <Row key={asset.id}>
            <Cell>{asset.name}</Cell><Cell>{asset.dimensions}</Cell>
          </Row>}</TableBody>
        </TableView>
        <Flex direction="column" gap="size-200" width={{base:'100%',tablet:'size-2400'}}>
          <Picker label="Export format" selectedKey={format} onSelectionChange={setFormat}>
            <Item key="png">PNG</Item><Item key="jpeg">JPEG</Item>
          </Picker>
          <Text>{selected.length} assets selected</Text>
          <Button variant="accent" isDisabled={!selected.length} onPress={() =>
            setRecipe(JSON.stringify({format, assets:selected.map(a=>a.id)}, null, 2))}>
            Prepare recipe
          </Button>
        </Flex>
      </Flex>
      <p role="status">{recipe ? 'Local recipe prepared. No image files were converted.' : ''}</p>
      {recipe && <pre style={{whiteSpace:'pre-wrap'}}>{recipe}</pre>}
    </View>
  </Provider>;
}
createRoot(document.getElementById('root')).render(<AssetReview />);
```

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

```
@adobe/react-spectrum v3 を Provider と defaultTheme とともに使用してください。提供されたキー付き TableView とエクスポートインスペクターを、Picker、Item、Flex、View、Button を使って構築してください。選択は Set または all として扱い、選択が変わってもフォーマットを保持し、実際の変換サービスが接続されるまでは結果をローカルレシピと呼んでください。明示的な tablet/desktop のブレークポイントキーと、サポートされているスタイルプロップを使用してください。v3 と Spectrum 2 の API は分けておいてください。
```

## Adobe Spectrum デザインシステム 出典と対象範囲

@adobe/react-spectrum を使用した、維持されている React Spectrum v3 ドキュメントの OpenDesign 実装研究です。Spectrum 2 も利用可能で、API が異なります。このページは v3 を最新の実装として位置づけているわけではありません。スタンドアロンのアセットボードプレビューは、例示用のアートワークとアプリケーションが選択した色による独自の HTML/CSS 解釈であり、ネイティブの Spectrum コンポーネントやカラーマネジメントされた画像エディターではありません。

- Provider ここで扱う実装と制約に関する公式の React Spectrum リファレンスです。

- スタイリング ここで扱う実装と制約に関する公式の React Spectrum リファレンスです。

- テーマ設定 ここで扱う実装と制約に関する公式の React Spectrum リファレンスです。

- TableView ここで扱う実装と制約に関する公式の React Spectrum リファレンスです。

- Picker ここで扱う実装と制約に関する公式の React Spectrum リファレンスです。

- Heading ここで扱う実装と制約に関する公式の React Spectrum リファレンスです。

- Button ここで扱う実装と制約に関する公式の React Spectrum リファレンスです。

- 移行 ここで扱う実装と制約に関する公式の React Spectrum リファレンスです。

## Adobe Spectrum デザインシステム 関連リソース

### Alaska Airlines Auro

実際のセマンティックカラーとタイプトークン、クラスベースのタイポグラフィ、ネイティブのフライトコンポーネントを通して、Auro の Alaska テーマを探ります。2 件の独自のフライト記録が、航空会社の在庫や予約を表すものではなく、ローカルでの絞り込みと選択を示します。

### Arco Design

Arco の制御された Transfer コンポーネントで、レポートセクションのセレクターを構築します。実際のスペーシングとサイズのスケール、CSS 変数の規約、セマンティックな界面表面、そして行を選択することと移動することの違いを探ります。

### Atlassian デザインシステム

セマンティックな Atlassian トークン、8 ピクセルのスペーシングスケール、実際の Button、Lozenge、Toggle の API、そして必須の Compiled スタイリングのセットアップを使って、課題計画ボードを構築します。課題を検査し、ボードを絞り込み、選択とステータスを混同することなくローカルの作業項目を移動します。


- [実装リファレンス](https://react-spectrum.adobe.com/v3/TableView.html)
- [ソース](https://react-spectrum.adobe.com/v3/Provider.html)
- [ソース](https://react-spectrum.adobe.com/migrating)
- [ソース](https://react-spectrum.adobe.com/v3/styling.html)
- [ソース](https://react-spectrum.adobe.com/v3/TableView.html)
- [ソース](https://react-spectrum.adobe.com/v3/Picker.html)
- [関連する仕様を確認する](https://react-spectrum.adobe.com/migrating)
- [関連する仕様を確認する](https://react-spectrum.adobe.com/v3/theming.html)
- [関連する仕様を確認する](https://react-spectrum.adobe.com/v3/styling.html)
- [関連する仕様を確認する](https://react-spectrum.adobe.com/v3/Heading.html)
- [関連する仕様を確認する](https://react-spectrum.adobe.com/v3/TableView.html)
- [関連する仕様を確認する](https://react-spectrum.adobe.com/v3/Picker.html)
- [関連する仕様を確認する](https://react-spectrum.adobe.com/v3/Provider.html)
- [コードリファレンス](https://react-spectrum.adobe.com/v3/TableView.html)
- [コードリファレンス](https://react-spectrum.adobe.com/v3/Provider.html)
- [Provider ここで扱う実装と制約に関する公式の React Spectrum リファレンスです。](https://react-spectrum.adobe.com/v3/Provider.html)
- [スタイリング ここで扱う実装と制約に関する公式の React Spectrum リファレンスです。](https://react-spectrum.adobe.com/v3/styling.html)
- [テーマ設定 ここで扱う実装と制約に関する公式の React Spectrum リファレンスです。](https://react-spectrum.adobe.com/v3/theming.html)
- [TableView ここで扱う実装と制約に関する公式の React Spectrum リファレンスです。](https://react-spectrum.adobe.com/v3/TableView.html)
- [Picker ここで扱う実装と制約に関する公式の React Spectrum リファレンスです。](https://react-spectrum.adobe.com/v3/Picker.html)
- [Heading ここで扱う実装と制約に関する公式の React Spectrum リファレンスです。](https://react-spectrum.adobe.com/v3/Heading.html)
- [Button ここで扱う実装と制約に関する公式の React Spectrum リファレンスです。](https://react-spectrum.adobe.com/v3/Button.html)
- [移行 ここで扱う実装と制約に関する公式の React Spectrum リファレンスです。](https://react-spectrum.adobe.com/migrating)
