David Pomerenke commited on
Commit
867080c
·
1 Parent(s): 51a302e

Simple Plot map

Browse files
frontend/package-lock.json CHANGED
@@ -8,6 +8,7 @@
8
  "name": "frontend",
9
  "version": "0.1.0",
10
  "dependencies": {
 
11
  "@testing-library/dom": "^10.4.0",
12
  "@testing-library/jest-dom": "^6.6.3",
13
  "@testing-library/react": "^16.2.0",
@@ -17,6 +18,7 @@
17
  "react": "^19.0.0",
18
  "react-dom": "^19.0.0",
19
  "react-scripts": "5.0.1",
 
20
  "web-vitals": "^2.1.4"
21
  }
22
  },
@@ -3034,6 +3036,20 @@
3034
  "node": ">= 8"
3035
  }
3036
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3037
  "node_modules/@pkgjs/parseargs": {
3038
  "version": "0.11.0",
3039
  "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
@@ -5228,6 +5244,12 @@
5228
  "url": "https://github.com/sponsors/sindresorhus"
5229
  }
5230
  },
 
 
 
 
 
 
5231
  "node_modules/bluebird": {
5232
  "version": "3.7.2",
5233
  "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
@@ -6390,6 +6412,416 @@
6390
  "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
6391
  "license": "MIT"
6392
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6393
  "node_modules/damerau-levenshtein": {
6394
  "version": "1.0.8",
6395
  "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
@@ -6560,6 +6992,15 @@
6560
  "url": "https://github.com/sponsors/ljharb"
6561
  }
6562
  },
 
 
 
 
 
 
 
 
 
6563
  "node_modules/delayed-stream": {
6564
  "version": "1.0.0",
6565
  "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -9304,6 +9745,24 @@
9304
  "node": ">= 0.4"
9305
  }
9306
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9307
  "node_modules/ipaddr.js": {
9308
  "version": "2.2.0",
9309
  "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz",
@@ -9820,6 +10279,12 @@
9820
  "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
9821
  "license": "ISC"
9822
  },
 
 
 
 
 
 
9823
  "node_modules/istanbul-lib-coverage": {
9824
  "version": "3.2.2",
9825
  "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
@@ -14463,6 +14928,12 @@
14463
  "url": "https://github.com/sponsors/isaacs"
14464
  }
14465
  },
 
 
 
 
 
 
14466
  "node_modules/rollup": {
14467
  "version": "2.79.2",
14468
  "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz",
@@ -14540,6 +15011,12 @@
14540
  "queue-microtask": "^1.2.2"
14541
  }
14542
  },
 
 
 
 
 
 
14543
  "node_modules/safe-array-concat": {
14544
  "version": "1.1.3",
14545
  "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz",
@@ -16190,6 +16667,45 @@
16190
  "node": ">=0.6"
16191
  }
16192
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16193
  "node_modules/tough-cookie": {
16194
  "version": "4.1.4",
16195
  "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz",
 
8
  "name": "frontend",
9
  "version": "0.1.0",
10
  "dependencies": {
11
+ "@observablehq/plot": "^0.6.17",
12
  "@testing-library/dom": "^10.4.0",
13
  "@testing-library/jest-dom": "^6.6.3",
14
  "@testing-library/react": "^16.2.0",
 
18
  "react": "^19.0.0",
19
  "react-dom": "^19.0.0",
20
  "react-scripts": "5.0.1",
21
+ "topojson-simplify": "^3.0.3",
22
  "web-vitals": "^2.1.4"
23
  }
24
  },
 
3036
  "node": ">= 8"
3037
  }
3038
  },
3039
+ "node_modules/@observablehq/plot": {
3040
+ "version": "0.6.17",
3041
+ "resolved": "https://registry.npmjs.org/@observablehq/plot/-/plot-0.6.17.tgz",
3042
+ "integrity": "sha512-/qaXP/7mc4MUS0s4cPPFASDRjtsWp85/TbfsciqDgU1HwYixbSbbytNuInD8AcTYC3xaxACgVX06agdfQy9W+g==",
3043
+ "license": "ISC",
3044
+ "dependencies": {
3045
+ "d3": "^7.9.0",
3046
+ "interval-tree-1d": "^1.0.0",
3047
+ "isoformat": "^0.2.0"
3048
+ },
3049
+ "engines": {
3050
+ "node": ">=12"
3051
+ }
3052
+ },
3053
  "node_modules/@pkgjs/parseargs": {
3054
  "version": "0.11.0",
3055
  "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
 
5244
  "url": "https://github.com/sponsors/sindresorhus"
5245
  }
5246
  },
5247
+ "node_modules/binary-search-bounds": {
5248
+ "version": "2.0.5",
5249
+ "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.5.tgz",
5250
+ "integrity": "sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA==",
5251
+ "license": "MIT"
5252
+ },
5253
  "node_modules/bluebird": {
5254
  "version": "3.7.2",
5255
  "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
 
6412
  "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
6413
  "license": "MIT"
6414
  },
