# 画面設計書 11-About画面

## 概要

本ドキュメントは、GhosttyアプリケーションのAbout画面（バージョン情報ダイアログ）の設計仕様を定義する。About画面は、アプリケーションのバージョン、ビルド番号、コミット情報、および外部リンク（GitHub、ドキュメント）を表示するmacOS専用の情報表示画面である。

### 本画面の処理概要

About画面は、ユーザーにアプリケーションのメタ情報を提供し、関連リソースへのアクセスを可能にする画面である。

**業務上の目的・背景**：ターミナルエミュレータの利用者がアプリケーションのバージョンを確認したり、問題報告時にビルド情報を参照したりするために必要な画面である。また、GitHubリポジトリやドキュメントサイトへの導線を提供することで、ユーザーサポートとコミュニティ参加を促進する。macOSアプリケーションの標準的なAboutダイアログとして、Appleのガイドラインに沿った外観を提供する。

**画面へのアクセス方法**：メニューバーから「Ghostty > About Ghostty」を選択、またはシステム標準のキーボードショートカットでアクセス可能。AboutControllerがシングルトンパターンで管理し、show()メソッドでウィンドウを表示する。

**主要な操作・処理内容**：
1. アプリケーションアイコンの表示（クリックまたはホバーでアイコンバリエーションを切り替え）
2. アプリケーション名「Ghostty」と説明文の表示
3. バージョン情報（Version、Build、Commit）の表示
4. Docsボタン押下でドキュメントサイト（ghostty.org/docs）を外部ブラウザで開く
5. GitHubボタン押下でGitHubリポジトリページを外部ブラウザで開く
6. コミットハッシュのクリックで該当コミットページを外部ブラウザで開く
7. 著作権情報の表示

**画面遷移**：
- 遷移元：メインターミナルウィンドウ（メニューバーから）
- 遷移先：なし（情報表示のみ、外部URLは別ウィンドウで開く）

**権限による表示制御**：権限による制御は存在しない。すべてのユーザーが同一の画面を閲覧可能。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 37 | macOSアプリ | 主機能 | アプリケーションのバージョン、ビルド、コミット情報の表示 |
| 43 | バージョン表示 | 主機能 | バージョン情報の表示 |

## 画面種別

情報表示（ダイアログ）

## URL/ルーティング

macOSネイティブアプリケーションのため、URLルーティングは存在しない。AboutController.shared.show()メソッドで画面を表示する。

## 入出力項目

| 項目名 | 入出力 | データ型 | 必須 | 説明 |
|--------|--------|----------|------|------|
| なし | - | - | - | 入力項目なし（情報表示のみ） |

## 表示項目

| 項目名 | データ型 | ソース | 説明 |
|--------|----------|--------|------|
| アプリケーションアイコン | Image | Assets/App Icons | アニメーション付きアイコン表示（CyclingIconView） |
| アプリケーション名 | String | 固定値 | 「Ghostty」 |
| 説明文 | String | 固定値 | 「Fast, native, feature-rich terminal emulator pushing modern features.」 |
| Version | String | Bundle.main.infoDictionary["CFBundleShortVersionString"] | バージョン番号（例: 1.0.0） |
| Build | String | Bundle.main.infoDictionary["CFBundleVersion"] | ビルド番号 |
| Commit | String | Bundle.main.infoDictionary["GhosttyCommit"] | Gitコミットハッシュ（GitHubへのリンク付き） |
| 著作権情報 | String | Bundle.main.infoDictionary["NSHumanReadableCopyright"] | コピーライト表示 |

## イベント仕様

### 1-アイコンタップ

CyclingIconViewのonTapGestureにより、次のアイコンバリエーションに切り替え。AboutViewModelのadvanceToNextIcon()を呼び出す。

### 2-アイコンホバー

CyclingIconViewのonHoverにより、ホバー状態を管理。AboutViewModelのisHoveringプロパティを更新する。

### 3-Docsボタン押下

Environment(\\.openURL)を使用して、ghostty.org/docsを外部ブラウザで開く。

### 4-GitHubボタン押下

Environment(\\.openURL)を使用して、github.com/ghostty-org/ghosttyを外部ブラウザで開く。

### 5-Commitリンククリック

PropertyRowコンポーネントでLinkとして実装。クリック時にgithub.com/ghostty-org/ghostty/commits/{commit}を外部ブラウザで開く。

### 6-アイコン右クリック（コンテキストメニュー）

「Copy Icon Config」メニュー項目を表示。選択時に現在のアイコン設定（macos-icon = {iconName}）をクリップボードにコピー。

### 7-ウィンドウクローズ

AboutControllerのwindowWillClose通知によりAboutViewModelのstopCyclingIcons()を呼び出し、アイコンサイクリングを停止。

### 8-Escapeキー押下

