@jjlmoya/utils-chrono 1.19.0 → 1.20.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 (33) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +2 -0
  3. package/src/entries.ts +4 -1
  4. package/src/index.ts +1 -0
  5. package/src/tests/locale_completeness.test.ts +1 -1
  6. package/src/tests/tool_validation.test.ts +1 -1
  7. package/src/tool/altitude-watch-accuracy-estimator/altitude-watch-accuracy-estimator.css +488 -0
  8. package/src/tool/altitude-watch-accuracy-estimator/bibliography.astro +16 -0
  9. package/src/tool/altitude-watch-accuracy-estimator/bibliography.ts +12 -0
  10. package/src/tool/altitude-watch-accuracy-estimator/client.ts +167 -0
  11. package/src/tool/altitude-watch-accuracy-estimator/component.astro +15 -0
  12. package/src/tool/altitude-watch-accuracy-estimator/components/AltitudeScene.astro +138 -0
  13. package/src/tool/altitude-watch-accuracy-estimator/entry.ts +61 -0
  14. package/src/tool/altitude-watch-accuracy-estimator/helpers.ts +49 -0
  15. package/src/tool/altitude-watch-accuracy-estimator/i18n/de.ts +101 -0
  16. package/src/tool/altitude-watch-accuracy-estimator/i18n/en.ts +101 -0
  17. package/src/tool/altitude-watch-accuracy-estimator/i18n/es.ts +101 -0
  18. package/src/tool/altitude-watch-accuracy-estimator/i18n/fr.ts +101 -0
  19. package/src/tool/altitude-watch-accuracy-estimator/i18n/id.ts +101 -0
  20. package/src/tool/altitude-watch-accuracy-estimator/i18n/it.ts +101 -0
  21. package/src/tool/altitude-watch-accuracy-estimator/i18n/ja.ts +101 -0
  22. package/src/tool/altitude-watch-accuracy-estimator/i18n/ko.ts +101 -0
  23. package/src/tool/altitude-watch-accuracy-estimator/i18n/nl.ts +101 -0
  24. package/src/tool/altitude-watch-accuracy-estimator/i18n/pl.ts +101 -0
  25. package/src/tool/altitude-watch-accuracy-estimator/i18n/pt.ts +101 -0
  26. package/src/tool/altitude-watch-accuracy-estimator/i18n/ru.ts +101 -0
  27. package/src/tool/altitude-watch-accuracy-estimator/i18n/sv.ts +101 -0
  28. package/src/tool/altitude-watch-accuracy-estimator/i18n/tr.ts +101 -0
  29. package/src/tool/altitude-watch-accuracy-estimator/i18n/zh.ts +101 -0
  30. package/src/tool/altitude-watch-accuracy-estimator/index.ts +11 -0
  31. package/src/tool/altitude-watch-accuracy-estimator/logic.ts +61 -0
  32. package/src/tool/altitude-watch-accuracy-estimator/seo.astro +16 -0
  33. package/src/tools.ts +2 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jjlmoya/utils-chrono",
3
- "version": "1.19.0",
3
+ "version": "1.20.0",
4
4
  "type": "module",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./src/index.ts",
@@ -21,6 +21,7 @@ import { tourbillonVisualizer } from '../tool/tourbillon-visualizer/entry';
21
21
  import { gmtWorldTimer } from '../tool/gmt-world-timer/entry';
22
22
  import { quartzBatteryHealth } from '../tool/quartz-battery-health/entry';
23
23
  import { mainspringFinder } from '../tool/mainspring-finder/entry';
24
+ import { altitudeWatchAccuracyEstimator } from '../tool/altitude-watch-accuracy-estimator/entry';
24
25
 
25
26
  export const chronoCategory: ChronoCategoryEntry = {
26
27
  icon: 'mdi:clock-outline',
@@ -47,6 +48,7 @@ export const chronoCategory: ChronoCategoryEntry = {
47
48
  gmtWorldTimer,
48
49
  quartzBatteryHealth,
49
50
  mainspringFinder,
51
+ altitudeWatchAccuracyEstimator,
50
52
  ],
51
53
  i18n: {
52
54
  de: () => import('./i18n/de').then((m) => m.content),
package/src/entries.ts CHANGED
@@ -44,6 +44,8 @@ export { quartzBatteryHealth } from './tool/quartz-battery-health/entry';
44
44
  export type { QuartzBatteryHealthUI, QuartzBatteryHealthLocaleContent } from './tool/quartz-battery-health/entry';
45
45
  export { mainspringFinder } from './tool/mainspring-finder/entry';
46
46
  export type { MainspringFinderUI, MainspringFinderLocaleContent } from './tool/mainspring-finder/entry';
47
+ export { altitudeWatchAccuracyEstimator } from './tool/altitude-watch-accuracy-estimator/entry';
48
+ export type { AltitudeWatchAccuracyEstimatorUI, AltitudeWatchAccuracyEstimatorLocaleContent } from './tool/altitude-watch-accuracy-estimator/entry';
47
49
  export { chronoCategory } from './category';
48
50
 
49
51
  import { watchAccuracyTracker } from './tool/watch-accuracy-tracker/entry';
@@ -69,6 +71,7 @@ import { tourbillonVisualizer } from './tool/tourbillon-visualizer/entry';
69
71
  import { gmtWorldTimer } from './tool/gmt-world-timer/entry';
70
72
  import { quartzBatteryHealth } from './tool/quartz-battery-health/entry';
71
73
  import { mainspringFinder } from './tool/mainspring-finder/entry';
74
+ import { altitudeWatchAccuracyEstimator } from './tool/altitude-watch-accuracy-estimator/entry';
72
75
 
73
- export const ALL_ENTRIES = [watchAccuracyTracker, wristPresenceCalculator, demagnetizingTimer, watchSavingsPlanner, crownReferenceGuide, powerReserveEstimator, beatRateConverter, waterResistanceConverter, strapTaperCalculator, watchSizeComparator, lumeColorSimulator, moonPhaseVisualizer, tachymeterCalculator, serviceIntervalTracker, strapLengthCalculator, telemeterCalculator, siderealTimeTracker, gearTrainExplorer, perpetualCalendar, tourbillonVisualizer, gmtWorldTimer, quartzBatteryHealth, mainspringFinder];
76
+ export const ALL_ENTRIES = [watchAccuracyTracker, wristPresenceCalculator, demagnetizingTimer, watchSavingsPlanner, crownReferenceGuide, powerReserveEstimator, beatRateConverter, waterResistanceConverter, strapTaperCalculator, watchSizeComparator, lumeColorSimulator, moonPhaseVisualizer, tachymeterCalculator, serviceIntervalTracker, strapLengthCalculator, telemeterCalculator, siderealTimeTracker, gearTrainExplorer, perpetualCalendar, tourbillonVisualizer, gmtWorldTimer, quartzBatteryHealth, mainspringFinder, altitudeWatchAccuracyEstimator];
74
77
 
package/src/index.ts CHANGED
@@ -17,6 +17,7 @@ export { serviceIntervalTracker, SERVICE_INTERVAL_TRACKER_TOOL } from './tool/se
17
17
  export { strapLengthCalculator, STRAP_LENGTH_CALCULATOR_TOOL } from './tool/strap-length-calculator';
18
18
  export { quartzBatteryHealth, QUARTZ_BATTERY_HEALTH_TOOL } from './tool/quartz-battery-health';
19
19
  export { mainspringFinder, MAINSPRING_FINDER_TOOL } from './tool/mainspring-finder';
20
+ export { altitudeWatchAccuracyEstimator, ALTITUDE_WATCH_ACCURACY_ESTIMATOR_TOOL } from './tool/altitude-watch-accuracy-estimator';
20
21
 
21
22
  export type {
22
23
  KnownLocale,
@@ -22,7 +22,7 @@ describe('Locale Completeness Validation', () => {
22
22
  });
23
23
 
24
24
  it('all tools registered', () => {
25
- expect(ALL_TOOLS.length).toBe(23);
25
+ expect(ALL_TOOLS.length).toBe(24);
26
26
  });
27
27
 
28
28
  });
@@ -5,7 +5,7 @@ import { chronoCategory } from '../data';
5
5
  describe('Tool Validation Suite', () => {
6
6
  describe('Library Registration', () => {
7
7
  it('should have tools in ALL_TOOLS', () => {
8
- expect(ALL_TOOLS.length).toBe(23);
8
+ expect(ALL_TOOLS.length).toBe(24);
9
9
  });
10
10
 
11
11
 
@@ -0,0 +1,488 @@
1
+ .tool-main-card {
2
+ --color-success: #22c55e;
3
+ --color-warning: #eab308;
4
+ --color-orange: #f97316;
5
+ --color-danger: #ef4444;
6
+
7
+ background: var(--bg-surface);
8
+ border: 1px solid var(--border-color);
9
+ border-radius: 1.25rem;
10
+ margin: 0 auto;
11
+ padding: 1.25rem;
12
+ display: flex;
13
+ flex-direction: column;
14
+ gap: 1rem;
15
+ box-shadow: var(--shadow-base);
16
+ }
17
+
18
+ .alti-layout {
19
+ display: grid;
20
+ grid-template-columns: 140px 1fr;
21
+ gap: 1.25rem;
22
+ }
23
+
24
+ .alti-column {
25
+ position: relative;
26
+ width: 140px;
27
+ height: 420px;
28
+ flex-shrink: 0;
29
+ }
30
+
31
+ .alti-mountain-svg {
32
+ width: 100%;
33
+ height: 100%;
34
+ display: block;
35
+ }
36
+
37
+ .alti-thumb {
38
+ position: absolute;
39
+ left: 50%;
40
+ width: 32px;
41
+ height: 32px;
42
+ background: var(--accent);
43
+ border: 3px solid var(--bg-surface);
44
+ border-radius: 50%;
45
+ cursor: grab;
46
+ transform: translate(-50%, 50%);
47
+ z-index: 10;
48
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 30%, transparent), 0 2px 8px rgba(0,0,0,0.3);
49
+ transition: box-shadow 0.2s ease;
50
+ touch-action: none;
51
+ }
52
+
53
+ .alti-thumb:hover {
54
+ box-shadow: 0 0 0 5px color-mix(in srgb, var(--accent) 20%, transparent), 0 2px 12px rgba(0,0,0,0.4);
55
+ }
56
+
57
+ .alti-thumb::after {
58
+ content: '';
59
+ position: absolute;
60
+ top: 50%;
61
+ left: 50%;
62
+ width: 8px;
63
+ height: 8px;
64
+ background: var(--bg-surface);
65
+ border-radius: 50%;
66
+ transform: translate(-50%, -50%);
67
+ }
68
+
69
+ .alti-elevation-label {
70
+ position: absolute;
71
+ right: -8px;
72
+ font-size: 0.6rem;
73
+ font-weight: 700;
74
+ color: var(--text-base);
75
+ opacity: 0.4;
76
+ transform: translateY(-50%);
77
+ font-variant-numeric: tabular-nums;
78
+ pointer-events: none;
79
+ }
80
+
81
+ .alti-current-label {
82
+ position: absolute;
83
+ left: 50%;
84
+ font-size: 0.65rem;
85
+ font-weight: 700;
86
+ color: var(--accent);
87
+ transform: translate(-50%, calc(50% + 16px));
88
+ white-space: nowrap;
89
+ font-variant-numeric: tabular-nums;
90
+ pointer-events: none;
91
+ z-index: 11;
92
+ }
93
+
94
+ .alti-particles {
95
+ position: absolute;
96
+ top: 0;
97
+ left: 0;
98
+ width: 100%;
99
+ height: 100%;
100
+ pointer-events: none;
101
+ overflow: hidden;
102
+ border-radius: 0.75rem;
103
+ }
104
+
105
+ .alti-particle {
106
+ position: absolute;
107
+ width: 3px;
108
+ height: 3px;
109
+ background: var(--accent);
110
+ border-radius: 50%;
111
+ opacity: 0.3;
112
+ animation: particle-float 3s ease-in-out infinite;
113
+ }
114
+
115
+ @keyframes particle-float {
116
+ 0%, 100% {
117
+ transform: translateY(0) scale(1);
118
+ opacity: 0.15;
119
+ }
120
+ 50% {
121
+ transform: translateY(-20px) scale(1.4);
122
+ opacity: 0.4;
123
+ }
124
+ }
125
+
126
+ .alti-main {
127
+ display: flex;
128
+ flex-direction: column;
129
+ gap: 1rem;
130
+ min-width: 0;
131
+ }
132
+
133
+ .alti-top-row {
134
+ display: grid;
135
+ grid-template-columns: 1fr 1fr;
136
+ gap: 1rem;
137
+ }
138
+
139
+ .alti-balance-panel {
140
+ background: var(--bg-page);
141
+ border: 1px solid var(--border-base);
142
+ border-radius: 0.875rem;
143
+ padding: 1rem;
144
+ display: flex;
145
+ flex-direction: column;
146
+ align-items: center;
147
+ gap: 0.5rem;
148
+ position: relative;
149
+ overflow: hidden;
150
+ }
151
+
152
+ .alti-balance-panel::before {
153
+ content: '';
154
+ position: absolute;
155
+ inset: 0;
156
+ background: radial-gradient(ellipse at 50% 40%, color-mix(in srgb, var(--accent) 4%, transparent) 0%, transparent 70%);
157
+ pointer-events: none;
158
+ }
159
+
160
+ .alti-balance-title {
161
+ font-size: 0.6rem;
162
+ font-weight: 600;
163
+ text-transform: uppercase;
164
+ letter-spacing: 0.06em;
165
+ color: var(--text-base);
166
+ opacity: 0.5;
167
+ }
168
+
169
+ .alti-balance-svg-wrap {
170
+ width: 140px;
171
+ height: 140px;
172
+ position: relative;
173
+ }
174
+
175
+ .alti-balance-svg-wrap svg {
176
+ width: 100%;
177
+ height: 100%;
178
+ display: block;
179
+ overflow: visible;
180
+ }
181
+
182
+ .balance-rim {
183
+ fill: none;
184
+ stroke: var(--text-base);
185
+ stroke-width: 2;
186
+ opacity: 0.15;
187
+ }
188
+
189
+ .balance-outer {
190
+ fill: none;
191
+ stroke: var(--accent);
192
+ stroke-width: 2.5;
193
+ opacity: 0.6;
194
+ transition: stroke 0.3s ease;
195
+ }
196
+
197
+ .balance-spoke {
198
+ stroke: var(--text-base);
199
+ stroke-width: 2;
200
+ opacity: 0.3;
201
+ transform-origin: 70px 70px;
202
+ transition: transform 0.05s linear;
203
+ }
204
+
205
+ .balance-hub {
206
+ fill: var(--accent);
207
+ opacity: 0.8;
208
+ }
209
+
210
+ .balance-staff {
211
+ fill: var(--text-base);
212
+ opacity: 0.15;
213
+ }
214
+
215
+ .balance-hairspring {
216
+ fill: none;
217
+ stroke: var(--accent);
218
+ stroke-width: 1;
219
+ opacity: 0.3;
220
+ }
221
+
222
+ .alti-rate-badge {
223
+ display: flex;
224
+ align-items: baseline;
225
+ gap: 0.25rem;
226
+ padding: 0.3rem 0.75rem;
227
+ background: color-mix(in srgb, var(--accent) 8%, var(--bg-page));
228
+ border: 1px solid color-mix(in srgb, var(--accent) 15%, transparent);
229
+ border-radius: 2rem;
230
+ font-size: 0.75rem;
231
+ font-weight: 700;
232
+ color: var(--accent);
233
+ font-variant-numeric: tabular-nums;
234
+ }
235
+
236
+ .alti-rate-badge .unit {
237
+ font-size: 0.6rem;
238
+ font-weight: 600;
239
+ opacity: 0.6;
240
+ }
241
+
242
+ .alti-rate-badge.neutral {
243
+ color: var(--text-base);
244
+ border-color: var(--border-base);
245
+ background: var(--bg-page);
246
+ }
247
+
248
+ .alti-deviation-panel {
249
+ background: var(--bg-page);
250
+ border: 1px solid var(--border-base);
251
+ border-radius: 0.875rem;
252
+ padding: 1rem;
253
+ display: flex;
254
+ flex-direction: column;
255
+ gap: 0.5rem;
256
+ }
257
+
258
+ .alti-deviation-title {
259
+ font-size: 0.6rem;
260
+ font-weight: 600;
261
+ text-transform: uppercase;
262
+ letter-spacing: 0.06em;
263
+ color: var(--text-base);
264
+ opacity: 0.5;
265
+ }
266
+
267
+ .alti-deviation-gauge {
268
+ display: flex;
269
+ flex-direction: column;
270
+ align-items: center;
271
+ gap: 0.25rem;
272
+ }
273
+
274
+ .alti-deviation-value {
275
+ font-size: 2.5rem;
276
+ font-weight: 800;
277
+ font-variant-numeric: tabular-nums;
278
+ line-height: 1;
279
+ color: var(--accent);
280
+ transition: color 0.3s ease;
281
+ }
282
+
283
+ .alti-deviation-value.negative { color: var(--text-dimmed); }
284
+
285
+ .alti-deviation-unit {
286
+ font-size: 0.75rem;
287
+ font-weight: 600;
288
+ color: var(--text-dimmed);
289
+ text-transform: uppercase;
290
+ letter-spacing: 0.05em;
291
+ opacity: 0.6;
292
+ }
293
+
294
+ .alti-deviation-bar {
295
+ width: 100%;
296
+ height: 6px;
297
+ background: var(--border-base);
298
+ border-radius: 3px;
299
+ overflow: hidden;
300
+ margin-top: 0.25rem;
301
+ }
302
+
303
+ .alti-deviation-fill {
304
+ height: 100%;
305
+ background: var(--accent);
306
+ border-radius: 3px;
307
+ transition: width 0.3s ease;
308
+ }
309
+
310
+ .alti-deviation-desc {
311
+ font-size: 0.65rem;
312
+ font-weight: 600;
313
+ text-transform: uppercase;
314
+ letter-spacing: 0.05em;
315
+ padding: 0.15rem 0.5rem;
316
+ border-radius: 0.25rem;
317
+ background: color-mix(in srgb, var(--accent) 8%, var(--bg-page));
318
+ color: var(--accent);
319
+ }
320
+
321
+ .alti-deviation-desc.negligible {
322
+ background: color-mix(in srgb, var(--color-success) 8%, var(--bg-page));
323
+ color: var(--color-success);
324
+ }
325
+ .alti-deviation-desc.minor {
326
+ background: color-mix(in srgb, var(--color-warning) 8%, var(--bg-page));
327
+ color: var(--color-warning);
328
+ }
329
+ .alti-deviation-desc.noticeable {
330
+ background: color-mix(in srgb, var(--accent) 8%, var(--bg-page));
331
+ color: var(--accent);
332
+ }
333
+ .alti-deviation-desc.significant {
334
+ background: color-mix(in srgb, var(--color-orange) 8%, var(--bg-page));
335
+ color: var(--color-orange);
336
+ }
337
+ .alti-deviation-desc.severe {
338
+ background: color-mix(in srgb, var(--color-danger) 8%, var(--bg-page));
339
+ color: var(--color-danger);
340
+ }
341
+
342
+ .alti-atm-row {
343
+ display: grid;
344
+ grid-template-columns: repeat(3, 1fr);
345
+ gap: 0.5rem;
346
+ }
347
+
348
+ .alti-atm-card {
349
+ background: var(--bg-page);
350
+ border: 1px solid var(--border-base);
351
+ border-radius: 0.625rem;
352
+ padding: 0.6rem 0.75rem;
353
+ display: flex;
354
+ flex-direction: column;
355
+ gap: 0.1rem;
356
+ transition: border-color 0.3s ease;
357
+ }
358
+
359
+ .alti-atm-card:hover {
360
+ border-color: color-mix(in srgb, var(--accent) 20%, var(--border-base));
361
+ }
362
+
363
+ .alti-atm-label {
364
+ font-size: 0.55rem;
365
+ font-weight: 600;
366
+ text-transform: uppercase;
367
+ letter-spacing: 0.06em;
368
+ color: var(--text-base);
369
+ opacity: 0.45;
370
+ }
371
+
372
+ .alti-atm-value {
373
+ font-size: 1.1rem;
374
+ font-weight: 700;
375
+ color: var(--text-base);
376
+ font-variant-numeric: tabular-nums;
377
+ line-height: 1.2;
378
+ }
379
+
380
+ .alti-atm-unit {
381
+ font-size: 0.6rem;
382
+ font-weight: 600;
383
+ color: var(--text-dimmed);
384
+ opacity: 0.6;
385
+ }
386
+
387
+ .alti-chart-section {
388
+ background: var(--bg-page);
389
+ border: 1px solid var(--border-base);
390
+ border-radius: 0.875rem;
391
+ padding: 0.75rem 1rem;
392
+ }
393
+
394
+ .alti-chart-title {
395
+ font-size: 0.6rem;
396
+ font-weight: 600;
397
+ text-transform: uppercase;
398
+ letter-spacing: 0.06em;
399
+ color: var(--text-base);
400
+ opacity: 0.5;
401
+ margin-bottom: 0.4rem;
402
+ }
403
+
404
+ .alti-chart-svg {
405
+ width: 100%;
406
+ height: 80px;
407
+ display: block;
408
+ }
409
+
410
+ .alti-chart-grid line {
411
+ stroke: var(--border-base);
412
+ stroke-width: 0.5;
413
+ opacity: 0.4;
414
+ }
415
+
416
+ .alti-chart-line {
417
+ fill: none;
418
+ stroke: var(--accent);
419
+ stroke-width: 2;
420
+ opacity: 0.7;
421
+ }
422
+
423
+ .alti-chart-area {
424
+ fill: color-mix(in srgb, var(--accent) 10%, transparent);
425
+ }
426
+
427
+ .alti-chart-dot {
428
+ fill: var(--accent);
429
+ transition: cx 0.3s ease, cy 0.3s ease;
430
+ }
431
+
432
+ .alti-chart-labels {
433
+ display: flex;
434
+ justify-content: space-between;
435
+ font-size: 0.5rem;
436
+ color: var(--text-base);
437
+ opacity: 0.35;
438
+ margin-top: 0.15rem;
439
+ font-variant-numeric: tabular-nums;
440
+ }
441
+
442
+ .alti-info-bar {
443
+ background: color-mix(in srgb, var(--accent) 4%, var(--bg-page));
444
+ border: 1px solid color-mix(in srgb, var(--accent) 8%, transparent);
445
+ border-radius: 0.625rem;
446
+ padding: 0.6rem 0.75rem;
447
+ display: flex;
448
+ align-items: flex-start;
449
+ gap: 0.5rem;
450
+ }
451
+
452
+ .alti-info-icon {
453
+ flex-shrink: 0;
454
+ width: 18px;
455
+ height: 18px;
456
+ color: var(--accent);
457
+ opacity: 0.6;
458
+ margin-top: 1px;
459
+ }
460
+
461
+ .alti-info-text {
462
+ font-size: 0.7rem;
463
+ color: var(--text-base);
464
+ opacity: 0.65;
465
+ line-height: 1.5;
466
+ }
467
+
468
+ .alti-info-text strong {
469
+ color: var(--accent);
470
+ opacity: 1;
471
+ }
472
+
473
+ @media (max-width: 640px) {
474
+ .alti-layout {
475
+ grid-template-columns: 1fr;
476
+ }
477
+ .alti-column {
478
+ width: 100%;
479
+ height: 120px;
480
+ order: -1;
481
+ }
482
+ .alti-top-row {
483
+ grid-template-columns: 1fr;
484
+ }
485
+ .alti-atm-row {
486
+ grid-template-columns: repeat(3, 1fr);
487
+ }
488
+ }
@@ -0,0 +1,16 @@
1
+ ---
2
+ import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
3
+ import { altitudeWatchAccuracyEstimator } from './index';
4
+ import type { KnownLocale } from '../../types';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'en' } = Astro.props as Props;
11
+ const loader = altitudeWatchAccuracyEstimator.i18n[locale] || altitudeWatchAccuracyEstimator.i18n.en;
12
+ const content = await loader?.();
13
+ if (!content) return null;
14
+ ---
15
+
16
+ {content && <SharedBibliography links={content.bibliography} />}
@@ -0,0 +1,12 @@
1
+ import type { BibliographyEntry } from '../../types';
2
+
3
+ export const bibliography: BibliographyEntry[] = [
4
+ {
5
+ name: 'Atmospheric Pressure vs Altitude - Engineering Toolbox',
6
+ url: 'https://www.engineeringtoolbox.com/air-altitude-pressure-d_462.html',
7
+ },
8
+ {
9
+ name: 'Watch Accuracy and Environmental Factors - Watchuseek',
10
+ url: 'https://www.watchuseek.com/threads/elevation-impact-on-automatic-movement-precision-accuracy.371978/',
11
+ },
12
+ ];