Make Interfaces Feel Better

Details that make interfaces feel better — 小さなデザインエンジニアリング判断の Agent Skill

1 — 概要

Make Interfaces Feel Better は、Details that make interfaces feel better をもとにした Agent Skill。UI コンポーネント実装、フロントエンドレビュー、アニメーション調整のとき、エージェントが「それっぽいが少しズレている」箇所を具体的な CSS / Tailwind パターンで直せるようにする。

単一の巨大ルールブックではなく、SKILL.md が入口で、タイポグラフィ・サーフェス・アニメーション・パフォーマンスの 4 参照ファイルに詳細が分割されている。

16Core principles
4Reference files
40×40Min hit area (px)
0.96Press scale (fixed)
前提: 良い UI は 1 つの魔法ではなく、角丸の同心、影のレイヤー、割り込み可能な transition、段階的 enter などが積み重なって成立する。スキルはその積み上げをレビュー出力まで含めて標準化する。
2 — 導入

配布は npx skills add が中心。インストール後は UI 作業時に自動適用され、手動ではスラッシュコマンドでも呼べる。

npx skills add jakubkrehel/make-interfaces-feel-better

/make-interfaces-feel-better

トリガー例: UI polish、design details、「make it feel better」、「feels off」、stagger animations、border radius、optical alignment、tabular numbers、image outlines、box shadows など。

3 — スキル構成
ファイル扱う領域主なトピック
SKILL.md入口・原則一覧16 原則、Common Mistakes、Review Checklist、出力形式
typography.md文字組みtext-wrap: balance/pretty、font smoothing、tabular-nums
surfaces.md面・深度同心 border-radius、光学配置、shadow-as-border、image outline、hit area
animations.md動きinterruptible transition、stagger enter、exit、icon cross-fade、scale on press
performance.mdGPU / transitiontransition: all 禁止、will-change の使い分け
4 — 16 のコア原則(要約)

1. 同心 border-radius

外半径 = 内半径 + padding。ネストした角丸の不一致は「なんか変」の典型。

2. 光学配置

幾何中心ではなく見た目の中心。アイコン付きボタンや再生三角は手動調整。

3. 影で深度

カードやボタンの縁は透明な box-shadow レイヤー。区切り線は border のまま。

4. 割り込み可能な animation

hover / toggle は CSS transition。keyframes は一度きりの enter 向け。

5. Split & stagger enter

大きな 1 コンテナではなく意味単位に分け、約 100ms ずつ遅延。

6. 控えめな exit

固定 translateY(-12px) 程度。enter より短く、視線を奪わない。

7. 文脈アイコン animation

scale 0.25→1、opacity、blur 4px→0。spring の bounce は常に 0。

8–10. タイポ 3 点

macOS で antialiased、動的数値に tabular-nums、見出しは balance / 本文は pretty。

11. 画像 outline

ライト rgba(0,0,0,0.1)、ダーク rgba(255,255,255,0.1) のみ。slate/zinc 系禁止。

12. Press scale

常に scale(0.96)。0.95 未満は大げさ。static で無効化可。

13. 初回 load で animate しない

AnimatePresence initial={false} — ただし意図的 hero enter は例外。

14–15. Performance

transition: all 禁止。プロパティを列挙。will-change は stutter 確認後のみ。

16. Hit area

最小 40×40px。見た目が小さければ疑似要素で拡張。重なりは避ける。

outerRadius = innerRadius + padding
5 — Typography
シナリオ指定理由
見出し・短いタイトルtext-wrap: balance行長を均等化(6 行以下が対象)
段落・UI テキストtext-wrap: pretty末尾の orphan を避ける(長さ制限なし)
長文・コードデフォルトbalance は長文で無視される

Font smoothing & tabular numbers

macOS では html { -webkit-font-smoothing: antialiased; } を root に 1 回。カウンタ・価格・タイマーなど更新される数字は font-variant-numeric: tabular-nums(Tailwind: tabular-nums)で桁幅を固定し、layout shift を防ぐ。

6 — Surfaces

カードやボタンの「縁」には、3 層の透明 shadow 変数(1px ring + lift + ambient)を使う。ダークモードでは白 1px ring に簡略化。リスト区切りやフォーム outline は border を維持する。

影を使うborder を使う
カード、ドロップダウン、浮き上がるボタンリスト区切り、テーブル罫線、入力 outline
背景色が混在する UIレイアウト上の separator

画像は outline + outline-offset: -1px で layout に影響させず縁取り。色は pure black / pure white の 10% opacity のみ。

7 — Animations
CSS transitionCSS keyframes
割り込み可 — 最新 state へ再補間不可 — 先頭からやり直し
用途hover、toggle、drawer初回 enter、loading シーケンス

Icon cross-fade(Motion なし)

package.json に motion / framer-motion が無い場合、両アイコンを DOM に残し absolute で重ね、cubic-bezier(0.2, 0, 0, 1) で opacity / scale / blur を cross-fade する。値は scale 0.25、blur 4px を厳守。

Enter / exit のタイミング

  • Enter: 意味块ごとに opacity + translateY(12px) + blur(4px)、stagger ~100ms
  • Exit: translateY(-12px) 程度、150ms 前後 — enter より短く
  • Press: active:scale-[0.96] + transition-transform
8 — Performance

transition: all および Tailwind の bare transition は禁止。変化するプロパティだけ列挙する(例: transition-[scale,opacity,filter])。

プロパティGPU 合成will-change
transform, opacity, filterYes初回 stutter が見えたときのみ
width, background-colorNo効果薄 — 付けない
注意: will-change: all は禁止。レイヤー増加でメモリコストが上がるため、先回りで全要素に付けない。
9 — レビュー出力

変更提案は必ず Markdown 表形式。Before / After 列を持ち、原則ごとに見出しを付けてグループ化する。変更が無い原則は表ごと省略する。

BeforeAfter
rounded-xl on card + inner button (p-2)card rounded-2xl (12+8), inner rounded-lg
<span>{count}</span>className="tabular-nums" on counter
scale(0.9) on pressscale(0.96) — 0.95 未満は大げさ

Review Checklist(14 項目)は SKILL.md 末尾。ネスト角丸、光学配置、shadow、stagger enter、tabular-nums、hit area などを機械的に確認する。