From 6ea00cfe434dd5396f7f29ee96168f9c46a75327 Mon Sep 17 00:00:00 2001 From: YiYi Date: Tue, 11 Aug 2026 23:38:08 +0800 Subject: [PATCH] feat: add base styles, component styles, and theme management - Created base CSS styles for typography, layout, and transitions. - Added component-specific styles for navigation, hero section, about section, infrastructure, projects, modal, contact, and footer. - Introduced design tokens for consistent theming across light and dark modes. - Implemented theme management functionality with local storage support and system preference detection. - Configured TypeScript settings for the project. --- .bind-domain.cjs | 32 + .create-dns.cjs | 30 + .gitignore | 24 + index.html | 15 + logo.png | Bin 0 -> 32514 bytes package-lock.json | 1369 ++++++++++++++++++++++++++++++++++ package.json | 26 + public/favicon.svg | 1 + public/images/authrouter.png | Bin 0 -> 154523 bytes src/data/contacts.ts | 12 + src/data/infra.ts | 17 + src/data/projects.ts | 23 + src/data/regions.ts | 44 ++ src/globe.ts | 178 +++++ src/i18n.ts | 58 ++ src/komari.ts | 70 ++ src/locales/en.json | 64 ++ src/locales/zh.json | 64 ++ src/main.ts | 410 ++++++++++ src/styles/base.css | 124 +++ src/styles/components.css | 829 ++++++++++++++++++++ src/styles/tokens.css | 64 ++ src/theme.ts | 50 ++ tsconfig.json | 24 + 24 files changed, 3528 insertions(+) create mode 100644 .bind-domain.cjs create mode 100644 .create-dns.cjs create mode 100644 .gitignore create mode 100644 index.html create mode 100644 logo.png create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/favicon.svg create mode 100644 public/images/authrouter.png create mode 100644 src/data/contacts.ts create mode 100644 src/data/infra.ts create mode 100644 src/data/projects.ts create mode 100644 src/data/regions.ts create mode 100644 src/globe.ts create mode 100644 src/i18n.ts create mode 100644 src/komari.ts create mode 100644 src/locales/en.json create mode 100644 src/locales/zh.json create mode 100644 src/main.ts create mode 100644 src/styles/base.css create mode 100644 src/styles/components.css create mode 100644 src/styles/tokens.css create mode 100644 src/theme.ts create mode 100644 tsconfig.json diff --git a/.bind-domain.cjs b/.bind-domain.cjs new file mode 100644 index 0000000..e7b3e73 --- /dev/null +++ b/.bind-domain.cjs @@ -0,0 +1,32 @@ +const fs = require("fs"); +const path = require("path"); +const os = require("os"); + +const tomlPath = path.join(os.homedir(), "AppData", "Roaming", "xdg.config", ".wrangler", "config", "default.toml"); +const toml = fs.readFileSync(tomlPath, "utf8"); +const match = toml.match(/oauth_token\s*=\s*"([^"]+)"/); +if (!match) { + console.error("no token found"); + process.exit(1); +} +const token = match[1]; +const accountId = "6a638c3c2047a3ce064af7e4febb0ead"; +const project = "personalweb"; +const domain = "www.zhouhaoze.com"; + +fetch(`https://api.cloudflare.com/client/v4/accounts/${accountId}/pages/projects/${project}/domains`, { + method: "POST", + headers: { + Authorization: `Bearer ${token}`, + "Content-Type": "application/json", + }, + body: JSON.stringify({ name: domain }), +}) + .then((r) => r.json()) + .then((j) => { + console.log(JSON.stringify(j, null, 2)); + }) + .catch((e) => { + console.error(e); + process.exit(1); + }); diff --git a/.create-dns.cjs b/.create-dns.cjs new file mode 100644 index 0000000..63f56b8 --- /dev/null +++ b/.create-dns.cjs @@ -0,0 +1,30 @@ +const fs = require("fs"); +const path = require("path"); +const os = require("os"); + +const tomlPath = path.join(os.homedir(), "AppData", "Roaming", "xdg.config", ".wrangler", "config", "default.toml"); +const toml = fs.readFileSync(tomlPath, "utf8"); +const match = toml.match(/oauth_token\s*=\s*"([^"]+)"/); +const token = match[1]; +const zoneId = "5ed3652548a0e8c430910c4090b02357"; + +fetch(`https://api.cloudflare.com/client/v4/zones/${zoneId}/dns_records`, { + method: "POST", + headers: { + Authorization: `Bearer ${token}`, + "Content-Type": "application/json", + }, + body: JSON.stringify({ + type: "CNAME", + name: "www", + content: "personalweb-bkl.pages.dev", + proxied: true, + ttl: 1, + }), +}) + .then((r) => r.json()) + .then((j) => console.log(JSON.stringify(j, null, 2))) + .catch((e) => { + console.error(e); + process.exit(1); + }); diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/index.html b/index.html new file mode 100644 index 0000000..ccd4e9c --- /dev/null +++ b/index.html @@ -0,0 +1,15 @@ + + + + + + + + Haoze Zhou + + + +
+ + + diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0f35b5346a151ea744aaa5e6067f522adb48376f GIT binary patch literal 32514 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.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.3.tgz", + "integrity": "sha512-ieIiibVCp0tX7TLu2cafoNPv8wJyYi01ekXpbf8q2j7F4rGAhhXb/eQh7ge9DRBY78GwmRQtvjZDux7EDbA8kA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.3.tgz", + "integrity": "sha512-Zh9tCon19eDXJoihx0rqKhMUlMYqzwj3aPsSuHmI4RWZh62dWUL+DJN4C5YQya5TcQBJU/Fe8+rY0jhXTQITqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.3.tgz", + "integrity": "sha512-nGbJWewA1wrXXZiQhjAT5rhibGfns5ZNkDVqxsO6zJ3f3YvpoDNNmGMSbbhLuXKjNScaBJVOAboztAWVespQMg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.3.tgz", + "integrity": "sha512-QNniJr5Kml0kDEB98jiDOJjXNroxIIi0IXIbdYzY26Xt1pVbeP62+KnoIZLwirOymX/0jDk/2gI/bNUv7A7OIw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.3.tgz", + "integrity": "sha512-TkqEAcmmvH3I/q4114NB4RVt6241Dao48pF45uLcFGrwAaIn0iITgTAKP/dLjbN0R4buJjGb91+UHSoFmpgIWw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.3.tgz", + "integrity": "sha512-NHqjnxpsndf4MPymxteFAWHHfkTL8HjWh1KB7z23ofZ6QO2euONuxDXjat69dKZRALnGypg8k8SsK8vZJoXv1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.3.tgz", + "integrity": "sha512-6tbrbwfz5GB9DQ4Jwo6hy9v+vR31xZlvzZ6n5Xut6Hhx5PvrA9q/HsK8KMaYQp063iqZGXwNvZtYNLD7EM/x0w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.3.tgz", + "integrity": "sha512-oyuXxXmoZHjXC917IAPFAAv4wWAa0cM9afk8nx1+9/jNNOX1uPf8yDA6p7G0RypOfw/X0PQt5IfoquY1um+zSg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.3.tgz", + "integrity": "sha512-TytMwF2KVGqP2tgd0I1OY0PAv78dZRAYcF5ssDzjM34SUXCED3uXvSd5+lHoC0bTD6eEdFz7LdQNCO1y0oVk9w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.3.tgz", + "integrity": "sha512-/E9m3qstrJFVPoULV25mVQblSNExY2+kBsYe4sy0Tn0yOOgJ8wZbZt3KnRbF/XeU2Gl1STKUQnDNTqhIE5MD4A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.3.tgz", + "integrity": "sha512-Kr0OcsoQI816i6HOl3vFHpd1K0eZyh76zgfj4c1nTyaTsd5r2Mj1lwM4R90y/qaCfmTn9eHy0SKwi98eitRxug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.3.tgz", + "integrity": "sha512-hOtMwTqnME+/gJcH/PCZ0wn0zPUjiWOgkHpxbSJpfGKMezHltx1S7/k1SitzVa7Ww2cqrDDaFbZEhcJZO8o+Jw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.3.tgz", + "integrity": "sha512-ekcqMMkI2PlhYnfzQnB/cEdYUVVJViWvoUyLrbzgDoi3Snfc1mVBwdnc306ufA5ejy8JSPjT2RlW1nQSjW7efg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@turf/boolean-point-in-polygon": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-point-in-polygon/-/boolean-point-in-polygon-7.4.0.tgz", + "integrity": "sha512-GQrHc6WSDHhf32GB/b9AGyOeC05AQ3nGN7ooWTrlCYefKn7X9/2wG9BNexF47AuyDq5jPdOvITVR26BLFWV+mA==", + "license": "MIT", + "dependencies": { + "@turf/helpers": "7.4.0", + "@turf/invariant": "7.4.0", + "@types/geojson": "^7946.0.10", + "point-in-polygon-hao": "^1.1.0", + "tslib": "^2.8.1" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/helpers": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-7.4.0.tgz", + "integrity": "sha512-7PAwLZqOdRzTI5g9bHvUwlloAXPDH/mlajtryk0tw4ZwGMtmXsAyF4QundsAMfy4u48Fyd3AUqMXY0SMxqJGWg==", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.8.1" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/invariant": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-7.4.0.tgz", + "integrity": "sha512-OAsc3qdNx+tRqzWmMNFMnVlWWACIqnYqIejZKvb2oKkKPYJJrURPXZ6OdrGD58ljJMolLoqwIZGSx3VndaEjxg==", + "license": "MIT", + "dependencies": { + "@turf/helpers": "7.4.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.8.1" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@tweenjs/tween.js": { + "version": "25.0.0", + "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-25.0.0.tgz", + "integrity": "sha512-XKLA6syeBUaPzx4j3qwMqzzq+V4uo72BnlbOjmuljLrRqdsd3qnzvZZoxvMHZ23ndsRS4aufU6JOZYpCbU6T1A==", + "license": "MIT" + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT" + }, + "node_modules/@types/stats.js": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.4.tgz", + "integrity": "sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/three": { + "version": "0.183.0", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.183.0.tgz", + "integrity": "sha512-AaGkvloQhxdrfMm/HbY8cpOz1K1jkEELn6zjFoY3yhAiC7zhhZE19+gDBybYwKk+GqXmWKxqDCB43NqyW3+QZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@dimforge/rapier3d-compat": "~0.12.0", + "@tweenjs/tween.js": "~23.1.3", + "@types/stats.js": "*", + "@types/webxr": ">=0.5.17", + "@webgpu/types": "*", + "fflate": "~0.8.2", + "meshoptimizer": "~1.0.1" + } + }, + "node_modules/@types/three/node_modules/@tweenjs/tween.js": { + "version": "23.1.3", + "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", + "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/topojson-client": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@types/topojson-client/-/topojson-client-3.1.5.tgz", + "integrity": "sha512-C79rySTyPxnQNNguTZNI1Ct4D7IXgvyAs3p9HPecnl6mNrJ5+UhvGNYcZfpROYV2lMHI48kJPxwR+F9C6c7nmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/geojson": "*", + "@types/topojson-specification": "*" + } + }, + "node_modules/@types/topojson-specification": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/topojson-specification/-/topojson-specification-1.0.5.tgz", + "integrity": "sha512-C7KvcQh+C2nr6Y2Ub4YfgvWvWCgP2nOQMtfhlnwsRL4pYmmwzBS7HclGiS87eQfDOU/DLQpX6GEscviaz4yLIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/webxr": { + "version": "0.5.24", + "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.24.tgz", + "integrity": "sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webgpu/types": { + "version": "0.1.71", + "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.71.tgz", + "integrity": "sha512-mMy8/ODcKhab808co15eW+yN+HgXoQxRQHTiBV9Mrvl1r0ufnid7YOcI+gi4eUWSWl9ezD6TW2KXccrL8HCh2A==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/accessor-fn": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/accessor-fn/-/accessor-fn-1.5.3.tgz", + "integrity": "sha512-rkAofCwe/FvYFUlMB0v0gWmhqtfAtV1IUkdPbfhTUyYniu5LrC0A0UJkTH0Jv3S8SvwkmfuAlY+mQIJATdocMA==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo-voronoi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/d3-geo-voronoi/-/d3-geo-voronoi-2.1.0.tgz", + "integrity": "sha512-kqE4yYuOjPbKdBXG0xztCacPwkVSK2REF1opSNrnqqtXJmNcM++UbwQ8SxvwP6IQTj9RvIjjK4qeiVsEfj0Z2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-delaunay": "6", + "d3-geo": "3", + "d3-tricontour": "1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-octree": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-octree/-/d3-octree-1.1.0.tgz", + "integrity": "sha512-F8gPlqpP+HwRPMO/8uOu5wjH110+6q4cgJvgJT6vlpy3BEaDIKlTZrgHKZSp/i1InRpVfh4puY/kvL6MxK930A==", + "license": "MIT" + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "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" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-tricontour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-tricontour/-/d3-tricontour-1.1.0.tgz", + "integrity": "sha512-G7gHKj89n2owmkGb6WX6ixcnQ0Kf/0wpa9VIh9DGdbHu8wdrlaHU4ir3/bFNERl8N8nn4G7e7qbtBG8N9caihQ==", + "license": "ISC", + "dependencies": { + "d3-delaunay": "6", + "d3-scale": "4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-bind-mapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/data-bind-mapper/-/data-bind-mapper-1.0.3.tgz", + "integrity": "sha512-QmU3lyEnbENQPo0M1F9BMu4s6cqNNp8iJA+b/HP2sSb7pf3dxwF3+EP1eO69rwBfH9kFJ1apmzrtogAmVt2/Xw==", + "license": "MIT", + "dependencies": { + "accessor-fn": "1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/delaunator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz", + "integrity": "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/earcut": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.2.3.tgz", + "integrity": "sha512-vnS4AVwp1KHAF13i1vp1/2D5evWy3k5u/iW/B81QVsUZtV8cv2tU0b2VNFlqvh4kYwrFMDdjPCfAmfyJW9y14Q==", + "license": "ISC" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fflate": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.3.tgz", + "integrity": "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==", + "dev": true, + "license": "MIT" + }, + "node_modules/frame-ticker": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/frame-ticker/-/frame-ticker-1.0.3.tgz", + "integrity": "sha512-E0X2u2JIvbEMrqEg5+4BpTqaD22OwojJI63K7MdKHdncjtAhGRbCR8nJCr2vwEt9NWBPCPcu70X9smPviEBy8Q==", + "license": "MIT", + "dependencies": { + "simplesignal": "^2.1.6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/h3-js": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/h3-js/-/h3-js-4.5.0.tgz", + "integrity": "sha512-uKmdPc+DuarnR+XqZxEuWOMw7KzzKROrx3MLeJpFnMOs78S9M5eZ+X5RieS9UcSFQqbeXzbfWuX/W9Pyajinqw==", + "license": "Apache-2.0", + "engines": { + "node": ">=4", + "npm": ">=3", + "yarn": ">=1.3.0" + } + }, + "node_modules/index-array-by": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/index-array-by/-/index-array-by-1.4.2.tgz", + "integrity": "sha512-SP23P27OUKzXWEC/TOyWlwLviofQkCSCKONnc62eItjp69yCZZPqDQtr3Pw5gJDnPeUMqExmKydNZaJO0FU9pw==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/kapsule": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/kapsule/-/kapsule-1.16.3.tgz", + "integrity": "sha512-4+5mNNf4vZDSwPhKprKwz3330iisPrb08JyMgbsdFrimBCKNHecua/WBwvVg3n7vwx0C1ARjfhwIpbrbd9n5wg==", + "license": "MIT", + "dependencies": { + "lodash-es": "4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lodash-es": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", + "license": "MIT" + }, + "node_modules/meshoptimizer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-1.0.1.tgz", + "integrity": "sha512-Vix+QlA1YYT3FwmBBZ+49cE5y/b+pRrcXKqGpS5ouh33d3lSp2PoTpCw19E0cKDFWalembrHnIaZetf27a+W2g==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/point-in-polygon-hao": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/point-in-polygon-hao/-/point-in-polygon-hao-1.2.4.tgz", + "integrity": "sha512-x2pcvXeqhRHlNRdhLs/tgFapAbSSe86wa/eqmj1G6pWftbEs5aVRJhRGM6FYSUERKu0PjekJzMq0gsI2XyiclQ==", + "license": "MIT", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", + "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==", + "license": "Unlicense" + }, + "node_modules/rolldown": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.3.tgz", + "integrity": "sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.143.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.2.3", + "@rolldown/binding-darwin-arm64": "1.2.3", + "@rolldown/binding-darwin-x64": "1.2.3", + "@rolldown/binding-freebsd-x64": "1.2.3", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.3", + "@rolldown/binding-linux-arm64-gnu": "1.2.3", + "@rolldown/binding-linux-arm64-musl": "1.2.3", + "@rolldown/binding-linux-ppc64-gnu": "1.2.3", + "@rolldown/binding-linux-s390x-gnu": "1.2.3", + "@rolldown/binding-linux-x64-gnu": "1.2.3", + "@rolldown/binding-linux-x64-musl": "1.2.3", + "@rolldown/binding-openharmony-arm64": "1.2.3", + "@rolldown/binding-win32-arm64-msvc": "1.2.3", + "@rolldown/binding-win32-x64-msvc": "1.2.3" + } + }, + "node_modules/simplesignal": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/simplesignal/-/simplesignal-2.1.7.tgz", + "integrity": "sha512-PEo2qWpUke7IMhlqiBxrulIFvhJRLkl1ih52Rwa+bPjzhJepcd4GIjn2RiQmFSx3dQvsEAgF0/lXMwMN7vODaA==", + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/three": { + "version": "0.183.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.183.0.tgz", + "integrity": "sha512-G6SH2jfefIVa2YI4JL2VbgQhrrbp1A8dRc7lr3PW827kdVyaX2RgH6M5FmjmdVFLgSHppyg3OYOZdTfWElle+g==", + "license": "MIT", + "peer": true + }, + "node_modules/three-conic-polygon-geometry": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/three-conic-polygon-geometry/-/three-conic-polygon-geometry-2.1.3.tgz", + "integrity": "sha512-7KYcgd7rYg91L8AnCEddeyhw4qlv9+8NAI0luHq7QGt26icWUGNCsvLyD+u6FPKjP+un3zGBi4JGzqgGpmBSWA==", + "license": "MIT", + "dependencies": { + "@turf/boolean-point-in-polygon": "^7.2", + "d3-array": "1 - 3", + "d3-geo": "1 - 3", + "d3-geo-voronoi": "2", + "d3-scale": "1 - 4", + "delaunator": "5", + "earcut": "3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "three": ">=0.72.0" + } + }, + "node_modules/three-geojson-geometry": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/three-geojson-geometry/-/three-geojson-geometry-2.1.1.tgz", + "integrity": "sha512-dC7bF3ri1goDcihYhzACHOBQqu7YNNazYLa2bSydVIiJUb3jDFojKSy+gNj2pMkqZNSVjssSmdY9zlmnhEpr1w==", + "license": "MIT", + "dependencies": { + "d3-geo": "1 - 3", + "d3-interpolate": "1 - 3", + "earcut": "3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "three": ">=0.72.0" + } + }, + "node_modules/three-globe": { + "version": "2.45.2", + "resolved": "https://registry.npmjs.org/three-globe/-/three-globe-2.45.2.tgz", + "integrity": "sha512-3qJE2LAdyHsUPt02mgMRc+PG3j9kGEA0fUYrwKPGIVtvMR1XjDn9hCXu31AWocdgHOFcXkrRVz7jJZzTIvR0eQ==", + "license": "MIT", + "dependencies": { + "@tweenjs/tween.js": "18 - 25", + "accessor-fn": "1", + "d3-array": "3", + "d3-color": "3", + "d3-geo": "3", + "d3-interpolate": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "data-bind-mapper": "1", + "frame-ticker": "1", + "h3-js": "4", + "index-array-by": "1", + "kapsule": "^1.16", + "three-conic-polygon-geometry": "2", + "three-geojson-geometry": "2", + "three-slippy-map-globe": "1", + "tinycolor2": "1" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "three": ">=0.154" + } + }, + "node_modules/three-slippy-map-globe": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/three-slippy-map-globe/-/three-slippy-map-globe-1.0.6.tgz", + "integrity": "sha512-PCUR+X+1kYFYtQBf8+b/ct8xBHtnkeu7FItRYBeFxyIe3ksnGuLi0H9RAxAfVSSUsZVbKIKNz9q1atEjynrrkg==", + "license": "MIT", + "dependencies": { + "d3-geo": "1 - 3", + "d3-octree": "^1.1", + "d3-scale": "1 - 4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "three": ">=0.154" + } + }, + "node_modules/tinycolor2": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", + "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/topojson-client": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", + "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", + "license": "ISC", + "dependencies": { + "commander": "2" + }, + "bin": { + "topo2geo": "bin/topo2geo", + "topomerge": "bin/topomerge", + "topoquantize": "bin/topoquantize" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/vite": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.1.tgz", + "integrity": "sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.33.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.25", + "rolldown": "~1.2.1", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.4.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/world-atlas": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/world-atlas/-/world-atlas-2.0.2.tgz", + "integrity": "sha512-IXfV0qwlKXpckz1FhwXVwKRjiIhOnWttOskm5CtxMsjgE/MXAYRHWJqgXOpM8IkcPBoXnyTU5lFHcYa5ChG0LQ==", + "license": "ISC" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..6057542 --- /dev/null +++ b/package.json @@ -0,0 +1,26 @@ +{ + "name": "personalweb", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "devDependencies": { + "@types/three": "^0.183.0", + "@types/topojson-client": "^3.1.5", + "typescript": "~6.0.2", + "vite": "^8.2.0" + }, + "dependencies": { + "@fontsource/ibm-plex-mono": "^5.3.0", + "@fontsource/outfit": "^5.3.0", + "@phosphor-icons/web": "^2.1.2", + "three": "^0.183.0", + "three-globe": "^2.45.2", + "topojson-client": "^3.1.0", + "world-atlas": "^2.0.2" + } +} diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..6893eb1 --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/authrouter.png b/public/images/authrouter.png new file mode 100644 index 0000000000000000000000000000000000000000..a0fa5b003cd2002f36e68b8723cf6fbaeffc9b85 GIT binary patch literal 154523 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%0AgVrY@{hl_!(sHG$!Idzt~SbR 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 = { + HK: { code: "HK", lat: 22.3193, lng: 114.1694, name: "Hong Kong" }, + SG: { code: "SG", lat: 1.3521, lng: 103.8198, name: "Singapore" }, + CN: { code: "CN", lat: 39.9042, lng: 116.4074, name: "China" }, + DE: { code: "DE", lat: 50.1109, lng: 8.6821, name: "Germany" }, + JP: { code: "JP", lat: 35.6762, lng: 139.6503, name: "Japan" }, + CA: { code: "CA", lat: 43.6532, lng: -79.3832, name: "Canada" }, + GB: { code: "GB", lat: 51.5072, lng: -0.1276, name: "United Kingdom" }, + US: { code: "US", lat: 37.3382, lng: -121.8863, name: "United States" }, + NL: { code: "NL", lat: 52.3676, lng: 4.9041, name: "Netherlands" }, + AU: { code: "AU", lat: -33.8688, lng: 151.2093, name: "Australia" }, + KR: { code: "KR", lat: 37.5665, lng: 126.978, name: "South Korea" }, + TR: { code: "TR", lat: 41.0082, lng: 28.9784, name: "Turkey" }, + IN: { code: "IN", lat: 19.076, lng: 72.8777, name: "India" }, + ID: { code: "ID", lat: -6.2088, lng: 106.8456, name: "Indonesia" }, + MY: { code: "MY", lat: 3.139, lng: 101.6869, name: "Malaysia" }, + BR: { code: "BR", lat: -23.5505, lng: -46.6333, name: "Brazil" }, + VN: { code: "VN", lat: 21.0278, lng: 105.8342, name: "Vietnam" }, + TW: { code: "TW", lat: 25.033, lng: 121.5654, name: "Taiwan" }, +}; + +const REGIONAL_INDICATOR_BASE = 0x1f1e6; + +export function flagToRegionInfo(flag: string): RegionInfo | null { + const chars = Array.from(flag); + if (chars.length !== 2) return null; + const letters = chars.map((c) => { + const codePoint = c.codePointAt(0); + if (codePoint === undefined) return null; + const offset = codePoint - REGIONAL_INDICATOR_BASE; + if (offset < 0 || offset > 25) return null; + return String.fromCharCode(65 + offset); + }); + if (letters.some((l) => l === null)) return null; + const code = letters.join(""); + return REGION_TABLE[code] ?? null; +} diff --git a/src/globe.ts b/src/globe.ts new file mode 100644 index 0000000..c91669d --- /dev/null +++ b/src/globe.ts @@ -0,0 +1,178 @@ +import * as THREE from "three"; +import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js"; +import ThreeGlobe from "three-globe"; +import { feature } from "topojson-client"; +import type { GeometryCollection, Topology } from "topojson-specification"; +import countriesTopology from "world-atlas/countries-110m.json"; +import type { InfraSnapshot } from "./komari"; +import { flagToRegionInfo } from "./data/regions"; +import { onThemeChange } from "./theme"; + +interface GlobePoint { + lat: number; + lng: number; + name: string; + count: number; +} + +function buildPoints(snapshot: InfraSnapshot): GlobePoint[] { + return snapshot.regionBreakdown.flatMap(({ flag, count }) => { + const info = flagToRegionInfo(flag); + return info ? [{ lat: info.lat, lng: info.lng, name: info.name, count }] : []; + }); +} + +function cssVar(name: string, fallback: string): string { + const value = getComputedStyle(document.documentElement).getPropertyValue(name).trim(); + return value || fallback; +} + +function hexToRgba(hex: string, alpha: number): string { + const clean = hex.replace("#", ""); + const r = parseInt(clean.substring(0, 2), 16); + const g = parseInt(clean.substring(2, 4), 16); + const b = parseInt(clean.substring(4, 6), 16); + return `rgba(${r}, ${g}, ${b}, ${alpha})`; +} + +function sizeOf(container: HTMLElement): { width: number; height: number } { + const rect = container.getBoundingClientRect(); + return { width: Math.max(1, Math.round(rect.width || 320)), height: Math.max(1, Math.round(rect.height || 320)) }; +} + +export function mountGlobe(container: HTMLElement, snapshot: InfraSnapshot): () => void { + const points = buildPoints(snapshot); + const reduceMotion = window.matchMedia("(prefers-reduced-motion: reduce)").matches; + let accent = cssVar("--accent", "#3b4fa3"); + let textColor = cssVar("--text", "#f5f4f1"); + let globeBase = cssVar("--bg-elevated", "#1b1e26"); + const topology = countriesTopology as unknown as Topology; + const countries = feature(topology, topology.objects.countries as GeometryCollection); + const initialSize = sizeOf(container); + + const scene = new THREE.Scene(); + const camera = new THREE.PerspectiveCamera(42, initialSize.width / initialSize.height, 0.1, 2000); + camera.position.set(0, 0, 280); + + const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true, powerPreference: "high-performance" }); + renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2)); + renderer.setSize(initialSize.width, initialSize.height); + renderer.setClearColor(0x000000, 0); + container.replaceChildren(renderer.domElement); + renderer.domElement.style.cursor = "grab"; + renderer.domElement.setAttribute("aria-label", "Interactive globe showing server regions"); + + scene.add(new THREE.AmbientLight(0xffffff, 1.1)); + const frontLight = new THREE.DirectionalLight(0xffffff, 0.65); + frontLight.position.set(200, 180, 250); + scene.add(frontLight); + const fillLightLeft = new THREE.DirectionalLight(0xffffff, 0.28); + fillLightLeft.position.set(-260, 60, 120); + scene.add(fillLightLeft); + const rimLight = new THREE.DirectionalLight(0xffffff, 0.22); + rimLight.position.set(0, -120, -260); + scene.add(rimLight); + + const globeMaterial = new THREE.MeshPhongMaterial({ color: new THREE.Color(globeBase), shininess: 14, transparent: true, opacity: 0.96 }); + + const globe = new ThreeGlobe() + .globeMaterial(globeMaterial) + .polygonsData(countries.features) + .polygonCapColor(() => hexToRgba(accent, 0.12)) + .polygonSideColor(() => hexToRgba(accent, 0.04)) + .polygonStrokeColor(() => hexToRgba(accent, 0.48)) + .polygonAltitude(0.004) + .showGraticules(true) + .showAtmosphere(true) + .atmosphereColor(accent) + .atmosphereAltitude(0.18) + .pointsData(points) + .pointLat("lat") + .pointLng("lng") + .pointColor(() => accent) + .pointAltitude(0.018) + .pointRadius(0.42); + + globe + .labelsData(points) + .labelLat("lat") + .labelLng("lng") + .labelText((d) => `${(d as GlobePoint).name} · ${(d as GlobePoint).count}`) + .labelSize(1.15) + .labelColor(() => textColor) + .labelDotRadius(0.32) + .labelDotOrientation("bottom") + .labelResolution(3) + .labelAltitude(0.022); + + if (!reduceMotion) { + globe.ringsData(points).ringLat("lat").ringLng("lng").ringColor(() => (t: number) => hexToRgba(accent, 1 - t)).ringMaxRadius(5).ringPropagationSpeed(1.5).ringRepeatPeriod(2200); + } + scene.add(globe); + + function repaint(): void { + accent = cssVar("--accent", "#3b4fa3"); + textColor = cssVar("--text", "#f5f4f1"); + globeBase = cssVar("--bg-elevated", "#1b1e26"); + globeMaterial.color.set(globeBase); + globe + .polygonCapColor(() => hexToRgba(accent, 0.12)) + .polygonSideColor(() => hexToRgba(accent, 0.04)) + .polygonStrokeColor(() => hexToRgba(accent, 0.48)) + .atmosphereColor(accent) + .pointColor(() => accent) + .labelColor(() => textColor); + if (!reduceMotion) { + globe.ringColor(() => (t: number) => hexToRgba(accent, 1 - t)); + } + } + const unsubscribeTheme = onThemeChange(repaint); + + const controls = new OrbitControls(camera, renderer.domElement); + controls.enableZoom = false; + controls.enablePan = false; + controls.enableDamping = true; + controls.dampingFactor = 0.08; + controls.rotateSpeed = 0.55; + controls.autoRotate = !reduceMotion; + controls.autoRotateSpeed = 0.45; + controls.minDistance = 180; + controls.maxDistance = 400; + + let frameId = 0; + const animate = () => { + frameId = requestAnimationFrame(animate); + controls.update(); + renderer.render(scene, camera); + }; + animate(); + + const resizeObserver = new ResizeObserver(() => { + const { width, height } = sizeOf(container); + camera.aspect = width / height; + camera.updateProjectionMatrix(); + renderer.setSize(width, height); + }); + resizeObserver.observe(container); + + const handlePointerDown = () => { + renderer.domElement.style.cursor = "grabbing"; + }; + const handlePointerUp = () => { + renderer.domElement.style.cursor = "grab"; + }; + renderer.domElement.addEventListener("pointerdown", handlePointerDown); + renderer.domElement.addEventListener("pointerup", handlePointerUp); + + return () => { + cancelAnimationFrame(frameId); + resizeObserver.disconnect(); + unsubscribeTheme(); + renderer.domElement.removeEventListener("pointerdown", handlePointerDown); + renderer.domElement.removeEventListener("pointerup", handlePointerUp); + controls.dispose(); + renderer.dispose(); + scene.clear(); + if (renderer.domElement.parentElement === container) container.removeChild(renderer.domElement); + }; +} diff --git a/src/i18n.ts b/src/i18n.ts new file mode 100644 index 0000000..aaedac3 --- /dev/null +++ b/src/i18n.ts @@ -0,0 +1,58 @@ +import en from "./locales/en.json"; +import zh from "./locales/zh.json"; + +export type Lang = "en" | "zh"; + +const dictionaries: Record> = { en, zh }; + +const STORAGE_KEY = "pw-lang"; + +function detectLang(): Lang { + const stored = localStorage.getItem(STORAGE_KEY); + if (stored === "en" || stored === "zh") return stored; + return navigator.language.toLowerCase().startsWith("zh") ? "zh" : "en"; +} + +let currentLang: Lang = detectLang(); +const listeners = new Set<(lang: Lang) => void>(); + +export function getLang(): Lang { + return currentLang; +} + +export function t(key: string): string { + return dictionaries[currentLang][key] ?? dictionaries.en[key] ?? key; +} + +export function setLang(lang: Lang): void { + currentLang = lang; + localStorage.setItem(STORAGE_KEY, lang); + document.documentElement.lang = lang === "zh" ? "zh-CN" : "en"; + applyTranslations(); + listeners.forEach((fn) => fn(lang)); +} + +export function onLangChange(fn: (lang: Lang) => void): void { + listeners.add(fn); +} + +export function applyTranslations(): void { + document.querySelectorAll("[data-i18n]").forEach((el) => { + const key = el.dataset.i18n; + if (!key) return; + el.textContent = t(key); + }); + document.querySelectorAll("[data-i18n-attr]").forEach((el) => { + const spec = el.dataset.i18nAttr; + if (!spec) return; + spec.split(",").forEach((pair) => { + const [attr, key] = pair.split(":").map((s) => s.trim()); + if (attr && key) el.setAttribute(attr, t(key)); + }); + }); +} + +export function initI18n(): void { + document.documentElement.lang = currentLang === "zh" ? "zh-CN" : "en"; + applyTranslations(); +} diff --git a/src/komari.ts b/src/komari.ts new file mode 100644 index 0000000..7bcbf94 --- /dev/null +++ b/src/komari.ts @@ -0,0 +1,70 @@ +import { infraFallback } from "./data/infra"; + +const KOMARI_BASE_URL = "https://ops.zhouhaoze.top"; + +interface KomariNode { + name: string; + region: string; // flag emoji per Komari's public API +} + +interface KomariNodesResponse { + data: KomariNode[]; +} + +export interface RegionBreakdown { + flag: string; + count: number; +} + +export interface InfraSnapshot { + serverCount: number; + regionCount: number; + regions: string[]; + regionBreakdown: RegionBreakdown[]; + live: boolean; +} + +export async function fetchInfraSnapshot(): Promise { + if (!KOMARI_BASE_URL) { + return { + serverCount: infraFallback.serverCount, + regionCount: infraFallback.regionCount, + regions: [], + regionBreakdown: [], + live: false, + }; + } + + try { + const res = await fetch(`${KOMARI_BASE_URL}/api/nodes`, { + signal: AbortSignal.timeout(5000), + }); + if (!res.ok) throw new Error(`Komari responded ${res.status}`); + const body: KomariNodesResponse = await res.json(); + const nodes = body.data; + + const counts = new Map(); + for (const n of nodes) { + if (!n.region) continue; + counts.set(n.region, (counts.get(n.region) ?? 0) + 1); + } + const regionBreakdown = Array.from(counts, ([flag, count]) => ({ flag, count })); + const regions = regionBreakdown.map((r) => r.flag); + + return { + serverCount: nodes.length || infraFallback.serverCount, + regionCount: regions.length || infraFallback.regionCount, + regions, + regionBreakdown, + live: true, + }; + } catch { + return { + serverCount: infraFallback.serverCount, + regionCount: infraFallback.regionCount, + regions: [], + regionBreakdown: [], + live: false, + }; + } +} diff --git a/src/locales/en.json b/src/locales/en.json new file mode 100644 index 0000000..9c9a6f2 --- /dev/null +++ b/src/locales/en.json @@ -0,0 +1,64 @@ +{ + "nav.about": "About", + "nav.infra": "Infrastructure", + "nav.projects": "Projects", + "nav.contact": "Contact", + "nav.themeToggle": "Toggle light and dark mode", + "nav.langToggle": "Switch language", + + "hero.eyebrow": "Student / Developer", + "hero.name": "Haoze Zhou", + "hero.tagline": "CS undergraduate at Universiti Malaya, building and running a few of my own services on the side.", + "hero.cta": "View projects", + "hero.more": "About me", + "hero.note": "Currently running 38 servers across 19 regions, live-monitored via Komari.", + "hero.stat.servers": "Servers", + "hero.stat.regions": "Regions", + "hero.stat.projects": "Projects", + "hero.focusLabel": "Currently focused on", + "hero.focus1": "Frontend engineering", + "hero.focus2": "AI / ML fundamentals", + "hero.focus3": "Backend & self-hosting", + + "about.title": "About", + "about.identity": "Universiti Malaya (QS 56) · Computer Science · Year 1 · Expected graduation 2030", + "about.bio1": "I'm a first-year Computer Science undergraduate at Universiti Malaya. I'm interested in frontend development, AI, and backend systems, and still figuring out which direction I want to go deeper on.", + "about.bio2": "I like building and maintaining services myself, from writing code to running the servers behind them. I tend to learn best by actually doing.", + "about.skillsTitle": "Skills and tools", + "about.timelineTitle": "A few milestones", + "about.timeline.2025": "Started Computer Science at Universiti Malaya", + "about.timeline.2026": "Kept building and self-hosting side projects and services", + + "infra.title": "Self-hosted infrastructure", + "infra.lead": "A few services I build and maintain in my spare time, spread across several countries and regions, monitored live by Komari.", + "infra.statServers": "servers", + "infra.statRegions": "countries / regions", + "infra.regionsFallback": "{count} regions monitored via Komari", + "infra.gitea.name": "Gitea", + "infra.gitea.desc": "Self-hosted code hosting for managing personal project repositories.", + "infra.mailcow.name": "MailCow", + "infra.mailcow.desc": "Self-hosted mail server handling email for my personal domain.", + "infra.uptime.name": "Uptime Kuma", + "infra.uptime.desc": "Tracks uptime and response health across my other services.", + "infra.alist.name": "Alist", + "infra.alist.desc": "File management and sharing across several storage sources.", + "infra.globeHint": "Drag to rotate, showing node distribution", + + "projects.title": "Projects", + "projects.lead": "Things I've written and maintained. Click a card for more detail.", + "projects.authrouter.tag": "Featured", + "projects.authrouter.title": "AuthRouter", + "projects.authrouter.desc": "Consolidates multiple identity providers behind a single login endpoint, with identity mapping across providers.", + "projects.authrouter.detail": "Systems that connect to several identity providers often force users to jump between different login entry points, and identity data ends up scattered across them. AuthRouter merges these into one endpoint: callers integrate once, and requests get routed to the right upstream provider with identities mapped into a consistent format.", + "projects.viewOnGithub": "View on GitHub", + "projects.emptyNote": "More projects are on the way and will be added here over time.", + "projects.media.placeholder": "Project screenshot coming soon", + + "contact.title": "Contact", + "contact.lead": "Feel free to reach me through any of the following.", + "contact.email": "Email", + "contact.github": "GitHub", + "contact.telegram": "Telegram", + + "footer.text": "© 2026 Haoze Zhou" +} diff --git a/src/locales/zh.json b/src/locales/zh.json new file mode 100644 index 0000000..b53c719 --- /dev/null +++ b/src/locales/zh.json @@ -0,0 +1,64 @@ +{ + "nav.about": "关于", + "nav.infra": "基础设施", + "nav.projects": "项目", + "nav.contact": "联系", + "nav.themeToggle": "切换深浅色模式", + "nav.langToggle": "切换语言", + + "hero.eyebrow": "在读学生 / 开发爱好者", + "hero.name": "周昊泽", + "hero.tagline": "马来亚大学计算机科学在读,业余搭建和维护一些自己的服务与工具。", + "hero.cta": "查看项目", + "hero.more": "关于我", + "hero.note": "目前维护着 38 台服务器,分布在 19 个地区,由 Komari 实时监控。", + "hero.stat.servers": "服务器", + "hero.stat.regions": "地区", + "hero.stat.projects": "项目", + "hero.focusLabel": "当前关注方向", + "hero.focus1": "前端开发", + "hero.focus2": "AI / 机器学习基础", + "hero.focus3": "后端与自建服务", + + "about.title": "关于我", + "about.identity": "马来亚大学(QS 56) 计算机科学 · 大一 · 预计 2030 年毕业", + "about.bio1": "目前在马来亚大学读计算机科学本科一年级,对前端开发、人工智能和后端系统都感兴趣,还在探索自己更想深入的方向。", + "about.bio2": "平时喜欢自己动手搭建和维护一些服务,从写代码到管理服务器都会去尝试,更习惯在实践里学东西。", + "about.skillsTitle": "技能与工具", + "about.timelineTitle": "一些节点", + "about.timeline.2025": "入学马来亚大学,计算机科学专业", + "about.timeline.2026": "持续折腾自建服务与个人项目", + + "infra.title": "自建基础设施", + "infra.lead": "业余时间搭建和维护的一些服务,分布在多个国家和地区,状态由 Komari 实时监控。", + "infra.statServers": "台服务器", + "infra.statRegions": "个国家 / 地区", + "infra.regionsFallback": "{count} 个地区由 Komari 实时监控", + "infra.gitea.name": "Gitea", + "infra.gitea.desc": "自建代码托管服务,存放和管理个人项目仓库。", + "infra.mailcow.name": "MailCow", + "infra.mailcow.desc": "自建邮件服务,负责个人域名下的邮箱收发。", + "infra.uptime.name": "Uptime Kuma", + "infra.uptime.desc": "监控各项服务的在线状态和响应情况。", + "infra.alist.name": "Alist", + "infra.alist.desc": "聚合多个存储来源的文件管理与分享服务。", + "infra.globeHint": "拖拽旋转,查看节点分布", + + "projects.title": "项目", + "projects.lead": "一些自己写的和维护的项目,点击卡片可以看更多细节。", + "projects.authrouter.tag": "重点项目", + "projects.authrouter.title": "AuthRouter", + "projects.authrouter.desc": "把多个身份提供方(IdP)整合到一个统一的登录入口,只需要调用一个端点就能完成登录,并支持在不同身份提供方之间做身份映射。", + "projects.authrouter.detail": "很多系统会同时接入好几个身份提供方,用户登录时经常要在不同入口之间跳转,身份信息也难以统一。AuthRouter 把这些入口整合成一个,调用方只需要对接一个端点,就能把登录请求路由到正确的上游,并把不同上游的身份信息映射成统一的格式。", + "projects.viewOnGithub": "在 GitHub 查看", + "projects.emptyNote": "更多项目正在整理中,之后会陆续补充在这里。", + "projects.media.placeholder": "项目截图待补充", + + "contact.title": "联系方式", + "contact.lead": "欢迎通过下面的方式找到我。", + "contact.email": "邮箱", + "contact.github": "GitHub", + "contact.telegram": "Telegram", + + "footer.text": "© 2026 周昊泽" +} diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..9621668 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,410 @@ +import "./styles/tokens.css"; +import "./styles/base.css"; +import "./styles/components.css"; +import { initI18n, setLang, getLang, onLangChange, applyTranslations, t } from "./i18n"; +import { initTheme, toggleTheme, getTheme, onThemeChange } from "./theme"; +import { projects } from "./data/projects"; +import { infraServices } from "./data/infra"; +import { contacts } from "./data/contacts"; +import { fetchInfraSnapshot, type InfraSnapshot } from "./komari"; + +const app = document.querySelector("#app")!; + +app.innerHTML = ` + + +
+
+
+
+ +

+

+
+ + +
+

+
+
+ -- + +
+
+ -- + +
+
+ ${projects.length} + +
+
+
+ +
+ +
+
+
+ +
+
+ +
+
+
+ 01 +

+ +

+

+
+
+

+
+

+
+
+ 2025 + +
+
+ 2026 + +
+
+
+
+
+ +
+
+
+ 02 +

+

+
+
+
+
+
+
--
+
+
+
+
--
+
+
+
+
+
+ + + + +
+
+
+
+
+
+ +
+
+
+ 03 +

+

+
+ +
+
+
+ +
+
+
+ 04 +

+

+
+ +
+
+
+ +
+
+
+ + + +`; + +const SKILLS: Array<{ icon: string; label: string }> = [ + { icon: "ph-code", label: "TypeScript" }, + { icon: "ph-brackets-curly", label: "Go" }, + { icon: "ph-terminal-window", label: "Linux" }, + { icon: "ph-cloud", label: "Self-hosting" }, + { icon: "ph-git-branch", label: "Git" }, + { icon: "ph-brain", label: "AI / ML basics" }, +]; + +function renderSkills(): void { + const el = document.getElementById("skills-list")!; + el.innerHTML = SKILLS.map( + (s) => `
${s.label}
` + ).join(""); +} + +function renderInfraServices(): void { + const el = document.getElementById("infra-services")!; + el.innerHTML = infraServices + .map( + (s) => ` +
+ +
+
+
+
+
` + ) + .join(""); +} + +function renderContacts(): void { + const el = document.getElementById("contact-links")!; + el.innerHTML = contacts + .map( + (c) => ` + + + + ` + ) + .join(""); +} + +const infraSnapshotPromise = fetchInfraSnapshot(); +let infraSnapshotCache: InfraSnapshot | null = null; + +function paintRegionChips(): void { + if (!infraSnapshotCache) return; + const chips = document.getElementById("region-chips")!; + if (infraSnapshotCache.live && infraSnapshotCache.regions.length) { + chips.innerHTML = infraSnapshotCache.regions + .map((r) => `${r}`) + .join(""); + } else { + const label = t("infra.regionsFallback").replace("{count}", String(infraSnapshotCache.regionCount)); + chips.innerHTML = `${label}`; + } +} + +async function renderInfraStats(): Promise { + infraSnapshotCache = await infraSnapshotPromise; + document.getElementById("stat-servers")!.textContent = String(infraSnapshotCache.serverCount); + document.getElementById("stat-regions")!.textContent = String(infraSnapshotCache.regionCount); + document.getElementById("hero-stat-servers")!.textContent = String(infraSnapshotCache.serverCount); + document.getElementById("hero-stat-regions")!.textContent = String(infraSnapshotCache.regionCount); + paintRegionChips(); +} + +function setupInfraGlobe(): void { + const container = document.getElementById("infra-globe")!; + const canvasMount = document.createElement("div"); + canvasMount.className = "infra__globe-canvas"; + container.prepend(canvasMount); + + const observer = new IntersectionObserver( + (entries) => { + if (entries.some((e) => e.isIntersecting)) { + observer.disconnect(); + mountGlobeWhenReady(container, canvasMount); + } + }, + { threshold: 0.2 } + ); + observer.observe(container); +} + +async function mountGlobeWhenReady(container: HTMLElement, canvasMount: HTMLElement): Promise { + const snapshot = await infraSnapshotPromise; + if (!snapshot.regionBreakdown.length) return; + const { mountGlobe } = await import("./globe"); + container.classList.add("has-live"); + mountGlobe(canvasMount, snapshot); +} + +function openModal(html: string): void { + const overlay = document.getElementById("modal-overlay")!; + document.getElementById("modal-body")!.innerHTML = html; + overlay.classList.add("is-open"); +} + +function closeModal(): void { + document.getElementById("modal-overlay")!.classList.remove("is-open"); +} + +function renderProjects(): void { + const featuredSlot = document.getElementById("project-featured-slot")!; + const grid = document.getElementById("project-grid")!; + const featured = projects.filter((p) => p.featured); + const rest = projects.filter((p) => !p.featured); + + featuredSlot.innerHTML = featured + .map( + (p) => ` + ` + ) + .join(""); + + grid.innerHTML = + rest + .map( + (p) => ` +
+

+

+
` + ) + .join("") + + (rest.length === 0 + ? `
` + : ""); + + document.querySelectorAll("[data-project]").forEach((card) => { + card.addEventListener("click", () => { + const project = projects.find((p) => p.id === card.dataset.project); + if (!project) return; + openModal(` + + + ${ + project.image + ? `` + : `` + } + + + + `); + applyTranslations(); + }); + }); +} + +function setupThemeToggle(): void { + const btn = document.getElementById("theme-toggle")!; + const paint = () => { + btn.innerHTML = getTheme() === "dark" ? `` : ``; + }; + paint(); + onThemeChange(paint); + btn.addEventListener("click", toggleTheme); +} + +function setupLangToggle(): void { + const btn = document.getElementById("lang-toggle")!; + const paint = () => { + btn.textContent = getLang() === "zh" ? "EN" : "中文"; + }; + paint(); + onLangChange(() => { + paint(); + paintRegionChips(); + }); + btn.addEventListener("click", () => setLang(getLang() === "zh" ? "en" : "zh")); +} + +function setupModal(): void { + document.getElementById("modal-close")!.addEventListener("click", closeModal); + document.getElementById("modal-overlay")!.addEventListener("click", (e) => { + if (e.target === document.getElementById("modal-overlay")) closeModal(); + }); + document.addEventListener("keydown", (e) => { + if (e.key === "Escape") closeModal(); + }); +} + +function setupScrollReveal(): void { + const reduceMotion = window.matchMedia("(prefers-reduced-motion: reduce)").matches; + const targets = document.querySelectorAll(".reveal"); + if (reduceMotion) { + targets.forEach((el) => el.classList.add("is-visible")); + return; + } + const observer = new IntersectionObserver( + (entries) => { + entries.forEach((entry) => { + if (entry.isIntersecting) { + entry.target.classList.add("is-visible"); + observer.unobserve(entry.target); + } + }); + }, + { threshold: 0.15 } + ); + targets.forEach((el) => observer.observe(el)); +} + +initTheme(); +initI18n(); +renderSkills(); +renderInfraServices(); +renderProjects(); +renderContacts(); +setupThemeToggle(); +setupLangToggle(); +setupModal(); +setupScrollReveal(); +setupInfraGlobe(); +applyTranslations(); +renderInfraStats(); + +// Ensure the empty i18n keys used as placeholders (e.g. tag on non-featured items) don't render "undefined" +document.querySelectorAll('[data-i18n=""]').forEach((el) => el.remove()); + diff --git a/src/styles/base.css b/src/styles/base.css new file mode 100644 index 0000000..575e8b3 --- /dev/null +++ b/src/styles/base.css @@ -0,0 +1,124 @@ +@import "@fontsource/outfit/400.css"; +@import "@fontsource/outfit/500.css"; +@import "@fontsource/outfit/600.css"; +@import "@fontsource/outfit/700.css"; +@import "@fontsource/ibm-plex-mono/400.css"; +@import "@fontsource/ibm-plex-mono/500.css"; +@import "@phosphor-icons/web/regular"; + +*, +*::before, +*::after { + box-sizing: border-box; +} + +html { + scroll-behavior: smooth; +} + +@media (prefers-reduced-motion: reduce) { + html { + scroll-behavior: auto; + } +} + +body { + margin: 0; + font-family: var(--font-display); + background: var(--bg); + color: var(--text); + transition: background-color 0.3s var(--ease-standard), color 0.3s var(--ease-standard); + position: relative; + min-height: 100dvh; +} + +/* Woven texture: fixed, pointer-events none, never on a scrolling container (perf) */ +body::before { + content: ""; + position: fixed; + inset: 0; + z-index: 0; + pointer-events: none; + background-image: repeating-linear-gradient( + 45deg, + var(--texture-line) 0px, + var(--texture-line) 1px, + transparent 1px, + transparent 6px + ), + repeating-linear-gradient( + -45deg, + var(--texture-line) 0px, + var(--texture-line) 1px, + transparent 1px, + transparent 6px + ); +} + +#app { + position: relative; + z-index: 1; +} + +h1, +h2, +h3, +p { + margin: 0; +} + +ul { + margin: 0; + padding: 0; + list-style: none; +} + +a { + color: inherit; + text-decoration: none; +} + +button { + font-family: inherit; + cursor: pointer; +} + +img { + max-width: 100%; + display: block; +} + +.container { + max-width: var(--content-max); + margin: 0 auto; + padding: 0 24px; +} + +.visually-hidden { + position: absolute; + width: 1px; + height: 1px; + overflow: hidden; + clip: rect(0 0 0 0); + white-space: nowrap; +} + +/* Scroll reveal base state, activated via IntersectionObserver in main.ts */ +.reveal { + opacity: 0; + transform: translateY(24px); + transition: opacity 0.6s var(--ease-standard), transform 0.6s var(--ease-standard); +} + +.reveal.is-visible { + opacity: 1; + transform: translateY(0); +} + +@media (prefers-reduced-motion: reduce) { + .reveal { + opacity: 1; + transform: none; + transition: none; + } +} diff --git a/src/styles/components.css b/src/styles/components.css new file mode 100644 index 0000000..3626bc3 --- /dev/null +++ b/src/styles/components.css @@ -0,0 +1,829 @@ +/* ---------- Nav ---------- */ +.nav { + position: fixed; + top: 0; + left: 0; + right: 0; + height: var(--nav-height); + z-index: 50; + background: color-mix(in srgb, var(--bg) 88%, transparent); + backdrop-filter: blur(10px); + border-bottom: 1px solid var(--border-faint); +} + +.nav__inner { + height: 100%; + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; +} + +.nav__mark { + font-family: var(--font-mono); + font-weight: 500; + font-size: 0.95rem; + letter-spacing: 0.02em; +} + +.nav__links { + display: flex; + align-items: center; + gap: 28px; +} + +.nav__link { + font-size: 0.92rem; + color: var(--text-muted); + transition: color 0.2s var(--ease-standard); +} + +.nav__link:hover { + color: var(--text); +} + +.nav__controls { + display: flex; + align-items: center; + gap: 8px; +} + +.icon-btn { + display: inline-flex; + align-items: center; + justify-content: center; + width: 36px; + height: 36px; + border-radius: var(--radius-sm); + border: 1px solid var(--border-faint); + background: transparent; + color: var(--text); + font-size: 1rem; + transition: border-color 0.2s var(--ease-standard), transform 0.15s var(--ease-standard); +} + +.icon-btn:hover { + border-color: var(--border); +} + +.icon-btn:active { + transform: scale(0.96); +} + +.lang-btn { + font-family: var(--font-mono); + font-size: 0.78rem; + font-weight: 500; + padding: 0 12px; + width: auto; + letter-spacing: 0.04em; +} + +@media (max-width: 640px) { + .nav__links { + display: none; + } +} + +/* ---------- Hero ---------- */ +.hero { + padding: calc(var(--nav-height) + 64px) 0 80px; + min-height: 100dvh; + display: flex; + align-items: center; +} + +.hero__grid { + display: grid; + grid-template-columns: 1.1fr 0.9fr; + gap: 48px; + align-items: center; +} + +.hero__eyebrow { + font-family: var(--font-mono); + font-size: 0.8rem; + color: var(--accent); + margin-bottom: 16px; + display: block; +} + +.hero__name { + font-size: clamp(2.6rem, 5.6vw, 4.4rem); + font-weight: 700; + letter-spacing: -0.02em; + line-height: 1.05; + margin-bottom: 18px; +} + +.hero__tagline { + font-size: 1.15rem; + color: var(--text-muted); + max-width: 50ch; + line-height: 1.65; + margin-bottom: 28px; +} + +.hero__actions { + display: flex; + align-items: center; + gap: 20px; + margin-bottom: 20px; + flex-wrap: wrap; +} + +.btn--text { + padding: 12px 4px; + color: var(--text); +} + +.btn--text:hover { + color: var(--accent); +} + +.hero__support { + display: flex; + align-items: center; + gap: 8px; + font-family: var(--font-mono); + font-size: 0.85rem; + color: var(--text-muted); + margin-bottom: 28px; +} + +.hero__support i { + color: var(--accent); +} + +.btn { + display: inline-flex; + align-items: center; + gap: 8px; + padding: 12px 24px; + border-radius: var(--radius-pill); + font-size: 0.95rem; + font-weight: 500; + border: 1px solid transparent; + transition: transform 0.15s var(--ease-standard), background-color 0.2s var(--ease-standard); + white-space: nowrap; +} + +.btn--primary { + background: var(--accent); + color: #f5f4f1; +} + +.btn--primary:hover { + background: var(--accent-strong); +} + +.btn--primary:active { + transform: scale(0.98); +} + +.hero__stats { + display: flex; + gap: 32px; + margin-top: 4px; +} + +.hero__stat { + display: flex; + flex-direction: column; + gap: 4px; +} + +.hero__stat-value { + font-family: var(--font-mono); + font-size: 1.4rem; + font-weight: 500; + color: var(--accent); + line-height: 1; +} + +.hero__stat-label { + font-size: 0.78rem; + color: var(--text-muted); +} + +.hero__focus { + margin-top: 32px; + padding-top: 20px; + border-top: 1px dashed var(--border-faint); +} + +.hero__focus-label { + font-family: var(--font-mono); + font-size: 0.78rem; + color: var(--text-muted); + display: block; + margin-bottom: 10px; + letter-spacing: 0.03em; +} + +.hero__focus-list { + display: flex; + gap: 10px; + flex-wrap: wrap; +} + +.hero__focus-list span { + font-size: 0.85rem; + padding: 6px 12px; + border-radius: var(--radius-pill); + background: var(--accent-soft); + color: var(--accent); +} + +.hero__mark { + justify-self: center; + width: min(320px, 100%); + aspect-ratio: 1; +} + +.hero__orbit { + transform-origin: 100px 100px; + animation: hero-orbit-spin 12s linear infinite; +} + +@keyframes hero-orbit-spin { + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: reduce) { + .hero__orbit { + animation: none; + } +} + +.section__index { + font-family: var(--font-mono); + font-size: 0.78rem; + color: var(--accent); + display: block; + margin-bottom: 10px; + letter-spacing: 0.04em; +} + +@media (max-width: 768px) { + .hero { + padding-top: calc(var(--nav-height) + 40px); + } + .hero__grid { + grid-template-columns: 1fr; + gap: 40px; + text-align: left; + } + .hero__mark { + width: min(220px, 60vw); + } + .hero__stats { + gap: 20px; + flex-wrap: wrap; + } +} + +/* ---------- Section shared ---------- */ +.section { + padding: 96px 0; +} + +.section__head { + margin-bottom: 48px; + max-width: 60ch; +} + +.section__title { + font-size: clamp(2rem, 3.4vw, 2.7rem); + font-weight: 600; + letter-spacing: -0.01em; + margin-bottom: 14px; +} + +.section__lead { + color: var(--text-muted); + line-height: 1.65; + font-size: 1.08rem; +} + +@media (max-width: 768px) { + .section { + padding: 64px 0; + } +} + +/* ---------- About ---------- */ +.about__grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 56px; +} + +.about__bio p { + color: var(--text-muted); + line-height: 1.7; + margin-bottom: 16px; +} + +.about__identity { + font-family: var(--font-mono); + font-size: 0.85rem; + color: var(--accent); + margin-bottom: 20px; + display: block; +} + +.skills { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 12px; +} + +.skill-tag { + display: flex; + align-items: center; + gap: 10px; + padding: 12px 14px; + border: 1px dashed var(--border); + border-radius: var(--radius-sm); + background: var(--bg-elevated); + font-size: 0.88rem; +} + +.skill-tag i { + color: var(--accent); + font-size: 1.1rem; +} + +.timeline { + margin-top: 40px; + display: flex; + flex-direction: column; + gap: 0; + border-left: 1px dashed var(--border); + padding-left: 24px; +} + +.timeline__item { + position: relative; + padding-bottom: 24px; +} + +.timeline__item:last-child { + padding-bottom: 0; +} + +.timeline__item::before { + content: ""; + position: absolute; + left: -29px; + top: 4px; + width: 9px; + height: 9px; + border-radius: 50%; + background: var(--accent); +} + +.timeline__year { + font-family: var(--font-mono); + font-size: 0.8rem; + color: var(--accent); + display: block; + margin-bottom: 4px; +} + +.timeline__label { + font-size: 0.94rem; + color: var(--text-muted); +} + +@media (max-width: 768px) { + .about__grid { + grid-template-columns: 1fr; + gap: 40px; + } + .skills { + grid-template-columns: 1fr 1fr; + } +} + +@media (max-width: 480px) { + .skills { + grid-template-columns: 1fr; + } +} + +/* ---------- Infrastructure (map-dominant, asymmetric) ---------- */ +.infra { + background: var(--bg-elevated); + border-top: 1px solid var(--border-faint); + border-bottom: 1px solid var(--border-faint); +} + +.infra__grid { + display: grid; + grid-template-columns: 1.3fr 1fr; + gap: 56px; + align-items: start; +} + +.infra__stats { + display: flex; + gap: 40px; + margin-bottom: 28px; +} + +.stat__value { + font-family: var(--font-mono); + font-size: clamp(2.2rem, 4vw, 3rem); + font-weight: 500; + color: var(--accent); + line-height: 1; +} + +.stat__label { + font-size: 0.85rem; + color: var(--text-muted); + margin-top: 6px; +} + +.infra__globe { + position: relative; + border: 1px dashed var(--border); + border-radius: var(--radius); + padding: 24px; + background: var(--bg); + min-height: 320px; + display: flex; + flex-direction: column; + justify-content: flex-end; + overflow: hidden; +} + +.infra__globe-canvas { + position: absolute; + inset: 0; +} + +.infra__globe.has-live .infra__globe-fallback { + display: none; +} + +.infra__globe-fallback { + display: flex; + flex-wrap: wrap; + gap: 8px; + position: relative; + z-index: 1; +} + +.infra__globe-hint { + position: absolute; + right: 16px; + bottom: 16px; + z-index: 2; + display: inline-flex; + align-items: center; + gap: 8px; + padding: 8px 14px; + border-radius: var(--radius-pill); + border: 1px solid var(--border-faint); + background: color-mix(in srgb, var(--bg-elevated) 85%, transparent); + backdrop-filter: blur(6px); + color: var(--text); + font-size: 0.8rem; +} + +.infra__globe-hint i { + color: var(--accent); +} + +.region-chip { + font-family: var(--font-mono); + font-size: 0.78rem; + padding: 6px 10px; + border-radius: var(--radius-pill); + background: var(--accent-soft); + color: var(--accent); +} + +.infra__services { + display: flex; + flex-direction: column; + gap: 18px; +} + +.service-row { + display: flex; + align-items: flex-start; + gap: 14px; + padding-bottom: 18px; + border-bottom: 1px dashed var(--border-faint); +} + +.service-row:last-child { + border-bottom: none; + padding-bottom: 0; +} + +.service-row i { + font-size: 1.3rem; + color: var(--accent); + margin-top: 2px; +} + +.service-row__name { + font-weight: 600; + font-size: 0.96rem; + margin-bottom: 2px; +} + +.service-row__desc { + font-size: 0.86rem; + color: var(--text-muted); + line-height: 1.55; +} + +@media (max-width: 768px) { + .infra__grid { + grid-template-columns: 1fr; + gap: 36px; + } + .infra__stats { + gap: 28px; + } +} + +/* ---------- Projects (featured + grid) ---------- */ +.project-featured { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 40px; + align-items: center; + padding: 32px; + border: 1px dashed var(--border); + border-radius: var(--radius); + background: var(--bg-elevated); + margin-bottom: 40px; + cursor: pointer; + transition: border-color 0.2s var(--ease-standard); +} + +.project-featured:hover { + border-color: var(--accent); +} + +.project-featured__media { + border-radius: var(--radius-sm); + overflow: hidden; + aspect-ratio: 16/10; + background: var(--bg); + display: flex; + align-items: center; + justify-content: center; + color: var(--text-muted); + font-size: 0.82rem; + text-align: center; + padding: 16px; + border: 1px dashed var(--border-faint); +} + +img.project-featured__media { + padding: 0; + border: none; + object-fit: cover; + width: 100%; +} + +.project-featured__tag { + font-family: var(--font-mono); + font-size: 0.78rem; + color: var(--accent); + margin-bottom: 10px; + display: block; +} + +.project-featured__title { + font-size: 1.6rem; + font-weight: 600; + margin-bottom: 12px; +} + +.project-featured__desc { + color: var(--text-muted); + line-height: 1.6; + font-size: 0.96rem; + margin-bottom: 16px; +} + +.project-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 20px; +} + +.project-card { + padding: 24px; + border: 1px dashed var(--border); + border-radius: var(--radius); + background: var(--bg-elevated); + cursor: pointer; + transition: border-color 0.2s var(--ease-standard), transform 0.15s var(--ease-standard); +} + +.project-card:hover { + border-color: var(--accent); + transform: translateY(-2px); +} + +.project-card__title { + font-weight: 600; + font-size: 1.05rem; + margin-bottom: 8px; +} + +.project-card__desc { + font-size: 0.88rem; + color: var(--text-muted); + line-height: 1.55; +} + +.project-empty { + padding: 32px; + border: 1px dashed var(--border-faint); + border-radius: var(--radius); + text-align: center; + color: var(--text-muted); + font-size: 0.9rem; + grid-column: 1 / -1; +} + +@media (max-width: 768px) { + .project-featured { + grid-template-columns: 1fr; + } + .project-grid { + grid-template-columns: 1fr; + } +} + +/* ---------- Modal ---------- */ +.modal-overlay { + position: fixed; + inset: 0; + z-index: 100; + background: color-mix(in srgb, var(--bg) 55%, rgba(0, 0, 0, 0.4)); + backdrop-filter: blur(4px); + display: flex; + align-items: center; + justify-content: center; + padding: 24px; + opacity: 0; + pointer-events: none; + transition: opacity 0.25s var(--ease-standard); +} + +.modal-overlay.is-open { + opacity: 1; + pointer-events: auto; +} + +.modal { + background: var(--bg-elevated); + border: 1px solid var(--border); + border-radius: var(--radius); + max-width: 560px; + width: 100%; + max-height: 85vh; + overflow-y: auto; + padding: 32px; + transform: translateY(12px) scale(0.98); + transition: transform 0.25s var(--ease-standard); +} + +.modal-overlay.is-open .modal { + transform: translateY(0) scale(1); +} + +.modal__close { + position: absolute; + top: 16px; + right: 16px; +} + +.modal__tag { + font-family: var(--font-mono); + font-size: 0.78rem; + color: var(--accent); + display: block; + margin-bottom: 8px; +} + +.modal__title { + font-size: 1.4rem; + font-weight: 600; + margin-bottom: 16px; +} + +.modal__media { + aspect-ratio: 16/10; + border-radius: var(--radius-sm); + border: 1px dashed var(--border-faint); + background: var(--bg); + display: flex; + align-items: center; + justify-content: center; + color: var(--text-muted); + font-size: 0.82rem; + text-align: center; + padding: 16px; + margin-bottom: 20px; + overflow: hidden; +} + +img.modal__media { + padding: 0; + border: none; + object-fit: cover; + width: 100%; +} + +.modal__desc { + color: var(--text-muted); + line-height: 1.7; + font-size: 0.95rem; + margin-bottom: 20px; +} + +.modal__stack { + display: flex; + flex-wrap: wrap; + gap: 8px; + margin-bottom: 24px; +} + +.stack-chip { + font-family: var(--font-mono); + font-size: 0.76rem; + padding: 5px 10px; + border-radius: var(--radius-pill); + background: var(--accent-soft); + color: var(--accent); +} + +@media (prefers-reduced-motion: reduce) { + .modal-overlay, + .modal { + transition: none; + } +} + +/* ---------- Contact (centered minimal) ---------- */ +.contact { + text-align: center; +} + +.contact__links { + display: flex; + justify-content: center; + gap: 16px; + flex-wrap: wrap; +} + +.contact-link { + display: flex; + align-items: center; + gap: 10px; + padding: 14px 22px; + border: 1px dashed var(--border); + border-radius: var(--radius-pill); + font-size: 0.92rem; + font-weight: 500; + transition: border-color 0.2s var(--ease-standard), transform 0.15s var(--ease-standard); +} + +.contact-link:hover { + border-color: var(--accent); + transform: translateY(-2px); +} + +.contact-link i { + color: var(--accent); + font-size: 1.1rem; +} + +/* ---------- Footer ---------- */ +.footer { + padding: 32px 0; + text-align: center; + font-size: 0.82rem; + color: var(--text-muted); + border-top: 1px solid var(--border-faint); +} + + + + + diff --git a/src/styles/tokens.css b/src/styles/tokens.css new file mode 100644 index 0000000..ab34741 --- /dev/null +++ b/src/styles/tokens.css @@ -0,0 +1,64 @@ +/* + Woven Canvas design tokens. + Theme resolution order: [data-theme] attribute (user override, persisted) + > prefers-color-scheme (system default). Never pure #000/#fff. +*/ + +:root { + --font-display: "Outfit", -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif; + --font-mono: "IBM Plex Mono", "SFMono-Regular", monospace; + + --radius: 12px; + --radius-sm: 8px; + --radius-pill: 999px; + + --accent: #3b4fa3; + --accent-strong: #2e3d82; + --accent-soft: rgba(59, 79, 163, 0.12); + + --nav-height: 64px; + --content-max: 1160px; + + --ease-standard: cubic-bezier(0.16, 1, 0.3, 1); + + color-scheme: light dark; +} + +/* Light (default) */ +:root, +:root[data-theme="light"] { + --bg: #edece8; + --bg-elevated: #f5f4f1; + --text: #2a2b2e; + --text-muted: #5a5b60; + --border: rgba(59, 79, 163, 0.35); + --border-faint: rgba(42, 43, 46, 0.12); + --texture-line: rgba(42, 43, 46, 0.045); + --shadow: 0 10px 30px rgba(42, 43, 46, 0.08); +} + +/* Dark override via explicit attribute */ +:root[data-theme="dark"] { + --bg: #14161c; + --bg-elevated: #1b1e26; + --text: #e8e8ea; + --text-muted: #a3a5ac; + --border: rgba(122, 145, 232, 0.4); + --border-faint: rgba(232, 232, 234, 0.12); + --texture-line: rgba(232, 232, 234, 0.05); + --shadow: 0 10px 30px rgba(0, 0, 0, 0.35); +} + +/* System dark preference, only applies when user has not overridden */ +@media (prefers-color-scheme: dark) { + :root:not([data-theme="light"]):not([data-theme="dark"]) { + --bg: #14161c; + --bg-elevated: #1b1e26; + --text: #e8e8ea; + --text-muted: #a3a5ac; + --border: rgba(122, 145, 232, 0.4); + --border-faint: rgba(232, 232, 234, 0.12); + --texture-line: rgba(232, 232, 234, 0.05); + --shadow: 0 10px 30px rgba(0, 0, 0, 0.35); + } +} diff --git a/src/theme.ts b/src/theme.ts new file mode 100644 index 0000000..0b91f6c --- /dev/null +++ b/src/theme.ts @@ -0,0 +1,50 @@ +export type Theme = "light" | "dark"; + +const STORAGE_KEY = "pw-theme"; + +function systemPrefersDark(): boolean { + return window.matchMedia("(prefers-color-scheme: dark)").matches; +} + +function detectTheme(): Theme { + const stored = localStorage.getItem(STORAGE_KEY); + if (stored === "light" || stored === "dark") return stored; + return systemPrefersDark() ? "dark" : "light"; +} + +let currentTheme: Theme = detectTheme(); +const listeners = new Set<(theme: Theme) => void>(); + +export function getTheme(): Theme { + return currentTheme; +} + +export function setTheme(theme: Theme): void { + currentTheme = theme; + localStorage.setItem(STORAGE_KEY, theme); + document.documentElement.setAttribute("data-theme", theme); + listeners.forEach((fn) => fn(theme)); +} + +export function toggleTheme(): void { + setTheme(currentTheme === "dark" ? "light" : "dark"); +} + +export function onThemeChange(fn: (theme: Theme) => void): () => void { + listeners.add(fn); + return () => listeners.delete(fn); +} + +export function initTheme(): void { + document.documentElement.setAttribute("data-theme", currentTheme); + + // Only follow live system changes if the user has never made an explicit choice. + if (!localStorage.getItem(STORAGE_KEY)) { + window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", (e) => { + if (localStorage.getItem(STORAGE_KEY)) return; + currentTheme = e.matches ? "dark" : "light"; + document.documentElement.setAttribute("data-theme", currentTheme); + listeners.forEach((fn) => fn(currentTheme)); + }); + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..206b5e0 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "es2023", + "module": "esnext", + "lib": ["ES2023", "DOM"], + "types": ["vite/client"], + "allowArbitraryExtensions": true, + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +}