@jjlmoya/utils-chrono 1.3.0 → 1.4.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 (160) hide show
  1. package/package.json +1 -1
  2. package/src/category/i18n/de.ts +11 -9
  3. package/src/category/i18n/en.ts +11 -9
  4. package/src/category/i18n/fr.ts +11 -9
  5. package/src/category/i18n/id.ts +11 -9
  6. package/src/category/i18n/it.ts +11 -9
  7. package/src/category/i18n/ja.ts +11 -9
  8. package/src/category/i18n/ko.ts +11 -9
  9. package/src/category/i18n/nl.ts +11 -9
  10. package/src/category/i18n/pl.ts +11 -9
  11. package/src/category/i18n/pt.ts +11 -9
  12. package/src/category/i18n/ru.ts +11 -9
  13. package/src/category/i18n/sv.ts +11 -9
  14. package/src/category/i18n/tr.ts +11 -9
  15. package/src/category/i18n/zh.ts +11 -9
  16. package/src/category/index.ts +6 -0
  17. package/src/entries.ts +10 -1
  18. package/src/index.ts +3 -0
  19. package/src/tests/locale_completeness.test.ts +1 -1
  20. package/src/tests/no_h1_in_components.test.ts +1 -1
  21. package/src/tests/tool_validation.test.ts +1 -1
  22. package/src/tool/beat-rate-converter/bibliography.ts +1 -1
  23. package/src/tool/beat-rate-converter/components/ConverterPanel.astro +57 -20
  24. package/src/tool/beat-rate-converter/i18n/en.ts +5 -5
  25. package/src/tool/crown-reference-guide/bibliography.ts +3 -3
  26. package/src/tool/crown-reference-guide/i18n/de.ts +37 -29
  27. package/src/tool/crown-reference-guide/i18n/en.ts +38 -30
  28. package/src/tool/crown-reference-guide/i18n/es.ts +36 -28
  29. package/src/tool/crown-reference-guide/i18n/fr.ts +38 -30
  30. package/src/tool/crown-reference-guide/i18n/id.ts +38 -30
  31. package/src/tool/crown-reference-guide/i18n/it.ts +38 -30
  32. package/src/tool/crown-reference-guide/i18n/ja.ts +38 -30
  33. package/src/tool/crown-reference-guide/i18n/ko.ts +38 -30
  34. package/src/tool/crown-reference-guide/i18n/nl.ts +38 -30
  35. package/src/tool/crown-reference-guide/i18n/pl.ts +38 -30
  36. package/src/tool/crown-reference-guide/i18n/pt.ts +38 -30
  37. package/src/tool/crown-reference-guide/i18n/ru.ts +41 -33
  38. package/src/tool/crown-reference-guide/i18n/sv.ts +38 -30
  39. package/src/tool/crown-reference-guide/i18n/tr.ts +38 -30
  40. package/src/tool/crown-reference-guide/i18n/zh.ts +37 -29
  41. package/src/tool/demagnetizing-timer/i18n/de.ts +1 -1
  42. package/src/tool/demagnetizing-timer/i18n/en.ts +1 -1
  43. package/src/tool/demagnetizing-timer/i18n/es.ts +1 -1
  44. package/src/tool/demagnetizing-timer/i18n/fr.ts +1 -1
  45. package/src/tool/demagnetizing-timer/i18n/id.ts +1 -1
  46. package/src/tool/demagnetizing-timer/i18n/it.ts +1 -1
  47. package/src/tool/demagnetizing-timer/i18n/ja.ts +1 -1
  48. package/src/tool/demagnetizing-timer/i18n/ko.ts +1 -1
  49. package/src/tool/demagnetizing-timer/i18n/nl.ts +1 -1
  50. package/src/tool/demagnetizing-timer/i18n/pl.ts +2 -2
  51. package/src/tool/demagnetizing-timer/i18n/pt.ts +1 -1
  52. package/src/tool/demagnetizing-timer/i18n/ru.ts +7 -7
  53. package/src/tool/demagnetizing-timer/i18n/sv.ts +1 -1
  54. package/src/tool/demagnetizing-timer/i18n/tr.ts +1 -1
  55. package/src/tool/demagnetizing-timer/i18n/zh.ts +1 -1
  56. package/src/tool/lume-color-simulator/bibliography.astro +16 -0
  57. package/src/tool/lume-color-simulator/bibliography.ts +16 -0
  58. package/src/tool/lume-color-simulator/client.ts +186 -0
  59. package/src/tool/lume-color-simulator/component.astro +17 -0
  60. package/src/tool/lume-color-simulator/components/LumePanel.astro +98 -0
  61. package/src/tool/lume-color-simulator/entry.ts +57 -0
  62. package/src/tool/lume-color-simulator/i18n/de.ts +174 -0
  63. package/src/tool/lume-color-simulator/i18n/en.ts +174 -0
  64. package/src/tool/lume-color-simulator/i18n/es.ts +174 -0
  65. package/src/tool/lume-color-simulator/i18n/fr.ts +174 -0
  66. package/src/tool/lume-color-simulator/i18n/id.ts +174 -0
  67. package/src/tool/lume-color-simulator/i18n/it.ts +175 -0
  68. package/src/tool/lume-color-simulator/i18n/ja.ts +174 -0
  69. package/src/tool/lume-color-simulator/i18n/ko.ts +174 -0
  70. package/src/tool/lume-color-simulator/i18n/nl.ts +175 -0
  71. package/src/tool/lume-color-simulator/i18n/pl.ts +174 -0
  72. package/src/tool/lume-color-simulator/i18n/pt.ts +174 -0
  73. package/src/tool/lume-color-simulator/i18n/ru.ts +174 -0
  74. package/src/tool/lume-color-simulator/i18n/sv.ts +174 -0
  75. package/src/tool/lume-color-simulator/i18n/tr.ts +174 -0
  76. package/src/tool/lume-color-simulator/i18n/zh.ts +174 -0
  77. package/src/tool/lume-color-simulator/index.ts +11 -0
  78. package/src/tool/lume-color-simulator/lume-color-simulator.css +208 -0
  79. package/src/tool/lume-color-simulator/seo.astro +16 -0
  80. package/src/tool/moon-phase-visualizer/bibliography.astro +16 -0
  81. package/src/tool/moon-phase-visualizer/bibliography.ts +16 -0
  82. package/src/tool/moon-phase-visualizer/client.ts +243 -0
  83. package/src/tool/moon-phase-visualizer/component.astro +17 -0
  84. package/src/tool/moon-phase-visualizer/components/MoonPanel.astro +63 -0
  85. package/src/tool/moon-phase-visualizer/entry.ts +51 -0
  86. package/src/tool/moon-phase-visualizer/i18n/de.ts +175 -0
  87. package/src/tool/moon-phase-visualizer/i18n/en.ts +175 -0
  88. package/src/tool/moon-phase-visualizer/i18n/es.ts +175 -0
  89. package/src/tool/moon-phase-visualizer/i18n/fr.ts +175 -0
  90. package/src/tool/moon-phase-visualizer/i18n/id.ts +175 -0
  91. package/src/tool/moon-phase-visualizer/i18n/it.ts +176 -0
  92. package/src/tool/moon-phase-visualizer/i18n/ja.ts +175 -0
  93. package/src/tool/moon-phase-visualizer/i18n/ko.ts +175 -0
  94. package/src/tool/moon-phase-visualizer/i18n/nl.ts +176 -0
  95. package/src/tool/moon-phase-visualizer/i18n/pl.ts +175 -0
  96. package/src/tool/moon-phase-visualizer/i18n/pt.ts +175 -0
  97. package/src/tool/moon-phase-visualizer/i18n/ru.ts +175 -0
  98. package/src/tool/moon-phase-visualizer/i18n/sv.ts +175 -0
  99. package/src/tool/moon-phase-visualizer/i18n/tr.ts +175 -0
  100. package/src/tool/moon-phase-visualizer/i18n/zh.ts +175 -0
  101. package/src/tool/moon-phase-visualizer/index.ts +11 -0
  102. package/src/tool/moon-phase-visualizer/moon-phase-visualizer.css +216 -0
  103. package/src/tool/moon-phase-visualizer/seo.astro +16 -0
  104. package/src/tool/power-reserve-estimator/bibliography.ts +2 -2
  105. package/src/tool/power-reserve-estimator/components/EstimatorPanel.astro +146 -39
  106. package/src/tool/power-reserve-estimator/i18n/en.ts +3 -3
  107. package/src/tool/strap-taper-calculator/i18n/en.ts +2 -2
  108. package/src/tool/strap-taper-calculator/i18n/ru.ts +3 -3
  109. package/src/tool/watch-accuracy-tracker/i18n/ru.ts +2 -2
  110. package/src/tool/watch-savings-planner/i18n/en.ts +5 -5
  111. package/src/tool/watch-size-comparator/bibliography.astro +16 -0
  112. package/src/tool/watch-size-comparator/bibliography.ts +16 -0
  113. package/src/tool/watch-size-comparator/client.ts +287 -0
  114. package/src/tool/watch-size-comparator/component.astro +17 -0
  115. package/src/tool/watch-size-comparator/components/WatchForm.astro +121 -0
  116. package/src/tool/watch-size-comparator/drawing/index.ts +79 -0
  117. package/src/tool/watch-size-comparator/drawing/measures.ts +57 -0
  118. package/src/tool/watch-size-comparator/drawing/utils.ts +37 -0
  119. package/src/tool/watch-size-comparator/drawing/watch.ts +78 -0
  120. package/src/tool/watch-size-comparator/entry.ts +62 -0
  121. package/src/tool/watch-size-comparator/i18n/de.ts +189 -0
  122. package/src/tool/watch-size-comparator/i18n/en.ts +189 -0
  123. package/src/tool/watch-size-comparator/i18n/es.ts +189 -0
  124. package/src/tool/watch-size-comparator/i18n/fr.ts +189 -0
  125. package/src/tool/watch-size-comparator/i18n/id.ts +189 -0
  126. package/src/tool/watch-size-comparator/i18n/it.ts +190 -0
  127. package/src/tool/watch-size-comparator/i18n/ja.ts +189 -0
  128. package/src/tool/watch-size-comparator/i18n/ko.ts +189 -0
  129. package/src/tool/watch-size-comparator/i18n/nl.ts +190 -0
  130. package/src/tool/watch-size-comparator/i18n/pl.ts +189 -0
  131. package/src/tool/watch-size-comparator/i18n/pt.ts +189 -0
  132. package/src/tool/watch-size-comparator/i18n/ru.ts +189 -0
  133. package/src/tool/watch-size-comparator/i18n/sv.ts +189 -0
  134. package/src/tool/watch-size-comparator/i18n/tr.ts +189 -0
  135. package/src/tool/watch-size-comparator/i18n/zh.ts +189 -0
  136. package/src/tool/watch-size-comparator/index.ts +11 -0
  137. package/src/tool/watch-size-comparator/seo.astro +16 -0
  138. package/src/tool/watch-size-comparator/watch-size-comparator.css +373 -0
  139. package/src/tool/water-resistance-converter/bibliography.ts +2 -2
  140. package/src/tool/water-resistance-converter/i18n/de.ts +5 -5
  141. package/src/tool/water-resistance-converter/i18n/en.ts +6 -6
  142. package/src/tool/water-resistance-converter/i18n/es.ts +6 -6
  143. package/src/tool/water-resistance-converter/i18n/fr.ts +6 -6
  144. package/src/tool/water-resistance-converter/i18n/id.ts +6 -6
  145. package/src/tool/water-resistance-converter/i18n/it.ts +6 -6
  146. package/src/tool/water-resistance-converter/i18n/ja.ts +6 -6
  147. package/src/tool/water-resistance-converter/i18n/ko.ts +6 -6
  148. package/src/tool/water-resistance-converter/i18n/nl.ts +6 -6
  149. package/src/tool/water-resistance-converter/i18n/pl.ts +6 -6
  150. package/src/tool/water-resistance-converter/i18n/pt.ts +6 -6
  151. package/src/tool/water-resistance-converter/i18n/ru.ts +8 -8
  152. package/src/tool/water-resistance-converter/i18n/sv.ts +6 -6
  153. package/src/tool/water-resistance-converter/i18n/tr.ts +6 -6
  154. package/src/tool/water-resistance-converter/i18n/zh.ts +3 -3
  155. package/src/tool/wrist-presence-calculator/i18n/fr.ts +1 -1
  156. package/src/tool/wrist-presence-calculator/i18n/pl.ts +1 -1
  157. package/src/tool/wrist-presence-calculator/i18n/pt.ts +1 -1
  158. package/src/tool/wrist-presence-calculator/i18n/ru.ts +5 -5
  159. package/src/tool/wrist-presence-calculator/i18n/sv.ts +1 -1
  160. package/src/tools.ts +6 -0
