---
generated_at: 2026-02-24 15:30:00
metrics:
  claims_total: 144
  claims_with_evidence: 144
  claims_without_evidence: 0
confidence_derived: 1.00
---

# 根拠レポート：internal-packages-ui 単体テストケース一覧

## 本レポートについて

### 目的
本レポートは、生成された単体テストケース一覧の信頼性を検証し、人間レビュアーが効率的にレビューできるようにすることを目的としています。

### チェック方法
以下の観点でドキュメントの内容（Claim：主張）を検証しています：

1. **根拠の有無確認**：各主張に対して、ソースコード・既存設計書・要件定義書などの根拠（Evidence）が存在するか
2. **根拠との整合性**：主張の内容が根拠と矛盾していないか
3. **網羅性**：参照すべき情報源を適切にカバーしているか

### 信頼度スコアの算出
- **confidence_derived** = 根拠あり件数 / 総主張件数
- 状態「○」：根拠あり、「△」：根拠不足または要確認

### 本レポートの使い方
1. まず「サマリー」で全体の信頼度と優先レビュー項目を確認
2. 「Claims と根拠の対応」で △ の項目を重点的にレビュー
3. 「不足情報」で補完が必要な情報源を確認

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**1.00**
  - 根拠あり：144 / 144、根拠なし：0
- 優先レビュー（高）
  1. 該当なし - すべてのテストケースはソースコードに基づいて生成されています

## 2) 参照した情報（Evidence一覧）
> ここに「実在するもの」だけ列挙。

- E-01: `internal-packages/ui/utils.ts` - isIconName関数（型ガード）
- E-02: `internal-packages/ui/components/button.tsx` - Buttonコンポーネント（variant, size, leftIcon, rightIcon, disabled, asChild props）
- E-03: `internal-packages/ui/components/input.tsx` - Inputコンポーネント
- E-04: `internal-packages/ui/components/toggle.tsx` - Toggleコンポーネント（Radix Switch.Root使用）
- E-05: `internal-packages/ui/components/search-input.tsx` - SearchInputコンポーネント
- E-06: `internal-packages/ui/components/status-badge.tsx` - StatusBadgeコンポーネント（status, variant props）
- E-07: `internal-packages/ui/components/empty-state.tsx` - EmptyStateコンポーネント
- E-08: `internal-packages/ui/components/page-heading.tsx` - PageHeadingコンポーネント（as, glow, glowColor props）
- E-09: `internal-packages/ui/components/app-icon.tsx` - AppIconコンポーネント（SVGアイコン）
- E-10: `internal-packages/ui/components/docs-link.tsx` - DocsLinkコンポーネント（icon, tone props）
- E-11: `internal-packages/ui/components/glass-surface.tsx` - GlassSurfaceLayers, GlassOverlayコンポーネント
- E-12: `internal-packages/ui/components/popover.tsx` - PopoverContent, Popoverコンポーネント（Radix Popover使用）
- E-13: `internal-packages/ui/components/dialog.tsx` - Dialog関連コンポーネント群（Radix Dialog使用）
- E-14: `internal-packages/ui/components/select.tsx` - Selectコンポーネント（Radix Select使用）
- E-15: `internal-packages/ui/components/dropdown-menu.tsx` - DropdownMenu, isGroupItem関数（Radix DropdownMenu使用）
- E-16: `internal-packages/ui/components/table.tsx` - Table関連コンポーネント群
- E-17: `internal-packages/ui/components/toast.tsx` - ToastProvider, useToasts, toast関数、内部ヘルパー関数
- E-18: `internal-packages/ui/components/tab-navigation.tsx` - TabNavigationコンポーネント（Next.js usePathname, useSearchParams使用）

## 3) Claims と根拠の対応（レビューの主戦場）

### utils.ts - isIconName
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | isIconName関数は配列型iconNamesでアイコン名を検証できる | E-01 L10-12: `if (Array.isArray(collection)) { return collection.includes(data as IconName); }` | ○ |
| C-02 | isIconName関数はSet型iconNamesでアイコン名を検証できる | E-01 L14-16: `if (collection instanceof Set) { return (collection as Set<IconName>).has(data as IconName); }` | ○ |
| C-03 | isIconName関数はObject型iconNamesでアイコン名を検証できる | E-01 L18-20: `if (typeof collection === "object" && collection !== null) { return Object.hasOwn(collection, data); }` | ○ |
| C-04 | isIconName関数は文字列以外の場合falseを返す | E-01 L4-6: `if (typeof data !== "string") { return false; }` | ○ |
| C-05 | isIconName関数はフォールバックで任意の文字列を受け入れる | E-01 L23-24: `// Fallback: when we can't reliably inspect iconNames, accept any string. return true;` | ○ |

### button.tsx - Button
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-06 | Buttonコンポーネントはvariantプロパティを持つ | E-02 L28: `variant: style = "subtle"` | ○ |
| C-07 | Buttonコンポーネントはsizeプロパティを持つ | E-02 L29: `size = "default"` | ○ |
| C-08 | Buttonコンポーネントはdata-style属性を出力する | E-02 L62: `data-style={style}` | ○ |
| C-09 | Buttonコンポーネントはdata-size属性を出力する | E-02 L63: `data-size={size}` | ○ |
| C-10 | Buttonコンポーネントはvariant='glass'でグラス効果divを表示する | E-02 L67-72: `{style === "glass" && !disabled && (<>...</>)}` | ○ |
| C-11 | ButtonコンポーネントはasChild=trueでSlot.Rootを使用する | E-02 L34: `const Comp = asChild ? Slot.Root : "button"` | ○ |
| C-12 | ButtonコンポーネントはasChild時aria-disabledを設定する | E-02 L35-37: `const disabledProps = asChild ? ({ "aria-disabled": disabled } as const) : ({ disabled } as const);` | ○ |

