データ分析 · 新しいリソース

Wonderflow Wandaデザインシステム.

Wandaの実際のテーマロールとトークン構文を使って、トピックフィルター、展開可能な根拠の詳細、常時表示されるローカルノートブックを備えた、フィードバックを読み解くための包括的なワークスペースを作成します。

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

Wonderflow Wandaデザインシステムのインターフェースプレビュー

作成した観察記録を絞り込み、背景情報を確認し、メモを保存して、Wandaのテーマを切り替えます。

フィードバックを読み、リサーチノートを作成完全な例を開く
ネイティブのWanda 16.0.0テーマCSSを使用した独自のHTMLです。Reactコンポーネントのランタイムは使用していません。 · 実装リファレンス
02

Wonderflow Wandaデザインシステムのデザインリファレンス

@wonderflow/themes 16.0.0のライト/ダークJSONと@wonderflow/tokens 16.0.0のWebトークンJSONを、公開されている開発者向けドキュメントと照合して検証済みです。

ライト/ダークの値を持つテーマロール

ソース
名前 / ルール値 / 設定用途
--global-foregroundlight hsl(221 10% 30%) / dark hsl(220 16% 85%)フィードバックのサンプルで使用する、ライト/ダークに対応したテーマロール。
--global-backgroundlight hsl(0 0% 100%) / dark hsl(0 0% 0%)フィードバックのサンプルで使用する、ライト/ダークに対応したテーマロール。
--global-interactive-textlight hsl(214 66% 44%) / dark hsl(206 72% 67%)フィードバックのサンプルで使用する、ライト/ダークに対応したテーマロール。
--cta-defaultlight hsl(0 100% 44%) / dark hsl(0 100% 44%)フィードバックのサンプルで使用する、ライト/ダークに対応したテーマロール。
--cta-darklight hsl(0 100% 38%) / dark hsl(0 100% 38%)フィードバックのサンプルで使用する、ライト/ダークに対応したテーマロール。
--cta-foregroundlight hsl(0 0% 100%) / dark hsl(0 0% 100%)フィードバックのサンプルで使用する、ライト/ダークに対応したテーマロール。
--dimmed-0light hsl(210 20% 98%) / dark hsl(225 11% 7%)フィードバックのサンプルで使用する、ライト/ダークに対応したテーマロール。
--dimmed-1light hsl(220 19% 91%) / dark hsl(218 11% 14%)フィードバックのサンプルで使用する、ライト/ダークに対応したテーマロール。
--dimmed-2light hsl(220 16% 85%) / dark hsl(219 13% 22%)フィードバックのサンプルで使用する、ライト/ダークに対応したテーマロール。
--highlight-green-backgroundlight hsl(149 100% 91%) / dark hsl(166 100% 13%)フィードバックのサンプルで使用する、ライト/ダークに対応したテーマロール。
--highlight-green-foregroundlight hsl(156 100% 23%) / dark hsl(145 76% 75%)フィードバックのサンプルで使用する、ライト/ダークに対応したテーマロール。
--highlight-red-backgroundlight hsl(343 100% 96%) / dark hsl(350 100% 15%)フィードバックのサンプルで使用する、ライト/ダークに対応したテーマロール。
--highlight-red-foregroundlight hsl(351 92% 37%) / dark hsl(351 100% 81%)フィードバックのサンプルで使用する、ライト/ダークに対応したテーマロール。
--highlight-yellow-backgroundlight hsl(60 100% 89%) / dark hsl(22 100% 19%)フィードバックのサンプルで使用する、ライト/ダークに対応したテーマロール。
--highlight-yellow-foregroundlight hsl(25 100% 34%) / dark hsl(38 100% 77%)フィードバックのサンプルで使用する、ライト/ダークに対応したテーマロール。

スペースのプリミティブ

ソース
名前 / ルール値 / 設定用途
--space-40.250remビルド時にtoken()で使用するか、CSSのカスタムプロパティファイルをインポートしてください。
--space-80.500remビルド時にtoken()で使用するか、CSSのカスタムプロパティファイルをインポートしてください。
--space-161.000remビルド時にtoken()で使用するか、CSSのカスタムプロパティファイルをインポートしてください。
--space-241.500remビルド時にtoken()で使用するか、CSSのカスタムプロパティファイルをインポートしてください。
--space-322.000remビルド時にtoken()で使用するか、CSSのカスタムプロパティファイルをインポートしてください。
--space-483.000remビルド時にtoken()で使用するか、CSSのカスタムプロパティファイルをインポートしてください。

