@jjlmoya/utils-cooking 1.9.0 → 1.11.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.
@@ -1,6 +1,5 @@
1
1
  ---
2
2
  import { Icon } from 'astro-icon/components';
3
- import './RouxGuide.css';
4
3
 
5
4
  interface Props {
6
5
  ui: Record<string, string>;
@@ -185,10 +184,490 @@ const { ui } = Astro.props;
185
184
  }
186
185
  </script>
187
186
 
187
+ <style is:global>
188
+ :root {
189
+ --rg-primary: hsl(38deg, 92%, 50%);
190
+ --rg-primary-light: hsl(38deg, 92%, 90%);
191
+ --rg-secondary: hsl(25deg, 95%, 53%);
192
+ --rg-bg-card: hsl(0deg, 0%, 100%);
193
+ --rg-bg-app: hsl(210deg, 20%, 98%);
194
+ --rg-border: hsl(210deg, 20%, 90%);
195
+ --rg-text-main: hsl(210deg, 30%, 20%);
196
+ --rg-text-muted: hsl(210deg, 15%, 50%);
197
+ --rg-shadow-lg: 0 10px 15px -3px rgb(0, 0, 0, 0.1);
198
+ --rg-radius: 1rem;
199
+ }
200
+
201
+ .theme-dark {
202
+ --rg-bg-card: hsl(220deg, 25%, 12%);
203
+ --rg-bg-app: hsl(220deg, 30%, 7%);
204
+ --rg-border: hsl(220deg, 20%, 20%);
205
+ --rg-text-main: hsl(210deg, 20%, 95%);
206
+ --rg-text-muted: hsl(210deg, 15%, 70%);
207
+ --rg-primary-light: hsl(38deg, 92%, 12%);
208
+ }
209
+ </style>
210
+
188
211
  <style>
189
212
  input[type='number']::-webkit-outer-spin-button,
190
213
  input[type='number']::-webkit-inner-spin-button {
191
214
  -webkit-appearance: none;
192
215
  margin: 0;
193
216
  }
