blob: f009e00ff27281942605706357476ed6ffd8e203 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
|
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Commis</title>
<link rel="stylesheet" href="style.css">
<link rel="icon" href="logo.png" type="image/png">
</head>
<body>
<header>
<div class="header-title"><img src="logo.png" alt="Commis" style="height:32px;width:32px;object-fit:contain;vertical-align:middle;margin-right:0.4rem;border-radius:6px;">Commis</div>
<div id="ollama-status" class="status-badge">Checking...</div>
</header>
<nav class="tab-nav">
<button class="tab-btn active" data-tab="pantry">Pantry</button>
<button class="tab-btn" data-tab="meals">Meals</button>
<button class="tab-btn" data-tab="menu">This Week's Menu</button>
<button class="tab-btn" data-tab="grocery">Grocery List</button>
<button class="tab-btn" data-tab="chat">Chat</button>
</nav>
<main>
<!-- Pantry Tab -->
<div id="tab-pantry" class="tab-content active">
<div class="tab-header">
<h2>Pantry</h2>
<button class="btn btn-primary" id="btn-add-ingredient">+ Add Ingredient</button>
</div>
<!-- Add form (hidden by default) -->
<div id="add-ingredient-form" class="form-card hidden">
<h3>Add Ingredient</h3>
<div class="form-row">
<div class="form-group"><label>Name</label><input type="text" id="ing-name" placeholder="e.g. Chicken Breast"></div>
</div>
<div class="form-actions">
<button class="btn btn-primary" id="btn-save-ingredient">Save</button>
<button class="btn" id="btn-cancel-ingredient">Cancel</button>
</div>
</div>
<table id="pantry-table">
<thead><tr><th>Name</th><th>Category</th><th>Actions</th></tr></thead>
<tbody id="pantry-tbody"></tbody>
</table>
<div id="pantry-empty" class="empty-state hidden">No ingredients yet. Add some to get started.</div>
</div>
<!-- Meals Tab -->
<div id="tab-meals" class="tab-content hidden">
<div class="tab-header">
<h2>Meal Log</h2>
<button class="btn btn-primary" id="btn-log-meal">+ Log Meal</button>
</div>
<div id="log-meal-form" class="form-card hidden">
<h3>Log a Meal</h3>
<div class="form-row">
<div class="form-group"><label>Meal Name</label><input type="text" id="meal-name" placeholder="e.g. Chicken Stir Fry"></div>
<div class="form-group"><label>Type</label>
<select id="meal-type">
<option value="breakfast">Breakfast</option>
<option value="lunch">Lunch</option>
<option value="dinner" selected>Dinner</option>
<option value="snack">Snack</option>
</select>
</div>
<div class="form-group"><label>Date & Time</label><input type="datetime-local" id="meal-datetime"></div>
<div class="form-group"><label>Servings</label><input type="number" id="meal-servings" value="1" min="1"></div>
<div class="form-group full-width"><label>Notes</label><input type="text" id="meal-notes" placeholder="Optional notes"></div>
</div>
<div class="form-actions">
<button class="btn btn-primary" id="btn-save-meal">Save</button>
<button class="btn" id="btn-cancel-meal">Cancel</button>
</div>
</div>
<div id="meals-stats" class="stats-section"></div>
<div id="meals-timeline"></div>
<div id="meals-empty" class="empty-state hidden">No meals logged yet.</div>
</div>
<!-- Menu Tab -->
<div id="tab-menu" class="tab-content hidden">
<div class="tab-header">
<h2>This Week's Menu</h2>
<div class="header-actions">
<textarea id="menu-user-notes" class="ai-notes-input" placeholder="Any preferences or instructions for the AI (e.g. vegetarian, 2 people, quick breakfasts)..." rows="2"></textarea>
<button class="btn btn-primary" id="btn-generate-menu">✨ Generate Menu</button>
<button class="btn btn-danger hidden" id="btn-clear-menu">Clear</button>
<div id="menu-spinner" class="spinner hidden"></div>
</div>
</div>
<div id="menu-notes" class="info-banner hidden"></div>
<div class="import-url-form" id="import-url-form" style="display:flex;gap:0.5rem;margin-top:0.75rem;">
<input type="url" id="import-url-input" placeholder="Paste recipe URL…" style="flex:1;" />
<button class="btn btn-secondary" id="btn-import-recipe" onclick="importRecipe()">Import</button>
</div>
<div style="display:flex;gap:0.5rem;margin-top:0.5rem;">
<input type="text" id="add-dish-input" placeholder="Describe a dish to add… e.g. a quick pasta for tonight" style="flex:1;" />
<button class="btn btn-secondary" id="btn-add-dish" onclick="addSingleDish()">Add Dish</button>
</div>
<div id="recipe-list" class="recipe-list"></div>
<div id="menu-empty" class="empty-state hidden">No menu generated yet. Click "Generate Menu" to create one.</div>
</div>
<!-- Grocery Tab -->
<div id="tab-grocery" class="tab-content hidden">
<div class="tab-header">
<h2>Grocery List</h2>
<div class="header-actions">
<textarea id="grocery-user-notes" class="ai-notes-input" placeholder="Any preferences or instructions for the AI (e.g. budget $50, no red meat, stock up on breakfast items)..." rows="2"></textarea>
<button class="btn btn-primary" id="btn-generate-grocery">✨ Generate List</button>
<button class="btn btn-danger hidden" id="btn-clear-grocery">Clear</button>
<button class="btn btn-secondary hidden" id="btn-copy-grocery">Copy</button>
<button class="btn btn-success hidden" id="btn-mark-purchased">✓ Mark All Purchased</button>
<div id="grocery-spinner" class="spinner hidden"></div>
</div>
</div>
<div id="grocery-notes" class="info-banner hidden"></div>
<div id="grocery-total" class="hidden"></div>
<div id="grocery-sections"></div>
<div id="grocery-empty" class="empty-state hidden">No grocery list yet. Click "Generate List" to create one.</div>
</div>
<!-- Chat Tab -->
<div id="tab-chat" class="tab-content hidden">
<div class="chat-container">
<div id="chat-messages" class="chat-messages"></div>
<div class="chat-input-area">
<textarea id="chat-input" class="chat-input" placeholder="Ask Commis anything about your kitchen..." rows="2"></textarea>
<button class="btn btn-primary" id="btn-send-chat">Send</button>
</div>
</div>
</div>
</main>
<!-- Swap Recipe Modal -->
<div id="swap-modal-overlay" class="modal-overlay hidden" onclick="cancelSwap()">
<div class="modal" onclick="event.stopPropagation()">
<div class="modal-title">Swap Recipe</div>
<div id="swap-modal-subtitle" class="modal-subtitle"></div>
<textarea id="swap-notes" class="ai-notes-input" placeholder="Any preferences? e.g. vegetarian, something with chicken, quick and easy... (optional)" rows="3"></textarea>
<div class="modal-actions">
<button class="btn btn-secondary" onclick="cancelSwap()">Cancel</button>
<button class="btn btn-primary" onclick="confirmSwap()">Find Replacement</button>
</div>
</div>
</div>
<div id="toast-container"></div>
<script src="app.js"></script>
</body>
</html>
|