マーケティングソフトウェア · 新しいリソース

Sprout Social Seedsデザインシステム.

編集レビューキューで、Seeds の実際の公開カラー、間隔、製品用タイポグラフィ、ボーダートークンを確認できます。複数選択、フィルター適用後の空状態、取り消しにも対応しています。

OpenDesign ガイド6章リファレンス項目 38 件オリジナルアプリケーションガイド
01

Sprout Social Seedsデザインシステムのインターフェースプレビュー

表示中の投稿を選択し、混合選択の状態を確認して、フィルター適用後の一括変更から復元または取り消しを行います。

レビュー用の編集キューを準備する完全な例を開く
ネイティブなSeedsトークンCSSと、オリジナルのHTML/JavaScriptキュー動作をすべて実装。・ 実装リファレンス
02

Sprout Social Seedsデザインシステムのデザインリファレンス

実際にインストールされるSeedsのカラー 2.5.0、スペース 0.8.1、タイポグラフィ 3.8.0、ボーダー 1.7.1のCSSエクスポート。

製品例の配色リファレンス

ソース
名前 / ルール値 / 設定用途
--color-neutral-0#ffffff 公開されている実際の配色トークン。オリジナルのキューにおけるアクションやステータスとの対応付けは、アプリケーション固有です。
--color-neutral-100#f3f4f4 公開されている実際の配色トークン。オリジナルのキューにおけるアクションやステータスとの対応付けは、アプリケーション固有です。
--color-neutral-200#dee1e1 公開されている実際の配色トークン。オリジナルのキューにおけるアクションやステータスとの対応付けは、アプリケーション固有です。
--color-neutral-700#515e5f 公開されている実際の配色トークン。オリジナルのキューにおけるアクションやステータスとの対応付けは、アプリケーション固有です。
--color-neutral-900#273333 公開されている実際の配色トークン。オリジナルのキューにおけるアクションやステータスとの対応付けは、アプリケーション固有です。
--color-blue-0#e9f4ff 公開されている実際の配色トークン。オリジナルのキューにおけるアクションやステータスとの対応付けは、アプリケーション固有です。
--color-blue-300#a1c2f8 公開されている実際の配色トークン。オリジナルのキューにおけるアクションやステータスとの対応付けは、アプリケーション固有です。
--color-blue-700#205bc3 公開されている実際の配色トークン。オリジナルのキューにおけるアクションやステータスとの対応付けは、アプリケーション固有です。
--color-green-100#d7f4d7 公開されている実際の配色トークン。オリジナルのキューにおけるアクションやステータスとの対応付けは、アプリケーション固有です。
--color-green-900#006b40 公開されている実際の配色トークン。オリジナルのキューにおけるアクションやステータスとの対応付けは、アプリケーション固有です。

完全な固定スペーシングスケール

ソース
名前 / ルール値 / 設定用途
--space-size--00px実際のCSSピクセルトークンです。パッケージには18pxを基準にしたrem相当値も含まれます。16px基準の換算値と決めつけないでください。
--space-size--1002px実際のCSSピクセルトークンです。パッケージには18pxを基準にしたrem相当値も含まれます。16px基準の換算値と決めつけないでください。
--space-size--2004px実際のCSSピクセルトークンです。パッケージには18pxを基準にしたrem相当値も含まれます。16px基準の換算値と決めつけないでください。
--space-size--3008px実際のCSSピクセルトークンです。パッケージには18pxを基準にしたrem相当値も含まれます。16px基準の換算値と決めつけないでください。
--space-size--35012px実際のCSSピクセルトークンです。パッケージには18pxを基準にしたrem相当値も含まれます。16px基準の換算値と決めつけないでください。
--space-size--40016px実際のCSSピクセルトークンです。パッケージには18pxを基準にしたrem相当値も含まれます。16px基準の換算値と決めつけないでください。
--space-size--45024px実際のCSSピクセルトークンです。パッケージには18pxを基準にしたrem相当値も含まれます。16px基準の換算値と決めつけないでください。
--space-size--50032px実際のCSSピクセルトークンです。パッケージには18pxを基準にしたrem相当値も含まれます。16px基準の換算値と決めつけないでください。
--space-size--60040px実際のCSSピクセルトークンです。パッケージには18pxを基準にしたrem相当値も含まれます。16px基準の換算値と決めつけないでください。

