Komalpreet Kaur commited on
Commit
e22af00
Β·
unverified Β·
1 Parent(s): 7d0dac0

feat: implement 3D knowledge graph visualization using react-force-graph-3d

Browse files
frontend/package-lock.json CHANGED
@@ -8,19 +8,21 @@
8
  "name": "frontend",
9
  "version": "0.0.0",
10
  "dependencies": {
11
- "react": "^19.2.4",
12
- "react-dom": "^19.2.4"
 
 
13
  },
14
  "devDependencies": {
15
- "@eslint/js": "^9.39.4",
16
- "@types/react": "^19.2.14",
17
- "@types/react-dom": "^19.2.3",
18
- "@vitejs/plugin-react": "^6.0.1",
19
- "eslint": "^9.39.4",
20
- "eslint-plugin-react-hooks": "^7.0.1",
21
- "eslint-plugin-react-refresh": "^0.5.2",
22
- "globals": "^17.4.0",
23
- "vite": "^8.0.1"
24
  }
25
  },
26
  "node_modules/@babel/code-frame": {
@@ -156,6 +158,16 @@
156
  "@babel/core": "^7.0.0"
157
  }
158
  },
 
 
 
 
 
 
 
 
 
 
159
  "node_modules/@babel/helper-string-parser": {
160
  "version": "7.27.1",
161
  "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
@@ -216,6 +228,47 @@
216
  "node": ">=6.0.0"
217
  }
218
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
219
  "node_modules/@babel/template": {
220
  "version": "7.28.6",
221
  "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz",
@@ -264,38 +317,446 @@
264
  "node": ">=6.9.0"
265
  }
266
  },
267
- "node_modules/@emnapi/core": {
268
- "version": "1.9.1",
269
- "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.1.tgz",
270
- "integrity": "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==",
 
 
 
271
  "dev": true,
272
  "license": "MIT",
273
  "optional": true,
274
- "dependencies": {
275
- "@emnapi/wasi-threads": "1.2.0",
276
- "tslib": "^2.4.0"
 
 
277
  }
278
  },
279
- "node_modules/@emnapi/runtime": {
280
- "version": "1.9.1",
281
- "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.1.tgz",
282
- "integrity": "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==",
 
 
 
283
  "dev": true,
284
  "license": "MIT",
285
  "optional": true,
286
- "dependencies": {
287
- "tslib": "^2.4.0"
 
 
 
288
  }
289
  },
290
- "node_modules/@emnapi/wasi-threads": {
291
- "version": "1.2.0",
292
- "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz",
293
- "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==",
 
 
 
294
  "dev": true,
295
  "license": "MIT",
296
  "optional": true,
297
- "dependencies": {
298
- "tslib": "^2.4.0"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
299
  }
300
  },
301
  "node_modules/@eslint-community/eslint-utils": {
@@ -557,37 +1018,129 @@
557
  "@jridgewell/sourcemap-codec": "^1.4.14"
558
  }
559
  },
560
- "node_modules/@napi-rs/wasm-runtime": {
561
- "version": "1.1.1",
562
- "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz",
563
- "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==",
 
 
 
 
 
 
 
 
 
 
564
  "dev": true,
565
  "license": "MIT",
566
  "optional": true,
567
- "dependencies": {
568
- "@emnapi/core": "^1.7.1",
569
- "@emnapi/runtime": "^1.7.1",
570
- "@tybys/wasm-util": "^0.10.1"
571
- },
572
- "funding": {
573
- "type": "github",
574
- "url": "https://github.com/sponsors/Brooooooklyn"
575
- }
576
  },
577
- "node_modules/@oxc-project/types": {
578
- "version": "0.120.0",
579
- "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.120.0.tgz",
580
- "integrity": "sha512-k1YNu55DuvAip/MGE1FTsIuU3FUCn6v/ujG9V7Nq5Df/kX2CWb13hhwD0lmJGMGqE+bE1MXvv9SZVnMzEXlWcg==",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
581
  "dev": true,
582
  "license": "MIT",
583
- "funding": {
584
- "url": "https://github.com/sponsors/Boshen"
585
- }
 
586
  },
587
- "node_modules/@rolldown/binding-android-arm64": {
588
- "version": "1.0.0-rc.10",
589
- "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.10.tgz",
590
- "integrity": "sha512-jOHxwXhxmFKuXztiu1ORieJeTbx5vrTkcOkkkn2d35726+iwhrY1w/+nYY/AGgF12thg33qC3R1LMBF5tHTZHg==",
591
  "cpu": [
592
  "arm64"
593
  ],
@@ -595,16 +1148,13 @@
595
  "license": "MIT",
596
  "optional": true,
597
  "os": [
598
- "android"
599
- ],
600
- "engines": {
601
- "node": "^20.19.0 || >=22.12.0"
602
- }
603
  },
604
- "node_modules/@rolldown/binding-darwin-arm64": {
605
- "version": "1.0.0-rc.10",
606
- "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.10.tgz",
607
- "integrity": "sha512-gED05Teg/vtTZbIJBc4VNMAxAFDUPkuO/rAIyyxZjTj1a1/s6z5TII/5yMGZ0uLRCifEtwUQn8OlYzuYc0m70w==",
608
  "cpu": [
609
  "arm64"
610
  ],
@@ -612,118 +1162,97 @@
612
  "license": "MIT",
613
  "optional": true,
614
  "os": [
615
- "darwin"
616
- ],
617
- "engines": {
618
- "node": "^20.19.0 || >=22.12.0"
619
- }
620
  },
621
- "node_modules/@rolldown/binding-darwin-x64": {
622
- "version": "1.0.0-rc.10",
623
- "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.10.tgz",
624
- "integrity": "sha512-rI15NcM1mA48lqrIxVkHfAqcyFLcQwyXWThy+BQ5+mkKKPvSO26ir+ZDp36AgYoYVkqvMcdS8zOE6SeBsR9e8A==",
625
  "cpu": [
626
- "x64"
627
  ],
628
  "dev": true,
629
  "license": "MIT",
630
  "optional": true,
631
  "os": [
632
- "darwin"
633
- ],
634
- "engines": {
635
- "node": "^20.19.0 || >=22.12.0"
636
- }
637
  },
638
- "node_modules/@rolldown/binding-freebsd-x64": {
639
- "version": "1.0.0-rc.10",
640
- "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.10.tgz",
641
- "integrity": "sha512-XZRXHdTa+4ME1MuDVp021+doQ+z6Ei4CCFmNc5/sKbqb8YmkiJdj8QKlV3rCI0AJtAeSB5n0WGPuJWNL9p/L2w==",
642
  "cpu": [
643
- "x64"
644
  ],
645
  "dev": true,
646
  "license": "MIT",
647
  "optional": true,
648
  "os": [
649
- "freebsd"
650
- ],
651
- "engines": {
652
- "node": "^20.19.0 || >=22.12.0"
653
- }
654
  },
655
- "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
656
- "version": "1.0.0-rc.10",
657
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.10.tgz",
658
- "integrity": "sha512-R0SQMRluISSLzFE20sPWYHVmJdDQnRyc/FzSCN72BqQmh2SOZUFG+N3/vBZpR4C6WpEUVYJLrYUXaj43sJsNLA==",
659
  "cpu": [
660
- "arm"
661
  ],
662
  "dev": true,
663
  "license": "MIT",
664
  "optional": true,
665
  "os": [
666
  "linux"
667
- ],
668
- "engines": {
669
- "node": "^20.19.0 || >=22.12.0"
670
- }
671
  },
672
- "node_modules/@rolldown/binding-linux-arm64-gnu": {
673
- "version": "1.0.0-rc.10",
674
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.10.tgz",
675
- "integrity": "sha512-Y1reMrV/o+cwpduYhJuOE3OMKx32RMYCidf14y+HssARRmhDuWXJ4yVguDg2R/8SyyGNo+auzz64LnPK9Hq6jg==",
676
  "cpu": [
677
- "arm64"
678
  ],
679
  "dev": true,
680
  "license": "MIT",
681
  "optional": true,
682
  "os": [
683
  "linux"
684
- ],
685
- "engines": {
686
- "node": "^20.19.0 || >=22.12.0"
687
- }
688
  },
689
- "node_modules/@rolldown/binding-linux-arm64-musl": {
690
- "version": "1.0.0-rc.10",
691
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.10.tgz",
692
- "integrity": "sha512-vELN+HNb2IzuzSBUOD4NHmP9yrGwl1DVM29wlQvx1OLSclL0NgVWnVDKl/8tEks79EFek/kebQKnNJkIAA4W2g==",
693
  "cpu": [
694
- "arm64"
695
  ],
696
  "dev": true,
697
  "license": "MIT",
698
  "optional": true,
699
  "os": [
700
  "linux"
701
- ],
702
- "engines": {
703
- "node": "^20.19.0 || >=22.12.0"
704
- }
705
  },
706
- "node_modules/@rolldown/binding-linux-ppc64-gnu": {
707
- "version": "1.0.0-rc.10",
708
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.10.tgz",
709
- "integrity": "sha512-ZqrufYTgzxbHwpqOjzSsb0UV/aV2TFIY5rP8HdsiPTv/CuAgCRjM6s9cYFwQ4CNH+hf9Y4erHW1GjZuZ7WoI7w==",
710
  "cpu": [
711
- "ppc64"
712
  ],
713
  "dev": true,
714
  "license": "MIT",
715
  "optional": true,
716
  "os": [
717
  "linux"
718
- ],
719
- "engines": {
720
- "node": "^20.19.0 || >=22.12.0"
721
- }
722
  },
723
- "node_modules/@rolldown/binding-linux-s390x-gnu": {
724
- "version": "1.0.0-rc.10",
725
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.10.tgz",
726
- "integrity": "sha512-gSlmVS1FZJSRicA6IyjoRoKAFK7IIHBs7xJuHRSmjImqk3mPPWbR7RhbnfH2G6bcmMEllCt2vQ/7u9e6bBnByg==",
727
  "cpu": [
728
  "s390x"
729
  ],
@@ -732,15 +1261,12 @@
732
  "optional": true,
733
  "os": [
734
  "linux"
735
- ],
736
- "engines": {
737
- "node": "^20.19.0 || >=22.12.0"
738
- }
739
  },
740
- "node_modules/@rolldown/binding-linux-x64-gnu": {
741
- "version": "1.0.0-rc.10",
742
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.10.tgz",
743
- "integrity": "sha512-eOCKUpluKgfObT2pHjztnaWEIbUabWzk3qPZ5PuacuPmr4+JtQG4k2vGTY0H15edaTnicgU428XW/IH6AimcQw==",
744
  "cpu": [
745
  "x64"
746
  ],
@@ -749,15 +1275,12 @@
749
  "optional": true,
750
  "os": [
751
  "linux"
752
- ],
753
- "engines": {
754
- "node": "^20.19.0 || >=22.12.0"
755
- }
756
  },
757
- "node_modules/@rolldown/binding-linux-x64-musl": {
758
- "version": "1.0.0-rc.10",
759
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.10.tgz",
760
- "integrity": "sha512-Xdf2jQbfQowJnLcgYfD/m0Uu0Qj5OdxKallD78/IPPfzaiaI4KRAwZzHcKQ4ig1gtg1SuzC7jovNiM2TzQsBXA==",
761
  "cpu": [
762
  "x64"
763
  ],
@@ -766,15 +1289,26 @@
766
  "optional": true,
767
  "os": [
768
  "linux"
 
 
 
 
 
 
 
 
769
  ],
770
- "engines": {
771
- "node": "^20.19.0 || >=22.12.0"
772
- }
 
 
 
773
  },
774
- "node_modules/@rolldown/binding-openharmony-arm64": {
775
- "version": "1.0.0-rc.10",
776
- "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.10.tgz",
777
- "integrity": "sha512-o1hYe8hLi1EY6jgPFyxQgQ1wcycX+qz8eEbVmot2hFkgUzPxy9+kF0u0NIQBeDq+Mko47AkaFFaChcvZa9UX9Q==",
778
  "cpu": [
779
  "arm64"
780
  ],
@@ -783,49 +1317,40 @@
783
  "optional": true,
784
  "os": [
785
  "openharmony"
786
- ],
787
- "engines": {
788
- "node": "^20.19.0 || >=22.12.0"
789
- }
790
  },
791
- "node_modules/@rolldown/binding-wasm32-wasi": {
792
- "version": "1.0.0-rc.10",
793
- "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.10.tgz",
794
- "integrity": "sha512-Ugv9o7qYJudqQO5Y5y2N2SOo6S4WiqiNOpuQyoPInnhVzCY+wi/GHltcLHypG9DEUYMB0iTB/huJrpadiAcNcA==",
795
  "cpu": [
796
- "wasm32"
797
  ],
798
  "dev": true,
799
  "license": "MIT",
800
  "optional": true,
801
- "dependencies": {
802
- "@napi-rs/wasm-runtime": "^1.1.1"
803
- },
804
- "engines": {
805
- "node": ">=14.0.0"
806
- }
807
  },
808
- "node_modules/@rolldown/binding-win32-arm64-msvc": {
809
- "version": "1.0.0-rc.10",
810
- "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.10.tgz",
811
- "integrity": "sha512-7UODQb4fQUNT/vmgDZBl3XOBAIOutP5R3O/rkxg0aLfEGQ4opbCgU5vOw/scPe4xOqBwL9fw7/RP1vAMZ6QlAQ==",
812
  "cpu": [
813
- "arm64"
814
  ],
815
  "dev": true,
816
  "license": "MIT",
817
  "optional": true,
818
  "os": [
819
  "win32"
820
- ],
821
- "engines": {
822
- "node": "^20.19.0 || >=22.12.0"
823
- }
824
  },
825
- "node_modules/@rolldown/binding-win32-x64-msvc": {
826
- "version": "1.0.0-rc.10",
827
- "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.10.tgz",
828
- "integrity": "sha512-PYxKHMVHOb5NJuDL53vBUl1VwUjymDcYI6rzpIni0C9+9mTiJedvUxSk7/RPp7OOAm3v+EjgMu9bIy3N6b408w==",
829
  "cpu": [
830
  "x64"
831
  ],
@@ -834,27 +1359,71 @@
834
  "optional": true,
835
  "os": [
836
  "win32"
 
 
 
 
 
 
 
 
837
  ],
838
- "engines": {
839
- "node": "^20.19.0 || >=22.12.0"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
840
  }
841
  },
842
- "node_modules/@rolldown/pluginutils": {
843
- "version": "1.0.0-rc.7",
844
- "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.7.tgz",
845
- "integrity": "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==",
846
  "dev": true,
847
- "license": "MIT"
 
 
 
848
  },
849
- "node_modules/@tybys/wasm-util": {
850
- "version": "0.10.1",
851
- "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
852
- "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==",
 
 
 
 
 
 
 
 
 
 
 
853
  "dev": true,
854
  "license": "MIT",
855
- "optional": true,
856
  "dependencies": {
857
- "tslib": "^2.4.0"
858
  }
859
  },
860
  "node_modules/@types/estree": {
@@ -871,51 +1440,79 @@
871
  "dev": true,
872
  "license": "MIT"
873
  },
 
 
 
 
 
 
 
874
  "node_modules/@types/react": {
875
- "version": "19.2.14",
876
- "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz",
877
- "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==",
878
  "dev": true,
879
  "license": "MIT",
880
  "peer": true,
881
  "dependencies": {
 
882
  "csstype": "^3.2.2"
883
  }
884
  },
885
  "node_modules/@types/react-dom": {
886
- "version": "19.2.3",
887
- "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz",
888
- "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==",
889
  "dev": true,
890
  "license": "MIT",
891
  "peerDependencies": {
892
- "@types/react": "^19.2.0"
893
  }
894
  },
895
  "node_modules/@vitejs/plugin-react": {
896
- "version": "6.0.1",
897
- "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.1.tgz",
898
- "integrity": "sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==",
899
  "dev": true,
900
  "license": "MIT",
901
  "dependencies": {
902
- "@rolldown/pluginutils": "1.0.0-rc.7"
 
 
 
 
 
903
  },
904
  "engines": {
905
- "node": "^20.19.0 || >=22.12.0"
906
  },
907
  "peerDependencies": {
908
- "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0",
909
- "babel-plugin-react-compiler": "^1.0.0",
910
- "vite": "^8.0.0"
 
 
 
 
 
 
 
 
 
 
 
911
  },
912
- "peerDependenciesMeta": {
913
- "@rolldown/plugin-babel": {
914
- "optional": true
915
- },
916
- "babel-plugin-react-compiler": {
917
- "optional": true
918
- }
 
 
 
 
919
  }
920
  },
921
  "node_modules/acorn": {
@@ -1096,62 +1693,233 @@
1096
  "url": "https://github.com/chalk/chalk?sponsor=1"
1097
  }
1098
  },
1099
- "node_modules/color-convert": {
1100
- "version": "2.0.1",
1101
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
1102
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
1103
- "dev": true,
1104
- "license": "MIT",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1105
  "dependencies": {
1106
- "color-name": "~1.1.4"
1107
  },
1108
  "engines": {
1109
- "node": ">=7.0.0"
1110
  }
1111
  },
1112
- "node_modules/color-name": {
1113
- "version": "1.1.4",
1114
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
1115
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
1116
- "dev": true,
1117
- "license": "MIT"
1118
- },
1119
- "node_modules/concat-map": {
1120
- "version": "0.0.1",
1121
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
1122
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
1123
- "dev": true,
1124
- "license": "MIT"
1125
- },
1126
- "node_modules/convert-source-map": {
1127
- "version": "2.0.0",
1128
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
1129
- "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
1130
- "dev": true,
1131
- "license": "MIT"
1132
  },
