@jjlmoya/utils-drones 1.1.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 (56) hide show
  1. package/package.json +61 -0
  2. package/src/category/i18n/en.ts +107 -0
  3. package/src/category/i18n/es.ts +106 -0
  4. package/src/category/i18n/fr.ts +107 -0
  5. package/src/category/index.ts +15 -0
  6. package/src/category/seo.astro +92 -0
  7. package/src/components/PreviewNavSidebar.astro +116 -0
  8. package/src/components/PreviewToolbar.astro +143 -0
  9. package/src/data.ts +11 -0
  10. package/src/env.d.ts +5 -0
  11. package/src/index.ts +22 -0
  12. package/src/layouts/PreviewLayout.astro +117 -0
  13. package/src/pages/[locale]/[slug].astro +146 -0
  14. package/src/pages/[locale].astro +251 -0
  15. package/src/pages/index.astro +4 -0
  16. package/src/tests/faq_count.test.ts +19 -0
  17. package/src/tests/locale_completeness.test.ts +42 -0
  18. package/src/tests/mocks/astro_mock.js +2 -0
  19. package/src/tests/no_h1_in_components.test.ts +48 -0
  20. package/src/tests/seo_length.test.ts +22 -0
  21. package/src/tests/seo_section_types.test.ts +75 -0
  22. package/src/tests/tool_validation.test.ts +17 -0
  23. package/src/tool/antenna-length-calculator/AntennaLengthCalculator.css +684 -0
  24. package/src/tool/antenna-length-calculator/bibliography.astro +14 -0
  25. package/src/tool/antenna-length-calculator/component.astro +360 -0
  26. package/src/tool/antenna-length-calculator/i18n/en.ts +204 -0
  27. package/src/tool/antenna-length-calculator/i18n/es.ts +204 -0
  28. package/src/tool/antenna-length-calculator/i18n/fr.ts +204 -0
  29. package/src/tool/antenna-length-calculator/index.ts +27 -0
  30. package/src/tool/antenna-length-calculator/seo.astro +39 -0
  31. package/src/tool/drone-flight-time/FlightTimeCalculator.css +363 -0
  32. package/src/tool/drone-flight-time/bibliography.astro +14 -0
  33. package/src/tool/drone-flight-time/component.astro +262 -0
  34. package/src/tool/drone-flight-time/components/AutonomyChart.astro +13 -0
  35. package/src/tool/drone-flight-time/components/BatterySpecs.astro +46 -0
  36. package/src/tool/drone-flight-time/components/ConsumptionStats.astro +33 -0
  37. package/src/tool/drone-flight-time/components/FlightDashboard.astro +33 -0
  38. package/src/tool/drone-flight-time/i18n/en.ts +200 -0
  39. package/src/tool/drone-flight-time/i18n/es.ts +200 -0
  40. package/src/tool/drone-flight-time/i18n/fr.ts +200 -0
  41. package/src/tool/drone-flight-time/index.ts +27 -0
  42. package/src/tool/drone-flight-time/seo.astro +31 -0
  43. package/src/tool/gps-coordinates-converter/GpsCoordinatesConverter.css +310 -0
  44. package/src/tool/gps-coordinates-converter/bibliography.astro +14 -0
  45. package/src/tool/gps-coordinates-converter/component.astro +355 -0
  46. package/src/tool/gps-coordinates-converter/components/GpsHistory.astro +36 -0
  47. package/src/tool/gps-coordinates-converter/components/GpsInputs.astro +92 -0
  48. package/src/tool/gps-coordinates-converter/components/GpsMap.astro +18 -0
  49. package/src/tool/gps-coordinates-converter/components/GpsResults.astro +50 -0
  50. package/src/tool/gps-coordinates-converter/i18n/en.ts +201 -0
  51. package/src/tool/gps-coordinates-converter/i18n/es.ts +201 -0
  52. package/src/tool/gps-coordinates-converter/i18n/fr.ts +201 -0
  53. package/src/tool/gps-coordinates-converter/index.ts +27 -0
  54. package/src/tool/gps-coordinates-converter/seo.astro +39 -0
  55. package/src/tools.ts +16 -0
  56. package/src/types.ts +72 -0
