mirror of
https://github.com/anomalyco/opencode.git
synced 2026-08-26 19:41:59 +00:00
fix map inaccuracy
This commit is contained in:
parent
13c27598d3
commit
3f31551fad
23 changed files with 1 additions and 445 deletions
23
bun.lock
23
bun.lock
|
|
@ -858,25 +858,18 @@
|
|||
"@solidjs/meta": "catalog:",
|
||||
"@solidjs/router": "catalog:",
|
||||
"@solidjs/start": "catalog:",
|
||||
"d3-geo": "3.1.1",
|
||||
"d3-scale": "4.0.2",
|
||||
"effect": "catalog:",
|
||||
"i18n-iso-countries": "7.14.0",
|
||||
"nitro": "3.0.1-alpha.1",
|
||||
"solid-js": "catalog:",
|
||||
"sst": "catalog:",
|
||||
"topojson-client": "3.1.0",
|
||||
"vite": "catalog:",
|
||||
"world-atlas": "2.0.2",
|
||||
},
|
||||
"devDependencies": {
|
||||
"@cloudflare/workers-types": "catalog:",
|
||||
"@types/bun": "catalog:",
|
||||
"@types/d3-geo": "3.1.0",
|
||||
"@types/d3-scale": "4.0.9",
|
||||
"@types/geojson": "7946.0.16",
|
||||
"@types/topojson-client": "3.1.5",
|
||||
"@types/topojson-specification": "1.0.5",
|
||||
"@typescript/native-preview": "catalog:",
|
||||
"typescript": "catalog:",
|
||||
},
|
||||
|
|
@ -2843,8 +2836,6 @@
|
|||
|
||||
"@types/cross-spawn": ["@types/cross-spawn@6.0.6", "", { "dependencies": { "@types/node": "*" } }, "sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA=="],
|
||||
|
||||
"@types/d3-geo": ["@types/d3-geo@3.1.0", "", { "dependencies": { "@types/geojson": "*" } }, "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ=="],
|
||||
|
||||
"@types/d3-scale": ["@types/d3-scale@4.0.9", "", { "dependencies": { "@types/d3-time": "*" } }, "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw=="],
|
||||
|
||||
"@types/d3-time": ["@types/d3-time@3.0.4", "", {}, "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g=="],
|
||||
|
|
@ -2865,8 +2856,6 @@
|
|||
|
||||
"@types/fs-extra": ["@types/fs-extra@9.0.13", "", { "dependencies": { "@types/node": "*" } }, "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA=="],
|
||||
|
||||
"@types/geojson": ["@types/geojson@7946.0.16", "", {}, "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg=="],
|
||||
|
||||
"@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="],
|
||||
|
||||
"@types/http-cache-semantics": ["@types/http-cache-semantics@4.2.0", "", {}, "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q=="],
|
||||
|
|
@ -2945,10 +2934,6 @@
|
|||
|
||||
"@types/ssri": ["@types/ssri@7.1.5", "", { "dependencies": { "@types/node": "*" } }, "sha512-odD/56S3B51liILSk5aXJlnYt99S6Rt9EFDDqGtJM26rKHApHcwyU/UoYHrzKkdkHMAIquGWCuHtQTbes+FRQw=="],
|
||||
|
||||
"@types/topojson-client": ["@types/topojson-client@3.1.5", "", { "dependencies": { "@types/geojson": "*", "@types/topojson-specification": "*" } }, "sha512-C79rySTyPxnQNNguTZNI1Ct4D7IXgvyAs3p9HPecnl6mNrJ5+UhvGNYcZfpROYV2lMHI48kJPxwR+F9C6c7nmw=="],
|
||||
|
||||
"@types/topojson-specification": ["@types/topojson-specification@1.0.5", "", { "dependencies": { "@types/geojson": "*" } }, "sha512-C7KvcQh+C2nr6Y2Ub4YfgvWvWCgP2nOQMtfhlnwsRL4pYmmwzBS7HclGiS87eQfDOU/DLQpX6GEscviaz4yLIQ=="],
|
||||
|
||||
"@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="],
|
||||
|
||||
"@types/tsscmp": ["@types/tsscmp@1.0.2", "", {}, "sha512-cy7BRSU8GYYgxjcx0Py+8lo5MthuDhlyu076KUcYzVNXL23luYgRHkMG2fIFEc6neckeh/ntP82mw+U4QjZq+g=="],
|
||||
|
|
@ -3437,8 +3422,6 @@
|
|||
|
||||
"d3-format": ["d3-format@3.1.2", "", {}, "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg=="],
|
||||
|
||||
"d3-geo": ["d3-geo@3.1.1", "", { "dependencies": { "d3-array": "2.5.0 - 3" } }, "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q=="],
|
||||
|
||||
"d3-interpolate": ["d3-interpolate@3.0.1", "", { "dependencies": { "d3-color": "1 - 3" } }, "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g=="],
|
||||
|
||||
"d3-scale": ["d3-scale@4.0.2", "", { "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", "d3-interpolate": "1.2.0 - 3", "d3-time": "2.1.1 - 3", "d3-time-format": "2 - 4" } }, "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ=="],
|
||||
|
|
@ -5317,8 +5300,6 @@
|
|||
|
||||
"toolbeam-docs-theme": ["toolbeam-docs-theme@0.4.8", "", { "peerDependencies": { "@astrojs/starlight": "^0.34.3", "astro": "^5.7.13" } }, "sha512-b+5ynEFp4Woe5a22hzNQm42lD23t13ZMihVxHbzjA50zdcM9aOSJTIjdJ0PDSd4/50HbBXcpHiQsz6rM4N88ww=="],
|
||||
|
||||
"topojson-client": ["topojson-client@3.1.0", "", { "dependencies": { "commander": "2" }, "bin": { "topo2geo": "bin/topo2geo", "topomerge": "bin/topomerge", "topoquantize": "bin/topoquantize" } }, "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw=="],
|
||||
|
||||
"tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="],
|
||||
|
||||
"traverse": ["traverse@0.3.9", "", {}, "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ=="],
|
||||
|
|
@ -5561,8 +5542,6 @@
|
|||
|
||||
"workerd": ["workerd@1.20251118.0", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20251118.0", "@cloudflare/workerd-darwin-arm64": "1.20251118.0", "@cloudflare/workerd-linux-64": "1.20251118.0", "@cloudflare/workerd-linux-arm64": "1.20251118.0", "@cloudflare/workerd-windows-64": "1.20251118.0" }, "bin": { "workerd": "bin/workerd" } }, "sha512-Om5ns0Lyx/LKtYI04IV0bjIrkBgoFNg0p6urzr2asekJlfP18RqFzyqMFZKf0i9Gnjtz/JfAS/Ol6tjCe5JJsQ=="],
|
||||
|
||||
"world-atlas": ["world-atlas@2.0.2", "", {}, "sha512-IXfV0qwlKXpckz1FhwXVwKRjiIhOnWttOskm5CtxMsjgE/MXAYRHWJqgXOpM8IkcPBoXnyTU5lFHcYa5ChG0LQ=="],
|
||||
|
||||
"wrangler": ["wrangler@4.50.0", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.4.0", "@cloudflare/unenv-preset": "2.7.11", "blake3-wasm": "2.1.5", "esbuild": "0.25.4", "miniflare": "4.20251118.1", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", "workerd": "1.20251118.0" }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@cloudflare/workers-types": "^4.20251118.0" }, "optionalPeers": ["@cloudflare/workers-types"], "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js" } }, "sha512-+nuZuHZxDdKmAyXOSrHlciGshCoAPiy5dM+t6mEohWm7HpXvTHmWQGUf/na9jjWlWJHCJYOWzkA1P5HBJqrIEA=="],
|
||||
|
||||
"wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="],
|
||||
|
|
@ -6515,8 +6494,6 @@
|
|||
|
||||
"tiny-async-pool/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="],
|
||||
|
||||
"topojson-client/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="],
|
||||
|
||||
"tree-sitter-bash/node-addon-api": ["node-addon-api@8.8.0", "", {}, "sha512-c5Ko1fZJIJmzhFIkhRN76WTq+fC6tWnGy9CXA0fA+XygsWZmEwG8vmbkNqxMyoaa0Tin4djul49NzdVcJJcjeA=="],
|
||||
|
||||
"tw-to-css/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="],
|
||||
|
|
|
|||
|
|
@ -19,25 +19,18 @@
|
|||
"@solidjs/meta": "catalog:",
|
||||
"@solidjs/router": "catalog:",
|
||||
"@solidjs/start": "catalog:",
|
||||
"d3-geo": "3.1.1",
|
||||
"d3-scale": "4.0.2",
|
||||
"effect": "catalog:",
|
||||
"i18n-iso-countries": "7.14.0",
|
||||
"nitro": "3.0.1-alpha.1",
|
||||
"solid-js": "catalog:",
|
||||
"sst": "catalog:",
|
||||
"topojson-client": "3.1.0",
|
||||
"vite": "catalog:",
|
||||
"world-atlas": "2.0.2"
|
||||
"vite": "catalog:"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@cloudflare/workers-types": "catalog:",
|
||||
"@types/bun": "catalog:",
|
||||
"@types/d3-geo": "3.1.0",
|
||||
"@types/d3-scale": "4.0.9",
|
||||
"@types/geojson": "7946.0.16",
|
||||
"@types/topojson-client": "3.1.5",
|
||||
"@types/topojson-specification": "1.0.5",
|
||||
"@typescript/native-preview": "catalog:",
|
||||
"typescript": "catalog:"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -129,8 +129,6 @@ const en = {
|
|||
"home.geoTitle": "Geographic Breakdown",
|
||||
"home.noGeoTitle": "No geo data",
|
||||
"home.noGeoDescription": "No geo rows matched this range.",
|
||||
"home.worldMap": "World map of token usage by country",
|
||||
"home.geoMapTitle": "Geo Breakdown map",
|
||||
"home.unknown": "Unknown",
|
||||
"home.tokenCostTitle": "Token Cost",
|
||||
"home.tokenCostDescription": "Price per 1M tokens.",
|
||||
|
|
@ -238,7 +236,6 @@ const en = {
|
|||
"model.geoDescription": "OpenCode model tokens used by country.",
|
||||
"model.noGeoTitle": "No geo data",
|
||||
"model.noGeoDescription": "No OpenCode geo rows matched this model.",
|
||||
"model.worldMap": "World map of model token usage by country",
|
||||
"model.peersDescription": "Nearby models by recent OpenCode token volume.",
|
||||
"model.noPeersTitle": "No peers",
|
||||
"model.noPeersDescription": "Peer rankings appear after usage lands.",
|
||||
|
|
|
|||
|
|
@ -110,8 +110,6 @@ export const dict = {
|
|||
"home.geoTitle": "التوزيع الجغرافي",
|
||||
"home.noGeoTitle": "لا توجد بيانات جغرافية",
|
||||
"home.noGeoDescription": "لم تطابق أي صفوف جغرافية هذا النطاق.",
|
||||
"home.worldMap": "خريطة عالمية لاستخدام الرموز حسب البلد",
|
||||
"home.geoMapTitle": "خريطة التوزيع الجغرافي",
|
||||
"home.unknown": "غير معروف",
|
||||
"home.tokenCostTitle": "تكلفة الرموز",
|
||||
"home.tokenCostDescription": "السعر لكل مليون رمز.",
|
||||
|
|
@ -218,7 +216,6 @@ export const dict = {
|
|||
"model.geoDescription": "رموز نموذج OpenCode المستخدمة حسب البلد.",
|
||||
"model.noGeoTitle": "لا توجد بيانات جغرافية",
|
||||
"model.noGeoDescription": "لم تطابق أي صفوف جغرافية في OpenCode هذا النموذج.",
|
||||
"model.worldMap": "خريطة عالمية لاستخدام رموز النموذج حسب البلد",
|
||||
"model.peersDescription": "نماذج قريبة حسب حجم رموز OpenCode الأخير.",
|
||||
"model.noPeersTitle": "لا توجد نماذج مشابهة",
|
||||
"model.noPeersDescription": "تظهر ترتيبات النماذج المشابهة بعد وصول الاستخدام.",
|
||||
|
|
|
|||
|
|
@ -111,8 +111,6 @@ export const dict = {
|
|||
"home.geoTitle": "Distribuição geográfica",
|
||||
"home.noGeoTitle": "Sem dados geográficos",
|
||||
"home.noGeoDescription": "Nenhuma linha geográfica correspondeu a este intervalo.",
|
||||
"home.worldMap": "Mapa-múndi do uso de tokens por país",
|
||||
"home.geoMapTitle": "Mapa da distribuição geográfica",
|
||||
"home.unknown": "Desconhecido",
|
||||
"home.tokenCostTitle": "Custo de tokens",
|
||||
"home.tokenCostDescription": "Preço por 1 milhão de tokens.",
|
||||
|
|
@ -221,7 +219,6 @@ export const dict = {
|
|||
"model.geoDescription": "Tokens do modelo OpenCode usados por país.",
|
||||
"model.noGeoTitle": "Sem dados geográficos",
|
||||
"model.noGeoDescription": "Nenhuma linha geográfica do OpenCode correspondeu a este modelo.",
|
||||
"model.worldMap": "Mapa-múndi do uso de tokens do modelo por país",
|
||||
"model.peersDescription": "Modelos próximos por volume recente de tokens do OpenCode.",
|
||||
"model.noPeersTitle": "Sem pares",
|
||||
"model.noPeersDescription": "Os rankings de pares aparecem depois que o uso chega.",
|
||||
|
|
|
|||
|
|
@ -111,8 +111,6 @@ export const dict = {
|
|||
"home.geoTitle": "Geografisk opdeling",
|
||||
"home.noGeoTitle": "Ingen geodata",
|
||||
"home.noGeoDescription": "Ingen georækker matchede dette interval.",
|
||||
"home.worldMap": "Verdenskort over tokenbrug efter land",
|
||||
"home.geoMapTitle": "Kort over geografisk opdeling",
|
||||
"home.unknown": "Ukendt",
|
||||
"home.tokenCostTitle": "Tokenomkostning",
|
||||
"home.tokenCostDescription": "Pris pr. 1 mio. tokens.",
|
||||
|
|
@ -219,7 +217,6 @@ export const dict = {
|
|||
"model.geoDescription": "OpenCode-modeltokens brugt efter land.",
|
||||
"model.noGeoTitle": "Ingen geodata",
|
||||
"model.noGeoDescription": "Ingen OpenCode-georækker matchede denne model.",
|
||||
"model.worldMap": "Verdenskort over modeltokenbrug efter land",
|
||||
"model.peersDescription": "Nærliggende modeller efter seneste OpenCode-tokenvolumen.",
|
||||
"model.noPeersTitle": "Ingen lignende modeller",
|
||||
"model.noPeersDescription": "Ranglister over lignende modeller vises, når brug lander.",
|
||||
|
|
|
|||
|
|
@ -111,8 +111,6 @@ export const dict = {
|
|||
"home.geoTitle": "Geografische Aufschlüsselung",
|
||||
"home.noGeoTitle": "Keine Geodaten",
|
||||
"home.noGeoDescription": "Keine Geozeilen passten zu diesem Zeitraum.",
|
||||
"home.worldMap": "Weltkarte der Tokennutzung nach Land",
|
||||
"home.geoMapTitle": "Karte der geografischen Aufschlüsselung",
|
||||
"home.unknown": "Unbekannt",
|
||||
"home.tokenCostTitle": "Tokenkosten",
|
||||
"home.tokenCostDescription": "Preis pro 1 Mio. Tokens.",
|
||||
|
|
@ -221,7 +219,6 @@ export const dict = {
|
|||
"model.geoDescription": "OpenCode-Modelltokens nach Land.",
|
||||
"model.noGeoTitle": "Keine Geodaten",
|
||||
"model.noGeoDescription": "Keine OpenCode-Geozeilen passten zu diesem Modell.",
|
||||
"model.worldMap": "Weltkarte der Modelltokennutzung nach Land",
|
||||
"model.peersDescription": "Nahe Modelle nach aktuellem OpenCode-Tokenvolumen.",
|
||||
"model.noPeersTitle": "Keine Vergleichsmodelle",
|
||||
"model.noPeersDescription": "Vergleichsrankings erscheinen, nachdem Nutzung eingegangen ist.",
|
||||
|
|
|
|||
|
|
@ -110,8 +110,6 @@ export const dict = {
|
|||
"home.geoTitle": "Desglose geográfico",
|
||||
"home.noGeoTitle": "Sin datos geográficos",
|
||||
"home.noGeoDescription": "Ninguna fila geográfica coincidió con este rango.",
|
||||
"home.worldMap": "Mapa mundial del uso de tokens por país",
|
||||
"home.geoMapTitle": "Mapa de desglose geográfico",
|
||||
"home.unknown": "Desconocido",
|
||||
"home.tokenCostTitle": "Coste de tokens",
|
||||
"home.tokenCostDescription": "Precio por 1 M de tokens.",
|
||||
|
|
@ -220,7 +218,6 @@ export const dict = {
|
|||
"model.geoDescription": "Tokens del modelo de OpenCode usados por país.",
|
||||
"model.noGeoTitle": "Sin datos geográficos",
|
||||
"model.noGeoDescription": "Ninguna fila geográfica de OpenCode coincidió con este modelo.",
|
||||
"model.worldMap": "Mapa mundial del uso de tokens del modelo por país",
|
||||
"model.peersDescription": "Modelos cercanos por volumen reciente de tokens de OpenCode.",
|
||||
"model.noPeersTitle": "Sin modelos similares",
|
||||
"model.noPeersDescription": "Las clasificaciones de modelos similares aparecen después de que llegue uso.",
|
||||
|
|
|
|||
|
|
@ -111,8 +111,6 @@ export const dict = {
|
|||
"home.geoTitle": "Répartition géographique",
|
||||
"home.noGeoTitle": "Aucune donnée géographique",
|
||||
"home.noGeoDescription": "Aucune ligne géographique ne correspondait à cette période.",
|
||||
"home.worldMap": "Carte mondiale de l'utilisation des tokens par pays",
|
||||
"home.geoMapTitle": "Carte de répartition géographique",
|
||||
"home.unknown": "Inconnu",
|
||||
"home.tokenCostTitle": "Coût des tokens",
|
||||
"home.tokenCostDescription": "Prix par million de tokens.",
|
||||
|
|
@ -222,7 +220,6 @@ export const dict = {
|
|||
"model.geoDescription": "Tokens du modèle OpenCode utilisés par pays.",
|
||||
"model.noGeoTitle": "Aucune donnée géographique",
|
||||
"model.noGeoDescription": "Aucune ligne géographique OpenCode ne correspondait à ce modèle.",
|
||||
"model.worldMap": "Carte mondiale de l'utilisation des tokens du modèle par pays",
|
||||
"model.peersDescription": "Modèles proches par volume récent de tokens OpenCode.",
|
||||
"model.noPeersTitle": "Aucun modèle proche",
|
||||
"model.noPeersDescription": "Les classements de modèles proches apparaissent après l'arrivée de l'utilisation.",
|
||||
|
|
|
|||
|
|
@ -111,8 +111,6 @@ export const dict = {
|
|||
"home.geoTitle": "Ripartizione geografica",
|
||||
"home.noGeoTitle": "Nessun dato geografico",
|
||||
"home.noGeoDescription": "Nessuna riga geografica corrispondeva a questo intervallo.",
|
||||
"home.worldMap": "Mappa mondiale dell'utilizzo dei token per paese",
|
||||
"home.geoMapTitle": "Mappa della ripartizione geografica",
|
||||
"home.unknown": "Sconosciuto",
|
||||
"home.tokenCostTitle": "Costo token",
|
||||
"home.tokenCostDescription": "Prezzo per 1 M di token.",
|
||||
|
|
@ -221,7 +219,6 @@ export const dict = {
|
|||
"model.geoDescription": "Token del modello OpenCode usati per paese.",
|
||||
"model.noGeoTitle": "Nessun dato geografico",
|
||||
"model.noGeoDescription": "Nessuna riga geografica OpenCode corrispondeva a questo modello.",
|
||||
"model.worldMap": "Mappa mondiale dell'utilizzo dei token del modello per paese",
|
||||
"model.peersDescription": "Modelli vicini per volume recente di token OpenCode.",
|
||||
"model.noPeersTitle": "Nessun modello simile",
|
||||
"model.noPeersDescription": "Le classifiche dei modelli simili appaiono dopo l'arrivo dell'utilizzo.",
|
||||
|
|
|
|||
|
|
@ -113,8 +113,6 @@ export const dict = {
|
|||
"home.geoTitle": "地域別内訳",
|
||||
"home.noGeoTitle": "地域データがありません",
|
||||
"home.noGeoDescription": "この期間に一致する地域行はありません。",
|
||||
"home.worldMap": "国別トークン使用量の世界地図",
|
||||
"home.geoMapTitle": "地域別内訳マップ",
|
||||
"home.unknown": "不明",
|
||||
"home.tokenCostTitle": "トークンコスト",
|
||||
"home.tokenCostDescription": "100万トークンあたりの価格。",
|
||||
|
|
@ -222,7 +220,6 @@ export const dict = {
|
|||
"model.geoDescription": "国別のOpenCodeモデルのトークン使用量。",
|
||||
"model.noGeoTitle": "地域データがありません",
|
||||
"model.noGeoDescription": "このモデルに一致するOpenCode地域行はありません。",
|
||||
"model.worldMap": "国別モデル別トークン使用量の世界地図",
|
||||
"model.peersDescription": "最近のOpenCodeトークン量が近いモデル。",
|
||||
"model.noPeersTitle": "類似モデルがありません",
|
||||
"model.noPeersDescription": "使用量が届くと類似モデルのランキングが表示されます。",
|
||||
|
|
|
|||
|
|
@ -113,8 +113,6 @@ export const dict = {
|
|||
"home.geoTitle": "지역별 분포",
|
||||
"home.noGeoTitle": "지역 데이터 없음",
|
||||
"home.noGeoDescription": "이 범위에 맞는 지역 행이 없습니다.",
|
||||
"home.worldMap": "국가별 토큰 사용량 세계 지도",
|
||||
"home.geoMapTitle": "지역별 분포 지도",
|
||||
"home.unknown": "알 수 없음",
|
||||
"home.tokenCostTitle": "토큰 비용",
|
||||
"home.tokenCostDescription": "100만 토큰당 가격입니다.",
|
||||
|
|
@ -221,7 +219,6 @@ export const dict = {
|
|||
"model.geoDescription": "국가별 OpenCode 모델 토큰 사용량입니다.",
|
||||
"model.noGeoTitle": "지역 데이터 없음",
|
||||
"model.noGeoDescription": "이 모델과 일치하는 OpenCode 지역 행이 없습니다.",
|
||||
"model.worldMap": "국가별 모델 토큰 사용량 세계 지도",
|
||||
"model.peersDescription": "최근 OpenCode 토큰 볼륨이 가까운 모델입니다.",
|
||||
"model.noPeersTitle": "비슷한 모델 없음",
|
||||
"model.noPeersDescription": "사용량이 들어오면 비슷한 모델 순위가 표시됩니다.",
|
||||
|
|
|
|||
|
|
@ -111,8 +111,6 @@ export const dict = {
|
|||
"home.geoTitle": "Geografisk fordeling",
|
||||
"home.noGeoTitle": "Ingen geodata",
|
||||
"home.noGeoDescription": "Ingen georader matchet dette intervallet.",
|
||||
"home.worldMap": "Verdenskart over tokenbruk etter land",
|
||||
"home.geoMapTitle": "Kart over geografisk fordeling",
|
||||
"home.unknown": "Ukjent",
|
||||
"home.tokenCostTitle": "Tokenkostnad",
|
||||
"home.tokenCostDescription": "Pris per 1 mill. tokens.",
|
||||
|
|
@ -220,7 +218,6 @@ export const dict = {
|
|||
"model.geoDescription": "OpenCode-modelltokens brukt etter land.",
|
||||
"model.noGeoTitle": "Ingen geodata",
|
||||
"model.noGeoDescription": "Ingen OpenCode-georader matchet denne modellen.",
|
||||
"model.worldMap": "Verdenskart over modelltokenbruk etter land",
|
||||
"model.peersDescription": "Nærliggende modeller etter nylig OpenCode-tokenvolum.",
|
||||
"model.noPeersTitle": "Ingen lignende modeller",
|
||||
"model.noPeersDescription": "Rangeringer for lignende modeller vises etter at bruk lander.",
|
||||
|
|
|
|||
|
|
@ -110,8 +110,6 @@ export const dict = {
|
|||
"home.geoTitle": "Podział geograficzny",
|
||||
"home.noGeoTitle": "Brak danych geograficznych",
|
||||
"home.noGeoDescription": "Żadne wiersze geograficzne nie pasowały do tego zakresu.",
|
||||
"home.worldMap": "Mapa świata użycia tokenów według kraju",
|
||||
"home.geoMapTitle": "Mapa podziału geograficznego",
|
||||
"home.unknown": "Nieznane",
|
||||
"home.tokenCostTitle": "Koszt tokenów",
|
||||
"home.tokenCostDescription": "Cena za 1 mln tokenów.",
|
||||
|
|
@ -219,7 +217,6 @@ export const dict = {
|
|||
"model.geoDescription": "Tokeny modelu OpenCode użyte według kraju.",
|
||||
"model.noGeoTitle": "Brak danych geograficznych",
|
||||
"model.noGeoDescription": "Żadne wiersze geograficzne OpenCode nie pasowały do tego modelu.",
|
||||
"model.worldMap": "Mapa świata użycia tokenów modelu według kraju",
|
||||
"model.peersDescription": "Pobliskie modele według ostatniego wolumenu tokenów OpenCode.",
|
||||
"model.noPeersTitle": "Brak podobnych modeli",
|
||||
"model.noPeersDescription": "Rankingi podobnych modeli pojawią się po nadejściu użycia.",
|
||||
|
|
|
|||
|
|
@ -111,8 +111,6 @@ export const dict = {
|
|||
"home.geoTitle": "Географический разрез",
|
||||
"home.noGeoTitle": "Нет геоданных",
|
||||
"home.noGeoDescription": "Нет географических строк для этого диапазона.",
|
||||
"home.worldMap": "Карта мира использования токенов по странам",
|
||||
"home.geoMapTitle": "Карта географического разреза",
|
||||
"home.unknown": "Неизвестно",
|
||||
"home.tokenCostTitle": "Стоимость токенов",
|
||||
"home.tokenCostDescription": "Цена за 1 млн токенов.",
|
||||
|
|
@ -221,7 +219,6 @@ export const dict = {
|
|||
"model.geoDescription": "Токены модели OpenCode, использованные по странам.",
|
||||
"model.noGeoTitle": "Нет геоданных",
|
||||
"model.noGeoDescription": "Нет географических строк OpenCode для этой модели.",
|
||||
"model.worldMap": "Карта мира использования токенов модели по странам",
|
||||
"model.peersDescription": "Близкие модели по недавнему объему токенов OpenCode.",
|
||||
"model.noPeersTitle": "Нет похожих моделей",
|
||||
"model.noPeersDescription": "Рейтинги похожих моделей появятся после использования.",
|
||||
|
|
|
|||
|
|
@ -112,8 +112,6 @@ export const dict = {
|
|||
"home.geoTitle": "แยกตามภูมิศาสตร์",
|
||||
"home.noGeoTitle": "ไม่มีข้อมูลภูมิศาสตร์",
|
||||
"home.noGeoDescription": "ไม่มีแถวภูมิศาสตร์ที่ตรงกับช่วงเวลานี้",
|
||||
"home.worldMap": "แผนที่โลกของการใช้ token แยกตามประเทศ",
|
||||
"home.geoMapTitle": "แผนที่แยกตามภูมิศาสตร์",
|
||||
"home.unknown": "ไม่ทราบ",
|
||||
"home.tokenCostTitle": "ต้นทุน Token",
|
||||
"home.tokenCostDescription": "ราคาต่อ 1 ล้าน token",
|
||||
|
|
@ -221,7 +219,6 @@ export const dict = {
|
|||
"model.geoDescription": "token ของโมเดล OpenCode ที่ใช้แยกตามประเทศ",
|
||||
"model.noGeoTitle": "ไม่มีข้อมูลภูมิศาสตร์",
|
||||
"model.noGeoDescription": "ไม่มีแถวภูมิศาสตร์ของ OpenCode ที่ตรงกับโมเดลนี้",
|
||||
"model.worldMap": "แผนที่โลกของการใช้ token ของโมเดลแยกตามประเทศ",
|
||||
"model.peersDescription": "โมเดลใกล้เคียงตามปริมาณ token ล่าสุดของ OpenCode",
|
||||
"model.noPeersTitle": "ไม่มีโมเดลใกล้เคียง",
|
||||
"model.noPeersDescription": "อันดับโมเดลใกล้เคียงจะแสดงหลังจากมีการใช้งานเข้ามา",
|
||||
|
|
|
|||
|
|
@ -111,8 +111,6 @@ export const dict = {
|
|||
"home.geoTitle": "Coğrafi Dağılım",
|
||||
"home.noGeoTitle": "Coğrafi veri yok",
|
||||
"home.noGeoDescription": "Bu aralıkla eşleşen coğrafi satır yok.",
|
||||
"home.worldMap": "Ülkeye göre token kullanımının dünya haritası",
|
||||
"home.geoMapTitle": "Coğrafi Dağılım haritası",
|
||||
"home.unknown": "Bilinmiyor",
|
||||
"home.tokenCostTitle": "Token Maliyeti",
|
||||
"home.tokenCostDescription": "1 milyon token başına fiyat.",
|
||||
|
|
@ -221,7 +219,6 @@ export const dict = {
|
|||
"model.geoDescription": "Ülkeye göre kullanılan OpenCode model tokenları.",
|
||||
"model.noGeoTitle": "Coğrafi veri yok",
|
||||
"model.noGeoDescription": "Bu modelle eşleşen OpenCode coğrafi satırı yok.",
|
||||
"model.worldMap": "Ülkeye göre model token kullanımının dünya haritası",
|
||||
"model.peersDescription": "Son OpenCode token hacmine göre yakındaki modeller.",
|
||||
"model.noPeersTitle": "Benzer yok",
|
||||
"model.noPeersDescription": "Benzer model sıralamaları kullanım geldikten sonra görünür.",
|
||||
|
|
|
|||
|
|
@ -111,8 +111,6 @@ export const dict = {
|
|||
"home.geoTitle": "Географічний розріз",
|
||||
"home.noGeoTitle": "Немає геоданих",
|
||||
"home.noGeoDescription": "Жодні географічні рядки не відповідали цьому діапазону.",
|
||||
"home.worldMap": "Карта світу використання токенів за країнами",
|
||||
"home.geoMapTitle": "Карта географічного розрізу",
|
||||
"home.unknown": "Невідомо",
|
||||
"home.tokenCostTitle": "Вартість токенів",
|
||||
"home.tokenCostDescription": "Ціна за 1 млн токенів.",
|
||||
|
|
@ -221,7 +219,6 @@ export const dict = {
|
|||
"model.geoDescription": "Токени моделі OpenCode, використані за країнами.",
|
||||
"model.noGeoTitle": "Немає геоданих",
|
||||
"model.noGeoDescription": "Жодні географічні рядки OpenCode не відповідали цій моделі.",
|
||||
"model.worldMap": "Карта світу використання токенів моделі за країнами",
|
||||
"model.peersDescription": "Близькі моделі за нещодавнім обсягом токенів OpenCode.",
|
||||
"model.noPeersTitle": "Немає схожих моделей",
|
||||
"model.noPeersDescription": "Рейтинги схожих моделей з'являться після використання.",
|
||||
|
|
|
|||
|
|
@ -112,8 +112,6 @@ export const dict = {
|
|||
"home.geoTitle": "地理分布",
|
||||
"home.noGeoTitle": "无地理数据",
|
||||
"home.noGeoDescription": "没有符合该时间范围的地理行。",
|
||||
"home.worldMap": "按国家/地区显示 token 使用量的世界地图",
|
||||
"home.geoMapTitle": "地理分布地图",
|
||||
"home.unknown": "未知",
|
||||
"home.tokenCostTitle": "Token 成本",
|
||||
"home.tokenCostDescription": "每 100 万 token 的价格。",
|
||||
|
|
@ -220,7 +218,6 @@ export const dict = {
|
|||
"model.geoDescription": "按国家/地区统计的 OpenCode 模型 token 使用量。",
|
||||
"model.noGeoTitle": "无地理数据",
|
||||
"model.noGeoDescription": "没有符合此模型的 OpenCode 地理行。",
|
||||
"model.worldMap": "按国家/地区显示模型 token 使用量的世界地图",
|
||||
"model.peersDescription": "按近期 OpenCode token 用量排列的相近模型。",
|
||||
"model.noPeersTitle": "无同类模型",
|
||||
"model.noPeersDescription": "使用量到达后会显示同类模型排名。",
|
||||
|
|
|
|||
|
|
@ -112,8 +112,6 @@ export const dict = {
|
|||
"home.geoTitle": "地理分布",
|
||||
"home.noGeoTitle": "無地理數據",
|
||||
"home.noGeoDescription": "沒有符合該時間範圍的地理列。",
|
||||
"home.worldMap": "按國家/地區顯示 token 使用量的世界地圖",
|
||||
"home.geoMapTitle": "地理分布地圖",
|
||||
"home.unknown": "未知",
|
||||
"home.tokenCostTitle": "Token 成本",
|
||||
"home.tokenCostDescription": "每 100 萬 token 的價格。",
|
||||
|
|
@ -220,7 +218,6 @@ export const dict = {
|
|||
"model.geoDescription": "按國家/地區統計的 OpenCode 模型 token 使用量。",
|
||||
"model.noGeoTitle": "無地理數據",
|
||||
"model.noGeoDescription": "沒有符合此模型的 OpenCode 地理列。",
|
||||
"model.worldMap": "按國家/地區顯示模型 token 使用量的世界地圖",
|
||||
"model.peersDescription": "按近期 OpenCode token 用量排列的相近模型。",
|
||||
"model.noPeersTitle": "無同類模型",
|
||||
"model.noPeersDescription": "使用量到達後會顯示同類模型排名。",
|
||||
|
|
|
|||
|
|
@ -17,7 +17,6 @@ import { useI18n } from "../../context/i18n"
|
|||
import { useLanguage } from "../../context/language"
|
||||
import { localizedUrl } from "../../lib/language"
|
||||
import { findModelCatalogEntry, formatCatalogLabName, loadModelCatalog, type ModelCatalogEntry } from "../model-catalog"
|
||||
import { geoMapHeight, geoMapWidth, worldBorderPath, worldCountryMarkers, worldCountryPaths } from "../geo-map"
|
||||
import { SectionHeading } from "../section-heading"
|
||||
import { runStatsEffect } from "../../stats-runtime"
|
||||
import { setStatsPageCacheHeaders } from "../stats-cache"
|
||||
|
|
@ -892,21 +891,10 @@ function ModelEfficiencySection(props: { data: StatsModelPageData | null; catalo
|
|||
|
||||
function ModelGeoBreakdownSection(props: { data: CountryEntry[] }) {
|
||||
const i18n = useI18n()
|
||||
const language = useLanguage()
|
||||
const [activeCountry, setActiveCountry] = createSignal<string>()
|
||||
const data = createMemo(() => props.data)
|
||||
const countryById = createMemo(
|
||||
() =>
|
||||
new Map(
|
||||
data().flatMap((country) => {
|
||||
const id = countryNumericId(country.country)
|
||||
return id ? [[id, country] as const] : []
|
||||
}),
|
||||
),
|
||||
)
|
||||
const maxTokens = createMemo(() => Math.max(0, ...data().map((country) => country.tokens)) || 1)
|
||||
const topCountries = createMemo(() => data().slice(0, 15))
|
||||
const active = createMemo(() => data().find((country) => country.country === activeCountry()) ?? data()[0])
|
||||
|
||||
return (
|
||||
<section
|
||||
|
|
@ -927,26 +915,6 @@ function ModelGeoBreakdownSection(props: { data: CountryEntry[] }) {
|
|||
fallback={<ModelEmptyState title={i18n.t("model.noGeoTitle")} description={i18n.t("model.noGeoDescription")} />}
|
||||
>
|
||||
<div data-component="geo-breakdown">
|
||||
<div data-slot="geo-map-panel">
|
||||
<GeoWorldMap
|
||||
countryById={countryById()}
|
||||
activeCountry={activeCountry()}
|
||||
maxTokens={maxTokens()}
|
||||
onActiveCountryChange={setActiveCountry}
|
||||
/>
|
||||
<Show when={active()}>
|
||||
{(country) => (
|
||||
<div data-slot="geo-active-country">
|
||||
<span>#{String(country().rank).padStart(2, "0")}</span>
|
||||
<strong>{formatCountryName(country().country, language.tag(language.locale()), i18n)}</strong>
|
||||
<p>
|
||||
<b>{formatGeoTokens(country().tokens)}</b>
|
||||
<em>{formatGeoShare(country().share)}</em>
|
||||
</p>
|
||||
</div>
|
||||
)}
|
||||
</Show>
|
||||
</div>
|
||||
<GeoCountryList
|
||||
data={topCountries()}
|
||||
activeCountry={activeCountry()}
|
||||
|
|
@ -959,92 +927,6 @@ function ModelGeoBreakdownSection(props: { data: CountryEntry[] }) {
|
|||
)
|
||||
}
|
||||
|
||||
function GeoWorldMap(props: {
|
||||
countryById: Map<string, CountryEntry>
|
||||
activeCountry: string | undefined
|
||||
maxTokens: number
|
||||
onActiveCountryChange: (country: string | undefined) => void
|
||||
}) {
|
||||
const i18n = useI18n()
|
||||
const opacityScale = createMemo(() => scaleSqrt().domain([0, props.maxTokens]).range([0.26, 0.96]).clamp(true))
|
||||
const countryOpacity = (country: CountryEntry | undefined) => {
|
||||
if (!country || country.tokens <= 0) return 0
|
||||
const opacity = opacityScale()(country.tokens)
|
||||
if (props.activeCountry === country.country) return 1
|
||||
if (!props.activeCountry) return opacity
|
||||
return Math.max(0.18, opacity * 0.36)
|
||||
}
|
||||
|
||||
return (
|
||||
<svg
|
||||
data-component="geo-world-map"
|
||||
viewBox={`0 0 ${geoMapWidth} ${geoMapHeight}`}
|
||||
role="img"
|
||||
aria-label={i18n.t("model.worldMap")}
|
||||
>
|
||||
<title>{i18n.t("home.geoMapTitle")}</title>
|
||||
<g data-slot="geo-countries">
|
||||
<For each={worldCountryPaths}>
|
||||
{(country) => {
|
||||
const entry = () => props.countryById.get(country.id)
|
||||
return (
|
||||
<path
|
||||
d={country.path}
|
||||
data-country-id={country.id}
|
||||
data-has-data={entry() ? "true" : undefined}
|
||||
data-active={entry()?.country === props.activeCountry ? "true" : undefined}
|
||||
style={{ "--geo-country-opacity": String(countryOpacity(entry())) } as JSX.CSSProperties}
|
||||
aria-hidden="true"
|
||||
onPointerEnter={() => {
|
||||
const item = entry()
|
||||
if (!item) return
|
||||
props.onActiveCountryChange(item.country)
|
||||
}}
|
||||
onClick={() => {
|
||||
const item = entry()
|
||||
if (!item) return
|
||||
props.onActiveCountryChange(item.country)
|
||||
}}
|
||||
/>
|
||||
)
|
||||
}}
|
||||
</For>
|
||||
</g>
|
||||
<g data-slot="geo-country-markers">
|
||||
<For each={worldCountryMarkers}>
|
||||
{(country) => {
|
||||
const entry = () => props.countryById.get(country.id)
|
||||
return (
|
||||
<Show when={entry()}>
|
||||
<circle
|
||||
cx={country.marker.x}
|
||||
cy={country.marker.y}
|
||||
data-country-id={country.id}
|
||||
r={entry()?.country === props.activeCountry ? 3.4 : 2.4}
|
||||
data-active={entry()?.country === props.activeCountry ? "true" : undefined}
|
||||
style={{ "--geo-country-opacity": String(countryOpacity(entry())) } as JSX.CSSProperties}
|
||||
aria-hidden="true"
|
||||
onPointerEnter={() => {
|
||||
const item = entry()
|
||||
if (!item) return
|
||||
props.onActiveCountryChange(item.country)
|
||||
}}
|
||||
onClick={() => {
|
||||
const item = entry()
|
||||
if (!item) return
|
||||
props.onActiveCountryChange(item.country)
|
||||
}}
|
||||
/>
|
||||
</Show>
|
||||
)
|
||||
}}
|
||||
</For>
|
||||
</g>
|
||||
<path data-slot="geo-borders" d={worldBorderPath} aria-hidden="true" />
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
|
||||
function GeoCountryList(props: {
|
||||
data: CountryEntry[]
|
||||
activeCountry: string | undefined
|
||||
|
|
|
|||
|
|
@ -1,120 +0,0 @@
|
|||
import { geoEquirectangular, geoPath } from "d3-geo"
|
||||
import { feature, mesh } from "topojson-client"
|
||||
import countriesTopologySource from "world-atlas/countries-110m.json?raw"
|
||||
import type { FeatureCollection, GeometryObject, GeoJsonProperties } from "geojson"
|
||||
import type { GeometryCollection, Topology } from "topojson-specification"
|
||||
|
||||
export const geoMapWidth = 960
|
||||
export const geoMapHeight = 430
|
||||
|
||||
type WorldCountryProperties = GeoJsonProperties & { name?: string }
|
||||
type WorldTopology = Topology<{ countries: GeometryCollection<WorldCountryProperties> }>
|
||||
|
||||
const worldTopology = JSON.parse(countriesTopologySource) as WorldTopology
|
||||
const worldCountryGeometries: GeometryCollection<WorldCountryProperties> = {
|
||||
...worldTopology.objects.countries,
|
||||
geometries: worldTopology.objects.countries.geometries.filter((country) => String(country.id ?? "") !== "010"),
|
||||
}
|
||||
const worldCountries = feature<WorldCountryProperties>(worldTopology, worldCountryGeometries) as FeatureCollection<
|
||||
GeometryObject,
|
||||
WorldCountryProperties
|
||||
>
|
||||
const worldProjection = geoEquirectangular().fitExtent(
|
||||
[
|
||||
[10, 12],
|
||||
[geoMapWidth - 10, geoMapHeight - 12],
|
||||
],
|
||||
worldCountries,
|
||||
)
|
||||
const worldPath = geoPath(worldProjection)
|
||||
|
||||
export const worldCountryPaths = worldCountries.features.map((country) => ({
|
||||
id: String(country.id ?? "").padStart(3, "0"),
|
||||
path: worldPath(country) ?? "",
|
||||
}))
|
||||
|
||||
export const worldBorderPath = worldPath(mesh(worldTopology, worldCountryGeometries, (a, b) => a !== b)) ?? ""
|
||||
|
||||
function geoCountryMarker(country: (typeof worldCountries.features)[number]) {
|
||||
const bounds = worldPath.bounds(country)
|
||||
const [x, y] = worldPath.centroid(country)
|
||||
if (!Number.isFinite(x) || !Number.isFinite(y)) return undefined
|
||||
if (bounds[1][0] - bounds[0][0] >= 3 && bounds[1][1] - bounds[0][1] >= 3) return undefined
|
||||
return { x, y }
|
||||
}
|
||||
|
||||
// The 110m topology omits small regions. Geographic centroids keep those countries interactive without shipping 50m paths.
|
||||
const fallbackCountryMarkerCoordinates = [
|
||||
["016", -170.7179, -14.3046],
|
||||
["020", 1.5606, 42.542],
|
||||
["028", -61.7945, 17.2762],
|
||||
["048", 50.5425, 26.0417],
|
||||
["052", -59.5602, 13.1811],
|
||||
["060", -64.7558, 32.3131],
|
||||
["086", 72.4453, -7.3312],
|
||||
["092", -64.4704, 18.5276],
|
||||
["132", -23.9576, 15.9551],
|
||||
["136", -80.9129, 19.43],
|
||||
["174", 43.6844, -11.879],
|
||||
["184", -159.7871, -21.2195],
|
||||
["212", -61.3576, 15.4394],
|
||||
["234", -6.8808, 62.0527],
|
||||
["239", -36.4863, -54.4641],
|
||||
["248", 19.9528, 60.2153],
|
||||
["258", -144.8045, -14.7283],
|
||||
["296", -167.9217, 0.893],
|
||||
["308", -61.6818, 12.1174],
|
||||
["316", 144.767, 13.4406],
|
||||
["334", 73.52, -53.0872],
|
||||
["336", 12.4343, 41.9021],
|
||||
["344", 114.1143, 22.3983],
|
||||
["438", 9.5357, 47.1367],
|
||||
["446", 113.509, 22.2231],
|
||||
["462", 73.4573, 3.7316],
|
||||
["470", 14.405, 35.9215],
|
||||
["480", 57.5714, -20.2779],
|
||||
["492", 7.4073, 43.7526],
|
||||
["500", -62.1856, 16.7404],
|
||||
["520", 166.9326, -0.5189],
|
||||
["531", -68.9721, 12.1957],
|
||||
["533", -69.9827, 12.521],
|
||||
["534", -63.0572, 18.0509],
|
||||
["570", -169.8704, -19.0489],
|
||||
["574", 167.9497, -29.0516],
|
||||
["580", 145.6193, 15.8288],
|
||||
["583", 153.2966, 7.5361],
|
||||
["584", 170.3313, 7.015],
|
||||
["585", 134.4056, 7.286],
|
||||
["612", -128.3167, -24.3649],
|
||||
["652", -62.841, 17.8988],
|
||||
["654", -9.7009, -12.3548],
|
||||
["659", -62.6873, 17.2647],
|
||||
["660", -63.066, 18.2243],
|
||||
["662", -60.9696, 13.8946],
|
||||
["663", -63.0599, 18.0888],
|
||||
["666", -56.3037, 46.9187],
|
||||
["670", -61.2008, 13.2251],
|
||||
["674", 12.4594, 43.9415],
|
||||
["678", 6.7235, 0.4434],
|
||||
["690", 55.476, -4.6601],
|
||||
["702", 103.817, 1.359],
|
||||
["776", -174.7998, -20.4161],
|
||||
["796", -71.9734, 21.8312],
|
||||
["831", -2.5726, 49.4678],
|
||||
["832", -2.1272, 49.2181],
|
||||
["833", -4.5388, 54.224],
|
||||
["850", -64.8028, 17.9555],
|
||||
["876", -177.3469, -13.8898],
|
||||
["882", -172.1649, -13.7536],
|
||||
] as const
|
||||
|
||||
export const worldCountryMarkers = [
|
||||
...worldCountries.features.flatMap((country) => {
|
||||
const marker = geoCountryMarker(country)
|
||||
return marker ? [{ id: String(country.id ?? "").padStart(3, "0"), marker }] : []
|
||||
}),
|
||||
...fallbackCountryMarkerCoordinates.flatMap(([id, longitude, latitude]) => {
|
||||
const marker = worldProjection([longitude, latitude])
|
||||
return marker ? [{ id, marker: { x: marker[0], y: marker[1] } }] : []
|
||||
}),
|
||||
]
|
||||
|
|
@ -2264,121 +2264,6 @@ body {
|
|||
align-items: start;
|
||||
}
|
||||
|
||||
[data-page="stats"] [data-slot="geo-map-panel"] {
|
||||
position: relative;
|
||||
min-width: 0;
|
||||
overflow: hidden;
|
||||
background: var(--stats-layer);
|
||||
border: 1px solid var(--stats-line);
|
||||
}
|
||||
|
||||
[data-page="stats"] [data-component="geo-world-map"] {
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
[data-page="stats"] [data-slot="geo-countries"] path {
|
||||
fill: var(--stats-layer-2);
|
||||
stroke: var(--stats-bg);
|
||||
stroke-width: 0.45px;
|
||||
transition:
|
||||
fill 140ms ease,
|
||||
opacity 140ms ease;
|
||||
}
|
||||
|
||||
[data-page="stats"] [data-slot="geo-countries"] path[data-has-data="true"] {
|
||||
fill: var(--stats-accent);
|
||||
opacity: var(--geo-country-opacity);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
[data-page="stats"] [data-slot="geo-countries"] path[data-active="true"] {
|
||||
fill: color-mix(in srgb, var(--stats-accent) 70%, var(--stats-text));
|
||||
opacity: var(--geo-country-opacity);
|
||||
}
|
||||
|
||||
[data-page="stats"] [data-slot="geo-country-markers"] circle {
|
||||
fill: var(--stats-accent);
|
||||
stroke: var(--stats-bg);
|
||||
stroke-width: 1.1px;
|
||||
opacity: var(--geo-country-opacity);
|
||||
cursor: pointer;
|
||||
transition:
|
||||
fill 140ms ease,
|
||||
opacity 140ms ease,
|
||||
r 140ms ease;
|
||||
}
|
||||
|
||||
[data-page="stats"] [data-slot="geo-country-markers"] circle[data-active="true"] {
|
||||
fill: color-mix(in srgb, var(--stats-accent) 70%, var(--stats-text));
|
||||
opacity: var(--geo-country-opacity);
|
||||
}
|
||||
|
||||
[data-page="stats"] [data-slot="geo-borders"] {
|
||||
fill: none;
|
||||
stroke: var(--stats-line-strong);
|
||||
stroke-linejoin: round;
|
||||
stroke-width: 0.6px;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
[data-page="stats"] [data-slot="geo-active-country"] {
|
||||
position: absolute;
|
||||
bottom: 16px;
|
||||
left: 16px;
|
||||
display: grid;
|
||||
gap: 8px;
|
||||
min-width: 168px;
|
||||
max-width: calc(100% - 32px);
|
||||
box-sizing: border-box;
|
||||
padding: 12px;
|
||||
background: color-mix(in srgb, var(--stats-bg) 92%, transparent);
|
||||
box-shadow:
|
||||
0 0 0 0.5px var(--stats-line-strong),
|
||||
0 6px 16px #0000000d,
|
||||
0 2px 6px #0000000f;
|
||||
}
|
||||
|
||||
[data-page="stats"] [data-slot="geo-active-country"] span,
|
||||
[data-page="stats"] [data-slot="geo-active-country"] em {
|
||||
color: var(--stats-faint);
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
[data-page="stats"] [data-slot="geo-active-country"] span {
|
||||
font-size: 10px;
|
||||
font-weight: 600;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
[data-page="stats"] [data-slot="geo-active-country"] strong {
|
||||
min-width: 0;
|
||||
overflow: hidden;
|
||||
color: var(--stats-text);
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
line-height: 1.2;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
[data-page="stats"] [data-slot="geo-active-country"] p {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 16px;
|
||||
color: var(--stats-muted);
|
||||
font-size: 11px;
|
||||
font-weight: 500;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
[data-page="stats"] [data-slot="geo-active-country"] b {
|
||||
color: var(--stats-accent-text);
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
[data-page="stats"] [data-component="geo-country-list"] {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(min(100%, 212px), 1fr));
|
||||
|
|
@ -8386,13 +8271,6 @@ body {
|
|||
height: 400px;
|
||||
}
|
||||
|
||||
[data-page="stats"] [data-slot="geo-active-country"] {
|
||||
position: static;
|
||||
min-width: 0;
|
||||
max-width: none;
|
||||
margin: 0 12px 12px;
|
||||
}
|
||||
|
||||
[data-page="stats"] [data-component="geo-country-list"] button {
|
||||
grid-template-columns: 26px 8px minmax(0, 1fr) auto;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue