Communitygithub.com

nkurunziza-saddy/surfaces

Web上の製品UIの素材を定義します。明暗モードに応じた正確なシャドウレシピ、境界線とシャドウの使い分け、強制カラーモード対応の透明境界線、同心円状の半径スケール、画像のアウトライン、ホバーや押下などすべてのインタラクティブ状態をサーフェスの変化として表現、アイコンセット(currentColor、アウトラインと塗り、ストローク調整)を提供します。

surfaces とは?

このスキルは、Web上の製品UIを構成するすべてのサーフェス(表面)を定義し、その見た目と振る舞いを一貫して決定します。フィル(塗り)、エッジ(縁)、シャドウ(影)、角丸の半径、インタラクティブ状態、アイコンの表現を、あらかじめ決められた少数のレシピから選択することで、画面上の異なる場所で矛盾したスタイルが生じるのを防ぎます。 このスキルは、まずサーフェスが必要かどうかを判断し、不要なコンテナを削除することから始めます。次に、ページ、レイズド(浮き上がり)、フローティング、オーバーレイの4段階のレベルから要素の役割に応じた適切なレベルを選びます。エッジは影か境界線のどちらかで描画し、両方は使いません。角丸は親子要素で同心円状になるように設計し、画像にはアウトラインを追加します。ホバー、押下、選択、無効、フォーカス可視の各状態はすべてサーフェスの変化として実装します。アイコンは1セットのみ使い、currentColorでストロークをテキストの太さに合わせます。 対応するプラットフォームやツールに依存せず、あらゆるWeb製品UIに適用可能な設計原則と実装パターンを提供します。SKILL.mdには具体的なトークンやルールへの参照が含まれており、開発者はそれらに従って一貫性のあるUIを構築できます。また、強制カラーモードやダークモードなど、アクセシビリティとモダンなデザイン要件にも対応しています。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/nkurunziza-saddy/hmm-interfaces/tree/HEAD/surfaces

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

サーフェス

このスキルは、各要素の素材、すなわち塗り、エッジ、影、半径、状態、アイコンを決定します。少数のレシピから選択するため、2つの画面で異なるカードが使われることはありません。

決定を行う前に、product-ui の §1(テイストジャーナルと優先順位)と §5(どのスキルが何を担当するか)を適用してください。

この順序で決定する

  1. サーフェスは必要か? 追加する前に削除する。周囲にスペースがある見出しにはカードは不要です。カードの中にカードを入れ子にしないでください。理由: コンテナが増えるごとに、目が読まなければならないエッジが増えます。
  2. どのレベルか? ページ、レイズド、フローティング、またはオーバーレイ。要素ごとに1レベルで、どれだけ目立たせたいかではなく、その要素が何をするかによって選択します。elevation.md。
  3. エッジは何で描くか? 高低差には影のリングを使います。構造には境界線を使います。1つのエッジに両方を同時に使わないでください。elevation.md。
  4. どの半径か? 要素の役割に対応するトークンを取得し、入れ子になった半径を同心円状にします。elevation.md。
  5. どの状態か? デフォルトを磨く前に、ホバー、押下、選択、無効、フォーカス可視をサーフェスの変化としてデザインします。states-and-icons.md。
  6. どのアイコン処理か? 1セット、currentColor、ストロークはテキストに合わせます。states-and-icons.md。
  7. マテリアルは許可されるか? スクロールするコンテンツの上に浮かぶクロームだけです。materials-and-edges.md。
  8. スクロールのエッジ。 区切り線、フェード、オーバースクロール。materials-and-edges.md。

4つのレベル

レベル用途ライトモードダークモード
ページ基本の背景基本の塗り、影なし最も暗い塗り、影なし
レイズドカード、コントロール、選択されたオプション白、リング + 1pxドロップ + 3pxタイトドロップ1段階明るく、白いリング、タイトな黒ドロップ
フローティングメニュー、ポップオーバー、ツールチップ、トースト白、リング + 1pxドロップ + 4pxタイトドロップ2段階明るく、白いリング、タイトな黒ドロップ
オーバーレイダイアログ、シート、コマンドパレット(スクリムとともに)白、リング + 1pxドロップ + 6pxタイトドロップ3段階明るく、白いリング、タイトな黒ドロップ

正確なトークンはelevation.mdにあります。その背後にあるルール:

  • リングとタイトドロップ。 ブラー ≤ 8px、オフセット ≤ 6px、ネガティブスプレッドのドロップ。理由: 大きくてソフトなブラーはグローに見え、ページを濁らせ、生成されたように見えます。
  • ダークモードでは明るくして高さを表現。 ダークでは影がほとんど見えないため、明るさが高さを伝え、低アルファの白いリングがエッジを伝えます。
  • 影は半透明で1色。 不透明なグレーはハローを残します。ダークドロップは黒のままです。
  • 同じレベルの兄弟要素は共有する。 1列のカードは、1つの影、1つの半径、1つのパディングを持ちます。
  • ホバーは塗りを変え、影は変えない。

