@jjlmoya/utils-babies 1.11.0 → 1.13.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 (29) hide show
  1. package/package.json +7 -4
  2. package/scripts/postinstall.mjs +27 -0
  3. package/src/category/index.ts +6 -6
  4. package/src/entries.ts +20 -0
  5. package/src/tool/baby-feeding-calculator/baby-feeding-calculator.css +402 -0
  6. package/src/tool/baby-feeding-calculator/component.astro +0 -404
  7. package/src/tool/baby-feeding-calculator/entry.ts +47 -0
  8. package/src/tool/baby-feeding-calculator/index.ts +2 -49
  9. package/src/tool/baby-percentile-calculator/baby-weight-height-percentile.css +451 -0
  10. package/src/tool/baby-percentile-calculator/component.astro +0 -453
  11. package/src/tool/baby-percentile-calculator/entry.ts +55 -0
  12. package/src/tool/baby-percentile-calculator/index.ts +2 -57
  13. package/src/tool/baby-size-converter/baby-size-converter.css +553 -0
  14. package/src/tool/baby-size-converter/component.astro +0 -555
  15. package/src/tool/baby-size-converter/entry.ts +53 -0
  16. package/src/tool/baby-size-converter/index.ts +2 -55
  17. package/src/tool/fertile-days-estimator/component.astro +0 -551
  18. package/src/tool/fertile-days-estimator/entry.ts +47 -0
  19. package/src/tool/fertile-days-estimator/fertile-days-calculator.css +549 -0
  20. package/src/tool/fertile-days-estimator/index.ts +2 -49
  21. package/src/tool/pregnancy-calculator/component.astro +0 -1054
  22. package/src/tool/pregnancy-calculator/entry.ts +87 -0
  23. package/src/tool/pregnancy-calculator/index.ts +2 -89
  24. package/src/tool/pregnancy-calculator/pregnancy-weeks-calculator.css +1053 -0
  25. package/src/tool/vaccination-calendar/baby-vaccination-calendar-spain.css +396 -0
  26. package/src/tool/vaccination-calendar/component.astro +0 -398
  27. package/src/tool/vaccination-calendar/entry.ts +67 -0
  28. package/src/tool/vaccination-calendar/index.ts +2 -69
  29. package/src/tools.ts +1 -1
@@ -239,407 +239,3 @@ const { ui } = Astro.props;
239
239
  })();
240
240
  </script>
241
241
 