AboutControllerのcancel(_:)が呼び出され、ウィンドウを閉じる。

## データベース更新仕様

### 操作別データベース影響一覧

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| なし | - | - | データベース操作なし（情報表示のみ） |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|-------------|------|---------------|----------|
| なし | - | - | メッセージ表示なし |

## 例外処理

| 例外状態 | 画面の振る舞い |
|---------|---------------|
| Bundle情報が取得できない | 該当項目を非表示（if letによるオプショナルバインディング） |
| GitHubコミットが空文字列 | Commit行を非表示 |
| 外部URLが無効 | ボタンを非表示（if let urlによる条件チェック） |

## 備考

- macOS専用画面（GTK版には対応するAbout画面は存在しない）
- VisualEffectBackgroundによりApple標準の「About My Mac」に似た半透明背景を実現
- アイコンサイクリング機能により、ユーザーはGhosttyの各種アイコンバリエーションをプレビュー可能
- テキスト選択が有効化されており、バージョン情報をコピー可能

---

## コードリーディングガイド

本画面を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

AboutViewModelがアイコンサイクリングの状態管理を担当し、Bundleのメタデータがバージョン情報の供給源となる。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | AboutViewModel.swift | `macos/Sources/Features/About/AboutViewModel.swift` | アイコンサイクリングの状態管理、currentIconとisHoveringプロパティ |

**読解のコツ**: SwiftUIの@Publishedプロパティラッパーを理解することで、状態変更がビューに自動反映される仕組みを把握できる。

#### Step 2: エントリーポイントを理解する

AboutControllerがウィンドウのライフサイクルを管理し、AboutViewをホストする。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | AboutController.swift | `macos/Sources/Features/About/AboutController.swift` | シングルトンパターン、ウィンドウ表示/非表示の制御 |

**主要処理フロー**:
1. **11-16行目**: windowDidLoad()でNSHostingViewにAboutViewをセット
2. **20-23行目**: show()でウィンドウ表示とアイコンサイクリング開始
3. **44-46行目**: windowWillClose()でアイコンサイクリング停止

#### Step 3: ビューレイヤーを理解する

AboutViewがSwiftUIビューとしてUIを構築し、CyclingIconViewがアイコン表示を担当する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | AboutView.swift | `macos/Sources/Features/About/AboutView.swift` | VStackによるレイアウト構成、Bundle情報の取得 |
| 3-2 | CyclingIconView.swift | `macos/Sources/Features/About/CyclingIconView.swift` | アイコンアニメーション、タップ/ホバーイベント処理 |

**主要処理フロー**:
- **10-13行目（AboutView.swift）**: Bundle.main.infoDictionaryからバージョン情報を取得
- **44-107行目（AboutView.swift）**: bodyプロパティでUI構造を定義
- **109-146行目（AboutView.swift）**: PropertyRowサブビューでバージョン情報行を表示

### プログラム呼び出し階層図

```
AboutController.shared.show()
    │
    ├─ NSHostingView(rootView: AboutView())
    │      │
    │      ├─ CyclingIconView
    │      │      └─ AboutViewModel.advanceToNextIcon()
    │      │
    │      ├─ PropertyRow (Version)
    │      ├─ PropertyRow (Build)
    │      ├─ PropertyRow (Commit) ─── Link → GitHub
    │      │
    │      ├─ Button("Docs") ─── openURL(docsURL)
    │      └─ Button("GitHub") ─── openURL(githubURL)
    │
    └─ AboutViewModel.startCyclingIcons()
```

### データフロー図

```
[入力]                    [処理]                         [出力]

Bundle.main              AboutView.body                  VStack Layout
.infoDictionary  ───▶    - version読み取り    ───▶       - CyclingIconView
                         - build読み取り                  - Text("Ghostty")
                         - commit読み取り                 - PropertyRow x3
                         - copyright読み取り              - Button x2
                                                         - Text(copyright)

AboutViewModel           CyclingIconView                 Image
.currentIcon     ───▶    - iconView(for:)     ───▶      (アニメーション付き)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| AboutView.swift | `macos/Sources/Features/About/AboutView.swift` | ソース | メインビュー（SwiftUI） |
| AboutController.swift | `macos/Sources/Features/About/AboutController.swift` | ソース | ウィンドウコントローラー |
| AboutViewModel.swift | `macos/Sources/Features/About/AboutViewModel.swift` | ソース | アイコンサイクリング状態管理 |
| CyclingIconView.swift | `macos/Sources/Features/About/CyclingIconView.swift` | ソース | アイコン表示ビュー |
| About.xib | `macos/Resources/About.xib` | リソース | NIBファイル（ウィンドウ定義） |
| Info.plist | `macos/Resources/Info.plist` | 設定 | バンドルメタデータ |
