@jjlmoya/utils-chrono 1.18.0 → 1.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/category/index.ts +4 -0
- package/src/entries.ts +7 -1
- package/src/index.ts +2 -0
- package/src/tests/locale_completeness.test.ts +1 -1
- package/src/tests/tool_validation.test.ts +1 -1
- package/src/tool/altitude-watch-accuracy-estimator/altitude-watch-accuracy-estimator.css +488 -0
- package/src/tool/altitude-watch-accuracy-estimator/bibliography.astro +16 -0
- package/src/tool/altitude-watch-accuracy-estimator/bibliography.ts +12 -0
- package/src/tool/altitude-watch-accuracy-estimator/client.ts +167 -0
- package/src/tool/altitude-watch-accuracy-estimator/component.astro +15 -0
- package/src/tool/altitude-watch-accuracy-estimator/components/AltitudeScene.astro +138 -0
- package/src/tool/altitude-watch-accuracy-estimator/entry.ts +61 -0
- package/src/tool/altitude-watch-accuracy-estimator/helpers.ts +49 -0
- package/src/tool/altitude-watch-accuracy-estimator/i18n/de.ts +101 -0
- package/src/tool/altitude-watch-accuracy-estimator/i18n/en.ts +101 -0
- package/src/tool/altitude-watch-accuracy-estimator/i18n/es.ts +101 -0
- package/src/tool/altitude-watch-accuracy-estimator/i18n/fr.ts +101 -0
- package/src/tool/altitude-watch-accuracy-estimator/i18n/id.ts +101 -0
- package/src/tool/altitude-watch-accuracy-estimator/i18n/it.ts +101 -0
- package/src/tool/altitude-watch-accuracy-estimator/i18n/ja.ts +101 -0
- package/src/tool/altitude-watch-accuracy-estimator/i18n/ko.ts +101 -0
- package/src/tool/altitude-watch-accuracy-estimator/i18n/nl.ts +101 -0
- package/src/tool/altitude-watch-accuracy-estimator/i18n/pl.ts +101 -0
- package/src/tool/altitude-watch-accuracy-estimator/i18n/pt.ts +101 -0
- package/src/tool/altitude-watch-accuracy-estimator/i18n/ru.ts +101 -0
- package/src/tool/altitude-watch-accuracy-estimator/i18n/sv.ts +101 -0
- package/src/tool/altitude-watch-accuracy-estimator/i18n/tr.ts +101 -0
- package/src/tool/altitude-watch-accuracy-estimator/i18n/zh.ts +101 -0
- package/src/tool/altitude-watch-accuracy-estimator/index.ts +11 -0
- package/src/tool/altitude-watch-accuracy-estimator/logic.ts +61 -0
- package/src/tool/altitude-watch-accuracy-estimator/seo.astro +16 -0
- package/src/tool/mainspring-finder/bibliography.astro +16 -0
- package/src/tool/mainspring-finder/bibliography.ts +16 -0
- package/src/tool/mainspring-finder/client.ts +89 -0
- package/src/tool/mainspring-finder/component.astro +72 -0
- package/src/tool/mainspring-finder/entry.ts +50 -0
- package/src/tool/mainspring-finder/helpers.ts +52 -0
- package/src/tool/mainspring-finder/i18n/de.ts +212 -0
- package/src/tool/mainspring-finder/i18n/en.ts +212 -0
- package/src/tool/mainspring-finder/i18n/es.ts +212 -0
- package/src/tool/mainspring-finder/i18n/fr.ts +212 -0
- package/src/tool/mainspring-finder/i18n/id.ts +212 -0
- package/src/tool/mainspring-finder/i18n/it.ts +212 -0
- package/src/tool/mainspring-finder/i18n/ja.ts +212 -0
- package/src/tool/mainspring-finder/i18n/ko.ts +212 -0
- package/src/tool/mainspring-finder/i18n/nl.ts +212 -0
- package/src/tool/mainspring-finder/i18n/pl.ts +212 -0
- package/src/tool/mainspring-finder/i18n/pt.ts +212 -0
- package/src/tool/mainspring-finder/i18n/ru.ts +212 -0
- package/src/tool/mainspring-finder/i18n/sv.ts +212 -0
- package/src/tool/mainspring-finder/i18n/tr.ts +212 -0
- package/src/tool/mainspring-finder/i18n/zh.ts +212 -0
- package/src/tool/mainspring-finder/index.ts +11 -0
- package/src/tool/mainspring-finder/mainspring-finder.css +242 -0
- package/src/tool/mainspring-finder/seo.astro +16 -0
- package/src/tools.ts +4 -0
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import type { MainspringFinderUI } from '../entry';
|
|
3
|
+
import { bibliography } from '../bibliography';
|
|
4
|
+
|
|
5
|
+
export const content: ToolLocaleContent<MainspringFinderUI> = {
|
|
6
|
+
slug: 'mainspring-finder',
|
|
7
|
+
title: '发条计算器',
|
|
8
|
+
description: '根据发条盒尺寸计算古董机芯发条尺寸。',
|
|
9
|
+
ui: {
|
|
10
|
+
title: '发条计算器',
|
|
11
|
+
barrelLabel: '发条盒内径',
|
|
12
|
+
arborLabel: '条轴外径',
|
|
13
|
+
heightLabel: '发条盒高度',
|
|
14
|
+
turnsLabel: '圈数',
|
|
15
|
+
calculate: '计算',
|
|
16
|
+
resultThickness: '厚度',
|
|
17
|
+
resultHeight: '高度',
|
|
18
|
+
resultLength: '长度',
|
|
19
|
+
resultStrength: '强度',
|
|
20
|
+
strengthWeak: '轻',
|
|
21
|
+
strengthMedium: '中',
|
|
22
|
+
strengthStrong: '强',
|
|
23
|
+
commercial: '商业规格',
|
|
24
|
+
unitLabel: '单位',
|
|
25
|
+
mm: 'mm',
|
|
26
|
+
inch: 'in',
|
|
27
|
+
step1: '用游标卡尺测量发条盒内径、条轴外径和内高。',
|
|
28
|
+
step2: '设定预期的上链圈数(手动5-8圈,自动6-10圈)。',
|
|
29
|
+
step3: '切换mm/in选择您偏好的单位系统。',
|
|
30
|
+
tipTitle: '提示',
|
|
31
|
+
tipContent: '务必对照厂家规格验证计算尺寸。订购前请交叉参考供应商目录。',
|
|
32
|
+
},
|
|
33
|
+
seo: [
|
|
34
|
+
{ type: 'title', text: '发条计算器 - 为手表机芯计算弹簧尺寸', level: 2 },
|
|
35
|
+
{
|
|
36
|
+
type: 'stats',
|
|
37
|
+
items: [
|
|
38
|
+
{ value: '0.08-0.18 mm', label: '典型发条厚度' },
|
|
39
|
+
{ value: '5-10 turns', label: '标准上链范围' },
|
|
40
|
+
{ value: '150-450 mm', label: '常见发条长度' },
|
|
41
|
+
],
|
|
42
|
+
columns: 3,
|
|
43
|
+
},
|
|
44
|
+
{ type: 'paragraph', html: '修复古董机芯通常首先要找到正确的发条。<strong>发条计算器</strong>可根据发条盒几何尺寸帮助您计算发条的理论尺寸。输入发条盒内径、条轴直径、发条盒高度和预期上链圈数后,工具将计算出弹簧的厚度、高度和长度。结果还以公制和英制单位的近似商业规格显示,方便交叉参考供应商目录。' },
|
|
45
|
+
{ type: 'title', text: '发条尺寸如何计算', level: 3 },
|
|
46
|
+
{ type: 'paragraph', html: '发条占据了发条盒壁与条轴之间的环形空间。<strong>弹簧厚度</strong>估算为<strong>(发条盒内径 - 条轴外径)/(2倍圈数 + 1.5)</strong>,其中额外的1.5圈考虑了弹簧端部固定和弹簧自身所占的空间。<strong>弹簧长度</strong>遵循<strong>L = pi x 圈数 x(发条盒内径 + 条轴外径)/ 2</strong>,得出展开后的总长度。<strong>弹簧高度</strong>等于发条盒内高减去微小间隙(通常为0.1 mm),以防止摩擦发条盒盖。' },
|
|
47
|
+
{ type: 'title', text: '如何测量发条盒以选择发条', level: 3 },
|
|
48
|
+
{
|
|
49
|
+
type: 'glossary',
|
|
50
|
+
items: [
|
|
51
|
+
{ term: '发条盒内径', definition: '用卡尺测量的发条盒内部直径。这是发条可以占据的最大圆。典型范围:8-30 mm。' },
|
|
52
|
+
{ term: '条轴直径', definition: '条轴最宽处的直径,发条内圈在此处钩挂。较小的条轴允许在同一发条盒内使用更长的发条。' },
|
|
53
|
+
{ term: '发条盒高度', definition: '发条盒的内部高度。发条高度必须略小(0.05-0.15 mm),以便自由旋转而不摩擦盒盖。' },
|
|
54
|
+
{ term: '上链表圈数', definition: '机芯提供的完整上链表圈数。手动上链机芯通常提供5-8圈,自动机芯6-10圈。' },
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
{ type: 'title', text: '发条强度及其对机芯的意义', level: 3 },
|
|
58
|
+
{ type: 'paragraph', html: '<strong>弹簧厚度</strong>是决定传递给齿轮系扭矩的主要因素。较厚的弹簧(大于0.14 mm)提供高扭矩,适合带有复杂功能的机芯,如计时码表或报时机构。中等弹簧(0.10-0.14 mm)适用于大多数仅显示时间和日期的常规机芯。薄弹簧(低于0.10 mm)用于小型女装机芯或超薄机芯。有原厂规格时务必匹配;过强的弹簧可能损坏条轴或齿轮系轴尖。' },
|
|
59
|
+
{
|
|
60
|
+
type: 'diagnostic',
|
|
61
|
+
variant: 'warning',
|
|
62
|
+
title: '使用错误的发条可能损坏您的机芯',
|
|
63
|
+
html: '安装<strong>过厚</strong>的弹簧会增加超出设计极限的摩擦和扭矩,可能磨损条轴孔、弯曲中心轮轴尖,甚至导致发条盒破裂。<strong>过薄</strong>的弹簧则无法提供足够的振幅,导致手表走慢或在达到满链前停止。订购前务必交叉参考计算尺寸与已知供应商目录。',
|
|
64
|
+
},
|
|
65
|
+
{ type: 'title', text: '商业发条尺寸系统', level: 3 },
|
|
66
|
+
{ type: 'paragraph', html: '发条供应商按<strong>长度 x 高度 x 厚度</strong>(毫米)对弹簧进行分类。常见的公制规格遵循General Resources或GR系统。英制系统仍被一些美国和英国供应商使用。本工具同时显示两种系统,无论供应商如何,您都可以搜索目录。当找不到精确的计算尺寸时,选择高度完全匹配、厚度误差在0.005 mm以内的最接近商业规格,然后从相同高度/厚度系列中选择调整长度。' },
|
|
67
|
+
{ type: 'title', text: '古董机芯注意事项', level: 3 },
|
|
68
|
+
{
|
|
69
|
+
type: 'list',
|
|
70
|
+
items: [
|
|
71
|
+
'<strong>瑞士机芯(ETA、FHF、AS、Unitas)</strong> - 在GR系统中有完善记录。大多数有已知的发条编号。',
|
|
72
|
+
'<strong>法国机芯(LIP、France Ebauches)</strong> - 常使用非标准发条盒比例。请仔细测量。',
|
|
73
|
+
'<strong>美国机芯(Waltham、Elgin、Illinois)</strong> - 英制系统。使用英制输出交叉参考。',
|
|
74
|
+
'<strong>日本机芯(Seiko、Citizen、Miyota)</strong> - 公制系统,1960年后机芯的目录覆盖良好。',
|
|
75
|
+
'<strong>中国机芯(Sea-Gull、DG、Tongji)</strong> - 常仿制瑞士设计。通常适用瑞士GR编号。',
|
|
76
|
+
],
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
type: 'summary',
|
|
80
|
+
title: '发条选择要点总结',
|
|
81
|
+
items: [
|
|
82
|
+
'用精密卡尺准确测量发条盒内径、条轴外径和发条盒高度',
|
|
83
|
+
'将计算尺寸作为起点,而非绝对规格',
|
|
84
|
+
'交叉参考厂家技术资料或已知供应商目录',
|
|
85
|
+
'发条高度精确匹配发条盒高度减去0.05-0.15 mm间隙',
|
|
86
|
+
'厚度与计算值的误差控制在0.005 mm以内以获得最佳性能',
|
|
87
|
+
'验证发条长度足以满足预期的上链表圈数',
|
|
88
|
+
],
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
faq: [
|
|
92
|
+
{
|
|
93
|
+
question: '计算出的发条尺寸有多准确?',
|
|
94
|
+
answer: '计算基于标准制表公式,假设理想发条盒几何结构。由于制造公差、弹簧端部配置(撑头、眼孔或T型端)以及特定合金的不同,实际尺寸可能有5-10%的偏差。始终将计算值作为强有力的参考,但订购前请交叉参考厂家数据表或商业供应商目录。',
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
question: '如果找不到精确的商业规格怎么办?',
|
|
98
|
+
answer: '当找不到精确尺寸时,优先匹配发条高度,其次是厚度误差在0.005 mm以内。长度可以从相同高度和厚度系列中选择不同的弹簧进行调整。如果发条盒有足够空间,稍长的弹簧也可以工作,但较短的弹簧会减少动力储备。',
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
question: '如何在不拆下发条的情况下测量发条盒尺寸?',
|
|
102
|
+
answer: '如果发条盒仍装有旧发条,可以从外侧测量发条盒外径(然后减去壁厚,通常为0.2-0.4 mm)和整体高度(然后减去盒盖厚度)。为获得最精确的结果,请在测量前拆下旧发条并清洁发条盒。',
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
question: '撑头端和眼孔端发条有什么区别?',
|
|
106
|
+
answer: '撑头端(也称为T型端)有一个小型T形凸片钩入发条盒壁。大多数现代瑞士和日本机芯使用此类型。眼孔端有一个小孔套在条轴的销钉上。本工具仅计算发条带材尺寸;您必须确认端部类型与您的发条盒匹配后再订购。',
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
question: '此工具可用于计时码表或自动机芯吗?',
|
|
110
|
+
answer: '可以,但请注意自动机芯通常具有更高的上链圈数(8-10圈),可能需要稍薄的弹簧以容纳额外的上链模块。计时码表机芯通常需要更厚的弹簧来驱动计时机构。相应调整圈数值并对照厂家规格验证。',
|
|
111
|
+
},
|
|
112
|
+
],
|
|
113
|
+
bibliography,
|
|
114
|
+
howTo: [
|
|
115
|
+
{
|
|
116
|
+
name: '测量发条盒内径',
|
|
117
|
+
text: '使用精密卡尺测量发条盒内径。在两个相差90度的位置测量并取平均值。以毫米为单位记录结果。',
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
name: '测量条轴直径',
|
|
121
|
+
text: '测量条轴最宽处的直径,即发条内圈附着点。此位置通常在条轴中心附近,而非方形端。',
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
name: '测量发条盒内高',
|
|
125
|
+
text: '测量发条盒从底部到顶部边缘的深度。如果盒盖可拆卸,将盒盖厚度纳入测量。发条高度约为少0.1 mm。',
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
name: '设定上链表圈数',
|
|
129
|
+
text: '确定发条完全上紧时的完整圈数。手动上链机芯通常为5-8圈。自动机芯可能有6-10圈。如有规格表请查询确认。',
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
name: '读取计算尺寸',
|
|
133
|
+
text: '工具显示推荐的弹簧厚度、高度和长度。同时估算弹簧强度类别,并分别以公制和英制单位提供商业等效规格。',
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
name: '交叉参考目录',
|
|
137
|
+
text: '使用显示的商业规格搜索供应商目录。将公制或英制尺寸输入Cousins UK、Jules Borel或您偏好的供应商。如果找不到精确尺寸,请调整搜索条件。',
|
|
138
|
+
},
|
|
139
|
+
],
|
|
140
|
+
schemas: [
|
|
141
|
+
{
|
|
142
|
+
'@context': 'https://schema.org',
|
|
143
|
+
'@type': 'FAQPage',
|
|
144
|
+
'mainEntity': [
|
|
145
|
+
{
|
|
146
|
+
'@type': 'Question',
|
|
147
|
+
'name': '计算出的发条尺寸有多准确?',
|
|
148
|
+
'acceptedAnswer': { '@type': 'Answer', 'text': '计算基于标准制表公式,假设理想发条盒几何结构。实际尺寸可能有5-10%的偏差。订购前请交叉参考厂家数据表或商业目录。' },
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
'@type': 'Question',
|
|
152
|
+
'name': '如果找不到精确的商业规格怎么办?',
|
|
153
|
+
'acceptedAnswer': { '@type': 'Answer', 'text': '优先匹配发条高度,其次是厚度误差在0.005 mm以内。从相同高度/厚度系列中调整长度。' },
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
'@type': 'Question',
|
|
157
|
+
'name': '如何在不拆下发条的情况下测量发条盒尺寸?',
|
|
158
|
+
'acceptedAnswer': { '@type': 'Answer', 'text': '测量发条盒外径并减去壁厚(0.2-0.4 mm)。为获得最佳结果,请先拆下旧发条。' },
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
'@type': 'Question',
|
|
162
|
+
'name': '撑头端和眼孔端有什么区别?',
|
|
163
|
+
'acceptedAnswer': { '@type': 'Answer', 'text': '撑头端(T型端)钩入发条盒壁。眼孔端有一个孔套在条轴销钉上。现代瑞士/日本机芯使用撑头端。' },
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
'@type': 'Question',
|
|
167
|
+
'name': '此工具可用于计时码表或自动机芯吗?',
|
|
168
|
+
'acceptedAnswer': { '@type': 'Answer', 'text': '可以。自动机芯通常需要更多圈数(8-10圈)和更薄的弹簧。计时码表需要更厚的弹簧。调整圈数并验证。' },
|
|
169
|
+
},
|
|
170
|
+
],
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
'@context': 'https://schema.org',
|
|
174
|
+
'@type': 'SoftwareApplication',
|
|
175
|
+
'name': '发条计算器',
|
|
176
|
+
'operatingSystem': 'All',
|
|
177
|
+
'applicationCategory': 'UtilitiesApplication',
|
|
178
|
+
'applicationSubCategory': 'Watch Mainspring Calculator',
|
|
179
|
+
'description': '根据发条盒尺寸计算古董机芯发条的理论尺寸。',
|
|
180
|
+
'softwareVersion': '1.0',
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
'@context': 'https://schema.org',
|
|
184
|
+
'@type': 'TechArticle',
|
|
185
|
+
'name': '手表发条尺寸计算',
|
|
186
|
+
'proficiencyLevel': 'Intermediate',
|
|
187
|
+
'abstract': '了解如何根据发条盒内径、条轴尺寸和上链表圈数计算发条尺寸。',
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
'@context': 'https://schema.org',
|
|
191
|
+
'@type': 'HowTo',
|
|
192
|
+
'name': '如何找到正确的发条',
|
|
193
|
+
'description': '测量手表发条盒并计算正确发条尺寸的分步指南。',
|
|
194
|
+
'step': [
|
|
195
|
+
{ '@type': 'HowToStep', 'name': '测量发条盒内径', 'text': '使用精密卡尺测量发条盒内径。' },
|
|
196
|
+
{ '@type': 'HowToStep', 'name': '测量条轴外径', 'text': '测量条轴最宽处的直径。' },
|
|
197
|
+
{ '@type': 'HowToStep', 'name': '测量发条盒高度', 'text': '测量内部深度。发条高度约为少0.1 mm。' },
|
|
198
|
+
{ '@type': 'HowToStep', 'name': '设定圈数', 'text': '手动上链设5-8圈,自动机芯设6-10圈。' },
|
|
199
|
+
{ '@type': 'HowToStep', 'name': '读取结果', 'text': '查看弹簧厚度、高度、长度和商业等效规格。' },
|
|
200
|
+
],
|
|
201
|
+
'totalTime': 'PT5M',
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
'@context': 'https://schema.org',
|
|
205
|
+
'@type': 'Product',
|
|
206
|
+
'name': '发条计算器',
|
|
207
|
+
'description': '一款为制表师提供的根据发条盒尺寸计算发条尺寸的工具。',
|
|
208
|
+
'category': 'Watchmaking Tool',
|
|
209
|
+
'audience': { '@type': 'Audience', 'audienceType': '制表师和钟表爱好者' },
|
|
210
|
+
},
|
|
211
|
+
],
|
|
212
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ToolDefinition } from '../../types';
|
|
2
|
+
import { mainspringFinder } from './entry';
|
|
3
|
+
|
|
4
|
+
export * from './entry';
|
|
5
|
+
|
|
6
|
+
export const MAINSPRING_FINDER_TOOL: ToolDefinition = {
|
|
7
|
+
entry: mainspringFinder,
|
|
8
|
+
Component: () => import('./component.astro'),
|
|
9
|
+
SEOComponent: () => import('./seo.astro'),
|
|
10
|
+
BibliographyComponent: () => import('./bibliography.astro'),
|
|
11
|
+
};
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
.msf {
|
|
2
|
+
background: var(--bg-surface, #fff);
|
|
3
|
+
border: 1px solid var(--border-color, #e2e8f0);
|
|
4
|
+
border-radius: 1.25rem;
|
|
5
|
+
padding: 1.5rem;
|
|
6
|
+
display: flex;
|
|
7
|
+
flex-direction: column;
|
|
8
|
+
gap: 1rem;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.msf-top {
|
|
12
|
+
display: flex;
|
|
13
|
+
align-items: center;
|
|
14
|
+
justify-content: space-between;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.msf-h {
|
|
18
|
+
font-size: 1.1rem;
|
|
19
|
+
font-weight: 800;
|
|
20
|
+
margin: 0;
|
|
21
|
+
background: linear-gradient(135deg, var(--text-base, #0f172a) 0%, color-mix(in srgb, var(--text-base, #0f172a) 65%, var(--accent, #6366f1)) 100%);
|
|
22
|
+
-webkit-background-clip: text;
|
|
23
|
+
-webkit-text-fill-color: transparent;
|
|
24
|
+
letter-spacing: -0.02em;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.msf-u {
|
|
28
|
+
display: flex;
|
|
29
|
+
background: var(--bg-muted, #f1f5f9);
|
|
30
|
+
border: 1px solid var(--border-color, #e2e8f0);
|
|
31
|
+
border-radius: 0.45rem;
|
|
32
|
+
padding: 0.1rem;
|
|
33
|
+
gap: 0.1rem;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.msf-u-btn {
|
|
37
|
+
padding: 0.25rem 0.55rem;
|
|
38
|
+
border: none;
|
|
39
|
+
border-radius: 0.35rem;
|
|
40
|
+
background: transparent;
|
|
41
|
+
color: var(--text-muted, #475569);
|
|
42
|
+
font-size: 0.7rem;
|
|
43
|
+
font-weight: 700;
|
|
44
|
+
cursor: pointer;
|
|
45
|
+
transition: all 0.2s;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.msf-u-on {
|
|
49
|
+
background: var(--accent, #6366f1);
|
|
50
|
+
color: var(--color-white, #fff);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.msf-grid {
|
|
54
|
+
display: grid;
|
|
55
|
+
grid-template-columns: repeat(4, 1fr);
|
|
56
|
+
gap: 0.5rem;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
@media (max-width: 480px) { .msf-grid { grid-template-columns: repeat(2, 1fr); } }
|
|
60
|
+
|
|
61
|
+
.msf-f {
|
|
62
|
+
display: flex;
|
|
63
|
+
flex-direction: column;
|
|
64
|
+
gap: 0.25rem;
|
|
65
|
+
cursor: pointer;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.msf-f-l {
|
|
69
|
+
font-size: 0.6rem;
|
|
70
|
+
font-weight: 700;
|
|
71
|
+
text-transform: uppercase;
|
|
72
|
+
letter-spacing: 0.06em;
|
|
73
|
+
color: var(--text-base, #0f172a);
|
|
74
|
+
opacity: 0.5;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.msf-f-i {
|
|
78
|
+
padding: 0.55rem 0.7rem;
|
|
79
|
+
border: 1px solid var(--border-color, #e2e8f0);
|
|
80
|
+
border-radius: 0.65rem;
|
|
81
|
+
background: var(--bg-page, #f8fafc);
|
|
82
|
+
color: var(--text-base, #0f172a);
|
|
83
|
+
font-size: 0.85rem;
|
|
84
|
+
font-weight: 600;
|
|
85
|
+
width: 100%;
|
|
86
|
+
box-sizing: border-box;
|
|
87
|
+
transition: all 0.2s;
|
|
88
|
+
font-variant-numeric: tabular-nums;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.msf-f-i:focus {
|
|
92
|
+
outline: none;
|
|
93
|
+
border-color: var(--accent, #6366f1);
|
|
94
|
+
box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent, #6366f1) 15%, transparent);
|
|
95
|
+
background: var(--bg-surface, #fff);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.msf-r {
|
|
99
|
+
display: none;
|
|
100
|
+
flex-direction: column;
|
|
101
|
+
gap: 0.75rem;
|
|
102
|
+
background: color-mix(in srgb, var(--bg-page, #f8fafc) 50%, var(--bg-surface, #fff));
|
|
103
|
+
border: 1px solid var(--border-color, #e2e8f0);
|
|
104
|
+
border-radius: 1rem;
|
|
105
|
+
padding: 1rem;
|
|
106
|
+
animation: msf-in 0.25s ease;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
@keyframes msf-in {
|
|
110
|
+
from {
|
|
111
|
+
opacity: 0;
|
|
112
|
+
transform: translateY(4px);
|
|
113
|
+
}
|
|
114
|
+
to {
|
|
115
|
+
opacity: 1;
|
|
116
|
+
transform: translateY(0);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.msf-r-grid {
|
|
121
|
+
display: grid;
|
|
122
|
+
grid-template-columns: repeat(3, 1fr);
|
|
123
|
+
gap: 0.5rem;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
@media (max-width: 400px) { .msf-r-grid { grid-template-columns: 1fr; } }
|
|
127
|
+
|
|
128
|
+
.msf-r-c {
|
|
129
|
+
display: flex;
|
|
130
|
+
flex-direction: column;
|
|
131
|
+
align-items: center;
|
|
132
|
+
gap: 0.15rem;
|
|
133
|
+
padding: 0.6rem 0.4rem;
|
|
134
|
+
background: var(--bg-surface, #fff);
|
|
135
|
+
border: 1px solid var(--border-color, #e2e8f0);
|
|
136
|
+
border-radius: 0.75rem;
|
|
137
|
+
text-align: center;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.msf-r-c-l {
|
|
141
|
+
font-size: 0.55rem;
|
|
142
|
+
font-weight: 700;
|
|
143
|
+
text-transform: uppercase;
|
|
144
|
+
letter-spacing: 0.05em;
|
|
145
|
+
opacity: 0.45;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.msf-r-c-v {
|
|
149
|
+
font-size: 1rem;
|
|
150
|
+
font-weight: 800;
|
|
151
|
+
font-variant-numeric: tabular-nums;
|
|
152
|
+
color: var(--text-base, #0f172a);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.msf-r-bot {
|
|
156
|
+
display: flex;
|
|
157
|
+
align-items: center;
|
|
158
|
+
justify-content: space-between;
|
|
159
|
+
gap: 0.75rem;
|
|
160
|
+
padding-top: 0.6rem;
|
|
161
|
+
border-top: 1px solid var(--border-color, #e2e8f0);
|
|
162
|
+
flex-wrap: wrap;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.msf-r-bot-i {
|
|
166
|
+
display: flex;
|
|
167
|
+
align-items: center;
|
|
168
|
+
gap: 0.4rem;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
.msf-r-bot-l {
|
|
172
|
+
font-size: 0.6rem;
|
|
173
|
+
font-weight: 700;
|
|
174
|
+
text-transform: uppercase;
|
|
175
|
+
letter-spacing: 0.05em;
|
|
176
|
+
opacity: 0.45;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
.msf-badge {
|
|
180
|
+
padding: 0.15rem 0.5rem;
|
|
181
|
+
border-radius: 99px;
|
|
182
|
+
font-size: 0.68rem;
|
|
183
|
+
font-weight: 700;
|
|
184
|
+
color: var(--color-white, #fff);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
.msf-r-bot-v {
|
|
188
|
+
font-size: 0.78rem;
|
|
189
|
+
font-weight: 700;
|
|
190
|
+
font-variant-numeric: tabular-nums;
|
|
191
|
+
opacity: 0.85;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
.msf-steps {
|
|
195
|
+
display: flex;
|
|
196
|
+
flex-direction: column;
|
|
197
|
+
gap: 0.4rem;
|
|
198
|
+
padding: 0.85rem;
|
|
199
|
+
background: var(--bg-page, #f8fafc);
|
|
200
|
+
border: 1px solid var(--border-color, #e2e8f0);
|
|
201
|
+
border-radius: 0.75rem;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
.msf-step {
|
|
205
|
+
display: flex;
|
|
206
|
+
align-items: center;
|
|
207
|
+
gap: 0.5rem;
|
|
208
|
+
font-size: 0.75rem;
|
|
209
|
+
line-height: 1.35;
|
|
210
|
+
color: var(--text-base, #0f172a);
|
|
211
|
+
opacity: 0.7;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
.msf-step-n {
|
|
215
|
+
width: 1.3rem;
|
|
216
|
+
height: 1.3rem;
|
|
217
|
+
border-radius: 50%;
|
|
218
|
+
background: color-mix(in srgb, var(--accent, #6366f1) 15%, var(--bg-surface, #fff));
|
|
219
|
+
color: var(--accent, #6366f1);
|
|
220
|
+
display: flex;
|
|
221
|
+
align-items: center;
|
|
222
|
+
justify-content: center;
|
|
223
|
+
font-size: 0.6rem;
|
|
224
|
+
font-weight: 800;
|
|
225
|
+
flex-shrink: 0;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
.msf-tip {
|
|
229
|
+
display: flex;
|
|
230
|
+
align-items: flex-start;
|
|
231
|
+
gap: 0.4rem;
|
|
232
|
+
padding: 0.6rem 0.75rem;
|
|
233
|
+
background: color-mix(in srgb, var(--color-warning, #f59e0b) 8%, var(--bg-surface, #fff));
|
|
234
|
+
border: 1px solid color-mix(in srgb, var(--color-warning, #f59e0b) 18%, var(--border-color, #e2e8f0));
|
|
235
|
+
border-radius: 0.6rem;
|
|
236
|
+
font-size: 0.72rem;
|
|
237
|
+
line-height: 1.35;
|
|
238
|
+
color: var(--text-base, #0f172a);
|
|
239
|
+
opacity: 0.8;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
.msf-tip svg { color: var(--color-warning, #f59e0b); }
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
3
|
+
import { mainspringFinder } from './index';
|
|
4
|
+
import type { KnownLocale } from '../../types';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { locale = 'en' } = Astro.props;
|
|
11
|
+
const loader = mainspringFinder.i18n[locale] || mainspringFinder.i18n.en;
|
|
12
|
+
const content = await loader?.();
|
|
13
|
+
if (!content) return null;
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|
package/src/tools.ts
CHANGED
|
@@ -22,6 +22,8 @@ import { PERPETUAL_CALENDAR_TOOL } from './tool/perpetual-calendar';
|
|
|
22
22
|
import { TOURBILLON_VISUALIZER_TOOL } from './tool/tourbillon-visualizer';
|
|
23
23
|
import { GMT_WORLD_TIMER_TOOL } from './tool/gmt-world-timer';
|
|
24
24
|
import { QUARTZ_BATTERY_HEALTH_TOOL } from './tool/quartz-battery-health';
|
|
25
|
+
import { MAINSPRING_FINDER_TOOL } from './tool/mainspring-finder';
|
|
26
|
+
import { ALTITUDE_WATCH_ACCURACY_ESTIMATOR_TOOL } from './tool/altitude-watch-accuracy-estimator';
|
|
25
27
|
|
|
26
28
|
export const ALL_TOOLS: ToolDefinition[] = [
|
|
27
29
|
WATCH_ACCURACY_TRACKER_TOOL,
|
|
@@ -46,6 +48,8 @@ export const ALL_TOOLS: ToolDefinition[] = [
|
|
|
46
48
|
TOURBILLON_VISUALIZER_TOOL,
|
|
47
49
|
GMT_WORLD_TIMER_TOOL,
|
|
48
50
|
QUARTZ_BATTERY_HEALTH_TOOL,
|
|
51
|
+
MAINSPRING_FINDER_TOOL,
|
|
52
|
+
ALTITUDE_WATCH_ACCURACY_ESTIMATOR_TOOL,
|
|
49
53
|
];
|
|
50
54
|
|
|
51
55
|
|