@jjlmoya/utils-home 1.15.0 → 1.17.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 (140) hide show
  1. package/package.json +5 -3
  2. package/scripts/postinstall.mjs +27 -0
  3. package/src/pages/[locale]/[slug].astro +28 -12
  4. package/src/tests/locale_completeness.test.ts +2 -20
  5. package/src/tests/shared-test-helpers.ts +56 -0
  6. package/src/tests/tool_exports.test.ts +34 -0
  7. package/src/tool/dewPointCalculator/bibliography.ts +10 -0
  8. package/src/tool/dewPointCalculator/component.astro +0 -232
  9. package/src/tool/dewPointCalculator/dew-point-calculator.css +230 -0
  10. package/src/tool/dewPointCalculator/i18n/de.ts +2 -12
  11. package/src/tool/dewPointCalculator/i18n/en.ts +2 -12
  12. package/src/tool/dewPointCalculator/i18n/es.ts +2 -12
  13. package/src/tool/dewPointCalculator/i18n/fr.ts +2 -12
  14. package/src/tool/dewPointCalculator/i18n/id.ts +2 -12
  15. package/src/tool/dewPointCalculator/i18n/it.ts +2 -12
  16. package/src/tool/dewPointCalculator/i18n/ja.ts +2 -12
  17. package/src/tool/dewPointCalculator/i18n/ko.ts +2 -12
  18. package/src/tool/dewPointCalculator/i18n/nl.ts +2 -12
  19. package/src/tool/dewPointCalculator/i18n/pl.ts +2 -12
  20. package/src/tool/dewPointCalculator/i18n/pt.ts +2 -12
  21. package/src/tool/dewPointCalculator/i18n/ru.ts +2 -12
  22. package/src/tool/dewPointCalculator/i18n/sv.ts +2 -12
  23. package/src/tool/dewPointCalculator/i18n/tr.ts +2 -12
  24. package/src/tool/dewPointCalculator/i18n/zh.ts +2 -12
  25. package/src/tool/dewPointCalculator/seo.astro +2 -1
  26. package/src/tool/heatingComparator/bibliography.ts +14 -0
  27. package/src/tool/heatingComparator/component.astro +0 -269
  28. package/src/tool/heatingComparator/heating-consumption-comparator.css +267 -0
  29. package/src/tool/heatingComparator/i18n/de.ts +2 -16
  30. package/src/tool/heatingComparator/i18n/en.ts +2 -12
  31. package/src/tool/heatingComparator/i18n/es.ts +2 -16
  32. package/src/tool/heatingComparator/i18n/fr.ts +2 -12
  33. package/src/tool/heatingComparator/i18n/id.ts +2 -16
  34. package/src/tool/heatingComparator/i18n/it.ts +2 -16
  35. package/src/tool/heatingComparator/i18n/ja.ts +296 -310
  36. package/src/tool/heatingComparator/i18n/ko.ts +296 -306
  37. package/src/tool/heatingComparator/i18n/nl.ts +2 -16
  38. package/src/tool/heatingComparator/i18n/pl.ts +2 -16
  39. package/src/tool/heatingComparator/i18n/pt.ts +2 -16
  40. package/src/tool/heatingComparator/i18n/ru.ts +2 -12
  41. package/src/tool/heatingComparator/i18n/sv.ts +2 -16
  42. package/src/tool/heatingComparator/i18n/tr.ts +2 -16
  43. package/src/tool/heatingComparator/i18n/zh.ts +296 -306
  44. package/src/tool/heatingComparator/seo.astro +3 -3
  45. package/src/tool/ledSavingCalculator/bibliography.ts +14 -0
  46. package/src/tool/ledSavingCalculator/component.astro +0 -305
  47. package/src/tool/ledSavingCalculator/i18n/de.ts +2 -12
  48. package/src/tool/ledSavingCalculator/i18n/en.ts +2 -16
  49. package/src/tool/ledSavingCalculator/i18n/es.ts +2 -16
  50. package/src/tool/ledSavingCalculator/i18n/fr.ts +2 -16
  51. package/src/tool/ledSavingCalculator/i18n/id.ts +2 -12
  52. package/src/tool/ledSavingCalculator/i18n/it.ts +2 -12
  53. package/src/tool/ledSavingCalculator/i18n/ja.ts +2 -12
  54. package/src/tool/ledSavingCalculator/i18n/ko.ts +2 -12
  55. package/src/tool/ledSavingCalculator/i18n/nl.ts +2 -12
  56. package/src/tool/ledSavingCalculator/i18n/pl.ts +2 -12
  57. package/src/tool/ledSavingCalculator/i18n/pt.ts +2 -12
  58. package/src/tool/ledSavingCalculator/i18n/ru.ts +2 -12
  59. package/src/tool/ledSavingCalculator/i18n/sv.ts +2 -12
  60. package/src/tool/ledSavingCalculator/i18n/tr.ts +2 -12
  61. package/src/tool/ledSavingCalculator/i18n/zh.ts +2 -12
  62. package/src/tool/ledSavingCalculator/led-saving-calculator.css +303 -0
  63. package/src/tool/ledSavingCalculator/seo.astro +2 -1
  64. package/src/tool/projectorCalculator/bibliography.ts +5 -0
  65. package/src/tool/projectorCalculator/component.astro +0 -359
  66. package/src/tool/projectorCalculator/i18n/de.ts +2 -6
  67. package/src/tool/projectorCalculator/i18n/en.ts +2 -7
  68. package/src/tool/projectorCalculator/i18n/es.ts +2 -7
  69. package/src/tool/projectorCalculator/i18n/fr.ts +2 -7
  70. package/src/tool/projectorCalculator/i18n/id.ts +2 -7
  71. package/src/tool/projectorCalculator/i18n/it.ts +2 -6
  72. package/src/tool/projectorCalculator/i18n/ja.ts +175 -179
  73. package/src/tool/projectorCalculator/i18n/ko.ts +175 -179
  74. package/src/tool/projectorCalculator/i18n/nl.ts +2 -6
  75. package/src/tool/projectorCalculator/i18n/pl.ts +2 -6
  76. package/src/tool/projectorCalculator/i18n/pt.ts +2 -6
  77. package/src/tool/projectorCalculator/i18n/ru.ts +2 -6
  78. package/src/tool/projectorCalculator/i18n/sv.ts +2 -6
  79. package/src/tool/projectorCalculator/i18n/tr.ts +2 -6
  80. package/src/tool/projectorCalculator/i18n/zh.ts +175 -179
  81. package/src/tool/projectorCalculator/projector-throw-calculator.css +357 -0
  82. package/src/tool/projectorCalculator/seo.astro +2 -1
  83. package/src/tool/qrGenerator/bibliography.ts +14 -0
  84. package/src/tool/qrGenerator/component.astro +0 -266
  85. package/src/tool/qrGenerator/i18n/de.ts +192 -202
  86. package/src/tool/qrGenerator/i18n/en.ts +2 -16
  87. package/src/tool/qrGenerator/i18n/es.ts +2 -16
  88. package/src/tool/qrGenerator/i18n/fr.ts +2 -16
  89. package/src/tool/qrGenerator/i18n/id.ts +146 -150
  90. package/src/tool/qrGenerator/i18n/it.ts +169 -173
  91. package/src/tool/qrGenerator/i18n/ja.ts +146 -150
  92. package/src/tool/qrGenerator/i18n/ko.ts +146 -150
  93. package/src/tool/qrGenerator/i18n/nl.ts +146 -150
  94. package/src/tool/qrGenerator/i18n/pl.ts +146 -150
  95. package/src/tool/qrGenerator/i18n/pt.ts +146 -150
  96. package/src/tool/qrGenerator/i18n/ru.ts +146 -150
  97. package/src/tool/qrGenerator/i18n/sv.ts +146 -150
  98. package/src/tool/qrGenerator/i18n/tr.ts +146 -150
  99. package/src/tool/qrGenerator/i18n/zh.ts +146 -150
  100. package/src/tool/qrGenerator/qr-generator.css +264 -0
  101. package/src/tool/qrGenerator/seo.astro +2 -1
  102. package/src/tool/solarCalculator/bibliography.ts +5 -0
  103. package/src/tool/solarCalculator/component.astro +0 -298
  104. package/src/tool/solarCalculator/i18n/de.ts +141 -145
  105. package/src/tool/solarCalculator/i18n/en.ts +2 -7
  106. package/src/tool/solarCalculator/i18n/es.ts +2 -7
  107. package/src/tool/solarCalculator/i18n/fr.ts +2 -7
  108. package/src/tool/solarCalculator/i18n/id.ts +2 -6
  109. package/src/tool/solarCalculator/i18n/it.ts +2 -6
  110. package/src/tool/solarCalculator/i18n/ja.ts +121 -125
  111. package/src/tool/solarCalculator/i18n/ko.ts +116 -120
  112. package/src/tool/solarCalculator/i18n/nl.ts +2 -5
  113. package/src/tool/solarCalculator/i18n/pl.ts +2 -6
  114. package/src/tool/solarCalculator/i18n/pt.ts +2 -6
  115. package/src/tool/solarCalculator/i18n/ru.ts +2 -5
  116. package/src/tool/solarCalculator/i18n/sv.ts +2 -5
  117. package/src/tool/solarCalculator/i18n/tr.ts +2 -5
  118. package/src/tool/solarCalculator/i18n/zh.ts +116 -120
  119. package/src/tool/solarCalculator/seo.astro +2 -1
  120. package/src/tool/solarCalculator/solar-panel-calculator.css +296 -0
  121. package/src/tool/tariffComparator/bibliography.ts +7 -0
  122. package/src/tool/tariffComparator/component.astro +0 -337
  123. package/src/tool/tariffComparator/electricity-tariff-comparator.css +335 -0
  124. package/src/tool/tariffComparator/i18n/de.ts +129 -132
  125. package/src/tool/tariffComparator/i18n/en.ts +2 -9
  126. package/src/tool/tariffComparator/i18n/es.ts +2 -9
  127. package/src/tool/tariffComparator/i18n/fr.ts +2 -9
  128. package/src/tool/tariffComparator/i18n/id.ts +2 -5
  129. package/src/tool/tariffComparator/i18n/it.ts +2 -5
  130. package/src/tool/tariffComparator/i18n/ja.ts +129 -132
  131. package/src/tool/tariffComparator/i18n/ko.ts +129 -132
  132. package/src/tool/tariffComparator/i18n/nl.ts +2 -5
  133. package/src/tool/tariffComparator/i18n/pl.ts +2 -5
  134. package/src/tool/tariffComparator/i18n/pt.ts +2 -5
  135. package/src/tool/tariffComparator/i18n/ru.ts +2 -5
  136. package/src/tool/tariffComparator/i18n/sv.ts +2 -5
  137. package/src/tool/tariffComparator/i18n/tr.ts +2 -5
  138. package/src/tool/tariffComparator/i18n/zh.ts +129 -132
  139. package/src/tool/tariffComparator/seo.astro +2 -1
  140. package/src/types.ts +0 -2
