機能一覧Features
Parky Web版が提供するエンドユーザー向け機能のカタログです。
A catalog of end-user features offered by the Parky Web App.
検索と発見Search & discovery
| 機能 | Feature | 説明 | Description |
|---|---|---|---|
全文検索 (/search) | Full-text search (/search) |
Pagefind が生成する静的インデックスをクライアントから fetch して全文検索。駐車場・ハブ・シーン・メディア記事を横断検索する | Client-side full-text search over a static index built by Pagefind. Covers lots, hub pages, scenes, and media articles |
| 地図検索 | Map search | Mapbox 上で範囲ドラッグによる絞り込み | Drag-and-search within a Mapbox viewport |
| フィルタ | Filters | 料金帯・車種・屋根・24時間・EV等 | Price band, vehicle type, roof, 24h, EV, etc. |
| ソート | Sort | 仕様書の範囲では「安い順」「近い順」。レビュー順・評価順は UI レベルで検討中の項目で、実装有無はコンポーネント単位で確認すること | The spec calls out "cheapest" and "nearest". Rating-based sort is a UI-level idea and should be verified per component |
| シーン別LP | Scene landings | 花見・通勤・イベント等、目的別プリセット | Presets for cherry blossom, commute, event, etc. |
| AI検索 | AI search | 自然言語(テキスト or 音声入力)で駐車場を検索。LLM が条件をパースし、目的地・半径・料金・時刻・ソートを自動設定。Workers /v1/search/ai を呼び出す。目的地未指定時は聞き返しまたは現在地ボタンで補完 |
Search parking lots via natural language (text or voice). LLM parses conditions into destination, radius, price, time, and sort. Calls the Workers /v1/search/ai. Missing destination triggers a follow-up or current-location button |
到着予想時刻 (/api/route-eta) |
Arrival ETA (/api/route-eta) |
/search の入庫欄クイックボタン。現在地 → 目的地 の車移動時間を Mapbox Directions (driving-traffic プロファイル / 渋滞加味) で取得し、現在時刻に足して入庫時刻に自動投入する。目的地未指定 / 位置情報拒否 / API 失敗時は 30 分後にフォールバック。Cloudflare edge で 120 秒キャッシュ。 |
Quick-fill button on /search. Calls Mapbox Directions (driving-traffic profile, traffic-aware) with current location → destination, adds the duration to the current time, and populates the entry-time input. Falls back to now+30min if destination missing, geolocation denied, or the API fails. Cached on the Cloudflare edge for 120 seconds. |
| 追従検索バー | Sticky search bar | /search の検索バーは position: sticky でサイトヘッダ直下 (top 88px / 24px 余白) に追従固定。画面を占有しすぎないよう、追従開始時は入出庫時刻ブロックを自動で折りたたむ(アイコンで手動展開可)。スクロールがページ先頭に戻ったら自動展開。sentinel 境界と折りたたみ境界を分けてヒステリシスを持たせ、スクロール中のチラつきを防止。 |
The /search search bar is pinned below the site header (top: 88px, 24px breathing room) via position: sticky. The entry/exit time block auto-collapses when the bar sticks to avoid dominating the viewport (manual expand via icon). It auto-expands only when scroll returns near the top (scrollY < 20), giving hysteresis between the sticky threshold and the collapse threshold to prevent flicker. |
スポット情報Spot information
- 基本情報(住所・営業時間・収容台数・車種対応)
- Basics (address, hours, capacity, vehicle types)
- 料金表(時間帯別・曜日別)
- Pricing table (time / day of week)
- 設備情報(屋根・EV充電・精算機)
- Facilities (roof, EV charger, payment machines)
- ユーザーレビュー・星評価
- User reviews and star ratings
- 周辺駐車場の推薦
- Nearby lot recommendations
- 写真ギャラリー
- Photo gallery
エリアスポンサー表示Area sponsor display
- マップ上にカテゴリ別アイコン(SVG Canvas描画)でスポンサーを表示。飲食=赤、カフェ=紫、ショップ=青、観光=シアン等。
- Sponsor markers on map with category-colored SVG icons (restaurant=red, cafe=purple, shop=blue, attraction=cyan, etc.).
- 駐車場詳細ページ(
/spot/[id]/)に「おすすめスポット」横スクロールカード。サムネイル・カテゴリ・距離を表示。 - Parking detail page (
/spot/[id]/) shows sponsor cards in a horizontal scroll section with thumbnail, category, and distance. - 駅ハブページ(
/p/[pref]/[city]/[spot]/)にグリッド表示のスポンサーカードセクション。 - Station hub page (
/p/[pref]/[city]/[spot]/) shows sponsor cards in a grid layout. - データは PostGIS
nearby_sponsors()RPC で取得(ビルド時に SSG)。 - Data fetched via PostGIS
nearby_sponsors()RPC at build time (SSG).
ハブページ(地域階層)Hub pages (geographic tree)
- 都道府県 → 市区町村 → エリアの三階層
- Prefecture → city → area tree (3 levels)
- 各階層でビルド時に駐車場リストを事前生成(SEO重視)
- Each level is pre-rendered at build with its lot list for SEO
- 地図ミニビューを island として埋め込み
- Embeds a mini map island
メディア記事 (/media)Media articles (/media)
- Supabase
articlesテーブルで管理。駐車場ノウハウ、ドライブ、ニュース、EV、TOKYO CAR STORY の 5 カテゴリ - Managed via the Supabase
articlestable. Five categories: parking, drive, news, EV, and TOKYO CAR STORY - カテゴリ別一覧ページ
/media/category/[slug]/(drive / news / ev / parking) を SSG 生成 - Category listing pages
/media/category/[slug]/are generated via SSG - TOKYO CAR STORY 専用サブコーナー
/media/story/。話数はarticles.story_numberカラムで永続化(並び替えで番号がズレない) - TOKYO CAR STORY section at
/media/story/. Issue numbers are persisted inarticles.story_number(never drift when reordered) - 記事詳細の目次自動生成、関連記事、ハブへのクロスリンク
- Auto-generated TOC, related articles, and hub cross-links in article detail
- SEO: canonical / og:image / og:type="article" / Article JSON-LD / BreadcrumbList。
/media/story/には CollectionPage + ItemList JSON-LD - SEO: canonical / og:image / og:type="article" / Article JSON-LD / BreadcrumbList.
/media/story/also emits CollectionPage + ItemList JSON-LD
ニュースレター購読Newsletter subscription
/media/のフッター近くに購読フォーム。メールアドレスを送信するとnewsletter_subscribersテーブルに INSERT- Subscription form near the footer of
/media/. Submitting an email inserts a row intonewsletter_subscribers - SSG のため Astro API route は使わず、クライアントから Supabase REST に直 POST(anon キー、INSERT のみ RLS で許可)
- No Astro API route (SSG). Client posts directly to Supabase REST using the anon key; only INSERT is permitted by RLS
- 重複メールは
Prefer: resolution=merge-duplicatesで upsert 扱い、成功メッセージを表示 - Duplicate emails are upserted via
Prefer: resolution=merge-duplicatesand a success message is shown
モバイルアプリ連携(計画)Mobile app handoff (planned)
現状:
Current state:
Web 版とモバイルアプリの連携(スポットを「モバイルアプリで開く」ディープリンク、未導入時のストア誘導など)は仕様書にも実装にも現時点で定義されていません。将来の検討項目として扱ってください。
Web ↔ mobile handoff (deep links from a spot page into the app, store fallbacks, etc.) is not defined in the spec or the code today. Treat it as a future consideration.
多言語 (i18n)Internationalization
- 日本語 / 英語。英語版は
/en/*配下 - Japanese and English; English lives under
/en/* - hreflang タグを自動付与
- Auto-generated hreflang tags