@jjlmoya/utils-drones 1.16.0 → 1.17.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 (34) hide show
  1. package/package.json +1 -1
  2. package/src/entries.ts +4 -1
  3. package/src/index.ts +1 -0
  4. package/src/tests/locale_completeness.test.ts +2 -2
  5. package/src/tests/tool_validation.test.ts +2 -2
  6. package/src/tool/drone-power-analyzer/i18n/de.ts +1 -1
  7. package/src/tool/drone-power-analyzer/i18n/es.ts +1 -1
  8. package/src/tool/drone-power-analyzer/i18n/fr.ts +1 -1
  9. package/src/tool/gsd-flight-planner/InputsColumn.astro +108 -0
  10. package/src/tool/gsd-flight-planner/ResultsColumn.astro +90 -0
  11. package/src/tool/gsd-flight-planner/bibliography.astro +6 -0
  12. package/src/tool/gsd-flight-planner/bibliography.ts +7 -0
  13. package/src/tool/gsd-flight-planner/component.astro +22 -0
  14. package/src/tool/gsd-flight-planner/entry.ts +29 -0
  15. package/src/tool/gsd-flight-planner/gsd-flight-planner.css +515 -0
  16. package/src/tool/gsd-flight-planner/i18n/de.ts +214 -0
  17. package/src/tool/gsd-flight-planner/i18n/en.ts +214 -0
  18. package/src/tool/gsd-flight-planner/i18n/es.ts +221 -0
  19. package/src/tool/gsd-flight-planner/i18n/fr.ts +214 -0
  20. package/src/tool/gsd-flight-planner/i18n/id.ts +214 -0
  21. package/src/tool/gsd-flight-planner/i18n/it.ts +214 -0
  22. package/src/tool/gsd-flight-planner/i18n/ja.ts +214 -0
  23. package/src/tool/gsd-flight-planner/i18n/ko.ts +214 -0
  24. package/src/tool/gsd-flight-planner/i18n/nl.ts +214 -0
  25. package/src/tool/gsd-flight-planner/i18n/pl.ts +214 -0
  26. package/src/tool/gsd-flight-planner/i18n/pt.ts +214 -0
  27. package/src/tool/gsd-flight-planner/i18n/ru.ts +214 -0
  28. package/src/tool/gsd-flight-planner/i18n/sv.ts +214 -0
  29. package/src/tool/gsd-flight-planner/i18n/tr.ts +214 -0
  30. package/src/tool/gsd-flight-planner/i18n/zh.ts +214 -0
  31. package/src/tool/gsd-flight-planner/index.ts +8 -0
  32. package/src/tool/gsd-flight-planner/logic.js +326 -0
  33. package/src/tool/gsd-flight-planner/seo.astro +15 -0
  34. package/src/tools.ts +3 -0
