@jjlmoya/utils-cooking 1.33.0 → 1.34.0
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/package.json +1 -1
- package/src/category/index.ts +4 -0
- package/src/entries.ts +5 -1
- package/src/index.ts +2 -0
- package/src/tests/i18n-titles.test.ts +1 -1
- package/src/tests/i18n_coverage.test.ts +1 -0
- package/src/tests/locale_completeness.test.ts +2 -2
- package/src/tests/tool_validation.test.ts +2 -2
- package/src/tool/carry-over-cooking-predictor/bibliography.astro +6 -0
- package/src/tool/carry-over-cooking-predictor/bibliography.ts +10 -0
- package/src/tool/carry-over-cooking-predictor/carry-over-cooking-predictor.css +513 -0
- package/src/tool/carry-over-cooking-predictor/component.astro +362 -0
- package/src/tool/carry-over-cooking-predictor/entry.ts +26 -0
- package/src/tool/carry-over-cooking-predictor/i18n/de.ts +286 -0
- package/src/tool/carry-over-cooking-predictor/i18n/en.ts +286 -0
- package/src/tool/carry-over-cooking-predictor/i18n/es.ts +286 -0
- package/src/tool/carry-over-cooking-predictor/i18n/fr.ts +286 -0
- package/src/tool/carry-over-cooking-predictor/i18n/id.ts +286 -0
- package/src/tool/carry-over-cooking-predictor/i18n/it.ts +286 -0
- package/src/tool/carry-over-cooking-predictor/i18n/ja.ts +286 -0
- package/src/tool/carry-over-cooking-predictor/i18n/ko.ts +286 -0
- package/src/tool/carry-over-cooking-predictor/i18n/nl.ts +286 -0
- package/src/tool/carry-over-cooking-predictor/i18n/pl.ts +286 -0
- package/src/tool/carry-over-cooking-predictor/i18n/pt.ts +286 -0
- package/src/tool/carry-over-cooking-predictor/i18n/ru.ts +286 -0
- package/src/tool/carry-over-cooking-predictor/i18n/sv.ts +286 -0
- package/src/tool/carry-over-cooking-predictor/i18n/tr.ts +286 -0
- package/src/tool/carry-over-cooking-predictor/i18n/zh.ts +286 -0
- package/src/tool/carry-over-cooking-predictor/index.ts +11 -0
- package/src/tool/carry-over-cooking-predictor/logic.ts +63 -0
- package/src/tool/carry-over-cooking-predictor/seo.astro +15 -0
- package/src/tool/egg-timer/component.astro +19 -17
- package/src/tool/egg-timer/perfect-boiled-egg-timer-altitude-calculator.css +336 -502
- package/src/tool/maillard-reaction-optimizer/bibliography.astro +6 -0
- package/src/tool/maillard-reaction-optimizer/bibliography.ts +14 -0
- package/src/tool/maillard-reaction-optimizer/component.astro +391 -0
- package/src/tool/maillard-reaction-optimizer/entry.ts +12 -0
- package/src/tool/maillard-reaction-optimizer/i18n/de.ts +307 -0
- package/src/tool/maillard-reaction-optimizer/i18n/en.ts +307 -0
- package/src/tool/maillard-reaction-optimizer/i18n/es.ts +307 -0
- package/src/tool/maillard-reaction-optimizer/i18n/fr.ts +307 -0
- package/src/tool/maillard-reaction-optimizer/i18n/id.ts +307 -0
- package/src/tool/maillard-reaction-optimizer/i18n/it.ts +307 -0
- package/src/tool/maillard-reaction-optimizer/i18n/ja.ts +307 -0
- package/src/tool/maillard-reaction-optimizer/i18n/ko.ts +307 -0
- package/src/tool/maillard-reaction-optimizer/i18n/nl.ts +308 -0
- package/src/tool/maillard-reaction-optimizer/i18n/pl.ts +307 -0
- package/src/tool/maillard-reaction-optimizer/i18n/pt.ts +307 -0
- package/src/tool/maillard-reaction-optimizer/i18n/ru.ts +307 -0
- package/src/tool/maillard-reaction-optimizer/i18n/sv.ts +307 -0
- package/src/tool/maillard-reaction-optimizer/i18n/tr.ts +307 -0
- package/src/tool/maillard-reaction-optimizer/i18n/zh.ts +307 -0
- package/src/tool/maillard-reaction-optimizer/index.ts +11 -0
- package/src/tool/maillard-reaction-optimizer/logic.ts +57 -0
- package/src/tool/maillard-reaction-optimizer/maillard-reaction-optimizer.css +694 -0
- package/src/tool/maillard-reaction-optimizer/seo.astro +15 -0
- package/src/tool/meat-binder-transglutaminase-calculator/bibliography.ts +10 -6
- package/src/tool/meat-binder-transglutaminase-calculator/component.astro +5 -1
- package/src/tool/meat-binder-transglutaminase-calculator/components/LabReport.astro +3 -3
- package/src/tools.ts +4 -0
- package/src/types.ts +1 -1
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import { bibliography } from '../bibliography';
|
|
3
|
+
|
|
4
|
+
const title = '余热烹饪预测器:热惯性计算工具';
|
|
5
|
+
const description = '预测烤肉从烤箱取出后内部温度还会继续上升多少度。获取精确的取出温度,完美达到理想熟度。';
|
|
6
|
+
|
|
7
|
+
const faq = [
|
|
8
|
+
{
|
|
9
|
+
question: '什么是余热烹饪(Carry-Over Cooking)?为什么会发生?',
|
|
10
|
+
answer: '余热烹饪(也称热惯性)是指食物从烤箱取出后内部温度继续上升的现象。烤制过程中积聚在外层的热量会持续向中心传导。在50°C时取出的烤肉,静置后可达54°C-这就是一成熟和三成熟之间的差异。',
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
question: '烤箱温度如何影响余热效应?',
|
|
14
|
+
answer: '较高的烤箱温度(200-250°C)会在表面和核心之间形成更大的温度梯度,在外壳中储存更多潜热,从而增强余热效应。在120°C下烤制的肉余热升温极小(约1°C),而在220°C下烤制时,静置期间可升温5-8°C。',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: '肉的形状会影响余热计算吗?',
|
|
18
|
+
answer: '会的。形状会显著影响热渗透。整禽和厚块烤肉相对于表面积具有更大的热容量,因此保留更多热量,余热效应也更显著。牛排等扁平切块表面与体积之比高,冷却快,余热效应极小。',
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
question: '取出肉后应该静置多长时间?',
|
|
22
|
+
answer: '静置时间取决于重量和形状。一般规则是每100g肉约1分钟,最少10分钟,最长45分钟。一块2kg的烤肉大约需要16分钟静置。在此期间,内部温度均衡,余热效应完成。',
|
|
23
|
+
},
|
|
24
|
+
];
|
|
25
|
+
|
|
26
|
+
const howTo = [
|
|
27
|
+
{
|
|
28
|
+
name: '选择肉的形状',
|
|
29
|
+
text: '禽类选择「整禽」,里脊和去骨肉块选择「圆柱形烤肉」,牛排和鱼柳选择「扁平切块」。',
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
name: '输入重量',
|
|
33
|
+
text: '以克为单位输入肉的总重量。不同形状类型有各自的最小重量限制。',
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: '设置烤箱温度',
|
|
37
|
+
text: '输入您的实际烤箱温度。温度越高,余热效应越强。',
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: '设置目标温度',
|
|
41
|
+
text: '输入期望的最终内部温度(例如:牛肉三分熟54°C,家禽74°C)。',
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: '读取取出温度',
|
|
45
|
+
text: '计算器会告诉您何时取出肉,以便静置后达到目标温度。',
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
name: '静置肉品',
|
|
49
|
+
text: '按推荐时间让肉静置。不要包裹太紧,否则外壳会变软。',
|
|
50
|
+
},
|
|
51
|
+
];
|
|
52
|
+
|
|
53
|
+
const faqSchema = {
|
|
54
|
+
'@context': 'https://schema.org' as const,
|
|
55
|
+
'@type': 'FAQPage' as const,
|
|
56
|
+
mainEntity: faq.map((item) => ({
|
|
57
|
+
'@type': 'Question' as const,
|
|
58
|
+
name: item.question,
|
|
59
|
+
acceptedAnswer: { '@type': 'Answer' as const, text: item.answer },
|
|
60
|
+
})),
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
const howToSchema = {
|
|
64
|
+
'@context': 'https://schema.org' as const,
|
|
65
|
+
'@type': 'HowTo' as const,
|
|
66
|
+
name: title,
|
|
67
|
+
description,
|
|
68
|
+
step: howTo.map((step) => ({
|
|
69
|
+
'@type': 'HowToStep' as const,
|
|
70
|
+
name: step.name,
|
|
71
|
+
text: step.text,
|
|
72
|
+
})),
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const appSchema = {
|
|
76
|
+
'@context': 'https://schema.org' as const,
|
|
77
|
+
'@type': 'SoftwareApplication' as const,
|
|
78
|
+
name: title,
|
|
79
|
+
description,
|
|
80
|
+
applicationCategory: 'UtilitiesApplication',
|
|
81
|
+
operatingSystem: 'Web',
|
|
82
|
+
offers: { '@type': 'Offer' as const, price: '0', priceCurrency: 'EUR' },
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export const content: ToolLocaleContent = {
|
|
86
|
+
slug: 'carry-over-cooking-predictor',
|
|
87
|
+
title: '余热烹饪预测器',
|
|
88
|
+
description: '预测烤肉从烤箱取出后内部温度还会继续上升多少度。获取精确的取出温度,完美达到理想熟度。',
|
|
89
|
+
faqTitle: '常见问题',
|
|
90
|
+
ui: {
|
|
91
|
+
title: '余热烹饪预测器',
|
|
92
|
+
subtitle: '精准烧烤的热惯性计算工具',
|
|
93
|
+
geometryLabel: '肉品形状',
|
|
94
|
+
wholeBird: '整禽(家禽)',
|
|
95
|
+
cylindricalRoast: '圆柱形烤肉(里脊、去骨肉块)',
|
|
96
|
+
flatCut: '扁平切块(牛排、鱼柳)',
|
|
97
|
+
weightLabel: '重量',
|
|
98
|
+
ovenTempLabel: '烤箱温度',
|
|
99
|
+
targetTempLabel: '目标内部温度',
|
|
100
|
+
pullTemp: '取出温度',
|
|
101
|
+
carryOver: '余热效应',
|
|
102
|
+
restTime: '静置时间',
|
|
103
|
+
minutes: '分钟',
|
|
104
|
+
degreesC: '°C',
|
|
105
|
+
degreesF: '°F',
|
|
106
|
+
unitLabel: '单位',
|
|
107
|
+
metricUnit: '公制',
|
|
108
|
+
imperialUnit: '英制',
|
|
109
|
+
geometryDescCylindrical: '已选择圆柱形烤肉-适中的热惯性,余热效应可预测。',
|
|
110
|
+
weightG: 'g',
|
|
111
|
+
weightOz: 'oz',
|
|
112
|
+
errorTargetExceedsOven: '目标温度不能超过烤箱温度。',
|
|
113
|
+
errorOvenTooHot: '烤箱温度超过350°C,请降低温度。',
|
|
114
|
+
errorWeightTooLow: '重量低于此形状的最小值。',
|
|
115
|
+
errorWeightTooHigh: '重量超过此形状的最大值。',
|
|
116
|
+
pullNow: '立即取出肉品',
|
|
117
|
+
pullAt: '取出温度',
|
|
118
|
+
toReach: '达到',
|
|
119
|
+
afterRest: '静置后',
|
|
120
|
+
carryOverWillAdd: '余热效应约增加',
|
|
121
|
+
footerTemplate: '{carry} 余热 · {rest} 静置 · {weight}{wunit}, {oven} 烤箱 → {target} 目标',
|
|
122
|
+
},
|
|
123
|
+
faq,
|
|
124
|
+
howTo,
|
|
125
|
+
seo: [
|
|
126
|
+
{
|
|
127
|
+
type: 'title',
|
|
128
|
+
text: '余热烹饪预测器:每次都能找到完美的取出温度',
|
|
129
|
+
level: 2,
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
type: 'paragraph',
|
|
133
|
+
html: '余热烹饪是指食物离开烤箱后内部温度继续上升的现象。烤制过程中外层储存热量,这些能量在静置期间持续向较冷的中心传导。在50°C取出的厚块烤肉,静置后可达54°C-这就是一成熟和三分熟的区别。本计算器能精确预测烤肉温度会上升多少度,让您在最准确的时刻取出。',
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
type: 'stats',
|
|
137
|
+
columns: 4,
|
|
138
|
+
items: [
|
|
139
|
+
{ value: '5-8°C', label: '典型余热效应(高温烤箱)', icon: 'mdi:thermometer' },
|
|
140
|
+
{ value: '1-3°C', label: '最小余热效应(低温烤箱)', icon: 'mdi:thermometer-low' },
|
|
141
|
+
{ value: '16分钟', label: '2kg烤肉的静置时间', icon: 'mdi:clock-outline' },
|
|
142
|
+
{ value: '45分钟', label: '推荐最长静置时间', icon: 'mdi:clock-alert' },
|
|
143
|
+
],
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
type: 'title',
|
|
147
|
+
text: '按熟度分类的取出温度对照表',
|
|
148
|
+
level: 3,
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
type: 'paragraph',
|
|
152
|
+
html: '使用此表格找到您的目标内部温度,然后让计算器确定精确的取出温度。请记住:取出温度始终<strong>低于</strong>目标温度,因为余热效应会在静置期间继续加热。',
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
type: 'table',
|
|
156
|
+
headers: ['熟度', '目标温度', '取出温度(200°C烤箱)', '静置时间'],
|
|
157
|
+
rows: [
|
|
158
|
+
['牛肉 一成熟', '52°C / 126°F', '46-48°C / 115-118°F', '10-15分钟'],
|
|
159
|
+
['牛肉 三分熟', '54°C / 129°F', '48-50°C / 118-122°F', '10-15分钟'],
|
|
160
|
+
['牛肉 五分熟', '60°C / 140°F', '54-56°C / 129-133°F', '10-15分钟'],
|
|
161
|
+
['牛肉 全熟', '71°C / 160°F', '65-67°C / 149-153°F', '10-15分钟'],
|
|
162
|
+
['猪肉 七分熟', '63°C / 145°F', '57-59°C / 135-138°F', '10-15分钟'],
|
|
163
|
+
['猪肉 全熟', '71°C / 160°F', '65-67°C / 149-153°F', '10-15分钟'],
|
|
164
|
+
['鸡肉/火鸡胸肉', '74°C / 165°F', '68-70°C / 154-158°F', '15-20分钟'],
|
|
165
|
+
['鸡肉/火鸡腿肉', '82°C / 180°F', '76-78°C / 169-172°F', '15-20分钟'],
|
|
166
|
+
['羊肉 三分熟', '54°C / 129°F', '48-50°C / 118-122°F', '10-15分钟'],
|
|
167
|
+
['羊肉 五分熟', '60°C / 140°F', '54-56°C / 129-133°F', '10-15分钟'],
|
|
168
|
+
],
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
type: 'title',
|
|
172
|
+
text: '形状如何改变热力计算',
|
|
173
|
+
level: 3,
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
type: 'comparative',
|
|
177
|
+
columns: 3,
|
|
178
|
+
items: [
|
|
179
|
+
{
|
|
180
|
+
title: '整禽',
|
|
181
|
+
icon: 'mdi:food-drumstick',
|
|
182
|
+
description: '相对表面积而言热容量最大。厚实的胸肉和腿肉核心储存了巨大的潜热。',
|
|
183
|
+
highlight: false,
|
|
184
|
+
points: ['余热效应:200°C烤箱下5-10°C', '静置时间:20-45分钟', '最适合:火鸡、整鸡、鸭', '比目标温度低8-10°C时取出'],
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
title: '圆柱形烤肉',
|
|
188
|
+
icon: 'mdi:food-steak',
|
|
189
|
+
description: '最常见的烤肉形状。适中的保温性,余热效应可预测。',
|
|
190
|
+
highlight: true,
|
|
191
|
+
points: ['余热效应:200°C烤箱下3-7°C', '静置时间:15-30分钟', '最适合:里脊、猪腰肉、羊架', '比目标温度低5-7°C时取出'],
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
title: '扁平切块',
|
|
195
|
+
icon: 'mdi:food',
|
|
196
|
+
description: '表面与体积之比高,热量散失快。余热效应虽小但仍不可忽视。',
|
|
197
|
+
highlight: false,
|
|
198
|
+
points: ['余热效应:200°C烤箱下1-3°C', '静置时间:5-15分钟', '最适合:牛排、鸡胸肉、鱼柳', '比目标温度低1-3°C时取出'],
|
|
199
|
+
},
|
|
200
|
+
],
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
type: 'title',
|
|
204
|
+
text: '常见的余热烹饪错误及其解决方法',
|
|
205
|
+
level: 3,
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
type: 'diagnostic',
|
|
209
|
+
variant: 'warning',
|
|
210
|
+
title: '取出太晚',
|
|
211
|
+
html: '如果等到温度计显示目标温度才取出,余热效应会导致温度超额上升3-8°C。三分熟的烤肉会变成五分熟甚至七分熟。<strong>务必在比目标温度低5-8°C时取出。</strong>使用本计算器获取精确数值。',
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
type: 'diagnostic',
|
|
215
|
+
variant: 'error',
|
|
216
|
+
title: '切开太早',
|
|
217
|
+
html: '取出后立即切开烤肉会导致多达30%的肉汁流失。温度梯度没有时间均衡,中心仍然偏生而外层过熟。<strong>请按照推荐时间充分静置。</strong>用锡纸松散地盖住-不要紧紧包裹,否则蒸汽会使外壳变软。',
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
type: 'diagnostic',
|
|
221
|
+
variant: 'info',
|
|
222
|
+
title: '烤箱温度过低',
|
|
223
|
+
html: '低温烤箱(低于150°C / 300°F)在表面和核心之间形成的温度梯度极小。这意味着几乎没有余热效应。如果采用低温烹饪,可以在目标温度精确取出,超额升温的风险极小。但外壳的形成会显著减弱。',
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
type: 'title',
|
|
227
|
+
text: '完美烧烤的专业技巧',
|
|
228
|
+
level: 3,
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
type: 'tip',
|
|
232
|
+
title: '10度法则',
|
|
233
|
+
html: '高温烤箱(220°C / 425°F)下,整禽每100g肉大约增加1°C的余热升温,圆柱形烤肉每100g约增加0.7°C。可作为计算器结果的参考:220°C下烤制的2kg鸡肉,余热升温约7-9°C。',
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
type: 'tip',
|
|
237
|
+
title: '静置位置很重要',
|
|
238
|
+
html: '务必在温热的盘子或砧板上静置肉品,不要放在冷表面上。冷表面会从烤肉底部吸热,导致最终温度不均匀。整禽应胸肉朝上静置,使肉汁均匀分布到白肉中。',
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
type: 'tip',
|
|
242
|
+
title: '盖而不包',
|
|
243
|
+
html: '静置时用锡纸松散地盖住烤肉。紧紧包裹会锁住蒸汽,使外壳变软。松散覆盖可在让蒸汽逸出的同时减少约30%的热量损失,同时保留余热效应和酥脆的外皮。',
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
type: 'title',
|
|
247
|
+
text: '关键烧烤术语表',
|
|
248
|
+
level: 3,
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
type: 'glossary',
|
|
252
|
+
items: [
|
|
253
|
+
{ term: '余热烹饪 (Carry-Over Cooking)', definition: '食物从热源取出后内部温度继续上升的现象,由热量从外层向中心传导所致。' },
|
|
254
|
+
{ term: '取出温度', definition: '应将肉从烤箱取出的内部温度。考虑到余热效应,始终低于目标温度。' },
|
|
255
|
+
{ term: '目标温度', definition: '静置后肉应达到的最终内部温度。也称食用温度。' },
|
|
256
|
+
{ term: '热惯性', definition: '物体抵抗温度变化的性质。较重、密度较高的肉块热惯性更大,余热效应也更显著。' },
|
|
257
|
+
{ term: '静置', definition: '烤制后将肉静置不动的时间,使热量均衡、肉汁在纤维中重新分布。' },
|
|
258
|
+
{ term: '温度梯度', definition: '肉表面与核心之间的温度差。梯度越大,储存用于余热效应的潜热越多。' },
|
|
259
|
+
{ term: '潜热', definition: '烤制过程中储存在肉外层的热能。在静置温度均衡过程中释放出来。' },
|
|
260
|
+
],
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
type: 'title',
|
|
264
|
+
text: '快速参考:推荐取出温度',
|
|
265
|
+
level: 3,
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
type: 'summary',
|
|
269
|
+
title: '完美效果建议取出温度(200°C / 400°F烤箱)',
|
|
270
|
+
items: [
|
|
271
|
+
'牛肉三分熟:48-50°C / 118-122°F取出,目标54°C / 129°F',
|
|
272
|
+
'牛肉五分熟:54-56°C / 129-133°F取出,目标60°C / 140°F',
|
|
273
|
+
'猪腰肉:57-59°C / 135-138°F取出,目标63°C / 145°F',
|
|
274
|
+
'鸡胸肉:68-70°C / 154-158°F取出,目标74°C / 165°F',
|
|
275
|
+
'整只火鸡:68-70°C / 154-158°F取出,目标74°C / 165°F(胸肉)',
|
|
276
|
+
'羊架:48-50°C / 118-122°F取出,目标54°C / 129°F',
|
|
277
|
+
],
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
type: 'paragraph',
|
|
281
|
+
html: '每块烤肉都不同。重量、实际烤箱温度和肉块的形状都会影响这些数值。这正是本计算器的用途-它根据您的具体输入,计算出适合您的精确取出温度。无需猜测,不会翻车。',
|
|
282
|
+
},
|
|
283
|
+
],
|
|
284
|
+
bibliography,
|
|
285
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
286
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ToolDefinition } from '../../types';
|
|
2
|
+
import { carryOverCooking } from './entry';
|
|
3
|
+
|
|
4
|
+
export * from './entry';
|
|
5
|
+
|
|
6
|
+
export const CARRY_OVER_COOKING_TOOL: ToolDefinition = {
|
|
7
|
+
entry: carryOverCooking,
|
|
8
|
+
Component: () => import('./component.astro'),
|
|
9
|
+
SEOComponent: () => import('./seo.astro'),
|
|
10
|
+
BibliographyComponent: () => import('./bibliography.astro'),
|
|
11
|
+
};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export type MeatGeometry = 'whole-bird' | 'cylindrical-roast' | 'flat-cut';
|
|
2
|
+
|
|
3
|
+
export interface CarryOverInput {
|
|
4
|
+
weight: number;
|
|
5
|
+
ovenTemp: number;
|
|
6
|
+
targetTemp: number;
|
|
7
|
+
geometry: MeatGeometry;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface CarryOverResult {
|
|
11
|
+
pullTemp: number;
|
|
12
|
+
carryOverDegrees: number;
|
|
13
|
+
restTimeMinutes: number;
|
|
14
|
+
error: string | null;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const GEOMETRY_FACTOR: Record<MeatGeometry, number> = {
|
|
18
|
+
'whole-bird': 0.045,
|
|
19
|
+
'cylindrical-roast': 0.035,
|
|
20
|
+
'flat-cut': 0.025,
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const GEOMETRY_MIN_WEIGHT: Record<MeatGeometry, number> = {
|
|
24
|
+
'whole-bird': 500,
|
|
25
|
+
'cylindrical-roast': 300,
|
|
26
|
+
'flat-cut': 150,
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
const GEOMETRY_MAX_WEIGHT: Record<MeatGeometry, number> = {
|
|
30
|
+
'whole-bird': 8000,
|
|
31
|
+
'cylindrical-roast': 6000,
|
|
32
|
+
'flat-cut': 2000,
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export class CarryOverLogic {
|
|
36
|
+
static calculate(input: CarryOverInput): CarryOverResult {
|
|
37
|
+
if (input.targetTemp >= input.ovenTemp) {
|
|
38
|
+
return { pullTemp: 0, carryOverDegrees: 0, restTimeMinutes: 0, error: 'TargetTempExceedsOven' };
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (input.ovenTemp > 350) {
|
|
42
|
+
return { pullTemp: 0, carryOverDegrees: 0, restTimeMinutes: 0, error: 'OvenTooHot' };
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const minW = GEOMETRY_MIN_WEIGHT[input.geometry];
|
|
46
|
+
const maxW = GEOMETRY_MAX_WEIGHT[input.geometry];
|
|
47
|
+
if (input.weight < minW) {
|
|
48
|
+
return { pullTemp: 0, carryOverDegrees: 0, restTimeMinutes: 0, error: 'WeightTooLow' };
|
|
49
|
+
}
|
|
50
|
+
if (input.weight > maxW) {
|
|
51
|
+
return { pullTemp: 0, carryOverDegrees: 0, restTimeMinutes: 0, error: 'WeightTooHigh' };
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const deltaOven = input.ovenTemp - input.targetTemp;
|
|
55
|
+
const factor = GEOMETRY_FACTOR[input.geometry];
|
|
56
|
+
const weightFactor = Math.min(1, input.weight / 3000);
|
|
57
|
+
const carryOverDegrees = parseFloat((deltaOven * factor * weightFactor).toFixed(1));
|
|
58
|
+
const pullTemp = parseFloat((input.targetTemp - carryOverDegrees).toFixed(1));
|
|
59
|
+
const restTimeMinutes = Math.round(Math.min(45, Math.max(10, input.weight / 100 * 0.8)));
|
|
60
|
+
|
|
61
|
+
return { pullTemp, carryOverDegrees, restTimeMinutes, error: null };
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
3
|
+
import { carryOverCooking } from './entry';
|
|
4
|
+
import type { KnownLocale } from '../../types';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { locale = 'en' } = Astro.props;
|
|
11
|
+
const content = await carryOverCooking.i18n[locale]?.();
|
|
12
|
+
if (!content) return null;
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
@@ -10,32 +10,34 @@ const { ui } = Astro.props;
|
|
|
10
10
|
---
|
|
11
11
|
|
|
12
12
|
<div class="egg-timer-wrapper">
|
|
13
|
-
<div class="egg-timer-
|
|
14
|
-
<div class="egg-timer-
|
|
15
|
-
<
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
<div class="egg-timer-
|
|
22
|
-
<div class="egg-timer-
|
|
13
|
+
<div class="egg-timer-main-card">
|
|
14
|
+
<div class="egg-timer-header">
|
|
15
|
+
<Icon name="mdi:tune" />
|
|
16
|
+
<span>{ui.parameters}</span>
|
|
17
|
+
</div>
|
|
18
|
+
|
|
19
|
+
<div class="egg-timer-body">
|
|
20
|
+
<div class="egg-timer-controls">
|
|
21
|
+
<div class="egg-timer-parameters-grid">
|
|
22
|
+
<div class="egg-timer-param">
|
|
23
23
|
<div class="egg-timer-label-row">
|
|
24
24
|
<label class="egg-timer-label">{ui.initial_temperature}</label>
|
|
25
25
|
</div>
|
|
26
26
|
<div class="egg-timer-buttons-group">
|
|
27
27
|
<button class="egg-timer-btn active" data-temp="4">
|
|
28
28
|
<Icon name="mdi:fridge" />
|
|
29
|
-
<span>{ui.fridge}</span>
|
|
29
|
+
<span>{ui.fridge}</span>
|
|
30
|
+
<span class="egg-timer-temp">4°C</span>
|
|
30
31
|
</button>
|
|
31
32
|
<button class="egg-timer-btn" data-temp="20">
|
|
32
33
|
<Icon name="mdi:thermometer" />
|
|
33
|
-
<span>{ui.ambient}</span>
|
|
34
|
+
<span>{ui.ambient}</span>
|
|
35
|
+
<span class="egg-timer-temp">20°C</span>
|
|
34
36
|
</button>
|
|
35
37
|
</div>
|
|
36
38
|
</div>
|
|
37
39
|
|
|
38
|
-
<div class="egg-timer-
|
|
40
|
+
<div class="egg-timer-param">
|
|
39
41
|
<div class="egg-timer-label-row">
|
|
40
42
|
<label class="egg-timer-label">{ui.egg_size}</label>
|
|
41
43
|
</div>
|
|
@@ -47,7 +49,7 @@ const { ui } = Astro.props;
|
|
|
47
49
|
</div>
|
|
48
50
|
</div>
|
|
49
51
|
|
|
50
|
-
<div class="egg-timer-
|
|
52
|
+
<div class="egg-timer-param">
|
|
51
53
|
<div class="egg-timer-label-row">
|
|
52
54
|
<label class="egg-timer-label">{ui.altitude}</label>
|
|
53
55
|
</div>
|
|
@@ -81,7 +83,7 @@ const { ui } = Astro.props;
|
|
|
81
83
|
</div>
|
|
82
84
|
|
|
83
85
|
<div class="egg-timer-results">
|
|
84
|
-
<div class="egg-timer-result-
|
|
86
|
+
<div class="egg-timer-result-item soft">
|
|
85
87
|
<div class="egg-timer-result-header">
|
|
86
88
|
<div>
|
|
87
89
|
<h3 class="egg-timer-result-title">{ui.soft_cooked}</h3>
|
|
@@ -92,7 +94,7 @@ const { ui } = Astro.props;
|
|
|
92
94
|
<div class="egg-timer-result-time" id="time-soft">00:00</div>
|
|
93
95
|
</div>
|
|
94
96
|
|
|
95
|
-
<div class="egg-timer-result-
|
|
97
|
+
<div class="egg-timer-result-item mollet">
|
|
96
98
|
<div class="egg-timer-result-header">
|
|
97
99
|
<div>
|
|
98
100
|
<h3 class="egg-timer-result-title">{ui.mollet}</h3>
|
|
@@ -103,7 +105,7 @@ const { ui } = Astro.props;
|
|
|
103
105
|
<div class="egg-timer-result-time" id="time-mollet">00:00</div>
|
|
104
106
|
</div>
|
|
105
107
|
|
|
106
|
-
<div class="egg-timer-result-
|
|
108
|
+
<div class="egg-timer-result-item hard">
|
|
107
109
|
<div class="egg-timer-result-header">
|
|
108
110
|
<div>
|
|
109
111
|
<h3 class="egg-timer-result-title">{ui.hard_cooked}</h3>
|