{"_id":"@brainage04/astro-shell","_rev":"7-445a9ce68e11f4b0aa37505d262e45d1","name":"@brainage04/astro-shell","dist-tags":{"latest":"0.5.0"},"versions":{"0.1.1":{"name":"@brainage04/astro-shell","version":"0.1.1","_id":"@brainage04/astro-shell@0.1.1","maintainers":[{"name":"brainage04","email":"thomasmcmah21@gmail.com"}],"dist":{"shasum":"b5eaa16d19e4d9d45117ac78616120bc7cde4955","tarball":"https://registry.npmjs.org/@brainage04/astro-shell/-/astro-shell-0.1.1.tgz","fileCount":6,"integrity":"sha512-Yr9735Xjb1cR7zPxX0KEfIg+mK1rMbCF699N6RZCRyOJVW5i/4ZwvHgNen61/VH/v+SdTGBVlar/sJxS3IsjBg==","signatures":[{"sig":"MEUCIQDLW9YZ6tOjVU4hcgIcc3LrtKrnvghHLX1O5BAYffQlhAIgKUgFtTdNbeDjkJwD/7iaJMmoPto30/57MLU94C7MhC4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11114},"type":"module","exports":{"./global.css":"./src/styles/global.css","./components/SiteFooter.astro":"./src/components/SiteFooter.astro","./components/SiteHeader.astro":"./src/components/SiteHeader.astro","./components/SiteLayout.astro":"./src/components/SiteLayout.astro","./components/TerminalPanel.astro":"./src/components/TerminalPanel.astro"},"gitHead":"7c15bad3bd3fb727b703dcfd04867cbb9d9906cf","private":false,"_npmUser":{"name":"brainage04","email":"thomasmcmah21@gmail.com"},"_npmVersion":"10.9.8","directories":{},"_nodeVersion":"22.22.3","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"astro":"7.0.3","typescript":"6.0.3","@webtui/css":"0.1.9"},"peerDependencies":{"astro":">=7.0.0","@webtui/css":">=0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/astro-shell_0.1.1_1783504492471_0.057014461623189794","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@brainage04/astro-shell","version":"0.2.0","_id":"@brainage04/astro-shell@0.2.0","maintainers":[{"name":"brainage04","email":"thomasmcmah21@gmail.com"}],"dist":{"shasum":"521008dee8ad56b464a047b0f67ce2a3fcf0191b","tarball":"https://registry.npmjs.org/@brainage04/astro-shell/-/astro-shell-0.2.0.tgz","fileCount":8,"integrity":"sha512-XPmRRkzOqjVrY+aYHTDR82Dgd/PaXmQaMUrY9KbflLDpChWSQ+QSj3d3Uxok2gnbPSCT4K6V8BfRyjWdFqkXhg==","signatures":[{"sig":"MEUCIETsyhF62bYE3w6i8R7Hi30iMZYX5jtCb3M2iiItg6xLAiEAzU2TuakBnQzSVhPVPCPsbx9cNpN7jXtiGVvvjr+OeM8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12785},"type":"module","exports":{"./global.css":"./src/styles/global.css","./components/PageHeader.astro":"./src/components/PageHeader.astro","./components/SiteFooter.astro":"./src/components/SiteFooter.astro","./components/SiteHeader.astro":"./src/components/SiteHeader.astro","./components/SiteLayout.astro":"./src/components/SiteLayout.astro","./components/TerminalPanel.astro":"./src/components/TerminalPanel.astro"},"gitHead":"58852523c40853f324d85c6c2bfc203792fd0d66","private":false,"_npmUser":{"name":"brainage04","email":"thomasmcmah21@gmail.com"},"_npmVersion":"10.9.8","description":"Shared Astro shell components and base styles for brainage04 websites.","directories":{},"_nodeVersion":"22.22.3","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"astro":"7.0.3","typescript":"6.0.3","@webtui/css":"0.1.9"},"peerDependencies":{"astro":">=7.0.0","@webtui/css":">=0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/astro-shell_0.2.0_1783505684466_0.8900132823364286","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@brainage04/astro-shell","version":"0.2.1","_id":"@brainage04/astro-shell@0.2.1","maintainers":[{"name":"brainage04","email":"thomasmcmah21@gmail.com"}],"dist":{"shasum":"b9b9f14623aa2b35e3a4ea23c5f589d9dcef9560","tarball":"https://registry.npmjs.org/@brainage04/astro-shell/-/astro-shell-0.2.1.tgz","fileCount":8,"integrity":"sha512-zb1yg9NCcStZZDOY4MIO2tE+0o8sfeNKgNb/Xo3dAjYKZh92x11YuUVbPzXzhlrnDkQfdFixWGl6kOwsWnwdZg==","signatures":[{"sig":"MEYCIQDjF8CCREnWKaF9P7zPqVVbDxlQhDBnVgpJWVNi0EYlrwIhAPGJDq7x/gOfTYH24jzZjN/9zpBVOc/o7rOhaRzZPfcO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12785},"type":"module","exports":{"./global.css":"./src/styles/global.css","./components/PageHeader.astro":"./src/components/PageHeader.astro","./components/SiteFooter.astro":"./src/components/SiteFooter.astro","./components/SiteHeader.astro":"./src/components/SiteHeader.astro","./components/SiteLayout.astro":"./src/components/SiteLayout.astro","./components/TerminalPanel.astro":"./src/components/TerminalPanel.astro"},"gitHead":"4e578b7cf2f4c52463890b7b071c2a5122b57664","private":false,"_npmUser":{"name":"brainage04","email":"thomasmcmah21@gmail.com"},"_npmVersion":"10.9.8","description":"Shared Astro shell components and base styles for brainage04 websites.","directories":{},"_nodeVersion":"22.22.3","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"astro":"7.0.3","typescript":"6.0.3","@webtui/css":"0.1.9"},"peerDependencies":{"astro":">=7.0.0","@webtui/css":">=0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/astro-shell_0.2.1_1783508616891_0.09696146242453163","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@brainage04/astro-shell","version":"0.4.0","_id":"@brainage04/astro-shell@0.4.0","maintainers":[{"name":"brainage04","email":"thomasmcmah21@gmail.com"}],"homepage":"https://github.com/brainage04/AstroShell#readme","bugs":{"url":"https://github.com/brainage04/AstroShell/issues"},"dist":{"shasum":"8a92328375c0d6b8f944fd4016caa9056f86acf5","tarball":"https://registry.npmjs.org/@brainage04/astro-shell/-/astro-shell-0.4.0.tgz","fileCount":10,"integrity":"sha512-OMPuik6qRIK3ywFjQr6ruLr58PTVwHxjtvFEtRDsIutH4G2179jgJk3MhbcPL8whgtouPju/xX+MSPuT/WaStA==","signatures":[{"sig":"MEQCIFn/GpyqK7wfW1bj+2fRpOSeVQ5r+hcoyyAIVNMW0NUmAiBVK0UOWRzjJOzJ1DGLlLguv96R4jzFwE9IFOOES7vDSg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brainage04%2fastro-shell@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":18673},"type":"module","exports":{"./withBase":"./src/lib/withBase.ts","./global.css":"./src/styles/global.css","./components/PageHeader.astro":"./src/components/PageHeader.astro","./components/SiteFooter.astro":"./src/components/SiteFooter.astro","./components/SiteHeader.astro":"./src/components/SiteHeader.astro","./components/SiteLayout.astro":"./src/components/SiteLayout.astro","./components/TerminalPanel.astro":"./src/components/TerminalPanel.astro"},"gitHead":"bdaf7b8c90c6a0997065664969e3ea34e40da729","private":false,"scripts":{"lint":"eslint . --max-warnings=0","check":"astro check","format":"prettier --write .","pack:check":"npm pack --dry-run --ignore-scripts","format:check":"prettier --check .","release:check":"npm run check && npm run lint && npm run format:check && npm run pack:check","prepublishOnly":"npm run release:check","publish:package":"npm publish --access public"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:68fdc3f7-a591-48b0-ac9c-81f333fba0ae"}},"repository":{"url":"git+https://github.com/brainage04/AstroShell.git","type":"git"},"_npmVersion":"11.16.0","description":"Shared Astro layout, navigation, footer, terminal panel, metadata, base-path handling, and WebTUI foundation used by the sites in this workspace.","directories":{},"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"astro":"7.1.5","eslint":"10.8.0","prettier":"3.9.6","@eslint/js":"10.0.1","typescript":"6.0.3","@webtui/css":"0.1.9","@astrojs/check":"0.9.10","typescript-eslint":"8.65.0","eslint-plugin-astro":"3.0.1","prettier-plugin-astro":"0.14.1"},"peerDependencies":{"astro":"^7.1.5","@webtui/css":"^0.1.9"},"_npmOperationalInternal":{"tmp":"tmp/astro-shell_0.4.0_1785639700685_0.19157061691858535","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@brainage04/astro-shell","version":"0.4.1","_id":"@brainage04/astro-shell@0.4.1","maintainers":[{"name":"brainage04","email":"thomasmcmah21@gmail.com"}],"homepage":"https://github.com/brainage04/AstroShell#readme","bugs":{"url":"https://github.com/brainage04/AstroShell/issues"},"dist":{"shasum":"681a7f0ca1919076e7696d94ddada4b55eaf277c","tarball":"https://registry.npmjs.org/@brainage04/astro-shell/-/astro-shell-0.4.1.tgz","fileCount":13,"integrity":"sha512-W0GYGqMy8U7XD/nOT3VcaBu4j/2zUwTW3KKxdsB1jphvO1MUg/TP+rqDo/G/ekO/p/QQN4GmY1kbXA8egUqUjA==","signatures":[{"sig":"MEQCIE7WiWafWeYHI8Z4EKcZgxtqA8P9GllQaPoIkY/tunZFAiAAhcN4zUCA6Qq104LC7jk0n0Vt3OnkFBj6nP1h35T9kw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brainage04%2fastro-shell@0.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":22838},"type":"module","exports":{"./config":"./src/config.ts","./withBase":"./src/lib/withBase.ts","./global.css":"./src/styles/global.css","./components/PageHeader.astro":"./src/components/PageHeader.astro","./components/SiteFooter.astro":"./src/components/SiteFooter.astro","./components/SiteHeader.astro":"./src/components/SiteHeader.astro","./components/SiteLayout.astro":"./src/components/SiteLayout.astro","./components/NotFoundPage.astro":"./src/components/NotFoundPage.astro","./components/TerminalPanel.astro":"./src/components/TerminalPanel.astro"},"gitHead":"b3ca8a70b2cf47d05424cec88914d3e1359d1fb0","private":false,"scripts":{"lint":"eslint . --max-warnings=0","test":"vitest run","check":"astro check","format":"prettier --write .","pack:check":"npm pack --dry-run --ignore-scripts","format:check":"prettier --check .","release:check":"npm run check && npm run lint && npm run format:check && npm test && npm run pack:check","prepublishOnly":"npm run release:check","publish:package":"npm publish --access public"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:68fdc3f7-a591-48b0-ac9c-81f333fba0ae"}},"repository":{"url":"git+https://github.com/brainage04/AstroShell.git","type":"git"},"_npmVersion":"11.17.0","description":"Shared Astro layout, navigation, footer, terminal panel, metadata, base-path handling, and WebTUI foundation used by the sites in this workspace.","directories":{},"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"astro":"7.3.1","eslint":"10.9.1","vitest":"5.0.0","prettier":"3.9.6","@eslint/js":"10.0.1","typescript":"6.0.3","@webtui/css":"0.1.10","@astrojs/check":"0.9.10","typescript-eslint":"8.69.0","eslint-plugin-astro":"3.1.0","prettier-plugin-astro":"0.14.1"},"peerDependencies":{"astro":"^7.1.5","@webtui/css":"^0.1.9"},"_npmOperationalInternal":{"tmp":"tmp/astro-shell_0.4.1_1788496776504_0.1565386433823701","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@brainage04/astro-shell","version":"0.4.2","_id":"@brainage04/astro-shell@0.4.2","maintainers":[{"name":"brainage04","email":"thomasmcmah21@gmail.com"}],"homepage":"https://github.com/brainage04/AstroShell#readme","bugs":{"url":"https://github.com/brainage04/AstroShell/issues"},"dist":{"shasum":"5ccc55eb34e37a36edf5cfca2e5073b70e0a8542","tarball":"https://registry.npmjs.org/@brainage04/astro-shell/-/astro-shell-0.4.2.tgz","fileCount":13,"integrity":"sha512-8wcMXm5y8RaxYqEsZifcvtv3DJ4utLzcAflV9k337XoQw1X18avnNbKcfbdqKtThNMMjwg2dnJkAfcYsY64qyQ==","signatures":[{"sig":"MEYCIQDwXjkiGfILSJ9Ip/oo1Quk7eRZtil47A1+zP1tL6pr4AIhAIExFfhCQxkDRSf92aSO99h9uFfZ5F508SY6cPT8B1Kb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brainage04%2fastro-shell@0.4.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":22923},"type":"module","exports":{"./config":"./src/config.ts","./withBase":"./src/lib/withBase.ts","./global.css":"./src/styles/global.css","./components/PageHeader.astro":"./src/components/PageHeader.astro","./components/SiteFooter.astro":"./src/components/SiteFooter.astro","./components/SiteHeader.astro":"./src/components/SiteHeader.astro","./components/SiteLayout.astro":"./src/components/SiteLayout.astro","./components/NotFoundPage.astro":"./src/components/NotFoundPage.astro","./components/TerminalPanel.astro":"./src/components/TerminalPanel.astro"},"gitHead":"07cd8ee0fd84ea7fb808cf69ae0eea0b2cb0a71f","private":false,"scripts":{"lint":"eslint . --max-warnings=0","test":"vitest run","check":"astro check","format":"prettier --write .","pack:check":"npm pack --dry-run --ignore-scripts","format:check":"prettier --check .","release:check":"npm run check && npm run lint && npm run format:check && npm test && npm run pack:check","prepublishOnly":"npm run release:check","publish:package":"npm publish --access public"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:68fdc3f7-a591-48b0-ac9c-81f333fba0ae"}},"repository":{"url":"git+https://github.com/brainage04/AstroShell.git","type":"git"},"_npmVersion":"11.17.0","description":"Shared Astro layout, navigation, footer, terminal panel, metadata, base-path handling, and WebTUI foundation used by the sites in this workspace.","directories":{},"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"astro":"7.3.1","eslint":"10.9.1","vitest":"5.0.0","prettier":"3.9.6","@eslint/js":"10.0.1","typescript":"6.0.3","@webtui/css":"0.1.10","@astrojs/check":"0.9.10","typescript-eslint":"8.69.0","eslint-plugin-astro":"3.1.0","prettier-plugin-astro":"0.14.1"},"peerDependencies":{"astro":"^7.1.5","@webtui/css":"^0.1.9"},"_npmOperationalInternal":{"tmp":"tmp/astro-shell_0.4.2_1788499401635_0.8005692919621545","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"_id":"@brainage04/astro-shell@0.5.0","bugs":{"url":"https://github.com/brainage04/AstroShell/issues"},"dist":{"shasum":"cabe423a16804c2d3ab0737507d42e694fe793a8","tarball":"https://registry.npmjs.org/@brainage04/astro-shell/-/astro-shell-0.5.0.tgz","fileCount":25,"integrity":"sha512-FAA/wj3LpBqm61+n9/y9rqtrkCJf4FvvjGo8wHYTI0+7sT7FcAts6PVUYuychUx2Eph2LpFnDSMiSl78LTJTzg==","signatures":[{"sig":"MEUCIDE+C2GqKzACUmUaGRldlHaJ2BEOUxPg7tFPq9g2ukCyAiEAnPPGGHCrnDuDIW/5NxkNKnNsnOQ+CEqmN29yk7kwD7g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIEglPfxnkFdrNT4heea8AZS4XrsmDYOiFs+2QfRyF7cLAiAmOwTz3fVRvgGLPpI1U70ExcHvk149kZ8MdBqGDGCp1g=="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brainage04%2fastro-shell@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":48335},"name":"@brainage04/astro-shell","type":"module","exports":{".":{"types":"./src/integration.d.ts","default":"./src/integration.mjs"},"./config":"./src/config.ts","./eslint":{"types":"./src/presets/eslint.d.ts","default":"./src/presets/eslint.js"},"./prettier":{"types":"./src/presets/prettier.d.mts","default":"./src/presets/prettier.mjs"},"./withBase":"./src/lib/withBase.ts","./global.css":"./src/styles/global.css","./navigation":"./src/lib/navigation.ts","./tsconfig.json":"./src/presets/tsconfig.json","./pages/404.astro":"./src/pages/404.astro","./themes/rose.css":"./src/themes/rose.css","./components/StatCard.astro":"./src/components/StatCard.astro","./components/PageHeader.astro":"./src/components/PageHeader.astro","./components/SiteFooter.astro":"./src/components/SiteFooter.astro","./components/SiteHeader.astro":"./src/components/SiteHeader.astro","./components/SiteLayout.astro":"./src/components/SiteLayout.astro","./components/ProfileCard.astro":"./src/components/ProfileCard.astro","./components/NotFoundPage.astro":"./src/components/NotFoundPage.astro","./components/TerminalPanel.astro":"./src/components/TerminalPanel.astro"},"gitHead":"f5fbfd4c364a1b02bd711b313385d6fbb0344f12","private":false,"scripts":{"lint":"eslint . --max-warnings=0","test":"vitest run","check":"astro check","format":"prettier --write .","pack:check":"npm pack --dry-run --ignore-scripts","format:check":"prettier --check .","release:check":"npm run check && npm run lint && npm run format:check && npm test && npm run pack:check","prepublishOnly":"npm run release:check","publish:package":"npm publish --access public"},"version":"0.5.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:68fdc3f7-a591-48b0-ac9c-81f333fba0ae"}},"homepage":"https://github.com/brainage04/AstroShell#readme","repository":{"url":"git+https://github.com/brainage04/AstroShell.git","type":"git"},"_npmVersion":"11.19.0","description":"Shared Astro integration, layout, navigation, footer, 404 page, components, design tokens, tool presets and CI workflows used by the sites in this workspace, built on [WebTUI](https://webtui.ironclad.sh/).","directories":{},"maintainers":[{"name":"brainage04","email":"thomasmcmah21@gmail.com"}],"_nodeVersion":"24.20.0","dependencies":{"@eslint/js":"10.0.1","typescript-eslint":"8.69.0","eslint-plugin-astro":"3.1.0","prettier-plugin-astro":"0.14.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"astro":"7.3.1","eslint":"10.9.1","vitest":"5.0.0","prettier":"3.9.6","typescript":"6.0.3","@webtui/css":"0.1.10","@astrojs/check":"0.9.10"},"peerDependencies":{"astro":"^7.1.5","@webtui/css":"^0.1.9"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/astro-shell_0.5.0_1790182111507_0.8457817065324684"}}},"time":{"created":"2026-07-08T09:54:52.379Z","modified":"2026-09-23T16:48:31.939Z","0.1.1":"2026-07-08T09:54:52.603Z","0.2.0":"2026-07-08T10:14:44.610Z","0.2.1":"2026-07-08T11:03:37.041Z","0.4.0":"2026-08-02T03:01:40.812Z","0.4.1":"2026-09-04T04:39:36.647Z","0.4.2":"2026-09-04T05:23:21.771Z","0.5.0":"2026-09-23T16:48:31.586Z"},"bugs":{"url":"https://github.com/brainage04/AstroShell/issues"},"homepage":"https://github.com/brainage04/AstroShell#readme","repository":{"url":"git+https://github.com/brainage04/AstroShell.git","type":"git"},"description":"Shared Astro integration, layout, navigation, footer, 404 page, components, design tokens, tool presets and CI workflows used by the sites in this workspace, built on [WebTUI](https://webtui.ironclad.sh/).","maintainers":[{"name":"brainage04","email":"thomasmcmah21@gmail.com"}],"readme":"# AstroShell\n\nShared Astro integration, layout, navigation, footer, 404 page, components, design tokens, tool presets and CI workflows used by the sites in this workspace, built on [WebTUI](https://webtui.ironclad.sh/).\n\n## Requirements\n\n- Node.js 24\n- Astro `^7.1.5`\n- `@webtui/css` `^0.1.9`\n\n## Installation\n\n```bash\nnpm install @brainage04/astro-shell\n```\n\n## Usage\n\nRegister the integration in `astro.config.mjs`:\n\n```js\nimport { defineConfig } from 'astro/config';\nimport astroShell from '@brainage04/astro-shell';\nimport { siteConfig } from './src/site.config.ts';\n\nexport default defineConfig({\n  integrations: [\n    astroShell({\n      config: siteConfig,\n      styles: ['@brainage04/astro-shell/themes/rose.css', './src/styles/site.css'],\n    }),\n  ],\n});\n```\n\nDescribe the site once in `src/site.config.ts`:\n\n```ts\nimport type { SiteConfig } from '@brainage04/astro-shell/config';\n\nexport const siteConfig = {\n  siteName: 'Example',\n  description: 'Example site',\n  sourceHref: 'https://github.com/example/site',\n  ownerHref: 'https://github.com/example',\n  ownerName: 'example',\n  navItems: [\n    { name: 'Home', href: '/' },\n    { name: 'Projects', href: '/projects/', activeMode: 'prefix' },\n  ],\n} satisfies SiteConfig;\n```\n\nUse the shell layout directly in pages. The home page omits `title`; its document title is `homeTitle` (default `siteName`). Other pages render `<title> | <siteName>`.\n\n```astro\n---\nimport SiteLayout from '@brainage04/astro-shell/components/SiteLayout.astro';\nimport TerminalPanel from '@brainage04/astro-shell/components/TerminalPanel.astro';\n---\n\n<SiteLayout>\n  <TerminalPanel title=\"Hello\">Shared shell content.</TerminalPanel>\n</SiteLayout>\n```\n\n`SiteLayout` props, all optional: `title`, `description` (default `config.description`), `image` (default `config.image`), `ogType` (`'website'` | `'article'`, default `'website'`), `canonicalHref` (default `config.canonicalHref`). A `head` slot adds extra head elements.\n\nLocal links and assets passed to the shell are prefixed with Astro's configured base path. Use `withBase` for application-owned links:\n\n```ts\nimport { withBase } from '@brainage04/astro-shell/withBase';\n```\n\n### Integration options\n\n| option     | type                | default  | effect                                                                                                                                                                                                                   |\n| ---------- | ------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| `config`   | `SiteConfig`        | required | Exposed to the shell as `virtual:astro-shell/config`. Must be JSON-serialisable.                                                                                                                                         |\n| `styles`   | `readonly string[]` | `[]`     | Imported after the shell's `global.css`, in order, so site rules win the cascade. Entries starting with `./` or `../` resolve against the Astro project root; package specifiers (e.g. a theme) are imported as written. |\n| `notFound` | `boolean`           | `true`   | Injects `/404` rendering `NotFoundPage` inside `SiteLayout`. Set `false` to ship your own `src/pages/404.astro`.                                                                                                         |\n\nThe integration also applies the GitHub Pages environment: `PUBLIC_SITE_URL` (when set) becomes `site`, and `base` is `PUBLIC_BASE_PATH` or `/`.\n\n### `SiteConfig`\n\nRequired: `siteName`, `description`, `sourceHref`, `navItems`, `ownerHref`, `ownerName`.\nOptional: `homeTitle`, `brandLabel`, `brandHref`, `faviconHref`, `faviconType`, `image`, `canonicalHref`, `themeColor` (default `#151515`), `preconnectHrefs`, `creatorHref`, `creatorName`, `year` (footer copyright year, default current year), `lang` (default `en`).\n\n`NavItem`: `{ name, href, external?, match?, activeMode?: 'exact' | 'prefix' }`. `isNavItemActive(item, pathname, base?)` from `@brainage04/astro-shell/navigation` exposes the header's matching rule.\n\n## Components\n\n- `components/SiteLayout.astro`, `components/SiteHeader.astro`, `components/SiteFooter.astro`\n- `components/PageHeader.astro` — `{ title }`\n- `components/TerminalPanel.astro` — `{ title?, class?, id?, shear? }`\n- `components/NotFoundPage.astro` — `{ message?, homeHref?, homeLabel?, secondaryHref?, secondaryLabel? }`\n- `components/StatCard.astro` — `{ label, value?, valueId?, note?, class? }`, renders `.stat-card` with an `<output>` (defaults to `—`) for script-updated values.\n- `components/ProfileCard.astro` — `{ name, avatar, avatarAlt?, socials }`; avatar frame, `h1` name row with social icons, default slot for the copy under the name. `avatar` and local `socials[].icon`/`href` are public paths (base applied). `SocialLink` is exported from `@brainage04/astro-shell/config`: `{ name, href, icon, iconWidth, iconHeight, external? }`.\n\n`ProfileCard` layout can be tuned per site with custom properties on `.profile-card` (defaults in brackets):\n\n| property                   | default                                                                                                                      |\n| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |\n| `--profile-avatar-column`  | `minmax(8rem, 13rem)`                                                                                                        |\n| `--profile-gap`            | `clamp(1.5rem, 5vw, 3.5rem)`                                                                                                 |\n| `--profile-background`     | `linear-gradient(110deg, color-mix(in srgb, var(--accent-primary) 7%, transparent), transparent 48%), var(--surface-raised)` |\n| `--profile-copy-gap`       | `0.9rem`                                                                                                                     |\n| `--profile-name-gap`       | `0.7rem 1.25rem`                                                                                                             |\n| `--profile-name-size`      | `clamp(2rem, 5vw, 3.5rem)`                                                                                                   |\n| `--profile-name-leading`   | `0.98`                                                                                                                       |\n| `--profile-name-tracking`  | `-0.055em`                                                                                                                   |\n| `--profile-socials-offset` | `0 -0.125rem`                                                                                                                |\n\n## Styles and tokens\n\n`global.css` is loaded by `SiteLayout`. It imports the WebTUI base plus typography, button, badge, separator, pre and box utilities, and provides the shell classes (`.terminal-panel`, `.panel-header`, `.page-header`, `.action-button`, `.action-button--ghost`, `.hero-actions`, `.stack`, `.grid`, `.field`, `.control-card`, `.note-card`, `.stat-card`, `.site-badge`, `.muted`, `.sr-only`, `.skip-link`) and these utilities:\n\n- `.meta-row` — wrapping row of small uppercase mono labels.\n- `.section-heading` — heading on the left, optional link or `p` on the right, subtle bottom rule.\n- `.chip-list` — unstyled `ul` of mono chips. Tune with `--chip-font-size`, `--chip-padding`, `--chip-gap`, `--chip-color`, `--chip-tint` (accent mix percentage).\n- `.table-wrap` — bordered horizontal-scroll wrapper; add `.table-wrap--stack` to turn rows into stacked cards at ≤640px, labelled from `td[data-label]`.\n- A global `prefers-reduced-motion: reduce` block disables animations, transitions and smooth scrolling.\n\nThemes are plain stylesheets listed in `styles`: `@brainage04/astro-shell/themes/rose.css` is the rose/lilac palette shared by several sites.\n\nTokens (set on `:root`/`html:root` in a theme or site stylesheet):\n\n| token                                                          | default                                                    |\n| -------------------------------------------------------------- | ---------------------------------------------------------- |\n| `--background0..3`, `--foreground0..2`                         | neutral dark palette                                       |\n| `--accent-primary`                                             | `#8bd5ff` (links, active nav, focus accents)               |\n| `--accent-secondary`                                           | `#f36f9f`                                                  |\n| `--accent-highlight`                                           | `#f7d774` (focus outline, stat values)                     |\n| `--danger`                                                     | `#ff928a`                                                  |\n| `--font-mono`                                                  | `'Courier New', Courier, monospace`                        |\n| `--surface` / `--surface-raised`                               | `var(--background1)` / `var(--background2)`                |\n| `--border-subtle` / `--border-strong`                          | `--foreground2` at 34% / 68%                               |\n| `--shadow-raised`                                              | `0 1.25rem 3rem color-mix(in srgb, #000 28%, transparent)` |\n| `--panel-bg` / `--panel-border`                                | `--surface` at 92% / `var(--border-strong)`                |\n| `--control-bg`, `--control-border`, `--control-height`         | buttons and number inputs; height `2.75rem`                |\n| `--site-main-width`, `--site-nav-width`, `--site-footer-width` | `70rem`, `70rem`, `72rem`                                  |\n| `--site-grid-min`                                              | `19rem` (`.grid` column minimum)                           |\n\n## Tool presets\n\n```js\n// eslint.config.js\nexport { default } from '@brainage04/astro-shell/eslint';\n```\n\n```js\n// prettier.config.mjs\nexport { default } from '@brainage04/astro-shell/prettier';\n```\n\n```json\n// tsconfig.json\n{\n  \"extends\": \"@brainage04/astro-shell/tsconfig.json\",\n  \"include\": [\".astro/types.d.ts\", \"**/*\"],\n  \"exclude\": [\"dist\"]\n}\n```\n\nThe shell depends on `@eslint/js`, `eslint-plugin-astro`, `typescript-eslint` and `prettier-plugin-astro`; sites keep `eslint`, `prettier`, `typescript`, `@astrojs/check`, `astro` and (if used) `vitest`.\n\n## Reusable workflows\n\n```yaml\n# .github/workflows/deploy.yml\nname: Deploy to GitHub Pages\n\non:\n  push:\n    branches: [main]\n  workflow_dispatch:\n\njobs:\n  deploy:\n    uses: brainage04/AstroShell/.github/workflows/site-deploy.yml@v0.5.0\n    permissions:\n      contents: read\n      pages: write\n      id-token: write\n```\n\n```yaml\n# .github/workflows/validate.yml\nname: Validate\n\non:\n  pull_request:\n  push:\n    branches: [main]\n\njobs:\n  validate:\n    uses: brainage04/AstroShell/.github/workflows/site-validate.yml@v0.5.0\n    permissions:\n      contents: read\n```\n\n- `site-validate.yml` runs `npm ci`, `check`, `lint`, `format:check`, `npm test --if-present` and `build` on Node 24.\n- `site-deploy.yml` builds with `withastro/action`, deriving `PUBLIC_SITE_URL`/`PUBLIC_BASE_PATH` from the repository (user sites deploy to `/`, project sites to `/<repo>`), then deploys to the `github-pages` environment. Input `ref` (optional) builds a specific ref instead of the triggering commit.\n\n## Migrating from 0.4\n\n1. Add the integration to `astro.config.mjs` and delete the site's own `PUBLIC_SITE_URL`/`PUBLIC_BASE_PATH` handling.\n2. Delete `src/layouts/SiteLayout.astro` wrappers and `src/pages/404.astro`; import `@brainage04/astro-shell/components/SiteLayout.astro` directly. The layout no longer accepts `SiteConfig` props.\n3. Home pages drop `title=\"Home\"` (the magic value is gone); other pages keep `title`.\n4. `SiteConfig.ownerHref` and `ownerName` are required (the footer no longer defaults to brainage04). Remove fields that are `undefined`, `[]`, equal to the default, and nav `match` values equal to `href`.\n5. Move site stylesheets into the integration's `styles` option instead of importing them in a layout.\n6. Rename tokens (old names are removed, no aliases):\n\n   | 0.4                               | 0.5                                        |\n   | --------------------------------- | ------------------------------------------ |\n   | `--accent-cyan`                   | `--accent-primary`                         |\n   | `--accent`                        | `--accent-secondary`                       |\n   | `--accent-yellow`                 | `--accent-highlight`                       |\n   | `--accent-green`                  | removed (use a local custom property)      |\n   | `--shadow-soft`, `--panel-shadow` | `--shadow-raised`                          |\n   | `--font-body`, `--font-display`   | `--font-mono` (`--font-family` follows it) |\n\n7. Replace a duplicated rose palette block with `@brainage04/astro-shell/themes/rose.css` in `styles`.\n8. Replace local copies of the new utilities (`.meta-row`, `.section-heading`, `.chip-list`, `.table-wrap`, `.stat-card` internals, reduced-motion blocks that only disable transitions) with the shared ones.\n9. `<button class=\"action-button\">` now renders exactly like `<a class=\"action-button\">`: drop `is-=\"button\"` and height/padding workarounds.\n10. The scanline overlay sits behind content (`z-index: -1`); delete `body > * { position: relative; z-index: 1 }` workarounds.\n11. Switch `eslint.config.js`, `prettier.config.mjs` and `tsconfig.json` to the presets and drop the devDependencies the shell now supplies.\n12. Replace `deploy.yml`/`validate.yml` bodies with the reusable workflow callers above.\n\n## Development\n\n```bash\nnpm ci\n```\n\n## Validation\n\n```bash\nnpm run check\nnpm run lint\nnpm run format:check\nnpm test\nnpm run pack:check\n```\n\n`npm run release:check` runs the complete pre-publish validation sequence.\n\n## Deployment\n\n`npm run publish:package` publishes the package to npm (`prepublishOnly` runs `release:check`). `.github/workflows/publish.yml` provides the same release path through npm trusted publishing.\n","readmeFilename":"README.md"}