@jjlmoya/utils-babies 1.2.0 → 1.4.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 +2 -2
- package/src/tool/baby-feeding-calculator/bibliography.astro +8 -4
- package/src/tool/baby-feeding-calculator/component.astro +208 -177
- package/src/tool/baby-feeding-calculator/style.css +317 -229
- package/src/tool/baby-percentile-calculator/bibliography.astro +8 -4
- package/src/tool/baby-percentile-calculator/component.astro +98 -240
- package/src/tool/baby-percentile-calculator/i18n/en.ts +1 -0
- package/src/tool/baby-percentile-calculator/i18n/es.ts +1 -0
- package/src/tool/baby-percentile-calculator/i18n/fr.ts +1 -0
- package/src/tool/baby-percentile-calculator/index.ts +1 -0
- package/src/tool/baby-percentile-calculator/style.css +342 -268
- package/src/tool/baby-size-converter/bibliography.astro +8 -4
- package/src/tool/baby-size-converter/component.astro +221 -212
- package/src/tool/baby-size-converter/style.css +433 -263
- package/src/tool/fertile-days-estimator/bibliography.astro +8 -4
- package/src/tool/fertile-days-estimator/component.astro +202 -200
- package/src/tool/fertile-days-estimator/style.css +408 -270
- package/src/tool/pregnancy-calculator/bibliography.astro +8 -4
- package/src/tool/pregnancy-calculator/component.astro +50 -8
- package/src/tool/pregnancy-calculator/i18n/en.ts +8 -0
- package/src/tool/pregnancy-calculator/i18n/es.ts +8 -0
- package/src/tool/pregnancy-calculator/i18n/fr.ts +8 -0
- package/src/tool/pregnancy-calculator/index.ts +8 -0
- package/src/tool/pregnancy-calculator/style.css +351 -134
- package/src/tool/vaccination-calendar/bibliography.astro +8 -4
- package/src/tool/vaccination-calendar/component.astro +120 -124
- package/src/tool/vaccination-calendar/style.css +296 -209
|
@@ -4,138 +4,92 @@ import type { BabyPercentileCalculatorUI } from './index';
|
|
|
4
4
|
interface Props { ui: BabyPercentileCalculatorUI; }
|
|
5
5
|
const { ui } = Astro.props;
|
|
6
6
|
---
|
|
7
|
-
<div id="
|
|
8
|
-
<div class="
|
|
9
|
-
<div class="
|
|
10
|
-
<span class="
|
|
11
|
-
|
|
12
|
-
<div class="
|
|
13
|
-
<label class="
|
|
14
|
-
<div class="
|
|
15
|
-
<button
|
|
16
|
-
|
|
17
|
-
class="baby-percentile-calculator-sex-btn"
|
|
18
|
-
data-sex="boy"
|
|
19
|
-
data-active="true"
|
|
20
|
-
type="button"
|
|
21
|
-
>{ui.sexBoy}</button>
|
|
22
|
-
<button
|
|
23
|
-
id="bpc-btn-girl"
|
|
24
|
-
class="baby-percentile-calculator-sex-btn"
|
|
25
|
-
data-sex="girl"
|
|
26
|
-
data-active="false"
|
|
27
|
-
type="button"
|
|
28
|
-
>{ui.sexGirl}</button>
|
|
7
|
+
<div id="bpc-root" class="bpc-card" data-ui={JSON.stringify(ui)}>
|
|
8
|
+
<div class="bpc-main">
|
|
9
|
+
<div class="bpc-left">
|
|
10
|
+
<span class="bpc-section-marker">{ui.labelMeasurements}</span>
|
|
11
|
+
|
|
12
|
+
<div class="bpc-input-group">
|
|
13
|
+
<label class="bpc-input-label">{ui.labelSex}</label>
|
|
14
|
+
<div class="bpc-sex-selector">
|
|
15
|
+
<button id="bpc-btn-boy" class="bpc-sex-btn bpc-active" data-sex="boy" type="button">{ui.sexBoy}</button>
|
|
16
|
+
<button id="bpc-btn-girl" class="bpc-sex-btn" data-sex="girl" type="button">{ui.sexGirl}</button>
|
|
29
17
|
</div>
|
|
30
18
|
</div>
|
|
31
19
|
|
|
32
|
-
<div class="
|
|
33
|
-
<div class="
|
|
34
|
-
<button
|
|
35
|
-
|
|
36
|
-
class="baby-percentile-calculator-unit-tab"
|
|
37
|
-
data-unit="months"
|
|
38
|
-
data-active="true"
|
|
39
|
-
type="button"
|
|
40
|
-
>{ui.unitMonths}</button>
|
|
41
|
-
<button
|
|
42
|
-
id="bpc-unit-years"
|
|
43
|
-
class="baby-percentile-calculator-unit-tab"
|
|
44
|
-
data-unit="yearsMonths"
|
|
45
|
-
data-active="false"
|
|
46
|
-
type="button"
|
|
47
|
-
>{ui.unitYearsMonths}</button>
|
|
20
|
+
<div class="bpc-input-group">
|
|
21
|
+
<div class="bpc-unit-nav">
|
|
22
|
+
<button id="bpc-unit-months" class="bpc-unit-tab bpc-active" data-unit="months" type="button">{ui.unitMonths}</button>
|
|
23
|
+
<button id="bpc-unit-years" class="bpc-unit-tab" data-unit="yearsMonths" type="button">{ui.unitYearsMonths}</button>
|
|
48
24
|
</div>
|
|
49
25
|
</div>
|
|
50
26
|
|
|
51
|
-
<div class="
|
|
52
|
-
<div class="
|
|
53
|
-
<button id="bpc-step-minus-years" class="
|
|
54
|
-
<div id="bpc-years-view" class="
|
|
55
|
-
<span id="bpc-years-val" class="
|
|
56
|
-
<span class="
|
|
27
|
+
<div class="bpc-input-group">
|
|
28
|
+
<div class="bpc-stepper-box">
|
|
29
|
+
<button id="bpc-step-minus-years" class="bpc-btn-step" type="button" style="display:none">-</button>
|
|
30
|
+
<div id="bpc-years-view" class="bpc-val-view" style="display:none">
|
|
31
|
+
<span id="bpc-years-val" class="bpc-val-big">0</span>
|
|
32
|
+
<span class="bpc-val-sub">{ui.labelYears}</span>
|
|
57
33
|
</div>
|
|
58
|
-
<button id="bpc-step-plus-years" class="
|
|
34
|
+
<button id="bpc-step-plus-years" class="bpc-btn-step" type="button" style="display:none">+</button>
|
|
59
35
|
|
|
60
|
-
<button id="bpc-step-minus" class="
|
|
61
|
-
<div class="
|
|
62
|
-
<span id="bpc-age-val" class="
|
|
63
|
-
<span class="
|
|
36
|
+
<button id="bpc-step-minus" class="bpc-btn-step" type="button">-</button>
|
|
37
|
+
<div class="bpc-val-view">
|
|
38
|
+
<span id="bpc-age-val" class="bpc-val-big">0</span>
|
|
39
|
+
<span class="bpc-val-sub">{ui.labelMonths}</span>
|
|
64
40
|
</div>
|
|
65
|
-
<button id="bpc-step-plus" class="
|
|
41
|
+
<button id="bpc-step-plus" class="bpc-btn-step" type="button">+</button>
|
|
42
|
+
</div>
|
|
43
|
+
<div style="padding: 0 11px;">
|
|
44
|
+
<input id="bpc-slider" class="bpc-slider" type="range" min="0" max="60" value="0" step="1" />
|
|
66
45
|
</div>
|
|
67
|
-
<input
|
|
68
|
-
id="bpc-slider"
|
|
69
|
-
class="baby-percentile-calculator-slider-line"
|
|
70
|
-
type="range"
|
|
71
|
-
min="0"
|
|
72
|
-
max="60"
|
|
73
|
-
value="0"
|
|
74
|
-
step="1"
|
|
75
|
-
/>
|
|
76
46
|
</div>
|
|
77
47
|
|
|
78
|
-
<div class="
|
|
79
|
-
<div class="
|
|
80
|
-
<label for="bpc-weight" class="
|
|
81
|
-
<input
|
|
82
|
-
id="bpc-weight"
|
|
83
|
-
class="baby-percentile-calculator-num-input"
|
|
84
|
-
type="number"
|
|
85
|
-
min="1"
|
|
86
|
-
max="30"
|
|
87
|
-
step="0.1"
|
|
88
|
-
placeholder="3.5"
|
|
89
|
-
/>
|
|
48
|
+
<div class="bpc-grid-2">
|
|
49
|
+
<div class="bpc-input-group">
|
|
50
|
+
<label for="bpc-weight" class="bpc-input-label">{ui.labelWeight}</label>
|
|
51
|
+
<input id="bpc-weight" class="bpc-num-input" type="number" min="1" max="30" step="0.1" placeholder="3.5" />
|
|
90
52
|
</div>
|
|
91
|
-
<div class="
|
|
92
|
-
<label for="bpc-height" class="
|
|
93
|
-
<input
|
|
94
|
-
id="bpc-height"
|
|
95
|
-
class="baby-percentile-calculator-num-input"
|
|
96
|
-
type="number"
|
|
97
|
-
min="30"
|
|
98
|
-
max="130"
|
|
99
|
-
step="0.1"
|
|
100
|
-
placeholder="50"
|
|
101
|
-
/>
|
|
53
|
+
<div class="bpc-input-group">
|
|
54
|
+
<label for="bpc-height" class="bpc-input-label">{ui.labelHeight}</label>
|
|
55
|
+
<input id="bpc-height" class="bpc-num-input" type="number" min="30" max="130" step="0.1" placeholder="50" />
|
|
102
56
|
</div>
|
|
103
57
|
</div>
|
|
104
58
|
|
|
105
|
-
<div class="
|
|
106
|
-
<button id="bpc-btn-save" class="
|
|
107
|
-
<button id="bpc-btn-clear" class="
|
|
59
|
+
<div class="bpc-history-actions">
|
|
60
|
+
<button id="bpc-btn-save" class="bpc-btn-secondary" type="button">{ui.btnAddHistory}</button>
|
|
61
|
+
<button id="bpc-btn-clear" class="bpc-btn-clear" type="button">{ui.btnClearHistory}</button>
|
|
108
62
|
</div>
|
|
109
63
|
</div>
|
|
110
64
|
|
|
111
|
-
<div class="
|
|
112
|
-
<span class="
|
|
65
|
+
<div class="bpc-right">
|
|
66
|
+
<span class="bpc-section-marker">{ui.labelDashboard}</span>
|
|
113
67
|
|
|
114
|
-
<div class="
|
|
115
|
-
<div class="
|
|
116
|
-
<span class="
|
|
117
|
-
<span id="bpc-res-weight" class="
|
|
118
|
-
<span id="bpc-res-weight-desc" class="
|
|
68
|
+
<div class="bpc-res-grid">
|
|
69
|
+
<div class="bpc-res-item">
|
|
70
|
+
<span class="bpc-res-title">{ui.labelWeight2}</span>
|
|
71
|
+
<span id="bpc-res-weight" class="bpc-percent-val">—</span>
|
|
72
|
+
<span id="bpc-res-weight-desc" class="bpc-res-desc">{ui.labelCalculating}</span>
|
|
119
73
|
</div>
|
|
120
|
-
<div class="
|
|
121
|
-
<span class="
|
|
122
|
-
<span id="bpc-res-height" class="
|
|
123
|
-
<span id="bpc-res-height-desc" class="
|
|
74
|
+
<div class="bpc-res-item">
|
|
75
|
+
<span class="bpc-res-title">{ui.labelHeight2}</span>
|
|
76
|
+
<span id="bpc-res-height" class="bpc-percent-val">—</span>
|
|
77
|
+
<span id="bpc-res-height-desc" class="bpc-res-desc">{ui.labelCalculating}</span>
|
|
124
78
|
</div>
|
|
125
|
-
<div class="
|
|
126
|
-
<span class="
|
|
127
|
-
<span id="bpc-res-bmi" class="
|
|
128
|
-
<span id="bpc-res-bmi-desc" class="
|
|
79
|
+
<div class="bpc-res-item">
|
|
80
|
+
<span class="bpc-res-title">{ui.labelBMI}</span>
|
|
81
|
+
<span id="bpc-res-bmi" class="bpc-percent-val">—</span>
|
|
82
|
+
<span id="bpc-res-bmi-desc" class="bpc-res-desc">{ui.labelCalculating}</span>
|
|
129
83
|
</div>
|
|
130
84
|
</div>
|
|
131
85
|
|
|
132
|
-
<div id="bpc-alert" class="
|
|
86
|
+
<div id="bpc-alert" class="bpc-alert-msg bpc-hidden">{ui.alertOutOfRange}</div>
|
|
133
87
|
|
|
134
|
-
<div class="
|
|
88
|
+
<div class="bpc-chart-box">
|
|
135
89
|
<canvas id="bpc-chart"></canvas>
|
|
136
90
|
</div>
|
|
137
91
|
|
|
138
|
-
<p class="
|
|
92
|
+
<p class="bpc-disclaimer">{ui.disclaimer}</p>
|
|
139
93
|
</div>
|
|
140
94
|
</div>
|
|
141
95
|
</div>
|
|
@@ -144,45 +98,18 @@ const { ui } = Astro.props;
|
|
|
144
98
|
import { calculatePercentile, getDescriptionKey, getDataSet, calcBMI, buildChartDatasets } from './logic';
|
|
145
99
|
import { interpolateLMS } from './lmsData';
|
|
146
100
|
|
|
147
|
-
const root = document.getElementById('
|
|
101
|
+
const root = document.getElementById('bpc-root') as HTMLElement;
|
|
148
102
|
const ui = JSON.parse(root.dataset.ui as string) as Record<string, string>;
|
|
149
103
|
|
|
150
|
-
interface HistoryEntry {
|
|
151
|
-
|
|
152
|
-
age: number;
|
|
153
|
-
weight: number;
|
|
154
|
-
height: number;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
interface State {
|
|
158
|
-
sex: string;
|
|
159
|
-
age: number;
|
|
160
|
-
ageUnit: string;
|
|
161
|
-
weight: number;
|
|
162
|
-
height: number;
|
|
163
|
-
history: HistoryEntry[];
|
|
164
|
-
}
|
|
104
|
+
interface HistoryEntry { sex: string; age: number; weight: number; height: number; }
|
|
105
|
+
interface State { sex: string; age: number; ageUnit: string; weight: number; height: number; history: HistoryEntry[]; }
|
|
165
106
|
|
|
166
107
|
const LS_KEY = 'jjlmoya-babies-percentile';
|
|
167
|
-
|
|
168
|
-
const state: State = {
|
|
169
|
-
sex: 'boy',
|
|
170
|
-
age: 0,
|
|
171
|
-
ageUnit: 'months',
|
|
172
|
-
weight: 0,
|
|
173
|
-
height: 0,
|
|
174
|
-
history: [],
|
|
175
|
-
};
|
|
176
|
-
|
|
108
|
+
const state: State = { sex: 'boy', age: 0, ageUnit: 'months', weight: 0, height: 0, history: [] };
|
|
177
109
|
let chartInstance: { destroy: () => void; data: { datasets: object[] }; update: () => void } | null = null;
|
|
178
110
|
|
|
179
|
-
function getEl(id: string): HTMLElement {
|
|
180
|
-
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
function getInput(id: string): HTMLInputElement {
|
|
184
|
-
return document.getElementById(id) as HTMLInputElement;
|
|
185
|
-
}
|
|
111
|
+
function getEl(id: string): HTMLElement { return document.getElementById(id) as HTMLElement; }
|
|
112
|
+
function getInput(id: string): HTMLInputElement { return document.getElementById(id) as HTMLInputElement; }
|
|
186
113
|
|
|
187
114
|
function renderPercentiles(): void {
|
|
188
115
|
const dataSet = getDataSet(state.sex);
|
|
@@ -198,10 +125,10 @@ const { ui } = Astro.props;
|
|
|
198
125
|
resWeight.textContent = '—';
|
|
199
126
|
resHeight.textContent = '—';
|
|
200
127
|
resBmi.textContent = '—';
|
|
201
|
-
resWeightDesc.textContent = ui['labelCalculating'] ??
|
|
202
|
-
resHeightDesc.textContent = ui['labelCalculating'] ??
|
|
203
|
-
resBmiDesc.textContent = ui['labelCalculating'] ??
|
|
204
|
-
alertEl.
|
|
128
|
+
resWeightDesc.textContent = ui['labelCalculating'] ?? '';
|
|
129
|
+
resHeightDesc.textContent = ui['labelCalculating'] ?? '';
|
|
130
|
+
resBmiDesc.textContent = ui['labelCalculating'] ?? '';
|
|
131
|
+
alertEl.classList.add('bpc-hidden');
|
|
205
132
|
return;
|
|
206
133
|
}
|
|
207
134
|
|
|
@@ -221,12 +148,8 @@ const { ui } = Astro.props;
|
|
|
221
148
|
resHeightDesc.textContent = ui[getDescriptionKey(pH)] ?? '';
|
|
222
149
|
resBmiDesc.textContent = ui[getDescriptionKey(pBmi)] ?? '';
|
|
223
150
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
alertEl.setAttribute('data-visible', 'true');
|
|
227
|
-
} else {
|
|
228
|
-
alertEl.removeAttribute('data-visible');
|
|
229
|
-
}
|
|
151
|
+
if (pW < 3 || pW > 97 || pH < 3 || pH > 97) alertEl.classList.remove('bpc-hidden');
|
|
152
|
+
else alertEl.classList.add('bpc-hidden');
|
|
230
153
|
}
|
|
231
154
|
|
|
232
155
|
async function initChart(): Promise<void> {
|
|
@@ -240,10 +163,7 @@ const { ui } = Astro.props;
|
|
|
240
163
|
responsive: true,
|
|
241
164
|
maintainAspectRatio: true,
|
|
242
165
|
plugins: { legend: { display: false } },
|
|
243
|
-
scales: {
|
|
244
|
-
x: { type: 'linear', min: 0, max: 60 },
|
|
245
|
-
y: { type: 'linear' },
|
|
246
|
-
},
|
|
166
|
+
scales: { x: { type: 'linear', min: 0, max: 60 }, y: { type: 'linear' } },
|
|
247
167
|
},
|
|
248
168
|
});
|
|
249
169
|
}
|
|
@@ -257,8 +177,7 @@ const { ui } = Astro.props;
|
|
|
257
177
|
function syncAgeDisplay(): void {
|
|
258
178
|
const slider = getInput('bpc-slider');
|
|
259
179
|
slider.value = String(state.age);
|
|
260
|
-
getEl('bpc-age-val').textContent = String(state.age % 12);
|
|
261
|
-
|
|
180
|
+
getEl('bpc-age-val').textContent = String(state.ageUnit === 'yearsMonths' ? state.age % 12 : state.age);
|
|
262
181
|
if (state.ageUnit === 'yearsMonths') {
|
|
263
182
|
getEl('bpc-years-val').textContent = String(Math.floor(state.age / 12));
|
|
264
183
|
}
|
|
@@ -273,116 +192,55 @@ const { ui } = Astro.props;
|
|
|
273
192
|
|
|
274
193
|
function setSex(sex: string): void {
|
|
275
194
|
state.sex = sex;
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
btnGirl.setAttribute('data-active', sex === 'girl' ? 'true' : 'false');
|
|
280
|
-
|
|
281
|
-
if (sex === 'boy') {
|
|
282
|
-
root.classList.add('baby-percentile-calculator-boy');
|
|
283
|
-
} else {
|
|
284
|
-
root.classList.remove('baby-percentile-calculator-boy');
|
|
285
|
-
}
|
|
286
|
-
|
|
195
|
+
getEl('bpc-btn-boy').classList.toggle('bpc-active', sex === 'boy');
|
|
196
|
+
getEl('bpc-btn-girl').classList.toggle('bpc-active', sex === 'girl');
|
|
197
|
+
root.classList.toggle('bpc-boy', sex === 'boy');
|
|
287
198
|
renderPercentiles();
|
|
288
199
|
updateChart();
|
|
289
200
|
}
|
|
290
201
|
|
|
291
202
|
function setUnit(unit: string): void {
|
|
292
203
|
state.ageUnit = unit;
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
const yearsControls = [
|
|
299
|
-
getEl('bpc-step-minus-years'),
|
|
300
|
-
getEl('bpc-step-plus-years'),
|
|
301
|
-
getEl('bpc-years-view'),
|
|
302
|
-
];
|
|
303
|
-
|
|
304
|
-
yearsControls.forEach(el => {
|
|
305
|
-
if (unit === 'yearsMonths') {
|
|
306
|
-
el.style.display = '';
|
|
307
|
-
} else {
|
|
308
|
-
el.style.display = 'none';
|
|
309
|
-
}
|
|
310
|
-
});
|
|
311
|
-
|
|
312
|
-
const monthLabel = getEl('bpc-age-val').nextElementSibling as HTMLElement;
|
|
313
|
-
if (monthLabel) {
|
|
314
|
-
monthLabel.textContent = (unit === 'yearsMonths' ? ui['labelMonths'] : ui['labelMonths']) ?? null;
|
|
315
|
-
}
|
|
316
|
-
|
|
204
|
+
getEl('bpc-unit-months').classList.toggle('bpc-active', unit === 'months');
|
|
205
|
+
getEl('bpc-unit-years').classList.toggle('bpc-active', unit === 'yearsMonths');
|
|
206
|
+
const yearsControls = [getEl('bpc-step-minus-years'), getEl('bpc-step-plus-years'), getEl('bpc-years-view')];
|
|
207
|
+
yearsControls.forEach(el => { el.style.display = unit === 'yearsMonths' ? '' : 'none'; });
|
|
317
208
|
syncAgeDisplay();
|
|
318
209
|
}
|
|
319
210
|
|
|
320
211
|
function loadHistory(): void {
|
|
321
212
|
try {
|
|
322
213
|
const raw = localStorage.getItem(LS_KEY);
|
|
323
|
-
if (raw) {
|
|
324
|
-
|
|
325
|
-
state.history = Array.isArray(parsed) ? parsed : [];
|
|
326
|
-
}
|
|
327
|
-
} catch {
|
|
328
|
-
state.history = [];
|
|
329
|
-
}
|
|
214
|
+
if (raw) { const parsed = JSON.parse(raw) as HistoryEntry[]; state.history = Array.isArray(parsed) ? parsed : []; }
|
|
215
|
+
} catch { state.history = []; }
|
|
330
216
|
renderPercentiles();
|
|
331
217
|
}
|
|
332
218
|
|
|
333
219
|
function save(): void {
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
age: state.age,
|
|
337
|
-
weight: state.weight,
|
|
338
|
-
height: state.height,
|
|
339
|
-
};
|
|
340
|
-
state.history.push(entry);
|
|
341
|
-
try {
|
|
342
|
-
localStorage.setItem(LS_KEY, JSON.stringify(state.history));
|
|
343
|
-
} catch { }
|
|
220
|
+
state.history.push({ sex: state.sex, age: state.age, weight: state.weight, height: state.height });
|
|
221
|
+
try { localStorage.setItem(LS_KEY, JSON.stringify(state.history)); } catch { }
|
|
344
222
|
}
|
|
345
223
|
|
|
346
224
|
function clearHistory(): void {
|
|
347
225
|
state.history = [];
|
|
348
|
-
try {
|
|
349
|
-
localStorage.removeItem(LS_KEY);
|
|
350
|
-
} catch { }
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
function bindEvents(): void {
|
|
354
|
-
getEl('bpc-btn-boy').addEventListener('click', () => setSex('boy'));
|
|
355
|
-
getEl('bpc-btn-girl').addEventListener('click', () => setSex('girl'));
|
|
356
|
-
|
|
357
|
-
getEl('bpc-unit-months').addEventListener('click', () => setUnit('months'));
|
|
358
|
-
getEl('bpc-unit-years').addEventListener('click', () => setUnit('yearsMonths'));
|
|
359
|
-
|
|
360
|
-
getEl('bpc-step-minus').addEventListener('click', () => setAge(state.age - 1));
|
|
361
|
-
getEl('bpc-step-plus').addEventListener('click', () => setAge(state.age + 1));
|
|
362
|
-
|
|
363
|
-
getEl('bpc-step-minus-years').addEventListener('click', () => setAge(state.age - 12));
|
|
364
|
-
getEl('bpc-step-plus-years').addEventListener('click', () => setAge(state.age + 12));
|
|
365
|
-
|
|
366
|
-
getInput('bpc-slider').addEventListener('input', (e) => {
|
|
367
|
-
const val = parseInt((e.target as HTMLInputElement).value, 10);
|
|
368
|
-
setAge(val);
|
|
369
|
-
});
|
|
370
|
-
|
|
371
|
-
getInput('bpc-weight').addEventListener('input', (e) => {
|
|
372
|
-
state.weight = parseFloat((e.target as HTMLInputElement).value) || 0;
|
|
373
|
-
renderPercentiles();
|
|
374
|
-
});
|
|
375
|
-
|
|
376
|
-
getInput('bpc-height').addEventListener('input', (e) => {
|
|
377
|
-
state.height = parseFloat((e.target as HTMLInputElement).value) || 0;
|
|
378
|
-
renderPercentiles();
|
|
379
|
-
});
|
|
380
|
-
|
|
381
|
-
getEl('bpc-btn-save').addEventListener('click', () => save());
|
|
382
|
-
getEl('bpc-btn-clear').addEventListener('click', () => clearHistory());
|
|
226
|
+
try { localStorage.removeItem(LS_KEY); } catch { }
|
|
383
227
|
}
|
|
384
228
|
|
|
229
|
+
getEl('bpc-btn-boy').addEventListener('click', () => setSex('boy'));
|
|
230
|
+
getEl('bpc-btn-girl').addEventListener('click', () => setSex('girl'));
|
|
231
|
+
getEl('bpc-unit-months').addEventListener('click', () => setUnit('months'));
|
|
232
|
+
getEl('bpc-unit-years').addEventListener('click', () => setUnit('yearsMonths'));
|
|
233
|
+
getEl('bpc-step-minus').addEventListener('click', () => setAge(state.age - 1));
|
|
234
|
+
getEl('bpc-step-plus').addEventListener('click', () => setAge(state.age + 1));
|
|
235
|
+
getEl('bpc-step-minus-years').addEventListener('click', () => setAge(state.age - 12));
|
|
236
|
+
getEl('bpc-step-plus-years').addEventListener('click', () => setAge(state.age + 12));
|
|
237
|
+
getInput('bpc-slider').addEventListener('input', (e) => setAge(parseInt((e.target as HTMLInputElement).value, 10)));
|
|
238
|
+
getInput('bpc-weight').addEventListener('input', (e) => { state.weight = parseFloat((e.target as HTMLInputElement).value) || 0; renderPercentiles(); });
|
|
239
|
+
getInput('bpc-height').addEventListener('input', (e) => { state.height = parseFloat((e.target as HTMLInputElement).value) || 0; renderPercentiles(); });
|
|
240
|
+
getEl('bpc-btn-save').addEventListener('click', () => save());
|
|
241
|
+
getEl('bpc-btn-clear').addEventListener('click', () => clearHistory());
|
|
242
|
+
|
|
243
|
+
setSex('boy');
|
|
385
244
|
loadHistory();
|
|
386
|
-
bindEvents();
|
|
387
245
|
initChart();
|
|
388
246
|
</script>
|
|
@@ -106,6 +106,7 @@ export const content: BabyPercentileCalculatorLocaleContent = {
|
|
|
106
106
|
labelHighRange: 'High range',
|
|
107
107
|
alertOutOfRange: 'Value outside P3-P97 range. Please consult your pediatrician.',
|
|
108
108
|
labelMonths: 'Months',
|
|
109
|
+
labelYears: 'Years',
|
|
109
110
|
faqTitle: 'Frequently asked questions',
|
|
110
111
|
bibliographyTitle: 'References',
|
|
111
112
|
},
|
|
@@ -106,6 +106,7 @@ export const content: BabyPercentileCalculatorLocaleContent = {
|
|
|
106
106
|
labelHighRange: 'Rango alto',
|
|
107
107
|
alertOutOfRange: 'Valor fuera de los rangos P3-P97. Consulta con tu pediatra.',
|
|
108
108
|
labelMonths: 'Meses',
|
|
109
|
+
labelYears: 'Años',
|
|
109
110
|
faqTitle: 'Preguntas frecuentes',
|
|
110
111
|
bibliographyTitle: 'Referencias',
|
|
111
112
|
},
|
|
@@ -106,6 +106,7 @@ export const content: BabyPercentileCalculatorLocaleContent = {
|
|
|
106
106
|
labelHighRange: 'Plage haute',
|
|
107
107
|
alertOutOfRange: 'Valeur hors des plages P3-P97. Consultez votre pédiatre.',
|
|
108
108
|
labelMonths: 'Mois',
|
|
109
|
+
labelYears: 'Années',
|
|
109
110
|
faqTitle: 'Questions fréquentes',
|
|
110
111
|
bibliographyTitle: 'Références',
|
|
111
112
|
},
|