@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.
Files changed (130) hide show
  1. package/package.json +60 -0
  2. package/src/category/i18n/en.ts +24 -0
  3. package/src/category/i18n/es.ts +208 -0
  4. package/src/category/i18n/fr.ts +24 -0
  5. package/src/category/index.ts +37 -0
  6. package/src/category/seo.astro +15 -0
  7. package/src/components/PreviewNavSidebar.astro +116 -0
  8. package/src/components/PreviewToolbar.astro +143 -0
  9. package/src/data.ts +11 -0
  10. package/src/env.d.ts +5 -0
  11. package/src/index.ts +32 -0
  12. package/src/layouts/PreviewLayout.astro +117 -0
  13. package/src/pages/[locale]/[slug].astro +146 -0
  14. package/src/pages/[locale].astro +251 -0
  15. package/src/pages/index.astro +4 -0
  16. package/src/tests/faq_count.test.ts +19 -0
  17. package/src/tests/i18n-titles.test.ts +66 -0
  18. package/src/tests/locale_completeness.test.ts +42 -0
  19. package/src/tests/mocks/astro_mock.js +2 -0
  20. package/src/tests/no_h1_in_components.test.ts +48 -0
  21. package/src/tests/seo_length.test.ts +22 -0
  22. package/src/tests/tool_validation.test.ts +17 -0
  23. package/src/tool/american-kitchen-converter/AmericanKitchenEngine.ts +259 -0
  24. package/src/tool/american-kitchen-converter/bibliography.astro +6 -0
  25. package/src/tool/american-kitchen-converter/component.astro +838 -0
  26. package/src/tool/american-kitchen-converter/i18n/en.ts +282 -0
  27. package/src/tool/american-kitchen-converter/i18n/es.ts +281 -0
  28. package/src/tool/american-kitchen-converter/i18n/fr.ts +292 -0
  29. package/src/tool/american-kitchen-converter/index.ts +24 -0
  30. package/src/tool/american-kitchen-converter/seo.astro +8 -0
  31. package/src/tool/banana-ripeness/BananaCare.css +587 -0
  32. package/src/tool/banana-ripeness/BananaEngine.ts +79 -0
  33. package/src/tool/banana-ripeness/bibliography.astro +6 -0
  34. package/src/tool/banana-ripeness/component.astro +285 -0
  35. package/src/tool/banana-ripeness/i18n/en.ts +177 -0
  36. package/src/tool/banana-ripeness/i18n/es.ts +177 -0
  37. package/src/tool/banana-ripeness/i18n/fr.ts +177 -0
  38. package/src/tool/banana-ripeness/index.ts +24 -0
  39. package/src/tool/banana-ripeness/seo.astro +8 -0
  40. package/src/tool/brine/bibliography.astro +6 -0
  41. package/src/tool/brine/component.astro +884 -0
  42. package/src/tool/brine/i18n/en.ts +221 -0
  43. package/src/tool/brine/i18n/es.ts +222 -0
  44. package/src/tool/brine/i18n/fr.ts +221 -0
  45. package/src/tool/brine/index.ts +26 -0
  46. package/src/tool/brine/seo.astro +8 -0
  47. package/src/tool/cookware-guide/CookwareGuide.css +487 -0
  48. package/src/tool/cookware-guide/bibliography.astro +6 -0
  49. package/src/tool/cookware-guide/component.astro +164 -0
  50. package/src/tool/cookware-guide/i18n/en.ts +163 -0
  51. package/src/tool/cookware-guide/i18n/es.ts +163 -0
  52. package/src/tool/cookware-guide/i18n/fr.ts +164 -0
  53. package/src/tool/cookware-guide/index.ts +24 -0
  54. package/src/tool/cookware-guide/init.ts +174 -0
  55. package/src/tool/cookware-guide/seo.astro +8 -0
  56. package/src/tool/egg-timer/EggTimer.css +503 -0
  57. package/src/tool/egg-timer/bibliography.astro +14 -0
  58. package/src/tool/egg-timer/component.astro +281 -0
  59. package/src/tool/egg-timer/i18n/en.ts +230 -0
  60. package/src/tool/egg-timer/i18n/es.ts +222 -0
  61. package/src/tool/egg-timer/i18n/fr.ts +121 -0
  62. package/src/tool/egg-timer/index.ts +27 -0
  63. package/src/tool/egg-timer/seo.astro +39 -0
  64. package/src/tool/ingredient-rescaler/IngredientRescaler.css +308 -0
  65. package/src/tool/ingredient-rescaler/bibliography.astro +6 -0
  66. package/src/tool/ingredient-rescaler/component.astro +107 -0
  67. package/src/tool/ingredient-rescaler/i18n/en.ts +265 -0
  68. package/src/tool/ingredient-rescaler/i18n/es.ts +268 -0
  69. package/src/tool/ingredient-rescaler/i18n/fr.ts +207 -0
  70. package/src/tool/ingredient-rescaler/index.ts +24 -0
  71. package/src/tool/ingredient-rescaler/init.ts +200 -0
  72. package/src/tool/ingredient-rescaler/seo.astro +8 -0
  73. package/src/tool/kitchen-timer/KitchenTimer.css +325 -0
  74. package/src/tool/kitchen-timer/bibliography.astro +6 -0
  75. package/src/tool/kitchen-timer/component.astro +341 -0
  76. package/src/tool/kitchen-timer/i18n/en.ts +154 -0
  77. package/src/tool/kitchen-timer/i18n/es.ts +154 -0
  78. package/src/tool/kitchen-timer/i18n/fr.ts +154 -0
  79. package/src/tool/kitchen-timer/index.ts +26 -0
  80. package/src/tool/kitchen-timer/init.ts +55 -0
  81. package/src/tool/kitchen-timer/lib/AudioHelper.ts +27 -0
  82. package/src/tool/kitchen-timer/lib/DockManager.ts +97 -0
  83. package/src/tool/kitchen-timer/lib/KitchenTimer.ts +264 -0
  84. package/src/tool/kitchen-timer/seo.astro +8 -0
  85. package/src/tool/meringue-peak/MeringueCalculator.css +298 -0
  86. package/src/tool/meringue-peak/bibliography.astro +6 -0
  87. package/src/tool/meringue-peak/component.astro +169 -0
  88. package/src/tool/meringue-peak/i18n/en.ts +257 -0
  89. package/src/tool/meringue-peak/i18n/es.ts +234 -0
  90. package/src/tool/meringue-peak/i18n/fr.ts +234 -0
  91. package/src/tool/meringue-peak/index.ts +24 -0
  92. package/src/tool/meringue-peak/seo.astro +8 -0
  93. package/src/tool/mold-scaler/MoldScaler.css +406 -0
  94. package/src/tool/mold-scaler/bibliography.astro +6 -0
  95. package/src/tool/mold-scaler/component.astro +126 -0
  96. package/src/tool/mold-scaler/i18n/en.ts +268 -0
  97. package/src/tool/mold-scaler/i18n/es.ts +269 -0
  98. package/src/tool/mold-scaler/i18n/fr.ts +276 -0
  99. package/src/tool/mold-scaler/index.ts +26 -0
  100. package/src/tool/mold-scaler/init.ts +264 -0
  101. package/src/tool/mold-scaler/seo.astro +8 -0
  102. package/src/tool/pizza/Pizza.css +569 -0
  103. package/src/tool/pizza/bibliography.astro +6 -0
  104. package/src/tool/pizza/calculator.ts +143 -0
  105. package/src/tool/pizza/component.astro +237 -0
  106. package/src/tool/pizza/i18n/en.ts +288 -0
  107. package/src/tool/pizza/i18n/es.ts +289 -0
  108. package/src/tool/pizza/i18n/fr.ts +288 -0
  109. package/src/tool/pizza/index.ts +27 -0
  110. package/src/tool/pizza/seo.astro +8 -0
  111. package/src/tool/roux-guide/RouxGuide.css +483 -0
  112. package/src/tool/roux-guide/bibliography.astro +6 -0
  113. package/src/tool/roux-guide/component.astro +194 -0
  114. package/src/tool/roux-guide/i18n/en.ts +233 -0
  115. package/src/tool/roux-guide/i18n/es.ts +225 -0
  116. package/src/tool/roux-guide/i18n/fr.ts +225 -0
  117. package/src/tool/roux-guide/index.ts +24 -0
  118. package/src/tool/roux-guide/init.ts +187 -0
  119. package/src/tool/roux-guide/seo.astro +8 -0
  120. package/src/tool/sourdough-calculator/SourdoughCalculator.css +369 -0
  121. package/src/tool/sourdough-calculator/bibliography.astro +6 -0
  122. package/src/tool/sourdough-calculator/component.astro +198 -0
  123. package/src/tool/sourdough-calculator/i18n/en.ts +242 -0
  124. package/src/tool/sourdough-calculator/i18n/es.ts +243 -0
  125. package/src/tool/sourdough-calculator/i18n/fr.ts +248 -0
  126. package/src/tool/sourdough-calculator/index.ts +24 -0
  127. package/src/tool/sourdough-calculator/init.ts +131 -0
  128. package/src/tool/sourdough-calculator/seo.astro +8 -0
  129. package/src/tools.ts +29 -0
  130. package/src/types.ts +73 -0
