<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>画面 on 設計書</title><link>https://Hitamuki.github.io/image-upload/design/ui/</link><description>Recent content in 画面 on 設計書</description><generator>Hugo</generator><language>ja</language><atom:link href="https://Hitamuki.github.io/image-upload/design/ui/index.xml" rel="self" type="application/rss+xml"/><item><title>画面一覧</title><link>https://Hitamuki.github.io/image-upload/design/ui/0_%E7%94%BB%E9%9D%A2%E4%B8%80%E8%A6%A7/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://Hitamuki.github.io/image-upload/design/ui/0_%E7%94%BB%E9%9D%A2%E4%B8%80%E8%A6%A7/</guid><description>&lt;h1 id="画面一覧"&gt;画面一覧&lt;a class="anchor" href="#%e7%94%bb%e9%9d%a2%e4%b8%80%e8%a6%a7"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;ID&lt;/th&gt;
 &lt;th style="text-align: left"&gt;画面名&lt;/th&gt;
 &lt;th style="text-align: left"&gt;URI&lt;/th&gt;
 &lt;th style="text-align: left"&gt;概要&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;a href="https://Hitamuki.github.io/image-upload/design/ui/scr001-upload/"&gt;SCR001&lt;/a&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;画像アップロード画面&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;/home&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;画像の選択・アップロード・閲覧を行う単一画面&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>画面共通仕様</title><link>https://Hitamuki.github.io/image-upload/design/ui/1_%E7%94%BB%E9%9D%A2%E5%85%B1%E9%80%9A%E4%BB%95%E6%A7%98/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://Hitamuki.github.io/image-upload/design/ui/1_%E7%94%BB%E9%9D%A2%E5%85%B1%E9%80%9A%E4%BB%95%E6%A7%98/</guid><description>&lt;h1 id="画面共通仕様"&gt;画面共通仕様&lt;a class="anchor" href="#%e7%94%bb%e9%9d%a2%e5%85%b1%e9%80%9a%e4%bb%95%e6%a7%98"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="トレーサビリティ"&gt;トレーサビリティ&lt;a class="anchor" href="#%e3%83%88%e3%83%ac%e3%83%bc%e3%82%b5%e3%83%93%e3%83%aa%e3%83%86%e3%82%a3"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="使い分け"&gt;使い分け&lt;a class="anchor" href="#%e4%bd%bf%e3%81%84%e5%88%86%e3%81%91"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;ID&lt;/th&gt;
 &lt;th style="text-align: left"&gt;目的&lt;/th&gt;
 &lt;th style="text-align: left"&gt;生成場所&lt;/th&gt;
 &lt;th style="text-align: left"&gt;有効期間&lt;/th&gt;
 &lt;th style="text-align: left"&gt;主な用途&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;trace_id&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;横断的トレーサビリティ&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Frontend (セッション開始時)&lt;/td&gt;
 &lt;td style="text-align: left"&gt;セッション全体&lt;/td&gt;
 &lt;td style="text-align: left"&gt;ログ集約・障害調査&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;request_id&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;操作的冪等性&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Frontend (各操作開始時)&lt;/td&gt;
 &lt;td style="text-align: left"&gt;単一操作&lt;/td&gt;
 &lt;td style="text-align: left"&gt;重複実行防止・キャンセル&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="trace_id-の生成と伝播"&gt;trace_id の生成と伝播&lt;a class="anchor" href="#trace_id-%e3%81%ae%e7%94%9f%e6%88%90%e3%81%a8%e4%bc%9d%e6%92%ad"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;用途&lt;/strong&gt;: ユーザーセッション全体の追跡、横断的なログ検索&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;生成&lt;/strong&gt;: アプリ初期化時に UUID v4 を一度だけ生成し、グローバル状態で保持&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;伝播&lt;/strong&gt;: 全APIリクエストヘッダー &lt;code&gt;X-Trace-ID&lt;/code&gt; に自動付与&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可視化&lt;/strong&gt;: 開発者ツールで表示し、障害調査時に CloudWatch Logs Insights で横断検索&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="request_id-の生成と管理"&gt;request_id の生成と管理&lt;a class="anchor" href="#request_id-%e3%81%ae%e7%94%9f%e6%88%90%e3%81%a8%e7%ae%a1%e7%90%86"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;用途&lt;/strong&gt;: 操作の重複防止、非同期処理のキャンセル、リトライ制御&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;生成&lt;/strong&gt;: 各操作開始時に UUID v4 を都度生成（ファイルアップロード、API呼び出しなど）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;管理&lt;/strong&gt;: 操作単位でローカルに管理し、処理完了まで保持&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;冪等性&lt;/strong&gt;: 同一操作の重複実行を防止するため、request_id を生成して管理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;キャンセル対応&lt;/strong&gt;: 非同期処理のキャンセル時に request_id を使用して処理を特定&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="プログレスバー"&gt;プログレスバー&lt;a class="anchor" href="#%e3%83%97%e3%83%ad%e3%82%b0%e3%83%ac%e3%82%b9%e3%83%90%e3%83%bc"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="アップロードプログレスバー"&gt;アップロードプログレスバー&lt;a class="anchor" href="#%e3%82%a2%e3%83%83%e3%83%97%e3%83%ad%e3%83%bc%e3%83%89%e3%83%97%e3%83%ad%e3%82%b0%e3%83%ac%e3%82%b9%e3%83%90%e3%83%bc"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class="mermaid"&gt;stateDiagram-v2
 [*] --&amp;gt; Idle: アップロード開始
 Idle --&amp;gt; Uploading: ファイル選択
 Uploading --&amp;gt; Processing: アップロード完了
 Uploading --&amp;gt; Error: エラー発生
 Processing --&amp;gt; Success: 処理完了
 Processing --&amp;gt; Error: エラー発生
 Error --&amp;gt; Idle: リトライ or キャンセル
 Success --&amp;gt; Idle: 完了&lt;/pre&gt;&lt;h3 id="プログレスバーの仕様"&gt;プログレスバーの仕様&lt;a class="anchor" href="#%e3%83%97%e3%83%ad%e3%82%b0%e3%83%ac%e3%82%b9%e3%83%90%e3%83%bc%e3%81%ae%e4%bb%95%e6%a7%98"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;表示条件&lt;/strong&gt;: ファイルアップロード時、API リクエスト時&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;進捗表示&lt;/strong&gt;: パーセンテージと残り時間を表示&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;キャンセル機能&lt;/strong&gt;: ユーザーがいつでもキャンセル可能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;エラー表示&lt;/strong&gt;: エラー発生時に詳細メッセージを表示&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="懸案事項"&gt;懸案事項&lt;a class="anchor" href="#%e6%87%b8%e6%a1%88%e4%ba%8b%e9%a0%85"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="技術的懸案"&gt;技術的懸案&lt;a class="anchor" href="#%e6%8a%80%e8%a1%93%e7%9a%84%e6%87%b8%e6%a1%88"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ブラウザ互換性&lt;/strong&gt;: AbortController の IE サポート&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ネットワーク切断&lt;/strong&gt;: オフライン時の処理方針&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="uiux-懸案"&gt;UI/UX 懸案&lt;a class="anchor" href="#uiux-%e6%87%b8%e6%a1%88"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;エラーメッセージ&lt;/strong&gt;: ユーザーフレンドリーなエラー表現&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;アクセシビリティ&lt;/strong&gt;: スクリーンリーダー対応&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="tbd"&gt;TBD&lt;a class="anchor" href="#tbd"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="機能仕様"&gt;機能仕様&lt;a class="anchor" href="#%e6%a9%9f%e8%83%bd%e4%bb%95%e6%a7%98"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;ファイルサイズ制限&lt;/strong&gt;: 具体的な上限値の決定&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;同時アップロード数&lt;/strong&gt;: 複数ファイル同時アップロードの制限&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;プレビュー機能&lt;/strong&gt;: アップロード前の画像プレビュー要否&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="技術仕様"&gt;技術仕様&lt;a class="anchor" href="#%e6%8a%80%e8%a1%93%e4%bb%95%e6%a7%98"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;CDN 対応&lt;/strong&gt;: 静的アセットの配信戦略&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;PWA 対応&lt;/strong&gt;: Service Worker の導入要否&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;監視体制&lt;/strong&gt;: エラーログ収集方法&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="セキュリティ仕様"&gt;セキュリティ仕様&lt;a class="anchor" href="#%e3%82%bb%e3%82%ad%e3%83%a5%e3%83%aa%e3%83%86%e3%82%a3%e4%bb%95%e6%a7%98"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;CSP ポリシー&lt;/strong&gt;: Content Security Policy の詳細&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;XSS 対策&lt;/strong&gt;: 入力値検証の範囲&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;CSRF 対策&lt;/strong&gt;: トークン管理方式&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="非同期処理の制御"&gt;非同期処理の制御&lt;a class="anchor" href="#%e9%9d%9e%e5%90%8c%e6%9c%9f%e5%87%a6%e7%90%86%e3%81%ae%e5%88%b6%e5%be%a1"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;キャンセル機構&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>画面メッセージ一覧表</title><link>https://Hitamuki.github.io/image-upload/design/ui/2_%E7%94%BB%E9%9D%A2%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E4%B8%80%E8%A6%A7%E8%A1%A8/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://Hitamuki.github.io/image-upload/design/ui/2_%E7%94%BB%E9%9D%A2%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E4%B8%80%E8%A6%A7%E8%A1%A8/</guid><description>&lt;h1 id="画面メッセージ一覧表"&gt;画面メッセージ一覧表&lt;a class="anchor" href="#%e7%94%bb%e9%9d%a2%e3%83%a1%e3%83%83%e3%82%bb%e3%83%bc%e3%82%b8%e4%b8%80%e8%a6%a7%e8%a1%a8"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;画面上に表示されるすべてのメッセージを管理する。&lt;code&gt;{変数名}&lt;/code&gt; は動的に置換される。&lt;/p&gt;
&lt;h2 id="共通メッセージ"&gt;共通メッセージ&lt;a class="anchor" href="#%e5%85%b1%e9%80%9a%e3%83%a1%e3%83%83%e3%82%bb%e3%83%bc%e3%82%b8"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;操作結果に応じて汎用的に使用するメッセージ。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;メッセージID&lt;/th&gt;
 &lt;th style="text-align: left"&gt;種別&lt;/th&gt;
 &lt;th style="text-align: left"&gt;メッセージテンプレート&lt;/th&gt;
 &lt;th style="text-align: left"&gt;変数&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;MSG-UI-C001&lt;/td&gt;
 &lt;td style="text-align: left"&gt;成功&lt;/td&gt;
 &lt;td style="text-align: left"&gt;{target}を登録しました&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;target&lt;/code&gt;: 対象名（例: 画像）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;MSG-UI-C002&lt;/td&gt;
 &lt;td style="text-align: left"&gt;成功&lt;/td&gt;
 &lt;td style="text-align: left"&gt;{target}を更新しました&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;target&lt;/code&gt;: 対象名&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;MSG-UI-C003&lt;/td&gt;
 &lt;td style="text-align: left"&gt;成功&lt;/td&gt;
 &lt;td style="text-align: left"&gt;{target}を削除しました&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;target&lt;/code&gt;: 対象名&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;MSG-UI-C004&lt;/td&gt;
 &lt;td style="text-align: left"&gt;エラー&lt;/td&gt;
 &lt;td style="text-align: left"&gt;通信エラーが発生しました。再度お試しください&lt;/td&gt;
 &lt;td style="text-align: left"&gt;—&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;MSG-UI-C005&lt;/td&gt;
 &lt;td style="text-align: left"&gt;エラー&lt;/td&gt;
 &lt;td style="text-align: left"&gt;サーバーエラーが発生しました。しばらくしてから再度お試しください&lt;/td&gt;
 &lt;td style="text-align: left"&gt;—&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="個別メッセージ"&gt;個別メッセージ&lt;a class="anchor" href="#%e5%80%8b%e5%88%a5%e3%83%a1%e3%83%83%e3%82%bb%e3%83%bc%e3%82%b8"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;メッセージID&lt;/th&gt;
 &lt;th style="text-align: left"&gt;種別&lt;/th&gt;
 &lt;th style="text-align: left"&gt;メッセージテンプレート&lt;/th&gt;
 &lt;th style="text-align: left"&gt;変数&lt;/th&gt;
 &lt;th style="text-align: left"&gt;発生条件&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;MSG-UI-001&lt;/td&gt;
 &lt;td style="text-align: left"&gt;エラー&lt;/td&gt;
 &lt;td style="text-align: left"&gt;対応していないファイル形式です&lt;/td&gt;
 &lt;td style="text-align: left"&gt;—&lt;/td&gt;
 &lt;td style="text-align: left"&gt;ファイル拡張子・MIMEタイプが許可リスト外&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;MSG-UI-002&lt;/td&gt;
 &lt;td style="text-align: left"&gt;エラー&lt;/td&gt;
 &lt;td style="text-align: left"&gt;ファイルサイズが上限（{maxSize}）を超えています&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;maxSize&lt;/code&gt;: 上限サイズ（例: 5MB）&lt;/td&gt;
 &lt;td style="text-align: left"&gt;ファイルサイズが上限超過&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;MSG-UI-003&lt;/td&gt;
 &lt;td style="text-align: left"&gt;エラー&lt;/td&gt;
 &lt;td style="text-align: left"&gt;アップロードがタイムアウトしました。再度お試しください&lt;/td&gt;
 &lt;td style="text-align: left"&gt;—&lt;/td&gt;
 &lt;td style="text-align: left"&gt;S3アップロード時のネットワークタイムアウト&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;MSG-UI-004&lt;/td&gt;
 &lt;td style="text-align: left"&gt;エラー&lt;/td&gt;
 &lt;td style="text-align: left"&gt;アップロードに失敗しました。URLの有効期限が切れている可能性があります&lt;/td&gt;
 &lt;td style="text-align: left"&gt;—&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Presigned URL有効期限切れ&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;MSG-UI-005&lt;/td&gt;
 &lt;td style="text-align: left"&gt;エラー&lt;/td&gt;
 &lt;td style="text-align: left"&gt;ファイルアクセス権限がありません&lt;/td&gt;
 &lt;td style="text-align: left"&gt;—&lt;/td&gt;
 &lt;td style="text-align: left"&gt;S3アクセス権限エラー&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;MSG-UI-006&lt;/td&gt;
 &lt;td style="text-align: left"&gt;警告&lt;/td&gt;
 &lt;td style="text-align: left"&gt;最大アップロード数に達しました&lt;/td&gt;
 &lt;td style="text-align: left"&gt;—&lt;/td&gt;
 &lt;td style="text-align: left"&gt;アップロード上限到達時&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;MSG-UI-007&lt;/td&gt;
 &lt;td style="text-align: left"&gt;エラー&lt;/td&gt;
 &lt;td style="text-align: left"&gt;署名付きURLの取得に失敗しました。再度お試しください&lt;/td&gt;
 &lt;td style="text-align: left"&gt;—&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Presigned URL取得レスポンスにuploadUrlまたはkeyが含まれない&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>画像アップロード画面</title><link>https://Hitamuki.github.io/image-upload/design/ui/scr001-upload/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://Hitamuki.github.io/image-upload/design/ui/scr001-upload/</guid><description>&lt;h1 id="画像アップロード画面"&gt;画像アップロード画面&lt;a class="anchor" href="#%e7%94%bb%e5%83%8f%e3%82%a2%e3%83%83%e3%83%97%e3%83%ad%e3%83%bc%e3%83%89%e7%94%bb%e9%9d%a2"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="id"&gt;ID&lt;a class="anchor" href="#id"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;scr001-upload&lt;/p&gt;
&lt;h2 id="関連仕様設計"&gt;関連仕様・設計&lt;a class="anchor" href="#%e9%96%a2%e9%80%a3%e4%bb%95%e6%a7%98%e8%a8%ad%e8%a8%88"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;種別&lt;/th&gt;
 &lt;th style="text-align: left"&gt;ドキュメント&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;要件&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;a href="https://Hitamuki.github.io/image-upload/requirements/req001-upload/"&gt;req001-upload&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;相互作用&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;a href="https://Hitamuki.github.io/image-upload/design/interaction/ia001-upload/"&gt;ia001-upload&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;API&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;a href="https://Hitamuki.github.io/image-upload/design/api/images/api001-upload/"&gt;api001-upload&lt;/a&gt; / &lt;a href="https://Hitamuki.github.io/image-upload/design/api/images/api002-upload/"&gt;api002-upload&lt;/a&gt; / &lt;a href="https://Hitamuki.github.io/image-upload/design/api/images/api003-upload/"&gt;api003-upload&lt;/a&gt; / &lt;a href="https://Hitamuki.github.io/image-upload/design/api/images/api004-upload/"&gt;api004-upload&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="概要"&gt;概要&lt;a class="anchor" href="#%e6%a6%82%e8%a6%81"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;hellip;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ユーザーがローカル端末から画像を選択・プレビューし、S3へアップロードする&lt;/li&gt;
&lt;li&gt;アップロード済み画像のファイル名一覧を表示し、選択した画像をプレビュー閲覧できる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="レイアウト"&gt;レイアウト&lt;a class="anchor" href="#%e3%83%ac%e3%82%a4%e3%82%a2%e3%82%a6%e3%83%88"&gt;#&lt;/a&gt;&lt;/h2&gt;


 
 
 &lt;img src="https://Hitamuki.github.io/image-upload/images/%E7%94%BB%E5%83%8F%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E7%94%BB%E9%9D%A2_hu_b975c7e0bc0b1922.png" alt="画像アップロード画面"&gt;
 


&lt;hr&gt;
&lt;h2 id="遷移"&gt;遷移&lt;a class="anchor" href="#%e9%81%b7%e7%a7%bb"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;単一画面（画面遷移なし）&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="項目"&gt;項目&lt;a class="anchor" href="#%e9%a0%85%e7%9b%ae"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;No&lt;/th&gt;
 &lt;th style="text-align: left"&gt;項目名&lt;/th&gt;
 &lt;th style="text-align: left"&gt;種類&lt;/th&gt;
 &lt;th style="text-align: left"&gt;説明&lt;/th&gt;
 &lt;th style="text-align: left"&gt;初期状態&lt;/th&gt;
 &lt;th style="text-align: left"&gt;制約&lt;/th&gt;
 &lt;th style="text-align: left"&gt;備考&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;1&lt;/td&gt;
 &lt;td style="text-align: left"&gt;画像選択ボタン&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Button / Input&lt;/td&gt;
 &lt;td style="text-align: left"&gt;ローカルからファイル選択ダイアログを開く&lt;/td&gt;
 &lt;td style="text-align: left"&gt;活性&lt;/td&gt;
 &lt;td style="text-align: left"&gt;アップロード済み5枚時はDisabled&lt;/td&gt;
 &lt;td style="text-align: left"&gt;上限到達時は項目4に「最大アップロード数に達しました」を表示&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;2&lt;/td&gt;
 &lt;td style="text-align: left"&gt;選択画像プレビュー&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Image&lt;/td&gt;
 &lt;td style="text-align: left"&gt;現在選択されている（未アップロード）画像のプレビュー&lt;/td&gt;
 &lt;td style="text-align: left"&gt;非表示&lt;/td&gt;
 &lt;td style="text-align: left"&gt;—&lt;/td&gt;
 &lt;td style="text-align: left"&gt;ファイル選択後に表示。アップロード完了後にクリア&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;3&lt;/td&gt;
 &lt;td style="text-align: left"&gt;アップロードボタン&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Button&lt;/td&gt;
 &lt;td style="text-align: left"&gt;S3へのアップロードとDB登録を開始する&lt;/td&gt;
 &lt;td style="text-align: left"&gt;非活性&lt;/td&gt;
 &lt;td style="text-align: left"&gt;画像未選択時はDisabled&lt;/td&gt;
 &lt;td style="text-align: left"&gt;—&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;4&lt;/td&gt;
 &lt;td style="text-align: left"&gt;ステータスメッセージ&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Text&lt;/td&gt;
 &lt;td style="text-align: left"&gt;成功・エラー・警告を表示する&lt;/td&gt;
 &lt;td style="text-align: left"&gt;空&lt;/td&gt;
 &lt;td style="text-align: left"&gt;—&lt;/td&gt;
 &lt;td style="text-align: left"&gt;アクション結果に応じて動的に更新&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;5&lt;/td&gt;
 &lt;td style="text-align: left"&gt;画像リスト&lt;/td&gt;
 &lt;td style="text-align: left"&gt;List&lt;/td&gt;
 &lt;td style="text-align: left"&gt;アップロード済みのファイル名を一覧表示する&lt;/td&gt;
 &lt;td style="text-align: left"&gt;画面表示時にDBから取得&lt;/td&gt;
 &lt;td style="text-align: left"&gt;—&lt;/td&gt;
 &lt;td style="text-align: left"&gt;画面初期表示時に api003 を呼び出す&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;6&lt;/td&gt;
 &lt;td style="text-align: left"&gt;ギャラリープレビュー&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Image&lt;/td&gt;
 &lt;td style="text-align: left"&gt;リストで選択されたアップロード済み画像のプレビュー&lt;/td&gt;
 &lt;td style="text-align: left"&gt;非表示&lt;/td&gt;
 &lt;td style="text-align: left"&gt;—&lt;/td&gt;
 &lt;td style="text-align: left"&gt;項目5のファイル名クリック時に api004 で取得したURLを表示&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="アクション"&gt;アクション&lt;a class="anchor" href="#%e3%82%a2%e3%82%af%e3%82%b7%e3%83%a7%e3%83%b3"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;No&lt;/th&gt;
 &lt;th style="text-align: left"&gt;アクション名&lt;/th&gt;
 &lt;th style="text-align: left"&gt;トリガー&lt;/th&gt;
 &lt;th style="text-align: left"&gt;処理概要&lt;/th&gt;
 &lt;th style="text-align: left"&gt;期待結果&lt;/th&gt;
 &lt;th style="text-align: left"&gt;API&lt;/th&gt;
 &lt;th style="text-align: left"&gt;備考&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;1&lt;/td&gt;
 &lt;td style="text-align: left"&gt;初期表示&lt;/td&gt;
 &lt;td style="text-align: left"&gt;画面表示時（自動）&lt;/td&gt;
 &lt;td style="text-align: left"&gt;アップロード済み画像のメタデータ一覧を取得&lt;/td&gt;
 &lt;td style="text-align: left"&gt;項目5にファイル名リスト表示&lt;/td&gt;
 &lt;td style="text-align: left"&gt;api003&lt;/td&gt;
 &lt;td style="text-align: left"&gt;—&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;2&lt;/td&gt;
 &lt;td style="text-align: left"&gt;ファイル選択&lt;/td&gt;
 &lt;td style="text-align: left"&gt;画像選択ボタン押下&lt;/td&gt;
 &lt;td style="text-align: left"&gt;ファイル形式・サイズをクライアントバリデーション後、プレビューを生成&lt;/td&gt;
 &lt;td style="text-align: left"&gt;項目2にプレビュー表示、項目3を活性化&lt;/td&gt;
 &lt;td style="text-align: left"&gt;—&lt;/td&gt;
 &lt;td style="text-align: left"&gt;バリデーション違反時は項目4にエラー表示(MSG-UI-001/MSG-UI-002)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;3&lt;/td&gt;
 &lt;td style="text-align: left"&gt;アップロード実行&lt;/td&gt;
 &lt;td style="text-align: left"&gt;アップロードボタン押下&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Presigned URL取得 → S3アップロード → メタデータ保存&lt;/td&gt;
 &lt;td style="text-align: left"&gt;項目4に成功メッセージ(MSG-UI-C001)表示、項目5のリスト更新&lt;/td&gt;
 &lt;td style="text-align: left"&gt;api001 → api002&lt;/td&gt;
 &lt;td style="text-align: left"&gt;完了後にアクション5を実行。失敗時はMSG-UI-C004/MSG-UI-C005を表示&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;4&lt;/td&gt;
 &lt;td style="text-align: left"&gt;リスト項目選択&lt;/td&gt;
 &lt;td style="text-align: left"&gt;項目5のファイル名クリック&lt;/td&gt;
 &lt;td style="text-align: left"&gt;選択画像の閲覧用Presigned URLを個別取得して表示&lt;/td&gt;
 &lt;td style="text-align: left"&gt;項目6にプレビュー表示&lt;/td&gt;
 &lt;td style="text-align: left"&gt;api004&lt;/td&gt;
 &lt;td style="text-align: left"&gt;初期表示時は取得しない（遅延取得）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;5&lt;/td&gt;
 &lt;td style="text-align: left"&gt;プレビュークリア&lt;/td&gt;
 &lt;td style="text-align: left"&gt;アップロード完了後（自動）&lt;/td&gt;
 &lt;td style="text-align: left"&gt;選択状態と項目2のプレビューをリセット&lt;/td&gt;
 &lt;td style="text-align: left"&gt;項目3を非活性化&lt;/td&gt;
 &lt;td style="text-align: left"&gt;—&lt;/td&gt;
 &lt;td style="text-align: left"&gt;アクション3の完了後に自動実行&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="バリデーションクライアントサイド"&gt;バリデーション（クライアントサイド）&lt;a class="anchor" href="#%e3%83%90%e3%83%aa%e3%83%87%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%82%af%e3%83%a9%e3%82%a4%e3%82%a2%e3%83%b3%e3%83%88%e3%82%b5%e3%82%a4%e3%83%89"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;アクション1（ファイル選択時）に実施する。違反時は項目4にエラーメッセージを表示し、リクエストを送信しない。&lt;/p&gt;</description></item></channel></rss>