6415
+ "node_modules/d3": {
6416
+ "version": "7.9.0",
6417
+ "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz",
6418
+ "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==",
6419
+ "license": "ISC",
6420
+ "dependencies": {
6421
+ "d3-array": "3",
6422
+ "d3-axis": "3",
6423
+ "d3-brush": "3",
6424
+ "d3-chord": "3",
6425
+ "d3-color": "3",
6426
+ "d3-contour": "4",
6427
+ "d3-delaunay": "6",
6428
+ "d3-dispatch": "3",
6429
+ "d3-drag": "3",
6430
+ "d3-dsv": "3",
6431
+ "d3-ease": "3",
6432
+ "d3-fetch": "3",
6433
+ "d3-force": "3",
6434
+ "d3-format": "3",
6435
+ "d3-geo": "3",
6436
+ "d3-hierarchy": "3",
6437
+ "d3-interpolate": "3",
6438
+ "d3-path": "3",
6439
+ "d3-polygon": "3",
6440
+ "d3-quadtree": "3",
6441
+ "d3-random": "3",
6442
+ "d3-scale": "4",
6443
+ "d3-scale-chromatic": "3",
6444
+ "d3-selection": "3",
6445
+ "d3-shape": "3",
6446
+ "d3-time": "3",
6447
+ "d3-time-format": "4",
6448
+ "d3-timer": "3",
6449
+ "d3-transition": "3",
6450
+ "d3-zoom": "3"
6451
+ },
6452
+ "engines": {
6453
+ "node": ">=12"
6454
+ }
6455
+ },
6456
+ "node_modules/d3-array": {
6457
+ "version": "3.2.4",
6458
+ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz",
6459
+ "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==",
6460
+ "license": "ISC",
6461
+ "dependencies": {
6462
+ "internmap": "1 - 2"
6463
+ },
6464
+ "engines": {
6465
+ "node": ">=12"
6466
+ }
6467
+ },
6468
+ "node_modules/d3-axis": {
6469
+ "version": "3.0.0",
6470
+ "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz",
6471
+ "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==",
6472
+ "license": "ISC",
6473
+ "engines": {
6474
+ "node": ">=12"
6475
+ }
6476
+ },
6477
+ "node_modules/d3-brush": {
6478
+ "version": "3.0.0",
6479
+ "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz",
6480
+ "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==",
6481
+ "license": "ISC",
6482
+ "dependencies": {
6483
+ "d3-dispatch": "1 - 3",
6484
+ "d3-drag": "2 - 3",
6485
+ "d3-interpolate": "1 - 3",
6486
+ "d3-selection": "3",
6487
+ "d3-transition": "3"
6488
+ },
6489
+ "engines": {
6490
+ "node": ">=12"
6491
+ }
6492
+ },
6493
+ "node_modules/d3-chord": {
6494
+ "version": "3.0.1",
6495
+ "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz",
6496
+ "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==",
6497
+ "license": "ISC",
6498
+ "dependencies": {
6499
+ "d3-path": "1 - 3"
6500
+ },
6501
+ "engines": {
6502
+ "node": ">=12"
6503
+ }
6504
+ },
6505
+ "node_modules/d3-color": {
6506
+ "version": "3.1.0",
6507
+ "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
6508
+ "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==",
6509
+ "license": "ISC",
6510
+ "engines": {
6511
+ "node": ">=12"
6512
+ }
6513
+ },
6514
+ "node_modules/d3-contour": {
6515
+ "version": "4.0.2",
6516
+ "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz",
6517
+ "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==",
6518
+ "license": "ISC",
6519
+ "dependencies": {
6520
+ "d3-array": "^3.2.0"
6521
+ },
6522
+ "engines": {
6523
+ "node": ">=12"
6524
+ }
6525
+ },
6526
+ "node_modules/d3-delaunay": {
6527
+ "version": "6.0.4",
6528
+ "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz",
6529
+ "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==",
6530
+ "license": "ISC",
6531
+ "dependencies": {
6532
+ "delaunator": "5"
6533
+ },
6534
+ "engines": {
6535
+ "node": ">=12"
6536
+ }
6537
+ },
6538
+ "node_modules/d3-dispatch": {
6539
+ "version": "3.0.1",
6540
+ "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz",
6541
+ "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==",
6542
+ "license": "ISC",
6543
+ "engines": {
6544
+ "node": ">=12"
6545
+ }
6546
+ },
6547
+ "node_modules/d3-drag": {
6548
+ "version": "3.0.0",
6549
+ "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz",
6550
+ "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==",
6551
+ "license": "ISC",
6552
+ "dependencies": {
6553
+ "d3-dispatch": "1 - 3",
6554
+ "d3-selection": "3"
6555
+ },
6556
+ "engines": {
6557
+ "node": ">=12"
6558
+ }
6559
+ },
6560
+ "node_modules/d3-dsv": {
6561
+ "version": "3.0.1",
6562
+ "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz",
6563
+ "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==",
6564
+ "license": "ISC",
6565
+ "dependencies": {
6566
+ "commander": "7",
6567
+ "iconv-lite": "0.6",
6568
+ "rw": "1"
6569
+ },
6570
+ "bin": {
6571
+ "csv2json": "bin/dsv2json.js",
6572
+ "csv2tsv": "bin/dsv2dsv.js",
6573
+ "dsv2dsv": "bin/dsv2dsv.js",
6574
+ "dsv2json": "bin/dsv2json.js",
6575
+ "json2csv": "bin/json2dsv.js",
6576
+ "json2dsv": "bin/json2dsv.js",
6577
+ "json2tsv": "bin/json2dsv.js",
6578
+ "tsv2csv": "bin/dsv2dsv.js",
6579
+ "tsv2json": "bin/dsv2json.js"
6580
+ },
6581
+ "engines": {
6582
+ "node": ">=12"
6583
+ }
6584
+ },
6585
+ "node_modules/d3-dsv/node_modules/commander": {
6586
+ "version": "7.2.0",
6587
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
6588
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
6589
+ "license": "MIT",
6590
+ "engines": {
6591
+ "node": ">= 10"
6592
+ }
6593
+ },
6594
+ "node_modules/d3-ease": {
6595
+ "version": "3.0.1",
6596
+ "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
6597
+ "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==",
6598
+ "license": "BSD-3-Clause",
6599
+ "engines": {
6600
+ "node": ">=12"
6601
+ }
6602
+ },
6603
+ "node_modules/d3-fetch": {
6604
+ "version": "3.0.1",
6605
+ "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz",
6606
+ "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==",
6607
+ "license": "ISC",
6608
+ "dependencies": {
6609
+ "d3-dsv": "1 - 3"
6610
+ },
6611
+ "engines": {
6612
+ "node": ">=12"
6613
+ }
6614
+ },
6615
+ "node_modules/d3-force": {
6616
+ "version": "3.0.0",
6617
+ "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz",
6618
+ "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==",
6619
+ "license": "ISC",
6620
+ "dependencies": {
6621
+ "d3-dispatch": "1 - 3",
6622
+ "d3-quadtree": "1 - 3",
6623
+ "d3-timer": "1 - 3"
6624
+ },
6625
+ "engines": {
6626
+ "node": ">=12"
6627
+ }
6628
+ },
6629
+ "node_modules/d3-format": {
6630
+ "version": "3.1.0",
6631
+ "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz",
6632
+ "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==",
6633
+ "license": "ISC",
6634
+ "engines": {
6635
+ "node": ">=12"
6636
+ }
6637
+ },
6638
+ "node_modules/d3-geo": {
6639
+ "version": "3.1.1",
6640
+ "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz",
6641
+ "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==",
6642
+ "license": "ISC",
6643
+ "dependencies": {
6644
+ "d3-array": "2.5.0 - 3"
6645
+ },
6646
+ "engines": {
6647
+ "node": ">=12"
6648
+ }
6649
+ },
6650
+ "node_modules/d3-hierarchy": {
6651
+ "version": "3.1.2",
6652
+ "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz",
6653
+ "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==",
6654
+ "license": "ISC",
6655
+ "engines": {
6656
+ "node": ">=12"
6657
+ }
6658
+ },
6659
+ "node_modules/d3-interpolate": {
6660
+ "version": "3.0.1",
6661
+ "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
6662
+ "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
6663
+ "license": "ISC",
6664
+ "dependencies": {
6665
+ "d3-color": "1 - 3"
6666
+ },
6667
+ "engines": {
6668
+ "node": ">=12"
6669
+ }
6670
+ },
6671
+ "node_modules/d3-path": {
6672
+ "version": "3.1.0",
6673
+ "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz",
6674
+ "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==",
6675
+ "license": "ISC",
6676
+ "engines": {
6677
+ "node": ">=12"
6678
+ }
6679
+ },
6680
+ "node_modules/d3-polygon": {
6681
+ "version": "3.0.1",
6682
+ "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz",
6683
+ "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==",
6684
+ "license": "ISC",
6685
+ "engines": {
6686
+ "node": ">=12"
6687
+ }
6688
+ },
6689
+ "node_modules/d3-quadtree": {
6690
+ "version": "3.0.1",
6691
+ "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz",
6692
+ "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==",
6693
+ "license": "ISC",
6694
+ "engines": {
6695
+ "node": ">=12"
6696
+ }
6697
+ },
6698
+ "node_modules/d3-random": {
6699
+ "version": "3.0.1",
6700
+ "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz",
6701
+ "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==",
6702
+ "license": "ISC",
6703
+ "engines": {
6704
+ "node": ">=12"
6705
+ }
6706
+ },
6707
+ "node_modules/d3-scale": {
6708
+ "version": "4.0.2",
6709
+ "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",
6710
+ "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
6711
+ "license": "ISC",
6712
+ "dependencies": {
6713
+ "d3-array": "2.10.0 - 3",
6714
+ "d3-format": "1 - 3",
6715
+ "d3-interpolate": "1.2.0 - 3",
6716
+ "d3-time": "2.1.1 - 3",
6717
+ "d3-time-format": "2 - 4"
6718
+ },
6719
+ "engines": {
6720
+ "node": ">=12"
6721
+ }
6722
+ },
6723
+ "node_modules/d3-scale-chromatic": {
6724
+ "version": "3.1.0",
6725
+ "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz",
6726
+ "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==",
6727
+ "license": "ISC",
6728
+ "dependencies": {
6729
+ "d3-color": "1 - 3",
6730
+ "d3-interpolate": "1 - 3"
6731
+ },
6732
+ "engines": {
6733
+ "node": ">=12"
6734
+ }
6735
+ },
6736
+ "node_modules/d3-selection": {
6737
+ "version": "3.0.0",
6738
+ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz",
6739
+ "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==",
6740
+ "license": "ISC",
6741
+ "engines": {
6742
+ "node": ">=12"
6743
+ }
6744
+ },
6745
+ "node_modules/d3-shape": {
6746
+ "version": "3.2.0",
6747
+ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz",
6748
+ "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==",
6749
+ "license": "ISC",
6750
+ "dependencies": {
6751
+ "d3-path": "^3.1.0"
6752
+ },
6753
+ "engines": {
6754
+ "node": ">=12"
6755
+ }
6756
+ },
6757
+ "node_modules/d3-time": {
6758
+ "version": "3.1.0",
6759
+ "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz",
6760
+ "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",
6761
+ "license": "ISC",
6762
+ "dependencies": {
6763
+ "d3-array": "2 - 3"
6764
+ },
6765
+ "engines": {
6766
+ "node": ">=12"
6767
+ }
6768
+ },
6769
+ "node_modules/d3-time-format": {
6770
+ "version": "4.1.0",
6771
+ "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",
6772
+ "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
6773
+ "license": "ISC",
6774
+ "dependencies": {
6775
+ "d3-time": "1 - 3"
6776
+ },
6777
+ "engines": {
6778
+ "node": ">=12"
6779
+ }
6780
+ },
6781
+ "node_modules/d3-timer": {
6782
+ "version": "3.0.1",
6783
+ "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
6784
+ "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==",
6785
+ "license": "ISC",
6786
+ "engines": {
6787
+ "node": ">=12"
6788
+ }
6789
+ },
6790
+ "node_modules/d3-transition": {
6791
+ "version": "3.0.1",
6792
+ "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz",
6793
+ "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==",
6794
+ "license": "ISC",
6795
+ "dependencies": {
6796
+ "d3-color": "1 - 3",
6797
+ "d3-dispatch": "1 - 3",
6798
+ "d3-ease": "1 - 3",
6799
+ "d3-interpolate": "1 - 3",
6800
+ "d3-timer": "1 - 3"
6801
+ },
6802
+ "engines": {
6803
+ "node": ">=12"
6804
+ },
6805
+ "peerDependencies": {
6806
+ "d3-selection": "2 - 3"
6807
+ }
6808
+ },
6809
+ "node_modules/d3-zoom": {
6810
+ "version": "3.0.0",
6811
+ "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz",
6812
+ "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==",
6813
+ "license": "ISC",
6814
+ "dependencies": {
6815
+ "d3-dispatch": "1 - 3",
6816
+ "d3-drag": "2 - 3",
6817
+ "d3-interpolate": "1 - 3",
6818
+ "d3-selection": "2 - 3",
6819
+ "d3-transition": "2 - 3"
6820
+ },
6821
+ "engines": {
6822
+ "node": ">=12"
6823
+ }
6824
+ },
6825
  "node_modules/damerau-levenshtein": {
6826
  "version": "1.0.8",
6827
  "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
 
6992
  "url": "https://github.com/sponsors/ljharb"
6993
  }