角丸のプリミティブ

ソース
名前 / ルール値 / 設定用途
--radius-40.250remビルド時にtoken()で使用するか、CSSのカスタムプロパティファイルをインポートしてください。
--radius-80.500remビルド時にtoken()で使用するか、CSSのカスタムプロパティファイルをインポートしてください。
--radius-161.000remビルド時にtoken()で使用するか、CSSのカスタムプロパティファイルをインポートしてください。
--radius-241.500remビルド時にtoken()で使用するか、CSSのカスタムプロパティファイルをインポートしてください。

ブレークポイントのプリミティブ

ソース
名前 / ルール値 / 設定用途
--breakpoint-extra-small30emビルド時にtoken()で使用するか、CSSのカスタムプロパティファイルをインポートしてください。
--breakpoint-small48emビルド時にtoken()で使用するか、CSSのカスタムプロパティファイルをインポートしてください。
--breakpoint-medium60emビルド時にtoken()で使用するか、CSSのカスタムプロパティファイルをインポートしてください。
--breakpoint-large80emビルド時にtoken()で使用するか、CSSのカスタムプロパティファイルをインポートしてください。

時間のプリミティブ

ソース
名前 / ルール値 / 設定用途
--duration-1000.10sビルド時にtoken()で使用するか、CSSのカスタムプロパティファイルをインポートしてください。
--duration-2000.20sビルド時にtoken()で使用するか、CSSのカスタムプロパティファイルをインポートしてください。
--duration-2500.25sビルド時にtoken()で使用するか、CSSのカスタムプロパティファイルをインポートしてください。
--duration-3000.30sビルド時にtoken()で使用するか、CSSのカスタムプロパティファイルをインポートしてください。
03

Wonderflow Wandaデザインシステム完全ガイド

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

DESIGN-wonderflow-wanda.md

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

ガイドをダウンロード

Wonderflow Wandaデザインシステムのプリミティブ、テーマ、CSSの使用方法

色の2つのレベルを理解する

Wandaのプリミティブカラートークンは、hsl()で囲まずに214 66% 44%のようなHSLチャンネルで表します。--global-interactive-textなどのテーマロールは、CSSの色全体に解決されます。テーマの値全体をさらに囲むと無効になり、プリミティブのチャンネルをhsl()で囲まない場合も無効です。この表では、完全なロール値と通常の寸法を分けて記載しています。

この OpenDesign ガイドから

ビルド時と実行時のトークンを意図的に使い分ける

ドキュメントに記載されたtoken()表記は、WandaのPostCSS設定で処理されます。ブラウザーで使えるCSS関数ではありません。標準的なHTMLプロジェクトでは、公開されているtokens.cssをインポートしてvar()を使う方法もあります。動作するサンプルでは、公開されているthemes.cssを標準のカスタムプロパティとともに使用しているため、表に出ていないPostCSSのビルド手順は必要ありません。

Wonderflow Wandaデザインシステムのライト/ダークテーマロール

セマンティックな背景面をまとめて切り替える

Wandaにはライトとダークのテーママッピングがあります。このサンプルではルートのdata-themeを変更し、テーマスタイルシートによって前景、背景面、ボーダー、ハイライトのロールをまとめて切り替えます。テーマの切り替えは表示状態の変更であり、リサーチ状態のリセットではないため、選択内容と保存済みメモはそのまま維持されます。

メインのローカル操作にCTAロールを限定する

赤のCTAペアは、保存済みメモの確認に一度だけ使用しています。トピックタグにはニュートラルなハイライトロールを使い、感情タグには緑、黄、赤のペアを使っています。各タグには感情を文章でも示しているため、色の見分けにくさによって意味が失われることはありません。カードごとに別のアクセントパレットを設けることもしていません。

Wonderflow Wandaデザインシステムのフィードバック内容と根拠の境界

観察と解釈を分けて扱う

各カードには、作成された観察記録と、展開して表示できる背景情報が含まれています。背景情報ではサンプルが示す内容を説明し、頻度や深刻度に関する主張を明示的に避けています。実際のフィードバックツールでは、単一の引用を根拠のない傾向として扱うのではなく、情報源と分析の境界を保つ必要があります。

装飾で根拠を捏造しない

