@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
@@ -0,0 +1,634 @@
1
+ :root {
2
+ --snow-emerald: #10b981;
3
+ --snow-blue: #3b82f6;
4
+ --snow-rose: #f43f5e;
5
+ --snow-bg-card: rgba(255, 255, 255, 0.95);
6
+ --snow-border: rgba(226, 232, 240, 0.8);
7
+ --snow-text-main: #0f172a;
8
+ --snow-text-muted: #64748b;
9
+ --snow-bg-input: rgba(255, 255, 255, 0.8);
10
+ --snow-bg-subtle: rgba(0, 0, 0, 0.02);
11
+ --snow-bg-tab: rgba(0, 0, 0, 0.05);
12
+ }
13
+
14
+ :global(.theme-dark),
15
+ :global([data-theme="dark"]) {
16
+ --snow-bg-card: rgba(15, 23, 42, 0.9);
17
+ --snow-border: rgba(30, 41, 59, 1);
18
+ --snow-text-main: #f8fafc;
19
+ --snow-text-muted: #94a3b8;
20
+ --snow-bg-input: rgba(0, 0, 0, 0.3);
21
+ }
22
+
23
+ .snow-container {
24
+ width: 100%;
25
+ color: var(--snow-text-main);
26
+ }
27
+
28
+ .snow-main-card {
29
+ background: var(--snow-bg-card);
30
+ backdrop-filter: blur(24px);
31
+ -webkit-backdrop-filter: blur(24px);
32
+ border-radius: 2.5rem;
33
+ border: 1px solid var(--snow-border);
34
+ display: grid;
35
+ grid-template-columns: 1fr;
36
+ box-shadow: 0 40px 100px -20px rgba(0, 0, 0, 0.1);
37
+ overflow: hidden;
38
+ }
39
+
40
+ @media (min-width: 1024px) {
41
+ .snow-main-card {
42
+ grid-template-columns: 380px 1fr;
43
+ }
44
+ }
45
+
46
+ .snow-sidebar {
47
+ padding: 3rem 2.5rem;
48
+ background: var(--snow-bg-subtle);
49
+ border-right: 1px solid var(--snow-border);
50
+ overflow-y: auto;
51
+ max-height: 80vh;
52
+ }
53
+
54
+ .snow-title {
55
+ font-size: 1.75rem;
56
+ font-weight: 900;
57
+ letter-spacing: -0.04em;
58
+ display: flex;
59
+ align-items: center;
60
+ gap: 0.75rem;
61
+ margin-bottom: 2.5rem;
62
+ color: var(--snow-emerald);
63
+ }
64
+
65
+ .snow-section-label {
66
+ display: block;
67
+ font-size: 0.65rem;
68
+ font-weight: 900;
69
+ text-transform: uppercase;
70
+ letter-spacing: 0.15em;
71
+ opacity: 0.4;
72
+ margin-bottom: 1.5rem;
73
+ }
74
+
75
+ .snow-input-group {
76
+ margin-bottom: 1.5rem;
77
+ }
78
+
79
+ .snow-label {
80
+ display: block;
81
+ font-size: 0.75rem;
82
+ font-weight: 850;
83
+ margin-bottom: 0.6rem;
84
+ opacity: 0.8;
85
+ }
86
+
87
+ .snow-input-wrapper {
88
+ position: relative;
89
+ display: flex;
90
+ align-items: center;
91
+ }
92
+
93
+ .snow-input {
94
+ width: 100%;
95
+ background: var(--snow-bg-input);
96
+ border: 1.5px solid var(--snow-border);
97
+ padding: 1rem 1.25rem;
98
+ border-radius: 1.25rem;
99
+ font-size: 1rem;
100
+ font-weight: 700;
101
+ color: inherit;
102
+ transition: all 0.3s cubic-bezier(0.19, 1, 0.22, 1);
103
+ }
104
+
105
+ .snow-input:focus {
106
+ outline: none;
107
+ border-color: var(--snow-emerald);
108
+ box-shadow: 0 0 0 5px rgba(16, 185, 129, 0.1);
109
+ }
110
+
111
+ .snow-input-unit {
112
+ position: absolute;
113
+ right: 1.25rem;
114
+ font-weight: 900;
115
+ font-size: 0.75rem;
116
+ opacity: 0.3;
117
+ pointer-events: none;
118
+ }
119
+
120
+ .snow-help-text,
121
+ .snow-input-help {
122
+ font-size: 0.6rem;
123
+ line-height: 1.4;
124
+ opacity: 0.4;
125
+ font-weight: bold;
126
+ margin-top: 0.5rem;
127
+ }
128
+
129
+ .snow-method-tabs {
130
+ display: flex;
131
+ background: var(--snow-bg-tab);
132
+ padding: 0.4rem;
133
+ border-radius: 1.25rem;
134
+ margin: 2rem 0;
135
+ gap: 0.4rem;
136
+ }
137
+
138
+ .snow-tab {
139
+ flex: 1;
140
+ padding: 0.85rem;
141
+ border-radius: 1rem;
142
+ border: none;
143
+ font-weight: 900;
144
+ font-size: 0.75rem;
145
+ cursor: pointer;
146
+ background: transparent;
147
+ color: var(--snow-text-muted);
148
+ transition: all 0.3s cubic-bezier(0.19, 1, 0.22, 1);
149
+ }
150
+
151
+ .snow-tab.active {
152
+ background: white;
153
+ color: var(--snow-emerald);
154
+ box-shadow: 0 10px 20px -5px rgba(0, 0, 0, 0.1);
155
+ }
156
+
157
+ :global(.theme-dark) .snow-tab.active,
158
+ :global([data-theme="dark"]) .snow-tab.active {
159
+ background: rgba(255, 255, 255, 0.1);
160
+ color: white;
161
+ }
162
+
163
+ .snow-adder-card {
164
+ background: rgba(16, 185, 129, 0.08);
165
+ border: 1.5px solid rgba(16, 185, 129, 0.2);
166
+ padding: 2rem 1.5rem;
167
+ border-radius: 1.75rem;
168
+ margin-bottom: 2rem;
169
+ }
170
+
171
+ .snow-adder-content {
172
+ display: flex;
173
+ flex-direction: column;
174
+ gap: 1rem;
175
+ }
176
+
177
+ .snow-grid-2 {
178
+ display: grid;
179
+ grid-template-columns: 1fr 1fr;
180
+ gap: 0.75rem;
181
+ }
182
+
183
+ .snow-btn {
184
+ padding: 0.85rem 1.5rem;
185
+ border-radius: 1rem;
186
+ border: none;
187
+ font-weight: 900;
188
+ font-size: 0.75rem;
189
+ cursor: pointer;
190
+ transition: all 0.3s cubic-bezier(0.19, 1, 0.22, 1);
191
+ display: flex;
192
+ align-items: center;
193
+ gap: 0.75rem;
194
+ justify-content: center;
195
+ text-transform: uppercase;
196
+ letter-spacing: 0.05em;
197
+ }
198
+
199
+ .snow-btn-add {
200
+ background: linear-gradient(
201
+ 135deg,
202
+ var(--snow-emerald),
203
+ var(--snow-blue)
204
+ );
205
+ color: white;
206
+ }
207
+
208
+ .snow-btn-add:hover {
209
+ transform: translateY(-2px);
210
+ box-shadow: 0 20px 40px -10px rgba(16, 185, 129, 0.2);
211
+ }
212
+
213
+ .snow-btn-clear {
214
+ margin-top: 2rem;
215
+ font-size: 0.65rem;
216
+ font-weight: 900;
217
+ text-transform: uppercase;
218
+ letter-spacing: 0.05em;
219
+ color: var(--snow-rose);
220
+ opacity: 0.5;
221
+ background: none;
222
+ border: none;
223
+ cursor: pointer;
224
+ display: flex;
225
+ align-items: center;
226
+ gap: 0.5rem;
227
+ transition: all 0.3s ease;
228
+ }
229
+
230
+ .snow-btn-clear:hover {
231
+ opacity: 1;
232
+ color: var(--snow-rose);
233
+ }
234
+
235
+ .snow-content {
236
+ padding: 3rem;
237
+ overflow-y: auto;
238
+ max-height: 80vh;
239
+ }
240
+
241
+ .snow-empty-view {
242
+ display: flex;
243
+ flex-direction: column;
244
+ align-items: center;
245
+ justify-content: center;
246
+ min-height: 400px;
247
+ text-align: center;
248
+ }
249
+
250
+ .snow-empty-icon {
251
+ font-size: 3rem;
252
+ opacity: 0.2;
253
+ margin-bottom: 1rem;
254
+ }
255
+
256
+ .snow-empty-title {
257
+ font-size: 1.5rem;
258
+ font-weight: 900;
259
+ text-transform: uppercase;
260
+ letter-spacing: -0.02em;
261
+ margin-bottom: 1rem;
262
+ }
263
+
264
+ .snow-empty-description {
265
+ max-width: 300px;
266
+ font-size: 0.875rem;
267
+ opacity: 0.5;
268
+ }
269
+
270
+ .snow-hidden {
271
+ display: none;
272
+ }
273
+
274
+ .snow-inventory-area {
275
+ margin-bottom: 2rem;
276
+ }
277
+
278
+ .snow-mini-table {
279
+ border: 1px solid var(--snow-border);
280
+ border-radius: 1rem;
281
+ overflow: hidden;
282
+ }
283
+
284
+ .snow-table-row {
285
+ display: grid;
286
+ grid-template-columns: 1fr 1fr 1fr 1fr 60px;
287
+ padding: 1rem;
288
+ font-size: 0.875rem;
289
+ border-bottom: 1px solid var(--snow-border);
290
+ align-items: center;
291
+ }
292
+
293
+ .snow-table-header {
294
+ background: var(--snow-bg-subtle);
295
+ font-weight: 900;
296
+ text-transform: uppercase;
297
+ font-size: 0.65rem;
298
+ opacity: 0.6;
299
+ }
300
+
301
+ .snow-debt-list {
302
+ max-height: 200px;
303
+ overflow-y: auto;
304
+ }
305
+
306
+ :global(.snow-debt-item) {
307
+ display: grid;
308
+ grid-template-columns: 1fr 1fr 1fr 1fr 60px;
309
+ padding: 1rem;
310
+ border-bottom: 1px solid var(--snow-border);
311
+ align-items: center;
312
+ gap: 1rem;
313
+ }
314
+
315
+ :global(.snow-debt-remove) {
316
+ background: none;
317
+ border: none;
318
+ color: var(--snow-rose);
319
+ cursor: pointer;
320
+ font-weight: 900;
321
+ font-size: 1.25rem;
322
+ opacity: 0.3;
323
+ transition: opacity 0.3s ease;
324
+ }
325
+
326
+ :global(.snow-debt-remove:hover) {
327
+ opacity: 1;
328
+ }
329
+
330
+ .snow-results-hero {
331
+ background: linear-gradient(
332
+ 135deg,
333
+ rgba(16, 185, 129, 0.1),
334
+ rgba(59, 130, 246, 0.1)
335
+ );
336
+ border: 1.5px solid var(--snow-border);
337
+ border-radius: 1.75rem;
338
+ padding: 3rem;
339
+ margin-bottom: 2rem;
340
+ display: flex;
341
+ justify-content: space-between;
342
+ align-items: center;
343
+ }
344
+
345
+ .snow-hero-main {
346
+ display: flex;
347
+ flex-direction: column;
348
+ gap: 0.5rem;
349
+ }
350
+
351
+ .snow-hero-label {
352
+ font-size: 0.65rem;
353
+ font-weight: 900;
354
+ text-transform: uppercase;
355
+ letter-spacing: 0.1em;
356
+ opacity: 0.6;
357
+ }
358
+
359
+ .snow-hero-value {
360
+ font-size: 2.5rem;
361
+ font-weight: 900;
362
+ letter-spacing: -0.02em;
363
+ color: var(--snow-emerald);
364
+ }
365
+
366
+ .snow-hero-badge {
367
+ display: flex;
368
+ align-items: center;
369
+ gap: 0.75rem;
370
+ background: rgba(16, 185, 129, 0.1);
371
+ padding: 1rem 1.5rem;
372
+ border-radius: 1rem;
373
+ font-weight: 900;
374
+ font-size: 0.75rem;
375
+ text-transform: uppercase;
376
+ letter-spacing: 0.05em;
377
+ color: var(--snow-emerald);
378
+ }
379
+
380
+ .snow-grid-stats {
381
+ display: grid;
382
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
383
+ gap: 1.5rem;
384
+ margin-bottom: 3rem;
385
+ }
386
+
387
+ .snow-stat-box {
388
+ background: var(--snow-bg-subtle);
389
+ border: 1px solid var(--snow-border);
390
+ border-radius: 1.25rem;
391
+ padding: 2rem 1.5rem;
392
+ text-align: center;
393
+ }
394
+
395
+ .snow-stat-highlight {
396
+ background: rgba(59, 130, 246, 0.08);
397
+ border-color: rgba(59, 130, 246, 0.2);
398
+ }
399
+
400
+ .snow-stat-value {
401
+ font-size: 1.875rem;
402
+ font-weight: 900;
403
+ color: var(--snow-emerald);
404
+ margin-bottom: 0.5rem;
405
+ }
406
+
407
+ .snow-stat-label {
408
+ font-size: 0.65rem;
409
+ font-weight: 900;
410
+ text-transform: uppercase;
411
+ letter-spacing: 0.1em;
412
+ opacity: 0.6;
413
+ }
414
+
415
+ .snow-action-plan {
416
+ margin-bottom: 3rem;
417
+ }
418
+
419
+ .snow-action-header {
420
+ display: flex;
421
+ align-items: center;
422
+ justify-content: space-between;
423
+ margin-bottom: 2rem;
424
+ flex-wrap: wrap;
425
+ gap: 1rem;
426
+ }
427
+
428
+ .snow-action-title {
429
+ font-size: 0.65rem;
430
+ font-weight: 900;
431
+ text-transform: uppercase;
432
+ letter-spacing: 0.1em;
433
+ opacity: 0.6;
434
+ }
435
+
436
+ .snow-action-help {
437
+ font-size: 0.6rem;
438
+ font-weight: 900;
439
+ background: rgba(59, 130, 246, 0.1);
440
+ padding: 0.5rem 1rem;
441
+ border-radius: 2rem;
442
+ text-transform: uppercase;
443
+ color: var(--snow-blue);
444
+ }
445
+
446
+ .snow-action-list {
447
+ display: flex;
448
+ flex-direction: column;
449
+ gap: 1rem;
450
+ }
451
+
452
+ :global(.snow-plan-item) {
453
+ display: grid;
454
+ grid-template-columns: 50px 1fr 1fr;
455
+ gap: 1.5rem;
456
+ align-items: center;
457
+ padding: 1.5rem;
458
+ background: var(--snow-bg-subtle);
459
+ border: 1.5px solid var(--snow-border);
460
+ border-radius: 1rem;
461
+ }
462
+
463
+ :global(.snow-plan-item.active-step) {
464
+ background: rgba(16, 185, 129, 0.05);
465
+ border-color: rgba(16, 185, 129, 0.3);
466
+ }
467
+
468
+ :global(.snow-step-marker) {
469
+ width: 50px;
470
+ height: 50px;
471
+ background: var(--snow-emerald);
472
+ color: white;
473
+ display: flex;
474
+ align-items: center;
475
+ justify-content: center;
476
+ border-radius: 50%;
477
+ font-weight: 900;
478
+ font-size: 1.25rem;
479
+ }
480
+
481
+ :global(.snow-step-body) {
482
+ display: flex;
483
+ flex-direction: column;
484
+ gap: 0.25rem;
485
+ }
486
+
487
+ :global(.snow-step-label) {
488
+ font-size: 0.65rem;
489
+ font-weight: 900;
490
+ text-transform: uppercase;
491
+ letter-spacing: 0.05em;
492
+ opacity: 0.6;
493
+ }
494
+
495
+ :global(.snow-step-name) {
496
+ font-size: 1rem;
497
+ font-weight: 900;
498
+ color: var(--snow-text-main);
499
+ }
500
+
501
+ :global(.snow-step-amount) {
502
+ display: flex;
503
+ flex-direction: column;
504
+ align-items: flex-end;
505
+ gap: 0.25rem;
506
+ text-align: right;
507
+ }
508
+
509
+ :global(.snow-step-amount span) {
510
+ font-size: 0.65rem;
511
+ opacity: 0.6;
512
+ text-transform: uppercase;
513
+ }
514
+
515
+ :global(.snow-step-amount strong) {
516
+ font-size: 1.25rem;
517
+ font-weight: 900;
518
+ color: var(--snow-emerald);
519
+ }
520
+
521
+ .snow-table-container {
522
+ margin-bottom: 2rem;
523
+ }
524
+
525
+ .snow-table-header-action {
526
+ display: flex;
527
+ align-items: center;
528
+ justify-content: space-between;
529
+ margin-bottom: 1.5rem;
530
+ flex-wrap: wrap;
531
+ gap: 1rem;
532
+ }
533
+
534
+ .snow-table-title {
535
+ font-size: 0.65rem;
536
+ font-weight: 900;
537
+ text-transform: uppercase;
538
+ letter-spacing: 0.1em;
539
+ opacity: 0.6;
540
+ }
541
+
542
+ .snow-btn-export {
543
+ font-size: 0.65rem;
544
+ font-weight: 900;
545
+ text-transform: uppercase;
546
+ border: none;
547
+ background: none;
548
+ color: var(--snow-emerald);
549
+ border-bottom: 2px solid rgba(16, 185, 129, 0.3);
550
+ cursor: pointer;
551
+ padding: 0.25rem 0;
552
+ transition: all 0.3s ease;
553
+ }
554
+
555
+ .snow-btn-export:hover {
556
+ border-bottom-color: var(--snow-emerald);
557
+ }
558
+
559
+ .snow-table-overlay {
560
+ border: 1px solid var(--snow-border);
561
+ border-radius: 1rem;
562
+ overflow: hidden;
563
+ }
564
+
565
+ .snow-table-scroll {
566
+ overflow-x: auto;
567
+ }
568
+
569
+ table {
570
+ width: 100%;
571
+ border-collapse: collapse;
572
+ font-size: 0.875rem;
573
+ }
574
+
575
+ table thead {
576
+ background: var(--snow-bg-subtle);
577
+ font-weight: 900;
578
+ text-transform: uppercase;
579
+ font-size: 0.65rem;
580
+ opacity: 0.6;
581
+ }
582
+
583
+ table th {
584
+ padding: 1rem;
585
+ text-align: left;
586
+ border-bottom: 1px solid var(--snow-border);
587
+ }
588
+
589
+ :global(table td) {
590
+ padding: 1rem;
591
+ border-bottom: 1px solid var(--snow-border);
592
+ }
593
+
594
+ :global(table tr:last-child td) {
595
+ border-bottom: none;
596
+ }
597
+
598
+ :global(.snow-table-free) {
599
+ color: var(--snow-emerald);
600
+ font-weight: 900;
601
+ }
602
+
603
+ :global(.snow-table-muted) {
604
+ opacity: 0.6;
605
+ }
606
+
607
+ @media (max-width: 768px) {
608
+ .snow-sidebar {
609
+ max-height: none;
610
+ }
611
+ .snow-content {
612
+ max-height: none;
613
+ }
614
+ .snow-results-hero {
615
+ flex-direction: column;
616
+ text-align: center;
617
+ gap: 1.5rem;
618
+ }
619
+ .snow-grid-2 {
620
+ grid-template-columns: 1fr;
621
+ }
622
+ .snow-table-row {
623
+ grid-template-columns: 1fr;
624
+ }
625
+ .snow-table-header {
626
+ display: none;
627
+ }
628
+ :global(.snow-debt-item) {
629
+ grid-template-columns: 1fr;
630
+ padding: 1rem 0;
631
+ border-left: 4px solid var(--snow-emerald);
632
+ padding-left: 1rem;
633
+ }
634
+ }