目的・役割

ユーザーが投票・閲覧できるランキングを発見する起点画面。受付中(active)と終了済(ended)を切り替えて表示。

UI 構成

要素種類説明
NavigationBar固定タイトル「ランスタ」、右上に通知ベル
フィードPickerPicker (segmented)「受付中 / 終了済」切り替え
ランキングカードリストListRankingCardView(後述のレイアウト刷新版)
RankingCardView レイアウトVStack ・右上に大きめランクバッジ(32px円、Sは虹グラデ、A〜Gは色分け)
・投票タイプバッジ(シングル: グレー / TOP3: 淡い緑 GRN002)をタグ群の上部に配置
・大タグ・小タグを別行で表示(縦並び)
・左下に作成者アイコン + 表示名(匿名投稿時は「匿名」表記に切替)
・クイズ通過バッジは hasQuiz=true の場合のみ表示
未読バッジNotificationBadge通知ベルアイコン上部
引き下げリフレッシュrefreshable最新化トリガー
バナー広告共通配置MainTabView の safeAreaInset(.bottom) でタブバー直上に配置されるため、ホーム個別の広告領域は持たない(プレミアム時は非表示)

状態

状態表示内容
初期表示ローディングインジケータ
データありランキングカードリスト
データなし「現在表示できるランキングはありません」
ネットワークエラー「再読み込み」ボタン付きエラー表示

遷移

操作遷移先
カードタップRankingDetailView
通知ベルタップNotificationListView
Pickerで Active/Ended 切替同画面でリスト再読込

使用するデータモデル

Ranking {
    let id: UUID
    var title: String
    var majorTag: String
    var voteCount: Int
    var voteTier: VoteTier  // G〜S
    var status: RankingStatus  // active / ended
    var startsAt: Date
    var endsAt: Date
}

実装メモ

関連

変更履歴

バージョン日付変更内容
1.02026-05-09初版作成
1.12026-05-10RankingCardView レイアウト刷新(右上ランクバッジ・投票タイプバッジ・タグ縦並び・作成者表示・クイズ通過バッジ条件表示)/バナー広告を MainTabView 共通配置へ移動/scenePhase=.active 復帰時のログインボーナス判定を追記