@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.
Files changed (277) hide show
  1. package/package.json +65 -0
  2. package/scripts/postinstall.mjs +27 -0
  3. package/src/category/ChronoCategorySEO.astro +8 -0
  4. package/src/category/i18n/de.ts +23 -0
  5. package/src/category/i18n/en.ts +23 -0
  6. package/src/category/i18n/es.ts +23 -0
  7. package/src/category/i18n/fr.ts +23 -0
  8. package/src/category/i18n/id.ts +23 -0
  9. package/src/category/i18n/it.ts +23 -0
  10. package/src/category/i18n/ja.ts +23 -0
  11. package/src/category/i18n/ko.ts +23 -0
  12. package/src/category/i18n/nl.ts +23 -0
  13. package/src/category/i18n/pl.ts +23 -0
  14. package/src/category/i18n/pt.ts +23 -0
  15. package/src/category/i18n/ru.ts +23 -0
  16. package/src/category/i18n/sv.ts +23 -0
  17. package/src/category/i18n/tr.ts +23 -0
  18. package/src/category/i18n/zh.ts +23 -0
  19. package/src/category/index.ts +42 -0
  20. package/src/components/PreviewNavSidebar.astro +116 -0
  21. package/src/components/PreviewToolbar.astro +143 -0
  22. package/src/data.ts +11 -0
  23. package/src/entries.ts +32 -0
  24. package/src/env.d.ts +5 -0
  25. package/src/index.ts +28 -0
  26. package/src/layouts/PreviewLayout.astro +117 -0
  27. package/src/pages/[locale]/[slug].astro +161 -0
  28. package/src/pages/[locale].astro +251 -0
  29. package/src/pages/index.astro +4 -0
  30. package/src/tests/faq_count.test.ts +19 -0
  31. package/src/tests/i18n_coverage.test.ts +36 -0
  32. package/src/tests/locale_completeness.test.ts +29 -0
  33. package/src/tests/mocks/astro_mock.js +2 -0
  34. package/src/tests/no_h1_in_components.test.ts +48 -0
  35. package/src/tests/schemas_fulfillment.test.ts +23 -0
  36. package/src/tests/seo_length.test.ts +22 -0
  37. package/src/tests/shared-test-helpers.ts +56 -0
  38. package/src/tests/slug_language_code_format.test.ts +23 -0
  39. package/src/tests/slug_uniqueness.test.ts +81 -0
  40. package/src/tests/title_quality.test.ts +55 -0
  41. package/src/tests/tool_exports.test.ts +34 -0
  42. package/src/tests/tool_validation.test.ts +18 -0
  43. package/src/tool/beat-rate-converter/beat-rate-converter.css +301 -0
  44. package/src/tool/beat-rate-converter/bibliography.astro +16 -0
  45. package/src/tool/beat-rate-converter/bibliography.ts +12 -0
  46. package/src/tool/beat-rate-converter/client.ts +46 -0
  47. package/src/tool/beat-rate-converter/component.astro +15 -0
  48. package/src/tool/beat-rate-converter/components/ConverterPanel.astro +87 -0
  49. package/src/tool/beat-rate-converter/entry.ts +42 -0
  50. package/src/tool/beat-rate-converter/i18n/de.ts +138 -0
  51. package/src/tool/beat-rate-converter/i18n/en.ts +138 -0
  52. package/src/tool/beat-rate-converter/i18n/es.ts +138 -0
  53. package/src/tool/beat-rate-converter/i18n/fr.ts +138 -0
  54. package/src/tool/beat-rate-converter/i18n/id.ts +138 -0
  55. package/src/tool/beat-rate-converter/i18n/it.ts +138 -0
  56. package/src/tool/beat-rate-converter/i18n/ja.ts +138 -0
  57. package/src/tool/beat-rate-converter/i18n/ko.ts +138 -0
  58. package/src/tool/beat-rate-converter/i18n/nl.ts +138 -0
  59. package/src/tool/beat-rate-converter/i18n/pl.ts +138 -0
  60. package/src/tool/beat-rate-converter/i18n/pt.ts +138 -0
  61. package/src/tool/beat-rate-converter/i18n/ru.ts +138 -0
  62. package/src/tool/beat-rate-converter/i18n/sv.ts +138 -0
  63. package/src/tool/beat-rate-converter/i18n/tr.ts +138 -0
  64. package/src/tool/beat-rate-converter/i18n/zh.ts +138 -0
  65. package/src/tool/beat-rate-converter/index.ts +11 -0
  66. package/src/tool/beat-rate-converter/seo.astro +16 -0
  67. package/src/tool/crown-reference-guide/bibliography.astro +16 -0
  68. package/src/tool/crown-reference-guide/bibliography.ts +20 -0
  69. package/src/tool/crown-reference-guide/client.ts +193 -0
  70. package/src/tool/crown-reference-guide/component.astro +69 -0
  71. package/src/tool/crown-reference-guide/components/CrownView.astro +40 -0
  72. package/src/tool/crown-reference-guide/components/MovementSelector.astro +26 -0
  73. package/src/tool/crown-reference-guide/components/PositionPanel.astro +59 -0
  74. package/src/tool/crown-reference-guide/crown-reference-guide.css +383 -0
  75. package/src/tool/crown-reference-guide/entry.ts +60 -0
  76. package/src/tool/crown-reference-guide/i18n/de.ts +207 -0
  77. package/src/tool/crown-reference-guide/i18n/en.ts +207 -0
  78. package/src/tool/crown-reference-guide/i18n/es.ts +207 -0
  79. package/src/tool/crown-reference-guide/i18n/fr.ts +207 -0
  80. package/src/tool/crown-reference-guide/i18n/id.ts +207 -0
  81. package/src/tool/crown-reference-guide/i18n/it.ts +207 -0
  82. package/src/tool/crown-reference-guide/i18n/ja.ts +207 -0
  83. package/src/tool/crown-reference-guide/i18n/ko.ts +207 -0
  84. package/src/tool/crown-reference-guide/i18n/nl.ts +207 -0
  85. package/src/tool/crown-reference-guide/i18n/pl.ts +207 -0
  86. package/src/tool/crown-reference-guide/i18n/pt.ts +207 -0
  87. package/src/tool/crown-reference-guide/i18n/ru.ts +207 -0
  88. package/src/tool/crown-reference-guide/i18n/sv.ts +207 -0
  89. package/src/tool/crown-reference-guide/i18n/tr.ts +207 -0
  90. package/src/tool/crown-reference-guide/i18n/zh.ts +207 -0
  91. package/src/tool/crown-reference-guide/index.ts +11 -0
  92. package/src/tool/crown-reference-guide/seo.astro +16 -0
  93. package/src/tool/crown-reference-guide/utils.ts +0 -0
  94. package/src/tool/demagnetizing-timer/bibliography.astro +16 -0
  95. package/src/tool/demagnetizing-timer/bibliography.ts +12 -0
  96. package/src/tool/demagnetizing-timer/client.ts +221 -0
  97. package/src/tool/demagnetizing-timer/component.astro +15 -0
  98. package/src/tool/demagnetizing-timer/components/TimerPanel.astro +92 -0
  99. package/src/tool/demagnetizing-timer/demagnetizing-timer.css +389 -0
  100. package/src/tool/demagnetizing-timer/entry.ts +50 -0
  101. package/src/tool/demagnetizing-timer/helpers/field.ts +134 -0
  102. package/src/tool/demagnetizing-timer/i18n/de.ts +143 -0
  103. package/src/tool/demagnetizing-timer/i18n/en.ts +143 -0
  104. package/src/tool/demagnetizing-timer/i18n/es.ts +143 -0
  105. package/src/tool/demagnetizing-timer/i18n/fr.ts +143 -0
  106. package/src/tool/demagnetizing-timer/i18n/id.ts +143 -0
  107. package/src/tool/demagnetizing-timer/i18n/it.ts +143 -0
  108. package/src/tool/demagnetizing-timer/i18n/ja.ts +143 -0
  109. package/src/tool/demagnetizing-timer/i18n/ko.ts +143 -0
  110. package/src/tool/demagnetizing-timer/i18n/nl.ts +143 -0
  111. package/src/tool/demagnetizing-timer/i18n/pl.ts +143 -0
  112. package/src/tool/demagnetizing-timer/i18n/pt.ts +143 -0
  113. package/src/tool/demagnetizing-timer/i18n/ru.ts +143 -0
  114. package/src/tool/demagnetizing-timer/i18n/sv.ts +143 -0
  115. package/src/tool/demagnetizing-timer/i18n/tr.ts +143 -0
  116. package/src/tool/demagnetizing-timer/i18n/zh.ts +143 -0
  117. package/src/tool/demagnetizing-timer/index.ts +11 -0
  118. package/src/tool/demagnetizing-timer/seo.astro +16 -0
  119. package/src/tool/demagnetizing-timer/utils.ts +0 -0
  120. package/src/tool/power-reserve-estimator/bibliography.astro +16 -0
  121. package/src/tool/power-reserve-estimator/bibliography.ts +16 -0
  122. package/src/tool/power-reserve-estimator/client.ts +139 -0
  123. package/src/tool/power-reserve-estimator/component.astro +15 -0
  124. package/src/tool/power-reserve-estimator/components/EstimatorPanel.astro +150 -0
  125. package/src/tool/power-reserve-estimator/entry.ts +51 -0
  126. package/src/tool/power-reserve-estimator/i18n/de.ts +158 -0
  127. package/src/tool/power-reserve-estimator/i18n/en.ts +158 -0
  128. package/src/tool/power-reserve-estimator/i18n/es.ts +158 -0
  129. package/src/tool/power-reserve-estimator/i18n/fr.ts +158 -0
  130. package/src/tool/power-reserve-estimator/i18n/id.ts +158 -0
  131. package/src/tool/power-reserve-estimator/i18n/it.ts +158 -0
  132. package/src/tool/power-reserve-estimator/i18n/ja.ts +158 -0
  133. package/src/tool/power-reserve-estimator/i18n/ko.ts +158 -0
  134. package/src/tool/power-reserve-estimator/i18n/nl.ts +158 -0
  135. package/src/tool/power-reserve-estimator/i18n/pl.ts +158 -0
  136. package/src/tool/power-reserve-estimator/i18n/pt.ts +158 -0
  137. package/src/tool/power-reserve-estimator/i18n/ru.ts +158 -0
  138. package/src/tool/power-reserve-estimator/i18n/sv.ts +158 -0
  139. package/src/tool/power-reserve-estimator/i18n/tr.ts +158 -0
  140. package/src/tool/power-reserve-estimator/i18n/zh.ts +158 -0
  141. package/src/tool/power-reserve-estimator/index.ts +11 -0
  142. package/src/tool/power-reserve-estimator/power-reserve-estimator.css +402 -0
  143. package/src/tool/power-reserve-estimator/seo.astro +16 -0
  144. package/src/tool/strap-taper-calculator/bibliography.astro +16 -0
  145. package/src/tool/strap-taper-calculator/bibliography.ts +12 -0
  146. package/src/tool/strap-taper-calculator/client.ts +129 -0
  147. package/src/tool/strap-taper-calculator/component.astro +15 -0
  148. package/src/tool/strap-taper-calculator/components/CalculatorPanel.astro +114 -0
  149. package/src/tool/strap-taper-calculator/entry.ts +56 -0
  150. package/src/tool/strap-taper-calculator/i18n/de.ts +152 -0
  151. package/src/tool/strap-taper-calculator/i18n/en.ts +152 -0
  152. package/src/tool/strap-taper-calculator/i18n/es.ts +152 -0
  153. package/src/tool/strap-taper-calculator/i18n/fr.ts +152 -0
  154. package/src/tool/strap-taper-calculator/i18n/id.ts +152 -0
  155. package/src/tool/strap-taper-calculator/i18n/it.ts +152 -0
  156. package/src/tool/strap-taper-calculator/i18n/ja.ts +152 -0
  157. package/src/tool/strap-taper-calculator/i18n/ko.ts +152 -0
  158. package/src/tool/strap-taper-calculator/i18n/nl.ts +152 -0
  159. package/src/tool/strap-taper-calculator/i18n/pl.ts +152 -0
  160. package/src/tool/strap-taper-calculator/i18n/pt.ts +152 -0
  161. package/src/tool/strap-taper-calculator/i18n/ru.ts +152 -0
  162. package/src/tool/strap-taper-calculator/i18n/sv.ts +152 -0
  163. package/src/tool/strap-taper-calculator/i18n/tr.ts +152 -0
  164. package/src/tool/strap-taper-calculator/i18n/zh.ts +152 -0
  165. package/src/tool/strap-taper-calculator/index.ts +11 -0
  166. package/src/tool/strap-taper-calculator/seo.astro +16 -0
  167. package/src/tool/strap-taper-calculator/strap-taper-calculator.css +320 -0
  168. package/src/tool/watch-accuracy-tracker/bibliography.astro +16 -0
  169. package/src/tool/watch-accuracy-tracker/bibliography.ts +12 -0
  170. package/src/tool/watch-accuracy-tracker/chart.ts +126 -0
  171. package/src/tool/watch-accuracy-tracker/client.ts +287 -0
  172. package/src/tool/watch-accuracy-tracker/component.astro +35 -0
  173. package/src/tool/watch-accuracy-tracker/components/AccuracyTracker.astro +96 -0
  174. package/src/tool/watch-accuracy-tracker/components/DriftPredictor.astro +126 -0
  175. package/src/tool/watch-accuracy-tracker/components/LogHistory.astro +66 -0
  176. package/src/tool/watch-accuracy-tracker/entry.ts +94 -0
  177. package/src/tool/watch-accuracy-tracker/i18n/de.ts +167 -0
  178. package/src/tool/watch-accuracy-tracker/i18n/en.ts +167 -0
  179. package/src/tool/watch-accuracy-tracker/i18n/es.ts +167 -0
  180. package/src/tool/watch-accuracy-tracker/i18n/fr.ts +167 -0
  181. package/src/tool/watch-accuracy-tracker/i18n/id.ts +167 -0
  182. package/src/tool/watch-accuracy-tracker/i18n/it.ts +167 -0
  183. package/src/tool/watch-accuracy-tracker/i18n/ja.ts +167 -0
  184. package/src/tool/watch-accuracy-tracker/i18n/ko.ts +167 -0
  185. package/src/tool/watch-accuracy-tracker/i18n/nl.ts +167 -0
  186. package/src/tool/watch-accuracy-tracker/i18n/pl.ts +167 -0
  187. package/src/tool/watch-accuracy-tracker/i18n/pt.ts +167 -0
  188. package/src/tool/watch-accuracy-tracker/i18n/ru.ts +167 -0
  189. package/src/tool/watch-accuracy-tracker/i18n/sv.ts +167 -0
  190. package/src/tool/watch-accuracy-tracker/i18n/tr.ts +167 -0
  191. package/src/tool/watch-accuracy-tracker/i18n/zh.ts +167 -0
  192. package/src/tool/watch-accuracy-tracker/index.ts +9 -0
  193. package/src/tool/watch-accuracy-tracker/logger.ts +105 -0
  194. package/src/tool/watch-accuracy-tracker/seo.astro +16 -0
  195. package/src/tool/watch-accuracy-tracker/utils.ts +99 -0
  196. package/src/tool/watch-accuracy-tracker/watch-accuracy-tracker.css +564 -0
  197. package/src/tool/watch-savings-planner/bibliography.astro +16 -0
  198. package/src/tool/watch-savings-planner/bibliography.ts +8 -0
  199. package/src/tool/watch-savings-planner/client.ts +271 -0
  200. package/src/tool/watch-savings-planner/component.astro +33 -0
  201. package/src/tool/watch-savings-planner/components/AddGoalForm.astro +49 -0
  202. package/src/tool/watch-savings-planner/components/GoalCard.astro +58 -0
  203. package/src/tool/watch-savings-planner/entry.ts +62 -0
  204. package/src/tool/watch-savings-planner/i18n/de.ts +153 -0
  205. package/src/tool/watch-savings-planner/i18n/en.ts +155 -0
  206. package/src/tool/watch-savings-planner/i18n/es.ts +153 -0
  207. package/src/tool/watch-savings-planner/i18n/fr.ts +153 -0
  208. package/src/tool/watch-savings-planner/i18n/id.ts +153 -0
  209. package/src/tool/watch-savings-planner/i18n/it.ts +153 -0
  210. package/src/tool/watch-savings-planner/i18n/ja.ts +153 -0
  211. package/src/tool/watch-savings-planner/i18n/ko.ts +153 -0
  212. package/src/tool/watch-savings-planner/i18n/nl.ts +153 -0
  213. package/src/tool/watch-savings-planner/i18n/pl.ts +153 -0
  214. package/src/tool/watch-savings-planner/i18n/pt.ts +153 -0
  215. package/src/tool/watch-savings-planner/i18n/ru.ts +153 -0
  216. package/src/tool/watch-savings-planner/i18n/sv.ts +153 -0
  217. package/src/tool/watch-savings-planner/i18n/tr.ts +153 -0
  218. package/src/tool/watch-savings-planner/i18n/zh.ts +153 -0
  219. package/src/tool/watch-savings-planner/index.ts +11 -0
  220. package/src/tool/watch-savings-planner/seo.astro +16 -0
  221. package/src/tool/watch-savings-planner/utils.ts +0 -0
  222. package/src/tool/watch-savings-planner/watch-savings-planner.css +460 -0
  223. package/src/tool/water-resistance-converter/bibliography.astro +16 -0
  224. package/src/tool/water-resistance-converter/bibliography.ts +16 -0
  225. package/src/tool/water-resistance-converter/client.ts +56 -0
  226. package/src/tool/water-resistance-converter/component.astro +15 -0
  227. package/src/tool/water-resistance-converter/components/ConverterPanel.astro +113 -0
  228. package/src/tool/water-resistance-converter/entry.ts +52 -0
  229. package/src/tool/water-resistance-converter/i18n/de.ts +148 -0
  230. package/src/tool/water-resistance-converter/i18n/en.ts +148 -0
  231. package/src/tool/water-resistance-converter/i18n/es.ts +148 -0
  232. package/src/tool/water-resistance-converter/i18n/fr.ts +148 -0
  233. package/src/tool/water-resistance-converter/i18n/id.ts +148 -0
  234. package/src/tool/water-resistance-converter/i18n/it.ts +148 -0
  235. package/src/tool/water-resistance-converter/i18n/ja.ts +148 -0
  236. package/src/tool/water-resistance-converter/i18n/ko.ts +148 -0
  237. package/src/tool/water-resistance-converter/i18n/nl.ts +148 -0
  238. package/src/tool/water-resistance-converter/i18n/pl.ts +148 -0
  239. package/src/tool/water-resistance-converter/i18n/pt.ts +148 -0
  240. package/src/tool/water-resistance-converter/i18n/ru.ts +148 -0
  241. package/src/tool/water-resistance-converter/i18n/sv.ts +148 -0
  242. package/src/tool/water-resistance-converter/i18n/tr.ts +148 -0
  243. package/src/tool/water-resistance-converter/i18n/zh.ts +148 -0
  244. package/src/tool/water-resistance-converter/index.ts +11 -0
  245. package/src/tool/water-resistance-converter/seo.astro +16 -0
  246. package/src/tool/water-resistance-converter/water-resistance-converter.css +254 -0
  247. package/src/tool/wrist-presence-calculator/bibliography.astro +16 -0
  248. package/src/tool/wrist-presence-calculator/bibliography.ts +12 -0
  249. package/src/tool/wrist-presence-calculator/client.ts +180 -0
  250. package/src/tool/wrist-presence-calculator/component.astro +23 -0
  251. package/src/tool/wrist-presence-calculator/components/CalculatorInputs.astro +97 -0
  252. package/src/tool/wrist-presence-calculator/components/FitResult.astro +68 -0
  253. package/src/tool/wrist-presence-calculator/components/Visualizer.astro +16 -0
  254. package/src/tool/wrist-presence-calculator/entry.ts +59 -0
  255. package/src/tool/wrist-presence-calculator/helpers/canvas.ts +189 -0
  256. package/src/tool/wrist-presence-calculator/helpers/results.ts +78 -0
  257. package/src/tool/wrist-presence-calculator/i18n/de.ts +139 -0
  258. package/src/tool/wrist-presence-calculator/i18n/en.ts +155 -0
  259. package/src/tool/wrist-presence-calculator/i18n/es.ts +139 -0
  260. package/src/tool/wrist-presence-calculator/i18n/fr.ts +139 -0
  261. package/src/tool/wrist-presence-calculator/i18n/id.ts +139 -0
  262. package/src/tool/wrist-presence-calculator/i18n/it.ts +139 -0
  263. package/src/tool/wrist-presence-calculator/i18n/ja.ts +139 -0
  264. package/src/tool/wrist-presence-calculator/i18n/ko.ts +139 -0
  265. package/src/tool/wrist-presence-calculator/i18n/nl.ts +139 -0
  266. package/src/tool/wrist-presence-calculator/i18n/pl.ts +139 -0
  267. package/src/tool/wrist-presence-calculator/i18n/pt.ts +139 -0
  268. package/src/tool/wrist-presence-calculator/i18n/ru.ts +139 -0
  269. package/src/tool/wrist-presence-calculator/i18n/sv.ts +139 -0
  270. package/src/tool/wrist-presence-calculator/i18n/tr.ts +139 -0
  271. package/src/tool/wrist-presence-calculator/i18n/zh.ts +155 -0
  272. package/src/tool/wrist-presence-calculator/index.ts +11 -0
  273. package/src/tool/wrist-presence-calculator/seo.astro +16 -0
  274. package/src/tool/wrist-presence-calculator/utils.ts +30 -0
  275. package/src/tool/wrist-presence-calculator/wrist-presence-calculator.css +372 -0
  276. package/src/tools.ts +26 -0
  277. package/src/types.ts +70 -0
