cooking-temperature 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +296 -35
- package/dist/icons.d.mts +5 -0
- package/dist/icons.d.ts +5 -0
- package/dist/icons.js +102 -0
- package/dist/icons.js.map +1 -0
- package/dist/icons.mjs +75 -0
- package/dist/icons.mjs.map +1 -0
- package/dist/index.d.mts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +11 -11
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +11 -11
- package/dist/index.mjs.map +1 -1
- package/package.json +6 -1
package/README.md
CHANGED
|
@@ -13,31 +13,70 @@ npm install cooking-temperature
|
|
|
13
13
|
```typescript
|
|
14
14
|
import {
|
|
15
15
|
findByName,
|
|
16
|
+
findById,
|
|
17
|
+
findByCategory,
|
|
18
|
+
getAllEntries,
|
|
19
|
+
getAllCategories,
|
|
20
|
+
getCategoryName,
|
|
16
21
|
getQuickReference,
|
|
17
22
|
getSafeMinimumTemp,
|
|
18
23
|
getDonenessTemp,
|
|
24
|
+
getCookingMethods,
|
|
19
25
|
getCookingInstruction,
|
|
20
26
|
convertTemperature,
|
|
21
27
|
} from "cooking-temperature"
|
|
22
28
|
|
|
23
29
|
// Quick reference lookup
|
|
24
30
|
const chicken = getQuickReference("chicken breast", "oven_bake")
|
|
25
|
-
// Returns:
|
|
31
|
+
// Returns:
|
|
32
|
+
// {
|
|
33
|
+
// name: "Chicken Breast",
|
|
34
|
+
// safeMinimumTemp: 165,
|
|
35
|
+
// tempUnit: "F",
|
|
36
|
+
// restMinutes: 0,
|
|
37
|
+
// suggestedMethod: {
|
|
38
|
+
// method: "oven_bake",
|
|
39
|
+
// applianceTemp: 400,
|
|
40
|
+
// timeMinutes: { min: 22, max: 28 },
|
|
41
|
+
// notes: "Let rest 5 minutes before slicing"
|
|
42
|
+
// },
|
|
43
|
+
// visualIndicators: ["No pink in center", "Juices run clear", "Firm to touch"]
|
|
44
|
+
// }
|
|
26
45
|
|
|
27
46
|
// Find an ingredient by name or alias
|
|
28
47
|
const beef = findByName("ribeye")
|
|
48
|
+
// Returns: CookingTemperatureEntry | undefined
|
|
49
|
+
|
|
50
|
+
// Get all available categories
|
|
51
|
+
const categories = getAllCategories()
|
|
52
|
+
// Returns: ["poultry", "beef", "pork", "seafood_fish", "seafood_shellfish", "egg", "vegetable", "grain"]
|
|
53
|
+
|
|
54
|
+
// Get human-readable category name
|
|
55
|
+
const name = getCategoryName("seafood_fish")
|
|
56
|
+
// Returns: "Fish"
|
|
29
57
|
|
|
30
58
|
// Get safe minimum temperature
|
|
31
59
|
const safeTemp = getSafeMinimumTemp("chicken-breast", "F")
|
|
32
60
|
// Returns: { temp: 165, restMinutes: 0 }
|
|
33
61
|
|
|
34
62
|
// Get doneness temperature for proteins
|
|
35
|
-
const mediumRare = getDonenessTemp("beef-ribeye", "medium_rare", "F")
|
|
63
|
+
const mediumRare = getDonenessTemp("beef-steak-ribeye", "medium_rare", "F")
|
|
36
64
|
// Returns: 135
|
|
37
65
|
|
|
66
|
+
// Get available cooking methods
|
|
67
|
+
const methods = getCookingMethods("salmon-fillet")
|
|
68
|
+
// Returns: ["oven_bake", "pan_sear", "grill", "poach", "sous_vide"]
|
|
69
|
+
|
|
38
70
|
// Get cooking instructions
|
|
39
71
|
const instructions = getCookingInstruction("salmon-fillet", "oven_bake")
|
|
40
|
-
// Returns:
|
|
72
|
+
// Returns:
|
|
73
|
+
// {
|
|
74
|
+
// applianceTemp: 400,
|
|
75
|
+
// applianceTempUnit: "F",
|
|
76
|
+
// timeMinutes: { min: 12, max: 15 },
|
|
77
|
+
// notes: "Skin-side down",
|
|
78
|
+
// portionDescription: "6 oz fillet, 1 inch thick"
|
|
79
|
+
// }
|
|
41
80
|
|
|
42
81
|
// Convert between Fahrenheit and Celsius
|
|
43
82
|
const celsius = convertTemperature(165, "F", "C")
|
|
@@ -46,57 +85,279 @@ const celsius = convertTemperature(165, "F", "C")
|
|
|
46
85
|
|
|
47
86
|
## API
|
|
48
87
|
|
|
88
|
+
### Types
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
type TemperatureUnit = "F" | "C"
|
|
92
|
+
|
|
93
|
+
type IngredientCategory =
|
|
94
|
+
| "poultry" | "beef" | "pork" | "lamb"
|
|
95
|
+
| "seafood_fish" | "seafood_shellfish"
|
|
96
|
+
| "egg" | "vegetable" | "grain" | "legume"
|
|
97
|
+
|
|
98
|
+
type DonenessLevel =
|
|
99
|
+
| "rare" | "medium_rare" | "medium"
|
|
100
|
+
| "medium_well" | "well_done" | "safe_minimum"
|
|
101
|
+
|
|
102
|
+
type CookingMethod =
|
|
103
|
+
| "oven_roast" | "oven_bake" | "pan_sear" | "pan_fry"
|
|
104
|
+
| "grill" | "broil" | "poach" | "simmer" | "boil" | "steam"
|
|
105
|
+
| "sous_vide" | "air_fry" | "deep_fry" | "slow_cook"
|
|
106
|
+
```
|
|
107
|
+
|
|
49
108
|
### Lookup Functions
|
|
50
109
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
110
|
+
#### `findByName(query: string): CookingTemperatureEntry | undefined`
|
|
111
|
+
|
|
112
|
+
Find an ingredient by name or alias (case-insensitive partial match).
|
|
113
|
+
|
|
114
|
+
```typescript
|
|
115
|
+
const entry = findByName("ribeye")
|
|
116
|
+
// Returns full CookingTemperatureEntry object or undefined
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
#### `findById(id: string): CookingTemperatureEntry | undefined`
|
|
120
|
+
|
|
121
|
+
Find an ingredient by its exact unique ID.
|
|
122
|
+
|
|
123
|
+
```typescript
|
|
124
|
+
const entry = findById("beef-steak-ribeye")
|
|
125
|
+
// Returns full CookingTemperatureEntry object or undefined
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
#### `findByCategory(category: IngredientCategory): CookingTemperatureEntry[]`
|
|
129
|
+
|
|
130
|
+
Get all ingredients in a category.
|
|
131
|
+
|
|
132
|
+
```typescript
|
|
133
|
+
const poultryItems = findByCategory("poultry")
|
|
134
|
+
// Returns: CookingTemperatureEntry[] (all poultry entries)
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
#### `getAllEntries(): CookingTemperatureEntry[]`
|
|
138
|
+
|
|
139
|
+
Get all cooking temperature entries in the library.
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
const all = getAllEntries()
|
|
143
|
+
// Returns: CookingTemperatureEntry[] (all entries)
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
#### `getAllCategories(): IngredientCategory[]`
|
|
147
|
+
|
|
148
|
+
Get all available categories.
|
|
149
|
+
|
|
150
|
+
```typescript
|
|
151
|
+
const categories = getAllCategories()
|
|
152
|
+
// Returns: ["poultry", "beef", "pork", "seafood_fish", "seafood_shellfish", "egg", "vegetable", "grain"]
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
#### `getCategoryName(category: IngredientCategory): string`
|
|
156
|
+
|
|
157
|
+
Get the human-readable display name for a category.
|
|
158
|
+
|
|
159
|
+
```typescript
|
|
160
|
+
const name = getCategoryName("seafood_fish")
|
|
161
|
+
// Returns: "Fish"
|
|
162
|
+
|
|
163
|
+
const name2 = getCategoryName("seafood_shellfish")
|
|
164
|
+
// Returns: "Shellfish"
|
|
165
|
+
```
|
|
56
166
|
|
|
57
167
|
### Temperature Functions
|
|
58
168
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
169
|
+
#### `convertTemperature(temp: number, from_unit: TemperatureUnit, to_unit: TemperatureUnit): number`
|
|
170
|
+
|
|
171
|
+
Convert between Fahrenheit and Celsius.
|
|
172
|
+
|
|
173
|
+
```typescript
|
|
174
|
+
const celsius = convertTemperature(165, "F", "C")
|
|
175
|
+
// Returns: 74
|
|
176
|
+
|
|
177
|
+
const fahrenheit = convertTemperature(74, "C", "F")
|
|
178
|
+
// Returns: 165
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
#### `getSafeMinimumTemp(ingredientId: string, unit?: TemperatureUnit): { temp: number; restMinutes: number } | undefined`
|
|
182
|
+
|
|
183
|
+
Get USDA safe minimum internal temperature for an ingredient.
|
|
184
|
+
|
|
185
|
+
```typescript
|
|
186
|
+
const safeTemp = getSafeMinimumTemp("chicken-breast", "F")
|
|
187
|
+
// Returns: { temp: 165, restMinutes: 0 }
|
|
188
|
+
|
|
189
|
+
const beefTemp = getSafeMinimumTemp("beef-steak-ribeye", "F")
|
|
190
|
+
// Returns: { temp: 145, restMinutes: 3 }
|
|
191
|
+
|
|
192
|
+
const inCelsius = getSafeMinimumTemp("chicken-breast", "C")
|
|
193
|
+
// Returns: { temp: 74, restMinutes: 0 }
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
#### `getDonenessTemp(ingredientId: string, doneness_level: DonenessLevel, unit?: TemperatureUnit): number | undefined`
|
|
197
|
+
|
|
198
|
+
Get internal temperature for a specific doneness level.
|
|
199
|
+
|
|
200
|
+
```typescript
|
|
201
|
+
const rare = getDonenessTemp("beef-steak-ribeye", "rare", "F")
|
|
202
|
+
// Returns: 125
|
|
203
|
+
|
|
204
|
+
const mediumRare = getDonenessTemp("beef-steak-ribeye", "medium_rare", "F")
|
|
205
|
+
// Returns: 135
|
|
206
|
+
|
|
207
|
+
const medium = getDonenessTemp("beef-steak-ribeye", "medium", "C")
|
|
208
|
+
// Returns: 60
|
|
209
|
+
```
|
|
62
210
|
|
|
63
211
|
### Cooking Instructions
|
|
64
212
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
213
|
+
#### `getCookingMethods(ingredientId: string): CookingMethod[]`
|
|
214
|
+
|
|
215
|
+
Get available cooking methods for an ingredient.
|
|
216
|
+
|
|
217
|
+
```typescript
|
|
218
|
+
const methods = getCookingMethods("salmon-fillet")
|
|
219
|
+
// Returns: ["oven_bake", "pan_sear", "grill", "poach", "sous_vide"]
|
|
220
|
+
|
|
221
|
+
const chickenMethods = getCookingMethods("chicken-breast")
|
|
222
|
+
// Returns: ["oven_bake", "pan_sear", "grill", "poach", "sous_vide", "air_fry"]
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
#### `getCookingInstruction(ingredientId: string, cooking_method: CookingMethod, portionHint?: string): object | undefined`
|
|
226
|
+
|
|
227
|
+
Get detailed cooking instructions for a specific method.
|
|
228
|
+
|
|
229
|
+
```typescript
|
|
230
|
+
const instructions = getCookingInstruction("salmon-fillet", "oven_bake")
|
|
231
|
+
// Returns:
|
|
232
|
+
// {
|
|
233
|
+
// applianceTemp: 400,
|
|
234
|
+
// applianceTempUnit: "F",
|
|
235
|
+
// timeMinutes: { min: 12, max: 15 },
|
|
236
|
+
// notes: "Skin-side down",
|
|
237
|
+
// portionDescription: "6 oz fillet, 1 inch thick"
|
|
238
|
+
// }
|
|
239
|
+
|
|
240
|
+
// With portion hint for specific cuts
|
|
241
|
+
const thickCut = getCookingInstruction("beef-steak-ribeye", "grill", "1.5 inch")
|
|
242
|
+
// Returns instructions for 1.5 inch thick steak
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
#### `getQuickReference(query: string, cooking_method?: CookingMethod, unit?: TemperatureUnit): object | undefined`
|
|
246
|
+
|
|
247
|
+
Get a quick reference with all relevant cooking info combined.
|
|
248
|
+
|
|
249
|
+
```typescript
|
|
250
|
+
const ref = getQuickReference("chicken breast", "oven_bake", "F")
|
|
251
|
+
// Returns:
|
|
252
|
+
// {
|
|
253
|
+
// name: "Chicken Breast",
|
|
254
|
+
// safeMinimumTemp: 165,
|
|
255
|
+
// tempUnit: "F",
|
|
256
|
+
// restMinutes: 0,
|
|
257
|
+
// suggestedMethod: {
|
|
258
|
+
// method: "oven_bake",
|
|
259
|
+
// applianceTemp: 400,
|
|
260
|
+
// timeMinutes: { min: 22, max: 28 },
|
|
261
|
+
// notes: "Let rest 5 minutes before slicing"
|
|
262
|
+
// },
|
|
263
|
+
// visualIndicators: ["No pink in center", "Juices run clear", "Firm to touch"]
|
|
264
|
+
// }
|
|
265
|
+
|
|
266
|
+
// Without method - returns just temperature info
|
|
267
|
+
const tempOnly = getQuickReference("salmon", undefined, "C")
|
|
268
|
+
// Returns:
|
|
269
|
+
// {
|
|
270
|
+
// name: "Salmon Fillet",
|
|
271
|
+
// safeMinimumTemp: 63,
|
|
272
|
+
// tempUnit: "C",
|
|
273
|
+
// restMinutes: 0,
|
|
274
|
+
// suggestedMethod: undefined,
|
|
275
|
+
// visualIndicators: ["Flesh flakes easily", "Opaque throughout"]
|
|
276
|
+
// }
|
|
277
|
+
```
|
|
68
278
|
|
|
69
279
|
## Categories
|
|
70
280
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
281
|
+
| Category | Description | ID |
|
|
282
|
+
|----------|-------------|-----|
|
|
283
|
+
| Poultry | Chicken, turkey, duck | `poultry` |
|
|
284
|
+
| Beef | Steaks, roasts, ground beef | `beef` |
|
|
285
|
+
| Pork | Chops, tenderloin, ribs | `pork` |
|
|
286
|
+
| Lamb | Chops, leg, ground lamb | `lamb` |
|
|
287
|
+
| Fish | Salmon, tuna, cod | `seafood_fish` |
|
|
288
|
+
| Shellfish | Shrimp, lobster, scallops | `seafood_shellfish` |
|
|
289
|
+
| Eggs | Various egg preparations | `egg` |
|
|
290
|
+
| Vegetables | Common vegetables | `vegetable` |
|
|
291
|
+
| Grains | Rice, pasta, quinoa | `grain` |
|
|
292
|
+
| Legumes | Beans, lentils | `legume` |
|
|
79
293
|
|
|
80
294
|
## Doneness Levels
|
|
81
295
|
|
|
82
296
|
For proteins that support doneness preferences:
|
|
83
297
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
298
|
+
| Level | Description |
|
|
299
|
+
|-------|-------------|
|
|
300
|
+
| `rare` | Cool red center |
|
|
301
|
+
| `medium_rare` | Warm red center |
|
|
302
|
+
| `medium` | Warm pink center |
|
|
303
|
+
| `medium_well` | Slightly pink center |
|
|
304
|
+
| `well_done` | No pink, fully cooked |
|
|
305
|
+
| `safe_minimum` | USDA recommended baseline |
|
|
90
306
|
|
|
91
307
|
## Cooking Methods
|
|
92
308
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
309
|
+
| Method | Description |
|
|
310
|
+
|--------|-------------|
|
|
311
|
+
| `oven_roast` | Dry heat, uncovered, typically for larger cuts |
|
|
312
|
+
| `oven_bake` | Dry heat, may be covered |
|
|
313
|
+
| `pan_sear` | High heat, quick cooking |
|
|
314
|
+
| `pan_fry` | Medium heat, more oil |
|
|
315
|
+
| `grill` | Direct heat from below |
|
|
316
|
+
| `broil` | Direct heat from above |
|
|
317
|
+
| `poach` | Gentle simmering liquid |
|
|
318
|
+
| `simmer` | Low bubbling liquid |
|
|
319
|
+
| `boil` | Rolling boil |
|
|
320
|
+
| `steam` | Suspended over boiling water |
|
|
321
|
+
| `sous_vide` | Vacuum-sealed, precise temperature water bath |
|
|
322
|
+
| `air_fry` | Circulating hot air |
|
|
323
|
+
| `deep_fry` | Submerged in hot oil |
|
|
324
|
+
| `slow_cook` | Low temperature, long duration |
|
|
325
|
+
|
|
326
|
+
## Icons
|
|
327
|
+
|
|
328
|
+
The library includes SVG icons as base64-encoded data URLs for categories and common ingredients.
|
|
329
|
+
|
|
330
|
+
```typescript
|
|
331
|
+
import {
|
|
332
|
+
CATEGORY_ICONS,
|
|
333
|
+
INGREDIENT_ICONS,
|
|
334
|
+
getIcon,
|
|
335
|
+
} from "cooking-temperature/icons"
|
|
336
|
+
|
|
337
|
+
// Get a category icon
|
|
338
|
+
const poultryIcon = CATEGORY_ICONS["poultry"]
|
|
339
|
+
// Returns: "data:image/svg+xml;base64,..."
|
|
340
|
+
|
|
341
|
+
// Get a specific ingredient icon
|
|
342
|
+
const salmonIcon = INGREDIENT_ICONS["salmon_fillet"]
|
|
343
|
+
|
|
344
|
+
// Use the helper function (falls back to category icon if no specific icon exists)
|
|
345
|
+
const icon = getIcon("salmon_fillet", "seafood_fish")
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
### Available Icon Exports
|
|
349
|
+
|
|
350
|
+
| Export | Description |
|
|
351
|
+
|--------|-------------|
|
|
352
|
+
| `CATEGORY_ICONS` | Icons for each food category (poultry, beef, pork, seafood_fish, seafood_shellfish, egg, vegetable, grain) |
|
|
353
|
+
| `POULTRY_ICONS` | Chicken breast, thigh, whole chicken, turkey breast |
|
|
354
|
+
| `BEEF_ICONS` | Ribeye steak, ground beef, beef roast |
|
|
355
|
+
| `SEAFOOD_ICONS` | Salmon fillet, shrimp, cod fillet, tuna steak |
|
|
356
|
+
| `EGG_ICONS` | Fried, boiled, scrambled, poached eggs |
|
|
357
|
+
| `VEGETABLE_ICONS` | Broccoli, asparagus, potato, carrot |
|
|
358
|
+
| `GRAIN_ICONS` | White rice, pasta, quinoa |
|
|
359
|
+
| `INGREDIENT_ICONS` | Combined export of all ingredient icons |
|
|
360
|
+
| `getIcon(id, category?)` | Helper function that returns an icon by ID, with optional category fallback |
|
|
100
361
|
|
|
101
362
|
## License
|
|
102
363
|
|
package/dist/icons.d.mts
ADDED
package/dist/icons.d.ts
ADDED
package/dist/icons.js
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// icons.ts
|
|
21
|
+
var icons_exports = {};
|
|
22
|
+
__export(icons_exports, {
|
|
23
|
+
CATEGORY_ICONS: () => CATEGORY_ICONS,
|
|
24
|
+
INGREDIENT_ICONS: () => INGREDIENT_ICONS,
|
|
25
|
+
getIcon: () => getIcon
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(icons_exports);
|
|
28
|
+
var toDataUrl = (svg) => {
|
|
29
|
+
const encoded = encodeURIComponent(svg).replace(/'/g, "%27").replace(/"/g, "%22");
|
|
30
|
+
return `data:image/svg+xml,${encoded}`;
|
|
31
|
+
};
|
|
32
|
+
var SVG_POULTRY = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#C1694F" d="M30.326 14.24c-.279-4.063-4.016-7.592-8.396-7.931-4.38-.339-7.294 1.908-8.406 5.865-1.113 3.958 1.006 9.672 1.006 9.672l1.781 2.281 3.594 5.719 3 .281 2.219-1.562 3.344-4.281 1.5-1.75.358-8.294z"/><path fill="#E0A577" d="M26.639 12.178c-.224-3.25-3.213-6.074-6.717-6.345-3.504-.271-5.836 1.526-6.725 4.692-.889 3.166.805 7.738.805 7.738l1.425 1.825 2.875 4.575 2.4.225 1.775-1.25 2.675-3.425 1.2-1.4.287-6.635z"/><path fill="#C1694F" d="M11.069 18.063c-2.5-1.688-3.02-4.602-3.02-4.602s-.937-6.219-.479-8.732c.458-2.513 2.769-3.27 4.436-2.498 1.667.771 1.428 1.705 2.016 3.575.588 1.87.336 3.803 1.078 5.614.741 1.811 1.913 2.933 2.26 4.618.346 1.685-.33 3.327-2.372 3.806-2.041.478-3.919-1.781-3.919-1.781z"/><path fill="#E0A577" d="M12.298 16.537c-2-1.35-2.416-3.682-2.416-3.682s-.75-4.975-.383-6.986c.367-2.01 2.215-2.616 3.549-1.998 1.333.617 1.142 1.364 1.613 2.86.47 1.496.269 3.042.862 4.491.593 1.449 1.531 2.347 1.808 3.694.277 1.348-.264 2.662-1.898 3.045-1.633.383-3.135-1.424-3.135-1.424z"/><ellipse cx="17.952" cy="32.656" fill="#C1694F" rx="4.218" ry="1.594"/><path fill="#E0A577" d="M16.858 21.858s-.546 6.792-.179 8.75c.367 1.958 1 2.344 2.042 2.25 1.041-.094 1.291-1.125 1.375-2.417.083-1.292.125-8.333.125-8.333l-3.363-.25z"/></svg>`;
|
|
33
|
+
var SVG_BEEF = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#BE1931" d="M35.728 10.357c-2.267-5.266-6.9-8.628-12.102-9.472-1.249-.203-7.308-.937-13.081 2.279C5.058 6.641 1.353 11.785.16 20.074c-.591 4.108-.074 7.093 1.539 8.871 2.021 2.229 5.555 2.596 8.306 2.596.976 0 1.87-.052 2.58-.103 2.018-.149 8.741-1.043 14.396-4.636 5.575-3.543 9.989-10.38 8.747-16.445z"/><path fill="#DD2E44" d="M33.728 11.357c-1.983-4.608-6.037-7.549-10.59-8.29-1.093-.178-6.395-.82-11.446 1.994C6.801 7.936 3.558 12.437 2.513 19.69c-.518 3.595-.065 6.207 1.347 7.762 1.769 1.951 4.861 2.272 7.268 2.272.854 0 1.636-.046 2.257-.09 1.766-.131 7.649-.913 12.597-4.057 4.88-3.102 8.742-9.085 7.746-14.22z"/><path fill="#BE1931" d="M23.901 5.398c-1.093-.178-6.395-.82-11.446 1.994-.969.54-1.859 1.157-2.674 1.833 1.019-.397 2.149-.652 3.394-.652 5.237 0 9.891 3.618 10.909 8.707.324 1.62.283 3.219-.056 4.73 3.019-2.727 5.476-6.757 4.62-10.392-1.983-4.608-6.037-7.549-10.59-8.29.614.09 4.219.788 5.843 2.07z"/><ellipse cx="12.814" cy="15.785" fill="#F7DECE" rx="7.021" ry="5.404"/><ellipse cx="12.814" cy="15.785" fill="#BE1931" rx="3.298" ry="2.54"/></svg>`;
|
|
34
|
+
var SVG_PORK = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#C1694F" d="M31.29 13.214c-.483-4.839-5.274-8.944-10.761-9.221-5.487-.277-9.12 2.704-10.481 7.571-1.361 4.867.636 11.714 1.959 14.199 1.323 2.485 2.978 4.354 6.27 4.648 3.292.294 6.234-1.102 8.413-3.826 2.179-2.724 5.083-8.532 4.6-13.371z"/><path fill="#E0A577" d="M28.632 13.661c-.386-3.871-4.219-7.155-8.609-7.377-4.39-.222-7.296 2.163-8.385 6.057-1.089 3.894.509 9.371 1.567 11.359 1.058 1.988 2.382 3.483 5.016 3.718 2.634.235 4.987-.882 6.73-3.061 1.744-2.179 4.067-6.825 3.681-10.696z"/><path fill="#FFCC4D" d="M10.733 19.714c-1.128 1.332-4.012 4.523-5.345 5.618-1.333 1.095-3.857 2.857-3.857 4.762s1.524 3.619 3.619 3.619c2.095 0 3.583-1.179 4.917-2.333 1.333-1.155 4.379-4.446 5.065-5.422.686-.976 1.143-2.531.762-3.238-.381-.708-2.115-.746-3.219-.368-1.105.381-1.942-2.638-1.942-2.638z"/><path fill="#FFAC33" d="M5.482 31.003c-.073 0-.146-.022-.209-.067-.156-.111-.193-.328-.082-.484 1.04-1.459 3.113-4.063 3.134-4.09.117-.148.331-.177.483-.063.151.114.182.328.067.48-.021.027-2.089 2.625-3.125 4.078-.069.095-.176.146-.268.146zm1.729.814c-.073 0-.147-.022-.21-.068-.155-.111-.192-.328-.081-.484 1.373-1.928 3.076-4.138 3.093-4.161.115-.151.33-.181.482-.066.152.113.183.328.068.48-.017.023-1.716 2.228-3.084 4.148-.068.098-.175.151-.268.151zm1.787.664c-.073 0-.147-.022-.21-.068-.155-.111-.192-.328-.081-.484 1.398-1.961 2.869-3.931 2.884-3.951.114-.152.33-.184.482-.069.153.113.185.327.071.48-.015.02-1.482 1.984-2.877 3.941-.068.099-.175.151-.269.151z"/><ellipse cx="6.833" cy="32.524" fill="#FFCC4D" rx="2.667" ry="1.143"/></svg>`;
|
|
35
|
+
var SVG_FISH = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#55ACEE" d="M27 2s-5.958 3.75-8.031 5.469C14.865 11.057 8.503 18.839 5 23c-1.5 1-2.5 2.25-2.5 3.5 0 2.5 2.603 5.5 4.5 5.5 1.5 0 2.5-1 3.5-2.5 3.5-4.5 10.654-10.588 13.5-13.5C25.806 14.056 31 9 31 9l-4-7z"/><circle cx="9.5" cy="27.5" r="1.5" fill="#292F33"/><path fill="#3B88C3" d="M25 4s-4.958 3.75-7.031 5.469C13.865 13.057 8.503 19.839 5 24c-1.5 1-2.083 2.5-2.083 3.5 0 1.75 1.686 3.5 3.583 3.5 1.5 0 2.5-1 3.5-2.5 3.5-4.5 9.654-9.588 12.5-12.5C24.306 14.056 29 10 29 10l-4-6z"/><path fill="#55ACEE" d="M31 8s3 3.334 3 6c0 2.668-3 6-3 6l-2.667-5.333L31 8z"/><path fill="#3B88C3" d="M29 10s3 2.334 3 5c0 2.668-3 5-3 5l-2-4.5 2-5.5z"/></svg>`;
|
|
36
|
+
var SVG_SHRIMP = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#F4900C" d="M26.688 9.812c-.271 2.917-1.167 8.146-4.792 11.771-2.917 2.917-8.771 3.125-12.708 3.125-1.549 0-2.912-.049-3.938-.106-1.958-.107-2.313-.707-2.188-1.914s1.538-.998 3.059-.871c.761.063 1.722.107 2.817.107 3.458 0 8.146-.438 10.146-2.438 2.833-2.833 3.563-6.563 3.813-8.938.188-1.792.854-1.917 1.604-1.646.75.272.395 1.91.187 2.91z"/><path fill="#FFCC4D" d="M10.376 15.098c-2.188.354-3.188.917-3.188 2.417 0 1.125.667 1.792 1.792 1.792 1.75 0 2.104-.771 2.104-1.917s-.708-2.292-.708-2.292z"/><path fill="#F4900C" d="M16.542 10.639c-4.25 0-5.917 2.042-6.875 4.5.084-.001.162-.014.25-.014 2.292 0 2.667 2.417 2.667 3.583 0 1.75-.854 3.167-3.292 3.167-1.708 0-3-1.104-3.145-2.958-.032.035-.065.065-.098.101-1.125 1.25-1.875 3.063-1.875 5.875 0 4.166 3.333 8.229 8.833 8.229s9.667-4.229 9.667-9.646c0-6.625-3.25-12.837-6.132-12.837z"/><circle cx="9.396" cy="27.441" r="1.25" fill="#662113"/><path fill="#FFCC4D" d="M15.5 25c-1.375 0-2.5 1.625-2.5 3.5 0 1.25.375 2.5 1.875 2.5 1.667 0 2.125-1.417 2.125-2.917 0-1.208-.125-3.083-1.5-3.083zm4-1c-1.125 0-2 1.542-2 3.25 0 1.083.333 2.25 1.625 2.25 1.375 0 1.875-1.208 1.875-2.583 0-1.084-.167-2.917-1.5-2.917z"/><path fill="#F4900C" d="M5.813 25.77c-.094-.178-.428-.188-.746-.022-.318.166-.479.452-.385.631l1.334 2.428c.081.155.327.187.599.095-.233-.497-1.026-1.995-.802-3.132z"/><path fill="#FFCC4D" d="M30.599 5.401c-.345.174-.525.513-.431.785.036.104.136.393-.212.938-.49.768-1.679 1.717-4.002 2.882-5.708 2.862-8.62.67-10.33-.776-.615-.52-1.084-1.059-1.462-1.55-.295-.384-.764-.389-1.047-.01-.283.378-.172.919.168 1.27l.022.023c.396.443.925.986 1.622 1.555 1.981 1.616 5.846 4.287 12.511.948 2.549-1.277 3.944-2.394 4.604-3.429.451-.708.554-1.378.343-1.988-.094-.272-.34-.361-.513-.361-.089 0-.175.021-.249.059-.355.179-.549.504-.479.784.054.217-.011.448-.234.668-.356.351-1.085.787-2.186 1.323-3.364 1.637-5.539 1.314-6.753.552-1.028-.646-1.424-1.558-1.425-1.56-.116-.266-.5-.361-.857-.212-.356.149-.54.484-.423.749l.001.002c.02.046.508 1.131 1.778 1.933 1.535.968 4.167 1.378 8.079-.527 1.212-.59 2.036-1.087 2.495-1.54.538-.531.659-1.102.529-1.574-.132-.476-.51-.818-.993-.818-.109 0-.221.019-.334.056z"/><ellipse cx="27.819" cy="2.692" fill="#FFCC4D" rx="2.413" ry="1.025" transform="rotate(-63.435 27.82 2.693)"/><ellipse cx="30.569" cy="4.067" fill="#FFCC4D" rx="2.413" ry="1.025" transform="rotate(-63.435 30.57 4.067)"/></svg>`;
|
|
37
|
+
var SVG_EGG = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#E1E8ED" d="M18 35c-7.732 0-14-4.701-14-10.5C4 14.603 11.268 1 18 1s14 13.603 14 23.5c0 5.799-6.268 10.5-14 10.5z"/><path fill="#CCD6DD" d="M18 33c-6.627 0-12-3.873-12-8.5C6 15.603 12.268 3 18 3s12 12.603 12 21.5c0 4.627-5.373 8.5-12 8.5z"/></svg>`;
|
|
38
|
+
var SVG_BROCCOLI = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#77B255" d="M22.453 35.564c-.315 0-.636-.08-.934-.251-5.281-3.029-5.792-10.958-5.813-11.294-.042-.679.474-1.263 1.152-1.305.683-.048 1.263.474 1.305 1.152.005.073.456 7.134 4.607 9.515.59.339.795 1.091.456 1.683-.227.396-.642.617-1.069.617-.001-.117-.296-.117-.704-.117z"/><path fill="#5C913B" d="M13.838 35.564c-.315 0-.636-.08-.934-.251-5.281-3.029-5.792-10.958-5.813-11.294-.042-.679.474-1.263 1.152-1.305.683-.048 1.263.474 1.305 1.152.005.073.456 7.134 4.607 9.515.59.339.795 1.091.456 1.683-.227.396-.642.617-1.069.617-.001-.117-.296-.117-.704-.117z"/><ellipse cx="20.285" cy="18.546" fill="#77B255" rx="5.701" ry="5.476"/><ellipse cx="8.073" cy="15.9" fill="#5C913B" rx="5.145" ry="4.943"/><circle cx="23.111" cy="9.561" r="5.588" fill="#77B255"/><ellipse cx="13.838" cy="7.589" fill="#5C913B" rx="4.866" ry="4.674"/><circle cx="17.236" cy="13.369" r="6.145" fill="#3E721D"/><circle cx="10.166" cy="9.561" r="4.588" fill="#77B255"/><circle cx="26.508" cy="14.571" r="4.588" fill="#5C913B"/><ellipse cx="20.285" cy="4.787" fill="#5C913B" rx="4.31" ry="4.141"/></svg>`;
|
|
39
|
+
var SVG_RICE = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#CCD6DD" d="M33 22H3c-1.657 0-3 1.343-3 3v6c0 1.657 1.343 3 3 3h30c1.657 0 3-1.343 3-3v-6c0-1.657-1.343-3-3-3z"/><path fill="#E1E8ED" d="M33 20H3c-1.657 0-3 1.343-3 3v6c0 1.657 1.343 3 3 3h30c1.657 0 3-1.343 3-3v-6c0-1.657-1.343-3-3-3z"/><path fill="#F5F8FA" d="M8 18c-.552 0-1-.447-1-1v-4c0-.553.448-1 1-1s1 .447 1 1v4c0 .553-.448 1-1 1zm4 0c-.552 0-1-.447-1-1v-5c0-.553.448-1 1-1s1 .447 1 1v5c0 .553-.448 1-1 1zm4-1c-.552 0-1-.447-1-1v-4c0-.553.448-1 1-1s1 .447 1 1v4c0 .553-.448 1-1 1zm4 0c-.552 0-1-.447-1-1v-5c0-.553.448-1 1-1s1 .447 1 1v5c0 .553-.448 1-1 1zm4 1c-.552 0-1-.447-1-1v-4c0-.553.448-1 1-1s1 .447 1 1v4c0 .553-.448 1-1 1zm4 0c-.552 0-1-.447-1-1v-5c0-.553.448-1 1-1s1 .447 1 1v5c0 .553-.448 1-1 1z"/></svg>`;
|
|
40
|
+
var SVG_FRIED_EGG = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#E1E8ED" d="M35 19.5c0 4.142-3.582 7.5-8 7.5-2.348 0-4.471-.939-6-2.452C19.471 26.061 17.348 27 15 27c-4.418 0-8-3.358-8-7.5 0-.646.087-1.271.248-1.865C4.414 17.047 2 14.552 2 11.5 2 8.186 4.833 5.5 8.333 5.5c.357 0 .707.027 1.05.078C10.66 3.398 12.928 2 15.5 2c2.572 0 4.84 1.398 6.117 3.578.343-.051.693-.078 1.05-.078C26.167 5.5 29 8.186 29 11.5c0 .985-.227 1.918-.631 2.757C32.159 14.676 35 16.799 35 19.5z"/><ellipse cx="15" cy="18" fill="#FFCC4D" rx="8" ry="7"/><ellipse cx="15" cy="17" fill="#FFE8B6" rx="4" ry="3.5"/></svg>`;
|
|
41
|
+
var CATEGORY_ICONS = {
|
|
42
|
+
poultry: toDataUrl(SVG_POULTRY),
|
|
43
|
+
beef: toDataUrl(SVG_BEEF),
|
|
44
|
+
pork: toDataUrl(SVG_PORK),
|
|
45
|
+
seafood_fish: toDataUrl(SVG_FISH),
|
|
46
|
+
seafood_shellfish: toDataUrl(SVG_SHRIMP),
|
|
47
|
+
egg: toDataUrl(SVG_EGG),
|
|
48
|
+
vegetable: toDataUrl(SVG_BROCCOLI),
|
|
49
|
+
grain: toDataUrl(SVG_RICE)
|
|
50
|
+
};
|
|
51
|
+
var INGREDIENT_ICONS = {
|
|
52
|
+
// Poultry
|
|
53
|
+
chicken_breast: toDataUrl(SVG_POULTRY),
|
|
54
|
+
chicken_breast_boneless: toDataUrl(SVG_POULTRY),
|
|
55
|
+
chicken_thigh_boneless: toDataUrl(SVG_POULTRY),
|
|
56
|
+
chicken_thigh: toDataUrl(SVG_POULTRY),
|
|
57
|
+
chicken_whole: toDataUrl(SVG_POULTRY),
|
|
58
|
+
turkey_breast: toDataUrl(SVG_POULTRY),
|
|
59
|
+
// Beef
|
|
60
|
+
beef_steak_ribeye: toDataUrl(SVG_BEEF),
|
|
61
|
+
beef_ground: toDataUrl(SVG_BEEF),
|
|
62
|
+
beef_roast: toDataUrl(SVG_BEEF),
|
|
63
|
+
// Pork
|
|
64
|
+
pork_chop: toDataUrl(SVG_PORK),
|
|
65
|
+
pork_tenderloin: toDataUrl(SVG_PORK),
|
|
66
|
+
pork_ribs: toDataUrl(SVG_PORK),
|
|
67
|
+
// Seafood
|
|
68
|
+
salmon_fillet: toDataUrl(SVG_FISH),
|
|
69
|
+
tuna_steak: toDataUrl(SVG_FISH),
|
|
70
|
+
cod_fillet: toDataUrl(SVG_FISH),
|
|
71
|
+
shrimp: toDataUrl(SVG_SHRIMP),
|
|
72
|
+
// Eggs
|
|
73
|
+
egg_fried: toDataUrl(SVG_FRIED_EGG),
|
|
74
|
+
egg_boiled: toDataUrl(SVG_EGG),
|
|
75
|
+
egg_scrambled: toDataUrl(SVG_FRIED_EGG),
|
|
76
|
+
egg_poached: toDataUrl(SVG_FRIED_EGG),
|
|
77
|
+
// Vegetables
|
|
78
|
+
broccoli: toDataUrl(SVG_BROCCOLI),
|
|
79
|
+
asparagus: toDataUrl(SVG_BROCCOLI),
|
|
80
|
+
potato: toDataUrl(SVG_BROCCOLI),
|
|
81
|
+
carrot: toDataUrl(SVG_BROCCOLI),
|
|
82
|
+
// Grains
|
|
83
|
+
rice_white: toDataUrl(SVG_RICE),
|
|
84
|
+
pasta: toDataUrl(SVG_RICE),
|
|
85
|
+
quinoa: toDataUrl(SVG_RICE)
|
|
86
|
+
};
|
|
87
|
+
var getIcon = (id, category) => {
|
|
88
|
+
if (INGREDIENT_ICONS[id]) {
|
|
89
|
+
return INGREDIENT_ICONS[id];
|
|
90
|
+
}
|
|
91
|
+
if (category && CATEGORY_ICONS[category]) {
|
|
92
|
+
return CATEGORY_ICONS[category];
|
|
93
|
+
}
|
|
94
|
+
return void 0;
|
|
95
|
+
};
|
|
96
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
97
|
+
0 && (module.exports = {
|
|
98
|
+
CATEGORY_ICONS,
|
|
99
|
+
INGREDIENT_ICONS,
|
|
100
|
+
getIcon
|
|
101
|
+
});
|
|
102
|
+
//# sourceMappingURL=icons.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../icons.ts"],"sourcesContent":["// High-quality flat-style food icons as data URLs\n// Consistent style, no external dependencies\n\n// Helper to encode SVG as data URL\nconst toDataUrl = (svg: string): string => {\n const encoded = encodeURIComponent(svg)\n .replace(/'/g, '%27')\n .replace(/\"/g, '%22');\n return `data:image/svg+xml,${encoded}`;\n};\n\n// =============================================================================\n// SVG DEFINITIONS\n// =============================================================================\n\nconst SVG_POULTRY = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 36 36\"><path fill=\"#C1694F\" d=\"M30.326 14.24c-.279-4.063-4.016-7.592-8.396-7.931-4.38-.339-7.294 1.908-8.406 5.865-1.113 3.958 1.006 9.672 1.006 9.672l1.781 2.281 3.594 5.719 3 .281 2.219-1.562 3.344-4.281 1.5-1.75.358-8.294z\"/><path fill=\"#E0A577\" d=\"M26.639 12.178c-.224-3.25-3.213-6.074-6.717-6.345-3.504-.271-5.836 1.526-6.725 4.692-.889 3.166.805 7.738.805 7.738l1.425 1.825 2.875 4.575 2.4.225 1.775-1.25 2.675-3.425 1.2-1.4.287-6.635z\"/><path fill=\"#C1694F\" d=\"M11.069 18.063c-2.5-1.688-3.02-4.602-3.02-4.602s-.937-6.219-.479-8.732c.458-2.513 2.769-3.27 4.436-2.498 1.667.771 1.428 1.705 2.016 3.575.588 1.87.336 3.803 1.078 5.614.741 1.811 1.913 2.933 2.26 4.618.346 1.685-.33 3.327-2.372 3.806-2.041.478-3.919-1.781-3.919-1.781z\"/><path fill=\"#E0A577\" d=\"M12.298 16.537c-2-1.35-2.416-3.682-2.416-3.682s-.75-4.975-.383-6.986c.367-2.01 2.215-2.616 3.549-1.998 1.333.617 1.142 1.364 1.613 2.86.47 1.496.269 3.042.862 4.491.593 1.449 1.531 2.347 1.808 3.694.277 1.348-.264 2.662-1.898 3.045-1.633.383-3.135-1.424-3.135-1.424z\"/><ellipse cx=\"17.952\" cy=\"32.656\" fill=\"#C1694F\" rx=\"4.218\" ry=\"1.594\"/><path fill=\"#E0A577\" d=\"M16.858 21.858s-.546 6.792-.179 8.75c.367 1.958 1 2.344 2.042 2.25 1.041-.094 1.291-1.125 1.375-2.417.083-1.292.125-8.333.125-8.333l-3.363-.25z\"/></svg>`;\n\nconst SVG_BEEF = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 36 36\"><path fill=\"#BE1931\" d=\"M35.728 10.357c-2.267-5.266-6.9-8.628-12.102-9.472-1.249-.203-7.308-.937-13.081 2.279C5.058 6.641 1.353 11.785.16 20.074c-.591 4.108-.074 7.093 1.539 8.871 2.021 2.229 5.555 2.596 8.306 2.596.976 0 1.87-.052 2.58-.103 2.018-.149 8.741-1.043 14.396-4.636 5.575-3.543 9.989-10.38 8.747-16.445z\"/><path fill=\"#DD2E44\" d=\"M33.728 11.357c-1.983-4.608-6.037-7.549-10.59-8.29-1.093-.178-6.395-.82-11.446 1.994C6.801 7.936 3.558 12.437 2.513 19.69c-.518 3.595-.065 6.207 1.347 7.762 1.769 1.951 4.861 2.272 7.268 2.272.854 0 1.636-.046 2.257-.09 1.766-.131 7.649-.913 12.597-4.057 4.88-3.102 8.742-9.085 7.746-14.22z\"/><path fill=\"#BE1931\" d=\"M23.901 5.398c-1.093-.178-6.395-.82-11.446 1.994-.969.54-1.859 1.157-2.674 1.833 1.019-.397 2.149-.652 3.394-.652 5.237 0 9.891 3.618 10.909 8.707.324 1.62.283 3.219-.056 4.73 3.019-2.727 5.476-6.757 4.62-10.392-1.983-4.608-6.037-7.549-10.59-8.29.614.09 4.219.788 5.843 2.07z\"/><ellipse cx=\"12.814\" cy=\"15.785\" fill=\"#F7DECE\" rx=\"7.021\" ry=\"5.404\"/><ellipse cx=\"12.814\" cy=\"15.785\" fill=\"#BE1931\" rx=\"3.298\" ry=\"2.54\"/></svg>`;\n\nconst SVG_PORK = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 36 36\"><path fill=\"#C1694F\" d=\"M31.29 13.214c-.483-4.839-5.274-8.944-10.761-9.221-5.487-.277-9.12 2.704-10.481 7.571-1.361 4.867.636 11.714 1.959 14.199 1.323 2.485 2.978 4.354 6.27 4.648 3.292.294 6.234-1.102 8.413-3.826 2.179-2.724 5.083-8.532 4.6-13.371z\"/><path fill=\"#E0A577\" d=\"M28.632 13.661c-.386-3.871-4.219-7.155-8.609-7.377-4.39-.222-7.296 2.163-8.385 6.057-1.089 3.894.509 9.371 1.567 11.359 1.058 1.988 2.382 3.483 5.016 3.718 2.634.235 4.987-.882 6.73-3.061 1.744-2.179 4.067-6.825 3.681-10.696z\"/><path fill=\"#FFCC4D\" d=\"M10.733 19.714c-1.128 1.332-4.012 4.523-5.345 5.618-1.333 1.095-3.857 2.857-3.857 4.762s1.524 3.619 3.619 3.619c2.095 0 3.583-1.179 4.917-2.333 1.333-1.155 4.379-4.446 5.065-5.422.686-.976 1.143-2.531.762-3.238-.381-.708-2.115-.746-3.219-.368-1.105.381-1.942-2.638-1.942-2.638z\"/><path fill=\"#FFAC33\" d=\"M5.482 31.003c-.073 0-.146-.022-.209-.067-.156-.111-.193-.328-.082-.484 1.04-1.459 3.113-4.063 3.134-4.09.117-.148.331-.177.483-.063.151.114.182.328.067.48-.021.027-2.089 2.625-3.125 4.078-.069.095-.176.146-.268.146zm1.729.814c-.073 0-.147-.022-.21-.068-.155-.111-.192-.328-.081-.484 1.373-1.928 3.076-4.138 3.093-4.161.115-.151.33-.181.482-.066.152.113.183.328.068.48-.017.023-1.716 2.228-3.084 4.148-.068.098-.175.151-.268.151zm1.787.664c-.073 0-.147-.022-.21-.068-.155-.111-.192-.328-.081-.484 1.398-1.961 2.869-3.931 2.884-3.951.114-.152.33-.184.482-.069.153.113.185.327.071.48-.015.02-1.482 1.984-2.877 3.941-.068.099-.175.151-.269.151z\"/><ellipse cx=\"6.833\" cy=\"32.524\" fill=\"#FFCC4D\" rx=\"2.667\" ry=\"1.143\"/></svg>`;\n\nconst SVG_FISH = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 36 36\"><path fill=\"#55ACEE\" d=\"M27 2s-5.958 3.75-8.031 5.469C14.865 11.057 8.503 18.839 5 23c-1.5 1-2.5 2.25-2.5 3.5 0 2.5 2.603 5.5 4.5 5.5 1.5 0 2.5-1 3.5-2.5 3.5-4.5 10.654-10.588 13.5-13.5C25.806 14.056 31 9 31 9l-4-7z\"/><circle cx=\"9.5\" cy=\"27.5\" r=\"1.5\" fill=\"#292F33\"/><path fill=\"#3B88C3\" d=\"M25 4s-4.958 3.75-7.031 5.469C13.865 13.057 8.503 19.839 5 24c-1.5 1-2.083 2.5-2.083 3.5 0 1.75 1.686 3.5 3.583 3.5 1.5 0 2.5-1 3.5-2.5 3.5-4.5 9.654-9.588 12.5-12.5C24.306 14.056 29 10 29 10l-4-6z\"/><path fill=\"#55ACEE\" d=\"M31 8s3 3.334 3 6c0 2.668-3 6-3 6l-2.667-5.333L31 8z\"/><path fill=\"#3B88C3\" d=\"M29 10s3 2.334 3 5c0 2.668-3 5-3 5l-2-4.5 2-5.5z\"/></svg>`;\n\nconst SVG_SHRIMP = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 36 36\"><path fill=\"#F4900C\" d=\"M26.688 9.812c-.271 2.917-1.167 8.146-4.792 11.771-2.917 2.917-8.771 3.125-12.708 3.125-1.549 0-2.912-.049-3.938-.106-1.958-.107-2.313-.707-2.188-1.914s1.538-.998 3.059-.871c.761.063 1.722.107 2.817.107 3.458 0 8.146-.438 10.146-2.438 2.833-2.833 3.563-6.563 3.813-8.938.188-1.792.854-1.917 1.604-1.646.75.272.395 1.91.187 2.91z\"/><path fill=\"#FFCC4D\" d=\"M10.376 15.098c-2.188.354-3.188.917-3.188 2.417 0 1.125.667 1.792 1.792 1.792 1.75 0 2.104-.771 2.104-1.917s-.708-2.292-.708-2.292z\"/><path fill=\"#F4900C\" d=\"M16.542 10.639c-4.25 0-5.917 2.042-6.875 4.5.084-.001.162-.014.25-.014 2.292 0 2.667 2.417 2.667 3.583 0 1.75-.854 3.167-3.292 3.167-1.708 0-3-1.104-3.145-2.958-.032.035-.065.065-.098.101-1.125 1.25-1.875 3.063-1.875 5.875 0 4.166 3.333 8.229 8.833 8.229s9.667-4.229 9.667-9.646c0-6.625-3.25-12.837-6.132-12.837z\"/><circle cx=\"9.396\" cy=\"27.441\" r=\"1.25\" fill=\"#662113\"/><path fill=\"#FFCC4D\" d=\"M15.5 25c-1.375 0-2.5 1.625-2.5 3.5 0 1.25.375 2.5 1.875 2.5 1.667 0 2.125-1.417 2.125-2.917 0-1.208-.125-3.083-1.5-3.083zm4-1c-1.125 0-2 1.542-2 3.25 0 1.083.333 2.25 1.625 2.25 1.375 0 1.875-1.208 1.875-2.583 0-1.084-.167-2.917-1.5-2.917z\"/><path fill=\"#F4900C\" d=\"M5.813 25.77c-.094-.178-.428-.188-.746-.022-.318.166-.479.452-.385.631l1.334 2.428c.081.155.327.187.599.095-.233-.497-1.026-1.995-.802-3.132z\"/><path fill=\"#FFCC4D\" d=\"M30.599 5.401c-.345.174-.525.513-.431.785.036.104.136.393-.212.938-.49.768-1.679 1.717-4.002 2.882-5.708 2.862-8.62.67-10.33-.776-.615-.52-1.084-1.059-1.462-1.55-.295-.384-.764-.389-1.047-.01-.283.378-.172.919.168 1.27l.022.023c.396.443.925.986 1.622 1.555 1.981 1.616 5.846 4.287 12.511.948 2.549-1.277 3.944-2.394 4.604-3.429.451-.708.554-1.378.343-1.988-.094-.272-.34-.361-.513-.361-.089 0-.175.021-.249.059-.355.179-.549.504-.479.784.054.217-.011.448-.234.668-.356.351-1.085.787-2.186 1.323-3.364 1.637-5.539 1.314-6.753.552-1.028-.646-1.424-1.558-1.425-1.56-.116-.266-.5-.361-.857-.212-.356.149-.54.484-.423.749l.001.002c.02.046.508 1.131 1.778 1.933 1.535.968 4.167 1.378 8.079-.527 1.212-.59 2.036-1.087 2.495-1.54.538-.531.659-1.102.529-1.574-.132-.476-.51-.818-.993-.818-.109 0-.221.019-.334.056z\"/><ellipse cx=\"27.819\" cy=\"2.692\" fill=\"#FFCC4D\" rx=\"2.413\" ry=\"1.025\" transform=\"rotate(-63.435 27.82 2.693)\"/><ellipse cx=\"30.569\" cy=\"4.067\" fill=\"#FFCC4D\" rx=\"2.413\" ry=\"1.025\" transform=\"rotate(-63.435 30.57 4.067)\"/></svg>`;\n\nconst SVG_EGG = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 36 36\"><path fill=\"#E1E8ED\" d=\"M18 35c-7.732 0-14-4.701-14-10.5C4 14.603 11.268 1 18 1s14 13.603 14 23.5c0 5.799-6.268 10.5-14 10.5z\"/><path fill=\"#CCD6DD\" d=\"M18 33c-6.627 0-12-3.873-12-8.5C6 15.603 12.268 3 18 3s12 12.603 12 21.5c0 4.627-5.373 8.5-12 8.5z\"/></svg>`;\n\nconst SVG_BROCCOLI = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 36 36\"><path fill=\"#77B255\" d=\"M22.453 35.564c-.315 0-.636-.08-.934-.251-5.281-3.029-5.792-10.958-5.813-11.294-.042-.679.474-1.263 1.152-1.305.683-.048 1.263.474 1.305 1.152.005.073.456 7.134 4.607 9.515.59.339.795 1.091.456 1.683-.227.396-.642.617-1.069.617-.001-.117-.296-.117-.704-.117z\"/><path fill=\"#5C913B\" d=\"M13.838 35.564c-.315 0-.636-.08-.934-.251-5.281-3.029-5.792-10.958-5.813-11.294-.042-.679.474-1.263 1.152-1.305.683-.048 1.263.474 1.305 1.152.005.073.456 7.134 4.607 9.515.59.339.795 1.091.456 1.683-.227.396-.642.617-1.069.617-.001-.117-.296-.117-.704-.117z\"/><ellipse cx=\"20.285\" cy=\"18.546\" fill=\"#77B255\" rx=\"5.701\" ry=\"5.476\"/><ellipse cx=\"8.073\" cy=\"15.9\" fill=\"#5C913B\" rx=\"5.145\" ry=\"4.943\"/><circle cx=\"23.111\" cy=\"9.561\" r=\"5.588\" fill=\"#77B255\"/><ellipse cx=\"13.838\" cy=\"7.589\" fill=\"#5C913B\" rx=\"4.866\" ry=\"4.674\"/><circle cx=\"17.236\" cy=\"13.369\" r=\"6.145\" fill=\"#3E721D\"/><circle cx=\"10.166\" cy=\"9.561\" r=\"4.588\" fill=\"#77B255\"/><circle cx=\"26.508\" cy=\"14.571\" r=\"4.588\" fill=\"#5C913B\"/><ellipse cx=\"20.285\" cy=\"4.787\" fill=\"#5C913B\" rx=\"4.31\" ry=\"4.141\"/></svg>`;\n\nconst SVG_RICE = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 36 36\"><path fill=\"#CCD6DD\" d=\"M33 22H3c-1.657 0-3 1.343-3 3v6c0 1.657 1.343 3 3 3h30c1.657 0 3-1.343 3-3v-6c0-1.657-1.343-3-3-3z\"/><path fill=\"#E1E8ED\" d=\"M33 20H3c-1.657 0-3 1.343-3 3v6c0 1.657 1.343 3 3 3h30c1.657 0 3-1.343 3-3v-6c0-1.657-1.343-3-3-3z\"/><path fill=\"#F5F8FA\" d=\"M8 18c-.552 0-1-.447-1-1v-4c0-.553.448-1 1-1s1 .447 1 1v4c0 .553-.448 1-1 1zm4 0c-.552 0-1-.447-1-1v-5c0-.553.448-1 1-1s1 .447 1 1v5c0 .553-.448 1-1 1zm4-1c-.552 0-1-.447-1-1v-4c0-.553.448-1 1-1s1 .447 1 1v4c0 .553-.448 1-1 1zm4 0c-.552 0-1-.447-1-1v-5c0-.553.448-1 1-1s1 .447 1 1v5c0 .553-.448 1-1 1zm4 1c-.552 0-1-.447-1-1v-4c0-.553.448-1 1-1s1 .447 1 1v4c0 .553-.448 1-1 1zm4 0c-.552 0-1-.447-1-1v-5c0-.553.448-1 1-1s1 .447 1 1v5c0 .553-.448 1-1 1z\"/></svg>`;\n\nconst SVG_FRIED_EGG = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 36 36\"><path fill=\"#E1E8ED\" d=\"M35 19.5c0 4.142-3.582 7.5-8 7.5-2.348 0-4.471-.939-6-2.452C19.471 26.061 17.348 27 15 27c-4.418 0-8-3.358-8-7.5 0-.646.087-1.271.248-1.865C4.414 17.047 2 14.552 2 11.5 2 8.186 4.833 5.5 8.333 5.5c.357 0 .707.027 1.05.078C10.66 3.398 12.928 2 15.5 2c2.572 0 4.84 1.398 6.117 3.578.343-.051.693-.078 1.05-.078C26.167 5.5 29 8.186 29 11.5c0 .985-.227 1.918-.631 2.757C32.159 14.676 35 16.799 35 19.5z\"/><ellipse cx=\"15\" cy=\"18\" fill=\"#FFCC4D\" rx=\"8\" ry=\"7\"/><ellipse cx=\"15\" cy=\"17\" fill=\"#FFE8B6\" rx=\"4\" ry=\"3.5\"/></svg>`;\n\n// =============================================================================\n// CATEGORY ICONS\n// =============================================================================\n\nexport const CATEGORY_ICONS: Record<string, string> = {\n poultry: toDataUrl(SVG_POULTRY),\n beef: toDataUrl(SVG_BEEF),\n pork: toDataUrl(SVG_PORK),\n seafood_fish: toDataUrl(SVG_FISH),\n seafood_shellfish: toDataUrl(SVG_SHRIMP),\n egg: toDataUrl(SVG_EGG),\n vegetable: toDataUrl(SVG_BROCCOLI),\n grain: toDataUrl(SVG_RICE),\n};\n\n// =============================================================================\n// INGREDIENT ICONS\n// =============================================================================\n\nexport const INGREDIENT_ICONS: Record<string, string> = {\n // Poultry\n chicken_breast: toDataUrl(SVG_POULTRY),\n chicken_breast_boneless: toDataUrl(SVG_POULTRY),\n chicken_thigh_boneless: toDataUrl(SVG_POULTRY),\n chicken_thigh: toDataUrl(SVG_POULTRY),\n chicken_whole: toDataUrl(SVG_POULTRY),\n turkey_breast: toDataUrl(SVG_POULTRY),\n\n // Beef\n beef_steak_ribeye: toDataUrl(SVG_BEEF),\n beef_ground: toDataUrl(SVG_BEEF),\n beef_roast: toDataUrl(SVG_BEEF),\n\n // Pork\n pork_chop: toDataUrl(SVG_PORK),\n pork_tenderloin: toDataUrl(SVG_PORK),\n pork_ribs: toDataUrl(SVG_PORK),\n\n // Seafood\n salmon_fillet: toDataUrl(SVG_FISH),\n tuna_steak: toDataUrl(SVG_FISH),\n cod_fillet: toDataUrl(SVG_FISH),\n shrimp: toDataUrl(SVG_SHRIMP),\n\n // Eggs\n egg_fried: toDataUrl(SVG_FRIED_EGG),\n egg_boiled: toDataUrl(SVG_EGG),\n egg_scrambled: toDataUrl(SVG_FRIED_EGG),\n egg_poached: toDataUrl(SVG_FRIED_EGG),\n\n // Vegetables\n broccoli: toDataUrl(SVG_BROCCOLI),\n asparagus: toDataUrl(SVG_BROCCOLI),\n potato: toDataUrl(SVG_BROCCOLI),\n carrot: toDataUrl(SVG_BROCCOLI),\n\n // Grains\n rice_white: toDataUrl(SVG_RICE),\n pasta: toDataUrl(SVG_RICE),\n quinoa: toDataUrl(SVG_RICE),\n};\n\n// =============================================================================\n// HELPER\n// =============================================================================\n\nexport const getIcon = (id: string, category?: string): string | undefined => {\n if (INGREDIENT_ICONS[id]) {\n return INGREDIENT_ICONS[id];\n }\n if (category && CATEGORY_ICONS[category]) {\n return CATEGORY_ICONS[category];\n }\n return undefined;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,IAAM,YAAY,CAAC,QAAwB;AACzC,QAAM,UAAU,mBAAmB,GAAG,EACnC,QAAQ,MAAM,KAAK,EACnB,QAAQ,MAAM,KAAK;AACtB,SAAO,sBAAsB,OAAO;AACtC;AAMA,IAAM,cAAc;AAEpB,IAAM,WAAW;AAEjB,IAAM,WAAW;AAEjB,IAAM,WAAW;AAEjB,IAAM,aAAa;AAEnB,IAAM,UAAU;AAEhB,IAAM,eAAe;AAErB,IAAM,WAAW;AAEjB,IAAM,gBAAgB;AAMf,IAAM,iBAAyC;AAAA,EACpD,SAAS,UAAU,WAAW;AAAA,EAC9B,MAAM,UAAU,QAAQ;AAAA,EACxB,MAAM,UAAU,QAAQ;AAAA,EACxB,cAAc,UAAU,QAAQ;AAAA,EAChC,mBAAmB,UAAU,UAAU;AAAA,EACvC,KAAK,UAAU,OAAO;AAAA,EACtB,WAAW,UAAU,YAAY;AAAA,EACjC,OAAO,UAAU,QAAQ;AAC3B;AAMO,IAAM,mBAA2C;AAAA;AAAA,EAEtD,gBAAgB,UAAU,WAAW;AAAA,EACrC,yBAAyB,UAAU,WAAW;AAAA,EAC9C,wBAAwB,UAAU,WAAW;AAAA,EAC7C,eAAe,UAAU,WAAW;AAAA,EACpC,eAAe,UAAU,WAAW;AAAA,EACpC,eAAe,UAAU,WAAW;AAAA;AAAA,EAGpC,mBAAmB,UAAU,QAAQ;AAAA,EACrC,aAAa,UAAU,QAAQ;AAAA,EAC/B,YAAY,UAAU,QAAQ;AAAA;AAAA,EAG9B,WAAW,UAAU,QAAQ;AAAA,EAC7B,iBAAiB,UAAU,QAAQ;AAAA,EACnC,WAAW,UAAU,QAAQ;AAAA;AAAA,EAG7B,eAAe,UAAU,QAAQ;AAAA,EACjC,YAAY,UAAU,QAAQ;AAAA,EAC9B,YAAY,UAAU,QAAQ;AAAA,EAC9B,QAAQ,UAAU,UAAU;AAAA;AAAA,EAG5B,WAAW,UAAU,aAAa;AAAA,EAClC,YAAY,UAAU,OAAO;AAAA,EAC7B,eAAe,UAAU,aAAa;AAAA,EACtC,aAAa,UAAU,aAAa;AAAA;AAAA,EAGpC,UAAU,UAAU,YAAY;AAAA,EAChC,WAAW,UAAU,YAAY;AAAA,EACjC,QAAQ,UAAU,YAAY;AAAA,EAC9B,QAAQ,UAAU,YAAY;AAAA;AAAA,EAG9B,YAAY,UAAU,QAAQ;AAAA,EAC9B,OAAO,UAAU,QAAQ;AAAA,EACzB,QAAQ,UAAU,QAAQ;AAC5B;AAMO,IAAM,UAAU,CAAC,IAAY,aAA0C;AAC5E,MAAI,iBAAiB,EAAE,GAAG;AACxB,WAAO,iBAAiB,EAAE;AAAA,EAC5B;AACA,MAAI,YAAY,eAAe,QAAQ,GAAG;AACxC,WAAO,eAAe,QAAQ;AAAA,EAChC;AACA,SAAO;AACT;","names":[]}
|