@jjlmoya/utils-home 1.28.0 → 1.30.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/entries.ts +7 -1
  3. package/src/index.ts +2 -0
  4. package/src/tests/locale_completeness.test.ts +2 -2
  5. package/src/tests/tool_validation.test.ts +2 -2
  6. package/src/tool/applianceCostCalculator/appliance-cost-calculator.css +635 -0
  7. package/src/tool/applianceCostCalculator/bibliography.astro +14 -0
  8. package/src/tool/applianceCostCalculator/bibliography.ts +14 -0
  9. package/src/tool/applianceCostCalculator/component.astro +322 -0
  10. package/src/tool/applianceCostCalculator/entry.ts +29 -0
  11. package/src/tool/applianceCostCalculator/i18n/de.ts +229 -0
  12. package/src/tool/applianceCostCalculator/i18n/en.ts +229 -0
  13. package/src/tool/applianceCostCalculator/i18n/es.ts +229 -0
  14. package/src/tool/applianceCostCalculator/i18n/fr.ts +229 -0
  15. package/src/tool/applianceCostCalculator/i18n/id.ts +229 -0
  16. package/src/tool/applianceCostCalculator/i18n/it.ts +229 -0
  17. package/src/tool/applianceCostCalculator/i18n/ja.ts +229 -0
  18. package/src/tool/applianceCostCalculator/i18n/ko.ts +229 -0
  19. package/src/tool/applianceCostCalculator/i18n/nl.ts +229 -0
  20. package/src/tool/applianceCostCalculator/i18n/pl.ts +229 -0
  21. package/src/tool/applianceCostCalculator/i18n/pt.ts +229 -0
  22. package/src/tool/applianceCostCalculator/i18n/ru.ts +229 -0
  23. package/src/tool/applianceCostCalculator/i18n/sv.ts +229 -0
  24. package/src/tool/applianceCostCalculator/i18n/tr.ts +229 -0
  25. package/src/tool/applianceCostCalculator/i18n/zh.ts +229 -0
  26. package/src/tool/applianceCostCalculator/index.ts +9 -0
  27. package/src/tool/applianceCostCalculator/logic.ts +122 -0
  28. package/src/tool/applianceCostCalculator/seo.astro +15 -0
  29. package/src/tool/applianceCostCalculator/ui.ts +41 -0
  30. package/src/tool/deskErgonomics/bibliography.astro +14 -0
  31. package/src/tool/deskErgonomics/bibliography.ts +5 -0
  32. package/src/tool/deskErgonomics/component.astro +192 -0
  33. package/src/tool/deskErgonomics/desk-ergonomics.css +361 -0
  34. package/src/tool/deskErgonomics/entry.ts +29 -0
  35. package/src/tool/deskErgonomics/i18n/de.ts +237 -0
  36. package/src/tool/deskErgonomics/i18n/en.ts +215 -0
  37. package/src/tool/deskErgonomics/i18n/es.ts +237 -0
  38. package/src/tool/deskErgonomics/i18n/fr.ts +237 -0
  39. package/src/tool/deskErgonomics/i18n/id.ts +215 -0
  40. package/src/tool/deskErgonomics/i18n/it.ts +237 -0
  41. package/src/tool/deskErgonomics/i18n/ja.ts +215 -0
  42. package/src/tool/deskErgonomics/i18n/ko.ts +215 -0
  43. package/src/tool/deskErgonomics/i18n/nl.ts +215 -0
  44. package/src/tool/deskErgonomics/i18n/pl.ts +215 -0
  45. package/src/tool/deskErgonomics/i18n/pt.ts +237 -0
  46. package/src/tool/deskErgonomics/i18n/ru.ts +215 -0
  47. package/src/tool/deskErgonomics/i18n/sv.ts +215 -0
  48. package/src/tool/deskErgonomics/i18n/tr.ts +215 -0
  49. package/src/tool/deskErgonomics/i18n/zh.ts +215 -0
  50. package/src/tool/deskErgonomics/index.ts +9 -0
  51. package/src/tool/deskErgonomics/logic.ts +49 -0
  52. package/src/tool/deskErgonomics/seo.astro +15 -0
  53. package/src/tool/deskErgonomics/ui.ts +28 -0
  54. package/src/tool/vampireDrawSimulator/bibliography.ts +3 -3
  55. package/src/tools.ts +4 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jjlmoya/utils-home",