@@ -0,0 +1,515 @@
1
+ /* GSD Flight Planner - Single Unified Card */
2
+
3
+ .gsd-flight-planner-ui {
4
+ --gsd-primary: #0891b2;
5
+ --gsd-border: #e5e7eb;
6
+ --gsd-bg: #fff;
7
+ --gsd-bg-alt: #f9fafb;
8
+ --gsd-text: #1f2937;
9
+ --gsd-text-muted: #6b7280;
10
+ --gsd-shadow: rgba(0, 0, 0, 0.05);
11
+
12
+ color: var(--gsd-text);
13
+ }
14
+
15
+ .theme-dark .gsd-flight-planner-ui {
16
+ --gsd-primary: #06b6d4;
17
+ --gsd-border: #374151;
18
+ --gsd-bg: #111827;
19
+ --gsd-bg-alt: #1f2937;
20
+ --gsd-text: #f3f4f6;
21
+ --gsd-text-muted: #9ca3af;
22
+ --gsd-shadow: rgba(0, 0, 0, 0.2);
23
+ }
24
+
25
+ /* Main Card */
26
+
27
+ .gsd-flight-planner-ui .main-card {
28
+ background: var(--gsd-bg);
29
+ border: 1px solid var(--gsd-border);
30
+ border-radius: 12px;
31
+ box-shadow: 0 4px 12px var(--gsd-shadow);
32
+ display: grid;
33
+ grid-template-columns: 1fr 1px 1fr;
34
+ overflow: hidden;
35
+ margin: 1.5rem;
36
+ min-height: 600px;
37
+ position: relative;
38
+ }
39
+
40
+ .gsd-flight-planner-ui .unit-toggle {
41
+ display: flex;
42
+ gap: 0.5rem;
43
+ background: var(--gsd-bg-alt);
44
+ padding: 0.25rem;
45
+ border-radius: 6px;
46
+ border: 1px solid var(--gsd-border);
47
+ }
48
+
49
+ .gsd-flight-planner-ui .unit-toggle-corner {
50
+ position: absolute;
51
+ top: 1.25rem;
52
+ right: 1.25rem;
53
+ z-index: 10;
54
+ }
55
+
56
+ .gsd-flight-planner-ui .unit-btn {
57
+ padding: 0.5rem 1rem;
58
+ background: transparent;
59
+ border: none;
60
+ border-radius: 4px;
61
+ font-size: 0.85rem;
62
+ font-weight: 600;
63
+ color: var(--gsd-text-muted);
64
+ cursor: pointer;
65
+ transition: all 0.2s ease;
66
+ }
67
+
68
+ .gsd-flight-planner-ui .unit-btn.active {
69
+ background: var(--gsd-bg);
70
+ color: var(--gsd-primary);
71
+ border: 1px solid var(--gsd-primary);
72
+ box-shadow: 0 2px 4px var(--gsd-shadow);
73
+ }
74
+
75
+ .gsd-flight-planner-ui .column {
76
+ padding: 2rem;
77
+ overflow-y: auto;
78
+ }
79
+
80
+ .gsd-flight-planner-ui .column-inputs {
81
+ grid-column: 1;
82
+ }
83
+
84
+ .gsd-flight-planner-ui .column-results {
85
+ grid-column: 3;
86
+ }
87
+
88
+ .gsd-flight-planner-ui .divider {
89
+ background: var(--gsd-border);
90
+ grid-column: 2;
91
+ }
92
+
93
+ .gsd-flight-planner-ui .column-title {
94
+ margin: 0 0 1.5rem;
95
+ font-size: 1rem;
96
+ font-weight: 700;
97
+ text-transform: uppercase;
98
+ letter-spacing: 0.8px;
99
+ color: var(--gsd-text);
100
+ padding-bottom: 1rem;
101
+ border-bottom: 2px solid var(--gsd-primary);
102
+ }
103
+
104
+ /* Sections */
105
+
106
+ .gsd-flight-planner-ui .section {
107
+ margin-bottom: 1.5rem;
108
+ }
109
+
110
+ .gsd-flight-planner-ui .section:last-child {
111
+ margin-bottom: 2rem;
112
+ }
113
+
114
+ .gsd-flight-planner-ui .section-label {
115
+ display: block;
116
+ font-size: 0.75rem;
117
+ font-weight: 700;
118
+ text-transform: uppercase;
119
+ letter-spacing: 0.5px;
120
+ color: var(--gsd-text-muted);
121
+ margin-bottom: 0.75rem;
122
+ }
123
+
124
+ .gsd-flight-planner-ui .input-field {
125
+ width: 100%;
126
+ padding: 0.75rem;
127
+ background: var(--gsd-bg-alt);
128
+ border: 1px solid var(--gsd-border);
129
+ border-radius: 6px;
130
+ font-size: 0.9rem;
131
+ color: var(--gsd-text);
132
+ transition: all 0.2s ease;
133
+ }
134
+
135
+ .gsd-flight-planner-ui .input-field:focus {
136
+ outline: none;
137
+ border-color: var(--gsd-primary);
138
+ box-shadow: 0 0 0 3px rgba(6, 182, 212, 0.1);
139
+ }
140
+
141
+ .gsd-flight-planner-ui select {
142
+ appearance: none;
143
+ -webkit-appearance: none;
144
+ -moz-appearance: none;
145
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%236b7280' d='M6 9L1 4h10z'/%3E%3C/svg%3E");
146
+ background-repeat: no-repeat;
147
+ background-position: right 0.75rem center;
148
+ background-size: 12px;
149
+ padding-right: 2.5rem;
150
+ }
151
+
152
+ .gsd-flight-planner-ui .input-row {
153
+ display: grid;
154
+ grid-template-columns: 1fr 1fr;
155
+ gap: 0.75rem;
156
+ }
157
+
158
+ .gsd-flight-planner-ui .input-item {
159
+ display: flex;
160
+ flex-direction: column;
161
+ gap: 0.4rem;
162
+ }
163
+
164
+ .gsd-flight-planner-ui .input-label {
165
+ font-size: 0.75rem;
166
+ font-weight: 600;
167
+ color: var(--gsd-text-muted);
168
+ text-transform: uppercase;
169
+ letter-spacing: 0.3px;
170
+ }
171
+
172
+ .gsd-flight-planner-ui .unit-hint {
173
+ font-size: 0.7rem;
174
+ color: var(--gsd-text-muted);
175
+ }
176
+
177
+ .gsd-flight-planner-ui .slider {
178
+ width: 100%;
179
+ height: 6px;
180
+ border-radius: 3px;
181
+ background: var(--gsd-border);
182
+ outline: none;
183
+ -webkit-appearance: none;
184
+ appearance: none;
185
+ margin-top: 0.5rem;
186
+ }
187
+
188
+ .gsd-flight-planner-ui .slider::-webkit-slider-thumb {
189
+ -webkit-appearance: none;
190
+ appearance: none;
191
+ width: 16px;
192
+ height: 16px;
193
+ border-radius: 50%;
194
+ background: var(--gsd-primary);
195
+ cursor: pointer;
196
+ box-shadow: 0 2px 6px rgba(6, 182, 212, 0.3);
197
+ }
198
+
199
+ .gsd-flight-planner-ui .slider::-moz-range-thumb {
200
+ width: 16px;
201
+ height: 16px;
202
+ border-radius: 50%;
203
+ background: var(--gsd-primary);
204
+ cursor: pointer;
205
+ border: none;
206
+ box-shadow: 0 2px 6px rgba(6, 182, 212, 0.3);
207
+ }
208
+
209
+ .gsd-flight-planner-ui .result-box {
210
+ background: var(--gsd-bg-alt);
211
+ border: 1px solid var(--gsd-border);
212
+ border-radius: 6px;
213
+ padding: 0.75rem;
214
+ margin-top: 0.5rem;
215
+ display: flex;
216
+ justify-content: space-between;
217
+ align-items: center;
218
+ gap: 1rem;
219
+ }
220
+
221
+ .gsd-flight-planner-ui .result-label {
222
+ font-size: 0.75rem;
223
+ font-weight: 600;
224
+ color: var(--gsd-text-muted);
225
+ text-transform: uppercase;
226
+ letter-spacing: 0.3px;
227
+ }
228
+
229
+ .gsd-flight-planner-ui .result-value {
230
+ font-size: 1.25rem;
231
+ font-weight: 700;
232
+ color: var(--gsd-primary);
233
+ }
234
+
235
+ /* Results Column */
236
+
237
+ .gsd-flight-planner-ui .result-section {
238
+ margin-bottom: 2rem;
239
+ padding: 1.5rem;
240
+ background: var(--gsd-bg-alt);
241
+ border-radius: 8px;
242
+ border: 1px solid var(--gsd-border);
243
+ }
244
+
245
+ .gsd-flight-planner-ui .result-header {
246
+ font-size: 0.85rem;
247
+ font-weight: 700;
248
+ text-transform: uppercase;
249
+ letter-spacing: 0.5px;
250
+ color: var(--gsd-text);
251
+ margin-bottom: 1rem;
252
+ }
253
+
254
+ /* GSD Display */
255
+
256
+ .gsd-flight-planner-ui .gsd-large {
257
+ text-align: center;
258
+ margin-bottom: 1.5rem;
259
+ }
260
+
261
+ .gsd-flight-planner-ui .gsd-number {
262
+ font-size: 2.5rem;
263
+ font-weight: 800;
264
+ color: var(--gsd-primary);
265
+ line-height: 1;
266
+ }
267
+
268
+ .gsd-flight-planner-ui .gsd-label {
269
+ font-size: 0.85rem;
270
+ color: var(--gsd-text-muted);
271
+ margin-top: 0.5rem;
272
+ }
273
+
274
+ /* Precision Bar */
275
+
276
+ .gsd-flight-planner-ui .precision-bar {
277
+ margin-bottom: 1rem;
278
+ }
279
+
280
+ .gsd-flight-planner-ui .bar-track {
281
+ position: relative;
282
+ height: 18px;
283
+ background: linear-gradient(90deg, #ef4444 0%, #f59e0b 33%, #a3e635 66%, #22c55e 100%);
284
+ border-radius: 4px;
285
+ margin-bottom: 0.75rem;
286
+ overflow: hidden;
287
+ }
288
+
289
+ .gsd-flight-planner-ui .bar-fill {
290
+ position: absolute;
291
+ height: 100%;
292
+ background: rgba(6, 182, 212, 0.3);
293
+ border-right: 2px solid var(--gsd-primary);
294
+ transition: width 0.3s ease;
295
+ }
296
+
297
+ .gsd-flight-planner-ui .bar-labels {
298
+ display: grid;
299
+ grid-template-columns: repeat(4, 1fr);
300
+ font-size: 0.65rem;
301
+ text-align: center;
302
+ color: var(--gsd-text-muted);
303
+ gap: 0.25rem;
304
+ }
305
+
306
+ .gsd-flight-planner-ui .classification {
307
+ text-align: center;
308
+ padding: 0.75rem;
309
+ background: var(--gsd-bg);
310
+ border-radius: 6px;
311
+ font-size: 0.8rem;
312
+ font-weight: 600;
313
+ color: var(--gsd-primary);
314
+ border: 1px solid var(--gsd-border);
315
+ }
316
+
317
+ /* Coverage Display */
318
+
319
+ .gsd-flight-planner-ui .coverage-display {
320
+ display: grid;
321
+ grid-template-columns: 1fr 1fr;
322
+ gap: 1rem;
323
+ margin-bottom: 1rem;
324
+ }
325
+
326
+ .gsd-flight-planner-ui .coverage-stat {
327
+ background: var(--gsd-bg);
328
+ padding: 0.75rem;
329
+ border-radius: 6px;
330
+ border: 1px solid var(--gsd-border);
331
+ text-align: center;
332
+ }
333
+
334
+ .gsd-flight-planner-ui .stat-label {
335
+ display: block;
336
+ font-size: 0.7rem;
337
+ font-weight: 600;
338
+ text-transform: uppercase;
339
+ letter-spacing: 0.3px;
340
+ color: var(--gsd-text-muted);
341
+ margin-bottom: 0.4rem;
342
+ }
343
+
344
+ .gsd-flight-planner-ui .stat-value {
345
+ display: block;
346
+ font-size: 1.5rem;
347
+ font-weight: 700;
348
+ color: var(--gsd-primary);
349
+ }
350
+
351
+ .gsd-flight-planner-ui .stat-unit {
352
+ display: block;
353
+ font-size: 0.7rem;
354
+ color: var(--gsd-text-muted);
355
+ margin-top: 0.3rem;
356
+ }
357
+
358
+ .gsd-flight-planner-ui .coverage-visual {
359
+ width: 100%;
360
+ height: auto;
361
+ color: var(--gsd-text);
362
+ }
363
+
364
+ /* Metrics Display */
365
+
366
+ .gsd-flight-planner-ui .metrics-display {
367
+ display: grid;
368
+ grid-template-columns: repeat(2, 1fr);
369
+ gap: 1rem;
370
+ }
371
+
372
+ .gsd-flight-planner-ui .metric-item {
373
+ background: var(--gsd-bg);
374
+ padding: 1.25rem;
375
+ border-radius: 6px;
376
+ border: 1px solid var(--gsd-border);
377
+ text-align: center;
378
+ }
379
+
380
+ .gsd-flight-planner-ui .metric-label {
381
+ display: block;
382
+ font-size: 0.7rem;
383
+ font-weight: 600;
384
+ text-transform: uppercase;
385
+ letter-spacing: 0.3px;
386
+ color: var(--gsd-text-muted);
387
+ margin-bottom: 0.75rem;
388
+ }
389
+
390
+ .gsd-flight-planner-ui .metric-number {
391
+ display: block;
392
+ font-size: 1.75rem;
393
+ font-weight: 800;
394
+ color: var(--gsd-primary);
395
+ }
396
+
397
+ .gsd-flight-planner-ui .metric-unit {
398
+ display: block;
399
+ font-size: 0.7rem;
400
+ color: var(--gsd-text-muted);
401
+ margin-top: 0.25rem;
402
+ }
403
+
404
+ /* Alerts */
405
+
406
+ .gsd-flight-planner-ui .alerts-container {
407
+ display: flex;
408
+ flex-direction: column;
409
+ gap: 0.75rem;
410
+ margin-bottom: 1.5rem;
411
+ }
412
+
413
+ .gsd-flight-planner-ui .alert {
414
+ padding: 0.75rem 1rem;
415
+ background: var(--gsd-bg);
416
+ border-left: 3px solid #f59e0b;
417
+ border-radius: 4px;
418
+ font-size: 0.85rem;
419
+ color: var(--gsd-text);
420
+ }
421
+
422
+ /* Buttons */
423
+
424
+ .gsd-flight-planner-ui .btn-secondary {
425
+ width: 100%;
426
+ padding: 0.875rem 1.5rem;
427
+ background: var(--gsd-bg-alt);
428
+ border: 1px solid var(--gsd-border);
429
+ border-radius: 6px;
430
+ color: var(--gsd-text);
431
+ font-weight: 600;
432
+ font-size: 0.9rem;
433
+ cursor: pointer;
434
+ transition: all 0.2s ease;
435
+ }
436
+
437
+ .gsd-flight-planner-ui .btn-secondary:hover {
438
+ border-color: var(--gsd-primary);
439
+ color: var(--gsd-primary);
440
+ }
441
+
442
+ .gsd-flight-planner-ui .btn-primary {
443
+ width: 100%;
444
+ padding: 0.875rem 1.5rem;
445
+ background: var(--gsd-primary);
446
+ color: white;
447
+ border: none;
448
+ border-radius: 6px;
449
+ font-weight: 700;
450
+ font-size: 0.9rem;
451
+ cursor: pointer;
452
+ transition: all 0.2s ease;
453
+ box-shadow: 0 2px 8px rgba(6, 182, 212, 0.2);
454
+ }
455
+
456
+ .gsd-flight-planner-ui .btn-primary:hover {
457
+ background: #0e7490;
458
+ box-shadow: 0 4px 12px rgba(6, 182, 212, 0.3);
459
+ transform: translateY(-1px);
460
+ }
461
+
462
+ /* Responsive */
463
+
464
+ @media (max-width: 1200px) {
465
+ .gsd-flight-planner-ui .main-card {
466
+ grid-template-columns: 1fr;
467
+ }
468
+
469
+ .gsd-flight-planner-ui .column-inputs {
470
+ grid-column: 1;
471
+ border-right: none;
472
+ border-bottom: 1px solid var(--gsd-border);
473
+ }
474
+
475
+ .gsd-flight-planner-ui .column-results {
476
+ grid-column: 1;
477
+ }
478
+
479
+ .gsd-flight-planner-ui .divider {
480
+ display: none;
481
+ }
482
+
483
+ .gsd-flight-planner-ui .unit-toggle-corner {
484
+ top: 1rem;
485
+ right: 1rem;
486
+ }
487
+ }
488
+
489
+ @media (max-width: 640px) {
490
+ .gsd-flight-planner-ui .main-card {
491
+ margin: 1rem 0.75rem;
492
+ }
493
+
494
+ .gsd-flight-planner-ui .unit-toggle-corner {
495
+ top: 0.75rem;
496
+ right: 0.75rem;
497
+ }
498
+
499
+ .gsd-flight-planner-ui .column {
500
+ padding: 1.5rem;
501
+ }
502
+
503
+ .gsd-flight-planner-ui .gsd-number {
504
+ font-size: 2rem;
505
+ }
506
+
507
+ .gsd-flight-planner-ui .metrics-display {
508
+ grid-template-columns: 1fr;
509
+ }
510
+
511
+ .gsd-flight-planner-ui .input-row,
512
+ .gsd-flight-planner-ui .coverage-display {
513
+ grid-template-columns: 1fr;
514
+ }
515
+ }