@jjlmoya/utils-health 1.26.0 → 1.28.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 (55) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +3 -1
  3. package/src/entries.ts +5 -1
  4. package/src/index.ts +2 -0
  5. package/src/tests/locale_completeness.test.ts +1 -1
  6. package/src/tests/tool_validation.test.ts +2 -2
  7. package/src/tool/correctedReticulocyteIndex/bibliography.astro +14 -0
  8. package/src/tool/correctedReticulocyteIndex/bibliography.ts +20 -0
  9. package/src/tool/correctedReticulocyteIndex/component.astro +262 -0
  10. package/src/tool/correctedReticulocyteIndex/corrected-reticulocyte-index-calculator.css +419 -0
  11. package/src/tool/correctedReticulocyteIndex/entry.ts +27 -0
  12. package/src/tool/correctedReticulocyteIndex/i18n/de.ts +349 -0
  13. package/src/tool/correctedReticulocyteIndex/i18n/en.ts +349 -0
  14. package/src/tool/correctedReticulocyteIndex/i18n/es.ts +349 -0
  15. package/src/tool/correctedReticulocyteIndex/i18n/fr.ts +349 -0
  16. package/src/tool/correctedReticulocyteIndex/i18n/id.ts +349 -0
  17. package/src/tool/correctedReticulocyteIndex/i18n/it.ts +349 -0
  18. package/src/tool/correctedReticulocyteIndex/i18n/ja.ts +349 -0
  19. package/src/tool/correctedReticulocyteIndex/i18n/ko.ts +349 -0
  20. package/src/tool/correctedReticulocyteIndex/i18n/nl.ts +349 -0
  21. package/src/tool/correctedReticulocyteIndex/i18n/pl.ts +349 -0
  22. package/src/tool/correctedReticulocyteIndex/i18n/pt.ts +349 -0
  23. package/src/tool/correctedReticulocyteIndex/i18n/ru.ts +349 -0
  24. package/src/tool/correctedReticulocyteIndex/i18n/sv.ts +349 -0
  25. package/src/tool/correctedReticulocyteIndex/i18n/tr.ts +349 -0
  26. package/src/tool/correctedReticulocyteIndex/i18n/zh.ts +349 -0
  27. package/src/tool/correctedReticulocyteIndex/index.ts +12 -0
  28. package/src/tool/correctedReticulocyteIndex/logic.ts +45 -0
  29. package/src/tool/correctedReticulocyteIndex/seo.astro +15 -0
  30. package/src/tool/correctedReticulocyteIndex/ui.ts +38 -0
  31. package/src/tool/serumOsmolalityCalculator/bibliography.astro +14 -0
  32. package/src/tool/serumOsmolalityCalculator/bibliography.ts +24 -0
  33. package/src/tool/serumOsmolalityCalculator/component.astro +269 -0
  34. package/src/tool/serumOsmolalityCalculator/entry.ts +27 -0
  35. package/src/tool/serumOsmolalityCalculator/i18n/de.ts +292 -0
  36. package/src/tool/serumOsmolalityCalculator/i18n/en.ts +292 -0
  37. package/src/tool/serumOsmolalityCalculator/i18n/es.ts +292 -0
  38. package/src/tool/serumOsmolalityCalculator/i18n/fr.ts +292 -0
  39. package/src/tool/serumOsmolalityCalculator/i18n/id.ts +292 -0
  40. package/src/tool/serumOsmolalityCalculator/i18n/it.ts +292 -0
  41. package/src/tool/serumOsmolalityCalculator/i18n/ja.ts +292 -0
  42. package/src/tool/serumOsmolalityCalculator/i18n/ko.ts +292 -0
  43. package/src/tool/serumOsmolalityCalculator/i18n/nl.ts +292 -0
  44. package/src/tool/serumOsmolalityCalculator/i18n/pl.ts +292 -0
  45. package/src/tool/serumOsmolalityCalculator/i18n/pt.ts +292 -0
  46. package/src/tool/serumOsmolalityCalculator/i18n/ru.ts +292 -0
  47. package/src/tool/serumOsmolalityCalculator/i18n/sv.ts +292 -0
  48. package/src/tool/serumOsmolalityCalculator/i18n/tr.ts +292 -0
  49. package/src/tool/serumOsmolalityCalculator/i18n/zh.ts +292 -0
  50. package/src/tool/serumOsmolalityCalculator/index.ts +12 -0
  51. package/src/tool/serumOsmolalityCalculator/logic.ts +57 -0
  52. package/src/tool/serumOsmolalityCalculator/seo.astro +15 -0
  53. package/src/tool/serumOsmolalityCalculator/serum-osmolality-calculator.css +476 -0
  54. package/src/tool/serumOsmolalityCalculator/ui.ts +37 -0
  55. package/src/tools.ts +3 -1