この例には、実在しない顧客の身元、星評価、モデルの信頼度スコアはありません。作成した5件のメモで、フィルタリング、開閉表示、保存状態を示すには十分です。実際の製品では、リサーチの出所とアクセスルールをデータ契約に定める必要があります。見栄えのよい引用カードだけでは、それらを補えません。

Wonderflow Wandaデザインシステムのフィルタリングとノートブックの状態

トピックと感情の条件を組み合わせる

2つのネイティブの選択メニューではAND条件で絞り込みます。該当するメモがない組み合わせでは、再操作を促すメッセージとリセット操作を表示します。結果件数の分母は、より大きなデータセットの件数であるかのように見せず、作成済みの5件のメモと明記します。これらはすべてソース一式で確認できます。

保存済みメモを表示状態から独立させる

Wonderflow Wanda デザインシステムのカード、開閉表示、レスポンシブレイアウト

余白で根拠と操作を分ける

幅の広い画面では、各メモカードに16pxの角丸と24pxの内側余白を設けます。タグでトピックを示し、引用文は大きめの文字サイズで表示します。展開可能なコンテキストは保存操作の前に配置します。ノートブックはメモの横に、より控えめな背景面で表示します。これらはWandaの値を使って表現した独自の構成であり、標準搭載のリサーチカードコンポーネントを示すものではありません。

モバイルでも読書の順序を保つ

768pxではノートブックを観察メモの後に移動し、カードのパディングを16pxに縮小します。トピックと感情のコントロールは全幅の行として表示します。展開したコンテキストはドキュメントのフロー内に残り、他のメモに重なったり、隠したりしません。カードに固定高を設定していないため、引用文が長くても読みやすさを保てます。

Wonderflow Wandaデザインシステム ネイティブ ReactセットアップとHTML境界

Wandaのツールチェーン全体を考慮する

公式の導入ではreact-components、themes、symbols、tokensを使用し、コンポーネントCSSに必要なPostCSS設定を@wonderflow/configで提供します。Reactのエントリーポイントではcore.cssとthemesパッケージをインポートします。react-componentsだけをインストールし、すべてのテーマロールが利用できると想定するのは不完全な統合です。また、公開されている導入ページでは、バージョン10.6を超える場合のTailwindとの互換性についても注意を促しています。

ネイティブコンポーネントと称さず、このサンプルを使う

実行できるプレビューでは、Wanda 16.0.0のテーマCSSと独自のセマンティックなHTMLを使用しています。ReactのButton、Select、開閉表示コンポーネントは実行していません。この境界は意図的に設けており、明確に示しています。完全なソースは静的サーバーで実行できますが、Reactへのネイティブ移行では、現在のコンポーネントAPIとビルド設定を確認する必要があります。

Wonderflow Wanda デザインシステムの完全なソースとエージェントレビュー

実際のプレビューを再現する

指定バージョンのテーマパッケージをインストールし、生成されたthemes.cssを、付属のindex.htmlおよびwanda.cssと同じ場所にコピーして、ディレクトリを配信します。ソースには5件すべてのメモ、フィルタリング、開閉表示、保存状態、フィードバックが含まれます。プレビューでは実行時のネットワーク依存を避けるため、同じスタイルシートをローカルにバンドルしています。

  1. @wonderflow/themes 16.0.0をインストールし、生成されたCSSをコピーします。
  2. index.htmlとwanda.cssの完全なファイルを保存します。
  3. 結果が空になるように絞り込み、リセットしてからメモを保存します。
  4. テーマを切り替え、ノートブックがそのまま保たれることを確認します。

失敗時と状態遷移を確認する

エージェントには、フィルターの母数、結果が空のときの復帰方法、保存したメモの保持、レビュー結果の無効化を維持するよう指示してください。両方の表示テーマと、長文のメモを展開した状態を確認します。ローカルのレビューは選択されたサンプルの要約にすぎません。別途実装し、根拠となる情報源を用意しない限り、AI分析や顧客検証と称してはいけません。

  • token()を実行時のCSSとして扱わないでください。
  • プリミティブなHSLチャンネルと、完全なテーマカラーを区別します。
  • 作成したサンプルと実際のリサーチ根拠を区別します。

Wonderflow Wanda デザインシステムのコンポーネント例

index.html — フィードバックワークスペース全体

独自のセマンティックなHTMLと、アプリケーションのすべての状態。コピーしたWandaのテーマスタイルシートを使用します。

