@jjlmoya/utils-finance 1.12.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 (26) hide show
  1. package/package.json +5 -3
  2. package/scripts/postinstall.mjs +27 -0
  3. package/src/tool/compoundInterest/component.astro +0 -376
  4. package/src/tool/compoundInterest/compound-interest-calculator.css +79 -0
  5. package/src/tool/courtFeeCalculator/component.astro +0 -237
  6. package/src/tool/courtFeeCalculator/spanish-court-fees-calculator.css +235 -0
  7. package/src/tool/debtSnowball/component.astro +0 -636
  8. package/src/tool/debtSnowball/debt-snowball-calculator.css +634 -0
  9. package/src/tool/fireCalculator/component.astro +0 -334
  10. package/src/tool/fireCalculator/four-percent-rule-fire-calculator.css +332 -0
  11. package/src/tool/ibanBicSwiftConverter/component.astro +0 -414
  12. package/src/tool/ibanBicSwiftConverter/iban-to-bic-swift-converter.css +412 -0
  13. package/src/tool/inflation/component.astro +0 -280
  14. package/src/tool/inflation/inflation-calculator-spain.css +278 -0
  15. package/src/tool/lateInterest/component.astro +0 -400
  16. package/src/tool/lateInterest/late-interest-calculator.css +398 -0
  17. package/src/tool/legalInterestRate/component.astro +0 -509
  18. package/src/tool/legalInterestRate/legal-interest-on-money-spain.css +507 -0
  19. package/src/tool/lotteryOptimizer/component.astro +0 -561
  20. package/src/tool/lotteryOptimizer/spain-lottery-optimizer.css +17 -0
  21. package/src/tool/mortgage/component.astro +0 -641
  22. package/src/tool/mortgage/mortgage-calculator.css +639 -0
  23. package/src/tool/percentageCalculator/component.astro +0 -336
  24. package/src/tool/percentageCalculator/percentage-calculator.css +289 -0
  25. package/src/tool/rentIncreaseCalculator/component.astro +0 -372
  26. package/src/tool/rentIncreaseCalculator/rent-increase-calculator.css +370 -0
@@ -261,642 +261,6 @@ const { ui } = Astro.props;
261
261
  </div>
262
262
  </div>
263
263
 
