@jjlmoya/utils-finance 1.45.0 → 1.47.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 (73) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +2 -1
  3. package/src/entries.ts +5 -1
  4. package/src/tests/locale_completeness.test.ts +2 -2
  5. package/src/tests/mfe_assets_contract.test.ts +48 -0
  6. package/src/tests/tool_validation.test.ts +2 -2
  7. package/src/tool/loanAprScenarioCalculator/bibliography.astro +11 -0
  8. package/src/tool/loanAprScenarioCalculator/bibliography.ts +29 -0
  9. package/src/tool/loanAprScenarioCalculator/component.astro +62 -0
  10. package/src/tool/loanAprScenarioCalculator/controller.ts +205 -0
  11. package/src/tool/loanAprScenarioCalculator/currency-dom.ts +107 -0
  12. package/src/tool/loanAprScenarioCalculator/currency.test.ts +57 -0
  13. package/src/tool/loanAprScenarioCalculator/currency.ts +105 -0
  14. package/src/tool/loanAprScenarioCalculator/dom-views.ts +190 -0
  15. package/src/tool/loanAprScenarioCalculator/entry.ts +28 -0
  16. package/src/tool/loanAprScenarioCalculator/evaluator.ts +21 -0
  17. package/src/tool/loanAprScenarioCalculator/i18n/de.ts +194 -0
  18. package/src/tool/loanAprScenarioCalculator/i18n/en.ts +194 -0
  19. package/src/tool/loanAprScenarioCalculator/i18n/es.ts +195 -0
  20. package/src/tool/loanAprScenarioCalculator/i18n/fr.ts +195 -0
  21. package/src/tool/loanAprScenarioCalculator/i18n/id.ts +193 -0
  22. package/src/tool/loanAprScenarioCalculator/i18n/it.ts +193 -0
  23. package/src/tool/loanAprScenarioCalculator/i18n/ja.ts +186 -0
  24. package/src/tool/loanAprScenarioCalculator/i18n/ko.ts +186 -0
  25. package/src/tool/loanAprScenarioCalculator/i18n/nl.ts +194 -0
  26. package/src/tool/loanAprScenarioCalculator/i18n/pl.ts +194 -0
  27. package/src/tool/loanAprScenarioCalculator/i18n/pt.ts +194 -0
  28. package/src/tool/loanAprScenarioCalculator/i18n/ru.ts +193 -0
  29. package/src/tool/loanAprScenarioCalculator/i18n/sv.ts +189 -0
  30. package/src/tool/loanAprScenarioCalculator/i18n/tr.ts +193 -0
  31. package/src/tool/loanAprScenarioCalculator/i18n/zh.ts +181 -0
  32. package/src/tool/loanAprScenarioCalculator/index.ts +11 -0
  33. package/src/tool/loanAprScenarioCalculator/loan-apr-scenario-calculator.css +699 -0
  34. package/src/tool/loanAprScenarioCalculator/logic.test.ts +65 -0
  35. package/src/tool/loanAprScenarioCalculator/logic.ts +259 -0
  36. package/src/tool/loanAprScenarioCalculator/presets.ts +51 -0
  37. package/src/tool/loanAprScenarioCalculator/scenario-dom.ts +101 -0
  38. package/src/tool/loanAprScenarioCalculator/seo.astro +11 -0
  39. package/src/tool/loanAprScenarioCalculator/storage.ts +60 -0
  40. package/src/tool/loanAprScenarioCalculator/ui.ts +55 -0
  41. package/src/tool/loanAprScenarioCalculator/validation.ts +24 -0
  42. package/src/tool/renterInsuranceCoverageGapCalculator/bibliography.astro +11 -0
  43. package/src/tool/renterInsuranceCoverageGapCalculator/bibliography.ts +6 -0
  44. package/src/tool/renterInsuranceCoverageGapCalculator/component.astro +80 -0
  45. package/src/tool/renterInsuranceCoverageGapCalculator/controller.ts +102 -0
  46. package/src/tool/renterInsuranceCoverageGapCalculator/currency.test.ts +17 -0
  47. package/src/tool/renterInsuranceCoverageGapCalculator/currency.ts +69 -0
  48. package/src/tool/renterInsuranceCoverageGapCalculator/dom-views.ts +68 -0
  49. package/src/tool/renterInsuranceCoverageGapCalculator/entry.ts +28 -0
  50. package/src/tool/renterInsuranceCoverageGapCalculator/evaluator.ts +17 -0
  51. package/src/tool/renterInsuranceCoverageGapCalculator/i18n/de.ts +40 -0
  52. package/src/tool/renterInsuranceCoverageGapCalculator/i18n/en.ts +98 -0
  53. package/src/tool/renterInsuranceCoverageGapCalculator/i18n/es.ts +38 -0
  54. package/src/tool/renterInsuranceCoverageGapCalculator/i18n/fr.ts +38 -0
  55. package/src/tool/renterInsuranceCoverageGapCalculator/i18n/id.ts +38 -0
  56. package/src/tool/renterInsuranceCoverageGapCalculator/i18n/it.ts +38 -0
  57. package/src/tool/renterInsuranceCoverageGapCalculator/i18n/ja.ts +38 -0
  58. package/src/tool/renterInsuranceCoverageGapCalculator/i18n/ko.ts +38 -0
  59. package/src/tool/renterInsuranceCoverageGapCalculator/i18n/nl.ts +38 -0
  60. package/src/tool/renterInsuranceCoverageGapCalculator/i18n/pl.ts +38 -0
  61. package/src/tool/renterInsuranceCoverageGapCalculator/i18n/pt.ts +38 -0
  62. package/src/tool/renterInsuranceCoverageGapCalculator/i18n/ru.ts +38 -0
  63. package/src/tool/renterInsuranceCoverageGapCalculator/i18n/sv.ts +38 -0
  64. package/src/tool/renterInsuranceCoverageGapCalculator/i18n/tr.ts +38 -0
  65. package/src/tool/renterInsuranceCoverageGapCalculator/i18n/zh.ts +38 -0
  66. package/src/tool/renterInsuranceCoverageGapCalculator/index.ts +11 -0
  67. package/src/tool/renterInsuranceCoverageGapCalculator/logic.test.ts +52 -0
  68. package/src/tool/renterInsuranceCoverageGapCalculator/logic.ts +108 -0
  69. package/src/tool/renterInsuranceCoverageGapCalculator/renter-insurance-coverage-gap-calculator.css +462 -0
  70. package/src/tool/renterInsuranceCoverageGapCalculator/seo.astro +11 -0
  71. package/src/tool/renterInsuranceCoverageGapCalculator/storage.ts +23 -0
  72. package/src/tool/renterInsuranceCoverageGapCalculator/ui.ts +48 -0
  73. package/src/tools.ts +3 -1