@@ -0,0 +1,186 @@
1
+ interface LumePreset {
2
+ id: string;
3
+ dayColor: [number, number, number];
4
+ nightColor: [number, number, number];
5
+ name: string;
6
+ colorName: string;
7
+ }
8
+
9
+ const LUME_PRESETS: Record<string, LumePreset> = {
10
+ c1: { id: 'c1', dayColor: [200, 230, 201], nightColor: [80, 200, 80], name: 'C1', colorName: 'Classic Green' },
11
+ c3: { id: 'c3', dayColor: [165, 214, 167], nightColor: [50, 220, 60], name: 'C3', colorName: 'Super Green' },
12
+ bgw9: { id: 'bgw9', dayColor: [224, 231, 255], nightColor: [90, 160, 255], name: 'BGW9', colorName: 'Ice Blue' },
13
+ luminova: { id: 'luminova', dayColor: [215, 204, 200], nightColor: [180, 200, 180], name: 'LumiNova', colorName: 'Warm White' },
14
+ vintage: { id: 'vintage', dayColor: [188, 170, 164], nightColor: [140, 120, 80], name: 'Vintage', colorName: 'Aged Radium' },
15
+ orange: { id: 'orange', dayColor: [255, 204, 128], nightColor: [255, 130, 30], name: 'Orange', colorName: 'Diver Orange' },
16
+ blue: { id: 'blue', dayColor: [144, 202, 249], nightColor: [40, 100, 220], name: 'Blue', colorName: 'Deep Blue' },
17
+ green: { id: 'green', dayColor: [129, 199, 132], nightColor: [30, 200, 50], name: 'Green', colorName: 'Neon Green' },
18
+ };
19
+
20
+ const canvas = document.getElementById('lume-canvas') as HTMLCanvasElement;
21
+ const ctx = canvas.getContext('2d')!;
22
+ const slider = document.getElementById('brightness-slider') as HTMLInputElement;
23
+ const presetBtns = document.querySelectorAll('.preset-btn') as NodeListOf<HTMLElement>;
24
+ const infoType = document.getElementById('info-type') as HTMLElement;
25
+ const infoColor = document.getElementById('info-color') as HTMLElement;
26
+ const infoHex = document.getElementById('info-hex') as HTMLElement;
27
+ const infoRgb = document.getElementById('info-rgb') as HTMLElement;
28
+
29
+ let activeLume = 'c1';
30
+
31
+ function lerpColor(a: [number, number, number], b: [number, number, number], t: number): [number, number, number] {
32
+ return [
33
+ Math.round(a[0] + (b[0] - a[0]) * t),
34
+ Math.round(a[1] + (b[1] - a[1]) * t),
35
+ Math.round(a[2] + (b[2] - a[2]) * t),
36
+ ];
37
+ }
38
+
39
+ function rgbToHex(r: number, g: number, b: number): string {
40
+ return '#' + [r, g, b].map((x) => x.toString(16).padStart(2, '0')).join('');
41
+ }
42
+
43
+ function getBrightness(): number {
44
+ return parseInt(slider.value) / 100;
45
+ }
46
+
47
+ function drawBackground(h: number, w: number, brightness: number): void {
48
+ const bgBrightness = Math.round(brightness * 180) + 20;
49
+ ctx.fillStyle = `rgb(${bgBrightness}, ${bgBrightness}, ${Math.round(bgBrightness * 0.95)})`;
50
+ ctx.fillRect(0, 0, w, h);
51
+ }
52
+
53
+ function drawWatchBody(cx: number, cy: number, radius: number, brightness: number): void {
54
+ ctx.save();
55
+ ctx.shadowColor = 'rgba(0,0,0,0.3)';
56
+ ctx.shadowBlur = 20;
57
+ ctx.shadowOffsetY = 4;
58
+ ctx.beginPath();
59
+ ctx.arc(cx, cy, radius, 0, Math.PI * 2);
60
+ ctx.fillStyle = brightness < 0.4 ? `rgb(${Math.round(brightness * 180 + 5)}, ${Math.round(brightness * 180 + 5)}, ${Math.round(brightness * 180 + 5)})` : '#333';
61
+ ctx.fill();
62
+ ctx.restore();
63
+
64
+ ctx.beginPath();
65
+ ctx.arc(cx, cy, radius, 0, Math.PI * 2);
66
+ ctx.fillStyle = brightness < 0.4 ? '#444' : '#555';
67
+ ctx.fill();
68
+
69
+ ctx.beginPath();
70
+ ctx.arc(cx, cy, radius - 8, 0, Math.PI * 2);
71
+ ctx.fillStyle = brightness < 0.4 ? '#3a3a3a' : '#4a4a4a';
72
+ ctx.fill();
73
+
74
+ ctx.beginPath();
75
+ ctx.arc(cx, cy, radius - 14, 0, Math.PI * 2);
76
+ ctx.fillStyle = brightness < 0.3 ? '#2a2a2a' : '#3a3a3a';
77
+ ctx.fill();
78
+ }
79
+
80
+ function drawLumeMarkers(o: { cx: number; cy: number; radius: number; preset: LumePreset; brightness: number }): void {
81
+ const { cx, cy, radius, preset, brightness } = o;
82
+ for (let i = 0; i < 12; i++) {
83
+ const angle = (i * 30 - 90) * Math.PI / 180;
84
+ const mx = cx + Math.cos(angle) * (radius - 28);
85
+ const my = cy + Math.sin(angle) * (radius - 28);
86
+ const markerSize = i % 3 === 0 ? 5 : 3;
87
+ const markerBrightness = i % 3 === 0 ? 1 : 0.8;
88
+ const markerColor = lerpColor(preset.nightColor, preset.dayColor, brightness * markerBrightness);
89
+
90
+ ctx.beginPath();
91
+ ctx.arc(mx, my, markerSize, 0, Math.PI * 2);
92
+ ctx.fillStyle = `rgb(${markerColor[0]}, ${markerColor[1]}, ${markerColor[2]})`;
93
+
94
+ if (brightness < 0.5) {
95
+ ctx.save();
96
+ ctx.shadowColor = `rgb(${markerColor[0]}, ${markerColor[1]}, ${markerColor[2]})`;
97
+ ctx.shadowBlur = (1 - brightness) * 20;
98
+ ctx.fill();
99
+ ctx.restore();
100
+ } else {
101
+ ctx.fill();
102
+ }
103
+ }
104
+ }
105
+
106
+ function drawLumeHands(cx: number, cy: number, color: [number, number, number], brightness: number): void {
107
+ const hands = [
108
+ { length: 34, width: 2.5, angle: -60 },
109
+ { length: 42, width: 2, angle: 15 },
110
+ ];
111
+
112
+ for (const hand of hands) {
113
+ const angle = (hand.angle - 90) * Math.PI / 180;
114
+ const hx = cx + Math.cos(angle) * hand.length;
115
+ const hy = cy + Math.sin(angle) * hand.length;
116
+
117
+ ctx.save();
118
+ ctx.shadowColor = brightness < 0.5 ? `rgb(${color[0]}, ${color[1]}, ${color[2]})` : 'transparent';
119
+ ctx.shadowBlur = brightness < 0.5 ? (1 - brightness) * 15 : 0;
120
+ ctx.beginPath();
121
+ ctx.moveTo(cx, cy);
122
+ ctx.lineTo(hx, hy);
123
+ ctx.strokeStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
124
+ ctx.lineWidth = hand.width;
125
+ ctx.lineCap = 'round';
126
+ ctx.stroke();
127
+ ctx.restore();
128
+ }
129
+
130
+ ctx.beginPath();
131
+ ctx.arc(cx, cy, 3, 0, Math.PI * 2);
132
+ ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
133
+ ctx.fill();
134
+ }
135
+
136
+ function drawLabel(cx: number, h: number, preset: LumePreset, brightness: number): void {
137
+ ctx.fillStyle = brightness < 0.5 ? '#aaa' : '#666';
138
+ ctx.font = '11px sans-serif';
139
+ ctx.textAlign = 'center';
140
+ ctx.fillText(
141
+ `${preset.name} \u00b7 ${Math.round((1 - brightness) * 100)}% glow`,
142
+ cx, h - 12
143
+ );
144
+ }
145
+
146
+ function updateInfo(preset: LumePreset, brightness: number): void {
147
+ const color = lerpColor(preset.nightColor, preset.dayColor, brightness);
148
+ infoType.textContent = preset.name;
149
+ infoColor.textContent = preset.colorName;
150
+ infoHex.textContent = rgbToHex(color[0], color[1], color[2]);
151
+ infoRgb.textContent = `${color[0]}, ${color[1]}, ${color[2]}`;
152
+ }
153
+
154
+ function drawLume(): void {
155
+ const preset = LUME_PRESETS[activeLume];
156
+ if (!preset) return;
157
+
158
+ const brightness = getBrightness();
159
+ const W = canvas.width;
160
+ const H = canvas.height;
161
+ const cx = W / 2;
162
+ const cy = H / 2;
163
+ const radius = 62;
164
+
165
+ drawBackground(H, W, brightness);
166
+ drawWatchBody(cx, cy, radius, brightness);
167
+ drawLumeMarkers({ cx, cy, radius, preset, brightness });
168
+
169
+ const color = lerpColor(preset.nightColor, preset.dayColor, brightness);
170
+ drawLumeHands(cx, cy, color, brightness);
171
+ drawLabel(cx, H, preset, brightness);
172
+ updateInfo(preset, brightness);
173
+ }
174
+
175
+ presetBtns.forEach((btn) => {
176
+ btn.addEventListener('click', () => {
177
+ presetBtns.forEach((b) => b.classList.remove('active'));
178
+ btn.classList.add('active');
179
+ activeLume = btn.dataset.lume || 'c1';
180
+ drawLume();
181
+ });
182
+ });
183
+
184
+ slider.addEventListener('input', drawLume);
185
+
186
+ drawLume();
@@ -0,0 +1,17 @@
1
+ ---
2
+ import LumePanel from './components/LumePanel.astro';
3
+
4
+ interface Props {
5
+ ui: Record<string, string>;
6
+ }
7
+
8
+ const { ui } = Astro.props;
9
+ ---
10
+
11
+ <link href="./lume-color-simulator.css" rel="stylesheet" />
12
+
13
+ <div class="tool-main-card" data-ui={JSON.stringify(ui)}>
14
+ <LumePanel labels={ui} />
15
+ </div>
16
+
17
+ <script src="./client.ts"></script>
@@ -0,0 +1,98 @@
1
+ ---
2
+ interface Props {
3
+ labels: Record<string, string>;
4
+ }
5
+
6
+ const { labels } = Astro.props;
7
+ ---
8
+
9
+ <div class="lume-panel">
10
+ <div class="panel-section">
11
+ <div class="section-label">{labels.lumeType || "Lume Type"}</div>
12
+ <div class="preset-grid" id="preset-grid">
13
+ <button type="button" class="preset-btn active" data-lume="c1">
14
+ <span class="preset-swatch" style="background:#c8e6c9"></span>
15
+ <span class="preset-name">{labels.c1Name || "C1"}</span>
16
+ <span class="preset-desc">{labels.c1Desc || "Green (classic)"}</span>
17
+ </button>
18
+ <button type="button" class="preset-btn" data-lume="c3">
19
+ <span class="preset-swatch" style="background:#a5d6a7"></span>
20
+ <span class="preset-name">{labels.c3Name || "C3"}</span>
21
+ <span class="preset-desc">{labels.c3Desc || "Super Green"}</span>
22
+ </button>
23
+ <button type="button" class="preset-btn" data-lume="bgw9">
24
+ <span class="preset-swatch" style="background:#e0e7ff"></span>
25
+ <span class="preset-name">{labels.bgw9Name || "BGW9"}</span>
26
+ <span class="preset-desc">{labels.bgw9Desc || "Ice Blue"}</span>
27
+ </button>
28
+ <button type="button" class="preset-btn" data-lume="luminova">
29
+ <span class="preset-swatch" style="background:#d7ccc8"></span>
30
+ <span class="preset-name">{labels.lumiNovaName || "LumiNova"}</span>
31
+ <span class="preset-desc">{labels.lumiNovaDesc || "Warm White"}</span>
32
+ </button>
33
+ <button type="button" class="preset-btn" data-lume="vintage">
34
+ <span class="preset-swatch" style="background:#bcaaa4"></span>
35
+ <span class="preset-name">{labels.vintageName || "Vintage"}</span>
36
+ <span class="preset-desc">{labels.vintageDesc || "Aged Radium"}</span>
37
+ </button>
38
+ <button type="button" class="preset-btn" data-lume="orange">
39
+ <span class="preset-swatch" style="background:#ffcc80"></span>
40
+ <span class="preset-name">{labels.orangeName || "Orange"}</span>
41
+ <span class="preset-desc">{labels.orangeDesc || "Diver Orange"}</span>
42
+ </button>
43
+ <button type="button" class="preset-btn" data-lume="blue">
44
+ <span class="preset-swatch" style="background:#90caf9"></span>
45
+ <span class="preset-name">{labels.blueName || "Blue"}</span>
46
+ <span class="preset-desc">{labels.blueDesc || "Deep Blue"}</span>
47
+ </button>
48
+ <button type="button" class="preset-btn" data-lume="green">
49
+ <span class="preset-swatch" style="background:#81c784"></span>
50
+ <span class="preset-name">{labels.greenName || "Green"}</span>
51
+ <span class="preset-desc">{labels.greenDesc || "Neon Green"}</span>
52
+ </button>
53
+ </div>
54
+ </div>
55
+
56
+ <div class="panel-section">
57
+ <div class="section-label">{labels.brightness || "Ambient Brightness"}</div>
58
+ <div class="slider-row">
59
+ <span class="slider-icon">
60
+ <svg viewBox="0 0 24 24" width="18" height="18"><path d="M6.76 4.84l-1.8-1.79-1.41 1.41 1.79 1.79 1.42-1.41zM4 10.5H1v2h3v-2zm9-9.95h-2V3.5h2V.55zm7.45 3.91l-1.41-1.41-1.79 1.79 1.41 1.41 1.79-1.79zm-3.21 13.7l1.79 1.8 1.41-1.41-1.8-1.79-1.4 1.4zM20 10.5v2h3v-2h-3zm-8-5c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6zm-1 16.95h2V19.5h-2v2.95zm-7.45-3.91l1.41 1.41 1.79-1.8-1.41-1.41-1.79 1.8z" fill="currentColor"/></svg>
61
+ </span>
62
+ <input type="range" id="brightness-slider" min="0" max="100" value="20" />
63
+ <span class="slider-icon">
64
+ <svg viewBox="0 0 24 24" width="18" height="18"><path d="M20.21 15.71c-.87.39-1.82.59-2.79.59-3.87 0-7-3.13-7-7 0-1.67.57-3.22 1.53-4.47.12-.15.1-.37-.02-.5-.12-.12-.34-.13-.48-.03-2.04 1.52-3.34 3.91-3.34 6.5 0 4.42 3.58 8 8 8 1.35 0 2.64-.34 3.79-.96.15-.07.22-.24.15-.39-.07-.15-.24-.22-.39-.15-.05.02-.12.05-.15.07z" fill="currentColor"/></svg>
65
+ </span>
66
+ </div>
67
+ </div>
68
+
69
+ <div class="lume-canvas-wrapper">
70
+ <canvas id="lume-canvas" width="400" height="180"></canvas>
71
+ </div>
72
+
73
+ <div class="color-info" id="color-info">
74
+ <div class="color-info-item">
75
+ <span class="color-info-label">{labels.type || "Type"}</span>
76
+ <span class="color-info-value" id="info-type">C1</span>
77
+ </div>
78
+ <div class="color-info-item">
79
+ <span class="color-info-label">{labels.color || "Color"}</span>
80
+ <span class="color-info-value" id="info-color">Green</span>
81
+ </div>
82
+ <div class="color-info-item">
83
+ <span class="color-info-label">{labels.hex || "HEX"}</span>
84
+ <span class="color-info-value" id="info-hex">#c8e6c9</span>
85
+ </div>
86
+ <div class="color-info-item">
87
+ <span class="color-info-label">{labels.rgb || "RGB"}</span>
88
+ <span class="color-info-value" id="info-rgb">200, 230, 201</span>
89
+ </div>
90
+ </div>
91
+
92
+ <div class="tip-row">
93
+ <svg class="tip-icon" viewBox="0 0 24 24" width="16" height="16">
94
+ <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z" fill="currentColor" />
95
+ </svg>
96
+ <span class="tip-text">{labels.tipContent || "Lume brightness depends on the pigment quality and how much light it absorbed. BGW9 glows blue-white and is the brightest, while vintage lume has a warm, dim glow."}</span>
97
+ </div>
98
+ </div>
@@ -0,0 +1,57 @@
1
+ import type { ChronoToolEntry, ToolLocaleContent } from '../../types';
2
+
3
+ export type LumeColorSimulatorUI = {
4
+ title: string;
5
+ lumeType: string;
6
+ brightness: string;
7
+ dark: string;
8
+ light: string;
9
+ color: string;
10
+ hex: string;
11
+ rgb: string;
12
+ type: string;
13
+ description: string;
14
+ c1Name: string;
15
+ c1Desc: string;
16
+ c3Name: string;
17
+ c3Desc: string;
18
+ bgw9Name: string;
19
+ bgw9Desc: string;
20
+ lumiNovaName: string;
21
+ lumiNovaDesc: string;
22
+ vintageName: string;
23
+ vintageDesc: string;
24
+ orangeName: string;
25
+ orangeDesc: string;
26
+ blueName: string;
27
+ blueDesc: string;
28
+ greenName: string;
29
+ greenDesc: string;
30
+ tipTitle: string;
31
+ tipContent: string;
32
+ };
33
+
34
+ export type LumeColorSimulatorLocaleContent = ToolLocaleContent<LumeColorSimulatorUI>;
35
+
36
+ export const lumeColorSimulator: ChronoToolEntry<LumeColorSimulatorUI> = {
37
+ id: 'lume-color-simulator',
38
+ icons: { bg: 'mdi:brightness-6', fg: 'mdi:weather-night' },
39
+ i18n: {
40
+ en: () => import('./i18n/en').then((m) => m.content),
41
+ de: () => import('./i18n/de').then((m) => m.content),
42
+ es: () => import('./i18n/es').then((m) => m.content),
43
+ fr: () => import('./i18n/fr').then((m) => m.content),
44
+ id: () => import('./i18n/id').then((m) => m.content),
45
+ it: () => import('./i18n/it').then((m) => m.content),
46
+ ja: () => import('./i18n/ja').then((m) => m.content),
47
+ ko: () => import('./i18n/ko').then((m) => m.content),
48
+ nl: () => import('./i18n/nl').then((m) => m.content),
49
+ pl: () => import('./i18n/pl').then((m) => m.content),
50
+ pt: () => import('./i18n/pt').then((m) => m.content),
51
+ ru: () => import('./i18n/ru').then((m) => m.content),
52
+ sv: () => import('./i18n/sv').then((m) => m.content),
53
+ tr: () => import('./i18n/tr').then((m) => m.content),
54
+ zh: () => import('./i18n/zh').then((m) => m.content),
55
+ },
56
+ };
57
+
@@ -0,0 +1,174 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { LumeColorSimulatorUI } from '../entry';
3
+ import { bibliography } from '../bibliography';
4
+
5
+ export const content: ToolLocaleContent<LumeColorSimulatorUI> = {
6
+ slug: 'leuchtfarben-simulator',
7
+ title: 'Leuchtfarben–Simulator – Zifferblatt–Leuchten visualisieren',
8
+ description: 'Verschaffe dir einen visuellen Eindruck verschiedener Leuchtfarben in Echtzeit. Vergleiche C1, C3, BGW9, LumiNova und mehr bei unterschiedlicher Umgebungshelligkeit.',
9
+ ui: {
10
+ title: 'Leuchtfarben–Simulator',
11
+ lumeType: 'Leuchttyp',
12
+ brightness: 'Umgebungshelligkeit',
13
+ dark: 'Dunkel',
14
+ light: 'Hell',
15
+ color: 'Farbe',
16
+ hex: 'HEX',
17
+ rgb: 'RGB',
18
+ type: 'Typ',
19
+ description: 'Beschreibung',
20
+ c1Name: 'C1',
21
+ c1Desc: 'Grün (klassisch)',
22
+ c3Name: 'C3',
23
+ c3Desc: 'Super-Grün',
24
+ bgw9Name: 'BGW9',
25
+ bgw9Desc: 'Eisblau',
26
+ lumiNovaName: 'LumiNova',
27
+ lumiNovaDesc: 'Warmweiß',
28
+ vintageName: 'Vintage',
29
+ vintageDesc: 'Gealtertes Radium',
30
+ orangeName: 'Orange',
31
+ orangeDesc: 'Taucher-Orange',
32
+ blueName: 'Blau',
33
+ blueDesc: 'Tiefblau',
34
+ greenName: 'Grün',
35
+ greenDesc: 'Neon-Grün',
36
+ tipTitle: 'Tipp',
37
+ tipContent: 'Die Leuchtkraft hängt von der Pigmentqualität und der aufgenommenen Lichtmenge ab. BGW9 leuchtet blau-weiß und ist am hellsten, während Vintage-Leuchten einen warmen, gedimmten Schein abgeben.',
38
+ },
39
+ seo: [
40
+ { type: 'title', text: 'Uhren-Leuchtfarben-Simulator – Echtzeit-Leuchtkraft-Visualisierung', level: 2 },
41
+ { type: 'paragraph', html: 'Die Leuchtfarbe ist eine der persönlichsten Entscheidungen beim Uhrensammeln. Bevorzugst du das klassische grüne Leuchten von <strong>C1 Super-LumiNova</strong> oder das eisige Blau von <strong>BGW9</strong>? Dieser Simulator zeigt dir, wie jeder Leuchttyp bei verschiedenen Helligkeitsstufen aussieht – von vollem Tageslicht bis zur tiefsten Dunkelheit, mit exakten <strong>HEX- und RGB-Werten</strong> für jeden Farbton.' },
42
+ { type: 'title', text: 'Super-LumiNova-Typen im Vergleich', level: 3 },
43
+ {
44
+ type: 'table', headers: ['Typ', 'Tagesfarbe', 'Leuchtfarbe', 'Helligkeit', 'Geeignet für'], rows: [
45
+ ['C1', 'Hellgrün', 'Grün', 'Mittel', 'Dress-Watches, Original-Optik'],
46
+ ['C3', 'Gelbgrün', 'Hellgrün', 'Am hellsten', 'Taucheruhren, Tool-Watches'],
47
+ ['BGW9', 'Gebeiztes Weiß', 'Eisblau', 'Hell', 'Moderne Sportuhren, klare Optik'],
48
+ ['LumiNova', 'Warmbeige', 'Warmweiß', 'Niedrig-mittel', 'Preisgünstige Leuchtmittel'],
49
+ ['Vintage', 'Creme / Beige', 'Warm gedimmt', 'Niedrig', 'Heritage-Uhren'],
50
+ ['Orange', 'Orange', 'Orange', 'Mittel', 'Taucher-Akzente, Retro-Taucher'],
51
+ ['Blau', 'Hellblau', 'Blau', 'Mittel', 'Designer-Zifferblätter, Modeuhren'],
52
+ ['Grün', 'Hellgrün', 'Grün', 'Hell', 'Militärische Uhren'],
53
+ ]
54
+ },
55
+ { type: 'title', text: 'C1 vs. C3 vs. BGW9 – Welchen solltest du wählen?', level: 3 },
56
+ {
57
+ type: 'comparative', columns: 2, items: [
58
+ { title: 'C1 Klassisches Grün', icon: 'mdi:lightbulb-on', description: 'Die ursprüngliche Super-LumiNova-Formulierung. Leuchtet grün mit mittlerer Helligkeit. Eine sichere, klassische Wahl, die zu jedem Uhrenstil passt.', points: ['Mittlere Helligkeit, 4–6 h sichtbar', 'Grünes Leuchten, warmer Ton', 'Günstigste Formulierung', 'Häufig in Einsteigeruhren'], highlight: false },
59
+ { title: 'C3 Super–Grün', icon: 'mdi:lightning-bolt', description: 'Das hellste grüne Leuchtmittel. Wird in professionellen Taucheruhren verwendet, bei denen die Ablesbarkeit unter Wasser entscheidend ist. Maximale Leuchtkraft bei minimaler Aufladung.', points: ['Höchste Helligkeit, 8–12 h sichtbar', 'Gelbgrün bei Tageslicht', 'Bevorzugt von Seiko, Citizen, Omega', 'Am besten für Lesbarkeit bei wenig Licht'], highlight: true },
60
+ ]
61
+ },
62
+ {
63
+ type: 'comparative', columns: 2, items: [
64
+ { title: 'BGW9 Eisblau', icon: 'mdi:snowflake', description: 'Leuchtet blau-weiß statt grün. Etwas weniger hell als C3, aber wegen seiner klaren, modernen Ästhetik geschätzt. Beliebt in luxuriösen Sportuhren.', points: ['Hohe Helligkeit, 6–10 h sichtbar', 'Blau-weißes Leuchten, neutraler Ton', 'Klare, moderne Optik bei Tageslicht', 'Verwendet von Tudor, Grand Seiko, Omega'], highlight: true },
65
+ { title: 'Vintage–Radium–Stil', icon: 'mdi:fire', description: 'Warmer Beige-/Cremeton, der an das Radium-Leuchten der 1960er Jahre erinnert. Absichtlich gedimmter für die authentische Optik. Das Leuchten ist warm, dezent und altert wunderschön.', points: ['Niedrige Helligkeit, 2–4 h sichtbar', 'Warmes Creme bis gedämpftes Bernstein', 'Gealtertes Aussehen ohne Radioaktivität', 'Beliebt in Heritage-Neuauflagen'], highlight: false },
66
+ ]
67
+ },
68
+ { type: 'diagnostic', variant: 'info', title: 'Helligkeit ist nicht alles', icon: 'mdi:palette', html: 'Das hellste Leuchtmittel (C3) ist nicht immer die beste Wahl. <strong>BGW9</strong> tauscht einen kleinen Helligkeitsunterschied gegen einen neutraleren, moderneren Look, den viele Sammler bevorzugen. <strong>Vintage-Leuchten</strong> stellen die epochengerechte Optik über die Leistung. Entscheide dich danach, was dir am wichtigsten ist: <strong>maximale Leuchtkraft, moderne Ästhetik oder Heritage-Authentizität.</strong>' },
69
+ { type: 'title', text: 'Wie Leuchtfarbe funktioniert: Die Wissenschaft hinter dem Leuchten', level: 3 },
70
+ {
71
+ type: 'glossary', items: [
72
+ { term: 'Super-LumiNova', definition: 'Ein photolumineszierendes Pigment auf Strontiumaluminat-Basis. Es absorbiert UV- und sichtbares Licht und gibt es als Leuchten wieder. Nicht radioaktiv und unbedenklich. Ursprünglich 1993 von Nemoto & Co. entwickelt.' },
73
+ { term: 'Aufladezeit', definition: 'Die Dauer der Lichteinwirkung, die nötig ist, um das Leuchtpigment zu sättigen. Eine vollständige Aufladung dauert 10–30 Minuten unter direktem Sonnenlicht oder UV. Längere Aufladung = längeres und helleres Leuchten.' },
74
+ { term: 'Leuchtdauer', definition: 'Wie lange das Leuchten nach dem Aufladen sichtbar bleibt. Hochwertiges Super-LumiNova leuchtet 6–12 Stunden sichtbar. Die hellste Phase sind die ersten 30 Minuten nach dem Aufladen.' },
75
+ { term: 'Pigmentqualität', definition: 'Die Qualität der Strontiumaluminat-Kristalle. Hochwertigere Pigmente (C3, BGW9) verwenden größere, gleichmäßigere Kristalle für ein helleres und längeres Leuchten. Niedrigere Qualitätsstufen (LumiNova) verwenden kleinere Kristalle und sind dunkler.' },
76
+ ]
77
+ },
78
+ {
79
+ type: 'summary', title: 'Kurzleitfaden zur Leuchtmittelauswahl', items: [
80
+ 'Für maximale Ablesbarkeit im Dunkeln: Wähle C3 (hellstes Grün) oder BGW9 (hellstes Blau-Weiß).',
81
+ 'Für einen modernen Luxus-Look: BGW9 ist der aktuelle Favorit unter den High-End-Uhrenmarken.',
82
+ 'Für Vintage-/Heritage-Bauten: Verwende Vintage oder Orange für epochengerechte Wärme.',
83
+ 'C1 ist der Allrounder: gute Helligkeit, klassisches Grün, erschwinglich.',
84
+ 'Die Leuchtfarbe bei Tageslicht unterscheidet sich deutlich von der Leuchtfarbe – nutze den Simulator, um beide zu vergleichen.',
85
+ ]
86
+ },
87
+ ],
88
+ faq: [
89
+ {
90
+ question: 'Welches Leuchtmittel ist am hellsten?',
91
+ answer: 'C3 Super-LumiNova ist die hellste grüne Formulierung. BGW9 ist das hellste Blau-Weiß. Beide sind deutlich heller als C1 oder Standard-LumiNova.',
92
+ },
93
+ {
94
+ question: 'Was ist BGW9-Leuchtfarbe?',
95
+ answer: 'BGW9 ist eine Super-LumiNova-Variante, die blau-weiß statt grün leuchtet. Sie ist etwas weniger hell als C3, wird aber von vielen wegen ihres klaren, modernen Aussehens bevorzugt.',
96
+ },
97
+ {
98
+ question: 'Leuchtet Vintage-Leuchtfarbe?',
99
+ answer: 'Moderne Vintage-Leuchtfarbe (beige/warm) leuchtet, ist aber absichtlich dunkler, um gealtertes Radium zu imitieren. Der Kompromiss liegt in der ästhetischen Authentizität gegenüber maximaler Helligkeit.',
100
+ },
101
+ {
102
+ question: 'Wie lange hält Leuchtfarbe?',
103
+ answer: 'Nach vollständiger Aufladung unter hellem Licht leuchtet hochwertiges Super-LumiNova 6–12 Stunden sichtbar. Die hellste Phase sind die ersten 30 Minuten.',
104
+ },
105
+ ],
106
+ bibliography,
107
+ howTo: [
108
+ {
109
+ name: 'Leuchttyp auswählen',
110
+ text: 'Wähle aus den Voreinstellungen C1, C3, BGW9, LumiNova, Vintage, Orange, Blau oder Grün.',
111
+ },
112
+ {
113
+ name: 'Helligkeit anpassen',
114
+ text: 'Bewege den Regler für die Umgebungshelligkeit von Tag (links) zu Nacht (rechts), um zu sehen, wie sich das Leuchten verhält.',
115
+ },
116
+ {
117
+ name: 'Daten ablesen',
118
+ text: 'Die Infokarte zeigt die genauen HEX- und RGB-Werte der aktuellen Farbe.',
119
+ },
120
+ ],
121
+ schemas: [
122
+ {
123
+ '@context': 'https://schema.org',
124
+ '@type': 'FAQPage',
125
+ 'mainEntity': [
126
+ {
127
+ '@type': 'Question',
128
+ 'name': 'Welches Leuchtmittel ist am hellsten?',
129
+ 'acceptedAnswer': { '@type': 'Answer', 'text': 'C3 Super-LumiNova ist das hellste Grün. BGW9 ist das hellste Blau-Weiß.' },
130
+ },
131
+ {
132
+ '@type': 'Question',
133
+ 'name': 'Was ist BGW9-Leuchtfarbe?',
134
+ 'acceptedAnswer': { '@type': 'Answer', 'text': 'BGW9 ist eine Super-LumiNova-Variante, die blau-weiß statt grün leuchtet.' },
135
+ },
136
+ {
137
+ '@type': 'Question',
138
+ 'name': 'Leuchtet Vintage-Leuchtfarbe?',
139
+ 'acceptedAnswer': { '@type': 'Answer', 'text': 'Moderne Vintage-Leuchtfarbe leuchtet, ist aber absichtlich dunkler, um gealtertes Radium zu imitieren.' },
140
+ },
141
+ ],
142
+ },
143
+ {
144
+ '@context': 'https://schema.org',
145
+ '@type': 'SoftwareApplication',
146
+ 'name': 'Leuchtfarben-Simulator',
147
+ 'operatingSystem': 'All',
148
+ 'applicationCategory': 'UtilitiesApplication',
149
+ 'browserRequirements': 'Erfordert HTML5 und JavaScript.',
150
+ },
151
+ {
152
+ '@context': 'https://schema.org',
153
+ '@type': 'HowTo',
154
+ 'name': 'So simuliert man Leuchtfarben',
155
+ 'step': [
156
+ {
157
+ '@type': 'HowToStep',
158
+ 'name': 'Leuchttyp auswählen',
159
+ 'text': 'Wähle aus den Voreinstellungen C1, C3, BGW9, LumiNova oder anderen.',
160
+ },
161
+ {
162
+ '@type': 'HowToStep',
163
+ 'name': 'Helligkeit anpassen',
164
+ 'text': 'Bewege den Regler von Tag zu Nacht, um das Leuchtverhalten zu sehen.',
165
+ },
166
+ {
167
+ '@type': 'HowToStep',
168
+ 'name': 'Daten ablesen',
169
+ 'text': 'Die Infokarte zeigt HEX- und RGB-Werte der aktuellen Farbe.',
170
+ },
171
+ ],
172
+ },
173
+ ],
174
+ };