From 2bd5bff4e0a211306e39d1a8c765100801081586 Mon Sep 17 00:00:00 2001 From: John Axe Date: Tue, 4 Aug 2026 12:26:47 +0400 Subject: [PATCH 1/3] chore: add prettier and astro check MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Minimal validation for the site — formatting and type checking / compilation. Two tools, four devDependencies: - prettier + prettier-plugin-astro, config matching the code style already in the repo (single quotes, semicolons, printWidth 100) - @astrojs/check + typescript, wired as `npm run typecheck`. astro build alone does not typecheck: it strips TS via esbuild, so a bad product tag or a malformed code token would compile fine and only surface as a broken card in the browser. astro check rejects it at the source. `npm run validate` chains format:check + typecheck + build. Deliberately not included, to keep the dependency footprint small: - eslint (+ eslint-plugin-astro, typescript-eslint) — 3 packages and a config to police ~30 lines of inline DOM wiring; astro check already covers the type-level errors that actually break this site. Worth ~55 npm packages; can be added later if the JS surface grows. - vitest — the tests I would write here (product has a recognized tag, code tokens use a known syntax class, required fields present) are the same invariants `Product`/`CodeToken` already encode as types and astro check already enforces. Runtime assertions restating the type system are upkeep without coverage. site.ts also gets a // prettier-ignore above each product's code: array. Each array packs several token tuples per line so the line mirrors the source line it renders as; prettier's default array breaking (one tuple per line) would expand each snippet to 20+ lines and lose that. --- .prettierignore | 8 + .prettierrc.json | 15 + package-lock.json | 1046 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 15 +- src/data/site.ts | 12 + 5 files changed, 1095 insertions(+), 1 deletion(-) create mode 100644 .prettierignore create mode 100644 .prettierrc.json diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..f42c780 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,8 @@ +dist/ +.astro/ +node_modules/ +package-lock.json + +# org-facing content, not site source — left as authored +README.md +profile/ diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..8f091cd --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,15 @@ +{ + "singleQuote": true, + "semi": true, + "printWidth": 100, + "trailingComma": "all", + "plugins": ["prettier-plugin-astro"], + "overrides": [ + { + "files": "*.astro", + "options": { + "parser": "astro" + } + } + ] +} diff --git a/package-lock.json b/package-lock.json index 372a28e..8b9222b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,8 +7,73 @@ "name": "galaxio-org-site", "dependencies": { "astro": "^7.1.6" + }, + "devDependencies": { + "@astrojs/check": "^0.9.10", + "prettier": "^3.9.6", + "prettier-plugin-astro": "^0.14.1", + "typescript": "^6.0.3" + }, + "engines": { + "node": ">=22.12.0" } }, + "node_modules/@astrojs/check": { + "version": "0.9.10", + "resolved": "https://registry.npmjs.org/@astrojs/check/-/check-0.9.10.tgz", + "integrity": "sha512-zgx/UQMozdjOa3bOxjgeCFdtpE3c9rRX6xHwa+2QXvy8z8Akifu2AtubHyv/zzC2znO8dl8fFWL4K+Ba9kS8HQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@astrojs/language-server": "^2.16.7", + "chokidar": "^4.0.3", + "kleur": "^4.1.5", + "yargs": "^18.0.0" + }, + "bin": { + "astro-check": "bin/astro-check.js" + }, + "peerDependencies": { + "typescript": "^5.0.0 || ^6.0.0" + } + }, + "node_modules/@astrojs/check/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@astrojs/check/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@astrojs/compiler": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.13.1.tgz", + "integrity": "sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg==", + "dev": true, + "license": "MIT" + }, "node_modules/@astrojs/compiler-binding": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding/-/compiler-binding-0.3.2.tgz", @@ -213,6 +278,48 @@ "unified": "^11.0.5" } }, + "node_modules/@astrojs/language-server": { + "version": "2.16.13", + "resolved": "https://registry.npmjs.org/@astrojs/language-server/-/language-server-2.16.13.tgz", + "integrity": "sha512-ekOa+CYprEq5n4EJC1qTIAhLk49HZIUQuFwrEuF+3JK/pdMaYnWoREFUI2A0KEPOJiFA2kamBzKzbYljDvUxLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@astrojs/compiler": "^2.13.1", + "@astrojs/yaml2ts": "^0.2.4", + "@jridgewell/sourcemap-codec": "^1.5.5", + "@volar/kit": "~2.4.28", + "@volar/language-core": "~2.4.28", + "@volar/language-server": "~2.4.28", + "@volar/language-service": "~2.4.28", + "muggle-string": "^0.4.1", + "tinyglobby": "^0.2.16", + "volar-service-css": "0.0.71", + "volar-service-emmet": "0.0.71", + "volar-service-html": "0.0.71", + "volar-service-prettier": "0.0.71", + "volar-service-typescript": "0.0.71", + "volar-service-typescript-twoslash-queries": "0.0.71", + "volar-service-yaml": "0.0.71", + "vscode-html-languageservice": "^5.6.2", + "vscode-uri": "^3.1.0" + }, + "bin": { + "astro-ls": "bin/nodeServer.js" + }, + "peerDependencies": { + "prettier": "^3.0.0", + "prettier-plugin-astro": ">=0.11.0" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + }, + "prettier-plugin-astro": { + "optional": true + } + } + }, "node_modules/@astrojs/markdown-satteri": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@astrojs/markdown-satteri/-/markdown-satteri-0.3.5.tgz", @@ -253,6 +360,16 @@ "node": "18.20.8 || ^20.3.0 || >=22.0.0" } }, + "node_modules/@astrojs/yaml2ts": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@astrojs/yaml2ts/-/yaml2ts-0.2.4.tgz", + "integrity": "sha512-8oddpOae35pJsXPQXhTkM0ypfKPskVsh2bCxRtbf7e+/Epw2nReakFYpLKjZMEr75CsoF203PMnCocpfz0s69A==", + "dev": true, + "license": "MIT", + "dependencies": { + "yaml": "^2.8.3" + } + }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", @@ -481,6 +598,68 @@ "sisteransi": "^1.0.5" } }, + "node_modules/@emmetio/abbreviation": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@emmetio/abbreviation/-/abbreviation-2.3.3.tgz", + "integrity": "sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@emmetio/scanner": "^1.0.4" + } + }, + "node_modules/@emmetio/css-abbreviation": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@emmetio/css-abbreviation/-/css-abbreviation-2.1.8.tgz", + "integrity": "sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@emmetio/scanner": "^1.0.4" + } + }, + "node_modules/@emmetio/css-parser": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@emmetio/css-parser/-/css-parser-0.4.1.tgz", + "integrity": "sha512-2bC6m0MV/voF4CTZiAbG5MWKbq5EBmDPKu9Sb7s7nVcEzNQlrZP6mFFFlIaISM8X6514H9shWMme1fCm8cWAfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@emmetio/stream-reader": "^2.2.0", + "@emmetio/stream-reader-utils": "^0.1.0" + } + }, + "node_modules/@emmetio/html-matcher": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@emmetio/html-matcher/-/html-matcher-1.3.0.tgz", + "integrity": "sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@emmetio/scanner": "^1.0.0" + } + }, + "node_modules/@emmetio/scanner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@emmetio/scanner/-/scanner-1.0.4.tgz", + "integrity": "sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@emmetio/stream-reader": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@emmetio/stream-reader/-/stream-reader-2.2.0.tgz", + "integrity": "sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@emmetio/stream-reader-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@emmetio/stream-reader-utils/-/stream-reader-utils-0.1.0.tgz", + "integrity": "sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==", + "dev": true, + "license": "MIT" + }, "node_modules/@emnapi/core": { "version": "1.11.3", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.3.tgz", @@ -1428,6 +1607,111 @@ "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==", "license": "ISC" }, + "node_modules/@volar/kit": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/kit/-/kit-2.4.28.tgz", + "integrity": "sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-service": "2.4.28", + "@volar/typescript": "2.4.28", + "typesafe-path": "^0.2.2", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz", + "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.28" + } + }, + "node_modules/@volar/language-server": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/language-server/-/language-server-2.4.28.tgz", + "integrity": "sha512-NqcLnE5gERKuS4PUFwlhMxf6vqYo7hXtbMFbViXcbVkbZ905AIVWhnSo0ZNBC2V127H1/2zP7RvVOVnyITFfBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "@volar/language-service": "2.4.28", + "@volar/typescript": "2.4.28", + "path-browserify": "^1.0.1", + "request-light": "^0.7.0", + "vscode-languageserver": "^9.0.1", + "vscode-languageserver-protocol": "^3.17.5", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@volar/language-service": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/language-service/-/language-service-2.4.28.tgz", + "integrity": "sha512-Rh/wYCZJrI5vCwMk9xyw/Z+MsWxlJY1rmMZPsxUoJKfzIRjS/NF1NmnuEcrMbEVGja00aVpCsInJfixQTMdvLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "vscode-languageserver-protocol": "^3.17.5", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz", + "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz", + "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vscode/emmet-helper": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@vscode/emmet-helper/-/emmet-helper-2.11.0.tgz", + "integrity": "sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "emmet": "^2.4.3", + "jsonc-parser": "^2.3.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "^3.15.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vscode/emmet-helper/node_modules/jsonc-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz", + "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vscode/l10n": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.18.tgz", + "integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==", + "dev": true, + "license": "MIT" + }, "node_modules/am-i-vibing": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/am-i-vibing/-/am-i-vibing-0.4.0.tgz", @@ -1440,6 +1724,32 @@ "am-i-vibing": "dist/cli.mjs" } }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -2100,6 +2410,39 @@ "node": ">=8" } }, + "node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -2353,6 +2696,30 @@ "node": ">=4" } }, + "node_modules/emmet": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/emmet/-/emmet-2.4.11.tgz", + "integrity": "sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==", + "dev": true, + "license": "MIT", + "workspaces": [ + "./packages/scanner", + "./packages/abbreviation", + "./packages/css-abbreviation", + "./" + ], + "dependencies": { + "@emmetio/abbreviation": "^2.3.3", + "@emmetio/css-abbreviation": "^2.1.8" + } + }, + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, "node_modules/entities": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", @@ -2370,6 +2737,16 @@ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==" }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", @@ -2386,6 +2763,13 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "license": "MIT" }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, "node_modules/fast-string-truncated-width": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-1.2.1.tgz", @@ -2399,6 +2783,23 @@ "fast-string-truncated-width": "^1.2.0" } }, + "node_modules/fast-uri": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", + "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/fast-wrap-ansi": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.1.6.tgz", @@ -2463,6 +2864,29 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-tsconfig": { "version": "5.0.0-beta.4", "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-5.0.0-beta.4.tgz", @@ -2687,6 +3111,16 @@ "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", "license": "MIT" }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/lightningcss": { "version": "1.33.0", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", @@ -3098,6 +3532,13 @@ "node": ">=10" } }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, + "license": "MIT" + }, "node_modules/nanoid": { "version": "3.3.17", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.17.tgz", @@ -3265,6 +3706,13 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, "node_modules/piccolore": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/piccolore/-/piccolore-0.1.3.tgz", @@ -3315,6 +3763,37 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/prettier": { + "version": "3.9.6", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz", + "integrity": "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-astro": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/prettier-plugin-astro/-/prettier-plugin-astro-0.14.1.tgz", + "integrity": "sha512-RiBETaaP9veVstE4vUwSIcdATj6dKmXljouXc/DDNwBSPTp8FRkLGDSGFClKsAFeeg+13SB0Z1JZvbD76bigJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@astrojs/compiler": "^2.9.1", + "prettier": "^3.0.0", + "sass-formatter": "^0.7.6" + }, + "engines": { + "node": "^14.15.0 || >=16.0.0" + } + }, "node_modules/prismjs": { "version": "1.30.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", @@ -3384,6 +3863,23 @@ "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", "license": "MIT" }, + "node_modules/request-light": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.7.0.tgz", + "integrity": "sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", @@ -3440,6 +3936,23 @@ "@rolldown/binding-win32-x64-msvc": "1.2.2" } }, + "node_modules/s.color": { + "version": "0.0.15", + "resolved": "https://registry.npmjs.org/s.color/-/s.color-0.0.15.tgz", + "integrity": "sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==", + "dev": true, + "license": "MIT" + }, + "node_modules/sass-formatter": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/sass-formatter/-/sass-formatter-0.7.9.tgz", + "integrity": "sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "suf-log": "^2.5.3" + } + }, "node_modules/satteri": { "version": "0.9.5", "resolved": "https://registry.npmjs.org/satteri/-/satteri-0.9.5.tgz", @@ -3580,6 +4093,23 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/string-width": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz", + "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/stringify-entities": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", @@ -3594,6 +4124,32 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/suf-log": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/suf-log/-/suf-log-2.5.3.tgz", + "integrity": "sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==", + "dev": true, + "license": "MIT", + "dependencies": { + "s.color": "0.0.15" + } + }, "node_modules/svgo": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.1.tgz", @@ -3681,6 +4237,37 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "optional": true }, + "node_modules/typesafe-path": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/typesafe-path/-/typesafe-path-0.2.2.tgz", + "integrity": "sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==", + "dev": true, + "license": "MIT" + }, + "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/typescript-auto-import-cache": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/typescript-auto-import-cache/-/typescript-auto-import-cache-0.3.6.tgz", + "integrity": "sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.3.8" + } + }, "node_modules/ufo": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", @@ -4020,6 +4607,289 @@ } } }, + "node_modules/volar-service-css": { + "version": "0.0.71", + "resolved": "https://registry.npmjs.org/volar-service-css/-/volar-service-css-0.0.71.tgz", + "integrity": "sha512-wRRFt9BpjMKCazcgOh67MSjUjiWUCAh99DyYSDIOTuxaRjEtDC7PpB0k1Y1wbJIW/pVtMUSVbpPo3UGSm0Byxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "vscode-css-languageservice": "^6.3.0", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } + } + }, + "node_modules/volar-service-emmet": { + "version": "0.0.71", + "resolved": "https://registry.npmjs.org/volar-service-emmet/-/volar-service-emmet-0.0.71.tgz", + "integrity": "sha512-zqjzt6bN95e3CUstBm0PBFAJnrfz0ZAARka87fart46/gNCLLuP3Vujy8V/J8HEziTFLnfkgIASLFYPUhonJcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@emmetio/css-parser": "^0.4.1", + "@emmetio/html-matcher": "^1.3.0", + "@vscode/emmet-helper": "^2.9.3", + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } + } + }, + "node_modules/volar-service-html": { + "version": "0.0.71", + "resolved": "https://registry.npmjs.org/volar-service-html/-/volar-service-html-0.0.71.tgz", + "integrity": "sha512-e8tHPhgQ7ooLfudAEIku+kgd9pWkq3SSz8RbnQDI1+Eb8wbenkLGHqoirLqz5ORLV6wIMr2Iv08RWBG5eOcgpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "vscode-html-languageservice": "^5.3.0", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } + } + }, + "node_modules/volar-service-prettier": { + "version": "0.0.71", + "resolved": "https://registry.npmjs.org/volar-service-prettier/-/volar-service-prettier-0.0.71.tgz", + "integrity": "sha512-Rz7JVH3qD108UCdmIEiZvOBNljMt2nLFdbN8AXcDfn7xD9F5I2aCIsDVqBbXw21PsnxG0b7MfwtNF+zPS/NKUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0", + "prettier": "^2.2 || ^3.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + }, + "prettier": { + "optional": true + } + } + }, + "node_modules/volar-service-typescript": { + "version": "0.0.71", + "resolved": "https://registry.npmjs.org/volar-service-typescript/-/volar-service-typescript-0.0.71.tgz", + "integrity": "sha512-yTtM/BVT6hoyEYnDtaCyAtNhdNeS/mhTTABlBOdw3NNiRBUin3IznFJpgfjer4c6RYopiPjjQjc9VFhxVl1mLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-browserify": "^1.0.1", + "semver": "^7.6.2", + "typescript-auto-import-cache": "^0.3.5", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-nls": "^5.2.0", + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } + } + }, + "node_modules/volar-service-typescript-twoslash-queries": { + "version": "0.0.71", + "resolved": "https://registry.npmjs.org/volar-service-typescript-twoslash-queries/-/volar-service-typescript-twoslash-queries-0.0.71.tgz", + "integrity": "sha512-9K2k72s4n7rV9s4bX0MyjbX9iBribvKZbBJKuEmTCZfeWJXs6Yh7bGpY4eoc7UufAjvpheBqwyZCOIPBvxCv0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } + } + }, + "node_modules/volar-service-yaml": { + "version": "0.0.71", + "resolved": "https://registry.npmjs.org/volar-service-yaml/-/volar-service-yaml-0.0.71.tgz", + "integrity": "sha512-qYGWGuVpUTnZGu5P/CR4KLK4aIR8RrcVnmfZ2eRcj9q/I8VZCoC5yy9FtEvfNvnDp4MU17yhdJcvpQPIqhJS2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "vscode-uri": "^3.0.8", + "yaml-language-server": "~1.23.0" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } + } + }, + "node_modules/vscode-css-languageservice": { + "version": "6.3.10", + "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-6.3.10.tgz", + "integrity": "sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vscode/l10n": "^0.0.18", + "vscode-languageserver-textdocument": "^1.0.12", + "vscode-languageserver-types": "3.17.5", + "vscode-uri": "^3.1.0" + } + }, + "node_modules/vscode-css-languageservice/node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "dev": true, + "license": "MIT" + }, + "node_modules/vscode-html-languageservice": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-5.6.2.tgz", + "integrity": "sha512-ulCrSnFnfQ16YzvwnYUgEbUEl/ZG7u2eV27YhvLObSHKkb8fw1Z9cgsnUwjTEeDIdJDoTDTDpxuhQwoenoLNMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vscode/l10n": "^0.0.18", + "vscode-languageserver-textdocument": "^1.0.12", + "vscode-languageserver-types": "^3.17.5", + "vscode-uri": "^3.1.0" + } + }, + "node_modules/vscode-json-languageservice": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-4.1.8.tgz", + "integrity": "sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "jsonc-parser": "^3.0.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "^3.16.0", + "vscode-nls": "^5.0.0", + "vscode-uri": "^3.0.2" + }, + "engines": { + "npm": ">=7.0.0" + } + }, + "node_modules/vscode-jsonrpc": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.1.tgz", + "integrity": "sha512-rfuA6T75H6m5EkbhtEPzre9pT0HPcDI2MMy4+nPFIBks5J8JBAUHD4tRYSgaBOijIEC7SRkC1kKyXTLqbmh9jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "vscode-languageserver-protocol": "3.17.5" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.18.2", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.18.2.tgz", + "integrity": "sha512-XRyDbT0Pp3sSNti3JmxVEUMySWCSi1hhM+/KUlCy1hV1zmrqpM1OwO12EAki8blhmLuIMpaJrYbo0OzGVfK2Qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "vscode-jsonrpc": "9.0.1", + "vscode-languageserver-types": "3.18.0" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", + "dev": true, + "license": "MIT" + }, + "node_modules/vscode-languageserver-types": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.18.0.tgz", + "integrity": "sha512-8TsGPNMIMiiBdkORgRSvLjuiEIiAFtO+KssmYWxQ+uSVvlf7RjK8YKCOjPzZ+YA04jXEV7+7LvkSmHkhpNS99g==", + "dev": true, + "license": "MIT" + }, + "node_modules/vscode-languageserver/node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver/node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "dev": true, + "license": "MIT", + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/vscode-languageserver/node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "dev": true, + "license": "MIT" + }, + "node_modules/vscode-nls": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-5.2.0.tgz", + "integrity": "sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==", + "dev": true, + "license": "MIT" + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true, + "license": "MIT" + }, "node_modules/web-namespaces": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", @@ -4030,11 +4900,187 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/xxhash-wasm": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz", "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==" }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "devOptional": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yaml-language-server": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/yaml-language-server/-/yaml-language-server-1.23.0.tgz", + "integrity": "sha512-3qVyCOexLCWw06PQa5kRPwvMWMZ/eZeCRWUvgD6a0OkqL/4iCnxy2WumbWifa937Uo5xhyWJ0uxlU39ljhNh7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vscode/l10n": "^0.0.18", + "ajv": "^8.17.1", + "ajv-draft-04": "^1.0.0", + "ajv-i18n": "^4.2.0", + "prettier": "^3.8.1", + "request-light": "^0.5.7", + "vscode-json-languageservice": "4.1.8", + "vscode-languageserver": "^9.0.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "^3.16.0", + "vscode-uri": "^3.0.2", + "yaml": "2.8.3" + }, + "bin": { + "yaml-language-server": "bin/yaml-language-server" + } + }, + "node_modules/yaml-language-server/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/yaml-language-server/node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/yaml-language-server/node_modules/ajv-i18n": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ajv-i18n/-/ajv-i18n-4.2.0.tgz", + "integrity": "sha512-v/ei2UkCEeuKNXh8RToiFsUclmU+G57LO1Oo22OagNMENIw+Yb8eMwvHu7Vn9fmkjJyv6XclhJ8TbuigSglPkg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^8.0.0-beta.0" + } + }, + "node_modules/yaml-language-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/yaml-language-server/node_modules/request-light": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.5.8.tgz", + "integrity": "sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==", + "dev": true, + "license": "MIT" + }, + "node_modules/yaml-language-server/node_modules/yaml": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", + "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.1.0.tgz", + "integrity": "sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^8.2.1", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, "node_modules/yargs-parser": { "version": "22.0.0", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", diff --git a/package.json b/package.json index 9da22f2..35fc285 100644 --- a/package.json +++ b/package.json @@ -2,12 +2,25 @@ "name": "galaxio-org-site", "private": true, "type": "module", + "engines": { + "node": ">=22.12.0" + }, "scripts": { "dev": "astro dev", "build": "astro build", - "preview": "astro preview" + "preview": "astro preview", + "format": "prettier --write .", + "format:check": "prettier --check .", + "typecheck": "astro check", + "validate": "npm run format:check && npm run typecheck && npm run build" }, "dependencies": { "astro": "^7.1.6" + }, + "devDependencies": { + "@astrojs/check": "^0.9.10", + "prettier": "^3.9.6", + "prettier-plugin-astro": "^0.14.1", + "typescript": "^6.0.3" } } diff --git a/src/data/site.ts b/src/data/site.ts index 0b69204..513dc6d 100644 --- a/src/data/site.ts +++ b/src/data/site.ts @@ -62,6 +62,7 @@ export const productGroups: ProductGroup[] = [ 'Gatling 3.13.5 · Scala 2.13.16 · Java 17+', ], lang: 'scala · build.sbt + simulation', + // prettier-ignore code: [ ['com', '// build.sbt\n'], ['key', 'libraryDependencies'], ['', ' += '], ['str', '"org.galaxio" %% "gatling-kafka-plugin" % ""'], ['', ' % Test\n\n'], @@ -93,6 +94,7 @@ export const productGroups: ProductGroup[] = [ 'Gatling 3.13.x · Scala 2.13 · Java 11+', ], lang: 'scala · build.sbt + simulation', + // prettier-ignore code: [ ['com', '// build.sbt — plugin + your JDBC driver\n'], ['key', 'libraryDependencies'], ['', ' ++= '], ['fn', 'Seq'], ['', '(\n'], @@ -128,6 +130,7 @@ export const productGroups: ProductGroup[] = [ 'Gatling 3.13.x · Scala 2.13 · Java 17+', ], lang: 'scala · build.sbt + simulation', + // prettier-ignore code: [ ['com', '// build.sbt\n'], ['key', 'libraryDependencies'], ['', ' += '], ['str', '"org.galaxio" %% "gatling-amqp-plugin" % ""'], ['', ' % Test\n\n'], @@ -163,6 +166,7 @@ export const productGroups: ProductGroup[] = [ 'Gatling 3.13.x since 1.12.0 · Scala 2.13 · Java 17+', ], lang: 'scala · build.sbt + simulation', + // prettier-ignore code: [ ['com', '// build.sbt\n'], ['key', 'libraryDependencies'], ['', ' += '], ['str', '"org.galaxio" %% "gatling-picatinny" % "VERSION"'], ['', ' % Test\n\n'], @@ -199,6 +203,7 @@ export const productGroups: ProductGroup[] = [ 'Apache-2.0 · Node >= 22 · Agent Skills standard', ], lang: 'shell · install', + // prettier-ignore code: [ ['com', '# Claude Code\n'], ['', '$ claude plugin marketplace add galax-io/ai-plugins\n\n'], @@ -233,6 +238,7 @@ export const productGroups: ProductGroup[] = [ 'macOS, Linux, Windows · go install, shell installer, or Docker', ], lang: 'shell', + // prettier-ignore code: [ ['com', '# install (macOS / Linux)\n'], ['', '$ curl -fsSL https://raw.githubusercontent.com/galax-io/\\\n'], @@ -262,6 +268,7 @@ export const productGroups: ProductGroup[] = [ 'Pack 0.15.0 · Gatling 3.13.5 · Picatinny 1.17.1', ], lang: 'shell', + // prettier-ignore code: [ ['com', '# scaffold, then enable optional plugin modules\n'], ['', '$ galaxio template init gatling/scala-sbt \\\n'], @@ -288,6 +295,7 @@ export const productGroups: ProductGroup[] = [ 'Swap in your own with template configure --registry', ], lang: 'shell', + // prettier-ignore code: [ ['com', '# the default registry needs no setup, but you can inspect it\n'], ['', '$ galaxio template configure --show\n'], @@ -322,6 +330,7 @@ export const productGroups: ProductGroup[] = [ 'Status: research & design — the design lives in docs/', ], lang: 'shell · specify', + // prettier-ignore code: [ ['com', '# discover\n'], ['', '$ specify preset search perf\n'], @@ -348,6 +357,7 @@ export const productGroups: ProductGroup[] = [ 'Installs 7 spec-kit extensions + a preset', ], lang: 'shell · copier', + // prettier-ignore code: [ ['com', '# install Copier once, isolated\n'], ['', '$ uv tool install copier '], ['com', '# or: pipx install copier'], ['', '\n\n'], @@ -380,6 +390,7 @@ export const productGroups: ProductGroup[] = [ 'Pairs with gatling-kafka-plugin Avro support', ], lang: 'scala · plugins.sbt', + // prettier-ignore code: [ ['com', '// project/plugins.sbt\n'], ['fn', 'addSbtPlugin'], ['', '('], ['str', '"org.galaxio" % "sbt-schema-registry-plugin" % ""'], ['', ')\n\n'], @@ -403,6 +414,7 @@ export const productGroups: ProductGroup[] = [ 'Reproducible across CI providers', ], lang: 'shell', + // prettier-ignore code: [ ['com', '# the galaxio CLI is also published as an image\n'], ['', '$ docker pull galaxioteam/galaxio:latest\n\n'], From 2207a5df66bb39fd0275a7022127c74d34da25f1 Mon Sep 17 00:00:00 2001 From: John Axe Date: Tue, 4 Aug 2026 12:26:59 +0400 Subject: [PATCH 2/3] style: apply prettier formatting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mechanical `npm run format` output over the site source, plus a two-line var -> const in BaseLayout's pre-paint theme script. README.md and profile/ are in .prettierignore — they are org-facing content rather than site source, and reflowing their markdown tables would be churn in files this change has no reason to touch. --- .github/dependabot.yml | 16 +- src/components/CodeFrame.astro | 4 +- src/components/Product.astro | 15 +- src/layouts/BaseLayout.astro | 11 +- src/pages/index.astro | 214 +++++++-- src/styles/global.css | 796 +++++++++++++++++++++++++-------- 6 files changed, 807 insertions(+), 249 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 5883331..c6be0ee 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,19 +1,19 @@ version: 2 updates: - - package-ecosystem: "npm" - directory: "/" + - package-ecosystem: 'npm' + directory: '/' schedule: - interval: "weekly" + interval: 'weekly' groups: npm-dependencies: patterns: - - "*" + - '*' - - package-ecosystem: "github-actions" - directory: "/" + - package-ecosystem: 'github-actions' + directory: '/' schedule: - interval: "weekly" + interval: 'weekly' groups: actions-dependencies: patterns: - - "*" + - '*' diff --git a/src/components/CodeFrame.astro b/src/components/CodeFrame.astro index 76b7e96..e285c78 100644 --- a/src/components/CodeFrame.astro +++ b/src/components/CodeFrame.astro @@ -15,5 +15,7 @@ const { lang, codeId, tokens } = Astro.props; {lang} -
{tokens.map(([cls, txt]) => (cls ? {txt} : txt))}
+
+
{tokens.map(([cls, txt]) => (cls ? {txt} : txt))}
+
diff --git a/src/components/Product.astro b/src/components/Product.astro index dd869f1..d3ce02e 100644 --- a/src/components/Product.astro +++ b/src/components/Product.astro @@ -22,14 +22,20 @@ const codeId = `code-${index}`;
{product.name} - + {product.tag}
{product.summary}
@@ -53,7 +59,8 @@ const codeId = `code-${index}`; fill="none" stroke="currentColor" stroke-width="1.8" - stroke-linecap="round"> Repository ↗ diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro index 8d01048..8a6b8c5 100644 --- a/src/layouts/BaseLayout.astro +++ b/src/layouts/BaseLayout.astro @@ -28,8 +28,8 @@ const { title, description } = Astro.props; // yet — before first paint, so there is no flash and no defaulting // to light on a system set to dark (function () { - var stored = localStorage.getItem('galaxio-theme'); - var theme = + const stored = localStorage.getItem('galaxio-theme'); + const theme = stored === 'dark' || stored === 'light' ? stored : window.matchMedia('(prefers-color-scheme: dark)').matches @@ -50,11 +50,8 @@ const { title, description } = Astro.props; > - + ({
- Galaxio·Team + Galaxio·Team
@@ -275,14 +360,16 @@ const groups = productGroups.map((group) => ({

The signal everybody tunes into.

- A live community of performance engineers, contributors and Galaxio maintainers. Ask questions, - share findings, follow releases — in Russian, English and Spanish. + A live community of performance engineers, contributors and Galaxio maintainers. Ask + questions, share findings, follow releases — in Russian, English and Spanish.

10k+Members
24/7Active
-
RU·EN·ESLanguages
+
+ RU·EN·ESLanguages +
({

- Critical features and integrations can be prioritized as a paid engagement. That is the fastest path - when shipping speed matters more than waiting in the regular queue. + Critical features and integrations can be prioritized as a paid engagement. That is the + fastest path when shipping speed matters more than waiting in the regular queue.

Get in touch - @@ -364,8 +457,8 @@ const groups = productGroups.map((group) => ({ Galaxio Team

- Open-source plugins, agent tooling and workflows for performance testing. Named after Asimov's - Galaxia — coordination, scale, systems working as one. + Open-source plugins, agent tooling and workflows for performance testing. Named after + Asimov's Galaxia — coordination, scale, systems working as one.

@@ -417,7 +540,8 @@ const groups = productGroups.map((group) => ({ const themeBtn = document.getElementById('themeBtn'); const themeLabel = themeBtn?.querySelector('.theme-label'); function syncThemeLabel() { - if (themeLabel) themeLabel.textContent = root.getAttribute('data-theme') === 'dark' ? 'Dark' : 'Light'; + if (themeLabel) + themeLabel.textContent = root.getAttribute('data-theme') === 'dark' ? 'Dark' : 'Light'; } syncThemeLabel(); themeBtn?.addEventListener('click', () => { diff --git a/src/styles/global.css b/src/styles/global.css index 0ca3dbf..8c3c267 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -2,34 +2,40 @@ /* Galaxio brand palette — locked: #000000 / #ECECEC / #0000FF */ :root { --ink: #000000; - --paper: #ECECEC; - --white: #FFFFFF; - --blue: #0000FF; + --paper: #ececec; + --white: #ffffff; + --blue: #0000ff; /* light theme defaults — pure white paper */ --bg: var(--white); --bg-alt: var(--paper); --fg: var(--ink); --fg-muted: #6b6b6b; - --hairline: rgba(0,0,0,0.10); - --rule: rgba(0,0,0,0.18); - --rule-strong: rgba(0,0,0,0.6); + --hairline: rgba(0, 0, 0, 0.1); + --rule: rgba(0, 0, 0, 0.18); + --rule-strong: rgba(0, 0, 0, 0.6); --on-blue: var(--white); --paint-blue: var(--blue); } -html[data-theme="dark"] { +html[data-theme='dark'] { --bg: var(--ink); --bg-alt: #0a0a0a; --fg: var(--paper); --fg-muted: #8b8b8b; - --hairline: rgba(255,255,255,0.10); - --rule: rgba(255,255,255,0.18); - --rule-strong: rgba(255,255,255,0.55); + --hairline: rgba(255, 255, 255, 0.1); + --rule: rgba(255, 255, 255, 0.18); + --rule-strong: rgba(255, 255, 255, 0.55); --paint-blue: #2d2dff; } -*,*::before,*::after { box-sizing: border-box; } -html { scroll-behavior: smooth; } +*, +*::before, +*::after { + box-sizing: border-box; +} +html { + scroll-behavior: smooth; +} body { margin: 0; background: var(--bg); @@ -37,15 +43,36 @@ body { font-family: 'Space Grotesk', system-ui, sans-serif; line-height: 1.5; -webkit-font-smoothing: antialiased; - transition: background 320ms ease, color 320ms ease; + transition: + background 320ms ease, + color 320ms ease; overflow-x: hidden; } -a { color: inherit; text-decoration: none; } -button { font: inherit; color: inherit; background: none; border: 0; padding: 0; cursor: pointer; } -img, svg { display: block; max-width: 100%; } -::selection { background: var(--blue); color: var(--white); } +a { + color: inherit; + text-decoration: none; +} +button { + font: inherit; + color: inherit; + background: none; + border: 0; + padding: 0; + cursor: pointer; +} +img, +svg { + display: block; + max-width: 100%; +} +::selection { + background: var(--blue); + color: var(--white); +} -.mono { font-family: 'JetBrains Mono', ui-monospace, monospace; } +.mono { + font-family: 'JetBrains Mono', ui-monospace, monospace; +} .page { max-width: 1480px; @@ -84,16 +111,23 @@ img, svg { display: block; max-width: 100%; } /* pin explicitly: nav.primary is display:none below 920px and would otherwise drop out of grid auto-placement, pulling topbar-actions into its (1fr) column and left-aligning it there */ -.topbar-inner > .brand { grid-column: 1; } -.topbar-inner > nav.primary { grid-column: 2; } -.topbar-inner > .topbar-actions { grid-column: 3; } +.topbar-inner > .brand { + grid-column: 1; +} +.topbar-inner > nav.primary { + grid-column: 2; +} +.topbar-inner > .topbar-actions { + grid-column: 3; +} .brand { display: inline-flex; align-items: center; gap: 12px; } .brand-mark { - width: 38px; height: 38px; + width: 38px; + height: 38px; color: var(--fg); flex: none; } @@ -132,7 +166,9 @@ nav.primary a { padding: 6px 0; position: relative; } -nav.primary a:hover { color: var(--fg); } +nav.primary a:hover { + color: var(--fg); +} nav.primary a::before { content: attr(data-num); font-family: 'JetBrains Mono', monospace; @@ -141,9 +177,17 @@ nav.primary a::before { color: var(--blue); letter-spacing: 0.04em; } -@media (max-width: 920px) { nav.primary { display: none; } } +@media (max-width: 920px) { + nav.primary { + display: none; + } +} -.topbar-actions { display: flex; align-items: center; gap: 10px; } +.topbar-actions { + display: flex; + align-items: center; + gap: 10px; +} .theme-toggle { display: inline-flex; align-items: center; @@ -157,9 +201,12 @@ nav.primary a::before { text-transform: uppercase; transition: border-color 200ms ease; } -.theme-toggle:hover { border-color: var(--rule-strong); } +.theme-toggle:hover { + border-color: var(--rule-strong); +} .theme-toggle .swatch { - width: 16px; height: 16px; + width: 16px; + height: 16px; border-radius: 50%; background: var(--fg); border: 1px solid var(--rule); @@ -178,20 +225,44 @@ nav.primary a::before { letter-spacing: -0.01em; transition: background 200ms; } -html[data-theme="dark"] .gh-btn { background: var(--paper); color: var(--ink); } -.gh-btn:hover { background: var(--blue); color: var(--white); } -.gh-btn svg { width: 16px; height: 16px; } +html[data-theme='dark'] .gh-btn { + background: var(--paper); + color: var(--ink); +} +.gh-btn:hover { + background: var(--blue); + color: var(--white); +} +.gh-btn svg { + width: 16px; + height: 16px; +} /* compact topbar on small screens — full lockup and labels do not fit */ @media (max-width: 640px) { - .topbar-inner { gap: 12px; } - .brand { gap: 10px; } - .brand-mark { width: 32px; height: 32px; } + .topbar-inner { + gap: 12px; + } + .brand { + gap: 10px; + } + .brand-mark { + width: 32px; + height: 32px; + } .brand-name .sep, - .brand-name .team { display: none; } - .theme-toggle { padding: 8px; } - .theme-toggle .theme-label { display: none; } - .gh-btn { padding: 9px 14px; } + .brand-name .team { + display: none; + } + .theme-toggle { + padding: 8px; + } + .theme-toggle .theme-label { + display: none; + } + .gh-btn { + padding: 9px 14px; + } } /* ═══════════════════ HERO ═══════════════════ */ @@ -213,16 +284,29 @@ html[data-theme="dark"] .gh-btn { background: var(--paper); color: var(--ink); } border-bottom: 1px dashed var(--hairline); margin-bottom: clamp(28px, 4vw, 56px); } -.hero-coord-row .sig { color: var(--fg); } +.hero-coord-row .sig { + color: var(--fg); +} .hero-coord-row .blink { - display: inline-block; width: 6px; height: 6px; - border-radius: 50%; background: var(--blue); - margin-right: 8px; vertical-align: middle; + display: inline-block; + width: 6px; + height: 6px; + border-radius: 50%; + background: var(--blue); + margin-right: 8px; + vertical-align: middle; animation: blink 1.4s ease-in-out infinite; } -@keyframes blink { 50% { opacity: 0.25; } } +@keyframes blink { + 50% { + opacity: 0.25; + } +} @media (max-width: 640px) { - .hero-coord-row { flex-direction: column; gap: 10px; } + .hero-coord-row { + flex-direction: column; + gap: 10px; + } } /* Hero composition: orbital diagram + wordmark */ @@ -234,10 +318,15 @@ html[data-theme="dark"] .gh-btn { background: var(--paper); color: var(--ink); } align-items: center; } @media (max-width: 980px) { - .hero-stage { grid-template-columns: 1fr; } + .hero-stage { + grid-template-columns: 1fr; + } } -.hero-text { position: relative; z-index: 2; } +.hero-text { + position: relative; + z-index: 2; +} .hero-eyebrow { display: inline-flex; align-items: center; @@ -252,7 +341,10 @@ html[data-theme="dark"] .gh-btn { background: var(--paper); color: var(--ink); } border-radius: 999px; margin-bottom: 32px; } -.hero-eyebrow svg { width: 12px; height: 12px; } +.hero-eyebrow svg { + width: 12px; + height: 12px; +} .hero-headline { font-size: clamp(56px, 9vw, 148px); @@ -316,17 +408,33 @@ html[data-theme="dark"] .gh-btn { background: var(--paper); color: var(--ink); } font-weight: 600; letter-spacing: -0.01em; border: 1px solid transparent; - transition: transform 220ms ease, background 220ms ease; + transition: + transform 220ms ease, + background 220ms ease; } .btn-arrow { - width: 12px; height: 12px; + width: 12px; + height: 12px; transition: transform 220ms ease; } -.btn:hover .btn-arrow { transform: translate(3px, -3px); } -.btn-primary { background: var(--blue); color: var(--white); } -.btn-primary:hover { transform: translateY(-2px); } -.btn-ghost { border-color: var(--rule-strong); color: var(--fg); } -.btn-ghost:hover { background: var(--fg); color: var(--bg); } +.btn:hover .btn-arrow { + transform: translate(3px, -3px); +} +.btn-primary { + background: var(--blue); + color: var(--white); +} +.btn-primary:hover { + transform: translateY(-2px); +} +.btn-ghost { + border-color: var(--rule-strong); + color: var(--fg); +} +.btn-ghost:hover { + background: var(--fg); + color: var(--bg); +} /* Orbital system diagram */ .orbit-stage { @@ -337,7 +445,10 @@ html[data-theme="dark"] .gh-btn { background: var(--paper); color: var(--ink); } margin-left: auto; } @media (max-width: 980px) { - .orbit-stage { margin: 0 auto; max-width: 480px; } + .orbit-stage { + margin: 0 auto; + max-width: 480px; + } } .orbit-svg { position: absolute; @@ -346,23 +457,53 @@ html[data-theme="dark"] .gh-btn { background: var(--paper); color: var(--ink); } height: 100%; color: var(--fg); } -.orbit-ring { fill: none; stroke: currentColor; stroke-width: 1; opacity: 0.18; } -.orbit-ring.dashed { stroke-dasharray: 2 4; opacity: 0.32; } +.orbit-ring { + fill: none; + stroke: currentColor; + stroke-width: 1; + opacity: 0.18; +} +.orbit-ring.dashed { + stroke-dasharray: 2 4; + opacity: 0.32; +} .orbit-spin { transform-origin: 50% 50%; animation: rot 80s linear infinite; } -.orbit-spin.reverse { animation: rotrev 120s linear infinite; } -@keyframes rot { to { transform: rotate(360deg); } } -@keyframes rotrev { to { transform: rotate(-360deg); } } -.orbit-tick { fill: var(--fg); opacity: 0.4; } -.orbit-node { fill: var(--bg); stroke: var(--blue); stroke-width: 2; } -.orbit-node-blue { fill: var(--blue); stroke: var(--blue); } +.orbit-spin.reverse { + animation: rotrev 120s linear infinite; +} +@keyframes rot { + to { + transform: rotate(360deg); + } +} +@keyframes rotrev { + to { + transform: rotate(-360deg); + } +} +.orbit-tick { + fill: var(--fg); + opacity: 0.4; +} +.orbit-node { + fill: var(--bg); + stroke: var(--blue); + stroke-width: 2; +} +.orbit-node-blue { + fill: var(--blue); + stroke: var(--blue); +} .orbit-mark { position: absolute; - top: 50%; left: 50%; - width: 26%; height: 26%; + top: 50%; + left: 50%; + width: 26%; + height: 26%; transform: translate(-50%, -50%); color: var(--blue); animation: rot 60s linear infinite; @@ -370,15 +511,17 @@ html[data-theme="dark"] .gh-btn { background: var(--paper); color: var(--ink); } } .orbit-mark-wrap { position: absolute; - top: 50%; left: 50%; - width: 30%; height: 30%; + top: 50%; + left: 50%; + width: 30%; + height: 30%; transform: translate(-50%, -50%); border-radius: 50%; background: var(--bg); border: 1px solid var(--rule); } .orbit-mark-wrap::after { - content: ""; + content: ''; position: absolute; inset: -10px; border: 1px solid var(--blue); @@ -387,8 +530,14 @@ html[data-theme="dark"] .gh-btn { background: var(--paper); color: var(--ink); } animation: pulse-ring 3s ease-out infinite; } @keyframes pulse-ring { - 0% { transform: scale(0.9); opacity: 0.45; } - 100% { transform: scale(1.25); opacity: 0; } + 0% { + transform: scale(0.9); + opacity: 0.45; + } + 100% { + transform: scale(1.25); + opacity: 0; + } } /* Labels around the orbit */ @@ -407,20 +556,41 @@ html[data-theme="dark"] .gh-btn { background: var(--paper); color: var(--ink); } z-index: 2; } .orbit-label::before { - content: "·"; + content: '·'; color: var(--blue); margin-right: 5px; font-size: 16px; line-height: 0; vertical-align: middle; } -.orbit-label.l1 { top: 6%; left: 22%; } -.orbit-label.l2 { top: 18%; right: 4%; } -.orbit-label.l3 { top: 48%; left: 0; } -.orbit-label.l4 { bottom: 22%; right: 0; } -.orbit-label.l5 { bottom: 4%; left: 32%; } -.orbit-label.l6 { top: 70%; left: 16%; } -.orbit-label.l7 { top: 30%; left: 30%; } +.orbit-label.l1 { + top: 6%; + left: 22%; +} +.orbit-label.l2 { + top: 18%; + right: 4%; +} +.orbit-label.l3 { + top: 48%; + left: 0; +} +.orbit-label.l4 { + bottom: 22%; + right: 0; +} +.orbit-label.l5 { + bottom: 4%; + left: 32%; +} +.orbit-label.l6 { + top: 70%; + left: 16%; +} +.orbit-label.l7 { + top: 30%; + left: 30%; +} /* ═══════════════════ MARQUEE ═══════════════════ */ .marquee { @@ -452,12 +622,26 @@ html[data-theme="dark"] .gh-btn { background: var(--paper); color: var(--ink); } align-items: center; gap: 56px; } -.marquee-mark { width: 18px; height: 18px; flex: none; opacity: 0.95; } -@keyframes scroll { to { transform: translateX(-50%); } } +.marquee-mark { + width: 18px; + height: 18px; + flex: none; + opacity: 0.95; +} +@keyframes scroll { + to { + transform: translateX(-50%); + } +} /* ═══════════════════ SECTION ═══════════════════ */ -section.block { padding: clamp(64px, 9vw, 130px) 0; position: relative; } -section.block + section.block { border-top: 1px solid var(--hairline); } +section.block { + padding: clamp(64px, 9vw, 130px) 0; + position: relative; +} +section.block + section.block { + border-top: 1px solid var(--hairline); +} .section-head { display: grid; @@ -468,7 +652,11 @@ section.block + section.block { border-top: 1px solid var(--hairline); } padding-bottom: clamp(24px, 3vw, 36px); border-bottom: 1px solid var(--hairline); } -@media (max-width: 860px) { .section-head { grid-template-columns: 1fr; } } +@media (max-width: 860px) { + .section-head { + grid-template-columns: 1fr; + } +} .section-tag { display: flex; @@ -486,7 +674,8 @@ section.block + section.block { border-top: 1px solid var(--hairline); } color: var(--fg-muted); } .section-tag .mark { - width: 14px; height: 14px; + width: 14px; + height: 14px; color: var(--blue); } .section-tag .num { @@ -495,7 +684,10 @@ section.block + section.block { border-top: 1px solid var(--hairline); } color: var(--fg-muted); letter-spacing: 0.04em; } -.section-tag .num b { color: var(--blue); font-weight: 500; } +.section-tag .num b { + color: var(--blue); + font-weight: 500; +} .section-title { font-size: clamp(36px, 5.6vw, 80px); @@ -505,7 +697,10 @@ section.block + section.block { border-top: 1px solid var(--hairline); } font-weight: 500; text-wrap: balance; } -.section-title em { font-style: italic; color: var(--blue); } +.section-title em { + font-style: italic; + color: var(--blue); +} .section-title .stroked { -webkit-text-stroke: 1.5px var(--fg); color: transparent; @@ -531,9 +726,15 @@ section.block + section.block { border-top: 1px solid var(--hairline); } border-bottom: 1px solid var(--hairline); transition: background 240ms ease; } -.product:last-child { border-bottom: 0; } -.product:hover { background: var(--bg-alt); } -.product[open] { background: var(--bg-alt); } +.product:last-child { + border-bottom: 0; +} +.product:hover { + background: var(--bg-alt); +} +.product[open] { + background: var(--bg-alt); +} .product-row { display: grid; @@ -545,9 +746,13 @@ section.block + section.block { border-top: 1px solid var(--hairline); } user-select: none; } @media (max-width: 860px) { - .product-row { grid-template-columns: 50px 1fr auto; } + .product-row { + grid-template-columns: 50px 1fr auto; + } .product-row .product-idx, - .product-row .product-summary { display: none; } + .product-row .product-summary { + display: none; + } } .product-idx { font-family: 'JetBrains Mono', monospace; @@ -558,12 +763,13 @@ section.block + section.block { border-top: 1px solid var(--hairline); } /* small spiral mark in product row */ .product-orbit { - width: 38px; height: 38px; + width: 38px; + height: 38px; color: var(--fg); position: relative; } .product-orbit::before { - content: ""; + content: ''; position: absolute; inset: 0; border: 1px dashed var(--rule); @@ -572,12 +778,18 @@ section.block + section.block { border-top: 1px solid var(--hairline); } .product-orbit svg { position: absolute; inset: 6px; - width: calc(100% - 12px); height: calc(100% - 12px); + width: calc(100% - 12px); + height: calc(100% - 12px); color: inherit; - transition: transform 600ms ease, color 240ms ease; + transition: + transform 600ms ease, + color 240ms ease; } .product:hover .product-orbit svg, -.product[open] .product-orbit svg { color: var(--blue); transform: rotate(60deg); } +.product[open] .product-orbit svg { + color: var(--blue); + transform: rotate(60deg); +} .product-name { font-family: 'JetBrains Mono', monospace; @@ -600,19 +812,26 @@ section.block + section.block { border-top: 1px solid var(--hairline); } border: 1px solid var(--rule); background: var(--bg); } -.product-tag.core { color: var(--blue); border-color: var(--blue); } +.product-tag.core { + color: var(--blue); + border-color: var(--blue); +} .product-summary { color: var(--fg-muted); font-size: 15px; letter-spacing: -0.005em; } .product-plus { - width: 38px; height: 38px; + width: 38px; + height: 38px; border-radius: 50%; border: 1px solid var(--rule-strong); display: grid; place-items: center; - transition: background 240ms, color 240ms, transform 280ms; + transition: + background 240ms, + color 240ms, + transform 280ms; } .product[open] .product-plus { background: var(--blue); @@ -620,23 +839,36 @@ section.block + section.block { border-top: 1px solid var(--hairline); } border-color: var(--blue); transform: rotate(45deg); } -.product-plus svg { width: 14px; height: 14px; } +.product-plus svg { + width: 14px; + height: 14px; +} .product-body { display: grid; grid-template-rows: 0fr; - transition: grid-template-rows 360ms cubic-bezier(.4,0,.2,1); + transition: grid-template-rows 360ms cubic-bezier(0.4, 0, 0.2, 1); +} +.product[open] .product-body { + grid-template-rows: 1fr; +} +.product-body > .inner { + overflow: hidden; } -.product[open] .product-body { grid-template-rows: 1fr; } -.product-body > .inner { overflow: hidden; } .product-doc { display: grid; grid-template-columns: 1fr minmax(0, 1.2fr); gap: clamp(20px, 3vw, 56px); padding: 16px clamp(12px, 1.5vw, 20px) 40px; } -.product-doc > * { min-width: 0; } -@media (max-width: 860px) { .product-doc { grid-template-columns: 1fr; } } +.product-doc > * { + min-width: 0; +} +@media (max-width: 860px) { + .product-doc { + grid-template-columns: 1fr; + } +} .product-doc h4 { font-family: 'JetBrains Mono', monospace; @@ -647,7 +879,9 @@ section.block + section.block { border-top: 1px solid var(--hairline); } margin: 0 0 12px; font-weight: 500; } -.product-doc h4:not(:first-child) { margin-top: 28px; } +.product-doc h4:not(:first-child) { + margin-top: 28px; +} .product-detail p { margin: 0; font-size: 16px; @@ -671,7 +905,7 @@ section.block + section.block { border-top: 1px solid var(--hairline); } letter-spacing: -0.005em; } .product-detail li::before { - content: "→"; + content: '→'; position: absolute; left: 0; color: var(--blue); @@ -693,16 +927,31 @@ section.block + section.block { border-top: 1px solid var(--hairline); } font-family: 'JetBrains Mono', monospace; letter-spacing: -0.01em; border: 1px solid var(--rule-strong); - transition: background 200ms, color 200ms, border-color 200ms; + transition: + background 200ms, + color 200ms, + border-color 200ms; +} +.plink:hover { + background: var(--fg); + color: var(--bg); + border-color: var(--fg); } -.plink:hover { background: var(--fg); color: var(--bg); border-color: var(--fg); } .plink.primary { background: var(--blue); color: var(--white); border-color: var(--blue); } -.plink.primary:hover { background: var(--ink); border-color: var(--ink); color: var(--white); } -html[data-theme="dark"] .plink.primary:hover { background: var(--paper); color: var(--ink); border-color: var(--paper); } +.plink.primary:hover { + background: var(--ink); + border-color: var(--ink); + color: var(--white); +} +html[data-theme='dark'] .plink.primary:hover { + background: var(--paper); + color: var(--ink); + border-color: var(--paper); +} /* code block */ .code-frame { @@ -714,8 +963,12 @@ html[data-theme="dark"] .plink.primary:hover { background: var(--paper); color: font-size: 13px; line-height: 1.65; } -html[data-theme="light"] .code-frame { background: var(--paper); } -html[data-theme="dark"] .code-frame { background: #050505; } +html[data-theme='light'] .code-frame { + background: var(--paper); +} +html[data-theme='dark'] .code-frame { + background: #050505; +} .code-head { display: flex; align-items: center; @@ -728,10 +981,15 @@ html[data-theme="dark"] .code-frame { background: #050505; } color: var(--fg-muted); } .code-head .label { - display: inline-flex; align-items: center; gap: 10px; + display: inline-flex; + align-items: center; + gap: 10px; } .code-head .label::before { - content: ""; width: 8px; height: 8px; border-radius: 50%; + content: ''; + width: 8px; + height: 8px; + border-radius: 50%; background: var(--blue); } .copy-btn { @@ -745,59 +1003,132 @@ html[data-theme="dark"] .code-frame { background: #050505; } border-radius: 4px; transition: color 200ms; } -.copy-btn:hover { color: var(--blue); } +.copy-btn:hover { + color: var(--blue); +} .code-body { padding: 18px 20px; overflow-x: auto; } -.code-body pre { margin: 0; white-space: pre; color: var(--fg); } -.tk-key { color: var(--blue); font-weight: 600; } -.tk-str { color: #1a7f37; } -html[data-theme="dark"] .tk-str { color: #7ee7a4; } -.tk-com { color: var(--fg-muted); font-style: italic; } -.tk-fn { color: var(--fg); font-weight: 600; } +.code-body pre { + margin: 0; + white-space: pre; + color: var(--fg); +} +.tk-key { + color: var(--blue); + font-weight: 600; +} +.tk-str { + color: #1a7f37; +} +html[data-theme='dark'] .tk-str { + color: #7ee7a4; +} +.tk-com { + color: var(--fg-muted); + font-style: italic; +} +.tk-fn { + color: var(--fg); + font-weight: 600; +} /* product group headers */ -.product-group { margin-bottom: clamp(40px, 5vw, 64px); } -.product-group:last-of-type { margin-bottom: 0; } +.product-group { + margin-bottom: clamp(40px, 5vw, 64px); +} +.product-group:last-of-type { + margin-bottom: 0; +} .product-group-head { - display: flex; align-items: baseline; justify-content: space-between; - gap: 24px; flex-wrap: wrap; - padding-bottom: 14px; border-bottom: 1px solid var(--rule-strong); + display: flex; + align-items: baseline; + justify-content: space-between; + gap: 24px; + flex-wrap: wrap; + padding-bottom: 14px; + border-bottom: 1px solid var(--rule-strong); } .product-group-label { - display: flex; align-items: center; gap: 12px; margin: 0; - font-size: clamp(19px, 2vw, 26px); letter-spacing: -0.03em; font-weight: 500; + display: flex; + align-items: center; + gap: 12px; + margin: 0; + font-size: clamp(19px, 2vw, 26px); + letter-spacing: -0.03em; + font-weight: 500; +} +.product-group-label .gmark { + width: 16px; + height: 16px; + color: var(--blue); + flex: none; } -.product-group-label .gmark { width: 16px; height: 16px; color: var(--blue); flex: none; } .product-group-count { - font-family: 'JetBrains Mono', monospace; font-size: 11px; - color: var(--fg-muted); letter-spacing: 0.06em; + font-family: 'JetBrains Mono', monospace; + font-size: 11px; + color: var(--fg-muted); + letter-spacing: 0.06em; } .product-group-note { - font-family: 'JetBrains Mono', monospace; font-size: 11px; - color: var(--fg-muted); letter-spacing: 0.02em; max-width: 52ch; + font-family: 'JetBrains Mono', monospace; + font-size: 11px; + color: var(--fg-muted); + letter-spacing: 0.02em; + max-width: 52ch; text-transform: uppercase; } -.product-group .products { border-top: 0; border-bottom: 1px solid var(--hairline); } +.product-group .products { + border-top: 0; + border-bottom: 1px solid var(--hairline); +} .archived-note { - display: flex; gap: clamp(20px, 3vw, 48px); align-items: baseline; - flex-wrap: wrap; padding-top: 28px; margin-top: clamp(32px, 4vw, 48px); + display: flex; + gap: clamp(20px, 3vw, 48px); + align-items: baseline; + flex-wrap: wrap; + padding-top: 28px; + margin-top: clamp(32px, 4vw, 48px); border-top: 1px dashed var(--rule); } .archived-label { - font-family: 'JetBrains Mono', monospace; font-size: 11px; - text-transform: uppercase; letter-spacing: 0.1em; color: var(--fg-muted); + font-family: 'JetBrains Mono', monospace; + font-size: 11px; + text-transform: uppercase; + letter-spacing: 0.1em; + color: var(--fg-muted); +} +.archived-note ul { + list-style: none; + margin: 0; + padding: 0; + display: grid; + gap: 10px; +} +.archived-note li { + display: flex; + gap: 12px; + align-items: baseline; + flex-wrap: wrap; } -.archived-note ul { list-style: none; margin: 0; padding: 0; display: grid; gap: 10px; } -.archived-note li { display: flex; gap: 12px; align-items: baseline; flex-wrap: wrap; } .archived-note li a { - font-family: 'JetBrains Mono', monospace; font-size: 14px; - color: var(--fg); text-decoration: line-through; text-decoration-color: var(--rule); + font-family: 'JetBrains Mono', monospace; + font-size: 14px; + color: var(--fg); + text-decoration: line-through; + text-decoration-color: var(--rule); +} +.archived-note li a:hover { + color: var(--blue); + text-decoration-color: var(--blue); +} +.archived-note li span { + font-size: 13px; + color: var(--fg-muted); + letter-spacing: -0.005em; } -.archived-note li a:hover { color: var(--blue); text-decoration-color: var(--blue); } -.archived-note li span { font-size: 13px; color: var(--fg-muted); letter-spacing: -0.005em; } /* ═══════════════════ COMMUNITY ═══════════════════ */ .community-grid { @@ -806,7 +1137,11 @@ html[data-theme="dark"] .tk-str { color: #7ee7a4; } gap: clamp(20px, 4vw, 56px); align-items: stretch; } -@media (max-width: 940px) { .community-grid { grid-template-columns: 1fr; } } +@media (max-width: 940px) { + .community-grid { + grid-template-columns: 1fr; + } +} .contribute { display: flex; @@ -822,7 +1157,9 @@ html[data-theme="dark"] .tk-str { color: #7ee7a4; } align-items: center; transition: padding 240ms ease; } -.contrib:hover { padding-left: 8px; } +.contrib:hover { + padding-left: 8px; +} .contrib-num { font-family: 'JetBrains Mono', monospace; font-size: 11px; @@ -844,11 +1181,17 @@ html[data-theme="dark"] .tk-str { color: #7ee7a4; } max-width: 50ch; } .contrib-arrow { - width: 24px; height: 24px; + width: 24px; + height: 24px; color: var(--fg-muted); - transition: color 200ms, transform 200ms; + transition: + color 200ms, + transform 200ms; +} +.contrib:hover .contrib-arrow { + color: var(--blue); + transform: translate(2px, -2px); } -.contrib:hover .contrib-arrow { color: var(--blue); transform: translate(2px, -2px); } /* Telegram satellite panel */ .tg-panel { @@ -866,17 +1209,25 @@ html[data-theme="dark"] .tk-str { color: #7ee7a4; } } .tg-rings { position: absolute; - top: -20%; right: -20%; - width: 90%; aspect-ratio: 1; + top: -20%; + right: -20%; + width: 90%; + aspect-ratio: 1; pointer-events: none; } .tg-rings circle { fill: none; - stroke: rgba(255,255,255,0.22); + stroke: rgba(255, 255, 255, 0.22); stroke-width: 1; } -.tg-rings .dashed { stroke-dasharray: 2 5; opacity: 0.5; } -.tg-spin { animation: rot 90s linear infinite; transform-origin: 50% 50%; } +.tg-rings .dashed { + stroke-dasharray: 2 5; + opacity: 0.5; +} +.tg-spin { + animation: rot 90s linear infinite; + transform-origin: 50% 50%; +} .tg-eye { font-family: 'JetBrains Mono', monospace; font-size: 11px; @@ -888,7 +1239,10 @@ html[data-theme="dark"] .tk-str { color: #7ee7a4; } opacity: 0.78; } .tg-eye::before { - content: ""; width: 32px; height: 1px; background: currentColor; + content: ''; + width: 32px; + height: 1px; + background: currentColor; } .tg-headline { font-size: clamp(40px, 4.8vw, 64px); @@ -899,9 +1253,12 @@ html[data-theme="dark"] .tk-str { color: #7ee7a4; } max-width: 16ch; position: relative; } -.tg-headline em { font-style: italic; font-weight: 400; } +.tg-headline em { + font-style: italic; + font-weight: 400; +} .tg-body { - color: rgba(255,255,255,0.84); + color: rgba(255, 255, 255, 0.84); font-size: 15px; line-height: 1.55; max-width: 38ch; @@ -910,7 +1267,7 @@ html[data-theme="dark"] .tk-str { color: #7ee7a4; } .tg-stats { display: flex; gap: 32px; - border-top: 1px solid rgba(255,255,255,0.25); + border-top: 1px solid rgba(255, 255, 255, 0.25); padding-top: 24px; flex-wrap: wrap; } @@ -947,8 +1304,13 @@ html[data-theme="dark"] .tk-str { color: #7ee7a4; } position: relative; z-index: 2; } -.tg-cta:hover { transform: translateY(-2px); } -.tg-cta svg { width: 18px; height: 18px; } +.tg-cta:hover { + transform: translateY(-2px); +} +.tg-cta svg { + width: 18px; + height: 18px; +} .tg-cta .handle { font-family: 'JetBrains Mono', monospace; font-size: 13px; @@ -966,21 +1328,40 @@ html[data-theme="dark"] .tk-str { color: #7ee7a4; } position: relative; overflow: hidden; } -html[data-theme="dark"] .manifesto { background: #050505; } +html[data-theme='dark'] .manifesto { + background: #050505; +} .manifesto-rings { position: absolute; - left: -10%; top: 50%; - width: 50%; aspect-ratio: 1; + left: -10%; + top: 50%; + width: 50%; + aspect-ratio: 1; transform: translateY(-50%); pointer-events: none; color: var(--paper); opacity: 0.18; } -.manifesto-rings circle { fill: none; stroke: currentColor; stroke-width: 1; } -.manifesto-rings .dashed { stroke-dasharray: 2 5; opacity: 0.6; } -.manifesto-rings .blue-orbit { stroke: var(--blue); opacity: 0.9; } -.manifesto-spin { transform-origin: 50% 50%; animation: rot 100s linear infinite; } -.manifesto-spin.rev { animation: rotrev 140s linear infinite; } +.manifesto-rings circle { + fill: none; + stroke: currentColor; + stroke-width: 1; +} +.manifesto-rings .dashed { + stroke-dasharray: 2 5; + opacity: 0.6; +} +.manifesto-rings .blue-orbit { + stroke: var(--blue); + opacity: 0.9; +} +.manifesto-spin { + transform-origin: 50% 50%; + animation: rot 100s linear infinite; +} +.manifesto-spin.rev { + animation: rotrev 140s linear infinite; +} .manifesto-inner { position: relative; z-index: 1; @@ -991,7 +1372,11 @@ html[data-theme="dark"] .manifesto { background: #050505; } max-width: 1480px; margin: 0 auto; } -@media (max-width: 860px) { .manifesto-inner { grid-template-columns: 1fr; } } +@media (max-width: 860px) { + .manifesto-inner { + grid-template-columns: 1fr; + } +} .manifesto-tag { font-family: 'JetBrains Mono', monospace; font-size: 11px; @@ -1007,9 +1392,12 @@ html[data-theme="dark"] .manifesto { background: #050505; } font-weight: 500; margin: 0; } -.manifesto h2 em { font-style: italic; color: var(--blue); } +.manifesto h2 em { + font-style: italic; + color: var(--blue); +} .manifesto-body p { - color: rgba(236,236,236,0.78); + color: rgba(236, 236, 236, 0.78); font-size: 16px; line-height: 1.65; margin: 0 0 16px; @@ -1030,8 +1418,15 @@ html[data-theme="dark"] .manifesto { background: #050505; } opacity: 0.9; pointer-events: none; } -@media (max-width: 860px) { .manifesto-mark { display: none; } } -.manifesto-mark svg { animation: rot 50s linear infinite; transform-origin: 50% 50%; } +@media (max-width: 860px) { + .manifesto-mark { + display: none; + } +} +.manifesto-mark svg { + animation: rot 50s linear infinite; + transform-origin: 50% 50%; +} /* ═══════════════════ PRIORITY ═══════════════════ */ .priority { @@ -1042,7 +1437,11 @@ html[data-theme="dark"] .manifesto { background: #050505; } padding: clamp(48px, 6vw, 80px) 0; border-top: 1px solid var(--hairline); } -@media (max-width: 760px) { .priority { grid-template-columns: 1fr; } } +@media (max-width: 760px) { + .priority { + grid-template-columns: 1fr; + } +} .priority h2 { font-size: clamp(34px, 4.2vw, 60px); line-height: 0.98; @@ -1051,7 +1450,10 @@ html[data-theme="dark"] .manifesto { background: #050505; } margin: 0; max-width: 14ch; } -.priority h2 em { color: var(--blue); font-style: italic; } +.priority h2 em { + color: var(--blue); + font-style: italic; +} .priority p { color: var(--fg-muted); font-size: 16px; @@ -1070,8 +1472,16 @@ footer { grid-template-columns: 1.5fr 1fr 1fr 1fr; gap: clamp(24px, 4vw, 56px); } -@media (max-width: 820px) { .footer-grid { grid-template-columns: 1fr 1fr; } } -@media (max-width: 540px) { .footer-grid { grid-template-columns: 1fr; } } +@media (max-width: 820px) { + .footer-grid { + grid-template-columns: 1fr 1fr; + } +} +@media (max-width: 540px) { + .footer-grid { + grid-template-columns: 1fr; + } +} .footer-grid h4 { font-family: 'JetBrains Mono', monospace; font-size: 10px; @@ -1081,9 +1491,21 @@ footer { margin: 0 0 16px; font-weight: 500; } -.footer-grid ul { list-style: none; padding: 0; margin: 0; display: grid; gap: 10px; } -.footer-grid a { font-size: 14px; color: var(--fg); letter-spacing: -0.005em; } -.footer-grid a:hover { color: var(--blue); } +.footer-grid ul { + list-style: none; + padding: 0; + margin: 0; + display: grid; + gap: 10px; +} +.footer-grid a { + font-size: 14px; + color: var(--fg); + letter-spacing: -0.005em; +} +.footer-grid a:hover { + color: var(--blue); +} .footer-about p { font-size: 14px; color: var(--fg-muted); @@ -1098,11 +1520,13 @@ footer { margin-bottom: 18px; } .footer-about .mark-line svg { - width: 26px; height: 26px; + width: 26px; + height: 26px; color: var(--fg); } .footer-about .mark-line strong { - font-size: 15px; letter-spacing: -0.02em; + font-size: 15px; + letter-spacing: -0.02em; } .footer-bottom { @@ -1121,7 +1545,11 @@ footer { gap: 16px; } .footer-bottom .blue-dot { - display: inline-block; width: 6px; height: 6px; - background: var(--blue); border-radius: 50%; margin-right: 8px; + display: inline-block; + width: 6px; + height: 6px; + background: var(--blue); + border-radius: 50%; + margin-right: 8px; vertical-align: middle; } From e7f05bd2cdd347a68e05c8ce97ab7f42c8c2801d Mon Sep 17 00:00:00 2001 From: John Axe Date: Tue, 4 Aug 2026 12:27:10 +0400 Subject: [PATCH 3/3] ci: run validate on pull requests and pushes to main Nothing gated a PR before this: deploy.yml only builds and deploys on push to main, so a change that failed to typecheck would land and then break the deploy. Checkout, Node 22 (Astro 7 needs >=22.12.0, now pinned via engines), npm ci, then format:check / typecheck / build as separate steps so a red PR names the check that broke instead of one opaque validate blob. --- .github/workflows/ci.yml | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..17db48e --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,35 @@ +name: CI + +on: + pull_request: + push: + branches: [main] + +concurrency: + group: ci-${{ github.ref }} + cancel-in-progress: true + +jobs: + validate: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v7 + + - name: Set up Node.js + uses: actions/setup-node@v5 + with: + node-version: 22 + cache: npm + + - name: Install dependencies + run: npm ci + + - name: Check formatting + run: npm run format:check + + - name: Type check + run: npm run typecheck + + - name: Build + run: npm run build