採用プラットフォーム · 新しいリソース

SEEK Braid デザインシステム.

テーマごとにスコープされた変数、実際の4つのブレークポイント、文脈に応じたテキスト、トーンの異なるボタン、操作を無効にするのではなく検証内容を説明する制御付きフィールドを使った、独自の求人検索レイアウトを通して Braid を理解しましょう。

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

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

職種または都市の検索語を編集して適用し、検索結果がない場合を確認してから、入力欄と適用済みの検索条件を両方クリアします。

求人検索のサンプル完全な例を開く
Braidの検索構成、階層、ブレークポイントのガイダンスを独自に解釈したオフライン版HTMLです。SEEKのライブデータやBraidランタイムは使用しません。プレビューの配色と実際の余白は、このアプリケーション独自の設定です。· 実装リファレンス
02

SEEK Braid デザインシステムの設計リファレンス

現行のBraidコンポーネントとCSSのリファレンスです。サイズ名は選択したテーマに基づいて決まります。未検証のピクセル換算値や、生成されたCSS変数名はここでは創作していません。標準のサンプルではseekJobsを明示的に選択しています。

レスポンシブのブレークポイント

ソース
名前 / ルール値 / 設定用途
mobile0基本スタイル。
tablet740px最初に適用される広い画面向けの条件。
desktop992pxデスクトップ向けの条件。
wide1200px幅の広い画面向けの条件。

テーマ変数API

ソース
名前 / ルール値 / 設定用途
vars.space.mediumTheme-scoped CSS expressionそのまま使用できます。算術演算にはcalcが必要です。
vars.space.gutterTheme gutter expressionレイアウトのガター。
vars.backgroundColor.bodyTheme body backgroundページの背景。
vars.backgroundColor.surfaceTheme surface backgroundコンテナの背景。
vars.backgroundColor.brandAccentTheme brand action backgroundすべてに共通する16進カラーコードがあるとは限りません。
vars.foregroundColor.neutralTheme text roleメインコンテンツ。
vars.foregroundColor.secondaryTheme secondary roleメタデータ。
vars.borderColor.focusTheme focus role視覚的に確認できるフォーカス。
vars.borderRadius.standardTheme radius expression標準の形状。

ボックスレイアウトAPI

ソース
名前 / ルール値 / 設定用途
componentdiv by default必要に応じて、意味に沿ったmain、section、formを選択します。
paddingNamed space, responsive object allowed使用例:モバイルmedium/タブレットxlarge。
gapNamed spacing values隣接する要素間のスペーシング。
background="customDark"Context for custom dark surfaces前景色の動作を一致させられます。
borderRadiusnone / small / standard / large / xlarge / fullテーマに応じて決まる形状。

テキストとフィールドの仕様

ソース
名前 / ルール値 / 設定用途
label / secondaryLabel / tertiaryLabelThree label levels目的、任意の補足情報、入力支援。
descriptionBelow-label contextフィールドにフォーカスすると読み上げられます。
message + tonecritical / positive / caution / neutralフィールドの状態を説明します。
onClearCallback required for clear action制御対象の値はアプリケーション側でリセットします。
clearLabelAccessible clear-control label日本語化します。

ボタンの強調度と動作

ソース
名前 / ルール値 / 設定用途
variantsolid / ghost / soft / transparent視覚的な強調。
tonebrandAccent / formAccent / critical / neutralアクションの意味。
No explicit toneNeutral ghost by default控えめな標準設定。
Explicit tone, no variantSolid default曖昧さを避けるには、両方を指定します。
sizestandard / smallサポートされているサイズ。
loadingAlso disables interaction実際に処理中の場合に限ります。
Ordinary disabledNot supported操作できる状態を保ち、エラーの内容を説明します。

テキストの意味

ソース
名前 / ルール値 / 設定用途
sizelarge / standard / small / xsmallテーマの文字サイズ設定。
weightregular / medium / strongテキストの強調。
component="p"Paragraph element文字の見た目と意味は別々に考えます。
maxLinesNumberユーザー生成コンテンツの表示範囲を制限します。
tone="secondary"Metadata emphasisエラーロールの代わりにはなりません。
03

SEEK Braid デザインシステム完全ガイド

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

DESIGN-seek-braid.md

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

ガイドをダウンロード

SEEK Braid デザインシステム:選択したテーマが視覚表現の仕様を決定する

Provider、リセット、生成される変数が連携します

Braidは、SEEK Groupの複数のテーマに対応しています。Braidの変数APIにはスコープ付きのCSS式が含まれているため、vars.space.mediumなどの名前は安定した参照として使えます。一方、生成されるカスタムプロパティの識別子を手作業で再現する必要はありません。この例では、BraidProviderを通じてseekJobsを選択します。