1133
- "node_modules/cross-spawn": {
1134
- "version": "7.0.6",
1135
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
1136
- "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
1137
- "dev": true,
1138
  "license": "MIT",
1139
  "dependencies": {
1140
- "path-key": "^3.1.0",
1141
- "shebang-command": "^2.0.0",
1142
- "which": "^2.0.1"
1143
  },
1144
  "engines": {
1145
- "node": ">= 8"
1146
  }
1147
  },
1148
- "node_modules/csstype": {
1149
- "version": "3.2.3",
1150
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
1151
- "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
1152
- "dev": true,
1153
- "license": "MIT"
1154
- },
1155
  "node_modules/debug": {
1156
  "version": "4.4.3",
1157
  "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
@@ -1177,16 +1945,6 @@
1177
  "dev": true,
1178
  "license": "MIT"
1179
  },
1180
- "node_modules/detect-libc": {
1181
- "version": "2.1.2",
1182
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
1183
- "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
1184
- "dev": true,
1185
- "license": "Apache-2.0",
1186
- "engines": {
1187
- "node": ">=8"
1188
- }
1189
- },
1190
  "node_modules/electron-to-chromium": {
1191
  "version": "1.5.321",
1192
  "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.321.tgz",
@@ -1194,6 +1952,48 @@
1194
  "dev": true,
1195
  "license": "ISC"
1196
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1197
  "node_modules/escalade": {
1198
  "version": "3.2.0",
1199
  "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
@@ -1279,33 +2079,26 @@
1279
  }
1280
  },
1281
  "node_modules/eslint-plugin-react-hooks": {
1282
- "version": "7.0.1",
1283
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz",
1284
- "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==",
1285
  "dev": true,
1286
  "license": "MIT",
1287
- "dependencies": {
1288
- "@babel/core": "^7.24.4",
1289
- "@babel/parser": "^7.24.4",
1290
- "hermes-parser": "^0.25.1",
1291
- "zod": "^3.25.0 || ^4.0.0",
1292
- "zod-validation-error": "^3.5.0 || ^4.0.0"
1293
- },
1294
  "engines": {
1295
- "node": ">=18"
1296
  },
1297
  "peerDependencies": {
1298
  "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
1299
  }
1300
  },
1301
  "node_modules/eslint-plugin-react-refresh": {
1302
- "version": "0.5.2",
1303
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.2.tgz",
1304
- "integrity": "sha512-hmgTH57GfzoTFjVN0yBwTggnsVUF2tcqi7RJZHqi9lIezSs4eFyAMktA68YD4r5kNw1mxyY4dmkyoFDb3FIqrA==",
1305
  "dev": true,
1306
  "license": "MIT",
1307
  "peerDependencies": {
1308
- "eslint": "^9 || ^10"
1309
  }
1310
  },
1311
  "node_modules/eslint-scope": {
@@ -1492,6 +2285,20 @@
1492
  "dev": true,
1493
  "license": "ISC"
1494
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1495
  "node_modules/fsevents": {
1496
  "version": "2.3.3",
1497
  "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
@@ -1531,9 +2338,9 @@
1531
  }
1532
  },
1533
  "node_modules/globals": {
1534
- "version": "17.4.0",
1535
- "resolved": "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz",
1536
- "integrity": "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==",
1537
  "dev": true,
1538
  "license": "MIT",
1539
  "engines": {
@@ -1553,23 +2360,6 @@
1553
  "node": ">=8"
1554
  }
1555
  },
1556
- "node_modules/hermes-estree": {
1557
- "version": "0.25.1",
1558
- "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz",
1559
- "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==",
1560
- "dev": true,
1561
- "license": "MIT"
1562
- },
1563
- "node_modules/hermes-parser": {
1564
- "version": "0.25.1",
1565
- "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz",
1566
- "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==",
1567
- "dev": true,
1568
- "license": "MIT",
1569
- "dependencies": {
1570
- "hermes-estree": "0.25.1"
1571
- }
1572
- },
1573
  "node_modules/ignore": {
1574
  "version": "5.3.2",
1575
  "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
@@ -1607,6 +2397,15 @@
1607
  "node": ">=0.8.19"
1608
  }
1609
  },
 
 
 
 
 
 
 
 
 
1610
  "node_modules/is-extglob": {
1611
  "version": "2.1.1",
1612
  "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -1637,11 +2436,19 @@
1637
  "dev": true,
1638
  "license": "ISC"
1639
  },
 
 
 
 
 
 
 
 
 
1640
  "node_modules/js-tokens": {
1641
  "version": "4.0.0",
1642
  "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1643
  "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
1644
- "dev": true,
1645
  "license": "MIT"
1646
  },
1647
  "node_modules/js-yaml": {
@@ -1649,344 +2456,95 @@
1649
  "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
1650
  "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
1651
  "dev": true,
1652
- "license": "MIT",
1653
- "dependencies": {
1654
- "argparse": "^2.0.1"
1655
- },
1656
- "bin": {
1657
- "js-yaml": "bin/js-yaml.js"
1658
- }
1659
- },
1660
- "node_modules/jsesc": {
1661
- "version": "3.1.0",
1662
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
1663
- "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
1664
- "dev": true,
1665
- "license": "MIT",
1666
- "bin": {
1667
- "jsesc": "bin/jsesc"
1668
- },
1669
- "engines": {
1670
- "node": ">=6"
1671
- }
1672
- },
1673
- "node_modules/json-buffer": {
1674
- "version": "3.0.1",
1675
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
1676
- "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
1677
- "dev": true,
1678
- "license": "MIT"
1679
- },
1680
- "node_modules/json-schema-traverse": {
1681
- "version": "0.4.1",
1682
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
1683
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
1684
- "dev": true,
1685
- "license": "MIT"
1686
- },
1687
- "node_modules/json-stable-stringify-without-jsonify": {
1688
- "version": "1.0.1",
1689
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
1690
- "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
1691
- "dev": true,
1692
- "license": "MIT"
1693
- },
1694
- "node_modules/json5": {
1695
- "version": "2.2.3",
1696
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
1697
- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
1698
- "dev": true,
1699
- "license": "MIT",
1700
- "bin": {
1701
- "json5": "lib/cli.js"
1702
- },
1703
- "engines": {
1704
- "node": ">=6"
1705
- }
1706
- },
1707
- "node_modules/keyv": {
1708
- "version": "4.5.4",
1709
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
1710
- "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
1711
- "dev": true,
1712
- "license": "MIT",
1713
- "dependencies": {
1714
- "json-buffer": "3.0.1"
1715
- }
1716
- },
1717
- "node_modules/levn": {
1718
- "version": "0.4.1",
1719
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
1720
- "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
1721
- "dev": true,
1722
- "license": "MIT",
1723
- "dependencies": {
1724
- "prelude-ls": "^1.2.1",
1725
- "type-check": "~0.4.0"
1726
- },
1727
- "engines": {
1728
- "node": ">= 0.8.0"
1729
- }
1730
- },
1731
- "node_modules/lightningcss": {
1732
- "version": "1.32.0",
1733
- "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
1734
- "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==",
1735
- "dev": true,
1736
- "license": "MPL-2.0",
1737
- "dependencies": {
1738
- "detect-libc": "^2.0.3"
1739
- },
1740
- "engines": {
1741
- "node": ">= 12.0.0"
1742
- },
1743
- "funding": {
1744
- "type": "opencollective",
1745
- "url": "https://opencollective.com/parcel"
1746
- },
1747
- "optionalDependencies": {
1748
- "lightningcss-android-arm64": "1.32.0",
1749
- "lightningcss-darwin-arm64": "1.32.0",
1750
- "lightningcss-darwin-x64": "1.32.0",
1751
- "lightningcss-freebsd-x64": "1.32.0",
1752
- "lightningcss-linux-arm-gnueabihf": "1.32.0",
1753
- "lightningcss-linux-arm64-gnu": "1.32.0",
1754
- "lightningcss-linux-arm64-musl": "1.32.0",
1755
- "lightningcss-linux-x64-gnu": "1.32.0",
1756
- "lightningcss-linux-x64-musl": "1.32.0",
1757
- "lightningcss-win32-arm64-msvc": "1.32.0",
1758
- "lightningcss-win32-x64-msvc": "1.32.0"
1759
- }
1760
- },
1761
- "node_modules/lightningcss-android-arm64": {
1762
- "version": "1.32.0",
1763
- "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz",
1764
- "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==",
1765
- "cpu": [
1766
- "arm64"
1767
- ],
1768
- "dev": true,
1769
- "license": "MPL-2.0",
1770
- "optional": true,
1771
- "os": [
1772
- "android"
1773
- ],
1774
- "engines": {
1775
- "node": ">= 12.0.0"
1776
- },
1777
- "funding": {
1778
- "type": "opencollective",
1779
- "url": "https://opencollective.com/parcel"
1780
- }
1781
- },
1782
- "node_modules/lightningcss-darwin-arm64": {
1783
- "version": "1.32.0",
1784
- "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz",
1785
- "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==",
1786
- "cpu": [
1787
- "arm64"
1788
- ],
1789
- "dev": true,
1790
- "license": "MPL-2.0",
1791
- "optional": true,
1792
- "os": [
1793
- "darwin"
1794
- ],
1795
- "engines": {
1796
- "node": ">= 12.0.0"
1797
- },
1798
- "funding": {
1799
- "type": "opencollective",
1800
- "url": "https://opencollective.com/parcel"
1801
- }
1802
- },
1803
- "node_modules/lightningcss-darwin-x64": {
1804
- "version": "1.32.0",
1805
- "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz",
1806
- "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==",
1807
- "cpu": [
1808
- "x64"
1809
- ],
1810
- "dev": true,
1811
- "license": "MPL-2.0",
1812
- "optional": true,
1813
- "os": [
1814
- "darwin"
1815
- ],
1816
- "engines": {
1817
- "node": ">= 12.0.0"
1818
- },
1819
- "funding": {
1820
- "type": "opencollective",
1821
- "url": "https://opencollective.com/parcel"
1822
- }
1823
- },
1824
- "node_modules/lightningcss-freebsd-x64": {
1825
- "version": "1.32.0",
1826
- "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz",
1827
- "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==",
1828
- "cpu": [
1829
- "x64"
1830
- ],
1831
- "dev": true,
1832
- "license": "MPL-2.0",
1833
- "optional": true,
1834
- "os": [
1835
- "freebsd"
1836
- ],
1837
- "engines": {
1838
- "node": ">= 12.0.0"
1839
- },
1840
- "funding": {
1841
- "type": "opencollective",
1842
- "url": "https://opencollective.com/parcel"
1843
- }
1844
- },
1845
- "node_modules/lightningcss-linux-arm-gnueabihf": {
1846
- "version": "1.32.0",
1847
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz",
1848
- "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==",
1849
- "cpu": [
1850
- "arm"
1851
- ],
1852
- "dev": true,
1853
- "license": "MPL-2.0",
1854
- "optional": true,
1855
- "os": [
1856
- "linux"
1857
- ],
1858
- "engines": {
1859
- "node": ">= 12.0.0"
1860
  },
1861
- "funding": {
1862
- "type": "opencollective",
1863
- "url": "https://opencollective.com/parcel"
1864
  }
1865
  },
1866
- "node_modules/lightningcss-linux-arm64-gnu": {
1867
- "version": "1.32.0",
1868
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz",
1869
- "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==",
1870
- "cpu": [
1871
- "arm64"
1872
- ],
1873
  "dev": true,
1874
- "license": "MPL-2.0",
1875
- "optional": true,
1876
- "os": [
1877
- "linux"
1878
- ],
1879
- "engines": {
1880
- "node": ">= 12.0.0"
1881
  },
1882
- "funding": {
1883
- "type": "opencollective",
1884
- "url": "https://opencollective.com/parcel"
1885
  }
1886
  },
1887
- "node_modules/lightningcss-linux-arm64-musl": {
1888
- "version": "1.32.0",
1889
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz",
1890
- "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==",
1891
- "cpu": [
1892
- "arm64"
1893
- ],
1894
  "dev": true,
1895
- "license": "MPL-2.0",
1896
- "optional": true,
1897
- "os": [
1898
- "linux"
1899
- ],
1900
- "engines": {
1901
- "node": ">= 12.0.0"
1902
- },
1903
- "funding": {
1904
- "type": "opencollective",
1905
- "url": "https://opencollective.com/parcel"
1906
- }
1907
  },
1908
- "node_modules/lightningcss-linux-x64-gnu": {
1909
- "version": "1.32.0",
1910
- "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz",
1911
- "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==",
1912
- "cpu": [
1913
- "x64"
1914
- ],
1915
  "dev": true,
1916
- "license": "MPL-2.0",
1917
- "optional": true,
1918
- "os": [
1919
- "linux"
1920
- ],
1921
- "engines": {
1922
- "node": ">= 12.0.0"
1923
- },
1924
- "funding": {
1925
- "type": "opencollective",
1926
- "url": "https://opencollective.com/parcel"
1927
- }
1928
  },
1929
- "node_modules/lightningcss-linux-x64-musl": {
1930
- "version": "1.32.0",
1931
- "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz",
1932
- "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==",
1933
- "cpu": [
1934
- "x64"
1935
- ],
1936
  "dev": true,
1937
- "license": "MPL-2.0",
1938
- "optional": true,
1939
- "os": [
1940
- "linux"
1941
- ],
 
 
 
 
 
 
1942
  "engines": {
1943
- "node": ">= 12.0.0"
 
 
 
 
 
 
 
 
 
1944
  },
1945
- "funding": {
1946
- "type": "opencollective",
1947
- "url": "https://opencollective.com/parcel"
1948
  }
1949
  },
1950
- "node_modules/lightningcss-win32-arm64-msvc": {
1951
- "version": "1.32.0",
1952
- "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz",
1953
- "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==",
1954
- "cpu": [
1955
- "arm64"
1956
- ],
1957
  "dev": true,
1958
- "license": "MPL-2.0",
1959
- "optional": true,
1960
- "os": [
1961
- "win32"
1962
- ],
1963
- "engines": {
1964
- "node": ">= 12.0.0"
1965
- },
1966
- "funding": {
1967
- "type": "opencollective",
1968
- "url": "https://opencollective.com/parcel"
1969
  }
1970
  },
1971
- "node_modules/lightningcss-win32-x64-msvc": {
1972
- "version": "1.32.0",
1973
- "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz",
1974
- "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==",
1975
- "cpu": [
1976
- "x64"
1977
- ],
1978
  "dev": true,
1979
- "license": "MPL-2.0",
1980
- "optional": true,
1981
- "os": [
1982
- "win32"
1983
- ],
1984
- "engines": {
1985
- "node": ">= 12.0.0"
1986
  },
1987
- "funding": {
1988
- "type": "opencollective",
1989
- "url": "https://opencollective.com/parcel"
1990
  }
1991
  },
1992
  "node_modules/locate-path": {
@@ -2005,6 +2563,12 @@
2005
  "url": "https://github.com/sponsors/sindresorhus"
2006
  }
2007
  },
 
 
 
 
 
 
2008
  "node_modules/lodash.merge": {
2009
  "version": "4.6.2",
2010
  "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
@@ -2012,6 +2576,18 @@
2012
  "dev": true,
2013
  "license": "MIT"
2014
  },
 
 
 
 
 
 
 
 
 
 
 
 
2015
  "node_modules/lru-cache": {
2016
  "version": "5.1.1",
2017
  "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@@ -2068,6 +2644,44 @@
2068
  "dev": true,
2069
  "license": "MIT"
2070
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2071
  "node_modules/node-releases": {
2072
  "version": "2.0.36",
2073
  "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz",
@@ -2075,6 +2689,15 @@
2075
  "dev": true,
2076
  "license": "MIT"
2077
  },
 
 
 
 
 
 
 
 
 
2078
  "node_modules/optionator": {
2079
  "version": "0.9.4",
2080
  "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
@@ -2166,9 +2789,9 @@
2166
  "license": "ISC"
2167
  },
2168
  "node_modules/picomatch": {
2169
- "version": "4.0.3",
2170
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
2171
- "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
2172
  "dev": true,
2173
  "license": "MIT",
2174
  "peer": true,
@@ -2179,10 +2802,22 @@
2179
  "url": "https://github.com/sponsors/jonschlinkert"
2180
  }
2181
  },
 
 
 
 
 
 
 
 
 
 
 
 
2182
  "node_modules/postcss": {
2183
- "version": "8.5.8",
2184
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz",
2185
- "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==",
2186
  "dev": true,
2187
  "funding": [
2188
  {
@@ -2208,6 +2843,16 @@
2208
  "node": "^10 || ^12 || >=14"
2209
  }
2210
  },
 
 
 
 
 
 
 
 
 
 
2211
  "node_modules/prelude-ls": {
2212
  "version": "1.2.1",
2213
  "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@@ -2218,6 +2863,17 @@
2218
  "node": ">= 0.8.0"
2219
  }
2220
  },
 
 
 
 
 
 
 
 
 
 
 
2221
  "node_modules/punycode": {
2222
  "version": "2.3.1",
2223
  "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
@@ -2229,25 +2885,77 @@
2229
  }
2230
  },
2231
  "node_modules/react": {
2232
- "version": "19.2.4",
2233
- "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz",
2234
- "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==",
2235
  "license": "MIT",
2236
  "peer": true,
 
 
 
2237
  "engines": {
2238
  "node": ">=0.10.0"
2239
  }
2240
  },
2241
  "node_modules/react-dom": {
2242
- "version": "19.2.4",
2243
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz",
2244
- "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2245
  "license": "MIT",
2246
  "dependencies": {
2247
- "scheduler": "^0.27.0"
 
 
 
2248
  },
2249
  "peerDependencies": {
2250
- "react": "^19.2.4"
 
 
 
 
 
 
 
 
 
 
2251
  }
2252
  },
