@jjlmoya/utils-babies 1.1.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 (82) hide show
  1. package/package.json +69 -0
  2. package/src/category/i18n/en.ts +48 -0
  3. package/src/category/i18n/es.ts +48 -0
  4. package/src/category/i18n/fr.ts +48 -0
  5. package/src/category/index.ts +24 -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 +30 -0
  10. package/src/env.d.ts +5 -0
  11. package/src/index.ts +19 -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/locale_completeness.test.ts +42 -0
  18. package/src/tests/mocks/astro_mock.js +2 -0
  19. package/src/tests/no_h1_in_components.test.ts +48 -0
  20. package/src/tests/seo_length.test.ts +23 -0
  21. package/src/tests/tool_validation.test.ts +17 -0
  22. package/src/tool/baby-feeding-calculator/bibliography.astro +7 -0
  23. package/src/tool/baby-feeding-calculator/component.astro +210 -0
  24. package/src/tool/baby-feeding-calculator/i18n/en.ts +162 -0
  25. package/src/tool/baby-feeding-calculator/i18n/es.ts +162 -0
  26. package/src/tool/baby-feeding-calculator/i18n/fr.ts +162 -0
  27. package/src/tool/baby-feeding-calculator/index.ts +47 -0
  28. package/src/tool/baby-feeding-calculator/logic.ts +85 -0
  29. package/src/tool/baby-feeding-calculator/seo.astro +58 -0
  30. package/src/tool/baby-feeding-calculator/style.css +329 -0
  31. package/src/tool/baby-percentile-calculator/bibliography.astro +7 -0
  32. package/src/tool/baby-percentile-calculator/component.astro +388 -0
  33. package/src/tool/baby-percentile-calculator/i18n/en.ts +244 -0
  34. package/src/tool/baby-percentile-calculator/i18n/es.ts +244 -0
  35. package/src/tool/baby-percentile-calculator/i18n/fr.ts +244 -0
  36. package/src/tool/baby-percentile-calculator/index.ts +54 -0
  37. package/src/tool/baby-percentile-calculator/lmsData.ts +80 -0
  38. package/src/tool/baby-percentile-calculator/logic.ts +85 -0
  39. package/src/tool/baby-percentile-calculator/seo.astro +36 -0
  40. package/src/tool/baby-percentile-calculator/style.css +393 -0
  41. package/src/tool/baby-size-converter/bibliography.astro +7 -0
  42. package/src/tool/baby-size-converter/component.astro +289 -0
  43. package/src/tool/baby-size-converter/data.json +11 -0
  44. package/src/tool/baby-size-converter/i18n/en.ts +203 -0
  45. package/src/tool/baby-size-converter/i18n/es.ts +203 -0
  46. package/src/tool/baby-size-converter/i18n/fr.ts +203 -0
  47. package/src/tool/baby-size-converter/index.ts +53 -0
  48. package/src/tool/baby-size-converter/logic.ts +44 -0
  49. package/src/tool/baby-size-converter/seo.astro +36 -0
  50. package/src/tool/baby-size-converter/style.css +394 -0
  51. package/src/tool/fertile-days-estimator/bibliography.astro +7 -0
  52. package/src/tool/fertile-days-estimator/component.astro +265 -0
  53. package/src/tool/fertile-days-estimator/i18n/en.ts +258 -0
  54. package/src/tool/fertile-days-estimator/i18n/es.ts +262 -0
  55. package/src/tool/fertile-days-estimator/i18n/fr.ts +258 -0
  56. package/src/tool/fertile-days-estimator/index.ts +47 -0
  57. package/src/tool/fertile-days-estimator/logic.ts +58 -0
  58. package/src/tool/fertile-days-estimator/seo.astro +36 -0
  59. package/src/tool/fertile-days-estimator/style.css +419 -0
  60. package/src/tool/pregnancy-calculator/bibliography.astro +7 -0
  61. package/src/tool/pregnancy-calculator/calculator.ts +41 -0
  62. package/src/tool/pregnancy-calculator/component.astro +432 -0
  63. package/src/tool/pregnancy-calculator/i18n/en.ts +315 -0
  64. package/src/tool/pregnancy-calculator/i18n/es.ts +319 -0
  65. package/src/tool/pregnancy-calculator/i18n/fr.ts +315 -0
  66. package/src/tool/pregnancy-calculator/index.ts +55 -0
  67. package/src/tool/pregnancy-calculator/milestones.ts +153 -0
  68. package/src/tool/pregnancy-calculator/seo.astro +36 -0
  69. package/src/tool/pregnancy-calculator/store.ts +60 -0
  70. package/src/tool/pregnancy-calculator/style.css +807 -0
  71. package/src/tool/vaccination-calendar/bibliography.astro +7 -0
  72. package/src/tool/vaccination-calendar/component.astro +286 -0
  73. package/src/tool/vaccination-calendar/i18n/en.ts +170 -0
  74. package/src/tool/vaccination-calendar/i18n/es.ts +174 -0
  75. package/src/tool/vaccination-calendar/i18n/fr.ts +170 -0
  76. package/src/tool/vaccination-calendar/index.ts +47 -0
  77. package/src/tool/vaccination-calendar/logic.ts +59 -0
  78. package/src/tool/vaccination-calendar/seo.astro +36 -0
  79. package/src/tool/vaccination-calendar/style.css +316 -0
  80. package/src/tool/vaccination-calendar/vaccinationData.ts +21 -0
  81. package/src/tools.ts +17 -0
  82. package/src/types.ts +72 -0
