From 63116f186512508507899bc15f9ef96b94b9fe7b Mon Sep 17 00:00:00 2001 From: botre Date: Sat, 8 Aug 2026 12:48:45 +0200 Subject: [PATCH 1/4] Build the stylesheet ahead of time Every page compiled its CSS in the browser through the Tailwind Play CDN, which Tailwind documents as development-only. It was the one render-blocking resource on every page, it came from a third party, and a slow CDN left the site with no layout at all. public/app.css is now generated from src/styles by the Tailwind CLI and committed, so the binary, the container and `go run` still need no Node. CI rebuilds it and fails if the committed file has drifted, which is the only thing keeping a generated artifact honest. The source is split by responsibility: an entry that only imports, element defaults and reclaimed browser surfaces, the two component patterns utilities cannot express, and the keyframes with their reduced-motion contract. Prettier ignores the generated sheet. Left alone it would reformat the minified output, the next build would revert it, and the freshness check could never pass. Claude-Session: https://claude.ai/code/session_01X8JeP7AQwpd2coSfwbMopt --- .github/workflows/test.yml | 16 + .prettierignore | 12 + docs/scripts.md | 13 + package-lock.json | 1030 ++++++++++++++++++++++++++++++++++++ package.json | 13 + public/app.css | 2 + src/styles/app.css | 17 + src/styles/base.css | 25 + src/styles/components.css | 27 + src/styles/motion.css | 36 ++ 10 files changed, 1191 insertions(+) create mode 100644 .prettierignore create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/app.css create mode 100644 src/styles/app.css create mode 100644 src/styles/base.css create mode 100644 src/styles/components.css create mode 100644 src/styles/motion.css diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3de0e07..9bf4dd9 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -19,6 +19,22 @@ jobs: go-version-file: "go.mod" cache: false - run: go test ./... + styles: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + - uses: actions/setup-node@v7 + with: + node-version-file: ".tool-versions" + - run: npm ci + # public/app.css is committed so the binary and container need no Node. + # A rebuild that changes it means a template or script gained a class the + # committed sheet does not carry, and the running app would be missing it. + - name: Rebuild stylesheet and check it matches the committed one + run: | + npm run css + git diff --exit-code --stat public/app.css \ + || { echo "::error::public/app.css is stale. Run 'npm run css' and commit the result"; exit 1; } e2e: runs-on: ubuntu-latest defaults: diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..908f4a7 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,12 @@ +# Generated by `npm run css`. Prettier would reformat the minified output and +# the next build would revert it, so the CI freshness check could never pass. +public/app.css + +# Build output and dependencies +bin +node_modules +e2e/test-results +e2e/playwright-report + +# Impeccable critique archives are generated snapshots, not source. +.impeccable/critique diff --git a/docs/scripts.md b/docs/scripts.md index dc41af1..4068bbc 100644 --- a/docs/scripts.md +++ b/docs/scripts.md @@ -4,6 +4,7 @@ Install dependencies: ```bash go mod download +npm install cd e2e && npm install && npx playwright install chromium ``` @@ -13,6 +14,18 @@ Upkeep dependencies: go mod tidy ``` +Build the stylesheet: + +```bash +npm run css +``` + +`public/app.css` is generated from `src/styles/app.css` and is committed, so the +binary, the container, and `go run` never need Node. Rebuild it whenever a +template or a script gains a class the sheet does not already carry, and commit +the result; CI fails if the committed file differs from a fresh build. During +design work, `npm run css:watch` regenerates on save. + Run project: ```bash diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..1eed89d --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1030 @@ +{ + "name": "httphq-assets", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "httphq-assets", + "devDependencies": { + "@tailwindcss/cli": "4.2.4", + "tailwindcss": "4.2.4" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz", + "integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.6.0", + "@parcel/watcher-darwin-arm64": "2.6.0", + "@parcel/watcher-darwin-x64": "2.6.0", + "@parcel/watcher-freebsd-x64": "2.6.0", + "@parcel/watcher-linux-arm-glibc": "2.6.0", + "@parcel/watcher-linux-arm-musl": "2.6.0", + "@parcel/watcher-linux-arm64-glibc": "2.6.0", + "@parcel/watcher-linux-arm64-musl": "2.6.0", + "@parcel/watcher-linux-x64-glibc": "2.6.0", + "@parcel/watcher-linux-x64-musl": "2.6.0", + "@parcel/watcher-win32-arm64": "2.6.0", + "@parcel/watcher-win32-x64": "2.6.0" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz", + "integrity": "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz", + "integrity": "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz", + "integrity": "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz", + "integrity": "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz", + "integrity": "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz", + "integrity": "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz", + "integrity": "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz", + "integrity": "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz", + "integrity": "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz", + "integrity": "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz", + "integrity": "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz", + "integrity": "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/cli": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/cli/-/cli-4.2.4.tgz", + "integrity": "sha512-e87GGhuXxnyQPyA0TS8an/3wNpj+OUmx8u0F4BicYr48TF72032AIu5917rRYaWm7HorXi3GSZ/uG+ohqP6AKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/watcher": "^2.5.1", + "@tailwindcss/node": "4.2.4", + "@tailwindcss/oxide": "4.2.4", + "enhanced-resolve": "^5.19.0", + "mri": "^1.2.0", + "picocolors": "^1.1.1", + "tailwindcss": "4.2.4" + }, + "bin": { + "tailwindcss": "dist/index.mjs" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.4.tgz", + "integrity": "sha512-Ai7+yQPxz3ddrDQzFfBKdHEVBg0w3Zl83jnjuwxnZOsnH9pGn93QHQtpU0p/8rYWxvbFZHneni6p1BSLK4DkGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", + "jiti": "^2.6.1", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.2.4" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.4.tgz", + "integrity": "sha512-9El/iI069DKDSXwTvB9J4BwdO5JhRrOweGaK25taBAvBXyXqJAX+Jqdvs8r8gKpsI/1m0LeJLyQYTf/WLrBT1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.2.4", + "@tailwindcss/oxide-darwin-arm64": "4.2.4", + "@tailwindcss/oxide-darwin-x64": "4.2.4", + "@tailwindcss/oxide-freebsd-x64": "4.2.4", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.4", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.4", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.4", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.4", + "@tailwindcss/oxide-linux-x64-musl": "4.2.4", + "@tailwindcss/oxide-wasm32-wasi": "4.2.4", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.4", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.4" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.4.tgz", + "integrity": "sha512-e7MOr1SAn9U8KlZzPi1ZXGZHeC5anY36qjNwmZv9pOJ8E4Q6jmD1vyEHkQFmNOIN7twGPEMXRHmitN4zCMN03g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.4.tgz", + "integrity": "sha512-tSC/Kbqpz/5/o/C2sG7QvOxAKqyd10bq+ypZNf+9Fi2TvbVbv1zNpcEptcsU7DPROaSbVgUXmrzKhurFvo5eDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.4.tgz", + "integrity": "sha512-yPyUXn3yO/ufR6+Kzv0t4fCg2qNr90jxXc5QqBpjlPNd0NqyDXcmQb/6weunH/MEDXW5dhyEi+agTDiqa3WsGg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.4.tgz", + "integrity": "sha512-BoMIB4vMQtZsXdGLVc2z+P9DbETkiopogfWZKbWwM8b/1Vinbs4YcUwo+kM/KeLkX3Ygrf4/PsRndKaYhS8Eiw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.4.tgz", + "integrity": "sha512-7pIHBLTHYRAlS7V22JNuTh33yLH4VElwKtB3bwchK/UaKUPpQ0lPQiOWcbm4V3WP2I6fNIJ23vABIvoy2izdwA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.4.tgz", + "integrity": "sha512-+E4wxJ0ZGOzSH325reXTWB48l42i93kQqMvDyz5gqfRzRZ7faNhnmvlV4EPGJU3QJM/3Ab5jhJ5pCRUsKn6OQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.4.tgz", + "integrity": "sha512-bBADEGAbo4ASnppIziaQJelekCxdMaxisrk+fB7Thit72IBnALp9K6ffA2G4ruj90G9XRS2VQ6q2bCKbfFV82g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.4.tgz", + "integrity": "sha512-7Mx25E4WTfnht0TVRTyC00j3i0M+EeFe7wguMDTlX4mRxafznw0CA8WJkFjWYH5BlgELd1kSjuU2JiPnNZbJDA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.4.tgz", + "integrity": "sha512-2wwJRF7nyhOR0hhHoChc04xngV3iS+akccHTGtz965FwF0up4b2lOdo6kI1EbDaEXKgvcrFBYcYQQ/rrnWFVfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.4.tgz", + "integrity": "sha512-FQsqApeor8Fo6gUEklzmaa9994orJZZDBAlQpK2Mq+DslRKFJeD6AjHpBQ0kZFQohVr8o85PPh8eOy86VlSCmw==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.8.1", + "@emnapi/runtime": "^1.8.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.1", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.4.tgz", + "integrity": "sha512-L9BXqxC4ToVgwMFqj3pmZRqyHEztulpUJzCxUtLjobMCzTPsGt1Fa9enKbOpY2iIyVtaHNeNvAK8ERP/64sqGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.4.tgz", + "integrity": "sha512-ESlKG0EpVJQwRjXDDa9rLvhEAh0mhP1sF7sap9dNZT0yyl9SAG6T7gdP09EH0vIv0UNTlo6jPWyujD6559fZvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.24.5", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", + "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "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==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.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" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.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" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.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" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.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" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.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" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.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" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.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" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.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" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.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" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.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" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tailwindcss": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.4.tgz", + "integrity": "sha512-HhKppgO81FQof5m6TEnuBWCZGgfRAWbaeOaGT00KOy/Pf/j6oUihdvBpA7ltCeAvZpFhW3j0PTclkxsd4IXYDA==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..ac93bf8 --- /dev/null +++ b/package.json @@ -0,0 +1,13 @@ +{ + "name": "httphq-assets", + "private": true, + "description": "Build-time stylesheet generation. The Go application does not depend on npm at runtime; public/app.css is committed and served from the binary's static directory.", + "scripts": { + "css": "tailwindcss --input ./src/styles/app.css --output ./public/app.css --minify", + "css:watch": "tailwindcss --input ./src/styles/app.css --output ./public/app.css --watch" + }, + "devDependencies": { + "@tailwindcss/cli": "4.2.4", + "tailwindcss": "4.2.4" + } +} diff --git a/public/app.css b/public/app.css new file mode 100644 index 0000000..42422c4 --- /dev/null +++ b/public/app.css @@ -0,0 +1,2 @@ +/*! tailwindcss v4.2.4 | MIT License | https://tailwindcss.com */ +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-amber-50:oklch(98.7% .022 95.277);--color-amber-700:oklch(55.5% .163 48.998);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-700:oklch(50.8% .118 165.612);--color-sky-50:oklch(97.7% .013 236.62);--color-sky-700:oklch(50% .134 242.749);--color-blue-50:oklch(97% .014 254.604);--color-blue-700:oklch(48.8% .243 264.376);--color-indigo-50:oklch(96.2% .018 272.314);--color-indigo-100:oklch(93% .034 272.788);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-indigo-600:oklch(51.1% .262 276.966);--color-indigo-700:oklch(45.7% .24 277.023);--color-indigo-900:oklch(35.9% .144 278.697);--color-violet-50:oklch(96.9% .016 293.756);--color-violet-700:oklch(49.1% .27 292.581);--color-rose-50:oklch(96.9% .015 12.422);--color-rose-100:oklch(94.1% .03 12.58);--color-rose-200:oklch(89.2% .058 10.001);--color-rose-500:oklch(64.5% .246 16.439);--color-rose-600:oklch(58.6% .253 17.585);--color-rose-700:oklch(51.4% .222 16.935);--color-slate-50:oklch(98.4% .003 247.858);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-xl:36rem;--container-2xl:42rem;--container-4xl:56rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-5xl:3rem;--text-5xl--line-height:1;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}button:not(:disabled),summary,[role=button]:not(:disabled){cursor:pointer}::selection{background-color:var(--color-indigo-100);color:var(--color-indigo-900)}:root{accent-color:var(--color-indigo-600);color-scheme:light}}@layer components{.app-select{appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='%2364748b'%3E%3Cpath fill-rule='evenodd' d='M5.23 7.21a.75.75 0 011.06.02L10 11.083l3.71-3.853a.75.75 0 111.08 1.04l-4.25 4.41a.75.75 0 01-1.08 0L5.21 8.27a.75.75 0 01.02-1.06z' clip-rule='evenodd'/%3E%3C/svg%3E");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.1em;padding-right:2rem}.loading-dots:after{content:"";text-align:left;width:1.5ch;animation:1.2s steps(4,end) infinite httphq-dots;display:inline-block}}@layer utilities{.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-0{top:calc(var(--spacing) * 0)}.z-10{z-index:10}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.-mx-4{margin-inline:calc(var(--spacing) * -4)}.mx-auto{margin-inline:auto}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-auto{margin-top:auto}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-9{height:calc(var(--spacing) * 9)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-96{max-height:calc(var(--spacing) * 96)}.min-h-11{min-height:calc(var(--spacing) * 11)}.min-h-screen{min-height:100vh}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-9{width:calc(var(--spacing) * 9)}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-md{max-width:var(--container-md)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.flex-shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.list-none{list-style-type:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.rounded{border-radius:.25rem}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.border{border-style:var(--tw-border-style);border-width:1px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-rose-200{border-color:var(--color-rose-200)}.border-slate-100{border-color:var(--color-slate-100)}.border-slate-200{border-color:var(--color-slate-200)}.border-slate-300{border-color:var(--color-slate-300)}.bg-amber-50{background-color:var(--color-amber-50)}.bg-blue-50{background-color:var(--color-blue-50)}.bg-emerald-50{background-color:var(--color-emerald-50)}.bg-indigo-50{background-color:var(--color-indigo-50)}.bg-indigo-600{background-color:var(--color-indigo-600)}.bg-rose-50{background-color:var(--color-rose-50)}.bg-sky-50{background-color:var(--color-sky-50)}.bg-slate-50{background-color:var(--color-slate-50)}.bg-slate-50\/95{background-color:#f8fafcf2}@supports (color:color-mix(in lab, red, red)){.bg-slate-50\/95{background-color:color-mix(in oklab, var(--color-slate-50) 95%, transparent)}}.bg-slate-100{background-color:var(--color-slate-100)}.bg-violet-50{background-color:var(--color-violet-50)}.bg-white{background-color:var(--color-white)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-12{padding-block:calc(var(--spacing) * 12)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-10{padding-top:calc(var(--spacing) * 10)}.pt-12{padding-top:calc(var(--spacing) * 12)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pb-8{padding-bottom:calc(var(--spacing) * 8)}.pb-10{padding-bottom:calc(var(--spacing) * 10)}.pb-12{padding-bottom:calc(var(--spacing) * 12)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.text-pretty{text-wrap:pretty}.break-all{word-break:break-all}.text-\[\#005cc5\]{color:#005cc5}.text-\[\#032f62\]{color:#032f62}.text-amber-700{color:var(--color-amber-700)}.text-blue-700{color:var(--color-blue-700)}.text-emerald-700{color:var(--color-emerald-700)}.text-indigo-600{color:var(--color-indigo-600)}.text-indigo-700{color:var(--color-indigo-700)}.text-rose-700{color:var(--color-rose-700)}.text-sky-700{color:var(--color-sky-700)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-700{color:var(--color-slate-700)}.text-slate-800{color:var(--color-slate-800)}.text-slate-900{color:var(--color-slate-900)}.text-violet-700{color:var(--color-violet-700)}.text-white{color:var(--color-white)}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.underline-offset-2{text-underline-offset:2px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.select-all{-webkit-user-select:all;user-select:all}.group-open\:rotate-180:is(:where(.group):is([open],:popover-open,:open) *){rotate:180deg}.placeholder\:text-slate-400::placeholder{color:var(--color-slate-400)}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media (hover:hover){.hover\:bg-indigo-500:hover{background-color:var(--color-indigo-500)}.hover\:bg-rose-100:hover{background-color:var(--color-rose-100)}.hover\:bg-slate-50:hover{background-color:var(--color-slate-50)}.hover\:text-indigo-600:hover{color:var(--color-indigo-600)}.hover\:text-rose-600:hover{color:var(--color-rose-600)}.hover\:underline:hover{text-decoration-line:underline}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}}.focus\:border-indigo-500:focus{border-color:var(--color-indigo-500)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-indigo-400:focus{--tw-ring-color:var(--color-indigo-400)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-indigo-500:focus-visible{--tw-ring-color:var(--color-indigo-500)}.focus-visible\:ring-rose-500:focus-visible{--tw-ring-color:var(--color-rose-500)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}@media (min-width:40rem){.sm\:-mx-6{margin-inline:calc(var(--spacing) * -6)}.sm\:inline{display:inline}.sm\:w-40{width:calc(var(--spacing) * 40)}.sm\:w-auto{width:auto}.sm\:max-w-\[10rem\]{max-width:10rem}.sm\:shrink-0{flex-shrink:0}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:gap-3{gap:calc(var(--spacing) * 3)}.sm\:p-5{padding:calc(var(--spacing) * 5)}.sm\:p-8{padding:calc(var(--spacing) * 8)}.sm\:px-5{padding-inline:calc(var(--spacing) * 5)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:py-8{padding-block:calc(var(--spacing) * 8)}.sm\:py-12{padding-block:calc(var(--spacing) * 12)}.sm\:pt-16{padding-top:calc(var(--spacing) * 16)}.sm\:pb-5{padding-bottom:calc(var(--spacing) * 5)}.sm\:pb-8{padding-bottom:calc(var(--spacing) * 8)}.sm\:pb-12{padding-bottom:calc(var(--spacing) * 12)}.sm\:pb-14{padding-bottom:calc(var(--spacing) * 14)}.sm\:text-right{text-align:right}.sm\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.sm\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.sm\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}}}@keyframes httphq-dots{0%{content:""}25%{content:"."}50%{content:".."}75%,to{content:"..."}}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}.loading-dots:after{content:"...";animation:none}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false} \ No newline at end of file diff --git a/src/styles/app.css b/src/styles/app.css new file mode 100644 index 0000000..f8927bc --- /dev/null +++ b/src/styles/app.css @@ -0,0 +1,17 @@ +/* Stylesheet entry point. Built to public/app.css by `npm run css`. + Everything here is import and configuration only; rules live in the modules + so each one stays small enough to read in full. */ + +@import "tailwindcss"; + +@import "./base.css"; +@import "./components.css"; +@import "./motion.css"; + +/* Class names are authored in the Go templates and in the endpoint page's + scripts. The method-badge palette in particular lives only in endpoint.js as + string literals, so dropping that source silently removes every badge colour + from the generated sheet. Only the scripts are scanned, never the generated + sheet next to them. */ +@source "../views"; +@source "../../public/*.js"; diff --git a/src/styles/base.css b/src/styles/base.css new file mode 100644 index 0000000..efd54d2 --- /dev/null +++ b/src/styles/base.css @@ -0,0 +1,25 @@ +/* Element defaults and the browser-owned surfaces the design system reclaims: + cursors, selection, and the native control accent. */ + +@layer base { + /* Tailwind resets buttons to the default cursor; actionable controls get the + pointer back. */ + button:not(:disabled), + summary, + [role="button"]:not(:disabled) { + cursor: pointer; + } + + /* Selection, native control accent, and form-control rendering all ship with + browser defaults that belong to no design system. Bind them to the palette + so the parts the product does not draw still read as the product. */ + ::selection { + background-color: var(--color-indigo-100); + color: var(--color-indigo-900); + } + + :root { + accent-color: var(--color-indigo-600); + color-scheme: light; + } +} diff --git a/src/styles/components.css b/src/styles/components.css new file mode 100644 index 0000000..9741cf0 --- /dev/null +++ b/src/styles/components.css @@ -0,0 +1,27 @@ +/* Patterns that utility classes cannot express: a native control restyled from + scratch, and a text affordance built from generated content. */ + +@layer components { + /* Native select with the chevron drawn in, anchored right after the value. + The fill is a literal hex because a data URI cannot read a CSS variable; + it is the slate-500 equivalent and must be kept in step with it. */ + .app-select { + appearance: none; + -webkit-appearance: none; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='%2364748b'%3E%3Cpath fill-rule='evenodd' d='M5.23 7.21a.75.75 0 011.06.02L10 11.083l3.71-3.853a.75.75 0 111.08 1.04l-4.25 4.41a.75.75 0 01-1.08 0L5.21 8.27a.75.75 0 01.02-1.06z' clip-rule='evenodd'/%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right 0.5rem center; + background-size: 1.1em; + padding-right: 2rem; + } + + /* Ellipsis for the waiting state. Reserves its widest width so the label it + follows never shifts as the dots cycle. */ + .loading-dots::after { + content: ""; + display: inline-block; + width: 1.5ch; + text-align: left; + animation: httphq-dots 1.2s steps(4, end) infinite; + } +} diff --git a/src/styles/motion.css b/src/styles/motion.css new file mode 100644 index 0000000..c9b24cc --- /dev/null +++ b/src/styles/motion.css @@ -0,0 +1,36 @@ +/* Keyframes and the reduced-motion contract. Every animation in this product is + decorative, so honouring the preference is a clean substitution rather than a + loss of meaning. */ + +@keyframes httphq-dots { + 0% { + content: ""; + } + 25% { + content: "."; + } + 50% { + content: ".."; + } + 75%, + 100% { + content: "..."; + } +} + +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + scroll-behavior: auto !important; + } + + /* Resting state carries the same meaning as the cycle: still waiting. */ + .loading-dots::after { + content: "..."; + animation: none; + } +} From ca3f5948984f75403f3ba6cdddd568fcc3250681 Mon Sep 17 00:00:00 2001 From: botre Date: Sat, 8 Aug 2026 12:49:14 +0200 Subject: [PATCH 2/4] Load scripts and metadata per page The layout loaded the syntax highlighter, Alpine and the three endpoint scripts on every page. The marketing and contact pages use none of them and now ship no JavaScript at all; the endpoint page opts in through a render flag. The styles those scripts used to inject at startup moved into the stylesheet, so they apply before first paint instead of after. Pages also carry the metadata their two arrival paths need. The title was the bare product name and there were no Open Graph tags, so a search result showed one word and a pasted link unfurled as a naked URL. The social card is drawn from the brand mark and renders an example capture, and robots.txt now allows the assets an unfurl has to fetch. Absolute URLs track the requesting host rather than a configured hostname, so a self-hosted deployment advertises itself. Claude-Session: https://claude.ai/code/session_01X8JeP7AQwpd2coSfwbMopt --- public/index.js | 22 ++---------------- public/robots.txt | 3 +++ public/social-card.png | Bin 0 -> 55641 bytes src/application.go | 41 ++++++++++++++++++++++++-------- src/views/layouts/main.html | 45 ++++++++++++++++++++++++++++-------- 5 files changed, 72 insertions(+), 39 deletions(-) create mode 100644 public/social-card.png diff --git a/public/index.js b/public/index.js index 24d0a3d..db181da 100644 --- a/public/index.js +++ b/public/index.js @@ -1,4 +1,5 @@ -/* Shared helpers loaded on every page. */ +/* Shared helpers for the endpoint page. Loaded only where the capture stream + renders; the marketing and contact pages ship no JavaScript at all. */ const TIME_DIVISIONS = [ { amount: 60, name: "seconds" }, @@ -61,22 +62,3 @@ window.parseHeaderLines = function (text) { } return out; }; - -/* App-wide style overrides (loading-dots animation, native-select chevron, - pointer cursor on actionable elements). Injected once at startup. */ - -(function injectAppStyles() { - if (document.getElementById("httphq-app-style")) return; - const style = document.createElement("style"); - style.id = "httphq-app-style"; - style.textContent = [ - // Loading dots in the empty state. - ".loading-dots::after{content:'';display:inline-block;width:1.5ch;text-align:left;animation:httphq-dots 1.2s steps(4,end) infinite}", - "@keyframes httphq-dots{0%{content:''}25%{content:'.'}50%{content:'..'}75%,100%{content:'...'}}", - // Tailwind v4 doesn't set cursor:pointer on buttons by default; restore it. - "button:not(:disabled),summary,[role=button]:not(:disabled){cursor:pointer}", - // Custom select chevron, anchored right after the value with sane padding. - "select.app-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='%2364748b'%3E%3Cpath fill-rule='evenodd' d='M5.23 7.21a.75.75 0 011.06.02L10 11.083l3.71-3.853a.75.75 0 111.08 1.04l-4.25 4.41a.75.75 0 01-1.08 0L5.21 8.27a.75.75 0 01.02-1.06z' clip-rule='evenodd'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 0.5rem center;background-size:1.1em;padding-right:2rem}", - ].join(""); - document.head.appendChild(style); -})(); diff --git a/public/robots.txt b/public/robots.txt index 917d9ed..1c62193 100644 --- a/public/robots.txt +++ b/public/robots.txt @@ -1,4 +1,7 @@ User-agent: * Allow: /$ Allow: /contact$ +Allow: /app.css +Allow: /social-card.png +Allow: /logo.svg Disallow: / diff --git a/public/social-card.png b/public/social-card.png new file mode 100644 index 0000000000000000000000000000000000000000..fb3c270a248190c33b7462320b32bc91f115460f GIT binary patch literal 55641 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 V>k)g&@=ZC~rC#hu7;O#K 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 literal 0 HcmV?d00001 diff --git a/src/application.go b/src/application.go index 9f0c49a..d14ab08 100644 --- a/src/application.go +++ b/src/application.go @@ -98,13 +98,14 @@ func resolvePlatform(name string) platformConfig { // contentSecurityPolicy is the CSP sent on every response, assembled once at // startup because its only variable part is fixed for the process lifetime. // -// - script-src needs 'unsafe-eval' for Alpine (it compiles directive -// expressions via the Function constructor) and the Tailwind Play CDN -// (compiles utility classes at runtime). All page scripts are external so -// script-src does NOT need 'unsafe-inline'. -// - style-src needs 'unsafe-inline' because Tailwind Play CDN injects -// generated styles into