3
- "version": "1.28.0",
3
+ "version": "1.30.0",
4
4
  "type": "module",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./src/index.ts",
package/src/entries.ts CHANGED
@@ -20,6 +20,10 @@ export { wallPaintingCalculator } from './tool/wallPaintingCalculator/entry';
20
20
  export type { WallPaintingCalculatorLocaleContent } from './tool/wallPaintingCalculator/entry';
21
21
  export { vampireDrawSimulator } from './tool/vampireDrawSimulator/entry';
22
22
  export type { VampireDrawSimulatorLocaleContent } from './tool/vampireDrawSimulator/entry';
23
+ export { deskErgonomics } from './tool/deskErgonomics/entry';
24
+ export type { DeskErgonomicsLocaleContent } from './tool/deskErgonomics/entry';
25
+ export { applianceCostCalculator } from './tool/applianceCostCalculator/entry';
26
+ export type { ApplianceCostCalculatorLocaleContent } from './tool/applianceCostCalculator/entry';
23
27
  export { homeCategory } from './category';
24
28
  import { dewPointCalculator } from './tool/dewPointCalculator/entry';
25
29
  import { heatingComparator } from './tool/heatingComparator/entry';
@@ -32,4 +36,6 @@ import { wifiRangeSimulator } from './tool/wifiRangeSimulator/entry';
32
36
  import { acTonnageCalculator } from './tool/acTonnageCalculator/entry';
33
37
  import { wallPaintingCalculator } from './tool/wallPaintingCalculator/entry';
34
38
  import { vampireDrawSimulator } from './tool/vampireDrawSimulator/entry';
35
- export const ALL_ENTRIES = [dewPointCalculator, heatingComparator, ledSavingCalculator, projectorCalculator, qrGenerator, solarCalculator, tariffComparator, wifiRangeSimulator, acTonnageCalculator, wallPaintingCalculator, vampireDrawSimulator];
39
+ import { deskErgonomics } from './tool/deskErgonomics/entry';
40
+ import { applianceCostCalculator } from './tool/applianceCostCalculator/entry';
41
+ export const ALL_ENTRIES = [dewPointCalculator, heatingComparator, ledSavingCalculator, projectorCalculator, qrGenerator, solarCalculator, tariffComparator, wifiRangeSimulator, acTonnageCalculator, wallPaintingCalculator, vampireDrawSimulator, deskErgonomics, applianceCostCalculator];
package/src/index.ts CHANGED
@@ -26,4 +26,6 @@ export { TARIFF_COMPARATOR_TOOL } from './tool/tariffComparator';
26
26
  export { HEATING_COMPARATOR_TOOL } from './tool/heatingComparator';
27
27
  export { WALL_PAINTING_CALCULATOR_TOOL } from './tool/wallPaintingCalculator';
28
28
  export { VAMPIRE_DRAW_SIMULATOR_TOOL } from './tool/vampireDrawSimulator';
29
+ export { DESK_ERGONOMICS_TOOL } from './tool/deskErgonomics';
30
+ export { APPLIANCE_COST_CALCULATOR_TOOL } from './tool/applianceCostCalculator';
29
31
 
@@ -17,8 +17,8 @@ describe('Locale Completeness Validation', () => {
17
17
  });
18
18
  });
19
19
 
20
- it('should have 11 tools registered', () => {
21
- expect(ALL_TOOLS.length).toBe(11);
20
+ it('should have 13 tools registered', () => {
21
+ expect(ALL_TOOLS.length).toBe(13);
22
22
  });
23
23
  });
24
24
 
@@ -4,8 +4,8 @@ import { homeCategory } from '../data';
4
4
 