217
+
218
+ .rg-container {
219
+ width: 100%;
220
+ max-width: 100%;
221
+ padding: 1rem;
222
+ }
223
+
224
+ .rg-card {
225
+ background: var(--rg-bg-card);
226
+ border: 1px solid var(--rg-border);
227
+ border-radius: var(--rg-radius);
228
+ box-shadow: var(--rg-shadow-lg);
229
+ overflow: hidden;
230
+ }
231
+
232
+ .rg-progress-wrapper {
233
+ height: 0.375rem;
234
+ width: 100%;
235
+ background: var(--rg-bg-app);
236
+ position: relative;
237
+ }
238
+
239
+ .rg-progress-bar {
240
+ height: 100%;
241
+ background: linear-gradient(to right, var(--rg-primary), var(--rg-secondary));
242
+ transition: width 0.3s ease;
243
+ width: 50%;
244
+ }
245
+
246
+ .rg-content {
247
+ padding: 2rem;
248
+ }
249
+
250
+ @media (max-width: 1024px) {
251
+ .rg-content {
252
+ padding: 1.5rem;
253
+ }
254
+ }
255
+
256
+ @media (max-width: 640px) {
257
+ .rg-content {
258
+ padding: 1rem;
259
+ }
260
+ }
261
+
262
+ .rg-grid {
263
+ display: grid;
264
+ grid-template-columns: 1fr;
265
+ gap: 3rem;
266
+ }
267
+
268
+ @media (min-width: 1024px) {
269
+ .rg-grid {
270
+ grid-template-columns: 1fr 1fr;
271
+ }
272
+ }
273
+
274
+ .rg-controls {
275
+ display: flex;
276
+ flex-direction: column;
277
+ gap: 2.5rem;
278
+ }
279
+
280
+ .rg-control-group {
281
+ display: flex;
282
+ flex-direction: column;
283
+ gap: 1rem;
284
+ }
285
+
286
+ .rg-label {
287
+ font-size: 0.75rem;
288
+ font-weight: 700;
289
+ color: var(--rg-text-muted);
290
+ text-transform: uppercase;
291
+ letter-spacing: 0.05em;
292
+ display: flex;
293
+ align-items: center;
294
+ gap: 0.75rem;
295
+ }
296
+
297
+ .rg-step {
298
+ width: 1.5rem;
299
+ height: 1.5rem;
300
+ border-radius: 50%;
301
+ background: hsl(38deg, 92%, 90%);
302
+ color: var(--rg-primary);
303
+ display: flex;
304
+ align-items: center;
305
+ justify-content: center;
306
+ font-weight: 700;
307
+ font-size: 0.75rem;
308
+ }
309
+
310
+ :global(.theme-dark) .rg-step {
311
+ background: hsl(38deg, 92%, 12%);
312
+ }
313
+
314
+ .rg-volume-wrapper {
315
+ display: flex;
316
+ flex-direction: column;
317
+ gap: 1rem;
318
+ }
319
+
320
+ @media (min-width: 640px) {
321
+ .rg-volume-wrapper {
322
+ flex-direction: row;
323
+ gap: 1rem;
324
+ }
325
+ }
326
+
327
+ .rg-input-group {
328
+ position: relative;
329
+ flex: 1;
330
+ }
331
+
332
+ .rg-input {
333
+ width: 100%;
334
+ padding: 1rem 2rem 1rem 1rem;
335
+ border: 2px solid var(--rg-border);
336
+ border-radius: 0.75rem;
337
+ background: var(--rg-bg-app);
338
+ color: var(--rg-text-main);
339
+ font-weight: 600;
340
+ font-size: 1.875rem;
341
+ text-align: center;
342
+ transition: all 0.3s ease;
343
+ }
344
+
345
+ .rg-input:focus {
346
+ outline: none;
347
+ border-color: var(--rg-primary);
348
+ box-shadow: 0 0 0 3px hsl(38deg, 92%, 50%, 0.1);
349
+ }
350
+
351
+ .rg-unit {
352
+ position: absolute;
353
+ right: 1rem;
354
+ top: 50%;
355
+ transform: translateY(-50%);
356
+ color: var(--rg-text-muted);
357
+ font-weight: 600;
358
+ font-size: 0.875rem;
359
+ text-transform: uppercase;
360
+ letter-spacing: 0.05em;
361
+ pointer-events: none;
362
+ }
363
+
364
+ .rg-liquid-buttons {
365
+ display: grid;
366
+ grid-template-columns: repeat(4, 1fr);
367
+ gap: 0.5rem;
368
+ }
369
+
370
+ @media (max-width: 640px) {
371
+ .rg-liquid-buttons {
372
+ grid-template-columns: repeat(2, 1fr);
373
+ }
374
+ }
375
+
376
+ .rg-liquid-btn {
377
+ display: flex;
378
+ align-items: center;
379
+ justify-content: center;
380
+ padding: 0.75rem;
381
+ border: 2px solid var(--rg-border);
382
+ border-radius: 0.75rem;
383
+ background: var(--rg-bg-card);
384
+ color: var(--rg-text-muted);
385
+ cursor: pointer;
386
+ transition: all 0.3s ease;
387
+ }
388
+
389
+ .rg-liquid-btn:hover {
390
+ border-color: var(--rg-primary);
391
+ color: var(--rg-primary);
392
+ }
393
+
394
+ .rg-liquid-btn.active {
395
+ background: var(--rg-bg-app);
396
+ border-color: var(--rg-primary);
397
+ color: var(--rg-primary);
398
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
399
+ }
400
+
401
+ .rg-btn-icon {
402
+ width: 1.5rem;
403
+ height: 1.5rem;
404
+ }
405
+
406
+ .rg-texture-grid {
407
+ display: grid;
408
+ grid-template-columns: repeat(2, 1fr);
409
+ gap: 0.75rem;
410
+ }
411
+
412
+ @media (min-width: 640px) {
413
+ .rg-texture-grid {
414
+ grid-template-columns: repeat(4, 1fr);
415
+ }
416
+ }
417
+
418
+ .rg-texture-btn {
419
+ display: flex;
420
+ flex-direction: column;
421
+ align-items: center;
422
+ gap: 0.75rem;
423
+ padding: 1rem 0.75rem;
424
+ border: 2px solid var(--rg-border);
425
+ border-radius: 0.75rem;
426
+ background: var(--rg-bg-card);
427
+ color: var(--rg-text-muted);
428
+ cursor: pointer;
429
+ transition: all 0.3s ease;
430
+ text-align: center;
431
+ }
432
+
433
+ .rg-texture-btn:hover {
434
+ border-color: var(--rg-primary);
435
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
436
+ }
437
+
438
+ .rg-texture-btn.active {
439
+ background: var(--rg-primary-light);
440
+ border-color: var(--rg-primary);
441
+ color: var(--rg-primary);
442
+ }
443
+
444
+ .rg-texture-visual {
445
+ width: 1.5rem;
446
+ height: 1.5rem;
447
+ border: 1px solid currentcolor;
448
+ border-radius: 0.25rem;
449
+ overflow: hidden;
450
+ display: flex;
451
+ align-items: flex-end;
452
+ }
453
+
454
+ .rg-texture-bar {
455
+ width: 100%;
456
+ background: currentcolor;
457
+ transition: height 0.3s ease;
458
+ }
459
+
460
+ .rg-texture-btn[data-level="1"] .rg-texture-bar {
461
+ height: 25%;
462
+ }
463
+
464
+ .rg-texture-btn[data-level="2"] .rg-texture-bar {
465
+ height: 50%;
466
+ }
467
+
468
+ .rg-texture-btn[data-level="3"] .rg-texture-bar {
469
+ height: 75%;
470
+ }
471
+
472
+ .rg-texture-btn[data-level="4"] .rg-texture-bar {
473
+ height: 100%;
474
+ }
475
+
476
+ .rg-texture-label {
477
+ font-size: 0.75rem;
478
+ font-weight: 600;
479
+ line-height: 1.2;
480
+ }
481
+
482
+ .rg-results {
483
+ display: flex;
484
+ flex-direction: column;
485
+ gap: 1.5rem;
486
+ }
487
+
488
+ .rg-result-hero {
489
+ background: linear-gradient(135deg, var(--rg-primary), var(--rg-secondary));
490
+ border-radius: var(--rg-radius);
491
+ padding: 2rem;
492
+ color: var(--rg-bg-card);
493
+ box-shadow: var(--rg-shadow-lg);
494
+ position: relative;
495
+ overflow: hidden;
496
+ }
497
+
498
+ .rg-result-hero::before {
499
+ content: '';
500
+ position: absolute;
501
+ top: -50%;
502
+ left: -50%;
503
+ width: 200%;
504
+ height: 200%;
505
+ background: radial-gradient(circle, hsla(0deg, 0%, 100%, 0.1), transparent 60%);
506
+ pointer-events: none;
507
+ }
508
+
509
+ .rg-result-header {
510
+ display: flex;
511
+ justify-content: space-between;
512
+ align-items: center;
513
+ margin-bottom: 1.5rem;
514
+ position: relative;
515
+ z-index: 1;
516
+ }
517
+
518
+ .rg-result-label {
519
+ font-size: 0.75rem;
520
+ font-weight: 700;
521
+ text-transform: uppercase;
522
+ letter-spacing: 0.1em;
523
+ opacity: 0.8;
524
+ }
525
+
526
+ .rg-roux-type {
527
+ font-size: 0.75rem;
528
+ font-weight: 600;
529
+ background: hsla(0deg, 0%, 0%, 0.2);
530
+ padding: 0.5rem 1rem;
531
+ border-radius: 0.5rem;
532
+ text-transform: capitalize;
533
+ }
534
+
535
+ .rg-result-amounts {
536
+ display: flex;
537
+ align-items: center;
538
+ justify-content: space-around;
539
+ margin-bottom: 1.5rem;
540
+ position: relative;
541
+ z-index: 1;
542
+ text-align: center;
543
+ }
544
+
545
+ .rg-amount {
546
+ flex: 1;
547
+ }
548
+
549
+ .rg-amount-value {
550
+ font-size: 2.5rem;
551
+ font-weight: 800;
552
+ margin-bottom: 0.5rem;
553
+ line-height: 1;
554
+ }
555
+
556
+ .rg-amount-unit {
557
+ font-size: 0.75rem;
558
+ font-weight: 600;
559
+ text-transform: uppercase;
560
+ opacity: 0.8;
561
+ }
562
+
563
+ .rg-amount-plus {
564
+ font-size: 1.5rem;
565
+ opacity: 0.3;
566
+ margin: 0 1rem;
567
+ }
568
+
569
+ .rg-instructions-box {
570
+ background: hsla(0deg, 0%, 0%, 0.2);
571
+ border-radius: 0.75rem;
572
+ border: 1px solid hsla(0deg, 0%, 100%, 0.1);
573
+ padding: 1rem;
574
+ position: relative;
575
+ z-index: 1;
576
+ backdrop-filter: blur(4px);
577
+ }
578
+
579
+ .rg-instructions-header {
580
+ display: flex;
581
+ align-items: center;
582
+ gap: 0.5rem;
583
+ margin-bottom: 0.75rem;
584
+ color: hsl(38deg, 92%, 90%);
585
+ }
586
+
587
+ .rg-instructions-icon {
588
+ width: 1rem;
589
+ height: 1rem;
590
+ }
591
+
592
+ .rg-instructions-title {
593
+ font-size: 0.75rem;
594
+ font-weight: 700;
595
+ text-transform: uppercase;
596
+ letter-spacing: 0.1em;
597
+ }
598
+
599
+ .rg-instructions-text {
600
+ font-size: 0.875rem;
601
+ font-weight: 500;
602
+ line-height: 1.5;
603
+ color: hsl(38deg, 92%, 95%);
604
+ margin: 0;
605
+ }
606
+
607
+ .rg-sauce-info {
608
+ background: var(--rg-bg-app);
609
+ border: 1px solid var(--rg-border);
610
+ border-radius: var(--rg-radius);
611
+ padding: 1.5rem;
612
+ display: flex;
613
+ flex-direction: column;
614
+ gap: 1rem;
615
+ }
616
+
617
+ .rg-sauce-header {
618
+ display: flex;
619
+ align-items: center;
620
+ gap: 1rem;
621
+ margin-bottom: 0.5rem;
622
+ }
623
+
624
+ .rg-sauce-icon {
625
+ width: 2.5rem;
626
+ height: 2.5rem;
627
+ border-radius: 0.5rem;
628
+ background: hsl(38deg, 92%, 90%);
629
+ color: var(--rg-primary);
630
+ display: flex;
631
+ align-items: center;
632
+ justify-content: center;
633
+ flex-shrink: 0;
634
+ }
635
+
636
+ :global(.theme-dark) .rg-sauce-icon {
637
+ background: hsl(38deg, 92%, 12%);
638
+ }
639
+
640
+ .rg-icon-lg {
641
+ width: 1.25rem;
642
+ height: 1.25rem;
643
+ }
644
+
645
+ .rg-sauce-name {
646
+ font-size: 1rem;
647
+ font-weight: 700;
648
+ color: var(--rg-text-main);
649
+ flex: 1;
650
+ }
651
+
652
+ .rg-sauce-ratio {
653
+ font-size: 0.75rem;
654
+ font-weight: 700;
655
+ color: var(--rg-text-muted);
656
+ text-transform: uppercase;
657
+ letter-spacing: 0.05em;
658
+ white-space: nowrap;
659
+ }
660
+
661
+ .rg-sauce-tip {
662
+ font-size: 0.875rem;
663
+ font-weight: 500;
664
+ line-height: 1.6;
665
+ color: var(--rg-text-muted);
666
+ font-style: italic;
667
+ background: var(--rg-bg-card);
668
+ padding: 1rem;
669
+ border-radius: 0.75rem;
670
+ border: 1px solid var(--rg-border);
671
+ margin: 0;
672
+ }
194
673
  </style>