製品向けの書体と読みやすい表示密度

ソース
名前 / ルール値 / 設定用途
--typography-familysystem-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif公開されているタイポグラフィパッケージの値です。製品の例ではシステムフォントファミリーを使用し、マーケティング用のProxima Nova書体は使用していません。
--typography-font-size--10011px公開されているタイポグラフィパッケージの値です。製品の例ではシステムフォントファミリーを使用し、マーケティング用のProxima Nova書体は使用していません。
--typography-font-size--20013px公開されているタイポグラフィパッケージの値です。製品の例ではシステムフォントファミリーを使用し、マーケティング用のProxima Nova書体は使用していません。
--typography-font-size--30016px公開されているタイポグラフィパッケージの値です。製品の例ではシステムフォントファミリーを使用し、マーケティング用のProxima Nova書体は使用していません。
--typography-font-size--40018px公開されているタイポグラフィパッケージの値です。製品の例ではシステムフォントファミリーを使用し、マーケティング用のProxima Nova書体は使用していません。
--typography-font-size--50021px公開されているタイポグラフィパッケージの値です。製品の例ではシステムフォントファミリーを使用し、マーケティング用のProxima Nova書体は使用していません。
--typography-font-size--60024px公開されているタイポグラフィパッケージの値です。製品の例ではシステムフォントファミリーを使用し、マーケティング用のProxima Nova書体は使用していません。
--typography-font-size--70032px公開されているタイポグラフィパッケージの値です。製品の例ではシステムフォントファミリーを使用し、マーケティング用のProxima Nova書体は使用していません。
--typography-line-height--30024px公開されているタイポグラフィパッケージの値です。製品の例ではシステムフォントファミリーを使用し、マーケティング用のProxima Nova書体は使用していません。
--typography-line-height--50029.333333333333332px公開されているタイポグラフィパッケージの値です。製品の例ではシステムフォントファミリーを使用し、マーケティング用のProxima Nova書体は使用していません。

形状とボーダーのスケール

ソース
名前 / ルール値 / 設定用途
--border-radius-4004px実際のボーダーパッケージの値です。オリジナルのカードでは、角丸8pxと1pxのボーダーを使用しています。
--border-radius-5006px実際のボーダーパッケージの値です。オリジナルのカードでは、角丸8pxと1pxのボーダーを使用しています。
--border-radius-6008px実際のボーダーパッケージの値です。オリジナルのカードでは、角丸8pxと1pxのボーダーを使用しています。
--border-radius-80012px実際のボーダーパッケージの値です。オリジナルのカードでは、角丸8pxと1pxのボーダーを使用しています。
--border-radius-90024px実際のボーダーパッケージの値です。オリジナルのカードでは、角丸8pxと1pxのボーダーを使用しています。
--border-radius-1000999999px実際のボーダーパッケージの値です。オリジナルのカードでは、角丸8pxと1pxのボーダーを使用しています。
--border-width-5001px実際のボーダーパッケージの値です。オリジナルのカードでは、角丸8pxと1pxのボーダーを使用しています。
--border-width-6002px実際のボーダーパッケージの値です。オリジナルのカードでは、角丸8pxと1pxのボーダーを使用しています。
--border-width-7003px実際のボーダーパッケージの値です。オリジナルのカードでは、角丸8pxと1pxのボーダーを使用しています。
03

Sprout Social Seedsデザインシステム完全ガイド

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

DESIGN-sprout-seeds.md

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

ガイドをダウンロード

Sprout Social Seedsデザインシステムのプロダクトトークンとランタイムの適用範囲

プロダクトの基盤を活用する