@@ -0,0 +1,389 @@
1
+ .tool-main-card {
2
+ background: var(--bg-surface);
3
+ border: 1px solid var(--border-color);
4
+ border-radius: 1.25rem;
5
+ max-width: 400px;
6
+ margin: 0 auto;
7
+ padding: 1.75rem;
8
+ display: flex;
9
+ flex-direction: column;
10
+ gap: 1.75rem;
11
+ box-shadow: var(--shadow-base);
12
+ position: relative;
13
+ overflow: hidden;
14
+ }
15
+
16
+ .theme-light {
17
+ --color-start: #22c55e;
18
+ --color-start-hover: #16a34a;
19
+ --color-stop: #ef4444;
20
+ --color-stop-hover: #dc2626;
21
+ --color-pressing: #22c55e;
22
+ --color-releasing: #f59e0b;
23
+ --color-complete: var(--accent);
24
+ --color-white: #fff;
25
+ }
26
+
27
+ .theme-dark {
28
+ --color-start: #4ade80;
29
+ --color-start-hover: #22c55e;
30
+ --color-stop: #f87171;
31
+ --color-stop-hover: #ef4444;
32
+ --color-pressing: #4ade80;
33
+ --color-releasing: #fbbf24;
34
+ --color-complete: var(--accent);
35
+ --color-white: #fff;
36
+ }
37
+
38
+ .timer-panel {
39
+ display: flex;
40
+ flex-direction: column;
41
+ gap: 1.5rem;
42
+ position: relative;
43
+ z-index: 1;
44
+ }
45
+
46
+ .timer-display-section {
47
+ display: flex;
48
+ flex-direction: column;
49
+ align-items: center;
50
+ gap: 0.875rem;
51
+ }
52
+
53
+ .timer-circle-wrapper {
54
+ position: relative;
55
+ width: 220px;
56
+ height: 220px;
57
+ display: flex;
58
+ align-items: center;
59
+ justify-content: center;
60
+ }
61
+
62
+ .field-canvas {
63
+ position: absolute;
64
+ inset: 0;
65
+ width: 100%;
66
+ height: 100%;
67
+ pointer-events: none;
68
+ z-index: 0;
69
+ }
70
+
71
+ .timer-circle {
72
+ position: relative;
73
+ width: 180px;
74
+ height: 180px;
75
+ z-index: 1;
76
+ }
77
+
78
+ .timer-glow-ring {
79
+ position: absolute;
80
+ top: 50%;
81
+ left: 50%;
82
+ width: 160px;
83
+ height: 160px;
84
+ border-radius: 50%;
85
+ transform: translate(-50%, -50%) scale(1);
86
+ pointer-events: none;
87
+ transition: opacity 0.4s ease;
88
+ opacity: 0;
89
+ z-index: 0;
90
+ }
91
+
92
+ .phase-pressing .timer-glow-ring {
93
+ background: radial-gradient(circle, rgba(34, 197, 94, 0.2) 0%, transparent 70%);
94
+ }
95
+
96
+ .theme-dark .phase-pressing .timer-glow-ring {
97
+ background: radial-gradient(circle, rgba(74, 222, 128, 0.25) 0%, transparent 70%);
98
+ }
99
+
100
+ .phase-releasing .timer-glow-ring {
101
+ background: radial-gradient(circle, rgba(245, 158, 11, 0.2) 0%, transparent 70%);
102
+ }
103
+
104
+ .theme-dark .phase-releasing .timer-glow-ring {
105
+ background: radial-gradient(circle, rgba(251, 191, 36, 0.25) 0%, transparent 70%);
106
+ }
107
+
108
+ .timer-svg {
109
+ width: 100%;
110
+ height: 100%;
111
+ transform: rotate(-90deg);
112
+ position: relative;
113
+ z-index: 1;
114
+ }
115
+
116
+ .timer-bg-ring {
117
+ fill: none;
118
+ stroke: var(--border-base);
119
+ stroke-width: 6;
120
+ opacity: 0.4;
121
+ }
122
+
123
+ .timer-progress-ring {
124
+ fill: none;
125
+ stroke: var(--accent);
126
+ stroke-width: 6;
127
+ stroke-linecap: round;
128
+ transition: stroke 0.4s ease;
129
+ }
130
+
131
+ .phase-pressing .timer-progress-ring {
132
+ stroke: var(--color-pressing);
133
+ }
134
+
135
+ .phase-releasing .timer-progress-ring {
136
+ stroke: var(--color-releasing);
137
+ }
138
+
139
+ .phase-complete .timer-progress-ring {
140
+ stroke: var(--color-complete);
141
+ }
142
+
143
+ .timer-text {
144
+ position: absolute;
145
+ top: 50%;
146
+ left: 50%;
147
+ transform: translate(-50%, -50%);
148
+ text-align: center;
149
+ z-index: 1;
150
+ }
151
+
152
+ .timer-value {
153
+ display: block;
154
+ font-size: 3rem;
155
+ font-weight: 800;
156
+ color: var(--text-base);
157
+ font-variant-numeric: tabular-nums;
158
+ line-height: 1;
159
+ letter-spacing: -0.03em;
160
+ }
161
+
162
+ .timer-unit {
163
+ display: block;
164
+ font-size: 0.8rem;
165
+ color: var(--text-dimmed);
166
+ margin-top: 0.2rem;
167
+ font-weight: 500;
168
+ text-transform: uppercase;
169
+ letter-spacing: 0.08em;
170
+ }
171
+
172
+ .timer-status-pill {
173
+ font-size: 0.8125rem;
174
+ font-weight: 600;
175
+ padding: 0.375rem 1rem;
176
+ border-radius: 2rem;
177
+ background: var(--bg-page);
178
+ border: 1px solid var(--border-base);
179
+ color: var(--text-dimmed);
180
+ text-align: center;
181
+ transition: all 0.3s ease;
182
+ min-width: 120px;
183
+ }
184
+
185
+ .status-pressing {
186
+ background: rgba(34, 197, 94, 0.1);
187
+ border-color: var(--color-pressing);
188
+ color: var(--color-pressing);
189
+ }
190
+
191
+ .theme-dark .status-pressing {
192
+ background: rgba(74, 222, 128, 0.12);
193
+ }
194
+
195
+ .status-releasing {
196
+ background: rgba(245, 158, 11, 0.1);
197
+ border-color: var(--color-releasing);
198
+ color: var(--color-releasing);
199
+ }
200
+
201
+ .theme-dark .status-releasing {
202
+ background: rgba(251, 191, 36, 0.12);
203
+ }
204
+
205
+ .status-complete {
206
+ background: rgba(99, 102, 241, 0.1);
207
+ border-color: var(--accent);
208
+ color: var(--accent);
209
+ }
210
+
211
+ .timer-controls {
212
+ display: flex;
213
+ gap: 0.625rem;
214
+ justify-content: center;
215
+ }
216
+
217
+ .timer-btn {
218
+ display: inline-flex;
219
+ align-items: center;
220
+ gap: 0.4rem;
221
+ padding: 0.6rem 1.25rem;
222
+ border: none;
223
+ border-radius: 2rem;
224
+ font-size: 0.875rem;
225
+ font-weight: 600;
226
+ cursor: pointer;
227
+ transition: all 0.2s ease;
228
+ outline: none;
229
+ }
230
+
231
+ .timer-btn:disabled {
232
+ opacity: 0.3;
233
+ cursor: not-allowed;
234
+ transform: none;
235
+ }
236
+
237
+ .timer-btn:not(:disabled):active {
238
+ transform: scale(0.96);
239
+ }
240
+
241
+ .btn-icon {
242
+ flex-shrink: 0;
243
+ }
244
+
245
+ .start-btn {
246
+ background: var(--color-start);
247
+ color: var(--color-white);
248
+ box-shadow: 0 2px 12px rgba(34, 197, 94, 0.25);
249
+ }
250
+
251
+ .start-btn:hover:not(:disabled) {
252
+ background: var(--color-start-hover);
253
+ box-shadow: 0 4px 16px rgba(34, 197, 94, 0.35);
254
+ transform: translateY(-1px);
255
+ }
256
+
257
+ .stop-btn {
258
+ background: var(--color-stop);
259
+ color: var(--color-white);
260
+ box-shadow: 0 2px 12px rgba(239, 68, 68, 0.25);
261
+ }
262
+
263
+ .stop-btn:hover:not(:disabled) {
264
+ background: var(--color-stop-hover);
265
+ box-shadow: 0 4px 16px rgba(239, 68, 68, 0.35);
266
+ transform: translateY(-1px);
267
+ }
268
+
269
+ .reset-btn {
270
+ background: var(--bg-page);
271
+ color: var(--text-dimmed);
272
+ border: 1px solid var(--border-base);
273
+ padding: 0.6rem;
274
+ border-radius: 50%;
275
+ width: 2.5rem;
276
+ height: 2.5rem;
277
+ display: flex;
278
+ align-items: center;
279
+ justify-content: center;
280
+ }
281
+
282
+ .reset-btn:hover {
283
+ border-color: var(--accent);
284
+ color: var(--text-base);
285
+ background: var(--bg-surface);
286
+ }
287
+
288
+ .duration-selector {
289
+ display: flex;
290
+ align-items: center;
291
+ justify-content: center;
292
+ gap: 0.75rem;
293
+ }
294
+
295
+ .chip-group-label {
296
+ font-size: 0.75rem;
297
+ font-weight: 600;
298
+ color: var(--text-dimmed);
299
+ text-transform: uppercase;
300
+ letter-spacing: 0.06em;
301
+ }
302
+
303
+ .chip-group {
304
+ display: flex;
305
+ gap: 0.25rem;
306
+ background: var(--bg-page);
307
+ padding: 0.25rem;
308
+ border-radius: 2rem;
309
+ border: 1px solid var(--border-base);
310
+ }
311
+
312
+ .chip {
313
+ padding: 0.35rem 0.9rem;
314
+ border: none;
315
+ border-radius: 1.5rem;
316
+ font-size: 0.8125rem;
317
+ font-weight: 600;
318
+ cursor: pointer;
319
+ background: transparent;
320
+ color: var(--text-dimmed);
321
+ transition: all 0.2s ease;
322
+ }
323
+
324
+ .chip:hover {
325
+ color: var(--text-base);
326
+ }
327
+
328
+ .chip.active {
329
+ background: var(--accent);
330
+ color: var(--color-white);
331
+ }
332
+
333
+ .steps-section {
334
+ display: flex;
335
+ flex-direction: column;
336
+ gap: 0.625rem;
337
+ padding: 1rem 1.125rem;
338
+ background: var(--bg-page);
339
+ border-radius: 0.875rem;
340
+ border: 1px solid var(--border-base);
341
+ }
342
+
343
+ .step-row {
344
+ display: flex;
345
+ align-items: center;
346
+ gap: 0.75rem;
347
+ }
348
+
349
+ .step-marker {
350
+ width: 1.375rem;
351
+ height: 1.375rem;
352
+ border-radius: 50%;
353
+ background: var(--accent);
354
+ color: var(--color-white);
355
+ font-size: 0.6875rem;
356
+ font-weight: 700;
357
+ display: flex;
358
+ align-items: center;
359
+ justify-content: center;
360
+ flex-shrink: 0;
361
+ }
362
+
363
+ .step-text {
364
+ font-size: 0.8125rem;
365
+ color: var(--text-dimmed);
366
+ line-height: 1.4;
367
+ }
368
+
369
+ .tip-row {
370
+ display: flex;
371
+ align-items: flex-start;
372
+ gap: 0.5rem;
373
+ padding: 0.75rem 1rem;
374
+ background: var(--bg-page);
375
+ border-radius: 0.75rem;
376
+ border: 1px solid var(--border-base);
377
+ }
378
+
379
+ .tip-icon {
380
+ flex-shrink: 0;
381
+ color: var(--accent);
382
+ margin-top: 0.1rem;
383
+ }
384
+
385
+ .tip-text {
386
+ font-size: 0.75rem;
387
+ color: var(--text-dimmed);
388
+ line-height: 1.45;
389
+ }
@@ -0,0 +1,50 @@
1
+ import type { ChronoToolEntry, ToolLocaleContent } from '../../types';
2
+
3
+ export type DemagnetizingTimerUI = {
4
+ title: string;
5
+ durationLabel: string;
6
+ duration1s: string;
7
+ duration2s: string;
8
+ duration3s: string;
9
+ customLabel: string;
10
+ startButton: string;
11
+ stopButton: string;
12
+ resetButton: string;
13
+ pressPhase: string;
14
+ holdPhase: string;
15
+ releasePhase: string;
16
+ completePhase: string;
17
+ ready: string;
18
+ seconds: string;
19
+ instructions: string;
20
+ step1: string;
21
+ step2: string;
22
+ step3: string;
23
+ step4: string;
24
+ tipTitle: string;
25
+ tipContent: string;
26
+ };
27
+
28
+ export type DemagnetizingTimerLocaleContent = ToolLocaleContent<DemagnetizingTimerUI>;
29
+
30
+ export const demagnetizingTimer: ChronoToolEntry<DemagnetizingTimerUI> = {
31
+ id: 'demagnetizing-timer',
32
+ icons: { bg: 'mdi:magnet', fg: 'mdi:timelapse' },
33
+ i18n: {
34
+ de: () => import('./i18n/de').then((m) => m.content),
35
+ en: () => import('./i18n/en').then((m) => m.content),
36
+ es: () => import('./i18n/es').then((m) => m.content),
37
+ fr: () => import('./i18n/fr').then((m) => m.content),
38
+ id: () => import('./i18n/id').then((m) => m.content),
39
+ it: () => import('./i18n/it').then((m) => m.content),
40
+ ja: () => import('./i18n/ja').then((m) => m.content),
41
+ ko: () => import('./i18n/ko').then((m) => m.content),
42
+ nl: () => import('./i18n/nl').then((m) => m.content),
43
+ pl: () => import('./i18n/pl').then((m) => m.content),
44
+ pt: () => import('./i18n/pt').then((m) => m.content),
45
+ ru: () => import('./i18n/ru').then((m) => m.content),
46
+ sv: () => import('./i18n/sv').then((m) => m.content),
47
+ tr: () => import('./i18n/tr').then((m) => m.content),
48
+ zh: () => import('./i18n/zh').then((m) => m.content),
49
+ },
50
+ };
@@ -0,0 +1,134 @@
1
+ export interface Particle {
2
+ x: number;
3
+ y: number;
4
+ vx: number;
5
+ vy: number;
6
+ radius: number;
7
+ alpha: number;
8
+ life: number;
9
+ maxLife: number;
10
+ }
11
+
12
+ export class MagneticField {
13
+ private canvas: HTMLCanvasElement;
14
+ private ctx: CanvasRenderingContext2D;
15
+ private particles: Particle[] = [];
16
+ private animationId: number | null = null;
17
+ private active = false;
18
+ private cx = 0;
19
+ private cy = 0;
20
+
21
+ constructor(canvas: HTMLCanvasElement) {
22
+ this.canvas = canvas;
23
+ this.ctx = canvas.getContext('2d')!;
24
+ this.resize();
25
+ }
26
+
27
+ resize() {
28
+ const rect = this.canvas.parentElement!.getBoundingClientRect();
29
+ const size = Math.min(rect.width, 260);
30
+ this.canvas.width = size;
31
+ this.canvas.height = size;
32
+ this.cx = size / 2;
33
+ this.cy = size / 2;
34
+ }
35
+
36
+ start() {
37
+ this.active = true;
38
+ this.particles = [];
39
+ const count = Math.floor(this.cx * 0.3);
40
+ for (let i = 0; i < count; i++) {
41
+ this.particles.push(this.createParticle());
42
+ }
43
+ this.animate();
44
+ }
45
+
46
+ stop() {
47
+ this.active = false;
48
+ if (this.animationId) {
49
+ cancelAnimationFrame(this.animationId);
50
+ this.animationId = null;
51
+ }
52
+ this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
53
+ }
54
+
55
+ private createParticle(): Particle {
56
+ const angle = Math.random() * Math.PI * 2;
57
+ const dist = Math.random() * this.cx * 0.7 + 10;
58
+ return {
59
+ x: this.cx + Math.cos(angle) * dist,
60
+ y: this.cy + Math.sin(angle) * dist,
61
+ vx: 0,
62
+ vy: 0,
63
+ radius: Math.random() * 2.5 + 0.5,
64
+ alpha: Math.random() * 0.6 + 0.2,
65
+ life: 0,
66
+ maxLife: Math.random() * 120 + 60,
67
+ };
68
+ }
69
+
70
+ private updateParticles(color: string) {
71
+ const ctx = this.ctx;
72
+ for (let i = this.particles.length - 1; i >= 0; i--) {
73
+ const p = this.particles[i];
74
+ const dx = this.cx - p.x;
75
+ const dy = this.cy - p.y;
76
+ const dist = Math.sqrt(dx * dx + dy * dy);
77
+
78
+ const force = 200 / (dist + 1);
79
+ p.vx += (dx / dist) * force * 0.008;
80
+ p.vy += (dy / dist) * force * 0.008;
81
+
82
+ p.vx *= 0.94;
83
+ p.vy *= 0.94;
84
+ p.x += p.vx;
85
+ p.y += p.vy;
86
+ p.life++;
87
+
88
+ const radialAlpha = 1 - dist / (this.cx * 0.9);
89
+ const a = p.alpha * Math.min(radialAlpha, 1) * (1 - p.life / p.maxLife);
90
+
91
+ ctx.beginPath();
92
+ ctx.arc(p.x, p.y, p.radius, 0, Math.PI * 2);
93
+ ctx.fillStyle = `rgba(${color}, ${Math.max(a, 0)})`;
94
+ ctx.fill();
95
+
96
+ if (p.life >= p.maxLife || dist > this.cx * 0.95) {
97
+ this.particles[i] = this.createParticle();
98
+ }
99
+ }
100
+ }
101
+
102
+ private animate = () => {
103
+ if (!this.active) return;
104
+ this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
105
+
106
+ const isDark = document.documentElement.classList.contains('theme-dark');
107
+ const color = isDark ? '129, 140, 248' : '99, 102, 241';
108
+
109
+ this.updateParticles(color);
110
+ this.drawFieldLines(color);
111
+ this.animationId = requestAnimationFrame(this.animate);
112
+ };
113
+
114
+ private drawFieldLines(color: string) {
115
+ const ctx = this.ctx;
116
+ const time = Date.now() / 1000;
117
+
118
+ for (let ring = 0; ring < 3; ring++) {
119
+ const baseR = this.cx * (0.25 + ring * 0.18);
120
+ ctx.beginPath();
121
+ for (let a = 0; a <= Math.PI * 2; a += 0.04) {
122
+ const wobble = Math.sin(a * 4 + time * (1.5 - ring * 0.4)) * 4;
123
+ const r = baseR + wobble;
124
+ const x = this.cx + Math.cos(a) * r;
125
+ const y = this.cy + Math.sin(a) * r;
126
+ if (a === 0) ctx.moveTo(x, y);
127
+ else ctx.lineTo(x, y);
128
+ }
129
+ ctx.strokeStyle = `rgba(${color}, ${0.08 - ring * 0.025})`;
130
+ ctx.lineWidth = 1.5;
131
+ ctx.stroke();
132
+ }
133
+ }
134
+ }
@@ -0,0 +1,143 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { DemagnetizingTimerUI } from '../entry';
3
+ import { bibliography } from '../bibliography';
4
+
5
+ export const content: ToolLocaleContent<DemagnetizingTimerUI> = {
6
+ slug: 'entmagnetisierungs-timer',
7
+ title: 'Uhren Entmagnetisierungs Timer & Anleitung',
8
+ description: 'Ein präziser Countdown-Timer mit akustischen Signalen zur DIY-Entmagnetisierung von Uhren. Ermitteln Sie die genaue Haltedauer für Ihre Entmagnetisierungsspule.',
9
+ ui: {
10
+ title: 'Timer Einstellungen',
11
+ durationLabel: 'Pulsdauer',
12
+ duration1s: '1 Sekunde',
13
+ duration2s: '2 Sekunden',
14
+ duration3s: '3 Sekunden',
15
+ customLabel: 'Benutzerdefiniert',
16
+ startButton: 'Start',
17
+ stopButton: 'Stopp',
18
+ resetButton: 'Zurücksetzen',
19
+ pressPhase: 'Entmagnetisierer-Taste jetzt drücken!',
20
+ holdPhase: 'Taste gedrückt halten...',
21
+ releasePhase: 'Jetzt loslassen!',
22
+ completePhase: 'Fertig! Uhr wegbewegen.',
23
+ ready: 'Bereit',
24
+ seconds: 's',
25
+ instructions: 'So entmagnetisieren Sie',
26
+ step1: 'Legen Sie die Uhr auf die Entmagnetisierer-Plattform.',
27
+ step2: 'Drücken Sie Start und halten Sie die Entmagnetisierer-Taste für die eingestellte Dauer gedrückt.',
28
+ step3: 'Lassen Sie die Taste los und bewegen Sie die Uhr langsam weg.',
29
+ step4: 'Wiederholen Sie den Vorgang 2–3 Mal und drehen Sie die Uhr dabei jeweils.',
30
+ tipTitle: 'Tipp',
31
+ tipContent: 'Halten Sie die Uhr mindestens 1 Meter vom Entmagnetisierer entfernt, wenn er eingeschaltet ist, um eine erneute Magnetisierung zu vermeiden.',
32
+ },
33
+ seo: [
34
+ { type: 'title', text: 'Uhren-Entmagnetisierungs-Timer — Präzises Timing für die DIY-Entmagnetisierung', level: 2 },
35
+ { type: 'paragraph', html: 'Die Entmagnetisierung einer Uhr erfordert präzises Timing beim Tastendruck. Die meisten DIY-Entmagnetisierer erzeugen ein abklingendes magnetisches Wechselfeld, und der ideale Puls dauert zwischen <strong>1 und 3 Sekunden</strong>. Zu kurz und das Feld neutralisiert die Magnetisierung nicht; zu lang und Sie riskieren eine Sättigung des Werks.' },
36
+ { type: 'title', text: 'Warum das Timing bei der Uhren-Entmagnetisierung entscheidend ist', level: 3 },
37
+ { type: 'paragraph', html: 'Wenn Sie die Taste am Entmagnetisierer drücken, entsteht im Inneren der Spule ein magnetisches Wechselfeld. Das Feld oszilliert mit der Netzfrequenz (50/60 Hz) und klingt beim Loslassen ab. Ziel ist es, die Uhr <strong>gerade lange genug</strong> diesem abklingenden Feld auszusetzen, um die magnetischen Domänen in der Spirale und anderen Stahlkomponenten zu randomisieren. Ein Puls von 1 bis 3 Sekunden ist für die meisten Werke ideal.' },
38
+ { type: 'title', text: 'Wie ein Entmagnetisierer funktioniert', level: 3 },
39
+ { type: 'paragraph', html: 'Ein Entmagnetisierer ist im Wesentlichen eine Drahtspule, die bei Bestromung ein starkes magnetisches Wechselfeld erzeugt. Wird eine magnetisierte Uhr in dieses Feld gelegt, kippen ihre internen magnetischen Domänen schnell hin und her. Wird das Feld abrupt abgeschaltet (durch Loslassen der Taste), setzen sich die Domänen in einem zufälligen Muster fest und heben die Nettomagnetisierung effektiv auf.' },
40
+ { type: 'title', text: 'Anzeichen, dass Ihre Uhr entmagnetisiert werden muss', level: 3 },
41
+ { type: 'paragraph', html: 'Häufige Symptome einer magnetisierten Uhr sind: tägliches Vorlaufen um mehrere Minuten, inkonsistenter Gang in verschiedenen Positionen, ein hörbar schnelleres Tickgeräusch und in extremen Fällen ein völliger Stillstand. Wenn Ihre Automatikuhr plötzlich schnell läuft, ist oft eine Magnetisierung die Ursache – und die Entmagnetisierung eine einfache Lösung.' },
42
+ ],
43
+ faq: [
44
+ {
45
+ question: 'Wie lange soll ich die Entmagnetisierer-Taste drücken?',
46
+ answer: '1 bis 3 Sekunden ist die empfohlene Pulsdauer. Beginnen Sie mit 1 Sekunde und steigern Sie bei Bedarf. Zu lange Pulse können die Spule überhitzen und bringen keine besseren Ergebnisse.',
47
+ },
48
+ {
49
+ question: 'Kann ich eine Uhr mehr als einmal entmagnetisieren?',
50
+ answer: 'Ja. Wiederholen Sie den Vorgang 2 bis 3 Mal und drehen Sie die Uhr jedes Mal um 90 Grad. So werden alle Achsen dem Wechselfeld ausgesetzt. Eine Über-Entmagnetisierung ist nicht möglich.',
51
+ },
52
+ {
53
+ question: 'Wirkt die Entmagnetisierung auch bei Quarzuhren?',
54
+ answer: 'Quarzuhren sind selten von Magnetisierung betroffen, da sie nur wenige ferromagnetische Teile enthalten. Allerdings kann sich der Schrittmotor in manchen Quarzwerken magnetisieren, was zu unruhigem Zeigerlauf führt. Die Entmagnetisierung ist auch für Quarzuhren sicher.',
55
+ },
56
+ ],
57
+ bibliography,
58
+ howTo: [
59
+ {
60
+ name: 'Dauer einstellen',
61
+ text: 'Wählen Sie 1, 2 oder 3 Sekunden, je nach Stärke der Magnetisierung.',
62
+ },
63
+ {
64
+ name: 'Uhr positionieren',
65
+ text: 'Legen Sie die Uhr flach auf die Entmagnetisierer-Plattform, zentriert über der Spule.',
66
+ },
67
+ {
68
+ name: 'Drücken und halten',
69
+ text: 'Drücken Sie gleichzeitig die Start-Taste und die Entmagnetisierer-Taste und halten Sie sie für die eingestellte Dauer.',
70
+ },
71
+ {
72
+ name: 'Loslassen und wegbewegen',
73
+ text: 'Lassen Sie die Taste los und bewegen Sie die Uhr mindestens 1 Meter weg, bevor Sie den Entmagnetisierer ausschalten.',
74
+ },
75
+ ],
76
+ schemas: [
77
+ {
78
+ '@context': 'https://schema.org',
79
+ '@type': 'FAQPage',
80
+ 'mainEntity': [
81
+ {
82
+ '@type': 'Question',
83
+ 'name': 'Wie lange soll ich die Entmagnetisierer-Taste drücken?',
84
+ 'acceptedAnswer': {
85
+ '@type': 'Answer',
86
+ 'text': '1 bis 3 Sekunden ist die empfohlene Pulsdauer. Beginnen Sie mit 1 Sekunde und steigern Sie bei Bedarf. Zu lange Pulse können die Spule überhitzen und bringen keine besseren Ergebnisse.',
87
+ },
88
+ },
89
+ {
90
+ '@type': 'Question',
91
+ 'name': 'Kann ich eine Uhr mehr als einmal entmagnetisieren?',
92
+ 'acceptedAnswer': {
93
+ '@type': 'Answer',
94
+ 'text': 'Ja. Wiederholen Sie den Vorgang 2 bis 3 Mal und drehen Sie die Uhr jedes Mal um 90 Grad. So werden alle Achsen dem Wechselfeld ausgesetzt. Eine Über-Entmagnetisierung ist nicht möglich.',
95
+ },
96
+ },
97
+ {
98
+ '@type': 'Question',
99
+ 'name': 'Wirkt die Entmagnetisierung auch bei Quarzuhren?',
100
+ 'acceptedAnswer': {
101
+ '@type': 'Answer',
102
+ 'text': 'Quarzuhren sind selten von Magnetisierung betroffen, da sie nur wenige ferromagnetische Teile enthalten. Allerdings kann sich der Schrittmotor in manchen Quarzwerken magnetisieren, was zu unruhigem Zeigerlauf führt. Die Entmagnetisierung ist auch für Quarzuhren sicher.',
103
+ },
104
+ },
105
+ ],
106
+ },
107
+ {
108
+ '@context': 'https://schema.org',
109
+ '@type': 'SoftwareApplication',
110
+ 'name': 'Uhren-Entmagnetisierungs-Timer & Anleitung',
111
+ 'operatingSystem': 'All',
112
+ 'applicationCategory': 'UtilitiesApplication',
113
+ 'browserRequirements': 'Requires HTML5. Requires JavaScript.',
114
+ },
115
+ {
116
+ '@context': 'https://schema.org',
117
+ '@type': 'HowTo',
118
+ 'name': 'So entmagnetisieren Sie eine Uhr',
119
+ 'step': [
120
+ {
121
+ '@type': 'HowToStep',
122
+ 'name': 'Dauer einstellen',
123
+ 'text': 'Wählen Sie 1, 2 oder 3 Sekunden, je nach Stärke der Magnetisierung.',
124
+ },
125
+ {
126
+ '@type': 'HowToStep',
127
+ 'name': 'Uhr positionieren',
128
+ 'text': 'Legen Sie die Uhr flach auf die Entmagnetisierer-Plattform, zentriert über der Spule.',
129
+ },
130
+ {
131
+ '@type': 'HowToStep',
132
+ 'name': 'Drücken und halten',
133
+ 'text': 'Drücken Sie gleichzeitig die Start-Taste und die Entmagnetisierer-Taste und halten Sie sie für die eingestellte Dauer.',
134
+ },
135
+ {
136
+ '@type': 'HowToStep',
137
+ 'name': 'Loslassen und wegbewegen',
138
+ 'text': 'Lassen Sie die Taste los und bewegen Sie die Uhr mindestens 1 Meter weg, bevor Sie den Entmagnetisierer ausschalten.',
139
+ },
140
+ ],
141
+ },
142
+ ],
143
+ };