@@ -105,6 +105,23 @@ export const content: ToolLocaleContent = {
105
105
  blond: "Blond",
106
106
  brown: "Brown",
107
107
  beurreManied: "Beurre Manié (For final adjustments)",
108
+ recipeBechamel: "Béchamel",
109
+ recipeVeloute: "Velouté",
110
+ recipeEspagnole: "Espagnole",
111
+ recipeTomato: "Tomato Sauce",
112
+ tipBechamel: "Use cold milk. Add it gradually at first or all at once if you whisk vigorously.",
113
+ tipVeloute: "Use light poultry or fish stock. Let the roux smell like biscuits before adding the liquid.",
114
+ tipEspagnole: "For powerful dark sauces. The roux should be chocolate-colored but not burnt.",
115
+ tipTomato: "The roux will help give body and smoothness to the tomato's final texture.",
116
+ rouxWhiteLabel: "White Roux",
117
+ rouxBlondLabel: "Blond Roux",
118
+ rouxBrownLabel: "Brown Roux",
119
+ descWhite: "Cook only until it loses the raw flour smell. No color.",
120
+ descBlond: "Look for a toasted butter color and nutty aroma.",
121
+ descBrown: "Very low heat. Chocolate color. Note: requires +10% weight.",
122
+ timeWhite: "2-3 min",
123
+ timeBlond: "5-8 min",
124
+ timeBrown: "15-20 min",
108
125
  },
