@jjlmoya/utils-nautical 1.4.0 → 1.6.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.
@@ -1,5 +1,4 @@
1
1
  ---
2
- import './style.css';
3
2
  import type { SailAreaUI } from './index';
4
3
 
5
4
  interface Props {
@@ -416,3 +415,357 @@ const { ui } = Astro.props;
416
415
 
417
416
  loadFromLocal();
418
417
  </script>
418
+
419
+ <style>
420
+ .sail-area-calculator {
421
+ --sa-primary: #003b73;
422
+ --sa-primary-light: #0055a4;
423
+ --sa-secondary: #ef4135;
424
+ --sa-radius: 16px;
425
+ --n-bg: #fff;
426
+ --n-bg-muted: #f1f5f9;
427
+ --n-text: #0f172a;
428
+ --n-text-muted: #475569;
429
+ --n-text-dim: #64748b;
430
+ --n-border: #e2e8f0;
431
+ --n-shadow: rgba(0, 0, 0, 0.05);
432
+ --n-primary: #3b82f6;
433
+ --n-primary-on: #fff;
434
+ --n-accent: #6366f1;
435
+ --n-cyan: #0891b2;
436
+ --n-success: #10b981;
437
+ --n-warning: #f59e0b;
438
+ --n-error: #f43f5e;
439
+
440
+ padding: 1rem;
441
+ max-width: 1200px;
442
+ margin: 0 auto;
443
+ }
444
+
445
+ :global(.theme-dark) .sail-area-calculator {
446
+ --n-bg: #0f172a;
447
+ --n-bg-muted: #1e293b;
448
+ --n-text: #f8fafc;
449
+ --n-text-muted: #94a3b8;
450
+ --n-text-dim: #64748b;
451
+ --n-border: #334155;
452
+ --n-shadow: rgba(0, 0, 0, 0.3);
453
+ --n-primary: #60a5fa;
454
+ --n-primary-on: #fff;
455
+ --n-accent: #818cf8;
456
+ --n-cyan: #22d3ee;
457
+ --n-success: #34d399;
458
+ --n-warning: #fbbf24;
459
+ --n-error: #fb7185;
460
+ }
461
+
462
+ .sa-calculator-wrapper {
463
+ background: var(--n-bg);
464
+ border: 1px solid var(--n-border);
465
+ border-radius: var(--sa-radius);
466
+ padding: 1.5rem;
467
+ display: flex;
468
+ flex-direction: column;
469
+ gap: 2rem;
470
+ }
471
+
472
+ .sa-main-controls {
473
+ display: flex;
474
+ flex-direction: column;
475
+ gap: 1.5rem;
476
+ }
477
+
478
+ .sa-section-group h3 {
479
+ font-size: 0.75rem;
480
+ text-transform: uppercase;
481
+ letter-spacing: 0.1em;
482
+ color: var(--n-text-muted);
483
+ margin-bottom: 1rem;
484
+ display: flex;
485
+ align-items: center;
486
+ gap: 0.5rem;
487
+ opacity: 0.8;
488
+ border-bottom: 1px solid var(--n-border);
489
+ padding-bottom: 0.4rem;
490
+ }
491
+
492
+ .sa-compact-grid {
493
+ display: grid;
494
+ grid-template-columns: repeat(2, 1fr);
495
+ gap: 1rem;
496
+ }
497
+
498
+ .sa-input-row {
499
+ display: flex;
500
+ flex-direction: column;
501
+ gap: 0.4rem;
502
+ }
503
+
504
+ .sa-input-row label {
505
+ font-size: 0.7rem;
506
+ font-weight: 700;
507
+ color: var(--n-text-muted);
508
+ }
509
+
510
+ .sa-elegant-input {
511
+ background: var(--n-bg-muted);
512
+ border: 1.5px solid var(--n-border);
513
+ border-radius: 10px;
514
+ padding: 0.7rem 0.9rem;
515
+ font-size: 0.95rem;
516
+ color: var(--n-text);
517
+ font-weight: 600;
518
+ width: 100%;
519
+ }
520
+
521
+ .sa-elegant-input:focus {
522
+ border-color: var(--sa-primary-light);
523
+ outline: none;
524
+ }
525
+
526
+ .sa-input-with-unit {
527
+ position: relative;
528
+ display: flex;
529
+ align-items: center;
530
+ }
531
+
532
+ .sa-unit-tag {
533
+ position: absolute;
534
+ right: 10px;
535
+ font-size: 0.65rem;
536
+ font-weight: 900;
537
+ color: var(--n-text-muted);
538
+ background: var(--n-bg);
539
+ border: 1px solid var(--n-border);
540
+ padding: 2px 6px;
541
+ border-radius: 4px;
542
+ }
543
+
544
+ .sa-unit-tag select {
545
+ color: var(--n-text-muted);
546
+ }
547
+
548
+ .sa-sidebar-results {
549
+ background: var(--n-bg-muted);
550
+ padding: 1.5rem;
551
+ border-radius: var(--sa-radius);
552
+ border: 1px solid var(--n-border);
553
+ text-align: center;
554
+ }
555
+
556
+ .sad-value-large {
557
+ font-size: 3.5rem;
558
+ font-weight: 950;
559
+ letter-spacing: -0.04em;
560
+ color: var(--sa-primary);
561
+ line-height: 1;
562
+ }
563
+
564
+ :global(.theme-dark) .sail-area-calculator .sad-value-large {
565
+ color: var(--n-accent);
566
+ }
567
+
568
+ .sad-label {
569
+ font-size: 0.75rem;
570
+ font-weight: 850;
571
+ color: var(--n-text-muted);
572
+ text-transform: uppercase;
573
+ letter-spacing: 0.15em;
574
+ }
575
+
576
+ .sa-gauge-track {
577
+ height: 4px;
578
+ background: var(--n-border);
579
+ border-radius: 2px;
580
+ margin: 1.5rem 0;
581
+ position: relative;
582
+ }
583
+
584
+ .sa-gauge-indicator {
585
+ position: absolute;
586
+ top: 50%;
587
+ width: 14px;
588
+ height: 14px;
589
+ background: var(--sa-secondary);
590
+ border: 3px solid var(--n-bg-muted);
591
+ border-radius: 50%;
592
+ transform: translate(-50%, -50%);
593
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.15);
594
+ transition: left 0.8s cubic-bezier(0.34, 1.56, 0.64, 1);
595
+ }
596
+
597
+ .sa-verdict-box {
598
+ background: var(--n-bg);
599
+ padding: 1rem;
600
+ border-radius: 12px;
601
+ border: 1px solid var(--n-border);
602
+ }
603
+
604
+ .sa-verdict-box h4 {
605
+ font-size: 0.95rem;
606
+ margin-bottom: 0.4rem;
607
+ color: var(--n-text);
608
+ }
609
+
610
+ .sa-verdict-box p {
611
+ font-size: 0.8rem;
612
+ line-height: 1.5;
613
+ color: var(--n-text-muted);
614
+ }
615
+
616
+ .sa-stats-summary {
617
+ display: grid;
618
+ grid-template-columns: 1fr 1fr;
619
+ gap: 1rem;
620
+ margin-top: 1.5rem;
621
+ padding-top: 1.5rem;
622
+ border-top: 1px dashed var(--n-border);
623
+ }
624
+
625
+ .sa-stat-item span {
626
+ font-size: 0.75rem;
627
+ color: var(--n-text-muted);
628
+ display: block;
629
+ }
630
+
631
+ .sa-stat-item span:last-child {
632
+ font-size: 1.2rem;
633
+ font-weight: 900;
634
+ color: var(--n-text);
635
+ }
636
+
637
+ .sa-export-btn-premium {
638
+ width: 100%;
639
+ margin-top: 1.5rem;
640
+ padding: 1rem;
641
+ background: var(--sa-primary);
642
+ color: var(--n-primary-on);
643
+ border: none;
644
+ border-radius: 10px;
645
+ font-size: 0.75rem;
646
+ font-weight: 800;
647
+ letter-spacing: 0.05em;
648
+ cursor: pointer;
649
+ display: flex;
650
+ align-items: center;
651
+ justify-content: center;
652
+ gap: 0.5rem;
653
+ }
654
+
655
+ .sa-slider-box {
656
+ background: var(--n-bg-muted);
657
+ padding: 1.5rem;
658
+ border-radius: 12px;
659
+ border: 1px solid var(--n-border);
660
+ }
661
+
662
+ .sa-slider-header {
663
+ display: flex;
664
+ justify-content: space-between;
665
+ align-items: center;
666
+ margin-bottom: 1.5rem;
667
+ }
668
+
669
+ .sa-slider-header label {
670
+ font-size: 0.85rem;
671
+ font-weight: 800;
672
+ color: var(--n-text);
673
+ }
674
+
675
+ .sa-percentage-badge {
676
+ background: var(--sa-primary);
677
+ color: var(--n-primary-on);
678
+ padding: 4px 10px;
679
+ border-radius: 20px;
680
+ font-size: 0.8rem;
681
+ font-weight: 900;
682
+ }
683
+
684
+ .sa-slider-wrapper {
685
+ padding: 0 5px;
686
+ }
687
+
688
+ .sa-modern-slider {
689
+ appearance: none;
690
+ width: 100%;
691
+ height: 6px;
692
+ background: var(--n-border);
693
+ border-radius: 10px;
694
+ outline: none;
695
+ margin: 1rem 0;
696
+ }
697
+
698
+ .sa-modern-slider::-webkit-slider-thumb {
699
+ appearance: none;
700
+ width: 24px;
701
+ height: 24px;
702
+ background: var(--sa-primary);
703
+ border: 4px solid var(--n-bg-muted);
704
+ border-radius: 50%;
705
+ cursor: pointer;
706
+ box-shadow: 0 2px 10px rgba(0, 59, 115, 0.2);
707
+ transition: transform 0.2s;
708
+ }
709
+
710
+ .sa-modern-slider::-webkit-slider-thumb:hover {
711
+ transform: scale(1.1);
712
+ }
713
+
714
+ .sa-modern-slider::-moz-range-thumb {
715
+ width: 24px;
716
+ height: 24px;
717
+ background: var(--sa-primary);
718
+ border: 4px solid var(--n-bg-muted);
719
+ border-radius: 50%;
720
+ cursor: pointer;
721
+ }
722
+
723
+ .sa-modern-slider::-moz-range-track {
724
+ height: 6px;
725
+ background: var(--n-border);
726
+ border-radius: 10px;
727
+ }
728
+
729
+ .sa-slider-ticks {
730
+ display: flex;
731
+ justify-content: space-between;
732
+ margin-top: 0.5rem;
733
+ }
734
+
735
+ .sa-slider-ticks span {
736
+ font-size: 0.65rem;
737
+ font-weight: 700;
738
+ color: var(--n-text-muted);
739
+ }
740
+
741
+ @media (min-width: 1024px) {
742
+ .sail-area-calculator {
743
+ padding: 2rem;
744
+ }
745
+
746
+ .sa-calculator-wrapper {
747
+ display: grid;
748
+ grid-template-columns: 1fr 400px;
749
+ gap: 3rem;
750
+ padding: 2.5rem;
751
+ }
752
+
753
+ .sa-compact-grid {
754
+ grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
755
+ }
756
+
757
+ .sa-main-controls {
758
+ gap: 2.5rem;
759
+ }
760
+
761
+ .sa-sidebar-results {
762
+ position: sticky;
763
+ top: 2rem;
764
+ padding: 2.5rem;
765
+ }
766
+
767
+ .sad-value-large {
768
+ font-size: 5.5rem;
769
+ }
770
+ }
771
+ </style>
@@ -1,5 +1,4 @@
1
1
  ---
