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 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: { name, safeMinimumTemp, tempUnit, restMinutes, suggestedMethod, visualIndicators }
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: { applianceTemp, applianceTempUnit, timeMinutes, notes, portionDescription }
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
- - `findByName(query)` - Find an ingredient by name or alias
52
- - `findById(id)` - Find an ingredient by its unique ID
53
- - `findByCategory(category)` - Get all ingredients in a category
54
- - `getAllEntries()` - Get all cooking temperature entries
55
- - `getAllCategories()` - Get all available categories
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
- - `convertTemperature(temp, from, to)` - Convert between Fahrenheit and Celsius
60
- - `getSafeMinimumTemp(ingredientId, unit?)` - Get USDA safe minimum temperature
61
- - `getDonenessTemp(ingredientId, doneness, unit?)` - Get temperature for a specific doneness level
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
- - `getCookingMethods(ingredientId)` - Get available cooking methods for an ingredient
66
- - `getCookingInstruction(ingredientId, method, portionHint?)` - Get detailed cooking instructions
67
- - `getQuickReference(query, method?, unit?)` - Get a quick reference with all relevant info
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
- - `poultry` - Chicken, turkey, duck
72
- - `beef` - Steaks, roasts, ground beef
73
- - `pork` - Chops, tenderloin, ribs
74
- - `seafood_fish` - Salmon, tuna, cod
75
- - `seafood_shellfish` - Shrimp, lobster, scallops
76
- - `egg` - Various egg preparations
77
- - `vegetable` - Common vegetables
78
- - `grain` - Rice, pasta, quinoa
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
- - `rare`
85
- - `medium_rare`
86
- - `medium`
87
- - `medium_well`
88
- - `well_done`
89
- - `safe_minimum` (USDA baseline)
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
- - `oven_roast`, `oven_bake`
94
- - `pan_sear`, `pan_fry`
95
- - `grill`, `broil`
96
- - `poach`, `simmer`, `boil`, `steam`
97
- - `sous_vide`
98
- - `air_fry`, `deep_fry`
99
- - `slow_cook`
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
 
@@ -0,0 +1,5 @@
1
+ declare const CATEGORY_ICONS: Record<string, string>;
2
+ declare const INGREDIENT_ICONS: Record<string, string>;
3
+ declare const getIcon: (id: string, category?: string) => string | undefined;
4
+
5
+ export { CATEGORY_ICONS, INGREDIENT_ICONS, getIcon };
@@ -0,0 +1,5 @@
1
+ declare const CATEGORY_ICONS: Record<string, string>;
2
+ declare const INGREDIENT_ICONS: Record<string, string>;
3
+ declare const getIcon: (id: string, category?: string) => string | undefined;
4
+
5
+ export { CATEGORY_ICONS, INGREDIENT_ICONS, getIcon };
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":[]}