Seedsでは、プロダクト向けのタイポグラフィとブランド向けのタイポグラフィが区別されています。このキューでは、公開タイポグラフィパッケージに含まれる実際のシステムフォントファミリーのトークンと、公開されているカラー、スペース、ボーダーのトークンを使用します。マーケティング用書体を読み込んで、プロダクトシステムを再現したと称することはありません。参照値と例の比較ができるよう、セットアップではパッケージのバージョンを固定しています。

この OpenDesign ガイドから

トークンとコンポーネントを分ける

Seedsのトークンパッケージを読み込むと変数が使えるようになりますが、投稿エディターやReactコンポーネントツリーが作られるわけではありません。この例にあるカード、選択ロジック、ローカルのレビュー操作は、すべてオリジナルのOpenDesignコードです。このページでは、意図的に「トークンベースの実装」と呼んでいます。SeedsのネイティブなReactコンポーネントには、公式のコンポーネントリソースに記載された独自の連携要件があります。

Sprout Social Seedsデザインシステムの配色・スペーシング・タイポグラフィの参照値

正確なトークン名を使う

このリファレンスには、12pxを表す--space-size--350や、8pxを表す--border-radius-600など、実際にエクスポートされる名前が含まれています。これらの名前は、スケールのラベルに倍率を掛けても特定できません。CSSはトークンファイルを直接インポートして変数を使用するため、推測した配色ではなく、固定された配布パッケージまでたどって表示値を確認できます。

remの基準値に注意する

spaceパッケージにはpxとremの両方の形式があります。たとえば、16pxのステップは0.8888888888888888remでも表され、18pxのベースラインを反映しています。このスタディでは、意図した間隔を明確に保つため、px形式のトークンを使用します。rem値を16pxのルートにそのまま置き換えると、密度が保たれるのではなく変化してしまいます。

Sprout Social Seeds デザインシステム:エディトリアルカードとレビューの文脈

操作する前から役立つカードにする

各カードには、チャンネル、ステータス、元のタイトル、短い投稿本文がすべて表示されます。補足情報を開くと、レビュー基準を確認できます。コンテンツは架空の練習用で、ワークスペースはソーシャルアカウントに接続されていません。そのため、実際の投稿や分析データにアクセスしているかのように見せることなく、カードで現実味のあるタスクを提示できます。

ブランドのアクセントカラーは読みやすさを損なわない範囲で使う

青は元のキューのレビュー操作を示し、緑は「レビュー準備完了」のテキストに添えています。これらの役割は、実際のパレット項目を使ったアプリケーション独自の判断です。ステータスは常に文字でも表示するため、色が見えなくても意味が伝わります。3件の投稿は境界線と間隔で区切り、読みやすいコンテンツを装飾用のプレースホルダーに置き換えることはありません。

Sprout Social Seeds デザインシステム:選択状態と複数選択状態の表示

一括選択は現在のビュー内に限定する

「表示中の投稿を選択」は、フィルター後の項目に適用されます。表示中の複数のカードから1件だけ選択すると、一括選択チェックボックスはネイティブの中間状態になります。フィルターを変更すると選択が解除されるため、非表示のレコードが後の操作で変更されることはありません。表示件数には、表示中と選択中の数がそれぞれ示されます。

  • 一括選択は表示中のレコードにのみ適用されます。
  • 複数選択状態にはネイティブのindeterminateプロパティを使用します。
  • フィルターを変更すると選択が解除されます。
  • 選択中の下書きレコードに応じて操作状態が決まります。

意味のある操作だけを有効にする

Sprout Social Seeds デザインシステム:フィルター結果が空の場合の表示と元に戻す操作

空になったキューから復帰できるようにする

「下書き」を表示中に、表示されているすべての下書きをレビュー準備完了にすると、該当する結果がなくなります。空の状態では、レコード自体は残っていることを説明し、「すべての投稿を表示」への導線を用意します。ローカルで結果が分かっている場合に、読み込みスピナーを表示したり、ネットワークエラーを作り出したりすることはありません。一致する項目がない状態と、レコードが存在しない状態は、引き続き区別して表示されます。