2
- import './style.css';
3
2
  import type { SpeedConverterUI } from './index';
4
3
  interface Props { ui: SpeedConverterUI; }
5
4
  const { ui } = Astro.props;
@@ -123,3 +122,245 @@ const bd = JSON.parse(ui.beaufortDataJson) as { force: number; name: string; sea
123
122
  iKn.value = savedKn > 0 ? String(savedKn) : '';
124
123
  sync('val-kn', savedKn);
125
124
  </script>
125
+
126
+ <style>
127
+ .speed-converter {
128
+ --n-bg: #fff;
129
+ --n-bg-muted: #f1f5f9;
130
+ --n-text: #0f172a;
131
+ --n-text-muted: #475569;
132
+ --n-text-dim: #64748b;
133
+ --n-border: #e2e8f0;
134
+ --n-shadow: rgba(0, 0, 0, 0.05);
135
+ --n-primary: #3b82f6;
136
+ --n-primary-on: #fff;
137
+ --n-accent: #6366f1;
138
+ --n-cyan: #0891b2;
139
+ --n-success: #10b981;
140
+ --n-warning: #f59e0b;
141
+ --n-error: #f43f5e;
142
+
143
+ max-width: 900px;
144
+ margin: 0 auto;
145
+ display: flex;
146
+ flex-direction: column;
147
+ gap: 2rem;
148
+ }
149
+
150
+ :global(.theme-dark) .speed-converter {
151
+ --n-bg: #0f172a;
152
+ --n-bg-muted: #1e293b;
153
+ --n-text: #f8fafc;
154
+ --n-text-muted: #94a3b8;
155
+ --n-text-dim: #64748b;
156
+ --n-border: #334155;
157
+ --n-shadow: rgba(0, 0, 0, 0.3);
158
+ --n-primary: #60a5fa;
159
+ --n-primary-on: #fff;
160
+ --n-accent: #818cf8;
161
+ --n-cyan: #22d3ee;
162
+ --n-success: #34d399;
163
+ --n-warning: #fbbf24;
164
+ --n-error: #fb7185;
165
+ }
166
+
167
+ .sc-input-grid {
168
+ display: grid;
169
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
170
+ gap: 1rem;
171
+ background: var(--n-bg);
172
+ border: 1px solid var(--n-border);
173
+ border-radius: 1.5rem;
174
+ padding: 2rem;
175
+ }
176
+
177
+ .sc-input-group {
178
+ display: flex;
179
+ flex-direction: column;
180
+ gap: 0.5rem;
181
+ }
182
+
183
+ .sc-input-group label {
184
+ font-size: 0.8rem;
185
+ font-weight: 600;
186
+ color: var(--n-text-muted);
187
+ text-transform: uppercase;
188
+ }
189
+
190
+ .sc-input-wrapper {
191
+ background: var(--n-bg-muted);
192
+ border: 2px solid var(--n-border);
193
+ border-radius: 0.8rem;
194
+ padding: 0.8rem 1rem;
195
+ transition: border-color 0.2s;
196
+ }
197
+
198
+ .sc-input-wrapper:focus-within {
199
+ border-color: var(--n-cyan);
200
+ }
201
+
202
+ .sc-input-wrapper input {
203
+ background: transparent;
204
+ border: none;
205
+ outline: none;
206
+ color: var(--n-text);
207
+ font-size: 1.5rem;
208
+ font-weight: 800;
209
+ width: 100%;
210
+ }
211
+
212
+ .sc-input-wrapper input::-webkit-outer-spin-button,
213
+ .sc-input-wrapper input::-webkit-inner-spin-button {
214
+ appearance: none;
215
+ }
216
+
217
+ .sc-beaufort-summary {
218
+ background: var(--n-primary);
219
+ color: var(--n-primary-on);
220
+ border-radius: 1.5rem;
221
+ padding: 2rem;
222
+ display: grid;
223
+ grid-template-columns: auto 1fr;
224
+ gap: 1rem 2rem;
225
+ align-items: center;
226
+ }
227
+
228
+ .sc-force-circle {
229
+ width: 80px;
230
+ height: 80px;
231
+ border-radius: 50%;
232
+ background: rgba(255, 255, 255, 0.15);
233
+ display: flex;
234
+ align-items: center;
235
+ justify-content: center;
236
+ font-size: 2.5rem;
237
+ font-weight: 800;
238
+ color: var(--n-primary-on);
239
+ flex-shrink: 0;
240
+ }
241
+
242
+ .sc-force-text-box {
243
+ display: flex;
244
+ flex-direction: column;
245
+ gap: 0.3rem;
246
+ }
247
+
248
+ .sc-force-name {
249
+ margin: 0;
250
+ font-size: 1.4rem;
251
+ font-weight: 800;
252
+ color: var(--n-primary-on);
253
+ }
254
+
255
+ .sc-force-detail {
256
+ margin: 0;
257
+ opacity: 0.8;
258
+ font-size: 0.9rem;
259
+ color: var(--n-primary-on);
260
+ }
261
+
262
+ .sc-sea-state-box {
263
+ grid-column: 1 / -1;
264
+ background: rgba(255, 255, 255, 0.1);
265
+ border-radius: 1rem;
266
+ padding: 1rem 1.5rem;
267
+ }
268
+
269
+ .sc-sea-text .label {
270
+ font-size: 0.7rem;
271
+ text-transform: uppercase;
272
+ opacity: 0.7;
273
+ color: var(--n-primary-on);
274
+ font-weight: 700;
275
+ }
276
+
277
+ .sc-sea-text p {
278
+ margin: 0.2rem 0 0;
279
+ font-weight: 600;
280
+ color: var(--n-primary-on);
281
+ }
282
+
283
+ .sc-table-container {
284
+ background: var(--n-bg);
285
+ border: 1px solid var(--n-border);
286
+ border-radius: 1.5rem;
287
+ overflow: hidden;
288
+ }
289
+
290
+ .sc-table-container h3 {
291
+ padding: 1.5rem;
292
+ margin: 0;
293
+ font-size: 1rem;
294
+ color: var(--n-text-muted);
295
+ border-bottom: 1px solid var(--n-border);
296
+ font-weight: 700;
297
+ }
298
+
299
+ .sc-scroll-area {
300
+ overflow-x: auto;
301
+ }
302
+
303
+ .sc-beaufort-table {
304
+ width: 100%;
305
+ border-collapse: collapse;
306
+ }
307
+
308
+ .sc-beaufort-table th {
309
+ text-align: left;
310
+ padding: 0.8rem 1rem;
311
+ font-size: 0.75rem;
312
+ color: var(--n-text-muted);
313
+ text-transform: uppercase;
314
+ border-bottom: 2px solid var(--n-border);
315
+ }
316
+
317
+ .sc-beaufort-table td {
318
+ padding: 0.8rem 1rem;
319
+ font-size: 0.9rem;
320
+ color: var(--n-text-muted);
321
+ border-bottom: 1px solid var(--n-border);
322
+ }
323
+
324
+ .sc-clickable-row {
325
+ cursor: pointer;
326
+ transition: background 0.15s;
327
+ }
328
+
329
+ .sc-clickable-row:hover {
330
+ background: var(--n-bg-muted);
331
+ }
332
+
333
+ .sc-clickable-row.active {
334
+ background: var(--n-primary);
335
+ }
336
+
337
+ .sc-clickable-row.active td {
338
+ color: var(--n-primary-on);
339
+ }
340
+
341
+ .sc-force-tag {
342
+ background: var(--n-bg-muted);
343
+ padding: 0.2rem 0.5rem;
344
+ border-radius: 0.4rem;
345
+ font-weight: 700;
346
+ font-size: 0.85rem;
347
+ color: var(--n-text);
348
+ }
349
+
350
+ .sc-clickable-row.active .sc-force-tag {
351
+ background: rgba(255, 255, 255, 0.2);
352
+ color: var(--n-primary-on);
353
+ }
354
+
355
+ @media (max-width: 640px) {
356
+ .sc-beaufort-summary {
357
+ grid-template-columns: 1fr;
358
+ }
359
+
360
+ .sc-force-circle {
361
+ width: 60px;
362
+ height: 60px;
363
+ font-size: 2rem;
364
+ }
365
+ }
366
+ </style>