109
126
  faqTitle: "Frequently Asked Questions",
110
127
  faq: [
@@ -304,5 +321,5 @@ export const content: ToolLocaleContent = {
304
321
  html: "Our roux ratio calculator ensures your sauces always have the perfect technical consistency for every dish.",
305
322
  },
306
323
  ],
307
- schemas: [faqSchema, howToSchema, appSchema],
324
+ schemas: [faqSchema as any, howToSchema as any, appSchema as any],
308
325
  };
@@ -227,7 +227,7 @@ export const content: ToolLocaleContent = {
227
227
  type: 'diagnostic',
228
228
  variant: 'warning',
229
229
  title: '¿Salsa con Grumaje o Sabor a Harina?',
230
- html: 'Si la salsa tiene grumos, probablemente añadiste líquido caliente a un roux caliente. Aplica el choque térmico (líquido frío sobre roux caliente). Si sabe a harina, aumenta el tiempo de cocción inicial antes de añadir el líquido para gelatinizar el almidón correctamente.',
230
+ html: 'Si la salsa tiene grumos, probablemente añadiste líquido caliente a un roux caliente. Aplica el choque térmico (liquide frío sobre roux caliente). Si sabe a harina, aumenta el tiempo de cocción inicial antes de añadir el líquido para gelatinizar el almidón correctamente.',
231
231
  },