実際に行った変更だけを元に戻す

アプリケーションは、直近のレビュー操作で変更したレコードの以前のステータスだけを保存します。「元に戻す」を実行すると、それらの値を復元して現在のビューを再描画し、フォーカスをフィルターに戻します。無関係なレコードをリセットしたり、公開済みのソーシャル投稿を取り消せるかのように見せたりすることはありません。次の一括操作を行うと、利用できる「元に戻す」操作は置き換わります。「最後の変更を元に戻す」というラベルに沿った動作です。

Sprout Social Seeds デザインシステム:実行可能なキューとチェック項目

4種類すべてのトークン配布パッケージを使う

ソースでは、元の構成用スタイルシートより前に、カラー、スペース、タイポグラフィ、ボーダーの各CSSをインポートします。main.js、seeds.css、HTMLシェルをまとめて保存してください。プレビューには、同じ公開値とアプリケーションコードがバンドルされており、外部フォントやバックエンドは使用しません。正確なパッケージバージョンはインストールコマンドに記載されています。

  1. バージョンを固定したSeedsトークンパッケージ4種をインストールします。
  2. 提供されたエントリーポイント、CSS、ルートのHTMLを保存します。
  3. フィルターを変更する前に、複数選択状態をテストします。
  4. 一括レビュー後に、フィルターで結果が空になった状態からの復帰と、元に戻す操作を確認します。

複数の状態を組み合わせてテストする

投稿を1件選択し、一括選択が中間状態になることを確認します。「下書き」に切り替え、選択が解除されることを確認します。表示中の下書きを選択してレビュー準備完了にし、結果が空になることを確認します。操作を元に戻し、2件の下書きが戻ることを確認してから、すべての投稿を表示します。スマートフォン幅ではカードが1列に並び、ラベルやレビュー操作も引き続き利用できます。

Sprout Social Seeds デザインシステム:コンポーネント例

main.js — エディトリアルキューの完全版

元データ、フィルター、中間状態の複数選択、一括変更、元に戻す操作。