6994
  },
6995
+ "node_modules/delaunator": {
6996
+ "version": "5.0.1",
6997
+ "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz",
6998
+ "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==",
6999
+ "license": "ISC",
7000
+ "dependencies": {
7001
+ "robust-predicates": "^3.0.2"
7002
+ }
7003
+ },
7004
  "node_modules/delayed-stream": {
7005
  "version": "1.0.0",
7006
  "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
 
9745
  "node": ">= 0.4"
9746
  }
9747
  },
9748
+ "node_modules/internmap": {
9749
+ "version": "2.0.3",
9750
+ "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
9751
+ "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==",
9752
+ "license": "ISC",
9753
+ "engines": {
9754
+ "node": ">=12"
9755
+ }
9756
+ },
9757
+ "node_modules/interval-tree-1d": {
9758
+ "version": "1.0.4",
9759
+ "resolved": "https://registry.npmjs.org/interval-tree-1d/-/interval-tree-1d-1.0.4.tgz",
9760
+ "integrity": "sha512-wY8QJH+6wNI0uh4pDQzMvl+478Qh7Rl4qLmqiluxALlNvl+I+o5x38Pw3/z7mDPTPS1dQalZJXsmbvxx5gclhQ==",
9761
+ "license": "MIT",
9762
+ "dependencies": {
9763
+ "binary-search-bounds": "^2.0.0"
9764
+ }
9765
+ },
9766
  "node_modules/ipaddr.js": {
9767
  "version": "2.2.0",
9768
  "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz",
 
10279
  "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
10280
  "license": "ISC"
10281
  },
10282
+ "node_modules/isoformat": {
10283
+ "version": "0.2.1",
10284
+ "resolved": "https://registry.npmjs.org/isoformat/-/isoformat-0.2.1.tgz",
10285
+ "integrity": "sha512-tFLRAygk9NqrRPhJSnNGh7g7oaVWDwR0wKh/GM2LgmPa50Eg4UfyaCO4I8k6EqJHl1/uh2RAD6g06n5ygEnrjQ==",
10286
+ "license": "ISC"
10287
+ },
10288
  "node_modules/istanbul-lib-coverage": {
10289
  "version": "3.2.2",
10290
  "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
 
14928
  "url": "https://github.com/sponsors/isaacs"
14929
  }
14930
  },
14931
+ "node_modules/robust-predicates": {
14932
+ "version": "3.0.2",
14933
+ "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz",
14934
+ "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==",
14935
+ "license": "Unlicense"
14936
+ },
14937
  "node_modules/rollup": {
14938
  "version": "2.79.2",
14939
  "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz",
 
15011
  "queue-microtask": "^1.2.2"
15012
  }
15013
  },
15014
+ "node_modules/rw": {
15015
+ "version": "1.3.3",
15016
+ "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz",
15017
+ "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==",
15018
+ "license": "BSD-3-Clause"
15019
+ },
15020
  "node_modules/safe-array-concat": {
15021
  "version": "1.1.3",
15022
  "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz",
 
16667
  "node": ">=0.6"
16668
  }
