@jjlmoya/utils-cooking 1.32.0 → 1.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/package.json +2 -2
  2. package/src/category/index.ts +6 -0
  3. package/src/entries.ts +7 -1
  4. package/src/index.ts +3 -0
  5. package/src/tests/i18n-titles.test.ts +1 -1
  6. package/src/tests/i18n_coverage.test.ts +1 -0
  7. package/src/tests/locale_completeness.test.ts +2 -2
  8. package/src/tests/tool_validation.test.ts +2 -2
  9. package/src/tool/carry-over-cooking-predictor/bibliography.astro +6 -0
  10. package/src/tool/carry-over-cooking-predictor/bibliography.ts +10 -0
  11. package/src/tool/carry-over-cooking-predictor/carry-over-cooking-predictor.css +513 -0
  12. package/src/tool/carry-over-cooking-predictor/component.astro +362 -0
  13. package/src/tool/carry-over-cooking-predictor/entry.ts +26 -0
  14. package/src/tool/carry-over-cooking-predictor/i18n/de.ts +286 -0
  15. package/src/tool/carry-over-cooking-predictor/i18n/en.ts +286 -0
  16. package/src/tool/carry-over-cooking-predictor/i18n/es.ts +286 -0
  17. package/src/tool/carry-over-cooking-predictor/i18n/fr.ts +286 -0
  18. package/src/tool/carry-over-cooking-predictor/i18n/id.ts +286 -0
  19. package/src/tool/carry-over-cooking-predictor/i18n/it.ts +286 -0
  20. package/src/tool/carry-over-cooking-predictor/i18n/ja.ts +286 -0
  21. package/src/tool/carry-over-cooking-predictor/i18n/ko.ts +286 -0
  22. package/src/tool/carry-over-cooking-predictor/i18n/nl.ts +286 -0
  23. package/src/tool/carry-over-cooking-predictor/i18n/pl.ts +286 -0
  24. package/src/tool/carry-over-cooking-predictor/i18n/pt.ts +286 -0
  25. package/src/tool/carry-over-cooking-predictor/i18n/ru.ts +286 -0
  26. package/src/tool/carry-over-cooking-predictor/i18n/sv.ts +286 -0
  27. package/src/tool/carry-over-cooking-predictor/i18n/tr.ts +286 -0
  28. package/src/tool/carry-over-cooking-predictor/i18n/zh.ts +286 -0
  29. package/src/tool/carry-over-cooking-predictor/index.ts +11 -0
  30. package/src/tool/carry-over-cooking-predictor/logic.ts +63 -0
  31. package/src/tool/carry-over-cooking-predictor/seo.astro +15 -0
  32. package/src/tool/egg-timer/component.astro +19 -17
  33. package/src/tool/egg-timer/perfect-boiled-egg-timer-altitude-calculator.css +336 -502
  34. package/src/tool/maillard-reaction-optimizer/bibliography.astro +6 -0
  35. package/src/tool/maillard-reaction-optimizer/bibliography.ts +14 -0
  36. package/src/tool/maillard-reaction-optimizer/component.astro +391 -0
  37. package/src/tool/maillard-reaction-optimizer/entry.ts +12 -0
  38. package/src/tool/maillard-reaction-optimizer/i18n/de.ts +307 -0
  39. package/src/tool/maillard-reaction-optimizer/i18n/en.ts +307 -0
  40. package/src/tool/maillard-reaction-optimizer/i18n/es.ts +307 -0
  41. package/src/tool/maillard-reaction-optimizer/i18n/fr.ts +307 -0
  42. package/src/tool/maillard-reaction-optimizer/i18n/id.ts +307 -0
  43. package/src/tool/maillard-reaction-optimizer/i18n/it.ts +307 -0
  44. package/src/tool/maillard-reaction-optimizer/i18n/ja.ts +307 -0
  45. package/src/tool/maillard-reaction-optimizer/i18n/ko.ts +307 -0
  46. package/src/tool/maillard-reaction-optimizer/i18n/nl.ts +308 -0
  47. package/src/tool/maillard-reaction-optimizer/i18n/pl.ts +307 -0
  48. package/src/tool/maillard-reaction-optimizer/i18n/pt.ts +307 -0
  49. package/src/tool/maillard-reaction-optimizer/i18n/ru.ts +307 -0
  50. package/src/tool/maillard-reaction-optimizer/i18n/sv.ts +307 -0
  51. package/src/tool/maillard-reaction-optimizer/i18n/tr.ts +307 -0
  52. package/src/tool/maillard-reaction-optimizer/i18n/zh.ts +307 -0
  53. package/src/tool/maillard-reaction-optimizer/index.ts +11 -0
  54. package/src/tool/maillard-reaction-optimizer/logic.ts +57 -0
  55. package/src/tool/maillard-reaction-optimizer/maillard-reaction-optimizer.css +694 -0
  56. package/src/tool/maillard-reaction-optimizer/seo.astro +15 -0
  57. package/src/tool/meat-binder-transglutaminase-calculator/bibliography.astro +6 -0
  58. package/src/tool/meat-binder-transglutaminase-calculator/bibliography.ts +18 -0
  59. package/src/tool/meat-binder-transglutaminase-calculator/component.astro +253 -0
  60. package/src/tool/meat-binder-transglutaminase-calculator/components/LabReport.astro +59 -0
  61. package/src/tool/meat-binder-transglutaminase-calculator/components/TissueSpecimen.astro +67 -0
  62. package/src/tool/meat-binder-transglutaminase-calculator/components/TissueViewer.astro +137 -0
  63. package/src/tool/meat-binder-transglutaminase-calculator/entry.ts +26 -0
  64. package/src/tool/meat-binder-transglutaminase-calculator/i18n/de.ts +178 -0
  65. package/src/tool/meat-binder-transglutaminase-calculator/i18n/en.ts +178 -0
  66. package/src/tool/meat-binder-transglutaminase-calculator/i18n/es.ts +178 -0
  67. package/src/tool/meat-binder-transglutaminase-calculator/i18n/fr.ts +178 -0
  68. package/src/tool/meat-binder-transglutaminase-calculator/i18n/id.ts +178 -0
  69. package/src/tool/meat-binder-transglutaminase-calculator/i18n/it.ts +178 -0
  70. package/src/tool/meat-binder-transglutaminase-calculator/i18n/ja.ts +178 -0
  71. package/src/tool/meat-binder-transglutaminase-calculator/i18n/ko.ts +178 -0
  72. package/src/tool/meat-binder-transglutaminase-calculator/i18n/nl.ts +178 -0
  73. package/src/tool/meat-binder-transglutaminase-calculator/i18n/pl.ts +178 -0
  74. package/src/tool/meat-binder-transglutaminase-calculator/i18n/pt.ts +178 -0
  75. package/src/tool/meat-binder-transglutaminase-calculator/i18n/ru.ts +178 -0
  76. package/src/tool/meat-binder-transglutaminase-calculator/i18n/sv.ts +178 -0
  77. package/src/tool/meat-binder-transglutaminase-calculator/i18n/tr.ts +178 -0
  78. package/src/tool/meat-binder-transglutaminase-calculator/i18n/zh.ts +178 -0
  79. package/src/tool/meat-binder-transglutaminase-calculator/index.ts +11 -0
  80. package/src/tool/meat-binder-transglutaminase-calculator/logic.ts +66 -0
  81. package/src/tool/meat-binder-transglutaminase-calculator/meat-binder-transglutaminase-calculator.css +785 -0
  82. package/src/tool/meat-binder-transglutaminase-calculator/seo.astro +15 -0
  83. package/src/tools.ts +6 -0
  84. package/src/types.ts +1 -1
@@ -0,0 +1,694 @@
1
+ .mr {
2
+ --mr-bg: #faf6f0;
3
+ --mr-bg-dark: #12100e;
4
+ --mr-surface: #fff;
5
+ --mr-surface-dark: #1c1917;
6
+ --mr-ink: #2d1f0e;
7
+ --mr-ink-dark: #e8ddd0;
8
+ --mr-muted: #9b8a72;
9
+ --mr-muted-dark: #8a8070;
10
+ --mr-border: #e8ddd0;
11
+ --mr-border-dark: #2d2619;
12
+ --mr-amber: #c88a3e;
13
+ --mr-amber-dark: #e6a149;
14
+ --mr-gold: #bf8f3b;
15
+ --mr-gold-dark: #d4a44a;
16
+ --mr-brown: #5c3a1e;
17
+ --mr-brown-dark: #8b5e3c;
18
+ --mr-danger: #dc2626;
19
+ --mr-danger-dark: #ef4444;
20
+ --mr-green: #65a30d;
21
+ --mr-green-dark: #84cc16;
22
+
23
+ width: 100%;
24
+ box-sizing: border-box;
25
+ }
26
+
27
+ .mr-card {
28
+ max-width: 900px;
29
+ margin: 0 auto;
30
+ background: var(--mr-surface);
31
+ border: 1px solid var(--mr-border);
32
+ border-radius: 1.25rem;
33
+ overflow: hidden;
34
+ }
35
+
36
+ .theme-dark .mr-card {
37
+ background: var(--mr-surface-dark);
38
+ border-color: var(--mr-border-dark);
39
+ }
40
+
41
+ /* ===== Header ===== */
42
+ .mr-header {
43
+ padding: 1rem 1rem 0.75rem;
44
+ border-bottom: 1px solid var(--mr-border);
45
+ background: linear-gradient(135deg, var(--mr-surface) 0%, color-mix(in srgb, var(--mr-amber) 5%, var(--mr-surface)) 100%);
46
+ }
47
+
48
+ .theme-dark .mr-header {
49
+ border-bottom-color: var(--mr-border-dark);
50
+ background: linear-gradient(135deg, var(--mr-surface-dark) 0%, color-mix(in srgb, var(--mr-amber-dark) 6%, var(--mr-surface-dark)) 100%);
51
+ }
52
+
53
+ .mr-header-top {
54
+ display: flex;
55
+ flex-wrap: wrap;
56
+ justify-content: space-between;
57
+ align-items: center;
58
+ gap: 0.5rem;
59
+ margin-bottom: 0.5rem;
60
+ }
61
+
62
+ .mr-header-label {
63
+ font-size: 1rem;
64
+ font-weight: 800;
65
+ color: var(--mr-muted);
66
+ text-transform: uppercase;
67
+ letter-spacing: 0.08em;
68
+ }
69
+
70
+ .theme-dark .mr-header-label {
71
+ color: var(--mr-muted-dark);
72
+ }
73
+
74
+ .mr-flavor-badge {
75
+ display: inline-flex;
76
+ align-items: center;
77
+ gap: 0.35rem;
78
+ font-size: 0.9rem;
79
+ font-weight: 700;
80
+ padding: 0.4rem 0.9rem;
81
+ border-radius: 100px;
82
+ letter-spacing: 0.04em;
83
+ transition: all 0.3s ease;
84
+ }
85
+
86
+ .mr-flavor-badge.safe {
87
+ background: color-mix(in srgb, var(--mr-green) 18%, transparent);
88
+ color: var(--mr-green);
89
+ border: 1px solid color-mix(in srgb, var(--mr-green) 28%, transparent);
90
+ }
91
+
92
+ .theme-dark .mr-flavor-badge.safe {
93
+ background: color-mix(in srgb, var(--mr-green-dark) 18%, transparent);
94
+ color: var(--mr-green-dark);
95
+ border-color: color-mix(in srgb, var(--mr-green-dark) 28%, transparent);
96
+ }
97
+
98
+ .mr-flavor-badge.caution {
99
+ background: color-mix(in srgb, var(--mr-amber) 12%, transparent);
100
+ color: var(--mr-amber);
101
+ border: 1px solid color-mix(in srgb, var(--mr-amber) 20%, transparent);
102
+ }
103
+
104
+ .theme-dark .mr-flavor-badge.caution {
105
+ background: color-mix(in srgb, var(--mr-amber-dark) 12%, transparent);
106
+ color: var(--mr-amber-dark);
107
+ border-color: color-mix(in srgb, var(--mr-amber-dark) 20%, transparent);
108
+ }
109
+
110
+ .mr-flavor-badge.danger {
111
+ background: color-mix(in srgb, var(--mr-danger) 12%, transparent);
112
+ color: var(--mr-danger);
113
+ border: 1px solid color-mix(in srgb, var(--mr-danger) 20%, transparent);
114
+ }
115
+
116
+ .theme-dark .mr-flavor-badge.danger {
117
+ background: color-mix(in srgb, var(--mr-danger-dark) 12%, transparent);
118
+ color: var(--mr-danger-dark);
119
+ border-color: color-mix(in srgb, var(--mr-danger-dark) 20%, transparent);
120
+ }
121
+
122
+ /* ===== Unit Toggle ===== */
123
+ .mr-unit-row {
124
+ display: flex;
125
+ justify-content: flex-end;
126
+ align-items: center;
127
+ gap: 0.5rem;
128
+ }
129
+
130
+ .mr-unit-label {
131
+ font-size: 0.85rem;
132
+ font-weight: 700;
133
+ color: var(--mr-muted);
134
+ text-transform: uppercase;
135
+ letter-spacing: 0.06em;
136
+ }
137
+
138
+ .theme-dark .mr-unit-label {
139
+ color: var(--mr-muted-dark);
140
+ }
141
+
142
+ .mr-unit-toggle {
143
+ display: flex;
144
+ gap: 0;
145
+ border: 1px solid var(--mr-border);
146
+ border-radius: 8px;
147
+ overflow: hidden;
148
+ }
149
+
150
+ .theme-dark .mr-unit-toggle {
151
+ border-color: var(--mr-border-dark);
152
+ }
153
+
154
+ .mr-unit-btn {
155
+ flex: 1;
156
+ font-size: 0.9rem;
157
+ font-weight: 700;
158
+ padding: 0.55rem 0.9rem;
159
+ min-height: 44px;
160
+ border: none;
161
+ cursor: pointer;
162
+ background: transparent;
163
+ color: var(--mr-muted);
164
+ transition: all 0.2s ease;
165
+ letter-spacing: 0.04em;
166
+ }
167
+
168
+ .theme-dark .mr-unit-btn {
169
+ color: var(--mr-muted-dark);
170
+ }
171
+
172
+ .mr-unit-btn.active {
173
+ background: var(--mr-amber);
174
+ color: var(--mr-surface);
175
+ }
176
+
177
+ .theme-dark .mr-unit-btn.active {
178
+ background: var(--mr-amber-dark);
179
+ color: var(--mr-ink);
180
+ }
181
+
182
+ .mr-unit-btn:first-child {
183
+ border-right: 1px solid var(--mr-border);
184
+ }
185
+
186
+ .theme-dark .mr-unit-btn:first-child {
187
+ border-right-color: var(--mr-border-dark);
188
+ }
189
+
190
+ /* ===== Body ===== */
191
+ .mr-body {
192
+ display: grid;
193
+ grid-template-columns: 1fr;
194
+ gap: 0;
195
+ }
196
+
197
+ @media (min-width: 700px) {
198
+ .mr-body {
199
+ grid-template-columns: 1fr 1fr;
200
+ }
201
+ }
202
+
203
+ /* ===== Controls ===== */
204
+ .mr-controls {
205
+ padding: 1rem;
206
+ display: flex;
207
+ flex-direction: column;
208
+ gap: 1.25rem;
209
+ border-bottom: 2px solid color-mix(in srgb, var(--mr-border) 80%, var(--mr-ink));
210
+ }
211
+
212
+ @media (min-width: 700px) {
213
+ .mr-controls {
214
+ padding: 1.5rem;
215
+ border-bottom: none;
216
+ border-right: 2px solid color-mix(in srgb, var(--mr-border) 80%, var(--mr-ink));
217
+ }
218
+
219
+ .theme-dark .mr-controls {
220
+ border-right-color: var(--mr-border-dark);
221
+ }
222
+ }
223
+
224
+ .theme-dark .mr-controls {
225
+ border-bottom-color: var(--mr-border-dark);
226
+ }
227
+
228
+ .mr-control-group {
229
+ display: flex;
230
+ flex-direction: column;
231
+ gap: 0.4rem;
232
+ }
233
+
234
+ .mr-control-label {
235
+ font-size: 0.85rem;
236
+ font-weight: 700;
237
+ color: var(--mr-muted);
238
+ text-transform: uppercase;
239
+ letter-spacing: 0.06em;
240
+ }
241
+
242
+ .theme-dark .mr-control-label {
243
+ color: var(--mr-muted-dark);
244
+ }
245
+
246
+ .mr-slider-group {
247
+ display: flex;
248
+ align-items: center;
249
+ gap: 0.75rem;
250
+ }
251
+
252
+ .mr-range {
253
+ -webkit-appearance: none;
254
+ appearance: none;
255
+ flex: 1;
256
+ height: 6px;
257
+ border-radius: 4px;
258
+ background: var(--mr-border);
259
+ outline: none;
260
+ cursor: pointer;
261
+ min-width: 0;
262
+ }
263
+
264
+ .theme-dark .mr-range {
265
+ background: var(--mr-border-dark);
266
+ }
267
+
268
+ .mr-range::-webkit-slider-thumb {
269
+ -webkit-appearance: none;
270
+ appearance: none;
271
+ width: 32px;
272
+ height: 32px;
273
+ border-radius: 50%;
274
+ background: linear-gradient(135deg, var(--mr-gold), var(--mr-amber));
275
+ border: 3px solid var(--mr-surface);
276
+ box-shadow: 0 2px 8px rgba(191,143,59,0.4);
277
+ transition: transform 0.15s ease;
278
+ cursor: pointer;
279
+ }
280
+
281
+ .theme-dark .mr-range::-webkit-slider-thumb {
282
+ background: linear-gradient(135deg, var(--mr-gold-dark), var(--mr-amber-dark));
283
+ border-color: var(--mr-surface-dark);
284
+ }
285
+
286
+ .mr-range::-webkit-slider-thumb:hover {
287
+ transform: scale(1.1);
288
+ }
289
+
290
+ .mr-range::-moz-range-thumb {
291
+ width: 32px;
292
+ height: 32px;
293
+ border-radius: 50%;
294
+ background: linear-gradient(135deg, var(--mr-gold), var(--mr-amber));
295
+ border: 3px solid var(--mr-surface);
296
+ box-shadow: 0 2px 8px rgba(191,143,59,0.4);
297
+ cursor: pointer;
298
+ }
299
+
300
+ .theme-dark .mr-range::-moz-range-thumb {
301
+ background: linear-gradient(135deg, var(--mr-gold-dark), var(--mr-amber-dark));
302
+ border-color: var(--mr-surface-dark);
303
+ }
304
+
305
+ .mr-range-value {
306
+ font-size: 1.35rem;
307
+ font-weight: 800;
308
+ color: var(--mr-ink);
309
+ white-space: nowrap;
310
+ font-variant-numeric: tabular-nums;
311
+ min-width: 4rem;
312
+ text-align: right;
313
+ }
314
+
315
+ .theme-dark .mr-range-value {
316
+ color: var(--mr-ink-dark);
317
+ }
318
+
319
+ .mr-range-unit {
320
+ font-size: 0.8rem;
321
+ font-weight: 700;
322
+ color: var(--mr-ink);
323
+ }
324
+
325
+ .theme-dark .mr-range-unit {
326
+ color: var(--mr-ink-dark);
327
+ }
328
+
329
+ /* ===== Temp Recommendations ===== */
330
+ .mr-temp-hints {
331
+ display: flex;
332
+ flex-wrap: wrap;
333
+ gap: 0.5rem;
334
+ font-size: 0.82rem;
335
+ font-weight: 600;
336
+ }
337
+
338
+ .mr-temp-hint {
339
+ padding: 0.35rem 0.7rem;
340
+ border-radius: 100px;
341
+ background: var(--mr-bg);
342
+ border: 1px solid var(--mr-border);
343
+ color: var(--mr-ink);
344
+ white-space: nowrap;
345
+ }
346
+
347
+ .theme-dark .mr-temp-hint {
348
+ background: var(--mr-surface-dark);
349
+ border-color: var(--mr-border-dark);
350
+ color: var(--mr-ink-dark);
351
+ }
352
+
353
+ .mr-temp-hint.active {
354
+ background: color-mix(in srgb, var(--mr-gold) 20%, transparent);
355
+ border-color: var(--mr-gold);
356
+ color: var(--mr-brown);
357
+ }
358
+
359
+ .theme-dark .mr-temp-hint.active {
360
+ background: color-mix(in srgb, var(--mr-gold-dark) 20%, transparent);
361
+ border-color: var(--mr-gold-dark);
362
+ color: var(--mr-amber-dark);
363
+ }
364
+
365
+ /* ===== Preview Panel ===== */
366
+ .mr-preview {
367
+ padding: 1rem;
368
+ display: flex;
369
+ flex-direction: column;
370
+ align-items: center;
371
+ gap: 1rem;
372
+ background: radial-gradient(ellipse at 50% 30%, color-mix(in srgb, var(--mr-amber) 8%, transparent) 0%, transparent 70%);
373
+ }
374
+
375
+ @media (min-width: 700px) {
376
+ .mr-preview {
377
+ padding: 1.5rem;
378
+ }
379
+ }
380
+
381
+ /* ===== Speed Gauge ===== */
382
+ .mr-gauge-wrap {
383
+ position: relative;
384
+ width: min(200px, 60vw);
385
+ height: 130px;
386
+ }
387
+
388
+ @media (min-width: 700px) {
389
+ .mr-gauge-wrap {
390
+ width: 200px;
391
+ }
392
+ }
393
+
394
+ .mr-gauge-svg {
395
+ width: 100%;
396
+ height: 130px;
397
+ overflow: visible;
398
+ }
399
+
400
+ .mr-gauge-track-bg {
401
+ fill: none;
402
+ stroke: var(--mr-border);
403
+ stroke-width: 14;
404
+ }
405
+
406
+ .theme-dark .mr-gauge-track-bg {
407
+ stroke: var(--mr-border-dark);
408
+ }
409
+
410
+ .mr-gauge-track {
411
+ fill: none;
412
+ stroke-width: 14;
413
+ stroke-linecap: round;
414
+ transition: stroke-dashoffset 0.4s ease, stroke 0.4s ease;
415
+ }
416
+
417
+ .mr-gauge-center-val {
418
+ font-size: 2.4rem;
419
+ font-weight: 900;
420
+ fill: var(--mr-ink);
421
+ font-variant-numeric: tabular-nums;
422
+ }
423
+
424
+ .theme-dark .mr-gauge-center-val {
425
+ fill: var(--mr-ink-dark);
426
+ }
427
+
428
+ .mr-gauge-center-label {
429
+ font-size: 0.8rem;
430
+ font-weight: 700;
431
+ fill: var(--mr-muted);
432
+ }
433
+
434
+ .theme-dark .mr-gauge-center-label {
435
+ fill: var(--mr-muted-dark);
436
+ }
437
+
438
+ .mr-gauge-ticks {
439
+ stroke: var(--mr-muted);
440
+ stroke-width: 1;
441
+ opacity: 0.3;
442
+ }
443
+
444
+ /* ===== Browning Visual ===== */
445
+ .mr-browning-section {
446
+ width: 100%;
447
+ text-align: center;
448
+ }
449
+
450
+ .mr-browning-label {
451
+ font-size: 0.8rem;
452
+ font-weight: 700;
453
+ color: var(--mr-muted);
454
+ text-transform: uppercase;
455
+ letter-spacing: 0.06em;
456
+ margin-bottom: 0.5rem;
457
+ }
458
+
459
+ .theme-dark .mr-browning-label {
460
+ color: var(--mr-muted-dark);
461
+ }
462
+
463
+ .mr-browning-svg {
464
+ width: 100%;
465
+ max-width: 260px;
466
+ height: auto;
467
+ }
468
+
469
+ .mr-browning-bar-label {
470
+ font-size: 0.7rem;
471
+ fill: var(--mr-muted);
472
+ }
473
+
474
+ .theme-dark .mr-browning-bar-label {
475
+ fill: var(--mr-muted-dark);
476
+ }
477
+
478
+ /* ===== Stats Row ===== */
479
+ .mr-stats-row {
480
+ display: flex;
481
+ gap: 0.75rem;
482
+ width: 100%;
483
+ justify-content: center;
484
+ }
485
+
486
+ .mr-stat-card {
487
+ flex: 1;
488
+ max-width: 140px;
489
+ text-align: center;
490
+ padding: 0.75rem 0.5rem;
491
+ border-radius: 1rem;
492
+ background: var(--mr-bg);
493
+ border: 1px solid var(--mr-border);
494
+ }
495
+
496
+ .theme-dark .mr-stat-card {
497
+ background: var(--mr-surface-dark);
498
+ border-color: var(--mr-border-dark);
499
+ }
500
+
501
+ .mr-stat-label {
502
+ display: block;
503
+ font-size: 0.75rem;
504
+ font-weight: 700;
505
+ color: var(--mr-muted);
506
+ text-transform: uppercase;
507
+ letter-spacing: 0.06em;
508
+ margin-bottom: 0.25rem;
509
+ }
510
+
511
+ .theme-dark .mr-stat-label {
512
+ color: var(--mr-muted-dark);
513
+ }
514
+
515
+ .mr-stat-number {
516
+ display: block;
517
+ font-size: 1.5rem;
518
+ font-weight: 900;
519
+ color: var(--mr-ink);
520
+ font-variant-numeric: tabular-nums;
521
+ line-height: 1.1;
522
+ }
523
+
524
+ .theme-dark .mr-stat-number {
525
+ color: var(--mr-ink-dark);
526
+ }
527
+
528
+ .mr-stat-badge {
529
+ display: inline-block;
530
+ font-size: 1.5rem;
531
+ font-weight: 900;
532
+ line-height: 1.3;
533
+ }
534
+
535
+ .mr-stat-badge.fast {
536
+ color: var(--mr-green);
537
+ }
538
+
539
+ .theme-dark .mr-stat-badge.fast {
540
+ color: var(--mr-green-dark);
541
+ }
542
+
543
+ .mr-stat-badge.normal {
544
+ color: var(--mr-muted);
545
+ }
546
+
547
+ .theme-dark .mr-stat-badge.normal {
548
+ color: var(--mr-muted-dark);
549
+ }
550
+
551
+ /* ===== Baking Soda Recommendation ===== */
552
+ .mr-soda-rec {
553
+ width: 100%;
554
+ text-align: center;
555
+ padding: 0.75rem;
556
+ border-radius: 1rem;
557
+ background: var(--mr-bg);
558
+ border: 1px solid var(--mr-border);
559
+ }
560
+
561
+ .theme-dark .mr-soda-rec {
562
+ background: var(--mr-surface-dark);
563
+ border-color: var(--mr-border-dark);
564
+ }
565
+
566
+ .mr-soda-rec-label {
567
+ font-size: 0.75rem;
568
+ font-weight: 700;
569
+ color: var(--mr-muted);
570
+ text-transform: uppercase;
571
+ letter-spacing: 0.06em;
572
+ margin-bottom: 0.25rem;
573
+ display: block;
574
+ }
575
+
576
+ .theme-dark .mr-soda-rec-label {
577
+ color: var(--mr-muted-dark);
578
+ }
579
+
580
+ .mr-soda-rec-value {
581
+ font-size: 1.4rem;
582
+ font-weight: 900;
583
+ color: var(--mr-amber);
584
+ font-variant-numeric: tabular-nums;
585
+ }
586
+
587
+ .theme-dark .mr-soda-rec-value {
588
+ color: var(--mr-amber-dark);
589
+ }
590
+
591
+ .mr-soda-rec-max {
592
+ font-size: 0.8rem;
593
+ font-weight: 600;
594
+ color: var(--mr-muted);
595
+ }
596
+
597
+ .theme-dark .mr-soda-rec-max {
598
+ color: var(--mr-muted-dark);
599
+ }
600
+
601
+ /* ===== Error ===== */
602
+ .mr-error {
603
+ padding: 0.75rem 1rem;
604
+ }
605
+
606
+ .mr-error-text {
607
+ font-size: 0.95rem;
608
+ color: var(--mr-danger);
609
+ line-height: 1.5;
610
+ margin: 0;
611
+ padding: 0.75rem 1rem;
612
+ background: rgba(220,38,38,0.06);
613
+ border: 1px solid rgba(220,38,38,0.12);
614
+ border-radius: 0.75rem;
615
+ }
616
+
617
+ .theme-dark .mr-error-text {
618
+ color: var(--mr-danger-dark);
619
+ background: rgba(239,68,68,0.06);
620
+ border-color: rgba(239,68,68,0.12);
621
+ }
622
+
623
+ /* ===== Footer ===== */
624
+ .mr-footer {
625
+ padding: 0 1rem 1rem;
626
+ }
627
+
628
+ @media (min-width: 700px) {
629
+ .mr-footer {
630
+ padding: 0 2rem 1.5rem;
631
+ }
632
+ }
633
+
634
+ .mr-footer-text {
635
+ font-size: 0.9rem;
636
+ color: var(--mr-ink);
637
+ margin: 0;
638
+ padding: 0.75rem;
639
+ background: var(--mr-bg);
640
+ border: 1px solid var(--mr-border);
641
+ border-radius: 0.75rem;
642
+ line-height: 1.8;
643
+ display: flex;
644
+ flex-wrap: wrap;
645
+ align-items: baseline;
646
+ justify-content: center;
647
+ gap: 0.2rem 0;
648
+ }
649
+
650
+ @media (min-width: 700px) {
651
+ .mr-footer-text {
652
+ padding: 0.75rem 1rem;
653
+ }
654
+ }
655
+
656
+ .theme-dark .mr-footer-text {
657
+ color: var(--mr-ink-dark);
658
+ background: var(--mr-surface-dark);
659
+ border-color: var(--mr-border-dark);
660
+ }
661
+
662
+ .mr-footer-sep {
663
+ color: var(--mr-muted);
664
+ margin: 0 0.3rem;
665
+ font-weight: 400;
666
+ }
667
+
668
+ .theme-dark .mr-footer-sep {
669
+ color: var(--mr-muted-dark);
670
+ }
671
+
672
+ .mr-footer-stat {
673
+ white-space: nowrap;
674
+ }
675
+
676
+ .mr-footer-stat strong {
677
+ font-weight: 800;
678
+ color: var(--mr-amber);
679
+ font-variant-numeric: tabular-nums;
680
+ }
681
+
682
+ .theme-dark .mr-footer-stat strong {
683
+ color: var(--mr-amber-dark);
684
+ }
685
+
686
+ .mr-footer-stat small {
687
+ font-size: 0.8rem;
688
+ font-weight: 600;
689
+ color: var(--mr-muted);
690
+ }
691
+
692
+ .theme-dark .mr-footer-stat small {
693
+ color: var(--mr-muted-dark);
694
+ }
@@ -0,0 +1,15 @@
1
+ ---
2
+ import { SEORenderer } from '@jjlmoya/utils-shared';
3
+ import { maillardReaction } from './entry';
4
+ import type { KnownLocale } from '../../types';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'en' } = Astro.props;
11
+ const content = await maillardReaction.i18n[locale]?.();
12
+ if (!content) return null;
13
+ ---
14
+
15
+ {content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
@@ -0,0 +1,6 @@
1
+ ---
2
+ import { Bibliography as BibliographyComponent } from '@jjlmoya/utils-shared';
3
+ import { bibliography } from './bibliography';
4
+ ---
5
+
6
+ <BibliographyComponent links={bibliography} />
@@ -0,0 +1,18 @@
1
+ export const bibliography = [
2
+ {
3
+ name: 'Transglutaminase in Food Processing: Cross-Linking Proteins for Texture Modification (Comprehensive Reviews in Food Science and Food Safety)',
4
+ url: 'https://ift.onlinelibrary.wiley.com/journal/15414337',
5
+ },
6
+ {
7
+ name: 'Meat Glue: The Science of Transglutaminase in Molecular Gastronomy (Khymos / Martin Lersch)',
8
+ url: 'https://khymos.org/transglutaminase.php',
9
+ },
10
+ {
11
+ name: 'Modernist Cuisine at Home: Enzyme Applications in Charcuterie and Roulades (Nathan Myhrvold)',
12
+ url: 'https://modernistcuisine.com/books/modernist-cuisine-at-home/',
13
+ },
14
+ {
15
+ name: 'Effect of Transglutaminase on Meat Binding and Texture in Restructured Products (Journal of Food Science)',
16
+ url: 'https://ift.onlinelibrary.wiley.com/journal/17503841',
17
+ },
18
+ ];