@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.
- package/package.json +69 -0
- package/src/category/i18n/en.ts +48 -0
- package/src/category/i18n/es.ts +48 -0
- package/src/category/i18n/fr.ts +48 -0
- package/src/category/index.ts +24 -0
- package/src/category/seo.astro +15 -0
- package/src/components/PreviewNavSidebar.astro +116 -0
- package/src/components/PreviewToolbar.astro +143 -0
- package/src/data.ts +30 -0
- package/src/env.d.ts +5 -0
- package/src/index.ts +19 -0
- package/src/layouts/PreviewLayout.astro +117 -0
- package/src/pages/[locale]/[slug].astro +146 -0
- package/src/pages/[locale].astro +251 -0
- package/src/pages/index.astro +4 -0
- package/src/tests/faq_count.test.ts +19 -0
- package/src/tests/locale_completeness.test.ts +42 -0
- package/src/tests/mocks/astro_mock.js +2 -0
- package/src/tests/no_h1_in_components.test.ts +48 -0
- package/src/tests/seo_length.test.ts +23 -0
- package/src/tests/tool_validation.test.ts +17 -0
- package/src/tool/baby-feeding-calculator/bibliography.astro +7 -0
- package/src/tool/baby-feeding-calculator/component.astro +210 -0
- package/src/tool/baby-feeding-calculator/i18n/en.ts +162 -0
- package/src/tool/baby-feeding-calculator/i18n/es.ts +162 -0
- package/src/tool/baby-feeding-calculator/i18n/fr.ts +162 -0
- package/src/tool/baby-feeding-calculator/index.ts +47 -0
- package/src/tool/baby-feeding-calculator/logic.ts +85 -0
- package/src/tool/baby-feeding-calculator/seo.astro +58 -0
- package/src/tool/baby-feeding-calculator/style.css +329 -0
- package/src/tool/baby-percentile-calculator/bibliography.astro +7 -0
- package/src/tool/baby-percentile-calculator/component.astro +388 -0
- package/src/tool/baby-percentile-calculator/i18n/en.ts +244 -0
- package/src/tool/baby-percentile-calculator/i18n/es.ts +244 -0
- package/src/tool/baby-percentile-calculator/i18n/fr.ts +244 -0
- package/src/tool/baby-percentile-calculator/index.ts +54 -0
- package/src/tool/baby-percentile-calculator/lmsData.ts +80 -0
- package/src/tool/baby-percentile-calculator/logic.ts +85 -0
- package/src/tool/baby-percentile-calculator/seo.astro +36 -0
- package/src/tool/baby-percentile-calculator/style.css +393 -0
- package/src/tool/baby-size-converter/bibliography.astro +7 -0
- package/src/tool/baby-size-converter/component.astro +289 -0
- package/src/tool/baby-size-converter/data.json +11 -0
- package/src/tool/baby-size-converter/i18n/en.ts +203 -0
- package/src/tool/baby-size-converter/i18n/es.ts +203 -0
- package/src/tool/baby-size-converter/i18n/fr.ts +203 -0
- package/src/tool/baby-size-converter/index.ts +53 -0
- package/src/tool/baby-size-converter/logic.ts +44 -0
- package/src/tool/baby-size-converter/seo.astro +36 -0
- package/src/tool/baby-size-converter/style.css +394 -0
- package/src/tool/fertile-days-estimator/bibliography.astro +7 -0
- package/src/tool/fertile-days-estimator/component.astro +265 -0
- package/src/tool/fertile-days-estimator/i18n/en.ts +258 -0
- package/src/tool/fertile-days-estimator/i18n/es.ts +262 -0
- package/src/tool/fertile-days-estimator/i18n/fr.ts +258 -0
- package/src/tool/fertile-days-estimator/index.ts +47 -0
- package/src/tool/fertile-days-estimator/logic.ts +58 -0
- package/src/tool/fertile-days-estimator/seo.astro +36 -0
- package/src/tool/fertile-days-estimator/style.css +419 -0
- package/src/tool/pregnancy-calculator/bibliography.astro +7 -0
- package/src/tool/pregnancy-calculator/calculator.ts +41 -0
- package/src/tool/pregnancy-calculator/component.astro +432 -0
- package/src/tool/pregnancy-calculator/i18n/en.ts +315 -0
- package/src/tool/pregnancy-calculator/i18n/es.ts +319 -0
- package/src/tool/pregnancy-calculator/i18n/fr.ts +315 -0
- package/src/tool/pregnancy-calculator/index.ts +55 -0
- package/src/tool/pregnancy-calculator/milestones.ts +153 -0
- package/src/tool/pregnancy-calculator/seo.astro +36 -0
- package/src/tool/pregnancy-calculator/store.ts +60 -0
- package/src/tool/pregnancy-calculator/style.css +807 -0
- package/src/tool/vaccination-calendar/bibliography.astro +7 -0
- package/src/tool/vaccination-calendar/component.astro +286 -0
- package/src/tool/vaccination-calendar/i18n/en.ts +170 -0
- package/src/tool/vaccination-calendar/i18n/es.ts +174 -0
- package/src/tool/vaccination-calendar/i18n/fr.ts +170 -0
- package/src/tool/vaccination-calendar/index.ts +47 -0
- package/src/tool/vaccination-calendar/logic.ts +59 -0
- package/src/tool/vaccination-calendar/seo.astro +36 -0
- package/src/tool/vaccination-calendar/style.css +316 -0
- package/src/tool/vaccination-calendar/vaccinationData.ts +21 -0
- package/src/tools.ts +17 -0
- package/src/types.ts +72 -0
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
import type { PregnancyCalculatorLocaleContent } from '../index';
|
|
2
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
3
|
+
|
|
4
|
+
const slug = 'calculatrice-semaines-grossesse';
|
|
5
|
+
const title = 'Calculatrice de Semaines de Grossesse';
|
|
6
|
+
const description = 'Calculez exactement à quelle semaine de grossesse vous êtes, votre trimestre et votre date prévue d\'accouchement.';
|
|
7
|
+
const faq = [
|
|
8
|
+
{
|
|
9
|
+
question: 'Comment calcule-t-on la semaine de grossesse ?',
|
|
10
|
+
answer: 'On compte à partir du premier jour des dernières règles. On ajoute 280 jours à cette date pour obtenir la date prévue d\'accouchement. Si votre cycle est différent de 28 jours, le calcul s\'ajuste automatiquement.',
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
question: 'Quelle est la différence entre la DDR et la date de conception ?',
|
|
14
|
+
answer: 'La DDR (Date des Dernières Règles) est la méthode standard utilisée par les médecins. La date de conception est plus précise si vous la connaissez, car elle évite l\'estimation des 14 jours d\'ovulation.',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: 'Pourquoi la date de mon médecin est-elle différente ?',
|
|
18
|
+
answer: 'Votre médecin a peut-être corrigé la date à partir de l\'échographie du premier trimestre, qui est la méthode la plus précise. Des cycles irréguliers peuvent aussi justifier des différences.',
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
question: 'Quand commence le deuxième trimestre ?',
|
|
22
|
+
answer: 'Le deuxième trimestre commence à la semaine 13 et se termine à la fin de la semaine 26. La plupart des mères se sentent plus énergiques pendant cette période.',
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
question: 'Quelle est la précision de la date prévue d\'accouchement ?',
|
|
26
|
+
answer: 'La DPA est une estimation statistique. Seulement 3 à 5 % des bébés naissent exactement ce jour-là. La plupart des bébés naissent entre les semaines 38 et 42.',
|
|
27
|
+
},
|
|
28
|
+
];
|
|
29
|
+
const howTo = [
|
|
30
|
+
{
|
|
31
|
+
name: 'Sélectionnez la méthode de calcul',
|
|
32
|
+
text: 'Choisissez si vous voulez calculer à partir de vos dernières règles ou de la date de conception.',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: 'Entrez la date',
|
|
36
|
+
text: 'Sélectionnez le jour, le mois et l\'année à l\'aide des menus déroulants.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Ajustez la durée du cycle',
|
|
40
|
+
text: 'Si votre cycle n\'est pas de 28 jours, déplacez le curseur pour une estimation plus précise.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Consultez la semaine et le trimestre',
|
|
44
|
+
text: 'Le résultat affiche la semaine exacte, le trimestre et la date prévue d\'accouchement.',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'Explorez les jalons hebdomadaires',
|
|
48
|
+
text: 'Découvrez la taille du bébé, les changements biologiques et des conseils personnalisés pour chaque semaine.',
|
|
49
|
+
},
|
|
50
|
+
];
|
|
51
|
+
|
|
52
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
53
|
+
'@context': 'https://schema.org',
|
|
54
|
+
'@type': 'FAQPage',
|
|
55
|
+
mainEntity: faq.map((item) => ({
|
|
56
|
+
'@type': 'Question',
|
|
57
|
+
name: item.question,
|
|
58
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
59
|
+
})),
|
|
60
|
+
};
|
|
61
|
+
const howToSchema: WithContext<HowTo> = {
|
|
62
|
+
'@context': 'https://schema.org',
|
|
63
|
+
'@type': 'HowTo',
|
|
64
|
+
name: title,
|
|
65
|
+
description,
|
|
66
|
+
step: howTo.map((step) => ({
|
|
67
|
+
'@type': 'HowToStep',
|
|
68
|
+
name: step.name,
|
|
69
|
+
text: step.text,
|
|
70
|
+
})),
|
|
71
|
+
};
|
|
72
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
73
|
+
'@context': 'https://schema.org',
|
|
74
|
+
'@type': 'SoftwareApplication',
|
|
75
|
+
name: title,
|
|
76
|
+
description,
|
|
77
|
+
applicationCategory: 'UtilitiesApplication',
|
|
78
|
+
operatingSystem: 'Web',
|
|
79
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
80
|
+
inLanguage: 'fr',
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
export const content: PregnancyCalculatorLocaleContent = {
|
|
84
|
+
slug,
|
|
85
|
+
title,
|
|
86
|
+
description,
|
|
87
|
+
ui: {
|
|
88
|
+
btnFUR: 'Dernières règles',
|
|
89
|
+
btnConception: 'Date de conception',
|
|
90
|
+
labelPartnerMode: 'Mode partenaire',
|
|
91
|
+
labelFUR: 'Date des dernières règles',
|
|
92
|
+
labelConception: 'Date de conception',
|
|
93
|
+
labelCycleLength: 'Durée du cycle',
|
|
94
|
+
unitDays: 'jours',
|
|
95
|
+
labelWeeks: 'Semaines',
|
|
96
|
+
labelTrimester: 'Trimestre',
|
|
97
|
+
labelEDD: 'Date Prévue d\'Accouchement',
|
|
98
|
+
eddPlaceholder: 'Entrez votre date',
|
|
99
|
+
eddNote: 'Seulement 3 à 5 % des bébés naissent exactement ce jour-là',
|
|
100
|
+
btnCalendar: 'Enregistrer dans l\'agenda',
|
|
101
|
+
labelFruits: 'Fruits',
|
|
102
|
+
labelGeek: 'Geek',
|
|
103
|
+
labelSweets: 'Sucreries',
|
|
104
|
+
labelBioLabel: 'Développement biologique',
|
|
105
|
+
labelMomKey: 'Votre corps aujourd\'hui',
|
|
106
|
+
labelPartnerKey: 'Comment la soutenir aujourd\'hui',
|
|
107
|
+
labelNormalMolestias: 'Inconforts normaux',
|
|
108
|
+
labelAlert: 'Consulter si vous avez...',
|
|
109
|
+
labelTimeline: 'Chronologie',
|
|
110
|
+
labelStartHere: 'Commencez ici',
|
|
111
|
+
labelStartBody: 'Sélectionnez la date de vos dernières règles pour découvrir à quelle semaine vous en êtes.',
|
|
112
|
+
faqTitle: 'Questions fréquentes',
|
|
113
|
+
bibliographyTitle: 'Références',
|
|
114
|
+
},
|
|
115
|
+
seo: [
|
|
116
|
+
{
|
|
117
|
+
type: 'summary',
|
|
118
|
+
title: "Points essentiels à retenir",
|
|
119
|
+
items: [
|
|
120
|
+
"Calculez votre semaine de grossesse à partir de la DDR ou de la date de conception.",
|
|
121
|
+
"La DPA est une estimation : seulement 3 à 5 % des bébés naissent exactement ce jour-là.",
|
|
122
|
+
"Chaque trimestre a ses propres jalons biologiques et inconforts caractéristiques.",
|
|
123
|
+
"Consultez votre médecin ou sage-femme immédiatement si vous remarquez un signe d'alarme.",
|
|
124
|
+
"Le mode partenaire vous montre comment soutenir votre compagne semaine par semaine.",
|
|
125
|
+
],
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
type: 'title',
|
|
129
|
+
text: "Calculatrice de Semaines de Grossesse : bien plus qu'une date d'accouchement",
|
|
130
|
+
level: 2,
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
type: 'stats',
|
|
134
|
+
columns: 3,
|
|
135
|
+
items: [
|
|
136
|
+
{ value: '40 semaines', label: 'Durée moyenne de la grossesse' },
|
|
137
|
+
{ value: '280 jours', label: 'Jours de gestation' },
|
|
138
|
+
{ value: '±14 jours', label: "Marge d'erreur de la DPA" },
|
|
139
|
+
],
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
type: 'title',
|
|
143
|
+
text: 'Comment calcule-t-on la semaine de grossesse ?',
|
|
144
|
+
level: 3,
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
type: 'list',
|
|
148
|
+
items: [
|
|
149
|
+
"La méthode la plus courante utilise la date du premier jour des dernières règles (DDR) comme point de départ.",
|
|
150
|
+
"On ajoute 280 jours à la DDR pour obtenir la date prévue d'accouchement (DPA).",
|
|
151
|
+
"Si votre cycle est différent de 28 jours, la DPA est ajustée automatiquement.",
|
|
152
|
+
"La méthode par conception soustrait 14 jours du calcul pour approximer la DPA à partir de la fécondation.",
|
|
153
|
+
"L'échographie du premier trimestre peut corriger l'âge gestationnel avec plus de précision.",
|
|
154
|
+
],
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
type: 'tip',
|
|
158
|
+
html: "Si votre médecin indique une date différente de celle calculée ici, cela est probablement dû à un cycle irrégulier ou à une correction échographique du premier trimestre. Les deux dates sont valides.",
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
type: 'title',
|
|
162
|
+
text: 'Les trois trimestres de la grossesse',
|
|
163
|
+
level: 3,
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
type: 'table',
|
|
167
|
+
headers: ['Trimestre', 'Semaines', 'Jalon principal', 'Corps de la mère'],
|
|
168
|
+
rows: [
|
|
169
|
+
['1er', '1 – 12', 'Formation des organes', 'Nausées, fatigue, implantation'],
|
|
170
|
+
['2e', '13 – 26', 'Mouvements foetaux, écho morphologique', 'Énergie retrouvée, ventre visible'],
|
|
171
|
+
['3e', '27 – 40', 'Maturation pulmonaire, engagement', 'Pression pelvienne, préparation à l\'accouchement'],
|
|
172
|
+
],
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
type: 'title',
|
|
176
|
+
text: 'Jalons biologiques semaine par semaine',
|
|
177
|
+
level: 3,
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
type: 'table',
|
|
181
|
+
headers: ['Semaine', 'Taille approx.', 'Jalon biologique', 'Ce que ressent la mère'],
|
|
182
|
+
rows: [
|
|
183
|
+
['4', '~1 mm', "Implantation dans l'endomètre", 'Léger saignement possible'],
|
|
184
|
+
['8', '~18 mm', 'Cœur bat 150–170 fois/min', 'Nausées à leur maximum'],
|
|
185
|
+
['12', '~55 mm', 'Organes principaux formés', 'Risque de fausse couche en forte baisse'],
|
|
186
|
+
['20', '~25 cm', 'Entend les voix clairement', 'Échographie morphologique'],
|
|
187
|
+
['28', '~37 cm', 'Cycles veille-sommeil', 'Début du troisième trimestre'],
|
|
188
|
+
['36', '~47 cm', 'Poumons presque matures', "Engagement dans le bassin"],
|
|
189
|
+
['40', '~50 cm', 'Prêt à naître', "DPA : date prévue d'accouchement"],
|
|
190
|
+
],
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
type: 'title',
|
|
194
|
+
text: 'Symptômes courants par trimestre',
|
|
195
|
+
level: 3,
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
type: 'comparative',
|
|
199
|
+
columns: 2,
|
|
200
|
+
items: [
|
|
201
|
+
{
|
|
202
|
+
title: '1er trimestre (sem. 1–12)',
|
|
203
|
+
description: 'La phase de plus grands changements hormonaux.',
|
|
204
|
+
points: [
|
|
205
|
+
'Nausées et vomissements, surtout le matin',
|
|
206
|
+
'Fatigue extrême et somnolence',
|
|
207
|
+
'Sensibilité des seins',
|
|
208
|
+
'Envies fréquentes d\'uriner',
|
|
209
|
+
'Sautes d\'humeur',
|
|
210
|
+
],
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
title: '2e trimestre (sem. 13–26)',
|
|
214
|
+
description: "Le trimestre où la plupart des mères se sentent le mieux.",
|
|
215
|
+
points: [
|
|
216
|
+
'Disparition des nausées',
|
|
217
|
+
'Niveau d\'énergie amélioré',
|
|
218
|
+
'Ventre visible à partir de la semaine 18–20',
|
|
219
|
+
'Premiers mouvements foetaux (sem. 18–22)',
|
|
220
|
+
'Brûlures d\'estomac croissantes',
|
|
221
|
+
],
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
title: '3e trimestre (sem. 27–40)',
|
|
225
|
+
description: "Préparation à l'accouchement.",
|
|
226
|
+
points: [
|
|
227
|
+
'Pression pelvienne et douleurs dorsales',
|
|
228
|
+
'Contractions de Braxton Hicks',
|
|
229
|
+
'Pieds et chevilles enflés',
|
|
230
|
+
'Difficultés à dormir',
|
|
231
|
+
'Engagement du bébé (sem. 36–38)',
|
|
232
|
+
],
|
|
233
|
+
},
|
|
234
|
+
],
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
type: 'title',
|
|
238
|
+
text: "Signes d'alarme nécessitant une consultation immédiate",
|
|
239
|
+
level: 3,
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
type: 'list',
|
|
243
|
+
items: [
|
|
244
|
+
"Saignement vaginal abondant à n'importe quelle semaine : consultez immédiatement.",
|
|
245
|
+
"Contractions régulières avant la semaine 37 : risque d'accouchement prématuré.",
|
|
246
|
+
"Perte de liquide amniotique : rupture de la poche des eaux, rendez-vous aux urgences.",
|
|
247
|
+
"Maux de tête intenses avec vision floue : possible pré-éclampsie.",
|
|
248
|
+
"Absence de mouvements foetaux après la semaine 20 : signe d'alarme urgent.",
|
|
249
|
+
],
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
type: 'title',
|
|
253
|
+
text: 'Consultations médicales indispensables',
|
|
254
|
+
level: 3,
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
type: 'list',
|
|
258
|
+
items: [
|
|
259
|
+
"Semaine 8–12 : première échographie et bilan sanguin du premier trimestre.",
|
|
260
|
+
"Semaine 12 : dépistage combiné du premier trimestre (clarté nucale + prise de sang).",
|
|
261
|
+
"Semaine 18–22 : échographie morphologique (écho du 2e trimestre).",
|
|
262
|
+
"Semaine 24–28 : test de dépistage du diabète gestationnel (test O'Sullivan).",
|
|
263
|
+
"Semaine 36 : échographie de contrôle et prélèvement streptocoque B.",
|
|
264
|
+
],
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
type: 'glossary',
|
|
268
|
+
items: [
|
|
269
|
+
{
|
|
270
|
+
term: 'DDR (Date des Dernières Règles)',
|
|
271
|
+
definition: "Premier jour de vos dernières règles. Sert de référence pour calculer l'âge gestationnel.",
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
term: "DPA (Date Prévue d'Accouchement)",
|
|
275
|
+
definition: "Date estimée de l'accouchement, calculée en ajoutant 280 jours à la DDR.",
|
|
276
|
+
},
|
|
277
|
+
{
|
|
278
|
+
term: 'Liquide amniotique',
|
|
279
|
+
definition: "Liquide entourant le bébé dans l'utérus. Il protège le fœtus, régule la température et lui permet de bouger.",
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
term: 'Bouchon muqueux',
|
|
283
|
+
definition: "Sécrétion épaisse qui obstrue le col de l'utérus pendant la grossesse. Sa perte indique que l'accouchement approche.",
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
term: 'Pré-éclampsie',
|
|
287
|
+
definition: "Complication de la grossesse caractérisée par une hypertension artérielle et des lésions organiques. Nécessite une prise en charge médicale urgente.",
|
|
288
|
+
},
|
|
289
|
+
],
|
|
290
|
+
},
|
|
291
|
+
],
|
|
292
|
+
faqTitle: "Questions fréquentes",
|
|
293
|
+
faq,
|
|
294
|
+
bibliographyTitle: "Références",
|
|
295
|
+
bibliography: [
|
|
296
|
+
{
|
|
297
|
+
name: 'OMS – Soins prénatals',
|
|
298
|
+
url: 'https://www.who.int/fr/news-room/fact-sheets/detail/maternal-mortality',
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
name: 'ACOG – Methods for Estimating the Due Date',
|
|
302
|
+
url: 'https://www.acog.org/clinical/clinical-guidance/committee-opinion/articles/2017/05/methods-for-estimating-the-due-date',
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
name: 'Haute Autorité de Santé – Suivi et orientation des femmes enceintes',
|
|
306
|
+
url: 'https://www.has-sante.fr/jcms/c_547976/fr/suivi-et-orientation-des-femmes-enceintes',
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
name: 'UpToDate – Prenatal care: Initial assessment',
|
|
310
|
+
url: 'https://www.uptodate.com/contents/prenatal-care-initial-assessment',
|
|
311
|
+
},
|
|
312
|
+
],
|
|
313
|
+
howTo,
|
|
314
|
+
schemas: [faqSchema as any, howToSchema as any, appSchema],
|
|
315
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { BabiesToolEntry, ToolDefinition, ToolLocaleContent } from '../../types';
|
|
2
|
+
import PregnancyCalculatorComponent from './component.astro';
|
|
3
|
+
import PregnancyCalculatorSEO from './seo.astro';
|
|
4
|
+
import PregnancyCalculatorBibliography from './bibliography.astro';
|
|
5
|
+
|
|
6
|
+
export interface PregnancyCalculatorUI {
|
|
7
|
+
[key: string]: string;
|
|
8
|
+
btnFUR: string;
|
|
9
|
+
btnConception: string;
|
|
10
|
+
labelPartnerMode: string;
|
|
11
|
+
labelFUR: string;
|
|
12
|
+
labelConception: string;
|
|
13
|
+
labelCycleLength: string;
|
|
14
|
+
unitDays: string;
|
|
15
|
+
labelWeeks: string;
|
|
16
|
+
labelTrimester: string;
|
|
17
|
+
labelEDD: string;
|
|
18
|
+
eddPlaceholder: string;
|
|
19
|
+
eddNote: string;
|
|
20
|
+
btnCalendar: string;
|
|
21
|
+
labelFruits: string;
|
|
22
|
+
labelGeek: string;
|
|
23
|
+
labelSweets: string;
|
|
24
|
+
labelBioLabel: string;
|
|
25
|
+
labelMomKey: string;
|
|
26
|
+
labelPartnerKey: string;
|
|
27
|
+
labelNormalMolestias: string;
|
|
28
|
+
labelAlert: string;
|
|
29
|
+
labelTimeline: string;
|
|
30
|
+
labelStartHere: string;
|
|
31
|
+
labelStartBody: string;
|
|
32
|
+
faqTitle: string;
|
|
33
|
+
bibliographyTitle: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export type PregnancyCalculatorLocaleContent = ToolLocaleContent<PregnancyCalculatorUI>;
|
|
37
|
+
|
|
38
|
+
export const pregnancyCalculator: BabiesToolEntry<PregnancyCalculatorUI> = {
|
|
39
|
+
id: 'pregnancy-calculator',
|
|
40
|
+
icons: { bg: 'mdi:human-pregnant', fg: 'mdi:calendar-heart' },
|
|
41
|
+
i18n: {
|
|
42
|
+
es: () => import('./i18n/es').then((m) => m.content),
|
|
43
|
+
en: () => import('./i18n/en').then((m) => m.content),
|
|
44
|
+
fr: () => import('./i18n/fr').then((m) => m.content),
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
export { PregnancyCalculatorComponent, PregnancyCalculatorSEO, PregnancyCalculatorBibliography };
|
|
49
|
+
|
|
50
|
+
export const PREGNANCY_CALCULATOR_TOOL: ToolDefinition = {
|
|
51
|
+
entry: pregnancyCalculator,
|
|
52
|
+
Component: PregnancyCalculatorComponent,
|
|
53
|
+
SEOComponent: PregnancyCalculatorSEO,
|
|
54
|
+
BibliographyComponent: PregnancyCalculatorBibliography,
|
|
55
|
+
};
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
export interface Milestone {
|
|
2
|
+
analogies: { fruits: string; geek: string; sweets: string };
|
|
3
|
+
size: string;
|
|
4
|
+
biolook: string;
|
|
5
|
+
mom: string;
|
|
6
|
+
partner: string;
|
|
7
|
+
symptoms: string[];
|
|
8
|
+
alerts: string[];
|
|
9
|
+
wonder: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const milestones: Record<number, Milestone> = {
|
|
13
|
+
4: {
|
|
14
|
+
analogies: { fruits: 'Semilla de amapola', geek: 'Píxel solitario', sweets: 'Granito de azúcar' },
|
|
15
|
+
size: '~1 mm',
|
|
16
|
+
biolook: 'El blastocisto se implanta en el endometrio. Aparecen las tres capas embrionarias que formarán todos tus órganos.',
|
|
17
|
+
mom: 'Tu cuerpo aún no sabe que está embarazada, pero ya produce hCG. Quizá sientas un leve sangrado de implantación.',
|
|
18
|
+
partner: 'Puede que ella esté más cansada de lo habitual sin saber por qué. Es buen momento para cocinar su cena favorita.',
|
|
19
|
+
symptoms: ['Fatiga temprana', 'Tensión en el pecho', 'Ligero sangrado de implantación'],
|
|
20
|
+
alerts: ['Sangrado abundante rojo', 'Dolor pélvico agudo', 'Fiebre mayor de 38 grados'],
|
|
21
|
+
wonder: 'En este momento se decide si habrá uno o dos bebés.'
|
|
22
|
+
},
|
|
23
|
+
6: {
|
|
24
|
+
analogies: { fruits: 'Lenteja', geek: 'LED parpadeante', sweets: 'Lacasito' },
|
|
25
|
+
size: '~6 mm',
|
|
26
|
+
biolook: 'El corazón empieza a latir de forma irregular pero visible en ecografía. El tubo neural se cierra.',
|
|
27
|
+
mom: 'Las náuseas matutinas pueden comenzar ahora.',
|
|
28
|
+
partner: 'El olfato de ella se vuelve sobrehumano. Evita perfumes fuertes y cocinar pescado en casa.',
|
|
29
|
+
symptoms: ['Náuseas', 'Hipersensibilidad al olfato', 'Somnolencia extrema'],
|
|
30
|
+
alerts: ['Ausencia de latido en eco vaginal', 'Manchado oscuro persistente', 'Vómitos sin retención'],
|
|
31
|
+
wonder: 'Ya tiene la misma estructura cerebral básica que tendrá de adulto.'
|
|
32
|
+
},
|
|
33
|
+
8: {
|
|
34
|
+
analogies: { fruits: 'Frambuesa', geek: 'Memoria USB nano', sweets: 'Gominola de oso' },
|
|
35
|
+
size: '~18 mm',
|
|
36
|
+
biolook: 'Los dedos de manos y pies se separan. Los párpados cubren los ojos. El corazón late 150-170 veces por minuto.',
|
|
37
|
+
mom: 'Tu útero tiene el tamaño de un pomelo. Las náuseas están en su punto álgido.',
|
|
38
|
+
partner: 'Ella puede necesitar dormir 10-12 horas. Asume las tareas del hogar.',
|
|
39
|
+
symptoms: ['Náuseas intensas', 'Aumento de saliva', 'Micción muy frecuente'],
|
|
40
|
+
alerts: ['Vómitos incoercibles', 'Manchado oscuro', 'Dolor lumbar intenso'],
|
|
41
|
+
wonder: 'Si tocas la barriga de ella, él ya reacciona y se mueve.'
|
|
42
|
+
},
|
|
43
|
+
10: {
|
|
44
|
+
analogies: { fruits: 'Kumquat', geek: 'AirPod', sweets: 'Macarón' },
|
|
45
|
+
size: '~31 mm',
|
|
46
|
+
biolook: 'Técnicamente ya es un feto. Todos los órganos existen en forma rudimentaria. Las uñas empiezan a crecer.',
|
|
47
|
+
mom: 'Tu cintura empieza a ensancharse.',
|
|
48
|
+
partner: 'Acompáñala a la primera consulta del primer trimestre.',
|
|
49
|
+
symptoms: ['Hinchazón abdominal', 'Cambios bruscos de humor', 'Piel más sensible al sol'],
|
|
50
|
+
alerts: ['Pérdida de líquido claro', 'Calambres uterinos intensos', 'Fiebre sin causa aparente'],
|
|
51
|
+
wonder: 'Ya tiene su propio tipo de sangre, diferente al de su madre.'
|
|
52
|
+
},
|
|
53
|
+
12: {
|
|
54
|
+
analogies: { fruits: 'Ciruela', geek: 'Ratón inalámbrico', sweets: 'Mochi de fresa' },
|
|
55
|
+
size: '~55 mm',
|
|
56
|
+
biolook: 'Los órganos principales están formados. El bebé empieza a practicar movimientos de deglución.',
|
|
57
|
+
mom: 'El riesgo de aborto espontáneo cae drásticamente.',
|
|
58
|
+
partner: 'El segundo trimestre se acerca. El cansancio de ella mejorará pronto.',
|
|
59
|
+
symptoms: ['Reducción de las náuseas', 'Piel más luminosa o con manchas', 'Dolores de cabeza'],
|
|
60
|
+
alerts: ['Pérdida de líquido', 'Calambres fuertes', 'Fiebre persistente'],
|
|
61
|
+
wonder: 'Sus reflejos ya funcionan: si le tocas la palma de la mano, cierra el puño.'
|
|
62
|
+
},
|
|
63
|
+
16: {
|
|
64
|
+
analogies: { fruits: 'Aguacate', geek: 'Mando de PS5', sweets: 'Berlina de chocolate' },
|
|
65
|
+
size: '~12 cm',
|
|
66
|
+
biolook: 'Las orejas están en su posición final. El esqueleto de cartílago se convierte en hueso.',
|
|
67
|
+
mom: 'Muchas mamás sienten los primeros movimientos. La energía vuelve.',
|
|
68
|
+
partner: 'Puede que empiece a sentir pequeños movimientos.',
|
|
69
|
+
symptoms: ['Ardor de estómago leve', 'Congestión nasal', 'Sueños muy vividos'],
|
|
70
|
+
alerts: ['Ausencia total de movimientos fetales', 'Tensión alta', 'Sangrado vaginal'],
|
|
71
|
+
wonder: 'Si es niña, ya tiene 6 millones de óvulos en sus ovarios.'
|
|
72
|
+
},
|
|
73
|
+
20: {
|
|
74
|
+
analogies: { fruits: 'Plátano', geek: 'Consola de juegos portátil', sweets: 'Tarta de queso entera' },
|
|
75
|
+
size: '~25 cm',
|
|
76
|
+
biolook: 'El bebé ya oye tu voz con claridad. Se chupa el dedo.',
|
|
77
|
+
mom: 'Semana 20, ecuador. Es el momento de la ecografía morfológica.',
|
|
78
|
+
partner: 'Habla al bebé. Ya te oye.',
|
|
79
|
+
symptoms: ['Ardor de estómago frecuente', 'Hinchazón de pies al final del día', 'Picor en la piel del abdomen'],
|
|
80
|
+
alerts: ['Falta de movimientos fetales', 'Tensión arterial alta sostenida', 'Visión borrosa o con destellos'],
|
|
81
|
+
wonder: 'Sus huellas dactilares ya están completas y son únicas en el universo.'
|
|
82
|
+
},
|
|
83
|
+
24: {
|
|
84
|
+
analogies: { fruits: 'Mazorca de maíz', geek: 'Teclado mecánico', sweets: 'Donut gigante' },
|
|
85
|
+
size: '~30 cm',
|
|
86
|
+
biolook: 'Los pulmones producen surfactante. Los ojos empiezan a abrirse.',
|
|
87
|
+
mom: 'Tu útero llega al ombligo. La espalda puede empezar a resentirse.',
|
|
88
|
+
partner: 'Aprende los signos de parto pretérmino.',
|
|
89
|
+
symptoms: ['Dolor de espalda baja', 'Calambres en las piernas por la noche', 'Línea negra en el abdomen'],
|
|
90
|
+
alerts: ['Contracciones regulares antes de la semana 37', 'Pérdida de líquido amniótico', 'Sangrado vaginal'],
|
|
91
|
+
wonder: 'Si nace ahora, con cuidados intensivos, tiene posibilidades de sobrevivir.'
|
|
92
|
+
},
|
|
93
|
+
28: {
|
|
94
|
+
analogies: { fruits: 'Berenjena', geek: 'Tableta gráfica', sweets: 'Tarta de tres pisos' },
|
|
95
|
+
size: '~37 cm',
|
|
96
|
+
biolook: 'El bebé abre y cierra los ojos. Tiene ciclos de sueño y vigilia.',
|
|
97
|
+
mom: 'Empieza el tercer trimestre. La prueba de glucosa es ahora.',
|
|
98
|
+
partner: 'El insomnio puede agotarla. Acompáñala.',
|
|
99
|
+
symptoms: ['Insomnio y dificultad para encontrar postura', 'Hinchazón de manos y pies', 'Contracciones Braxton Hicks esporádicas'],
|
|
100
|
+
alerts: ['Reducción marcada de movimientos fetales', 'Dolor de cabeza intenso que no cede', 'Visión con luces o moscas'],
|
|
101
|
+
wonder: 'Ya tiene un sabor favorito.'
|
|
102
|
+
},
|
|
103
|
+
32: {
|
|
104
|
+
analogies: { fruits: 'Calabaza mediana', geek: 'Teclado de 60%', sweets: 'Caja de bombones entera' },
|
|
105
|
+
size: '~42 cm',
|
|
106
|
+
biolook: 'Practica la respiración. Sus pulmones están casi listos para el mundo exterior.',
|
|
107
|
+
mom: 'Recuperar el aliento es difícil. El bebé presiona el diafragma.',
|
|
108
|
+
partner: 'Prepara la bolsa del hospital.',
|
|
109
|
+
symptoms: ['Falta de aliento al esfuerzo mínimo', 'Hemorroides', 'Pérdida de orina al reír o toser'],
|
|
110
|
+
alerts: ['Picor intenso en palmas de manos y plantas de pies', 'Contracciones regulares', 'Dolor en boca del estómago con náuseas'],
|
|
111
|
+
wonder: 'Ya gira la cabeza hacia la luz que atraviesa la barriga de su madre.'
|
|
112
|
+
},
|
|
113
|
+
36: {
|
|
114
|
+
analogies: { fruits: 'Melón cantalupo', geek: 'Portátil de 15 pulgadas', sweets: 'Tarta de cumpleaños' },
|
|
115
|
+
size: '~47 cm',
|
|
116
|
+
biolook: 'El bebé suele encajarse cabeza abajo. Sus pulmones están casi maduros.',
|
|
117
|
+
mom: 'Sientes presión en la pelvis al encajarse el bebé.',
|
|
118
|
+
partner: 'El plan de parto debería estar listo.',
|
|
119
|
+
symptoms: ['Presión pélvica intensa', 'Vuelta del ardor de estómago', 'Ansiedad anticipatoria'],
|
|
120
|
+
alerts: ['Rotura de bolsa', 'Sangrado vaginal rojo', 'Ausencia de movimientos fetales'],
|
|
121
|
+
wonder: 'Ya tiene las uñas tan largas que podría arañarse al nacer.'
|
|
122
|
+
},
|
|
123
|
+
40: {
|
|
124
|
+
analogies: { fruits: 'Sandía', geek: 'PC de sobremesa completo', sweets: 'Tarta nupcial de 3 pisos' },
|
|
125
|
+
size: '~50 cm',
|
|
126
|
+
biolook: 'Todo está listo. Sus reflejos están coordinados, sus pulmones maduros, su cerebro activo.',
|
|
127
|
+
mom: 'El cansancio es máximo. Eres increíble.',
|
|
128
|
+
partner: 'Hoy puede que sea el día. Mantén el teléfono cargado y la calma que ella necesita de ti.',
|
|
129
|
+
symptoms: ['Presión pélvica muy intensa', 'Pérdida del tapón mucoso', 'Contracciones irregulares'],
|
|
130
|
+
alerts: ['Contracciones regulares cada 5 minutos durante 1 hora', 'Rotura de bolsa', 'Ausencia de movimientos'],
|
|
131
|
+
wonder: 'Su cerebro ha creado 100 mil millones de neuronas durante estos 9 meses.'
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
export const timelineLabels: Record<number, string> = {
|
|
136
|
+
4: 'Implantación', 5: 'Latido', 6: 'Corazón late', 7: 'Ojos y oídos',
|
|
137
|
+
8: 'Dedos', 9: 'Uñas', 10: 'Ya es feto', 11: 'Movimientos',
|
|
138
|
+
12: 'Triple Screening', 13: '2º Trimestre', 14: 'Cuello de útero', 15: 'Patadas',
|
|
139
|
+
16: 'Oye voces', 17: 'Grasa corporal', 18: 'Genitales visibles', 19: 'Vérnix',
|
|
140
|
+
20: 'Eco morfológica', 21: 'Huellas dactilares', 22: 'Labios formados', 23: 'Párpados',
|
|
141
|
+
24: 'Ojos se abren', 25: 'Capilares', 26: 'Reflejos', 27: 'Cerebro activo',
|
|
142
|
+
28: '3er Trimestre', 29: 'Huesos fuertes', 30: 'Médula ósea', 31: 'Surfactante',
|
|
143
|
+
32: 'Practica respirar', 33: 'Inmunidad', 34: 'Sistema nervioso', 35: 'Encajamiento',
|
|
144
|
+
36: 'Pulmones maduros', 37: 'A término', 38: 'Preparado', 39: 'Esperando', 40: 'Llegó el día'
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
export function getMilestone(week: number): Milestone {
|
|
148
|
+
const keys = Object.keys(milestones).map(Number).sort((a, b) => b - a);
|
|
149
|
+
for (const k of keys) {
|
|
150
|
+
if (week >= k) return milestones[k]!;
|
|
151
|
+
}
|
|
152
|
+
return milestones[4]!;
|
|
153
|
+
}
|
|
@@ -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 { pregnancyCalculator } from './index';
|
|
7
|
+
import type { KnownLocale } from '../../types';
|
|
8
|
+
|
|
9
|
+
interface Props { locale?: KnownLocale; }
|
|
10
|
+
const { locale = 'es' } = Astro.props;
|
|
11
|
+
const content = await pregnancyCalculator.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>
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { calculate, type CalcResult, type Method } from './calculator';
|
|
2
|
+
|
|
3
|
+
export type Category = 'fruits' | 'geek' | 'sweets';
|
|
4
|
+
|
|
5
|
+
export interface PCState {
|
|
6
|
+
method: Method;
|
|
7
|
+
date: string;
|
|
8
|
+
cycle: number;
|
|
9
|
+
partner: boolean;
|
|
10
|
+
analogyCat: Category;
|
|
11
|
+
result: CalcResult | null;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const LS_KEY = 'jjlmoya-babies-pregnancy-v1';
|
|
15
|
+
|
|
16
|
+
type Persisted = Pick<PCState, 'method' | 'date' | 'cycle' | 'partner' | 'analogyCat'>;
|
|
17
|
+
|
|
18
|
+
function loadFromStorage(): Partial<Persisted> {
|
|
19
|
+
try {
|
|
20
|
+
const raw = localStorage.getItem(LS_KEY);
|
|
21
|
+
return raw ? JSON.parse(raw) : {};
|
|
22
|
+
} catch { return {}; }
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function saveToStorage(s: PCState) {
|
|
26
|
+
try {
|
|
27
|
+
const p: Persisted = { method: s.method, date: s.date, cycle: s.cycle, partner: s.partner, analogyCat: s.analogyCat };
|
|
28
|
+
localStorage.setItem(LS_KEY, JSON.stringify(p));
|
|
29
|
+
} catch { }
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const saved = loadFromStorage();
|
|
33
|
+
|
|
34
|
+
const _state: PCState = {
|
|
35
|
+
method: saved.method ?? 'fur',
|
|
36
|
+
date: saved.date ?? '',
|
|
37
|
+
cycle: saved.cycle ?? 28,
|
|
38
|
+
partner: saved.partner ?? false,
|
|
39
|
+
analogyCat: saved.analogyCat ?? 'fruits',
|
|
40
|
+
result: null,
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
_state.result = calculate({ method: _state.method, date: _state.date, cycle: _state.cycle });
|
|
44
|
+
|
|
45
|
+
export function getState(): Readonly<PCState> {
|
|
46
|
+
return { ..._state };
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function setState(patch: Partial<Omit<PCState, 'result'>>) {
|
|
50
|
+
Object.assign(_state, patch);
|
|
51
|
+
_state.result = calculate({ method: _state.method, date: _state.date, cycle: _state.cycle });
|
|
52
|
+
saveToStorage(_state);
|
|
53
|
+
document.dispatchEvent(new CustomEvent('pc:update', { detail: getState() }));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function subscribe(handler: (s: Readonly<PCState>) => void): () => void {
|
|
57
|
+
const listener = (e: Event) => handler((e as CustomEvent<PCState>).detail);
|
|
58
|
+
document.addEventListener('pc:update', listener);
|
|
59
|
+
return () => document.removeEventListener('pc:update', listener);
|
|
60
|
+
}
|