@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,483 @@
1
+ :root {
2
+ --rg-primary: hsl(38deg, 92%, 50%);
3
+ --rg-primary-light: hsl(38deg, 92%, 90%);
4
+ --rg-primary-dark: hsl(38deg, 92%, 35%);
5
+ --rg-secondary: hsl(25deg, 95%, 53%);
6
+ --rg-bg-card: hsl(0deg, 0%, 100%);
7
+ --rg-bg-app: hsl(210deg, 20%, 98%);
8
+ --rg-border: hsl(210deg, 20%, 90%);
9
+ --rg-text-main: hsl(210deg, 30%, 20%);
10
+ --rg-text-muted: hsl(210deg, 15%, 50%);
11
+ --rg-text-disabled: hsl(210deg, 15%, 75%);
12
+ --rg-shadow-sm: 0 1px 2px 0 rgb(0, 0, 0, 0.05);
13
+ --rg-shadow-md: 0 4px 6px -1px rgb(0, 0, 0, 0.1), 0 2px 4px -2px rgb(0, 0, 0, 0.1);
14
+ --rg-shadow-lg: 0 10px 15px -3px rgb(0, 0, 0, 0.1), 0 4px 6px -4px rgb(0, 0, 0, 0.1);
15
+ --rg-radius: 1rem;
16
+ --rg-transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
17
+ }
18
+
19
+ .theme-dark {
20
+ --rg-bg-card: hsl(220deg, 25%, 12%);
21
+ --rg-bg-app: hsl(220deg, 30%, 7%);
22
+ --rg-border: hsl(220deg, 20%, 20%);
23
+ --rg-text-main: hsl(210deg, 20%, 95%);
24
+ --rg-text-muted: hsl(210deg, 15%, 70%);
25
+ --rg-text-disabled: hsl(210deg, 15%, 50%);
26
+ --rg-primary-light: hsl(38deg, 92%, 12%);
27
+ }
28
+
29
+ .rg-container {
30
+ width: 100%;
31
+ max-width: 100%;
32
+ padding: 1rem;
33
+ }
34
+
35
+ .rg-card {
36
+ background: var(--rg-bg-card);
37
+ border: 1px solid var(--rg-border);
38
+ border-radius: var(--rg-radius);
39
+ box-shadow: var(--rg-shadow-lg);
40
+ overflow: hidden;
41
+ }
42
+
43
+ .rg-progress-wrapper {
44
+ height: 0.375rem;
45
+ width: 100%;
46
+ background: var(--rg-bg-app);
47
+ position: relative;
48
+ }
49
+
50
+ .rg-progress-bar {
51
+ height: 100%;
52
+ background: linear-gradient(to right, var(--rg-primary), var(--rg-secondary));
53
+ transition: width var(--rg-transition);
54
+ width: 50%;
55
+ }
56
+
57
+ .rg-content {
58
+ padding: 2rem;
59
+ }
60
+
61
+ @media (max-width: 1024px) {
62
+ .rg-content {
63
+ padding: 1.5rem;
64
+ }
65
+ }
66
+
67
+ @media (max-width: 640px) {
68
+ .rg-content {
69
+ padding: 1rem;
70
+ }
71
+ }
72
+
73
+ .rg-grid {
74
+ display: grid;
75
+ grid-template-columns: 1fr;
76
+ gap: 3rem;
77
+ }
78
+
79
+ @media (min-width: 1024px) {
80
+ .rg-grid {
81
+ grid-template-columns: 1fr 1fr;
82
+ }
83
+ }
84
+
85
+ .rg-controls {
86
+ display: flex;
87
+ flex-direction: column;
88
+ gap: 2.5rem;
89
+ }
90
+
91
+ .rg-control-group {
92
+ display: flex;
93
+ flex-direction: column;
94
+ gap: 1rem;
95
+ }
96
+
97
+ .rg-label {
98
+ font-size: 0.75rem;
99
+ font-weight: 700;
100
+ color: var(--rg-text-muted);
101
+ text-transform: uppercase;
102
+ letter-spacing: 0.05em;
103
+ display: flex;
104
+ align-items: center;
105
+ gap: 0.75rem;
106
+ }
107
+
108
+ .rg-step {
109
+ width: 1.5rem;
110
+ height: 1.5rem;
111
+ border-radius: 50%;
112
+ background: hsl(38deg, 92%, 90%);
113
+ color: var(--rg-primary);
114
+ display: flex;
115
+ align-items: center;
116
+ justify-content: center;
117
+ font-weight: 700;
118
+ font-size: 0.75rem;
119
+ }
120
+
121
+ .theme-dark .rg-step {
122
+ background: hsl(38deg, 92%, 12%);
123
+ }
124
+
125
+ .rg-volume-wrapper {
126
+ display: flex;
127
+ flex-direction: column;
128
+ gap: 1rem;
129
+ }
130
+
131
+ @media (min-width: 640px) {
132
+ .rg-volume-wrapper {
133
+ flex-direction: row;
134
+ gap: 1rem;
135
+ }
136
+ }
137
+
138
+ .rg-input-group {
139
+ position: relative;
140
+ flex: 1;
141
+ }
142
+
143
+ .rg-input {
144
+ width: 100%;
145
+ padding: 1rem 2rem 1rem 1rem;
146
+ border: 2px solid var(--rg-border);
147
+ border-radius: 0.75rem;
148
+ background: var(--rg-bg-app);
149
+ color: var(--rg-text-main);
150
+ font-weight: 600;
151
+ font-size: 1.875rem;
152
+ text-align: center;
153
+ transition: var(--rg-transition);
154
+ }
155
+
156
+ .rg-input:focus {
157
+ outline: none;
158
+ border-color: var(--rg-primary);
159
+ box-shadow: 0 0 0 3px hsl(38deg, 92%, 50%, 0.1);
160
+ }
161
+
162
+ .rg-unit {
163
+ position: absolute;
164
+ right: 1rem;
165
+ top: 50%;
166
+ transform: translateY(-50%);
167
+ color: var(--rg-text-muted);
168
+ font-weight: 600;
169
+ font-size: 0.875rem;
170
+ text-transform: uppercase;
171
+ letter-spacing: 0.05em;
172
+ pointer-events: none;
173
+ }
174
+
175
+ .rg-liquid-buttons {
176
+ display: grid;
177
+ grid-template-columns: repeat(4, 1fr);
178
+ gap: 0.5rem;
179
+ }
180
+
181
+ @media (max-width: 640px) {
182
+ .rg-liquid-buttons {
183
+ grid-template-columns: repeat(2, 1fr);
184
+ }
185
+ }
186
+
187
+ .rg-liquid-btn {
188
+ display: flex;
189
+ align-items: center;
190
+ justify-content: center;
191
+ padding: 0.75rem;
192
+ border: 2px solid var(--rg-border);
193
+ border-radius: 0.75rem;
194
+ background: var(--rg-bg-card);
195
+ color: var(--rg-text-muted);
196
+ cursor: pointer;
197
+ transition: var(--rg-transition);
198
+ }
199
+
200
+ .rg-liquid-btn:hover {
201
+ border-color: var(--rg-primary);
202
+ color: var(--rg-primary);
203
+ }
204
+
205
+ .rg-liquid-btn.active {
206
+ background: var(--rg-bg-app);
207
+ border-color: var(--rg-primary);
208
+ color: var(--rg-primary);
209
+ box-shadow: var(--rg-shadow-md);
210
+ }
211
+
212
+ .rg-btn-icon {
213
+ width: 1.5rem;
214
+ height: 1.5rem;
215
+ }
216
+
217
+ .rg-texture-grid {
218
+ display: grid;
219
+ grid-template-columns: repeat(2, 1fr);
220
+ gap: 0.75rem;
221
+ }
222
+
223
+ @media (min-width: 640px) {
224
+ .rg-texture-grid {
225
+ grid-template-columns: repeat(4, 1fr);
226
+ }
227
+ }
228
+
229
+ .rg-texture-btn {
230
+ display: flex;
231
+ flex-direction: column;
232
+ align-items: center;
233
+ gap: 0.75rem;
234
+ padding: 1rem 0.75rem;
235
+ border: 2px solid var(--rg-border);
236
+ border-radius: 0.75rem;
237
+ background: var(--rg-bg-card);
238
+ color: var(--rg-text-muted);
239
+ cursor: pointer;
240
+ transition: var(--rg-transition);
241
+ text-align: center;
242
+ }
243
+
244
+ .rg-texture-btn:hover {
245
+ border-color: var(--rg-primary);
246
+ box-shadow: var(--rg-shadow-md);
247
+ }
248
+
249
+ .rg-texture-btn.active {
250
+ background: var(--rg-primary-light);
251
+ border-color: var(--rg-primary);
252
+ color: var(--rg-primary);
253
+ }
254
+
255
+ .rg-texture-visual {
256
+ width: 1.5rem;
257
+ height: 1.5rem;
258
+ border: 1px solid currentcolor;
259
+ border-radius: 0.25rem;
260
+ overflow: hidden;
261
+ display: flex;
262
+ align-items: flex-end;
263
+ }
264
+
265
+ .rg-texture-bar {
266
+ width: 100%;
267
+ background: currentcolor;
268
+ transition: height 0.3s ease;
269
+ }
270
+
271
+ .rg-texture-btn[data-level="1"] .rg-texture-bar {
272
+ height: 25%;
273
+ }
274
+
275
+ .rg-texture-btn[data-level="2"] .rg-texture-bar {
276
+ height: 50%;
277
+ }
278
+
279
+ .rg-texture-btn[data-level="3"] .rg-texture-bar {
280
+ height: 75%;
281
+ }
282
+
283
+ .rg-texture-btn[data-level="4"] .rg-texture-bar {
284
+ height: 100%;
285
+ }
286
+
287
+ .rg-texture-label {
288
+ font-size: 0.75rem;
289
+ font-weight: 600;
290
+ line-height: 1.2;
291
+ }
292
+
293
+ .rg-results {
294
+ display: flex;
295
+ flex-direction: column;
296
+ gap: 1.5rem;
297
+ }
298
+
299
+ .rg-result-hero {
300
+ background: linear-gradient(135deg, var(--rg-primary), var(--rg-secondary));
301
+ border-radius: var(--rg-radius);
302
+ padding: 2rem;
303
+ color: var(--rg-bg-card);
304
+ box-shadow: var(--rg-shadow-lg);
305
+ position: relative;
306
+ overflow: hidden;
307
+ }
308
+
309
+ .rg-result-hero::before {
310
+ content: '';
311
+ position: absolute;
312
+ top: -50%;
313
+ left: -50%;
314
+ width: 200%;
315
+ height: 200%;
316
+ background: radial-gradient(circle, hsla(0deg, 0%, 100%, 0.1), transparent 60%);
317
+ pointer-events: none;
318
+ }
319
+
320
+ .rg-result-header {
321
+ display: flex;
322
+ justify-content: space-between;
323
+ align-items: center;
324
+ margin-bottom: 1.5rem;
325
+ position: relative;
326
+ z-index: 1;
327
+ }
328
+
329
+ .rg-result-label {
330
+ font-size: 0.75rem;
331
+ font-weight: 700;
332
+ text-transform: uppercase;
333
+ letter-spacing: 0.1em;
334
+ opacity: 0.8;
335
+ }
336
+
337
+ .rg-roux-type {
338
+ font-size: 0.75rem;
339
+ font-weight: 600;
340
+ background: hsla(0deg, 0%, 0%, 0.2);
341
+ padding: 0.5rem 1rem;
342
+ border-radius: 0.5rem;
343
+ text-transform: capitalize;
344
+ }
345
+
346
+ .rg-result-amounts {
347
+ display: flex;
348
+ align-items: center;
349
+ justify-content: space-around;
350
+ margin-bottom: 1.5rem;
351
+ position: relative;
352
+ z-index: 1;
353
+ text-align: center;
354
+ }
355
+
356
+ .rg-amount {
357
+ flex: 1;
358
+ }
359
+
360
+ .rg-amount-value {
361
+ font-size: 2.5rem;
362
+ font-weight: 800;
363
+ margin-bottom: 0.5rem;
364
+ line-height: 1;
365
+ }
366
+
367
+ .rg-amount-unit {
368
+ font-size: 0.75rem;
369
+ font-weight: 600;
370
+ text-transform: uppercase;
371
+ opacity: 0.8;
372
+ }
373
+
374
+ .rg-amount-plus {
375
+ font-size: 1.5rem;
376
+ opacity: 0.3;
377
+ margin: 0 1rem;
378
+ }
379
+
380
+ .rg-instructions-box {
381
+ background: hsla(0deg, 0%, 0%, 0.2);
382
+ border-radius: 0.75rem;
383
+ border: 1px solid hsla(0deg, 0%, 100%, 0.1);
384
+ padding: 1rem;
385
+ position: relative;
386
+ z-index: 1;
387
+ backdrop-filter: blur(4px);
388
+ }
389
+
390
+ .rg-instructions-header {
391
+ display: flex;
392
+ align-items: center;
393
+ gap: 0.5rem;
394
+ margin-bottom: 0.75rem;
395
+ color: hsl(38deg, 92%, 90%);
396
+ }
397
+
398
+ .rg-instructions-icon {
399
+ width: 1rem;
400
+ height: 1rem;
401
+ }
402
+
403
+ .rg-instructions-title {
404
+ font-size: 0.75rem;
405
+ font-weight: 700;
406
+ text-transform: uppercase;
407
+ letter-spacing: 0.1em;
408
+ }
409
+
410
+ .rg-instructions-text {
411
+ font-size: 0.875rem;
412
+ font-weight: 500;
413
+ line-height: 1.5;
414
+ color: hsl(38deg, 92%, 95%);
415
+ margin: 0;
416
+ }
417
+
418
+ .rg-sauce-info {
419
+ background: var(--rg-bg-app);
420
+ border: 1px solid var(--rg-border);
421
+ border-radius: var(--rg-radius);
422
+ padding: 1.5rem;
423
+ display: flex;
424
+ flex-direction: column;
425
+ gap: 1rem;
426
+ }
427
+
428
+ .rg-sauce-header {
429
+ display: flex;
430
+ align-items: center;
431
+ gap: 1rem;
432
+ margin-bottom: 0.5rem;
433
+ }
434
+
435
+ .rg-sauce-icon {
436
+ width: 2.5rem;
437
+ height: 2.5rem;
438
+ border-radius: 0.5rem;
439
+ background: hsl(38deg, 92%, 90%);
440
+ color: var(--rg-primary);
441
+ display: flex;
442
+ align-items: center;
443
+ justify-content: center;
444
+ flex-shrink: 0;
445
+ }
446
+
447
+ .theme-dark .rg-sauce-icon {
448
+ background: hsl(38deg, 92%, 12%);
449
+ }
450
+
451
+ .rg-icon-lg {
452
+ width: 1.25rem;
453
+ height: 1.25rem;
454
+ }
455
+
456
+ .rg-sauce-name {
457
+ font-size: 1rem;
458
+ font-weight: 700;
459
+ color: var(--rg-text-main);
460
+ flex: 1;
461
+ }
462
+
463
+ .rg-sauce-ratio {
464
+ font-size: 0.75rem;
465
+ font-weight: 700;
466
+ color: var(--rg-text-muted);
467
+ text-transform: uppercase;
468
+ letter-spacing: 0.05em;
469
+ white-space: nowrap;
470
+ }
471
+
472
+ .rg-sauce-tip {
473
+ font-size: 0.875rem;
474
+ font-weight: 500;
475
+ line-height: 1.6;
476
+ color: var(--rg-text-muted);
477
+ font-style: italic;
478
+ background: var(--rg-bg-card);
479
+ padding: 1rem;
480
+ border-radius: 0.75rem;
481
+ border: 1px solid var(--rg-border);
482
+ margin: 0;
483
+ }
@@ -0,0 +1,6 @@
1
+ ---
2
+ import { Bibliography } from '@jjlmoya/utils-shared';
3
+ import { content } from './i18n/es';
4
+ ---
5
+
6
+ <Bibliography links={content.bibliography} />
@@ -0,0 +1,194 @@
1
+ ---
2
+ import { Icon } from 'astro-icon/components';
3
+ import './RouxGuide.css';
4
+
5
+ interface Props {
6
+ ui: Record<string, string>;
7
+ }
8
+
9
+ const { ui } = Astro.props;
10
+ ---
11
+
12
+ <div class="rg-container" id="roux-calculator">
13
+ <div class="rg-card">
14
+ <div class="rg-progress-wrapper">
15
+ <div class="rg-progress-bar" id="progress-bar"></div>
16
+ </div>
17
+
18
+ <div class="rg-content">
19
+ <div class="rg-grid">
20
+ <div class="rg-controls">
21
+ <div class="rg-control-group">
22
+ <label class="rg-label">
23
+ <span class="rg-step">1</span>
24
+ {ui.baseLiquid}
25
+ </label>
26
+
27
+ <div class="rg-volume-wrapper">
28
+ <div class="rg-input-group">
29
+ <input
30
+ type="number"
31
+ id="volume-input"
32
+ value="1000"
33
+ min="50"
34
+ step="50"
35
+ class="rg-input"
36
+ />
37
+ <span class="rg-unit">{ui.ml}</span>
38
+ </div>
39
+
40
+ <div class="rg-liquid-buttons">
41
+ <button
42
+ class="liquid-btn rg-liquid-btn active"
43
+ data-type="milk"
44
+ title={ui.milk}
45
+ >
46
+ <Icon name="mdi:cup-water" class="rg-btn-icon" />
47
+ </button>
48
+ <button
49
+ class="liquid-btn rg-liquid-btn"
50
+ data-type="lightStock"
51
+ title={ui.lightStock}
52
+ >
53
+ <Icon name="mdi:pot-mix-outline" class="rg-btn-icon" />
54
+ </button>
55
+ <button
56
+ class="liquid-btn rg-liquid-btn"
57
+ data-type="darkStock"
58
+ title={ui.darkStock}
59
+ >
60
+ <Icon name="mdi:food-steak" class="rg-btn-icon" />
61
+ </button>
62
+ <button
63
+ class="liquid-btn rg-liquid-btn"
64
+ data-type="tomato"
65
+ title={ui.tomato}
66
+ >
67
+ <Icon name="mdi:food-apple" class="rg-btn-icon" />
68
+ </button>
69
+ </div>
70
+ </div>
71
+ </div>
72
+
73
+ <div class="rg-control-group">
74
+ <label class="rg-label">
75
+ <span class="rg-step">2</span>
76
+ {ui.sauceTexture}
77
+ </label>
78
+
79
+ <div class="rg-texture-grid">
80
+ <button
81
+ class="texture-btn rg-texture-btn"
82
+ data-level="1"
83
+ >
84
+ <div class="rg-texture-visual">
85
+ <div class="rg-texture-bar"></div>
86
+ </div>
87
+ <span class="rg-texture-label">{ui.soup}</span>
88
+ </button>
89
+ <button
90
+ class="texture-btn rg-texture-btn active"
91
+ data-level="2"
92
+ >
93
+ <div class="rg-texture-visual">
94
+ <div class="rg-texture-bar"></div>
95
+ </div>
96
+ <span class="rg-texture-label">{ui.normalSauce}</span>
97
+ </button>
98
+ <button
99
+ class="texture-btn rg-texture-btn"
100
+ data-level="3"
101
+ >
102
+ <div class="rg-texture-visual">
103
+ <div class="rg-texture-bar"></div>
104
+ </div>
105
+ <span class="rg-texture-label">{ui.thick}</span>
106
+ </button>
107
+ <button
108
+ class="texture-btn rg-texture-btn"
109
+ data-level="4"
110
+ >
111
+ <div class="rg-texture-visual">
112
+ <div class="rg-texture-bar"></div>
113
+ </div>
114
+ <span class="rg-texture-label">{ui.croquette}</span>
115
+ </button>
116
+ </div>
117
+ </div>
118
+ </div>
119
+
120
+ <div class="rg-results">
121
+ <div class="rg-result-hero">
122
+ <div class="rg-result-header">
123
+ <span class="rg-result-label">{ui.rouxMix}</span>
124
+ <div class="rg-roux-type" id="roux-type-label">Blanco</div>
125
+ </div>
126
+
127
+ <div class="rg-result-amounts">
128
+ <div class="rg-amount">
129
+ <div class="rg-amount-value" id="butter-output">50</div>
130
+ <div class="rg-amount-unit">{ui.butter} (g)</div>
131
+ </div>
132
+ <div class="rg-amount-plus">+</div>
133
+ <div class="rg-amount">
134
+ <div class="rg-amount-value" id="flour-output">50</div>
135
+ <div class="rg-amount-unit">{ui.flour} (g)</div>
136
+ </div>
137
+ </div>
138
+
139
+ <div class="rg-instructions-box">
140
+ <div class="rg-instructions-header">
141
+ <Icon name="mdi:fire" class="rg-instructions-icon" />
142
+ <span class="rg-instructions-title">{ui.instructions}</span>
143
+ </div>
144
+ <p class="rg-instructions-text" id="cooking-instructions">
145
+ Cocina 2-3 min. No dejes que coja color.
146
+ </p>
147
+ </div>
148
+ </div>
149
+
150
+ <div class="rg-sauce-info">
151
+ <div class="rg-sauce-header">
152
+ <div class="rg-sauce-icon">
153
+ <Icon name="mdi:bookmark-check" class="rg-icon-lg" />
154
+ </div>
155
+ <span class="rg-sauce-name" id="sauce-name">Bechamel</span>
156
+ <span class="rg-sauce-ratio" id="ratio-display">90g/L</span>
157
+ </div>
158
+
159
+ <p class="rg-sauce-tip" id="chef-tip">
160
+ "Añade la leche fría de golpe sobre el roux caliente y remueve vigorosamente para evitar grumos."
161
+ </p>
162
+ </div>
163
+ </div>
164
+ </div>
165
+ </div>
166
+ </div>
167
+ </div>
168
+
169
+ <script>
170
+ import { initRouxGuide } from './init';
171
+ window.__initRouxGuide = initRouxGuide;
172
+ </script>
173
+
174
+ <script define:vars={{ ui }}>
175
+ const init = () => {
176
+ if (window.__initRouxGuide) {
177
+ window.__initRouxGuide(ui);
178
+ }
179
+ };
180
+
181
+ if (document.readyState === 'loading') {
182
+ document.addEventListener('DOMContentLoaded', init);
183
+ } else {
184
+ init();
185
+ }
186
+ </script>
187
+
188
+ <style>
189
+ input[type='number']::-webkit-outer-spin-button,
190
+ input[type='number']::-webkit-inner-spin-button {
191
+ -webkit-appearance: none;
192
+ margin: 0;
193
+ }
194
+ </style>