広報Web 仕様書
蒼翔祭の広報用 Web サイト(packages/web/soshosai-promotion)の仕様書です。
本書はコードから機械的に確認できる事実のみを記載した初版です。設計意図・運用ルール・今後の方針は広報用Webチームによる追記が必要です。空の節はそのために残してあります。
1. システム概要
1.1 目的
1.2 技術スタック
| 区分 | 採用技術 |
|---|---|
| フレームワーク | Next.js(App Router) |
| 言語 | TypeScript |
| UI | React |
| コンポーネント | Radix UI(accordion / dialog / navigation-menu / separator / slot) |
| スタイル | Tailwind CSS(tailwind-merge, class-variance-authority) |
| アイコン | lucide-react |
| 日本語の改行制御 | budoux |
他パッケージが Cloudflare Workers 中心であるのに対し、本パッケージは Next.js アプリである点が異なります。
1.3 パッケージ名
@soshosai/web-soshosai-promotion
2. 画面構成
src/app 配下のルーティングは以下のとおりです。
| パス | ファイル | 内容 |
|---|---|---|
/ | src/app/page.tsx | |
/event | src/app/event/page.tsx | |
/information | src/app/information/page.tsx | |
/reservation | src/app/reservation/page.tsx | |
/sponsor | src/app/sponsor/page.tsx | |
/visitor | src/app/visitor/page.tsx | |
/contact | src/app/contact/page.tsx | |
/privacy | public/privacy.html | プライバシーポリシー。App Router のページではなく静的 HTML |
/privacy は Workers Static Assets の html_handling: auto-trailing-slash が、拡張子の無いパスを privacy.html に当てて返します。静的書き出しでは rewrites() が使えないため、#894 で削除しました。
3. 設定
3.1 画像
next.config.ts は output: 'export'(静的書き出し)で、images.unoptimized: true です。
- 静的書き出しには Next.js の画像最適化サーバーが無いため、画像は
public/のファイルをそのまま配信します - 軽量化は、
public/に置く前に WebP へ変換しておくことで行います
3.2 middleware
middleware.ts はありません。静的書き出しでは middleware が動かないため、#894 で削除しました。
公開日時で表示を切り替えるゲート(RELEASE_UTC_TS)も、あわせて廃止しています(TBD-001)。
3.3 OGP 画像
public/images/ogp.jpg(1200x630)を、Open Graph と X(Twitter)カードの共有画像に使います。
- 公式テーマロゴ
public/images/soshosai-theme-logo-2026.webpと、テーマカラー、開催日を合成したものです - 開催日やロゴが変わったときは作り直してください
4. コマンド
| コマンド | 用途 |
|---|---|
pnpm dev | 開発サーバー起動 |
pnpm build | 静的書き出し(./out) |
pnpm preview | 書き出した ./out を wrangler dev で配信して確認 |
pnpm deploy / pnpm deploy:stg / pnpm deploy:preprod | 各環境へデプロイ(通常は CI が実行する) |
pnpm lint / pnpm lint:fix | Lint |
pnpm typecheck | 型チェック |
5. デプロイ
Worker 2026-promotion(assets-only の Workers Static Assets)として、他の Worker と同じ deploy-*.yml から配信します。
- デプロイの起点
- 他の Worker と同じです。
docs/files/guides/deploy-pipeline.mdを参照してください
- 他の Worker と同じです。
- 環境と公開先
- production:
soshosai.com(切替前は routes 無し。下記) - staging:
promo.stg.soshosai.com - preproduction:
promo.preprod.soshosai.com
- production:
- stg / preprod の検索除外
deploy:stg/deploy:preprodは、scripts/write-noindex-headers.mjsでout/_headersにX-Robots-Tag: noindexを書いてからデプロイします- 本番の
deployはこれを呼びません
- 本番ドメインの切替
soshosai.comは、旧リポジトリの Pages プロジェクト2025-promotionがまだ握っています- 切替手順は
docs/files/guides/deploy-pipeline.mdの「広報Web の cutover」にあります
6. 非機能要件
7. 決定ログ
本システムの要確定事項と、その決着状況を一覧で管理する。表の形式は全システム共通(.agents/skills/edit-specification/SKILL.md「決定ログの書式」を参照)。
状態 は 未確定 / 保留 / 決定済み / 対象外 のいずれかを取る。
| ID | 分類 | 判断が必要な内容 | 状態 | 期限 | 結論 |
|---|---|---|---|---|---|
| TBD-001 | middleware | 公開日時ゲート(RELEASE_UTC_TS)を復活させるか、恒久的に削除するか | 決定済み | — | 削除。静的書き出しでは middleware が動かないため、#894 で middleware.ts ごと削除した |