16669
  },
16670
+ "node_modules/topojson-client": {
16671
+ "version": "3.1.0",
16672
+ "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz",
16673
+ "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==",
16674
+ "license": "ISC",
16675
+ "dependencies": {
16676
+ "commander": "2"
16677
+ },
16678
+ "bin": {
16679
+ "topo2geo": "bin/topo2geo",
16680
+ "topomerge": "bin/topomerge",
16681
+ "topoquantize": "bin/topoquantize"
16682
+ }
16683
+ },
16684
+ "node_modules/topojson-client/node_modules/commander": {
16685
+ "version": "2.20.3",
16686
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
16687
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
16688
+ "license": "MIT"
16689
+ },
16690
+ "node_modules/topojson-simplify": {
16691
+ "version": "3.0.3",
16692
+ "resolved": "https://registry.npmjs.org/topojson-simplify/-/topojson-simplify-3.0.3.tgz",
16693
+ "integrity": "sha512-V+pBjLVzSQ3+hSOxBiV01OVXgFiCmMO8ia3huxKEyIMTC1ApQHBcdXdOqcQ6U2JJJD31TZduwY6KyF15R8sUgg==",
16694
+ "license": "ISC",
16695
+ "dependencies": {
16696
+ "commander": "2",
16697
+ "topojson-client": "3"
16698
+ },
16699
+ "bin": {
16700
+ "toposimplify": "bin/toposimplify"
16701
+ }
16702
+ },
16703
+ "node_modules/topojson-simplify/node_modules/commander": {
16704
+ "version": "2.20.3",
16705
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
16706
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
16707
+ "license": "MIT"
16708
+ },
16709
  "node_modules/tough-cookie": {
16710
  "version": "4.1.4",
16711
  "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz",
frontend/package.json CHANGED
@@ -3,6 +3,7 @@
3
  "version": "0.1.0",
4
  "private": true,
5
  "dependencies": {
 
6
  "@testing-library/dom": "^10.4.0",
7
  "@testing-library/jest-dom": "^6.6.3",
8
  "@testing-library/react": "^16.2.0",
@@ -12,6 +13,7 @@
12
  "react": "^19.0.0",
13
  "react-dom": "^19.0.0",
14
  "react-scripts": "5.0.1",
 
15
  "web-vitals": "^2.1.4"
16
  },
17
  "scripts": {
 
3
  "version": "0.1.0",
4
  "private": true,
5
  "dependencies": {
6
+ "@observablehq/plot": "^0.6.17",
7
  "@testing-library/dom": "^10.4.0",
8
  "@testing-library/jest-dom": "^6.6.3",
9
  "@testing-library/react": "^16.2.0",
 
13
  "react": "^19.0.0",
14
  "react-dom": "^19.0.0",
15
  "react-scripts": "5.0.1",
16
+ "topojson-simplify": "^3.0.3",
17
  "web-vitals": "^2.1.4"
18
  },
19
  "scripts": {
frontend/public/LICENSE ADDED
@@ -0,0 +1 @@
 
 
1
+ un.*.json: https://geoportal.un.org/arcgis/apps/sites/#/geohub/datasets/d7caaff3ef4b4f7c82689b7c4694ad92/about
frontend/public/countries-110m.json DELETED
The diff for this file is too large to render. See raw diff
 
frontend/public/un.topo.json ADDED
The diff for this file is too large to render. See raw diff
 
frontend/src/App.js CHANGED
@@ -13,7 +13,6 @@ function App () {
13
  const [error, setError] = useState(null)
14
  const [allSuggestions, setAllSuggestions] = useState([])
15
  const [filters, setFilters] = useState([])
16
- const [topology, setTopology] = useState(null)
17
  useEffect(() => {
18
  fetch('/results.json')
19
  .then(response => {
@@ -32,22 +31,6 @@ function App () {
32
  })
33
  }, [])
34
 
35
- useEffect(() => {
36
- fetch('/countries-110m.json')
37
- .then(response => {
38
- if (!response.ok) {
39
- throw new Error('Network response was not ok')
40
- }
41
- return response.json()
42
- })
43
- .then(jsonData => {
44
- setTopology(jsonData)
45
- })
46
- .catch(err => {
47
- setError(err.message)
48
- setLoading(false)
49
- })
50
- }, [])
51
  useEffect(() => {
52
  if (data) {
53
  const models = data.model_table.map(item => ({ type: 'Model', value: item.model, detail: item.provider, searchText: item.provider.toLowerCase() + ' ' + item.model.toLowerCase() }))
@@ -105,15 +88,15 @@ function App () {
105
  {data && (
106
  <>
107
  <div
 
108
  style={{
109
  flex: '100vw 100vw 100vw',
110
- maxWidth: 'min(100vw, 900px)',
111
- marginBottom: '2rem'
 
112
  }}
113
  >
114
- <div id='figure'>
115
- <WorldMap data={data} topology={topology} />
116
- </div>
117
  </div>
118
  <div
119
  style={{
 
13
  const [error, setError] = useState(null)
14
  const [allSuggestions, setAllSuggestions] = useState([])
15
  const [filters, setFilters] = useState([])
 
16
  useEffect(() => {
17
  fetch('/results.json')
18
  .then(response => {
 
31
  })
32
  }, [])
33
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
34
  useEffect(() => {
35
  if (data) {
36
  const models = data.model_table.map(item => ({ type: 'Model', value: item.model, detail: item.provider, searchText: item.provider.toLowerCase() + ' ' + item.model.toLowerCase() }))
 
88
  {data && (
89
  <>
90
  <div
91
+ id='figure'
92
  style={{
93
  flex: '100vw 100vw 100vw',
94
+ maxWidth: 'min(100vw, 800px)',
95
+ alignItems: 'center',
96
+ justifyContent: 'center',
97
  }}
98
  >
99
+ <WorldMap data={data} />
 
 
100
  </div>
101
  <div
102
  style={{
frontend/src/components/WorldMap.js CHANGED
@@ -1,58 +1,45 @@
1
- import { useRef, useEffect } from 'react';
2
- import * as d3 from 'd3';
3
- import { feature } from 'topojson-client';
4
 
5
- const WorldMap = ({ data, topology }) => {
6
- const svgRef = useRef(null);
 
7
 
8
  useEffect(() => {
9
- const createMap = async () => {
10
- // Clear any existing SVG content
11
- d3.select(svgRef.current).selectAll("*").remove();
12
-
13
- // Set dimensions
14
- const width = 800;
15
- const height = 450;
16
-
17
- // Create SVG
18
- const svg = d3.select(svgRef.current)
19
- .attr("width", width)
20
- .attr("height", height)
21
- .attr("viewBox", [0, 0, width, height])
22
- .attr("style", "max-width: 100%; height: auto;");
23
-
24
- // Create a projection
25
- const projection = d3.geoNaturalEarth1()
26
- .scale(width / 2 / Math.PI)
27
- .translate([width / 2, height / 2]);
28
-
29
- // Create a path generator
30
- const path = d3.geoPath()
31
- .projection(projection);
32
-
33
- // Convert TopoJSON to GeoJSON
34
- const countries = feature(topology, topology.objects.countries);
35
-
36
- // Draw the map
37
- svg.append("g")
38
- .selectAll("path")
39
- .data(countries.features)
40
- .join("path")
41
- .attr("fill", "#ccc") // Grey background
42
- .attr("d", path)
43
- .attr("stroke", "#fff")
44
- .attr("stroke-width", 0.5);
45
- };
46
-
47
- createMap();
48
- }, [data, topology]);
49
 
50
- return (
51
- <div className="world-map-container">
52
- <h2>World Language Distribution</h2>
53
- <svg ref={svgRef}></svg>
54
- </div>
55
- );
56
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
57
 
58
- export default WorldMap;
 
1
+ import { useRef, useEffect, useState } from 'react'
2
+ import * as topojson from 'topojson-client'
3
+ import * as Plot from '@observablehq/plot'
4
 
5
+ const WorldMap = () => {
6
+ const containerRef = useRef()
7
+ const [data, setData] = useState()
8
 
9
  useEffect(() => {
10
+ fetch('/un.topo.json')
11
+ .then(res => res.json())
12
+ .then(setData)
13
+ }, [])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
 
15
+ useEffect(() => {
16
+ if (data === undefined) return
17
+ // const plot = Plot.plot({
18
+ // y: {grid: true},
19
+ // color: {scheme: "burd"},
20
+ // marks: [
21
+ // Plot.ruleY([0]),
22
+ // Plot.dot(data, {x: "Date", y: "Anomaly", stroke: "Anomaly"})
23
+ // ]
24
+ // });
25
+ const countries = topojson.feature(data, data.objects.un)
26
+ const plot = Plot.plot({
27
+ width: 750,
28
+ height: 400,
29
+ projection: 'equal-earth',
30
+ marks: [
31
+ Plot.geo(countries, {
32
+ // fill: d => console.log(d.properties?.iso2cd),
33
+ // title: d => d.properties?.iso2cd
34
+ // tip: true
35
+ })
36
+ ]
37
+ })
38
+ containerRef.current.append(plot)
39
+ return () => plot.remove()
40
+ }, [data])
41
+
42
+ return <svg ref={containerRef} style={{ width: '100%', height: '100%' }} />
43
+ }
44
 
45
+ export default WorldMap