2253
  "node_modules/resolve-from": {
@@ -2260,52 +2968,59 @@
2260
  "node": ">=4"
2261
  }
2262
  },
2263
- "node_modules/rolldown": {
2264
- "version": "1.0.0-rc.10",
2265
- "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.10.tgz",
2266
- "integrity": "sha512-q7j6vvarRFmKpgJUT8HCAUljkgzEp4LAhPlJUvQhA5LA1SUL36s5QCysMutErzL3EbNOZOkoziSx9iZC4FddKA==",
2267
  "dev": true,
2268
  "license": "MIT",
2269
  "dependencies": {
2270
- "@oxc-project/types": "=0.120.0",
2271
- "@rolldown/pluginutils": "1.0.0-rc.10"
2272
  },
2273
  "bin": {
2274
- "rolldown": "bin/cli.mjs"
2275
  },
2276
  "engines": {
2277
- "node": "^20.19.0 || >=22.12.0"
 
2278
  },
2279
  "optionalDependencies": {
2280
- "@rolldown/binding-android-arm64": "1.0.0-rc.10",
2281
- "@rolldown/binding-darwin-arm64": "1.0.0-rc.10",
2282
- "@rolldown/binding-darwin-x64": "1.0.0-rc.10",
2283
- "@rolldown/binding-freebsd-x64": "1.0.0-rc.10",
2284
- "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.10",
2285
- "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.10",
2286
- "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.10",
2287
- "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.10",
2288
- "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.10",
2289
- "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.10",
2290
- "@rolldown/binding-linux-x64-musl": "1.0.0-rc.10",
2291
- "@rolldown/binding-openharmony-arm64": "1.0.0-rc.10",
2292
- "@rolldown/binding-wasm32-wasi": "1.0.0-rc.10",
2293
- "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.10",
2294
- "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.10"
2295
- }
2296
- },
2297
- "node_modules/rolldown/node_modules/@rolldown/pluginutils": {
2298
- "version": "1.0.0-rc.10",
2299
- "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.10.tgz",
2300
- "integrity": "sha512-UkVDEFk1w3mveXeKgaTuYfKWtPbvgck1dT8TUG3bnccrH0XtLTuAyfCoks4Q/M5ZGToSVJTIQYCzy2g/atAOeg==",
2301
- "dev": true,
2302
- "license": "MIT"
 
 
 
 
2303
  },
2304
  "node_modules/scheduler": {
2305
- "version": "0.27.0",
2306
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
2307
- "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
2308
- "license": "MIT"
 
 
 
2309
  },
2310
  "node_modules/semver": {
2311
  "version": "6.3.1",
@@ -2376,15 +3091,71 @@
2376
  "node": ">=8"
2377
  }
2378
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2379
  "node_modules/tinyglobby": {
2380
- "version": "0.2.15",
2381
- "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
2382
- "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
2383
  "dev": true,
2384
  "license": "MIT",
2385
  "dependencies": {
2386
  "fdir": "^6.5.0",
2387
- "picomatch": "^4.0.3"
2388
  },
2389
  "engines": {
2390
  "node": ">=12.0.0"
@@ -2393,14 +3164,6 @@
2393
  "url": "https://github.com/sponsors/SuperchupuDev"
2394
  }
2395
  },
2396
- "node_modules/tslib": {
2397
- "version": "2.8.1",
2398
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
2399
- "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
2400
- "dev": true,
2401
- "license": "0BSD",
2402
- "optional": true
2403
- },
2404
  "node_modules/type-check": {
2405
  "version": "0.4.0",
2406
  "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
@@ -2456,24 +3219,25 @@
2456
  }
2457
  },
2458
  "node_modules/vite": {
2459
- "version": "8.0.1",
2460
- "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.1.tgz",
2461
- "integrity": "sha512-wt+Z2qIhfFt85uiyRt5LPU4oVEJBXj8hZNWKeqFG4gRG/0RaRGJ7njQCwzFVjO+v4+Ipmf5CY7VdmZRAYYBPHw==",
2462
  "dev": true,
2463
  "license": "MIT",
2464
  "peer": true,
2465
  "dependencies": {
2466
- "lightningcss": "^1.32.0",
2467
- "picomatch": "^4.0.3",
2468
- "postcss": "^8.5.8",
2469
- "rolldown": "1.0.0-rc.10",
2470
- "tinyglobby": "^0.2.15"
 
2471
  },
2472
  "bin": {
2473
  "vite": "bin/vite.js"
2474
  },
2475
  "engines": {
2476
- "node": "^20.19.0 || >=22.12.0"
2477
  },
2478
  "funding": {
2479
  "url": "https://github.com/vitejs/vite?sponsor=1"
@@ -2482,15 +3246,14 @@
2482
  "fsevents": "~2.3.3"
2483
  },
2484
  "peerDependencies": {
2485
- "@types/node": "^20.19.0 || >=22.12.0",
2486
- "@vitejs/devtools": "^0.1.0",
2487
- "esbuild": "^0.27.0",
2488
  "jiti": ">=1.21.0",
2489
- "less": "^4.0.0",
2490
- "sass": "^1.70.0",
2491
- "sass-embedded": "^1.70.0",
2492
- "stylus": ">=0.54.8",
2493
- "sugarss": "^5.0.0",
 
2494
  "terser": "^5.16.0",
2495
  "tsx": "^4.8.1",
2496
  "yaml": "^2.4.2"
@@ -2499,18 +3262,15 @@
2499
  "@types/node": {
2500
  "optional": true
2501
  },
2502
- "@vitejs/devtools": {
2503
- "optional": true
2504
- },
2505
- "esbuild": {
2506
- "optional": true
2507
- },
2508
  "jiti": {
2509
  "optional": true
2510
  },
2511
  "less": {
2512
  "optional": true
2513
  },
 
 
 
2514
  "sass": {
2515
  "optional": true
2516
  },
@@ -2579,30 +3339,6 @@
2579
  "funding": {
2580
  "url": "https://github.com/sponsors/sindresorhus"
2581
  }
2582
- },
2583
- "node_modules/zod": {
2584
- "version": "4.3.6",
2585
- "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz",
2586
- "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==",
2587
- "dev": true,
2588
- "license": "MIT",
2589
- "peer": true,
2590
- "funding": {
2591
- "url": "https://github.com/sponsors/colinhacks"
2592
- }
2593
- },
2594
- "node_modules/zod-validation-error": {
2595
- "version": "4.0.2",
2596
- "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz",
2597
- "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==",
2598
- "dev": true,
2599
- "license": "MIT",
2600
- "engines": {
2601
- "node": ">=18.0.0"
2602
- },
2603
- "peerDependencies": {
2604
- "zod": "^3.25.0 || ^4.0.0"
2605
- }
2606
  }
2607
  }
2608
  }
 
8
  "name": "frontend",
9
  "version": "0.0.0",
10
  "dependencies": {
11
+ "react": "^18.3.1",
12
+ "react-dom": "^18.3.1",
13
+ "react-force-graph-3d": "^1.29.1",
14
+ "three": "^0.183.2"
15
  },
16
  "devDependencies": {
17
+ "@eslint/js": "^9.15.0",
18
+ "@types/react": "^18.3.12",
19
+ "@types/react-dom": "^18.3.1",
20
+ "@vitejs/plugin-react": "^4.3.4",
21
+ "eslint": "^9.15.0",
22
+ "eslint-plugin-react-hooks": "^5.0.0",
23
+ "eslint-plugin-react-refresh": "^0.4.14",
24
+ "globals": "^15.12.0",
25
+ "vite": "^6.0.0"
26
  }
27
  },
28
  "node_modules/@babel/code-frame": {
 
158
  "@babel/core": "^7.0.0"
159
  }
160
  },
161
+ "node_modules/@babel/helper-plugin-utils": {
162
+ "version": "7.28.6",
163
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz",
164
+ "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==",
165
+ "dev": true,
166
+ "license": "MIT",
167
+ "engines": {
168
+ "node": ">=6.9.0"
169
+ }
170
+ },
171
  "node_modules/@babel/helper-string-parser": {
172
  "version": "7.27.1",
173
  "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
 
228
  "node": ">=6.0.0"
229
  }
230
  },
231
+ "node_modules/@babel/plugin-transform-react-jsx-self": {
232
+ "version": "7.27.1",
233
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz",
234
+ "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==",
235
+ "dev": true,
236
+ "license": "MIT",
237
+ "dependencies": {
238
+ "@babel/helper-plugin-utils": "^7.27.1"
239
+ },
240
+ "engines": {
241
+ "node": ">=6.9.0"
242
+ },
243
+ "peerDependencies": {
244
+ "@babel/core": "^7.0.0-0"
245
+ }
246
+ },
247
+ "node_modules/@babel/plugin-transform-react-jsx-source": {
248
+ "version": "7.27.1",
249
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz",
250
+ "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==",
251
+ "dev": true,
252
+ "license": "MIT",
253
+ "dependencies": {
254
+ "@babel/helper-plugin-utils": "^7.27.1"
255
+ },
256
+ "engines": {
257
+ "node": ">=6.9.0"
258
+ },
259
+ "peerDependencies": {
260
+ "@babel/core": "^7.0.0-0"
261
+ }
262
+ },
263
+ "node_modules/@babel/runtime": {
264
+ "version": "7.29.2",
265
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz",
266
+ "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==",
267
+ "license": "MIT",
268
+ "engines": {
269
+ "node": ">=6.9.0"
270
+ }
271
+ },
272
  "node_modules/@babel/template": {
273
  "version": "7.28.6",
274
  "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz",
 
317
  "node": ">=6.9.0"
318
  }
319
  },
320
+ "node_modules/@esbuild/aix-ppc64": {
321
+ "version": "0.25.12",
322
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz",
323
+ "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==",
324
+ "cpu": [
325
+ "ppc64"
326
+ ],
327
  "dev": true,
328
  "license": "MIT",
329
  "optional": true,
330
+ "os": [
331
+ "aix"
332
+ ],
333
+ "engines": {
334
+ "node": ">=18"
335
  }
336
  },
337
+ "node_modules/@esbuild/android-arm": {
338
+ "version": "0.25.12",
339
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz",
340
+ "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==",
341
+ "cpu": [
342
+ "arm"
343
+ ],
344
  "dev": true,
345
  "license": "MIT",
346
  "optional": true,
347
+ "os": [
348
+ "android"
349
+ ],
350
+ "engines": {
351
+ "node": ">=18"
352
  }
353
  },
354
+ "node_modules/@esbuild/android-arm64": {
355
+ "version": "0.25.12",
356
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz",
357
+ "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==",
358
+ "cpu": [
359
+ "arm64"
360
+ ],
361
  "dev": true,
362
  "license": "MIT",
363
  "optional": true,
364
+ "os": [
365
+ "android"
366
+ ],
367
+ "engines": {
368
+ "node": ">=18"
369
+ }
370
+ },
371
+ "node_modules/@esbuild/android-x64": {
372
+ "version": "0.25.12",
373
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz",
374
+ "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==",
375
+ "cpu": [
376
+ "x64"
377
+ ],
378
+ "dev": true,
379
+ "license": "MIT",
380
+ "optional": true,
381
+ "os": [
382
+ "android"
383
+ ],
384
+ "engines": {
385
+ "node": ">=18"
386
+ }
387
+ },
388
+ "node_modules/@esbuild/darwin-arm64": {
389
+ "version": "0.25.12",
390
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz",
391
+ "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==",
392
+ "cpu": [
393
+ "arm64"
394
+ ],
395
+ "dev": true,
396
+ "license": "MIT",
397
+ "optional": true,
398
+ "os": [
399
+ "darwin"
400
+ ],
401
+ "engines": {
402
+ "node": ">=18"
403
+ }
404
+ },
405
+ "node_modules/@esbuild/darwin-x64": {
406
+ "version": "0.25.12",
407
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz",
408
+ "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==",
409
+ "cpu": [
410
+ "x64"
411
+ ],
412
+ "dev": true,
413
+ "license": "MIT",
414
+ "optional": true,
415
+ "os": [
416
+ "darwin"
417
+ ],
418
+ "engines": {
419
+ "node": ">=18"
420
+ }
421
+ },
422
+ "node_modules/@esbuild/freebsd-arm64": {
423
+ "version": "0.25.12",
424
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz",
425
+ "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==",
426
+ "cpu": [
427
+ "arm64"
428
+ ],
429
+ "dev": true,
430
+ "license": "MIT",
431
+ "optional": true,
432
+ "os": [
433
+ "freebsd"
434
+ ],
435
+ "engines": {
436
+ "node": ">=18"
437
+ }
438
+ },
439
+ "node_modules/@esbuild/freebsd-x64": {
440
+ "version": "0.25.12",
441
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz",
442
+ "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==",
443
+ "cpu": [
444
+ "x64"
445
+ ],
446
+ "dev": true,
447
+ "license": "MIT",
448
+ "optional": true,
449
+ "os": [
450
+ "freebsd"
451
+ ],
452
+ "engines": {
453
+ "node": ">=18"
454
+ }
455
+ },
456
+ "node_modules/@esbuild/linux-arm": {
457
+ "version": "0.25.12",
458
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz",
459
+ "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==",
460
+ "cpu": [
461
+ "arm"
462
+ ],
463
+ "dev": true,
464
+ "license": "MIT",
465
+ "optional": true,
466
+ "os": [
467
+ "linux"
468
+ ],
469
+ "engines": {
470
+ "node": ">=18"
471
+ }
472
+ },
473
+ "node_modules/@esbuild/linux-arm64": {
474
+ "version": "0.25.12",
475
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz",
476
+ "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==",
477
+ "cpu": [
478
+ "arm64"
479
+ ],
480
+ "dev": true,
481
+ "license": "MIT",
482
+ "optional": true,
483
+ "os": [
484
+ "linux"
485
+ ],
486
+ "engines": {
487
+ "node": ">=18"
488
+ }
489
+ },
490
+ "node_modules/@esbuild/linux-ia32": {
491
+ "version": "0.25.12",
492
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz",
493
+ "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==",
494
+ "cpu": [
495
+ "ia32"
496
+ ],
497
+ "dev": true,
498
+ "license": "MIT",
499
+ "optional": true,
500
+ "os": [
501
+ "linux"
502
+ ],
503
+ "engines": {
504
+ "node": ">=18"
505
+ }
506
+ },
507
+ "node_modules/@esbuild/linux-loong64": {
508
+ "version": "0.25.12",
509
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz",
510
+ "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==",
511
+ "cpu": [
512
+ "loong64"
513
+ ],
514
+ "dev": true,
515
+ "license": "MIT",
516
+ "optional": true,
517
+ "os": [
518
+ "linux"
519
+ ],
520
+ "engines": {
521
+ "node": ">=18"
522
+ }
523
+ },
524
+ "node_modules/@esbuild/linux-mips64el": {
525
+ "version": "0.25.12",
526
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz",
527
+ "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==",
528
+ "cpu": [
529
+ "mips64el"
530
+ ],
531
+ "dev": true,
532
+ "license": "MIT",
533
+ "optional": true,
534
+ "os": [
535
+ "linux"
536
+ ],
537
+ "engines": {
538
+ "node": ">=18"
539
+ }
540
+ },
541
+ "node_modules/@esbuild/linux-ppc64": {
542
+ "version": "0.25.12",
543
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz",
544
+ "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==",
545
+ "cpu": [
546
+ "ppc64"
547
+ ],
548
+ "dev": true,
549
+ "license": "MIT",
550
+ "optional": true,
551
+ "os": [
552
+ "linux"
553
+ ],
554
+ "engines": {
555
+ "node": ">=18"
556
+ }
557
+ },
558
+ "node_modules/@esbuild/linux-riscv64": {
559
+ "version": "0.25.12",
560
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz",
561
+ "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==",
562
+ "cpu": [
563
+ "riscv64"
564
+ ],
565
+ "dev": true,
566
+ "license": "MIT",
567
+ "optional": true,
568
+ "os": [
569
+ "linux"
570
+ ],
571
+ "engines": {
572
+ "node": ">=18"
573
+ }
574
+ },
575
+ "node_modules/@esbuild/linux-s390x": {
576
+ "version": "0.25.12",
577
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz",
578
+ "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==",
579
+ "cpu": [
580
+ "s390x"
581
+ ],
582
+ "dev": true,
583
+ "license": "MIT",
584
+ "optional": true,
585
+ "os": [
586
+ "linux"
587
+ ],
588
+ "engines": {
589
+ "node": ">=18"
590
+ }
591
+ },
592
+ "node_modules/@esbuild/linux-x64": {
593
+ "version": "0.25.12",
594
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz",
595
+ "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==",
596
+ "cpu": [
597
+ "x64"
598
+ ],
599
+ "dev": true,
600
+ "license": "MIT",
601
+ "optional": true,
602
+ "os": [
603
+ "linux"
604
+ ],
605
+ "engines": {
606
+ "node": ">=18"
607
+ }
608
+ },
609
+ "node_modules/@esbuild/netbsd-arm64": {
610
+ "version": "0.25.12",
611
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz",
612
+ "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==",
613
+ "cpu": [
614
+ "arm64"
615
+ ],
616
+ "dev": true,
617
+ "license": "MIT",
618
+ "optional": true,
619
+ "os": [
620
+ "netbsd"
621
+ ],
622
+ "engines": {
623
+ "node": ">=18"
624
+ }
625
+ },
626
+ "node_modules/@esbuild/netbsd-x64": {
627
+ "version": "0.25.12",
628
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz",
629
+ "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==",
630
+ "cpu": [
631
+ "x64"
632
+ ],
633
+ "dev": true,
634
+ "license": "MIT",
635
+ "optional": true,
636
+ "os": [
637
+ "netbsd"
638
+ ],
639
+ "engines": {
640
+ "node": ">=18"
641
+ }
642
+ },
643
+ "node_modules/@esbuild/openbsd-arm64": {
644
+ "version": "0.25.12",
645
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz",
646
+ "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==",
647
+ "cpu": [
648
+ "arm64"
649
+ ],
650
+ "dev": true,
651
+ "license": "MIT",
652
+ "optional": true,
653
+ "os": [
654
+ "openbsd"
655
+ ],
656
+ "engines": {
657
+ "node": ">=18"
658
+ }
659
+ },
660
+ "node_modules/@esbuild/openbsd-x64": {
661
+ "version": "0.25.12",
662
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz",
663
+ "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==",
664
+ "cpu": [
665
+ "x64"
666
+ ],
667
+ "dev": true,
668
+ "license": "MIT",
669
+ "optional": true,
670
+ "os": [
671
+ "openbsd"
672
+ ],
673
+ "engines": {
674
+ "node": ">=18"
675
+ }
676
+ },
677
+ "node_modules/@esbuild/openharmony-arm64": {
678
+ "version": "0.25.12",
679
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz",
680
+ "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==",
681
+ "cpu": [
682
+ "arm64"
683
+ ],
684
+ "dev": true,
685
+ "license": "MIT",
686
+ "optional": true,
687
+ "os": [
688
+ "openharmony"
689
+ ],
690
+ "engines": {
691
+ "node": ">=18"
692
+ }
693
+ },
694
+ "node_modules/@esbuild/sunos-x64": {
695
+ "version": "0.25.12",
696
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz",
697
+ "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==",
698
+ "cpu": [
699
+ "x64"
700
+ ],
701
+ "dev": true,
702
+ "license": "MIT",
703
+ "optional": true,
704
+ "os": [
705
+ "sunos"
706
+ ],
707
+ "engines": {
708
+ "node": ">=18"
709
+ }
710
+ },
711
+ "node_modules/@esbuild/win32-arm64": {
712
+ "version": "0.25.12",
713
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz",
714
+ "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==",
715
+ "cpu": [
716
+ "arm64"
717
+ ],
718
+ "dev": true,
719
+ "license": "MIT",
720
+ "optional": true,
721
+ "os": [
722
+ "win32"
723
+ ],
724
+ "engines": {
725
+ "node": ">=18"
726
+ }
727
+ },
728
+ "node_modules/@esbuild/win32-ia32": {
729
+ "version": "0.25.12",
730
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz",
731
+ "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==",
732
+ "cpu": [
733
+ "ia32"
734
+ ],
735
+ "dev": true,
736
+ "license": "MIT",
737
+ "optional": true,
738
+ "os": [
739
+ "win32"
740
+ ],
741
+ "engines": {
742
+ "node": ">=18"
743
+ }
744
+ },
745
+ "node_modules/@esbuild/win32-x64": {
746
+ "version": "0.25.12",
747
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz",
748
+ "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==",
749
+ "cpu": [
750
+ "x64"
751
+ ],
752
+ "dev": true,
753
+ "license": "MIT",
754
+ "optional": true,
755
+ "os": [
756
+ "win32"
757
+ ],
758
+ "engines": {
759
+ "node": ">=18"
760
  }
761
  },
762
  "node_modules/@eslint-community/eslint-utils": {
 
1018
  "@jridgewell/sourcemap-codec": "^1.4.14"
1019
  }
1020
  },
1021
+ "node_modules/@rolldown/pluginutils": {
1022
+ "version": "1.0.0-beta.27",
1023
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz",
1024
+ "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==",
1025
+ "dev": true,
1026
+ "license": "MIT"
1027
+ },
1028
+ "node_modules/@rollup/rollup-android-arm-eabi": {
1029
+ "version": "4.60.1",
1030
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.1.tgz",
1031
+ "integrity": "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==",
1032
+ "cpu": [
1033
+ "arm"
1034
+ ],
1035
  "dev": true,
1036
  "license": "MIT",
1037
  "optional": true,
1038
+ "os": [
1039
+ "android"
1040
+ ]
 
 
 
 
 
 
1041
  },
1042
+ "node_modules/@rollup/rollup-android-arm64": {
1043
+ "version": "4.60.1",
1044
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.1.tgz",
1045
+ "integrity": "sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==",
1046
+ "cpu": [
1047
+ "arm64"
1048
+ ],
1049
+ "dev": true,
1050
+ "license": "MIT",
1051
+ "optional": true,
1052
+ "os": [
1053
+ "android"
1054
+ ]
1055
+ },
1056
+ "node_modules/@rollup/rollup-darwin-arm64": {
1057
+ "version": "4.60.1",
1058
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.1.tgz",
1059
+ "integrity": "sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==",
1060
+ "cpu": [
1061
+ "arm64"
1062
+ ],
1063
+ "dev": true,
1064
+ "license": "MIT",
1065
+ "optional": true,
1066
+ "os": [
1067
+ "darwin"
1068
+ ]
1069
+ },
1070
+ "node_modules/@rollup/rollup-darwin-x64": {
1071
+ "version": "4.60.1",
1072
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.1.tgz",
1073
+ "integrity": "sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==",
1074
+ "cpu": [
1075
+ "x64"
1076
+ ],
1077
+ "dev": true,
1078
+ "license": "MIT",
1079
+ "optional": true,
1080
+ "os": [
1081
+ "darwin"
1082
+ ]
1083
+ },
1084
+ "node_modules/@rollup/rollup-freebsd-arm64": {
1085
+ "version": "4.60.1",
1086
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.1.tgz",
1087
+ "integrity": "sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==",
1088
+ "cpu": [
1089
+ "arm64"
1090
+ ],
1091
+ "dev": true,
1092
+ "license": "MIT",
1093
+ "optional": true,
1094
+ "os": [
1095
+ "freebsd"
1096
+ ]
1097
+ },
1098
+ "node_modules/@rollup/rollup-freebsd-x64": {
1099
+ "version": "4.60.1",
1100
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.1.tgz",
1101
+ "integrity": "sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==",
1102
+ "cpu": [
1103
+ "x64"
1104
+ ],
1105
+ "dev": true,
1106
+ "license": "MIT",
1107
+ "optional": true,
1108
+ "os": [
1109
+ "freebsd"
1110
+ ]
1111
+ },
1112
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
1113
+ "version": "4.60.1",
1114
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.1.tgz",
1115
+ "integrity": "sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==",
1116
+ "cpu": [
1117
+ "arm"
1118
+ ],
1119
+ "dev": true,
1120
+ "license": "MIT",
1121
+ "optional": true,
1122
+ "os": [
1123
+ "linux"
1124
+ ]
1125
+ },
1126
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
1127
+ "version": "4.60.1",
1128
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.1.tgz",
1129
+ "integrity": "sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==",
1130
+ "cpu": [
1131
+ "arm"
1132
+ ],
1133
  "dev": true,
1134
  "license": "MIT",
1135
+ "optional": true,
1136
+ "os": [
1137
+ "linux"
1138
+ ]
1139
  },
1140
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
1141
+ "version": "4.60.1",
1142
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.1.tgz",
1143
+ "integrity": "sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==",
1144
  "cpu": [
1145
  "arm64"
1146
  ],
 
1148
  "license": "MIT",
1149
  "optional": true,
1150
  "os": [
1151
+ "linux"
1152
+ ]
 
 
 
1153
  },
1154
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
1155
+ "version": "4.60.1",
1156
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.1.tgz",
1157
+ "integrity": "sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==",
1158
  "cpu": [
1159
  "arm64"
1160
  ],
 
1162
  "license": "MIT",
1163
  "optional": true,
1164
  "os": [
1165
+ "linux"
1166
+ ]
 
 
 
1167
  },
1168
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
1169
+ "version": "4.60.1",
1170
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.1.tgz",
1171
+ "integrity": "sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==",
1172
  "cpu": [
1173
+ "loong64"
1174
  ],
1175
  "dev": true,
1176
  "license": "MIT",
1177
  "optional": true,
1178
  "os": [
1179
+ "linux"
1180
+ ]
 
 
 
1181
  },
1182
+ "node_modules/@rollup/rollup-linux-loong64-musl": {
1183
+ "version": "4.60.1",
1184
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.1.tgz",
1185
+ "integrity": "sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==",
1186
  "cpu": [
1187
+ "loong64"
1188
  ],
1189
  "dev": true,
1190
  "license": "MIT",
1191
  "optional": true,
1192
  "os": [
1193
+ "linux"
1194
+ ]
 
 
 
1195
  },
1196
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
1197
+ "version": "4.60.1",
1198
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.1.tgz",
1199
+ "integrity": "sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==",
1200
  "cpu": [
1201
+ "ppc64"
1202
  ],
1203
  "dev": true,
1204
  "license": "MIT",
1205
  "optional": true,
1206
  "os": [
1207
  "linux"
1208
+ ]
 
 
 
1209
  },
1210
+ "node_modules/@rollup/rollup-linux-ppc64-musl": {
1211
+ "version": "4.60.1",
1212
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.1.tgz",
1213
+ "integrity": "sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==",
1214
  "cpu": [
1215
+ "ppc64"
1216
  ],
1217
  "dev": true,
1218
  "license": "MIT",
1219
  "optional": true,
1220
  "os": [
1221
  "linux"
1222
+ ]
 
 
 
1223
  },
1224
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
1225
+ "version": "4.60.1",
1226
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.1.tgz",
1227
+ "integrity": "sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==",
1228
  "cpu": [
1229
+ "riscv64"
1230
  ],
1231
  "dev": true,
1232
  "license": "MIT",
1233
  "optional": true,
1234
  "os": [
1235
  "linux"
1236
+ ]
 
 
 
1237
  },
1238
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
1239
+ "version": "4.60.1",
1240
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.1.tgz",
1241
+ "integrity": "sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==",
1242
  "cpu": [
1243
+ "riscv64"
1244
  ],
1245
  "dev": true,
1246
  "license": "MIT",
1247
  "optional": true,
1248
  "os": [
1249
  "linux"
1250
+ ]
 
 
 
1251
  },
1252
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
1253
+ "version": "4.60.1",
1254
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.1.tgz",
1255
+ "integrity": "sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==",
1256
  "cpu": [
1257
  "s390x"
1258
  ],
 
1261
  "optional": true,
1262
  "os": [
1263
  "linux"
1264
+ ]
 
 
 
1265
  },
1266
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
1267
+ "version": "4.60.1",
1268
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.1.tgz",
1269
+ "integrity": "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==",
1270
  "cpu": [
1271
  "x64"
1272
  ],
 
1275
  "optional": true,
1276
  "os": [
1277
  "linux"
1278
+ ]
 
 
 
1279
  },
1280
+ "node_modules/@rollup/rollup-linux-x64-musl": {
1281
+ "version": "4.60.1",
1282
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.1.tgz",
1283
+ "integrity": "sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==",
1284
  "cpu": [
1285
  "x64"
1286
  ],
 
1289
  "optional": true,
1290
  "os": [
1291
  "linux"
1292
+ ]
1293
+ },
1294
+ "node_modules/@rollup/rollup-openbsd-x64": {
1295
+ "version": "4.60.1",
1296
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.1.tgz",
1297
+ "integrity": "sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==",
1298
+ "cpu": [
1299
+ "x64"
1300
  ],
1301
+ "dev": true,
1302
+ "license": "MIT",
1303
+ "optional": true,
1304
+ "os": [
1305
+ "openbsd"
1306
+ ]
1307
  },
1308
+ "node_modules/@rollup/rollup-openharmony-arm64": {
1309
+ "version": "4.60.1",
1310
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.1.tgz",
1311
+ "integrity": "sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==",
1312
  "cpu": [
1313
  "arm64"
1314
  ],
 
1317
  "optional": true,
1318
  "os": [
1319
  "openharmony"
1320
+ ]
 
 
 
1321
  },
1322
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
1323
+ "version": "4.60.1",
1324
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.1.tgz",
1325
+ "integrity": "sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==",
1326
  "cpu": [
1327
+ "arm64"
1328
  ],
1329
  "dev": true,
1330
  "license": "MIT",
1331
  "optional": true,
1332
+ "os": [
1333
+ "win32"
1334
+ ]
 
 
 
1335
  },
1336
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
1337
+ "version": "4.60.1",
1338
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.1.tgz",
1339
+ "integrity": "sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==",
1340
  "cpu": [
1341
+ "ia32"
1342
  ],
1343
  "dev": true,
1344
  "license": "MIT",
1345
  "optional": true,
1346
  "os": [
1347
  "win32"
1348
+ ]
 
 
 
1349
  },
1350
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
1351
+ "version": "4.60.1",
1352
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.1.tgz",
1353
+ "integrity": "sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==",
1354
  "cpu": [
1355
  "x64"
1356
  ],
 
1359
  "optional": true,
1360
  "os": [
1361
  "win32"
1362
+ ]
1363
+ },
1364
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
1365
+ "version": "4.60.1",
1366
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.1.tgz",
1367
+ "integrity": "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==",
1368
+ "cpu": [
1369
+ "x64"
1370
  ],
1371
+ "dev": true,
1372
+ "license": "MIT",
1373
+ "optional": true,
1374
+ "os": [
1375
+ "win32"
1376
+ ]
1377
+ },
1378
+ "node_modules/@tweenjs/tween.js": {
1379
+ "version": "25.0.0",
1380
+ "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-25.0.0.tgz",
1381
+ "integrity": "sha512-XKLA6syeBUaPzx4j3qwMqzzq+V4uo72BnlbOjmuljLrRqdsd3qnzvZZoxvMHZ23ndsRS4aufU6JOZYpCbU6T1A==",
1382
+ "license": "MIT"
1383
+ },
1384
+ "node_modules/@types/babel__core": {
1385
+ "version": "7.20.5",
1386
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
1387
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
1388
+ "dev": true,
1389
+ "license": "MIT",
1390
+ "dependencies": {
1391
+ "@babel/parser": "^7.20.7",
1392
+ "@babel/types": "^7.20.7",
1393
+ "@types/babel__generator": "*",
1394
+ "@types/babel__template": "*",
1395
+ "@types/babel__traverse": "*"
1396
  }
1397
  },
1398
+ "node_modules/@types/babel__generator": {
1399
+ "version": "7.27.0",
1400
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
1401
+ "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
1402
  "dev": true,
1403
+ "license": "MIT",
1404
+ "dependencies": {
1405
+ "@babel/types": "^7.0.0"
1406
+ }
1407
  },
1408
+ "node_modules/@types/babel__template": {
1409
+ "version": "7.4.4",
1410
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
1411
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
1412
+ "dev": true,
1413
+ "license": "MIT",
1414
+ "dependencies": {
1415
+ "@babel/parser": "^7.1.0",
1416
+ "@babel/types": "^7.0.0"
1417
+ }
1418
+ },
1419
+ "node_modules/@types/babel__traverse": {
1420
+ "version": "7.28.0",
1421
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
1422
+ "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
1423
  "dev": true,
1424
  "license": "MIT",
 
1425
  "dependencies": {
1426
+ "@babel/types": "^7.28.2"
1427
  }
1428
  },
1429
  "node_modules/@types/estree": {
 
1440
  "dev": true,
1441
  "license": "MIT"
1442
  },
1443
+ "node_modules/@types/prop-types": {
1444
+ "version": "15.7.15",
1445
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz",
1446
+ "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==",
1447
+ "dev": true,
1448
+ "license": "MIT"
1449
+ },
1450
  "node_modules/@types/react": {
1451
+ "version": "18.3.28",
1452
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz",
1453
+ "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==",
1454
  "dev": true,
1455
  "license": "MIT",
1456
  "peer": true,
1457
  "dependencies": {
1458
+ "@types/prop-types": "*",
1459
  "csstype": "^3.2.2"
1460
  }
1461
  },
1462
  "node_modules/@types/react-dom": {
1463
+ "version": "18.3.7",
1464
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz",
1465
+ "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==",
1466
  "dev": true,
1467
  "license": "MIT",
1468
  "peerDependencies": {
1469
+ "@types/react": "^18.0.0"
1470
  }
1471
  },
1472
  "node_modules/@vitejs/plugin-react": {
1473
+ "version": "4.7.0",
1474
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz",
1475
+ "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==",
1476
  "dev": true,
1477
  "license": "MIT",
1478
  "dependencies": {
1479
+ "@babel/core": "^7.28.0",
1480
+ "@babel/plugin-transform-react-jsx-self": "^7.27.1",
1481
+ "@babel/plugin-transform-react-jsx-source": "^7.27.1",
1482
+ "@rolldown/pluginutils": "1.0.0-beta.27",
1483
+ "@types/babel__core": "^7.20.5",
1484
+ "react-refresh": "^0.17.0"
1485
  },
1486
  "engines": {
1487
+ "node": "^14.18.0 || >=16.0.0"
1488
  },
1489
  "peerDependencies": {
1490
+ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
1491
+ }
1492
+ },
1493
+ "node_modules/3d-force-graph": {
1494
+ "version": "1.80.0",
1495
+ "resolved": "https://registry.npmjs.org/3d-force-graph/-/3d-force-graph-1.80.0.tgz",
1496
+ "integrity": "sha512-tzI353gW1nXPpnC7VTa3JjMg+3cp77qOLUFO0vucPTfF+q5R6sQsNsIqVTbRIb7RSypn14nBa4yfkOe9ThxASw==",
1497
+ "license": "MIT",
1498
+ "dependencies": {
1499
+ "accessor-fn": "1",
1500
+ "kapsule": "^1.16",
1501
+ "three": ">=0.179 <1",
1502
+ "three-forcegraph": "1",
1503
+ "three-render-objects": "^1.41"
1504
  },
1505
+ "engines": {
1506
+ "node": ">=12"
1507
+ }
1508
+ },
1509
+ "node_modules/accessor-fn": {
1510
+ "version": "1.5.3",
1511
+ "resolved": "https://registry.npmjs.org/accessor-fn/-/accessor-fn-1.5.3.tgz",
1512
+ "integrity": "sha512-rkAofCwe/FvYFUlMB0v0gWmhqtfAtV1IUkdPbfhTUyYniu5LrC0A0UJkTH0Jv3S8SvwkmfuAlY+mQIJATdocMA==",
1513
+ "license": "MIT",
1514
+ "engines": {
1515
+ "node": ">=12"
1516
  }
1517
  },
1518
  "node_modules/acorn": {
 
1693
  "url": "https://github.com/chalk/chalk?sponsor=1"
1694
  }
1695
  },
1696
+ "node_modules/color-convert": {
1697
+ "version": "2.0.1",
1698
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
1699
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
1700
+ "dev": true,
1701
+ "license": "MIT",
1702
+ "dependencies": {
1703
+ "color-name": "~1.1.4"
1704
+ },
1705
+ "engines": {
1706
+ "node": ">=7.0.0"
1707
+ }
1708
+ },
1709
+ "node_modules/color-name": {
1710
+ "version": "1.1.4",
1711
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
1712
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
1713
+ "dev": true,
1714
+ "license": "MIT"
1715
+ },
1716
+ "node_modules/concat-map": {
1717
+ "version": "0.0.1",
1718
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
1719
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
1720
+ "dev": true,
1721
+ "license": "MIT"
1722
+ },
1723
+ "node_modules/convert-source-map": {
1724
+ "version": "2.0.0",
1725
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
1726
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
1727
+ "dev": true,
1728
+ "license": "MIT"
1729
+ },
1730
+ "node_modules/cross-spawn": {
1731
+ "version": "7.0.6",
1732
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
1733
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
1734
+ "dev": true,
1735
+ "license": "MIT",
1736
+ "dependencies": {
1737
+ "path-key": "^3.1.0",
1738
+ "shebang-command": "^2.0.0",
1739
+ "which": "^2.0.1"
1740
+ },
1741
+ "engines": {
1742
+ "node": ">= 8"
1743
+ }
1744
+ },
1745
+ "node_modules/csstype": {
1746
+ "version": "3.2.3",
1747
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
1748
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
1749
+ "dev": true,
1750
+ "license": "MIT"
1751
+ },
1752
+ "node_modules/d3-array": {
1753
+ "version": "3.2.4",
1754
+ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz",
1755
+ "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==",
1756
+ "license": "ISC",
1757
+ "dependencies": {
1758
+ "internmap": "1 - 2"
1759
+ },
1760
+ "engines": {
1761
+ "node": ">=12"
1762
+ }
1763
+ },
1764
+ "node_modules/d3-binarytree": {
1765
+ "version": "1.0.2",
1766
+ "resolved": "https://registry.npmjs.org/d3-binarytree/-/d3-binarytree-1.0.2.tgz",
1767
+ "integrity": "sha512-cElUNH+sHu95L04m92pG73t2MEJXKu+GeKUN1TJkFsu93E5W8E9Sc3kHEGJKgenGvj19m6upSn2EunvMgMD2Yw==",
1768
+ "license": "MIT"
1769
+ },
1770
+ "node_modules/d3-color": {
1771
+ "version": "3.1.0",
1772
+ "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
1773
+ "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==",
1774
+ "license": "ISC",
1775
+ "engines": {
1776
+ "node": ">=12"
1777
+ }
1778
+ },
1779
+ "node_modules/d3-dispatch": {
1780
+ "version": "3.0.1",
1781
+ "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz",
1782
+ "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==",
1783
+ "license": "ISC",
1784
+ "engines": {
1785
+ "node": ">=12"
1786
+ }
1787
+ },
1788
+ "node_modules/d3-force-3d": {
1789
+ "version": "3.0.6",
1790
+ "resolved": "https://registry.npmjs.org/d3-force-3d/-/d3-force-3d-3.0.6.tgz",
1791
+ "integrity": "sha512-4tsKHUPLOVkyfEffZo1v6sFHvGFwAIIjt/W8IThbp08DYAsXZck+2pSHEG5W1+gQgEvFLdZkYvmJAbRM2EzMnA==",
1792
+ "license": "MIT",
1793
+ "dependencies": {
1794
+ "d3-binarytree": "1",
1795
+ "d3-dispatch": "1 - 3",
1796
+ "d3-octree": "1",
1797
+ "d3-quadtree": "1 - 3",
1798
+ "d3-timer": "1 - 3"
1799
+ },
1800
+ "engines": {
1801
+ "node": ">=12"
1802
+ }
1803
+ },
1804
+ "node_modules/d3-format": {
1805
+ "version": "3.1.2",
1806
+ "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz",
1807
+ "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==",
1808
+ "license": "ISC",
1809
+ "engines": {
1810
+ "node": ">=12"
1811
+ }
1812
+ },
1813
+ "node_modules/d3-interpolate": {
1814
+ "version": "3.0.1",
1815
+ "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
1816
+ "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
1817
+ "license": "ISC",
1818
+ "dependencies": {
1819
+ "d3-color": "1 - 3"
1820
+ },
1821
+ "engines": {
1822
+ "node": ">=12"
1823
+ }
1824
+ },
1825
+ "node_modules/d3-octree": {
1826
+ "version": "1.1.0",
1827
+ "resolved": "https://registry.npmjs.org/d3-octree/-/d3-octree-1.1.0.tgz",
1828
+ "integrity": "sha512-F8gPlqpP+HwRPMO/8uOu5wjH110+6q4cgJvgJT6vlpy3BEaDIKlTZrgHKZSp/i1InRpVfh4puY/kvL6MxK930A==",
1829
+ "license": "MIT"
1830
+ },
1831
+ "node_modules/d3-quadtree": {
1832
+ "version": "3.0.1",
1833
+ "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz",
1834
+ "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==",
1835
+ "license": "ISC",
1836
+ "engines": {
1837
+ "node": ">=12"
1838
+ }
1839
+ },
1840
+ "node_modules/d3-scale": {
1841
+ "version": "4.0.2",
1842
+ "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",
1843
+ "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
1844
+ "license": "ISC",
1845
+ "dependencies": {
1846
+ "d3-array": "2.10.0 - 3",
1847
+ "d3-format": "1 - 3",
1848
+ "d3-interpolate": "1.2.0 - 3",
1849
+ "d3-time": "2.1.1 - 3",
1850
+ "d3-time-format": "2 - 4"
1851
+ },
1852
+ "engines": {
1853
+ "node": ">=12"
1854
+ }
1855
+ },
1856
+ "node_modules/d3-scale-chromatic": {
1857
+ "version": "3.1.0",
1858
+ "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz",
1859
+ "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==",
1860
+ "license": "ISC",
1861
+ "dependencies": {
1862
+ "d3-color": "1 - 3",
1863
+ "d3-interpolate": "1 - 3"
1864
+ },
1865
+ "engines": {
1866
+ "node": ">=12"
1867
+ }
1868
+ },
1869
+ "node_modules/d3-selection": {
1870
+ "version": "3.0.0",
1871
+ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz",
1872
+ "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==",
1873
+ "license": "ISC",
1874
+ "engines": {
1875
+ "node": ">=12"
1876
+ }
1877
+ },
1878
+ "node_modules/d3-time": {
1879
+ "version": "3.1.0",
1880
+ "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz",
1881
+ "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",
1882
+ "license": "ISC",
1883
+ "dependencies": {
1884
+ "d3-array": "2 - 3"
1885
+ },
1886
+ "engines": {
1887
+ "node": ">=12"
1888
+ }
1889
+ },
1890
+ "node_modules/d3-time-format": {
1891
+ "version": "4.1.0",
1892
+ "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",
1893
+ "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
1894
+ "license": "ISC",
1895
  "dependencies": {
1896
+ "d3-time": "1 - 3"
1897
  },
1898
  "engines": {
1899
+ "node": ">=12"
1900
  }
1901
  },
1902
+ "node_modules/d3-timer": {
1903
+ "version": "3.0.1",
1904
+ "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
1905
+ "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==",
1906
+ "license": "ISC",
1907
+ "engines": {
1908
+ "node": ">=12"
1909
+ }
 
 
 
 
 
 
 
 
 
 
 
 
1910
  },
1911
+ "node_modules/data-bind-mapper": {
1912
+ "version": "1.0.3",
1913
+ "resolved": "https://registry.npmjs.org/data-bind-mapper/-/data-bind-mapper-1.0.3.tgz",
1914
+ "integrity": "sha512-QmU3lyEnbENQPo0M1F9BMu4s6cqNNp8iJA+b/HP2sSb7pf3dxwF3+EP1eO69rwBfH9kFJ1apmzrtogAmVt2/Xw==",
 
1915
  "license": "MIT",
1916
  "dependencies": {
1917
+ "accessor-fn": "1"
 
 
1918
  },
1919
  "engines": {
1920
+ "node": ">=12"
1921
  }
1922
  },
 
 
 
 
 
 
 
1923
  "node_modules/debug": {
1924
  "version": "4.4.3",
1925
  "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
 
1945
  "dev": true,
1946
  "license": "MIT"
1947
  },
 
 
 
 
 
 
 
 
 
 
1948
  "node_modules/electron-to-chromium": {
1949
  "version": "1.5.321",
1950
  "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.321.tgz",
 
1952
  "dev": true,
1953
  "license": "ISC"
1954
  },
1955
+ "node_modules/esbuild": {
1956
+ "version": "0.25.12",
1957
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz",
1958
+ "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==",
1959
+ "dev": true,
1960
+ "hasInstallScript": true,
1961
+ "license": "MIT",
1962
+ "bin": {
1963
+ "esbuild": "bin/esbuild"
1964
+ },
1965
+ "engines": {
1966
+ "node": ">=18"
1967
+ },
1968
+ "optionalDependencies": {
1969
+ "@esbuild/aix-ppc64": "0.25.12",
1970
+ "@esbuild/android-arm": "0.25.12",
1971
+ "@esbuild/android-arm64": "0.25.12",
1972
+ "@esbuild/android-x64": "0.25.12",
1973
+ "@esbuild/darwin-arm64": "0.25.12",
1974
+ "@esbuild/darwin-x64": "0.25.12",
1975
+ "@esbuild/freebsd-arm64": "0.25.12",
1976
+ "@esbuild/freebsd-x64": "0.25.12",
1977
+ "@esbuild/linux-arm": "0.25.12",
1978
+ "@esbuild/linux-arm64": "0.25.12",
1979
+ "@esbuild/linux-ia32": "0.25.12",
1980
+ "@esbuild/linux-loong64": "0.25.12",
1981
+ "@esbuild/linux-mips64el": "0.25.12",
1982
+ "@esbuild/linux-ppc64": "0.25.12",
1983
+ "@esbuild/linux-riscv64": "0.25.12",
1984
+ "@esbuild/linux-s390x": "0.25.12",
1985
+ "@esbuild/linux-x64": "0.25.12",
1986
+ "@esbuild/netbsd-arm64": "0.25.12",
1987
+ "@esbuild/netbsd-x64": "0.25.12",
1988
+ "@esbuild/openbsd-arm64": "0.25.12",
1989
+ "@esbuild/openbsd-x64": "0.25.12",
1990
+ "@esbuild/openharmony-arm64": "0.25.12",
1991
+ "@esbuild/sunos-x64": "0.25.12",
1992
+ "@esbuild/win32-arm64": "0.25.12",
1993
+ "@esbuild/win32-ia32": "0.25.12",
1994
+ "@esbuild/win32-x64": "0.25.12"
1995
+ }
1996
+ },
1997
  "node_modules/escalade": {
1998
  "version": "3.2.0",
1999
  "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
 
2079
  }
2080
  },
2081
  "node_modules/eslint-plugin-react-hooks": {
2082
+ "version": "5.2.0",
2083
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz",
2084
+ "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==",
2085
  "dev": true,
2086
  "license": "MIT",
 
 
 
 
 
 
 
2087
  "engines": {
2088
+ "node": ">=10"
2089
  },
2090
  "peerDependencies": {
2091
  "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
2092
  }
2093
  },
2094
  "node_modules/eslint-plugin-react-refresh": {
2095
+ "version": "0.4.26",
2096
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.26.tgz",
2097
+ "integrity": "sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==",
2098
  "dev": true,
2099
  "license": "MIT",
2100
  "peerDependencies": {
2101
+ "eslint": ">=8.40"
2102
  }
2103
  },
2104
  "node_modules/eslint-scope": {
 
2285
  "dev": true,
2286
  "license": "ISC"
2287
  },
2288
+ "node_modules/float-tooltip": {
2289
+ "version": "1.7.5",
2290
+ "resolved": "https://registry.npmjs.org/float-tooltip/-/float-tooltip-1.7.5.tgz",
2291
+ "integrity": "sha512-/kXzuDnnBqyyWyhDMH7+PfP8J/oXiAavGzcRxASOMRHFuReDtofizLLJsf7nnDLAfEaMW4pVWaXrAjtnglpEkg==",
2292
+ "license": "MIT",
2293
+ "dependencies": {
2294
+ "d3-selection": "2 - 3",
2295
+ "kapsule": "^1.16",
2296
+ "preact": "10"
2297
+ },
2298
+ "engines": {
2299
+ "node": ">=12"
2300
+ }
2301
+ },
2302
  "node_modules/fsevents": {
2303
  "version": "2.3.3",
2304
  "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
 
2338
  }
2339
  },
2340
  "node_modules/globals": {
2341
+ "version": "15.15.0",
2342
+ "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
2343
+ "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
2344
  "dev": true,
2345
  "license": "MIT",
2346
  "engines": {
 
2360
  "node": ">=8"
2361
  }
2362
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2363
  "node_modules/ignore": {
2364
  "version": "5.3.2",
2365
  "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
 
2397
  "node": ">=0.8.19"
2398
  }
2399
  },
2400
+ "node_modules/internmap": {
2401
+ "version": "2.0.3",
2402
+ "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
2403
+ "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==",
2404
+ "license": "ISC",
2405
+ "engines": {
2406
+ "node": ">=12"
2407
+ }
2408
+ },
2409
  "node_modules/is-extglob": {
2410
  "version": "2.1.1",
2411
  "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
 
2436
  "dev": true,
2437
  "license": "ISC"
2438
  },
2439
+ "node_modules/jerrypick": {
2440
+ "version": "1.1.2",
2441
+ "resolved": "https://registry.npmjs.org/jerrypick/-/jerrypick-1.1.2.tgz",
2442
+ "integrity": "sha512-YKnxXEekXKzhpf7CLYA0A+oDP8V0OhICNCr5lv96FvSsDEmrb0GKM776JgQvHTMjr7DTTPEVv/1Ciaw0uEWzBA==",
2443
+ "license": "MIT",
2444
+ "engines": {
2445
+ "node": ">=12"
2446
+ }
2447
+ },
2448
  "node_modules/js-tokens": {
2449
  "version": "4.0.0",
2450
  "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
2451
  "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
 
2452
  "license": "MIT"
2453
  },
2454
  "node_modules/js-yaml": {
 
2456
  "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
2457
  "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
2458
  "dev": true,
2459
+ "license": "MIT",
2460
+ "dependencies": {
2461
+ "argparse": "^2.0.1"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2462
  },
2463
+ "bin": {
2464
+ "js-yaml": "bin/js-yaml.js"
 
2465
  }
2466
  },
2467
+ "node_modules/jsesc": {
2468
+ "version": "3.1.0",
2469
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
2470
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
 
 
 
2471
  "dev": true,
2472
+ "license": "MIT",
2473
+ "bin": {
2474
+ "jsesc": "bin/jsesc"
 
 
 
 
2475
  },
2476
+ "engines": {
2477
+ "node": ">=6"
 
2478
  }
2479
  },
2480
+ "node_modules/json-buffer": {
2481
+ "version": "3.0.1",
2482
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
2483
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
 
 
 
2484
  "dev": true,
2485
+ "license": "MIT"
 
 
 
 
 
 
 
 
 
 
 
2486
  },
2487
+ "node_modules/json-schema-traverse": {
2488
+ "version": "0.4.1",
2489
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
2490
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
 
 
 
2491
  "dev": true,
2492
+ "license": "MIT"
 
 
 
 
 
 
 
 
 
 
 
2493
  },
2494
+ "node_modules/json-stable-stringify-without-jsonify": {
2495
+ "version": "1.0.1",
2496
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
2497
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
 
 
 
2498
  "dev": true,
2499
+ "license": "MIT"
2500
+ },
2501
+ "node_modules/json5": {
2502
+ "version": "2.2.3",
2503
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
2504
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
2505
+ "dev": true,
2506
+ "license": "MIT",
2507
+ "bin": {
2508
+ "json5": "lib/cli.js"
2509
+ },
2510
  "engines": {
2511
+ "node": ">=6"
2512
+ }
2513
+ },
2514
+ "node_modules/kapsule": {
2515
+ "version": "1.16.3",
2516
+ "resolved": "https://registry.npmjs.org/kapsule/-/kapsule-1.16.3.tgz",
2517
+ "integrity": "sha512-4+5mNNf4vZDSwPhKprKwz3330iisPrb08JyMgbsdFrimBCKNHecua/WBwvVg3n7vwx0C1ARjfhwIpbrbd9n5wg==",
2518
+ "license": "MIT",
2519
+ "dependencies": {
2520
+ "lodash-es": "4"
2521
  },
2522
+ "engines": {
2523
+ "node": ">=12"
 
2524
  }
2525
  },
2526
+ "node_modules/keyv": {
2527
+ "version": "4.5.4",
2528
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
2529
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
 
 
 
2530
  "dev": true,
2531
+ "license": "MIT",
2532
+ "dependencies": {
2533
+ "json-buffer": "3.0.1"
 
 
 
 
 
 
 
 
2534
  }
2535
  },
2536
+ "node_modules/levn": {
2537
+ "version": "0.4.1",
2538
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
2539
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
 
 
 
2540
  "dev": true,
2541
+ "license": "MIT",
2542
+ "dependencies": {
2543
+ "prelude-ls": "^1.2.1",
2544
+ "type-check": "~0.4.0"
 
 
 
2545
  },
2546
+ "engines": {
2547
+ "node": ">= 0.8.0"
 
2548
  }
2549
  },
2550
  "node_modules/locate-path": {
 
2563
  "url": "https://github.com/sponsors/sindresorhus"
2564
  }
2565
  },
2566
+ "node_modules/lodash-es": {
2567
+ "version": "4.18.1",
2568
+ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz",
2569
+ "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==",
2570
+ "license": "MIT"
2571
+ },
2572
  "node_modules/lodash.merge": {
2573
  "version": "4.6.2",
2574
  "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
 
2576
  "dev": true,
2577
  "license": "MIT"
2578
  },
2579
+ "node_modules/loose-envify": {
2580
+ "version": "1.4.0",
2581
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
2582
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
2583
+ "license": "MIT",
2584
+ "dependencies": {
2585
+ "js-tokens": "^3.0.0 || ^4.0.0"
2586
+ },
2587
+ "bin": {
2588
+ "loose-envify": "cli.js"
2589
+ }
2590
+ },
2591
  "node_modules/lru-cache": {
2592
  "version": "5.1.1",
2593
  "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
 
2644
  "dev": true,
2645
  "license": "MIT"
2646
  },
2647
+ "node_modules/ngraph.events": {
2648
+ "version": "1.4.0",
2649
+ "resolved": "https://registry.npmjs.org/ngraph.events/-/ngraph.events-1.4.0.tgz",
2650
+ "integrity": "sha512-NeDGI4DSyjBNBRtA86222JoYietsmCXbs8CEB0dZ51Xeh4lhVl1y3wpWLumczvnha8sFQIW4E0vvVWwgmX2mGw==",
2651
+ "license": "BSD-3-Clause"
2652
+ },
2653
+ "node_modules/ngraph.forcelayout": {
2654
+ "version": "3.3.1",
2655
+ "resolved": "https://registry.npmjs.org/ngraph.forcelayout/-/ngraph.forcelayout-3.3.1.tgz",
2656
+ "integrity": "sha512-MKBuEh1wujyQHFTW57y5vd/uuEOK0XfXYxm3lC7kktjJLRdt/KEKEknyOlc6tjXflqBKEuYBBcu7Ax5VY+S6aw==",
2657
+ "license": "BSD-3-Clause",
2658
+ "dependencies": {
2659
+ "ngraph.events": "^1.0.0",
2660
+ "ngraph.merge": "^1.0.0",
2661
+ "ngraph.random": "^1.0.0"
2662
+ }
2663
+ },
2664
+ "node_modules/ngraph.graph": {
2665
+ "version": "20.1.2",
2666
+ "resolved": "https://registry.npmjs.org/ngraph.graph/-/ngraph.graph-20.1.2.tgz",
2667
+ "integrity": "sha512-W/G3GBR3Y5UxMLHTUCPP9v+pbtpzwuAEIqP5oZV+9IwgxAIEZwh+Foc60iPc1idlnK7Zxu0p3puxAyNmDvBd0Q==",
2668
+ "license": "BSD-3-Clause",
2669
+ "dependencies": {
2670
+ "ngraph.events": "^1.4.0"
2671
+ }
2672
+ },
2673
+ "node_modules/ngraph.merge": {
2674
+ "version": "1.0.0",
2675
+ "resolved": "https://registry.npmjs.org/ngraph.merge/-/ngraph.merge-1.0.0.tgz",
2676
+ "integrity": "sha512-5J8YjGITUJeapsomtTALYsw7rFveYkM+lBj3QiYZ79EymQcuri65Nw3knQtFxQBU1r5iOaVRXrSwMENUPK62Vg==",
2677
+ "license": "MIT"
2678
+ },
2679
+ "node_modules/ngraph.random": {
2680
+ "version": "1.2.0",
2681
+ "resolved": "https://registry.npmjs.org/ngraph.random/-/ngraph.random-1.2.0.tgz",
2682
+ "integrity": "sha512-4EUeAGbB2HWX9njd6bP6tciN6ByJfoaAvmVL9QTaZSeXrW46eNGA9GajiXiPBbvFqxUWFkEbyo6x5qsACUuVfA==",
2683
+ "license": "BSD-3-Clause"
2684
+ },
2685
  "node_modules/node-releases": {
2686
  "version": "2.0.36",
2687
  "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz",
 
2689
  "dev": true,
2690
  "license": "MIT"
2691
  },
2692
+ "node_modules/object-assign": {
2693
+ "version": "4.1.1",
2694
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
2695
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
2696
+ "license": "MIT",
2697
+ "engines": {
2698
+ "node": ">=0.10.0"
2699
+ }
2700
+ },
2701
  "node_modules/optionator": {
2702
  "version": "0.9.4",
2703
  "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
 
2789
  "license": "ISC"
2790
  },
2791
  "node_modules/picomatch": {
2792
+ "version": "4.0.4",
2793
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
2794
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
2795
  "dev": true,
2796
  "license": "MIT",
2797
  "peer": true,
 
2802
  "url": "https://github.com/sponsors/jonschlinkert"
2803
  }
2804
  },
2805
+ "node_modules/polished": {
2806
+ "version": "4.3.1",
2807
+ "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz",
2808
+ "integrity": "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==",
2809
+ "license": "MIT",
2810
+ "dependencies": {
2811
+ "@babel/runtime": "^7.17.8"
2812
+ },
2813
+ "engines": {
2814
+ "node": ">=10"
2815
+ }
2816
+ },
2817
  "node_modules/postcss": {
2818
+ "version": "8.5.9",
2819
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.9.tgz",
2820
+ "integrity": "sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==",
2821
  "dev": true,
2822
  "funding": [
2823
  {
 
2843
  "node": "^10 || ^12 || >=14"
2844
  }
2845
  },
2846
+ "node_modules/preact": {
2847
+ "version": "10.29.1",
2848
+ "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.1.tgz",
2849
+ "integrity": "sha512-gQCLc/vWroE8lIpleXtdJhTFDogTdZG9AjMUpVkDf2iTCNwYNWA+u16dL41TqUDJO4gm2IgrcMv3uTpjd4Pwmg==",
2850
+ "license": "MIT",
2851
+ "funding": {
2852
+ "type": "opencollective",
2853
+ "url": "https://opencollective.com/preact"
2854
+ }
2855
+ },
2856
  "node_modules/prelude-ls": {
2857
  "version": "1.2.1",
2858
  "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
 
2863
  "node": ">= 0.8.0"
2864
  }
2865
  },
2866
+ "node_modules/prop-types": {
2867
+ "version": "15.8.1",
2868
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
2869
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
2870
+ "license": "MIT",
2871
+ "dependencies": {
2872
+ "loose-envify": "^1.4.0",
2873
+ "object-assign": "^4.1.1",
2874
+ "react-is": "^16.13.1"
2875
+ }
2876
+ },
2877
  "node_modules/punycode": {
2878
  "version": "2.3.1",
2879
  "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
 
2885
  }
2886
  },
2887
  "node_modules/react": {
2888
+ "version": "18.3.1",
2889
+ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
2890
+ "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
2891
  "license": "MIT",
2892
  "peer": true,
2893
+ "dependencies": {
2894
+ "loose-envify": "^1.1.0"
2895
+ },
2896
  "engines": {
2897
  "node": ">=0.10.0"
2898
  }
2899
  },
2900
  "node_modules/react-dom": {
2901
+ "version": "18.3.1",
2902
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
2903
+ "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
2904
+ "license": "MIT",
2905
+ "dependencies": {
2906
+ "loose-envify": "^1.1.0",
2907
+ "scheduler": "^0.23.2"
2908
+ },
2909
+ "peerDependencies": {
2910
+ "react": "^18.3.1"
2911
+ }
2912
+ },
2913
+ "node_modules/react-force-graph-3d": {
2914
+ "version": "1.29.1",
2915
+ "resolved": "https://registry.npmjs.org/react-force-graph-3d/-/react-force-graph-3d-1.29.1.tgz",
2916
+ "integrity": "sha512-5Vp+PGpYnO+zLwgK2NvNqdXHvsWLrFzpDfJW1vUA1twjo9SPvXqfUYQrnRmAbD+K2tOxkZw1BkbH31l5b4TWHg==",
2917
+ "license": "MIT",
2918
+ "dependencies": {
2919
+ "3d-force-graph": "^1.79",
2920
+ "prop-types": "15",
2921
+ "react-kapsule": "^2.5"
2922
+ },
2923
+ "engines": {
2924
+ "node": ">=12"
2925
+ },
2926
+ "peerDependencies": {
2927
+ "react": "*"
2928
+ }
2929
+ },
2930
+ "node_modules/react-is": {
2931
+ "version": "16.13.1",
2932
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
2933
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
2934
+ "license": "MIT"
2935
+ },
2936
+ "node_modules/react-kapsule": {
2937
+ "version": "2.5.7",
2938
+ "resolved": "https://registry.npmjs.org/react-kapsule/-/react-kapsule-2.5.7.tgz",
2939
+ "integrity": "sha512-kifAF4ZPD77qZKc4CKLmozq6GY1sBzPEJTIJb0wWFK6HsePJatK3jXplZn2eeAt3x67CDozgi7/rO8fNQ/AL7A==",
2940
  "license": "MIT",
2941
  "dependencies": {
2942
+ "jerrypick": "^1.1.1"
2943
+ },
2944
+ "engines": {
2945
+ "node": ">=12"
2946
  },
2947
  "peerDependencies": {
2948
+ "react": ">=16.13.1"
2949
+ }
2950
+ },
2951
+ "node_modules/react-refresh": {
2952
+ "version": "0.17.0",
2953
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz",
2954
+ "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==",
2955
+ "dev": true,
2956
+ "license": "MIT",
2957
+ "engines": {
2958
+ "node": ">=0.10.0"
2959
  }
2960
  },
2961
  "node_modules/resolve-from": {
 
2968
  "node": ">=4"
2969
  }
2970
  },
2971
+ "node_modules/rollup": {
2972
+ "version": "4.60.1",
2973
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.1.tgz",
2974
+ "integrity": "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==",
2975
  "dev": true,
2976
  "license": "MIT",
2977
  "dependencies": {
2978
+ "@types/estree": "1.0.8"
 
2979
  },
2980
  "bin": {
2981
+ "rollup": "dist/bin/rollup"
2982
  },
2983
  "engines": {
2984
+ "node": ">=18.0.0",
2985
+ "npm": ">=8.0.0"
2986
  },
2987
  "optionalDependencies": {
2988
+ "@rollup/rollup-android-arm-eabi": "4.60.1",
2989
+ "@rollup/rollup-android-arm64": "4.60.1",
2990
+ "@rollup/rollup-darwin-arm64": "4.60.1",
2991
+ "@rollup/rollup-darwin-x64": "4.60.1",
2992
+ "@rollup/rollup-freebsd-arm64": "4.60.1",
2993
+ "@rollup/rollup-freebsd-x64": "4.60.1",
2994
+ "@rollup/rollup-linux-arm-gnueabihf": "4.60.1",
2995
+ "@rollup/rollup-linux-arm-musleabihf": "4.60.1",
2996
+ "@rollup/rollup-linux-arm64-gnu": "4.60.1",
2997
+ "@rollup/rollup-linux-arm64-musl": "4.60.1",
2998
+ "@rollup/rollup-linux-loong64-gnu": "4.60.1",
2999
+ "@rollup/rollup-linux-loong64-musl": "4.60.1",
3000
+ "@rollup/rollup-linux-ppc64-gnu": "4.60.1",
3001
+ "@rollup/rollup-linux-ppc64-musl": "4.60.1",
3002
+ "@rollup/rollup-linux-riscv64-gnu": "4.60.1",
3003
+ "@rollup/rollup-linux-riscv64-musl": "4.60.1",
3004
+ "@rollup/rollup-linux-s390x-gnu": "4.60.1",
3005
+ "@rollup/rollup-linux-x64-gnu": "4.60.1",
3006
+ "@rollup/rollup-linux-x64-musl": "4.60.1",
3007
+ "@rollup/rollup-openbsd-x64": "4.60.1",
3008
+ "@rollup/rollup-openharmony-arm64": "4.60.1",
3009
+ "@rollup/rollup-win32-arm64-msvc": "4.60.1",
3010
+ "@rollup/rollup-win32-ia32-msvc": "4.60.1",
3011
+ "@rollup/rollup-win32-x64-gnu": "4.60.1",
3012
+ "@rollup/rollup-win32-x64-msvc": "4.60.1",
3013
+ "fsevents": "~2.3.2"
3014
+ }
3015
  },
3016
  "node_modules/scheduler": {
3017
+ "version": "0.23.2",
3018
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
3019
+ "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
3020
+ "license": "MIT",
3021
+ "dependencies": {
3022
+ "loose-envify": "^1.1.0"
3023
+ }
3024
  },
3025
  "node_modules/semver": {
3026
  "version": "6.3.1",
 
3091
  "node": ">=8"
3092
  }
3093
  },
3094
+ "node_modules/three": {
3095
+ "version": "0.183.2",
3096
+ "resolved": "https://registry.npmjs.org/three/-/three-0.183.2.tgz",
3097
+ "integrity": "sha512-di3BsL2FEQ1PA7Hcvn4fyJOlxRRgFYBpMTcyOgkwJIaDOdJMebEFPA+t98EvjuljDx4hNulAGwF6KIjtwI5jgQ==",
3098
+ "license": "MIT",
3099
+ "peer": true
3100
+ },
3101
+ "node_modules/three-forcegraph": {
3102
+ "version": "1.43.2",
3103
+ "resolved": "https://registry.npmjs.org/three-forcegraph/-/three-forcegraph-1.43.2.tgz",
3104
+ "integrity": "sha512-KUlqDaWVsrYtKx0NVVi5M3NR46K5JQIiPEzZnTMvBq7EHVF2tJpWtgGiAT1mhaerrlJ7F4UGNS2rIVYHmVrzYw==",
3105
+ "license": "MIT",
3106
+ "dependencies": {
3107
+ "accessor-fn": "1",
3108
+ "d3-array": "1 - 3",
3109
+ "d3-force-3d": "2 - 3",
3110
+ "d3-scale": "1 - 4",
3111
+ "d3-scale-chromatic": "1 - 3",
3112
+ "data-bind-mapper": "1",
3113
+ "kapsule": "^1.16",
3114
+ "ngraph.forcelayout": "3",
3115
+ "ngraph.graph": "20",
3116
+ "tinycolor2": "1"
3117
+ },
3118
+ "engines": {
3119
+ "node": ">=12"
3120
+ },
3121
+ "peerDependencies": {
3122
+ "three": ">=0.118.3"
3123
+ }
3124
+ },
3125
+ "node_modules/three-render-objects": {
3126
+ "version": "1.41.1",
3127
+ "resolved": "https://registry.npmjs.org/three-render-objects/-/three-render-objects-1.41.1.tgz",
3128
+ "integrity": "sha512-0H7l7yREPVKfO3HL7RjPQ67T0phHgnyMeEc4ww/OCEfK6jbsm7psEcrR0SGFqGDyS/pDQTPi4DyPbS/xlHRJKw==",
3129
+ "license": "MIT",
3130
+ "dependencies": {
3131
+ "@tweenjs/tween.js": "18 - 25",
3132
+ "accessor-fn": "1",
3133
+ "float-tooltip": "^1.7",
3134
+ "kapsule": "^1.16",
3135
+ "polished": "4"
3136
+ },
3137
+ "engines": {
3138
+ "node": ">=12"
3139
+ },
3140
+ "peerDependencies": {
3141
+ "three": ">=0.179"
3142
+ }
3143
+ },
3144
+ "node_modules/tinycolor2": {
3145
+ "version": "1.6.0",
3146
+ "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz",
3147
+ "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==",
3148
+ "license": "MIT"
3149
+ },
3150
  "node_modules/tinyglobby": {
3151
+ "version": "0.2.16",
3152
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz",
3153
+ "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",
3154
  "dev": true,
3155
  "license": "MIT",
3156
  "dependencies": {
3157
  "fdir": "^6.5.0",
3158
+ "picomatch": "^4.0.4"
3159
  },
3160
  "engines": {
3161
  "node": ">=12.0.0"
 
3164
  "url": "https://github.com/sponsors/SuperchupuDev"
3165
  }
3166
  },
 
 
 
 
 
 
 
 
3167
  "node_modules/type-check": {
3168
  "version": "0.4.0",
3169
  "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
 
3219
  }
3220
  },
3221
  "node_modules/vite": {
3222
+ "version": "6.4.2",
3223
+ "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.2.tgz",
3224
+ "integrity": "sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ==",
3225
  "dev": true,
3226
  "license": "MIT",
3227
  "peer": true,
3228
  "dependencies": {
3229
+ "esbuild": "^0.25.0",
3230
+ "fdir": "^6.4.4",
3231
+ "picomatch": "^4.0.2",
3232
+ "postcss": "^8.5.3",
3233
+ "rollup": "^4.34.9",
3234
+ "tinyglobby": "^0.2.13"
3235
  },
3236
  "bin": {
3237
  "vite": "bin/vite.js"
3238
  },
3239
  "engines": {
3240
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
3241
  },
3242
  "funding": {
3243
  "url": "https://github.com/vitejs/vite?sponsor=1"
 
3246
  "fsevents": "~2.3.3"
3247
  },
3248
  "peerDependencies": {
3249
+ "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
 
 
3250
  "jiti": ">=1.21.0",
3251
+ "less": "*",
3252
+ "lightningcss": "^1.21.0",
3253
+ "sass": "*",
3254
+ "sass-embedded": "*",
3255
+ "stylus": "*",
3256
+ "sugarss": "*",
3257
  "terser": "^5.16.0",
3258
  "tsx": "^4.8.1",
3259
  "yaml": "^2.4.2"
 
3262
  "@types/node": {
3263
  "optional": true
3264
  },
 
 
 
 
 
 
3265
  "jiti": {
3266
  "optional": true
3267
  },
3268
  "less": {
3269
  "optional": true
3270
  },
3271
+ "lightningcss": {
3272
+ "optional": true
3273
+ },
3274
  "sass": {
3275
  "optional": true
3276
  },
 
3339
  "funding": {
3340
  "url": "https://github.com/sponsors/sindresorhus"
3341
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3342
  }
3343
  }
3344
  }
frontend/package.json CHANGED
@@ -11,7 +11,9 @@
11
  },
12
  "dependencies": {
13
  "react": "^18.3.1",
14
- "react-dom": "^18.3.1"
 
 
15
  },
16
  "devDependencies": {
17
  "@eslint/js": "^9.15.0",
 
11
  },
12
  "dependencies": {
13
  "react": "^18.3.1",
14
+ "react-dom": "^18.3.1",
15
+ "react-force-graph-3d": "^1.29.1",
16
+ "three": "^0.183.2"
17
  },
18
  "devDependencies": {
19
  "@eslint/js": "^9.15.0",
frontend/src/components/KnowledgeGraph.css CHANGED
@@ -20,18 +20,7 @@
20
  z-index: 0;
21
  }
22
 
23
- .graph-canvas {
24
- display: block;
25
- width: 100%;
26
- height: 100%;
27
- cursor: grab;
28
- z-index: 1;
29
- position: relative;
30
- }
31
 
32
- .graph-canvas:active {
33
- cursor: grabbing;
34
- }
35
 
36
  /* ── Header Bar ── */
37
  .graph-header {
 
20
  z-index: 0;
21
  }
22
 
 
 
 
 
 
 
 
 
23
 
 
 
 
24
 
25
  /* ── Header Bar ── */