この OpenDesign ガイドから

リセットは、ほかのBraidスタイルより先にインポートする必要があります。アプリケーションを埋め込む場合、styleBody={false}を指定すると、Providerによるホスト側のbodyの背景や余白の変更を防げます。このオプションを指定しても、テーマコンテキストは引き続き必要です。

関連する仕様を確認する

SEEK Braid デザインシステム:レスポンシブ値には名前付きのテーマスペースを使う

実際に使われている4つのブレークポイント条件を維持する

共通のブレークポイントは、モバイルが0、タブレットが740px、デスクトップが992px、ワイドが1200pxです。この例では、レスポンシブプロパティのオブジェクトを使い、タブレットのブレークポイントで余白を変更します。同じ変更のためにCSSメディアクエリを重複して記述する必要はありません。

ここでは、テーマのmediumスペースを推測したピクセル値として説明していません。余白にはBoxとStackを優先して使います。varsは、それらのコンポーネントでは表現できないレイアウトに使う、より低レベルな手段です。値はCSS式なので、乗算にはJavaScript数値演算ではなくcalcを使います。

関連する仕様を確認する

SEEK Braid デザインシステム:テキストロールは周囲の色コンテキストに対応する

階層とセマンティクスは別々に選ぶ

Textでは名前付きのサイズとウェイトを指定でき、Headingでは見出しの階層を表現できます。求人の都市名にはsecondaryトーンを使えますが、タイトルには検索結果を識別できるだけの強調を保ちます。段落には、既定の見た目だけを理由にHTML要素を選ぶのではなく、component="p"を指定してTextを段落として表示できます。

Braidは、暗い背景のコンテキストに合わせて前景色のトーンを調整します。元画像やカスタム背景を使う場合は、BoxにcustomDarkコンテキストを指定してその関係を伝えます。手動で色を指定したdivでも、同じコンテキスト動作が得られるとは限りません。

関連する仕様を確認する

SEEK Braid デザインシステム:トーンは意味、variantは強調度

ブランドアクセントは検索アクションに限定する

この例では、検索の「求人を検索」にsolidバリアントとbrandAccentを明示的に組み合わせています。「検索をクリア」は、より控えめなghostアクションです。繰り返し実行できるフォームアクションの強調にはformAccentを使えます。criticalは破壊的な結果を伴う操作向けであり、通常のコントロールを目立たせるために使うものではありません。

Braidの既定動作には注意が必要です。neutralボタンは、別途指定がなければghostになります。一方、toneを設定すると、暗黙のvariantはsolidになります。重要なアクションでは両方のプロパティを指定し、意図した階層を明確にします。Actionsが一般的なモバイルでの縦並びと、画面幅が広い場合の横並びに対応します。

関連する仕様を確認する

SEEK Braid デザインシステム:利用できないボタンより、操作可能なエラー表示を優先する

制御対象フィールドの仕様に従う

TextFieldのonChangeコールバックには、React入力イベントが渡されます。この例ではevent.target.valueを読み取り、入力中のテキストを保存し、ユーザーが「検索」を実行したときにのみ適用済みの検索条件を更新します。コントロール単体ではアプリケーションの状態をクリアできないため、クリア用のコールバックも渡します。

messageで空の検索語に関するエラーを説明し、criticalトーンで視覚的な状態を示します。descriptionは継続的な補足情報に使います。通常のdisabled Braid Buttonはサポートされていません。訪問者が次の操作を確認できるよう、アクションは実行可能な状態に保ちます。オフラインプレビューでは、無効なフィールドにフォーカスも移動します。

  1. 編集中の検索語は下書き状態で管理します。
  2. 検索時に、前後の空白を除いた検索語が空でないことを確認します。
  3. 失敗時には、役立つ重要なメッセージを表示します。
  4. 成功した場合に検索語を適用し、結果が0件の場合も状態を明示します。

関連する仕様を確認する

SEEK Braid デザインシステム:このサンプルは独自データのみを検索する

ローカル検索の結果は、募集中の求人を示すものではありません

プレビューには、職種、都市、勤務形態のメタデータを含む、架空の求人データが3件用意されています。検索では、大文字と小文字を区別せずに職種名と都市名を照合します。現在掲載中のSEEK求人は取得せず、結果はサンプルとして表示します。