JavaScript
import '@sproutsocial/seeds-color/dist/seeds-color.css';
import '@sproutsocial/seeds-space/dist/seeds-space.css';
import '@sproutsocial/seeds-typography/dist/seeds-typography.css';
import '@sproutsocial/seeds-border/dist/seeds-border.css';
import './seeds.css';
let items=[{id:'p1',title:'A clearer first step',channel:'Team updates',copy:'A useful guide starts with the task someone needs to complete. This week, we are revisiting the first step in our workshop toolkit.',status:'Draft'},{id:'p2',title:'Room for different perspectives',channel:'Community notes',copy:'Good workshop preparation creates more than an agenda. It gives people time to think and more than one way to contribute.',status:'Draft'},{id:'p3',title:'From notes to next actions',channel:'Team updates',copy:'Close a conversation with a decision, an owner and a date to look again. Keep open questions visible alongside the agreed next step.',status:'Ready for review'}];let chosen=new Set(),previous=null;
document.querySelector('#root').innerHTML=`<main><header><div><p class="eyebrow">OpenDesign · Editorial practice</p><h1>A small queue, ready for a closer look</h1><p>Prepare original sample posts for review. This workspace does not connect to social accounts or publish content.</p></div><span class="badge">3 sample posts</span></header><section class="filters" aria-label="Queue controls"><label>Status <select id="filter"><option>All posts</option><option>Draft</option><option>Ready for review</option></select></label><label class="select-all"><input type="checkbox" id="all">Select visible posts</label><button id="review" disabled>Mark ready for review</button></section><p id="count" role="status"></p><div id="posts"></div><section id="empty" hidden><h2>No posts in this view</h2><p>Your sample posts remain available in the full queue.</p><button id="clear">Show all posts</button></section><div id="notice" hidden><p id="message" role="status"></p><button id="undo">Undo last change</button></div><footer>Uses the published Seeds color, space, typography and border token packages. The post cards, selection model and local review action are original OpenDesign code, not Sprout Social’s application or native React components.</footer></main>`;
function visible(){let value=document.querySelector('#filter').value;return items.filter(x=>value==='All posts'||x.status===value)}
function updateSelection(){let rows=visible(),selected=rows.filter(x=>chosen.has(x.id));const all=document.querySelector('#all');all.checked=rows.length>0&&selected.length===rows.length;all.indeterminate=selected.length>0&&selected.length<rows.length;all.disabled=!rows.length;document.querySelector('#review').disabled=!selected.some(x=>x.status==='Draft');document.querySelector('#count').textContent=`${rows.length} posts shown · ${selected.length} selected`;}
function render(){let rows=visible();chosen=new Set([...chosen].filter(id=>rows.some(x=>x.id===id)));const root=document.querySelector('#posts');root.replaceChildren(...rows.map(x=>{let a=document.createElement('article');a.innerHTML=`<div class="post-head"><label><input type="checkbox" data-id="${x.id}" aria-label="Select ${x.title}" ${chosen.has(x.id)?'checked':''}><span class="channel">${x.channel}</span></label><span class="status ${x.status==='Draft'?'draft':'ready'}">${x.status}</span></div><h2>${x.title}</h2><p class="copy">${x.copy}</p><details><summary>Review checklist</summary><ul><li>The first sentence makes the subject clear.</li><li>The wording describes a real next step.</li><li>The post does not promise an unavailable feature.</li></ul></details>`;a.querySelector('input').onchange=e=>{e.target.checked?chosen.add(x.id):chosen.delete(x.id);updateSelection()};return a}));document.querySelector('#empty').hidden=rows.length>0;updateSelection();}
document.querySelector('#filter').onchange=()=>{chosen.clear();render()};document.querySelector('#all').onchange=e=>{chosen=new Set(e.target.checked?visible().map(x=>x.id):[]);render()};document.querySelector('#review').onclick=()=>{let changed=items.filter(x=>chosen.has(x.id)&&x.status==='Draft');if(!changed.length)return;previous=changed.map(x=>({id:x.id,status:x.status}));changed.forEach(x=>x.status='Ready for review');chosen.clear();render();document.querySelector('#notice').hidden=false;document.querySelector('#message').textContent=`${changed.length} ${changed.length===1?'post marked':'posts marked'} ready for review locally. Nothing was published.`;};document.querySelector('#undo').onclick=()=>{previous?.forEach(p=>{items.find(x=>x.id===p.id).status=p.status});previous=null;render();document.querySelector('#notice').hidden=true;document.querySelector('#filter').focus()};document.querySelector('#clear').onclick=()=>{document.querySelector('#filter').value='All posts';render();document.querySelector('#filter').focus()};render();

コードリファレンス

  • ソーシャルAPI、公開操作、ネイティブのReactコンポーネントを使用しているわけではありません。

seeds.css — 実際のトークンを使った構成

レスポンシブレイアウトの完全版では、インストール済みのCSS変数を使用します。