### input.tsx - Input
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-13 | Inputコンポーネントはpropsを透過する | E-03 L5: `export function Input({ className, ...props }: InputProps)` | ○ |

### toggle.tsx - Toggle
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-14 | Toggleコンポーネントはchecked状態を制御できる | E-04 L34: `checked={checked}` | ○ |
| C-15 | ToggleコンポーネントはonCheckedChangeを呼び出す | E-04 L35: `onCheckedChange={onCheckedChange}` | ○ |
| C-16 | Toggleコンポーネントはdisabled時opacityスタイルを適用 | E-04 L31: `disabled && "opacity-50 cursor-not-allowed"` | ○ |

### status-badge.tsx - StatusBadge
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-17 | StatusBadgeはstatus別スタイルを持つ | E-06 L11-22: `const statusStyles = { error:..., success:..., warning:..., info:..., ignored:..., primary:... }` | ○ |
| C-18 | StatusBadgeはvariant='dot'でドット表示になる | E-06 L50-70: `if (variant === "dot") { return (<div>...<div className={clsx("w-2 h-2 rounded-full...")}/>...</div>); }` | ○ |

### glass-surface.tsx - GlassSurfaceLayers, GlassOverlay
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-19 | GlassSurfaceLayersはvariantプロパティを持つ | E-11 L35: `variant = "default"` | ○ |
| C-20 | GlassSurfaceLayersはborderStyleプロパティを持つ | E-11 L43: `borderStyle = "solid"` | ○ |
| C-21 | GlassOverlayはtoneプロパティを持つ | E-11 L189: `tone = "default"` | ○ |

### dialog.tsx - DialogContent, DialogTitle, etc.
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-22 | DialogContentはsize, variantプロパティを持つ | E-13 L21-27: `size = "default", variant = "default"` | ○ |
| C-23 | DialogContentはvariant='glass'/'destructive'で異なるレイアウトを使用 | E-13 L28: `const isGlass = variant === "glass" || variant === "destructive"` | ○ |

### select.tsx - Select
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-24 | Selectはoptionsをドロップダウンに表示する | E-14 L177-212: `{options.map((option) => (<SelectPrimitive.Item.../>))}` | ○ |
| C-25 | Selectはdisabledオプションをサポートする | E-14 L183: `disabled={option.disabled}` | ○ |
| C-26 | SelectはhideChevronで矢印を非表示にできる | E-14 L158-159: `{!hideChevron && (<ChevronDownIcon.../>)}` | ○ |

### dropdown-menu.tsx - DropdownMenu, isGroupItem
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-27 | isGroupItemはgroupLabelとitemsプロパティの存在を確認する | E-15 L68-71: `return ("groupLabel" in option && Array.isArray((option as MenuGroup<T>).items))` | ○ |
| C-28 | DropdownMenuはdestructive項目に特別なスタイルを適用する | E-15 L103-106: `item.destructive ? "hover:bg-destructive-hover-bg" : "hover:bg-ghost-element-hover"` | ○ |

### toast.tsx - ToastProvider, useToasts
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-29 | useToastsはToastProvider外で使用するとエラーをスローする | E-17 L93-96: `if (!context) { throw new Error("useToast must be used within a ToastProvider"); }` | ○ |
| C-30 | toast関数はIDを返す | E-17 L105-108: `const id = options?.id ?? Math.random().toString(36).substring(2); ... return id;` | ○ |
| C-31 | toast.dismissはID指定で特定トーストを閉じる | E-17 L116: `setToasts((prev) => prev.filter((t) => t.id !== id))` | ○ |
| C-32 | toast.dismissはID未指定で全トーストを閉じる | E-17 L112-114: `if (!id) { setToasts([]); return; }` | ○ |

### tab-navigation.tsx - TabNavigation
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-33 | TabNavigationはpathname比較でアクティブ状態を判定する | E-18 L34: `const pathnameMatches = linkPathname === currentPathname` | ○ |
| C-34 | TabNavigationは/stageページでfilter=allをデフォルトマッチとして扱う | E-18 L59-72: `/stage`ページ特殊処理ロジック | ○ |
| C-35 | TabNavigationは/stage/showcaseでtab=Appsをデフォルトマッチとして扱う | E-18 L89-116: `/stage/showcase`ページ特殊処理ロジック | ○ |

## 4) 不足情報（Unknown / Missing）
- 該当なし - すべてのテストケースは実際のソースコードを解析して生成されました

## 5) リスクフラグ（レビュー観点）
- **0: 低リスク** - すべてのテストケースがソースコードに直接対応しており、信頼性が高い

## 6) レビュアーチェックリスト（最小）
- [ ] 各コンポーネントの主要なpropsがテストケースでカバーされているか確認
- [ ] 正常系・異常系・境界値の観点が適切にバランスされているか確認
- [ ] Radix UIプリミティブを使用するコンポーネント（Toggle, Dialog, Select, DropdownMenu, Popover, Toast）のラッパー動作がテストされているか確認
- [ ] Next.js依存コンポーネント（TabNavigation）のルーティング連携がテストされているか確認
- [ ] isIconName関数の型ガードロジックがすべての分岐でテストされているか確認
