diff --git a/astro.config.mjs b/astro.config.mjs index e762ba5..18ddeee 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -1,5 +1,9 @@ // @ts-check import { defineConfig } from 'astro/config'; +import tailwindcss from '@tailwindcss/vite'; -// https://astro.build/config -export default defineConfig({}); +export default defineConfig({ + vite: { + plugins: [tailwindcss()], + }, +}); diff --git a/package-lock.json b/package-lock.json index cf97e31..87e072e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,9 @@ "name": "lopata", "version": "0.0.1", "dependencies": { - "astro": "^6.4.6" + "@tailwindcss/vite": "^4.3.0", + "astro": "^6.4.6", + "tailwindcss": "^4.3.0" }, "engines": { "node": ">=22.12.0" @@ -1067,12 +1069,51 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "license": "MIT" }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@oslojs/encoding": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz", @@ -1526,6 +1567,263 @@ "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", "license": "MIT" }, + "node_modules/@tailwindcss/node": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.0.tgz", + "integrity": "sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.21.0", + "jiti": "^2.6.1", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.0" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.0.tgz", + "integrity": "sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==", + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.0", + "@tailwindcss/oxide-darwin-arm64": "4.3.0", + "@tailwindcss/oxide-darwin-x64": "4.3.0", + "@tailwindcss/oxide-freebsd-x64": "4.3.0", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.0", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.0", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.0", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.0", + "@tailwindcss/oxide-linux-x64-musl": "4.3.0", + "@tailwindcss/oxide-wasm32-wasi": "4.3.0", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.0", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.0" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.0.tgz", + "integrity": "sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.0.tgz", + "integrity": "sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.0.tgz", + "integrity": "sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.0.tgz", + "integrity": "sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.0.tgz", + "integrity": "sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.0.tgz", + "integrity": "sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.0.tgz", + "integrity": "sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.0.tgz", + "integrity": "sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.0.tgz", + "integrity": "sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.0.tgz", + "integrity": "sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.10.0", + "@emnapi/runtime": "^1.10.0", + "@emnapi/wasi-threads": "^1.2.1", + "@napi-rs/wasm-runtime": "^1.1.4", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.0.tgz", + "integrity": "sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.0.tgz", + "integrity": "sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.0.tgz", + "integrity": "sha512-t6J3OrB5Fc0ExuhohouH0fWUGMYL6PTLhW+E7zIk/pdbnJARZDCwjBznFnkh5ynRnIRSI4YjtTH0t6USjJISrw==", + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.3.0", + "@tailwindcss/oxide": "4.3.0", + "tailwindcss": "4.3.0" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, "node_modules/@types/debug": { "version": "4.1.13", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", @@ -2004,7 +2302,6 @@ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "license": "Apache-2.0", - "optional": true, "engines": { "node": ">=8" } @@ -2113,6 +2410,19 @@ "node": ">=4" } }, + "node_modules/enhanced-resolve": { + "version": "5.23.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.23.0.tgz", + "integrity": "sha512-yJN/BOOLxcOW2aQgeif9mSnaUB8KtvmMMp56oA1kx1CRfBKbhZm2pJ+NBY+3eOboHxix8lfjWpHE0Ei5U8RbSA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/entities": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", @@ -2308,6 +2618,12 @@ "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", "license": "ISC" }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, "node_modules/h3": { "version": "1.15.11", "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.11.tgz", @@ -2608,6 +2924,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "license": "MIT", + "peer": true, + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, "node_modules/js-yaml": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", @@ -2636,6 +2962,256 @@ "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", "license": "MIT" }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "license": "MPL-2.0", + "peer": true, + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "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.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "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.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "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.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "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.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "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.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "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.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "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.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "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.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "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.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "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.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", @@ -4225,6 +4801,25 @@ "url": "https://opencollective.com/svgo" } }, + "node_modules/tailwindcss": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.0.tgz", + "integrity": "sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/tiny-inflate": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", diff --git a/package.json b/package.json index 66c612e..e43b991 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,8 @@ "astro": "astro" }, "dependencies": { - "astro": "^6.4.6" + "@tailwindcss/vite": "^4.3.0", + "astro": "^6.4.6", + "tailwindcss": "^4.3.0" } } diff --git a/public/apple-icon.png b/public/apple-icon.png new file mode 100644 index 0000000..f9418b4 Binary files /dev/null and b/public/apple-icon.png differ diff --git a/public/blueprint-lopata.png b/public/blueprint-lopata.png new file mode 100644 index 0000000..de48fe0 Binary files /dev/null and b/public/blueprint-lopata.png differ diff --git a/public/classified-photo.png b/public/classified-photo.png new file mode 100644 index 0000000..7904819 Binary files /dev/null and b/public/classified-photo.png differ diff --git a/public/emblem.png b/public/emblem.png new file mode 100644 index 0000000..a310471 Binary files /dev/null and b/public/emblem.png differ diff --git a/public/icon-dark-32x32.png b/public/icon-dark-32x32.png new file mode 100644 index 0000000..12c825a Binary files /dev/null and b/public/icon-dark-32x32.png differ diff --git a/public/icon-light-32x32.png b/public/icon-light-32x32.png new file mode 100644 index 0000000..a3462cc Binary files /dev/null and b/public/icon-light-32x32.png differ diff --git a/public/icon.svg b/public/icon.svg new file mode 100644 index 0000000..5c11e6c --- /dev/null +++ b/public/icon.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/placeholder-logo.png b/public/placeholder-logo.png new file mode 100644 index 0000000..8a792ac Binary files /dev/null and b/public/placeholder-logo.png differ diff --git a/public/placeholder-logo.svg b/public/placeholder-logo.svg new file mode 100644 index 0000000..b1695aa --- /dev/null +++ b/public/placeholder-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/placeholder-user.jpg b/public/placeholder-user.jpg new file mode 100644 index 0000000..6fa7543 Binary files /dev/null and b/public/placeholder-user.jpg differ diff --git a/public/placeholder.jpg b/public/placeholder.jpg new file mode 100644 index 0000000..6bfe963 Binary files /dev/null and b/public/placeholder.jpg differ diff --git a/public/placeholder.svg b/public/placeholder.svg new file mode 100644 index 0000000..e763910 --- /dev/null +++ b/public/placeholder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/DossierCard.astro b/src/components/DossierCard.astro new file mode 100644 index 0000000..eb1099d --- /dev/null +++ b/src/components/DossierCard.astro @@ -0,0 +1,57 @@ +--- +import type { Dossier } from '../lib/dossiers' +import Stamp from './Stamp.astro' + +interface Props { + d: Dossier + rotate?: string +} + +const { d, rotate } = Astro.props as Props + +const classColor: Record = { + 'СОВ. СЕКРЕТНО': 'text-primary', + 'СЕКРЕТНО': 'stamp-ink', + 'ДСП': 'stamp-ink', + 'РАССЕКРЕЧЕНО': 'stamp-ink opacity-60', +} +--- + + + diff --git a/src/components/FieldRow.astro b/src/components/FieldRow.astro new file mode 100644 index 0000000..9fea7fe --- /dev/null +++ b/src/components/FieldRow.astro @@ -0,0 +1,15 @@ +--- +interface Props { + label?: string + value?: string +} + +const { label, value } = Astro.props as Props +--- + +
+
+ {label} +
+
+
diff --git a/src/components/OverlayStamp.astro b/src/components/OverlayStamp.astro new file mode 100644 index 0000000..98cc0b6 --- /dev/null +++ b/src/components/OverlayStamp.astro @@ -0,0 +1,18 @@ +--- +interface Props { + children?: any + class?: string +} + +const { children, class: className } = Astro.props as Props +--- + + diff --git a/src/components/Perforation.astro b/src/components/Perforation.astro new file mode 100644 index 0000000..d8ff2f6 --- /dev/null +++ b/src/components/Perforation.astro @@ -0,0 +1,21 @@ +--- +interface Props { + class?: string +} + +const { class: className } = Astro.props as Props +--- + + diff --git a/src/components/Redacted.astro b/src/components/Redacted.astro new file mode 100644 index 0000000..f1f9a70 --- /dev/null +++ b/src/components/Redacted.astro @@ -0,0 +1,9 @@ +--- +interface Props { + children?: any +} + +const { children } = Astro.props as Props +--- + +{children} diff --git a/src/components/SectionTitle.astro b/src/components/SectionTitle.astro new file mode 100644 index 0000000..b53cad4 --- /dev/null +++ b/src/components/SectionTitle.astro @@ -0,0 +1,17 @@ +--- +interface Props { + children?: any + index: string +} + +const { children, index } = Astro.props as Props +--- + +

+ + {index} + + + {children} + +

diff --git a/src/components/SiteFooter.astro b/src/components/SiteFooter.astro new file mode 100644 index 0000000..955806c --- /dev/null +++ b/src/components/SiteFooter.astro @@ -0,0 +1,16 @@ + diff --git a/src/components/SiteHeader.astro b/src/components/SiteHeader.astro new file mode 100644 index 0000000..45cff19 --- /dev/null +++ b/src/components/SiteHeader.astro @@ -0,0 +1,27 @@ +
+ +
diff --git a/src/components/Stamp.astro b/src/components/Stamp.astro new file mode 100644 index 0000000..97147c5 --- /dev/null +++ b/src/components/Stamp.astro @@ -0,0 +1,21 @@ +--- +interface Props { + children?: any + class?: string + skew?: boolean + variant?: 'red' | 'ink' +} + +const { children, class: className, skew = true, variant = 'red' } = Astro.props as Props +--- + + + {children} + diff --git a/src/layouts/base.astro b/src/layouts/base.astro new file mode 100644 index 0000000..e410f79 --- /dev/null +++ b/src/layouts/base.astro @@ -0,0 +1,29 @@ +--- +import '../styles/globals.css' + +interface Props { + title: string + description?: string +} + +const { title, description } = Astro.props as Props +--- + + + + + + + + + + {title} + {description && } + + + + + + + + diff --git a/src/layouts/dossier.astro b/src/layouts/dossier.astro new file mode 100644 index 0000000..1061499 --- /dev/null +++ b/src/layouts/dossier.astro @@ -0,0 +1,205 @@ +--- +import BaseLayout from './base.astro' +import SiteHeader from '../components/SiteHeader.astro' +import SiteFooter from '../components/SiteFooter.astro' +import OverlayStamp from '../components/OverlayStamp.astro' +import FieldRow from '../components/FieldRow.astro' +import Perforation from '../components/Perforation.astro' +import { DOSSIERS, getDossier } from '../lib/dossiers' + +interface Props { + title: string + fullName?: string + code?: string + category?: string + classification?: string + threat?: string + hasBlueprint?: boolean + hasPhoto?: boolean + fields?: { label: string; value: string }[] +} + +const frontmatter = Astro.props as Props +const slug = Astro.url.pathname.replace('/dossier/', '').replace('/', '') +const dossier = getDossier(slug) +const allDossiers = DOSSIERS +--- + + +
+ + + + +
+ + ← Вернуться в картотеку + + +
+
+ +
+