@@ -0,0 +1,285 @@
1
+ ---
2
+ import "./BananaCare.css";
3
+
4
+ interface Props {
5
+ ui: Record<string, string>;
6
+ }
7
+
8
+ const { ui } = Astro.props;
9
+ ---
10
+
11
+ <div class="banana-care-container">
12
+ <div class="banana-card">
13
+ <div class="glow-bg"></div>
14
+ <div class="glow-bg-2"></div>
15
+
16
+ <div class="banana-grid">
17
+ <div class="banana-visual-section">
18
+ <div class="status-card">
19
+ <div id="glow-indicator" class="glow-indicator"></div>
20
+
21
+ <div id="status-visual-indicator" class="status-visual">
22
+ <svg viewBox="0 0 240 200" class="banana-svg" xmlns="http://www.w3.org/2000/svg">
23
+ <g id="banana-group" class="banana-group">
24
+ <path
25
+ id="banana-body"
26
+ d="M50,20 Q10,120 100,170 Q180,190 200,140 Q110,175 50,20"
27
+ fill="currentColor"
28
+ class="banana-body"></path>
29
+
30
+ <path
31
+ d="M55,25 Q25,115 105,160 Q170,175 195,138"
32
+ fill="none"
33
+ stroke="rgba(0,0,0,0.1)"
34
+ stroke-width="2"
35
+ stroke-linecap="round"></path>
36
+
37
+ <path d="M50,20 L40,5 C38,2 45,-2 50,2 L58,16 Z" fill="#2d1302"></path>
38
+ <path d="M200,140 L206,142 L202,148 Z" fill="#2d1302"></path>
39
+
40
+ <g id="dots-container">
41
+ <circle class="banana-dot" cx="75" cy="110" r="4.5" fill="#311102"></circle>
42
+ <circle class="banana-dot" cx="105" cy="148" r="3.2" fill="#311102"></circle>
43
+ <circle class="banana-dot" cx="150" cy="165" r="5" fill="#311102"></circle>
44
+ <circle class="banana-dot" cx="50" cy="80" r="2.8" fill="#311102"></circle>
45
+ <circle class="banana-dot" cx="125" cy="158" r="3.8" fill="#311102"></circle>
46
+ <circle class="banana-dot" cx="178" cy="155" r="2.5" fill="#311102"></circle>
47
+ </g>
48
+ </g>
49
+ </svg>
50
+ </div>
51
+ </div>
52
+
53
+ <div class="status-info">
54
+ <div class="status-badge">
55
+ <div id="status-color-dot" class="status-dot"></div>
56
+ <span id="status-name" class="status-name">...</span>
57
+ </div>
58
+ <p id="status-description" class="status-description"></p>
59
+ </div>
60
+ </div>
61
+
62
+ <div class="banana-controls">
63
+ <div class="controls-panel">
64
+ <div class="control-group">
65
+ <div class="ripeness-header">
66
+ <span class="ripeness-label">{ui.ripesnessLabel}</span>
67
+ <span id="level-display" class="level-value">2.0</span>
68
+ </div>
69
+ <input
70
+ type="range"
71
+ id="ripeness-slider"
72
+ min="1"
73
+ max="5"
74
+ step="0.01"
75
+ value="2"
76
+ class="ripeness-slider"
77
+ />
78
+ </div>
79
+
80
+ <div class="grid-2-cols">
81
+ <div class="prediction-box">
82
+ <span class="prediction-label">{ui.nextStageLabel}</span>
83
+ <div class="prediction-value">
84
+ <span id="days-prediction" class="days-number">2.5</span>
85
+ <span class="days-unit">{ui.daysUnit}</span>
86
+ </div>
87
+ </div>
88
+
89
+ <div class="settings-column">
90
+ <div class="setting-item temp">
91
+ <div class="setting-header">
92
+ <span class="setting-label">{ui.tempLabel}</span>
93
+ <span id="temp-display" class="setting-value">20°C</span>
94
+ </div>
95
+ <input
96
+ type="range"
97
+ id="temp-slider"
98
+ min="5"
99
+ max="40"
100
+ value="20"
101
+ class="setting-slider"
102
+ />
103
+ </div>
104
+ <div class="setting-item humidity">
105
+ <div class="setting-header">
106
+ <span class="setting-label">{ui.humidityLabel}</span>
107
+ <span id="humidity-display" class="setting-value">50%</span>
108
+ </div>
109
+ <input
110
+ type="range"
111
+ id="humidity-slider"
112
+ min="10"
113
+ max="95"
114
+ value="50"
115
+ class="setting-slider"
116
+ />
117
+ </div>
118
+ </div>
119
+ </div>
120
+
121
+ <button id="partner-toggle" class="partner-btn">
122
+ <div class="partner-content">
123
+ <div class="partner-icon"></div>
124
+ <div class="partner-text">
125
+ <h4 class="partner-title">{ui.partnerToggleTitle}</h4>
126
+ <p class="partner-subtitle">{ui.partnerToggleSubtitle}</p>
127
+ </div>
128
+ </div>
129
+ <div class="toggle-switch">
130
+ <div id="toggle-circle" class="toggle-circle"></div>
131
+ </div>
132
+ </button>
133
+
134
+ <div class="grid-2-cols info-grid">
135
+ <div class="info-box conservation">
136
+ <h5 class="info-title">{ui.conservationTitle}</h5>
137
+ <p id="status-conservation" class="info-text"></p>
138
+ </div>
139
+ <div class="info-box acceleration">
140
+ <h5 class="info-title">{ui.accelerationTitle}</h5>
141
+ <p id="status-acceleration" class="info-text"></p>
142
+ </div>
143
+ </div>
144
+ </div>
145
+ </div>
146
+ </div>
147
+ </div>
148
+ </div>
149
+
150
+ <script is:inline define:vars={{ ui }}>
151
+ const slider = document.getElementById("ripeness-slider");
152
+ const tempSlider = document.getElementById("temp-slider");
153
+ const humiditySlider = document.getElementById("humidity-slider");
154
+ const partnerToggle = document.getElementById("partner-toggle");
155
+
156
+ const levelDisplay = document.getElementById("level-display");
157
+ const tempDisplay = document.getElementById("temp-display");
158
+ const humidityDisplay = document.getElementById("humidity-display");
159
+
160
+ const statusName = document.getElementById("status-name");
161
+ const statusDesc = document.getElementById("status-description");
162
+ const statusCons = document.getElementById("status-conservation");
163
+ const statusAccel = document.getElementById("status-acceleration");
164
+ const daysPrediction = document.getElementById("days-prediction");
165
+ const bananaBody = document.getElementById("banana-body");
166
+ const bananaGroup = document.getElementById("banana-group");
167
+ const glowIndicator = document.getElementById("glow-indicator");
168
+ const colorDot = document.getElementById("status-color-dot");
169
+ const toggleCircle = document.getElementById("toggle-circle");
170
+ const dots = document.querySelectorAll(".banana-dot");
171
+
172
+ let hasPartners = false;
173
+
174
+ const RIPENESS_STAGES = {
175
+ 1: {
176
+ name: ui.stage1Name,
177
+ description: ui.stage1Desc,
178
+ conservation: ui.stage1Conservation,
179
+ acceleration: ui.stage1Acceleration,
180
+ color: "#059669",
181
+ },
182
+ 2: {
183
+ name: ui.stage2Name,
184
+ description: ui.stage2Desc,
185
+ conservation: ui.stage2Conservation,
186
+ acceleration: ui.stage2Acceleration,
187
+ color: "#fbbf24",
188
+ },
189
+ 3: {
190
+ name: ui.stage3Name,
191
+ description: ui.stage3Desc,
192
+ conservation: ui.stage3Conservation,
193
+ acceleration: ui.stage3Acceleration,
194
+ color: "#f59e0b",
195
+ },
196
+ 4: {
197
+ name: ui.stage4Name,
198
+ description: ui.stage4Desc,
199
+ conservation: ui.stage4Conservation,
200
+ acceleration: ui.stage4Acceleration,
201
+ color: "#b45309",
202
+ },
203
+ 5: {
204
+ name: ui.stage5Name,
205
+ description: ui.stage5Desc,
206
+ conservation: ui.stage5Conservation,
207
+ acceleration: ui.stage5Acceleration,
208
+ color: "#451a03",
209
+ },
210
+ };
211
+
212
+ function getStatus(level) {
213
+ const stage = Math.max(1, Math.min(5, Math.round(level)));
214
+ return RIPENESS_STAGES[stage];
215
+ }
216
+
217
+ function calculateDays(level, temperature, humidity, hasPartnersFlag) {
218
+ const baseDaysPerStage = 3;
219
+ const tempFactor = 20 / temperature;
220
+ const humidityFactor = 1 + (humidity - 50) / 200;
221
+ const partnerFactor = hasPartnersFlag ? 0.6 : 1.0;
222
+
223
+ const remainingInStage = (1 - (level % 1 || 0.1)) * baseDaysPerStage;
224
+ return Number((remainingInStage * tempFactor * humidityFactor * partnerFactor).toFixed(1));
225
+ }
226
+
227
+ partnerToggle.addEventListener("click", () => {
228
+ hasPartners = !hasPartners;
229
+ partnerToggle.classList.toggle("active", hasPartners);
230
+ toggleCircle.classList.toggle("active", hasPartners);
231
+ update();
232
+ });
233
+
234
+ function getGlowColor(statusColor) {
235
+ const isDark = document.documentElement.classList.contains("theme-dark");
236
+ if (isDark && statusColor === "#fbbf24") {
237
+ return "#f1f5f9";
238
+ }
239
+ return statusColor;
240
+ }
241
+
242
+ function update() {
243
+ const level = parseFloat(slider.value);
244
+ const temp = parseInt(tempSlider.value);
245
+ const humidity = parseInt(humiditySlider.value);
246
+ const status = getStatus(level);
247
+
248
+ if (levelDisplay) levelDisplay.innerText = level.toFixed(1);
249
+ if (tempDisplay) tempDisplay.innerText = `${temp}°C`;
250
+ if (humidityDisplay) humidityDisplay.innerText = `${humidity}%`;
251
+
252
+ if (statusName) statusName.innerText = status.name;
253
+ if (statusDesc) statusDesc.innerText = status.description;
254
+ if (statusCons) statusCons.innerText = status.conservation;
255
+ if (statusAccel) statusAccel.innerText = status.acceleration;
256
+
257
+ bananaBody.style.color = status.color;
258
+ colorDot.style.backgroundColor = status.color;
259
+ colorDot.style.boxShadow = `0 0 15px ${status.color}`;
260
+
261
+ bananaGroup.style.transform = `rotate(${level * 5 - 12}deg) scale(${1 + (level - 2.5) * 0.05})`;
262
+
263
+ const glowColor = getGlowColor(status.color);
264
+ glowIndicator.style.backgroundColor = glowColor;
265
+ glowIndicator.style.opacity = (level / 12).toString();
266
+
267
+ dots.forEach((dot, index) => {
268
+ const threshold = 2.4 + index * 0.35;
269
+ if (level >= threshold) {
270
+ dot.style.opacity = "0.8";
271
+ } else {
272
+ dot.style.opacity = "0";
273
+ }
274
+ });
275
+
276
+ const days = calculateDays(level, temp, humidity, hasPartners);
277
+ daysPrediction.innerText = days.toString();
278
+ }
279
+
280
+ slider.addEventListener("input", update);
281
+ tempSlider.addEventListener("input", update);
282
+ humiditySlider.addEventListener("input", update);
283
+
284
+ update();
285
+ </script>
@@ -0,0 +1,177 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+
3
+ export const content: ToolLocaleContent = {
4
+ slug: 'banana-ripeness',
5
+ title: 'Banana Diagnostics and Conservation: Scientific Guide',
6
+ description: 'Analyze your banana ripening stage with scientific precision. Learn conservation techniques, ethylene biochemistry, and nutritional optimization.',
7
+ faqTitle: 'Frequently Asked Questions',
8
+ bibliographyTitle: 'Sources and References',
9
+ ui: {
10
+ ripesnessLabel: 'Ripeness State',
11
+ nextStageLabel: 'Next Stage in',
12
+ daysUnit: 'Days',
13
+ tempLabel: 'Temperature',
14
+ humidityLabel: 'Humidity',
15
+ partnerToggleTitle: 'Climacteric Companion',
16
+ partnerToggleSubtitle: 'External ethylene effect',
17
+ conservationTitle: 'Conservation',
18
+ accelerationTitle: 'Acceleration',
19
+ stage1Name: 'Emerald Green',
20
+ stage1Desc: 'Maximum resistant starch content. Full firmness.',
21
+ stage1Conservation: 'Room temperature (18-20°C). Avoid cold (<12°C).',
22
+ stage1Acceleration: 'Paper bag with a ripe apple or tomato.',
23
+ stage2Name: 'Radiant Yellow',
24
+ stage2Desc: 'Perfect balance between firmness and initial sweetness.',
25
+ stage2Conservation: 'Cool place, separate from bunch to slow ethylene.',
26
+ stage2Acceleration: 'Keep in bunch and wrap in plastic.',
27
+ stage3Name: 'Sweet Spotted',
28
+ stage3Desc: 'Antioxidant peak. Intense sweetness and creamy texture.',
29
+ stage3Conservation: 'Refrigerate to preserve pulp (though skin darkens).',
30
+ stage3Acceleration: 'Gentle heat (near heat source, not direct).',
31
+ stage4Name: 'Ripe Cinnamon',
32
+ stage4Desc: 'Very soft texture. Ideal for sugar-free baking.',
33
+ stage4Conservation: 'Peel and freeze immediately.',
34
+ stage4Acceleration: 'Already reached its peak.',
35
+ stage5Name: 'Overripe / Fermented',
36
+ stage5Desc: 'Advanced degradation process.',
37
+ stage5Conservation: 'Not recommended for direct consumption.',
38
+ stage5Acceleration: 'N/A',
39
+ },
40
+ faq: [
41
+ {
42
+ question: 'Why do bananas turn black in the fridge?',
43
+ answer: 'Cold breaks down cell walls in the peel, releasing enzymes that oxidize phenols and create black polyphenols. However, the inside usually stays firm and sweet longer than outside.',
44
+ },
45
+ {
46
+ question: 'How can I ripen a banana quickly?',
47
+ answer: 'Put them in a closed paper bag with an apple or tomato. These emit ethylene gas, which accelerates ripening. If in a hurry, you can put them in the oven at low temperature for a few minutes.',
48
+ },
49
+ {
50
+ question: 'Is it safe to eat spotted bananas?',
51
+ answer: 'Yes, totally. Spots indicate starch has converted to sugar, making them sweeter and more digestible. Only discard if they have mold, smell bad, or are excessively soft.',
52
+ },
53
+ {
54
+ question: 'What is ethylene?',
55
+ answer: 'It\'s a plant hormone in gas form that regulates growth and ripening. Banana is a climacteric fruit, meaning it continues producing ethylene and ripening after harvest.',
56
+ },
57
+ ],
58
+ howTo: [
59
+ {
60
+ name: 'Observe the color',
61
+ text: 'Carefully examine peel color, from green to dark brown, to determine current ripening stage.',
62
+ },
63
+ {
64
+ name: 'Use the simulator',
65
+ text: 'Slide the ripeness indicator to see accurate predictions about when it reaches the next stage.',
66
+ },
67
+ {
68
+ name: 'Adjust conditions',
69
+ text: 'Modify temperature and humidity to see how they affect ripening speed.',
70
+ },
71
+ {
72
+ name: 'Apply conservation',
73
+ text: 'Follow specific conservation and acceleration recommendations based on current stage.',
74
+ },
75
+ ],
76
+ bibliography: [
77
+ {
78
+ name: 'Ethylene and Fruit Ripening: A Biological Review (Nature Research)',
79
+ url: 'https://www.researchgate.net/profile/Jean-Claude-Pech/publication/284632414_Ethylene_and_Fruit_Ripening/links/5aef0bcbaca2727bc006482c/Ethylene-and-Fruit-Ripening.pdf',
80
+ },
81
+ {
82
+ name: 'Biochemical Changes in Musa acuminata during Ripening (Journal of Food Science)',
83
+ url: 'https://www.foodsciencejournal.com/assets/archives/2017/vol2issue5/2-5-31-566.pdf',
84
+ },
85
+ {
86
+ name: 'The Role of Respiration in Climacteric Fruits (Scientific American)',
87
+ url: 'https://www.nature.com/articles/226976b0',
88
+ },
89
+ ],
90
+ seo: [
91
+ {
92
+ type: 'title',
93
+ text: 'Science of Ripening in Musa × paradisiaca',
94
+ level: 2,
95
+ },
96
+ {
97
+ type: 'paragraph',
98
+ html: 'Banana is one of the most consumed fruits in the world, yet also one of the most biologically misunderstood. Unlike non-climacteric fruits like citrus or grapes, banana is a <strong>climacteric fruit</strong>. This means it continues ripening after harvest, drastically increasing cellular respiration and production of a critical gaseous phytohormone: <strong>ethylene</strong>.',
99
+ },
100
+ {
101
+ type: 'paragraph',
102
+ html: 'From a biochemical perspective, ripening is a cascade of enzymatic events. During this process, enzymes like amylase break down complex carbohydrates (starches) into simple sugars (fructose, glucose, and sucrose). This change not only alters flavor, making it sweeter, but also modifies texture by degrading pectin in cell walls, resulting in that soft, creamy consistency characterizing ripe banana.',
103
+ },
104
+ {
105
+ type: 'title',
106
+ text: 'The Ethylene Cycle',
107
+ level: 3,
108
+ },
109
+ {
110
+ type: 'paragraph',
111
+ html: 'Ethylene functions as a biological switch. Once fruit detects small ethylene concentration, it activates genes responsible for producing more ethylene, creating a positive feedback loop. This is why a very ripe banana accelerates ripening of all neighbors in the fruit bowl. To slow this process, it\'s vital to isolate specimens already showing brown spots from those still green.',
112
+ },
113
+ {
114
+ type: 'title',
115
+ text: 'The Refrigerator Myth',
116
+ level: 3,
117
+ },
118
+ {
119
+ type: 'paragraph',
120
+ html: 'There\'s a popular belief that bananas shouldn\'t go in the fridge. Reality is more complex: cold (below 12°C) causes chilling injury in peel cells, releasing enzymes that oxidize phenols and turn skin black. However, this only affects appearance. If the inside has already reached desired ripeness, cold will almost completely halt pulp softening, preserving flavor and texture for several additional days.',
121
+ },
122
+ {
123
+ type: 'title',
124
+ text: 'Advanced Conservation Strategies',
125
+ level: 3,
126
+ },
127
+ {
128
+ type: 'paragraph',
129
+ html: '<strong>Crown Wrapping:</strong> Wrapping the stem of a banana bunch with plastic wrap dramatically reduces ethylene release, extending commercial shelf life by up to 72 additional hours.',
130
+ },
131
+ {
132
+ type: 'paragraph',
133
+ html: '<strong>Dynamic Suspension:</strong> Hanging bananas prevents pressure bruising. Damaged tissues release ethylene faster, creating hotspots of accelerated ripening that spread through the fruit.',
134
+ },
135
+ {
136
+ type: 'paragraph',
137
+ html: '<strong>Cryotherapy (Freezing):</strong> For bananas in stage 4 (brown), freezing is best option. Peeling fruit before freezing prevents trapped moisture, maintaining fiber quality.',
138
+ },
139
+ {
140
+ type: 'title',
141
+ text: 'Nutritional Changes by Stage',
142
+ level: 2,
143
+ },
144
+ {
145
+ type: 'paragraph',
146
+ html: 'As banana ripens, its nutritional profile transforms dramatically, allowing it to be used as a specific dietary tool according to consumer objectives.',
147
+ },
148
+ {
149
+ type: 'table',
150
+ headers: ['Stage', 'Resistant Starch', 'Characteristics', 'Main Benefit'],
151
+ rows: [
152
+ ['Green (1-2)', '~80%', 'Very firm, maximum starch content', 'Gut health and glycemic control'],
153
+ ['Yellow (3)', '~5%', 'Balance of firmness and sweetness', 'Quick energy and B vitamins'],
154
+ ['Spotted (4)', 'Minimal', 'Very soft, high sugar content', 'Maximum antioxidant potential'],
155
+ ['Brown/Overripe (5)', 'Practically none', 'Very soft texture, advanced fermentation', 'Not recommended for consumption'],
156
+ ],
157
+ },
158
+ {
159
+ type: 'title',
160
+ text: 'Conclusion and Practical Application',
161
+ level: 2,
162
+ },
163
+ {
164
+ type: 'list',
165
+ items: [
166
+ '<strong>Reduce food waste:</strong> Precise banana stage diagnosis enables identifying optimal consumption moment, preventing valuable fruit loss.',
167
+ '<strong>Optimize nutritional benefits:</strong> From resistant starch in green for gut health to antioxidants in spotted for maximum antioxidant potential.',
168
+ '<strong>Plan strategic consumption:</strong> Adapt banana use according to your health objectives: glycemic control, quick energy, digestion, or antioxidants.',
169
+ ],
170
+ },
171
+ {
172
+ type: 'tip',
173
+ html: '<strong>Degradation Alert:</strong> External factors like relative humidity over 85% or temperatures above 25°C can drastically accelerate degradation, taking banana from optimal to inedible in hours. This simulator helps you anticipate these changes and plan strategically.',
174
+ },
175
+ ],
176
+ schemas: [],
177
+ };
@@ -0,0 +1,177 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+
3
+ export const content: ToolLocaleContent = {
4
+ slug: 'diagnostico-platanos',
5
+ title: 'Diagnóstico y Conservación de Plátanos: Guía Científica',
6
+ description: 'Analiza el estado de maduración de tus plátanos con precisión científica. Aprende técnicas de conservación, bioquímica del etileno y optimización nutricional.',
7
+ faqTitle: 'Preguntas Frecuentes',
8
+ bibliographyTitle: 'Fuentes y Referencias',
9
+ ui: {
10
+ ripesnessLabel: 'Estado de Maduración',
11
+ nextStageLabel: 'Próxima Etapa en',
12
+ daysUnit: 'Días',
13
+ tempLabel: 'Temperatura',
14
+ humidityLabel: 'Humedad',
15
+ partnerToggleTitle: 'Acompañamiento Climatérico',
16
+ partnerToggleSubtitle: 'Efecto etileno externo',
17
+ conservationTitle: 'Conservación',
18
+ accelerationTitle: 'Aceleración',
19
+ stage1Name: 'Verde Esmeralda',
20
+ stage1Desc: 'Contenido máximo de almidón resistente. Firmeza total.',
21
+ stage1Conservation: 'Ambiente (18-20°C). Evitar frío (<12°C).',
22
+ stage1Acceleration: 'Bolsa de papel con una manzana o tomate maduro.',
23
+ stage2Name: 'Amarillo Radiante',
24
+ stage2Desc: 'Equilibrio perfecto entre firmeza y dulzor inicial.',
25
+ stage2Conservation: 'Lugar fresco, separar del racimo para frenar etileno.',
26
+ stage2Acceleration: 'Mantener en el racimo y envolver en plástico.',
27
+ stage3Name: 'Moteado Dulce',
28
+ stage3Desc: 'Pico de antioxidantes. Dulzor intenso y textura cremosa.',
29
+ stage3Conservation: 'Refrigerar para conservar pulpa (aunque la piel se oscurezca).',
30
+ stage3Acceleration: 'Calor suave (cerca de una fuente de calor, no directa).',
31
+ stage4Name: 'Maduro Canela',
32
+ stage4Desc: 'Textura muy blanda. Ideal para repostería sin azúcar.',
33
+ stage4Conservation: 'Pelar y congelar inmediatamente.',
34
+ stage4Acceleration: 'Ya ha alcanzado su máximo.',
35
+ stage5Name: 'Pasado / Fermentado',
36
+ stage5Desc: 'Proceso de degradación avanzado.',
37
+ stage5Conservation: 'No recomendable para consumo directo.',
38
+ stage5Acceleration: 'N/A',
39
+ },
40
+ faq: [
41
+ {
42
+ question: '¿Por qué se ponen negros los plátanos en la nevera?',
43
+ answer: 'El frío rompe las paredes celulares de la cáscara, liberando enzimas que oxidan los fenoles y crean polifenoles negros. Sin embargo, el interior suele conservarse firme y dulce por más tiempo que fuera.',
44
+ },
45
+ {
46
+ question: '¿Cómo puedo madurar un plátano rápido?',
47
+ answer: 'Ponlos en una bolsa de papel cerrada con una manzana o un tomate. Estos emiten gas etileno, que acelera la maduración. Si tienes mucha prisa, puedes ponerlos unos minutos en el horno a baja temperatura.',
48
+ },
49
+ {
50
+ question: '¿Es seguro comer plátanos con manchas?',
51
+ answer: 'Sí, totalmente. De hecho, las manchas indican que el almidón se ha convertido en azúcar, haciéndolos más dulces y digeribles. Solo deséchalos si tienen moho, huelen mal o están excesivamente blandos.',
52
+ },
53
+ {
54
+ question: '¿Qué es el etileno?',
55
+ answer: 'Es una hormona vegetal en forma de gas que regula el crecimiento y la maduración. El plátano es una fruta climatérica, lo que significa que sigue produciendo etileno y madurando después de ser recolectado.',
56
+ },
57
+ ],
58
+ howTo: [
59
+ {
60
+ name: 'Observar el color',
61
+ text: 'Examina cuidadosamente el color de la cáscara, desde verde hasta marrón oscuro, para determinar el estado de maduración actual.',
62
+ },
63
+ {
64
+ name: 'Usar el simulador',
65
+ text: 'Desliza el indicador de maduración para ver predicciones precisas sobre cuándo alcanzará el siguiente estado.',
66
+ },
67
+ {
68
+ name: 'Ajustar condiciones',
69
+ text: 'Modifica temperatura y humedad para ver cómo afectan la velocidad de maduración.',
70
+ },
71
+ {
72
+ name: 'Aplicar conservación',
73
+ text: 'Sigue las recomendaciones específicas de conservación y aceleración según el estado actual.',
74
+ },
75
+ ],
76
+ bibliography: [
77
+ {
78
+ name: 'Ethylene and Fruit Ripening: A Biological Review',
79
+ url: '',
80
+ },
81
+ {
82
+ name: 'Biochemical Changes in Musa acuminata during Ripening (Journal of Food Science)',
83
+ url: 'https://www.foodsciencejournal.com/assets/archives/2017/vol2issue5/2-5-31-566.pdf',
84
+ },
85
+ {
86
+ name: 'The Role of Respiration in Climacteric Fruits (Scientific American)',
87
+ url: 'https://www.nature.com/articles/226976b0',
88
+ },
89
+ ],
90
+ seo: [
91
+ {
92
+ type: 'title',
93
+ text: 'Ciencia de la maduración del Musa × paradisiaca',
94
+ level: 2,
95
+ },
96
+ {
97
+ type: 'paragraph',
98
+ html: 'El plátano es una de las frutas más consumidas en el mundo, pero también una de las más incomprendidas biológicamente. A diferencia de las frutas no climatéricas, como los cítricos o las uvas, el plátano es una <strong>fruta climatérica</strong>. Esto significa que continúa madurando después de haber sido recolectado, incrementando drásticamente su respiración celular y la producción de una fitohormona gaseosa fundamental: el <strong>etileno</strong>.',
99
+ },
100
+ {
101
+ type: 'paragraph',
102
+ html: 'Desde un punto de vista bioquímico, la maduración es una cascada de eventos enzimáticos. Durante este proceso, las enzimas como la amilasa descomponen los carbohidratos complejos (almidones) en azúcares simples (fructosa, glucosa y sacarosa). Este cambio no solo altera el sabor, haciéndolo más dulce, sino que también modifica la textura al degradar la pectina de las paredes celulares, resultando en esa consistencia suave y cremosa que caracteriza al plátano maduro.',
103
+ },
104
+ {
105
+ type: 'title',
106
+ text: 'El Ciclo del Etileno',
107
+ level: 3,
108
+ },
109
+ {
110
+ type: 'paragraph',
111
+ html: 'El etileno funciona como un interruptor biológico. Una vez que la fruta detecta una pequeña concentración, activa los genes responsables de la producción de más etileno, creando un bucle de retroalimentación positiva. Es por esto que un plátano muy maduro acelerará la maduración de todos sus vecinos en el frutero. Para ralentizar este proceso, es vital aislar los ejemplares que ya presenten motas marrones de aquellos que todavía estén verdes.',
112
+ },
113
+ {
114
+ type: 'title',
115
+ text: 'El Mito del Frigorífico',
116
+ level: 3,
117
+ },
118
+ {
119
+ type: 'paragraph',
120
+ html: 'Existe la creencia popular de que los plátanos no deben ir a la nevera. La realidad es más compleja: el frío (por debajo de 12°C) causa daño por enfriamiento en las células de la cáscara, liberando enzimas que oxidan los fenoles y vuelven la piel negra. Sin embargo, esto solo afecta a la estética exterior. Si el interior ya ha alcanzado la madurez deseada, el frío detendrá casi por completo el ablandamiento de la pulpa, conservando el sabor y la textura interior durante varios días adicionales.',
121
+ },
122
+ {
123
+ type: 'title',
124
+ text: 'Estrategias Avanzadas de Conservación',
125
+ level: 3,
126
+ },
127
+ {
128
+ type: 'paragraph',
129
+ html: '<strong>El Sellado del Pedúnculo:</strong> Envolver el rabillo del racimo con film plástico reduce drásticamente la liberación de etileno, extendiendo la vida útil comercial de la unidad hasta en 72 horas adicionales.',
130
+ },
131
+ {
132
+ type: 'paragraph',
133
+ html: '<strong>Suspensión Dinámica:</strong> Colgar los plátanos evita los hematomas por presión. Los tejidos dañados liberan etileno más rápido, creando focos de maduración acelerada que se propagan por toda la fruta.',
134
+ },
135
+ {
136
+ type: 'paragraph',
137
+ html: '<strong>Crioterapia (Congelación):</strong> Para plátanos en fase 4 (marrón), la congelación es la mejor opción. Pelar la fruta antes de congelar evita que la humedad se quede atrapada, manteniendo la calidad de la fibra.',
138
+ },
139
+ {
140
+ type: 'title',
141
+ text: 'Cambios Nutricionales por Etapa',
142
+ level: 2,
143
+ },
144
+ {
145
+ type: 'paragraph',
146
+ html: 'A medida que el plátano madura, su perfil nutricional se transforma de manera radical, lo que permite utilizarlo como una herramienta dietética específica según los objetivos del consumidor.',
147
+ },
148
+ {
149
+ type: 'table',
150
+ headers: ['Fase', 'Almidón Resistente', 'Características', 'Beneficio Principal'],
151
+ rows: [
152
+ ['Verde (1-2)', '~80%', 'Muy firme, contenido máximo de almidón', 'Salud intestinal y control glucémico'],
153
+ ['Amarillo (3)', '~5%', 'Equilibrio de firmeza y dulzor', 'Energía rápida y vitaminas B'],
154
+ ['Moteado (4)', 'Mínimo', 'Muy blando, alto contenido de azúcares', 'Potencial antioxidante máximo'],
155
+ ['Marrón/Pasado (5)', 'Prácticamente nulo', 'Textura muy blanda, fermentación avanzada', 'No recomendable para consumo'],
156
+ ],
157
+ },
158
+ {
159
+ type: 'title',
160
+ text: 'Conclusión y Aplicación Práctica',
161
+ level: 2,
162
+ },
163
+ {
164
+ type: 'list',
165
+ items: [
166
+ '<strong>Reducir desperdicio alimentario:</strong> El diagnóstico preciso del estado de un plátano permite identificar el momento óptimo de consumo, evitando que se pierdan frutas valiosas.',
167
+ '<strong>Optimizar beneficios nutricionales:</strong> Desde el almidón resistente de los verdes para la salud intestinal, hasta los antioxidantes del moteado para potencial antioxidante máximo.',
168
+ '<strong>Planificar consumo estratégico:</strong> Adapta el uso del plátano según tus objetivos de salud: control glucémico, energía rápida, digestión u antioxidantes.',
169
+ ],
170
+ },
171
+ {
172
+ type: 'tip',
173
+ html: '<strong>Alerta de degradación:</strong> Factores externos como humedad relativa superior al 85% o temperaturas por encima de los 25°C pueden acelerar drásticamente la degradación, llevando el plátano de óptimo a incomestible en cuestión de horas. Este simulador te ayuda a anticipar estos cambios y planificar estratégicamente.',
174
+ },
175
+ ],
176
+ schemas: [],
177
+ };