@@ -0,0 +1,684 @@
1
+ :root {
2
+ --antenna-primary: #f59e0b;
3
+ --antenna-primary-rgb: 245, 158, 11;
4
+ --antenna-accent: #fbbf24;
5
+ --antenna-bg-glass: rgba(255, 255, 255, 0.7);
6
+ --antenna-border: rgba(255, 255, 255, 0.4);
7
+ --antenna-shadow: rgba(0, 0, 0, 0.08);
8
+ }
9
+
10
+ [data-theme="dark"] .antenna-calculator-ui,
11
+ .theme-dark .antenna-calculator-ui {
12
+ --antenna-bg-glass: rgba(15, 23, 42, 0.7);
13
+ --antenna-border: rgba(255, 255, 255, 0.05);
14
+ --antenna-shadow: rgba(0, 0, 0, 0.3);
15
+ }
16
+
17
+ .antenna-calculator-ui {
18
+ width: 100%;
19
+ max-width: 1300px;
20
+ margin: 0 auto;
21
+ padding: 2.5rem 1.5rem;
22
+ }
23
+
24
+ .tech-mega-card {
25
+ background: var(--antenna-bg-glass);
26
+ backdrop-filter: blur(24px) saturate(180%);
27
+ -webkit-backdrop-filter: blur(24px) saturate(180%);
28
+ border: 1px solid var(--antenna-border);
29
+ border-radius: 40px;
30
+ box-shadow: 0 40px 100px -20px var(--antenna-shadow);
31
+ overflow: hidden;
32
+ position: relative;
33
+ }
34
+
35
+ .tech-mega-card::before {
36
+ content: '';
37
+ position: absolute;
38
+ top: 0;
39
+ left: 0;
40
+ right: 0;
41
+ height: 6px;
42
+ background: linear-gradient(90deg, #f59e0b, #fbbf24, #f59e0b);
43
+ background-size: 200% 100%;
44
+ animation: gradient-shift 4s linear infinite;
45
+ z-index: 10;
46
+ }
47
+
48
+ @keyframes gradient-shift {
49
+ 0% { background-position: 0% 50%; }
50
+ 100% { background-position: 200% 50%; }
51
+ }
52
+
53
+ .card-grid {
54
+ display: grid;
55
+ grid-template-columns: 380px 1fr;
56
+ min-height: 500px;
57
+ width: 100%;
58
+ }
59
+
60
+ .config-sidebar {
61
+ padding: 3.5rem 3rem;
62
+ background: rgba(255, 255, 255, 0.2);
63
+ border-right: 1px solid rgba(0, 0, 0, 0.05);
64
+ display: flex;
65
+ flex-direction: column;
66
+ gap: 2.5rem;
67
+ }
68
+
69
+ [data-theme="dark"] .config-sidebar,
70
+ .theme-dark .config-sidebar {
71
+ background: rgba(255, 255, 255, 0.01);
72
+ border-right-color: rgba(255, 255, 255, 0.05);
73
+ }
74
+
75
+ .main-display {
76
+ padding: 3rem;
77
+ display: flex;
78
+ flex-direction: column;
79
+ gap: 2rem;
80
+ position: relative;
81
+ overflow: hidden;
82
+ min-width: 0;
83
+ }
84
+
85
+ /* Section Styling */
86
+ .section-title {
87
+ display: flex;
88
+ align-items: center;
89
+ gap: 0.75rem;
90
+ margin-bottom: 1.5rem;
91
+ }
92
+
93
+ .section-title [data-icon] {
94
+ width: 20px;
95
+ height: 20px;
96
+ color: var(--antenna-primary);
97
+ }
98
+
99
+ .section-title h2 {
100
+ font-size: 0.75rem;
101
+ font-weight: 800;
102
+ text-transform: uppercase;
103
+ letter-spacing: 0.15em;
104
+ color: #666;
105
+ margin: 0;
106
+ }
107
+
108
+ [data-theme="dark"] .section-title h2,
109
+ .theme-dark .section-title h2 {
110
+ color: #999;
111
+ }
112
+
113
+ /* Input Fields */
114
+ .input-group {
115
+ display: flex;
116
+ flex-direction: column;
117
+ gap: 0.75rem;
118
+ max-width: 100%;
119
+ }
120
+
121
+ .input-with-unit {
122
+ position: relative;
123
+ display: flex;
124
+ align-items: center;
125
+ }
126
+
127
+ .input-with-unit input {
128
+ width: 100%;
129
+ padding: 1.25rem 1.5rem;
130
+ background: white;
131
+ border: 2px solid rgba(0, 0, 0, 0.05);
132
+ border-radius: 20px;
133
+ font-size: 1.5rem;
134
+ font-weight: 800;
135
+ transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);
136
+ box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.02);
137
+ }
138
+
139
+ [data-theme="dark"] .input-with-unit input,
140
+ .theme-dark .input-with-unit input {
141
+ background: rgba(0, 0, 0, 0.3);
142
+ border-color: rgba(255, 255, 255, 0.1);
143
+ color: white;
144
+ }
145
+
146
+ .input-with-unit input:focus {
147
+ outline: none;
148
+ border-color: var(--antenna-primary);
149
+ box-shadow: 0 0 0 5px rgba(var(--antenna-primary-rgb), 0.15);
150
+ transform: translateY(-2px);
151
+ }
152
+
153
+ .unit {
154
+ position: absolute;
155
+ right: 1.5rem;
156
+ font-weight: 800;
157
+ color: var(--antenna-primary);
158
+ font-size: 0.9rem;
159
+ pointer-events: none;
160
+ opacity: 0.7;
161
+ }
162
+
163
+ .custom-range {
164
+ width: 100%;
165
+ height: 3px;
166
+ margin-top: 0.5rem;
167
+ margin-bottom: 0;
168
+ border-radius: 2px;
169
+ background: rgba(0, 0, 0, 0.1);
170
+ accent-color: var(--antenna-primary);
171
+ cursor: pointer;
172
+ -webkit-appearance: none;
173
+ appearance: none;
174
+ padding: 0;
175
+ }
176
+
177
+ .custom-range::-webkit-slider-thumb {
178
+ -webkit-appearance: none;
179
+ appearance: none;
180
+ width: 12px;
181
+ height: 12px;
182
+ background: var(--antenna-primary);
183
+ border: 2px solid white;
184
+ border-radius: 50%;
185
+ cursor: pointer;
186
+ pointer-events: auto;
187
+ }
188
+
189
+ /* Presets Grid */
190
+ .preset-grid {
191
+ display: grid;
192
+ grid-template-columns: repeat(2, 1fr);
193
+ gap: 0.75rem;
194
+ }
195
+
196
+ .preset-btn {
197
+ padding: 0.85rem;
198
+ background: white;
199
+ border: 1px solid rgba(0, 0, 0, 0.08);
200
+ border-radius: 14px;
201
+ font-size: 0.8rem;
202
+ font-weight: 700;
203
+ cursor: pointer;
204
+ transition: all 0.3s ease;
205
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.02);
206
+ }
207
+
208
+ [data-theme="dark"] .preset-btn,
209
+ .theme-dark .preset-btn {
210
+ background: rgba(255, 255, 255, 0.05);
211
+ border-color: rgba(255, 255, 255, 0.1);
212
+ color: #ddd;
213
+ }
214
+
215
+ .preset-btn:hover {
216
+ background: #fffbeb;
217
+ border-color: var(--antenna-primary);
218
+ color: var(--antenna-primary);
219
+ transform: translateY(-2px);
220
+ box-shadow: 0 10px 20px rgba(var(--antenna-primary-rgb), 0.1);
221
+ }
222
+
223
+ /* Radio Cards */
224
+ .type-selector {
225
+ display: grid;
226
+ grid-template-columns: 1fr 1fr;
227
+ gap: 1rem;
228
+ }
229
+
230
+ .radio-card input {
231
+ display: none;
232
+ }
233
+
234
+ .radio-card {
235
+ position: relative;
236
+ }
237
+
238
+ .radio-content {
239
+ display: flex;
240
+ flex-direction: column;
241
+ align-items: center;
242
+ gap: 0.75rem;
243
+ padding: 1.25rem;
244
+ background: white;
245
+ border: 2px solid transparent;
246
+ border-radius: 20px;
247
+ cursor: pointer;
248
+ transition: all 0.4s ease;
249
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.04);
250
+ }
251
+
252
+ [data-theme="dark"] .radio-content,
253
+ .theme-dark .radio-content {
254
+ background: rgba(255, 255, 255, 0.03);
255
+ }
256
+
257
+ .radio-card input:checked + .radio-content,
258
+ .radio-card.active .radio-content {
259
+ border-color: var(--antenna-primary);
260
+ background: linear-gradient(135deg, white, #fffbeb);
261
+ box-shadow: 0 15px 35px rgba(var(--antenna-primary-rgb), 0.15);
262
+ transform: scale(1.02);
263
+ }
264
+
265
+ [data-theme="dark"] .radio-card input:checked + .radio-content,
266
+ .theme-dark .radio-card input:checked + .radio-content {
267
+ background: linear-gradient(135deg, rgba(255,255,255,0.05), rgba(var(--antenna-primary-rgb), 0.1));
268
+ }
269
+
270
+ .radio-content [data-icon] {
271
+ width: 28px;
272
+ height: 28px;
273
+ color: #888;
274
+ transition: all 0.3s ease;
275
+ }
276
+
277
+ .radio-card input:checked + .radio-content [data-icon] {
278
+ color: var(--antenna-primary);
279
+ transform: rotate(360deg);
280
+ }
281
+
282
+ .radio-content span {
283
+ font-size: 0.85rem;
284
+ font-weight: 800;
285
+ }
286
+
287
+ /* Results Display */
288
+ .results-hero {
289
+ display: grid;
290
+ grid-template-columns: 1fr 1fr;
291
+ gap: 2rem;
292
+ }
293
+
294
+ .mega-result {
295
+ padding: 3rem;
296
+ border-radius: 32px;
297
+ position: relative;
298
+ overflow: hidden;
299
+ display: flex;
300
+ flex-direction: column;
301
+ justify-content: center;
302
+ transition: all 0.5s ease;
303
+ }
304
+
305
+ .mega-result.gold {
306
+ background: linear-gradient(135deg, #f59e0b, #d97706);
307
+ color: white;
308
+ box-shadow: 0 30px 60px rgba(217, 119, 6, 0.3);
309
+ }
310
+
311
+ .mega-result.glass {
312
+ background: rgba(255, 255, 255, 0.4);
313
+ border: 1px solid rgba(255, 255, 255, 0.6);
314
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.04);
315
+ }
316
+
317
+ [data-theme="dark"] .mega-result.glass,
318
+ .theme-dark .mega-result.glass {
319
+ background: rgba(255, 255, 255, 0.05);
320
+ border-color: rgba(255, 255, 255, 0.1);
321
+ }
322
+
323
+ .result-label {
324
+ font-size: 0.9rem;
325
+ font-weight: 800;
326
+ text-transform: uppercase;
327
+ letter-spacing: 0.1em;
328
+ margin-bottom: 0.5rem;
329
+ opacity: 0.8;
330
+ }
331
+
332
+ .result-value {
333
+ display: flex;
334
+ align-items: baseline;
335
+ gap: 0.5rem;
336
+ }
337
+
338
+ .result-value .number {
339
+ font-size: 4rem;
340
+ font-weight: 950;
341
+ line-height: 1;
342
+ font-variant-numeric: tabular-nums;
343
+ }
344
+
345
+ .result-value .unit {
346
+ font-size: 1.25rem;
347
+ font-weight: 800;
348
+ opacity: 0.7;
349
+ position: static;
350
+ }
351
+
352
+ /* Visualizer Canvas */
353
+ .visualizer-stage {
354
+ flex: 1;
355
+ background: radial-gradient(circle at center, rgba(255,255,255,0.5), transparent);
356
+ border-radius: 32px;
357
+ border: 2px solid rgba(255, 255, 255, 0.5);
358
+ position: relative;
359
+ display: flex;
360
+ align-items: center;
361
+ justify-content: center;
362
+ overflow: hidden;
363
+ }
364
+
365
+ [data-theme="dark"] .visualizer-stage,
366
+ .theme-dark .visualizer-stage {
367
+ background: radial-gradient(circle at center, rgba(255,255,255,0.03), transparent);
368
+ border-color: rgba(255, 255, 255, 0.05);
369
+ }
370
+
371
+ #antenna-svg {
372
+ width: 90%;
373
+ height: 90%;
374
+ filter: drop-shadow(0 10px 20px rgba(0,0,0,0.1));
375
+ }
376
+
377
+ .antenna-wire {
378
+ stroke-width: 8;
379
+ stroke-linecap: round;
380
+ transition: all 0.6s cubic-bezier(0.34, 1.56, 0.64, 1);
381
+ }
382
+
383
+ .antenna-wire.active {
384
+ stroke: var(--antenna-primary);
385
+ }
386
+
387
+ .feed-core {
388
+ fill: #ef4444;
389
+ stroke: white;
390
+ stroke-width: 2;
391
+ }
392
+
393
+ .feed-point-gap {
394
+ stroke-dasharray: 2 1;
395
+ }
396
+
397
+ .ground-plate {
398
+ fill: #3b82f6;
399
+ opacity: 0.8;
400
+ }
401
+
402
+ .measuring-line {
403
+ stroke: rgba(0, 0, 0, 0.2);
404
+ stroke-width: 1;
405
+ stroke-dasharray: 4 4;
406
+ }
407
+
408
+ [data-theme="dark"] .measuring-line,
409
+ .theme-dark .measuring-line {
410
+ stroke: rgba(255, 255, 255, 0.2);
411
+ }
412
+
413
+ /* Harmonics Meter */
414
+ .harmonics-container {
415
+ background: rgba(0, 0, 0, 0.02);
416
+ padding: 2rem;
417
+ border-radius: 24px;
418
+ }
419
+
420
+ [data-theme="dark"] .harmonics-container,
421
+ .theme-dark .harmonics-container {
422
+ background: rgba(255, 255, 255, 0.02);
423
+ }
424
+
425
+ .harmonics-list {
426
+ display: grid;
427
+ grid-template-columns: repeat(3, 1fr);
428
+ gap: 1rem;
429
+ }
430
+
431
+ .harmonic-card {
432
+ background: white;
433
+ padding: 0.65rem 0.85rem;
434
+ border-radius: 12px;
435
+ display: flex;
436
+ flex-direction: column;
437
+ gap: 0.1rem;
438
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.01);
439
+ border: 1px solid rgba(0, 0, 0, 0.03);
440
+ }
441
+
442
+ [data-theme="dark"] .harmonic-card,
443
+ .theme-dark .harmonic-card {
444
+ background: rgba(255, 255, 255, 0.03);
445
+ border-color: rgba(255, 255, 255, 0.05);
446
+ }
447
+
448
+ .h-header {
449
+ display: flex;
450
+ justify-content: space-between;
451
+ align-items: center;
452
+ margin-bottom: 0.5rem;
453
+ }
454
+
455
+ .h-badge {
456
+ font-size: 0.6rem;
457
+ font-weight: 900;
458
+ padding: 2px 6px;
459
+ background: rgba(var(--antenna-primary-rgb), 0.1);
460
+ color: var(--antenna-primary);
461
+ border-radius: 4px;
462
+ letter-spacing: 0.05em;
463
+ }
464
+
465
+ .h-order {
466
+ font-size: 0.7rem;
467
+ font-weight: 800;
468
+ color: #999;
469
+ }
470
+
471
+ .h-freq {
472
+ font-size: 1.05rem;
473
+ font-weight: 900;
474
+ color: var(--antenna-primary);
475
+ }
476
+
477
+ /* Expert Reference Grid */
478
+ .expert-reference-grid {
479
+ display: grid;
480
+ grid-template-columns: 1fr 1fr;
481
+ gap: 1rem;
482
+ }
483
+
484
+ .ref-card {
485
+ background: rgba(255, 255, 255, 0.4);
486
+ border: 1px solid rgba(255, 255, 255, 0.6);
487
+ padding: 1rem;
488
+ border-radius: 16px;
489
+ display: flex;
490
+ align-items: center;
491
+ gap: 0.75rem;
492
+ transition: all 0.3s ease;
493
+ }
494
+
495
+ [data-theme="dark"] .ref-card,
496
+ .theme-dark .ref-card {
497
+ background: rgba(255, 255, 255, 0.05);
498
+ border-color: rgba(255, 255, 255, 0.1);
499
+ }
500
+
501
+ .ref-card:hover {
502
+ transform: translateY(-3px);
503
+ box-shadow: 0 10px 20px rgba(0, 0, 0, 0.05);
504
+ }
505
+
506
+ .ref-card [data-icon] {
507
+ width: 28px;
508
+ height: 28px;
509
+ color: var(--antenna-primary);
510
+ background: rgba(var(--antenna-primary-rgb), 0.1);
511
+ padding: 8px;
512
+ border-radius: 12px;
513
+ }
514
+
515
+ .ref-card h4 {
516
+ margin: 0;
517
+ font-size: 0.65rem;
518
+ font-weight: 800;
519
+ text-transform: uppercase;
520
+ letter-spacing: 0.1em;
521
+ color: #888;
522
+ }
523
+
524
+ .ref-card p {
525
+ margin: 0;
526
+ font-size: 1rem;
527
+ font-weight: 900;
528
+ color: #444;
529
+ }
530
+
531
+ [data-theme="dark"] .ref-card p,
532
+ .theme-dark .ref-card p {
533
+ color: #eee;
534
+ }
535
+
536
+ /* Security Warning */
537
+ .security-warning {
538
+ margin-top: 1rem;
539
+ padding: 1.5rem;
540
+ background: rgba(239, 68, 68, 0.05);
541
+ border: 1px solid rgba(239, 68, 68, 0.1);
542
+ border-radius: 20px;
543
+ display: flex;
544
+ align-items: center;
545
+ gap: 1.25rem;
546
+ animation: pulse-border 3s infinite;
547
+ box-sizing: border-box;
548
+ }
549
+
550
+ [data-theme="dark"] .security-warning,
551
+ .theme-dark .security-warning {
552
+ background: rgba(239, 68, 68, 0.08);
553
+ }
554
+
555
+ .security-warning [data-icon] {
556
+ width: 32px;
557
+ height: 32px;
558
+ color: #ef4444;
559
+ flex-shrink: 0;
560
+ }
561
+
562
+ .security-warning p {
563
+ margin: 0;
564
+ font-size: 0.85rem;
565
+ line-height: 1.5;
566
+ color: #444;
567
+ }
568
+
569
+ [data-theme="dark"] .security-warning p,
570
+ .theme-dark .security-warning p {
571
+ color: #ccc;
572
+ }
573
+
574
+ @keyframes pulse-border {
575
+ 0% { border-color: rgba(239, 68, 68, 0.1); }
576
+ 50% { border-color: rgba(239, 68, 68, 0.3); }
577
+ 100% { border-color: rgba(239, 68, 68, 0.1); }
578
+ }
579
+
580
+ /* Responsive design */
581
+ @media (max-width: 1100px) {
582
+ .card-grid {
583
+ grid-template-columns: 1fr;
584
+ min-height: auto;
585
+ }
586
+
587
+ .config-sidebar {
588
+ border-right: none;
589
+ border-bottom: 1px solid rgba(0, 0, 0, 0.05);
590
+ padding: 2.5rem 2rem;
591
+ }
592
+
593
+ .main-display {
594
+ padding: 2.5rem 2rem;
595
+ }
596
+ }
597
+
598
+ @media (max-width: 600px) {
599
+ .antenna-calculator-ui {
600
+ padding: 0.5rem;
601
+ }
602
+
603
+ .tech-mega-card {
604
+ border-radius: 24px;
605
+ }
606
+
607
+ .config-sidebar {
608
+ padding: 1.5rem;
609
+ gap: 1.5rem;
610
+ }
611
+
612
+ .main-display {
613
+ padding: 1.5rem;
614
+ gap: 2rem;
615
+ }
616
+
617
+ .input-with-unit input {
618
+ font-size: 1.25rem;
619
+ padding: 1rem;
620
+ }
621
+
622
+ .result-value .number {
623
+ font-size: 2.5rem;
624
+ }
625
+
626
+ .mega-result {
627
+ padding: 1.5rem;
628
+ border-radius: 20px;
629
+ }
630
+
631
+ .results-hero {
632
+ grid-template-columns: 1fr;
633
+ gap: 1rem;
634
+ }
635
+
636
+ .harmonics-list {
637
+ grid-template-columns: 1fr;
638
+ gap: 1rem;
639
+ }
640
+
641
+ .h-freq {
642
+ font-size: 1.15rem;
643
+ }
644
+
645
+ .section-title h2 {
646
+ font-size: 0.65rem;
647
+ }
648
+
649
+ .expert-reference-grid {
650
+ grid-template-columns: 1fr;
651
+ gap: 0.75rem;
652
+ }
653
+
654
+ .ref-card {
655
+ padding: 1rem;
656
+ }
657
+
658
+ .visualizer-stage {
659
+ height: 200px;
660
+ }
661
+
662
+ .security-warning {
663
+ padding: 1rem;
664
+ gap: 0.75rem;
665
+ flex-direction: column;
666
+ text-align: center;
667
+ }
668
+
669
+ .security-warning [data-icon] {
670
+ width: 24px;
671
+ height: 24px;
672
+ }
673
+ }
674
+
675
+ .divider {
676
+ height: 1px;
677
+ width: 100%;
678
+ background: linear-gradient(90deg, transparent, rgba(0, 0, 0, 0.05), transparent);
679
+ }
680
+
681
+ [data-theme="dark"] .divider,
682
+ .theme-dark .divider {
683
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.05), transparent);
684
+ }
@@ -0,0 +1,14 @@
1
+ ---
2
+ import { Bibliography } from '@jjlmoya/utils-shared';
3
+ import { antennaLengthCalculator } from './index';
4
+ import type { KnownLocale } from '../../types';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'es' } = Astro.props;
11
+ const content = await antennaLengthCalculator.i18n[locale]?.();
12
+ ---
13
+
14
+ {content && <Bibliography links={content.bibliography} />}