264
- <style>
265
- :root {
266
- --snow-emerald: #10b981;
267
- --snow-blue: #3b82f6;
268
- --snow-rose: #f43f5e;
269
- --snow-bg-card: rgba(255, 255, 255, 0.95);
270
- --snow-border: rgba(226, 232, 240, 0.8);
271
- --snow-text-main: #0f172a;
272
- --snow-text-muted: #64748b;
273
- --snow-bg-input: rgba(255, 255, 255, 0.8);
274
- --snow-bg-subtle: rgba(0, 0, 0, 0.02);
275
- --snow-bg-tab: rgba(0, 0, 0, 0.05);
276
- }
277
-
278
- :global(.theme-dark),
279
- :global([data-theme="dark"]) {
280
- --snow-bg-card: rgba(15, 23, 42, 0.9);
281
- --snow-border: rgba(30, 41, 59, 1);
282
- --snow-text-main: #f8fafc;
283
- --snow-text-muted: #94a3b8;
284
- --snow-bg-input: rgba(0, 0, 0, 0.3);
285
- }
286
-
287
- .snow-container {
288
- width: 100%;
289
- color: var(--snow-text-main);
290
- }
291
-
292
- .snow-main-card {
293
- background: var(--snow-bg-card);
294
- backdrop-filter: blur(24px);
295
- -webkit-backdrop-filter: blur(24px);
296
- border-radius: 2.5rem;
297
- border: 1px solid var(--snow-border);
298
- display: grid;
299
- grid-template-columns: 1fr;
300
- box-shadow: 0 40px 100px -20px rgba(0, 0, 0, 0.1);
301
- overflow: hidden;
302
- }
303
-
304
- @media (min-width: 1024px) {
305
- .snow-main-card {
306
- grid-template-columns: 380px 1fr;
307
- }
308
- }
309
-
310
- .snow-sidebar {
311
- padding: 3rem 2.5rem;
312
- background: var(--snow-bg-subtle);
313
- border-right: 1px solid var(--snow-border);
314
- overflow-y: auto;
315
- max-height: 80vh;
316
- }
317
-
318
- .snow-title {
319
- font-size: 1.75rem;
320
- font-weight: 900;
321
- letter-spacing: -0.04em;
322
- display: flex;
323
- align-items: center;
324
- gap: 0.75rem;
325
- margin-bottom: 2.5rem;
326
- color: var(--snow-emerald);
327
- }
328
-
329
- .snow-section-label {
330
- display: block;
331
- font-size: 0.65rem;
332
- font-weight: 900;
333
- text-transform: uppercase;
334
- letter-spacing: 0.15em;
335
- opacity: 0.4;
336
- margin-bottom: 1.5rem;
337
- }
338
-
339
- .snow-input-group {
340
- margin-bottom: 1.5rem;
341
- }
342
-
343
- .snow-label {
344
- display: block;
345
- font-size: 0.75rem;
346
- font-weight: 850;
347
- margin-bottom: 0.6rem;
348
- opacity: 0.8;
349
- }
350
-
351
- .snow-input-wrapper {
352
- position: relative;
353
- display: flex;
354
- align-items: center;
355
- }
356
-
357
- .snow-input {
358
- width: 100%;
359
- background: var(--snow-bg-input);
360
- border: 1.5px solid var(--snow-border);
361
- padding: 1rem 1.25rem;
362
- border-radius: 1.25rem;
363
- font-size: 1rem;
364
- font-weight: 700;
365
- color: inherit;
366
- transition: all 0.3s cubic-bezier(0.19, 1, 0.22, 1);
367
- }
368
-
369
- .snow-input:focus {
370
- outline: none;
371
- border-color: var(--snow-emerald);
372
- box-shadow: 0 0 0 5px rgba(16, 185, 129, 0.1);
373
- }
374
-
375
- .snow-input-unit {
376
- position: absolute;
377
- right: 1.25rem;
378
- font-weight: 900;
379
- font-size: 0.75rem;
380
- opacity: 0.3;
381
- pointer-events: none;
382
- }
383
-
384
- .snow-help-text,
385
- .snow-input-help {
386
- font-size: 0.6rem;
387
- line-height: 1.4;
388
- opacity: 0.4;
389
- font-weight: bold;
390
- margin-top: 0.5rem;
391
- }
392
-
393
- .snow-method-tabs {
394
- display: flex;
395
- background: var(--snow-bg-tab);
396
- padding: 0.4rem;
397
- border-radius: 1.25rem;
398
- margin: 2rem 0;
399
- gap: 0.4rem;
400
- }
401
-
402
- .snow-tab {
403
- flex: 1;
404
- padding: 0.85rem;
405
- border-radius: 1rem;
406
- border: none;
407
- font-weight: 900;
408
- font-size: 0.75rem;
409
- cursor: pointer;
410
- background: transparent;
411
- color: var(--snow-text-muted);
412
- transition: all 0.3s cubic-bezier(0.19, 1, 0.22, 1);
413
- }
414
-
415
- .snow-tab.active {
416
- background: white;
417
- color: var(--snow-emerald);
418
- box-shadow: 0 10px 20px -5px rgba(0, 0, 0, 0.1);
419
- }
420
-
421
- :global(.theme-dark) .snow-tab.active,
422
- :global([data-theme="dark"]) .snow-tab.active {
423
- background: rgba(255, 255, 255, 0.1);
424
- color: white;
425
- }
426
-
427
- .snow-adder-card {
428
- background: rgba(16, 185, 129, 0.08);
429
- border: 1.5px solid rgba(16, 185, 129, 0.2);
430
- padding: 2rem 1.5rem;
431
- border-radius: 1.75rem;
432
- margin-bottom: 2rem;
433
- }
434
-
435
- .snow-adder-content {
436
- display: flex;
437
- flex-direction: column;
438
- gap: 1rem;
439
- }
440
-
441
- .snow-grid-2 {
442
- display: grid;
443
- grid-template-columns: 1fr 1fr;
444
- gap: 0.75rem;
445
- }
446
-
447
- .snow-btn {
448
- padding: 0.85rem 1.5rem;
449
- border-radius: 1rem;
450
- border: none;
451
- font-weight: 900;
452
- font-size: 0.75rem;
453
- cursor: pointer;
454
- transition: all 0.3s cubic-bezier(0.19, 1, 0.22, 1);
455
- display: flex;
456
- align-items: center;
457
- gap: 0.75rem;
458
- justify-content: center;
459
- text-transform: uppercase;
460
- letter-spacing: 0.05em;
461
- }
462
-
463
- .snow-btn-add {
464
- background: linear-gradient(
465
- 135deg,
466
- var(--snow-emerald),
467
- var(--snow-blue)
468
- );
469
- color: white;
470
- }
471
-
472
- .snow-btn-add:hover {
473
- transform: translateY(-2px);
474
- box-shadow: 0 20px 40px -10px rgba(16, 185, 129, 0.2);
475
- }
476
-
477
- .snow-btn-clear {
478
- margin-top: 2rem;
479
- font-size: 0.65rem;
480
- font-weight: 900;
481
- text-transform: uppercase;
482
- letter-spacing: 0.05em;
483
- color: var(--snow-rose);
484
- opacity: 0.5;
485
- background: none;
486
- border: none;
487
- cursor: pointer;
488
- display: flex;
489
- align-items: center;
490
- gap: 0.5rem;
491
- transition: all 0.3s ease;
492
- }
493
-
494
- .snow-btn-clear:hover {
495
- opacity: 1;
496
- color: var(--snow-rose);
497
- }
498
-
499
- .snow-content {
500
- padding: 3rem;
501
- overflow-y: auto;
502
- max-height: 80vh;
503
- }
504
-
505
- .snow-empty-view {
506
- display: flex;
507
- flex-direction: column;
508
- align-items: center;
509
- justify-content: center;
510
- min-height: 400px;
511
- text-align: center;
512
- }
513
-
514
- .snow-empty-icon {
515
- font-size: 3rem;
516
- opacity: 0.2;
517
- margin-bottom: 1rem;
518
- }
519
-
520
- .snow-empty-title {
521
- font-size: 1.5rem;
522
- font-weight: 900;
523
- text-transform: uppercase;
524
- letter-spacing: -0.02em;
525
- margin-bottom: 1rem;
526
- }
527
-
528
- .snow-empty-description {
529
- max-width: 300px;
530
- font-size: 0.875rem;
531
- opacity: 0.5;
532
- }
533
-
534
- .snow-hidden {
535
- display: none;
536
- }
537
-
538
- .snow-inventory-area {
539
- margin-bottom: 2rem;
540
- }
541
-
542
- .snow-mini-table {
543
- border: 1px solid var(--snow-border);
544
- border-radius: 1rem;
545
- overflow: hidden;
546
- }
547
-
548
- .snow-table-row {
549
- display: grid;
550
- grid-template-columns: 1fr 1fr 1fr 1fr 60px;
551
- padding: 1rem;
552
- font-size: 0.875rem;
553
- border-bottom: 1px solid var(--snow-border);
554
- align-items: center;
555
- }
556
-
557
- .snow-table-header {
558
- background: var(--snow-bg-subtle);
559
- font-weight: 900;
560
- text-transform: uppercase;
561
- font-size: 0.65rem;
562
- opacity: 0.6;
563
- }
564
-
565
- .snow-debt-list {
566
- max-height: 200px;
567
- overflow-y: auto;
568
- }
569
-
570
- :global(.snow-debt-item) {
571
- display: grid;
572
- grid-template-columns: 1fr 1fr 1fr 1fr 60px;
573
- padding: 1rem;
574
- border-bottom: 1px solid var(--snow-border);
575
- align-items: center;
576
- gap: 1rem;
577
- }
578
-
579
- :global(.snow-debt-remove) {
580
- background: none;
581
- border: none;
582
- color: var(--snow-rose);
583
- cursor: pointer;
584
- font-weight: 900;
585
- font-size: 1.25rem;
586
- opacity: 0.3;
587
- transition: opacity 0.3s ease;
588
- }
589
-
590
- :global(.snow-debt-remove:hover) {
591
- opacity: 1;
592
- }
593
-
594
- .snow-results-hero {
595
- background: linear-gradient(
596
- 135deg,
597
- rgba(16, 185, 129, 0.1),
598
- rgba(59, 130, 246, 0.1)
599
- );
600
- border: 1.5px solid var(--snow-border);
601
- border-radius: 1.75rem;
602
- padding: 3rem;
603
- margin-bottom: 2rem;
604
- display: flex;
605
- justify-content: space-between;
606
- align-items: center;
607
- }
608
-
609
- .snow-hero-main {
610
- display: flex;
611
- flex-direction: column;
612
- gap: 0.5rem;
613
- }
614
-
615
- .snow-hero-label {
616
- font-size: 0.65rem;
617
- font-weight: 900;
618
- text-transform: uppercase;
619
- letter-spacing: 0.1em;
620
- opacity: 0.6;
621
- }
622
-
623
- .snow-hero-value {
624
- font-size: 2.5rem;
625
- font-weight: 900;
626
- letter-spacing: -0.02em;
627
- color: var(--snow-emerald);
628
- }
629
-
630
- .snow-hero-badge {
631
- display: flex;
632
- align-items: center;
633
- gap: 0.75rem;
634
- background: rgba(16, 185, 129, 0.1);
635
- padding: 1rem 1.5rem;
636
- border-radius: 1rem;
637
- font-weight: 900;
638
- font-size: 0.75rem;
639
- text-transform: uppercase;
640
- letter-spacing: 0.05em;
641
- color: var(--snow-emerald);
642
- }
643
-
644
- .snow-grid-stats {
645
- display: grid;
646
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
647
- gap: 1.5rem;
648
- margin-bottom: 3rem;
649
- }
650
-
651
- .snow-stat-box {
652
- background: var(--snow-bg-subtle);
653
- border: 1px solid var(--snow-border);
654
- border-radius: 1.25rem;
655
- padding: 2rem 1.5rem;
656
- text-align: center;
657
- }
658
-
659
- .snow-stat-highlight {
660
- background: rgba(59, 130, 246, 0.08);
661
- border-color: rgba(59, 130, 246, 0.2);
662
- }
663
-
664
- .snow-stat-value {
665
- font-size: 1.875rem;
666
- font-weight: 900;
667
- color: var(--snow-emerald);
668
- margin-bottom: 0.5rem;
669
- }
670
-
671
- .snow-stat-label {
672
- font-size: 0.65rem;
673
- font-weight: 900;
674
- text-transform: uppercase;
675
- letter-spacing: 0.1em;
676
- opacity: 0.6;
677
- }
678
-
679
- .snow-action-plan {
680
- margin-bottom: 3rem;
681
- }
682
-
683
- .snow-action-header {
684
- display: flex;
685
- align-items: center;
686
- justify-content: space-between;
687
- margin-bottom: 2rem;
688
- flex-wrap: wrap;
689
- gap: 1rem;
690
- }
691
-
692
- .snow-action-title {
693
- font-size: 0.65rem;
694
- font-weight: 900;
695
- text-transform: uppercase;
696
- letter-spacing: 0.1em;
697
- opacity: 0.6;
698
- }
699
-
700
- .snow-action-help {
701
- font-size: 0.6rem;
702
- font-weight: 900;
703
- background: rgba(59, 130, 246, 0.1);
704
- padding: 0.5rem 1rem;
705
- border-radius: 2rem;
706
- text-transform: uppercase;
707
- color: var(--snow-blue);
708
- }
709
-
710
- .snow-action-list {
711
- display: flex;
712
- flex-direction: column;
713
- gap: 1rem;
714
- }
715
-
716
- :global(.snow-plan-item) {
717
- display: grid;
718
- grid-template-columns: 50px 1fr 1fr;
719
- gap: 1.5rem;
720
- align-items: center;
721
- padding: 1.5rem;
722
- background: var(--snow-bg-subtle);
723
- border: 1.5px solid var(--snow-border);
724
- border-radius: 1rem;
725
- }
726
-
727
- :global(.snow-plan-item.active-step) {
728
- background: rgba(16, 185, 129, 0.05);
729
- border-color: rgba(16, 185, 129, 0.3);
730
- }
731
-
732
- :global(.snow-step-marker) {
733
- width: 50px;
734
- height: 50px;
735
- background: var(--snow-emerald);
736
- color: white;
737
- display: flex;
738
- align-items: center;
739
- justify-content: center;
740
- border-radius: 50%;
741
- font-weight: 900;
742
- font-size: 1.25rem;
743
- }
744
-
745
- :global(.snow-step-body) {
746
- display: flex;
747
- flex-direction: column;
748
- gap: 0.25rem;
749
- }
750
-
751
- :global(.snow-step-label) {
752
- font-size: 0.65rem;
753
- font-weight: 900;
754
- text-transform: uppercase;
755
- letter-spacing: 0.05em;
756
- opacity: 0.6;
757
- }
758
-
759
- :global(.snow-step-name) {
760
- font-size: 1rem;
761
- font-weight: 900;
762
- color: var(--snow-text-main);
763
- }
764
-
765
- :global(.snow-step-amount) {
766
- display: flex;
767
- flex-direction: column;
768
- align-items: flex-end;
769
- gap: 0.25rem;
770
- text-align: right;
771
- }
772
-
773
- :global(.snow-step-amount span) {
774
- font-size: 0.65rem;
775
- opacity: 0.6;
776
- text-transform: uppercase;
777
- }
778
-
779
- :global(.snow-step-amount strong) {
780
- font-size: 1.25rem;
781
- font-weight: 900;
782
- color: var(--snow-emerald);
783
- }
784
-
785
- .snow-table-container {
786
- margin-bottom: 2rem;
787
- }
788
-
789
- .snow-table-header-action {
790
- display: flex;
791
- align-items: center;
792
- justify-content: space-between;
793
- margin-bottom: 1.5rem;
794
- flex-wrap: wrap;
795
- gap: 1rem;
796
- }
797
-
798
- .snow-table-title {
799
- font-size: 0.65rem;
800
- font-weight: 900;
801
- text-transform: uppercase;
802
- letter-spacing: 0.1em;
803
- opacity: 0.6;
804
- }
805
-
806
- .snow-btn-export {
807
- font-size: 0.65rem;
808
- font-weight: 900;
809
- text-transform: uppercase;
810
- border: none;
811
- background: none;
812
- color: var(--snow-emerald);
813
- border-bottom: 2px solid rgba(16, 185, 129, 0.3);
814
- cursor: pointer;
815
- padding: 0.25rem 0;
816
- transition: all 0.3s ease;
817
- }
818
-
819
- .snow-btn-export:hover {
820
- border-bottom-color: var(--snow-emerald);
821
- }
822
-
823
- .snow-table-overlay {
824
- border: 1px solid var(--snow-border);
825
- border-radius: 1rem;
826
- overflow: hidden;
827
- }
828
-
829
- .snow-table-scroll {
830
- overflow-x: auto;
831
- }
832
-
833
- table {
834
- width: 100%;
835
- border-collapse: collapse;
836
- font-size: 0.875rem;
837
- }
838
-
839
- table thead {
840
- background: var(--snow-bg-subtle);
841
- font-weight: 900;
842
- text-transform: uppercase;
843
- font-size: 0.65rem;
844
- opacity: 0.6;
845
- }
846
-
847
- table th {
848
- padding: 1rem;
849
- text-align: left;
850
- border-bottom: 1px solid var(--snow-border);
851
- }
852
-
853
- :global(table td) {
854
- padding: 1rem;
855
- border-bottom: 1px solid var(--snow-border);
856
- }
857
-
858
- :global(table tr:last-child td) {
859
- border-bottom: none;
860
- }
861
-
862
- :global(.snow-table-free) {
863
- color: var(--snow-emerald);
864
- font-weight: 900;
865
- }
866
-
867
- :global(.snow-table-muted) {
868
- opacity: 0.6;
869
- }
870
-
871
- @media (max-width: 768px) {
872
- .snow-sidebar {
873
- max-height: none;
874
- }
875
- .snow-content {
876
- max-height: none;
877
- }
878
- .snow-results-hero {
879
- flex-direction: column;
880
- text-align: center;
881
- gap: 1.5rem;
882
- }
883
- .snow-grid-2 {
884
- grid-template-columns: 1fr;
885
- }
886
- .snow-table-row {
887
- grid-template-columns: 1fr;
888
- }
889
- .snow-table-header {
890
- display: none;
891
- }
892
- :global(.snow-debt-item) {
893
- grid-template-columns: 1fr;
894
- padding: 1rem 0;
895
- border-left: 4px solid var(--snow-emerald);
896
- padding-left: 1rem;
897
- }
898
- }
899
- </style>
900
264
 
901
265
  <script>
902
266
  import {