232
232
  {
233
233
  type: 'title',
@@ -284,13 +284,30 @@ export const content: ToolLocaleContent = {
284
284
  butter: 'Mantequilla',
285
285
  flour: 'Harina',
286
286
  instructions: 'Instrucciones',
287
- sauceName: 'Tipo de Salsa',
287
+ sauceName: 'Tipo de Sauce',
288
288
  ratio: 'Ratio',
289
289
  chefTip: 'Tip del Chef',
290
290
  white: 'Blanco',
291
291
  blond: 'Rubio',
292
292
  brown: 'Oscuro',
293
293
  beurreManied: 'Beurre Manié (Si necesitas ajustar al final)',
294
+ recipeBechamel: "Bechamel",
295
+ recipeVeloute: "Velouté",
296
+ recipeEspagnole: "Española",
297
+ recipeTomato: "Salsa de Tomate",
298
+ tipBechamel: "Usa leche fría. Añádela gradualmente al principio o de golpe si bates fuerte.",
299
+ tipVeloute: "Usa fondo de ave o pescado. Deja que el roux huela a galleta antes de ligar.",
300
+ tipEspagnole: "Para salsas oscuras potentes. El roux debe estar color chocolate, pero sin quemarse.",
301
+ tipTomato: "El roux ayudará a dar cuerpo y suavidad a la textura final del tomate.",
302
+ rouxWhiteLabel: "Roux Blanco",
303
+ rouxBlondLabel: "Roux Rubio",
304
+ rouxBrownLabel: "Roux Oscuro",
305
+ descWhite: "Cocina solo hasta perder el olor a harina cruda. Sin color.",
306
+ descBlond: "Busca un color de mantequilla tostada y un aroma a nueces.",
307
+ descBrown: "Fuego muy suave. Color chocolate. Nota: requiere un 10% más de peso.",
308
+ timeWhite: "2-3 min",
309
+ timeBlond: "5-8 min",
310
+ timeBrown: "15-20 min",
294
311
  },
295
- schemas: [faqSchema, howToSchema, appSchema],
312
+ schemas: [faqSchema as any, howToSchema as any, appSchema as any],
296
313
  };
