尚未收集儲存庫資訊。
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
献立アプリ
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗家庭向けに、高タンパク・栄養バランス重視で旬の野菜を取り入れた夕食(主菜・副菜・汁物)を自動提案する Web アプリです。 Next.js(App Router)で作られており、Vercel にそのままデプロイできます。
npm install
npm run dev # http://localhost:3000
npm test # 自動テスト(vitest)
npm run build # 本番ビルド
スマートフォン向けの1カラム表示で、画面下部のタブで6つの画面を切り替えます。
| 画面 | パス | 内容 |
|---|---|---|
| A 今日の献立 | /(/?date=YYYY-MM-DD で任意の日) | 人数ボタン(1〜4人分)、主菜・副菜・汁物のカード(イメージ画像、ジャンル、調理方法、調理時間、1人あたりタンパク質、旬の野菜と理由・代替野菜、材料と分量(人数換算)、作り方)。上部に1人あたりタンパク質合計(ご飯含む)・目標達成率・材料費。「作った/作らなかった/この日を作り直す」ボタン |
| B 1週間カレンダー | /week | 先週/今週/来週の月〜日の献立一覧。魚の日🐟・パスタの日🍝・揚げ物の日🍤のバッジ。主菜のジャンル・調理方法の回数を棒グラフで可視化。品質チェックの結果一覧 |
| C 献立履歴 | /history | 日付ごとの記録(料理名・区分・ジャンル・調理方法・食材)。「実際に作った」チェック、削除、手動追加(表記揺れを吸収してマスタと照合)。14日以内の記録に「再提案しない期間」表示 |
| D 買い物リスト | /shopping | 人数ボタン(1〜4人分)、今週/来週の材料を食材ごとに合算(人数換算)。食材の種類別にまとめ、使う料理と日付を表示。購入済みチェック(保存される)。ご飯は米の合数に換算。調味料は折りたたみ |
| F 食材リスト | /pantry | 家にある食材をボタンで登録(「基本の調味料」「いつもある食材」をまとめて追加も可)。登録した食材で作れる料理を優先して提案し、買い物リストでは「家にある食材」として分けて表示。「この食材で献立を作り直す」ボタン |
| E 設定 | /settings | 人数(1〜4人分のボタン、初期値3人分)、1食の予算、目標タンパク質、1品の調理時間上限、苦手な食材、アレルギー食材、利用できる調理器具(電子レンジ・魚焼きグリル・オーブン・揚げ鍋) |
料理の「画像」は MVP ではタンパク源に応じた絵文字+ジャンル色のイメージ表示です(写真は今後の追加機能)。
MVP ではサーバー側 DB を持たず、料理マスタはコード内の初期データ、ユーザーデータは端末の localStorage に保存します(次回起動時も保持)。
型は src/lib/types.ts に定義しており、Vercel Postgres / Supabase へ移す場合も同じ構造でテーブル化できます。
Dish(src/lib/dishes.ts、153品:主菜69・副菜50・汁物34)| 項目 | 内容 |
|---|---|
| id | 料理ID(主菜 m***、パスタ p***、副菜 s***、汁物 u***) |
| name / normalizedName | 料理名 / 表記揺れを吸収した正規化名(重複登録防止に使用) |
| group | 類似料理グループ(例:麻婆豆腐と麻婆なす。同グループは同一料理として14日判定) |
| genre | 和食・中華・洋食 |
| category | 主菜・副菜・汁物 |
| method | 焼く・煮る・炒める・蒸す・揚げる・生食・和える |
| flavor | 味付け(しょうゆ・みそ・甘辛…)。1食の中で味が重ならないように使う |
| ingredients | 材料と分量(2人分) |
| steps | 作り方 |
| time | 調理時間(分) |
| equipment | 必要な調理器具 |
| isFish / isPasta / isFried | 魚料理・パスタ・揚げ物フラグ(材料・調理方法から自動設定) |
| mainIngredient | 主な食材 |
タンパク質量・旬の食材・材料費は保存せず、材料と 食材マスタ から計算します。
IngredientInfo(src/lib/ingredients.ts)食材名、種類、基本単位、1単位の重量、タンパク質(g/100g、食品成分表ベースの概算)、価格の目安、旬の月、旬以外は入手しにくいか、アレルゲン、代替食材、旬の理由。
HistoryEntry(localStorage kondate:v1:history)| 項目 | 内容 |
|---|---|
| date | 日付 |
| dishId | 料理ID(マスタにない手入力料理は null) |
| dishName | 料理名(手入力料理の重複判定に使用) |
| category | 料理区分 |
| servings | 人数 |
| made | 実際に作ったか |
| auto | 献立から自動記録したか |
WeekPlan(kondate:v1:plans):週の月曜日、日ごとの主菜・副菜・汁物ID、注意メモSettings(kondate:v1:settings)kondate:v1:shopping)提案(generator.ts)と検証(validator.ts)を分離しています。提案ロジックは候補を選ぶだけで、合否は必ずプログラムの検証で判定します。将来 AI 提案に差し替えても、同じ検証を通してから確定します。
履歴(作った料理)+保存済みの全週の献立を「食事の記録」として扱います(rules.ts の buildContext)。
同じ日・区分に履歴がある場合は履歴を優先し、「作らなかった」日の計画は数えません。
generatePlan)条件が競合した場合は 重複回避 → 揚げ物の頻度 → 魚料理週1回 を優先します。 魚料理・揚げ物・パスタの候補が無い場合(アレルギー設定や14日以内の重複)は通常の料理に切り替え、その理由を献立に表示します。 すべての候補が14日以内に使われている場合は、最も前に作った料理を再提案し「候補不足」を通知します。
validateWeek)| チェック | 重要度 |
|---|---|
| 過去14日以内の料理と重複していない | エラー |
| 揚げ物は14日間に1回まで | エラー |
| パスタは14日間に1回まで | エラー |
| 7日間に魚料理が1回以上 | エラー |
| 主菜・副菜・汁物がそろっている | エラー |
| 旬の野菜が使われている | エラー |
| タンパク質量が表示(計算)されている | エラー |
| 材料と作り方が具体的(分量あり・2手順以上) | エラー |
| アレルギー・苦手食材・調理器具・調理時間 | エラー |
| 1人あたりタンパク質が目標の8割以上 | 警告 |
| ジャンル・調理方法が偏っていない(同じものは週3回まで、3ジャンルすべて登場) | 警告 |
| 1食の予算内 | 警告 |
npm test
| ファイル | 内容 |
|---|---|
tests/data.test.ts | 料理マスタの整合性(ID・正規化名の重複なし、全材料が食材マスタにある、単位が正しい、作り方がある、主菜が1人15g以上、各区分の品数、全12か月で旬の料理が十分) |
tests/normalize.test.ts | 表記揺れ(「鶏の照り焼き」=「鶏肉の照焼き」など)と別料理の区別 |
tests/generator.test.ts | 1〜12月それぞれから8週間連続で生成して履歴に積み上げても必須条件をすべて満たす、パスタ・揚げ物が14日に1回のペース、揚げ鍋なし・アレルギー設定の反映、魚アレルギー時に理由を表示、1日だけ作り直しても他の日が変わらない、検証ロジックが違反(重複・揚げ物・パスタ・魚なし・汁物なし)を検出する |
tests/shopping.test.ts | 買い物リストの合算・人数換算・ご飯・表示形式 |
手動での確認手順: