@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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jjlmoya/utils-nautical",
3
- "version": "1.4.0",
3
+ "version": "1.6.0",
4
4
  "type": "module",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./src/index.ts",
@@ -37,7 +37,7 @@
37
37
  },
38
38
  "dependencies": {
39
39
  "@iconify-json/mdi": "^1.2.3",
40
- "@jjlmoya/utils-shared": "1.0.2",
40
+ "@jjlmoya/utils-shared": "^1.1.0",
41
41
  "astro": "^6.1.2",
42
42
  "astro-icon": "^1.1.0",
43
43
  "chart.js": "^4.5.1"
@@ -1,5 +1,4 @@
1
1
  ---
2
- import './style.css';
3
2
  import type { EnduranceUI } from './index';
4
3
 
5
4
  interface Props {
@@ -308,3 +307,343 @@ const { ui } = Astro.props;
308
307
  void SEA_FACTORS;
309
308
  new EnduranceCalculator();
310
309
  </script>
310
+
311
+ <style>
312
+ .endurance-calculator {
313
+ --n-bg: #fff;
314
+ --n-bg-muted: #f1f5f9;
315
+ --n-text: #0f172a;
316
+ --n-text-muted: #475569;
317
+ --n-text-dim: #64748b;
318
+ --n-border: #e2e8f0;
319
+ --n-shadow: rgba(0, 0, 0, 0.05);
320
+ --n-primary: #3b82f6;
321
+ --n-primary-on: #fff;
322
+ --n-accent: #6366f1;
323
+ --n-cyan: #0891b2;
324
+ --n-success: #10b981;
325
+ --n-warning: #f59e0b;
326
+ --n-error: #f43f5e;
327
+ --ec-hero-bg: #0f172a;
328
+ --ec-hero-label: #22d3ee;
329
+
330
+ max-width: 1000px;
331
+ margin: 0 auto;
332
+ }
333
+
334
+ :global(.theme-dark) .endurance-calculator {
335
+ --n-bg: #0f172a;
336
+ --n-bg-muted: #1e293b;
337
+ --n-text: #f8fafc;
338
+ --n-text-muted: #94a3b8;
339
+ --n-text-dim: #64748b;
340
+ --n-border: #334155;
341
+ --n-shadow: rgba(0, 0, 0, 0.3);
342
+ --n-primary: #60a5fa;
343
+ --n-primary-on: #fff;
344
+ --n-accent: #818cf8;
345
+ --n-cyan: #22d3ee;
346
+ --n-success: #34d399;
347
+ --n-warning: #fbbf24;
348
+ --n-error: #fb7185;
349
+ --ec-hero-bg: #020617;
350
+ --ec-hero-label: #22d3ee;
351
+ }
352
+
353
+ .ec-main-container {
354
+ background: var(--n-bg);
355
+ border: 1px solid var(--n-border);
356
+ border-radius: 1.5rem;
357
+ display: grid;
358
+ grid-template-columns: 360px 1fr;
359
+ overflow: hidden;
360
+ box-shadow: 0 20px 40px var(--n-shadow);
361
+ }
362
+
363
+ .ec-sidebar-inputs {
364
+ padding: 1.5rem;
365
+ border-right: 1px solid var(--n-border);
366
+ background: var(--n-bg-muted);
367
+ display: flex;
368
+ flex-direction: column;
369
+ gap: 1.2rem;
370
+ }
371
+
372
+ .ec-compact-group {
373
+ display: flex;
374
+ flex-direction: column;
375
+ gap: 0.4rem;
376
+ }
377
+
378
+ .ec-compact-group label {
379
+ font-size: 0.7rem;
380
+ font-weight: 800;
381
+ text-transform: uppercase;
382
+ color: var(--n-text-muted);
383
+ letter-spacing: 0.06em;
384
+ }
385
+
386
+ .ec-dual-row {
387
+ display: grid;
388
+ grid-template-columns: 1fr 1fr;
389
+ gap: 0.5rem;
390
+ }
391
+
392
+ .ec-sub-label {
393
+ font-size: 0.65rem;
394
+ color: var(--n-text-muted);
395
+ font-weight: 700;
396
+ margin-bottom: 0.2rem;
397
+ display: block;
398
+ }
399
+
400
+ .ec-field-wrapper {
401
+ position: relative;
402
+ display: flex;
403
+ align-items: center;
404
+ }
405
+
406
+ .ec-field-icon {
407
+ position: absolute;
408
+ left: 8px;
409
+ font-size: 0.9rem;
410
+ color: var(--n-text-muted);
411
+ pointer-events: none;
412
+ }
413
+
414
+ .ec-compact-input,
415
+ .ec-compact-select {
416
+ width: 100%;
417
+ background: var(--n-bg);
418
+ border: 1px solid var(--n-border);
419
+ border-radius: 0.5rem;
420
+ padding: 0.6rem 2.4rem 0.6rem 2.2rem;
421
+ font-size: 0.95rem;
422
+ font-weight: 700;
423
+ color: var(--n-text);
424
+ outline: none;
425
+ transition: border-color 0.2s;
426
+ }
427
+
428
+ .ec-compact-input:focus,
429
+ .ec-compact-select:focus {
430
+ border-color: var(--n-primary);
431
+ }
432
+
433
+ .ec-compact-select {
434
+ padding-right: 0.6rem;
435
+ cursor: pointer;
436
+ }
437
+
438
+ .ec-unit-tag {
439
+ position: absolute;
440
+ right: 8px;
441
+ font-size: 0.65rem;
442
+ font-weight: 800;
443
+ color: var(--n-text-muted);
444
+ pointer-events: none;
445
+ }
446
+
447
+ .ec-dashboard-panel {
448
+ padding: 2rem;
449
+ display: flex;
450
+ flex-direction: column;
451
+ gap: 2rem;
452
+ }
453
+
454
+ .ec-hero-display {
455
+ background: var(--ec-hero-bg);
456
+ border-radius: 1rem;
457
+ padding: 2rem;
458
+ color: var(--n-primary-on);
459
+ display: flex;
460
+ flex-direction: column;
461
+ gap: 1.5rem;
462
+ }
463
+
464
+ .ec-hero-top {
465
+ display: flex;
466
+ justify-content: space-between;
467
+ align-items: flex-start;
468
+ }
469
+
470
+ .ec-display-title {
471
+ font-size: 0.65rem;
472
+ font-weight: 900;
473
+ text-transform: uppercase;
474
+ color: var(--ec-hero-label);
475
+ letter-spacing: 0.1em;
476
+ }
477
+
478
+ .ec-main-value-row {
479
+ display: flex;
480
+ align-items: baseline;
481
+ gap: 0.5rem;
482
+ }
483
+
484
+ .ec-main-value {
485
+ font-size: 5rem;
486
+ font-weight: 900;
487
+ color: var(--n-primary-on);
488
+ line-height: 1;
489
+ }
490
+
491
+ .ec-main-unit {
492
+ font-size: 1.2rem;
493
+ font-weight: 700;
494
+ opacity: 0.4;
495
+ color: var(--n-primary-on);
496
+ }
497
+
498
+ .ec-fuel-badge {
499
+ font-size: 0.85rem;
500
+ font-weight: 900;
501
+ color: var(--ec-hero-label);
502
+ letter-spacing: 0.05em;
503
+ }
504
+
505
+ .ec-progress-track {
506
+ height: 10px;
507
+ background: rgba(255, 255, 255, 0.1);
508
+ border-radius: 5px;
509
+ position: relative;
510
+ overflow: hidden;
511
+ }
512
+
513
+ .ec-progress-fill {
514
+ height: 100%;
515
+ background: linear-gradient(90deg, var(--n-error) 0%, var(--n-cyan) 100%);
516
+ width: 0%;
517
+ transition: width 0.8s ease-out;
518
+ }
519
+
520
+ .ec-marker {
521
+ position: absolute;
522
+ top: 0;
523
+ bottom: 0;
524
+ width: 2px;
525
+ background: var(--n-primary-on);
526
+ z-index: 2;
527
+ }
528
+
529
+ .ec-stats-grid {
530
+ display: grid;
531
+ grid-template-columns: repeat(2, 1fr);
532
+ gap: 1rem;
533
+ }
534
+
535
+ .ec-stat-card {
536
+ background: var(--n-bg-muted);
537
+ border: 1px solid var(--n-border);
538
+ border-radius: 0.75rem;
539
+ padding: 1rem;
540
+ display: flex;
541
+ flex-direction: column;
542
+ gap: 0.2rem;
543
+ }
544
+
545
+ .ec-stat-label {
546
+ font-size: 0.6rem;
547
+ font-weight: 800;
548
+ text-transform: uppercase;
549
+ color: var(--n-text-muted);
550
+ letter-spacing: 0.06em;
551
+ }
552
+
553
+ .ec-stat-value {
554
+ font-size: 1.4rem;
555
+ font-weight: 900;
556
+ color: var(--n-text);
557
+ }
558
+
559
+ .ec-stat-value.danger {
560
+ color: var(--n-error);
561
+ }
562
+
563
+ .ec-stat-card.hidden {
564
+ display: none;
565
+ }
566
+
567
+ .ec-inverter-card {
568
+ padding: 1.5rem;
569
+ background: var(--n-bg-muted);
570
+ border: 1px dashed var(--n-border);
571
+ border-radius: 1rem;
572
+ display: flex;
573
+ flex-direction: column;
574
+ gap: 1rem;
575
+ }
576
+
577
+ .ec-inverter-header {
578
+ font-size: 0.75rem;
579
+ font-weight: 900;
580
+ text-transform: uppercase;
581
+ color: var(--n-cyan);
582
+ letter-spacing: 0.06em;
583
+ }
584
+
585
+ .ec-inverter-row {
586
+ display: grid;
587
+ grid-template-columns: 1fr 1fr;
588
+ gap: 1.5rem;
589
+ align-items: center;
590
+ }
591
+
592
+ .ec-inverter-label {
593
+ font-size: 0.65rem;
594
+ font-weight: 800;
595
+ text-transform: uppercase;
596
+ color: var(--n-text-muted);
597
+ margin-bottom: 0.3rem;
598
+ }
599
+
600
+ .ec-inverter-value {
601
+ font-size: 2rem;
602
+ font-weight: 900;
603
+ color: var(--n-cyan);
604
+ }
605
+
606
+ .ec-inverter-unit {
607
+ font-size: 0.85rem;
608
+ color: var(--n-text-muted);
609
+ font-weight: 700;
610
+ }
611
+
612
+ .ec-warning-bar {
613
+ background: color-mix(in srgb, var(--n-error), transparent 90%);
614
+ padding: 0.8rem 1.2rem;
615
+ border-radius: 0.5rem;
616
+ display: flex;
617
+ align-items: center;
618
+ gap: 0.6rem;
619
+ font-size: 0.75rem;
620
+ font-weight: 600;
621
+ color: var(--n-error);
622
+ }
623
+
624
+ .ec-warning-icon {
625
+ font-size: 1rem;
626
+ flex-shrink: 0;
627
+ }
628
+
629
+ @media (max-width: 800px) {
630
+ .ec-main-container {
631
+ grid-template-columns: 1fr;
632
+ }
633
+
634
+ .ec-sidebar-inputs {
635
+ border-right: none;
636
+ border-bottom: 1px solid var(--n-border);
637
+ }
638
+ }
639
+
640
+ @media (max-width: 480px) {
641
+ .ec-main-value {
642
+ font-size: 2.8rem;
643
+ }
644
+
645
+ .ec-stats-grid {
646
+ grid-template-columns: 1fr;
647
+ }
648
+ }
649
+ </style>
@@ -1,5 +1,4 @@
1
1
  ---
2
- import './style.css';
3
2
  import type { NauticalConverterUI } from './index';
4
3
 
5
4
  interface Props {
@@ -479,3 +478,211 @@ const allBeaufort = { es: beaufortEs, en: beaufortEn, fr: beaufortFr };
479
478
 
480
479
  new NauticalConverter();
481
480
  </script>
481
+
482
+ <style>
483
+ .nautical-converter {
484
+ --n-bg: #fff;
485
+ --n-bg-muted: #f1f5f9;
486
+ --n-text: #0f172a;
487
+ --n-text-muted: #475569;
488
+ --n-text-dim: #64748b;
489
+ --n-border: #e2e8f0;
490
+ --n-shadow: rgba(0, 0, 0, 0.05);
491
+ --n-primary: #3b82f6;
492
+ --n-primary-on: #fff;
493
+ --n-accent: #6366f1;
494
+ --n-cyan: #0891b2;
495
+ --n-success: #10b981;
496
+ --n-warning: #f59e0b;
497
+ --n-error: #f43f5e;
498
+
499
+ display: flex;
500
+ flex-direction: column;
501
+ gap: 1.5rem;
502
+ max-width: 900px;
503
+ margin: 0 auto;
504
+ }
505
+
506
+ :global(.theme-dark) .nautical-converter {
507
+ --n-bg: #0f172a;
508
+ --n-bg-muted: #1e293b;
509
+ --n-text: #f8fafc;
510
+ --n-text-muted: #94a3b8;
511
+ --n-text-dim: #64748b;
512
+ --n-border: #334155;
513
+ --n-shadow: rgba(0, 0, 0, 0.3);
514
+ --n-primary: #60a5fa;
515
+ --n-primary-on: #fff;
516
+ --n-accent: #818cf8;
517
+ --n-cyan: #22d3ee;
518
+ --n-success: #34d399;
519
+ --n-warning: #fbbf24;
520
+ --n-error: #fb7185;
521
+ }
522
+
523
+ .nc-category-tabs {
524
+ display: flex;
525
+ gap: 0.5rem;
526
+ flex-wrap: wrap;
527
+ background: var(--n-bg);
528
+ border: 1px solid var(--n-border);
529
+ border-radius: 1rem;
530
+ padding: 0.5rem;
531
+ }
532
+
533
+ .nc-tab-btn {
534
+ flex: 1;
535
+ min-width: 120px;
536
+ padding: 0.7rem 1.2rem;
537
+ border: none;
538
+ border-radius: 0.7rem;
539
+ background: transparent;
540
+ color: var(--n-text-muted);
541
+ font-size: 0.9rem;
542
+ font-weight: 600;
543
+ cursor: pointer;
544
+ transition: background 0.2s, color 0.2s;
545
+ }
546
+
547
+ .nc-tab-btn:hover {
548
+ background: var(--n-bg-muted);
549
+ color: var(--n-text);
550
+ }
551
+
552
+ .nc-tab-btn.active {
553
+ background: var(--n-primary);
554
+ color: var(--n-primary-on);
555
+ }
556
+
557
+ .nc-tab-panel {
558
+ display: none;
559
+ }
560
+
561
+ .nc-tab-panel.active {
562
+ display: block;
563
+ }
564
+
565
+ .nc-converter-card {
566
+ background: var(--n-bg);
567
+ border: 1px solid var(--n-border);
568
+ border-radius: 1.5rem;
569
+ padding: 2rem;
570
+ box-shadow: 0 8px 24px var(--n-shadow);
571
+ }
572
+
573
+ .nc-input-grid {
574
+ display: grid;
575
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
576
+ gap: 1.2rem;
577
+ }
578
+
579
+ .nc-input-group {
580
+ display: flex;
581
+ flex-direction: column;
582
+ gap: 0.4rem;
583
+ }
584
+
585
+ .nc-input-group label {
586
+ font-size: 0.8rem;
587
+ font-weight: 700;
588
+ color: var(--n-text-muted);
589
+ text-transform: uppercase;
590
+ letter-spacing: 0.05em;
591
+ }
592
+
593
+ .nc-input-wrapper {
594
+ position: relative;
595
+ display: flex;
596
+ align-items: center;
597
+ }
598
+
599
+ .nc-elegant-input {
600
+ width: 100%;
601
+ background: var(--n-bg);
602
+ color: var(--n-text);
603
+ border: 2px solid var(--n-border);
604
+ border-radius: 0.8rem;
605
+ padding: 0.75rem 2.8rem 0.75rem 1rem;
606
+ font-size: 1rem;
607
+ outline: none;
608
+ transition: border-color 0.2s;
609
+ }
610
+
611
+ .nc-elegant-input:focus {
612
+ border-color: var(--n-cyan);
613
+ }
614
+
615
+ .nc-copy-btn {
616
+ position: absolute;
617
+ right: 0.5rem;
618
+ background: none;
619
+ border: none;
620
+ cursor: pointer;
621
+ color: var(--n-cyan);
622
+ padding: 0.2rem;
623
+ display: flex;
624
+ align-items: center;
625
+ opacity: 0.5;
626
+ transition: opacity 0.2s;
627
+ }
628
+
629
+ .nc-copy-btn:hover {
630
+ opacity: 1;
631
+ }
632
+
633
+ .nc-beaufort-card {
634
+ margin-top: 1.5rem;
635
+ background: var(--n-bg);
636
+ border: 1px solid var(--n-border);
637
+ border-radius: 1rem;
638
+ padding: 1.2rem 1.5rem;
639
+ display: none;
640
+ align-items: center;
641
+ gap: 1.2rem;
642
+ }
643
+
644
+ .nc-beaufort-card.visible {
645
+ display: flex;
646
+ }
647
+
648
+ .nc-beaufort-badge {
649
+ display: flex;
650
+ align-items: center;
651
+ justify-content: center;
652
+ width: 56px;
653
+ height: 56px;
654
+ border-radius: 50%;
655
+ font-size: 1.6rem;
656
+ font-weight: 900;
657
+ color: var(--n-primary-on);
658
+ flex-shrink: 0;
659
+ }
660
+
661
+ .nc-beaufort-info {
662
+ display: flex;
663
+ flex-direction: column;
664
+ gap: 0.2rem;
665
+ }
666
+
667
+ .nc-beaufort-name {
668
+ font-size: 1.1rem;
669
+ font-weight: 700;
670
+ color: var(--n-text);
671
+ }
672
+
673
+ .nc-beaufort-sea {
674
+ font-size: 0.9rem;
675
+ color: var(--n-text-muted);
676
+ }
677
+
678
+ @media (max-width: 600px) {
679
+ .nc-input-grid {
680
+ grid-template-columns: 1fr 1fr;
681
+ }
682
+
683
+ .nc-tab-btn {
684
+ font-size: 0.8rem;
685
+ padding: 0.6rem 0.8rem;
686
+ }
687
+ }
688
+ </style>