入力中のテキストと適用済みの検索結果を別々に管理することで、検索を実行する前に職種を編集しても現在の結果が自動的に置き換わらないことが明確になります。「検索をクリア」では両方の値をリセットします。一致する結果がない場合はその旨を示し、検索コントロールは引き続き操作できる状態に保ちます。

  • 検索条件を適用した後に結果件数を表示します。
  • 編集中も、最後に適用した検索語を把握できるようにします。
  • サンプルの求人情報に、偽の適用送信処理を追加しないでください。

関連する仕様を確認する

SEEK Braid デザインシステム:Braidのスタイルを抽出するビルドを使う

パッケージのインストールは、セットアップの一部にすぎません

公式のセットアップはsku向けに最適化されています。BraidのVanilla Extractスタイルをカスタムバンドラーで使うには、ビルドへの統合が必要です。また、リセットと選択したテーマは、ドキュメントに記載された順序でアプリケーションに読み込む必要があります。提示するコードは、互換性のある既存のskuプロジェクト向けの完全なエントリーポイントです。任意のscriptタグだけでBraidを実行できるという説明ではありません。

Braidは開発時のアサーションと、環境に応じた警告を実行します。本番環境では、ビルド時にアサーションを取り除き、環境を置き換えることが公式のビルドガイドで説明されています。この点は実装ワークフローで考慮してください。このページのオフラインHTMLサンプルは、そのようなパッケージビルドに依存しません。

関連する仕様を確認する

SEEK Braid デザインシステムのコンポーネント例

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

ドキュメント全体をindex.htmlとして保存し、ブラウザーで開いてください。これは、Braidの検索構成、階層、ブレークポイントのガイダンスを独自にオフラインで再現したHTMLサンプルであり、SEEKのライブデータやBraidランタイムは使いません。プレビューの色と実際の余白は、アプリケーション側で選択したものです。

