@jjlmoya/utils-astronomy 1.16.0 → 1.18.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 (106) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +2 -1
  3. package/src/data.ts +2 -0
  4. package/src/entries.ts +4 -1
  5. package/src/pages/[locale]/[slug].astro +30 -14
  6. package/src/tests/locale_completeness.test.ts +1 -34
  7. package/src/tests/tool_structure.test.ts +71 -0
  8. package/src/tests/tool_validation.test.ts +4 -3
  9. package/src/tool/bortleVisualizer/bibliography.ts +8 -0
  10. package/src/tool/bortleVisualizer/entry.ts +2 -0
  11. package/src/tool/bortleVisualizer/i18n/de.ts +1 -9
  12. package/src/tool/bortleVisualizer/i18n/en.ts +1 -9
  13. package/src/tool/bortleVisualizer/i18n/es.ts +1 -9
  14. package/src/tool/bortleVisualizer/i18n/fr.ts +1 -9
  15. package/src/tool/bortleVisualizer/i18n/id.ts +1 -9
  16. package/src/tool/bortleVisualizer/i18n/it.ts +1 -9
  17. package/src/tool/bortleVisualizer/i18n/ja.ts +1 -9
  18. package/src/tool/bortleVisualizer/i18n/ko.ts +1 -9
  19. package/src/tool/bortleVisualizer/i18n/nl.ts +1 -9
  20. package/src/tool/bortleVisualizer/i18n/pl.ts +1 -9
  21. package/src/tool/bortleVisualizer/i18n/pt.ts +1 -9
  22. package/src/tool/bortleVisualizer/i18n/ru.ts +1 -9
  23. package/src/tool/bortleVisualizer/i18n/sv.ts +1 -9
  24. package/src/tool/bortleVisualizer/i18n/tr.ts +1 -9
  25. package/src/tool/bortleVisualizer/i18n/zh.ts +1 -9
  26. package/src/tool/bortleVisualizer/seo.astro +2 -48
  27. package/src/tool/deepSpaceScope/bibliography.ts +6 -0
  28. package/src/tool/deepSpaceScope/entry.ts +2 -0
  29. package/src/tool/deepSpaceScope/i18n/de.ts +1 -7
  30. package/src/tool/deepSpaceScope/i18n/en.ts +1 -7
  31. package/src/tool/deepSpaceScope/i18n/es.ts +1 -7
  32. package/src/tool/deepSpaceScope/i18n/fr.ts +1 -7
  33. package/src/tool/deepSpaceScope/i18n/id.ts +1 -7
  34. package/src/tool/deepSpaceScope/i18n/it.ts +1 -7
  35. package/src/tool/deepSpaceScope/i18n/ja.ts +1 -7
  36. package/src/tool/deepSpaceScope/i18n/ko.ts +1 -7
  37. package/src/tool/deepSpaceScope/i18n/nl.ts +1 -7
  38. package/src/tool/deepSpaceScope/i18n/pl.ts +1 -7
  39. package/src/tool/deepSpaceScope/i18n/pt.ts +1 -7
  40. package/src/tool/deepSpaceScope/i18n/ru.ts +1 -7
  41. package/src/tool/deepSpaceScope/i18n/sv.ts +1 -7
  42. package/src/tool/deepSpaceScope/i18n/tr.ts +1 -7
  43. package/src/tool/deepSpaceScope/i18n/zh.ts +1 -7
  44. package/src/tool/deepSpaceScope/seo.astro +2 -48
  45. package/src/tool/smartEyepieceCalculator/app.ts +327 -0
  46. package/src/tool/smartEyepieceCalculator/bibliography.astro +14 -0
  47. package/src/tool/smartEyepieceCalculator/bibliography.ts +6 -0
  48. package/src/tool/smartEyepieceCalculator/component.astro +125 -0
  49. package/src/tool/smartEyepieceCalculator/entry.ts +67 -0
  50. package/src/tool/smartEyepieceCalculator/i18n/de.ts +165 -0
  51. package/src/tool/smartEyepieceCalculator/i18n/en.ts +166 -0
  52. package/src/tool/smartEyepieceCalculator/i18n/es.ts +165 -0
  53. package/src/tool/smartEyepieceCalculator/i18n/fr.ts +165 -0
  54. package/src/tool/smartEyepieceCalculator/i18n/id.ts +165 -0
  55. package/src/tool/smartEyepieceCalculator/i18n/it.ts +165 -0
  56. package/src/tool/smartEyepieceCalculator/i18n/ja.ts +165 -0
  57. package/src/tool/smartEyepieceCalculator/i18n/ko.ts +165 -0
  58. package/src/tool/smartEyepieceCalculator/i18n/nl.ts +165 -0
  59. package/src/tool/smartEyepieceCalculator/i18n/pl.ts +165 -0
  60. package/src/tool/smartEyepieceCalculator/i18n/pt.ts +165 -0
  61. package/src/tool/smartEyepieceCalculator/i18n/ru.ts +165 -0
  62. package/src/tool/smartEyepieceCalculator/i18n/sv.ts +165 -0
  63. package/src/tool/smartEyepieceCalculator/i18n/tr.ts +165 -0
  64. package/src/tool/smartEyepieceCalculator/i18n/zh.ts +165 -0
  65. package/src/tool/smartEyepieceCalculator/index.ts +13 -0
  66. package/src/tool/smartEyepieceCalculator/logic.ts +67 -0
  67. package/src/tool/smartEyepieceCalculator/seo.astro +15 -0
  68. package/src/tool/smartEyepieceCalculator/smart-eyepiece-calculator.css +393 -0
  69. package/src/tool/starExposureCalculator/bibliography.ts +7 -0
  70. package/src/tool/starExposureCalculator/entry.ts +2 -0
  71. package/src/tool/starExposureCalculator/i18n/de.ts +1 -8
  72. package/src/tool/starExposureCalculator/i18n/en.ts +1 -8
  73. package/src/tool/starExposureCalculator/i18n/es.ts +1 -8
  74. package/src/tool/starExposureCalculator/i18n/fr.ts +1 -8
  75. package/src/tool/starExposureCalculator/i18n/id.ts +1 -8
  76. package/src/tool/starExposureCalculator/i18n/it.ts +1 -8
  77. package/src/tool/starExposureCalculator/i18n/ja.ts +1 -8
  78. package/src/tool/starExposureCalculator/i18n/ko.ts +1 -8
  79. package/src/tool/starExposureCalculator/i18n/nl.ts +1 -8
  80. package/src/tool/starExposureCalculator/i18n/pl.ts +1 -8
  81. package/src/tool/starExposureCalculator/i18n/pt.ts +1 -8
  82. package/src/tool/starExposureCalculator/i18n/ru.ts +1 -8
  83. package/src/tool/starExposureCalculator/i18n/sv.ts +1 -8
  84. package/src/tool/starExposureCalculator/i18n/tr.ts +1 -8
  85. package/src/tool/starExposureCalculator/i18n/zh.ts +1 -8
  86. package/src/tool/starExposureCalculator/seo.astro +2 -48
  87. package/src/tool/telescopeResolution/bibliography.ts +7 -0
  88. package/src/tool/telescopeResolution/entry.ts +2 -0
  89. package/src/tool/telescopeResolution/i18n/de.ts +1 -8
  90. package/src/tool/telescopeResolution/i18n/en.ts +1 -8
  91. package/src/tool/telescopeResolution/i18n/es.ts +1 -8
  92. package/src/tool/telescopeResolution/i18n/fr.ts +1 -8
  93. package/src/tool/telescopeResolution/i18n/id.ts +1 -8
  94. package/src/tool/telescopeResolution/i18n/it.ts +1 -8
  95. package/src/tool/telescopeResolution/i18n/ja.ts +1 -8
  96. package/src/tool/telescopeResolution/i18n/ko.ts +1 -8
  97. package/src/tool/telescopeResolution/i18n/nl.ts +1 -8
  98. package/src/tool/telescopeResolution/i18n/pl.ts +1 -8
  99. package/src/tool/telescopeResolution/i18n/pt.ts +1 -8
  100. package/src/tool/telescopeResolution/i18n/ru.ts +1 -8
  101. package/src/tool/telescopeResolution/i18n/sv.ts +1 -8
  102. package/src/tool/telescopeResolution/i18n/tr.ts +1 -8
  103. package/src/tool/telescopeResolution/i18n/zh.ts +1 -8
  104. package/src/tool/telescopeResolution/seo.astro +2 -48
  105. package/src/tools.ts +3 -0
  106. package/src/types.ts +1 -5
@@ -0,0 +1,393 @@
1
+ .epc-wrapper {
2
+ --epc-bg-card: var(--bg-surface, #fff);
3
+ --epc-bg-input: var(--bg-muted, #f5f5f7);
4
+ --epc-text-main: var(--text-base, #1d1d1f);
5
+ --epc-text-muted: var(--text-muted, #86868b);
6
+ --epc-accent: var(--color-primary, #2563eb);
7
+ --epc-accent-hover: var(--color-primary-hover, #1d4ed8);
8
+ --epc-border: var(--border-base, #e5e5ea);
9
+ --epc-danger-base: #ef4444;
10
+ --epc-danger-bg: #fee2e2;
11
+ --epc-danger-text: #b91c1c;
12
+ --epc-success-base: #10b981;
13
+ --epc-success-bg: #d1fae5;
14
+ --epc-success-text: #047857;
15
+ --epc-warning-base: #f59e0b;
16
+ --epc-warning-bg: #fef3c7;
17
+ --epc-warning-text: #b45309;
18
+ --epc-sim-bg: #0f172a;
19
+ --epc-radius: 12px;
20
+ --epc-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
21
+ --epc-shadow-sm: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);
22
+
23
+ color: var(--epc-text-main);
24
+ background: var(--epc-bg-card);
25
+ border-radius: var(--epc-radius);
26
+ box-shadow: var(--epc-shadow);
27
+ border: 1px solid var(--epc-border);
28
+ padding: 1.5rem;
29
+ transition: all 0.3s ease;
30
+ }
31
+
32
+
33
+
34
+
35
+
36
+ .epc-layout {
37
+ display: grid;
38
+ grid-template-columns: 1fr;
39
+ gap: 2rem;
40
+ }
41
+
42
+ @media (min-width: 768px) {
43
+ .epc-layout {
44
+ grid-template-columns: 1fr 1fr;
45
+ }
46
+ }
47
+
48
+ .epc-section {
49
+ margin-bottom: 2rem;
50
+ }
51
+
52
+ .epc-section-title {
53
+ margin: 0 0 1.25rem;
54
+ font-size: 1.25rem;
55
+ font-weight: 600;
56
+ color: var(--epc-text-main);
57
+ }
58
+
59
+ .epc-grid-2 {
60
+ display: grid;
61
+ grid-template-columns: 1fr 1fr;
62
+ gap: 1rem;
63
+ }
64
+
65
+ .epc-control-group {
66
+ margin-bottom: 1rem;
67
+ }
68
+
69
+ .epc-label {
70
+ display: flex;
71
+ align-items: center;
72
+ gap: 0.375rem;
73
+ font-size: 0.875rem;
74
+ font-weight: 500;
75
+ margin-bottom: 0.5rem;
76
+ color: var(--epc-text-main);
77
+ }
78
+
79
+ .epc-info-icon {
80
+ width: 14px;
81
+ height: 14px;
82
+ color: var(--epc-text-muted);
83
+ cursor: help;
84
+ }
85
+
86
+ .epc-input, .epc-select {
87
+ width: 100%;
88
+ padding: 0.625rem 0.75rem;
89
+ border: 1px solid var(--epc-border);
90
+ border-radius: 8px;
91
+ background: var(--epc-bg-input);
92
+ color: var(--epc-text-main);
93
+ font-size: 1rem;
94
+ transition: border-color 0.2s, box-shadow 0.2s;
95
+ box-sizing: border-box;
96
+ }
97
+
98
+ .epc-input:focus, .epc-select:focus {
99
+ outline: none;
100
+ border-color: var(--epc-accent);
101
+ box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
102
+ }
103
+
104
+
105
+
106
+ .epc-btn-primary {
107
+ width: 100%;
108
+ padding: 0.75rem;
109
+ background: var(--epc-accent);
110
+ color: var(--text-inverted, #fff);
111
+ border: none;
112
+ border-radius: 8px;
113
+ font-size: 1rem;
114
+ font-weight: 600;
115
+ cursor: pointer;
116
+ transition: background 0.2s;
117
+ }
118
+
119
+ .epc-btn-primary:hover {
120
+ background: var(--epc-accent-hover);
121
+ }
122
+
123
+
124
+
125
+ .epc-btn-secondary {
126
+ display: flex;
127
+ align-items: center;
128
+ gap: 0.5rem;
129
+ padding: 0.5rem 1rem;
130
+ background: var(--epc-bg-card);
131
+ color: var(--epc-text-main);
132
+ border: 1px solid var(--epc-border);
133
+ border-radius: 20px;
134
+ font-size: 0.875rem;
135
+ font-weight: 500;
136
+ cursor: pointer;
137
+ box-shadow: var(--epc-shadow-sm);
138
+ }
139
+
140
+ .epc-icon {
141
+ width: 16px;
142
+ height: 16px;
143
+ }
144
+
145
+ .epc-cards-container {
146
+ display: flex;
147
+ flex-direction: column;
148
+ gap: 1rem;
149
+ margin-bottom: 1rem;
150
+ }
151
+
152
+ .epc-card {
153
+ background: var(--epc-bg-card);
154
+ border: 1px solid var(--epc-border);
155
+ border-radius: 8px;
156
+ padding: 1rem;
157
+ box-shadow: var(--epc-shadow-sm);
158
+ transition: all 0.2s ease;
159
+ position: relative;
160
+ overflow: hidden;
161
+ cursor: pointer;
162
+ opacity: 0.5;
163
+ }
164
+
165
+ .epc-card:hover {
166
+ border-color: var(--epc-text-muted);
167
+ opacity: 0.8;
168
+ }
169
+
170
+ .epc-card.active {
171
+ border-color: var(--epc-accent);
172
+ box-shadow: 0 0 0 2px var(--epc-accent), var(--epc-shadow-sm);
173
+ background: color-mix(in srgb, var(--epc-accent) 5%, var(--epc-bg-card));
174
+ opacity: 1;
175
+ }
176
+
177
+ .epc-card.status-perfect { border-left: 4px solid var(--epc-success-base); }
178
+ .epc-card.status-warning { border-left: 4px solid var(--epc-warning-base); }
179
+ .epc-card.status-danger { border-left: 4px solid var(--epc-danger-base); }
180
+
181
+ .epc-card-header {
182
+ display: flex;
183
+ justify-content: space-between;
184
+ align-items: center;
185
+ margin-bottom: 0.75rem;
186
+ }
187
+
188
+ .epc-card-title {
189
+ font-weight: 600;
190
+ font-size: 0.875rem;
191
+ }
192
+
193
+ .epc-card-remove {
194
+ background: none;
195
+ border: none;
196
+ color: var(--epc-text-muted);
197
+ cursor: pointer;
198
+ padding: 4px;
199
+ border-radius: 4px;
200
+ }
201
+
202
+ .epc-card-remove:hover {
203
+ color: var(--epc-danger-base);
204
+ background: var(--epc-bg-input);
205
+ }
206
+
207
+ .epc-card-results {
208
+ display: grid;
209
+ grid-template-columns: repeat(3, 1fr);
210
+ gap: 0.5rem;
211
+ margin-top: 1rem;
212
+ padding-top: 1rem;
213
+ border-top: 1px solid var(--epc-border);
214
+ }
215
+
216
+ .epc-stat {
217
+ display: flex;
218
+ flex-direction: column;
219
+ align-items: center;
220
+ }
221
+
222
+ .epc-stat-val {
223
+ font-size: 1.25rem;
224
+ font-weight: 700;
225
+ }
226
+
227
+ .epc-stat-lbl {
228
+ font-size: 0.75rem;
229
+ color: var(--epc-text-muted);
230
+ }
231
+
232
+ /* Simulator */
233
+ .epc-simulator-panel {
234
+ display: flex;
235
+ flex-direction: column;
236
+ gap: 1.5rem;
237
+ }
238
+
239
+ .epc-sim-container {
240
+ width: 100%;
241
+ aspect-ratio: 1;
242
+ max-width: 400px;
243
+ margin: 0 auto;
244
+ border-radius: 50%;
245
+ background: var(--epc-sim-bg);
246
+ position: relative;
247
+ overflow: hidden;
248
+ box-shadow: inset 0 0 50px rgba(255,255,255,0.1), 0 10px 25px rgba(0,0,0,0.2);
249
+ border: 4px solid var(--epc-border);
250
+ }
251
+
252
+
253
+
254
+ .epc-sim-canvas {
255
+ width: 100%;
256
+ height: 100%;
257
+ position: relative;
258
+ display: flex;
259
+ align-items: center;
260
+ justify-content: center;
261
+ }
262
+
263
+ .epc-sim-target {
264
+ position: absolute;
265
+ background-position: center;
266
+ background-repeat: no-repeat;
267
+ background-size: contain;
268
+ transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1);
269
+ }
270
+
271
+ .epc-target-moon {
272
+ background-image: radial-gradient(circle at 30% 30%, #e0e0e0, #888);
273
+ border-radius: 50%;
274
+ }
275
+
276
+ .epc-target-saturn {
277
+ background-image: radial-gradient(ellipse at center, #ffd27f 30%, transparent 70%);
278
+ position: relative;
279
+ }
280
+
281
+ .epc-target-saturn::after {
282
+ content: '';
283
+ position: absolute;
284
+ top: 50%; left: 50%;
285
+ transform: translate(-50%, -50%) rotate(15deg);
286
+ width: 250%; height: 20%;
287
+ border-radius: 50%;
288
+ border: 2px solid #e5c488;
289
+ }
290
+
291
+
292
+
293
+ .epc-target-pleiades {
294
+ background-image: radial-gradient(circle, #fff 1px, transparent 1px);
295
+ background-size: 20% 20%;
296
+ background-position: 10% 10%, 30% 40%, 60% 20%, 80% 50%, 50% 70%, 20% 80%;
297
+ }
298
+
299
+ .epc-target-andromeda {
300
+ background-image: radial-gradient(ellipse at center, rgba(255,255,255,0.8) 5%, rgba(255,255,255,0.2) 30%, transparent 60%);
301
+ border-radius: 50%;
302
+ transform: rotate(35deg);
303
+ }
304
+
305
+ .epc-target-m13 {
306
+ background-image: radial-gradient(circle at center, rgba(255,255,255,1) 5%, rgba(255,255,255,0.6) 15%, rgba(255,255,255,0.2) 35%, transparent 60%);
307
+ border-radius: 50%;
308
+ }
309
+
310
+ .epc-sim-noise {
311
+ position: absolute;
312
+ top: 0; left: 0; right: 0; bottom: 0;
313
+ background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0IiBoZWlnaHQ9IjQiPjxyZWN0IHdpZHRoPSI0IiBoZWlnaHQ9IjQiIGZpbGw9IiNmZmYiIGZpbGwtb3BhY2l0eT0iMC4wNSIvPjwvc3ZnPg==');
314
+ opacity: 0;
315
+ pointer-events: none;
316
+ transition: opacity 0.3s;
317
+ }
318
+
319
+ .epc-sim-mask {
320
+ position: absolute;
321
+ top: 50%; left: 50%;
322
+ transform: translate(-50%, -50%);
323
+ border-radius: 50%;
324
+ border: 1px solid rgba(255,255,255,0.3);
325
+ box-shadow: 0 0 0 9999px rgba(0,0,0,0.6);
326
+ pointer-events: none;
327
+ transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1);
328
+ }
329
+
330
+
331
+
332
+ .epc-feedback-card {
333
+ padding: 1rem;
334
+ border-radius: 8px;
335
+ font-weight: 500;
336
+ line-height: 1.4;
337
+ display: none;
338
+ }
339
+
340
+ .epc-feedback-card.show {
341
+ display: block;
342
+ animation: epc-fade-in 0.3s ease;
343
+ }
344
+
345
+ .epc-feedback-card.perfect {
346
+ background: var(--epc-success-bg);
347
+ color: var(--epc-success-text);
348
+ border: 1px solid var(--epc-success-base);
349
+ }
350
+ .epc-feedback-card.warning {
351
+ background: var(--epc-warning-bg);
352
+ color: var(--epc-warning-text);
353
+ border: 1px solid var(--epc-warning-base);
354
+ }
355
+ .epc-feedback-card.danger {
356
+ background: var(--epc-danger-bg);
357
+ color: var(--epc-danger-text);
358
+ border: 1px solid var(--epc-danger-base);
359
+ }
360
+
361
+
362
+
363
+ .epc-cta-box {
364
+ padding: 1.25rem;
365
+ background: var(--epc-bg-card);
366
+ border: 1px solid var(--epc-border);
367
+ border-radius: 8px;
368
+ text-align: center;
369
+ font-weight: 600;
370
+ color: var(--epc-text-main);
371
+ display: none;
372
+ }
373
+
374
+ .epc-cta-box.show {
375
+ display: block;
376
+ }
377
+
378
+ .epc-cta-box.warning-border {
379
+ border-color: var(--epc-warning-base);
380
+ background: var(--epc-warning-bg);
381
+ color: var(--epc-warning-text);
382
+ }
383
+
384
+ @keyframes epc-fade-in {
385
+ from {
386
+ opacity: 0;
387
+ transform: translateY(5px);
388
+ }
389
+ to {
390
+ opacity: 1;
391
+ transform: translateY(0);
392
+ }
393
+ }
@@ -0,0 +1,7 @@
1
+ import type { BibliographyEntry } from '../../types';
2
+
3
+ export const bibliography: BibliographyEntry[] = [
4
+ { name: 'Règle NPF ou Nightscape Photography Formula', url: 'https://sahavre.fr/wp/regle-npf-rule/' },
5
+ { name: 'Why the 500 Rule is No Longer Enough', url: 'https://petapixel.com/2015/01/06/avoid-star-trails-following-500-rule/' },
6
+ { name: 'Lonely Speck: Belichtungsrechner für Astrofotografie', url: 'https://www.lonelyspeck.com/advanced-astrophotography-shutter-time-calculator/' },
7
+ ];
@@ -47,3 +47,5 @@ export const starExposureCalculator: AstronomyToolEntry<StarExposureCalculatorUI
47
47
  zh: () => import('./i18n/zh').then((m) => m.content),
48
48
  },
49
49
  };
50
+
51
+ export { bibliography } from './bibliography';
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { StarExposureCalculatorUI, StarExposureCalculatorLocaleContent } from '../index';
3
4
 
@@ -51,12 +52,6 @@ const howTo: StarExposureCalculatorLocaleContent['howTo'] = [
51
52
  { name: '4. Zeitüberschreitung simulieren', text: 'Verwenden Sie den Simulationsschieberegler, um zu visualisieren, wie ein Stern aussehen würde, wenn Sie die berechnete Zeit überschreiten.' },
52
53
  ];
53
54
 
54
- const bibliography: StarExposureCalculatorLocaleContent['bibliography'] = [
55
- { name: 'Französische Astronomische Gesellschaft: Das NPF-Modell', url: 'https://sahavre.fr/wp/regle-npf-rule/' },
56
- { name: 'PetaPixel: Warum die 500er-Regel nicht mehr ausreicht', url: 'https://petapixel.com/2015/01/06/avoid-star-trails-following-500-rule/' },
57
- { name: 'Lonely Speck: Belichtungsrechner für Astrofotografie', url: 'https://www.lonelyspeck.com/advanced-astrophotography-shutter-time-calculator/' },
58
- ];
59
-
60
55
  const seo: StarExposureCalculatorLocaleContent['seo'] = [
61
56
  {
62
57
  type: 'summary',
@@ -155,9 +150,7 @@ export const content: StarExposureCalculatorLocaleContent = {
155
150
  ui,
156
151
  seo,
157
152
  faq,
158
- faqTitle: 'Häufig gestellte Fragen (FAQ)',
159
153
  bibliography,
160
- bibliographyTitle: 'Bibliographische Referenzen',
161
154
  howTo,
162
155
  schemas: [faqSchema as any, howToSchema as any, appSchema],
163
156
  };
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { StarExposureCalculatorUI, StarExposureCalculatorLocaleContent } from '../index';
3
4
 
@@ -51,12 +52,6 @@ const howTo: StarExposureCalculatorLocaleContent['howTo'] = [
51
52
  { name: '4. Simulate time excess', text: 'Use the simulation slider to visualize how a star would look if you exceed the calculated time.' },
52
53
  ];
53
54
 
54
- const bibliography: StarExposureCalculatorLocaleContent['bibliography'] = [
55
- { name: 'French Astronomical Society: The NPF Model', url: 'https://sahavre.fr/wp/regle-npf-rule/' },
56
- { name: 'PetaPixel: Why the 500 Rule is No Longer Enough', url: 'https://petapixel.com/2015/01/06/avoid-star-trails-following-500-rule/' },
57
- { name: 'Lonely Speck: Astrophotography Shutter Time Calculator', url: 'https://www.lonelyspeck.com/advanced-astrophotography-shutter-time-calculator/' },
58
- ];
59
-
60
55
  const seo: StarExposureCalculatorLocaleContent['seo'] = [
61
56
  {
62
57
  type: 'summary',
@@ -155,9 +150,7 @@ export const content: StarExposureCalculatorLocaleContent = {
155
150
  ui,
156
151
  seo,
157
152
  faq,
158
- faqTitle: 'Frequently Asked Questions',
159
153
  bibliography,
160
- bibliographyTitle: 'Bibliographic References',
161
154
  howTo,
162
155
  schemas: [faqSchema as any, howToSchema as any, appSchema],
163
156
  };
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { StarExposureCalculatorUI, StarExposureCalculatorLocaleContent } from '../index';
3
4
 
@@ -51,12 +52,6 @@ const howTo: StarExposureCalculatorLocaleContent['howTo'] = [
51
52
  { name: '4. Simula el exceso de tiempo', text: 'Usa el slider de simulación para visualizar cómo se vería una estrella si superas el tiempo calculado.' },
52
53
  ];
53
54
 
54
- const bibliography: StarExposureCalculatorLocaleContent['bibliography'] = [
55
- { name: 'Sociedad Astronómica de Francia: El Modelo NPF', url: 'https://sahavre.fr/wp/regle-npf-rule/' },
56
- { name: 'PetaPixel: Why the 500 Rule is No Longer Enough', url: 'https://petapixel.com/2015/01/06/avoid-star-trails-following-500-rule/' },
57
- { name: 'Lonely Speck: Astrophotography Shutter Time Calculator', url: 'https://www.lonelyspeck.com/advanced-astrophotography-shutter-time-calculator/' },
58
- ];
59
-
60
55
  const seo: StarExposureCalculatorLocaleContent['seo'] = [
61
56
  {
62
57
  type: 'summary',
@@ -155,9 +150,7 @@ export const content: StarExposureCalculatorLocaleContent = {
155
150
  ui,
156
151
  seo,
157
152
  faq,
158
- faqTitle: 'Preguntas Frecuentes',
159
153
  bibliography,
160
- bibliographyTitle: 'Referencias Bibliográficas',
161
154
  howTo,
162
155
  schemas: [faqSchema as any, howToSchema as any, appSchema],
163
156
  };
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { StarExposureCalculatorUI, StarExposureCalculatorLocaleContent } from '../index';
3
4
 
@@ -51,12 +52,6 @@ const howTo: StarExposureCalculatorLocaleContent['howTo'] = [
51
52
  { name: '4. Simulez l\'excès de temps', text: 'Utilisez le curseur de simulation pour visualiser à quoi ressemblerait une étoile si vous dépassez le temps calculé.' },
52
53
  ];
53
54
 
54
- const bibliography: StarExposureCalculatorLocaleContent['bibliography'] = [
55
- { name: 'Société Astronomique de France: Le Modèle NPF', url: 'https://sahavre.fr/wp/regle-npf-rule/' },
56
- { name: 'PetaPixel: Pourquoi la Règle des 500 ne suffit plus', url: 'https://petapixel.com/2015/01/06/avoid-star-trails-following-500-rule/' },
57
- { name: 'Lonely Speck: Calculateur de Temps d\'Obturation', url: 'https://www.lonelyspeck.com/advanced-astrophotography-shutter-time-calculator/' },
58
- ];
59
-
60
55
  const seo: StarExposureCalculatorLocaleContent['seo'] = [
61
56
  {
62
57
  type: 'summary',
@@ -150,9 +145,7 @@ export const content: StarExposureCalculatorLocaleContent = {
150
145
  ui,
151
146
  seo,
152
147
  faq,
153
- faqTitle: 'Questions Fréquentes',
154
148
  bibliography,
155
- bibliographyTitle: 'Références Bibliographiques',
156
149
  howTo,
157
150
  schemas: [faqSchema as any, howToSchema as any, appSchema],
158
151
  };
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { StarExposureCalculatorUI, StarExposureCalculatorLocaleContent } from '../index';
3
4
 
@@ -51,12 +52,6 @@ const howTo: StarExposureCalculatorLocaleContent['howTo'] = [
51
52
  { name: '4. Simulasikan kelebihan waktu', text: 'Gunakan slider simulasi untuk memvisualisasikan bagaimana bintang akan terlihat jika Anda melebihi waktu yang dihitung.' },
52
53
  ];
53
54
 
54
- const bibliography: StarExposureCalculatorLocaleContent['bibliography'] = [
55
- { name: 'Masyarakat Astronomi Prancis: Model NPF', url: 'https://sahavre.fr/wp/regle-npf-rule/' },
56
- { name: 'PetaPixel: Mengapa Aturan 500 Tidak Lagi Cukup', url: 'https://petapixel.com/2015/01/06/avoid-star-trails-following-500-rule/' },
57
- { name: 'Lonely Speck: Kalkulator Waktu Rana Astrofotografi', url: 'https://www.lonelyspeck.com/advanced-astrophotography-shutter-time-calculator/' },
58
- ];
59
-
60
55
  const seo: StarExposureCalculatorLocaleContent['seo'] = [
61
56
  {
62
57
  type: 'summary',
@@ -155,9 +150,7 @@ export const content: StarExposureCalculatorLocaleContent = {
155
150
  ui,
156
151
  seo,
157
152
  faq,
158
- faqTitle: 'Pertanyaan yang Sering Diajukan',
159
153
  bibliography,
160
- bibliographyTitle: 'Referensi Bibliografi',
161
154
  howTo,
162
155
  schemas: [faqSchema as any, howToSchema as any, appSchema],
163
156
  };
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { StarExposureCalculatorUI, StarExposureCalculatorLocaleContent } from '../index';
3
4
 
@@ -51,12 +52,6 @@ const howTo: StarExposureCalculatorLocaleContent['howTo'] = [
51
52
  { name: '4. Simula l\'eccesso di tempo', text: 'Usa lo slider della simulazione per visualizzare come apparirebbe una stella se superi il tempo calcolato.' },
52
53
  ];
53
54
 
54
- const bibliography: StarExposureCalculatorLocaleContent['bibliography'] = [
55
- { name: 'Società Astronomica Francese: Il Modello NPF', url: 'https://sahavre.fr/wp/regle-npf-rule/' },
56
- { name: 'PetaPixel: Perché la Regola del 500 non è più sufficiente', url: 'https://petapixel.com/2015/01/06/avoid-star-trails-following-500-rule/' },
57
- { name: 'Lonely Speck: Calcolatore tempo di scatto per astrofotografia', url: 'https://www.lonelyspeck.com/advanced-astrophotography-shutter-time-calculator/' },
58
- ];
59
-
60
55
  const seo: StarExposureCalculatorLocaleContent['seo'] = [
61
56
  {
62
57
  type: 'summary',
@@ -155,9 +150,7 @@ export const content: StarExposureCalculatorLocaleContent = {
155
150
  ui,
156
151
  seo,
157
152
  faq,
158
- faqTitle: 'Domande Frequenti',
159
153
  bibliography,
160
- bibliographyTitle: 'Riferimenti Bibliografici',
161
154
  howTo,
162
155
  schemas: [faqSchema as any, howToSchema as any, appSchema],
163
156
  };
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { StarExposureCalculatorUI, StarExposureCalculatorLocaleContent } from '../index';
3
4
 
@@ -51,12 +52,6 @@ const howTo: StarExposureCalculatorLocaleContent['howTo'] = [
51
52
  { name: '4. シミュレーションで確認', text: 'スライダーを動かして、時間を超過した際に星がどのように流れて見えるかを確認できます。' },
52
53
  ];
53
54
 
54
- const bibliography: StarExposureCalculatorLocaleContent['bibliography'] = [
55
- { name: 'フランス天文学会:NPFモデルの解説', url: 'https://sahavre.fr/wp/regle-npf-rule/' },
56
- { name: 'PetaPixel:なぜ500ルールでは不十分なのか', url: 'https://petapixel.com/2015/01/06/avoid-star-trails-following-500-rule/' },
57
- { name: 'Lonely Speck:星空撮影シャッタースピード計算', url: 'https://www.lonelyspeck.com/advanced-astrophotography-shutter-time-calculator/' },
58
- ];
59
-
60
55
  const seo: StarExposureCalculatorLocaleContent['seo'] = [
61
56
  {
62
57
  type: 'summary',
@@ -155,9 +150,7 @@ export const content: StarExposureCalculatorLocaleContent = {
155
150
  ui,
156
151
  seo,
157
152
  faq,
158
- faqTitle: 'よくある質問 (FAQ)',
159
153
  bibliography,
160
- bibliographyTitle: '参考文献',
161
154
  howTo,
162
155
  schemas: [faqSchema as any, howToSchema as any, appSchema],
163
156
  };
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { StarExposureCalculatorUI, StarExposureCalculatorLocaleContent } from '../index';
3
4
 
@@ -51,12 +52,6 @@ const howTo: StarExposureCalculatorLocaleContent['howTo'] = [
51
52
  { name: '4. 시간 초과 시뮬레이션', text: '시뮬레이션 슬라이더를 사용하여 계산된 시간을 초과했을 때 별이 어떻게 보이는지 미리 확인하세요.' },
52
53
  ];
53
54
 
54
- const bibliography: StarExposureCalculatorLocaleContent['bibliography'] = [
55
- { name: '프랑스 천문학회: NPF 모델 상세 설명', url: 'https://sahavre.fr/wp/regle-npf-rule/' },
56
- { name: 'PetaPixel: 왜 더 이상 500 법칙만으로는 충분하지 않은가', url: 'https://petapixel.com/2015/01/06/avoid-star-trails-following-500-rule/' },
57
- { name: 'Lonely Speck: 천체 사진 셔터 스피드 계산 도구', url: 'https://www.lonelyspeck.com/advanced-astrophotography-shutter-time-calculator/' },
58
- ];
59
-
60
55
  const seo: StarExposureCalculatorLocaleContent['seo'] = [
61
56
  {
62
57
  type: 'summary',
@@ -155,9 +150,7 @@ export const content: StarExposureCalculatorLocaleContent = {
155
150
  ui,
156
151
  seo,
157
152
  faq,
158
- faqTitle: '자주 묻는 질문 (FAQ)',
159
153
  bibliography,
160
- bibliographyTitle: '참고 문헌',
161
154
  howTo,
162
155
  schemas: [faqSchema as any, howToSchema as any, appSchema],
163
156
  };
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { StarExposureCalculatorUI, StarExposureCalculatorLocaleContent } from '../index';
3
4
 
@@ -51,12 +52,6 @@ const howTo: StarExposureCalculatorLocaleContent['howTo'] = [
51
52
  { name: '4. Simuleer tijdsoverschrijding', text: 'Gebruik de simulatieregelaar om te visualiseren hoe een ster eruit zou zien als je de berekende tijd overschrijdt.' },
52
53
  ];
53
54
 
54
- const bibliography: StarExposureCalculatorLocaleContent['bibliography'] = [
55
- { name: 'Franse Astronomische Vereniging: Het NPF-model', url: 'https://sahavre.fr/wp/regle-npf-rule/' },
56
- { name: 'PetaPixel: Waarom de 500-regel niet meer genoeg is', url: 'https://petapixel.com/2015/01/06/avoid-star-trails-following-500-rule/' },
57
- { name: 'Lonely Speck: Astrofotografie Belichtingstijd Calculator', url: 'https://www.lonelyspeck.com/advanced-astrophotography-shutter-time-calculator/' },
58
- ];
59
-
60
55
  const seo: StarExposureCalculatorLocaleContent['seo'] = [
61
56
  {
62
57
  type: 'summary',
@@ -155,9 +150,7 @@ export const content: StarExposureCalculatorLocaleContent = {
155
150
  ui,
156
151
  seo,
157
152
  faq,
158
- faqTitle: 'Veelgestelde Vragen',
159
153
  bibliography,
160
- bibliographyTitle: 'Bibliografische Referenties',
161
154
  howTo,
162
155
  schemas: [faqSchema as any, howToSchema as any, appSchema],
163
156
  };
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { StarExposureCalculatorUI, StarExposureCalculatorLocaleContent } from '../index';
3
4
 
@@ -51,12 +52,6 @@ const howTo: StarExposureCalculatorLocaleContent['howTo'] = [
51
52
  { name: '4. Symuluj przekroczenie czasu', text: 'Użyj suwaka symulacji, aby zobaczyć, jak wyglądałaby gwiazda po przekroczeniu obliczonego czasu ekspozycji.' },
52
53
  ];
53
54
 
54
- const bibliography: StarExposureCalculatorLocaleContent['bibliography'] = [
55
- { name: 'Francuskie Towarzystwo Astronomiczne: Model NPF', url: 'https://sahavre.fr/wp/regle-npf-rule/' },
56
- { name: 'PetaPixel: Dlaczego reguła 500 już nie wystarcza', url: 'https://petapixel.com/2015/01/06/avoid-star-trails-following-500-rule/' },
57
- { name: 'Lonely Speck: Kalkulator czasu ekspozycji w astrofotografii', url: 'https://www.lonelyspeck.com/advanced-astrophotography-shutter-time-calculator/' },
58
- ];
59
-
60
55
  const seo: StarExposureCalculatorLocaleContent['seo'] = [
61
56
  {
62
57
  type: 'summary',
@@ -155,9 +150,7 @@ export const content: StarExposureCalculatorLocaleContent = {
155
150
  ui,
156
151
  seo,
157
152
  faq,
158
- faqTitle: 'Często zadawane pytania',
159
153
  bibliography,
160
- bibliographyTitle: 'Bibliografia',
161
154
  howTo,
162
155
  schemas: [faqSchema as any, howToSchema as any, appSchema],
163
156
  };