+ См. также +

+
+
+ {allDossiers.filter((d) => d.slug !== slug).slice(0, 4).map((d) => ( + + {d.name} + {d.code} + + ))} +
+
+ +
+ +
+
+ + +
+
+ + diff --git a/src/layouts/lopata.astro b/src/layouts/lopata.astro deleted file mode 100644 index 6e07c2c..0000000 --- a/src/layouts/lopata.astro +++ /dev/null @@ -1,32 +0,0 @@ ---- -const { frontmatter } = Astro.props; ---- - - - - - - {frontmatter.title} - - - -
- Главная -
- -
- -
- - diff --git a/src/lib/dossiers.ts b/src/lib/dossiers.ts new file mode 100644 index 0000000..ed102e9 --- /dev/null +++ b/src/lib/dossiers.ts @@ -0,0 +1,87 @@ +export type Classification = 'СОВ. СЕКРЕТНО' | 'СЕКРЕТНО' | 'ДСП' | 'РАССЕКРЕЧЕНО' + +export type Dossier = { + slug: string + code: string + name: string + fullName: string + category: 'ИНВЕНТАРЬ' | 'ПЕРСОНА' | 'ОБЪЕКТ' | 'ДИРЕКТИВА' + classification: Classification + threat: string + summary: string +} + +export const DOSSIERS: Dossier[] = [ + { + slug: 'lopata-bs-3000', + code: 'ИНВ-001', + name: 'Л.О.П.А.Т.А.', + fullName: + 'Локализатор Органических Признаков Анунаков Трансгрессивного Адаптера', + category: 'ИНВЕНТАРЬ', + classification: 'СОВ. СЕКРЕТНО', + threat: 'КАТ. III', + summary: + 'Модель БС-3000 (Садово-Боевая). Обнуление маскировочных био-голограмм и принудительное заземление внеземных агентов в полевых условиях.', + }, + { + slug: 'subject-ogurec', + code: 'ОБЪ-014', + name: 'СУБЪЕКТ «ОГУРЕЦ»', + fullName: 'Биомаскировочная единица класса «Парниковый»', + category: 'ОБЪЕКТ', + classification: 'СЕКРЕТНО', + threat: 'КАТ. II', + summary: + 'Рептилоидный агент, выявленный при инвентаризации теплицы участка №6. Демаскирован при пониженной температуре грунта.', + }, + { + slug: 'directive-kompot', + code: 'ДИР-007', + name: 'ДИРЕКТИВА «КОМПОТ»', + fullName: 'Устав полевого противодействия чешуйчатому личному составу', + category: 'ДИРЕКТИВА', + classification: 'ДСП', + threat: 'КАТ. I', + summary: + 'Свод обязательных предписаний для дачников-наблюдателей при контакте с предполагаемым агентом планеты Нибиру.', + }, + { + slug: 'agent-baba-zina', + code: 'ПЕР-003', + name: 'АГЕНТ «БАБА ЗИНА»', + fullName: 'Старший полевой оператор, участок №3, кооператив «Заря-9»', + category: 'ПЕРСОНА', + classification: 'РАССЕКРЕЧЕНО', + threat: '—', + summary: + 'Кавалер ордена Трудовой Грядки. Лично заземлила 14 (четырнадцать) подтверждённых рептилоидных единиц. Личность охраняется.', + }, + { + slug: 'object-nibiru', + code: 'ОБЪ-000', + name: 'ПЛАНЕТА НИБИРУ', + fullName: 'Источник трансгрессивной угрозы садоводческим территориям', + category: 'ОБЪЕКТ', + classification: 'СОВ. СЕКРЕТНО', + threat: 'КАТ. IV', + summary: + 'Внесистемное тело. Период сближения совпадает с пиком урожайности. Координаты [ДАННЫЕ ИЗЪЯТЫ].', + }, + { + slug: 'equipment-vedro', + code: 'ИНВ-022', + name: 'В.Е.Д.Р.О.', + fullName: + 'Высокочастотный Экранирующий Дезинтегратор Рептилоидных Оболочек', + category: 'ИНВЕНТАРЬ', + classification: 'СЕКРЕТНО', + threat: 'КАТ. II', + summary: + 'Оцинкованный контур-ловушка. Накрывается на голову агента для блокировки телепатического канала с орбитой.', + }, +] + +export function getDossier(slug: string) { + return DOSSIERS.find((d) => d.slug === slug) +} diff --git a/src/pages/dossier/agent-baba-zina.md b/src/pages/dossier/agent-baba-zina.md new file mode 100644 index 0000000..12aff1f --- /dev/null +++ b/src/pages/dossier/agent-baba-zina.md @@ -0,0 +1,24 @@ +--- +layout: ../../layouts/dossier.astro +title: АГЕНТ «БАБА ЗИНА» +fullName: Старший полевой оператор, участок №3, кооператив «Заря-9» +code: ПЕР-003 +category: ПЕРСОНА +classification: РАССЕКРЕЧЕНО +threat: "—" +fields: + - label: Позывной + value: "Агент «Баба Зина»" + - label: Должность + value: "Старший полевой оператор" + - label: Участок + value: "№3, кооператив «Заря-9»" + - label: Заслуги + value: "Орден Трудовой Грядки I степени" + - label: Подтверждённых заземлений + value: "14 (четырнадцать)" +--- + +## 1. Характеристика + +Образцовый полевой оператор. Лично разработала метод демаскировки «соль в три щепоти». Передаёт опыт молодым дачникам. Личность охраняется, фотоматериалы ДАННЫЕ ИЗЪЯТЫ в целях безопасности оператора и его теплицы. diff --git a/src/pages/dossier/directive-kompot.md b/src/pages/dossier/directive-kompot.md new file mode 100644 index 0000000..e35749a --- /dev/null +++ b/src/pages/dossier/directive-kompot.md @@ -0,0 +1,29 @@ +--- +layout: ../../layouts/dossier.astro +title: ДИРЕКТИВА «КОМПОТ» +fullName: Устав полевого противодействия чешуйчатому личному составу +code: ДИР-007 +category: ДИРЕКТИВА +classification: ДСП +threat: КАТ. I +fields: + - label: Обозначение + value: "Директива «Компот»" + - label: Тип документа + value: "Устав полевого противодействия" + - label: Действует с + value: "01.05.1986" + - label: Гриф + value: "Для служебного пользования" +--- + +## I. Общие положения + +Настоящий устав определяет обязательный порядок действий дачника-наблюдателя при установлении контакта с предполагаемым агентом планеты Нибиру на территории садоводческого товарищества. Незнание устава не освобождает от дежурства по сторожке. + +## II. Обязанности наблюдателя + +1. Сохранять бдительность в часы пик урожайности. +2. Иметь при себе исправный инвентарь (см. дело ИНВ-001). +3. Не вступать с агентом в переговоры о рассаде. +4. Докладывать о любом немигающем соседе незамедлительно. diff --git a/src/pages/dossier/equipment-vedro.md b/src/pages/dossier/equipment-vedro.md new file mode 100644 index 0000000..45c4bf8 --- /dev/null +++ b/src/pages/dossier/equipment-vedro.md @@ -0,0 +1,26 @@ +--- +layout: ../../layouts/dossier.astro +title: В.Е.Д.Р.О. +fullName: Высокочастотный Экранирующий Дезинтегратор Рептилоидных Оболочек +code: ИНВ-022 +category: ИНВЕНТАРЬ +classification: СЕКРЕТНО +threat: КАТ. II +fields: + - label: Наименование + value: В.Е.Д.Р.О. + - label: Полное название + value: Высокочастотный Экранирующий Дезинтегратор Рептилоидных Оболочек + - label: Материал + value: "Сталь оцинкованная, контур-ловушка" + - label: Объём + value: "12 л (стандарт кооператива)" +--- + +## 1. Назначение + +Оцинкованный контур-ловушка для блокировки телепатического канала агента с орбитой. Накрывается на голову локализованной единицы, создавая экранирующую клетку Фарадея кустарного исполнения. + +## 2. Применение в связке + +Используется совместно с изделием Л.О.П.А.Т.А. (дело ИНВ-001): сперва заземление, затем экранирование. Эффективность связки подтверждена агентом «Баба Зина». diff --git a/src/pages/dossier/lopata-bs-3000.md b/src/pages/dossier/lopata-bs-3000.md new file mode 100644 index 0000000..2745cef --- /dev/null +++ b/src/pages/dossier/lopata-bs-3000.md @@ -0,0 +1,46 @@ +--- +layout: ../../layouts/dossier.astro +title: Л.О.П.А.Т.А. +fullName: Локализатор Органических Признаков Анунаков Трансгрессивного Адаптера +code: ИНВ-001 +category: ИНВЕНТАРЬ +classification: СОВ. СЕКРЕТНО +threat: КАТ. III +hasBlueprint: true +fields: + - label: Наименование изделия + value: Л.О.П.А.Т.А. + - label: Индекс + value: "Модель БС-3000 / Садово-Боевая" + - label: Полное инж. название + value: Локализатор Органических Признаков Анунаков Трансгрессивного Адаптера + - label: Изготовитель + value: "Артель «Острый Штык», цех №4" + - label: Масса снаряжённая + value: "2,7 кг ± 0,3 кг" + - label: Заточка + value: "Двухсторонняя, угол 23°" + - label: Ресурс + value: "не менее 400 (четырёхсот) заземлений" +--- + +## 1. Назначение + +Изделие предназначено для обнуления маскировочных био-голограмм, принудительного заземления внеземных агентов и демаскировки чешуйчатого личного состава в полевых условиях. Допускается применение по прямому хозяйственному назначению (вскапывание грунта) в целях сохранения легенды оператора. + +## 2. Принцип действия + +Рабочее полотно изделия выполнено из заземлённого сплава «ЧУГ-7». При плотном контакте с поверхностью агента происходит срыв голографической оболочки и отвод паразитных нибируанских токов в грунт через черенок-токоотвод. + +Эффект демаскировки достигается за 1 (один) уверенный удар плашмя. Повторные удары наносятся до полного проявления чешуи либо до признания агентом своей внеземной природы. + +## 3. Порядок применения + +1. Убедиться в отсутствии посторонних дачников на смежных участках. +2. Принять стойку «Прополка боевая»: ноги на ширину грядки, черенок у пояса. +3. При первых признаках маскировки (немигающий взгляд, любовь к солнцу, неприятие соли) — нанести заземляющий удар. +4. Зафиксировать результат в журнале формы Б-2 и доложить старшему по кооперативу. + +## 4. Меры безопасности + +Запрещается заземлять агента при влажной обуви оператора. Запрещается оставлять изделие в борще. Хранить в сарае под охраной кота. При появлении на полотне зелёного свечения — изделие подлежит сдаче в артель для перезаточки и ДАННЫЕ ИЗЪЯТЫ. diff --git a/src/pages/dossier/object-nibiru.md b/src/pages/dossier/object-nibiru.md new file mode 100644 index 0000000..737fc17 --- /dev/null +++ b/src/pages/dossier/object-nibiru.md @@ -0,0 +1,26 @@ +--- +layout: ../../layouts/dossier.astro +title: ПЛАНЕТА НИБИРУ +fullName: Источник трансгрессивной угрозы садоводческим территориям +code: ОБЪ-000 +category: ОБЪЕКТ +classification: СОВ. СЕКРЕТНО +threat: КАТ. IV +fields: + - label: Обозначение + value: "Планета Нибиру" + - label: Класс угрозы + value: "КАТ. IV (трансгрессивная)" + - label: Период сближения + value: "совпадает с пиком урожайности" + - label: Координаты + value: ДАННЫЕ ИЗЪЯТЫ +--- + +## 1. Описание объекта + +Внесистемное небесное тело, признанное источником трансгрессивной угрозы садоводческим территориям. По данным наблюдений с водонапорной башни, сближение объекта вызывает аномальный рост сорняков и активизацию замаскированных агентов. + +## 2. Рекомендации + +В период сближения усилить дежурства, проверять рассаду на чешую, держать инвентарь заточенным. Дальнейшие сведения изъяты по грифу «Сов. Секретно». diff --git a/src/pages/dossier/subject-ogurec.md b/src/pages/dossier/subject-ogurec.md new file mode 100644 index 0000000..c6c6a28 --- /dev/null +++ b/src/pages/dossier/subject-ogurec.md @@ -0,0 +1,29 @@ +--- +layout: ../../layouts/dossier.astro +title: СУБЪЕКТ «ОГУРЕЦ» +fullName: Биомаскировочная единица класса «Парниковый» +code: ОБЪ-014 +category: ОБЪЕКТ +classification: СЕКРЕТНО +threat: КАТ. II +hasPhoto: true +fields: + - label: Обозначение + value: "Субъект «Огурец»" + - label: Класс + value: "Биомаскировочная единица «Парниковый»" + - label: Место выявления + value: "Теплица, участок №6" + - label: Состояние + value: "Локализован, заземлён" +--- + +## 1. Обстоятельства выявления + +Субъект обнаружен при плановой инвентаризации теплицы. Демаскирован при понижении температуры грунта ниже +8°C, при котором маскировочная оболочка теряет тургор и проявляется чешуйчатая структура. Реагировал на соль крайне нехарактерным для овоща образом. + +## 2. Признаки внеземного происхождения + +- Отсутствие семян при наличии идеальной формы. +- Поворот к наблюдателю независимо от положения солнца. +- Слабый запах озона и ДАННЫЕ ИЗЪЯТЫ. diff --git a/src/pages/index.astro b/src/pages/index.astro index 303e3af..7f61096 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -1,17 +1,116 @@ --- +import BaseLayout from '../layouts/base.astro' +import SiteHeader from '../components/SiteHeader.astro' +import SiteFooter from '../components/SiteFooter.astro' +import Stamp from '../components/Stamp.astro' +import OverlayStamp from '../components/OverlayStamp.astro' +import Perforation from '../components/Perforation.astro' +import DossierCard from '../components/DossierCard.astro' +import { DOSSIERS } from '../lib/dossiers' + +const tilts = ['-0.6deg', '0.5deg', '-0.4deg', '0.7deg', '-0.5deg', '0.4deg'] +--- ---- + +
+ - - - - - - - - Astro - - -

