@jjlmoya/utils-chrono 1.2.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 +65 -0
- package/scripts/postinstall.mjs +27 -0
- package/src/category/ChronoCategorySEO.astro +8 -0
- package/src/category/i18n/de.ts +23 -0
- package/src/category/i18n/en.ts +23 -0
- package/src/category/i18n/es.ts +23 -0
- package/src/category/i18n/fr.ts +23 -0
- package/src/category/i18n/id.ts +23 -0
- package/src/category/i18n/it.ts +23 -0
- package/src/category/i18n/ja.ts +23 -0
- package/src/category/i18n/ko.ts +23 -0
- package/src/category/i18n/nl.ts +23 -0
- package/src/category/i18n/pl.ts +23 -0
- package/src/category/i18n/pt.ts +23 -0
- package/src/category/i18n/ru.ts +23 -0
- package/src/category/i18n/sv.ts +23 -0
- package/src/category/i18n/tr.ts +23 -0
- package/src/category/i18n/zh.ts +23 -0
- package/src/category/index.ts +42 -0
- package/src/components/PreviewNavSidebar.astro +116 -0
- package/src/components/PreviewToolbar.astro +143 -0
- package/src/data.ts +11 -0
- package/src/entries.ts +32 -0
- package/src/env.d.ts +5 -0
- package/src/index.ts +28 -0
- package/src/layouts/PreviewLayout.astro +117 -0
- package/src/pages/[locale]/[slug].astro +161 -0
- package/src/pages/[locale].astro +251 -0
- package/src/pages/index.astro +4 -0
- package/src/tests/faq_count.test.ts +19 -0
- package/src/tests/i18n_coverage.test.ts +36 -0
- package/src/tests/locale_completeness.test.ts +29 -0
- package/src/tests/mocks/astro_mock.js +2 -0
- package/src/tests/no_h1_in_components.test.ts +48 -0
- package/src/tests/schemas_fulfillment.test.ts +23 -0
- package/src/tests/seo_length.test.ts +22 -0
- package/src/tests/shared-test-helpers.ts +56 -0
- package/src/tests/slug_language_code_format.test.ts +23 -0
- package/src/tests/slug_uniqueness.test.ts +81 -0
- package/src/tests/title_quality.test.ts +55 -0
- package/src/tests/tool_exports.test.ts +34 -0
- package/src/tests/tool_validation.test.ts +18 -0
- package/src/tool/beat-rate-converter/beat-rate-converter.css +301 -0
- package/src/tool/beat-rate-converter/bibliography.astro +16 -0
- package/src/tool/beat-rate-converter/bibliography.ts +12 -0
- package/src/tool/beat-rate-converter/client.ts +46 -0
- package/src/tool/beat-rate-converter/component.astro +15 -0
- package/src/tool/beat-rate-converter/components/ConverterPanel.astro +87 -0
- package/src/tool/beat-rate-converter/entry.ts +42 -0
- package/src/tool/beat-rate-converter/i18n/de.ts +138 -0
- package/src/tool/beat-rate-converter/i18n/en.ts +138 -0
- package/src/tool/beat-rate-converter/i18n/es.ts +138 -0
- package/src/tool/beat-rate-converter/i18n/fr.ts +138 -0
- package/src/tool/beat-rate-converter/i18n/id.ts +138 -0
- package/src/tool/beat-rate-converter/i18n/it.ts +138 -0
- package/src/tool/beat-rate-converter/i18n/ja.ts +138 -0
- package/src/tool/beat-rate-converter/i18n/ko.ts +138 -0
- package/src/tool/beat-rate-converter/i18n/nl.ts +138 -0
- package/src/tool/beat-rate-converter/i18n/pl.ts +138 -0
- package/src/tool/beat-rate-converter/i18n/pt.ts +138 -0
- package/src/tool/beat-rate-converter/i18n/ru.ts +138 -0
- package/src/tool/beat-rate-converter/i18n/sv.ts +138 -0
- package/src/tool/beat-rate-converter/i18n/tr.ts +138 -0
- package/src/tool/beat-rate-converter/i18n/zh.ts +138 -0
- package/src/tool/beat-rate-converter/index.ts +11 -0
- package/src/tool/beat-rate-converter/seo.astro +16 -0
- package/src/tool/crown-reference-guide/bibliography.astro +16 -0
- package/src/tool/crown-reference-guide/bibliography.ts +20 -0
- package/src/tool/crown-reference-guide/client.ts +193 -0
- package/src/tool/crown-reference-guide/component.astro +69 -0
- package/src/tool/crown-reference-guide/components/CrownView.astro +40 -0
- package/src/tool/crown-reference-guide/components/MovementSelector.astro +26 -0
- package/src/tool/crown-reference-guide/components/PositionPanel.astro +59 -0
- package/src/tool/crown-reference-guide/crown-reference-guide.css +383 -0
- package/src/tool/crown-reference-guide/entry.ts +60 -0
- package/src/tool/crown-reference-guide/i18n/de.ts +207 -0
- package/src/tool/crown-reference-guide/i18n/en.ts +207 -0
- package/src/tool/crown-reference-guide/i18n/es.ts +207 -0
- package/src/tool/crown-reference-guide/i18n/fr.ts +207 -0
- package/src/tool/crown-reference-guide/i18n/id.ts +207 -0
- package/src/tool/crown-reference-guide/i18n/it.ts +207 -0
- package/src/tool/crown-reference-guide/i18n/ja.ts +207 -0
- package/src/tool/crown-reference-guide/i18n/ko.ts +207 -0
- package/src/tool/crown-reference-guide/i18n/nl.ts +207 -0
- package/src/tool/crown-reference-guide/i18n/pl.ts +207 -0
- package/src/tool/crown-reference-guide/i18n/pt.ts +207 -0
- package/src/tool/crown-reference-guide/i18n/ru.ts +207 -0
- package/src/tool/crown-reference-guide/i18n/sv.ts +207 -0
- package/src/tool/crown-reference-guide/i18n/tr.ts +207 -0
- package/src/tool/crown-reference-guide/i18n/zh.ts +207 -0
- package/src/tool/crown-reference-guide/index.ts +11 -0
- package/src/tool/crown-reference-guide/seo.astro +16 -0
- package/src/tool/crown-reference-guide/utils.ts +0 -0
- package/src/tool/demagnetizing-timer/bibliography.astro +16 -0
- package/src/tool/demagnetizing-timer/bibliography.ts +12 -0
- package/src/tool/demagnetizing-timer/client.ts +221 -0
- package/src/tool/demagnetizing-timer/component.astro +15 -0
- package/src/tool/demagnetizing-timer/components/TimerPanel.astro +92 -0
- package/src/tool/demagnetizing-timer/demagnetizing-timer.css +389 -0
- package/src/tool/demagnetizing-timer/entry.ts +50 -0
- package/src/tool/demagnetizing-timer/helpers/field.ts +134 -0
- package/src/tool/demagnetizing-timer/i18n/de.ts +143 -0
- package/src/tool/demagnetizing-timer/i18n/en.ts +143 -0
- package/src/tool/demagnetizing-timer/i18n/es.ts +143 -0
- package/src/tool/demagnetizing-timer/i18n/fr.ts +143 -0
- package/src/tool/demagnetizing-timer/i18n/id.ts +143 -0
- package/src/tool/demagnetizing-timer/i18n/it.ts +143 -0
- package/src/tool/demagnetizing-timer/i18n/ja.ts +143 -0
- package/src/tool/demagnetizing-timer/i18n/ko.ts +143 -0
- package/src/tool/demagnetizing-timer/i18n/nl.ts +143 -0
- package/src/tool/demagnetizing-timer/i18n/pl.ts +143 -0
- package/src/tool/demagnetizing-timer/i18n/pt.ts +143 -0
- package/src/tool/demagnetizing-timer/i18n/ru.ts +143 -0
- package/src/tool/demagnetizing-timer/i18n/sv.ts +143 -0
- package/src/tool/demagnetizing-timer/i18n/tr.ts +143 -0
- package/src/tool/demagnetizing-timer/i18n/zh.ts +143 -0
- package/src/tool/demagnetizing-timer/index.ts +11 -0
- package/src/tool/demagnetizing-timer/seo.astro +16 -0
- package/src/tool/demagnetizing-timer/utils.ts +0 -0
- package/src/tool/power-reserve-estimator/bibliography.astro +16 -0
- package/src/tool/power-reserve-estimator/bibliography.ts +16 -0
- package/src/tool/power-reserve-estimator/client.ts +139 -0
- package/src/tool/power-reserve-estimator/component.astro +15 -0
- package/src/tool/power-reserve-estimator/components/EstimatorPanel.astro +150 -0
- package/src/tool/power-reserve-estimator/entry.ts +51 -0
- package/src/tool/power-reserve-estimator/i18n/de.ts +158 -0
- package/src/tool/power-reserve-estimator/i18n/en.ts +158 -0
- package/src/tool/power-reserve-estimator/i18n/es.ts +158 -0
- package/src/tool/power-reserve-estimator/i18n/fr.ts +158 -0
- package/src/tool/power-reserve-estimator/i18n/id.ts +158 -0
- package/src/tool/power-reserve-estimator/i18n/it.ts +158 -0
- package/src/tool/power-reserve-estimator/i18n/ja.ts +158 -0
- package/src/tool/power-reserve-estimator/i18n/ko.ts +158 -0
- package/src/tool/power-reserve-estimator/i18n/nl.ts +158 -0
- package/src/tool/power-reserve-estimator/i18n/pl.ts +158 -0
- package/src/tool/power-reserve-estimator/i18n/pt.ts +158 -0
- package/src/tool/power-reserve-estimator/i18n/ru.ts +158 -0
- package/src/tool/power-reserve-estimator/i18n/sv.ts +158 -0
- package/src/tool/power-reserve-estimator/i18n/tr.ts +158 -0
- package/src/tool/power-reserve-estimator/i18n/zh.ts +158 -0
- package/src/tool/power-reserve-estimator/index.ts +11 -0
- package/src/tool/power-reserve-estimator/power-reserve-estimator.css +402 -0
- package/src/tool/power-reserve-estimator/seo.astro +16 -0
- package/src/tool/strap-taper-calculator/bibliography.astro +16 -0
- package/src/tool/strap-taper-calculator/bibliography.ts +12 -0
- package/src/tool/strap-taper-calculator/client.ts +129 -0
- package/src/tool/strap-taper-calculator/component.astro +15 -0
- package/src/tool/strap-taper-calculator/components/CalculatorPanel.astro +114 -0
- package/src/tool/strap-taper-calculator/entry.ts +56 -0
- package/src/tool/strap-taper-calculator/i18n/de.ts +152 -0
- package/src/tool/strap-taper-calculator/i18n/en.ts +152 -0
- package/src/tool/strap-taper-calculator/i18n/es.ts +152 -0
- package/src/tool/strap-taper-calculator/i18n/fr.ts +152 -0
- package/src/tool/strap-taper-calculator/i18n/id.ts +152 -0
- package/src/tool/strap-taper-calculator/i18n/it.ts +152 -0
- package/src/tool/strap-taper-calculator/i18n/ja.ts +152 -0
- package/src/tool/strap-taper-calculator/i18n/ko.ts +152 -0
- package/src/tool/strap-taper-calculator/i18n/nl.ts +152 -0
- package/src/tool/strap-taper-calculator/i18n/pl.ts +152 -0
- package/src/tool/strap-taper-calculator/i18n/pt.ts +152 -0
- package/src/tool/strap-taper-calculator/i18n/ru.ts +152 -0
- package/src/tool/strap-taper-calculator/i18n/sv.ts +152 -0
- package/src/tool/strap-taper-calculator/i18n/tr.ts +152 -0
- package/src/tool/strap-taper-calculator/i18n/zh.ts +152 -0
- package/src/tool/strap-taper-calculator/index.ts +11 -0
- package/src/tool/strap-taper-calculator/seo.astro +16 -0
- package/src/tool/strap-taper-calculator/strap-taper-calculator.css +320 -0
- package/src/tool/watch-accuracy-tracker/bibliography.astro +16 -0
- package/src/tool/watch-accuracy-tracker/bibliography.ts +12 -0
- package/src/tool/watch-accuracy-tracker/chart.ts +126 -0
- package/src/tool/watch-accuracy-tracker/client.ts +287 -0
- package/src/tool/watch-accuracy-tracker/component.astro +35 -0
- package/src/tool/watch-accuracy-tracker/components/AccuracyTracker.astro +96 -0
- package/src/tool/watch-accuracy-tracker/components/DriftPredictor.astro +126 -0
- package/src/tool/watch-accuracy-tracker/components/LogHistory.astro +66 -0
- package/src/tool/watch-accuracy-tracker/entry.ts +94 -0
- package/src/tool/watch-accuracy-tracker/i18n/de.ts +167 -0
- package/src/tool/watch-accuracy-tracker/i18n/en.ts +167 -0
- package/src/tool/watch-accuracy-tracker/i18n/es.ts +167 -0
- package/src/tool/watch-accuracy-tracker/i18n/fr.ts +167 -0
- package/src/tool/watch-accuracy-tracker/i18n/id.ts +167 -0
- package/src/tool/watch-accuracy-tracker/i18n/it.ts +167 -0
- package/src/tool/watch-accuracy-tracker/i18n/ja.ts +167 -0
- package/src/tool/watch-accuracy-tracker/i18n/ko.ts +167 -0
- package/src/tool/watch-accuracy-tracker/i18n/nl.ts +167 -0
- package/src/tool/watch-accuracy-tracker/i18n/pl.ts +167 -0
- package/src/tool/watch-accuracy-tracker/i18n/pt.ts +167 -0
- package/src/tool/watch-accuracy-tracker/i18n/ru.ts +167 -0
- package/src/tool/watch-accuracy-tracker/i18n/sv.ts +167 -0
- package/src/tool/watch-accuracy-tracker/i18n/tr.ts +167 -0
- package/src/tool/watch-accuracy-tracker/i18n/zh.ts +167 -0
- package/src/tool/watch-accuracy-tracker/index.ts +9 -0
- package/src/tool/watch-accuracy-tracker/logger.ts +105 -0
- package/src/tool/watch-accuracy-tracker/seo.astro +16 -0
- package/src/tool/watch-accuracy-tracker/utils.ts +99 -0
- package/src/tool/watch-accuracy-tracker/watch-accuracy-tracker.css +564 -0
- package/src/tool/watch-savings-planner/bibliography.astro +16 -0
- package/src/tool/watch-savings-planner/bibliography.ts +8 -0
- package/src/tool/watch-savings-planner/client.ts +271 -0
- package/src/tool/watch-savings-planner/component.astro +33 -0
- package/src/tool/watch-savings-planner/components/AddGoalForm.astro +49 -0
- package/src/tool/watch-savings-planner/components/GoalCard.astro +58 -0
- package/src/tool/watch-savings-planner/entry.ts +62 -0
- package/src/tool/watch-savings-planner/i18n/de.ts +153 -0
- package/src/tool/watch-savings-planner/i18n/en.ts +155 -0
- package/src/tool/watch-savings-planner/i18n/es.ts +153 -0
- package/src/tool/watch-savings-planner/i18n/fr.ts +153 -0
- package/src/tool/watch-savings-planner/i18n/id.ts +153 -0
- package/src/tool/watch-savings-planner/i18n/it.ts +153 -0
- package/src/tool/watch-savings-planner/i18n/ja.ts +153 -0
- package/src/tool/watch-savings-planner/i18n/ko.ts +153 -0
- package/src/tool/watch-savings-planner/i18n/nl.ts +153 -0
- package/src/tool/watch-savings-planner/i18n/pl.ts +153 -0
- package/src/tool/watch-savings-planner/i18n/pt.ts +153 -0
- package/src/tool/watch-savings-planner/i18n/ru.ts +153 -0
- package/src/tool/watch-savings-planner/i18n/sv.ts +153 -0
- package/src/tool/watch-savings-planner/i18n/tr.ts +153 -0
- package/src/tool/watch-savings-planner/i18n/zh.ts +153 -0
- package/src/tool/watch-savings-planner/index.ts +11 -0
- package/src/tool/watch-savings-planner/seo.astro +16 -0
- package/src/tool/watch-savings-planner/utils.ts +0 -0
- package/src/tool/watch-savings-planner/watch-savings-planner.css +460 -0
- package/src/tool/water-resistance-converter/bibliography.astro +16 -0
- package/src/tool/water-resistance-converter/bibliography.ts +16 -0
- package/src/tool/water-resistance-converter/client.ts +56 -0
- package/src/tool/water-resistance-converter/component.astro +15 -0
- package/src/tool/water-resistance-converter/components/ConverterPanel.astro +113 -0
- package/src/tool/water-resistance-converter/entry.ts +52 -0
- package/src/tool/water-resistance-converter/i18n/de.ts +148 -0
- package/src/tool/water-resistance-converter/i18n/en.ts +148 -0
- package/src/tool/water-resistance-converter/i18n/es.ts +148 -0
- package/src/tool/water-resistance-converter/i18n/fr.ts +148 -0
- package/src/tool/water-resistance-converter/i18n/id.ts +148 -0
- package/src/tool/water-resistance-converter/i18n/it.ts +148 -0
- package/src/tool/water-resistance-converter/i18n/ja.ts +148 -0
- package/src/tool/water-resistance-converter/i18n/ko.ts +148 -0
- package/src/tool/water-resistance-converter/i18n/nl.ts +148 -0
- package/src/tool/water-resistance-converter/i18n/pl.ts +148 -0
- package/src/tool/water-resistance-converter/i18n/pt.ts +148 -0
- package/src/tool/water-resistance-converter/i18n/ru.ts +148 -0
- package/src/tool/water-resistance-converter/i18n/sv.ts +148 -0
- package/src/tool/water-resistance-converter/i18n/tr.ts +148 -0
- package/src/tool/water-resistance-converter/i18n/zh.ts +148 -0
- package/src/tool/water-resistance-converter/index.ts +11 -0
- package/src/tool/water-resistance-converter/seo.astro +16 -0
- package/src/tool/water-resistance-converter/water-resistance-converter.css +254 -0
- package/src/tool/wrist-presence-calculator/bibliography.astro +16 -0
- package/src/tool/wrist-presence-calculator/bibliography.ts +12 -0
- package/src/tool/wrist-presence-calculator/client.ts +180 -0
- package/src/tool/wrist-presence-calculator/component.astro +23 -0
- package/src/tool/wrist-presence-calculator/components/CalculatorInputs.astro +97 -0
- package/src/tool/wrist-presence-calculator/components/FitResult.astro +68 -0
- package/src/tool/wrist-presence-calculator/components/Visualizer.astro +16 -0
- package/src/tool/wrist-presence-calculator/entry.ts +59 -0
- package/src/tool/wrist-presence-calculator/helpers/canvas.ts +189 -0
- package/src/tool/wrist-presence-calculator/helpers/results.ts +78 -0
- package/src/tool/wrist-presence-calculator/i18n/de.ts +139 -0
- package/src/tool/wrist-presence-calculator/i18n/en.ts +155 -0
- package/src/tool/wrist-presence-calculator/i18n/es.ts +139 -0
- package/src/tool/wrist-presence-calculator/i18n/fr.ts +139 -0
- package/src/tool/wrist-presence-calculator/i18n/id.ts +139 -0
- package/src/tool/wrist-presence-calculator/i18n/it.ts +139 -0
- package/src/tool/wrist-presence-calculator/i18n/ja.ts +139 -0
- package/src/tool/wrist-presence-calculator/i18n/ko.ts +139 -0
- package/src/tool/wrist-presence-calculator/i18n/nl.ts +139 -0
- package/src/tool/wrist-presence-calculator/i18n/pl.ts +139 -0
- package/src/tool/wrist-presence-calculator/i18n/pt.ts +139 -0
- package/src/tool/wrist-presence-calculator/i18n/ru.ts +139 -0
- package/src/tool/wrist-presence-calculator/i18n/sv.ts +139 -0
- package/src/tool/wrist-presence-calculator/i18n/tr.ts +139 -0
- package/src/tool/wrist-presence-calculator/i18n/zh.ts +155 -0
- package/src/tool/wrist-presence-calculator/index.ts +11 -0
- package/src/tool/wrist-presence-calculator/seo.astro +16 -0
- package/src/tool/wrist-presence-calculator/utils.ts +30 -0
- package/src/tool/wrist-presence-calculator/wrist-presence-calculator.css +372 -0
- package/src/tools.ts +26 -0
- package/src/types.ts +70 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
interface CrownPos {
|
|
2
|
+
id: number;
|
|
3
|
+
title: string;
|
|
4
|
+
desc: string;
|
|
5
|
+
detail: string;
|
|
6
|
+
winding: string;
|
|
7
|
+
hack: string;
|
|
8
|
+
note?: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
interface Movement {
|
|
12
|
+
id: string;
|
|
13
|
+
name: string;
|
|
14
|
+
maker: string;
|
|
15
|
+
positions: CrownPos[];
|
|
16
|
+
posCount: number;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const mainEl = document.querySelector('.tool-main-card') as HTMLElement;
|
|
20
|
+
const ui = mainEl ? JSON.parse(mainEl.dataset.ui || '{}') : {};
|
|
21
|
+
|
|
22
|
+
let currentMovementId = 'eta-2824';
|
|
23
|
+
|
|
24
|
+
const movements: Movement[] = [
|
|
25
|
+
{
|
|
26
|
+
id: 'eta-2824', name: 'ETA 2824-2 / Sellita SW200', maker: 'ETA / Sellita', posCount: 3,
|
|
27
|
+
positions: [
|
|
28
|
+
{ id: 0, title: ui.position0Title || 'Resting', desc: ui.position0Desc || 'Crown is pushed in. Watch runs normally.', detail: ui.position0Detail || 'No winding or setting functions are engaged.', winding: '\u2014', hack: '\u2014' },
|
|
29
|
+
{ id: 1, title: ui.position1Title || 'Manual Winding', desc: ui.position1Desc || 'Turn the crown clockwise to wind the mainspring.', detail: ui.position1Detail || 'About 30\u201340 full rotations from a dead stop.', winding: 'CW', hack: '\u2014' },
|
|
30
|
+
{ id: 2, title: ui.position2Title || 'Date Quick-Set', desc: ui.position2Desc || 'Turn the crown clockwise to advance the date.', detail: ui.position2Detail || 'AVOID quick-setting between 9pm and 3am.', winding: '\u2014', hack: '\u2014', note: 'Avoid quick-set date between 9pm\u20133am' },
|
|
31
|
+
{ id: 3, title: ui.position3Title || 'Time Setting', desc: ui.position3Desc || 'Turn the crown in either direction to move the hands.', detail: ui.position3Detail || 'Pull to position 3 and rotate to set time.', winding: '\u2014', hack: ui.hasHack || 'Yes' },
|
|
32
|
+
],
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
id: 'eta-2892', name: 'ETA 2892-A2 / Sellita SW300', maker: 'ETA / Sellita', posCount: 3,
|
|
36
|
+
positions: [
|
|
37
|
+
{ id: 0, title: ui.position0Title || 'Resting', desc: ui.position0Desc || 'Crown pushed in. Thin movement running normally.', detail: ui.position0Detail || 'Slim profile and efficient automatic winding.', winding: '\u2014', hack: '\u2014' },
|
|
38
|
+
{ id: 1, title: ui.position1Title || 'Manual Winding', desc: ui.position1Desc || 'Turn clockwise to wind.', detail: ui.position1Detail || 'About 40 turns from dead stop.', winding: 'CW', hack: '\u2014' },
|
|
39
|
+
{ id: 2, title: ui.position2Title || 'Date Quick-Set', desc: ui.position2Desc || 'Turn clockwise to advance the date.', detail: ui.position2Detail || 'Avoid quick-set between 9pm and 3am.', winding: '\u2014', hack: '\u2014', note: 'Avoid quick-set date between 9pm\u20133am' },
|
|
40
|
+
{ id: 3, title: ui.position3Title || 'Time Setting', desc: ui.position3Desc || 'Rotate freely. Hacking seconds stop.', detail: ui.position3Detail || 'Use a time reference for perfect sync.', winding: '\u2014', hack: ui.hasHack || 'Yes' },
|
|
41
|
+
],
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
id: 'valjoux-7750', name: 'Valjoux 7750 / Sellita SW500', maker: 'ETA / Sellita', posCount: 3,
|
|
45
|
+
positions: [
|
|
46
|
+
{ id: 0, title: ui.position0Title || 'Resting', desc: ui.position0Desc || 'Crown pushed in. Chronograph runs independently.', detail: ui.position0Detail || 'Cam-switched chronograph mechanism.', winding: '\u2014', hack: '\u2014' },
|
|
47
|
+
{ id: 1, title: ui.position1Title || 'Manual Winding', desc: ui.position1Desc || 'Turn clockwise to wind.', detail: ui.position1Detail || 'Ball bearing rotor. About 40 turns.', winding: 'CW', hack: '\u2014' },
|
|
48
|
+
{ id: 2, title: ui.position2Title || 'Date Quick-Set', desc: ui.position2Desc || 'Turn clockwise to advance the date.', detail: ui.position2Detail || 'Day is linked to hour hand, no quick-set.', winding: '\u2014', hack: '\u2014', note: 'Day advances with time only' },
|
|
49
|
+
{ id: 3, title: ui.position3Title || 'Time Setting', desc: ui.position3Desc || 'Rotate freely. Seconds hack.', detail: ui.position3Detail || 'Stop chronograph before setting time.', winding: '\u2014', hack: ui.hasHack || 'Yes' },
|
|
50
|
+
],
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
id: 'miyota-8215', name: 'Miyota 8215 / 8315', maker: 'Citizen Miyota', posCount: 2,
|
|
54
|
+
positions: [
|
|
55
|
+
{ id: 0, title: ui.position0Title || 'Resting', desc: ui.position0Desc || 'Crown pushed in. Automatic winding.', detail: ui.position0Detail || 'Does not hack. Unidirectional rotor.', winding: '\u2014', hack: '\u2014' },
|
|
56
|
+
{ id: 1, title: ui.position1Title || 'Manual Winding', desc: ui.position1Desc || 'Turn clockwise to wind.', detail: ui.position1Detail || 'Unidirectional rotor. No date quick-set on base model.', winding: 'CW', hack: ui.noHack || 'No' },
|
|
57
|
+
{ id: 2, title: '\u2014', desc: '\u2014', detail: '\u2014', winding: '\u2014', hack: '\u2014' },
|
|
58
|
+
{ id: 3, title: ui.position3Title || 'Time Setting', desc: ui.position3Desc || 'Rotate to set hands. No hacking.', detail: ui.position3Detail || 'No hack. Rotate past desired time then back.', winding: '\u2014', hack: ui.noHack || 'No' },
|
|
59
|
+
],
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
id: 'miyota-9015', name: 'Miyota 9015', maker: 'Citizen Miyota', posCount: 3,
|
|
63
|
+
positions: [
|
|
64
|
+
{ id: 0, title: ui.position0Title || 'Resting', desc: ui.position0Desc || 'Crown pushed in. 28,800 vph high-beat.', detail: ui.position0Detail || 'Slim. Direct competitor to ETA 2892.', winding: '\u2014', hack: '\u2014' },
|
|
65
|
+
{ id: 1, title: ui.position1Title || 'Manual Winding', desc: ui.position1Desc || 'Turn clockwise. Quiet, smooth winding.', detail: ui.position1Detail || 'Bidirectional rotor. About 35 turns.', winding: 'CW', hack: '\u2014' },
|
|
66
|
+
{ id: 2, title: ui.position2Title || 'Date Quick-Set', desc: ui.position2Desc || 'Turn clockwise to advance date.', detail: ui.position2Detail || 'Avoid quick-set between 9pm and 4am.', winding: '\u2014', hack: '\u2014', note: 'Avoid quick-set date between 9pm\u20134am' },
|
|
67
|
+
{ id: 3, title: ui.position3Title || 'Time Setting', desc: ui.position3Desc || 'Rotate freely. Hacking stops seconds.', detail: ui.position3Detail || 'Smooth hand movement.', winding: '\u2014', hack: ui.hasHack || 'Yes' },
|
|
68
|
+
],
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
id: 'seiko-nh35', name: 'Seiko NH35 / 4R35', maker: 'Seiko Instruments', posCount: 3,
|
|
72
|
+
positions: [
|
|
73
|
+
{ id: 0, title: ui.position0Title || 'Resting', desc: ui.position0Desc || 'Crown pushed in. Magic Lever winding.', detail: ui.position0Detail || 'Efficient winding with minimal rotor movement.', winding: '\u2014', hack: '\u2014' },
|
|
74
|
+
{ id: 1, title: ui.position1Title || 'Manual Winding', desc: ui.position1Desc || 'Turn clockwise. Notched winding feel.', detail: ui.position1Detail || 'About 40\u201350 turns from dead.', winding: 'CW', hack: '\u2014' },
|
|
75
|
+
{ id: 2, title: ui.position2Title || 'Date Quick-Set', desc: ui.position2Desc || 'Turn clockwise to advance date.', detail: ui.position2Detail || 'Avoid 9pm\u20133am. Day-date versions quick-set both.', winding: '\u2014', hack: '\u2014', note: 'Avoid quick-set date between 9pm\u20133am' },
|
|
76
|
+
{ id: 3, title: ui.position3Title || 'Time Setting', desc: ui.position3Desc || 'Rotate freely. Hacking stops seconds.', detail: ui.position3Detail || '3Hz sweep. Set and push crown back.', winding: '\u2014', hack: ui.hasHack || 'Yes' },
|
|
77
|
+
],
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
id: 'seiko-6r35', name: 'Seiko 6R35', maker: 'Seiko', posCount: 3,
|
|
81
|
+
positions: [
|
|
82
|
+
{ id: 0, title: ui.position0Title || 'Resting', desc: ui.position0Desc || 'Crown pushed in. 70h power reserve.', detail: ui.position0Detail || 'Improved regulation over 4R series.', winding: '\u2014', hack: '\u2014' },
|
|
83
|
+
{ id: 1, title: ui.position1Title || 'Manual Winding', desc: ui.position1Desc || 'Turn clockwise. Extended mainspring.', detail: ui.position1Detail || 'About 50\u201360 turns from dead.', winding: 'CW', hack: '\u2014' },
|
|
84
|
+
{ id: 2, title: ui.position2Title || 'Date Quick-Set', desc: ui.position2Desc || 'Turn clockwise to advance date.', detail: ui.position2Detail || 'Avoid 9pm\u20133am. Instant date change.', winding: '\u2014', hack: '\u2014', note: 'Avoid quick-set date between 9pm\u20133am' },
|
|
85
|
+
{ id: 3, title: ui.position3Title || 'Time Setting', desc: ui.position3Desc || 'Rotate freely. Hacking.', detail: ui.position3Detail || '70h reserve means less frequent winding.', winding: '\u2014', hack: ui.hasHack || 'Yes' },
|
|
86
|
+
],
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
id: 'unitas-6498', name: 'Unitas 6497 / 6498', maker: 'ETA / Unitas', posCount: 1,
|
|
90
|
+
positions: [
|
|
91
|
+
{ id: 0, title: ui.position0Title || 'Resting', desc: ui.position0Desc || 'Crown pushed in. Hand-wound, small seconds.', detail: ui.position0Detail || 'Classic pocket watch caliber. No date.', winding: '\u2014', hack: '\u2014' },
|
|
92
|
+
{ id: 1, title: ui.position1Title || 'Manual Winding', desc: ui.position1Desc || 'Turn clockwise. 18,000 vph (2.5 Hz).', detail: ui.position1Detail || 'About 30\u201335 turns. Vintage character.', winding: 'CW', hack: '\u2014' },
|
|
93
|
+
{ id: 2, title: '\u2014', desc: '\u2014', detail: '\u2014', winding: '\u2014', hack: '\u2014' },
|
|
94
|
+
{ id: 3, title: ui.position3Title || 'Time Setting', desc: ui.position3Desc || 'Pull to set. Rotate freely.', detail: ui.position3Detail || 'No hacking. Large crown for easy setting.', winding: '\u2014', hack: ui.noHack || 'No' },
|
|
95
|
+
],
|
|
96
|
+
},
|
|
97
|
+
];
|
|
98
|
+
|
|
99
|
+
const crownStem = document.querySelector('.crown-stem') as SVGElement;
|
|
100
|
+
const crownHead = document.querySelector('.crown-head') as SVGElement;
|
|
101
|
+
const posChips = document.querySelectorAll('.pos-chip') as NodeListOf<HTMLButtonElement>;
|
|
102
|
+
|
|
103
|
+
const positionBadge = document.getElementById('position-badge') as HTMLElement;
|
|
104
|
+
const positionName = document.getElementById('position-name') as HTMLElement;
|
|
105
|
+
const panelDesc = document.getElementById('panel-desc') as HTMLElement;
|
|
106
|
+
const panelDetail = document.getElementById('panel-detail') as HTMLElement;
|
|
107
|
+
const panelNote = document.getElementById('panel-note') as HTMLElement;
|
|
108
|
+
const panelNoteText = document.getElementById('panel-note-text') as HTMLElement;
|
|
109
|
+
const attrWindingValue = document.getElementById('attr-winding-value') as HTMLElement;
|
|
110
|
+
const attrHackValue = document.getElementById('attr-hack-value') as HTMLElement;
|
|
111
|
+
const movementSelect = document.getElementById('movement-select') as HTMLSelectElement;
|
|
112
|
+
const pullBtn = document.getElementById('pull-btn') as HTMLButtonElement;
|
|
113
|
+
const arrowCw = document.querySelector('.arrow-cw') as SVGElement;
|
|
114
|
+
const arrowCcw = document.querySelector('.arrow-ccw') as SVGElement;
|
|
115
|
+
|
|
116
|
+
function getMovement(id: string): Movement {
|
|
117
|
+
return movements.find((m) => m.id === id) || movements[0];
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function getEffectivePositions(movement: Movement): CrownPos[] {
|
|
121
|
+
return movement.positions.filter((p) => p.title !== '\u2014');
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function setCrownPull(pos: number) {
|
|
125
|
+
const offset = pos * 8;
|
|
126
|
+
crownStem.setAttribute('width', String(28 + offset));
|
|
127
|
+
crownHead.setAttribute('x', String(158 + offset));
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function setPosHighlight(pos: number) {
|
|
131
|
+
posChips.forEach((chip) => {
|
|
132
|
+
chip.classList.toggle('active', parseInt(chip.dataset.pos || '0', 10) === pos);
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function setArrows(pos: number, movement: Movement) {
|
|
137
|
+
const p = movement.positions[pos];
|
|
138
|
+
arrowCw.style.opacity = '0';
|
|
139
|
+
arrowCcw.style.opacity = '0';
|
|
140
|
+
if (p && p.winding === 'CW') arrowCw.style.opacity = '0.8';
|
|
141
|
+
else if (p && p.winding === 'CCW') arrowCcw.style.opacity = '0.8';
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function setPanel(pos: number, movement: Movement) {
|
|
145
|
+
const p = movement.positions[pos];
|
|
146
|
+
if (!p || p.title === '\u2014') {
|
|
147
|
+
const eff = getEffectivePositions(movement);
|
|
148
|
+
const nearest = eff.reduce((a, b) => Math.abs(a.id - pos) < Math.abs(b.id - pos) ? a : b);
|
|
149
|
+
setPanel(nearest.id, movement);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
positionBadge.textContent = String(p.id);
|
|
153
|
+
positionName.textContent = p.title;
|
|
154
|
+
panelDesc.textContent = p.desc;
|
|
155
|
+
panelDetail.textContent = p.detail;
|
|
156
|
+
attrWindingValue.textContent = p.winding;
|
|
157
|
+
attrHackValue.textContent = p.hack;
|
|
158
|
+
panelNote.style.display = p.note ? 'flex' : 'none';
|
|
159
|
+
if (p.note) panelNoteText.textContent = p.note;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
function selectPosition(pos: number, movement: Movement) {
|
|
164
|
+
const eff = getEffectivePositions(movement);
|
|
165
|
+
const exists = eff.some((p) => p.id === pos);
|
|
166
|
+
const target = exists ? pos : eff.reduce((a, b) => Math.abs(a.id - pos) < Math.abs(b.id - pos) ? a : b).id;
|
|
167
|
+
setCrownPull(target);
|
|
168
|
+
setPosHighlight(target);
|
|
169
|
+
setArrows(target, movement);
|
|
170
|
+
setPanel(target, movement);
|
|
171
|
+
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
function loadMovement(id: string) {
|
|
175
|
+
currentMovementId = id;
|
|
176
|
+
selectPosition(0, getMovement(id));
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
posChips.forEach((chip) => {
|
|
180
|
+
chip.addEventListener('click', () => selectPosition(parseInt(chip.dataset.pos || '0', 10), getMovement(currentMovementId)));
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
movementSelect.addEventListener('change', () => loadMovement(movementSelect.value));
|
|
185
|
+
|
|
186
|
+
let pullStep = 0;
|
|
187
|
+
pullBtn.addEventListener('click', () => {
|
|
188
|
+
const eff = getEffectivePositions(getMovement(currentMovementId));
|
|
189
|
+
pullStep = (pullStep + 1) % eff.length;
|
|
190
|
+
selectPosition(eff[pullStep].id, getMovement(currentMovementId));
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
loadMovement(currentMovementId);
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
import MovementSelector from './components/MovementSelector.astro';
|
|
3
|
+
import PositionPanel from './components/PositionPanel.astro';
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
ui: Record<string, string>;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const { ui } = Astro.props;
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<div class="tool-main-card" data-ui={JSON.stringify(ui)}>
|
|
13
|
+
<div class="crown-top-row">
|
|
14
|
+
<div class="crown-visual" id="crown-visual">
|
|
15
|
+
<svg class="crown-svg" viewBox="0 0 320 100" id="crown-svg">
|
|
16
|
+
<rect class="crown-tube" x="120" y="38" width="14" height="24" rx="3" />
|
|
17
|
+
<g class="crown-move-group">
|
|
18
|
+
<rect class="crown-stem" x="132" y="42" width="28" height="16" rx="2" />
|
|
19
|
+
<rect class="crown-head" x="158" y="30" width="38" height="40" rx="6" />
|
|
20
|
+
<rect class="crown-notch" x="162" y="30" width="3" height="40" rx="0.5" />
|
|
21
|
+
<rect class="crown-notch" x="168" y="30" width="3" height="40" rx="0.5" />
|
|
22
|
+
<rect class="crown-notch" x="174" y="30" width="3" height="40" rx="0.5" />
|
|
23
|
+
<rect class="crown-notch" x="180" y="30" width="3" height="40" rx="0.5" />
|
|
24
|
+
<rect class="crown-notch" x="186" y="30" width="3" height="40" rx="0.5" />
|
|
25
|
+
<rect class="crown-notch" x="192" y="30" width="3" height="40" rx="0.5" />
|
|
26
|
+
</g>
|
|
27
|
+
<g class="arrow-cw" opacity="0">
|
|
28
|
+
<circle class="arrow-bg" cx="248" cy="50" r="22" />
|
|
29
|
+
<path class="arrow-path" d="M 240 50 A 14 14 0 0 1 258 42" />
|
|
30
|
+
<polygon class="arrow-head" points="258,38 264,42 260,46" />
|
|
31
|
+
<text class="arrow-text" x="248" y="54">CW</text>
|
|
32
|
+
</g>
|
|
33
|
+
<g class="arrow-ccw" opacity="0">
|
|
34
|
+
<circle class="arrow-bg" cx="248" cy="50" r="22" />
|
|
35
|
+
<path class="arrow-path" d="M 240 50 A 14 14 0 0 0 258 58" />
|
|
36
|
+
<polygon class="arrow-head" points="258,62 264,58 260,54" />
|
|
37
|
+
<text class="arrow-text" x="248" y="54">CCW</text>
|
|
38
|
+
</g>
|
|
39
|
+
</svg>
|
|
40
|
+
</div>
|
|
41
|
+
|
|
42
|
+
<div class="crown-side">
|
|
43
|
+
<MovementSelector labels={ui} />
|
|
44
|
+
|
|
45
|
+
<div class="pos-bar" id="pos-bar">
|
|
46
|
+
<button type="button" class="pos-chip active" data-pos="0">
|
|
47
|
+
<span class="chip-num">0</span>
|
|
48
|
+
<span class="chip-label">{ui.position0Title || "Rest"}</span>
|
|
49
|
+
</button>
|
|
50
|
+
<button type="button" class="pos-chip" data-pos="1">
|
|
51
|
+
<span class="chip-num">1</span>
|
|
52
|
+
<span class="chip-label">{ui.position1Title || "Wind"}</span>
|
|
53
|
+
</button>
|
|
54
|
+
<button type="button" class="pos-chip" data-pos="2">
|
|
55
|
+
<span class="chip-num">2</span>
|
|
56
|
+
<span class="chip-label">{ui.position2Title || "Date"}</span>
|
|
57
|
+
</button>
|
|
58
|
+
<button type="button" class="pos-chip" data-pos="3">
|
|
59
|
+
<span class="chip-num">3</span>
|
|
60
|
+
<span class="chip-label">{ui.position3Title || "Time"}</span>
|
|
61
|
+
</button>
|
|
62
|
+
</div>
|
|
63
|
+
</div>
|
|
64
|
+
</div>
|
|
65
|
+
|
|
66
|
+
<PositionPanel labels={ui} />
|
|
67
|
+
</div>
|
|
68
|
+
|
|
69
|
+
<script src="./client.ts"></script>
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
<div class="crown-visual" id="crown-visual">
|
|
10
|
+
<svg class="crown-svg" viewBox="0 0 380 130" id="crown-svg">
|
|
11
|
+
<g class="crown-group">
|
|
12
|
+
<rect class="crown-tube" x="20" y="45" width="18" height="40" rx="4" />
|
|
13
|
+
|
|
14
|
+
<g class="crown-move-group">
|
|
15
|
+
<rect class="crown-stem" x="36" y="52" width="40" height="26" rx="3" />
|
|
16
|
+
|
|
17
|
+
<rect class="crown-head" x="72" y="38" width="52" height="54" rx="8" />
|
|
18
|
+
|
|
19
|
+
<rect class="crown-notch" x="78" y="38" width="4" height="54" rx="1" />
|
|
20
|
+
<rect class="crown-notch" x="86" y="38" width="4" height="54" rx="1" />
|
|
21
|
+
<rect class="crown-notch" x="94" y="38" width="4" height="54" rx="1" />
|
|
22
|
+
<rect class="crown-notch" x="102" y="38" width="4" height="54" rx="1" />
|
|
23
|
+
<rect class="crown-notch" x="110" y="38" width="4" height="54" rx="1" />
|
|
24
|
+
<rect class="crown-notch" x="118" y="38" width="4" height="54" rx="1" />
|
|
25
|
+
|
|
26
|
+
<line class="crown-groove" x1="72" y1="56" x2="124" y2="56" />
|
|
27
|
+
<line class="crown-groove" x1="72" y1="74" x2="124" y2="74" />
|
|
28
|
+
</g>
|
|
29
|
+
|
|
30
|
+
<g class="arrow-cw" opacity="0">
|
|
31
|
+
<path class="arrow-path" d="M 150 60 Q 170 52 180 60" />
|
|
32
|
+
<polygon class="arrow-head" points="180,56 188,60 180,64" />
|
|
33
|
+
</g>
|
|
34
|
+
<g class="arrow-ccw" opacity="0">
|
|
35
|
+
<path class="arrow-path" d="M 150 74 Q 170 82 180 74" />
|
|
36
|
+
<polygon class="arrow-head" points="180,78 188,74 180,70" />
|
|
37
|
+
</g>
|
|
38
|
+
</g>
|
|
39
|
+
</svg>
|
|
40
|
+
</div>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
interface Props {
|
|
3
|
+
labels: Record<string, string>;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
const { labels } = Astro.props;
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
<div class="movement-selector">
|
|
10
|
+
<label class="selector-label" for="movement-select">
|
|
11
|
+
<svg viewBox="0 0 24 24" width="16" height="16">
|
|
12
|
+
<path d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58a.49.49 0 00.12-.61l-1.92-3.32a.488.488 0 00-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54a.484.484 0 00-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.07.62-.07.94s.02.64.07.94l-2.03 1.58a.49.49 0 00-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61l-2.01-1.58zM12 15.6A3.6 3.6 0 1115.6 12 3.611 3.611 0 0112 15.6z" fill="currentColor" />
|
|
13
|
+
</svg>
|
|
14
|
+
{labels.movementLabel || "Movement"}
|
|
15
|
+
</label>
|
|
16
|
+
<select id="movement-select" class="movement-select">
|
|
17
|
+
<option value="eta-2824">ETA 2824-2 / Sellita SW200</option>
|
|
18
|
+
<option value="eta-2892">ETA 2892-A2 / Sellita SW300</option>
|
|
19
|
+
<option value="valjoux-7750">Valjoux 7750 / Sellita SW500</option>
|
|
20
|
+
<option value="miyota-8215">Miyota 8215 / 8315</option>
|
|
21
|
+
<option value="miyota-9015">Miyota 9015</option>
|
|
22
|
+
<option value="seiko-nh35">Seiko NH35 / 4R35</option>
|
|
23
|
+
<option value="seiko-6r35">Seiko 6R35</option>
|
|
24
|
+
<option value="unitas-6498">Unitas 6497 / 6498</option>
|
|
25
|
+
</select>
|
|
26
|
+
</div>
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
---
|
|
2
|
+
interface Props {
|
|
3
|
+
labels: Record<string, string>;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
const { labels } = Astro.props;
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
<div class="position-panel" id="position-panel">
|
|
10
|
+
<div class="panel-header">
|
|
11
|
+
<div class="position-indicator" id="position-indicator">
|
|
12
|
+
<span class="position-badge" id="position-badge">0</span>
|
|
13
|
+
<span class="position-name" id="position-name">{labels.position0Title || "Resting"}</span>
|
|
14
|
+
</div>
|
|
15
|
+
<div class="position-controls">
|
|
16
|
+
<button type="button" class="pull-btn" id="pull-btn" title={labels.pullHint || "Pull crown"}>
|
|
17
|
+
<svg viewBox="0 0 24 24" width="22" height="22">
|
|
18
|
+
<path d="M12 5.83L15.17 9l1.41-1.41L12 3 7.41 7.59 8.83 9 12 5.83zm0 12.34L8.83 15l-1.41 1.41L12 21l4.59-4.59L15.17 15 12 18.17z" fill="currentColor" />
|
|
19
|
+
</svg>
|
|
20
|
+
</button>
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
23
|
+
|
|
24
|
+
<div class="panel-body">
|
|
25
|
+
<div class="panel-section">
|
|
26
|
+
<p class="panel-desc" id="panel-desc">{labels.position0Desc || "Crown is pushed in. Watch runs normally."}</p>
|
|
27
|
+
<p class="panel-detail" id="panel-detail">{labels.position0Detail || "No winding or setting functions are engaged."}</p>
|
|
28
|
+
</div>
|
|
29
|
+
|
|
30
|
+
<div class="panel-attributes" id="panel-attributes">
|
|
31
|
+
<div class="attribute-row" id="attr-winding">
|
|
32
|
+
<span class="attr-icon">
|
|
33
|
+
<svg viewBox="0 0 24 24" width="16" height="16">
|
|
34
|
+
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm6 10c0 3.31-2.69 6-6 6s-6-2.69-6-6 2.69-6 6-6 6 2.69 6 6z" fill="currentColor" />
|
|
35
|
+
<circle cx="12" cy="12" r="2" fill="currentColor" />
|
|
36
|
+
</svg>
|
|
37
|
+
</span>
|
|
38
|
+
<span class="attr-label">{labels.windingLabel || "Winding"}:</span>
|
|
39
|
+
<span class="attr-value" id="attr-winding-value">—</span>
|
|
40
|
+
</div>
|
|
41
|
+
<div class="attribute-row" id="attr-hack">
|
|
42
|
+
<span class="attr-icon">
|
|
43
|
+
<svg viewBox="0 0 24 24" width="16" height="16">
|
|
44
|
+
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 17.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L9 15v1c0 1.1.9 2 2 2v1.93zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39z" fill="currentColor" />
|
|
45
|
+
</svg>
|
|
46
|
+
</span>
|
|
47
|
+
<span class="attr-label">{labels.hackLabel || "Hack"}:</span>
|
|
48
|
+
<span class="attr-value" id="attr-hack-value">—</span>
|
|
49
|
+
</div>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
<div class="panel-note" id="panel-note" style="display: none;">
|
|
53
|
+
<svg viewBox="0 0 24 24" width="16" height="16">
|
|
54
|
+
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z" fill="currentColor" />
|
|
55
|
+
</svg>
|
|
56
|
+
<span id="panel-note-text"></span>
|
|
57
|
+
</div>
|
|
58
|
+
</div>
|
|
59
|
+
</div>
|