@@ -0,0 +1,419 @@
1
+ .rpi {
2
+ --rpi-bg: #fbfaf8;
3
+ --rpi-panel: #fff;
4
+ --rpi-panel-2: #f6f1ef;
5
+ --rpi-ink: #22191b;
6
+ --rpi-muted: #76676b;
7
+ --rpi-line: #e3d8d5;
8
+ --rpi-input: #fff;
9
+ --rpi-red: #b9232f;
10
+ --rpi-red-dark: #841721;
11
+ --rpi-yellow: #b76a14;
12
+ --rpi-green: #17764a;
13
+ --rpi-amber-bg: #fff8e7;
14
+ --rpi-amber-ink: #733b08;
15
+ --rpi-shadow: rgba(77, 37, 42, 0.14);
16
+
17
+ width: 100%;
18
+ overflow: hidden;
19
+ border: 1px solid var(--rpi-line);
20
+ border-radius: 8px;
21
+ background: var(--rpi-bg);
22
+ color: var(--rpi-ink);
23
+ box-shadow: 0 20px 50px var(--rpi-shadow);
24
+ }
25
+
26
+ .theme-dark .rpi {
27
+ --rpi-bg: #100d10;
28
+ --rpi-panel: #191317;
29
+ --rpi-panel-2: #22171b;
30
+ --rpi-ink: #fff7f7;
31
+ --rpi-muted: #d0bcc0;
32
+ --rpi-line: #3d2a30;
33
+ --rpi-input: #0d090c;
34
+ --rpi-red: #f05252;
35
+ --rpi-red-dark: #9b1c1c;
36
+ --rpi-yellow: #f59e0b;
37
+ --rpi-green: #22c55e;
38
+ --rpi-amber-bg: #241706;
39
+ --rpi-amber-ink: #f8d67a;
40
+ --rpi-shadow: rgba(0, 0, 0, 0.36);
41
+ }
42
+
43
+ .rpi__warning {
44
+ display: grid;
45
+ grid-template-columns: 1.8rem 1fr;
46
+ gap: 0.85rem;
47
+ padding: 1rem clamp(1rem, 3vw, 1.35rem);
48
+ border-bottom: 1px solid color-mix(in srgb, var(--rpi-yellow) 54%, var(--rpi-line));
49
+ background:
50
+ linear-gradient(90deg, color-mix(in srgb, var(--rpi-yellow) 12%, transparent), transparent 54%),
51
+ var(--rpi-amber-bg);
52
+ color: var(--rpi-amber-ink);
53
+ }
54
+
55
+ .rpi__warning-icon {
56
+ width: 1.8rem;
57
+ height: 1.8rem;
58
+ margin-top: 0.1rem;
59
+ }
60
+
61
+ .rpi__warning strong {
62
+ display: block;
63
+ margin-bottom: 0.28rem;
64
+ font-size: 0.83rem;
65
+ font-weight: 950;
66
+ letter-spacing: 0.05em;
67
+ text-transform: uppercase;
68
+ }
69
+
70
+ .rpi__warning span {
71
+ display: block;
72
+ max-width: 92ch;
73
+ font-size: 0.86rem;
74
+ font-weight: 650;
75
+ line-height: 1.5;
76
+ }
77
+
78
+ .rpi__report {
79
+ display: grid;
80
+ background: var(--rpi-panel-2);
81
+ }
82
+
83
+ .rpi__inputs {
84
+ display: grid;
85
+ gap: 0.75rem;
86
+ padding: clamp(0.85rem, 2.4vw, 1.15rem);
87
+ background:
88
+ linear-gradient(180deg, color-mix(in srgb, var(--rpi-red) 5%, transparent), transparent),
89
+ var(--rpi-panel-2);
90
+ }
91
+
92
+ .rpi__field {
93
+ display: grid;
94
+ gap: 0.65rem;
95
+ padding: 0.9rem;
96
+ border: 1px solid var(--rpi-line);
97
+ border-radius: 8px;
98
+ background: var(--rpi-panel);
99
+ }
100
+
101
+ .rpi__field span {
102
+ color: var(--rpi-muted);
103
+ font-size: 0.72rem;
104
+ font-weight: 900;
105
+ letter-spacing: 0.07em;
106
+ text-transform: uppercase;
107
+ }
108
+
109
+ .rpi__input {
110
+ width: 100%;
111
+ min-width: 0;
112
+ padding: 0.55rem 0.7rem;
113
+ border: 1px solid color-mix(in srgb, var(--rpi-line) 72%, var(--rpi-red));
114
+ border-radius: 8px;
115
+ background: var(--rpi-input);
116
+ color: var(--rpi-ink);
117
+ font: inherit;
118
+ font-size: clamp(1.65rem, 5vw, 2.45rem);
119
+ font-weight: 950;
120
+ line-height: 1;
121
+ outline: none;
122
+ }
123
+
124
+ .rpi__input::placeholder {
125
+ color: color-mix(in srgb, var(--rpi-muted) 42%, transparent);
126
+ }
127
+
128
+ .rpi__input:focus {
129
+ border-color: var(--rpi-red);
130
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--rpi-red) 16%, transparent);
131
+ }
132
+
133
+ .rpi__presets {
134
+ display: grid;
135
+ grid-template-columns: repeat(3, minmax(0, 1fr));
136
+ gap: 0.35rem;
137
+ }
138
+
139
+ .rpi__preset {
140
+ min-height: 2.15rem;
141
+ border: 1px solid var(--rpi-line);
142
+ border-radius: 6px;
143
+ background: transparent;
144
+ color: var(--rpi-muted);
145
+ font: inherit;
146
+ font-size: 0.72rem;
147
+ font-weight: 900;
148
+ cursor: pointer;
149
+ }
150
+
151
+ .rpi__preset--active {
152
+ border-color: var(--rpi-red);
153
+ background: var(--rpi-red);
154
+ color: #fff;
155
+ }
156
+
157
+ .rpi__result {
158
+ display: grid;
159
+ margin: 0 clamp(0.85rem, 2.4vw, 1.15rem) clamp(0.85rem, 2.4vw, 1.15rem);
160
+ overflow: hidden;
161
+ border: 1px solid var(--rpi-line);
162
+ border-radius: 8px;
163
+ background: var(--rpi-panel);
164
+ }
165
+
166
+ .rpi__sphere {
167
+ position: relative;
168
+ display: grid;
169
+ place-items: center;
170
+ min-height: 18rem;
171
+ padding: 1rem;
172
+ background:
173
+ radial-gradient(circle at 50% 42%, color-mix(in srgb, var(--rpi-red) 12%, transparent), transparent 42%),
174
+ var(--rpi-panel);
175
+ }
176
+
177
+ .rpi__sphere svg {
178
+ width: min(78%, 13.5rem);
179
+ height: auto;
180
+ opacity: 0.92;
181
+ filter: drop-shadow(0 18px 24px rgba(83, 24, 31, 0.18));
182
+ }
183
+
184
+ .rpi__sphere-orbit {
185
+ fill: none;
186
+ stroke: color-mix(in srgb, var(--rpi-red) 28%, var(--rpi-line));
187
+ stroke-width: 2;
188
+ stroke-dasharray: 6 8;
189
+ }
190
+
191
+ .rpi__sphere-core {
192
+ fill: color-mix(in srgb, var(--rpi-red) 12%, var(--rpi-panel));
193
+ stroke: color-mix(in srgb, var(--rpi-red) 56%, var(--rpi-line));
194
+ stroke-width: 4;
195
+ }
196
+
197
+ .theme-dark .rpi__sphere-core {
198
+ fill: color-mix(in srgb, var(--rpi-red-dark) 56%, #130b0f);
199
+ }
200
+
201
+ .rpi__sphere-fill {
202
+ fill: url("#rpiSphereGlow");
203
+ opacity: 0.72;
204
+ transition: d 180ms ease;
205
+ }
206
+
207
+ .rpi__sphere-shine {
208
+ fill: rgba(255, 255, 255, 0.7);
209
+ }
210
+
211
+ .rpi__sphere-value {
212
+ position: absolute;
213
+ display: grid;
214
+ gap: 0.2rem;
215
+ place-items: center;
216
+ min-width: 9rem;
217
+ padding: 0.55rem 0.7rem;
218
+ border: 1px solid color-mix(in srgb, var(--rpi-line) 64%, transparent);
219
+ border-radius: 8px;
220
+ background: color-mix(in srgb, var(--rpi-panel) 82%, transparent);
221
+ text-align: center;
222
+ box-shadow: 0 12px 28px rgba(60, 25, 31, 0.12);
223
+ }
224
+
225
+ .theme-dark .rpi__sphere-value {
226
+ background: rgba(12, 8, 11, 0.78);
227
+ }
228
+
229
+ .rpi__sphere-value span {
230
+ color: var(--rpi-muted);
231
+ font-size: 0.72rem;
232
+ font-weight: 950;
233
+ letter-spacing: 0.12em;
234
+ text-transform: uppercase;
235
+ }
236
+
237
+ .rpi__sphere-value strong {
238
+ color: var(--rpi-ink);
239
+ font-size: clamp(3.1rem, 12vw, 4.75rem);
240
+ font-weight: 1000;
241
+ line-height: 0.9;
242
+ }
243
+
244
+ .rpi__readout {
245
+ display: grid;
246
+ align-content: center;
247
+ gap: 0.72rem;
248
+ padding: clamp(1rem, 3vw, 1.35rem);
249
+ border-top: 1px solid var(--rpi-line);
250
+ background:
251
+ linear-gradient(135deg, color-mix(in srgb, var(--rpi-red) 7%, transparent), transparent 58%),
252
+ var(--rpi-panel);
253
+ }
254
+
255
+ .rpi__badge {
256
+ width: fit-content;
257
+ padding: 0.35rem 0.62rem;
258
+ border-radius: 999px;
259
+ background: color-mix(in srgb, var(--rpi-red) 14%, transparent);
260
+ color: var(--rpi-red);
261
+ font-size: 0.74rem;
262
+ font-weight: 950;
263
+ letter-spacing: 0.08em;
264
+ text-transform: uppercase;
265
+ }
266
+
267
+ .rpi__readout strong {
268
+ color: var(--rpi-red);
269
+ font-size: clamp(1.6rem, 5vw, 2.45rem);
270
+ line-height: 1;
271
+ }
272
+
273
+ .rpi__readout p {
274
+ max-width: 62ch;
275
+ margin: 0;
276
+ color: var(--rpi-muted);
277
+ font-size: 0.95rem;
278
+ line-height: 1.55;
279
+ }
280
+
281
+ .rpi__result[data-band="borderline"] .rpi__badge,
282
+ .rpi__result[data-band="borderline"] .rpi__readout strong {
283
+ color: var(--rpi-yellow);
284
+ }
285
+
286
+ .rpi__result[data-band="adequate"] .rpi__badge,
287
+ .rpi__result[data-band="adequate"] .rpi__readout strong {
288
+ color: var(--rpi-green);
289
+ }
290
+
291
+ .rpi__result[data-band="borderline"] .rpi__badge {
292
+ background: color-mix(in srgb, var(--rpi-yellow) 15%, transparent);
293
+ }
294
+
295
+ .rpi__result[data-band="adequate"] .rpi__badge {
296
+ background: color-mix(in srgb, var(--rpi-green) 15%, transparent);
297
+ }
298
+
299
+ .rpi__metrics {
300
+ display: grid;
301
+ gap: 0.75rem;
302
+ padding: 0 clamp(0.85rem, 2.4vw, 1.15rem) clamp(0.85rem, 2.4vw, 1.15rem);
303
+ background: var(--rpi-panel-2);
304
+ }
305
+
306
+ .rpi__metric {
307
+ display: grid;
308
+ gap: 0.35rem;
309
+ padding: 0.9rem;
310
+ border: 1px solid var(--rpi-line);
311
+ border-radius: 8px;
312
+ background: var(--rpi-panel);
313
+ }
314
+
315
+ .rpi__metric span {
316
+ color: var(--rpi-muted);
317
+ font-size: 0.68rem;
318
+ font-weight: 950;
319
+ letter-spacing: 0.08em;
320
+ text-transform: uppercase;
321
+ }
322
+
323
+ .rpi__metric strong {
324
+ color: var(--rpi-ink);
325
+ font-size: clamp(1.75rem, 6vw, 2.65rem);
326
+ line-height: 1;
327
+ }
328
+
329
+ .rpi__formula {
330
+ display: grid;
331
+ gap: 0.75rem;
332
+ padding: 0 clamp(0.85rem, 2.4vw, 1.15rem) clamp(0.85rem, 2.4vw, 1.15rem);
333
+ background: var(--rpi-panel-2);
334
+ }
335
+
336
+ .rpi__formula-card,
337
+ .rpi__factor-card {
338
+ display: grid;
339
+ gap: 0.65rem;
340
+ padding: 0.9rem;
341
+ border: 1px solid var(--rpi-line);
342
+ border-radius: 8px;
343
+ background:
344
+ linear-gradient(135deg, color-mix(in srgb, var(--rpi-red) 5%, transparent), transparent 62%),
345
+ var(--rpi-panel);
346
+ }
347
+
348
+ .rpi__formula-card {
349
+ grid-template-columns: 0.78rem 1fr;
350
+ align-items: start;
351
+ }
352
+
353
+ .rpi__formula-mark {
354
+ width: 0.78rem;
355
+ min-height: 100%;
356
+ border-radius: 999px;
357
+ background: linear-gradient(180deg, var(--rpi-red), color-mix(in srgb, var(--rpi-red) 18%, transparent));
358
+ }
359
+
360
+ .rpi__formula-copy {
361
+ display: grid;
362
+ gap: 0.42rem;
363
+ }
364
+
365
+ .rpi__formula-copy strong {
366
+ color: var(--rpi-ink);
367
+ font-size: 0.86rem;
368
+ }
369
+
370
+ .rpi__formula-copy span,
371
+ .rpi__factor-grid span {
372
+ color: var(--rpi-muted);
373
+ font-size: 0.82rem;
374
+ line-height: 1.45;
375
+ }
376
+
377
+ .rpi__factor-grid {
378
+ display: grid;
379
+ grid-template-columns: repeat(2, minmax(0, 1fr));
380
+ gap: 0.45rem;
381
+ }
382
+
383
+ .rpi__factor-grid span {
384
+ min-height: 2.35rem;
385
+ padding: 0.48rem 0.55rem;
386
+ border: 1px solid color-mix(in srgb, var(--rpi-line) 80%, transparent);
387
+ border-radius: 6px;
388
+ background: color-mix(in srgb, var(--rpi-panel-2) 64%, transparent);
389
+ font-weight: 750;
390
+ }
391
+
392
+ @media (max-width: 430px) {
393
+ .rpi__factor-grid {
394
+ grid-template-columns: 1fr;
395
+ }
396
+ }
397
+
398
+ @media (min-width: 720px) {
399
+ .rpi__inputs {
400
+ grid-template-columns: repeat(3, minmax(0, 1fr));
401
+ }
402
+
403
+ .rpi__result {
404
+ grid-template-columns: minmax(280px, 0.78fr) minmax(360px, 1.22fr);
405
+ }
406
+
407
+ .rpi__readout {
408
+ border-top: 0;
409
+ border-left: 1px solid var(--rpi-line);
410
+ }
411
+
412
+ .rpi__metrics {
413
+ grid-template-columns: repeat(3, 1fr);
414
+ }
415
+
416
+ .rpi__formula {
417
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(260px, 0.86fr);
418
+ }
419
+ }
@@ -0,0 +1,27 @@
1
+ import type { HealthToolEntry } from '../../types';
2
+ import type { CorrectedReticulocyteIndexUI } from './ui';
3
+
4
+ export const correctedReticulocyteIndex: HealthToolEntry<CorrectedReticulocyteIndexUI> = {
5
+ id: 'correctedReticulocyteIndex',
6
+ icons: {
7
+ bg: 'mdi:water-opacity',
8
+ fg: 'mdi:chart-bell-curve-cumulative',
9
+ },
10
+ i18n: {
11
+ de: () => import('./i18n/de').then((m) => m.content),
12
+ en: () => import('./i18n/en').then((m) => m.content),
13
+ es: () => import('./i18n/es').then((m) => m.content),
14
+ fr: () => import('./i18n/fr').then((m) => m.content),
15
+ id: () => import('./i18n/id').then((m) => m.content),
16
+ it: () => import('./i18n/it').then((m) => m.content),
17
+ ja: () => import('./i18n/ja').then((m) => m.content),
18
+ ko: () => import('./i18n/ko').then((m) => m.content),
19
+ nl: () => import('./i18n/nl').then((m) => m.content),
20
+ pl: () => import('./i18n/pl').then((m) => m.content),
21
+ pt: () => import('./i18n/pt').then((m) => m.content),
22
+ ru: () => import('./i18n/ru').then((m) => m.content),
23
+ sv: () => import('./i18n/sv').then((m) => m.content),
24
+ tr: () => import('./i18n/tr').then((m) => m.content),
25
+ zh: () => import('./i18n/zh').then((m) => m.content),
26
+ },
27
+ };