CSS
*{box-sizing:border-box}body{margin:0;font:var(--typography-font-size--300)/var(--typography-line-height--300) var(--typography-family);color:var(--color-neutral-900);background:var(--color-neutral-100)}main{max-width:1160px;padding:var(--space-size--500);margin:auto}header{display:flex;justify-content:space-between;gap:24px;align-items:flex-start;margin-bottom:32px}h1{font-size:var(--typography-font-size--700);line-height:var(--typography-line-height--700);margin:8px 0 16px;max-width:24ch}header p:last-child{max-width:64ch}.eyebrow,.badge{font-size:13px;font-weight:600}.badge{white-space:nowrap;background:var(--color-green-100);color:var(--color-green-900);padding:8px 12px;border-radius:var(--border-radius-400)}.filters{display:flex;align-items:center;gap:24px;flex-wrap:wrap;padding:24px;background:white;border:1px solid var(--color-neutral-200);border-radius:var(--border-radius-600)}label{display:flex;align-items:center;gap:8px}select,button{font:inherit;border:1px solid var(--color-neutral-600);border-radius:var(--border-radius-400);padding:8px 12px;min-height:40px}select{background:white;color:var(--color-neutral-900);max-width:100%}button{background:var(--color-blue-700);color:white;border-color:var(--color-blue-700);font-weight:600;cursor:pointer}button:disabled{opacity:.5;cursor:default}input{width:18px;height:18px;accent-color:var(--color-blue-700);flex-shrink:0}#count{font-size:13px;color:var(--color-neutral-700);margin:24px 0 16px}#posts{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:24px}article{display:flex;flex-direction:column;border:1px solid var(--color-neutral-200);border-radius:var(--border-radius-600);padding:24px;background:white;min-width:0}.post-head{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;flex-wrap:wrap}.channel,.status{font-size:13px}.status{padding:2px 8px;border-radius:4px}.draft{background:var(--color-neutral-100)}.ready{background:var(--color-green-100);color:var(--color-green-900)}h2{font-size:21px;line-height:29.333px;margin:24px 0 16px}.copy{min-height:144px}details{border-top:1px solid var(--color-neutral-200);padding-top:16px;margin-top:auto;font-size:13px;line-height:1.6}summary{cursor:pointer;font-weight:600}details ul{padding-left:20px}details li{margin:8px 0}#notice{display:flex;justify-content:space-between;align-items:center;gap:24px;background:var(--color-blue-0);border:1px solid var(--color-blue-300);border-radius:8px;padding:16px 24px;margin-top:24px}#notice p{margin:0}#empty{background:white;padding:24px;border-radius:8px}#empty h2{margin-top:0}footer{font-size:13px;line-height:1.6;border-top:1px solid var(--color-neutral-200);margin-top:32px;padding-top:24px}:focus-visible{outline:3px solid var(--color-blue-700);outline-offset:3px}[hidden]{display:none!important}@media(max-width:850px){#posts{grid-template-columns:1fr}.copy{min-height:0}header{flex-wrap:wrap}#notice{flex-wrap:wrap}}@media(max-width:480px){main{padding:16px}.filters,article{padding:16px}.filters>label:first-child{flex-wrap:wrap}h1{font-size:24px;line-height:32px}.filters{gap:16px}.eyebrow{overflow-wrap:anywhere}}

コードリファレンス

  • パレットを役割に割り当てる方法は、アプリケーション独自の判断です。

index.html — アプリシェルの完全版

ローカルアプリのルート要素とエントリーポイント。

html
<!doctype html>
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Editorial review queue</title></head><body><div id="root"></div><script type="module" src="/src/main.js"></script></body></html>

コードリファレンス

  • このファイルでルートの Vite index.html を置き換えます。
04

Sprout Social Seeds デザインシステム:エージェントのセットアップ

実装の出発点

これらは公開されているトークンパッケージです。レビューアプリケーションの完全版は、上記で提供した独自コードです。

シェル
npm create vite@latest seeds-review -- --template vanilla
cd seeds-review
npm install
npm install @sproutsocial/[email protected] @sproutsocial/[email protected] @sproutsocial/[email protected] @sproutsocial/[email protected]
# Save index.html at root; main.js and seeds.css in src.
npm run dev

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

AI エージェント用プロンプト
バージョンを固定した公開SeedsトークンCSSを使い、提供されたエディトリアルキューを構築してください。実際のトークン名、システムのプロダクト書体、表示中の項目に限定した選択、ネイティブの中間状態、下書きのみを対象とした一括更新、空の状態からの復帰、1段階の元に戻す操作を維持してください。元のサンプルコンテンツを保ち、ソーシャルアカウントへの接続や公開操作があるかのように示すことは避けてください。
05

Sprout Social Seeds デザインシステム:ソースと対象範囲

公開されているSeedsトークンパッケージを使った、独自のOpenDesignアプリケーションです。カードとレビューのワークフローは独自のHTML/JavaScriptであり、SeedsのネイティブReactコンポーネントではありません。ソーシャルアカウントには接続されておらず、何も公開されません。