html
<!doctype html><html lang="en"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Braid sample job search interpretation</title><style>*{box-sizing:border-box}body{margin:0;background:#f5f5f5;color:#222;font:16px/1.5 system-ui,sans-serif}header{background:white;padding:16px 32px;border-bottom:1px solid #ddd;display:flex;align-items:center;justify-content:space-between}header strong{color:#0d3880;font-size:20px}header span{font-size:14px;color:#666}.hero{background:#0d3880;color:white;padding:32px}.hero-inner{max-width:980px;margin:auto}h1{font-size:32px;line-height:1.2;margin:0 0 24px}form{display:grid;grid-template-columns:1fr auto auto;gap:16px;align-items:end}label{display:block;font-weight:600;margin-bottom:8px}input{height:48px;border:1px solid #aaa;border-radius:4px;padding:10px 12px;font:inherit;width:100%;min-width:0;color:#222}input[aria-invalid=true]{border:2px solid #c90040}button{height:48px;border:1px solid transparent;border-radius:4px;font:600 16px/1.2 system-ui;padding:0 24px;cursor:pointer}.search{background:#e60278;color:white}.clear{background:transparent;color:white;border-color:white}button:focus-visible,input:focus-visible{outline:3px solid #69d8ff;outline-offset:3px}.error{background:white;color:#b70040;padding:8px 12px;margin:16px 0 0;border-radius:4px}.error:empty{display:none}.help{font-size:14px;color:#e4eaf6;margin:16px 0 0}main{max-width:1044px;margin:32px auto;padding:0 32px}.results-head{display:flex;justify-content:space-between;gap:16px;margin-bottom:20px}h2{font-size:24px;line-height:1.3;margin:0 0 8px}.applied{font-size:14px;color:#555}article{display:grid;grid-template-columns:1fr 100px;gap:24px;padding:24px;background:white;border:1px solid #ddd;border-radius:4px;margin-bottom:16px}.company{font-size:14px;color:#555}.meta{margin:16px 0;display:flex;gap:8px;flex-wrap:wrap}.meta span{background:#f0f4fb;padding:4px 8px;font-size:12px;border-radius:4px}article p{margin:0;color:#555;font-size:14px}.monogram{background:#f1e5f4;color:#673b78;height:72px;width:72px;border-radius:12px;display:grid;place-items:center;font-weight:700;font-size:24px;justify-self:end}.monogram.blue{color:#0d3880;background:#e4efff}.monogram.green{color:#326342;background:#e8f4eb}.notice{background:white;border:1px solid #ddd;padding:24px}.boundary{font-size:12px;color:#666;margin:24px 0}@media(max-width:739px){header{padding:16px}header span{display:none}.hero{padding:24px 16px}h1{font-size:28px}form{grid-template-columns:1fr;gap:12px}form button{width:100%}main{padding:0 16px;margin:24px auto}article{padding:20px;grid-template-columns:1fr 48px;gap:12px}.monogram{height:48px;width:48px;font-size:18px}article h2{font-size:20px}.results-head{display:block}}</style><header><strong>Possibilities</strong><span>Original job-search specimen</span></header><section class="hero"><div class="hero-inner"><h1>Find your next possibility.</h1><form novalidate><div><label for="query">Role or city</label><input id="query" type="search" placeholder="Try designer or Melbourne" aria-describedby="error help"></div><button class="search" type="submit">Search jobs</button><button class="clear" type="button" id="clear">Clear search</button></form><div id="error" class="error" role="alert"></div><p id="help" class="help">Search three original sample roles. These are not live vacancies.</p></div></section><main><div class="results-head"><div><h2 id="count">3 sample results</h2><div class="applied" id="applied">Showing all sample roles</div></div></div><div id="results"></div><p class="boundary">Independent HTML interpretation of Braid’s search composition and responsive guidance. Original content and application palette; no SEEK data, account or application service is connected.</p></main><script>const jobs=[{title:'Product designer',city:'Melbourne',company:'North Studio',type:'Full time',mode:'Hybrid',initial:'NS',color:'',description:'Shape useful experiences with a small multidisciplinary product team.'},{title:'Design systems engineer',city:'Sydney',company:'Harbour Works',type:'Full time',mode:'Flexible',initial:'HW',color:'blue',description:'Build accessible components and improve the way teams deliver interfaces.'},{title:'UX researcher',city:'Melbourne',company:'Fern Collective',type:'Contract',mode:'On site',initial:'FC',color:'green',description:'Turn thoughtful field research into clear product opportunities.'}];const input=document.querySelector('#query'),error=document.querySelector('#error');let applied='';function render(){let matches=jobs.filter(j=>(j.title+' '+j.city).toLowerCase().includes(applied.toLowerCase()));document.querySelector('#count').textContent=matches.length+' sample '+(matches.length===1?'result':'results');document.querySelector('#applied').textContent=applied?'Applied search: '+applied:'Showing all sample roles';document.querySelector('#results').innerHTML=matches.length?matches.map(j=>`<article><div><h2>${j.title}</h2><div class="company">${j.company} · ${j.city}</div><div class="meta"><span>${j.type}</span><span>${j.mode}</span><span>Sample listing</span></div><p>${j.description}</p></div><div class="monogram ${j.color}" aria-hidden="true">${j.initial}</div></article>`).join(''):'<div class="notice">No sample roles match. Try another role or city, or clear your search.</div>'}document.querySelector('form').onsubmit=e=>{e.preventDefault();if(!input.value.trim()){error.textContent='Enter a role or city.';input.setAttribute('aria-invalid','true');input.focus();return}error.textContent='';input.removeAttribute('aria-invalid');applied=input.value.trim();render()};input.oninput=()=>{error.textContent='';input.removeAttribute('aria-invalid')};document.querySelector('#clear').onclick=()=>{input.value='';applied='';error.textContent='';input.removeAttribute('aria-invalid');render();input.focus()};render();</script></html>

コードリファレンス

  • 検索対象は同梱の架空の求人です。Braid のネイティブなエントリーポイントには、スタイル抽出を行うビルドと選択した seekJobs テーマが必要です。

入力中の検索語、適用済みの検索、明示的なリセット

制御された TextField でローカルの検索語を検証し、Actions で異なるスタイルのボタンを2つまとめ、Card/Stack/Heading/Text でオリジナルの検索結果を表示します。

jsx
// Entry module in an existing sku application:
// npm install braid-design-system
import 'braid-design-system/reset'; // Keep this first.
import React,{useState} from 'react';
import {createRoot} from 'react-dom/client';
import seekJobsTheme from 'braid-design-system/themes/seekJobs';
import {BraidProvider,Box,Stack,Heading,Text,TextField,Button,Actions,Card} from 'braid-design-system';
const jobs=[{id:1,title:'Product designer',city:'Melbourne'},{id:2,title:'Design systems engineer',city:'Sydney'},{id:3,title:'UX researcher',city:'Melbourne'}];
function JobSearch(){
 const [draft,setDraft]=useState(''),[query,setQuery]=useState(''),[error,setError]=useState('');
 const results=jobs.filter(j=>(j.title+' '+j.city).toLowerCase().includes(query.toLowerCase()));
 function search(){if(!draft.trim()){setError('Enter a role or city.');return;}setError('');setQuery(draft.trim());}
 function clear(){setDraft('');setQuery('');setError('');}
 return <Box component="main" padding={{mobile:'medium',tablet:'xlarge'}}>
  <Stack space="large">
   <Heading level="2">Find your next possibility</Heading>
   <TextField id="job-query" label="Role or city" value={draft}
     onChange={event=>{setDraft(event.target.value);setError('');}}
     onClear={()=>setDraft('')} clearLabel="Clear role or city"
     tone={error?'critical':'neutral'} message={error||'Search three original sample roles.'}/>
   <Actions><Button tone="brandAccent" variant="solid" onClick={search}>Search jobs</Button>
    <Button variant="ghost" onClick={clear}>Clear search</Button></Actions>
   <Text>{results.length} sample results</Text>
   {results.map(job=><Card key={job.id}><Stack space="small"><Heading level="3">{job.title}</Heading><Text tone="secondary">{job.city}</Text></Stack></Card>)}
   {!results.length&&<Text>No sample roles match. Try a different title or city.</Text>}
   <Text size="small" tone="secondary">These are sample listings, not live vacancies.</Text>
  </Stack>
 </Box>;
}
createRoot(document.getElementById('root')).render(<BraidProvider theme={seekJobsTheme}><JobSearch/></BraidProvider>);

コードリファレンス

  • onChange が受け取るのは生の文字列ではなく、入力イベントです。
  • 検索語が空でも検索は実行できます。入力する内容を案内します。
  • 検索をクリアすると、入力中のテキストと適用済みの検索結果が両方リセットされます。
04

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

実装の出発点

既存の sku ビルド向けの完全なアプリケーションエントリーポイントです。公式のセットアップで直接サポートされています。カスタムバンドラーには Vanilla Extract の統合が必要です。Reset のインポートは必ず先頭に置いてください。オフラインプレビューでは、ネイティブパッケージのコンパイルは行いません。

jsx
// Entry module in an existing sku application:
// npm install braid-design-system
import 'braid-design-system/reset'; // Keep this first.
import React,{useState} from 'react';
import {createRoot} from 'react-dom/client';
import seekJobsTheme from 'braid-design-system/themes/seekJobs';
import {BraidProvider,Box,Stack,Heading,Text,TextField,Button,Actions,Card} from 'braid-design-system';
const jobs=[{id:1,title:'Product designer',city:'Melbourne'},{id:2,title:'Design systems engineer',city:'Sydney'},{id:3,title:'UX researcher',city:'Melbourne'}];
function JobSearch(){
 const [draft,setDraft]=useState(''),[query,setQuery]=useState(''),[error,setError]=useState('');
 const results=jobs.filter(j=>(j.title+' '+j.city).toLowerCase().includes(query.toLowerCase()));
 function search(){if(!draft.trim()){setError('Enter a role or city.');return;}setError('');setQuery(draft.trim());}
 function clear(){setDraft('');setQuery('');setError('');}
 return <Box component="main" padding={{mobile:'medium',tablet:'xlarge'}}>
  <Stack space="large">
   <Heading level="2">Find your next possibility</Heading>
   <TextField id="job-query" label="Role or city" value={draft}
     onChange={event=>{setDraft(event.target.value);setError('');}}
     onClear={()=>setDraft('')} clearLabel="Clear role or city"
     tone={error?'critical':'neutral'} message={error||'Search three original sample roles.'}/>
   <Actions><Button tone="brandAccent" variant="solid" onClick={search}>Search jobs</Button>
    <Button variant="ghost" onClick={clear}>Clear search</Button></Actions>
   <Text>{results.length} sample results</Text>
   {results.map(job=><Card key={job.id}><Stack space="small"><Heading level="3">{job.title}</Heading><Text tone="secondary">{job.city}</Text></Stack></Card>)}
   {!results.length&&<Text>No sample roles match. Try a different title or city.</Text>}
   <Text size="small" tone="secondary">These are sample listings, not live vacancies.</Text>
  </Stack>
 </Box>;
}
createRoot(document.getElementById('root')).render(<BraidProvider theme={seekJobsTheme}><JobSearch/></BraidProvider>);

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

AI エージェント用プロンプト
seekJobs テーマを使って Braid の検索画面を構成し、Reset を先頭に置き、TextField のイベント状態を管理して、Actions でボタンをまとめます。単一のメイン検索ボタンには明示的に brandAccent の solid を指定し、リセットにはニュートラルな ghost を使います。空の検索も受け付け、エラーの理由を説明してください。通常の Button を無効化して検証を隠してはいけません。
05

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

独立した OpenDesign のリファレンスです。求人情報はオリジナルのサンプルで、実際の求人募集や応募送信機能はありません。指定された Braid の変数は、選択したテーマを通じて解決されます。