242
- <style>
243
- :global(.bfc-card) {
244
- background: #fff;
245
- border: 1px solid #e2e8f0;
246
- border-radius: 28px;
247
- overflow: hidden;
248
- display: flex;
249
- flex-direction: column;
250
- box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.08);
251
- }
252
-
253
- :global(.theme-dark .bfc-card) {
254
- background: #111827;
255
- border-color: #1f2937;
256
- }
257
-
258
- .bfc-main {
259
- display: grid;
260
- grid-template-columns: 1fr 1fr;
261
- }
262
-
263
- .bfc-left {
264
- background: #f8fafc;
265
- padding: 40px;
266
- border-right: 1px solid #e2e8f0;
267
- }
268
-
269
- :global(.theme-dark .bfc-left) {
270
- background: #1f2937;
271
- border-right-color: #374151;
272
- }
273
-
274
- :global(.bfc-right) {
275
- background: #fff;
276
- padding: 40px;
277
- }
278
-
279
- :global(.theme-dark .bfc-right) {
280
- background: #111827;
281
- }
282
-
283
- .bfc-section-marker {
284
- display: block;
285
- font-size: 0.75rem;
286
- font-weight: 800;
287
- text-transform: uppercase;
288
- letter-spacing: 0.15em;
289
- color: #64748b;
290
- margin-bottom: 32px;
291
- }
292
-
293
- :global(.bfc-input-label) {
294
- display: block;
295
- font-size: 0.95rem;
296
- font-weight: 700;
297
- color: #334155;
298
- margin-bottom: 12px;
299
- }
300
-
301
- :global(.theme-dark .bfc-input-label) {
302
- color: #e2e8f0;
303
- }
304
-
305
- .bfc-input-group {
306
- margin-bottom: 28px;
307
- }
308
-
309
- .bfc-unit-nav {
310
- display: flex;
311
- background: #e2e8f0;
312
- padding: 4px;
313
- border-radius: 12px;
314
- margin-bottom: 24px;
315
- }
316
-
317
- :global(.theme-dark .bfc-unit-nav) {
318
- background: #374151;
319
- }
320
-
321
- :global(.bfc-unit-tab) {
322
- flex: 1;
323
- padding: 8px;
324
- border: none;
325
- background: #f1f5f9;
326
- color: #64748b;
327
- font-size: 0.85rem;
328
- font-weight: 700;
329
- border-radius: 8px;
330
- cursor: pointer;
331
- transition: all 0.2s ease;
332
- margin: 2px;
333
- }
334
-
335
- :global(.theme-dark .bfc-unit-tab) {
336
- background: #1f2937;
337
- }
338
-
339
- :global(.bfc-unit-active) {
340
- background: #fff;
341
- color: #0d9488;
342
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
343
- }
344
-
345
- :global(.theme-dark .bfc-unit-active) {
346
- background: #4b5563;
347
- color: #2dd4bf;
348
- }
349
-
350
- .bfc-stepper-box {
351
- display: flex;
352
- align-items: center;
353
- justify-content: space-between;
354
- background: #fff;
355
- border: 1px solid #cbd5e1;
356
- border-radius: 16px;
357
- padding: 8px;
358
- margin-bottom: 8px;
359
- }
360
-
361
- :global(.theme-dark .bfc-stepper-box) {
362
- background: #111827;
363
- border-color: #4b5563;
364
- }
365
-
366
- :global(.bfc-btn-step) {
367
- width: 44px;
368
- height: 44px;
369
- border-radius: 12px;
370
- border: none;
371
- background: #f1f5f9;
372
- color: #334155;
373
- font-size: 1.25rem;
374
- font-weight: 700;
375
- cursor: pointer;
376
- transition: all 0.2s ease;
377
- }
378
-
379
- :global(.theme-dark .bfc-btn-step) {
380
- background: #374151;
381
- color: #f9fafb;
382
- }
383
-
384
- :global(.bfc-btn-step:hover) {
385
- background: #0d9488;
386
- color: #fff;
387
- }
388
-
389
- .bfc-val-view {
390
- text-align: center;
391
- }
392
-
393
- :global(.bfc-val-big) {
394
- display: block;
395
- font-size: 2rem;
396
- font-weight: 800;
397
- color: #0f172a;
398
- }
399
-
400
- :global(.theme-dark .bfc-val-big) {
401
- color: #fff;
402
- }
403
-
404
- :global(.bfc-val-sub) {
405
- display: block;
406
- font-size: 0.85rem;
407
- color: #64748b;
408
- font-weight: 600;
409
- }
410
-
411
- .bfc-slider-wrap {
412
- padding: 0 11px;
413
- }
414
-
415
- .bfc-slider {
416
- -webkit-appearance: none;
417
- appearance: none;
418
- width: 100%;
419
- margin: 16px 0;
420
- height: 6px;
421
- background: #e2e8f0;
422
- border-radius: 3px;
423
- outline: none;
424
- }
425
-
426
- :global(.theme-dark .bfc-slider) {
427
- background: #374151;
428
- }
429
-
430
- :global(.bfc-slider::-webkit-slider-thumb) {
431
- -webkit-appearance: none;
432
- appearance: none;
433
- width: 22px;
434
- height: 22px;
435
- border-radius: 50%;
436
- background: #0d9488;
437
- cursor: pointer;
438
- border: 3px solid #fff;
439
- box-shadow: 0 4px 10px rgba(13, 148, 136, 0.3);
440
- }
441
-
442
- .bfc-type-rack {
443
- display: grid;
444
- grid-template-columns: repeat(3, 1fr);
445
- gap: 12px;
446
- }
447
-
448
- :global(.bfc-type-tile) {
449
- background: #f1f5f9;
450
- border: 1px solid #cbd5e1;
451
- border-radius: 14px;
452
- padding: 14px 4px;
453
- text-align: center;
454
- cursor: pointer;
455
- transition: all 0.2s ease;
456
- font-size: 0.9rem;
457
- font-weight: 700;
458
- color: #64748b;
459
- }
460
-
461
- :global(.theme-dark .bfc-type-tile) {
462
- background: #1f2937;
463
- border-color: #4b5563;
464
- }
465
-
466
- :global(.bfc-type-active) {
467
- background: #f0fdfa;
468
- border-color: #0d9488;
469
- color: #0f766e;
470
- box-shadow: 0 2px 8px rgba(13, 148, 136, 0.1);
471
- }
472
-
473
- :global(.theme-dark .bfc-type-active) {
474
- background: rgba(13, 148, 136, 0.1);
475
- color: #2dd4bf;
476
- border-color: #2dd4bf;
477
- }
478
-
479
- .bfc-gauge-area {
480
- margin-top: 40px;
481
- padding: 30px;
482
- background: #fff;
483
- border-radius: 20px;
484
- border: 1px solid #e2e8f0;
485
- }
486
-
487
- :global(.theme-dark .bfc-gauge-area) {
488
- background: #111827;
489
- border-color: #374151;
490
- }
491
-
492
- .bfc-gauge-viz {
493
- display: flex;
494
- flex-direction: column;
495
- align-items: center;
496
- text-align: center;
497
- gap: 16px;
498
- }
499
-
500
- .bfc-stomach-bubble {
501
- width: 60px;
502
- height: 60px;
503
- background: radial-gradient(circle at 30% 30%, #5eead4 0%, #0d9488 100%);
504
- border-radius: 50%;
505
- transition: all 0.6s cubic-bezier(0.34, 1.56, 0.64, 1);
506
- box-shadow: 0 10px 25px rgba(13, 148, 136, 0.2);
507
- }
508
-
509
- :global(.bfc-visual-hint) {
510
- font-size: 0.95rem;
511
- font-weight: 600;
512
- color: #0f766e;
513
- margin: 0;
514
- }
515
-
516
- :global(.theme-dark .bfc-visual-hint) {
517
- color: #2dd4bf;
518
- }
519
-
520
- .bfc-res-card-box {
521
- background: #f0fdfa;
522
- border-radius: 24px;
523
- padding: 32px 16px;
524
- text-align: center;
525
- margin-bottom: 24px;
526
- }
527
-
528
- :global(.theme-dark .bfc-res-card-box) {
529
- background: rgba(13, 148, 136, 0.05);
530
- }
531
-
532
- :global(.bfc-res-main-val) {
533
- display: block;
534
- font-size: 3.5rem;
535
- font-weight: 950;
536
- color: #0d9488;
537
- letter-spacing: -0.05em;
538
- line-height: 1;
539
- }
540
-
541
- :global(.theme-dark .bfc-res-main-val) {
542
- color: #2dd4bf;
543
- }
544
-
545
- :global(.bfc-res-label) {
546
- display: block;
547
- margin-top: 8px;
548
- font-size: 1rem;
549
- font-weight: 700;
550
- color: #64748b;
551
- }
552
-
553
- .bfc-stats-grid {
554
- display: grid;
555
- grid-template-columns: 1fr 1fr;
556
- gap: 20px;
557
- margin-bottom: 32px;
558
- }
559
-
560
- .bfc-stat-item {
561
- padding: 8px;
562
- border-bottom: 2px solid #f1f5f9;
563
- }
564
-
565
- :global(.theme-dark .bfc-stat-item) {
566
- border-bottom-color: #374151;
567
- }
568
-
569
- :global(.bfc-stat-label) {
570
- display: block;
571
- font-size: 0.7rem;
572
- font-weight: 800;
573
- color: #94a3b8;
574
- text-transform: uppercase;
575
- margin-bottom: 2px;
576
- }
577
-
578
- :global(.bfc-stat-value) {
579
- font-size: 1.15rem;
580
- font-weight: 800;
581
- color: #334155;
582
- }
583
-
584
- :global(.theme-dark .bfc-stat-value) {
585
- color: #e2e8f0;
586
- }
587
-
588
- .bfc-behavior-sec {
589
- margin-top: 32px;
590
- }
591
-
592
- .bfc-pills-container {
593
- display: flex;
594
- flex-wrap: wrap;
595
- gap: 8px;
596
- margin-top: 12px;
597
- }
598
-
599
- .bfc-pill {
600
- font-size: 0.8rem;
601
- font-weight: 700;
602
- padding: 6px 12px;
603
- border-radius: 100px;
604
- }
605
-
606
- :global(.bfc-pill-hunger) {
607
- background: #fff7ed;
608
- color: #c2410c;
609
- }
610
-
611
- :global(.theme-dark .bfc-pill-hunger) {
612
- background: rgba(194, 65, 12, 0.1);
613
- color: #fdba74;
614
- }
615
-
616
- :global(.bfc-pill-fullness) {
617
- background: #f0fdf4;
618
- color: #15803d;
619
- }
620
-
621
- :global(.theme-dark .bfc-pill-fullness) {
622
- background: rgba(21, 128, 61, 0.1);
623
- color: #4ade80;
624
- }
625
-
626
- .bfc-hidden {
627
- display: none;
628
- }
629
-
630
- @media (max-width: 800px) {
631
- .bfc-main {
632
- grid-template-columns: 1fr;
633
- }
634
-
635
- .bfc-left {
636
- border-right: none;
637
- border-bottom: 1px solid #e2e8f0;
638
- padding: 30px 20px;
639
- }
640
-
641
- .bfc-right {
642
- padding: 30px 20px;
643
- }
644
- }
645
- </style>
@@ -0,0 +1,47 @@
1
+ import type { BabiesToolEntry, ToolLocaleContent } from '../../types';
2
+
3
+ export interface BabyFeedingCalculatorUI {
4
+ [key: string]: string;
5
+ labelConfig: string;
6
+ labelPlan: string;
7
+ unitDays: string;
8
+ unitWeeks: string;
9
+ unitMonths: string;
10
+ labelWeight: string;
11
+ labelFeedType: string;
12
+ feedBreast: string;
13
+ feedMixed: string;
14
+ feedFormula: string;
15
+ labelFreeDemand: string;
16
+ labelMlPerFeed: string;
17
+ labelFeedsCount: string;
18
+ labelDailyTotal: string;
19
+ labelHunger: string;
20
+ labelFullness: string;
21
+ faqTitle: string;
22
+ bibliographyTitle: string;
23
+ }
24
+
25
+ export type BabyFeedingCalculatorLocaleContent = ToolLocaleContent<BabyFeedingCalculatorUI>;
26
+
27
+ export const babyFeedingCalculator: BabiesToolEntry<BabyFeedingCalculatorUI> = {
28
+ id: 'baby-feeding-calculator',
29
+ icons: { bg: 'mdi:baby-bottle', fg: 'mdi:baby-bottle-outline' },
30
+ i18n: {
31
+ es: () => import('./i18n/es').then((m) => m.content),
32
+ en: () => import('./i18n/en').then((m) => m.content),
33
+ de: () => import('./i18n/de').then((m) => m.content),
34
+ fr: () => import('./i18n/fr').then((m) => m.content),
35
+ it: () => import('./i18n/it').then((m) => m.content),
36
+ pt: () => import('./i18n/pt').then((m) => m.content),
37
+ nl: () => import('./i18n/nl').then((m) => m.content),
38
+ pl: () => import('./i18n/pl').then((m) => m.content),
39
+ ru: () => import('./i18n/ru').then((m) => m.content),
40
+ tr: () => import('./i18n/tr').then((m) => m.content),
41
+ sv: () => import('./i18n/sv').then((m) => m.content),
42
+ id: () => import('./i18n/id').then((m) => m.content),
43
+ ja: () => import('./i18n/ja').then((m) => m.content),
44
+ ko: () => import('./i18n/ko').then((m) => m.content),
45
+ zh: () => import('./i18n/zh').then((m) => m.content),
46
+ },
47
+ };
@@ -1,52 +1,5 @@
1
- import type { BabiesToolEntry, ToolDefinition, ToolLocaleContent } from '../../types';
2
-
3
- export interface BabyFeedingCalculatorUI {
4
- [key: string]: string;
5
- labelConfig: string;
6
- labelPlan: string;
7
- unitDays: string;
8
- unitWeeks: string;
9
- unitMonths: string;
10
- labelWeight: string;
11
- labelFeedType: string;
12
- feedBreast: string;
13
- feedMixed: string;
14
- feedFormula: string;
15
- labelFreeDemand: string;
16
- labelMlPerFeed: string;
17
- labelFeedsCount: string;
18
- labelDailyTotal: string;
19
- labelHunger: string;
20
- labelFullness: string;
21
- faqTitle: string;
22
- bibliographyTitle: string;
23
- }
24
-
25
- export type BabyFeedingCalculatorLocaleContent = ToolLocaleContent<BabyFeedingCalculatorUI>;
26
-
27
- export const babyFeedingCalculator: BabiesToolEntry<BabyFeedingCalculatorUI> = {
28
- id: 'baby-feeding-calculator',
29
- icons: { bg: 'mdi:baby-bottle', fg: 'mdi:baby-bottle-outline' },
30
- i18n: {
31
- es: () => import('./i18n/es').then((m) => m.content),
32
- en: () => import('./i18n/en').then((m) => m.content),
33
- de: () => import('./i18n/de').then((m) => m.content),
34
- fr: () => import('./i18n/fr').then((m) => m.content),
35
- it: () => import('./i18n/it').then((m) => m.content),
36
- pt: () => import('./i18n/pt').then((m) => m.content),
37
- nl: () => import('./i18n/nl').then((m) => m.content),
38
- pl: () => import('./i18n/pl').then((m) => m.content),
39
- ru: () => import('./i18n/ru').then((m) => m.content),
40
- tr: () => import('./i18n/tr').then((m) => m.content),
41
- sv: () => import('./i18n/sv').then((m) => m.content),
42
- id: () => import('./i18n/id').then((m) => m.content),
43
- ja: () => import('./i18n/ja').then((m) => m.content),
44
- ko: () => import('./i18n/ko').then((m) => m.content),
45
- zh: () => import('./i18n/zh').then((m) => m.content),
46
- },
47
- };
48
-
49
-
1
+ import { babyFeedingCalculator } from './entry';
2
+ export * from './entry';
50
3
  export const BABY_FEEDING_CALCULATOR_TOOL: ToolDefinition = {
51
4
  entry: babyFeedingCalculator,
52
5
  Component: () => import('./component.astro'),