@jjlmoya/utils-drones 1.15.0 → 1.16.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 (93) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +2 -1
  3. package/src/entries.ts +4 -1
  4. package/src/index.ts +1 -0
  5. package/src/pages/[locale]/[slug].astro +30 -14
  6. package/src/tests/locale_completeness.test.ts +4 -22
  7. package/src/tests/shared-test-helpers.ts +56 -0
  8. package/src/tests/tool_exports.test.ts +34 -0
  9. package/src/tests/tool_validation.test.ts +2 -2
  10. package/src/tool/antenna-length-calculator/bibliography.astro +3 -11
  11. package/src/tool/antenna-length-calculator/bibliography.ts +6 -0
  12. package/src/tool/antenna-length-calculator/i18n/de.ts +2 -8
  13. package/src/tool/antenna-length-calculator/i18n/en.ts +2 -8
  14. package/src/tool/antenna-length-calculator/i18n/es.ts +2 -8
  15. package/src/tool/antenna-length-calculator/i18n/fr.ts +2 -8
  16. package/src/tool/antenna-length-calculator/i18n/id.ts +2 -8
  17. package/src/tool/antenna-length-calculator/i18n/it.ts +2 -8
  18. package/src/tool/antenna-length-calculator/i18n/ja.ts +2 -8
  19. package/src/tool/antenna-length-calculator/i18n/ko.ts +2 -8
  20. package/src/tool/antenna-length-calculator/i18n/nl.ts +2 -8
  21. package/src/tool/antenna-length-calculator/i18n/pl.ts +2 -8
  22. package/src/tool/antenna-length-calculator/i18n/pt.ts +2 -8
  23. package/src/tool/antenna-length-calculator/i18n/ru.ts +2 -8
  24. package/src/tool/antenna-length-calculator/i18n/sv.ts +2 -8
  25. package/src/tool/antenna-length-calculator/i18n/tr.ts +2 -8
  26. package/src/tool/antenna-length-calculator/i18n/zh.ts +2 -8
  27. package/src/tool/antenna-length-calculator/seo.astro +2 -26
  28. package/src/tool/drone-flight-time/bibliography.astro +3 -11
  29. package/src/tool/drone-flight-time/bibliography.ts +7 -0
  30. package/src/tool/drone-flight-time/i18n/de.ts +2 -9
  31. package/src/tool/drone-flight-time/i18n/en.ts +2 -9
  32. package/src/tool/drone-flight-time/i18n/es.ts +2 -9
  33. package/src/tool/drone-flight-time/i18n/fr.ts +2 -9
  34. package/src/tool/drone-flight-time/i18n/id.ts +2 -9
  35. package/src/tool/drone-flight-time/i18n/it.ts +2 -9
  36. package/src/tool/drone-flight-time/i18n/ja.ts +2 -9
  37. package/src/tool/drone-flight-time/i18n/ko.ts +2 -9
  38. package/src/tool/drone-flight-time/i18n/nl.ts +2 -9
  39. package/src/tool/drone-flight-time/i18n/pl.ts +2 -9
  40. package/src/tool/drone-flight-time/i18n/pt.ts +2 -9
  41. package/src/tool/drone-flight-time/i18n/ru.ts +2 -9
  42. package/src/tool/drone-flight-time/i18n/sv.ts +2 -9
  43. package/src/tool/drone-flight-time/i18n/tr.ts +2 -9
  44. package/src/tool/drone-flight-time/i18n/zh.ts +2 -9
  45. package/src/tool/drone-flight-time/seo.astro +2 -18
  46. package/src/tool/drone-power-analyzer/bibliography.astro +6 -0
  47. package/src/tool/drone-power-analyzer/bibliography.ts +7 -0
  48. package/src/tool/drone-power-analyzer/component.astro +210 -0
  49. package/src/tool/drone-power-analyzer/components/FlightProfile.astro +37 -0
  50. package/src/tool/drone-power-analyzer/components/MotorConfig.astro +46 -0
  51. package/src/tool/drone-power-analyzer/components/PowerGauge.astro +48 -0
  52. package/src/tool/drone-power-analyzer/components/WeightConfig.astro +49 -0
  53. package/src/tool/drone-power-analyzer/drone-power-analyzer.css +535 -0
  54. package/src/tool/drone-power-analyzer/entry.ts +29 -0
  55. package/src/tool/drone-power-analyzer/i18n/de.ts +203 -0
  56. package/src/tool/drone-power-analyzer/i18n/en.ts +203 -0
  57. package/src/tool/drone-power-analyzer/i18n/es.ts +203 -0
  58. package/src/tool/drone-power-analyzer/i18n/fr.ts +203 -0
  59. package/src/tool/drone-power-analyzer/i18n/id.ts +203 -0
  60. package/src/tool/drone-power-analyzer/i18n/it.ts +203 -0
  61. package/src/tool/drone-power-analyzer/i18n/ja.ts +203 -0
  62. package/src/tool/drone-power-analyzer/i18n/ko.ts +203 -0
  63. package/src/tool/drone-power-analyzer/i18n/nl.ts +203 -0
  64. package/src/tool/drone-power-analyzer/i18n/pl.ts +203 -0
  65. package/src/tool/drone-power-analyzer/i18n/pt.ts +203 -0
  66. package/src/tool/drone-power-analyzer/i18n/ru.ts +203 -0
  67. package/src/tool/drone-power-analyzer/i18n/sv.ts +203 -0
  68. package/src/tool/drone-power-analyzer/i18n/tr.ts +203 -0
  69. package/src/tool/drone-power-analyzer/i18n/zh.ts +203 -0
  70. package/src/tool/drone-power-analyzer/index.ts +8 -0
  71. package/src/tool/drone-power-analyzer/seo.astro +15 -0
  72. package/src/tool/gps-coordinates-converter/bibliography.astro +3 -11
  73. package/src/tool/gps-coordinates-converter/bibliography.ts +12 -0
  74. package/src/tool/gps-coordinates-converter/components/GpsMap.astro +3 -2
  75. package/src/tool/gps-coordinates-converter/gps-coordinates-converter.css +197 -119
  76. package/src/tool/gps-coordinates-converter/i18n/de.ts +35 -36
  77. package/src/tool/gps-coordinates-converter/i18n/en.ts +4 -14
  78. package/src/tool/gps-coordinates-converter/i18n/es.ts +4 -14
  79. package/src/tool/gps-coordinates-converter/i18n/fr.ts +4 -14
  80. package/src/tool/gps-coordinates-converter/i18n/id.ts +36 -37
  81. package/src/tool/gps-coordinates-converter/i18n/it.ts +35 -36
  82. package/src/tool/gps-coordinates-converter/i18n/ja.ts +19 -20
  83. package/src/tool/gps-coordinates-converter/i18n/ko.ts +20 -21
  84. package/src/tool/gps-coordinates-converter/i18n/nl.ts +33 -36
  85. package/src/tool/gps-coordinates-converter/i18n/pl.ts +19 -20
  86. package/src/tool/gps-coordinates-converter/i18n/pt.ts +19 -20
  87. package/src/tool/gps-coordinates-converter/i18n/ru.ts +19 -20
  88. package/src/tool/gps-coordinates-converter/i18n/sv.ts +19 -20
  89. package/src/tool/gps-coordinates-converter/i18n/tr.ts +19 -20
  90. package/src/tool/gps-coordinates-converter/i18n/zh.ts +20 -21
  91. package/src/tool/gps-coordinates-converter/seo.astro +2 -26
  92. package/src/tools.ts +3 -0
  93. package/src/types.ts +1 -3