26
  .graph-header {
frontend/src/components/KnowledgeGraph.jsx CHANGED
@@ -1,72 +1,36 @@
1
  import { useState, useRef, useEffect, useCallback } from 'react';
 
 
2
  import './KnowledgeGraph.css';
3
 
4
- /* ================================================================
5
- KnowledgeGraph β€” Canvas-based Force-Directed Graph Visualizer
6
- Zero external dependencies. Pure physics simulation on <canvas>.
7
- ================================================================ */
8
-
9
- // ── Physics Constants ───────────────────────────────────────────
10
- const REPULSION = 12000; // Coulomb repulsion between nodes
11
- const ATTRACTION = 0.005; // Spring attraction along edges
12
- const DAMPING = 0.90; // Velocity damping per frame
13
- const CENTER_PULL = 0.004; // Gravity toward canvas center
14
- const MIN_DIST = 90; // Min distance before repulsion caps
15
- const DT = 0.8; // Simulation timestep
16
-
17
- // ── Visual Constants ────────────────────────────────────────────
18
- const NODE_BASE_RADIUS = 6;
19
- const NODE_SCALE_FACTOR = 2.5;
20
- const NODE_MAX_RADIUS = 22;
21
- const EDGE_WIDTH = 0.8;
22
- const LABEL_FONT = '600 9px "JetBrains Mono", monospace';
23
- const EDGE_LABEL_FONT = '500 7px "JetBrains Mono", monospace';
24
-
25
- // ── Color Palette ───────────────────────────────────────────────
26
- const COLORS = {
27
- nodeFill: 'rgba(71, 191, 255, 0.9)',
28
- nodeGlow: 'rgba(71, 191, 255, 0.35)',
29
- nodeStroke: 'rgba(71, 191, 255, 0.6)',
30
- nodeHover: 'rgba(71, 191, 255, 1)',
31
- nodeHoverGlow: 'rgba(71, 191, 255, 0.6)',
32
- edgeLine: 'rgba(134, 59, 255, 0.25)',
33
- edgeHover: 'rgba(134, 59, 255, 0.55)',
34
- edgeLabel: 'rgba(134, 59, 255, 0.5)',
35
- labelText: 'rgba(224, 224, 224, 0.85)',
36
- labelDim: 'rgba(224, 224, 224, 0.4)',
37
- bg: '#080808',
38
- gridLine: 'rgba(255, 255, 255, 0.03)',
39
- particleColor: 'rgba(71, 191, 255, 0.6)',
40
- nodeHighlight: 'rgba(255, 215, 0, 0.8)',
41
- nodeHighlightGlow: 'rgba(255, 215, 0, 0.3)',
42
- };
43
-
44
-
45
  function KnowledgeGraph({ highlightedNodes = [] }) {
46
- const canvasRef = useRef(null);
47
- const animFrameRef = useRef(null);
48
- const nodesRef = useRef([]);
49
- const edgesRef = useRef([]);
50
- const particlesRef = useRef([]);
51
- const dragNodeRef = useRef(null);
52
- const hoverNodeRef = useRef(null);
53
- const panRef = useRef({ x: 0, y: 0 });
54
- const zoomRef = useRef(1);
55
- const mouseRef = useRef({ x: 0, y: 0, canvasX: 0, canvasY: 0 });
56
- const isDraggingRef = useRef(false);
57
- const isPanningRef = useRef(false);
58
- const panStartRef = useRef({ x: 0, y: 0, panX: 0, panY: 0 });
59
- const showLabelsRef = useRef(true);
60
- const highlightedRef = useRef([]);
61
 
62
- const [graphData, setGraphData] = useState({ nodes: [], edges: [] });
63
- const [loading, setLoading] = useState(true);
64
- const [stats, setStats] = useState({ nodes: 0, edges: 0 });
65
  const [graphStatus, setGraphStatus] = useState('loading');
66
- const [showLabels, setShowLabels] = useState(true);
 
67
  const [tooltipData, setTooltipData] = useState(null);
68
 
69
- // ── Fetch Graph Data ────────────────────────────────────────
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70
  const fetchGraph = useCallback(async () => {
71
  setLoading(true);
72
  setGraphStatus('loading');
@@ -76,483 +40,67 @@ function KnowledgeGraph({ highlightedNodes = [] }) {
76
 
77
  if (data.status === 'offline') {
78
  setGraphStatus('offline');
79
- setGraphData({ nodes: [], edges: [] });
80
  setStats({ nodes: 0, edges: 0 });
81
  } else if (data.nodes.length === 0) {
82
  setGraphStatus('empty');
83
- setGraphData({ nodes: [], edges: [] });
84
  setStats({ nodes: 0, edges: 0 });
85
  } else {
86
  setGraphStatus('online');
87
- setGraphData(data);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
88
  setStats({ nodes: data.nodes.length, edges: data.edges.length });
89
- initializePhysics(data);
90
  }
91
  } catch (err) {
92
  console.error('Failed to fetch graph:', err);
93
  setGraphStatus('error');
94
- setGraphData({ nodes: [], edges: [] });
95
  }
96
  setLoading(false);
97
  }, []);
98
 
99
- // ── Initialize Physics Nodes ────────────────────────────────
100
- const initializePhysics = useCallback((data) => {
101
- const canvas = canvasRef.current;
102
- if (!canvas) return;
103
-
104
- const cx = canvas.clientWidth / 2;
105
- const cy = canvas.clientHeight / 2;
106
-
107
- // Spread nodes in a circle around center
108
- const angleStep = (2 * Math.PI) / Math.max(data.nodes.length, 1);
109
- const spread = Math.min(cx, cy) * 0.5;
110
-
111
- nodesRef.current = data.nodes.map((n, i) => ({
112
- id: n.id,
113
- label: n.label,
114
- connections: n.connections || 0,
115
- x: cx + Math.cos(angleStep * i) * spread * (0.5 + Math.random() * 0.5),
116
- y: cy + Math.sin(angleStep * i) * spread * (0.5 + Math.random() * 0.5),
117
- vx: 0,
118
- vy: 0,
119
- radius: Math.min(NODE_BASE_RADIUS + (n.connections || 0) * NODE_SCALE_FACTOR, NODE_MAX_RADIUS),
120
- }));
121
-
122
- edgesRef.current = data.edges.map(e => ({
123
- source: e.source,
124
- target: e.target,
125
- label: e.label,
126
- }));
127
-
128
- // Initialize edge particles
129
- particlesRef.current = edgesRef.current.map(() => ({
130
- t: Math.random(), // position along edge [0, 1]
131
- speed: 0.002 + Math.random() * 0.003,
132
- }));
133
-
134
- // Center the view
135
- panRef.current = { x: 0, y: 0 };
136
- zoomRef.current = 1;
137
- }, []);
138
-
139
- // ── Physics Step ────────────────────────────────────────────
140
- const physicsStep = useCallback(() => {
141
- const nodes = nodesRef.current;
142
- const edges = edgesRef.current;
143
- const canvas = canvasRef.current;
144
- if (!canvas || nodes.length === 0) return;
145
-
146
- const cx = canvas.clientWidth / 2;
147
- const cy = canvas.clientHeight / 2;
148
-
149
- // Node-node repulsion
150
- for (let i = 0; i < nodes.length; i++) {
151
- for (let j = i + 1; j < nodes.length; j++) {
152
- let dx = nodes[j].x - nodes[i].x;
153
- let dy = nodes[j].y - nodes[i].y;
154
- let dist = Math.sqrt(dx * dx + dy * dy);
155
- if (dist < MIN_DIST) dist = MIN_DIST;
156
-
157
- const force = REPULSION / (dist * dist);
158
- const fx = (dx / dist) * force;
159
- const fy = (dy / dist) * force;
160
-
161
- nodes[i].vx -= fx * DT;
162
- nodes[i].vy -= fy * DT;
163
- nodes[j].vx += fx * DT;
164
- nodes[j].vy += fy * DT;
165
- }
166
- }
167
-
168
- // Edge attraction (spring)
169
- const nodeMap = {};
170
- nodes.forEach(n => { nodeMap[n.id] = n; });
171
-
172
- for (const edge of edges) {
173
- const src = nodeMap[edge.source];
174
- const tgt = nodeMap[edge.target];
175
- if (!src || !tgt) continue;
176
-
177
- const dx = tgt.x - src.x;
178
- const dy = tgt.y - src.y;
179
- const dist = Math.sqrt(dx * dx + dy * dy);
180
- if (dist < 1) continue;
181
-
182
- const force = ATTRACTION * dist;
183
- const fx = (dx / dist) * force;
184
- const fy = (dy / dist) * force;
185
-
186
- src.vx += fx * DT;
187
- src.vy += fy * DT;
188
- tgt.vx -= fx * DT;
189
- tgt.vy -= fy * DT;
190
- }
191
-
192
- // Center gravity + velocity integration
193
- for (const node of nodes) {
194
- if (dragNodeRef.current && node.id === dragNodeRef.current.id) continue;
195
-
196
- node.vx += (cx - node.x) * CENTER_PULL * DT;
197
- node.vy += (cy - node.y) * CENTER_PULL * DT;
198
-
199
- node.vx *= DAMPING;
200
- node.vy *= DAMPING;
201
-
202
- node.x += node.vx;
203
- node.y += node.vy;
204
- }
205
-
206
- // Advance particles
207
- particlesRef.current.forEach(p => {
208
- p.t += p.speed;
209
- if (p.t > 1) p.t -= 1;
210
- });
211
- }, []);
212
-
213
- // ── Render Frame ────────────────────────────────────────────
214
- const render = useCallback(() => {
215
- const canvas = canvasRef.current;
216
- if (!canvas) return;
217
- const ctx = canvas.getContext('2d');
218
- const W = canvas.clientWidth;
219
- const H = canvas.clientHeight;
220
- const nodes = nodesRef.current;
221
- const edges = edgesRef.current;
222
- const particles = particlesRef.current;
223
- const nodeMap = {};
224
- nodes.forEach(n => { nodeMap[n.id] = n; });
225
-
226
- const zoom = zoomRef.current;
227
- const pan = panRef.current;
228
-
229
- ctx.clearRect(0, 0, W, H);
230
- ctx.fillStyle = COLORS.bg;
231
- ctx.fillRect(0, 0, W, H);
232
-
233
- // Draw subtle grid
234
- ctx.save();
235
- ctx.translate(pan.x, pan.y);
236
- ctx.scale(zoom, zoom);
237
-
238
- const gridSize = 40;
239
- ctx.strokeStyle = COLORS.gridLine;
240
- ctx.lineWidth = 0.5 / zoom;
241
- const startX = -pan.x / zoom - 200;
242
- const endX = (W - pan.x) / zoom + 200;
243
- const startY = -pan.y / zoom - 200;
244
- const endY = (H - pan.y) / zoom + 200;
245
-
246
- for (let x = Math.floor(startX / gridSize) * gridSize; x < endX; x += gridSize) {
247
- ctx.beginPath();
248
- ctx.moveTo(x, startY);
249
- ctx.lineTo(x, endY);
250
- ctx.stroke();
251
- }
252
- for (let y = Math.floor(startY / gridSize) * gridSize; y < endY; y += gridSize) {
253
- ctx.beginPath();
254
- ctx.moveTo(startX, y);
255
- ctx.lineTo(endX, y);
256
- ctx.stroke();
257
- }
258
-
259
- // ── Draw Edges ──────────────────────────────────────
260
- edges.forEach((edge, idx) => {
261
- const src = nodeMap[edge.source];
262
- const tgt = nodeMap[edge.target];
263
- if (!src || !tgt) return;
264
-
265
- const isHovered = hoverNodeRef.current &&
266
- (edge.source === hoverNodeRef.current.id || edge.target === hoverNodeRef.current.id);
267
-
268
- // Edge line
269
- const grad = ctx.createLinearGradient(src.x, src.y, tgt.x, tgt.y);
270
- if (isHovered) {
271
- grad.addColorStop(0, 'rgba(71, 191, 255, 0.5)');
272
- grad.addColorStop(1, 'rgba(134, 59, 255, 0.5)');
273
- } else {
274
- grad.addColorStop(0, 'rgba(71, 191, 255, 0.12)');
275
- grad.addColorStop(1, COLORS.edgeLine);
276
- }
277
-
278
- ctx.beginPath();
279
- ctx.moveTo(src.x, src.y);
280
- ctx.lineTo(tgt.x, tgt.y);
281
- ctx.strokeStyle = grad;
282
- ctx.lineWidth = isHovered ? 1.5 / zoom : EDGE_WIDTH / zoom;
283
- ctx.stroke();
284
-
285
- // Edge particle
286
- if (particles[idx]) {
287
- const p = particles[idx];
288
- const px = src.x + (tgt.x - src.x) * p.t;
289
- const py = src.y + (tgt.y - src.y) * p.t;
290
- ctx.beginPath();
291
- ctx.arc(px, py, (isHovered ? 2.5 : 1.5) / zoom, 0, Math.PI * 2);
292
- ctx.fillStyle = COLORS.particleColor;
293
- ctx.fill();
294
- }
295
-
296
- // Edge label (only when hovered or labels enabled)
297
- if (isHovered && showLabelsRef.current) {
298
- const mx = (src.x + tgt.x) / 2;
299
- const my = (src.y + tgt.y) / 2;
300
- ctx.font = EDGE_LABEL_FONT;
301
- ctx.fillStyle = COLORS.edgeLabel;
302
- ctx.textAlign = 'center';
303
- ctx.textBaseline = 'bottom';
304
- ctx.fillText(edge.label.replace(/_/g, ' '), mx, my - 4 / zoom);
305
- }
306
- });
307
-
308
- // ── Draw Nodes ──────────────────────────────────────
309
- nodes.forEach(node => {
310
- const isHovered = hoverNodeRef.current && hoverNodeRef.current.id === node.id;
311
- const r = node.radius;
312
-
313
- // Glow effect
314
- const glowRadius = isHovered ? r * 3.5 : r * 2.5;
315
- const glow = ctx.createRadialGradient(node.x, node.y, r * 0.5, node.x, node.y, glowRadius);
316
- glow.addColorStop(0, isHovered ? COLORS.nodeHoverGlow : COLORS.nodeGlow);
317
- glow.addColorStop(1, 'transparent');
318
- ctx.beginPath();
319
- ctx.arc(node.x, node.y, glowRadius, 0, Math.PI * 2);
320
- ctx.fillStyle = glow;
321
- ctx.fill();
322
-
323
- // Node circle
324
- const isHighlighted = highlightedRef.current.includes(node.id) || highlightedRef.current.includes(node.label);
325
-
326
- // Node circle
327
- ctx.beginPath();
328
- ctx.arc(node.x, node.y, r, 0, Math.PI * 2);
329
-
330
- if (isHighlighted) {
331
- // High-intensity highlight
332
- ctx.fillStyle = COLORS.nodeHighlight;
333
- // Extra glow for highlighted nodes
334
- const pulse = 1 + Math.sin(Date.now() / 150) * 0.2;
335
- const hGlow = ctx.createRadialGradient(node.x, node.y, r * 0.5, node.x, node.y, r * 4 * pulse);
336
- hGlow.addColorStop(0, COLORS.nodeHighlightGlow);
337
- hGlow.addColorStop(1, 'transparent');
338
- ctx.save();
339
- ctx.globalCompositeOperation = 'screen';
340
- ctx.fillStyle = hGlow;
341
- ctx.beginPath();
342
- ctx.arc(node.x, node.y, r * 4 * pulse, 0, Math.PI * 2);
343
- ctx.fill();
344
- ctx.restore();
345
-
346
- ctx.fillStyle = COLORS.nodeHighlight;
347
- } else {
348
- ctx.fillStyle = isHovered ? COLORS.nodeHover : COLORS.nodeFill;
349
- }
350
-
351
- ctx.fill();
352
- ctx.strokeStyle = isHighlighted ? COLORS.nodeHighlight : COLORS.nodeStroke;
353
- ctx.lineWidth = (isHovered || isHighlighted ? 2 : 1) / zoom;
354
- ctx.stroke();
355
-
356
- // Inner highlight
357
- ctx.beginPath();
358
- ctx.arc(node.x - r * 0.2, node.y - r * 0.2, r * 0.35, 0, Math.PI * 2);
359
- ctx.fillStyle = 'rgba(255, 255, 255, 0.15)';
360
- ctx.fill();
361
-
362
- // Label
363
- if (showLabelsRef.current) {
364
- ctx.font = LABEL_FONT;
365
- ctx.fillStyle = isHovered ? COLORS.labelText : COLORS.labelDim;
366
- ctx.textAlign = 'center';
367
- ctx.textBaseline = 'top';
368
- ctx.fillText(node.label, node.x, node.y + r + 6 / zoom);
369
- }
370
- });
371
-
372
- ctx.restore();
373
- }, []);
374
-
375
- // ── Animation Loop ──────────────────────────────────────────
376
- useEffect(() => {
377
- const loop = () => {
378
- physicsStep();
379
- render();
380
- animFrameRef.current = requestAnimationFrame(loop);
381
- };
382
- animFrameRef.current = requestAnimationFrame(loop);
383
- return () => cancelAnimationFrame(animFrameRef.current);
384
- }, [physicsStep, render]);
385
-
386
- // ── Canvas Resize ───────────────────────────────────────────
387
- useEffect(() => {
388
- const resize = () => {
389
- const canvas = canvasRef.current;
390
- if (!canvas) return;
391
- const parent = canvas.parentElement;
392
- const dpr = window.devicePixelRatio || 1;
393
- canvas.width = parent.clientWidth * dpr;
394
- canvas.height = parent.clientHeight * dpr;
395
- canvas.style.width = parent.clientWidth + 'px';
396
- canvas.style.height = parent.clientHeight + 'px';
397
- const ctx = canvas.getContext('2d');
398
- ctx.scale(dpr, dpr);
399
- // High-DPI context preserved.
400
- };
401
- resize();
402
- window.addEventListener('resize', resize);
403
- return () => window.removeEventListener('resize', resize);
404
- }, []);
405
-
406
- // ── Fetch on mount ──────────────────────────────────────────
407
  useEffect(() => {
408
  fetchGraph();
409
  }, [fetchGraph]);
410
 
411
- // ── Coordinate transforms ───────────────────────────────────
412
- const screenToWorld = useCallback((sx, sy) => {
413
- return {
414
- x: (sx - panRef.current.x) / zoomRef.current,
415
- y: (sy - panRef.current.y) / zoomRef.current,
416
- };
417
- }, []);
418
-
419
- const findNodeAt = useCallback((wx, wy) => {
420
- const nodes = nodesRef.current;
421
- for (let i = nodes.length - 1; i >= 0; i--) {
422
- const n = nodes[i];
423
- const dx = wx - n.x;
424
- const dy = wy - n.y;
425
- if (dx * dx + dy * dy < (n.radius + 6) * (n.radius + 6)) {
426
- return n;
427
- }
428
- }
429
- return null;
430
- }, []);
431
-
432
- // ── Mouse Events ────────────────────────────────────────────
433
- const handleMouseDown = useCallback((e) => {
434
- const rect = canvasRef.current.getBoundingClientRect();
435
- const sx = e.clientX - rect.left;
436
- const sy = e.clientY - rect.top;
437
- const { x: wx, y: wy } = screenToWorld(sx, sy);
438
-
439
- const node = findNodeAt(wx, wy);
440
- if (node) {
441
- dragNodeRef.current = node;
442
- isDraggingRef.current = true;
443
- } else {
444
- isPanningRef.current = true;
445
- panStartRef.current = {
446
- x: e.clientX,
447
- y: e.clientY,
448
- panX: panRef.current.x,
449
- panY: panRef.current.y,
450
- };
451
  }
452
- }, [screenToWorld, findNodeAt]);
453
-
454
- const handleMouseMove = useCallback((e) => {
455
- const rect = canvasRef.current.getBoundingClientRect();
456
- const sx = e.clientX - rect.left;
457
- const sy = e.clientY - rect.top;
458
- mouseRef.current = { x: e.clientX, y: e.clientY, canvasX: sx, canvasY: sy };
459
-
460
- if (isDraggingRef.current && dragNodeRef.current) {
461
- const { x: wx, y: wy } = screenToWorld(sx, sy);
462
- dragNodeRef.current.x = wx;
463
- dragNodeRef.current.y = wy;
464
- dragNodeRef.current.vx = 0;
465
- dragNodeRef.current.vy = 0;
466
- return;
467
- }
468
-
469
- if (isPanningRef.current) {
470
- panRef.current = {
471
- x: panStartRef.current.panX + (e.clientX - panStartRef.current.x),
472
- y: panStartRef.current.panY + (e.clientY - panStartRef.current.y),
473
- };
474
- return;
475
- }
476
-
477
- // Hover detection
478
- const { x: wx, y: wy } = screenToWorld(sx, sy);
479
- const node = findNodeAt(wx, wy);
480
- hoverNodeRef.current = node;
481
-
482
- if (node) {
483
- // Build tooltip data with connected relations
484
- const relations = edgesRef.current
485
- .filter(e => e.source === node.id || e.target === node.id)
486
- .slice(0, 5)
487
- .map(e => ({
488
- source: e.source,
489
- target: e.target,
490
- label: e.label.replace(/_/g, ' '),
491
- }));
492
-
493
- setTooltipData({
494
- name: node.label,
495
- connections: node.connections,
496
- relations,
497
- x: e.clientX,
498
- y: e.clientY,
499
- });
500
- canvasRef.current.style.cursor = 'pointer';
501
- } else {
502
- setTooltipData(null);
503
- canvasRef.current.style.cursor = isPanningRef.current ? 'grabbing' : 'grab';
504
- }
505
- }, [screenToWorld, findNodeAt]);
506
-
507
- const handleMouseUp = useCallback(() => {
508
- dragNodeRef.current = null;
509
- isDraggingRef.current = false;
510
- isPanningRef.current = false;
511
- }, []);
512
-
513
- const handleWheel = useCallback((e) => {
514
- e.preventDefault();
515
- const rect = canvasRef.current.getBoundingClientRect();
516
- const sx = e.clientX - rect.left;
517
- const sy = e.clientY - rect.top;
518
-
519
- const zoomFactor = e.deltaY > 0 ? 0.92 : 1.08;
520
- const newZoom = Math.max(0.2, Math.min(5, zoomRef.current * zoomFactor));
521
-
522
- // Zoom toward cursor
523
- const worldBefore = screenToWorld(sx, sy);
524
- zoomRef.current = newZoom;
525
- const worldAfter = screenToWorld(sx, sy);
526
-
527
- panRef.current.x += (worldAfter.x - worldBefore.x) * newZoom;
528
- panRef.current.y += (worldAfter.y - worldBefore.y) * newZoom;
529
- }, [screenToWorld]);
530
-
531
- // ── Attach canvas events ────────────────────────────────────
532
- useEffect(() => {
533
- const canvas = canvasRef.current;
534
- if (!canvas) return;
535
- canvas.addEventListener('wheel', handleWheel, { passive: false });
536
- return () => canvas.removeEventListener('wheel', handleWheel);
537
- }, [handleWheel]);
538
-
539
- // ── Toggle labels sync ─────────────────────────────────────
540
- useEffect(() => {
541
- showLabelsRef.current = showLabels;
542
- }, [showLabels]);
543
-
544
- useEffect(() => {
545
- highlightedRef.current = highlightedNodes;
546
- }, [highlightedNodes]);
547
 
548
  // ── Render ──────────────────────────────────────────────────
549
  return (
550
- <div className="graph-container">
551
  {/* Header Bar */}
552
  <div className="graph-header">
553
  <div className="graph-title">
554
  <div className="pulse-ring" />
555
- <h2>Neural Mesh Topology</h2>
556
  <span className="label-mono" style={{ fontSize: '0.55rem' }}>
557
  {graphStatus === 'online' ? 'LIVE' : graphStatus.toUpperCase()}
558
  </span>
@@ -565,8 +113,9 @@ function KnowledgeGraph({ highlightedNodes = [] }) {
565
  {showLabels ? 'Hide Labels' : 'Show Labels'}
566
  </button>
567
  <button className="graph-btn" onClick={() => {
568
- panRef.current = { x: 0, y: 0 };
569
- zoomRef.current = 1;
 
570
  }}>
571
  Reset View
572
  </button>
@@ -576,15 +125,44 @@ function KnowledgeGraph({ highlightedNodes = [] }) {
576
  </div>
577
  </div>
578
 
579
- {/* Canvas */}
580
- <canvas
581
- ref={canvasRef}
582
- className="graph-canvas"
583
- onMouseDown={handleMouseDown}
584
- onMouseMove={handleMouseMove}
585
- onMouseUp={handleMouseUp}
586
- onMouseLeave={handleMouseUp}
587
- />
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
588
 
589
  {/* Stats Overlay */}
590
  {graphStatus === 'online' && (
@@ -610,38 +188,13 @@ function KnowledgeGraph({ highlightedNodes = [] }) {
610
  <div className="graph-legend">
611
  <div className="legend-title">Legend</div>
612
  <div className="legend-item">
613
- <div className="legend-dot primary" />
614
  <span className="legend-label">Entity Node</span>
615
  </div>
616
  <div className="legend-item">
617
- <div className="legend-dot secondary" />
618
- <span className="legend-label">Relationship</span>
619
- </div>
620
- </div>
621
- )}
622
-
623
- {/* Tooltip */}
624
- {tooltipData && (
625
- <div
626
- className="graph-tooltip visible"
627
- style={{
628
- left: tooltipData.x + 16,
629
- top: tooltipData.y - 10,
630
- }}
631
- >
632
- <div className="tooltip-name">{tooltipData.name}</div>
633
- <div className="tooltip-detail">
634
- Connections: {tooltipData.connections}
635
  </div>
636
- {tooltipData.relations.length > 0 && (
637
- <div className="tooltip-relations">
638
- {tooltipData.relations.map((r, i) => (
639
- <div key={i} className="tooltip-relation-item">
640
- {r.source}<span className="rel-arrow">β†’</span>{r.label}<span className="rel-arrow">β†’</span>{r.target}
641
- </div>
642
- ))}
643
- </div>
644
- )}
645
  </div>
646
  )}
647
 
 
1
  import { useState, useRef, useEffect, useCallback } from 'react';
2
+ import ForceGraph3D from 'react-force-graph-3d';
3
+ import * as THREE from 'three';
4
  import './KnowledgeGraph.css';
5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
  function KnowledgeGraph({ highlightedNodes = [] }) {
7
+ const fgRef = useRef();
8
+ const containerRef = useRef(null);
 
 
 
 
 
 
 
 
 
 
 
 
 
9
 
10
+ const [graphData, setGraphData] = useState({ nodes: [], links: [] });
11
+ const [loading, setLoading] = useState(true);
12
+ const [stats, setStats] = useState({ nodes: 0, edges: 0 });
13
  const [graphStatus, setGraphStatus] = useState('loading');
14
+ const [showLabels, setShowLabels] = useState(true);
15
+ const [dimensions, setDimensions] = useState({ width: 800, height: 600 });
16
  const [tooltipData, setTooltipData] = useState(null);
17
 
18
+ // Handle Resize
19
+ useEffect(() => {
20
+ const handleResize = () => {
21
+ if (containerRef.current) {
22
+ setDimensions({
23
+ width: containerRef.current.clientWidth,
24
+ height: containerRef.current.clientHeight
25
+ });
26
+ }
27
+ };
28
+ handleResize();
29
+ window.addEventListener('resize', handleResize);
30
+ return () => window.removeEventListener('resize', handleResize);
31
+ }, []);
32
+
33
+ // Fetch Graph Data
34
  const fetchGraph = useCallback(async () => {
35
  setLoading(true);
36
  setGraphStatus('loading');
 
40
 
41
  if (data.status === 'offline') {
42
  setGraphStatus('offline');
43
+ setGraphData({ nodes: [], links: [] });
44
  setStats({ nodes: 0, edges: 0 });
45
  } else if (data.nodes.length === 0) {
46
  setGraphStatus('empty');
47
+ setGraphData({ nodes: [], links: [] });
48
  setStats({ nodes: 0, edges: 0 });
49
  } else {
50
  setGraphStatus('online');
51
+
52
+ // Format for 3D Graph
53
+ const formattedData = {
54
+ nodes: data.nodes.map(n => ({
55
+ id: n.id,
56
+ label: n.label,
57
+ connections: n.connections || 0,
58
+ val: Math.max(1, (n.connections || 0) * 1.5) // Node visual size
59
+ })),
60
+ links: data.edges.map(e => ({
61
+ source: e.source,
62
+ target: e.target,
63
+ label: e.label
64
+ }))
65
+ };
66
+
67
+ setGraphData(formattedData);
68
  setStats({ nodes: data.nodes.length, edges: data.edges.length });
 
69
  }
70
  } catch (err) {
71
  console.error('Failed to fetch graph:', err);
72
  setGraphStatus('error');
73
+ setGraphData({ nodes: [], links: [] });
74
  }
75
  setLoading(false);
76
  }, []);
77
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
78
  useEffect(() => {
79
  fetchGraph();
80
  }, [fetchGraph]);
81
 
82
+ const handleNodeClick = useCallback(node => {
83
+ if (fgRef.current) {
84
+ // Aim at node from outside it
85
+ const distance = 80;
86
+ const distRatio = 1 + distance / Math.hypot(node.x, node.y, node.z);
87
+
88
+ fgRef.current.cameraPosition(
89
+ { x: node.x * distRatio, y: node.y * distRatio, z: node.z * distRatio }, // new position
90
+ node, // lookAt ({ x, y, z })
91
+ 1500 // ms transition duration
92
+ );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
93
  }
94
+ }, [fgRef]);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
95
 
96
  // ── Render ──────────────────────────────────────────────────
97
  return (
98
+ <div className="graph-container" ref={containerRef}>
99
  {/* Header Bar */}
100
  <div className="graph-header">
101
  <div className="graph-title">
102
  <div className="pulse-ring" />
103
+ <h2>Neural Mesh Topology (3D)</h2>
104
  <span className="label-mono" style={{ fontSize: '0.55rem' }}>
105
  {graphStatus === 'online' ? 'LIVE' : graphStatus.toUpperCase()}
106
  </span>
 
113
  {showLabels ? 'Hide Labels' : 'Show Labels'}
114
  </button>
115
  <button className="graph-btn" onClick={() => {
116
+ if (fgRef.current) {
117
+ fgRef.current.cameraPosition({ x: 0, y: 0, z: 250 }, { x: 0, y: 0, z: 0 }, 1000);
118
+ }
119
  }}>
120
  Reset View
121
  </button>
 
125
  </div>
126
  </div>
127
 
128
+ {/* 3D Canvas Container */}
129
+ {(graphStatus === 'online' || graphData.nodes.length > 0) && (
130
+ <div className="graph-canvas-3d" style={{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0 }}>
131
+ <ForceGraph3D
132
+ ref={fgRef}
133
+ width={dimensions.width}
134
+ height={dimensions.height}
135
+ graphData={graphData}
136
+ backgroundColor="rgba(0,0,0,0)" // Transparent to show CSS background
137
+
138
+ // Nodes
139
+ nodeLabel={showLabels ? "label" : ""}
140
+ nodeColor={node => {
141
+ if (highlightedNodes.includes(node.id) || highlightedNodes.includes(node.label)) {
142
+ return 'rgba(255, 215, 0, 0.9)'; // Highlight Gold
143
+ }
144
+ return 'rgba(71, 191, 255, 0.8)'; // Default Cyan
145
+ }}
146
+ nodeRelSize={4}
147
+ nodeResolution={16}
148
+
149
+ // Edges (Synapses) -> Particles
150
+ linkDirectionalParticles={2}
151
+ linkDirectionalParticleSpeed={d => 0.005 + (0.002 * Math.random())} // Varying speed
152
+ linkDirectionalParticleWidth={2}
153
+ linkDirectionalParticleColor={() => 'rgba(134, 59, 255, 0.9)'} // Purple energy
154
+
155
+ // Edge line styling
156
+ linkColor={() => 'rgba(71, 191, 255, 0.2)'}
157
+ linkOpacity={0.4}
158
+ linkWidth={0.8}
159
+
160
+ // Interaction
161
+ onNodeClick={handleNodeClick}
162
+ enableNodeDrag={true}
163
+ />
164
+ </div>
165
+ )}
166
 
167
  {/* Stats Overlay */}
168
  {graphStatus === 'online' && (
 
188
  <div className="graph-legend">
189
  <div className="legend-title">Legend</div>
190
  <div className="legend-item">
191
+ <div className="legend-dot primary" style={{ background: 'rgba(71, 191, 255, 0.8)' }} />
192
  <span className="legend-label">Entity Node</span>
193
  </div>
194
  <div className="legend-item">
195
+ <div className="legend-dot secondary" style={{ background: 'rgba(134, 59, 255, 0.8)' }} />
196
+ <span className="legend-label">Synaptic Flow (Particle)</span>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
197
  </div>
 
 
 
 
 
 
 
 
 
198
  </div>
199
  )}
200