@@ -0,0 +1,699 @@
1
+ .loan-apr-tool {
2
+ --n-bg: #f4eee3;
3
+ --n-surface: #fffdf8;
4
+ --n-surface-strong: #f1e5d4;
5
+ --n-ink: #17232d;
6
+ --n-muted: #65717a;
7
+ --n-line: #d8cabb;
8
+ --n-accent: #c75b36;
9
+ --n-accent-soft: #f1c6af;
10
+ --n-teal: #176d69;
11
+ --n-teal-soft: #bfe0d9;
12
+ --n-good: #2f7d5a;
13
+ --n-good-soft: #e0f0e5;
14
+ --n-bad: #b34d43;
15
+ --n-bad-soft: #f5ded8;
16
+ --n-warning: #8e4a27;
17
+ --n-shadow: #17232d1c;
18
+
19
+ box-sizing: border-box;
20
+ color: var(--n-ink);
21
+ font:
22
+ 1rem Georgia,
23
+ "Times New Roman",
24
+ serif;
25
+ margin: 1.5rem auto;
26
+ max-width: 1120px;
27
+ }
28
+ .theme-dark .loan-apr-tool {
29
+ --n-bg: #111719;
30
+ --n-surface: #1b2424;
31
+ --n-surface-strong: #243131;
32
+ --n-ink: #f4eee3;
33
+ --n-muted: #b8c0bd;
34
+ --n-line: #53615f;
35
+ --n-accent: #ee936d;
36
+ --n-accent-soft: #6f392b;
37
+ --n-teal: #79c8bd;
38
+ --n-teal-soft: #244d49;
39
+ --n-good: #81d19c;
40
+ --n-good-soft: #204231;
41
+ --n-bad: #ef9389;
42
+ --n-bad-soft: #4b2928;
43
+ --n-warning: #f0ac84;
44
+ --n-shadow: #0008;
45
+ }
46
+ .loan-apr-tool *,
47
+ .loan-apr-tool *::before,
48
+ .loan-apr-tool *::after {
49
+ box-sizing: border-box;
50
+ }
51
+ .loan-apr-input-ribbon,
52
+ .loan-apr-result {
53
+ background: var(--n-surface);
54
+ border: 1px solid var(--n-line);
55
+ box-shadow: 0 14px 32px var(--n-shadow);
56
+ }
57
+ .loan-apr-input-ribbon {
58
+ border-radius: 20px 20px 0 0;
59
+ overflow: hidden;
60
+ padding: clamp(0.75rem, 2vw, 1.15rem) clamp(1rem, 3vw, 1.75rem);
61
+ }
62
+ .loan-apr-ribbon-head,
63
+ .loan-apr-result-intro {
64
+ align-items: center;
65
+ display: flex;
66
+ gap: 1rem;
67
+ justify-content: space-between;
68
+ }
69
+ .loan-apr-ribbon-head {
70
+ min-height: 2.7rem;
71
+ }
72
+ .loan-apr-eyebrow {
73
+ color: var(--n-accent);
74
+ font-size: 0.72rem;
75
+ font-weight: 700;
76
+ letter-spacing: 0.14em;
77
+ text-transform: uppercase;
78
+ }
79
+ .loan-apr-actions {
80
+ align-items: center;
81
+ display: flex;
82
+ flex-wrap: wrap;
83
+ gap: 0.65rem;
84
+ justify-content: end;
85
+ }
86
+ .loan-apr-header-controls {
87
+ align-items: center;
88
+ display: flex;
89
+ gap: 0.75rem;
90
+ justify-content: end;
91
+ }
92
+ .loan-apr-actions button,
93
+ .loan-apr-presets button,
94
+ .loan-apr-mode-row button {
95
+ border: 1px solid var(--n-line);
96
+ cursor: pointer;
97
+ font: inherit;
98
+ }
99
+ .loan-apr-text-button {
100
+ background: transparent;
101
+ color: var(--n-muted);
102
+ padding: 0.6rem 0.75rem;
103
+ }
104
+ .loan-apr-copy-button {
105
+ background: var(--n-ink);
106
+ border-radius: 999px;
107
+ color: var(--n-surface);
108
+ padding: 0.65rem 1rem;
109
+ }
110
+ .loan-apr-copy-status {
111
+ color: var(--n-teal);
112
+ font-size: 0.8rem;
113
+ min-width: 0;
114
+ }
115
+ .loan-apr-currency-copy {
116
+ display: grid;
117
+ gap: 0.15rem;
118
+ }
119
+ .loan-apr-currency-label {
120
+ color: var(--n-ink);
121
+ font-weight: 700;
122
+ }
123
+ .loan-apr-currency-copy small {
124
+ color: var(--n-muted);
125
+ font-size: 0.76rem;
126
+ }
127
+ .loan-apr-currency-select {
128
+ min-width: 9.5rem;
129
+ position: relative;
130
+ }
131
+ .loan-apr-currency-trigger {
132
+ align-items: center;
133
+ background: var(--n-bg);
134
+ border: 1px solid var(--n-line);
135
+ color: var(--n-ink);
136
+ cursor: pointer;
137
+ display: flex;
138
+ font: inherit;
139
+ justify-content: space-between;
140
+ min-height: 2.7rem;
141
+ padding: 0.55rem 0.7rem;
142
+ width: 100%;
143
+ }
144
+ .loan-apr-currency-trigger-main {
145
+ align-items: center;
146
+ display: flex;
147
+ gap: 0.55rem;
148
+ }
149
+ .loan-apr-currency-trigger-main span {
150
+ overflow: hidden;
151
+ text-overflow: ellipsis;
152
+ white-space: nowrap;
153
+ }
154
+ .loan-apr-currency-trigger-main strong {
155
+ color: var(--n-teal);
156
+ }
157
+ .loan-apr-currency-arrow {
158
+ border-bottom: 1px solid currentcolor;
159
+ border-right: 1px solid currentcolor;
160
+ height: 0.5rem;
161
+ transform: rotate(45deg) translateY(-0.15rem);
162
+ width: 0.5rem;
163
+ }
164
+ .loan-apr-currency-menu {
165
+ background: var(--n-surface);
166
+ border: 1px solid var(--n-line);
167
+ box-shadow: 0 12px 24px var(--n-shadow);
168
+ display: grid;
169
+ grid-template-columns: repeat(2, minmax(0, 1fr));
170
+ max-height: 18rem;
171
+ overflow-y: auto;
172
+ padding: 0.35rem;
173
+ position: absolute;
174
+ right: 0;
175
+ top: calc(100% + 0.4rem);
176
+ width: 18rem;
177
+ z-index: 3;
178
+ }
179
+ .loan-apr-currency-menu[hidden] {
180
+ display: none;
181
+ }
182
+ .loan-apr-currency-option {
183
+ align-items: center;
184
+ background: transparent;
185
+ border: 0;
186
+ color: var(--n-ink);
187
+ cursor: pointer;
188
+ display: flex;
189
+ font: inherit;
190
+ gap: 0.5rem;
191
+ padding: 0.55rem;
192
+ text-align: left;
193
+ }
194
+ .loan-apr-currency-option span {
195
+ overflow: hidden;
196
+ text-overflow: ellipsis;
197
+ white-space: nowrap;
198
+ }
199
+ .loan-apr-currency-option:hover,
200
+ .loan-apr-currency-option:focus-visible,
201
+ .loan-apr-currency-option[aria-selected="true"] {
202
+ background: var(--n-teal-soft);
203
+ }
204
+ .loan-apr-currency-option strong {
205
+ color: var(--n-teal);
206
+ min-width: 2rem;
207
+ text-align: center;
208
+ }
209
+ .loan-apr-presets {
210
+ display: flex;
211
+ flex-wrap: wrap;
212
+ gap: 0.5rem;
213
+ margin: 0.85rem 0 1rem;
214
+ padding-top: 0.85rem;
215
+ border-top: 1px solid var(--n-line);
216
+ }
217
+ .loan-apr-presets button {
218
+ background: var(--n-bg);
219
+ border-radius: 999px;
220
+ color: var(--n-ink);
221
+ padding: 0.55rem 0.8rem;
222
+ }
223
+ .loan-apr-presets button:hover,
224
+ .loan-apr-presets button:focus-visible {
225
+ border-color: var(--n-accent);
226
+ }
227
+ .loan-apr-scenarios {
228
+ align-items: stretch;
229
+ display: grid;
230
+ gap: 1rem;
231
+ grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
232
+ }
233
+ .loan-apr-scenario {
234
+ background: var(--n-bg);
235
+ border: 1px solid var(--n-line);
236
+ border-radius: 14px;
237
+ min-width: 0;
238
+ padding: 1rem;
239
+ }
240
+ .loan-apr-scenario legend {
241
+ align-items: center;
242
+ display: flex;
243
+ font-weight: 700;
244
+ gap: 0.65rem;
245
+ padding: 0;
246
+ width: 100%;
247
+ }
248
+ .loan-apr-scenario legend input {
249
+ background: transparent;
250
+ border: 0;
251
+ color: var(--n-ink);
252
+ font: inherit;
253
+ min-width: 0;
254
+ outline: 0;
255
+ width: 100%;
256
+ }
257
+ .loan-apr-scenario-index,
258
+ .loan-apr-result-index {
259
+ align-items: center;
260
+ background: var(--n-accent);
261
+ border-radius: 50%;
262
+ color: #fff;
263
+ display: inline-flex;
264
+ flex: 0 0 2rem;
265
+ font:
266
+ 0.75rem Arial,
267
+ sans-serif;
268
+ height: 2rem;
269
+ justify-content: center;
270
+ width: 2rem;
271
+ }
272
+ .loan-apr-field-grid,
273
+ .loan-apr-fees {
274
+ display: grid;
275
+ gap: 0.75rem;
276
+ grid-template-columns: repeat(2, minmax(0, 1fr));
277
+ margin-top: 1rem;
278
+ }
279
+ .loan-apr-fees {
280
+ border-top: 1px solid var(--n-line);
281
+ grid-template-columns: repeat(3, minmax(0, 1fr));
282
+ padding-top: 1rem;
283
+ }
284
+ .loan-apr-scenario label {
285
+ color: var(--n-muted);
286
+ display: grid;
287
+ font-size: 0.82rem;
288
+ gap: 0.35rem;
289
+ }
290
+ .loan-apr-input-with-unit {
291
+ align-items: center;
292
+ background: var(--n-surface);
293
+ border: 1px solid var(--n-line);
294
+ display: flex;
295
+ min-height: 2.7rem;
296
+ }
297
+ .loan-apr-input-with-unit:focus-within {
298
+ border-color: var(--n-accent);
299
+ box-shadow: 0 0 0 3px var(--n-accent-soft);
300
+ }
301
+ .loan-apr-input-with-unit input {
302
+ background: transparent;
303
+ border: 0;
304
+ color: var(--n-ink);
305
+ font:
306
+ 600 1rem Arial,
307
+ sans-serif;
308
+ min-width: 0;
309
+ outline: 0;
310
+ padding: 0.65rem 0.55rem;
311
+ width: 100%;
312
+ }
313
+ .loan-apr-input-with-unit b {
314
+ color: var(--n-muted);
315
+ font:
316
+ 700 0.7rem Arial,
317
+ sans-serif;
318
+ padding: 0.65rem 0.6rem 0.65rem 0;
319
+ white-space: nowrap;
320
+ }
321
+ .loan-apr-mode-row {
322
+ background: var(--n-surface);
323
+ border: 1px solid var(--n-line);
324
+ display: flex;
325
+ margin-top: 1rem;
326
+ }
327
+ .loan-apr-mode-row button {
328
+ background: transparent;
329
+ color: var(--n-muted);
330
+ flex: 1;
331
+ font-size: 0.75rem;
332
+ padding: 0.6rem 0.45rem;
333
+ }
334
+ .loan-apr-mode-row button[aria-pressed="true"] {
335
+ background: var(--n-teal);
336
+ border-color: var(--n-teal);
337
+ color: #fff;
338
+ }
339
+ .loan-apr-mode-row button:first-child {
340
+ border-right: 0;
341
+ }
342
+ .loan-apr-scenario > label {
343
+ margin-top: 0.8rem;
344
+ }
345
+ .loan-apr-divider {
346
+ align-items: center;
347
+ color: var(--n-accent);
348
+ display: flex;
349
+ font:
350
+ 700 0.72rem Arial,
351
+ sans-serif;
352
+ justify-content: center;
353
+ }
354
+ .loan-apr-divider span {
355
+ border: 1px solid var(--n-accent);
356
+ border-radius: 50%;
357
+ padding: 0.45rem;
358
+ }
359
+ .loan-apr-result {
360
+ border-radius: 0 0 20px 20px;
361
+ border-top: 0;
362
+ overflow: hidden;
363
+ }
364
+ .loan-apr-result-intro {
365
+ background: var(--n-surface-strong);
366
+ padding: 1.3rem clamp(1rem, 3vw, 1.75rem);
367
+ }
368
+ .loan-apr-result h2 {
369
+ font-size: clamp(1.25rem, 3vw, 1.8rem);
370
+ margin: 0.2rem 0 0;
371
+ }
372
+ .loan-apr-result-intro p {
373
+ color: var(--n-teal);
374
+ font-size: 0.95rem;
375
+ margin: 0;
376
+ text-align: right;
377
+ }
378
+ .loan-apr-result-intro p span {
379
+ color: var(--n-muted);
380
+ display: inline-block;
381
+ font-size: 0.78rem;
382
+ margin-top: 0.35rem;
383
+ max-width: 28rem;
384
+ }
385
+ .loan-apr-visual-comparison {
386
+ align-items: stretch;
387
+ background: var(--n-bg);
388
+ border-bottom: 1px solid var(--n-line);
389
+ display: grid;
390
+ gap: 0.75rem;
391
+ grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
392
+ padding: 1rem clamp(1rem, 3vw, 1.75rem);
393
+ }
394
+ .loan-apr-visual-side {
395
+ align-items: center;
396
+ border: 2px solid var(--n-line);
397
+ display: grid;
398
+ gap: 0.35rem 0.65rem;
399
+ grid-template-columns: auto 1fr auto;
400
+ min-width: 0;
401
+ padding: 0.75rem;
402
+ }
403
+ .loan-apr-visual-side small {
404
+ color: var(--n-muted);
405
+ grid-column: 2 / -1;
406
+ font:
407
+ 700 0.68rem Arial,
408
+ sans-serif;
409
+ text-transform: uppercase;
410
+ }
411
+ .loan-apr-visual-side strong {
412
+ font:
413
+ 700 1.25rem Arial,
414
+ sans-serif;
415
+ white-space: nowrap;
416
+ }
417
+ .loan-apr-visual-side.loan-apr-visual-lower,
418
+ .loan-apr-result-lower {
419
+ background: var(--n-good-soft);
420
+ border-color: var(--n-good);
421
+ }
422
+ .loan-apr-visual-side.loan-apr-visual-lower strong,
423
+ .loan-apr-visual-side.loan-apr-visual-lower small {
424
+ color: var(--n-good);
425
+ }
426
+ .loan-apr-visual-side.loan-apr-visual-higher,
427
+ .loan-apr-result-higher {
428
+ background: var(--n-bad-soft);
429
+ border-color: var(--n-bad);
430
+ }
431
+ .loan-apr-visual-side.loan-apr-visual-higher strong,
432
+ .loan-apr-visual-side.loan-apr-visual-higher small {
433
+ color: var(--n-bad);
434
+ }
435
+ .loan-apr-visual-side.loan-apr-visual-neutral {
436
+ background: var(--n-surface);
437
+ }
438
+ .loan-apr-visual-index {
439
+ align-items: center;
440
+ background: var(--n-ink);
441
+ border-radius: 50%;
442
+ color: var(--n-surface);
443
+ display: inline-flex;
444
+ flex: 0 0 1.8rem;
445
+ font:
446
+ 700 0.75rem Arial,
447
+ sans-serif;
448
+ height: 1.8rem;
449
+ justify-content: center;
450
+ width: 1.8rem;
451
+ }
452
+ .loan-apr-visual-name {
453
+ overflow: hidden;
454
+ text-overflow: ellipsis;
455
+ white-space: nowrap;
456
+ }
457
+ .loan-apr-visual-vs {
458
+ align-self: center;
459
+ color: var(--n-accent);
460
+ font:
461
+ 700 0.72rem Arial,
462
+ sans-serif;
463
+ }
464
+ .loan-apr-result-panels {
465
+ display: grid;
466
+ grid-template-columns: repeat(2, minmax(0, 1fr));
467
+ }
468
+ .loan-apr-result-panel {
469
+ border-right: 1px solid var(--n-line);
470
+ padding: 1.3rem clamp(1rem, 3vw, 1.75rem);
471
+ }
472
+ .loan-apr-result-panel:last-child {
473
+ border-right: 0;
474
+ }
475
+ .loan-apr-result-panel header {
476
+ align-items: center;
477
+ display: flex;
478
+ gap: 0.65rem;
479
+ }
480
+ .loan-apr-result-panel h3 {
481
+ font-size: 1.05rem;
482
+ margin: 0;
483
+ }
484
+ .loan-apr-badge {
485
+ background: var(--n-good-soft);
486
+ border-radius: 999px;
487
+ color: var(--n-good);
488
+ font:
489
+ 700 0.68rem Arial,
490
+ sans-serif;
491
+ margin-left: auto;
492
+ padding: 0.4rem 0.55rem;
493
+ }
494
+ .loan-apr-result-higher .loan-apr-badge {
495
+ background: var(--n-bad-soft);
496
+ color: var(--n-bad);
497
+ }
498
+ .loan-apr-badge-invalid {
499
+ background: var(--n-bad-soft);
500
+ color: var(--n-bad);
501
+ }
502
+ .loan-apr-result-invalid p {
503
+ color: var(--n-warning);
504
+ margin-bottom: 0;
505
+ }
506
+ .loan-apr-timeline {
507
+ margin: 1.5rem 0 1.1rem;
508
+ }
509
+ .loan-apr-timeline-track {
510
+ align-items: center;
511
+ display: flex;
512
+ }
513
+ .loan-apr-timeline-line {
514
+ background: var(--n-teal);
515
+ height: 3px;
516
+ width: 100%;
517
+ }
518
+ .loan-apr-timeline-b .loan-apr-timeline-line {
519
+ background: var(--n-accent);
520
+ }
521
+ .loan-apr-timeline-dot {
522
+ background: var(--n-surface);
523
+ border: 3px solid var(--n-teal);
524
+ border-radius: 50%;
525
+ height: 0.9rem;
526
+ width: 0.9rem;
527
+ }
528
+ .loan-apr-timeline-b .loan-apr-timeline-dot {
529
+ border-color: var(--n-accent);
530
+ }
531
+ .loan-apr-timeline-labels {
532
+ color: var(--n-muted);
533
+ display: flex;
534
+ font:
535
+ 0.7rem Arial,
536
+ sans-serif;
537
+ justify-content: space-between;
538
+ padding-top: 0.55rem;
539
+ }
540
+ .loan-apr-timeline-labels span {
541
+ display: grid;
542
+ gap: 0.2rem;
543
+ }
544
+ .loan-apr-timeline-labels span:nth-child(2) {
545
+ text-align: center;
546
+ }
547
+ .loan-apr-timeline-labels span:last-child {
548
+ text-align: right;
549
+ }
550
+ .loan-apr-timeline-labels strong {
551
+ color: var(--n-ink);
552
+ font-size: 0.8rem;
553
+ }
554
+ .loan-apr-metrics {
555
+ border-top: 1px solid var(--n-line);
556
+ margin: 0;
557
+ }
558
+ .loan-apr-metric {
559
+ align-items: baseline;
560
+ border-bottom: 1px solid var(--n-line);
561
+ display: flex;
562
+ gap: 1rem;
563
+ justify-content: space-between;
564
+ padding: 0.65rem 0;
565
+ }
566
+ .loan-apr-metric-better,
567
+ .loan-apr-metric-worse,
568
+ .loan-apr-metric-neutral {
569
+ border-left: 4px solid transparent;
570
+ padding-left: 0.55rem;
571
+ }
572
+ .loan-apr-metric-better {
573
+ background: color-mix(in srgb, var(--n-good-soft) 55%, transparent);
574
+ border-left-color: var(--n-good);
575
+ }
576
+ .loan-apr-metric-worse {
577
+ background: color-mix(in srgb, var(--n-bad-soft) 55%, transparent);
578
+ border-left-color: var(--n-bad);
579
+ }
580
+ .loan-apr-metric-neutral {
581
+ border-left-color: var(--n-line);
582
+ }
583
+ .loan-apr-metric dt {
584
+ color: var(--n-muted);
585
+ font:
586
+ 0.76rem Arial,
587
+ sans-serif;
588
+ }
589
+ .loan-apr-metric dd {
590
+ font:
591
+ 600 0.9rem Arial,
592
+ sans-serif;
593
+ margin: 0;
594
+ text-align: right;
595
+ }
596
+ .loan-apr-metric-emphasis {
597
+ align-items: end;
598
+ padding: 0.9rem 0;
599
+ }
600
+ .loan-apr-metric-emphasis dt {
601
+ color: var(--n-ink);
602
+ font-weight: 700;
603
+ }
604
+ .loan-apr-metric-emphasis dd {
605
+ color: var(--n-teal);
606
+ font-size: 1.65rem;
607
+ }
608
+ .loan-apr-method {
609
+ align-items: start;
610
+ border-top: 1px solid var(--n-line);
611
+ display: grid;
612
+ gap: 0.25rem 1rem;
613
+ grid-template-columns: auto 1fr;
614
+ padding: 1rem clamp(1rem, 3vw, 1.75rem);
615
+ }
616
+ .loan-apr-method > span {
617
+ color: var(--n-accent);
618
+ font:
619
+ 700 0.72rem Arial,
620
+ sans-serif;
621
+ text-transform: uppercase;
622
+ }
623
+ .loan-apr-method p,
624
+ .loan-apr-method small {
625
+ color: var(--n-muted);
626
+ margin: 0;
627
+ }
628
+ .loan-apr-method small {
629
+ grid-column: 2;
630
+ }
631
+ .loan-apr-tool button:focus-visible,
632
+ .loan-apr-tool input:focus-visible {
633
+ outline: 3px solid var(--n-accent);
634
+ outline-offset: 2px;
635
+ }
636
+
637
+ @media (max-width: 760px) {
638
+ .loan-apr-ribbon-head,
639
+ .loan-apr-result-intro {
640
+ align-items: start;
641
+ flex-direction: column;
642
+ }
643
+ .loan-apr-header-controls {
644
+ align-items: stretch;
645
+ flex-direction: column-reverse;
646
+ width: 100%;
647
+ }
648
+ .loan-apr-actions {
649
+ justify-content: start;
650
+ }
651
+ .loan-apr-currency-select {
652
+ width: 100%;
653
+ }
654
+ .loan-apr-currency-menu {
655
+ left: 0;
656
+ right: auto;
657
+ width: 100%;
658
+ }
659
+ .loan-apr-scenarios,
660
+ .loan-apr-result-panels,
661
+ .loan-apr-visual-comparison {
662
+ grid-template-columns: 1fr;
663
+ }
664
+ .loan-apr-visual-vs {
665
+ display: none;
666
+ }
667
+ .loan-apr-divider {
668
+ padding: 0.25rem 0;
669
+ }
670
+ .loan-apr-result-panel {
671
+ border-bottom: 1px solid var(--n-line);
672
+ border-right: 0;
673
+ }
674
+ .loan-apr-result-panel:last-child {
675
+ border-bottom: 0;
676
+ }
677
+ .loan-apr-result-intro p {
678
+ text-align: left;
679
+ }
680
+ .loan-apr-method {
681
+ grid-template-columns: 1fr;
682
+ }
683
+ .loan-apr-method small {
684
+ grid-column: 1;
685
+ }
686
+ }
687
+
688
+ @media (max-width: 460px) {
689
+ .loan-apr-field-grid,
690
+ .loan-apr-fees {
691
+ grid-template-columns: 1fr;
692
+ }
693
+ .loan-apr-fees {
694
+ gap: 0.65rem;
695
+ }
696
+ .loan-apr-copy-status {
697
+ min-width: 0;
698
+ }
699
+ }