@@ -1,10 +1,11 @@
1
1
  ---
2
2
  import 'leaflet/dist/leaflet.css';
3
+ const { ui } = Astro.props;
3
4
  ---
4
5
 
5
6
  <div class="tech-section">
6
- <h3 class="section-title">Visualización en Mapas</h3>
7
+ <h3 class="section-title">{ui.mapVisualization}</h3>
7
8
  <div id="gpsMap" class="map-container"></div>
8
- <small class="hint">Haz clic en el mapa para capturar coordenadas directamente.</small>
9
+ <small class="hint">{ui.mapHint}</small>
9
10
  </div>
10
11
 
@@ -1,49 +1,48 @@
1
1
  .gps-converter-ui {
2
- --gps-accent: #0ea5e9;
3
- --gps-accent-rgb: 14, 165, 233;
4
- --gps-accent-glow: rgba(14, 165, 233, 0.15);
2
+ --gps-accent: #6366f1;
3
+ --gps-accent-rgb: 99, 102, 241;
4
+ --gps-accent-glow: rgba(99, 102, 241, 0.15);
5
5
  --gps-bg: #fff;
6
6
  --gps-bg-muted: #f8fafc;
7
7
  --gps-bg-surface: #f1f5f9;
8
- --gps-bg-overlay: #fdfdfd;
9
- --gps-text: #1e293b;
10
- --gps-text-muted: #64748b;
8
+ --gps-bg-overlay: #fff;
9
+ --gps-text: #0f172a;
10
+ --gps-text-muted: #475569;
11
11
  --gps-text-dim: #94a3b8;
12
12
  --gps-border: #e2e8f0;
13
13
  --gps-border-light: #f1f5f9;
14
- --gps-shadow: 0 40px 100px -20px rgba(0, 0, 0, 0.08);
14
+ --gps-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.05);
15
15
  --gps-danger: #ef4444;
