@jjlmoya/utils-cooking 1.10.0 → 1.12.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 (33) hide show
  1. package/package.json +58 -58
  2. package/src/tests/schemas_fulfillment.test.ts +23 -0
  3. package/src/tests/title_quality.test.ts +55 -0
  4. package/src/tool/american-kitchen-converter/i18n/fr.ts +1 -1
  5. package/src/tool/banana-ripeness/i18n/fr.ts +86 -86
  6. package/src/tool/brine/component.astro +20 -22
  7. package/src/tool/cookware-guide/component.astro +22 -6
  8. package/src/tool/cookware-guide/i18n/en.ts +2 -2
  9. package/src/tool/cookware-guide/i18n/es.ts +3 -3
  10. package/src/tool/cookware-guide/i18n/fr.ts +109 -110
  11. package/src/tool/ingredient-rescaler/component.astro +8 -3
  12. package/src/tool/ingredient-rescaler/i18n/en.ts +74 -97
  13. package/src/tool/ingredient-rescaler/i18n/es.ts +77 -100
  14. package/src/tool/kitchen-timer/component.astro +27 -9
  15. package/src/tool/kitchen-timer/i18n/en.ts +6 -7
  16. package/src/tool/kitchen-timer/i18n/es.ts +7 -8
  17. package/src/tool/kitchen-timer/i18n/fr.ts +76 -77
  18. package/src/tool/kitchen-timer/init.ts +23 -6
  19. package/src/tool/kitchen-timer/lib/KitchenTimer.ts +20 -8
  20. package/src/tool/meringue-peak/component.astro +4 -4
  21. package/src/tool/meringue-peak/i18n/fr.ts +1 -1
  22. package/src/tool/mold-scaler/component.astro +17 -11
  23. package/src/tool/mold-scaler/i18n/en.ts +87 -60
  24. package/src/tool/mold-scaler/i18n/es.ts +87 -61
  25. package/src/tool/mold-scaler/i18n/fr.ts +97 -69
  26. package/src/tool/pizza/i18n/en.ts +2 -2
  27. package/src/tool/pizza/i18n/es.ts +2 -2
  28. package/src/tool/pizza/i18n/fr.ts +2 -2
  29. package/src/tool/roux-guide/i18n/en.ts +18 -1
  30. package/src/tool/roux-guide/i18n/es.ts +21 -4
  31. package/src/tool/roux-guide/i18n/fr.ts +18 -1
  32. package/src/tool/roux-guide/init.ts +55 -52
  33. package/src/tool/sourdough-calculator/i18n/es.ts +133 -133
@@ -1,8 +1,6 @@
1
1
  ---
2
- import type { ToolLocaleContent } from "../../types";
3
-
4
2
  interface Props {
5
- ui: ToolLocaleContent["ui"];
3
+ ui: Record<string, string>;
6
4
  }
7
5
 
8
6
  const { ui } = Astro.props;
@@ -438,7 +436,7 @@ const { ui } = Astro.props;
438
436
  }
439
437
  }
440
438
 