html
<!doctype html><html lang="en" data-theme="light"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Feedback study</title><link rel="stylesheet" href="wanda-theme.css"><link rel="stylesheet" href="wanda.css"><body><main><header><div><span class="eyebrow">PRODUCT RESEARCH / AUTHORED SAMPLE NOTES</span><h1>Explore the feedback</h1><p>Read individual observations before turning a theme into a decision.</p></div><button id="theme" aria-pressed="false">Dark theme</button></header><div class="filters"><label>Topic <select id="topic" aria-label="Topic"><option value="all">All topics</option><option>Setup</option><option>Search</option><option>Export</option></select></label><label>Sentiment <select id="sentiment" aria-label="Sentiment"><option value="all">All sentiments</option><option value="positive">Positive</option><option value="mixed">Mixed</option><option value="negative">Negative</option></select></label><button id="reset">Reset filters</button></div><div class="workspace"><section><div class="section-heading"><h2>Sample observations</h2><span id="count" role="status"></span></div><div id="notes"></div><div id="empty" hidden><h3>No observations match</h3><p>Clear a filter to see the authored examples again.</p></div></section><aside><h2>Research notebook</h2><p>Save observations to keep them together while comparing topics.</p><ul id="saved"></ul><p id="hint">No observations saved yet.</p><button class="cta" id="review">Review saved notes</button><p id="result" role="status"></p></aside></div><footer>Original interface using Wanda 16.0.0 theme and token values. All quotations are written for this specimen, not real customer feedback or research findings.</footer></main>
<script>
const data=[{id:1,topic:'Setup',sentiment:'positive',quote:'The first checklist made it clear what I needed to prepare.',context:'Authored onboarding observation; one sample, not a measured trend.'},{id:2,topic:'Search',sentiment:'negative',quote:'I could not tell whether the filter was still active after I changed the search.',context:'Authored state-visibility observation; investigate with actual users.'},{id:3,topic:'Export',sentiment:'mixed',quote:'The file was useful, but I wanted to check the included columns first.',context:'Authored export observation; no frequency or severity estimate.'},{id:4,topic:'Setup',sentiment:'mixed',quote:'I understood the steps but needed an explanation of one unfamiliar term.',context:'Authored terminology observation; the term is intentionally unspecified.'},{id:5,topic:'Search',sentiment:'positive',quote:'Seeing a count beside each topic helped me narrow the list.',context:'Authored topic-navigation observation; not an endorsement.'}];const saved=new Set();const $=id=>document.getElementById(id);function render(){const visible=data.filter(n=>($('topic').value==='all'||n.topic===$('topic').value)&&($('sentiment').value==='all'||n.sentiment===$('sentiment').value));$('count').textContent=visible.length+' of '+data.length+' notes';$('empty').hidden=!!visible.length;$('notes').replaceChildren(...visible.map(n=>{let a=document.createElement('article');a.innerHTML=`<div class="tags"><span>${n.topic}</span><span class="${n.sentiment}">${n.sentiment}</span></div><blockquote>${n.quote}</blockquote><details><summary>Read sample context</summary><p>${n.context}</p></details><button class="save" aria-pressed="${saved.has(n.id)}" aria-label="${saved.has(n.id)?'Remove':'Save'} note ${n.id}">${saved.has(n.id)?'Saved to notebook':'Save to notebook'}</button>`;a.querySelector('.save').onclick=()=>{saved.has(n.id)?saved.delete(n.id):saved.add(n.id);$('result').textContent='';render()};return a}));$('saved').replaceChildren(...data.filter(n=>saved.has(n.id)).map(n=>{let l=document.createElement('li');l.textContent=n.topic+': '+n.quote;return l}));$('hint').hidden=!!saved.size}
$('topic').onchange=render;$('sentiment').onchange=render;$('reset').onclick=()=>{$('topic').value='all';$('sentiment').value='all';render()};$('review').onclick=()=>{$('result').textContent=saved.size?`${saved.size} authored notes ready for local review. No analysis has been generated.`:'Save a note before reviewing.'};$('theme').onclick=()=>{const dark=$('theme').getAttribute('aria-pressed')!=='true';$('theme').setAttribute('aria-pressed',dark);document.documentElement.dataset.theme=dark?'dark':'light'};render();
</script>
</body></html>

コードリファレンス

  • wanda.cssおよびwanda-theme.cssと同じ場所にindex.htmlとして保存します。

wanda.css — 実際のテーマロールを使った構成

