リクエスト詳細
✨ 既存アプリの改善
対応完了
対象アプリ: レシピ缶詰メーカー
レシピカードへの「サービング人数」切り替え機能の追加
## 1. 目的
現在のレシピ詳細モーダルは材料の分量が固定(例:2人前)で表示されるため、一人暮らしユーザーが半量に計算し直す手間が発生している。モーダル内に人数セレクター(1〜6人)を設け、選択した人数に応じて材料の分量をリアルタイムで換算表示することで、使い勝手を大幅に向上させる。
## 2. 具体的な仕様
### データ側(data/recipes.php)
- 各レシピに `"servings": 2`(基準人数、整数)フィールドを追加する。既存レシピには一律 `2` をデフォルト値として設定する。
- 各材料の `amount` フィールドは現状のまま文字列で保持する(例:`"豚バラ肉 200g"`)。
- 分量の数値部分(整数・小数)を正規表現で抽出し、人数比で乗算後、小数点以下1桁で丸めて再挿入するユーティリティ関数を JS 側に実装する。
### モーダル UI
- `modal-head` 内の `modal-meta` 付近に人数セレクターを追加する。
```html
<label class="servings-label">
<span>🍽 人数</span>
<select id="modal-servings">
<option value="1">1人前</option>
<option value="2" selected>2人前</option>
<option value="3">3人前</option>
<option value="4">4人前</option>
<option value="5">5人前</option>
<option value="6">6人前</option>
</select>
</label>
```
- セレクターの `change` イベントで `#modal-ingredients` の各 `<li>` を再描画する。
- モーダルを開くたびにセレクターをレシピの基準人数(`servings`)にリセットする。
### JS 実装(assets/recipe.js)
```js
// 分量換算ユーティリティ
function scaleAmount(text, baseServings, targetServings) {
if (baseServings === targetServings) return text;
var ratio = targetServings / baseServings;
return text.replace(/(\d+\.?\d*)/g, function(_, n) {
var scaled = parseFloat(n) * ratio;
// 整数に近ければ整数で返す
var rounded = Math.round(scaled * 10) / 10;
return rounded % 1 === 0 ? String(Math.round(rounded)) : String(rounded);
});
}
// renderModalIngredients(recipe, userIngredients, servings) を新規作成
// 既存の材料描画ロジックを関数化し、servings を引数で受け取る
// openModal 時: targetServings = recipe.servings(基準値)でセレクター初期化
// change イベント時: targetServings = parseInt(modal-servings.value)
```
### CSS(assets/recipe.css)
```css
.servings-label {
display: flex; align-items: center; gap: 8px;
font-size: 13px; font-weight: 700; white-space: nowrap;
}
.servings-label select {
width: auto; min-width: 90px; font-size: 14px;
border-color: var(--rc-orange); accent-color: var(--rc-orange);
}
```
## 3. 既存機能との整合
- レシピデータ(`data/recipes.php`)の構造に `servings` フィールドを追加するだけで、既存のマッチング・フィルター・お気に入り・履歴・買い足しリスト機能には一切影響しない。
- `servings` フィールドが未定義のレシピは `recipe.servings || 2` でフォールバックし後方互換を保つ。
- 換算はモーダル表示時のみのインメモリ処理であり、LocalStorage やサーバー側データは変更しない。
- スマホ・PC 両対応:セレクターは既存の `modal-head` flex レイアウト内に収まるよう `flex-wrap: wrap` を維持する。
現在のレシピ詳細モーダルは材料の分量が固定(例:2人前)で表示されるため、一人暮らしユーザーが半量に計算し直す手間が発生している。モーダル内に人数セレクター(1〜6人)を設け、選択した人数に応じて材料の分量をリアルタイムで換算表示することで、使い勝手を大幅に向上させる。
## 2. 具体的な仕様
### データ側(data/recipes.php)
- 各レシピに `"servings": 2`(基準人数、整数)フィールドを追加する。既存レシピには一律 `2` をデフォルト値として設定する。
- 各材料の `amount` フィールドは現状のまま文字列で保持する(例:`"豚バラ肉 200g"`)。
- 分量の数値部分(整数・小数)を正規表現で抽出し、人数比で乗算後、小数点以下1桁で丸めて再挿入するユーティリティ関数を JS 側に実装する。
### モーダル UI
- `modal-head` 内の `modal-meta` 付近に人数セレクターを追加する。
```html
<label class="servings-label">
<span>🍽 人数</span>
<select id="modal-servings">
<option value="1">1人前</option>
<option value="2" selected>2人前</option>
<option value="3">3人前</option>
<option value="4">4人前</option>
<option value="5">5人前</option>
<option value="6">6人前</option>
</select>
</label>
```
- セレクターの `change` イベントで `#modal-ingredients` の各 `<li>` を再描画する。
- モーダルを開くたびにセレクターをレシピの基準人数(`servings`)にリセットする。
### JS 実装(assets/recipe.js)
```js
// 分量換算ユーティリティ
function scaleAmount(text, baseServings, targetServings) {
if (baseServings === targetServings) return text;
var ratio = targetServings / baseServings;
return text.replace(/(\d+\.?\d*)/g, function(_, n) {
var scaled = parseFloat(n) * ratio;
// 整数に近ければ整数で返す
var rounded = Math.round(scaled * 10) / 10;
return rounded % 1 === 0 ? String(Math.round(rounded)) : String(rounded);
});
}
// renderModalIngredients(recipe, userIngredients, servings) を新規作成
// 既存の材料描画ロジックを関数化し、servings を引数で受け取る
// openModal 時: targetServings = recipe.servings(基準値)でセレクター初期化
// change イベント時: targetServings = parseInt(modal-servings.value)
```
### CSS(assets/recipe.css)
```css
.servings-label {
display: flex; align-items: center; gap: 8px;
font-size: 13px; font-weight: 700; white-space: nowrap;
}
.servings-label select {
width: auto; min-width: 90px; font-size: 14px;
border-color: var(--rc-orange); accent-color: var(--rc-orange);
}
```
## 3. 既存機能との整合
- レシピデータ(`data/recipes.php`)の構造に `servings` フィールドを追加するだけで、既存のマッチング・フィルター・お気に入り・履歴・買い足しリスト機能には一切影響しない。
- `servings` フィールドが未定義のレシピは `recipe.servings || 2` でフォールバックし後方互換を保つ。
- 換算はモーダル表示時のみのインメモリ処理であり、LocalStorage やサーバー側データは変更しない。
- スマホ・PC 両対応:セレクターは既存の `modal-head` flex レイアウト内に収まるよう `flex-wrap: wrap` を維持する。
💬 返信 (3)
🛠 開発を開始しました (機能追加 recipe-cannery)
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
📝 開発が完了しました
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
✅ リリース完了のお知らせ
ご要望いただいた「レシピ缶詰メーカー」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=recipe-cannery
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/recipe-cannery/
ご利用ありがとうございます!
ご要望いただいた「レシピ缶詰メーカー」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=recipe-cannery
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/recipe-cannery/
ご利用ありがとうございます!
Echo
Iris