ss-feedback について
ss-feedback は、データに応じた UI のフィードバック状態を実装する StyleSeed スキルです。UI 開発者向けに、ローディング、空、エラー、成功の表示と、アニメーションや再試行の扱いを示します。
主な機能
- 01ローディングスケルトンの指針
- 02空状態の内容と次の操作
- 03再試行付きエラー表示
- 04成功・取り消しトーストのパターン
- 05モーション軽減設定への配慮
活用シーン
- 01データカードへの状態追加
- 02部分失敗やページ全体の失敗への対応
- 03トーストによる操作確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ bitjaru/ styleseed --skill ss-feedbackインストール後、Claude Code で/ss-feedbackを入力して読み込まれたか確認します。
詳細
このワークフローの前に、セッションごとに1回だけ実行する更新の事前チェックを実施してください。
UX フィードバック状態ジェネレーター
レジストリ優先のアーティファクト境界
.styleseed/project.json と .styleseed/artifacts/index.json が存在する場合は、まず要求されたアーティファクト ID を解決し、.styleseed/bundles/<artifact-id>.md と .styleseed/manifests/<artifact-id>.json のみを読み込んでください。レジストリを使用するプロジェクトでは、グローバルなレガシーバンドルにフォールバックしないでください。レガシープロジェクトでは、レジストリが存在しない場合に限り .styleseed/effective-rules.md を使用できます。
使用しない場合
- 状態内の文言だけを扱う場合 →
/ss-copyを使用 - 既存の状態のアクセシビリティに問題がある場合 →
/ss-a11yを使用 - 新しいコンポーネントを作成する場合 →
/ss-componentを使用 - アナリティクスやエラーロギングの仕組みの場合 — UI 表示のみを対象とします
対象:$ARGUMENTS
手順
-
対象ファイルを読み込み、データに依存するすべての領域を特定します。
-
デザイン言語のリファレンスを読み込みます:
DESIGN-LANGUAGE.mdの「Loading States (Skeleton)」「Empty States」「Error States」の各セクション
-
データに依存する領域ごとに、以下の4つの状態をすべて実装します:
状態 1:読み込み中(スケルトン)
// Skeleton must match the final layout shape
<div className="bg-card rounded-2xl p-6 shadow-[var(--shadow-card)]">
<div className="flex items-center gap-2 mb-3">
<div className="size-7 bg-surface-muted rounded-lg animate-pulse" />
<div className="h-3 w-16 bg-surface-muted rounded animate-pulse" />
</div>
<div className="h-9 w-24 bg-surface-muted rounded-lg animate-pulse mb-3" />
<div className="h-3 w-12 bg-surface-muted rounded animate-pulse" />
</div>
ルール:
- スケルトンを最低 300ms 表示します(ちらつきを防止)
- スケルトンの表示を 300ms 遅らせます(読み込みが速い場合はスケルトンを完全に省略)
animate-pulseを使用します(1.5s サイクル)- スケルトンの形状を実際のコンテンツの寸法に合わせます
- カード内ではスピナーを使用しないでください
状態 2:空(データなし)
<EmptyState
icon={PackageIcon}
title="No activity yet"
description="Create your first project to get started."
action={<Button>Create Project</Button>}
/>
ルール:
- カード内で中央揃えにします
- アイコン:32px、
text-text-tertiary - タイトル:14px、
text-text-secondary - 次のアクションを必ず提案します
- ゼロ値は「0」と表示します(非表示にしたり、ダッシュに置き換えたりしない)
状態 3:エラー(読み込み失敗)
<div className="flex flex-col items-center justify-center py-8 text-center">
<AlertCircle className="size-8 text-destructive mb-3" />
<p className="text-[14px] text-text-secondary mb-4">Couldn't load the data</p>
<Button variant="brandGhost" size="sm" onClick={retry}>Try again</Button>
</div>
ルール:
- 部分的な失敗:影響を受けたカードのみエラーを表示し、ほかは通常どおり読み込みます
- ページ全体の失敗:再試行機能付きの全画面 EmptyState を表示します
- エラーメッセージ:平易な言葉を使い、システムに原因があることを明確にします
- 必ず再試行ボタンを用意します
状態 4:成功(アクションのフィードバック)
// Toast notification for action confirmations
toast("Changes saved")
// With undo for destructive actions
toast("Item deleted", { action: { label: "Undo", onClick: handleUndo } })
ルール:
- 情報トースト:3s 表示
- アクショントースト(元に戻す機能付き):5s 表示
- トーストの位置:BottomNav の上
- トーストは一度に1つだけ表示します(新しいトーストで古いものを置き換えます)
- 実装パターン:
function DataCard({ data, isLoading, error }) {
if (isLoading) return <DataCardSkeleton />
if (error) return <DataCardError onRetry={refetch} />
if (!data || data.length === 0) return <DataCardEmpty />
return <DataCardContent data={data} />
}
prefers-reduced-motionを確認し、動きを抑える設定が優先されている場合はanimate-pulseを無効にします。
コメント
Markdown 対応