@jjlmoya/utils-science 1.6.0 → 1.8.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-science",
3
- "version": "1.6.0",
3
+ "version": "1.8.0",
4
4
  "type": "module",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./src/index.ts",
@@ -1,5 +1,4 @@
1
1
  ---
2
- import "leaflet/dist/leaflet.css";
3
2
  import { Icon } from "astro-icon/components";
4
3
 
5
4
  interface Props {
@@ -168,6 +167,7 @@ const { ui } = Astro.props;
168
167
  </div>
169
168
 
170
169
  <script>
170
+ import "leaflet/dist/leaflet.css";
171
171
  import L from "leaflet";
172
172
  import { ImpactPhysics, type Composition } from "./logic/impactPhysics";
173
173
  import { VERDICT_CONFIGS } from "./constants";
@@ -360,3 +360,461 @@ const { ui } = Astro.props;
360
360
  window.addEventListener("resize", resizeCanvas);
361
361
  resizeCanvas();
362
362
  </script>
363
+
364
+ <style>
365
+ :root {
366
+ --colony-primary: #14b8a6;
367
+ --colony-secondary: #a855f7;
368
+ --colony-accent: #64748b;
369
+ --colony-danger: #ef4444;
370
+ --colony-danger-dark: #dc2626;
371
+ --colony-danger-light: #fca5a5;
372
+ --colony-bg-light: #f8fafc;
373
+ --colony-bg-dark: #0f172a;
374
+ --colony-bg-card: #fff;
375
+ --colony-bg-modal: rgba(255, 255, 255, 0.9);
376
+ --colony-border-light: #e2e8f0;
377
+ --colony-border-dark: #1e293b;
378
+ --colony-text-primary: #1e293b;
379
+ --colony-text-secondary: #64748b;
380
+ --colony-text-light: #f1f5f9;
381
+ }
382
+
383
+ :global(.theme-dark) {
384
+ --colony-bg-light: #0f172a;
385
+ --colony-bg-card: #1e293b;
386
+ --colony-bg-modal: rgba(30, 41, 59, 0.9);
387
+ --colony-border-light: #334155;
388
+ --colony-text-primary: #f1f5f9;
389
+ --colony-text-secondary: #cbd5e1;
390
+ }
391
+
392
+ .colony-container {
393
+ width: 100%;
394
+ max-width: 100%;
395
+ margin: 0 auto;
396
+ }
397
+
398
+ .colony-main-card {
399
+ width: 100%;
400
+ background: var(--colony-bg-card);
401
+ border-radius: 1.5rem;
402
+ box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1);
403
+ overflow: hidden;
404
+ border: 1px solid var(--colony-border-light);
405
+ transition: all 0.2s ease;
406
+ animation: colony-fade-in 0.3s ease-in-out;
407
+ }
408
+
409
+ .colony-grid {
410
+ display: grid;
411
+ grid-template-columns: 1fr;
412
+ gap: 0;
413
+ }
414
+
415
+ @media (min-width: 1024px) {
416
+ .colony-grid {
417
+ grid-template-columns: 2fr 1fr;
418
+ }
419
+ }
420
+
421
+ .colony-canvas-section {
422
+ padding: 1.5rem;
423
+ background: var(--colony-bg-light);
424
+ display: flex;
425
+ align-items: center;
426
+ justify-content: center;
427
+ min-height: 400px;
428
+ }
429
+
430
+ @media (min-width: 768px) {
431
+ .colony-canvas-section {
432
+ padding: 2.5rem;
433
+ }
434
+ }
435
+
436
+ .colony-canvas-wrapper {
437
+ position: relative;
438
+ width: 100%;
439
+ aspect-ratio: 1;
440
+ max-width: 500px;
441
+ }
442
+
443
+ .colony-hidden {
444
+ display: none;
445
+ }
446
+
447
+ .colony-upload-prompt {
448
+ width: 100%;
449
+ height: 100%;
450
+ border-radius: 100%;
451
+ border: 4px dashed var(--colony-border-light);
452
+ background: var(--colony-bg-card);
453
+ cursor: pointer;
454
+ display: flex;
455
+ flex-direction: column;
456
+ align-items: center;
457
+ justify-content: center;
458
+ gap: 1rem;
459
+ transition: all 0.3s ease;
460
+ padding: 2rem;
461
+ }
462
+
463
+ .colony-upload-prompt:hover {
464
+ border-color: var(--colony-primary);
465
+ background: var(--colony-bg-light);
466
+ }
467
+
468
+ .colony-upload-icon {
469
+ font-size: 3rem;
470
+ color: var(--colony-text-secondary);
471
+ }
472
+
473
+ .colony-upload-text {
474
+ text-align: center;
475
+ padding: 0 1.5rem;
476
+ }
477
+
478
+ .colony-upload-title {
479
+ font-size: 1.25rem;
480
+ font-weight: 700;
481
+ color: var(--colony-text-primary);
482
+ margin-bottom: 0.5rem;
483
+ }
484
+
485
+ .colony-upload-subtitle {
486
+ font-size: 0.875rem;
487
+ color: var(--colony-text-secondary);
488
+ }
489
+
490
+ .colony-petri-canvas {
491
+ position: absolute;
492
+ inset: 0;
493
+ width: 100%;
494
+ height: 100%;
495
+ border-radius: 100%;
496
+ border: 4px solid var(--colony-border-light);
497
+ cursor: crosshair;
498
+ box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1);
499
+ }
500
+
501
+ .colony-mode-indicator {
502
+ position: absolute;
503
+ top: 1rem;
504
+ left: 1rem;
505
+ background: var(--colony-bg-modal);
506
+ padding: 0.75rem;
507
+ border-radius: 0.5rem;
508
+ box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
509
+ backdrop-filter: blur(4px);
510
+ }
511
+
512
+ .colony-mode-label {
513
+ font-size: 0.75rem;
514
+ font-weight: 700;
515
+ color: var(--colony-text-secondary);
516
+ text-transform: uppercase;
517
+ letter-spacing: 0.05em;
518
+ margin-bottom: 0.25rem;
519
+ }
520
+
521
+ .colony-mode-value {
522
+ font-size: 1.125rem;
523
+ font-weight: 900;
524
+ letter-spacing: 0.025em;
525
+ }
526
+
527
+ .colony-mode-a {
528
+ color: var(--colony-primary);
529
+ }
530
+
531
+ .colony-mode-b {
532
+ color: var(--colony-secondary);
533
+ }
534
+
535
+ .colony-control-panel {
536
+ padding: 1.5rem;
537
+ border-left: 1px solid var(--colony-border-light);
538
+ display: flex;
539
+ flex-direction: column;
540
+ gap: 1.5rem;
541
+ background: var(--colony-bg-card);
542
+ }
543
+
544
+ @media (min-width: 768px) {
545
+ .colony-control-panel {
546
+ padding: 2rem;
547
+ }
548
+ }
549
+
550
+ @media (max-width: 1023px) {
551
+ .colony-control-panel {
552
+ border-left: none;
553
+ border-top: 1px solid var(--colony-border-light);
554
+ }
555
+ }
556
+
557
+ .colony-control-section {
558
+ display: flex;
559
+ flex-direction: column;
560
+ gap: 1rem;
561
+ }
562
+
563
+ .colony-button-section {
564
+ gap: 0.75rem;
565
+ }
566
+
567
+ .colony-control-title {
568
+ font-size: 0.875rem;
569
+ font-weight: 700;
570
+ text-transform: uppercase;
571
+ letter-spacing: 0.05em;
572
+ color: var(--colony-text-secondary);
573
+ }
574
+
575
+ .colony-button-grid {
576
+ display: grid;
577
+ grid-template-columns: 1fr 1fr;
578
+ gap: 0.75rem;
579
+ }
580
+
581
+ .colony-mode-btn {
582
+ padding: 0.75rem 1rem;
583
+ border-radius: 0.75rem;
584
+ border: 2px solid var(--colony-border-light);
585
+ background: var(--colony-bg-light);
586
+ color: var(--colony-text-secondary);
587
+ font-weight: 700;
588
+ font-size: 0.875rem;
589
+ cursor: pointer;
590
+ display: flex;
591
+ align-items: center;
592
+ justify-content: center;
593
+ gap: 0.5rem;
594
+ transition: all 0.2s ease;
595
+ }
596
+
597
+ .colony-mode-btn:hover {
598
+ transform: scale(1.05);
599
+ }
600
+
601
+ .colony-mode-btn-active {
602
+ border-color: var(--colony-primary);
603
+ background: color-mix(in srgb, var(--colony-primary) 10%, white);
604
+ color: var(--colony-primary);
605
+ }
606
+
607
+ :global(.theme-dark) .colony-mode-btn-active {
608
+ background: color-mix(in srgb, var(--colony-primary) 15%, var(--colony-bg-light));
609
+ }
610
+
611
+ .colony-color-dot {
612
+ width: 1rem;
613
+ height: 1rem;
614
+ border-radius: 50%;
615
+ display: inline-block;
616
+ }
617
+
618
+ .colony-color-a {
619
+ background: var(--colony-primary);
620
+ }
621
+
622
+ .colony-color-b {
623
+ background: var(--colony-secondary);
624
+ }
625
+
626
+ .colony-count-grid {
627
+ display: grid;
628
+ grid-template-columns: 1fr 1fr;
629
+ gap: 1rem;
630
+ }
631
+
632
+ .colony-count-box {
633
+ padding: 1rem;
634
+ border-radius: 1rem;
635
+ border: 1px solid var(--colony-border-light);
636
+ transition: all 0.2s ease;
637
+ }
638
+
639
+ .colony-count-box-a {
640
+ background: color-mix(in srgb, var(--colony-primary) 5%, var(--colony-bg-card));
641
+ border-color: color-mix(in srgb, var(--colony-primary) 20%, var(--colony-border-light));
642
+ }
643
+
644
+ .colony-count-box-b {
645
+ background: color-mix(in srgb, var(--colony-secondary) 5%, var(--colony-bg-card));
646
+ border-color: color-mix(in srgb, var(--colony-secondary) 20%, var(--colony-border-light));
647
+ }
648
+
649
+ .colony-count-label {
650
+ font-size: 0.75rem;
651
+ font-weight: 700;
652
+ text-transform: uppercase;
653
+ letter-spacing: 0.05em;
654
+ margin-bottom: 0.25rem;
655
+ }
656
+
657
+ .colony-count-label-a {
658
+ color: var(--colony-primary);
659
+ }
660
+
661
+ .colony-count-label-b {
662
+ color: var(--colony-secondary);
663
+ }
664
+
665
+ .colony-count-value {
666
+ font-size: 2.25rem;
667
+ font-weight: 900;
668
+ letter-spacing: 0.025em;
669
+ color: var(--colony-text-primary);
670
+ }
671
+
672
+ .colony-count-total {
673
+ background: var(--colony-bg-light);
674
+ padding: 1rem;
675
+ border-radius: 1rem;
676
+ border: 1px solid var(--colony-border-light);
677
+ grid-column: 1 / -1;
678
+ }
679
+
680
+ .colony-count-label-total {
681
+ font-size: 0.75rem;
682
+ font-weight: 700;
683
+ text-transform: uppercase;
684
+ letter-spacing: 0.05em;
685
+ color: var(--colony-text-secondary);
686
+ margin-bottom: 0.25rem;
687
+ }
688
+
689
+ .colony-count-value-total {
690
+ font-size: 3rem;
691
+ font-weight: 900;
692
+ letter-spacing: 0.025em;
693
+ color: var(--colony-text-primary);
694
+ }
695
+
696
+ .colony-divider {
697
+ height: 1px;
698
+ background: var(--colony-border-light);
699
+ }
700
+
701
+ .colony-action-btn {
702
+ width: 100%;
703
+ padding: 0.75rem 1rem;
704
+ border-radius: 0.75rem;
705
+ border: 2px solid transparent;
706
+ font-weight: 700;
707
+ font-size: 0.875rem;
708
+ cursor: pointer;
709
+ display: flex;
710
+ align-items: center;
711
+ justify-content: center;
712
+ gap: 0.5rem;
713
+ transition: all 0.2s ease;
714
+ }
715
+
716
+ .colony-undo-btn {
717
+ background: var(--colony-bg-light);
718
+ border-color: var(--colony-border-light);
719
+ color: var(--colony-text-primary);
720
+ }
721
+
722
+ .colony-undo-btn:hover {
723
+ background: var(--colony-bg-light);
724
+ border-color: var(--colony-accent);
725
+ }
726
+
727
+ .colony-clear-btn {
728
+ background: color-mix(in srgb, var(--colony-danger) 5%, var(--colony-bg-card));
729
+ border-color: color-mix(in srgb, var(--colony-danger) 20%, var(--colony-border-light));
730
+ color: var(--colony-danger-dark);
731
+ }
732
+
733
+ .colony-clear-btn:hover {
734
+ background: color-mix(in srgb, var(--colony-danger) 10%, var(--colony-bg-card));
735
+ border-color: color-mix(in srgb, var(--colony-danger) 40%, var(--colony-border-light));
736
+ }
737
+
738
+ :global(.theme-dark) .colony-clear-btn {
739
+ color: var(--colony-danger-light);
740
+ }
741
+
742
+ .colony-btn-icon {
743
+ font-size: 1.25rem;
744
+ }
745
+
746
+ .colony-info-text {
747
+ font-size: 0.875rem;
748
+ color: var(--colony-text-secondary);
749
+ display: flex;
750
+ flex-direction: column;
751
+ gap: 0.5rem;
752
+ padding-top: 0.5rem;
753
+ }
754
+
755
+ .colony-info-text p {
756
+ margin: 0;
757
+ display: flex;
758
+ align-items: center;
759
+ gap: 0.5rem;
760
+ }
761
+
762
+ .colony-info-icon {
763
+ font-size: 1rem;
764
+ flex-shrink: 0;
765
+ }
766
+
767
+ @media (max-width: 768px) {
768
+ .colony-canvas-section {
769
+ min-height: 300px;
770
+ padding: 1rem;
771
+ }
772
+
773
+ .colony-canvas-wrapper {
774
+ max-width: 100%;
775
+ }
776
+
777
+ .colony-control-panel {
778
+ padding: 1rem;
779
+ }
780
+
781
+ .colony-upload-title {
782
+ font-size: 1rem;
783
+ }
784
+
785
+ .colony-upload-subtitle {
786
+ font-size: 0.75rem;
787
+ }
788
+
789
+ .colony-mode-btn {
790
+ padding: 0.625rem 0.75rem;
791
+ font-size: 0.75rem;
792
+ }
793
+
794
+ .colony-count-value {
795
+ font-size: 1.875rem;
796
+ }
797
+
798
+ .colony-count-value-total {
799
+ font-size: 2.25rem;
800
+ }
801
+
802
+ .colony-action-btn {
803
+ padding: 0.625rem;
804
+ font-size: 0.75rem;
805
+ }
806
+
807
+ .colony-info-text {
808
+ font-size: 0.75rem;
809
+ }
810
+ }
811
+
812
+ @keyframes colony-fade-in {
813
+ from {
814
+ opacity: 0;
815
+ }
816
+ to {
817
+ opacity: 1;
818
+ }
819
+ }
820
+ </style>