5
5
  describe('Tool Validation Suite', () => {
6
6
  describe('Library Registration', () => {
7
- it('should have 11 tools in ALL_TOOLS', () => {
8
- expect(ALL_TOOLS.length).toBe(11);
7
+ it('should have 13 tools in ALL_TOOLS', () => {
8
+ expect(ALL_TOOLS.length).toBe(13);
9
9
  });
10
10
 
11
11
  it('homeCategory should be defined', () => {
@@ -0,0 +1,635 @@
1
+ .apc-root {
2
+ --apc-accent: #6366f1;
3
+ --apc-accent-glow: rgba(99, 102, 241, 0.35);
4
+ --apc-success: #22c55e;
5
+ --apc-warn: #f59e0b;
6
+ --apc-danger: #ef4444;
7
+ --apc-surface: var(--bg-surface);
8
+ --apc-page: var(--bg-page);
9
+ --apc-text: var(--text-main);
10
+ --apc-muted: var(--text-muted);
11
+ --apc-base: var(--text-base);
12
+ --apc-border: var(--border-color);
13
+
14
+ width: 100%;
15
+ padding: 1rem 0;
16
+ }
17
+
18
+ .apc-card {
19
+ width: 100%;
20
+ max-width: 640px;
21
+ margin: 0 auto;
22
+ background: var(--apc-surface);
23
+ border: 1px solid var(--apc-border);
24
+ border-radius: 28px;
25
+ overflow: hidden;
26
+ display: flex;
27
+ flex-direction: column;
28
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04), 0 8px 24px -4px rgba(0, 0, 0, 0.08);
29
+ }
30
+
31
+ .apc-stage {
32
+ position: relative;
33
+ padding: 2rem 1.5rem 1.25rem;
34
+ border-bottom: 1px solid var(--apc-border);
35
+ overflow: hidden;
36
+ }
37
+
38
+ .apc-stage-glow {
39
+ position: absolute;
40
+ top: 50%;
41
+ left: 50%;
42
+ width: 320px;
43
+ height: 320px;
44
+ border-radius: 50%;
45
+ background: radial-gradient(circle, var(--apc-accent-glow) 0%, transparent 70%);
46
+ transform: translate(-50%, -50%);
47
+ pointer-events: none;
48
+ opacity: 0.6;
49
+ transition: opacity 0.6s ease;
50
+ }
51
+
52
+ .apc-carousel {
53
+ position: relative;
54
+ z-index: 1;
55
+ display: flex;
56
+ justify-content: center;
57
+ gap: 0.75rem;
58
+ }
59
+
60
+ .apc-appliance {
61
+ display: flex;
62
+ flex-direction: column;
63
+ align-items: center;
64
+ gap: 0.5rem;
65
+ padding: 1rem 1.25rem;
66
+ border-radius: 20px;
67
+ border: 1.5px solid var(--apc-border);
68
+ background: transparent;
69
+ color: var(--apc-muted);
70
+ font-size: 0.7rem;
71
+ font-weight: 700;
72
+ letter-spacing: 0.04em;
73
+ cursor: pointer;
74
+ transition: all 0.35s cubic-bezier(0.16, 1, 0.3, 1);
75
+ }
76
+
77
+ .apc-appliance:hover {
78
+ border-color: var(--apc-accent);
79
+ color: var(--apc-text);
80
+ transform: translateY(-3px);
81
+ box-shadow: 0 8px 24px -8px var(--apc-accent-glow);
82
+ }
83
+
84
+ .apc-appliance.apc-active {
85
+ background: var(--apc-accent);
86
+ border-color: var(--apc-accent);
87
+ color: #fff;
88
+ transform: translateY(-3px) scale(1.04);
89
+ box-shadow: 0 12px 32px -8px var(--apc-accent-glow);
90
+ }
91
+
92
+ .apc-appliance svg {
93
+ width: 32px;
94
+ height: 32px;
95
+ transition: transform 0.35s cubic-bezier(0.16, 1, 0.3, 1);
96
+ }
97
+
98
+ .apc-appliance.apc-active svg {
99
+ transform: scale(1.1);
100
+ }
101
+
102
+ .apc-hero-num {
103
+ text-align: center;
104
+ margin-top: 1.5rem;
105
+ position: relative;
106
+ z-index: 1;
107
+ }
108
+
109
+ .apc-hero-label {
110
+ font-size: 0.6rem;
111
+ font-weight: 800;
112
+ text-transform: uppercase;
113
+ letter-spacing: 0.22em;
114
+ color: var(--apc-muted);
115
+ margin: 0 0 0.375rem;
116
+ }
117
+
118
+ .apc-hero-value {
119
+ font-size: clamp(3rem, 9vw, 4.5rem);
120
+ font-weight: 900;
121
+ line-height: 1;
122
+ margin: 0;
123
+ color: var(--apc-base);
124
+ letter-spacing: -0.03em;
125
+ }
126
+
127
+ .apc-hero-unit {
128
+ font-size: clamp(1.1rem, 3vw, 1.6rem);
129
+ font-weight: 400;
130
+ color: var(--apc-muted);
131
+ }
132
+
133
+ .apc-currency-row {
134
+ display: flex;
135
+ align-items: center;
136
+ justify-content: center;
137
+ gap: 0.75rem;
138
+ margin-top: 1rem;
139
+ position: relative;
140
+ z-index: 1;
141
+ }
142
+
143
+ .apc-currency-label {
144
+ font-size: 0.6rem;
145
+ font-weight: 900;
146
+ text-transform: uppercase;
147
+ letter-spacing: 0.16em;
148
+ color: var(--apc-muted);
149
+ }
150
+
151
+ .apc-currency-btns {
152
+ display: flex;
153
+ gap: 0.3rem;
154
+ }
155
+
156
+ .apc-currency-btn {
157
+ padding: 0.35rem 0.6rem;
158
+ border-radius: 8px;
159
+ border: 1px solid var(--apc-border);
160
+ background: var(--apc-page);
161
+ color: var(--apc-muted);
162
+ font-size: 0.75rem;
163
+ font-weight: 700;
164
+ cursor: pointer;
165
+ transition: all 0.2s;
166
+ }
167
+
168
+ .apc-currency-btn:hover {
169
+ border-color: var(--apc-accent);
170
+ color: var(--apc-text);
171
+ }
172
+
173
+ .apc-currency-btn.apc-currency-active {
174
+ background: var(--apc-accent);
175
+ border-color: var(--apc-accent);
176
+ color: #fff;
177
+ }
178
+
179
+ .apc-body {
180
+ padding: 1.25rem 1.5rem;
181
+ display: flex;
182
+ flex-direction: column;
183
+ gap: 1.25rem;
184
+ }
185
+
186
+ .apc-section-label {
187
+ font-size: 0.6rem;
188
+ font-weight: 900;
189
+ text-transform: uppercase;
190
+ letter-spacing: 0.2em;
191
+ color: var(--apc-accent);
192
+ margin: 0;
193
+ }
194
+
195
+ .apc-pill-track {
196
+ display: flex;
197
+ background: var(--apc-page);
198
+ border: 1px solid var(--apc-border);
199
+ border-radius: 14px;
200
+ padding: 0.3rem;
201
+ position: relative;
202
+ }
203
+
204
+ .apc-pill-btn {
205
+ flex: 1;
206
+ padding: 0.55rem 0.25rem;
207
+ border-radius: 11px;
208
+ border: none;
209
+ background: transparent;
210
+ color: var(--apc-muted);
211
+ font-size: 0.78rem;
212
+ font-weight: 700;
213
+ cursor: pointer;
214
+ transition: color 0.25s;
215
+ position: relative;
216
+ z-index: 1;
217
+ }
218
+
219
+ .apc-pill-btn:hover {
220
+ color: var(--apc-text);
221
+ }
222
+
223
+ .apc-pill-indicator {
224
+ position: absolute;
225
+ top: 0.3rem;
226
+ left: 0.3rem;
227
+ height: calc(100% - 0.6rem);
228
+ border-radius: 11px;
229
+ background: var(--apc-accent);
230
+ transition: transform 0.4s cubic-bezier(0.16, 1, 0.3, 1), width 0.4s cubic-bezier(0.16, 1, 0.3, 1);
231
+ z-index: 0;
232
+ }
233
+
234
+ .apc-pill-btn.apc-active {
235
+ color: #fff;
236
+ }
237
+
238
+ .apc-fields {
239
+ display: grid;
240
+ grid-template-columns: 1fr 1fr;
241
+ gap: 1rem;
242
+ }
243
+
244
+ .apc-field {
245
+ display: flex;
246
+ flex-direction: column;
247
+ gap: 0.4rem;
248
+ }
249
+
250
+ .apc-field-label {
251
+ font-size: 0.6rem;
252
+ font-weight: 900;
253
+ text-transform: uppercase;
254
+ letter-spacing: 0.18em;
255
+ color: var(--apc-muted);
256
+ }
257
+
258
+ .apc-field-input {
259
+ width: 100%;
260
+ font-size: 1.2rem;
261
+ font-weight: 800;
262
+ color: var(--apc-text);
263
+ background: transparent;
264
+ border: none;
265
+ border-bottom: 2px solid var(--apc-border);
266
+ padding: 0.2rem 0;
267
+ outline: none;
268
+ transition: border-color 0.2s;
269
+ }
270
+
271
+ .apc-field-input:focus {
272
+ border-color: var(--apc-accent);
273
+ }
274
+
275
+ .apc-field-unit {
276
+ font-size: 0.75rem;
277
+ font-weight: 600;
278
+ color: var(--apc-muted);
279
+ }
280
+
281
+ .apc-toggle {
282
+ display: inline-flex;
283
+ align-items: center;
284
+ gap: 0.625rem;
285
+ cursor: pointer;
286
+ user-select: none;
287
+ }
288
+
289
+ .apc-toggle input {
290
+ display: none;
291
+ }
292
+
293
+ .apc-toggle-track {
294
+ width: 44px;
295
+ height: 24px;
296
+ border-radius: 999px;
297
+ background: var(--apc-border);
298
+ position: relative;
299
+ transition: background 0.3s;
300
+ flex-shrink: 0;
301
+ }
302
+
303
+ .apc-toggle input:checked + .apc-toggle-track {
304
+ background: var(--apc-success);
305
+ }
306
+
307
+ .apc-toggle-track::after {
308
+ content: '';
309
+ position: absolute;
310
+ top: 2px;
311
+ left: 2px;
312
+ width: 20px;
313
+ height: 20px;
314
+ border-radius: 50%;
315
+ background: #fff;
316
+ transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1);
317
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.18);
318
+ }
319
+
320
+ .apc-toggle input:checked + .apc-toggle-track::after {
321
+ transform: translateX(20px);
322
+ }
323
+
324
+ .apc-toggle-text {
325
+ font-size: 0.8rem;
326
+ font-weight: 700;
327
+ color: var(--apc-text);
328
+ }
329
+
330
+ .apc-clock {
331
+ display: flex;
332
+ align-items: center;
333
+ gap: 1.25rem;
334
+ background: var(--apc-page);
335
+ border: 1px solid var(--apc-border);
336
+ border-radius: 20px;
337
+ padding: 1rem 1.25rem;
338
+ }
339
+
340
+ .apc-clock-dial {
341
+ width: 88px;
342
+ height: 88px;
343
+ border-radius: 50%;
344
+ border: 2px solid var(--apc-border);
345
+ position: relative;
346
+ flex-shrink: 0;
347
+ background: var(--apc-surface);
348
+ }
349
+
350
+ .apc-clock-dial::before {
351
+ content: '';
352
+ position: absolute;
353
+ inset: 4px;
354
+ border-radius: 50%;
355
+ border: 1px dashed var(--apc-border);
356
+ opacity: 0.5;
357
+ }
358
+
359
+ .apc-clock-hand {
360
+ position: absolute;
361
+ top: 50%;
362
+ left: 50%;
363
+ width: 2.5px;
364
+ height: 28px;
365
+ background: var(--apc-accent);
366
+ border-radius: 3px;
367
+ transform-origin: bottom center;
368
+ transform: translate(-50%, -100%) rotate(0deg);
369
+ transition: transform 0.5s cubic-bezier(0.16, 1, 0.3, 1);
370
+ }
371
+
372
+ .apc-clock-center {
373
+ position: absolute;
374
+ top: 50%;
375
+ left: 50%;
376
+ width: 7px;
377
+ height: 7px;
378
+ border-radius: 50%;
379
+ background: var(--apc-accent);
380
+ transform: translate(-50%, -50%);
381
+ }
382
+
383
+ .apc-clock-hours {
384
+ display: flex;
385
+ flex-wrap: wrap;
386
+ gap: 0.35rem;
387
+ flex: 1;
388
+ }
389
+
390
+ .apc-hour-chip {
391
+ min-width: 38px;
392
+ padding: 0.3rem 0.4rem;
393
+ border-radius: 10px;
394
+ border: 1px solid var(--apc-border);
395
+ background: var(--apc-surface);
396
+ color: var(--apc-muted);
397
+ font-size: 0.7rem;
398
+ font-weight: 700;
399
+ cursor: pointer;
400
+ transition: all 0.2s;
401
+ text-align: center;
402
+ }
403
+
404
+ .apc-hour-chip:hover {
405
+ border-color: var(--apc-accent);
406
+ color: var(--apc-text);
407
+ }
408
+
409
+ .apc-hour-chip.apc-active {
410
+ background: var(--apc-accent);
411
+ border-color: var(--apc-accent);
412
+ color: #fff;
413
+ box-shadow: 0 4px 12px -3px var(--apc-accent-glow);
414
+ }
415
+
416
+ .apc-hour-chip.apc-peak {
417
+ border-color: rgba(239, 68, 68, 0.4);
418
+ color: var(--apc-danger);
419
+ }
420
+
421
+ .apc-hour-chip.apc-peak:hover {
422
+ border-color: var(--apc-danger);
423
+ background: rgba(239, 68, 68, 0.06);
424
+ }
425
+
426
+ .apc-hour-chip.apc-peak.apc-active {
427
+ background: var(--apc-danger);
428
+ border-color: var(--apc-danger);
429
+ color: #fff;
430
+ box-shadow: 0 4px 12px -3px rgba(239, 68, 68, 0.35);
431
+ }
432
+
433
+ .apc-receipt {
434
+ background: var(--apc-page);
435
+ border: 1px solid var(--apc-border);
436
+ border-radius: 16px;
437
+ padding: 1.25rem 1.5rem;
438
+ position: relative;
439
+ margin-top: 0.5rem;
440
+ }
441
+
442
+ .apc-receipt::before {
443
+ content: '';
444
+ position: absolute;
445
+ top: -8px;
446
+ left: 0.75rem;
447
+ right: 0.75rem;
448
+ height: 14px;
449
+ background:
450
+ linear-gradient(135deg, var(--apc-surface) 7px, transparent 0),
451
+ linear-gradient(225deg, var(--apc-surface) 7px, transparent 0);
452
+ background-size: 14px 14px;
453
+ background-position: top left, top right;
454
+ background-repeat: repeat-x;
455
+ }
456
+
457
+ .apc-receipt-title {
458
+ font-size: 0.65rem;
459
+ font-weight: 900;
460
+ text-transform: uppercase;
461
+ letter-spacing: 0.2em;
462
+ color: var(--apc-muted);
463
+ margin: 0 0 1rem;
464
+ text-align: center;
465
+ }
466
+
467
+ .apc-receipt-row {
468
+ display: flex;
469
+ justify-content: space-between;
470
+ align-items: center;
471
+ padding: 0.6rem 0;
472
+ border-bottom: 1px dashed var(--apc-border);
473
+ font-size: 0.85rem;
474
+ }
475
+
476
+ .apc-receipt-row:last-of-type {
477
+ border-bottom: none;
478
+ }
479
+
480
+ .apc-receipt-name {
481
+ font-weight: 600;
482
+ color: var(--apc-text);
483
+ }
484
+
485
+ .apc-receipt-price {
486
+ font-weight: 800;
487
+ color: var(--apc-base);
488
+ font-size: 0.9rem;
489
+ }
490
+
491
+ .apc-receipt-total {
492
+ display: flex;
493
+ justify-content: space-between;
494
+ align-items: center;
495
+ margin-top: 0.625rem;
496
+ padding-top: 0.75rem;
497
+ border-top: 2px solid var(--apc-border);
498
+ }
499
+
500
+ .apc-receipt-total-name {
501
+ font-size: 0.85rem;
502
+ font-weight: 900;
503
+ text-transform: uppercase;
504
+ letter-spacing: 0.1em;
505
+ color: var(--apc-text);
506
+ }
507
+
508
+ .apc-receipt-total-price {
509
+ font-size: 1.35rem;
510
+ font-weight: 900;
511
+ color: var(--apc-accent);
512
+ }
513
+
514
+ .apc-receipt-year {
515
+ text-align: center;
516
+ font-size: 0.7rem;
517
+ font-weight: 700;
518
+ color: var(--apc-muted);
519
+ margin-top: 0.625rem;
520
+ }
521
+
522
+ .apc-tip {
523
+ padding: 1.25rem 1.5rem 1.5rem;
524
+ }
525
+
526
+ .apc-tip-card {
527
+ background:
528
+ linear-gradient(135deg, rgba(34, 197, 94, 0.05), rgba(99, 102, 241, 0.05));
529
+ border: 1px solid rgba(34, 197, 94, 0.18);
530
+ border-radius: 20px;
531
+ padding: 1.25rem;
532
+ text-align: center;
533
+ position: relative;
534
+ overflow: hidden;
535
+ }
536
+
537
+ .apc-tip-card::before {
538
+ content: '';
539
+ position: absolute;
540
+ top: -40px;
541
+ right: -40px;
542
+ width: 80px;
543
+ height: 80px;
544
+ border-radius: 50%;
545
+ background: rgba(99, 102, 241, 0.08);
546
+ filter: blur(20px);
547
+ }
548
+
549
+ .apc-tip-title {
550
+ font-size: 0.65rem;
551
+ font-weight: 900;
552
+ text-transform: uppercase;
553
+ letter-spacing: 0.2em;
554
+ color: var(--apc-success);
555
+ margin: 0 0 0.5rem;
556
+ position: relative;
557
+ z-index: 1;
558
+ }
559
+
560
+ .apc-tip-text {
561
+ font-size: 0.88rem;
562
+ font-weight: 700;
563
+ color: var(--apc-text);
564
+ margin: 0;
565
+ line-height: 1.5;
566
+ position: relative;
567
+ z-index: 1;
568
+ }
569
+
570
+ .apc-tip-badge {
571
+ display: inline-block;
572
+ margin-top: 0.625rem;
573
+ font-size: 0.78rem;
574
+ font-weight: 800;
575
+ color: var(--apc-success);
576
+ padding: 0.35rem 0.875rem;
577
+ border-radius: 999px;
578
+ background: rgba(34, 197, 94, 0.1);
579
+ border: 1px solid rgba(34, 197, 94, 0.22);
580
+ position: relative;
581
+ z-index: 1;
582
+ }
583
+
584
+ @media (max-width: 520px) {
585
+ .apc-card {
586
+ border-radius: 22px;
587
+ }
588
+
589
+ .apc-stage {
590
+ padding: 1.5rem 1rem 1rem;
591
+ }
592
+
593
+ .apc-carousel {
594
+ gap: 0.5rem;
595
+ }
596
+
597
+ .apc-appliance {
598
+ padding: 0.75rem 1rem;
599
+ font-size: 0.65rem;
600
+ }
601
+
602
+ .apc-appliance svg {
603
+ width: 26px;
604
+ height: 26px;
605
+ }
606
+
607
+ .apc-body {
608
+ padding: 1rem;
609
+ gap: 1rem;
610
+ }
611
+
612
+ .apc-fields {
613
+ grid-template-columns: 1fr;
614
+ gap: 0.875rem;
615
+ }
616
+
617
+ .apc-clock {
618
+ flex-direction: column;
619
+ align-items: flex-start;
620
+ gap: 0.875rem;
621
+ }
622
+
623
+ .apc-clock-hours {
624
+ width: 100%;
625
+ justify-content: center;
626
+ }
627
+
628
+ .apc-receipt {
629
+ padding: 1rem;
630
+ }
631
+
632
+ .apc-tip {
633
+ padding: 1rem;
634
+ }
635
+ }
@@ -0,0 +1,14 @@
1
+ ---
2
+ import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
3
+ import { applianceCostCalculator } from './index';
4
+ import type { KnownLocale } from '../../types';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'es' } = Astro.props;
11
+ const content = await applianceCostCalculator.i18n[locale]?.();
12
+ ---
13
+
14
+ {content && <SharedBibliography links={content.bibliography} />}
@@ -0,0 +1,14 @@
1
+ export const bibliography = [
2
+ {
3
+ name: 'European Union Energy Label: Washing Machines & Dishwashers',
4
+ url: 'https://energy-efficient-products.ec.europa.eu/product-list/dishwashers_en',
5
+ },
6
+ {
7
+ name: 'U.S. DOE: Appliance Energy Use and Cost',
8
+ url: 'https://www.energy.gov/energysaver/estimating-appliance-and-home-electronic-energy-use',
9
+ },
10
+ {
11
+ name: 'Energy Saving Trust: Wet Appliance Costs',
12
+ url: 'https://energysavingtrust.org.uk/how-save-energy-when-using-your-washing-machine/',
13
+ },
14
+ ];