@jjlmoya/utils-cooking 1.2.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 +60 -0
- package/src/category/i18n/en.ts +24 -0
- package/src/category/i18n/es.ts +208 -0
- package/src/category/i18n/fr.ts +24 -0
- package/src/category/index.ts +37 -0
- package/src/category/seo.astro +15 -0
- package/src/components/PreviewNavSidebar.astro +116 -0
- package/src/components/PreviewToolbar.astro +143 -0
- package/src/data.ts +11 -0
- package/src/env.d.ts +5 -0
- package/src/index.ts +32 -0
- package/src/layouts/PreviewLayout.astro +117 -0
- package/src/pages/[locale]/[slug].astro +146 -0
- package/src/pages/[locale].astro +251 -0
- package/src/pages/index.astro +4 -0
- package/src/tests/faq_count.test.ts +19 -0
- package/src/tests/i18n-titles.test.ts +66 -0
- package/src/tests/locale_completeness.test.ts +42 -0
- package/src/tests/mocks/astro_mock.js +2 -0
- package/src/tests/no_h1_in_components.test.ts +48 -0
- package/src/tests/seo_length.test.ts +22 -0
- package/src/tests/tool_validation.test.ts +17 -0
- package/src/tool/american-kitchen-converter/AmericanKitchenEngine.ts +259 -0
- package/src/tool/american-kitchen-converter/bibliography.astro +6 -0
- package/src/tool/american-kitchen-converter/component.astro +838 -0
- package/src/tool/american-kitchen-converter/i18n/en.ts +282 -0
- package/src/tool/american-kitchen-converter/i18n/es.ts +281 -0
- package/src/tool/american-kitchen-converter/i18n/fr.ts +292 -0
- package/src/tool/american-kitchen-converter/index.ts +24 -0
- package/src/tool/american-kitchen-converter/seo.astro +8 -0
- package/src/tool/banana-ripeness/BananaCare.css +587 -0
- package/src/tool/banana-ripeness/BananaEngine.ts +79 -0
- package/src/tool/banana-ripeness/bibliography.astro +6 -0
- package/src/tool/banana-ripeness/component.astro +285 -0
- package/src/tool/banana-ripeness/i18n/en.ts +177 -0
- package/src/tool/banana-ripeness/i18n/es.ts +177 -0
- package/src/tool/banana-ripeness/i18n/fr.ts +177 -0
- package/src/tool/banana-ripeness/index.ts +24 -0
- package/src/tool/banana-ripeness/seo.astro +8 -0
- package/src/tool/brine/bibliography.astro +6 -0
- package/src/tool/brine/component.astro +884 -0
- package/src/tool/brine/i18n/en.ts +221 -0
- package/src/tool/brine/i18n/es.ts +222 -0
- package/src/tool/brine/i18n/fr.ts +221 -0
- package/src/tool/brine/index.ts +26 -0
- package/src/tool/brine/seo.astro +8 -0
- package/src/tool/cookware-guide/CookwareGuide.css +487 -0
- package/src/tool/cookware-guide/bibliography.astro +6 -0
- package/src/tool/cookware-guide/component.astro +164 -0
- package/src/tool/cookware-guide/i18n/en.ts +163 -0
- package/src/tool/cookware-guide/i18n/es.ts +163 -0
- package/src/tool/cookware-guide/i18n/fr.ts +164 -0
- package/src/tool/cookware-guide/index.ts +24 -0
- package/src/tool/cookware-guide/init.ts +174 -0
- package/src/tool/cookware-guide/seo.astro +8 -0
- package/src/tool/egg-timer/EggTimer.css +503 -0
- package/src/tool/egg-timer/bibliography.astro +14 -0
- package/src/tool/egg-timer/component.astro +281 -0
- package/src/tool/egg-timer/i18n/en.ts +230 -0
- package/src/tool/egg-timer/i18n/es.ts +222 -0
- package/src/tool/egg-timer/i18n/fr.ts +121 -0
- package/src/tool/egg-timer/index.ts +27 -0
- package/src/tool/egg-timer/seo.astro +39 -0
- package/src/tool/ingredient-rescaler/IngredientRescaler.css +308 -0
- package/src/tool/ingredient-rescaler/bibliography.astro +6 -0
- package/src/tool/ingredient-rescaler/component.astro +107 -0
- package/src/tool/ingredient-rescaler/i18n/en.ts +265 -0
- package/src/tool/ingredient-rescaler/i18n/es.ts +268 -0
- package/src/tool/ingredient-rescaler/i18n/fr.ts +207 -0
- package/src/tool/ingredient-rescaler/index.ts +24 -0
- package/src/tool/ingredient-rescaler/init.ts +200 -0
- package/src/tool/ingredient-rescaler/seo.astro +8 -0
- package/src/tool/kitchen-timer/KitchenTimer.css +325 -0
- package/src/tool/kitchen-timer/bibliography.astro +6 -0
- package/src/tool/kitchen-timer/component.astro +341 -0
- package/src/tool/kitchen-timer/i18n/en.ts +154 -0
- package/src/tool/kitchen-timer/i18n/es.ts +154 -0
- package/src/tool/kitchen-timer/i18n/fr.ts +154 -0
- package/src/tool/kitchen-timer/index.ts +26 -0
- package/src/tool/kitchen-timer/init.ts +55 -0
- package/src/tool/kitchen-timer/lib/AudioHelper.ts +27 -0
- package/src/tool/kitchen-timer/lib/DockManager.ts +97 -0
- package/src/tool/kitchen-timer/lib/KitchenTimer.ts +264 -0
- package/src/tool/kitchen-timer/seo.astro +8 -0
- package/src/tool/meringue-peak/MeringueCalculator.css +298 -0
- package/src/tool/meringue-peak/bibliography.astro +6 -0
- package/src/tool/meringue-peak/component.astro +169 -0
- package/src/tool/meringue-peak/i18n/en.ts +257 -0
- package/src/tool/meringue-peak/i18n/es.ts +234 -0
- package/src/tool/meringue-peak/i18n/fr.ts +234 -0
- package/src/tool/meringue-peak/index.ts +24 -0
- package/src/tool/meringue-peak/seo.astro +8 -0
- package/src/tool/mold-scaler/MoldScaler.css +406 -0
- package/src/tool/mold-scaler/bibliography.astro +6 -0
- package/src/tool/mold-scaler/component.astro +126 -0
- package/src/tool/mold-scaler/i18n/en.ts +268 -0
- package/src/tool/mold-scaler/i18n/es.ts +269 -0
- package/src/tool/mold-scaler/i18n/fr.ts +276 -0
- package/src/tool/mold-scaler/index.ts +26 -0
- package/src/tool/mold-scaler/init.ts +264 -0
- package/src/tool/mold-scaler/seo.astro +8 -0
- package/src/tool/pizza/Pizza.css +569 -0
- package/src/tool/pizza/bibliography.astro +6 -0
- package/src/tool/pizza/calculator.ts +143 -0
- package/src/tool/pizza/component.astro +237 -0
- package/src/tool/pizza/i18n/en.ts +288 -0
- package/src/tool/pizza/i18n/es.ts +289 -0
- package/src/tool/pizza/i18n/fr.ts +288 -0
- package/src/tool/pizza/index.ts +27 -0
- package/src/tool/pizza/seo.astro +8 -0
- package/src/tool/roux-guide/RouxGuide.css +483 -0
- package/src/tool/roux-guide/bibliography.astro +6 -0
- package/src/tool/roux-guide/component.astro +194 -0
- package/src/tool/roux-guide/i18n/en.ts +233 -0
- package/src/tool/roux-guide/i18n/es.ts +225 -0
- package/src/tool/roux-guide/i18n/fr.ts +225 -0
- package/src/tool/roux-guide/index.ts +24 -0
- package/src/tool/roux-guide/init.ts +187 -0
- package/src/tool/roux-guide/seo.astro +8 -0
- package/src/tool/sourdough-calculator/SourdoughCalculator.css +369 -0
- package/src/tool/sourdough-calculator/bibliography.astro +6 -0
- package/src/tool/sourdough-calculator/component.astro +198 -0
- package/src/tool/sourdough-calculator/i18n/en.ts +242 -0
- package/src/tool/sourdough-calculator/i18n/es.ts +243 -0
- package/src/tool/sourdough-calculator/i18n/fr.ts +248 -0
- package/src/tool/sourdough-calculator/index.ts +24 -0
- package/src/tool/sourdough-calculator/init.ts +131 -0
- package/src/tool/sourdough-calculator/seo.astro +8 -0
- package/src/tools.ts +29 -0
- package/src/types.ts +73 -0
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
---
|
|
2
|
+
import "./MeringueCalculator.css";
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
ui: Record<string, string>;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
const { ui } = Astro.props;
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
<div class="meringue-calculator-container">
|
|
12
|
+
<div class="meringue-card meringue-fade-in">
|
|
13
|
+
<div class="meringue-input-section">
|
|
14
|
+
<div class="meringue-input-group">
|
|
15
|
+
<label for="whites-input">{ui.whitesLabel}</label>
|
|
16
|
+
<div class="meringue-input-wrapper">
|
|
17
|
+
<input
|
|
18
|
+
type="number"
|
|
19
|
+
id="whites-input"
|
|
20
|
+
placeholder={ui.whitesPlaceholder}
|
|
21
|
+
min="1"
|
|
22
|
+
max="2000"
|
|
23
|
+
value="120"
|
|
24
|
+
/>
|
|
25
|
+
<span class="meringue-input-unit">{ui.whitesUnit}</span>
|
|
26
|
+
</div>
|
|
27
|
+
</div>
|
|
28
|
+
|
|
29
|
+
<div class="meringue-input-group">
|
|
30
|
+
<label>{ui.typeLabel}</label>
|
|
31
|
+
<div class="meringue-type-selector" id="type-selector">
|
|
32
|
+
<button class="meringue-type-btn active" data-type="french">{ui.typeFrench}</button>
|
|
33
|
+
<button class="meringue-type-btn" data-type="italian">{ui.typeItalian}</button>
|
|
34
|
+
<button class="meringue-type-btn" data-type="swiss">{ui.typeSwiss}</button>
|
|
35
|
+
</div>
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
38
|
+
|
|
39
|
+
<div class="meringue-results-grid" id="main-results"></div>
|
|
40
|
+
|
|
41
|
+
<div class="meringue-time-section">
|
|
42
|
+
<h3
|
|
43
|
+
style="font-size: 1.125rem; font-weight: 800; color: var(--text-dark); margin-bottom: 1.5rem;"
|
|
44
|
+
>
|
|
45
|
+
{ui.timesHeading}
|
|
46
|
+
</h3>
|
|
47
|
+
<div class="meringue-time-grid" id="time-grid"></div>
|
|
48
|
+
</div>
|
|
49
|
+
|
|
50
|
+
<div class="meringue-pro-tip" id="pro-tip">
|
|
51
|
+
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
52
|
+
<circle cx="12" cy="12" r="10"></circle>
|
|
53
|
+
<line x1="12" y1="8" x2="12" y2="12"></line>
|
|
54
|
+
<line x1="12" y1="16" x2="12.01" y2="16"></line>
|
|
55
|
+
</svg>
|
|
56
|
+
<p id="tip-text">
|
|
57
|
+
{ui.frenchTip}
|
|
58
|
+
</p>
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
61
|
+
</div>
|
|
62
|
+
|
|
63
|
+
<script is:inline define:vars={{ ui }}>
|
|
64
|
+
const whitesInput = document.getElementById("whites-input");
|
|
65
|
+
const typeSelector = document.getElementById("type-selector");
|
|
66
|
+
const resultsGrid = document.getElementById("main-results");
|
|
67
|
+
const timeGrid = document.getElementById("time-grid");
|
|
68
|
+
const tipText = document.getElementById("tip-text");
|
|
69
|
+
|
|
70
|
+
let currentType = "french";
|
|
71
|
+
|
|
72
|
+
const TIPS = {
|
|
73
|
+
french: ui.frenchTip,
|
|
74
|
+
italian: ui.italianTip,
|
|
75
|
+
swiss: ui.swissTip,
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
const STAGES = [
|
|
79
|
+
{ name: ui.stageSpumado, desc: ui.stageSpumadoDesc, timeIdx: 0 },
|
|
80
|
+
{ name: ui.stageSoftPeaks, desc: ui.stageSoftPeaksDesc, timeIdx: 1 },
|
|
81
|
+
{ name: ui.stageStiffPeaks, desc: ui.stageStiffPeaksDesc, timeIdx: 2 },
|
|
82
|
+
];
|
|
83
|
+
|
|
84
|
+
function getRecipeData(type, weight) {
|
|
85
|
+
const recipes = {
|
|
86
|
+
french: {
|
|
87
|
+
results: [
|
|
88
|
+
{ label: ui.frenchSugarWhite, val: weight, unit: "g" },
|
|
89
|
+
{ label: ui.frenchSugarPowder, val: weight, unit: "g" },
|
|
90
|
+
],
|
|
91
|
+
times: [ui.frenchTime1, ui.frenchTime2, ui.frenchTime3],
|
|
92
|
+
},
|
|
93
|
+
italian: {
|
|
94
|
+
results: [
|
|
95
|
+
{ label: ui.italianSugarSyrup, val: weight * 2, unit: "g" },
|
|
96
|
+
{ label: ui.italianWater, val: Math.round(weight * 0.6), unit: "ml" },
|
|
97
|
+
],
|
|
98
|
+
times: [ui.italianTime1, ui.italianTime2, ui.italianTime3],
|
|
99
|
+
},
|
|
100
|
+
swiss: {
|
|
101
|
+
results: [
|
|
102
|
+
{ label: ui.swissSugarWhite, val: weight * 2, unit: "g" },
|
|
103
|
+
{ label: ui.swissMaxTemp, val: 60, unit: "°C" },
|
|
104
|
+
],
|
|
105
|
+
times: [ui.swissTime1, ui.swissTime2, ui.swissTime3],
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
return recipes[type];
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function renderResults(mainResults) {
|
|
112
|
+
resultsGrid.innerHTML = "";
|
|
113
|
+
mainResults.forEach((res) => {
|
|
114
|
+
const item = document.createElement("div");
|
|
115
|
+
item.className = "meringue-result-item meringue-fade-in";
|
|
116
|
+
item.innerHTML = `
|
|
117
|
+
<span class="meringue-result-label">${res.label}</span>
|
|
118
|
+
<span class="meringue-result-value">${res.val}<span class="meringue-result-unit">${res.unit}</span></span>
|
|
119
|
+
`;
|
|
120
|
+
resultsGrid.appendChild(item);
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function renderStages(times) {
|
|
125
|
+
timeGrid.innerHTML = "";
|
|
126
|
+
STAGES.forEach((stage, i) => {
|
|
127
|
+
const row = document.createElement("div");
|
|
128
|
+
row.className = "meringue-time-row meringue-fade-in";
|
|
129
|
+
row.style.animationDelay = `${i * 0.1}s`;
|
|
130
|
+
row.innerHTML = `
|
|
131
|
+
<div class="meringue-time-info">
|
|
132
|
+
<span class="meringue-time-stage">${stage.name}</span>
|
|
133
|
+
<span class="meringue-time-desc">${stage.desc}</span>
|
|
134
|
+
</div>
|
|
135
|
+
<span class="meringue-time-val">${times[i]}</span>
|
|
136
|
+
`;
|
|
137
|
+
timeGrid.appendChild(row);
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function calculate() {
|
|
142
|
+
const weight = parseFloat(whitesInput.value) || 0;
|
|
143
|
+
|
|
144
|
+
if (weight <= 0) {
|
|
145
|
+
resultsGrid.innerHTML = `<p style="color: #ef4444; font-weight: 600;">${ui.invalidWeightError}</p>`;
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const recipe = getRecipeData(currentType, weight);
|
|
150
|
+
renderResults(recipe.results);
|
|
151
|
+
renderStages(recipe.times);
|
|
152
|
+
tipText.textContent = TIPS[currentType];
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
whitesInput?.addEventListener("input", calculate);
|
|
156
|
+
|
|
157
|
+
typeSelector?.addEventListener("click", (e) => {
|
|
158
|
+
const target = e.target;
|
|
159
|
+
if (target.classList.contains("meringue-type-btn")) {
|
|
160
|
+
const btns = typeSelector.querySelectorAll(".meringue-type-btn");
|
|
161
|
+
btns.forEach((b) => b.classList.remove("active"));
|
|
162
|
+
target.classList.add("active");
|
|
163
|
+
currentType = target.dataset.type || "french";
|
|
164
|
+
calculate();
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
calculate();
|
|
169
|
+
</script>
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from "../../../types";
|
|
2
|
+
|
|
3
|
+
export const content: ToolLocaleContent = {
|
|
4
|
+
slug: "meringue-sugar-ratio-calculator-stiff-peaks",
|
|
5
|
+
title: "Professional Meringue Sugar Ratio Calculator",
|
|
6
|
+
description:
|
|
7
|
+
"Calculate the exact amount of sugar for French, Italian, or Swiss meringue based on your egg whites' weight. Mastering stiff peaks with professional precision.",
|
|
8
|
+
ui: {
|
|
9
|
+
whitesLabel: "Egg Whites Weight",
|
|
10
|
+
whitesPlaceholder: "E.g. 120",
|
|
11
|
+
whitesUnit: "g",
|
|
12
|
+
typeLabel: "Meringue Type",
|
|
13
|
+
typeFrench: "French",
|
|
14
|
+
typeItalian: "Italian",
|
|
15
|
+
typeSwiss: "Swiss",
|
|
16
|
+
timesHeading: "Estimated Times (Whipping at medium-high speed)",
|
|
17
|
+
stageSpumado: "Foamy",
|
|
18
|
+
stageSpumadoDesc: "Large bubbles, like soap water.",
|
|
19
|
+
stageSoftPeaks: "Soft Peaks",
|
|
20
|
+
stageSoftPeaksDesc: "Tip folds down when lifting the whisk.",
|
|
21
|
+
stageStiffPeaks: "Stiff Peaks",
|
|
22
|
+
stageStiffPeaksDesc: "Firm, shiny, and vertical tip.",
|
|
23
|
+
frenchSugarWhite: "Granulated Sugar",
|
|
24
|
+
frenchSugarPowder: "Powdered Sugar",
|
|
25
|
+
frenchTip:
|
|
26
|
+
"French meringue is common and simple. Ideal for baking pavlovas or as a base for batters. Not safe to eat uncooked.",
|
|
27
|
+
frenchTime1: "1-2 min",
|
|
28
|
+
frenchTime2: "3-5 min",
|
|
29
|
+
frenchTime3: "7-9 min",
|
|
30
|
+
italianSugarSyrup: "Sugar for Syrup",
|
|
31
|
+
italianWater: "Water",
|
|
32
|
+
italianTip:
|
|
33
|
+
"Italian meringue is the most stable. Made using 118°C sugar syrup. Perfect for cake decoration and direct consumption.",
|
|
34
|
+
italianTime1: "2 min",
|
|
35
|
+
italianTime2: "5 min",
|
|
36
|
+
italianTime3: "10-12 min",
|
|
37
|
+
swissSugarWhite: "Granulated Sugar",
|
|
38
|
+
swissMaxTemp: "Max Temp",
|
|
39
|
+
swissTip:
|
|
40
|
+
"Swiss meringue is heated in a double boiler until sugar dissolves. Extremely silky, ideal for smooth buttercreams.",
|
|
41
|
+
swissTime1: "1-2 min",
|
|
42
|
+
swissTime2: "4-6 min",
|
|
43
|
+
swissTime3: "8-10 min",
|
|
44
|
+
invalidWeightError: "Enter a valid weight",
|
|
45
|
+
},
|
|
46
|
+
faqTitle: "Frequently Asked Questions",
|
|
47
|
+
faq: [
|
|
48
|
+
{
|
|
49
|
+
question: "What is the ideal egg white to sugar ratio?",
|
|
50
|
+
answer:
|
|
51
|
+
"The professional standard is a 1:2 ratio. For every gram of egg white, use two grams of sugar to provide enough literal 'weight' to stabilize the protein structure.",
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
question: "How can I tell if I've reached stiff peaks?",
|
|
55
|
+
answer:
|
|
56
|
+
"When you lift the whisk, the peaks should stand straight up without drooping. The mixture should also be thick, very glossy, and stay in the bowl even if held upside down.",
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
question: "Which meringue type is best for frosting?",
|
|
60
|
+
answer:
|
|
61
|
+
"Italian meringue is preferred for frosting because the hot syrup 'cooks' the whites, making it both safe and structural enough to hold its shape for hours.",
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
question: "Why do my egg whites refuse to whip up?",
|
|
65
|
+
answer:
|
|
66
|
+
"Even a microscopic trace of fat—from leftover grease on the bowl or a tiny drop of yolk—will prevent the whites from forming a stable foam. Always use a clean metal or glass bowl.",
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
howTo: [
|
|
70
|
+
{
|
|
71
|
+
name: "Weigh your egg whites",
|
|
72
|
+
text: "Use a digital scale for precision. Even a 5-gram difference can change the required sugar amount.",
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
name: "Calculate sugar needs",
|
|
76
|
+
text: "Enter the weight into our tool to get exact granulated and/or powdered sugar measurements.",
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
name: "Choose your technique",
|
|
80
|
+
text: "Select French for simple baking, Italian for stability, or Swiss for silky fillings.",
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
name: "Whip to perfection",
|
|
84
|
+
text: "Follow the estimated timing guide until you reach that high-gloss, vertical stiff peak.",
|
|
85
|
+
},
|
|
86
|
+
],
|
|
87
|
+
bibliographyTitle: "Technical Sources & References",
|
|
88
|
+
bibliography: [
|
|
89
|
+
{
|
|
90
|
+
name: "King Arthur Baking - Meringue Guide",
|
|
91
|
+
url: "https://www.kingarthurbaking.com/blog/2015/07/05/meringue-types",
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
name: "Exploratorium - The Science of Egg Foam",
|
|
95
|
+
url: "https://www.exploratorium.edu/explore/cooking/egg-science",
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
name: "Fine Cooking - Mastering the Stiff Peak",
|
|
99
|
+
url: "https://www.finecooking.com/",
|
|
100
|
+
},
|
|
101
|
+
],
|
|
102
|
+
seo: [
|
|
103
|
+
{
|
|
104
|
+
type: "title",
|
|
105
|
+
text: "Master Guide for Meringue Ratios and Stiff Peak Calculation",
|
|
106
|
+
level: 2,
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
type: "paragraph",
|
|
110
|
+
html: "Mastering <strong>stiff peaks</strong> and various meringue methods is what separates home cooks from professional pastry chefs. The secret lies in the precision of the egg white weight and the exact sugar balance needed to stabilize the protein network.",
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
type: "stats",
|
|
114
|
+
columns: 4,
|
|
115
|
+
items: [
|
|
116
|
+
{
|
|
117
|
+
value: "1:2",
|
|
118
|
+
label: "White:Sugar Ratio",
|
|
119
|
+
icon: "mdi:scale-balance",
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
value: "118°C",
|
|
123
|
+
label: "Italian Syrup",
|
|
124
|
+
icon: "mdi:thermometer-high",
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
value: "60°C",
|
|
128
|
+
label: "Swiss Bain-Marie",
|
|
129
|
+
icon: "mdi:beaker-question-outline",
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
value: "0%",
|
|
133
|
+
label: "Fat Tolerance",
|
|
134
|
+
icon: "mdi:close-circle-outline",
|
|
135
|
+
},
|
|
136
|
+
],
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
type: "title",
|
|
140
|
+
text: "Comparison of Meringue Techniques",
|
|
141
|
+
level: 3,
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
type: "comparative",
|
|
145
|
+
columns: 3,
|
|
146
|
+
items: [
|
|
147
|
+
{
|
|
148
|
+
title: "French Meringue",
|
|
149
|
+
icon: "mdi:baguette",
|
|
150
|
+
description:
|
|
151
|
+
"The simplest but least stable. Whites and sugar whipped cold.",
|
|
152
|
+
points: [
|
|
153
|
+
"Ideal for baked cookies",
|
|
154
|
+
"Light and airy texture",
|
|
155
|
+
"Requires mandatory baking",
|
|
156
|
+
"Fastest preparation method",
|
|
157
|
+
],
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
title: "Italian Meringue",
|
|
161
|
+
icon: "mdi:pizza",
|
|
162
|
+
description: "Most stable. Uses hot sugar syrup at soft-ball stage.",
|
|
163
|
+
highlight: true,
|
|
164
|
+
points: [
|
|
165
|
+
"Perfect for cake decor",
|
|
166
|
+
"Safe for raw consumption",
|
|
167
|
+
"Best humidity resistance",
|
|
168
|
+
"Dense, glass-like shine",
|
|
169
|
+
],
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
title: "Swiss Meringue",
|
|
173
|
+
icon: "mdi:cheese",
|
|
174
|
+
description:
|
|
175
|
+
"Heated over a water bath. Balance of ease and stability.",
|
|
176
|
+
points: [
|
|
177
|
+
"Base for Buttercreams",
|
|
178
|
+
"Extremely silky texture",
|
|
179
|
+
"Excellent for fillings",
|
|
180
|
+
"Medium food safety level",
|
|
181
|
+
],
|
|
182
|
+
},
|
|
183
|
+
],
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
type: "title",
|
|
187
|
+
text: "Visual Stages of Egg White Whipping",
|
|
188
|
+
level: 3,
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
type: "table",
|
|
192
|
+
headers: ["Stage", "Visual Description", "Recommended Use", "Stability"],
|
|
193
|
+
rows: [
|
|
194
|
+
["Foamy", "Clear, large soap-like bubbles", "Add acid or sugar", "None"],
|
|
195
|
+
["Soft Peaks", "Tips curl down when lifted", "Mousses and soufflés", "Low"],
|
|
196
|
+
[
|
|
197
|
+
"Stiff Peaks",
|
|
198
|
+
"Stiff, vertical, and rigid tip",
|
|
199
|
+
"Decoration and baking",
|
|
200
|
+
"High",
|
|
201
|
+
],
|
|
202
|
+
[
|
|
203
|
+
"Overwhipped",
|
|
204
|
+
"Grainy and dry texture",
|
|
205
|
+
"Unusable (broken)",
|
|
206
|
+
"Collapse",
|
|
207
|
+
],
|
|
208
|
+
],
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
type: "diagnostic",
|
|
212
|
+
variant: "warning",
|
|
213
|
+
title: "Is Your Meringue 'Weeping' or Releasing Liquid?",
|
|
214
|
+
html: "If you see syrup leaking (syneresis), it's either because the sugar didn't fully dissolve or from high ambient humidity. In Italian meringue, ensure the syrup is poured in a slow, steady stream—never directly onto the whisk.",
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
type: "title",
|
|
218
|
+
text: "Technical Pastry Glossary",
|
|
219
|
+
level: 3,
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
type: "glossary",
|
|
223
|
+
items: [
|
|
224
|
+
{
|
|
225
|
+
term: "Ovalbumin",
|
|
226
|
+
definition:
|
|
227
|
+
"The main protein in egg whites responsible for trapping air during whipping.",
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
term: "Hygroscopic",
|
|
231
|
+
definition:
|
|
232
|
+
"Sugar's property to absorb moisture from the air, which can soften the meringue.",
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
term: "Cream of Tartar",
|
|
236
|
+
definition:
|
|
237
|
+
"An acidic salt that helps prevent overwhipping and stabilizes the foam structure.",
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
term: "Bain-Marie",
|
|
241
|
+
definition:
|
|
242
|
+
"The indirect heating method used to safely dissolve sugar for Swiss meringue.",
|
|
243
|
+
},
|
|
244
|
+
],
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
type: "tip",
|
|
248
|
+
title: "The Vinegar Bowl Trick",
|
|
249
|
+
html: "Wipe your bowl with a paper towel dampened with vinegar or lemon juice before starting. Any trace of fat will kill your foam, regardless of how much you whip.",
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
type: "paragraph",
|
|
253
|
+
html: "Our calculator automates the math so you can focus on whipping until you reach that perfect, high-gloss finish.",
|
|
254
|
+
},
|
|
255
|
+
],
|
|
256
|
+
schemas: [],
|
|
257
|
+
};
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
|
|
3
|
+
export const content: ToolLocaleContent = {
|
|
4
|
+
slug: 'calculadora-punto-de-nieve-merengue',
|
|
5
|
+
title: 'Calculadora de Merengue y Punto de Nieve',
|
|
6
|
+
description: 'Calcula la cantidad exacta de azúcar para merengue francés, italiano o suizo según el peso de tus claras. Tiempos de batido y trucos de repostería.',
|
|
7
|
+
faqTitle: 'Preguntas Frecuentes',
|
|
8
|
+
bibliographyTitle: 'Fuentes y Referencias',
|
|
9
|
+
ui: {
|
|
10
|
+
whitesLabel: 'Peso de las Claras',
|
|
11
|
+
whitesPlaceholder: 'Ej. 120',
|
|
12
|
+
whitesUnit: 'g',
|
|
13
|
+
typeLabel: 'Tipo de Merengue',
|
|
14
|
+
typeFrench: 'Francés',
|
|
15
|
+
typeItalian: 'Italiano',
|
|
16
|
+
typeSwiss: 'Suizo',
|
|
17
|
+
timesHeading: 'Tiempos Estimados (Batido a media/alta velocidad)',
|
|
18
|
+
stageSpumado: 'Espumado',
|
|
19
|
+
stageSpumadoDesc: 'Burbujas grandes, como jabón.',
|
|
20
|
+
stageSoftPeaks: 'Pico Blando',
|
|
21
|
+
stageSoftPeaksDesc: 'La punta se dobla al levantar.',
|
|
22
|
+
stageStiffPeaks: 'Punto de Nieve',
|
|
23
|
+
stageStiffPeaksDesc: 'Pico firme y brillante.',
|
|
24
|
+
frenchSugarWhite: 'Azúcar Blanquilla',
|
|
25
|
+
frenchSugarPowder: 'Azúcar Glas',
|
|
26
|
+
frenchTip: 'El merengue francés es el más común y fácil, ideal para hornear suspiros o añadir a masas aireadas. No es apto para comer en crudo.',
|
|
27
|
+
frenchTime1: '1-2 min',
|
|
28
|
+
frenchTime2: '3-5 min',
|
|
29
|
+
frenchTime3: '7-9 min',
|
|
30
|
+
italianSugarSyrup: 'Azúcar para Almíbar',
|
|
31
|
+
italianWater: 'Agua',
|
|
32
|
+
italianTip: 'El merengue italiano es el más estable. Se hace con almíbar caliente a 118°C. Es perfecto para decorar tartas y comer directamente.',
|
|
33
|
+
italianTime1: '2 min',
|
|
34
|
+
italianTime2: '5 min',
|
|
35
|
+
italianTime3: '10-12 min',
|
|
36
|
+
swissSugarWhite: 'Azúcar Blanquilla',
|
|
37
|
+
swissMaxTemp: 'Temperatura Máx',
|
|
38
|
+
swissTip: 'El merengue suizo se calienta al baño maría hasta que el azúcar se disuelve. Es muy versátil y ideal para cremas de mantequilla.',
|
|
39
|
+
swissTime1: '1-2 min',
|
|
40
|
+
swissTime2: '4-6 min',
|
|
41
|
+
swissTime3: '8-10 min',
|
|
42
|
+
invalidWeightError: 'Introduce un peso válido',
|
|
43
|
+
},
|
|
44
|
+
faq: [
|
|
45
|
+
{
|
|
46
|
+
question: '¿Qué relación de azúcar y clara es la ideal?',
|
|
47
|
+
answer: 'La regla de oro en repostería es el ratio 1:2. Por cada gramo de clara de huevo, se deben utilizar dos gramos de azúcar para asegurar una estructura estable y firme.',
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
question: '¿Cómo saber si el merengue está a punto de nieve?',
|
|
51
|
+
answer: 'El punto de nieve o pico firme se alcanza cuando, al levantar las varillas, el merengue forma una punta que se mantiene vertical sin doblarse. Además, el merengue debe verse muy brillante.',
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
question: '¿Cuál es el merengue más estable para decorar?',
|
|
55
|
+
answer: 'El merengue italiano es el más estable de los tres tipos principales, gracias a que el almíbar caliente cocina ligeramente las proteínas de la clara, creando una estructura más resistente al calor y al paso del tiempo.',
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
question: '¿Se pueden usar claras pasteurizadas de bote?',
|
|
59
|
+
answer: 'Sí, se pueden utilizar, pero suelen tardar un poco más en montar que las claras frescas. Un truco es añadir una pizca de cremor tártaro o unas gotas de limón para ayudar a la estabilidad.',
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
howTo: [
|
|
63
|
+
{
|
|
64
|
+
name: 'Pesar las claras',
|
|
65
|
+
text: 'Utiliza una báscula digital para obtener el peso exacto de las claras de huevo sin rastro de yema.',
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
name: 'Introducir peso',
|
|
69
|
+
text: 'Escribe ese peso en nuestra calculadora para obtener las cantidades de azúcar necesarias.',
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
name: 'Elegir técnica',
|
|
73
|
+
text: 'Selecciona si vas a preparar un merengue francés (básico), italiano (estable) o suizo (sedoso).',
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
name: 'Batir y verificar',
|
|
77
|
+
text: 'Sigue los tiempos estimados y comprueba la consistencia hasta alcanzar el punto de nieve firme.',
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
bibliography: [
|
|
81
|
+
{
|
|
82
|
+
name: 'Larousse Cocina: Tipos de Merengues y cómo prepararlos',
|
|
83
|
+
url: 'https://laroussecocina.mx/palabra/merengue/',
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
name: 'Exploratorium: The Science of Cooking - Egg Science',
|
|
87
|
+
url: 'https://www.exploratorium.edu/explore/cooking/egg-science',
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
name: 'Directo al Paladar: Guía completa del Merengue Francés',
|
|
91
|
+
url: 'https://www.directoalpaladar.com/curso-de-cocina/como-hacer-merengue-frances-facil-trucos-consejos-quede-perfecto',
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
seo: [
|
|
95
|
+
{
|
|
96
|
+
type: 'title',
|
|
97
|
+
text: 'Guía Maestro para el Cálculo de Merengue y Punto de Nieve',
|
|
98
|
+
level: 2,
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
type: 'paragraph',
|
|
102
|
+
html: 'Dominar el <strong>punto de nieve</strong> y los diferentes tipos de merengue es elevar tu repostería al nivel profesional. La clave reside en la precisión del peso de las claras y la relación exacta de azúcar para estabilizar la red de proteínas.',
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
type: 'stats',
|
|
106
|
+
columns: 4,
|
|
107
|
+
items: [
|
|
108
|
+
{
|
|
109
|
+
value: '1:2',
|
|
110
|
+
label: 'Ratio Clara:Azúcar',
|
|
111
|
+
icon: 'mdi:scale-balance',
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
value: '118°C',
|
|
115
|
+
label: 'Almíbar Italiano',
|
|
116
|
+
icon: 'mdi:thermometer-high',
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
value: '60°C',
|
|
120
|
+
label: 'Baño María Suizo',
|
|
121
|
+
icon: 'mdi:beaker-question-outline',
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
value: '0%',
|
|
125
|
+
label: 'Tolerancia a Grasa',
|
|
126
|
+
icon: 'mdi:close-circle-outline',
|
|
127
|
+
},
|
|
128
|
+
],
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
type: 'title',
|
|
132
|
+
text: 'Comparativa de Técnicas de Merengue',
|
|
133
|
+
level: 3,
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
type: 'comparative',
|
|
137
|
+
columns: 3,
|
|
138
|
+
items: [
|
|
139
|
+
{
|
|
140
|
+
title: 'Merengue Francés',
|
|
141
|
+
icon: 'mdi:baguette',
|
|
142
|
+
description: 'El más simple pero menos estable. Se baten las claras con azúcar en frío.',
|
|
143
|
+
points: [
|
|
144
|
+
'Ideal para hornear (suspiros)',
|
|
145
|
+
'Textura ligera y aireada',
|
|
146
|
+
'Requiere cocción obligatoria',
|
|
147
|
+
'Rápido de preparar',
|
|
148
|
+
],
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
title: 'Merengue Italiano',
|
|
152
|
+
icon: 'mdi:pizza',
|
|
153
|
+
description: 'El más estable de todos. Se usa almíbar a punto de bola blanda.',
|
|
154
|
+
highlight: true,
|
|
155
|
+
points: [
|
|
156
|
+
'Perfecto para decorar tartas',
|
|
157
|
+
'Apto para comer en crudo',
|
|
158
|
+
'Resiste mejor la humedad',
|
|
159
|
+
'Estructura densa y brillante',
|
|
160
|
+
],
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
title: 'Merengue Suizo',
|
|
164
|
+
icon: 'mdi:cheese',
|
|
165
|
+
description: 'Calentado al baño maría. Equilibrio entre facilidad y estabilidad.',
|
|
166
|
+
points: [
|
|
167
|
+
'Base para Buttercreams',
|
|
168
|
+
'Textura muy sedosa',
|
|
169
|
+
'Excelente para rellenos',
|
|
170
|
+
'Seguridad alimentaria media',
|
|
171
|
+
],
|
|
172
|
+
},
|
|
173
|
+
],
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
type: 'title',
|
|
177
|
+
text: 'Estados Visuales del Batido de Claras',
|
|
178
|
+
level: 3,
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
type: 'table',
|
|
182
|
+
headers: ['Estado', 'Descripción Visual', 'Uso Recomendado', 'Estabilidad'],
|
|
183
|
+
rows: [
|
|
184
|
+
['Espumado', 'Burbujas grandes, transparente', 'Añadir ácidos/azúcar', 'Nula'],
|
|
185
|
+
['Picos Blandos', 'La punta se dobla hacia abajo', 'Mousses y soufflés', 'Baja'],
|
|
186
|
+
['Pico Firme', 'Punta vertical y rígida', 'Decoración y horneado', 'Alta'],
|
|
187
|
+
['Sobrebatido', 'Textura granulosa y seca', 'Inservible (se corta)', 'Colapso'],
|
|
188
|
+
],
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
type: 'diagnostic',
|
|
192
|
+
variant: 'warning',
|
|
193
|
+
title: '¿Tu Merengue Llora o suelta Líquido?',
|
|
194
|
+
html: 'Si ves almíbar escapando del merengue (sinéresis), se debe a que el azúcar no se disolvió totalmente o a un exceso de humedad ambiental. En el merengue italiano, asegura que el almíbar caiga en hilo fino sobre las claras en movimiento, nunca sobre las varillas.',
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
type: 'title',
|
|
198
|
+
text: 'Glosario de Repostería Técnica',
|
|
199
|
+
level: 3,
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
type: 'glossary',
|
|
203
|
+
items: [
|
|
204
|
+
{
|
|
205
|
+
term: 'Ovoalbúmina',
|
|
206
|
+
definition: 'Principal proteína de la clara responsable de atrapar el aire en el batido.',
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
term: 'Higroscópico',
|
|
210
|
+
definition: 'Propiedad del azúcar de absorber humedad del aire, lo que puede ablandar el merengue.',
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
term: 'Cremor Tártaro',
|
|
214
|
+
definition: 'Sal ácida que ayuda a prevenir el sobrebatido y estabiliza la espuma.',
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
term: 'Baño María',
|
|
218
|
+
definition: 'Método de calor indirecto crucial para disolver el azúcar en el merengue suizo.',
|
|
219
|
+
},
|
|
220
|
+
],
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
type: 'tip',
|
|
224
|
+
title: 'El truco del Bol de Metal',
|
|
225
|
+
html: 'Limpia tu bol con una servilleta y un chorro de vinagre o limón antes de empezar. Cualquier rastro de grasa impedirá que las claras suban, por mucha energía que apliques.',
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
type: 'paragraph',
|
|
229
|
+
html: 'Nuestra calculadora automatiza las proporciones para que tú solo tengas que preocuparte de batir hasta alcanzar ese brillo perfecto.',
|
|
230
|
+
},
|
|
231
|
+
],
|
|
232
|
+
|
|
233
|
+
schemas: [],
|
|
234
|
+
};
|