WallpaperMachine
당신이 사랑하는 배경화면, 맥에서 새롭게 만나보세요
저장소 정보는 아직 수집하지 않았습니다.
아직 감지된 업데이트가 없습니다. 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 | 買い物リストの合算・人数換算・ご飯・表示形式 |
手動での確認手順: