@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.
- package/package.json +1 -1
- package/src/category/index.ts +2 -0
- package/src/entries.ts +4 -1
- package/src/index.ts +1 -0
- package/src/tests/locale_completeness.test.ts +1 -1
- package/src/tests/tool_validation.test.ts +1 -1
- package/src/tool/altitude-watch-accuracy-estimator/altitude-watch-accuracy-estimator.css +488 -0
- package/src/tool/altitude-watch-accuracy-estimator/bibliography.astro +16 -0
- package/src/tool/altitude-watch-accuracy-estimator/bibliography.ts +12 -0
- package/src/tool/altitude-watch-accuracy-estimator/client.ts +167 -0
- package/src/tool/altitude-watch-accuracy-estimator/component.astro +15 -0
- package/src/tool/altitude-watch-accuracy-estimator/components/AltitudeScene.astro +138 -0
- package/src/tool/altitude-watch-accuracy-estimator/entry.ts +61 -0
- package/src/tool/altitude-watch-accuracy-estimator/helpers.ts +49 -0
- package/src/tool/altitude-watch-accuracy-estimator/i18n/de.ts +101 -0
- package/src/tool/altitude-watch-accuracy-estimator/i18n/en.ts +101 -0
- package/src/tool/altitude-watch-accuracy-estimator/i18n/es.ts +101 -0
- package/src/tool/altitude-watch-accuracy-estimator/i18n/fr.ts +101 -0
- package/src/tool/altitude-watch-accuracy-estimator/i18n/id.ts +101 -0
- package/src/tool/altitude-watch-accuracy-estimator/i18n/it.ts +101 -0
- package/src/tool/altitude-watch-accuracy-estimator/i18n/ja.ts +101 -0
- package/src/tool/altitude-watch-accuracy-estimator/i18n/ko.ts +101 -0
- package/src/tool/altitude-watch-accuracy-estimator/i18n/nl.ts +101 -0
- package/src/tool/altitude-watch-accuracy-estimator/i18n/pl.ts +101 -0
- package/src/tool/altitude-watch-accuracy-estimator/i18n/pt.ts +101 -0
- package/src/tool/altitude-watch-accuracy-estimator/i18n/ru.ts +101 -0
- package/src/tool/altitude-watch-accuracy-estimator/i18n/sv.ts +101 -0
- package/src/tool/altitude-watch-accuracy-estimator/i18n/tr.ts +101 -0
- package/src/tool/altitude-watch-accuracy-estimator/i18n/zh.ts +101 -0
- package/src/tool/altitude-watch-accuracy-estimator/index.ts +11 -0
- package/src/tool/altitude-watch-accuracy-estimator/logic.ts +61 -0
- package/src/tool/altitude-watch-accuracy-estimator/seo.astro +16 -0
- package/src/tools.ts +2 -0
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { getAtmosphericData, DEVIATION_CHART_POINTS } from './logic';
|
|
2
|
+
|
|
3
|
+
const column = document.getElementById('alti-column')!;
|
|
4
|
+
const thumb = document.getElementById('alti-thumb')!;
|
|
5
|
+
const currentLabel = document.getElementById('alti-current-label')!;
|
|
6
|
+
const particlesContainer = document.getElementById('alti-particles')!;
|
|
7
|
+
|
|
8
|
+
const deviationValue = document.getElementById('alti-deviation-value')!;
|
|
9
|
+
const deviationFill = document.getElementById('alti-deviation-fill')!;
|
|
10
|
+
const deviationDesc = document.getElementById('alti-deviation-desc')!;
|
|
11
|
+
const rateBadge = document.getElementById('alti-rate-badge')!;
|
|
12
|
+
const rateValue = document.getElementById('alti-rate-value')!;
|
|
13
|
+
|
|
14
|
+
const atmPressure = document.getElementById('atm-pressure')!;
|
|
15
|
+
const atmDensity = document.getElementById('atm-density')!;
|
|
16
|
+
const atmTemp = document.getElementById('atm-temp')!;
|
|
17
|
+
|
|
18
|
+
const chartSvg = document.getElementById('deviation-chart')!;
|
|
19
|
+
|
|
20
|
+
const COL_HEIGHT = 420;
|
|
21
|
+
const MAX_ALT = 8000;
|
|
22
|
+
|
|
23
|
+
let currentAltitude = 0;
|
|
24
|
+
|
|
25
|
+
function getAltFromY(y: number): number {
|
|
26
|
+
const fraction = Math.max(0, Math.min(1, y / COL_HEIGHT));
|
|
27
|
+
return Math.round((1 - fraction) * MAX_ALT / 10) * 10;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function getYFromAlt(alt: number): number {
|
|
31
|
+
return (1 - alt / MAX_ALT) * COL_HEIGHT;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function createParticles(count: number) {
|
|
35
|
+
particlesContainer.innerHTML = '';
|
|
36
|
+
for (let i = 0; i < count; i++) {
|
|
37
|
+
const p = document.createElement('div');
|
|
38
|
+
p.className = 'alti-particle';
|
|
39
|
+
p.style.cssText = `left:${Math.random() * 100}%;top:${Math.random() * 100}%;animation-delay:${Math.random() * 3}s;animation-duration:${2 + Math.random() * 3}s;width:${2 + Math.random() * 2}px;height:${2 + Math.random() * 2}px;`;
|
|
40
|
+
particlesContainer.appendChild(p);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function updateParticles(altitude: number) {
|
|
45
|
+
createParticles(Math.round((1 - altitude / MAX_ALT) * 30));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function drawChart(currentAlt: number) {
|
|
49
|
+
const w = 800;
|
|
50
|
+
const h = 80;
|
|
51
|
+
const last = DEVIATION_CHART_POINTS[DEVIATION_CHART_POINTS.length - 1];
|
|
52
|
+
const maxDev = last ? last.deviation + 1 : 10;
|
|
53
|
+
const pad = 4;
|
|
54
|
+
const plotH = h - pad * 2;
|
|
55
|
+
|
|
56
|
+
let pathD = '';
|
|
57
|
+
let areaD = '';
|
|
58
|
+
for (let i = 0; i < DEVIATION_CHART_POINTS.length; i++) {
|
|
59
|
+
const p = DEVIATION_CHART_POINTS[i];
|
|
60
|
+
const x = (p.altitude / MAX_ALT) * w;
|
|
61
|
+
const y = h - pad - (p.deviation / maxDev) * plotH;
|
|
62
|
+
const cmd = i === 0 ? 'M' : 'L';
|
|
63
|
+
pathD += cmd + x.toFixed(1) + ' ' + y.toFixed(1);
|
|
64
|
+
areaD += cmd + x.toFixed(1) + ' ' + y.toFixed(1);
|
|
65
|
+
}
|
|
66
|
+
areaD += ' L' + w.toFixed(1) + ' ' + h.toFixed(1) + ' L0 ' + h.toFixed(1) + ' Z';
|
|
67
|
+
|
|
68
|
+
const idx = Math.min(Math.round(currentAlt / 100), DEVIATION_CHART_POINTS.length - 1);
|
|
69
|
+
const currentData = DEVIATION_CHART_POINTS[idx];
|
|
70
|
+
const cx = idx * 10;
|
|
71
|
+
const cy = currentData ? h - pad - (currentData.deviation / maxDev) * plotH : h;
|
|
72
|
+
|
|
73
|
+
chartSvg.innerHTML = `
|
|
74
|
+
<rect x="0" y="0" width="${w}" height="${h}" fill="transparent"/>
|
|
75
|
+
<path d="${areaD}" fill="url(#chart-grad)"/>
|
|
76
|
+
<path d="${pathD}" class="alti-chart-line"/>
|
|
77
|
+
<circle cx="${cx}" cy="${cy.toFixed(1)}" r="4" class="alti-chart-dot"/>
|
|
78
|
+
`;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function updateDisplay(altitude: number) {
|
|
82
|
+
currentAltitude = altitude;
|
|
83
|
+
const data = getAtmosphericData(altitude);
|
|
84
|
+
const y = getYFromAlt(altitude);
|
|
85
|
+
|
|
86
|
+
const bottomPct = (1 - y / COL_HEIGHT) * 100;
|
|
87
|
+
thumb.style.bottom = bottomPct + '%';
|
|
88
|
+
currentLabel.textContent = altitude + ' m';
|
|
89
|
+
currentLabel.style.top = '';
|
|
90
|
+
currentLabel.style.bottom = bottomPct + '%';
|
|
91
|
+
|
|
92
|
+
atmPressure.textContent = data.pressure.toFixed(1);
|
|
93
|
+
atmDensity.textContent = data.density.toFixed(3);
|
|
94
|
+
atmTemp.textContent = data.temperature.toFixed(1);
|
|
95
|
+
|
|
96
|
+
deviationValue.textContent = (data.deviation > 0 ? '+' : '') + data.deviation.toFixed(1);
|
|
97
|
+
const pct = Math.min(100, (data.deviation / 15) * 100);
|
|
98
|
+
deviationFill.style.width = pct + '%';
|
|
99
|
+
|
|
100
|
+
deviationDesc.textContent = data.deviationDesc.charAt(0).toUpperCase() + data.deviationDesc.slice(1);
|
|
101
|
+
deviationDesc.className = 'alti-deviation-desc ' + data.deviationDesc;
|
|
102
|
+
|
|
103
|
+
rateValue.textContent = (4 + data.deviation / 8).toFixed(2);
|
|
104
|
+
rateBadge.className = data.deviation < 0.5 ? 'alti-rate-badge neutral' : 'alti-rate-badge';
|
|
105
|
+
|
|
106
|
+
updateParticles(altitude);
|
|
107
|
+
drawChart(altitude);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function handleMove(clientY: number) {
|
|
111
|
+
const rect = column.getBoundingClientRect();
|
|
112
|
+
const y = Math.max(0, Math.min(COL_HEIGHT, ((clientY - rect.top) / rect.height) * COL_HEIGHT));
|
|
113
|
+
updateDisplay(getAltFromY(y));
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
let isDragging = false;
|
|
117
|
+
|
|
118
|
+
thumb.addEventListener('mousedown', (e: MouseEvent) => {
|
|
119
|
+
isDragging = true;
|
|
120
|
+
thumb.style.cursor = 'grabbing';
|
|
121
|
+
e.preventDefault();
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
document.addEventListener('mousemove', (e: MouseEvent) => {
|
|
125
|
+
if (!isDragging) return;
|
|
126
|
+
handleMove(e.clientY);
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
document.addEventListener('mouseup', () => {
|
|
130
|
+
if (isDragging) {
|
|
131
|
+
isDragging = false;
|
|
132
|
+
thumb.style.cursor = 'grab';
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
column.addEventListener('click', (e: MouseEvent) => {
|
|
137
|
+
if (e.target === thumb) return;
|
|
138
|
+
handleMove(e.clientY);
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
thumb.addEventListener('touchstart', (e: TouchEvent) => {
|
|
142
|
+
isDragging = true;
|
|
143
|
+
e.preventDefault();
|
|
144
|
+
}, { passive: false });
|
|
145
|
+
|
|
146
|
+
document.addEventListener('touchmove', (e: TouchEvent) => {
|
|
147
|
+
if (!isDragging) return;
|
|
148
|
+
handleMove(e.touches[0].clientY);
|
|
149
|
+
}, { passive: false });
|
|
150
|
+
|
|
151
|
+
document.addEventListener('touchend', () => {
|
|
152
|
+
isDragging = false;
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
let balancePhase = 0;
|
|
156
|
+
const balanceRotor = document.getElementById('balance-wheel-rotor')!;
|
|
157
|
+
|
|
158
|
+
function animateBalance() {
|
|
159
|
+
const data = getAtmosphericData(currentAltitude);
|
|
160
|
+
balancePhase += 0.02 + (data.deviation / 15) * 0.01;
|
|
161
|
+
const angle = Math.sin(balancePhase) * 15;
|
|
162
|
+
balanceRotor.style.transform = 'rotate(' + angle.toFixed(2) + 'deg)';
|
|
163
|
+
requestAnimationFrame(animateBalance);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
requestAnimationFrame(animateBalance);
|
|
167
|
+
updateDisplay(0);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
import AltitudeScene from './components/AltitudeScene.astro';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
ui: Record<string, string>;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
const { ui } = Astro.props;
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
<div class="tool-main-card" data-ui={JSON.stringify(ui)}>
|
|
12
|
+
<AltitudeScene labels={ui} />
|
|
13
|
+
</div>
|
|
14
|
+
|
|
15
|
+
<script src="./client.ts"></script>
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
---
|
|
2
|
+
interface Props {
|
|
3
|
+
labels: Record<string, string>;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
const { labels } = Astro.props;
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
<link href="./altitude-watch-accuracy-estimator.css" rel="stylesheet" />
|
|
10
|
+
|
|
11
|
+
<div class="alti-layout">
|
|
12
|
+
<div class="alti-column" id="alti-column">
|
|
13
|
+
<svg class="alti-mountain-svg" viewBox="0 0 140 420" preserveAspectRatio="none">
|
|
14
|
+
<defs>
|
|
15
|
+
<linearGradient id="mountain-bg" x1="0" y1="0" x2="0" y2="1">
|
|
16
|
+
<stop offset="0%" stop-color="#4338ca"/>
|
|
17
|
+
<stop offset="20%" stop-color="#6366f1"/>
|
|
18
|
+
<stop offset="40%" stop-color="#22c55e"/>
|
|
19
|
+
<stop offset="60%" stop-color="#65a30d"/>
|
|
20
|
+
<stop offset="80%" stop-color="#854d0e"/>
|
|
21
|
+
<stop offset="100%" stop-color="#1e3a5f"/>
|
|
22
|
+
</linearGradient>
|
|
23
|
+
<linearGradient id="mountain-fill" x1="0" y1="0" x2="0" y2="1">
|
|
24
|
+
<stop offset="0%" stop-color="rgba(255,255,255,0.08)"/>
|
|
25
|
+
<stop offset="50%" stop-color="rgba(255,255,255,0.04)"/>
|
|
26
|
+
<stop offset="100%" stop-color="rgba(255,255,255,0)"/>
|
|
27
|
+
</linearGradient>
|
|
28
|
+
<clipPath id="mountain-clip">
|
|
29
|
+
<path d="M0 420 L20 340 L35 310 L50 270 L60 230 L70 180 L75 140 L80 100 L85 60 L90 20 L95 0 L100 20 L105 60 L110 100 L115 140 L120 180 L130 230 L140 270 L140 420 Z"/>
|
|
30
|
+
</clipPath>
|
|
31
|
+
</defs>
|
|
32
|
+
<rect x="0" y="0" width="140" height="420" fill="url(#mountain-bg)" opacity="0.15"/>
|
|
33
|
+
<path d="M0 420 L20 340 L35 310 L50 270 L60 230 L70 180 L75 140 L80 100 L85 60 L90 20 L95 0 L100 20 L105 60 L110 100 L115 140 L120 180 L130 230 L140 270 L140 420 Z" fill="url(#mountain-fill)" stroke="var(--accent)" stroke-width="1.5" opacity="0.3"/>
|
|
34
|
+
<g opacity="0.15">
|
|
35
|
+
<line x1="0" y1="420" x2="140" y2="420" stroke="var(--text-base)" stroke-width="0.5"/>
|
|
36
|
+
<line x1="0" y1="315" x2="140" y2="315" stroke="var(--text-base)" stroke-width="0.5"/>
|
|
37
|
+
<line x1="0" y1="210" x2="140" y2="210" stroke="var(--text-base)" stroke-width="0.5"/>
|
|
38
|
+
<line x1="0" y1="105" x2="140" y2="105" stroke="var(--text-base)" stroke-width="0.5"/>
|
|
39
|
+
<line x1="0" y1="0" x2="140" y2="0" stroke="var(--text-base)" stroke-width="0.5"/>
|
|
40
|
+
</g>
|
|
41
|
+
<g class="alti-elevation-labels" id="alti-elevation-labels" font-size="7" fill="var(--text-base)" opacity="0.35" font-weight="600">
|
|
42
|
+
<text x="4" y="423">0</text>
|
|
43
|
+
<text x="4" y="318">2000</text>
|
|
44
|
+
<text x="4" y="213">4000</text>
|
|
45
|
+
<text x="4" y="108">6000</text>
|
|
46
|
+
<text x="4" y="13">8000</text>
|
|
47
|
+
</g>
|
|
48
|
+
</svg>
|
|
49
|
+
<div class="alti-particles" id="alti-particles"></div>
|
|
50
|
+
<div class="alti-thumb" id="alti-thumb"></div>
|
|
51
|
+
<div class="alti-current-label" id="alti-current-label">0 m</div>
|
|
52
|
+
</div>
|
|
53
|
+
|
|
54
|
+
<div class="alti-main">
|
|
55
|
+
<div class="alti-top-row">
|
|
56
|
+
<div class="alti-balance-panel">
|
|
57
|
+
<span class="alti-balance-title">{labels.oscillationLabel || 'Balance Wheel'}</span>
|
|
58
|
+
<div class="alti-balance-svg-wrap">
|
|
59
|
+
<svg viewBox="0 0 140 140" xmlns="http://www.w3.org/2000/svg">
|
|
60
|
+
<g id="balance-wheel-rotor" style="transform-origin:70px 70px">
|
|
61
|
+
<circle class="balance-rim" cx="70" cy="70" r="65"/>
|
|
62
|
+
<circle class="balance-outer" cx="70" cy="70" r="60"/>
|
|
63
|
+
<circle class="balance-rim" cx="70" cy="70" r="20"/>
|
|
64
|
+
<line class="balance-spoke" x1="70" y1="70" x2="70" y2="10"/>
|
|
65
|
+
<line class="balance-spoke" x1="70" y1="70" x2="127" y2="48"/>
|
|
66
|
+
<line class="balance-spoke" x1="70" y1="70" x2="113" y2="125"/>
|
|
67
|
+
<line class="balance-spoke" x1="70" y1="70" x2="27" y2="125"/>
|
|
68
|
+
<line class="balance-spoke" x1="70" y1="70" x2="13" y2="48"/>
|
|
69
|
+
<circle class="balance-hub" cx="70" cy="70" r="8"/>
|
|
70
|
+
<circle class="balance-staff" cx="70" cy="70" r="3"/>
|
|
71
|
+
<circle class="balance-staff" cx="70" cy="70" r="14" fill="none" stroke="var(--accent)" stroke-width="0.5" opacity="0.15"/>
|
|
72
|
+
</g>
|
|
73
|
+
<path class="balance-hairspring" d="M70 70 C70 60, 80 55, 85 65 C90 75, 75 80, 70 75 C65 70, 72 62, 78 65 C84 68, 78 73, 74 72" stroke="var(--accent)" fill="none" opacity="0.2"/>
|
|
74
|
+
</svg>
|
|
75
|
+
</div>
|
|
76
|
+
<div class="alti-rate-badge neutral" id="alti-rate-badge">
|
|
77
|
+
<span id="alti-rate-value">4.0</span>
|
|
78
|
+
<span class="unit">{labels.oscillationsPerSec || 'osc/s'}</span>
|
|
79
|
+
</div>
|
|
80
|
+
</div>
|
|
81
|
+
|
|
82
|
+
<div class="alti-deviation-panel">
|
|
83
|
+
<span class="alti-deviation-title">{labels.deviationLabel || 'Rate Deviation'}</span>
|
|
84
|
+
<div class="alti-deviation-gauge">
|
|
85
|
+
<div class="alti-deviation-value" id="alti-deviation-value">0.0</div>
|
|
86
|
+
<span class="alti-deviation-unit">{labels.secondsPerDay || 's/d'}</span>
|
|
87
|
+
<div class="alti-deviation-bar">
|
|
88
|
+
<div class="alti-deviation-fill" id="alti-deviation-fill" style="width:0%"></div>
|
|
89
|
+
</div>
|
|
90
|
+
<div class="alti-deviation-desc negligible" id="alti-deviation-desc">{labels.negligible || 'Negligible'}</div>
|
|
91
|
+
</div>
|
|
92
|
+
</div>
|
|
93
|
+
</div>
|
|
94
|
+
|
|
95
|
+
<div class="alti-atm-row">
|
|
96
|
+
<div class="alti-atm-card">
|
|
97
|
+
<span class="alti-atm-label">{labels.pressureLabel || 'Pressure'}</span>
|
|
98
|
+
<span class="alti-atm-value" id="atm-pressure">1013.3</span>
|
|
99
|
+
<span class="alti-atm-unit">{labels.pressureUnit || 'hPa'}</span>
|
|
100
|
+
</div>
|
|
101
|
+
<div class="alti-atm-card">
|
|
102
|
+
<span class="alti-atm-label">{labels.densityLabel || 'Air Density'}</span>
|
|
103
|
+
<span class="alti-atm-value" id="atm-density">1.225</span>
|
|
104
|
+
<span class="alti-atm-unit">{labels.densityUnit || 'kg/m³'}</span>
|
|
105
|
+
</div>
|
|
106
|
+
<div class="alti-atm-card">
|
|
107
|
+
<span class="alti-atm-label">{labels.temperatureLabel || 'Temperature'}</span>
|
|
108
|
+
<span class="alti-atm-value" id="atm-temp">15.0</span>
|
|
109
|
+
<span class="alti-atm-unit">{labels.temperatureUnit || '°C'}</span>
|
|
110
|
+
</div>
|
|
111
|
+
</div>
|
|
112
|
+
|
|
113
|
+
<div class="alti-chart-section">
|
|
114
|
+
<div class="alti-chart-title">{labels.deviationChart || 'Deviation vs Altitude'}</div>
|
|
115
|
+
<svg class="alti-chart-svg" viewBox="0 0 800 80" preserveAspectRatio="none" id="deviation-chart">
|
|
116
|
+
<defs>
|
|
117
|
+
<linearGradient id="chart-grad" x1="0" y1="0" x2="0" y2="1">
|
|
118
|
+
<stop offset="0%" stop-color="var(--accent)" stop-opacity="0.25"/>
|
|
119
|
+
<stop offset="100%" stop-color="var(--accent)" stop-opacity="0.02"/>
|
|
120
|
+
</linearGradient>
|
|
121
|
+
</defs>
|
|
122
|
+
<rect x="0" y="0" width="800" height="80" fill="transparent"/>
|
|
123
|
+
</svg>
|
|
124
|
+
<div class="alti-chart-labels">
|
|
125
|
+
<span>0</span>
|
|
126
|
+
<span>2000</span>
|
|
127
|
+
<span>4000</span>
|
|
128
|
+
<span>6000</span>
|
|
129
|
+
<span>8000 m</span>
|
|
130
|
+
</div>
|
|
131
|
+
</div>
|
|
132
|
+
|
|
133
|
+
<div class="alti-info-bar">
|
|
134
|
+
<svg class="alti-info-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="12" y1="16" x2="12" y2="12"/><line x1="12" y1="8" x2="12.01" y2="8"/></svg>
|
|
135
|
+
<span class="alti-info-text"><strong>{labels.howItWorks || 'How It Works'}:</strong> {labels.howItWorksDesc || 'Lower air density at high altitude reduces drag on the balance wheel, increasing amplitude and causing the watch to run faster.'}</span>
|
|
136
|
+
</div>
|
|
137
|
+
</div>
|
|
138
|
+
</div>
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { ChronoToolEntry, ToolLocaleContent } from '../../types';
|
|
2
|
+
|
|
3
|
+
export type AltitudeWatchAccuracyEstimatorUI = {
|
|
4
|
+
title: string;
|
|
5
|
+
altitudeLabel: string;
|
|
6
|
+
altitudeUnit: string;
|
|
7
|
+
seaLevel: string;
|
|
8
|
+
deviationLabel: string;
|
|
9
|
+
deviationUnit: string;
|
|
10
|
+
pressureLabel: string;
|
|
11
|
+
pressureUnit: string;
|
|
12
|
+
densityLabel: string;
|
|
13
|
+
densityUnit: string;
|
|
14
|
+
temperatureLabel: string;
|
|
15
|
+
temperatureUnit: string;
|
|
16
|
+
oscillationLabel: string;
|
|
17
|
+
oscillationsPerSec: string;
|
|
18
|
+
rateLabel: string;
|
|
19
|
+
atmDataTitle: string;
|
|
20
|
+
howItWorks: string;
|
|
21
|
+
howItWorksDesc: string;
|
|
22
|
+
negligible: string;
|
|
23
|
+
minor: string;
|
|
24
|
+
noticeable: string;
|
|
25
|
+
significant: string;
|
|
26
|
+
severe: string;
|
|
27
|
+
step1: string;
|
|
28
|
+
step2: string;
|
|
29
|
+
step3: string;
|
|
30
|
+
tipTitle: string;
|
|
31
|
+
tipContent: string;
|
|
32
|
+
deviationChart: string;
|
|
33
|
+
altitudeM: string;
|
|
34
|
+
secondsPerDay: string;
|
|
35
|
+
particleLabel: string;
|
|
36
|
+
airDensity: string;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export type AltitudeWatchAccuracyEstimatorLocaleContent = ToolLocaleContent<AltitudeWatchAccuracyEstimatorUI>;
|
|
40
|
+
|
|
41
|
+
export const altitudeWatchAccuracyEstimator: ChronoToolEntry<AltitudeWatchAccuracyEstimatorUI> = {
|
|
42
|
+
id: 'altitude-watch-accuracy-estimator',
|
|
43
|
+
icons: { bg: 'mdi:terrain', fg: 'mdi:axis-arrow' },
|
|
44
|
+
i18n: {
|
|
45
|
+
de: () => import('./i18n/de').then((m) => m.content),
|
|
46
|
+
en: () => import('./i18n/en').then((m) => m.content),
|
|
47
|
+
es: () => import('./i18n/es').then((m) => m.content),
|
|
48
|
+
fr: () => import('./i18n/fr').then((m) => m.content),
|
|
49
|
+
id: () => import('./i18n/id').then((m) => m.content),
|
|
50
|
+
it: () => import('./i18n/it').then((m) => m.content),
|
|
51
|
+
ja: () => import('./i18n/ja').then((m) => m.content),
|
|
52
|
+
ko: () => import('./i18n/ko').then((m) => m.content),
|
|
53
|
+
nl: () => import('./i18n/nl').then((m) => m.content),
|
|
54
|
+
pl: () => import('./i18n/pl').then((m) => m.content),
|
|
55
|
+
pt: () => import('./i18n/pt').then((m) => m.content),
|
|
56
|
+
ru: () => import('./i18n/ru').then((m) => m.content),
|
|
57
|
+
sv: () => import('./i18n/sv').then((m) => m.content),
|
|
58
|
+
tr: () => import('./i18n/tr').then((m) => m.content),
|
|
59
|
+
zh: () => import('./i18n/zh').then((m) => m.content),
|
|
60
|
+
},
|
|
61
|
+
};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { WithContext, Thing } from 'schema-dts';
|
|
2
|
+
import type { FAQItem, HowToStep } from '../../types';
|
|
3
|
+
|
|
4
|
+
function buildFAQ(faq: FAQItem[]): WithContext<Thing> {
|
|
5
|
+
return {
|
|
6
|
+
'@context': 'https://schema.org',
|
|
7
|
+
'@type': 'FAQPage',
|
|
8
|
+
'mainEntity': faq.map((f) => ({
|
|
9
|
+
'@type': 'Question',
|
|
10
|
+
'name': f.question,
|
|
11
|
+
'acceptedAnswer': {
|
|
12
|
+
'@type': 'Answer',
|
|
13
|
+
'text': f.answer,
|
|
14
|
+
},
|
|
15
|
+
})),
|
|
16
|
+
} as unknown as WithContext<Thing>;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function buildApp(title: string): WithContext<Thing> {
|
|
20
|
+
return {
|
|
21
|
+
'@context': 'https://schema.org',
|
|
22
|
+
'@type': 'SoftwareApplication',
|
|
23
|
+
'name': title,
|
|
24
|
+
'operatingSystem': 'All',
|
|
25
|
+
'applicationCategory': 'UtilitiesApplication',
|
|
26
|
+
'browserRequirements': 'Requires HTML5. Requires JavaScript.',
|
|
27
|
+
} as unknown as WithContext<Thing>;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function buildHowTo(title: string, howTo: HowToStep[]): WithContext<Thing> {
|
|
31
|
+
return {
|
|
32
|
+
'@context': 'https://schema.org',
|
|
33
|
+
'@type': 'HowTo',
|
|
34
|
+
'name': title,
|
|
35
|
+
'step': howTo.map((h) => ({
|
|
36
|
+
'@type': 'HowToStep',
|
|
37
|
+
'name': h.name,
|
|
38
|
+
'text': h.text,
|
|
39
|
+
})),
|
|
40
|
+
} as unknown as WithContext<Thing>;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function buildSchemas(
|
|
44
|
+
title: string,
|
|
45
|
+
faq: FAQItem[],
|
|
46
|
+
howTo: HowToStep[]
|
|
47
|
+
): WithContext<Thing>[] {
|
|
48
|
+
return [buildFAQ(faq), buildApp(title), buildHowTo(title, howTo)];
|
|
49
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import type { AltitudeWatchAccuracyEstimatorUI } from '../entry';
|
|
3
|
+
import { bibliography } from '../bibliography';
|
|
4
|
+
import { buildSchemas } from '../helpers';
|
|
5
|
+
|
|
6
|
+
const faq = [
|
|
7
|
+
{
|
|
8
|
+
question: 'Warum laufen mechanische Uhren in großer Höhe schneller?',
|
|
9
|
+
answer: 'Mechanische Uhren laufen in großen Höhen hauptsächlich aufgrund der geringeren Luftdichte schneller. Dünnere Luft erzeugt weniger Luftwiderstand auf die Unruh, sodass sie mit etwas größerer Amplitude schwingen kann. Diese erhöhte Amplitude führt dazu, dass die Uhr vorgeht - typischerweise 2-6 Sekunden pro Tag pro 1.000 m Höhengewinn, abhängig vom Werkdesign.',
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
question: 'Beeinflusst die Höhe auch Quarzuhren?',
|
|
13
|
+
answer: 'Quarzuhren werden minimal durch Höhe beeinflusst, da sie keine oszillierende mechanische Unruh haben. Extreme Höhenänderungen können jedoch die Batterieleistung aufgrund von Temperaturschwankungen beeinträchtigen. Der Effekt ist im Vergleich zu mechanischen Uhren vernachlässigbar.',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
question: 'Können Höhenänderungen meine Uhr beschädigen?',
|
|
17
|
+
answer: 'Höhenänderungen allein beschädigen mechanische Uhren selten. Schnelle Druckentlastung (wie in einem Flugzeug) kann jedoch bei einigen Uhren Probleme mit der Wasserdichtigkeit verursachen. Normale Höhenänderungen auf Reisen liegen innerhalb der Konstruktionstoleranz jeder Uhr.',
|
|
18
|
+
},
|
|
19
|
+
];
|
|
20
|
+
|
|
21
|
+
const howTo = [
|
|
22
|
+
{
|
|
23
|
+
name: 'Wählen Sie eine Höhe',
|
|
24
|
+
text: 'Ziehen Sie den Höhenregler nach oben oder unten, um verschiedene Höhenlagen vom Meeresspiegel bis 8.000 m zu simulieren. Beobachten Sie, wie sich Unruhoszillation und Atmosphärendaten in Echtzeit ändern.',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: 'Lesen Sie die Abweichung ab',
|
|
28
|
+
text: 'Die Gangabweichungsanzeige zeigt die geschätzten Sekunden pro Tag in der gewählten Höhe. Das Abweichungsdiagramm zeigt den Trend über alle Höhen.',
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: 'Berücksichtigen Sie die Faktoren',
|
|
32
|
+
text: 'Beobachten Sie, wie die Luftdichte mit der Höhe abnimmt, während die Gangabweichung zunimmt. Temperatur- und Druckdaten liefern Kontext für die Umweltveränderungen.',
|
|
33
|
+
},
|
|
34
|
+
];
|
|
35
|
+
|
|
36
|
+
const title = 'Höhengenauigkeitsschätzer: Wie Höhenlage Ihre Mechanische Uhr Beeinflusst';
|
|
37
|
+
|
|
38
|
+
export const content: ToolLocaleContent<AltitudeWatchAccuracyEstimatorUI> = {
|
|
39
|
+
slug: 'hoehengenauigkeitsschaetzer',
|
|
40
|
+
title,
|
|
41
|
+
description: 'Erkunden Sie, wie Höhenlage die Genauigkeit mechanischer Uhren beeinflusst. Passen Sie die Höhe vom Meeresspiegel bis zum Gipfel an und sehen Sie Echtzeitänderungen bei Unruhoszillation, Gangabweichung, Luftdichte, Druck und Temperatur.',
|
|
42
|
+
ui: {
|
|
43
|
+
title: 'Höhengenauigkeitsschätzer',
|
|
44
|
+
altitudeLabel: 'Höhe',
|
|
45
|
+
altitudeUnit: 'm',
|
|
46
|
+
seaLevel: 'Meeresspiegel',
|
|
47
|
+
deviationLabel: 'Gangabweichung',
|
|
48
|
+
deviationUnit: 's/d',
|
|
49
|
+
pressureLabel: 'Druck',
|
|
50
|
+
pressureUnit: 'hPa',
|
|
51
|
+
densityLabel: 'Luftdichte',
|
|
52
|
+
densityUnit: 'kg/m³',
|
|
53
|
+
temperatureLabel: 'Temperatur',
|
|
54
|
+
temperatureUnit: '°C',
|
|
55
|
+
oscillationLabel: 'Unruh',
|
|
56
|
+
oscillationsPerSec: 'U/s',
|
|
57
|
+
rateLabel: 'Gang',
|
|
58
|
+
atmDataTitle: 'Atmosphärische Bedingungen',
|
|
59
|
+
howItWorks: 'Funktionsweise',
|
|
60
|
+
howItWorksDesc: 'Geringere Luftdichte in großer Höhe reduziert den Luftwiderstand auf die Unruh, erhöht die Amplitude und lässt die Uhr schneller laufen. Dieses Tool schätzt die Gangabweichung basierend auf Standardatmosphärenmodellen.',
|
|
61
|
+
negligible: 'Vernachlässigbar',
|
|
62
|
+
minor: 'Gering',
|
|
63
|
+
noticeable: 'Spürbar',
|
|
64
|
+
significant: 'Deutlich',
|
|
65
|
+
severe: 'Stark',
|
|
66
|
+
step1: 'Ziehen Sie den Höhenregler, um Höhen vom Meeresspiegel bis 8.000 m zu simulieren.',
|
|
67
|
+
step2: 'Beobachten Sie die Unruh-Animation und die Abweichungsanzeige in Echtzeit.',
|
|
68
|
+
step3: 'Prüfen Sie die Atmosphärendaten, um die Umweltfaktoren zu verstehen.',
|
|
69
|
+
tipTitle: 'Tipp',
|
|
70
|
+
tipContent: 'Der Effekt variiert je nach Werk: Hochfrequenzwerke (36.000 VPH) sind weniger betroffen als Vintage-Niederfrequenzwerke (18.000 VPH).',
|
|
71
|
+
deviationChart: 'Abweichung vs. Höhe',
|
|
72
|
+
altitudeM: 'Höhe (m)',
|
|
73
|
+
secondsPerDay: 's/d',
|
|
74
|
+
particleLabel: 'Luftmoleküle',
|
|
75
|
+
airDensity: 'Luftdichte',
|
|
76
|
+
},
|
|
77
|
+
seo: [
|
|
78
|
+
{ type: 'title', text: 'Interaktiver Höhengenauigkeitsschätzer für Mechanische Uhren', level: 2 },
|
|
79
|
+
{ type: 'paragraph', html: 'Der <strong>Höhengenauigkeitsschätzer</strong> ist ein interaktives Tool, das visualisiert, wie Höhenänderungen die Präzision mechanischer Uhren beeinflussen. Durch Simulation von Höhen vom Meeresspiegel bis 8.000 m sehen Sie die geschätzte Gangabweichung durch sich ändernde Luftdichte, Druck und Temperatur.' },
|
|
80
|
+
{ type: 'title', text: 'Wie Höhe die Uhrengenauigkeit Beeinflusst', level: 3 },
|
|
81
|
+
{ type: 'paragraph', html: 'In größeren Höhen <strong>nimmt die Luftdichte ab</strong>, was den Luftwiderstand auf die Unruh reduziert. Dadurch kann die Unruh mit größerer Amplitude schwingen, was die Uhr etwas schneller laufen lässt. Der Effekt liegt typischerweise bei <strong>+2 bis +6 Sekunden pro Tag</strong> pro 1.000 m Höhengewinn.' },
|
|
82
|
+
{ type: 'title', text: 'Gangabweichung bei Verschiedenen Höhen', level: 3 },
|
|
83
|
+
{
|
|
84
|
+
type: 'table', headers: ['Höhe', 'Luftdichte', 'Druck', 'Temperatur', 'Gesch. Abweichung'], rows: [
|
|
85
|
+
['Meeresspiegel (0m)', '1,225 kg/m³', '1013 hPa', '15°C', 'Basis'],
|
|
86
|
+
['1.000m', '1,112 kg/m³', '898 hPa', '8,5°C', '+0,4 s/d'],
|
|
87
|
+
['2.000m', '1,007 kg/m³', '795 hPa', '2°C', '+0,9 s/d'],
|
|
88
|
+
['3.000m', '0,909 kg/m³', '701 hPa', '-4,5°C', '+1,5 s/d'],
|
|
89
|
+
['4.000m', '0,819 kg/m³', '616 hPa', '-11°C', '+2,1 s/d'],
|
|
90
|
+
['5.000m', '0,736 kg/m³', '540 hPa', '-17,5°C', '+2,8 s/d'],
|
|
91
|
+
]
|
|
92
|
+
},
|
|
93
|
+
{ type: 'title', text: 'Umweltfaktoren', level: 3 },
|
|
94
|
+
{ type: 'paragraph', html: 'Neben der Luftdichte können andere Umweltfaktoren in großer Höhe die Uhrenleistung beeinflussen: <strong>Temperatur</strong> beeinflusst die Schmierfettviskosität und die Federelastizität, <strong>Druckänderungen</strong> können die Gehäusedichtung beeinträchtigen. Der Effekt der Luftdichte auf den Unruhwiderstand ist jedoch der dominierende Faktor.' },
|
|
95
|
+
{ type: 'diagnostic', variant: 'info', title: 'Interaktives Simulationstool', icon: 'mdi:axis-arrow', badge: 'UHRENKUNDE', html: 'Dieses Tool bietet Schätzwerte basierend auf dem ISA-Modell und empirischen Beobachtungen. Tatsächliche Ergebnisse variieren je nach Werkkaliber, Zustand und Fertigungstoleranzen.' },
|
|
96
|
+
],
|
|
97
|
+
faq,
|
|
98
|
+
bibliography,
|
|
99
|
+
howTo,
|
|
100
|
+
schemas: buildSchemas(title, faq, howTo),
|
|
101
|
+
};
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import type { AltitudeWatchAccuracyEstimatorUI } from '../entry';
|
|
3
|
+
import { bibliography } from '../bibliography';
|
|
4
|
+
import { buildSchemas } from '../helpers';
|
|
5
|
+
|
|
6
|
+
const faq = [
|
|
7
|
+
{
|
|
8
|
+
question: 'Why do mechanical watches run faster at high altitude?',
|
|
9
|
+
answer: 'Mechanical watches run faster at high altitude primarily because of reduced air density. Thinner air creates less aerodynamic drag on the balance wheel, allowing it to oscillate with slightly greater amplitude. This increased amplitude causes the watch to gain time - typically 2-6 seconds per day per 1000m of elevation gain, depending on the movement design.',
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
question: 'Does altitude affect quartz watches too?',
|
|
13
|
+
answer: 'Quartz watches are minimally affected by altitude since they have no oscillating mechanical balance wheel. However, extreme altitude changes can affect battery performance due to temperature variations, and some quartz movements use mechanical components that could be influenced, but the effect is negligible compared to mechanical watches.',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
question: 'Can altitude changes damage my watch?',
|
|
17
|
+
answer: 'Altitude changes alone rarely damage mechanical watches. However, rapid decompression (like in an aircraft) can cause issues with water resistance in some watches. For saturation divers\' watches with helium escape valves, extreme pressure changes require proper valve operation. Normal altitude variations during travel are well within any watch\'s design tolerance.',
|
|
18
|
+
},
|
|
19
|
+
];
|
|
20
|
+
|
|
21
|
+
const howTo = [
|
|
22
|
+
{
|
|
23
|
+
name: 'Select an altitude',
|
|
24
|
+
text: 'Drag the altitude slider up or down to simulate different elevations, from sea level to 8,000m. Watch how the balance wheel oscillation and atmospheric data change in real time.',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: 'Read the deviation',
|
|
28
|
+
text: 'The rate deviation display shows estimated seconds gained per day at the selected altitude. The deviation chart below shows the trend across all altitudes.',
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: 'Consider the factors',
|
|
32
|
+
text: 'Observe how air density decreases with altitude while the rate deviation increases. Temperature and pressure data provide context for the environmental changes affecting your watch.',
|
|
33
|
+
},
|
|
34
|
+
];
|
|
35
|
+
|
|
36
|
+
const title = 'Altitude Watch Accuracy Estimator: How Elevation Affects Your Mechanical Watch';
|
|
37
|
+
|
|
38
|
+
export const content: ToolLocaleContent<AltitudeWatchAccuracyEstimatorUI> = {
|
|
39
|
+
slug: 'altitude-watch-accuracy-estimator',
|
|
40
|
+
title,
|
|
41
|
+
description: 'Explore how altitude affects mechanical watch accuracy. Adjust elevation from sea level to mountain peak and see real-time changes in balance wheel oscillation, rate deviation, air density, pressure, and temperature.',
|
|
42
|
+
ui: {
|
|
43
|
+
title: 'Altitude Watch Accuracy Estimator',
|
|
44
|
+
altitudeLabel: 'Altitude',
|
|
45
|
+
altitudeUnit: 'm',
|
|
46
|
+
seaLevel: 'Sea Level',
|
|
47
|
+
deviationLabel: 'Rate Deviation',
|
|
48
|
+
deviationUnit: 's/d',
|
|
49
|
+
pressureLabel: 'Pressure',
|
|
50
|
+
pressureUnit: 'hPa',
|
|
51
|
+
densityLabel: 'Air Density',
|
|
52
|
+
densityUnit: 'kg/m³',
|
|
53
|
+
temperatureLabel: 'Temperature',
|
|
54
|
+
temperatureUnit: '°C',
|
|
55
|
+
oscillationLabel: 'Balance Wheel',
|
|
56
|
+
oscillationsPerSec: 'osc/s',
|
|
57
|
+
rateLabel: 'Rate',
|
|
58
|
+
atmDataTitle: 'Atmospheric Conditions',
|
|
59
|
+
howItWorks: 'How It Works',
|
|
60
|
+
howItWorksDesc: 'Lower air density at high altitude reduces drag on the balance wheel, increasing amplitude and causing the watch to run faster. This tool estimates the rate deviation based on standard atmospheric models.',
|
|
61
|
+
negligible: 'Negligible',
|
|
62
|
+
minor: 'Minor',
|
|
63
|
+
noticeable: 'Noticeable',
|
|
64
|
+
significant: 'Significant',
|
|
65
|
+
severe: 'Severe',
|
|
66
|
+
step1: 'Drag the altitude slider to simulate elevations from sea level to 8,000m.',
|
|
67
|
+
step2: 'Watch the balance wheel animation and deviation gauge respond in real time.',
|
|
68
|
+
step3: 'Review the atmospheric data to understand the environmental factors at play.',
|
|
69
|
+
tipTitle: 'Tip',
|
|
70
|
+
tipContent: 'The effect varies by movement: high-beat movements (36,000 vph) are generally less affected by altitude than vintage low-beat movements (18,000 vph).',
|
|
71
|
+
deviationChart: 'Deviation vs Altitude',
|
|
72
|
+
altitudeM: 'Altitude (m)',
|
|
73
|
+
secondsPerDay: 's/d',
|
|
74
|
+
particleLabel: 'Air Molecules',
|
|
75
|
+
airDensity: 'Air Density',
|
|
76
|
+
},
|
|
77
|
+
seo: [
|
|
78
|
+
{ type: 'title', text: 'Interactive Altitude Watch Accuracy Estimator for Mechanical Watches', level: 2 },
|
|
79
|
+
{ type: 'paragraph', html: 'The <strong>Altitude Watch Accuracy Estimator</strong> is an interactive tool that visualizes how elevation changes affect mechanical watch precision. By simulating altitudes from sea level to 8,000 meters, you can see the estimated rate deviation caused by changing air density, pressure, and temperature.' },
|
|
80
|
+
{ type: 'title', text: 'How Altitude Affects Watch Accuracy', level: 3 },
|
|
81
|
+
{ type: 'paragraph', html: 'At higher altitudes, <strong>air density decreases</strong>, which reduces aerodynamic drag on the balance wheel. This allows the balance wheel to oscillate with greater amplitude, causing the watch to run slightly faster. The effect is typically in the range of <strong>+2 to +6 seconds per day</strong> for every 1,000 meters of elevation gain, though this varies by movement design, lubrication, and manufacturing tolerances.' },
|
|
82
|
+
{ type: 'title', text: 'Rate Deviation at Different Altitudes', level: 3 },
|
|
83
|
+
{
|
|
84
|
+
type: 'table', headers: ['Altitude', 'Air Density', 'Pressure', 'Temperature', 'Est. Deviation'], rows: [
|
|
85
|
+
['Sea Level (0m)', '1.225 kg/m³', '1013 hPa', '15°C', 'Baseline'],
|
|
86
|
+
['1,000m', '1.112 kg/m³', '898 hPa', '8.5°C', '+0.4 s/d'],
|
|
87
|
+
['2,000m', '1.007 kg/m³', '795 hPa', '2°C', '+0.9 s/d'],
|
|
88
|
+
['3,000m', '0.909 kg/m³', '701 hPa', '-4.5°C', '+1.5 s/d'],
|
|
89
|
+
['4,000m', '0.819 kg/m³', '616 hPa', '-11°C', '+2.1 s/d'],
|
|
90
|
+
['5,000m', '0.736 kg/m³', '540 hPa', '-17.5°C', '+2.8 s/d'],
|
|
91
|
+
]
|
|
92
|
+
},
|
|
93
|
+
{ type: 'title', text: 'Environmental Factors', level: 3 },
|
|
94
|
+
{ type: 'paragraph', html: 'Beyond air density, other environmental factors at high altitude can affect watch performance: <strong>temperature</strong> affects lubricant viscosity and mainspring elasticity, <strong>pressure changes</strong> can affect case sealing, and <strong>humidity</strong> at different altitudes may affect internal components. However, air density\'s effect on balance wheel drag is the dominant factor in altitude-related rate changes.' },
|
|
95
|
+
{ type: 'diagnostic', variant: 'info', title: 'Interactive Simulation Tool', icon: 'mdi:axis-arrow', badge: 'HOROLOGY', html: 'This tool provides estimated values based on the International Standard Atmosphere (ISA) model and empirical observations of balance wheel behavior. Actual results vary by movement caliber, condition, and individual manufacturing tolerances.' },
|
|
96
|
+
],
|
|
97
|
+
faq,
|
|
98
|
+
bibliography,
|
|
99
|
+
howTo,
|
|
100
|
+
schemas: buildSchemas(title, faq, howTo),
|
|
101
|
+
};
|