@@ -0,0 +1,203 @@
1
+ import type { BabySizeConverterLocaleContent } from '../index';
2
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
3
+
4
+ const slug = 'conversor-tallas-bebe';
5
+ const title = 'Conversor de Tallas de Bebé';
6
+ const description = 'Convierte tallas de ropa de bebé entre Zara, H&M, Primark, Carter\'s, Kiabi, Mango y Mayoral. Introduce la altura y el peso para obtener la talla exacta de cada marca.';
7
+ const faq = [
8
+ {
9
+ question: '¿Cómo sé qué talla de ropa le corresponde a mi bebé?',
10
+ answer: 'Lo más fiable es usar la altura del bebé como referencia principal. Las tallas europeas (50, 56, 62...) corresponden directamente a la altura en centímetros. Introduce la altura y el peso del bebé en el conversor para obtener la talla recomendada por cada marca.',
11
+ },
12
+ {
13
+ question: '¿Por qué las tallas varían tanto entre marcas?',
14
+ answer: 'Cada marca tiene su propio patrón de corte. H&M y Primark tienden a tallar más grande, mientras que Carter\'s y Mayoral tienen cortes más ajustados. Usa siempre las medidas del bebé, no solo la edad.',
15
+ },
16
+ {
17
+ question: '¿Qué medida debo tomar si está entre dos tallas?',
18
+ answer: 'Elige siempre la talla superior. Los bebés crecen muy rápidamente y una talla más grande garantiza mayor durabilidad y comodidad.',
19
+ },
20
+ {
21
+ question: '¿Las tallas en pulgadas funcionan igual?',
22
+ answer: 'Las marcas americanas como Carter\'s usan pulgadas y el peso como referencia. El conversor automáticamente te muestra las equivalencias en el sistema imperial si lo activas.',
23
+ },
24
+ ];
25
+ const howTo = [
26
+ {
27
+ name: 'Introduce la altura del bebé',
28
+ text: 'Usa el slider o los botones para ajustar la altura actual del bebé en centímetros o pulgadas.',
29
+ },
30
+ {
31
+ name: 'Introduce el peso del bebé',
32
+ text: 'Ajusta el peso en kg o libras para afinar los resultados, ya que algunas marcas usan el peso como referencia complementaria.',
33
+ },
34
+ {
35
+ name: 'Selecciona una marca',
36
+ text: 'Elige la marca de ropa para ver la talla sugerida y las medidas estimadas de la prenda.',
37
+ },
38
+ {
39
+ name: 'Consulta las equivalencias',
40
+ text: 'En el panel derecho verás las tallas equivalentes de todas las marcas disponibles de un vistazo.',
41
+ },
42
+ ];
43
+
44
+ const faqSchema: WithContext<FAQPage> = {
45
+ '@context': 'https://schema.org',
46
+ '@type': 'FAQPage',
47
+ mainEntity: faq.map((item) => ({
48
+ '@type': 'Question',
49
+ name: item.question,
50
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
51
+ })),
52
+ };
53
+ const howToSchema: WithContext<HowTo> = {
54
+ '@context': 'https://schema.org',
55
+ '@type': 'HowTo',
56
+ name: title,
57
+ description,
58
+ step: howTo.map((step) => ({
59
+ '@type': 'HowToStep',
60
+ name: step.name,
61
+ text: step.text,
62
+ })),
63
+ };
64
+ const appSchema: WithContext<SoftwareApplication> = {
65
+ '@context': 'https://schema.org',
66
+ '@type': 'SoftwareApplication',
67
+ name: title,
68
+ description,
69
+ applicationCategory: 'UtilitiesApplication',
70
+ operatingSystem: 'Web',
71
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
72
+ inLanguage: 'es',
73
+ };
74
+
75
+ export const content: BabySizeConverterLocaleContent = {
76
+ slug,
77
+ title,
78
+ description,
79
+ ui: {
80
+ labelInput: 'Medidas del bebé',
81
+ labelResults: 'Equivalencias estimadas',
82
+ labelHeight: 'Altura del bebé',
83
+ labelWeight: 'Peso actual del bebé',
84
+ labelPresets: 'Preajustes por edad típica',
85
+ unitMetric: 'Métrico (cm/kg)',
86
+ unitImperial: 'Imperial (in/lb)',
87
+ labelCm: 'cm',
88
+ labelKg: 'kg',
89
+ labelIn: 'in',
90
+ labelLb: 'lb',
91
+ labelBrandFit: 'Marca y Corte',
92
+ labelSuggested: 'Talla sugerida',
93
+ labelChest: 'Pecho',
94
+ labelWaist: 'Cintura',
95
+ labelGarmentMeasures: 'Medidas estimadas de la prenda',
96
+ fitRegular: 'Corte regular',
97
+ fitLarge: 'Corte amplio',
98
+ fitSmall: 'Corte ajustado',
99
+ tipTitle: 'Consejo de experto',
100
+ tipText: 'Los bebés crecen en picos de desarrollo muy rápidos. Si el resultado está en el límite superior de una talla, elige siempre la talla superior para garantizar la durabilidad y comodidad del bebé.',
101
+ shareAriaLabel: 'Compartir talla',
102
+ faqTitle: 'Preguntas frecuentes',
103
+ bibliographyTitle: 'Referencias',
104
+ },
105
+ seo: [
106
+ { type: 'title', text: 'Guía de tallas de bebé: Zara, H&M, Primark y marcas españolas', level: 2 },
107
+ { type: 'stats', columns: 3, items: [
108
+ { value: '2.5 cm', label: 'Crecimiento mensual' },
109
+ { value: '3 meses', label: 'Duración de cada talla' },
110
+ { value: '95%', label: 'Fiabilidad por altura' },
111
+ ]},
112
+ { type: 'tip', html: 'Usa siempre la altura como referencia principal para elegir talla, no la edad. Dos bebés del mismo mes pueden tener hasta 8–10 cm de diferencia, lo que supone saltar una talla completa.' },
113
+ { type: 'title', text: 'Tallas por edad, altura y peso', level: 3 },
114
+ { type: 'table', headers: ['Edad aprox.', 'Altura (cm)', 'Peso (kg)', 'Talla habitual', 'Uso estimado'], rows: [
115
+ ['Recién nacido', '50–56', '3–4.5', '50 / RN', '4–6 semanas'],
116
+ ['1–3 meses', '56–62', '4.5–6', '56–62', '6–8 semanas'],
117
+ ['3–6 meses', '62–68', '6–8', '62–68', '6–8 semanas'],
118
+ ['6–9 meses', '68–74', '8–9.5', '68–74', '6–8 semanas'],
119
+ ['9–12 meses', '74–80', '9.5–11', '74–80', '6–8 semanas'],
120
+ ['12–18 meses', '80–86', '11–13', '80–86', '3–4 meses'],
121
+ ['18–24 meses', '86–92', '13–15', '86–92', '3–4 meses'],
122
+ ]},
123
+ { type: 'title', text: 'Marcas que tallan grande vs ajustado', level: 3 },
124
+ { type: 'comparative', columns: 2, items: [
125
+ {
126
+ title: 'Tallan grande (elige talla inferior)',
127
+ description: 'Estas marcas usan cortes más amplios; toma una talla menos de la habitual.',
128
+ points: [
129
+ 'H&M: suele tallar una talla más',
130
+ 'Primark: corte amplio generalizado',
131
+ 'Lupilu (Lidl): corte holgado',
132
+ 'Recomendado para bebés en percentil bajo',
133
+ ],
134
+ },
135
+ {
136
+ title: 'Tallan ajustado (elige talla superior)',
137
+ description: 'Estas marcas usan cortes más ceñidos; toma una talla más de la habitual.',
138
+ points: [
139
+ "Carter's: corte americano ceñido",
140
+ 'Mayoral: corte europeo ajustado',
141
+ 'Neck & Neck: tallas reducidas',
142
+ 'Recomendado para bebés en percentil alto',
143
+ ],
144
+ },
145
+ ]},
146
+ { type: 'title', text: 'Claves para acertar con la talla', level: 3 },
147
+ { type: 'list', items: [
148
+ 'Mide siempre al bebé antes de comprar, no te fíes solo de la edad',
149
+ 'Si está en el límite entre dos tallas, elige la talla superior',
150
+ 'Ten en cuenta el margen para el pañal en prendas de cuerpo entero',
151
+ 'Las tallas europeas (50, 56, 62...) corresponden a la altura en cm',
152
+ 'Lava siempre antes de usar: el algodón puede encoger hasta un 5%',
153
+ ]},
154
+ { type: 'glossary', items: [
155
+ {
156
+ term: 'Talla 50 / Recién nacido',
157
+ definition: 'Pensada para bebés de hasta 50 cm de altura y unos 3.5 kg. Muchos bebés la superan muy rápidamente, incluso en las primeras semanas.',
158
+ },
159
+ {
160
+ term: 'Medida del tiro',
161
+ definition: 'Distancia desde la entrepierna hasta la cintura. Fundamental en bodies y peleles: un tiro corto limita el movimiento del bebé aunque el resto de la prenda encaje bien.',
162
+ },
163
+ {
164
+ term: 'Referencia por peso',
165
+ definition: "Algunas marcas americanas como Carter's usan el peso como referencia primaria. Útil para bebés con proporciones fuera del percentil estándar.",
166
+ },
167
+ {
168
+ term: 'Cuello de sobre',
169
+ definition: 'Diseño del escote de bodies y camisetas que permite vestir al bebé deslizando la prenda hacia abajo en lugar de pasarla por la cabeza. Imprescindible en los primeros meses.',
170
+ },
171
+ ]},
172
+ { type: 'summary', title: 'Lo que debes recordar', items: [
173
+ 'La altura es el indicador más fiable para elegir talla, por encima de la edad.',
174
+ "H&M y Primark tienden a tallar grande; Carter's y Mayoral tallan ajustado.",
175
+ 'Las tallas europeas numéricas (50, 56, 62...) corresponden a la altura en cm.',
176
+ 'En el límite entre tallas, elegir la superior garantiza mayor durabilidad.',
177
+ 'El cuello de sobre y el tiro amplio son los detalles clave de comodidad.',
178
+ ]},
179
+ ],
180
+ faqTitle: "Preguntas frecuentes",
181
+ faq,
182
+ bibliographyTitle: "Referencias",
183
+ bibliography: [
184
+ {
185
+ name: 'Zara - Guía de tallas infantiles',
186
+ url: 'https://www.zara.com/es/es/size-guide.html',
187
+ },
188
+ {
189
+ name: 'H&M - Guía de tallas para bebé',
190
+ url: 'https://www2.hm.com/es_es/customer-service/sizeguide.html',
191
+ },
192
+ {
193
+ name: 'OMS - Estándares de crecimiento infantil',
194
+ url: 'https://www.who.int/tools/child-growth-standards',
195
+ },
196
+ {
197
+ name: 'Mayoral - Guía de tallas',
198
+ url: 'https://www.mayoral.com/es-es/guia-tallas',
199
+ },
200
+ ],
201
+ howTo,
202
+ schemas: [faqSchema as any, howToSchema as any, appSchema],
203
+ };
@@ -0,0 +1,203 @@
1
+ import type { BabySizeConverterLocaleContent } from '../index';
2
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
3
+
4
+ const slug = 'convertisseur-tailles-bebe';
5
+ const title = 'Convertisseur de tailles bébé';
6
+ const description = "Convertissez les tailles de vêtements bébé entre Zara, H&M, Primark, Carter's, Kiabi, Mango et Mayoral. Entrez la taille et le poids de votre bébé pour obtenir la pointure exacte de chaque marque.";
7
+ const faq = [
8
+ {
9
+ question: "Comment savoir quelle taille de vêtement correspond à mon bébé ?",
10
+ answer: "Le plus fiable est d'utiliser la taille du bébé comme référence principale. Les tailles européennes (50, 56, 62...) correspondent directement à la taille en centimètres. Entrez la taille et le poids dans le convertisseur pour obtenir la taille recommandée par chaque marque.",
11
+ },
12
+ {
13
+ question: 'Pourquoi les tailles varient-elles autant selon les marques ?',
14
+ answer: "Chaque marque a son propre patron de coupe. H&M et Primark ont tendance à tailler grand, tandis que Carter's et Mayoral ont des coupes plus ajustées. Utilisez toujours les mesures du bébé, pas seulement son âge.",
15
+ },
16
+ {
17
+ question: 'Que faire si le bébé est entre deux tailles ?',
18
+ answer: "Choisissez toujours la taille supérieure. Les bébés grandissent très vite et une taille plus grande garantit une meilleure durabilité et un meilleur confort.",
19
+ },
20
+ {
21
+ question: "Les tailles en pouces fonctionnent-elles de la même façon ?",
22
+ answer: "Les marques américaines comme Carter's utilisent les pouces et le poids comme référence principale. Le convertisseur affiche automatiquement les équivalences en système impérial lorsque vous l'activez.",
23
+ },
24
+ ];
25
+ const howTo = [
26
+ {
27
+ name: 'Entrez la taille du bébé',
28
+ text: 'Utilisez le curseur ou les boutons pour ajuster la taille actuelle du bébé en centimètres ou en pouces.',
29
+ },
30
+ {
31
+ name: 'Entrez le poids du bébé',
32
+ text: 'Ajustez le poids en kg ou en livres pour affiner les résultats, car certaines marques utilisent le poids comme référence complémentaire.',
33
+ },
34
+ {
35
+ name: 'Sélectionnez une marque',
36
+ text: 'Choisissez la marque de vêtements pour voir la taille suggérée et les mesures estimées du vêtement.',
37
+ },
38
+ {
39
+ name: 'Consultez les équivalences',
40
+ text: 'Le panneau de droite affiche les tailles équivalentes de toutes les marques disponibles en un coup d\'oeil.',
41
+ },
42
+ ];
43
+
44
+ const faqSchema: WithContext<FAQPage> = {
45
+ '@context': 'https://schema.org',
46
+ '@type': 'FAQPage',
47
+ mainEntity: faq.map((item) => ({
48
+ '@type': 'Question',
49
+ name: item.question,
50
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
51
+ })),
52
+ };
53
+ const howToSchema: WithContext<HowTo> = {
54
+ '@context': 'https://schema.org',
55
+ '@type': 'HowTo',
56
+ name: title,
57
+ description,
58
+ step: howTo.map((step) => ({
59
+ '@type': 'HowToStep',
60
+ name: step.name,
61
+ text: step.text,
62
+ })),
63
+ };
64
+ const appSchema: WithContext<SoftwareApplication> = {
65
+ '@context': 'https://schema.org',
66
+ '@type': 'SoftwareApplication',
67
+ name: title,
68
+ description,
69
+ applicationCategory: 'UtilitiesApplication',
70
+ operatingSystem: 'Web',
71
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
72
+ inLanguage: 'fr',
73
+ };
74
+
75
+ export const content: BabySizeConverterLocaleContent = {
76
+ slug,
77
+ title,
78
+ description,
79
+ ui: {
80
+ labelInput: 'Mesures du bébé',
81
+ labelResults: 'Équivalences estimées',
82
+ labelHeight: 'Taille du bébé',
83
+ labelWeight: 'Poids actuel du bébé',
84
+ labelPresets: 'Préréglages par âge typique',
85
+ unitMetric: 'Métrique (cm/kg)',
86
+ unitImperial: 'Impérial (in/lb)',
87
+ labelCm: 'cm',
88
+ labelKg: 'kg',
89
+ labelIn: 'in',
90
+ labelLb: 'lb',
91
+ labelBrandFit: 'Marque et coupe',
92
+ labelSuggested: 'Taille suggérée',
93
+ labelChest: 'Poitrine',
94
+ labelWaist: 'Tour de taille',
95
+ labelGarmentMeasures: 'Mesures estimées du vêtement',
96
+ fitRegular: 'Coupe régulière',
97
+ fitLarge: 'Coupe ample',
98
+ fitSmall: 'Coupe ajustée',
99
+ tipTitle: 'Conseil expert',
100
+ tipText: "Les bébés grandissent très rapidement. Si le résultat se situe à la limite supérieure d'une taille, choisissez toujours la taille supérieure pour garantir la durabilité et le confort du bébé.",
101
+ shareAriaLabel: 'Partager la taille',
102
+ faqTitle: 'Questions fréquentes',
103
+ bibliographyTitle: 'Références',
104
+ },
105
+ seo: [
106
+ { type: 'title', text: "Guide des tailles bébé : Zara, H&M, Primark et grandes marques", level: 2 },
107
+ { type: 'stats', columns: 3, items: [
108
+ { value: '2,5 cm', label: 'Croissance mensuelle' },
109
+ { value: '3 mois', label: 'Durée par taille' },
110
+ { value: '95 %', label: 'Fiabilité par taille' },
111
+ ]},
112
+ { type: 'tip', html: "Utilisez toujours la taille comme référence principale pour choisir une pointure, pas l'âge. Deux bébés du même mois peuvent avoir jusqu'à 8–10 cm de différence, ce qui représente une taille complète." },
113
+ { type: 'title', text: 'Tailles par âge, taille et poids', level: 3 },
114
+ { type: 'table', headers: ['Âge approx.', 'Taille (cm)', 'Poids (kg)', 'Taille habituelle', 'Utilisation estimée'], rows: [
115
+ ['Nouveau-né', '50–56', '3–4,5', '50 / NB', '4–6 semaines'],
116
+ ['1–3 mois', '56–62', '4,5–6', '56–62', '6–8 semaines'],
117
+ ['3–6 mois', '62–68', '6–8', '62–68', '6–8 semaines'],
118
+ ['6–9 mois', '68–74', '8–9,5', '68–74', '6–8 semaines'],
119
+ ['9–12 mois', '74–80', '9,5–11', '74–80', '6–8 semaines'],
120
+ ['12–18 mois', '80–86', '11–13', '80–86', '3–4 mois'],
121
+ ['18–24 mois', '86–92', '13–15', '86–92', '3–4 mois'],
122
+ ]},
123
+ { type: 'title', text: 'Marques qui taillent grand vs ajusté', level: 3 },
124
+ { type: 'comparative', columns: 2, items: [
125
+ {
126
+ title: 'Taillent grand (prendre une taille en dessous)',
127
+ description: "Ces marques utilisent des coupes plus amples ; prenez une taille en moins par rapport à l'habituel.",
128
+ points: [
129
+ 'H&M : taille généralement une taille de plus',
130
+ 'Primark : coupe ample généralisée',
131
+ 'Lupilu (Lidl) : coupe large',
132
+ 'Recommandé pour les bébés en percentile bas',
133
+ ],
134
+ },
135
+ {
136
+ title: 'Taillent ajusté (prendre une taille au-dessus)',
137
+ description: "Ces marques utilisent des coupes plus cintrées ; prenez une taille de plus par rapport à l'habituel.",
138
+ points: [
139
+ "Carter's : coupe américaine cintrée",
140
+ 'Mayoral : coupe européenne ajustée',
141
+ 'Neck & Neck : tailles réduites',
142
+ 'Recommandé pour les bébés en percentile élevé',
143
+ ],
144
+ },
145
+ ]},
146
+ { type: 'title', text: 'Conseils pour trouver la bonne taille', level: 3 },
147
+ { type: 'list', items: [
148
+ "Mesurez toujours le bébé avant d'acheter, ne vous fiez pas uniquement à l'âge",
149
+ 'Si le résultat se situe entre deux tailles, choisissez toujours la taille supérieure',
150
+ 'Tenez compte de la place pour la couche dans les bodies et combinaisons',
151
+ 'Les tailles européennes (50, 56, 62...) correspondent à la taille en cm',
152
+ "Lavez toujours avant utilisation : le coton peut rétrécir jusqu'à 5 %",
153
+ ]},
154
+ { type: 'glossary', items: [
155
+ {
156
+ term: 'Taille 50 / Nouveau-né',
157
+ definition: "Conçue pour les bébés jusqu'à 50 cm et environ 3,5 kg. De nombreux bébés la dépassent très rapidement, même dans les premières semaines.",
158
+ },
159
+ {
160
+ term: 'Longueur entrejambe',
161
+ definition: "Distance de l'entrejambe à la taille. Fondamentale dans les bodies et combinaisons : une longueur courte limite les mouvements du bébé même si le reste du vêtement convient.",
162
+ },
163
+ {
164
+ term: 'Référence par poids',
165
+ definition: "Certaines marques américaines comme Carter's utilisent le poids comme référence principale. Utile pour les bébés dont les proportions sortent du percentile standard.",
166
+ },
167
+ {
168
+ term: 'Col enveloppe',
169
+ definition: "Design de l'encolure des bodies et T-shirts permettant d'habiller le bébé en faisant glisser le vêtement vers le bas plutôt que par la tête. Indispensable dans les premiers mois.",
170
+ },
171
+ ]},
172
+ { type: 'summary', title: "Ce qu'il faut retenir", items: [
173
+ "La taille est l'indicateur le plus fiable pour choisir la bonne pointure, avant l'âge.",
174
+ "H&M et Primark taillent généralement grand ; Carter's et Mayoral taillent ajusté.",
175
+ 'Les tailles européennes numériques (50, 56, 62...) correspondent à la taille en cm.',
176
+ 'En cas de doute entre deux tailles, choisir la supérieure garantit une meilleure durabilité.',
177
+ "Le col enveloppe et un entrejambe généreux sont les détails de confort essentiels.",
178
+ ]},
179
+ ],
180
+ faqTitle: "Questions fréquentes",
181
+ faq,
182
+ bibliographyTitle: "Références",
183
+ bibliography: [
184
+ {
185
+ name: 'Zara - Guide des tailles enfant',
186
+ url: 'https://www.zara.com/fr/fr/size-guide.html',
187
+ },
188
+ {
189
+ name: 'H&M - Guide des tailles bébé',
190
+ url: 'https://www2.hm.com/fr_fr/customer-service/sizeguide.html',
191
+ },
192
+ {
193
+ name: 'OMS - Normes de croissance de l\'enfant',
194
+ url: 'https://www.who.int/tools/child-growth-standards',
195
+ },
196
+ {
197
+ name: 'Kiabi - Guide des tailles',
198
+ url: 'https://www.kiabi.com/guide-des-tailles',
199
+ },
200
+ ],
201
+ howTo,
202
+ schemas: [faqSchema as any, howToSchema as any, appSchema],
203
+ };
@@ -0,0 +1,53 @@
1
+ import type { BabiesToolEntry, ToolDefinition, ToolLocaleContent } from '../../types';
2
+ import BabySizeConverterComponent from './component.astro';
3
+ import BabySizeConverterSEO from './seo.astro';
4
+ import BabySizeConverterBibliography from './bibliography.astro';
5
+
6
+ export interface BabySizeConverterUI {
7
+ [key: string]: string;
8
+ labelInput: string;
9
+ labelResults: string;
10
+ labelHeight: string;
11
+ labelWeight: string;
12
+ labelPresets: string;
13
+ unitMetric: string;
14
+ unitImperial: string;
15
+ labelCm: string;
16
+ labelKg: string;
17
+ labelIn: string;
18
+ labelLb: string;
19
+ labelBrandFit: string;
20
+ labelSuggested: string;
21
+ labelChest: string;
22
+ labelWaist: string;
23
+ labelGarmentMeasures: string;
24
+ fitRegular: string;
25
+ fitLarge: string;
26
+ fitSmall: string;
27
+ tipTitle: string;
28
+ tipText: string;
29
+ shareAriaLabel: string;
30
+ faqTitle: string;
31
+ bibliographyTitle: string;
32
+ }
33
+
34
+ export type BabySizeConverterLocaleContent = ToolLocaleContent<BabySizeConverterUI>;
35
+
36
+ export const babySizeConverter: BabiesToolEntry<BabySizeConverterUI> = {
37
+ id: 'baby-size-converter',
38
+ icons: { bg: 'mdi:tshirt-crew', fg: 'mdi:tshirt-crew-outline' },
39
+ i18n: {
40
+ es: () => import('./i18n/es').then((m) => m.content),
41
+ en: () => import('./i18n/en').then((m) => m.content),
42
+ fr: () => import('./i18n/fr').then((m) => m.content),
43
+ },
44
+ };
45
+
46
+ export { BabySizeConverterComponent, BabySizeConverterSEO, BabySizeConverterBibliography };
47
+
48
+ export const BABY_SIZE_CONVERTER_TOOL: ToolDefinition = {
49
+ entry: babySizeConverter,
50
+ Component: BabySizeConverterComponent,
51
+ SEOComponent: BabySizeConverterSEO,
52
+ BibliographyComponent: BabySizeConverterBibliography,
53
+ };
@@ -0,0 +1,44 @@
1
+ export interface BrandSize {
2
+ label: string;
3
+ age: number;
4
+ height: number;
5
+ weight: number;
6
+ chest: number;
7
+ waist: number;
8
+ }
9
+
10
+ export interface Brand {
11
+ id: string;
12
+ name: string;
13
+ fit: string;
14
+ sizes: BrandSize[];
15
+ }
16
+
17
+ export function findBestSize(brand: Brand, height: number, weight: number): BrandSize {
18
+ let best = brand.sizes[0]!;
19
+ let diff = Infinity;
20
+ brand.sizes.forEach((s) => {
21
+ const d = Math.abs(s.height - height) + Math.abs(s.weight - weight) * 8;
22
+ if (d < diff) {
23
+ diff = d;
24
+ best = s;
25
+ }
26
+ });
27
+ return best;
28
+ }
29
+
30
+ export function toImperialHeight(cm: number): string {
31
+ return (cm / 2.54).toFixed(1);
32
+ }
33
+
34
+ export function toImperialWeight(kg: number): string {
35
+ return (kg * 2.20462).toFixed(1);
36
+ }
37
+
38
+ export function buildShareUrl(height: number, weight: number, brandId: string): string {
39
+ const params = new URLSearchParams();
40
+ params.set('h', height.toString());
41
+ params.set('w', weight.toString());
42
+ params.set('b', brandId);
43
+ return `${window.location.pathname}?${params.toString()}`;
44
+ }
@@ -0,0 +1,36 @@
1
+ ---
2
+ import {
3
+ SEOTitle, SEOStats, SEOTip, SEOTable,
4
+ SEOList, SEOSummary, SEOComparative, SEOGlossary, SEOArticle,
5
+ } from '@jjlmoya/utils-shared';
6
+ import { babySizeConverter } from './index';
7
+ import type { KnownLocale } from '../../types';
8
+
9
+ interface Props { locale?: KnownLocale; }
10
+ const { locale = 'es' } = Astro.props;
11
+ const content = await babySizeConverter.i18n[locale]?.();
12
+ if (!content) return null;
13
+ const { seo } = content;
14
+ ---
15
+ <SEOArticle>
16
+ {seo.map((section: any) => {
17
+ switch (section.type) {
18
+ case 'summary': return <SEOSummary title={section.title} items={section.items} />;
19
+ case 'title': return <SEOTitle title={section.text} level={section.level || 2} />;
20
+ case 'paragraph': return <p set:html={section.html} />;
21
+ case 'stats': return <SEOStats stats={section.items} columns={section.columns} />;
22
+ case 'tip': return <SEOTip><Fragment set:html={section.html} /></SEOTip>;
23
+ case 'table': return (
24
+ <SEOTable headers={section.headers}>
25
+ {section.rows.map((row: string[]) => (
26
+ <tr>{row.map((cell: string) => <td set:html={cell} />)}</tr>
27
+ ))}
28
+ </SEOTable>
29
+ );
30
+ case 'list': return <SEOList items={section.items} />;
31
+ case 'comparative': return <SEOComparative items={section.items} columns={section.columns} />;
32
+ case 'glossary': return <SEOGlossary items={section.items} />;
33
+ default: return null;
34
+ }
35
+ })}
36
+ </SEOArticle>