441
- .brine-visualization {
439
+ :global(.brine-visualization) {
442
440
  display: flex;
443
441
  flex-direction: column;
444
442
  align-items: center;
@@ -448,7 +446,7 @@ const { ui } = Astro.props;
448
446
  position: relative;
449
447
  }
450
448
 
451
- .brine-jar {
449
+ :global(.brine-jar) {
452
450
  position: relative;
453
451
  width: 12rem;
454
452
  height: 16rem;
@@ -460,7 +458,7 @@ const { ui } = Astro.props;
460
458
  overflow: hidden;
461
459
  }
462
460
 
463
- .brine-jar-cap {
461
+ :global(.brine-jar-cap) {
464
462
  position: absolute;
465
463
  top: -0.25rem;
466
464
  left: 50%;
@@ -471,7 +469,7 @@ const { ui } = Astro.props;
471
469
  border-radius: 0.5rem 0.5rem 0 0;
472
470
  }
473
471
 
474
- .brine-water {
472
+ :global(.brine-water) {
475
473
  position: absolute;
476
474
  bottom: 0;
477
475
  left: 0;
@@ -481,7 +479,7 @@ const { ui } = Astro.props;
481
479
  height: 50%;
482
480
  }
483
481
 
484
- .brine-water::before {
482
+ :global(.brine-water)::before {
485
483
  content: '';
486
484
  position: absolute;
487
485
  top: 0;
@@ -511,7 +509,7 @@ const { ui } = Astro.props;
511
509
  }
512
510
  }
513
511
 
514
- .brine-product {
512
+ :global(.brine-product) {
515
513
  position: absolute;
516
514
  bottom: 1rem;
517
515
  left: 50%;
@@ -528,7 +526,7 @@ const { ui } = Astro.props;
528
526
  height: 40%;
529
527
  }
530
528
 
531
- .brine-product-label {
529
+ :global(.brine-product-label) {
532
530
  font-size: 0.75rem;
533
531
  font-weight: 700;
534
532
  color: rgba(0, 0, 0, 0.3);
@@ -536,7 +534,7 @@ const { ui } = Astro.props;
536
534
  letter-spacing: 0.05em;
537
535
  }
538
536
 
539
- .brine-particles {
537
+ :global(.brine-particles) {
540
538
  position: absolute;
541
539
  inset: 0;
542
540
  pointer-events: none;
@@ -700,10 +698,10 @@ const { ui } = Astro.props;
700
698
 
701
699
  const els = {
702
700
  inputs: {
703
- product: document.getElementById("weight-product") as HTMLInputElement,
704
- water: document.getElementById("weight-water") as HTMLInputElement,
705
- slider: document.getElementById("salinity-slider") as HTMLInputElement,
706
- sugar: document.getElementById("sugar-toggle") as HTMLInputElement,
701
+ product: document.getElementById("weight-product"),
702
+ water: document.getElementById("weight-water"),
703
+ slider: document.getElementById("salinity-slider"),
704
+ sugar: document.getElementById("sugar-toggle"),
707
705
  presets: document.querySelectorAll(".preset-btn"),
708
706
  },
709
707
  displays: {
@@ -729,7 +727,7 @@ const { ui } = Astro.props;
729
727
  return { salt, sugar, totalWeight };
730
728
  };
731
729
 
732
- const updateVisuals = (results: { salt: number; sugar: number; totalWeight: number }) => {
730
+ const updateVisuals = (results) => {
733
731
  const maxCap = 2000;
734
732
  const waterHeight = Math.min((state.water / maxCap) * 100, 90);
735
733
  if (els.vis.water) els.vis.water.style.height = `${Math.max(waterHeight, 10)}%`;
@@ -755,7 +753,7 @@ const { ui } = Astro.props;
755
753
  }
756
754
  };
757
755
 
758
- const createParticle = (className: string) => {
756
+ const createParticle = (className) => {
759
757
  if (!els.vis.particles) return;
760
758
  const p = document.createElement("div");
761
759
  const size = Math.random() * 4 + 2;
@@ -802,7 +800,7 @@ const { ui } = Astro.props;
802
800
  return { label: ui.timePreservesLabel, text: ui.timePreservesDuration };
803
801
  };
804
802
 
805
- const updateResults = (results: { salt: number; sugar: number; totalWeight: number }) => {
803
+ const updateResults = (results) => {
806
804
  if (els.displays.saltResult)
807
805
  els.displays.saltResult.textContent = Math.round(results.salt).toString();
808
806
  if (els.displays.sugarResult)
@@ -836,25 +834,25 @@ const { ui } = Astro.props;
836
834
 
837
835
  if (els.inputs.product)
838
836
  els.inputs.product.addEventListener("input", (e) => {
839
- state.product = parseFloat((e.target as HTMLInputElement).value) || 0;
837
+ state.product = parseFloat(e.target.value) || 0;
840
838
  update();
841
839
  });
842
840
 
843
841
  if (els.inputs.water)
844
842
  els.inputs.water.addEventListener("input", (e) => {
845
- state.water = parseFloat((e.target as HTMLInputElement).value) || 0;
843
+ state.water = parseFloat(e.target.value) || 0;
846
844
  update();
847
845
  });
848
846
 
849
847
  if (els.inputs.slider)
850
848
  els.inputs.slider.addEventListener("input", (e) => {
851
- state.salinity = parseFloat((e.target as HTMLInputElement).value);
849
+ state.salinity = parseFloat(e.target.value);
852
850
  update();
853
851
  });
854
852
 
855
853
  if (els.inputs.sugar)
856
854
  els.inputs.sugar.addEventListener("change", (e) => {
857
- state.sugar = (e.target as HTMLInputElement).checked;
855
+ state.sugar = e.target.checked;
858
856
  update();
859
857
  });
860
858
 
@@ -171,6 +171,7 @@ const { ui } = Astro.props;
171
171
  --cw-border: hsl(210deg, 14%, 89%);
172
172
  --cw-text-main: hsl(210deg, 40%, 14%);
173
173
  --cw-text-muted: hsl(210deg, 8%, 40%);
174
+ --cw-text-light: hsl(210deg, 40%, 98%);
174
175
  --cw-shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.1);
175
176
  --cw-radius: 1.5rem;
176
177
  }
@@ -180,8 +181,9 @@ const { ui } = Astro.props;
180
181
  --cw-bg-app: hsl(217deg, 39%, 8%);
181
182
  --cw-border: hsl(217deg, 33%, 25%);
182
183
  --cw-text-main: hsl(210deg, 40%, 98%);
183
- --cw-text-muted: hsl(210deg, 14%, 55%);
184
- --cw-primary-light: hsl(240deg, 100%, 12%);
184
+ --cw-text-muted: hsl(210deg, 14%, 75%);
185
+ --cw-text-light: hsl(210deg, 40%, 98%);
186
+ --cw-primary-light: hsl(240deg, 100%, 20%);
185
187
  }
186
188
  </style>
187
189
 
@@ -318,7 +320,16 @@ const { ui } = Astro.props;
318
320
  }
319
321
 
320
322
  :global(.theme-dark) .cw-style-btn.active {
321
- background: hsl(240deg, 100%, 20%);
323
+ background: hsl(240deg, 100%, 35%);
324
+ color: hsl(0deg, 0%, 100%);
325
+ }
326
+
327
+ :global(.theme-dark) .cw-style-btn.active .cw-style-name {
328
+ color: hsl(0deg, 0%, 100%);
329
+ }
330
+
331
+ :global(.theme-dark) .cw-style-btn.active .cw-style-desc {
332
+ color: hsl(0deg, 0%, 100%);
322
333
  }
323
334
 
324
335
  .cw-icon {
@@ -610,15 +621,20 @@ const { ui } = Astro.props;
610
621
  font-size: 0.6875rem;
611
622
  line-height: 1.6;
612
623
  color: var(--cw-text-muted);
613
- font-weight: 300;
624
+ font-weight: 400;
614
625
  font-style: italic;
615
- background: var(--cw-bg-card);
616
- padding: 1rem;
626
+ background: rgba(var(--cw-primary-rgb, 99, 102, 241), 0.03);
627
+ padding: 1.25rem;
617
628
  border-radius: 0.75rem;
618
629
  border: 1px solid var(--cw-border);
619
630
  margin: 0;
620
631
  }
621
632
 
633
+ :global(.theme-dark) .cw-tip-text {
634
+ color: var(--cw-text-main);
635
+ background: rgba(255, 255, 255, 0.03);
636
+ }
637
+
622
638
  .cw-hidden {
623
639
  display: none;
624
640
  }
@@ -1,6 +1,6 @@
1
1
  import type { ToolLocaleContent } from '../../../types';
2
2
 
3
- const title = "Smart Cookware Selector | Kitchen Utensils Guide";
3
+ const title = "Smart Cookware Selector: Kitchen Utensils Guide";
4
4
  const description = "Interactive guide to choose the best pan or pot based on your cooking style. Iron vs Stainless Steel vs Teflon. Find your perfect tool.";
5
5
  const faq = [
6
6
  {
@@ -73,7 +73,7 @@ const appSchema = {
73
73
 
74
74
  export const content: ToolLocaleContent = {
75
75
  slug: 'cookware-selector',
76
- title: 'Smart Cookware Selector | Kitchen Utensils Guide',
76
+ title: 'Smart Cookware Selector: Kitchen Utensils Guide',
77
77
  description: 'Interactive guide to choose the best pan or pot based on your cooking style. Iron vs Stainless Steel vs Teflon. Find your perfect tool.',
78
78
  faqTitle: 'Frequently Asked Questions',
79
79
  faq: [
@@ -1,6 +1,6 @@
1
1
  import type { ToolLocaleContent } from '../../../types';
2
2
 
3
- const title = "Selector de Sartenes Inteligente | Guía de Utensilios de Cocina";
3
+ const title = "Selector de Sartenes Inteligente: Guía de Utensilios de Cocina";
4
4
  const description = "Guía interactiva para elegir la mejor sartén u olla según tu estilo de cocina. Hierro vs Acero vs Teflón. Encuentra tu herramienta perfecta.";
5
5
  const faq = [
6
6
  {
@@ -72,8 +72,8 @@ const appSchema = {
72
72
  };
73
73
 
74
74
  export const content: ToolLocaleContent = {
75
- slug: 'selector-sartenes',
76
- title: 'Selector de Sartenes Inteligente | Guía de Utensilios de Cocina',
75
+ slug: 'guia-sartenes',
76
+ title: 'Selector de Sartenes Inteligente: Guía de Utensilios de Cocina',
77
77
  description: 'Guía interactiva para elegir la mejor sartén u olla según tu estilo de cocina. Hierro vs Acero vs Teflón. Encuentra tu herramienta perfecta.',
78
78
  faqTitle: 'Preguntas Frecuentes',
79
79
  faq: [
@@ -1,41 +1,41 @@
1
1
  import type { ToolLocaleContent } from '../../../types';
2
2
 
3
- const title = "Smart Cookware Selector | Kitchen Utensils Guide";
4
- const description = "Interactive guide to choose the best pan or pot based on your cooking style. Iron vs Stainless Steel vs Teflon. Find your perfect tool.";
3
+ const title = "Sélecteur d'Ustensiles Connecté | Guide de Cuisine";
4
+ const description = "Guide interactif pour choisir la meilleure poêle ou casserole selon votre style de cuisine. Fonte vs Acier Inoxydable vs Téflon. Trouvez votre outil parfait.";
5
5
  const faq = [
6
6
  {
7
- question: 'What is the best pan for daily use?',
8
- answer: 'For most people, a high-quality stainless steel pan or a well-seasoned cast iron are the best. Stainless is versatile and eternal, while iron offers natural non-stick without chemicals.',
7
+ question: 'Quelle est la meilleure poêle pour un usage quotidien ?',
8
+ answer: "Pour la plupart des gens, une poêle en acier inoxydable de haute qualité ou eine fonte bien culottée sont les meilleures options. L'inox est polyvalent et éternel, tandis que la fonte offre un anti-adhésif naturel sans produits chimiques.",
9
9
  },
10
10
  {
11
- question: 'Why does food stick to stainless steel?',
12
- answer: 'Usually due to insufficient heat or adding food too early. Try the "Leidenfrost effect": heat the pan until a water droplet rolls like a pearl. Then it\'s ready.',
11
+ question: 'Pourquoi les aliments attachent-ils à l\'acier inoxydable ?',
12
+ answer: 'Généralement en raison d\'une chaleur insuffisante ou de l\'ajout d\'aliments trop tôt. Essayez l\'"effet Leidenfrost" : chauffez la poêle jusqu\'à ce qu\'une goutte d\'eau roule comme une perle. Elle est alors prête.',
13
13
  },
14
14
  {
15
- question: 'How do I know if my pan is safe?',
16
- answer: 'Look for "PFOA Free" labels. Cast iron, carbon steel, and stainless steel are the safest and most durable options, as they have no coatings that degrade over time.',
15
+ question: 'Comment savoir si ma poêle est sûre ?',
16
+ answer: 'Recherchez les étiquettes "Sans PFOA". La fonte, l\'acier au carbone et l\'acier inoxydable sont les options les plus sûres et les plus durables, car elles n\'ont pas de revêtements qui se dégradent avec le temps.',
17
17
  },
18
18
  {
19
- question: 'What does it mean to "season" a pan?',
20
- answer: 'It\'s the process of creating a layer of polymerized oil on the metal (iron or carbon). This protects against rust and creates a natural non-stick surface that improves with each use.',
19
+ question: 'Que signifie "culotter" une poêle ?',
20
+ answer: 'C\'est le processus de création d\'une couche d\'huile polymérisée sur le métal (fonte ou carbone). Cela protège de la rouille et crée une surface anti-adhésive naturelle qui s\'améliore à chaque utilisation.',
21
21
  },
22
22
  {
23
- question: 'How much should I spend on a good pan?',
24
- answer: 'A set of 2-3 medium-high quality pans (stainless or iron) can last 20+ years. It\'s better to invest well in one pan than to buy 5 cheap ones lasting 2 years. Quality over quantity.',
23
+ question: 'Combien devrais-je dépenser pour une bonne poêle ?',
24
+ answer: 'Un ensemble de 2-3 poêles de qualité moyenne-haute (inox ou fonte) peut durer plus de 20 ans. Il vaut mieux investir dans une bonne poêle que d\'en acheter 5 bon marché qui durent 2 ans. La qualité avant la quantité.',
25
25
  },
26
26
  ];
27
27
  const howTo = [
28
28
  {
29
- name: 'Select your cooking style',
30
- text: 'Choose between high heat (searing), delicate (eggs), stews (slow cooking) or quick cooking. Each style has distinct requirements.',
29
+ name: 'Sélectionnez votre style de cuisine',
30
+ text: 'Choisissez entre feu vif (saisir), délicat (œufs), ragoûts (cuisson lente) ou cuisine rapide. Chaque style a des exigences distinctes.',
31
31
  },
32
32
  {
33
- name: 'Choose the ideal material',
34
- text: 'Based on your style, the tool will recommend the best material: iron, stainless steel, copper, or teflon.',
33
+ name: 'Choisissez le matériau idéal',
34
+ text: 'En fonction de votre style, l\'outil recommandera le meilleur matériau : fonte, acier inoxydable, cuivre ou téflon.',
35
35
  },
36
36
  {
37
- name: 'Read the characteristics',
38
- text: 'Understand advantages, disadvantages, maintenance, and durability. Then choose the specific pan that fits your budget and needs.',
37
+ name: 'Lisez les caractéristiques',
38
+ text: 'Comprenez les avantages, les inconvénients, l\'entretien et la durabilité. Choisissez ensuite la poêle spécifique qui correspond à votre budget et à vos besoins.',
39
39
  },
40
40
  ];
41
41
 
@@ -73,40 +73,39 @@ const appSchema = {
73
73
 
74
74
  export const content: ToolLocaleContent = {
75
75
  slug: 'cookware-selector',
76
- title: 'Smart Cookware Selector | Kitchen Utensils Guide',
77
- description: 'Interactive guide to choose the best pan or pot based on your cooking style. Iron vs Stainless Steel vs Teflon. Find your perfect tool.',
76
+ title: 'Sélecteur d\'Ustensiles Connecté | Guide de Cuisine',
77
+ description: 'Guide interactif pour choisir la meilleure poêle ou casserole selon votre style de cuisine. Fonte vs Acier Inoxydable vs Téflon. Trouvez votre outil parfait.',
78
78
  faqTitle: 'Questions Fréquemment Posées',
79
- bibliographyTitle: 'Bibliographie',
79
+ bibliographyTitle: 'Sources et Bibliographie',
80
80
  faq: [
81
81
  {
82
- question: 'What is the best pan for daily use?',
83
- answer: 'For most people, a high-quality stainless steel pan or a well-seasoned cast iron are the best. Stainless is versatile and eternal, while iron offers natural non-stick without chemicals.',
82
+ question: 'Quelle est la meilleure poêle pour un usage quotidien ?',
83
+ answer: "Pour la plupart des gens, une poêle en acier inoxydable de haute qualité ou eine fonte bien culottée sont les meilleures options. L'inox est polyvalent et éternel, tandis que la fonte offre un anti-adhésif naturel sans produits chimiques.",
84
84
  },
85
85
  {
86
- question: 'Why does food stick to stainless steel?',
87
- answer: 'Usually due to insufficient heat or adding food too early. Try the "Leidenfrost effect": heat the pan until a water droplet rolls like a pearl. Then it\'s ready.',
86
+ question: 'Pourquoi les aliments attachent-ils à l\'acier inoxydable ?',
87
+ answer: 'Généralement en raison d\'une chaleur insuffisante ou de l\'ajout d\'aliments trop tôt. Essayez l\'"effet Leidenfrost" : chauffez la poêle jusqu\'à ce qu\'une goutte d\'eau roule comme une perle. Elle est alors prête.',
88
88
  },
89
89
  {
90
- question: 'How do I know if my pan is safe?',
91
- answer: 'Look for "PFOA Free" labels. Cast iron, carbon steel, and stainless steel are the safest and most durable options, as they have no coatings that degrade over time.',
90
+ question: 'Comment savoir si ma poêle est sûre ?',
91
+ answer: 'Recherchez les étiquettes "Sans PFOA". La fonte, l\'acier au carbone et l\'acier inoxydable sont les options les plus sûres et les plus durables, car elles n\'ont pas de revêtements qui se dégradent avec le temps.',
92
92
  },
93
93
  {
94
- question: 'What does it mean to "season" a pan?',
95
- answer: 'It\'s the process of creating a layer of polymerized oil on the metal (iron or carbon). This protects against rust and creates a natural non-stick surface that improves with each use.',
94
+ question: 'Que signifie "culotter" une poêle ?',
95
+ answer: 'C\'est le processus de création d\'une couche d\'huile polymérisée sur le métal (fonte ou carbone). Cela protège de la rouille et crée une surface anti-adhésive naturelle qui s\'améliore à chaque utilisation.',
96
96
  },
97
97
  {
98
- question: 'How much should I spend on a good pan?',
99
- answer: 'A set of 2-3 medium-high quality pans (stainless or iron) can last 20+ years. It\'s better to invest well in one pan than to buy 5 cheap ones lasting 2 years. Quality over quantity.',
98
+ question: 'Combien devrais-je dépenser pour une bonne poêle ?',
99
+ answer: 'Un ensemble de 2-3 poêles de qualité moyenne-haute (inox ou fonte) peut durer plus de 20 ans. Il vaut mieux investir dans une bonne poêle que d\'en acheter 5 bon marché qui durent 2 ans. La qualité avant la quantité.',
100
100
  },
101
101
  ],
102
- bibliographyTitle: 'Bibliography',
103
102
  bibliography: [
104
103
  {
105
- name: 'The Flavor Bible - Pairing and Progress in Food',
104
+ name: 'The Flavor Bible - Association et Progrès en Cuisine',
106
105
  url: 'https://www.flavorprints.com/',
107
106
  },
108
107
  {
109
- name: 'On Food and Cooking - Harold McGee (The Science of Cooking)',
108
+ name: 'On Food and Cooking - Harold McGee (La Science de la Cuisine)',
110
109
  url: 'https://www.foodscience.org/',
111
110
  },
112
111
  {
@@ -116,120 +115,120 @@ export const content: ToolLocaleContent = {
116
115
  ],
117
116
  howTo: [
118
117
  {
119
- name: 'Select your cooking style',
120
- text: 'Choose between high heat (searing), delicate (eggs), stews (slow cooking) or quick cooking. Each style has distinct requirements.',
118
+ name: 'Sélectionnez votre style de cuisine',
119
+ text: 'Choisissez entre feu vif (saisir), délicat (œufs), ragoûts (cuisson lente) ou cuisine rapide. Chaque style a des exigences distinctes.',
121
120
  },
122
121
  {
123
- name: 'Choose the ideal material',
124
- text: 'Based on your style, the tool will recommend the best material: iron, stainless steel, copper, or teflon.',
122
+ name: 'Choisissez le matériau idéal',
123
+ text: 'En fonction de votre style, l\'outil recommandera le meilleur matériau : fonte, acier inoxydable, cuivre ou téflon.',
125
124
  },
126
125
  {
127
- name: 'Read the characteristics',
128
- text: 'Understand advantages, disadvantages, maintenance, and durability. Then choose the specific pan that fits your budget and needs.',
126
+ name: 'Lisez les caractéristiques',
127
+ text: 'Comprenez les avantages, les inconvénients, l\'entretien et la durabilité. Choisissez ensuite la poêle spécifique qui correspond à votre budget et à vos besoins.',
129
128
  },
130
129
  ],
131
130
  seo: [
132
131
  {
133
132
  type: 'title',
134
- text: 'Pan Materials: Science and Practice',
133
+ text: 'Matériaux de Poêle : Science et Pratique',
135
134
  level: 2,
136
135
  },
137
136
  {
138
137
  type: 'paragraph',
139
- html: 'Not all pans are equal. Each material has distinct thermodynamic properties that affect how it distributes heat, what temperatures it tolerates, and how it interacts with food. Understanding these differences is the key to choosing the right tool.',
138
+ html: 'Toutes les poêles ne se valent pas. Chaque matériau possède des propriétés thermodynamiques distinctes qui affectent la répartition de la chaleur, les températures tolérées et l\'interaction avec les aliments. Comprendre ces différences est la clé pour choisir le bon outil.',
140
139
  },
141
140
  {
142
141
  type: 'title',
143
- text: 'Cast Iron: The Classic',
142
+ text: 'Fonte : Le Classique',
144
143
  level: 3,
145
144
  },
146
145
  {
147
146
  type: 'paragraph',
148
- html: '<strong>Advantages:</strong> Excellent heat retention, uniform distribution, natural non-stick (when seasoned), lasts centuries, improves with time. <strong>Disadvantages:</strong> Heavy, requires maintenance, can rust, takes longer to heat, not suitable for prolonged acids.',
147
+ html: '<strong>Avantages :</strong> Excellente rétention de chaleur, distribution uniforme, anti-adhésif naturel (si culottée), dure des siècles, s\'améliore avec le temps. <strong>Inconvénients :</strong> Lourde, nécessite un entretien, peut rouiller, chauffe plus lentement, ne convient pas aux acides prolongés.',
149
148
  },
150
149
  {
151
150
  type: 'title',
152
- text: 'Stainless Steel: The Versatile',
151
+ text: 'Acier Inoxydable : Le Polyvalent',
153
152
  level: 3,
154
153
  },
155
154
  {
156
155
  type: 'paragraph',
157
- html: '<strong>Advantages:</strong> Durable, requires no maintenance, suitable for acids (wines, tomatoes), easy to clean, versatile, relatively economical. <strong>Disadvantages:</strong> Not naturally non-stick, requires technique (preheat well), uneven heat distribution (better with multi-layer bottom).',
156
+ html: '<strong>Avantages :</strong> Durable, ne nécessite aucun entretien, convient aux acides (vins, tomates), facile à nettoyer, polyvalent, relativement économique. <strong>Inconvénients :</strong> Pas naturellement anti-adhésif, nécessite de la technique (bien préchauffer), distribution de chaleur inégale (meilleure avec fond multicouche).',
158
157
  },
159
158
  {
160
159
  type: 'title',
161
- text: 'Teflon/PTFE: The Convenient',
160
+ text: 'Téflon/PTFE : Le Pratique',
162
161
  level: 3,
163
162
  },
164
163
  {
165
164
  type: 'paragraph',
166
- html: '<strong>Advantages:</strong> Instant non-stick, easy cooking, easy cleaning, economical. <strong>Disadvantages:</strong> Degrades over time and temperature, needs replacement every 3-5 years, unsafe at very high temperatures (>500°F), PTFE safety is debated.',
165
+ html: '<strong>Avantages :</strong> Anti-adhésif instantané, cuisine facile, nettoyage facile, économique. <strong>Inconvénients :</strong> Se dégrade avec le temps et la température, doit être remplacé tous les 3 à 5 ans, dangereux à très haute température (>260°C), la sécurité du PTFE est débattue.',
167
166
  },
168
167
  ],
169
168
  ui: {
170
- cookingStyle: 'How do you usually cook?',
171
- material: 'Material Type',
172
- highHeat: 'High Heat',
173
- sear: 'Sear / Seal',
174
- delicate: 'Delicate',
175
- fry: 'Eggs / Omelets',
176
- stew: 'Stews',
177
- slowCook: 'Slow Cooking',
178
- fast: 'Fast',
179
- quick: 'Quick Cooking',
180
- recommendation: 'Recommendation',
181
- characteristics: 'Characteristics',
182
- castIron: 'Cast Iron',
183
- stainlessSteel: 'Stainless Steel',
184
- carbon: 'Carbon Steel',
185
- copper: 'Copper',
186
- nonstick: 'Non-stick (Teflon)',
187
- advantages: 'Advantages',
188
- disadvantages: 'Disadvantages',
189
- maintenance: 'Maintenance',
190
- durability: 'Durability',
191
- heatRetention: 'Heat Retention',
192
- price: 'Price',
193
- step1: 'How do you usually cook?',
194
- step2: 'Maintenance Level',
195
- maintenanceLazy: 'Low / None',
196
- maintenanceLazyDesc: 'No complications washing.',
197
- maintenanceCare: 'Medium',
198
- maintenanceCareDesc: 'Normal hand washing.',
199
- maintenanceRitual: 'Ritual (High)',
200
- maintenanceRitualDesc: 'I enjoy seasoning.',
201
- idealPan: 'Your Ideal Pan',
202
- selectOptions: 'Select options',
203
- seeRecommendation: 'To see your recommendation',
204
- pro: 'PRO',
205
- con: 'CONS',
206
- masterTip: 'Master Tip',
207
- defaultTip: 'Combining stainless steel for searing and non-stick for eggs is the foundation of any efficient kitchen.',
208
- stainlessName: 'Stainless Steel',
209
- stainlessTag: 'The Pro All-rounder',
210
- stainlessPro: 'Eternal and non-reactive. Perfect searing.',
211
- stainlessCon: 'Requires technique (heat) to avoid sticking.',
212
- stainlessTip: 'Use the Leidenfrost effect: heat until a water droplet rolls like a pearl.',
213
- nonstickName: 'Non-stick',
214
- nonstickTag: 'Maximum Comfort',
215
- nonstickPro: 'Nothing sticks. Easy cleanup.',
216
- nonstickCon: 'Short lifespan (2-3 years). No high heat.',
217
- nonstickTip: 'Always hand wash and use wood/silicone utensils to double its life.',
169
+ cookingStyle: 'Comment cuisinez-vous habituellement ?',
170
+ material: 'Type de Matériau',
171
+ highHeat: 'Feu Vif',
172
+ sear: 'Saisir / Sceller',
173
+ delicate: 'Délicat',
174
+ fry: 'Œufs / Omelettes',
175
+ stew: 'Mijotés',
176
+ slowCook: 'Cuisson Lente',
177
+ fast: 'Rapide',
178
+ quick: 'Cuisine Rapide',
179
+ recommendation: 'Recommandation',
180
+ characteristics: 'Caractéristiques',
181
+ castIron: 'Fonte',
182
+ stainlessSteel: 'Acier Inoxydable',
183
+ carbon: 'Acier au Carbone',
184
+ copper: 'Cuivre',
185
+ nonstick: 'Anti-adhésif (Téflon)',
186
+ advantages: 'Avantages',
187
+ disadvantages: 'Inconvénients',
188
+ maintenance: 'Entretien',
189
+ durability: 'Durabilité',
190
+ heatRetention: 'Rétention de Chaleur',
191
+ price: 'Prix',
192
+ step1: 'Comment cuisinez-vous habituellement ?',
193
+ step2: 'Niveau d\'Entretien',
194
+ maintenanceLazy: 'Faible / Aucun',
195
+ maintenanceLazyDesc: 'Pas de complications pour le lavage.',
196
+ maintenanceCare: 'Moyen',
197
+ maintenanceCareDesc: 'Lavage à la main normal.',
198
+ maintenanceRitual: 'Rituel (Élevé)',
199
+ maintenanceRitualDesc: "J'aime culotter mes poêles.",
200
+ idealPan: 'Votre Poêle Idéale',
201
+ selectOptions: 'Sélectionnez des options',
202
+ seeRecommendation: 'Pour voir votre recommandation',
203
+ pro: 'AVANTAGES',
204
+ con: 'INCONVÉNIENTS',
205
+ masterTip: 'Conseil de Chef',
206
+ defaultTip: 'Combiner l\'acier inoxydable pour saisir et l\'anti-adhésif pour les œufs est la base de toute cuisine efficace.',
207
+ stainlessName: 'Acier Inoxydable',
208
+ stainlessTag: 'Le Pro Polyvalent',
209
+ stainlessPro: 'Éternel et non réactif. Saisis parfaits.',
210
+ stainlessCon: 'Nécessite de la technique (chaleur) pour éviter d\'attacher.',
211
+ stainlessTip: 'Utilisez l\'effet Leidenfrost : chauffez jusqu\'à ce qu\'une goutte d\'eau roule comme une perle.',
212
+ nonstickName: 'Anti-adhésif',
213
+ nonstickTag: 'Confort Maximum',
214
+ nonstickPro: 'Rien n\'attache. Nettoyage facile.',
215
+ nonstickCon: 'Durée de vie courte (2-3 ans). Pas de feu vif.',
216
+ nonstickTip: 'Lavez toujours à la main et utilisez des ustensiles en bois/silicone pour doubler sa vie.',
218
217
  castironName: 'Cast Iron',
219
- castironTag: 'The Classic Forever',
220
- castironPro: 'Incredible heat retention. Eternal.',
221
- castironCon: 'Very heavy. Requires regular seasoning.',
222
- castironTip: 'Heats slowly, but once hot it\'s a tank. Ideal for steaks.',
223
- carbonName: 'Carbon Steel',
224
- carbonTag: 'Fire Agility',
225
- carbonPro: 'Light as steel, almost like iron.',
226
- carbonCon: 'Rusts if left wet. Rough aesthetics.',
227
- carbonTip: 'The darker and uglier it gets, the better it works. Wok masters\' secret.',
228
- enamelName: 'Enameled Cast Iron',
229
- enamelTag: 'Gourmet Quality',
230
- enamelPro: 'Better slow cooking. Beautiful aesthetics.',
231
- enamelCon: 'Very expensive. Enamel fragile to hard impacts.',
232
- enamelTip: 'Perfect for endless braises. Enamel handles acids (tomato) without issues.',
218
+ castironTag: 'Le Classique Éternel',
219
+ castironPro: 'Incroyable rétention de chaleur. Éternelle.',
220
+ castironCon: 'Très lourde. Nécessite un culottage régulier.',
221
+ castironTip: 'Chauffe lentement, mais une fois chaude, c\'est un tank. Idéal pour les steaks.',
222
+ carbonName: 'Acier au Carbone',
223
+ carbonTag: 'Agilité du Feu',
224
+ carbonPro: 'Léger comme l\'acier, presque comme la fonte.',
225
+ carbonCon: 'Rouille s\'il reste mouillé. Esthétique rugueuse.',
226
+ carbonTip: 'Plus elle devient sombre et moche, mieux elle fonctionne. Le secret des maîtres du wok.',
227
+ enamelName: 'Fonte Émaillée',
228
+ enamelTag: 'Qualité Gourmet',
229
+ enamelPro: 'Meilleure cuisson lente. Belle esthétique.',
230
+ enamelCon: 'Très chère. Émail fragile aux chocs violents.',
231
+ enamelTip: 'Parfait pour les braisés sans fin. L\'émail supporte les acides (tomate) sans problème.',
233
232
  },
234
233
  schemas: [faqSchema, howToSchema, appSchema],
235
234
  };
@@ -302,6 +302,10 @@ ${ui.exampleLine4}`;
302
302
  gap: 0.5rem;
303
303
  }
304
304
 
305
+ :global(.theme-dark) .ir-results-title {
306
+ color: var(--ir-text-main);
307
+ }
308
+
305
309
  .ir-copy-btn {
306
310
  font-size: 0.75rem;
307
311
  background: hsl(210deg, 30%, 35%);
@@ -319,6 +323,7 @@ ${ui.exampleLine4}`;
319
323
 
320
324
  :global(.theme-dark) .ir-copy-btn {
321
325
  background: hsl(220deg, 25%, 30%);
326
+ color: var(--ir-text-main);
322
327
  }
323
328
 
324
329
  .ir-copy-btn:hover {
@@ -360,7 +365,7 @@ ${ui.exampleLine4}`;
360
365
  height: 3rem;
361
366
  }
362
367
 
363
- .ir-result-row {
368
+ :global(.ir-result-row) {
364
369
  display: flex;
365
370
  justify-content: space-between;
366
371
  align-items: center;
@@ -371,7 +376,7 @@ ${ui.exampleLine4}`;
371
376
  transition: all 0.3s ease;
372
377
  }
373
378
 
374
- .ir-result-row:hover {
379
+ :global(.ir-result-row):hover {
375
380
  background: var(--ir-primary-light);
376
381
  border-left-color: var(--ir-primary);
377
382
  }
@@ -389,7 +394,7 @@ ${ui.exampleLine4}`;
389
394
  font-size: 1.125rem;
390
395
  }
391
396
 
392
- .ir-no-amount-row {
397
+ :global(.ir-no-amount-row) {
393
398
  color: var(--ir-text-muted);
394
399
  font-style: italic;
395
400
  font-size: 0.875rem;