16
- --gps-danger-bg: rgba(239, 68, 68, 0.1);
16
+ --gps-radius-xl: 32px;
17
+ --gps-radius-lg: 20px;
18
+ --gps-radius-md: 12px;
17
19
 
18
20
  width: 100%;
19
21
  max-width: 1200px;
20
22
  margin: 2rem auto;
21
- padding: 0 1.5rem;
22
23
  }
23
24
 
24
25
  [data-theme="dark"] .gps-converter-ui,
25
26
  .theme-dark .gps-converter-ui {
26
27
  --gps-bg: #0f172a;
27
28
  --gps-bg-muted: #1e293b;
28
- --gps-bg-surface: #334155;
29
+ --gps-bg-surface: #1e293b;
29
30
  --gps-bg-overlay: #1e293b;
30
- --gps-text: #f1f5f9;
31
+ --gps-text: #f8fafc;
31
32
  --gps-text-muted: #94a3b8;
32
33
  --gps-text-dim: #64748b;
33
34
  --gps-border: #334155;
34
35
  --gps-border-light: #1e293b;
35
- --gps-shadow: 0 40px 100px -20px rgba(0, 0, 0, 0.4);
36
+ --gps-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
36
37
  }
37
38
 
38
39
  .gps-converter-ui .tech-mega-card {
39
40
  background: var(--gps-bg);
40
- backdrop-filter: blur(24px) saturate(180%);
41
- -webkit-backdrop-filter: blur(24px) saturate(180%);
42
41
  border: 1px solid var(--gps-border);
43
- border-radius: 40px;
42
+ border-radius: var(--gps-radius-xl);
44
43
  box-shadow: var(--gps-shadow);
45
- position: relative;
46
44
  overflow: hidden;
45
+ position: relative;
47
46
  }
48
47
 
