@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,59 @@
|
|
|
1
|
+
import type { ChronoToolEntry, ToolLocaleContent } from '../../types';
|
|
2
|
+
|
|
3
|
+
export type WristPresenceCalculatorUI = {
|
|
4
|
+
title: string;
|
|
5
|
+
wristCircumferenceLabel: string;
|
|
6
|
+
caseDiameterLabel: string;
|
|
7
|
+
lugToLugLabel: string;
|
|
8
|
+
wristWidthLabel: string;
|
|
9
|
+
autoEstimateWidthLabel: string;
|
|
10
|
+
unitCm: string;
|
|
11
|
+
unitInches: string;
|
|
12
|
+
unitMm: string;
|
|
13
|
+
fitAnalysisTitle: string;
|
|
14
|
+
caseWristRatioLabel: string;
|
|
15
|
+
wristCoverageLabel: string;
|
|
16
|
+
verdictLabel: string;
|
|
17
|
+
verdictOversized: string;
|
|
18
|
+
verdictBold: string;
|
|
19
|
+
verdictGolden: string;
|
|
20
|
+
verdictVintage: string;
|
|
21
|
+
coverageSafe: string;
|
|
22
|
+
coverageBold: string;
|
|
23
|
+
coverageOverhang: string;
|
|
24
|
+
sweetSpotTitle: string;
|
|
25
|
+
sweetSpotDesc: string;
|
|
26
|
+
minClassicLabel: string;
|
|
27
|
+
sweetSpotLabel: string;
|
|
28
|
+
maxBoldLabel: string;
|
|
29
|
+
maxLugToLugLabel: string;
|
|
30
|
+
idealSizesTitle: string;
|
|
31
|
+
visualizerTitle: string;
|
|
32
|
+
wristWidthHelp: string;
|
|
33
|
+
estimatedLabel: string;
|
|
34
|
+
customLabel: string;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export type WristPresenceCalculatorLocaleContent = ToolLocaleContent<WristPresenceCalculatorUI>;
|
|
38
|
+
|
|
39
|
+
export const wristPresenceCalculator: ChronoToolEntry<WristPresenceCalculatorUI> = {
|
|
40
|
+
id: 'wrist-presence-calculator',
|
|
41
|
+
icons: { bg: 'mdi:ruler', fg: 'mdi:watch' },
|
|
42
|
+
i18n: {
|
|
43
|
+
de: () => import('./i18n/de').then((m) => m.content),
|
|
44
|
+
en: () => import('./i18n/en').then((m) => m.content),
|
|
45
|
+
es: () => import('./i18n/es').then((m) => m.content),
|
|
46
|
+
fr: () => import('./i18n/fr').then((m) => m.content),
|
|
47
|
+
id: () => import('./i18n/id').then((m) => m.content),
|
|
48
|
+
it: () => import('./i18n/it').then((m) => m.content),
|
|
49
|
+
ja: () => import('./i18n/ja').then((m) => m.content),
|
|
50
|
+
ko: () => import('./i18n/ko').then((m) => m.content),
|
|
51
|
+
nl: () => import('./i18n/nl').then((m) => m.content),
|
|
52
|
+
pl: () => import('./i18n/pl').then((m) => m.content),
|
|
53
|
+
pt: () => import('./i18n/pt').then((m) => m.content),
|
|
54
|
+
ru: () => import('./i18n/ru').then((m) => m.content),
|
|
55
|
+
sv: () => import('./i18n/sv').then((m) => m.content),
|
|
56
|
+
tr: () => import('./i18n/tr').then((m) => m.content),
|
|
57
|
+
zh: () => import('./i18n/zh').then((m) => m.content),
|
|
58
|
+
},
|
|
59
|
+
};
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
interface DrawParams {
|
|
2
|
+
canvas: HTMLCanvasElement;
|
|
3
|
+
wristW: number;
|
|
4
|
+
caseD: number;
|
|
5
|
+
l2l: number;
|
|
6
|
+
unit: 'cm' | 'in';
|
|
7
|
+
ui: Record<string, string>;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
interface RenderContext {
|
|
11
|
+
ctx: CanvasRenderingContext2D;
|
|
12
|
+
cx: number;
|
|
13
|
+
cy: number;
|
|
14
|
+
scale: number;
|
|
15
|
+
colors: CSSStyleDeclaration;
|
|
16
|
+
wristW: number;
|
|
17
|
+
caseD: number;
|
|
18
|
+
l2l: number;
|
|
19
|
+
unit: 'cm' | 'in';
|
|
20
|
+
ui: Record<string, string>;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function drawFitVisualizer(params: DrawParams) {
|
|
24
|
+
const ctx = params.canvas.getContext('2d');
|
|
25
|
+
if (!ctx) return;
|
|
26
|
+
const rect = params.canvas.getBoundingClientRect();
|
|
27
|
+
const dpr = window.devicePixelRatio || 1;
|
|
28
|
+
params.canvas.width = rect.width * dpr;
|
|
29
|
+
params.canvas.height = rect.height * dpr;
|
|
30
|
+
ctx.scale(dpr, dpr);
|
|
31
|
+
const w = rect.width;
|
|
32
|
+
const h = rect.height;
|
|
33
|
+
ctx.clearRect(0, 0, w, h);
|
|
34
|
+
const scale = (w * 0.75) / Math.max(params.wristW, params.l2l, 80);
|
|
35
|
+
const r: RenderContext = {
|
|
36
|
+
ctx,
|
|
37
|
+
cx: w / 2,
|
|
38
|
+
cy: h / 2,
|
|
39
|
+
scale,
|
|
40
|
+
colors: getComputedStyle(params.canvas),
|
|
41
|
+
wristW: params.wristW,
|
|
42
|
+
caseD: params.caseD,
|
|
43
|
+
l2l: params.l2l,
|
|
44
|
+
unit: params.unit,
|
|
45
|
+
ui: params.ui
|
|
46
|
+
};
|
|
47
|
+
drawBackground(r);
|
|
48
|
+
drawWrist(r);
|
|
49
|
+
drawWatch(r);
|
|
50
|
+
drawDimensions(r);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function drawBackground(r: RenderContext) {
|
|
54
|
+
const outerCircle = r.colors.getPropertyValue('--visualizer-outer-circle').trim();
|
|
55
|
+
const outerStroke = r.colors.getPropertyValue('--visualizer-outer-stroke').trim();
|
|
56
|
+
const drawWristW = r.wristW * r.scale;
|
|
57
|
+
const drawL2l = r.l2l * r.scale;
|
|
58
|
+
r.ctx.fillStyle = outerCircle;
|
|
59
|
+
r.ctx.strokeStyle = outerStroke;
|
|
60
|
+
r.ctx.lineWidth = 1;
|
|
61
|
+
r.ctx.beginPath();
|
|
62
|
+
r.ctx.arc(r.cx, r.cy, Math.max(drawWristW, drawL2l) / 2 + 20, 0, Math.PI * 2);
|
|
63
|
+
r.ctx.fill();
|
|
64
|
+
r.ctx.stroke();
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function drawWrist(r: RenderContext) {
|
|
68
|
+
const wristFill = r.colors.getPropertyValue('--visualizer-wrist-fill').trim();
|
|
69
|
+
const wristStroke = r.colors.getPropertyValue('--visualizer-wrist-stroke').trim();
|
|
70
|
+
const drawWristW = r.wristW * r.scale;
|
|
71
|
+
r.ctx.fillStyle = wristFill;
|
|
72
|
+
r.ctx.strokeStyle = wristStroke;
|
|
73
|
+
r.ctx.lineWidth = 2;
|
|
74
|
+
r.ctx.beginPath();
|
|
75
|
+
r.ctx.ellipse(r.cx, r.cy, drawWristW / 2, 35, 0, 0, Math.PI * 2);
|
|
76
|
+
r.ctx.fill();
|
|
77
|
+
r.ctx.stroke();
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function drawWatch(r: RenderContext) {
|
|
81
|
+
const watchFace = r.colors.getPropertyValue('--visualizer-watch-face').trim();
|
|
82
|
+
const watchInner = r.colors.getPropertyValue('--visualizer-watch-inner').trim();
|
|
83
|
+
const isOverhang = r.l2l > r.wristW;
|
|
84
|
+
const watchColor = isOverhang ? 'rgba(239, 68, 68, 0.8)' : 'rgba(244, 63, 94, 0.8)';
|
|
85
|
+
const lugColor = isOverhang ? 'rgba(239, 68, 68, 0.6)' : 'rgba(244, 63, 94, 0.5)';
|
|
86
|
+
const drawCaseD = r.caseD * r.scale;
|
|
87
|
+
const drawL2l = r.l2l * r.scale;
|
|
88
|
+
drawLugs(r, drawCaseD, drawL2l, lugColor);
|
|
89
|
+
r.ctx.fillStyle = watchFace;
|
|
90
|
+
r.ctx.strokeStyle = watchColor;
|
|
91
|
+
r.ctx.lineWidth = 4;
|
|
92
|
+
r.ctx.beginPath();
|
|
93
|
+
r.ctx.arc(r.cx, r.cy, drawCaseD / 2, 0, Math.PI * 2);
|
|
94
|
+
r.ctx.fill();
|
|
95
|
+
r.ctx.stroke();
|
|
96
|
+
r.ctx.fillStyle = watchInner;
|
|
97
|
+
r.ctx.beginPath();
|
|
98
|
+
r.ctx.arc(r.cx, r.cy, drawCaseD / 2.3, 0, Math.PI * 2);
|
|
99
|
+
r.ctx.fill();
|
|
100
|
+
drawHands(r, drawCaseD, watchColor);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function drawLugs(r: RenderContext, drawCaseD: number, drawL2l: number, lugColor: string) {
|
|
104
|
+
r.ctx.strokeStyle = lugColor;
|
|
105
|
+
r.ctx.lineWidth = 6;
|
|
106
|
+
r.ctx.lineCap = 'round';
|
|
107
|
+
r.ctx.beginPath();
|
|
108
|
+
r.ctx.moveTo(r.cx - drawL2l / 2, r.cy - 8);
|
|
109
|
+
r.ctx.lineTo(r.cx - drawCaseD / 3, r.cy - 8);
|
|
110
|
+
r.ctx.moveTo(r.cx + drawCaseD / 3, r.cy - 8);
|
|
111
|
+
r.ctx.lineTo(r.cx + drawL2l / 2, r.cy - 8);
|
|
112
|
+
r.ctx.moveTo(r.cx - drawL2l / 2, r.cy + 8);
|
|
113
|
+
r.ctx.lineTo(r.cx - drawCaseD / 3, r.cy + 8);
|
|
114
|
+
r.ctx.moveTo(r.cx + drawCaseD / 3, r.cy + 8);
|
|
115
|
+
r.ctx.lineTo(r.cx + drawL2l / 2, r.cy + 8);
|
|
116
|
+
r.ctx.stroke();
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function drawHands(r: RenderContext, drawCaseD: number, watchColor: string) {
|
|
120
|
+
const watchHands = r.colors.getPropertyValue('--visualizer-watch-hands').trim();
|
|
121
|
+
r.ctx.strokeStyle = watchHands;
|
|
122
|
+
r.ctx.lineWidth = 2;
|
|
123
|
+
r.ctx.beginPath();
|
|
124
|
+
r.ctx.moveTo(r.cx, r.cy);
|
|
125
|
+
r.ctx.lineTo(r.cx + drawCaseD / 4, r.cy - drawCaseD / 6);
|
|
126
|
+
r.ctx.moveTo(r.cx, r.cy);
|
|
127
|
+
r.ctx.lineTo(r.cx, r.cy - drawCaseD / 3);
|
|
128
|
+
r.ctx.stroke();
|
|
129
|
+
r.ctx.fillStyle = watchColor;
|
|
130
|
+
r.ctx.beginPath();
|
|
131
|
+
r.ctx.arc(r.cx, r.cy, 3, 0, Math.PI * 2);
|
|
132
|
+
r.ctx.fill();
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function drawDimensions(r: RenderContext) {
|
|
136
|
+
const drawWristW = r.wristW * r.scale;
|
|
137
|
+
const drawL2l = r.l2l * r.scale;
|
|
138
|
+
drawWristDim(r, drawWristW);
|
|
139
|
+
drawWatchDim(r, drawL2l);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function drawWristDim(r: RenderContext, drawWristW: number) {
|
|
143
|
+
const dimensionLine = r.colors.getPropertyValue('--visualizer-dim-line').trim();
|
|
144
|
+
const dimensionText = r.colors.getPropertyValue('--visualizer-dim-text').trim();
|
|
145
|
+
r.ctx.strokeStyle = dimensionLine;
|
|
146
|
+
r.ctx.lineWidth = 1;
|
|
147
|
+
r.ctx.setLineDash([4, 4]);
|
|
148
|
+
r.ctx.beginPath();
|
|
149
|
+
r.ctx.moveTo(r.cx - drawWristW / 2, r.cy - 45);
|
|
150
|
+
r.ctx.lineTo(r.cx - drawWristW / 2, r.cy + 45);
|
|
151
|
+
r.ctx.moveTo(r.cx + drawWristW / 2, r.cy - 45);
|
|
152
|
+
r.ctx.lineTo(r.cx + drawWristW / 2, r.cy + 45);
|
|
153
|
+
r.ctx.stroke();
|
|
154
|
+
r.ctx.setLineDash([]);
|
|
155
|
+
r.ctx.beginPath();
|
|
156
|
+
r.ctx.moveTo(r.cx - drawWristW / 2, r.cy - 50);
|
|
157
|
+
r.ctx.lineTo(r.cx + drawWristW / 2, r.cy - 50);
|
|
158
|
+
r.ctx.stroke();
|
|
159
|
+
r.ctx.beginPath();
|
|
160
|
+
r.ctx.moveTo(r.cx - drawWristW / 2, r.cy - 53);
|
|
161
|
+
r.ctx.lineTo(r.cx - drawWristW / 2, r.cy - 47);
|
|
162
|
+
r.ctx.moveTo(r.cx + drawWristW / 2, r.cy - 53);
|
|
163
|
+
r.ctx.lineTo(r.cx + drawWristW / 2, r.cy - 47);
|
|
164
|
+
r.ctx.stroke();
|
|
165
|
+
r.ctx.fillStyle = dimensionText;
|
|
166
|
+
r.ctx.font = '10px sans-serif';
|
|
167
|
+
r.ctx.textAlign = 'center';
|
|
168
|
+
const valText = r.unit === 'in' ? `${(r.wristW / 25.4).toFixed(2)} in` : `${(r.wristW / 10).toFixed(1)} cm`;
|
|
169
|
+
r.ctx.fillText(`${valText} ${r.ui.customLabel || 'Wrist'}`, r.cx, r.cy - 58);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
function drawWatchDim(r: RenderContext, drawL2l: number) {
|
|
173
|
+
const isOverhang = r.l2l > r.wristW;
|
|
174
|
+
const watchColor = isOverhang ? 'rgba(239, 68, 68, 0.8)' : 'rgba(244, 63, 94, 0.8)';
|
|
175
|
+
r.ctx.strokeStyle = watchColor;
|
|
176
|
+
r.ctx.beginPath();
|
|
177
|
+
r.ctx.moveTo(r.cx - drawL2l / 2, r.cy + 50);
|
|
178
|
+
r.ctx.lineTo(r.cx + drawL2l / 2, r.cy + 50);
|
|
179
|
+
r.ctx.stroke();
|
|
180
|
+
r.ctx.beginPath();
|
|
181
|
+
r.ctx.moveTo(r.cx - drawL2l / 2, r.cy + 47);
|
|
182
|
+
r.ctx.lineTo(r.cx - drawL2l / 2, r.cy + 53);
|
|
183
|
+
r.ctx.moveTo(r.cx + drawL2l / 2, r.cy + 47);
|
|
184
|
+
r.ctx.lineTo(r.cx + drawL2l / 2, r.cy + 53);
|
|
185
|
+
r.ctx.stroke();
|
|
186
|
+
r.ctx.fillStyle = watchColor;
|
|
187
|
+
const l2lText = r.unit === 'in' ? `${(r.l2l / 25.4).toFixed(2)} in` : `${(r.l2l / 10).toFixed(1)} cm`;
|
|
188
|
+
r.ctx.fillText(`${l2lText} L2L`, r.cx, r.cy + 62);
|
|
189
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
export function getRatioText(ratioClass: string, ui: Record<string, string>): string {
|
|
2
|
+
if (ratioClass === 'verdict-golden') return ui.verdictGolden || 'Golden Fit';
|
|
3
|
+
if (ratioClass === 'verdict-bold') return ui.verdictBold || 'Bold Fit';
|
|
4
|
+
if (ratioClass === 'verdict-oversized') return ui.verdictOversized || 'Oversized';
|
|
5
|
+
return ui.verdictVintage || 'Vintage/Classic';
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function getCoverageText(coverageClass: string, ui: Record<string, string>): string {
|
|
9
|
+
if (coverageClass === 'coverage-safe') return ui.coverageSafe || 'Safe Fit';
|
|
10
|
+
if (coverageClass === 'coverage-bold') return ui.coverageBold || 'Bold Fit';
|
|
11
|
+
return ui.coverageOverhang || 'Overhang Warning';
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function formatVerdict(title: string, desc: string): string {
|
|
15
|
+
return `<strong>${title}:</strong> ${desc}`;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function getGoldenVerdict(ui: Record<string, string>): string {
|
|
19
|
+
return formatVerdict(
|
|
20
|
+
ui.verdictGolden || 'Golden Ratio Fit',
|
|
21
|
+
ui.verdictDescGolden || 'Excellent aesthetic balance! The watch diameter is perfectly proportioned to your wrist circumference, following traditional horology guidelines.'
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function getBoldVerdict(ui: Record<string, string>): string {
|
|
26
|
+
return formatVerdict(
|
|
27
|
+
ui.verdictBold || 'Bold Fit',
|
|
28
|
+
ui.verdictDescBold || 'A modern, sporty presence. The watch occupies a significant portion of the wrist but fits well without looking disproportionately massive.'
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function getVintageVerdict(ui: Record<string, string>): string {
|
|
33
|
+
return formatVerdict(
|
|
34
|
+
ui.verdictVintage || 'Vintage/Classic Fit',
|
|
35
|
+
ui.verdictDescVintage || 'A understated, elegant look. Ideal for formal dress watches or vintage styles, offering excellent comfort and a discreet wrist profile.'
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function getRegularVerdictHtml(ratio: number, ui: Record<string, string>): string {
|
|
40
|
+
if (ratio >= 4.5 && ratio <= 5.0) {
|
|
41
|
+
return getGoldenVerdict(ui);
|
|
42
|
+
}
|
|
43
|
+
if (ratio >= 4.0 && ratio < 4.5) {
|
|
44
|
+
return getBoldVerdict(ui);
|
|
45
|
+
}
|
|
46
|
+
return getVintageVerdict(ui);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function getVerdictHtml(
|
|
50
|
+
coverage: number,
|
|
51
|
+
ratio: number,
|
|
52
|
+
ui: Record<string, string>
|
|
53
|
+
): string {
|
|
54
|
+
if (coverage > 100) {
|
|
55
|
+
return formatVerdict(
|
|
56
|
+
ui.coverageOverhang || 'Lug Overhang Warning',
|
|
57
|
+
ui.verdictDescOverhang || 'The watch lugs exceed your flat wrist width. This watch will likely feel unstable, slide around, and visually look too large.'
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
if (ratio < 4.0) {
|
|
61
|
+
return formatVerdict(
|
|
62
|
+
ui.verdictOversized || 'Oversized Fit',
|
|
63
|
+
ui.verdictDescOversized || 'The case diameter is very large relative to your wrist size. This creates a commanding modern presence but make sure the lugs feel comfortable.'
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
return getRegularVerdictHtml(ratio, ui);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export function formatWristValue(mm: number, unit: 'cm' | 'in'): string {
|
|
70
|
+
if (unit === 'in') {
|
|
71
|
+
return `${(mm / 25.4).toFixed(2)} in`;
|
|
72
|
+
}
|
|
73
|
+
return `${(mm / 10).toFixed(1)} cm`;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export function formatRecValue(mm: number, unit: 'cm' | 'in'): string {
|
|
77
|
+
return formatWristValue(mm, unit);
|
|
78
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import type { WristPresenceCalculatorUI } from '../entry';
|
|
3
|
+
import { bibliography } from '../bibliography';
|
|
4
|
+
|
|
5
|
+
export const content: ToolLocaleContent<WristPresenceCalculatorUI> = {
|
|
6
|
+
slug: 'uhrenpraesenz-rechner',
|
|
7
|
+
title: 'Uhren Handgelenkpräsenz & Größenrechner',
|
|
8
|
+
description: 'Berechnen Sie das Gehäuse-zu-Handgelenk-Verhältnis, die flache Handgelenkbreite und ermitteln Sie die ideale Uhrengröße für Ihr Handgelenk basierend auf ästhetischen Richtlinien.',
|
|
9
|
+
ui: {
|
|
10
|
+
title: 'HandgelenkmaĂźe',
|
|
11
|
+
wristCircumferenceLabel: 'Handgelenkumfang',
|
|
12
|
+
caseDiameterLabel: 'Gehäusedurchmesser',
|
|
13
|
+
lugToLugLabel: 'Steg-zu-Steg',
|
|
14
|
+
wristWidthLabel: 'Flache Handgelenkbreite',
|
|
15
|
+
autoEstimateWidthLabel: 'Flache Handgelenkbreite automatisch schätzen (30%)',
|
|
16
|
+
unitCm: 'CM',
|
|
17
|
+
unitInches: 'IN',
|
|
18
|
+
unitMm: 'MM',
|
|
19
|
+
fitAnalysisTitle: 'Handgelenkpassform-Analyse',
|
|
20
|
+
caseWristRatioLabel: 'Gehäuse-zu-Handgelenk-Verhältnis',
|
|
21
|
+
wristCoverageLabel: 'Handgelenkabdeckung',
|
|
22
|
+
verdictLabel: 'Ergebnis',
|
|
23
|
+
verdictOversized: 'Zu großes Gehäuse',
|
|
24
|
+
verdictBold: 'Mutige / Moderne Passform',
|
|
25
|
+
verdictGolden: 'Goldene / Klassische Passform',
|
|
26
|
+
verdictVintage: 'Vintage / Zu klein',
|
|
27
|
+
coverageSafe: 'Sichere Passform',
|
|
28
|
+
coverageBold: 'Mutige Passform',
|
|
29
|
+
coverageOverhang: 'Ăśberhang-Warnung',
|
|
30
|
+
sweetSpotTitle: 'Trageweite',
|
|
31
|
+
sweetSpotDesc: 'Der Sweet Spot steht fĂĽr das ausgewogenste Erscheinungsbild.',
|
|
32
|
+
minClassicLabel: 'Vintage / Klassische Passform',
|
|
33
|
+
sweetSpotLabel: 'Ästhetischer Sweet Spot',
|
|
34
|
+
maxBoldLabel: 'Modern / Mutige Passform',
|
|
35
|
+
maxLugToLugLabel: 'Max. empfohlener Steg-zu-Steg',
|
|
36
|
+
idealSizesTitle: 'Ideale Größenrichtlinien',
|
|
37
|
+
visualizerTitle: 'Live-Passform-Simulator',
|
|
38
|
+
wristWidthHelp: 'Schätzung basierend auf der Handgelenkform.',
|
|
39
|
+
estimatedLabel: 'geschätzt',
|
|
40
|
+
customLabel: 'Handgelenk',
|
|
41
|
+
},
|
|
42
|
+
seo: [
|
|
43
|
+
{ type: 'title', text: 'Die perfekte Uhrengröße finden: Der Proportions-Ratgeber', level: 2 },
|
|
44
|
+
{ type: 'paragraph', html: 'Die richtige Uhrengröße zu finden ist eine Kombination aus Mathematik, Geometrie und persönlichem Stil. In der Uhrmacherei bezeichnet man das Erscheinungsbild einer Uhr am Arm als <strong>Handgelenkpräsenz</strong>. Eine Uhr sollte ausgewogen wirken – weder mit unschönem Überhang dominieren noch wie ein winziger Punkt verschwinden. Um diese Balance zu erreichen, analysieren Sammler drei Hauptmerkmale: Gehäusedurchmesser, Steg-zu-Steg-Abstand und Handgelenkform.' },
|
|
45
|
+
{ type: 'title', text: 'Das Gehäuse-zu-Handgelenk-Verhältnis verstehen', level: 3 },
|
|
46
|
+
{ type: 'paragraph', html: 'Eine klassische Methode zur Beurteilung von Uhrenproportionen ist das Gehäuse-zu-Handgelenk-Verhältnis. Dazu teilt man den Handgelenkumfang in Millimetern durch den Gehäusedurchmesser. Verhältnisse zwischen <strong>4,5 und 5,0</strong> gelten als klassischer Sweet Spot. Verhältnisse von <strong>4,0 bis 4,5</strong> wirken mutig und modern. Über 5,0 entsteht ein Vintage-Dresswatches-Feeling, unter 4,0 wirkt die Uhr überdimensioniert.' },
|
|
47
|
+
{ type: 'title', text: 'Warum der Steg-zu-Steg-Abstand wichtiger ist als der Durchmesser', level: 3 },
|
|
48
|
+
{ type: 'paragraph', html: 'Obwohl der Gehäusedurchmesser im Vordergrund steht, ist der <strong>Steg-zu-Steg-Abstand</strong> (die senkrechte Länge von Stegspitze zu Stegspitze) der eigentliche Maßstab für eine gute Passform. Die goldene Regel lautet: Der Steg-zu-Steg-Abstand darf die flache Handgelenkbreite nicht überschreiten. Stehen die Stege über, gleitet die Uhr, es entsteht ein Spalt zwischen Band und Haut, und das optische Erscheinungsbild leidet.' },
|
|
49
|
+
{ type: 'title', text: 'Flache vs. runde Handgelenke: Größen je nach Anatomie', level: 3 },
|
|
50
|
+
{ type: 'paragraph', html: 'Der Handgelenkumfang erzählt nur einen Teil der Geschichte. Handgelenke mit gleichem Umfang können unterschiedliche Querschnittsformen haben: flach oder rund. Flache Handgelenke bieten eine breitere Auflagefläche und vertragen längere Steg-zu-Steg-Abstände. Runde Handgelenke sind oben schmaler und erfordern kürzere Steg-zu-Steg-Maße, um Überhang zu vermeiden.' },
|
|
51
|
+
],
|
|
52
|
+
faq: [
|
|
53
|
+
{
|
|
54
|
+
question: 'Was ist das ideale Gehäuse-zu-Handgelenk-Verhältnis?',
|
|
55
|
+
answer: 'Das ideale Verhältnis liegt zwischen 4,0 und 5,0. Ein Verhältnis von 4,5 gilt als klassischer uhrmacherischer Sweet Spot. Zwischen 4,0 und 4,5 entsteht eine moderne, auffällige Präsenz; über 5,0 eignet sich die Uhr eher für den Vintage-Dresswatches-Stil; unter 4,0 wirkt das Gehäuse überdimensioniert.',
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
question: 'Warum ist der Steg-zu-Steg-Abstand wichtiger als der Gehäusedurchmesser?',
|
|
59
|
+
answer: 'Der Gehäusedurchmesser misst nur die Breite des Zifferblatts. Der Steg-zu-Steg-Abstand bestimmt hingegen, wie weit die Uhr über das Handgelenk reicht. Überschreitet er die flache Handgelenkbreite, hängen die Stege über, das Band fällt senkrecht ab, und die Uhr wirkt instabil und unverhältnismäßig groß.',
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
question: 'Wie beeinflussen flache und runde Handgelenke die Passform?',
|
|
63
|
+
answer: 'Zwei Handgelenke mit gleichem Umfang (z. B. 17 cm) können Uhren sehr unterschiedlich tragen. Ein flaches Handgelenk hat eine breitere Auflagefläche und verträgt längere Steg-zu-Steg-Abstände ohne Überhang. Ein rundes Handgelenk ist oben schmaler und braucht kürzere Steg-zu-Steg-Maße für eine stabile Passform.',
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
question: 'Wie verändern Dicke und Lünettengröße das optische Erscheinungsbild einer Uhr?',
|
|
67
|
+
answer: 'Uhren mit sehr schmaler Lünette (wie Dresswatches) haben eine größere Zifferblattfläche und wirken am Handgelenk größer als ihr tatsächlicher Durchmesser vermuten lässt. Taucheruhren mit breiter Drehlünette haben ein kleineres Zifferblatt und tragen dadurch kompakter. Uhren mit mehr als 13 mm Höhe wirken zudem wuchtiger und optisch schwerer.',
|
|
68
|
+
},
|
|
69
|
+
],
|
|
70
|
+
bibliography,
|
|
71
|
+
howTo: [
|
|
72
|
+
{
|
|
73
|
+
name: 'Handgelenk messen',
|
|
74
|
+
text: 'Legen Sie ein flexibles MaĂźband um Ihren Handgelenkknochen, um den Umfang in cm oder Zoll zu ermitteln.',
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
name: 'UhrenmaĂźe eingeben',
|
|
78
|
+
text: 'Tragen Sie den Gehäusedurchmesser und den Steg-zu-Steg-Abstand der zu prüfenden Uhr ein.',
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
name: 'Passform und Live-Simulator analysieren',
|
|
82
|
+
text: 'Prüfen Sie das Gehäuse-zu-Handgelenk-Verhältnis, die Steg-Überhang-Warnung und sehen Sie das Echtzeit-Diagramm.',
|
|
83
|
+
},
|
|
84
|
+
],
|
|
85
|
+
schemas: [
|
|
86
|
+
{
|
|
87
|
+
'@context': 'https://schema.org',
|
|
88
|
+
'@type': 'FAQPage',
|
|
89
|
+
'mainEntity': [
|
|
90
|
+
{
|
|
91
|
+
'@type': 'Question',
|
|
92
|
+
'name': 'Was ist das ideale Gehäuse-zu-Handgelenk-Verhältnis?',
|
|
93
|
+
'acceptedAnswer': {
|
|
94
|
+
'@type': 'Answer',
|
|
95
|
+
'text': 'Das ideale Verhältnis liegt zwischen 4,0 und 5,0. Ein Verhältnis von 4,5 gilt als klassischer uhrmacherischer Sweet Spot. Zwischen 4,0 und 4,5 entsteht eine moderne, auffällige Präsenz; über 5,0 eignet sich die Uhr eher für den Vintage-Dresswatches-Stil; unter 4,0 wirkt das Gehäuse überdimensioniert.'
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
'@type': 'Question',
|
|
100
|
+
'name': 'Warum ist der Steg-zu-Steg-Abstand wichtiger als der Gehäusedurchmesser?',
|
|
101
|
+
'acceptedAnswer': {
|
|
102
|
+
'@type': 'Answer',
|
|
103
|
+
'text': 'Der Gehäusedurchmesser misst nur die Breite des Zifferblatts. Der Steg-zu-Steg-Abstand bestimmt hingegen, wie weit die Uhr über das Handgelenk reicht. Überschreitet er die flache Handgelenkbreite, hängen die Stege über, das Band fällt senkrecht ab, und die Uhr wirkt instabil und unverhältnismäßig groß.'
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
]
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
'@context': 'https://schema.org',
|
|
110
|
+
'@type': 'SoftwareApplication',
|
|
111
|
+
'name': 'Uhren-Handgelenkpräsenz & Größenrechner',
|
|
112
|
+
'operatingSystem': 'All',
|
|
113
|
+
'applicationCategory': 'UtilitiesApplication',
|
|
114
|
+
'browserRequirements': 'Requires HTML5. Requires JavaScript.'
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
'@context': 'https://schema.org',
|
|
118
|
+
'@type': 'HowTo',
|
|
119
|
+
'name': 'Wie man die perfekte Uhrengröße bestimmt',
|
|
120
|
+
'step': [
|
|
121
|
+
{
|
|
122
|
+
'@type': 'HowToStep',
|
|
123
|
+
'name': 'Handgelenk messen',
|
|
124
|
+
'text': 'Legen Sie ein flexibles MaĂźband um Ihren Handgelenkknochen, um den Umfang in cm oder Zoll zu ermitteln.'
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
'@type': 'HowToStep',
|
|
128
|
+
'name': 'UhrenmaĂźe eingeben',
|
|
129
|
+
'text': 'Tragen Sie den Gehäusedurchmesser und den Steg-zu-Steg-Abstand der zu prüfenden Uhr ein.'
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
'@type': 'HowToStep',
|
|
133
|
+
'name': 'Passform und Live-Simulator analysieren',
|
|
134
|
+
'text': 'Prüfen Sie das Gehäuse-zu-Handgelenk-Verhältnis, die Steg-Überhang-Warnung und sehen Sie das Echtzeit-Diagramm.'
|
|
135
|
+
}
|
|
136
|
+
]
|
|
137
|
+
}
|
|
138
|
+
]
|
|
139
|
+
};
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import type { WristPresenceCalculatorUI } from '../entry';
|
|
3
|
+
import { bibliography } from '../bibliography';
|
|
4
|
+
|
|
5
|
+
export const content: ToolLocaleContent<WristPresenceCalculatorUI> = {
|
|
6
|
+
slug: 'wrist-presence-calculator',
|
|
7
|
+
title: 'Watch Wrist Presence & Sizing Calculator',
|
|
8
|
+
description: 'Calculate the case-to-wrist ratio, flat wrist width coverage, and determine the ideal watch size for your wrist based on aesthetic guidelines.',
|
|
9
|
+
ui: {
|
|
10
|
+
title: 'Wrist Sizing Settings',
|
|
11
|
+
wristCircumferenceLabel: 'Wrist Circumference',
|
|
12
|
+
caseDiameterLabel: 'Case Diameter',
|
|
13
|
+
lugToLugLabel: 'Lug-to-Lug',
|
|
14
|
+
wristWidthLabel: 'Flat Wrist Width',
|
|
15
|
+
autoEstimateWidthLabel: 'Auto-estimate flat wrist width (30%)',
|
|
16
|
+
unitCm: 'CM',
|
|
17
|
+
unitInches: 'IN',
|
|
18
|
+
unitMm: 'MM',
|
|
19
|
+
fitAnalysisTitle: 'Wrist Fit Assessment',
|
|
20
|
+
caseWristRatioLabel: 'Case-to-Wrist Ratio',
|
|
21
|
+
wristCoverageLabel: 'Wrist Coverage',
|
|
22
|
+
verdictLabel: 'Verdict',
|
|
23
|
+
verdictOversized: 'Oversized Fit',
|
|
24
|
+
verdictBold: 'Bold / Modern Fit',
|
|
25
|
+
verdictGolden: 'Golden / Classic Fit',
|
|
26
|
+
verdictVintage: 'Vintage / Undersized',
|
|
27
|
+
coverageSafe: 'Safe Fit',
|
|
28
|
+
coverageBold: 'Bold Fit',
|
|
29
|
+
coverageOverhang: 'Overhang Warning',
|
|
30
|
+
sweetSpotTitle: 'Fit Style',
|
|
31
|
+
sweetSpotDesc: 'The sweet spot represents the most balanced visual appearance.',
|
|
32
|
+
minClassicLabel: 'Vintage / Classic Fit',
|
|
33
|
+
sweetSpotLabel: 'Aesthetic Sweet Spot',
|
|
34
|
+
maxBoldLabel: 'Modern / Bold Fit',
|
|
35
|
+
maxLugToLugLabel: 'Max Recommended Lug-to-Lug',
|
|
36
|
+
idealSizesTitle: 'Ideal Sizing Guidelines',
|
|
37
|
+
visualizerTitle: 'Live Fit Simulator',
|
|
38
|
+
wristWidthHelp: 'Estimated based on wrist shape.',
|
|
39
|
+
estimatedLabel: 'estimated',
|
|
40
|
+
customLabel: 'Wrist',
|
|
41
|
+
},
|
|
42
|
+
seo: [
|
|
43
|
+
{ type: 'title', text: 'How to Choose the Perfect Watch Size: The Proportional Fit Guide', level: 2 },
|
|
44
|
+
{ type: 'paragraph', html: 'Finding the right watch size is a blend of mathematics, geometry, and personal style. In horology, how a timepiece sits on your arm is called <strong>wrist presence</strong>. A watch should look balanced—neither dominating your arm with unsightly overhang nor disappearing like a tiny speck. To achieve this balance, watch collectors analyze three main metrics: case diameter, lug-to-lug distance, and wrist shape.' },
|
|
45
|
+
{ type: 'title', text: 'Understanding the Case-to-Wrist Sizing Ratio', level: 3 },
|
|
46
|
+
{ type: 'paragraph', html: 'A traditional method to gauge watch proportions is the case-to-wrist ratio. By converting your wrist circumference to millimeters and dividing it by the watch\'s case diameter, you get a ratio. Ratios between <strong>4.5 and 5.0</strong> represent the classic sweet spot. Ratios from <strong>4.0 to 4.5</strong> create a bold, sporty modern look. Ratios above 5.0 offer a vintage dress watch aesthetic, while ratios below 4.0 are considered oversized.' },
|
|
47
|
+
{ type: 'title', text: 'Why Lug-to-Lug and Flat Wrist Width Define the Real Fit', level: 3 },
|
|
48
|
+
{ type: 'paragraph', html: 'While case diameter gets all the attention, <strong>lug-to-lug distance</strong> (the vertical length from top lug tips to bottom lug tips) is the true test of fit. The golden rule of watch sizing is that the lug-to-lug distance should never exceed the flat width of your wrist. If the lugs extend past your wrist edges, it creates a lug overhang. This results in the watch sliding around, a gap between the strap and your skin, and a poor visual appearance.' },
|
|
49
|
+
{ type: 'title', text: 'Flat vs. Round Wrists: Sizing for Your Specific Anatomy', level: 3 },
|
|
50
|
+
{ type: 'paragraph', html: 'Wrist circumference only tells part of the story. Wrists with identical circumferences can have different cross-sectional shapes: flat or round. Flat wrists have a wider top surface, meaning they can wear watches with longer lug-to-lug spans safely. Round wrists are more cylindrical, meaning they have a narrower flat top surface and require shorter lug-to-lug distances to avoid overhang.' },
|
|
51
|
+
],
|
|
52
|
+
faq: [
|
|
53
|
+
{
|
|
54
|
+
question: 'What is the ideal watch case-to-wrist ratio?',
|
|
55
|
+
answer: 'The ideal case-to-wrist ratio is between 4.0 and 5.0. Divided by wrist circumference, a ratio of 4.5 represents the traditional horology sweet spot. A ratio of 4.0 to 4.5 offers a modern, bold wrist presence, while ratios above 5.0 suit vintage dress watches, and ratios below 4.0 tend to look oversized.',
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
question: 'Why does watch lug-to-lug distance matter more than case diameter?',
|
|
59
|
+
answer: 'Case diameter only measures the width of the watch face, but lug-to-lug defines the total length of the watch across your wrist. If the lug-to-lug length exceeds your flat wrist width, the lugs will overhang, causing the strap to drape vertically. This makes the watch look unstable and disproportionately large.',
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
question: 'How do flat vs. round wrists affect watch sizing and fit?',
|
|
63
|
+
answer: 'Two wrists with the same circumference (e.g., 17 cm) can wear watches differently. A flat wrist has a wider top surface, allowing it to accommodate longer lug-to-lug watches without overhang. A round wrist is narrower on top, requiring shorter lug-to-lug lengths for a stable fit.',
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
question: 'How do thickness and bezel width change a watch\'s visual size?',
|
|
67
|
+
answer: 'Watches with very thin bezels (like dress watches) have a larger dial surface area and look larger on the wrist than their actual diameter. Dive watches with thick rotating bezels have a smaller dial, making them wear smaller. Similarly, watches thicker than 13mm appear chunkier and have greater visual weight.',
|
|
68
|
+
},
|
|
69
|
+
],
|
|
70
|
+
bibliography,
|
|
71
|
+
howTo: [
|
|
72
|
+
{
|
|
73
|
+
name: 'Measure Your Wrist',
|
|
74
|
+
text: 'Wrap a flexible measuring tape around your wrist bone to find your circumference in cm or inches.',
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
name: 'Enter Watch Dimensions',
|
|
78
|
+
text: 'Input the case diameter and the lug-to-lug distance of the watch you are evaluating.',
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
name: 'Analyze Fit and Visual Simulator',
|
|
82
|
+
text: 'Check the Case-to-Wrist ratio, check the lug overhang alert, and view the real-time simulation diagram.',
|
|
83
|
+
},
|
|
84
|
+
],
|
|
85
|
+
schemas: [
|
|
86
|
+
{
|
|
87
|
+
'@context': 'https://schema.org',
|
|
88
|
+
'@type': 'FAQPage',
|
|
89
|
+
'mainEntity': [
|
|
90
|
+
{
|
|
91
|
+
'@type': 'Question',
|
|
92
|
+
'name': 'What is the ideal watch case-to-wrist ratio?',
|
|
93
|
+
'acceptedAnswer': {
|
|
94
|
+
'@type': 'Answer',
|
|
95
|
+
'text': 'The ideal case-to-wrist ratio is between 4.0 and 5.0. Divided by wrist circumference, a ratio of 4.5 represents the traditional horology sweet spot. A ratio of 4.0 to 4.5 offers a modern, bold wrist presence, while ratios above 5.0 suit vintage dress watches, and ratios below 4.0 tend to look oversized.'
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
'@type': 'Question',
|
|
100
|
+
'name': 'Why does watch lug-to-lug distance matter more than case diameter?',
|
|
101
|
+
'acceptedAnswer': {
|
|
102
|
+
'@type': 'Answer',
|
|
103
|
+
'text': 'Case diameter only measures the width of the watch face, but lug-to-lug defines the total length of the watch across your wrist. If the lug-to-lug length exceeds your flat wrist width, the lugs will overhang, causing the strap to drape vertically. This makes the watch look unstable and disproportionately large.'
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
'@type': 'Question',
|
|
108
|
+
'name': 'How do flat vs. round wrists affect watch sizing and fit?',
|
|
109
|
+
'acceptedAnswer': {
|
|
110
|
+
'@type': 'Answer',
|
|
111
|
+
'text': 'Two wrists with the same circumference (e.g., 17 cm) can wear watches differently. A flat wrist has a wider top surface, allowing it to accommodate longer lug-to-lug watches without overhang. A round wrist is narrower on top, requiring shorter lug-to-lug lengths for a stable fit.'
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
'@type': 'Question',
|
|
116
|
+
'name': 'How do thickness and bezel width change a watch\'s visual size?',
|
|
117
|
+
'acceptedAnswer': {
|
|
118
|
+
'@type': 'Answer',
|
|
119
|
+
'text': 'Watches with very thin bezels (like dress watches) have a larger dial surface area and look larger on the wrist than their actual diameter. Dive watches with thick rotating bezels have a smaller dial, making them wear smaller. Similarly, watches thicker than 13mm appear chunkier and have greater visual weight.'
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
]
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
'@context': 'https://schema.org',
|
|
126
|
+
'@type': 'SoftwareApplication',
|
|
127
|
+
'name': 'Watch Wrist Presence & Sizing Calculator',
|
|
128
|
+
'operatingSystem': 'All',
|
|
129
|
+
'applicationCategory': 'UtilitiesApplication',
|
|
130
|
+
'browserRequirements': 'Requires HTML5. Requires JavaScript.'
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
'@context': 'https://schema.org',
|
|
134
|
+
'@type': 'HowTo',
|
|
135
|
+
'name': 'How to Determine Perfect Watch Size',
|
|
136
|
+
'step': [
|
|
137
|
+
{
|
|
138
|
+
'@type': 'HowToStep',
|
|
139
|
+
'name': 'Measure Your Wrist',
|
|
140
|
+
'text': 'Wrap a flexible measuring tape around your wrist bone to find your circumference in cm or inches.'
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
'@type': 'HowToStep',
|
|
144
|
+
'name': 'Enter Watch Dimensions',
|
|
145
|
+
'text': 'Input the case diameter and the lug-to-lug distance of the watch you are evaluating.'
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
'@type': 'HowToStep',
|
|
149
|
+
'name': 'Analyze Fit and Visual Simulator',
|
|
150
|
+
'text': 'Check the Case-to-Wrist ratio, check the lug overhang alert, and view the real-time simulation diagram.'
|
|
151
|
+
}
|
|
152
|
+
]
|
|
153
|
+
}
|
|
154
|
+
]
|
|
155
|
+
};
|