@@ -232,301 +232,3 @@ const initial = calculateTilt(40.41);
232
232
  init();
233
233
  </script>
234
234
 
235
- <style>
236
- .solar-wrapper {
237
- --solar-p: #f97316;
238
- --solar-winter: #3b82f6;
239
- --solar-summer: #eab308;
240
-
241
- width: 100%;
242
- padding: 1rem 0;
243
- }
244
-
245
- .solar-card {
246
- background: var(--bg-surface);
247
- width: calc(100% - 24px);
248
- max-width: 960px;
249
- margin: 0 auto;
250
- border-radius: 24px;
251
- overflow: hidden;
252
- display: flex;
253
- flex-direction: column;
254
- border: 1px solid var(--border-color);
255
- color: var(--text-main);
256
- }
257
-
258
- @media (min-width: 768px) {
259
- .solar-card {
260
- flex-direction: row;
261
- min-height: 560px;
262
- }
263
- }
264
-
265
- .solar-left {
266
- flex: 0 0 auto;
267
- width: 100%;
268
- padding: 32px;
269
- border-bottom: 1px solid var(--border-color);
270
- display: flex;
271
- flex-direction: column;
272
- gap: 24px;
273
- }
274
-
275
- @media (min-width: 768px) {
276
- .solar-left {
277
- width: 340px;
278
- border-bottom: none;
279
- border-right: 1px solid var(--border-color);
280
- }
281
- }
282
-
283
- .solar-right {
284
- flex: 1;
285
- background: #020617;
286
- position: relative;
287
- overflow: hidden;
288
- display: flex;
289
- align-items: center;
290
- justify-content: center;
291
- min-height: 380px;
292
- }
293
-
294
- .viz-dots {
295
- position: absolute;
296
- inset: 0;
297
- opacity: 0.15;
298
- pointer-events: none;
299
- background-image: radial-gradient(#fff 1px, transparent 1px);
300
- background-size: 24px 24px;
301
- }
302
-
303
- .viz-svg {
304
- width: 100%;
305
- height: 100%;
306
- position: relative;
307
- z-index: 1;
308
- padding: 1rem;
309
- }
310
-
311
- .sun-pulse {
312
- animation: pulse 2s ease-in-out infinite;
313
- }
314
-
315
- @keyframes pulse {
316
- 0%, 100% { opacity: 0.2; }
317
- 50% { opacity: 0.5; }
318
- }
319
-
320
- .field-group {
321
- display: flex;
322
- flex-direction: column;
323
- gap: 8px;
324
- }
325
-
326
- .field-label {
327
- font-size: 11px;
328
- font-weight: 700;
329
- color: var(--text-muted);
330
- text-transform: uppercase;
331
- letter-spacing: 0.1em;
332
- }
333
-
334
- .lat-row {
335
- position: relative;
336
- }
337
-
338
- .lat-input {
339
- width: 100%;
340
- font-size: 2.5rem;
341
- font-weight: 900;
342
- color: var(--text-main);
343
- background: transparent;
344
- border: none;
345
- border-bottom: 2px solid var(--border-color);
346
- padding: 4px 2.5rem 4px 0;
347
- outline: none;
348
- transition: border-color 0.2s;
349
- box-sizing: border-box;
350
- }
351
-
352
- .lat-input:focus {
353
- border-color: var(--solar-p);
354
- }
355
-
356
- .deg-unit {
357
- position: absolute;
358
- right: 8px;
359
- bottom: 8px;
360
- font-size: 1.5rem;
361
- color: var(--text-muted);
362
- font-weight: 300;
363
- }
364
-
365
- .locate-btn {
366
- display: inline-flex;
367
- align-items: center;
368
- gap: 6px;
369
- background: none;
370
- border: none;
371
- color: var(--solar-p);
372
- font-size: 0.8125rem;
373
- font-weight: 700;
374
- cursor: pointer;
375
- padding: 0;
376
- transition: opacity 0.2s;
377
- }
378
-
379
- .locate-btn:hover {
380
- opacity: 0.75;
381
- }
382
-
383
- .locate-btn.loading {
384
- opacity: 0.5;
385
- pointer-events: none;
386
- }
387
-
388
- .locate-btn svg {
389
- width: 16px;
390
- height: 16px;
391
- }
392
-
393
- .optimal-card {
394
- background: var(--bg-muted);
395
- border-radius: 16px;
396
- padding: 20px;
397
- border: 1px solid var(--border-color);
398
- position: relative;
399
- overflow: hidden;
400
- }
401
-
402
- .optimal-card::after {
403
- content: '';
404
- position: absolute;
405
- top: 0;
406
- right: 0;
407
- width: 80px;
408
- height: 80px;
409
- background: radial-gradient(circle at top right, rgba(249, 115, 22, 0.2), transparent);
410
- border-radius: 0 0 0 80px;
411
- }
412
-
413
- .optimal-label {
414
- font-size: 0.8125rem;
415
- color: var(--text-muted);
416
- font-weight: 500;
417
- margin: 0 0 4px;
418
- }
419
-
420
- .optimal-value-row {
421
- display: flex;
422
- align-items: baseline;
423
- gap: 4px;
424
- }
425
-
426
- .optimal-value {
427
- font-size: 3.5rem;
428
- font-weight: 900;
429
- color: var(--text-main);
430
- line-height: 1;
431
- }
432
-
433
- .optimal-deg {
434
- font-size: 1.5rem;
435
- font-weight: 700;
436
- color: var(--solar-p);
437
- }
438
-
439
- .efficiency-tag {
440
- display: flex;
441
- align-items: center;
442
- gap: 4px;
443
- font-size: 0.75rem;
444
- color: #16a34a;
445
- font-weight: 600;
446
- margin: 8px 0 0;
447
- }
448
-
449
- .efficiency-tag svg {
450
- width: 12px;
451
- height: 12px;
452
- }
453
-
454
- .season-grid {
455
- display: grid;
456
- grid-template-columns: 1fr 1fr;
457
- gap: 12px;
458
- }
459
-
460
- .season-card {
461
- border-radius: 12px;
462
- padding: 14px;
463
- border: 1px solid transparent;
464
- }
465
-
466
- .season-card.winter {
467
- background: rgba(59, 130, 246, 0.08);
468
- border-color: rgba(59, 130, 246, 0.2);
469
- }
470
-
471
- .season-card.summer {
472
- background: rgba(234, 179, 8, 0.08);
473
- border-color: rgba(234, 179, 8, 0.2);
474
- }
475
-
476
- .season-header {
477
- display: flex;
478
- align-items: center;
479
- gap: 6px;
480
- margin-bottom: 8px;
481
- }
482
-
483
- .season-header svg {
484
- width: 14px;
485
- height: 14px;
486
- flex-shrink: 0;
487
- }
488
-
489
- .season-card.winter .season-header svg {
490
- color: var(--solar-winter);
491
- }
492
-
493
- .season-card.summer .season-header svg {
494
- color: var(--solar-summer);
495
- }
496
-
497
- .season-name {
498
- font-size: 0.6875rem;
499
- font-weight: 800;
500
- text-transform: uppercase;
501
- letter-spacing: 0.08em;
502
- }
503
-
504
- .season-card.winter .season-name {
505
- color: var(--solar-winter);
506
- }
507
-
508
- .season-card.summer .season-name {
509
- color: var(--solar-summer);
510
- }
511
-
512
- .season-value {
513
- font-size: 1.5rem;
514
- font-weight: 700;
515
- color: var(--text-main);
516
- margin: 0;
517
- }
518
-
519
- .hemi-badge {
520
- display: inline-block;
521
- padding: 6px 14px;
522
- background: var(--bg-muted);
523
- border: 1px solid var(--border-color);
524
- border-radius: 8px;
525
- font-size: 0.6875rem;
526
- font-weight: 700;
527
- color: var(--text-muted);
528
- text-transform: uppercase;
529
- letter-spacing: 0.08em;
530
- align-self: flex-start;
531
- }
532
- </style>
@@ -1,146 +1,142 @@
1
- import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
- import type { ToolLocaleContent } from '../../../types';
3
- import type { SolarCalculatorUI } from '../ui';
4
-
5
- const slug = 'solar-neigung-rechner';
6
- const title = 'Solarpanel Neigungsrechner';
7
- const description =
8
- 'Berechnen Sie den optimalen Neigungswinkel für Ihre Solarmodule basierend auf Ihrem Breitengrad. Für feste Installationen und saisonale Anpassungen.';
9
-
10
- const faqData = [
11
- {
12
- question: 'Was passiert, wenn mein Dach nicht die perfekte Neigung hat?',
13
- answer:
14
- 'Das ist kein großes Problem. Verluste durch Abweichungen von 5-10° liegen bei weniger als 3 % der Jahresproduktion. Es ist wichtiger, Schatten zu vermeiden, als den exakten Winkel zu jagen.',
15
- },
16
- {
17
- question: 'Ist der optimale Winkel überall auf der Welt gleich?',
18
- answer:
19
- 'Nein. Er hängt direkt von Ihrem Breitengrad ab. In Madrid (~40°N) ist der Winkel anders als in Oslo (~60°N) oder Sydney (~34°S).',
20
- },
21
- {
22
- question: 'In welche Richtung sollten die Paneele zeigen?',
23
- answer:
24
- 'Auf der Nordhalbkugel immer nach Süden (Azimut 180°). Auf der Südhalbkugel nach Norden. Eine Ost-West-Ausrichtung kann 15-20 % Verlust gegenüber dem Optimum bedeuten.',
25
- },
26
- {
27
- question: 'Funktioniert das auch für Solarthermie (Warmwasser)?',
28
- answer:
29
- 'Ja. Die Formeln für die Neigung sind für thermische Kollektoren und Photovoltaik identisch, da beide auf dem gleichen geometrischen Prinzip basieren.',
30
- },
31
- ];
32
-
33
- const howToData = [
34
- {
35
- name: 'Breitengrad eingeben',
36
- text: 'Geben Sie Ihren Breitengrad in Dezimalgrad ein oder nutzen Sie die automatische Standorterkennung.',
37
- },
38
- {
39
- name: 'Optimalen Winkel prüfen',
40
- text: 'Der optimale Ganzjahreswinkel ist der Hauptwert für feste Installationen.',
41
- },
42
- {
43
- name: 'Saisonal anpassen (optional)',
44
- text: 'Wenn Ihre Halterung verstellbar ist, nutzen Sie die Winter- und Sommerwinkel für maximale Erträge.',
45
- },
46
- ];
47
-
48
- const faqSchema: WithContext<FAQPage> = {
49
- '@context': 'https://schema.org',
50
- '@type': 'FAQPage',
51
- mainEntity: faqData.map((item) => ({
52
- '@type': 'Question',
53
- name: item.question,
54
- acceptedAnswer: { '@type': 'Answer', text: item.answer },
55
- })),
56
- };
57
-
58
- const howToSchema: WithContext<HowTo> = {
59
- '@context': 'https://schema.org',
60
- '@type': 'HowTo',
61
- name: title,
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { SolarCalculatorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
5
+
6
+ const slug = 'solar-neigung-rechner';
7
+ const title = 'Solarpanel Neigungsrechner';
8
+ const description =
9
+ 'Berechnen Sie den optimalen Neigungswinkel für Ihre Solarmodule basierend auf Ihrem Breitengrad. Für feste Installationen und saisonale Anpassungen.';
10
+
11
+ const faqData = [
12
+ {
13
+ question: 'Was passiert, wenn mein Dach nicht die perfekte Neigung hat?',
14
+ answer:
15
+ 'Das ist kein großes Problem. Verluste durch Abweichungen von 5-10° liegen bei weniger als 3 % der Jahresproduktion. Es ist wichtiger, Schatten zu vermeiden, als den exakten Winkel zu jagen.',
16
+ },
17
+ {
18
+ question: 'Ist der optimale Winkel überall auf der Welt gleich?',
19
+ answer:
20
+ 'Nein. Er hängt direkt von Ihrem Breitengrad ab. In Madrid (~40°N) ist der Winkel anders als in Oslo (~60°N) oder Sydney (~34°S).',
21
+ },
22
+ {
23
+ question: 'In welche Richtung sollten die Paneele zeigen?',
24
+ answer:
25
+ 'Auf der Nordhalbkugel immer nach Süden (Azimut 180°). Auf der Südhalbkugel nach Norden. Eine Ost-West-Ausrichtung kann 15-20 % Verlust gegenüber dem Optimum bedeuten.',
26
+ },
27
+ {
28
+ question: 'Funktioniert das auch für Solarthermie (Warmwasser)?',
29
+ answer:
30
+ 'Ja. Die Formeln für die Neigung sind für thermische Kollektoren und Photovoltaik identisch, da beide auf dem gleichen geometrischen Prinzip basieren.',
31
+ },
32
+ ];
33
+
34
+ const howToData = [
35
+ {
36
+ name: 'Breitengrad eingeben',
37
+ text: 'Geben Sie Ihren Breitengrad in Dezimalgrad ein oder nutzen Sie die automatische Standorterkennung.',
38
+ },
39
+ {
40
+ name: 'Optimalen Winkel prüfen',
41
+ text: 'Der optimale Ganzjahreswinkel ist der Hauptwert für feste Installationen.',
42
+ },
43
+ {
44
+ name: 'Saisonal anpassen (optional)',
45
+ text: 'Wenn Ihre Halterung verstellbar ist, nutzen Sie die Winter- und Sommerwinkel für maximale Erträge.',
46
+ },
47
+ ];
48
+
49
+ const faqSchema: WithContext<FAQPage> = {
50
+ '@context': 'https://schema.org',
51
+ '@type': 'FAQPage',
52
+ mainEntity: faqData.map((item) => ({
53
+ '@type': 'Question',
54
+ name: item.question,
55
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
56
+ })),
57
+ };
58
+
59
+ const howToSchema: WithContext<HowTo> = {
60
+ '@context': 'https://schema.org',
61
+ '@type': 'HowTo',
62
+ name: title,
63
+ description,
64
+ step: howToData.map((step) => ({
65
+ '@type': 'HowToStep',
66
+ name: step.name,
67
+ text: step.text,
68
+ })),
69
+ };
70
+
71
+ const appSchema: WithContext<SoftwareApplication> = {
72
+ '@context': 'https://schema.org',
73
+ '@type': 'SoftwareApplication',
74
+ name: title,
75
+ description,
76
+ applicationCategory: 'UtilityApplication',
77
+ operatingSystem: 'All',
78
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
79
+ inLanguage: 'de',
80
+ };
81
+
82
+ export const content: ToolLocaleContent<SolarCalculatorUI> = {
83
+ slug,
84
+ title,
62
85
  description,
63
- step: howToData.map((step) => ({
64
- '@type': 'HowToStep',
65
- name: step.name,
66
- text: step.text,
67
- })),
68
- };
69
-
70
- const appSchema: WithContext<SoftwareApplication> = {
71
- '@context': 'https://schema.org',
72
- '@type': 'SoftwareApplication',
73
- name: title,
74
- description,
75
- applicationCategory: 'UtilityApplication',
76
- operatingSystem: 'All',
77
- offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
78
- inLanguage: 'de',
79
- };
80
-
81
- export const content: ToolLocaleContent<SolarCalculatorUI> = {
82
- slug,
83
- title,
84
- description,
85
- faqTitle: 'Häufig gestellte Fragen',
86
- faq: faqData,
87
- bibliographyTitle: 'Quellen',
88
- bibliography: [
89
- { name: 'NREL PVWatts Rechner', url: 'https://pvwatts.nrel.gov/' },
90
- { name: 'PVGIS Europäisches Solar-Tool', url: 'https://re.jrc.ec.europa.eu/pvgis/' },
91
- ],
92
- howTo: howToData,
93
- schemas: [faqSchema, howToSchema, appSchema],
94
- seo: [
95
- {
96
- type: 'title',
97
- text: 'Die Wissenschaft der Solar-Neigung',
98
- level: 2,
99
- },
100
- {
101
- type: 'paragraph',
102
- html: 'Der Unterschied zwischen einer hohen Stromersparnis und einer suboptimalen Anlage liegt oft im Winkel. Die Sonnenstrahlung ist dynamisch und ändert sich mit der Uhrzeit und Jahreszeit.',
103
- },
104
- {
105
- type: 'stats',
106
- items: [
107
- { value: 'Breite × 0,87', label: 'Faustformel', icon: 'mdi:angle-acute' },
108
- { value: '± 15°', label: 'Saisonaler Abgleich', icon: 'mdi:calendar-sync' },
109
- ],
110
- columns: 2,
111
- },
112
- {
113
- type: 'comparative',
114
- items: [
115
- {
116
- title: 'Das Prinzip der Rechtwinkligkeit',
117
- description: 'Ein Solarpanel arbeitet am effektivsten, wenn die Sonnenstrahlen im 90°-Winkel auftreffen.',
118
- icon: 'mdi:solar-panel',
119
- points: ['Maximiert die Energieausbeute', 'Basis aller Neigungsberechnungen'],
120
- },
121
- ],
122
- columns: 1,
123
- },
124
- {
125
- type: 'summary',
126
- title: 'Tipps für eine effiziente Installation',
127
- items: [
128
- 'Der Ganzjahreswinkel ist ideal für feste Montagen.',
129
- 'Abweichungen von ±5° sind vernachlässigbar.',
130
- 'Verschattung vermeiden ist wichtiger als der exakte Winkel.',
131
- 'Auf der Nordhalbkugel nach Süden ausrichten.',
132
- ],
133
- },
134
- ],
135
- ui: {
136
- labelLatitude: 'Geographische Breite',
137
- btnLocate: 'Meinen Standort finden',
138
- labelOptimal: 'Optimaler Ganzjahreswinkel',
139
- labelEfficiency: 'Maximale Effizienz',
140
- labelWinter: 'Winter',
141
- labelSummer: 'Sommer',
142
- hemisphereNorth: 'Nordhalbkugel — Nach SÜDEN ausrichten',
143
- hemisphereSouth: 'Südhalbkugel — Nach NORDEN ausrichten',
144
- geoNotAvailable: 'Geolokalisierung wird nicht unterstützt.',
145
- },
146
- };
86
+ faq: faqData,
87
+ bibliography,
88
+ howTo: howToData,
89
+ schemas: [faqSchema, howToSchema, appSchema],
90
+ seo: [
91
+ {
92
+ type: 'title',
93
+ text: 'Die Wissenschaft der Solar-Neigung',
94
+ level: 2,
95
+ },
96
+ {
97
+ type: 'paragraph',
98
+ html: 'Der Unterschied zwischen einer hohen Stromersparnis und einer suboptimalen Anlage liegt oft im Winkel. Die Sonnenstrahlung ist dynamisch und ändert sich mit der Uhrzeit und Jahreszeit.',
99
+ },
100
+ {
101
+ type: 'stats',
102
+ items: [
103
+ { value: 'Breite × 0,87', label: 'Faustformel', icon: 'mdi:angle-acute' },
104
+ { value: '± 15°', label: 'Saisonaler Abgleich', icon: 'mdi:calendar-sync' },
105
+ ],
106
+ columns: 2,
107
+ },
108
+ {
109
+ type: 'comparative',
110
+ items: [
111
+ {
112
+ title: 'Das Prinzip der Rechtwinkligkeit',
113
+ description: 'Ein Solarpanel arbeitet am effektivsten, wenn die Sonnenstrahlen im 90°-Winkel auftreffen.',
114
+ icon: 'mdi:solar-panel',
115
+ points: ['Maximiert die Energieausbeute', 'Basis aller Neigungsberechnungen'],
116
+ },
117
+ ],
118
+ columns: 1,
119
+ },
120
+ {
121
+ type: 'summary',
122
+ title: 'Tipps für eine effiziente Installation',
123
+ items: [
124
+ 'Der Ganzjahreswinkel ist ideal für feste Montagen.',
125
+ 'Abweichungen von ±5° sind vernachlässigbar.',
126
+ 'Verschattung vermeiden ist wichtiger als der exakte Winkel.',
127
+ 'Auf der Nordhalbkugel nach Süden ausrichten.',
128
+ ],
129
+ },
130
+ ],
131
+ ui: {
132
+ labelLatitude: 'Geographische Breite',
133
+ btnLocate: 'Meinen Standort finden',
134
+ labelOptimal: 'Optimaler Ganzjahreswinkel',
135
+ labelEfficiency: 'Maximale Effizienz',
136
+ labelWinter: 'Winter',
137
+ labelSummer: 'Sommer',
138
+ hemisphereNorth: 'Nordhalbkugel — Nach SÜDEN ausrichten',
139
+ hemisphereSouth: 'Südhalbkugel Nach NORDEN ausrichten',
140
+ geoNotAvailable: 'Geolokalisierung wird nicht unterstützt.',
141
+ },
142
+ };
@@ -1,6 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { ToolLocaleContent } from '../../../types';
3
3
  import type { SolarCalculatorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
4
5
 
5
6
  const slug = 'solar-panel-calculator';
6
7
  const title = 'Solar Panel Tilt Angle Calculator';
@@ -86,14 +87,8 @@ export const content: ToolLocaleContent<SolarCalculatorUI> = {
86
87
  slug,
87
88
  title,
88
89
  description,
89
- faqTitle: 'Frequently Asked Questions',
90
90
  faq: faqData,
91
- bibliographyTitle: 'Bibliography',
92
- bibliography: [
93
- { name: 'NREL PVWatts Calculator', url: 'https://pvwatts.nrel.gov/' },
94
- { name: 'PVGIS — European Commission Solar Tool', url: 'https://re.jrc.ec.europa.eu/pvgis/' },
95
- { name: 'SEIA — Solar Energy Industry Research Data', url: 'https://www.seia.org/solar-industry-research-data' },
96
- ],
91
+ bibliography,
97
92
  howTo: howToData,
98
93
  schemas: [faqSchema, howToSchema, appSchema],
99
94
  seo: [
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { SolarCalculatorUI } from '../ui';
@@ -86,14 +87,8 @@ export const content: ToolLocaleContent<SolarCalculatorUI> = {
86
87
  slug,
87
88
  title,
88
89
  description,
89
- faqTitle: 'Preguntas Frecuentes',
90
90
  faq: faqData,
91
- bibliographyTitle: 'Bibliografía',
92
- bibliography: [
93
- { name: 'NREL PVWatts Calculator', url: 'https://pvwatts.nrel.gov/' },
94
- { name: 'PVGIS — European Commission Solar Tool', url: 'https://re.jrc.ec.europa.eu/pvgis/' },
95
- { name: 'SEIA — Solar Energy Industry Research Data', url: 'https://www.seia.org/solar-industry-research-data' },
96
- ],
91
+ bibliography,
97
92
  howTo: howToData,
98
93
  schemas: [faqSchema, howToSchema, appSchema],
99
94
  seo: [
@@ -1,6 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { ToolLocaleContent } from '../../../types';
3
3
  import type { SolarCalculatorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
4
5
 
5
6
  const slug = 'calculateur-solaire';
6
7
  const title = "Calculateur d'Inclinaison de Panneaux Solaires";
@@ -86,14 +87,8 @@ export const content: ToolLocaleContent<SolarCalculatorUI> = {
86
87
  slug,
87
88
  title,
88
89
  description,
89
- faqTitle: 'Questions Fréquentes',
90
90
  faq: faqData,
91
- bibliographyTitle: 'Bibliographie',
92
- bibliography: [
93
- { name: 'NREL PVWatts Calculator', url: 'https://pvwatts.nrel.gov/' },
94
- { name: 'PVGIS — Outil Solaire de la Commission Européenne', url: 'https://re.jrc.ec.europa.eu/pvgis/' },
95
- { name: "SEIA — Données de Recherche sur l'Énergie Solaire", url: 'https://www.seia.org/solar-industry-research-data' },
96
- ],
91
+ bibliography,
97
92
  howTo: howToData,
98
93
  schemas: [faqSchema, howToSchema, appSchema],
99
94
  seo: [
@@ -1,6 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { ToolLocaleContent } from '../../../types';
3
3
  import type { SolarCalculatorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
4
5
 
5
6
  const slug = 'kalkulator-solar';
6
7
  const title = 'Kalkulator Kemiringan Panel Surya';
@@ -82,13 +83,8 @@ export const content: ToolLocaleContent<SolarCalculatorUI> = {
82
83
  slug,
83
84
  title,
84
85
  description,
85
- faqTitle: 'Pertanyaan Umum',
86
86
  faq: faqData,
87
- bibliographyTitle: 'Daftar Pustaka',
88
- bibliography: [
89
- { name: 'NREL PVWatts Calculator', url: 'https://pvwatts.nrel.gov/' },
90
- { name: 'PVGIS — European Commission Solar Tool', url: 'https://re.jrc.ec.europa.eu/pvgis/' },
91
- ],
87
+ bibliography,
92
88
  howTo: howToData,
93
89
  schemas: [faqSchema, howToSchema, appSchema],
94
90
  seo: [