参照不要のルール

  • 境界線は構造を、影は高低差を示す。 区切り線、入力フィールド、テーブルセル、選択状態は境界線を維持します。持ち上げるためにのみ存在するカードの境界線は、代わりにリングにします。
  • 影のリングの下に border: 1px solid transparent を維持する。 理由: 強制カラーモードでは影が削除され、境界線がエッジを描画し続けます。
  • 画像には1pxのインセットアウトライン: outline: 1px solid 黒10%(ダークでは白10%)、outline-offset: -1px。色付きの色合いは絶対に使わないでください(フリンジのように見えます)。ロゴや透過アートワークはスキップしてください。
  • 同心円状の半径。 外側 = 内側 + パディング(+ 境界線)、パディングが24pxまで。それを超えると、別々のサーフェスになります。
  • フォーカスはリングであり、決してなしではない。 :focus-visible は2pxのアクセントアウトラインを2pxのオフセットで表示します。フィールドでは2pxのアクセントエッジとして隙間なくぴったりと配置します。outline: none を代替なしで使うのはバグです。リングはレイアウトスペースを取りません。
  • 無効なコントロールはホバー、押下、スケールを受け付けない。
  • アイコン: サーフェスごとに1セット、currentColor、デフォルトはアウトライン、アクティブ時は塗りつぶし。ストロークは隣接するテキストの太さに追従し、400で1.5px、600で2pxまで。
  • 背後ブラーはフローティングクロームのみ。 コンテンツ、カード、テーブルには決して使わない。
  • スクロール可能なオーバーレイ(ダイアログ、ドロワー、メニュー)には overscroll-behavior: contain を設定する。

ペアの比較

悪い例良い例理由
カードに border: 1px solid #e5e5e5box-shadow: var(--elev-raised); border: 1px solid transparent高低差だけの境界線はリングになります。強制カラーでエッジを描画し続けます
box-shadow: 0 10px 40px rgba(0,0,0,.2)0 0 0 1px a.08, 0 1px 2px a.12, 0 4px 8px -4px a.16タイトで鮮明な方が大きくソフトなものより優れています
ダークカードに 0 8px 24px #000明るい塗りに加えて 0 0 0 1px oklch(1 0 0 / .08)ダークでは影が消えます。明るさが高さを示します
カード半径8、内側画像半径8、パディング8内側8、外側16同心円状の角は均等な隙間を保ちます
<img> が白いカードに溶け込むoutline: 1px solid oklch(0 0 0 / .1); outline-offset: -1px境界線なしでエッジが読み取れます
button:focus { outline: none }button:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px }キーボードユーザーが位置を把握できます
600ウェイトラベルの横に1.5pxアイコンストローク2pxストロークストロークの太さがステムの太さに一致します
すべてのツールバースロットに塗りつぶしアイコンデフォルトはアウトライン、アクティブのみ塗りつぶし塗りつぶしが状態シグナルです
カードに backdrop-filter: blur(20px)不透明なサーフェスブラーはスクロールコンテンツの上に浮かぶクロームに属します

終了前の確認

パターン修正
ライトUIでブラー > 8px またはアルファ > .2 の box-shadowレベルのトークンを使用する
border と box-shadow が同じ役割をしているリングと透明な境界線のみにする
影のリングに border: 1px solid transparent がない追加する
親要素とそのパディング付き子要素に同じ border-radius親には inner + padding を使用する
outline: none または outline: 0 で :focus-visible の代替がないリングを追加する
:focus(:focus-visibleではない)でリングをスタイリングしている:focus-visible に切り替える
状態によって border-width が変わる色、塗り、または同じ幅の透明な境界線にする
アイコンにハードコードされた fill="#…" または stroke="#…"currentColor にする
1つの画面に2つのアイコンライブラリがインポートされている1つにまとめる
スティッキーバー、サイドバー、フローティングメニュー以外での backdrop-filter削除する
overscroll-behavior: contain がないオーバーレイリスト追加する
スクローラーの端でのハードカット、または overflow: hidden でクリップされた影エッジをフェードする。スクローラーにパディングを追加する

ライトモードとダークモードを2倍でレンダリングし、各レベルの端を切り取って確認します。各コントロールでホバー、押下、Tabキーでフォーカス、選択、無効化を行い、前後でボックスサイズを比較します。強制カラーを切り替え(Chrome DevTools、レンダリングエミュレーション)、すべてのカードにまだエッジがあることを確認します。

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

nkurunziza-saddy/break

Stress-tests a piece of UI with worst-case data and every reachable state, then reports what broke with a numbered fix for each. Use it when the user types /break, or asks to "break this", "stress-test", "try the worst case", "what happens with long names", "check the empty and error states" or "find the edge cases" on a component or screen.

nkurunziza-saddy/layout

Structure and space in product UI on the web. It sets the spacing scale, grouping, alignment, density (compact or comfortable), hit areas, app shells (sidebar, toolbar, content, inspector), max widths, container-query responsiveness, dropdown and popover sizing, room for long and translated text, layout stability (no shift on load) and sticky elements that must not cover focus.

nkurunziza-saddy/motion

Builds motion for product UI on the web. It decides whether something should move at all, then why, which tool (CSS transition, WAAPI, Motion, spring), which properties, curve, duration, interruption, exit and reduced-motion path, and it writes the code. Also covers stagger and choreography, gestures (drag, flick, sheets), motion tokens and animation performance.

nkurunziza-saddy/pick-library

Picks the right library for a frontend task from a curated, status-checked list, instead of hand-rolling it or installing an abandoned package. Use it when the user asks "what should I use for…", "is there a library for…", or names a package, and when you are about to build a toast, command menu, drawer, date picker, table, virtual list, drag and drop, chart, OTP input, animated number, theme switch, form validation…

関連スキル