@@ -101,6 +101,23 @@ export const content: ToolLocaleContent = {
101
101
  blond: "Blond",
102
102
  brown: "Brun",
103
103
  beurreManied: "Beurre Manié (Pour ajuster à la fin)",
104
+ recipeBechamel: "Béchamel",
105
+ recipeVeloute: "Velouté",
106
+ recipeEspagnole: "Espagnole",
107
+ recipeTomato: "Sauce Tomate",
108
+ tipBechamel: "Utilisez du lait froid. Ajoutez-le progressivement au début ou d'un coup si vous fouettez vigoureusement.",
109
+ tipVeloute: "Utilisez un fond blanc. Le roux doit sentir le biscuit avant de lier au liquide.",
110
+ tipEspagnole: "Idéal pour les sauces brunes puissantes. Le roux doit être couleur chocolat, sans brûler.",
111
+ tipTomato: "Le roux aidera à donner du corps et de l'onctuosité à la texture finale de la tomate.",
112
+ rouxWhiteLabel: "Roux Blanc",
113
+ rouxBlondLabel: "Roux Blond",
114
+ rouxBrownLabel: "Roux Brun",
115
+ descWhite: "Cuire juste assez pour faire perdre l'odeur de farine crue. Sans coloration.",
116
+ descBlond: "Recherchez une couleur beurre noisette et un léger arôme de noix.",
117
+ descBrown: "Feu très doux. Couleur chocolate. Note : nécessite +10% de poids.",
118
+ timeWhite: "2-3 min",
119
+ timeBlond: "5-8 min",
120
+ timeBrown: "15-20 min",
104
121
  },
105
122
  faqTitle: "Questions Fréquentes sur le Roux",
106
123
  faq: [
@@ -292,5 +309,5 @@ export const content: ToolLocaleContent = {
292
309
  html: "Notre calculateur de roux garantit une consistance technique parfaite pour toutes vos créations culinaires.",
293
310
  },
294
311
  ],
295
- schemas: [faqSchema, howToSchema, appSchema],
312
+ schemas: [faqSchema as any, howToSchema as any, appSchema as any],
296
313
  };