LOPATA

- - + + +
+
+
+ +
+ {[ + { k: 'Дел в картотеке', v: '147' }, + { k: 'Заземлено агентов', v: '38' }, + { k: 'Активных участков', v: '9' }, + { k: 'Уровень тревоги', v: 'III' }, + ].map((s, i) => ( +
+

+ {s.v} +

+

+ {s.k} +

+
+ ))} +
+ +
+
+
+

+ Картотека дел +

+
+
+

+ Опись · лист 1 +

+
+ +
+ {DOSSIERS.map((d, i) => ( + + ))} +
+
+ +
+ +
+
+ + +
+
diff --git a/src/pages/protocol.astro b/src/pages/protocol.astro new file mode 100644 index 0000000..38964f1 --- /dev/null +++ b/src/pages/protocol.astro @@ -0,0 +1,128 @@ +--- +import BaseLayout from '../layouts/base.astro' +import SiteHeader from '../components/SiteHeader.astro' +import SiteFooter from '../components/SiteFooter.astro' +import Stamp from '../components/Stamp.astro' +import SectionTitle from '../components/SectionTitle.astro' +import Perforation from '../components/Perforation.astro' + +const STEPS = [ + { + n: '01', + t: 'Обнаружение', + d: 'Зафиксировать признаки маскировки: немигающий взгляд, любовь к солнцу, неприятие соли, идеальная рассада без труда.', + }, + { + n: '02', + t: 'Доклад', + d: 'Сообщить старшему по кооперативу через условный сигнал (три удара по бочке с водой).', + }, + { + n: '03', + t: 'Локализация', + d: 'Применить изделие Л.О.П.А.Т.А. (ИНВ-001) для заземления. Соблюдать меры безопасности.', + }, + { + n: '04', + t: 'Экранирование', + d: 'Накрыть изделием В.Е.Д.Р.О. (ИНВ-022) для блокировки канала связи с орбитой.', + }, + { + n: '05', + t: 'Регистрация', + d: 'Внести запись в журнал формы Б-2. Присвоить делу номер. Хранить вечно.', + }, +] +--- + + +
+ + + + +
+
+
+ +
+ +
+
+ + +
+
diff --git a/src/pages/user-manual.md b/src/pages/user-manual.md deleted file mode 100644 index f5fddcb..0000000 --- a/src/pages/user-manual.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -layout: ../layouts/lopata.astro -title: "Моя кастомная страница" ---- - -# СИСТЕМА Л.О.П.А.Т.А. diff --git a/src/styles/globals.css b/src/styles/globals.css new file mode 100644 index 0000000..98e0fe4 --- /dev/null +++ b/src/styles/globals.css @@ -0,0 +1,215 @@ +@import 'tailwindcss'; + +@custom-variant dark (&:is(.dark *)); + +@theme inline { + --font-heading: 'Oswald', sans-serif; + --font-sans: 'IBM Plex Mono', monospace; + --font-mono: 'IBM Plex Mono', monospace; + --color-sidebar-ring: var(--sidebar-ring); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar: var(--sidebar); + --color-chart-5: var(--chart-5); + --color-chart-4: var(--chart-4); + --color-chart-3: var(--chart-3); + --color-chart-2: var(--chart-2); + --color-chart-1: var(--chart-1); + --color-ring: var(--ring); + --color-input: var(--input); + --color-border: var(--border); + --color-destructive: var(--destructive); + --color-accent-foreground: var(--accent-foreground); + --color-accent: var(--accent); + --color-muted-foreground: var(--muted-foreground); + --color-muted: var(--muted); + --color-secondary-foreground: var(--secondary-foreground); + --color-secondary: var(--secondary); + --color-primary-foreground: var(--primary-foreground); + --color-primary: var(--primary); + --color-popover-foreground: var(--popover-foreground); + --color-popover: var(--popover); + --color-card-foreground: var(--card-foreground); + --color-card: var(--card); + --color-foreground: var(--foreground); + --color-background: var(--background); + --color-stamp: var(--stamp); + --color-ink: var(--ink); + --color-ink-soft: var(--ink-soft); + --radius-sm: calc(var(--radius) * 0.6); + --radius-md: calc(var(--radius) * 0.8); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) * 1.4); +} + +:root { + --background: oklch(0.9 0.028 78); + --foreground: oklch(0.32 0.03 52); + --card: oklch(0.945 0.024 84); + --card-foreground: oklch(0.32 0.03 52); + --popover: oklch(0.945 0.024 84); + --popover-foreground: oklch(0.32 0.03 52); + --primary: oklch(0.47 0.16 30); + --primary-foreground: oklch(0.95 0.022 88); + --secondary: oklch(0.86 0.03 78); + --secondary-foreground: oklch(0.34 0.03 52); + --muted: oklch(0.87 0.026 80); + --muted-foreground: oklch(0.5 0.028 56); + --accent: oklch(0.47 0.16 30); + --accent-foreground: oklch(0.95 0.022 88); + --destructive: oklch(0.47 0.16 30); + --border: oklch(0.56 0.035 58 / 0.45); + --input: oklch(0.56 0.035 58 / 0.45); + --ring: oklch(0.47 0.16 30); + --stamp: oklch(0.46 0.17 30); + --ink: oklch(0.32 0.03 52); + --ink-soft: oklch(0.5 0.028 56); + --chart-1: oklch(0.47 0.16 30); + --chart-2: oklch(0.5 0.02 60); + --chart-3: oklch(0.4 0.02 55); + --chart-4: oklch(0.6 0.05 80); + --chart-5: oklch(0.3 0.02 55); + --radius: 0.125rem; + --sidebar: oklch(0.9 0.022 84); + --sidebar-foreground: oklch(0.32 0.03 52); + --sidebar-primary: oklch(0.47 0.16 30); + --sidebar-primary-foreground: oklch(0.95 0.022 88); + --sidebar-accent: oklch(0.86 0.03 78); + --sidebar-accent-foreground: oklch(0.34 0.03 52); + --sidebar-border: oklch(0.56 0.035 58 / 0.45); + --sidebar-ring: oklch(0.47 0.16 30); +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + background-image: + radial-gradient( + 130% 120% at 50% 0%, + transparent 55%, + oklch(0.3 0.04 52 / 0.12) 100% + ), + radial-gradient(oklch(0.3 0.03 52 / 0.05) 1px, transparent 1.4px), + radial-gradient(oklch(0.3 0.03 52 / 0.04) 1px, transparent 1.4px), + linear-gradient(180deg, oklch(0.91 0.03 80), oklch(0.88 0.03 76)); + background-size: 100% 100%, 16px 16px, 22px 22px, 100% 100%; + background-position: 0 0, 0 0, 8px 11px, 0 0; + background-attachment: fixed; + } + html { + @apply font-mono; + } +} + +@layer utilities { + .font-heading { + font-family: var(--font-heading); + } + + .paper { + position: relative; + background-color: var(--card); + background-image: + linear-gradient( + oklch(0.5 0.03 56 / 0.05) 1px, + transparent 1px + ), + radial-gradient(oklch(0.3 0.03 52 / 0.04) 1px, transparent 1.3px); + background-size: 100% 30px, 18px 18px; + border: 1px solid oklch(0.5 0.04 56 / 0.35); + box-shadow: + 0 1px 0 oklch(1 0 0 / 0.4) inset, + 0 18px 40px -24px oklch(0.25 0.04 52 / 0.55), + 0 2px 6px -3px oklch(0.25 0.04 52 / 0.3); + } + + .paper-strong { + background-color: oklch(0.5 0.04 56 / 0.06); + } + + .tape { + position: absolute; + height: 1.6rem; + width: 6.5rem; + background: oklch(0.78 0.06 92 / 0.55); + box-shadow: 0 1px 4px oklch(0.25 0.04 52 / 0.25); + backdrop-filter: blur(0.5px); + } + + .rule { + border: 0; + border-top: 1px solid oklch(0.45 0.04 56 / 0.5); + box-shadow: 0 3px 0 -2px oklch(0.45 0.04 56 / 0.5); + } + + .rule-red { + border-top-color: var(--primary); + box-shadow: 0 3px 0 -2px var(--primary); + } + + .stamp { + --c: var(--stamp); + display: inline-flex; + align-items: center; + border: 2.5px solid var(--c); + color: var(--c); + text-transform: uppercase; + letter-spacing: 0.1em; + font-weight: 700; + border-radius: 3px; + box-shadow: inset 0 0 0 1.5px var(--c); + opacity: 0.78; + mix-blend-mode: multiply; + -webkit-mask-image: radial-gradient(oklch(0 0 0) 60%, transparent 62%), + url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='80' height='40'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2'/%3E%3CfeColorMatrix type='matrix' values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.4 1.1'/%3E%3C/filter%3E%3Crect width='80' height='40' filter='url(%23n)'/%3E%3C/svg%3E"); + -webkit-mask-composite: source-over; + mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='80' height='40'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2'/%3E%3CfeColorMatrix type='matrix' values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.4 1.1'/%3E%3C/filter%3E%3Crect width='80' height='40' filter='url(%23n)'/%3E%3C/svg%3E"); + mask-mode: luminance; + } + + .stamp-skew { + transform: rotate(-7deg); + } + + .stamp-ink { + --c: var(--ink-soft); + } + + .stamp-overlay { + color: var(--stamp); + border: 4px solid var(--stamp); + opacity: 0.22; + mix-blend-mode: multiply; + text-transform: uppercase; + font-weight: 700; + letter-spacing: 0.12em; + border-radius: 6px; + } + + .redacted { + background: var(--ink); + color: transparent; + user-select: none; + border-radius: 1px; + box-shadow: 0 0 1px 1px oklch(0.3 0.03 52 / 0.4); + } + + .banner-classified { + background: + repeating-linear-gradient( + 45deg, + oklch(0.42 0.16 30), + oklch(0.42 0.16 30) 14px, + oklch(0.38 0.15 30) 14px, + oklch(0.38 0.15 30) 28px + ); + color: var(--primary-foreground); + } +}