@jjlmoya/utils-drones 1.14.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 +196 -188
  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
@@ -0,0 +1,535 @@
1
+ /* Drone Power Analyzer - Scoped CSS */
2
+
3
+ .power-analyzer-ui {
4
+ --pa-primary: #3b82f6;
5
+ --pa-primary-rgb: 59, 130, 246;
6
+ --pa-accent: #60a5fa;
7
+ --pa-bg: #fff;
8
+ --pa-bg-muted: #f3f4f6;
9
+ --pa-bg-surface: #eeeff2;
10
+ --pa-text: #1f2937;
11
+ --pa-text-muted: #6b7280;
12
+ --pa-border: #d1d5db;
13
+ --pa-shadow: rgba(0, 0, 0, 0.08);
14
+ --pa-zone-low: #ef4444;
15
+ --pa-zone-optimal: #22c55e;
16
+ --pa-zone-racing: #a855f7;
17
+ --pa-input-bg: #fff;
18
+
19
+ color: var(--pa-text);
20
+ line-height: 1.5;
21
+ }
22
+
23
+ .theme-dark .power-analyzer-ui {
24
+ --pa-primary: #3b82f6;
25
+ --pa-accent: #60a5fa;
26
+ --pa-bg: #111827;
27
+ --pa-bg-muted: #1f2937;
28
+ --pa-bg-surface: #2d3748;
29
+ --pa-text: #f3f4f6;
30
+ --pa-text-muted: #9ca3af;
31
+ --pa-border: #4b5563;
32
+ --pa-shadow: rgba(0, 0, 0, 0.4);
33
+ --pa-input-bg: #1f2937;
34
+ }
35
+
36
+ .power-analyzer-ui .tech-mega-card {
37
+ background: var(--pa-bg);
38
+ border-radius: 14px;
39
+ box-shadow: 0 4px 12px var(--pa-shadow);
40
+ padding: 2.5rem;
41
+ border: 1px solid var(--pa-border);
42
+ position: relative;
43
+ }
44
+
45
+ .power-analyzer-ui .card-grid {
46
+ display: grid;
47
+ grid-template-columns: 360px 1fr;
48
+ gap: 2.5rem;
49
+ }
50
+
51
+ @media (max-width: 1100px) {
52
+ .power-analyzer-ui .card-grid {
53
+ grid-template-columns: 1fr;
54
+ gap: 2rem;
55
+ }
56
+ }
57
+
58
+ @media (max-width: 600px) {
59
+ .power-analyzer-ui .tech-mega-card {
60
+ padding: 1rem;
61
+ }
62
+
63
+ .power-analyzer-ui .card-grid {
64
+ gap: 1rem;
65
+ }
66
+ }
67
+
68
+ /* Config Sections */
69
+
70
+ .power-analyzer-ui .config-section {
71
+ display: flex;
72
+ flex-direction: column;
73
+ gap: 1.25rem;
74
+ padding: 1.5rem;
75
+ background: var(--pa-bg-muted);
76
+ border-radius: 12px;
77
+ border: 1px solid var(--pa-border);
78
+ }
79
+
80
+ .power-analyzer-ui .section-title {
81
+ margin: 0;
82
+ font-size: 0.95rem;
83
+ font-weight: 700;
84
+ color: var(--pa-text);
85
+ text-transform: uppercase;
86
+ letter-spacing: 0.08em;
87
+ }
88
+
89
+ .power-analyzer-ui .input-with-unit {
90
+ display: flex;
91
+ gap: 0.5rem;
92
+ align-items: center;
93
+ }
94
+
95
+ .power-analyzer-ui .input-with-unit input[type="number"] {
96
+ flex: 1;
97
+ }
98
+
99
+ .power-analyzer-ui .unit {
100
+ font-weight: 600;
101
+ color: var(--pa-text-muted);
102
+ min-width: 40px;
103
+ }
104
+
105
+ .power-analyzer-ui .thrust-slider {
106
+ margin-top: 0.5rem;
107
+ }
108
+
109
+ .power-analyzer-ui .unit-toggle-global {
110
+ position: absolute;
111
+ top: 1.5rem;
112
+ right: 1.5rem;
113
+ display: flex;
114
+ align-items: center;
115
+ gap: 0.5rem;
116
+ padding: 0.4rem 0.5rem;
117
+ background: var(--pa-bg-muted);
118
+ border: 1px solid var(--pa-border);
119
+ border-radius: 20px;
120
+ }
121
+
122
+ .power-analyzer-ui .unit-checkbox {
123
+ display: none;
124
+ }
125
+
126
+ .power-analyzer-ui .unit-label-global {
127
+ cursor: pointer;
128
+ font-weight: 600;
129
+ font-size: 0.8rem;
130
+ color: var(--pa-text-muted);
131
+ padding: 0.35rem 0.65rem;
132
+ border-radius: 16px;
133
+ transition: all 0.2s;
134
+ user-select: none;
135
+ text-transform: none;
136
+ }
137
+
138
+ .power-analyzer-ui .unit-checkbox:checked + .unit-label-global {
139
+ background: var(--pa-primary);
140
+ color: white;
141
+ }
142
+
143
+ .power-analyzer-ui .auw-slider {
144
+ margin-top: 0.5rem;
145
+ }
146
+
147
+ .power-analyzer-ui .battery-title {
148
+ font-size: 0.8rem;
149
+ font-weight: 600;
150
+ margin: 0.75rem 0 0.5rem;
151
+ color: var(--pa-text-muted);
152
+ text-transform: uppercase;
153
+ letter-spacing: 0.05em;
154
+ }
155
+
156
+ .power-analyzer-ui .battery-chips {
157
+ display: flex;
158
+ flex-wrap: wrap;
159
+ gap: 0.5rem;
160
+ }
161
+
162
+ .power-analyzer-ui .battery-chip {
163
+ padding: 0.5rem 0.85rem;
164
+ background: var(--pa-bg);
165
+ border: 1px solid var(--pa-border);
166
+ color: var(--pa-text);
167
+ border-radius: 16px;
168
+ font-size: 0.8rem;
169
+ font-weight: 500;
170
+ cursor: pointer;
171
+ transition: all 0.2s;
172
+ white-space: nowrap;
173
+ }
174
+
175
+ .power-analyzer-ui .battery-chip:hover {
176
+ background: var(--pa-border);
177
+ border-color: var(--pa-primary);
178
+ }
179
+
180
+ .power-analyzer-ui .battery-chip:active {
181
+ background: var(--pa-primary);
182
+ color: white;
183
+ border-color: var(--pa-primary);
184
+ }
185
+
186
+ .power-analyzer-ui .battery-chip-active {
187
+ background: var(--pa-primary);
188
+ color: white;
189
+ border-color: var(--pa-primary);
190
+ }
191
+
192
+ /* Pulse animation for feedback */
193
+ @keyframes pulse-input {
194
+ 0% {
195
+ box-shadow: 0 0 0 0 rgba(59, 130, 246, 0.4);
196
+ }
197
+ 50% {
198
+ box-shadow: 0 0 0 8px rgba(59, 130, 246, 0);
199
+ }
200
+ 100% {
201
+ box-shadow: 0 0 0 0 rgba(59, 130, 246, 0);
202
+ }
203
+ }
204
+
205
+ .power-analyzer-ui input[type="number"].pulse {
206
+ animation: pulse-input 0.6s ease-out;
207
+ }
208
+
209
+ .power-analyzer-ui .config-sidebar {
210
+ display: flex;
211
+ flex-direction: column;
212
+ gap: 1.5rem;
213
+ }
214
+
215
+ .power-analyzer-ui .main-display {
216
+ display: flex;
217
+ flex-direction: column;
218
+ gap: 2rem;
219
+ }
220
+
221
+ /* Form elements */
222
+
223
+ .power-analyzer-ui .input-group {
224
+ display: flex;
225
+ flex-direction: column;
226
+ gap: 0.65rem;
227
+ }
228
+
229
+ .power-analyzer-ui label {
230
+ font-weight: 600;
231
+ font-size: 0.9rem;
232
+ color: var(--pa-text);
233
+ text-transform: uppercase;
234
+ letter-spacing: 0.05em;
235
+ }
236
+
237
+ .power-analyzer-ui input[type="number"],
238
+ .power-analyzer-ui select {
239
+ padding: 0.85rem 0.9rem;
240
+ border: 2px solid var(--pa-border);
241
+ border-radius: 8px;
242
+ background: var(--pa-input-bg);
243
+ color: var(--pa-text);
244
+ font-size: 1rem;
245
+ font-weight: 500;
246
+ transition: all 0.2s;
247
+ }
248
+
249
+ .power-analyzer-ui select {
250
+ appearance: none;
251
+ background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236b7280' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='6 9 12 15 18 9'%3e%3c/polyline%3e%3c/svg%3e");
252
+ background-repeat: no-repeat;
253
+ background-position: right 0.75rem center;
254
+ background-size: 1.25rem;
255
+ padding-right: 2.5rem;
256
+ }
257
+
258
+ .theme-dark .power-analyzer-ui select {
259
+ background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%239ca3af' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='6 9 12 15 18 9'%3e%3c/polyline%3e%3c/svg%3e");
260
+ }
261
+
262
+ .power-analyzer-ui input[type="number"]:hover,
263
+ .power-analyzer-ui select:hover {
264
+ border-color: var(--pa-primary);
265
+ }
266
+
267
+ .power-analyzer-ui input[type="number"]:focus,
268
+ .power-analyzer-ui select:focus {
269
+ outline: none;
270
+ border-color: var(--pa-primary);
271
+ box-shadow: 0 0 0 4px rgba(var(--pa-primary-rgb), 0.15);
272
+ }
273
+
274
+ .power-analyzer-ui input[type="range"] {
275
+ cursor: pointer;
276
+ height: 8px;
277
+ -webkit-appearance: none;
278
+ appearance: none;
279
+ width: 100%;
280
+ background: linear-gradient(to right, var(--pa-zone-low), var(--pa-zone-optimal), var(--pa-zone-racing));
281
+ background-size: 100% 100%;
282
+ border-radius: 4px;
283
+ }
284
+
285
+ .power-analyzer-ui input[type="range"]::-webkit-slider-thumb {
286
+ -webkit-appearance: none;
287
+ appearance: none;
288
+ width: 22px;
289
+ height: 22px;
290
+ border-radius: 50%;
291
+ background: var(--pa-primary);
292
+ cursor: pointer;
293
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3);
294
+ border: 2px solid var(--pa-bg);
295
+ }
296
+
297
+ .power-analyzer-ui input[type="range"]::-moz-range-thumb {
298
+ width: 22px;
299
+ height: 22px;
300
+ border-radius: 50%;
301
+ background: var(--pa-primary);
302
+ cursor: pointer;
303
+ border: 2px solid var(--pa-bg);
304
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3);
305
+ }
306
+
307
+ .power-analyzer-ui input[type="range"]::-moz-range-track {
308
+ background: transparent;
309
+ border: none;
310
+ }
311
+
312
+
313
+ /* Buttons */
314
+
315
+ .power-analyzer-ui button {
316
+ padding: 0.75rem 1rem;
317
+ background: var(--pa-primary);
318
+ color: white;
319
+ border: none;
320
+ border-radius: 6px;
321
+ cursor: pointer;
322
+ font-weight: 600;
323
+ font-size: 0.95rem;
324
+ transition: all 0.2s;
325
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
326
+ }
327
+
328
+ .power-analyzer-ui button:hover {
329
+ background: var(--pa-accent);
330
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
331
+ }
332
+
333
+ .power-analyzer-ui button:active {
334
+ transform: translateY(1px);
335
+ }
336
+
337
+ /* Gauge Container */
338
+
339
+ .power-analyzer-ui .gauge-container {
340
+ display: flex;
341
+ flex-direction: column;
342
+ align-items: center;
343
+ gap: 1.5rem;
344
+ padding: 2rem 1.5rem;
345
+ background: var(--pa-bg-muted);
346
+ border-radius: 12px;
347
+ }
348
+
349
+ .power-analyzer-ui .gauge-wrapper {
350
+ width: 100%;
351
+ max-width: 280px;
352
+ }
353
+
354
+ .power-analyzer-ui .gauge-svg {
355
+ width: 100%;
356
+ height: auto;
357
+ display: block;
358
+ }
359
+
360
+ /* Main Ratio Display - Protagonist */
361
+
362
+ .power-analyzer-ui .ratio-display-main {
363
+ display: flex;
364
+ flex-direction: column;
365
+ align-items: center;
366
+ gap: 0.5rem;
367
+ text-align: center;
368
+ }
369
+
370
+ .power-analyzer-ui .ratio-number-large {
371
+ font-size: 3.5rem;
372
+ font-weight: 900;
373
+ color: var(--pa-primary);
374
+ line-height: 1;
375
+ letter-spacing: -0.02em;
376
+ }
377
+
378
+ .power-analyzer-ui .ratio-label-large {
379
+ font-size: 1.2rem;
380
+ color: var(--pa-text-muted);
381
+ font-weight: 500;
382
+ margin-top: -0.25rem;
383
+ }
384
+
385
+ .power-analyzer-ui .ratio-badge {
386
+ display: inline-block;
387
+ padding: 0.35rem 0.75rem;
388
+ border-radius: 20px;
389
+ font-size: 0.75rem;
390
+ font-weight: 600;
391
+ text-transform: uppercase;
392
+ letter-spacing: 0.05em;
393
+ margin-top: 0.5rem;
394
+ background: var(--pa-zone-low);
395
+ color: white;
396
+ }
397
+
398
+ .power-analyzer-ui .ratio-badge.optimal {
399
+ background: var(--pa-zone-optimal);
400
+ }
401
+
402
+ .power-analyzer-ui .ratio-badge.racing {
403
+ background: var(--pa-zone-racing);
404
+ }
405
+
406
+ /* Secondary Gauge Info */
407
+
408
+ .power-analyzer-ui .gauge-info {
409
+ display: flex;
410
+ justify-content: center;
411
+ gap: 1.5rem;
412
+ }
413
+
414
+ .power-analyzer-ui .thrust-display {
415
+ display: flex;
416
+ flex-direction: column;
417
+ align-items: center;
418
+ gap: 0.25rem;
419
+ }
420
+
421
+ .power-analyzer-ui .thrust-label {
422
+ font-size: 0.8rem;
423
+ color: var(--pa-text-muted);
424
+ font-weight: 500;
425
+ text-transform: uppercase;
426
+ letter-spacing: 0.05em;
427
+ }
428
+
429
+ .power-analyzer-ui .thrust-value {
430
+ font-weight: 700;
431
+ font-size: 1.5rem;
432
+ color: var(--pa-text);
433
+ }
434
+
435
+ /* Flight Profile Section */
436
+
437
+ .power-analyzer-ui .flight-section {
438
+ padding: 1.5rem;
439
+ background: var(--pa-bg-muted);
440
+ border-radius: 12px;
441
+ }
442
+
443
+ .power-analyzer-ui .flight-title {
444
+ margin: 0 0 1.25rem;
445
+ font-size: 0.95rem;
446
+ font-weight: 600;
447
+ color: var(--pa-text);
448
+ text-transform: uppercase;
449
+ letter-spacing: 0.05em;
450
+ }
451
+
452
+ .power-analyzer-ui .profiles-grid {
453
+ display: grid;
454
+ grid-template-columns: repeat(2, 1fr);
455
+ gap: 0.9rem;
456
+ margin-bottom: 1.75rem;
457
+ }
458
+
459
+ @media (max-width: 600px) {
460
+ .power-analyzer-ui .profiles-grid {
461
+ grid-template-columns: 1fr;
462
+ }
463
+ }
464
+
465
+ .power-analyzer-ui .profile-card {
466
+ display: flex;
467
+ flex-direction: column;
468
+ align-items: center;
469
+ justify-content: center;
470
+ gap: 0;
471
+ padding: 0.5rem 0.9rem;
472
+ background: transparent;
473
+ border-radius: 0;
474
+ border: none;
475
+ border-bottom: 3px solid var(--pa-border);
476
+ transition: all 0.3s;
477
+ text-align: center;
478
+ cursor: default;
479
+ }
480
+
481
+ .power-analyzer-ui .profile-card.not-suitable {
482
+ border-bottom-color: var(--pa-zone-low);
483
+ opacity: 0.45;
484
+ }
485
+
486
+ .power-analyzer-ui .profile-card.suitable {
487
+ border-bottom-color: var(--pa-zone-optimal);
488
+ opacity: 1;
489
+ }
490
+
491
+ .power-analyzer-ui .profile-name {
492
+ font-weight: 700;
493
+ font-size: 0.95rem;
494
+ color: var(--pa-text);
495
+ }
496
+
497
+ /* Recommendation Section */
498
+
499
+ .power-analyzer-ui .recommendation-section {
500
+ padding-top: 1.25rem;
501
+ border-top: 2px solid var(--pa-border);
502
+ }
503
+
504
+ .power-analyzer-ui .recommendation-title {
505
+ margin: 0 0 0.85rem;
506
+ font-size: 0.8rem;
507
+ font-weight: 600;
508
+ color: var(--pa-text-muted);
509
+ text-transform: uppercase;
510
+ letter-spacing: 0.05em;
511
+ }
512
+
513
+ .power-analyzer-ui .recommendation-text {
514
+ margin: 0;
515
+ line-height: 1.7;
516
+ color: var(--pa-text);
517
+ font-size: 0.95rem;
518
+ }
519
+
520
+ .power-analyzer-ui #recommendation-text {
521
+ color: var(--pa-text);
522
+ }
523
+
524
+ /* Battery presets */
525
+
526
+ .power-analyzer-ui .battery-presets {
527
+ margin-top: 0.5rem;
528
+ }
529
+
530
+ .power-analyzer-ui .battery-presets button {
531
+ width: 100%;
532
+ font-size: 0.9rem;
533
+ padding: 0.6rem;
534
+ text-align: left;
535
+ }
@@ -0,0 +1,29 @@
1
+ import type { DronesToolEntry, ToolLocaleContent } from '../../types';
2
+
3
+ export interface DronePowerAnalyzerUI {
4
+ [key: string]: string;
5
+ }
6
+
7
+ export type DronePowerAnalyzerLocaleContent = ToolLocaleContent<DronePowerAnalyzerUI>;
8
+
9
+ export const dronePowerAnalyzer: DronesToolEntry<DronePowerAnalyzerUI> = {
10
+ id: 'drone-power-analyzer',
11
+ icons: { bg: 'mdi:drone', fg: 'mdi:lightning-bolt' },
12
+ i18n: {
13
+ es: () => import('./i18n/es').then((m) => m.content),
14
+ en: () => import('./i18n/en').then((m) => m.content),
15
+ fr: () => import('./i18n/fr').then((m) => m.content),
16
+ de: () => import('./i18n/de').then((m) => m.content),
17
+ it: () => import('./i18n/it').then((m) => m.content),
18
+ pt: () => import('./i18n/pt').then((m) => m.content),
19
+ nl: () => import('./i18n/nl').then((m) => m.content),
20
+ pl: () => import('./i18n/pl').then((m) => m.content),
21
+ ru: () => import('./i18n/ru').then((m) => m.content),
22
+ ja: () => import('./i18n/ja').then((m) => m.content),
23
+ ko: () => import('./i18n/ko').then((m) => m.content),
24
+ zh: () => import('./i18n/zh').then((m) => m.content),
25
+ tr: () => import('./i18n/tr').then((m) => m.content),
26
+ sv: () => import('./i18n/sv').then((m) => m.content),
27
+ id: () => import('./i18n/id').then((m) => m.content),
28
+ },
29
+ };