49
48
  .gps-converter-ui .tech-mega-card::before {
@@ -52,10 +51,10 @@
52
51
  top: 0;
53
52
  left: 0;
54
53
  right: 0;
55
- height: 6px;
56
- background: linear-gradient(90deg, #0ea5e9, #6366f1, #0ea5e9);
54
+ height: 4px;
55
+ background: linear-gradient(90deg, #6366f1, #a855f7, #6366f1);
57
56
  background-size: 200% 100%;
58
- animation: gradient-shift-gps 4s linear infinite;
57
+ animation: gradient-shift-gps 3s linear infinite;
59
58
  z-index: 10;
60
59
  }
61
60
 
@@ -66,133 +65,158 @@
66
65
 
67
66
  .gps-converter-ui .card-grid {
68
67
  display: grid;
69
- grid-template-columns: 400px 1fr;
68
+ grid-template-columns: 360px 1fr;
70
69
  min-height: 700px;
71
70
  }
72
71
 
73
72
  .gps-converter-ui .config-sidebar {
74
- padding: 3.5rem 3rem;
75
- background: var(--gps-bg-overlay);
76
- border-right: 1px solid var(--gps-border-light);
73
+ padding: 2.5rem;
74
+ background: var(--gps-bg-muted);
75
+ border-right: 1px solid var(--gps-border);
77
76
  display: flex;
78
77
  flex-direction: column;
79
- gap: 3rem;
78
+ gap: 2.5rem;
80
79
  }
81
80
 
82
81
  .gps-converter-ui .main-display {
83
- padding: 3.5rem 3rem;
82
+ padding: 2.5rem;
84
83
  display: flex;
85
84
  flex-direction: column;
86
- gap: 3rem;
87
- background: var(--gps-bg);
88
- }
89
-
90
- .gps-converter-ui .divider {
91
- height: 1px;
92
- width: 100%;
93
- background: linear-gradient(90deg, transparent, var(--gps-border-light), transparent);
85
+ gap: 2.5rem;
94
86
  }
95
87
 
96
88
  .gps-converter-ui .tech-section {
97
89
  display: flex;
98
90
  flex-direction: column;
99
- gap: 1.5rem;
91
+ gap: 1.25rem;
92
+ }
93
+
94
+ .gps-converter-ui .row-header {
95
+ display: flex;
96
+ justify-content: space-between;
97
+ align-items: center;
98
+ gap: 1rem;
100
99
  }
101
100
 
102
101
  .gps-converter-ui .section-title {
103
- font-size: 0.75rem;
104
- font-weight: 800;
102
+ font-size: 0.8rem;
103
+ font-weight: 700;
105
104
  color: var(--gps-text-muted);
106
105
  text-transform: uppercase;
107
- letter-spacing: 0.15em;
106
+ letter-spacing: 0.1em;
108
107
  }
109
108
 
110
109
  .gps-converter-ui .field-label {
111
- font-size: 0.7rem;
112
- font-weight: 800;
113
- color: var(--gps-text-dim);
114
- text-transform: uppercase;
115
- letter-spacing: 0.05em;
110
+ font-size: 0.75rem;
111
+ font-weight: 600;
112
+ color: var(--gps-text-muted);
116
113
  margin-bottom: 0.5rem;
117
114
  display: block;
118
115
  }
119
116
 
120
117
  .gps-converter-ui .tech-input {
121
118
  width: 100%;
122
- padding: 1rem 1.25rem;
123
- background: var(--gps-bg-surface);
119
+ padding: 0.8rem 1rem;
120
+ background: var(--gps-bg);
124
121
  border: 1px solid var(--gps-border);
125
- border-radius: 16px;
126
- font-weight: 700;
122
+ border-radius: var(--gps-radius-md);
127
123
  color: var(--gps-text);
128
- font-size: 1rem;
129
- transition: all 0.3s ease;
124
+ font-weight: 500;
125
+ font-size: 0.95rem;
126
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
130
127
  }
131
128
 
132
129
  .gps-converter-ui .tech-input:focus {
133
130
  outline: none;
134
131
  border-color: var(--gps-accent);
135
132
  box-shadow: 0 0 0 4px var(--gps-accent-glow);
136
- background: var(--gps-bg);
137
133
  }
138
134
 
139
135
  .gps-converter-ui .mode-switch {
140
136
  display: flex;
141
137
  background: var(--gps-bg-surface);
142
- padding: 0.4rem;
143
- border-radius: 18px;
144
- gap: 0.25rem;
138
+ padding: 0.25rem;
139
+ border-radius: var(--gps-radius-md);
140
+ flex: 1;
145
141
  }
146
142
 
147
143
  .gps-converter-ui .mode-btn {
148
144
  flex: 1;
149
- padding: 0.75rem;
150
- border-radius: 14px;
145
+ padding: 0.6rem;
146
+ border-radius: calc(var(--gps-radius-md) - 4px);
151
147
  border: none;
152
148
  background: transparent;
153
- font-size: 0.75rem;
154
- font-weight: 800;
149
+ font-size: 0.8rem;
150
+ font-weight: 600;
155
151
  color: var(--gps-text-muted);
156
152
  cursor: pointer;
157
- transition: all 0.3s ease;
153
+ transition: all 0.2s ease;
158
154
  }
159
155
 
160
156
  .gps-converter-ui .mode-btn.active {
161
157
  background: var(--gps-bg);
162
158
  color: var(--gps-accent);
163
- box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1);
159
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
164
160
  }
165
161
 
166
- .gps-converter-ui .map-container {
167
- max-width: 100%;
168
- height: 400px;
169
- border-radius: 32px;
170
- overflow: hidden;
162
+ .gps-converter-ui .loc-btn {
171
163
  background: var(--gps-bg-surface);
172
- border: 1px solid var(--gps-border-light);
164
+ border: 1px solid var(--gps-border);
165
+ color: var(--gps-text-muted);
166
+ padding: 0.6rem;
167
+ border-radius: var(--gps-radius-md);
168
+ cursor: pointer;
169
+ display: flex;
170
+ align-items: center;
171
+ justify-content: center;
172
+ transition: all 0.2s ease;
173
+ }
174
+
175
+ .gps-converter-ui .loc-btn:hover {
176
+ color: var(--gps-accent);
177
+ border-color: var(--gps-accent);
178
+ background: var(--gps-bg);
179
+ }
180
+
181
+ .gps-converter-ui .compact-inputs {
182
+ display: grid;
183
+ grid-template-columns: 1fr 1fr;
184
+ gap: 1rem;
185
+ }
186
+
187
+ .gps-converter-ui .gms-group {
188
+ display: flex;
189
+ flex-direction: column;
190
+ gap: 0.5rem;
191
+ }
192
+
193
+ .gps-converter-ui .gms-group .compact-inputs {
194
+ grid-template-columns: repeat(4, 1fr);
195
+ gap: 0.5rem;
173
196
  }
174
197
 
175
198
  .gps-converter-ui .results-area {
176
199
  display: grid;
177
200
  grid-template-columns: repeat(2, 1fr);
178
- gap: 2rem;
201
+ gap: 1.5rem;
179
202
  }
180
203
 
181
204
  .gps-converter-ui .result-box {
182
- background: var(--gps-bg-overlay);
183
- border: 1px solid var(--gps-border-light);
184
- border-radius: 28px;
185
- padding: 2.5rem;
205
+ background: var(--gps-bg-muted);
206
+ border: 1px solid var(--gps-border);
207
+ border-radius: var(--gps-radius-lg);
208
+ padding: 1.5rem;
186
209
  display: flex;
187
210
  flex-direction: column;
188
- gap: 1rem;
189
- transition: all 0.3s ease;
211
+ gap: 0.75rem;
212
+ transition: all 0.2s ease;
190
213
  }
191
214
 
192
215
  .gps-converter-ui .result-box:hover {
193
- transform: translateY(-5px);
194
- box-shadow: 0 20px 40px rgba(0, 0, 0, 0.04);
195
216
  border-color: var(--gps-accent);
217
+ background: var(--gps-bg);
218
+ transform: translateY(-2px);
219
+ box-shadow: 0 12px 24px -10px rgba(0, 0, 0, 0.1);
196
220
  }
197
221
 
198
222
  .gps-converter-ui .res-header {
@@ -201,19 +225,27 @@
201
225
  align-items: center;
202
226
  }
203
227
 
228
+ .gps-converter-ui .res-label {
229
+ font-size: 0.7rem;
230
+ font-weight: 700;
231
+ color: var(--gps-text-dim);
232
+ text-transform: uppercase;
233
+ letter-spacing: 0.05em;
234
+ }
235
+
204
236
  .gps-converter-ui .copy-btn {
205
- background: var(--gps-bg-surface);
237
+ background: transparent;
206
238
  border: 1px solid var(--gps-border);
207
239
  color: var(--gps-text-muted);
208
- padding: 0.5rem 1rem;
209
- border-radius: 12px;
210
- font-size: 0.7rem;
211
- font-weight: 800;
240
+ padding: 0.4rem 0.8rem;
241
+ border-radius: 8px;
242
+ font-size: 0.65rem;
243
+ font-weight: 700;
212
244
  cursor: pointer;
213
245
  display: flex;
214
246
  align-items: center;
215
- gap: 0.5rem;
216
- transition: all 0.3s ease;
247
+ gap: 0.4rem;
248
+ transition: all 0.2s ease;
217
249
  }
218
250
 
219
251
  .gps-converter-ui .copy-btn:hover {
@@ -223,84 +255,130 @@
223
255
  }
224
256
 
225
257
  .gps-converter-ui .val-display {
226
- font-size: 1.5rem;
227
- font-weight: 900;
258
+ font-size: 1.25rem;
259
+ font-weight: 700;
228
260
  color: var(--gps-text);
229
261
  word-break: break-all;
230
- letter-spacing: -0.01em;
231
262
  }
232
263
 
233
- .gps-converter-ui .history-item {
234
- padding: 1.25rem 1.5rem;
235
- background: var(--gps-bg-surface);
236
- border-radius: 20px;
264
+ .gps-converter-ui .map-container {
265
+ height: 350px;
266
+ border-radius: var(--gps-radius-lg);
267
+ border: 1px solid var(--gps-border);
268
+ overflow: hidden;
269
+ z-index: 1;
270
+ }
271
+
272
+ .gps-converter-ui .header-row {
237
273
  display: flex;
238
274
  justify-content: space-between;
239
275
  align-items: center;
240
- transition: all 0.3s ease;
241
- border: 1px solid transparent;
242
276
  }
243
277
 
244
- .gps-converter-ui .history-item:hover {
245
- background: var(--gps-bg);
246
- border-color: var(--gps-accent);
247
- transform: translateX(5px);
278
+ .gps-converter-ui .text-btn {
279
+ background: transparent;
280
+ border: none;
281
+ color: var(--gps-text-dim);
282
+ font-size: 0.7rem;
283
+ font-weight: 700;
284
+ text-transform: uppercase;
285
+ cursor: pointer;
286
+ padding: 0.5rem;
287
+ transition: color 0.2s ease;
288
+ }
289
+
290
+ .gps-converter-ui .text-btn:hover {
291
+ color: var(--gps-danger);
248
292
  }
249
293
 
250
- .gps-converter-ui .hist-info {
294
+ .gps-converter-ui .history-list {
251
295
  display: flex;
252
296
  flex-direction: column;
253
- cursor: pointer;
254
- flex: 1;
297
+ gap: 0.75rem;
298
+ }
299
+
300
+ .gps-converter-ui .history-item {
301
+ background: var(--gps-bg);
302
+ border: 1px solid var(--gps-border);
303
+ border-radius: var(--gps-radius-md);
304
+ padding: 0.75rem 1rem;
305
+ display: flex;
306
+ justify-content: space-between;
307
+ align-items: center;
308
+ transition: all 0.2s ease;
309
+ }
310
+
311
+ .gps-converter-ui .history-item:hover {
312
+ border-color: var(--gps-accent);
313
+ transform: translateX(4px);
255
314
  }
256
315
 
257
316
  .gps-converter-ui .hist-coords {
258
- font-size: 0.9rem;
259
- font-weight: 800;
317
+ font-size: 0.85rem;
318
+ font-weight: 600;
260
319
  color: var(--gps-text);
261
320
  }
262
321
 
263
322
  .gps-converter-ui .hist-time {
264
- font-size: 0.7rem;
323
+ font-size: 0.65rem;
265
324
  color: var(--gps-text-dim);
266
- font-weight: 700;
267
- text-transform: uppercase;
325
+ }
326
+
327
+ .gps-converter-ui .hist-actions {
328
+ display: flex;
329
+ gap: 0.5rem;
268
330
  }
269
331
 
270
332
  .gps-converter-ui .action-btn {
271
- background: var(--gps-bg-overlay);
272
- border: 1px solid var(--gps-border);
273
- padding: 0.6rem;
274
- border-radius: 12px;
275
- color: var(--gps-text-dim);
333
+ background: var(--gps-bg-surface);
334
+ border: none;
335
+ color: var(--gps-text-muted);
336
+ padding: 0.4rem;
337
+ border-radius: 6px;
276
338
  cursor: pointer;
277
- display: flex;
278
- align-items: center;
279
- justify-content: center;
280
339
  transition: all 0.2s ease;
281
340
  }
282
341
 
342
+ .gps-converter-ui .action-btn:hover {
343
+ background: var(--gps-accent);
344
+ color: white;
345
+ }
346
+
347
+ .gps-converter-ui .delete-btn:hover {
348
+ background: var(--gps-danger);
349
+ }
350
+
283
351
  .gps-converter-ui .no-history {
352
+ padding: 2rem;
284
353
  text-align: center;
285
- padding: 3rem;
286
354
  color: var(--gps-text-dim);
287
- font-style: italic;
288
- font-size: 0.9rem;
355
+ font-size: 0.85rem;
356
+ border: 1px dashed var(--gps-border);
357
+ border-radius: var(--gps-radius-md);
358
+ }
359
+
360
+ .gps-converter-ui .divider {
361
+ height: 1px;
362
+ background: var(--gps-border);
363
+ opacity: 0.5;
289
364
  }
290
365
 
291
- @media (max-width: 1200px) {
366
+ @media (max-width: 1024px) {
292
367
  .gps-converter-ui .card-grid {
293
368
  grid-template-columns: 1fr;
294
369
  }
295
370
  .gps-converter-ui .config-sidebar {
296
371
  border-right: none;
297
- border-bottom: 1px solid var(--gps-border-light);
372
+ border-bottom: 1px solid var(--gps-border);
298
373
  }
299
374
  }
300
375
 
301
- @media (max-width: 600px) {
302
- .gps-converter-ui { padding: 0.5rem; }
303
- .gps-converter-ui .config-sidebar,
304
- .gps-converter-ui .main-display { padding: 2rem 1.5rem; }
305
- .gps-converter-ui .results-area { grid-template-columns: 1fr; }
376
+ @media (max-width: 640px) {
377
+ .gps-converter-ui .results-area {
378
+ grid-template-columns: 1fr;
379
+ }
380
+ .gps-converter-ui .main-display,
381
+ .gps-converter-ui .config-sidebar {
382
+ padding: 1.5rem;
383
+ }
306
384
  }
@@ -1,5 +1,6 @@
1
1
  import type { GpsCoordinatesConverterLocaleContent } from '../index';
2
2
  import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
3
+ import { bibliography } from '../bibliography';
3
4
 
4
5
  const slug = 'gps-koordinaten-umrechner';
5
6
  const title = 'GPS Koordinaten Umrechner fur Breitengrad und Laengengrad';
@@ -7,20 +8,20 @@ const description = 'Wandeln Sie GPS-Koordinaten zwischen Dezimalgrad (DD), Grad
7
8
 
8
9
  const faqItems = [
9
10
  {
10
- question: 'What is the difference between DD and DMS?',
11
- answer: `DD (Decimal Degrees) uses a single number with decimals (e.g., 51.50). DMS (Degrees, Minutes, Seconds) divides the degree into sexagesimal fractions (e.g., 51° 30' 0").`,
11
+ question: 'Was ist der Unterschied zwischen DD und DMS?',
12
+ answer: `DD (Dezimalgrad) verwendet eine einzelne Zahl mit Dezimalstellen (z. B. 51.50). DMS (Grad, Minuten, Sekunden) unterteilt das Grad in sexagesimale Bruchteile (z. B. 51° 30' 0").`,
12
13
  },
13
14
  {
14
- question: 'Why are negative coordinates used?',
15
- answer: 'In the Decimal system (DD), latitudes south of the Equator and longitudes west of Greenwich are indicated with a negative sign to facilitate mathematical calculations.',
15
+ question: 'Warum werden negative Koordinaten verwendet?',
16
+ answer: 'Im Dezimalsystem (DD) werden Breitengrade südlich des Äquators und Längengrade westlich von Greenwich mit einem Minuszeichen gekennzeichnet, um mathematische Berechnungen zu erleichtern.',
16
17
  },
17
18
  {
18
- question: 'How much precision do I lose when converting?',
19
- answer: 'Our tool uses double-precision floating point. With 6 decimals in DD, the precision is about 11 centimeters, which is more than enough for drones and civil navigation.',
19
+ question: 'Wie viel Präzision verliere ich beim Umrechnen?',
20
+ answer: 'Unser Tool verwendet Gleitkommazahlen mit doppelter Genauigkeit. Bei 6 Dezimalstellen in DD beträgt die Genauigkeit etwa 11 Zentimeter, was für Drohnen und zivile Navigation mehr als ausreichend ist.',
20
21
  },
21
22
  {
22
- question: 'Does this tool work offline?',
23
- answer: 'Yes, once the page is loaded, all conversion logic is local (client-side). Only the map requires a connection to download new tiles.',
23
+ question: 'Funktioniert dieses Tool offline?',
24
+ answer: 'Ja, sobald die Seite geladen ist, erfolgt die gesamte Umrechnungslogik lokal (clientseitig). Nur die Karte benötigt eine Verbindung, um neue Kacheln herunterzuladen.',
24
25
  },
25
26
  ];
26
27
 
@@ -43,26 +44,26 @@ const schemas: GpsCoordinatesConverterLocaleContent['schemas'] = [
43
44
  {
44
45
  '@type': 'HowToStep',
45
46
  position: 1,
46
- name: 'Input Coordinates',
47
- text: 'Enter your coordinates in either Decimal Degrees (DD) or Degrees, Minutes, Seconds (DMS) format.',
47
+ name: 'Koordinaten eingeben',
48
+ text: 'Geben Sie Ihre Koordinaten entweder im Format Dezimalgrad (DD) oder Grad, Minuten, Sekunden (DMS) ein.',
48
49
  },
49
50
  {
50
51
  '@type': 'HowToStep',
51
52
  position: 2,
52
- name: 'Review Conversion',
53
- text: 'The tool instantly displays the converted coordinates in all supported formats.',
53
+ name: 'Umrechnung überprüfen',
54
+ text: 'Das Tool zeigt sofort die umgerechneten Koordinaten in allen unterstützten Formaten an.',
54
55
  },
55
56
  {
56
57
  '@type': 'HowToStep',
57
58
  position: 3,
58
- name: 'Verify on Map',
59
- text: 'Check the map visualization to ensure the coordinates point to the correct location.',
59
+ name: 'Auf Karte verifizieren',
60
+ text: 'Überprüfen Sie die Kartenvisualisierung, um sicherzustellen, dass die Koordinaten auf den richtigen Ort zeigen.',
60
61
  },
61
62
  {
62
63
  '@type': 'HowToStep',
63
64
  position: 4,
64
- name: 'Copy Result',
65
- text: 'Copy the converted coordinates to your clipboard for use in navigation systems or mission planning.',
65
+ name: 'Ergebnis kopieren',
66
+ text: 'Kopieren Sie die umgerechneten Koordinaten in Ihre Zwischenablage für die Verwendung in Navigationssystemen oder bei der Missionsplanung.',
66
67
  },
67
68
  ],
68
69
  } as WithContext<HowTo>,
@@ -82,25 +83,26 @@ export const content: GpsCoordinatesConverterLocaleContent = {
82
83
  slug,
83
84
  title,
84
85
  description,
85
- faqTitle: 'Häufig gestellte Fragen',
86
- bibliographyTitle: 'Referenzhandbücher',
87
86
  ui: {
88
- faqTitle: 'Häufig gestellte Fragen',
89
- bibliographyTitle: 'Referenzhandbücher',
90
- latitude: 'Breitengrad',
91
- longitude: 'Längengrad',
92
- decimalDegrees: 'Dezimalgrad (DD)',
93
- degreesMinutesSeconds: 'Grad, Minuten, Sekunden (DMS)',
94
- gpsHardware: 'GPS Hardware Format (Roh)',
87
+ decimalDD: 'Dezimal (DD)',
88
+ degreesGMS: 'Grad (DMS)',
89
+ useLocation: 'Meinen Standort verwenden',
90
+ lat: 'Breitengrad',
91
+ lng: 'Längengrad',
92
+ latGMS: 'Breitengrad (DMS)',
93
+ lngGMS: 'Längengrad (DMS)',
94
+ gmsTraditional: 'Traditionelles DMS',
95
+ nauticalDM: 'Grad & Dez. Min. (Nautik)',
96
+ googleMapsFormat: 'Google Maps Format',
97
+ mapVisualization: 'Kartenvisualisierung',
98
+ mapHint: 'Klicken Sie auf die Karte, um Koordinaten direkt zu erfassen.',
95
99
  copy: 'Kopieren',
96
100
  copied: 'Kopiert!',
97
- invalidCoordinate: 'Ungültige Koordinate',
98
- pasteHardwareMapFormat: 'Hardware-Rohdaten einfügen (z.B. 404306300, -739981800)',
99
- validation: {
100
- latRange: 'Der Breitengrad muss zwischen -90 und 90 liegen.',
101
- lonRange: 'Der Längengrad muss zwischen -180 und 180 liegen.',
102
- invalidFormat: 'Das Format wird nicht erkannt. Bitte überprüfen Sie Ihre Eingabe.',
103
- },
101
+ recentHistory: 'Letzte Umrechnungen',
102
+ clear: 'Löschen',
103
+ noHistory: 'Keine letzten Umrechnungen.',
104
+ load: 'Laden',
105
+ delete: 'Löschen',
104
106
  },
105
107
  seo: [
106
108
  {
@@ -196,10 +198,7 @@ export const content: GpsCoordinatesConverterLocaleContent = {
196
198
  },
197
199
  ],
198
200
  faq: faqItems,
199
- bibliography: [
200
- { name: 'ArduPilot GPS Integration', url: 'https://ardupilot.org/copter/docs/common-positioning-landing-page.html' },
201
- { name: 'Dezimalgrad vs DMS (Wikipedia)', url: 'https://en.wikipedia.org/wiki/Decimal_degrees' },
202
- ],
201
+ bibliography,
203
202
  howTo: [
204
203
  {
205
204
  name: 'Format identifizieren',
@@ -1,5 +1,6 @@
1
1
  import type { GpsCoordinatesConverterLocaleContent } from '../index';
2
2
  import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
3
+ import { bibliography } from '../bibliography';
3
4
 
4
5
  const slug = 'gps-coordinates-converter';
5
6
  const title = 'GPS Coordinates Converter from Decimal to DMS Online Free';
@@ -81,11 +82,7 @@ export const content: GpsCoordinatesConverterLocaleContent = {
81
82
  slug,
82
83
  title,
83
84
  description,
84
- faqTitle: 'Frequently Asked Questions',
85
- bibliographyTitle: 'Bibliographic References',
86
85
  ui: {
87
- faqTitle: 'Frequently Asked Questions',
88
- bibliographyTitle: 'Bibliographic References',
89
86
  decimalDD: 'Decimal (DD)',
90
87
  degreesGMS: 'Degrees (DMS)',
91
88
  useLocation: 'Use my location',
@@ -96,6 +93,8 @@ export const content: GpsCoordinatesConverterLocaleContent = {
96
93
  gmsTraditional: 'Traditional DMS',
97
94
  nauticalDM: 'Degrees & Dec. Min. (Nautical)',
98
95
  googleMapsFormat: 'Google Maps Format',
96
+ mapVisualization: 'Map Visualization',
97
+ mapHint: 'Click on the map to capture coordinates directly.',
99
98
  copy: 'Copy',
100
99
  copied: 'Copied!',
101
100
  recentHistory: 'Recent History',
@@ -242,16 +241,7 @@ export const content: GpsCoordinatesConverterLocaleContent = {
242
241
  },
243
242
  ],
244
243
  faq: faqItems,
245
- bibliography: [
246
- {
247
- name: 'WGS 84 (World Geodetic System 1984): The global technical standard for mapping and GPS.',
248
- url: 'https://en.wikipedia.org/wiki/World_Geodetic_System',
249
- },
250
- {
251
- name: 'USGS: Using GPS and Coordinate Systems.',
252
- url: 'https://www.usgs.gov/faqs/how-do-i-find-latitude-and-longitude-a-location',
253
- },
254
- ],
244
+ bibliography,
255
245
  howTo: [],
256
246
  schemas,
257
247
  };