レスポンシブ対応のカードとノートブックのレイアウトで、公開されているカスタムプロパティを使用します。

CSS
*{box-sizing:border-box}body{margin:0;background:var(--global-background);color:var(--global-foreground);font:16px/1.5 system-ui,sans-serif}main{padding:32px}header{display:flex;align-items:start;justify-content:space-between;gap:24px;border-bottom:1px solid var(--dimmed-1);padding-bottom:24px}h1{font-size:32px;line-height:1.25;margin:8px 0 16px}h2{font-size:20px;margin:0}h3{font-size:18px}.eyebrow,footer{font-size:12px}p{margin:8px 0 16px}.filters{display:flex;flex-wrap:wrap;gap:16px;align-items:center;margin:24px 0}label{display:flex;gap:8px;align-items:center}button,select{background:var(--global-background);color:var(--global-foreground);font:inherit;padding:8px 16px;min-height:44px;border:1px solid var(--dimmed-2);border-radius:8px}button{cursor:pointer}.workspace{display:grid;grid-template-columns:1.7fr 1fr;gap:32px}.section-heading{display:flex;justify-content:space-between;gap:16px;margin-bottom:16px}#count{font-size:14px}article{padding:24px;border:1px solid var(--dimmed-1);border-radius:16px;margin-bottom:16px}.tags{display:flex;gap:8px;font-size:12px}.tags span{padding:4px 8px;background:var(--highlight-gray-background);color:var(--highlight-gray-foreground);border-radius:4px}.tags .positive{background:var(--highlight-green-background);color:var(--highlight-green-foreground)}.tags .negative{background:var(--highlight-red-background);color:var(--highlight-red-foreground)}.tags .mixed{background:var(--highlight-yellow-background);color:var(--highlight-yellow-foreground)}blockquote{margin:16px 0;font-size:20px;line-height:1.4}details{font-size:14px;margin:16px 0}summary{cursor:pointer;color:var(--global-interactive-text)}.save{font-size:14px}.save[aria-pressed=true]{border-color:var(--global-interactive-text);color:var(--global-interactive-text)}aside{background:var(--dimmed-0);padding:24px;border-radius:16px;align-self:start}aside p,aside li{font-size:14px}aside ul{padding-left:20px}aside li{margin:16px 0}.cta{background:var(--cta-default);color:var(--cta-foreground);border-color:var(--cta-default)}.cta:hover{background:var(--cta-dark)}button:focus-visible,select:focus-visible,summary:focus-visible{outline:3px solid var(--global-interactive-text);outline-offset:3px}footer{border-top:1px solid var(--dimmed-1);padding-top:16px;margin-top:32px}#empty{padding:24px;background:var(--dimmed-0);border-radius:16px}[hidden]{display:none!important}@media(max-width:767px){main{padding:16px}.workspace{grid-template-columns:1fr;gap:24px}header{display:block}header button{margin-top:8px}.filters label{width:100%;justify-content:space-between}.filters select{flex:1}article{padding:16px}h1{font-size:28px}.section-heading{align-items:center}}

コードリファレンス

  • テーマ値は人工的なパレットではなく、インストールしたパッケージから取得します。
04

Wonderflow Wanda デザインシステムエージェントの設定

実装の出発点

ローカルプレビューには、公開されている同じテーマCSSをバンドルしています。HTMLアプリケーションではPostCSSもReactも必要ありません。

シェル
npm install @wonderflow/[email protected]
cp node_modules/@wonderflow/themes/dist/themes.css wanda-theme.css
# Save the complete index.html and wanda.css examples beside that file.
python3 -m http.server 8080

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

AI エージェント用プロンプト
Wanda 16.0.0のテーマロールを使い、独自のHTML例をすべて含むフィードバックノートブックを構築します。AND条件での絞り込み、全5件を示す明示的な母数、展開可能なコンテキスト、保存状態の維持、古いレビュー結果のクリアを保ってください。token()のビルド時の使い方とCSS変数を区別し、作成した観察メモを顧客リサーチとして提示しないでください。
05

Wonderflow Wanda デザインシステムの情報源と対象範囲

Wandaのthemesとtokens 16.0.0を使用したOpenDesignアプリケーションの検証例です。インターフェースは独自のHTMLであり、ネイティブのWanda Reactランタイムではありません。引用文はすべてこのサンプル用に作成したもので、顧客の声や実際のリサーチ結果ではありません。