diff --git a/website/astro.config.mjs b/website/astro.config.mjs index cf6622d..f62de83 100644 --- a/website/astro.config.mjs +++ b/website/astro.config.mjs @@ -10,9 +10,21 @@ export default defineConfig({ title: 'aeo.js', description: 'Answer Engine Optimization for the modern web. Make your site discoverable by AI crawlers and LLMs.', url: 'https://aeojs.org', + schema: { + organization: { + name: 'aeo.js', + url: 'https://aeojs.org', + logo: 'https://aeojs.org/og.png', + sameAs: [ + 'https://github.com/multivmlabs/aeo.js', + 'https://www.npmjs.com/package/aeo.js', + ], + }, + }, widget: { enabled: true, position: 'bottom-right', + size: 'small', showBadge: true, theme: { background: 'rgba(10, 10, 10, 0.95)', @@ -25,12 +37,11 @@ export default defineConfig({ starlight({ title: 'aeo.js', description: 'Answer Engine Optimization for the modern web. Make your site discoverable by AI crawlers and LLMs.', - social: [ - { icon: 'github', label: 'GitHub', href: 'https://github.com/multivmlabs/aeo.js' }, - { icon: 'npm', label: 'npm', href: 'https://www.npmjs.com/package/aeo.js' }, - ], + social: [], components: { Header: './src/components/Header.astro', + Hero: './src/components/Hero.astro', + Footer: './src/components/Footer.astro', }, customCss: ['./src/styles/custom.css'], head: [ diff --git a/website/package-lock.json b/website/package-lock.json index cddd9a2..ceb8aea 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -9,6 +9,7 @@ "version": "0.0.1", "dependencies": { "@astrojs/starlight": "^0.38.1", + "aeo.js": "^0.0.8", "astro": "^6.0.1", "sharp": "^0.34.2" } @@ -1911,6 +1912,12 @@ "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", "license": "MIT" }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "license": "MIT" + }, "node_modules/@types/ms": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", @@ -1977,6 +1984,52 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/aeo.js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/aeo.js/-/aeo.js-0.0.8.tgz", + "integrity": "sha512-WZmc0V9kv58kcSnp6UlAYrhz2xvpqsoQRsHHYFlZKmPMMWzXdbSJK47nI3JnVV7jo1nK316QkPzhk2yJi6P0YA==", + "license": "MIT", + "dependencies": { + "@types/minimatch": "^5.1.2", + "minimatch": "^10.2.2" + }, + "bin": { + "aeo.js": "dist/cli.mjs", + "aeojs": "dist/cli.mjs" + }, + "peerDependencies": { + "@astrojs/astro": ">=3.0.0", + "@nuxt/kit": ">=3.0.0", + "next": ">=13.0.0", + "react": ">=17.0.0", + "vite": ">=4.0.0", + "vue": ">=3.0.0", + "webpack": ">=5.0.0" + }, + "peerDependenciesMeta": { + "@astrojs/astro": { + "optional": true + }, + "@nuxt/kit": { + "optional": true + }, + "next": { + "optional": true + }, + "react": { + "optional": true + }, + "vite": { + "optional": true + }, + "vue": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -2151,6 +2204,15 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/bcp-47": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-2.1.0.tgz", @@ -2182,6 +2244,18 @@ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "license": "ISC" }, + "node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/ccount": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", @@ -4610,6 +4684,21 @@ ], "license": "MIT" }, + "node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/mrmime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", diff --git a/website/package.json b/website/package.json index b25f57f..25cf3b4 100644 --- a/website/package.json +++ b/website/package.json @@ -11,7 +11,7 @@ }, "dependencies": { "@astrojs/starlight": "^0.38.1", - "aeo.js": "^0.0.7", + "aeo.js": "^0.0.8", "astro": "^6.0.1", "sharp": "^0.34.2" } diff --git a/website/src/components/Footer.astro b/website/src/components/Footer.astro new file mode 100644 index 0000000..2f4906a --- /dev/null +++ b/website/src/components/Footer.astro @@ -0,0 +1,52 @@ +--- +import Default from '@astrojs/starlight/components/Footer.astro'; +--- + + + + + + diff --git a/website/src/components/Header.astro b/website/src/components/Header.astro index df9cfa2..4437f17 100644 --- a/website/src/components/Header.astro +++ b/website/src/components/Header.astro @@ -1,81 +1,152 @@ --- -import Default from '@astrojs/starlight/components/Header.astro'; +import config from 'virtual:starlight/user-config'; +import Search from 'virtual:starlight/components/Search'; +import SiteTitle from 'virtual:starlight/components/SiteTitle'; + +const shouldRenderSearch = + config.pagefind || config.components.Search !== '@astrojs/starlight/components/Search.astro'; --- - +
+
+
+ +
+ +
+ +
+ {shouldRenderSearch && } +
- +
+ + npm downloads + + + GitHub stars + + + + + + +
+
diff --git a/website/src/components/Hero.astro b/website/src/components/Hero.astro new file mode 100644 index 0000000..4264e21 --- /dev/null +++ b/website/src/components/Hero.astro @@ -0,0 +1,168 @@ +--- +import { Image } from 'astro:assets'; +import Terminal from './Terminal.astro'; + +const PAGE_TITLE_ID = '_top'; + +const { data } = Astro.locals.starlightRoute.entry; +const { title = data.title, tagline, image, actions = [] } = data.hero || {}; + +const imageAttrs = { + loading: 'eager' as const, + decoding: 'async' as const, + width: 400, + height: 400, + alt: image?.alt || '', +}; + +let darkImage: ImageMetadata | undefined; +let lightImage: ImageMetadata | undefined; +let rawHtml: string | undefined; +if (image) { + if ('file' in image) { + darkImage = image.file; + } else if ('dark' in image) { + darkImage = image.dark; + lightImage = image.light; + } else { + rawHtml = image.html; + } +} + +const isSplash = data.template === 'splash'; +--- + +
+ { + darkImage && ( + + ) + } + {lightImage && } + {rawHtml &&
} +
+
+

+ {tagline &&
} +

+ { + actions.length > 0 && ( +
+ {actions.map(({ icon, link: href, text, variant }) => ( + + {text} + + + ))} +
+ ) + } +
+ {isSplash &&
} +
+ + + + diff --git a/website/src/components/StickyNav.astro b/website/src/components/StickyNav.astro new file mode 100644 index 0000000..5b91f53 --- /dev/null +++ b/website/src/components/StickyNav.astro @@ -0,0 +1,141 @@ +--- +const sections = [ + { label: 'Quick Start', id: 'quick-start' }, + { label: 'What is AEO?', id: 'what-is-aeo' }, + { label: 'Why AEO', id: 'why-aeo-matters' }, + { label: 'Widget', id: 'widget' }, + { label: 'Configuration', id: 'configuration' }, + { label: 'Generated Files', id: 'generated-files' }, + { label: 'Checker', id: 'checker' }, +]; +--- + + + + + + diff --git a/website/src/components/Terminal.astro b/website/src/components/Terminal.astro new file mode 100644 index 0000000..07d236a --- /dev/null +++ b/website/src/components/Terminal.astro @@ -0,0 +1,329 @@ +--- +--- + +
+
+
+ + + +
+
+ + + + +
+
+
+
+
+ $ + +
+
+
added 1 package in 2s
+
+
Ready — run npx aeo.js init to get started
+
+
+ +
+
+ $ + +
+
+
+
GEO Readiness Score: 92/100 (Excellent)
+
══════════════════════════════════════
+
+
AI Access: 20/20
+
Content Structure: 20/20
+
Schema Presence: 20/20
+
Meta Quality: 16/20
+
Citability: 16/20
+
+
+ +
+
+ $ + +
+
+
+
[aeo.js] Generating AEO files...
+
robots.txt — AI crawler directives
+
llms.txt — LLM summary
+
llms-full.txt — full content for LLMs
+
sitemap.xml — sitemap
+
schema.json — JSON-LD structured data
+
ai-index.json — AI content index
+
+
Generated 6 files in 42ms
+
+
+ +
+
+ // aeo.config.ts +
+
+
import {"{ defineConfig }"} from 'aeo.js'
+
+
export default {"defineConfig({"}
+
{" title: "}'My Site',
+
{" url: "}'https://mysite.com',
+
{" schema: { organization: { name: "}'My Co'{" } },"}
+
{" widget: { size: "}'small'{" },"}
+
{"});"}
+
+
+
+
+ + + + diff --git a/website/src/content/docs/index.mdx b/website/src/content/docs/index.mdx index 4ba400f..8a09b7a 100644 --- a/website/src/content/docs/index.mdx +++ b/website/src/content/docs/index.mdx @@ -3,50 +3,18 @@ title: aeo.js description: Answer Engine Optimization for the modern web. Make your site discoverable by AI crawlers and LLMs. template: splash hero: - tagline: Make your site discoverable by ChatGPT, Claude, Perplexity, and every AI answer engine — automatically. + tagline: Make your site discoverable by ChatGPT, Claude, Perplexity, and every AI answer engine, automatically. actions: - text: Get Started link: /getting-started/introduction/ icon: right-arrow variant: primary - - text: GitHub - link: https://github.com/multivmlabs/aeo.js - icon: external - variant: minimal - - text: npm - link: https://www.npmjs.com/package/aeo.js - icon: external - variant: minimal --- -import { Card, CardGrid, Tabs, TabItem } from '@astrojs/starlight/components'; +import { Tabs, TabItem } from '@astrojs/starlight/components'; +import StickyNav from '../../components/StickyNav.astro'; -## What is AEO? - -Answer Engine Optimization (AEO) is the practice of making your website discoverable and citable by AI-powered answer engines like ChatGPT, Claude, Perplexity, and SearchGPT. - -**aeo.js** auto-generates the files these engines look for and provides a drop-in widget that shows visitors how your site appears to AI. - - - - LLM-readable summaries of your site, auto-generated from your pages. - - - AI-crawler-aware robots directives with sensible defaults for all major AI bots. - - - Standard sitemap.xml plus an ai-index.json optimized for RAG pipelines. - - - Drop-in toggle showing the AI-readable version of any page. - - - First-class support for Astro, Next.js, Vite, Nuxt, Angular, and Webpack. - - - Run standalone with npx aeo.js generate — no framework integration needed. - - + ## Quick Start @@ -177,6 +145,39 @@ npm install aeo.js +## What is AEO? + +Answer Engine Optimization (AEO) is the practice of making your website discoverable and citable by AI-powered answer engines like ChatGPT, Claude, Perplexity, and SearchGPT. + +**aeo.js** auto-generates the files these engines look for and provides a drop-in widget that shows visitors how your site appears to AI. First-class support for Astro, Next.js, Vite, Nuxt, Angular, and Webpack — or run standalone via CLI. + +## Why AEO matters + +
+
+
58%
+
of searches
+
end without a click — AI gives the answer directly
+
+
+
40%
+
of Gen Z
+
prefer AI assistants over traditional search engines
+
+
+
97%
+
of sites
+
have no llms.txt or structured data for AI crawlers
+
+
+
1 min
+
to set up
+
aeo.js generates robots.txt, llms.txt, schema & more
+
+
+ +If your site isn't optimized for AI engines, you're invisible to a growing share of users who never open a search results page. AEO is the new SEO. + ## Widget The Human/AI widget lets visitors toggle between the normal page and its AI-readable markdown version. Framework plugins inject it automatically — for Next.js or manual setups: @@ -272,18 +273,17 @@ After building, your output directory contains: ``` public/ - robots.txt # AI-crawler-aware directives - llms.txt # Short LLM-readable summary - llms-full.txt # Full content for LLMs - sitemap.xml # Standard sitemap - docs.json # Documentation manifest - ai-index.json # AI-optimized content index - index.md # Markdown for / - about.md # Markdown for /about - … # One .md per page +├── robots.txt # AI-crawler directives +├── llms.txt # Short LLM-readable summary +├── llms-full.txt # Full content for LLMs +├── sitemap.xml # Standard sitemap +├── docs.json # Documentation manifest +├── ai-index.json # AI content index +├── index.md # Markdown for / +└── about.md # Markdown for /about ``` -## Check your site's AEO readiness +## Checker
diff --git a/website/src/styles/custom.css b/website/src/styles/custom.css index 6da1a7e..78b25e7 100644 --- a/website/src/styles/custom.css +++ b/website/src/styles/custom.css @@ -1,7 +1,7 @@ -@import url('https://fonts.googleapis.com/css2?family=Figtree:wght@300;400;500;600;700;800;900&family=JetBrains+Mono:wght@400;500&display=swap'); +@import url('https://fonts.googleapis.com/css2?family=Figtree:wght@300;400;500;600;700;800;900&family=Instrument+Serif:ital@0;1&family=JetBrains+Mono:wght@400;500&display=swap'); /* ────────────────────────────────────────────── - Color palette — pure black glassmorphism + Color palette — dark only ────────────────────────────────────────────── */ :root { --sl-color-accent-low: rgba(255, 255, 255, 0.06); @@ -29,7 +29,7 @@ --sl-content-width: 48rem; --sl-nav-height: 4rem; - --sl-text-h1: clamp(2rem, 4vw, 2.5rem); + --sl-text-h1: clamp(1.5rem, 3vw, 2rem); --sl-text-h2: clamp(1.4rem, 3vw, 1.8rem); --sl-text-h3: 1.2rem; --sl-text-body: 0.95rem; @@ -38,53 +38,36 @@ --sl-line-height: 1.7; } -[data-theme="light"] { - --sl-color-accent-low: rgba(0, 0, 0, 0.04); - --sl-color-accent: #000000; - --sl-color-accent-high: #000000; - --sl-color-white: #000000; - --sl-color-gray-1: #2a2a2a; - --sl-color-gray-2: #505050; - --sl-color-gray-3: #808080; - --sl-color-gray-4: #b0b0b0; - --sl-color-gray-5: #e8e8e8; - --sl-color-gray-6: #f5f5f5; - --sl-color-black: #ffffff; - --sl-color-bg-nav: rgba(255, 255, 255, 0.85); - --sl-color-bg-sidebar: rgba(255, 255, 255, 0.7); - --sl-color-hairline-shade: rgba(0, 0, 0, 0.08); - --sl-color-hairline-light: rgba(0, 0, 0, 0.05); - --sl-color-bg-inline-code: rgba(0, 0, 0, 0.06); - --sl-color-text: #333333; - --sl-color-text-accent: #000000; -} - /* ────────────────────────────────────────────── Global ────────────────────────────────────────────── */ html { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; + color-scheme: dark; } body { background: #000 !important; } -[data-theme="light"] body { - background: #ffffff !important; +/* Force dark mode — hide theme toggle */ +starlight-theme-select { + display: none !important; } /* ────────────────────────────────────────────── - Header — glassmorphic nav bar + Header — glassmorphic nav bar, centered container ────────────────────────────────────────────── */ header.header { - background: var(--sl-color-bg-nav) !important; - backdrop-filter: blur(20px) saturate(1.4); - -webkit-backdrop-filter: blur(20px) saturate(1.4); - border-bottom: 1px solid var(--sl-color-hairline-shade) !important; + background: rgba(0, 0, 0, 0.85) !important; + backdrop-filter: blur(16px); + -webkit-backdrop-filter: blur(16px); + border-bottom: 1px solid rgba(255, 255, 255, 0.05) !important; } +/* Header container centering handled in Header.astro */ + /* ────────────────────────────────────────────── Sidebar — glassmorphic panel ────────────────────────────────────────────── */ @@ -102,17 +85,16 @@ nav.sidebar a[aria-current="true"] { border-radius: 8px; } -[data-theme="light"] nav.sidebar a[aria-current="page"], -[data-theme="light"] nav.sidebar a[aria-current="true"] { - background: rgba(0, 0, 0, 0.06) !important; - color: #000 !important; -} - /* ────────────────────────────────────────────── Content typography ────────────────────────────────────────────── */ .sl-markdown-content h1, -.sl-markdown-content h2, +.sl-markdown-content h2 { + font-family: 'Instrument Serif', Georgia, serif; + font-weight: 400; + letter-spacing: 0.01em; +} + .sl-markdown-content h3, .sl-markdown-content h4 { font-weight: 700; @@ -137,15 +119,18 @@ nav.sidebar a[aria-current="true"] { } .expressive-code .frame { - background: rgba(255, 255, 255, 0.03) !important; - border: 1px solid rgba(255, 255, 255, 0.08) !important; - border-radius: 12px !important; - backdrop-filter: blur(12px); + background: rgba(255, 255, 255, 0.02) !important; + border: 1px solid rgba(255, 255, 255, 0.06) !important; + border-radius: 10px !important; } -[data-theme="light"] .expressive-code .frame { - background: rgba(0, 0, 0, 0.03) !important; - border: 1px solid rgba(0, 0, 0, 0.08) !important; +/* Hide terminal header on bash code blocks (no title needed) */ +.expressive-code .frame.is-terminal .header:not(:has(.title:not(:empty))) { + display: none !important; +} + +.expressive-code .frame.is-terminal .header { + display: none !important; } /* Inline code */ @@ -170,43 +155,65 @@ nav.sidebar a[aria-current="true"] { } .card:hover { - border-color: rgba(255, 255, 255, 0.16) !important; - background: rgba(255, 255, 255, 0.06) !important; -} - -[data-theme="light"] .card { - background: rgba(0, 0, 0, 0.02) !important; - border: 1px solid rgba(0, 0, 0, 0.08) !important; -} - -[data-theme="light"] .card:hover { - border-color: rgba(0, 0, 0, 0.14) !important; - background: rgba(0, 0, 0, 0.04) !important; + border-color: rgba(255, 255, 255, 0.12) !important; } .card .card-title { - font-weight: 600; + font-family: 'Instrument Serif', Georgia, serif; + font-weight: 400; + letter-spacing: 0.01em; + font-size: 1.15rem; } /* ────────────────────────────────────────────── - Tabs — glassmorphic + Tabs — matching hero terminal style ────────────────────────────────────────────── */ +starlight-tabs { + border-radius: 12px !important; + border: 1px solid rgba(255, 255, 255, 0.06) !important; + background: rgba(255, 255, 255, 0.02) !important; + overflow: hidden; +} + starlight-tabs [role="tablist"] { - border-bottom: 1px solid rgba(255, 255, 255, 0.08) !important; + background: rgba(255, 255, 255, 0.015) !important; + border-bottom: none !important; + border: none !important; + box-shadow: none !important; + padding: 10px 14px !important; + gap: 2px; +} + +starlight-tabs .tablist-wrapper { + border-bottom: none !important; } starlight-tabs [role="tab"] { + font-family: 'JetBrains Mono', monospace !important; font-weight: 500 !important; + font-size: 13px !important; + padding: 6px 14px !important; + border-radius: 6px !important; + border: none !important; + color: rgba(255, 255, 255, 0.3) !important; + letter-spacing: 0.01em; + transition: all 0.15s ease; +} + +starlight-tabs [role="tab"]:hover { + color: rgba(255, 255, 255, 0.55) !important; + background: rgba(255, 255, 255, 0.03) !important; } starlight-tabs [role="tab"][aria-selected="true"] { - border-color: #fff !important; - color: #fff !important; + color: rgba(255, 255, 255, 0.85) !important; + background: rgba(255, 255, 255, 0.06) !important; + border: none !important; + box-shadow: none !important; } -[data-theme="light"] starlight-tabs [role="tab"][aria-selected="true"] { - border-color: #000 !important; - color: #000 !important; +starlight-tabs [role="tabpanel"] { + padding: 18px !important; } /* ────────────────────────────────────────────── @@ -219,11 +226,6 @@ starlight-tabs [role="tab"][aria-selected="true"] { backdrop-filter: blur(8px); } -[data-theme="light"] .starlight-aside { - background: rgba(0, 0, 0, 0.03) !important; - border: 1px solid rgba(0, 0, 0, 0.08) !important; -} - /* ────────────────────────────────────────────── Tables — refined ────────────────────────────────────────────── */ @@ -249,19 +251,6 @@ starlight-tabs [role="tab"][aria-selected="true"] { padding: 0.75rem 1rem !important; } -[data-theme="light"] .sl-markdown-content table { - border-color: rgba(0, 0, 0, 0.08); -} - -[data-theme="light"] .sl-markdown-content th { - background: rgba(0, 0, 0, 0.03) !important; -} - -[data-theme="light"] .sl-markdown-content td, -[data-theme="light"] .sl-markdown-content th { - border-color: rgba(0, 0, 0, 0.06) !important; -} - /* ────────────────────────────────────────────── Links ────────────────────────────────────────────── */ @@ -276,15 +265,6 @@ starlight-tabs [role="tab"][aria-selected="true"] { text-decoration-color: rgba(255, 255, 255, 0.8) !important; } -[data-theme="light"] .sl-markdown-content a:not(.card):not([class*="action"]) { - color: #000 !important; - text-decoration-color: rgba(0, 0, 0, 0.3) !important; -} - -[data-theme="light"] .sl-markdown-content a:not(.card):not([class*="action"]):hover { - text-decoration-color: rgba(0, 0, 0, 0.8) !important; -} - /* ────────────────────────────────────────────── Hero overrides ────────────────────────────────────────────── */ @@ -292,60 +272,111 @@ starlight-tabs [role="tab"][aria-selected="true"] { background: transparent !important; } -.hero { - padding-block: 4rem !important; +/* Grid background on hero area */ +[data-has-hero] .page::before { + content: ''; + position: absolute; + inset: 0; + height: 100vh; + background-image: + linear-gradient(rgba(255, 255, 255, 0.03) 1px, transparent 1px), + linear-gradient(90deg, rgba(255, 255, 255, 0.03) 1px, transparent 1px); + background-size: 60px 60px; + mask-image: linear-gradient(to bottom, rgba(0,0,0,0.6) 0%, transparent 80%); + -webkit-mask-image: linear-gradient(to bottom, rgba(0,0,0,0.6) 0%, transparent 80%); + pointer-events: none; + z-index: 0; } +/* Hide the hero h1 title — already in header */ +.hero h1 { + display: none !important; +} + +/* Promote tagline to hero title with Instrument Serif */ .hero .tagline { - font-size: clamp(1.1rem, 2.5vw, 1.4rem) !important; - color: var(--sl-color-gray-2) !important; - line-height: 1.6 !important; - max-width: 32rem; + font-family: 'Instrument Serif', Georgia, serif !important; + font-size: clamp(1.8rem, 4vw, 2.8rem) !important; + font-weight: 400 !important; + letter-spacing: 0.01em !important; + color: var(--sl-color-white) !important; + line-height: 1.25 !important; + max-width: 26rem; + min-height: 3.5em; } -.hero .action { - border-radius: 10px !important; - font-weight: 600 !important; - letter-spacing: -0.01em; - transition: all 0.2s ease !important; +/* Hero layout */ +.hero { + padding-block: 3rem 2rem !important; } -.hero .action.primary { - background: #fff !important; - color: #000 !important; - border: 1px solid rgba(255, 255, 255, 0.2) !important; - box-shadow: 0 0 20px rgba(255, 255, 255, 0.1), 0 2px 8px rgba(255, 255, 255, 0.1); +[data-has-hero] .content-panel { + max-width: 72rem !important; + margin-inline: auto !important; + width: 100% !important; } -.hero .action.primary:hover { - box-shadow: 0 0 30px rgba(255, 255, 255, 0.15), 0 4px 16px rgba(255, 255, 255, 0.15); - transform: translateY(-1px); +.content-panel { + max-width: 72rem; + margin-inline: auto; } -.hero .action.minimal { - background: rgba(255, 255, 255, 0.06) !important; - border: 1px solid rgba(255, 255, 255, 0.1) !important; - color: #d4d4d4 !important; - backdrop-filter: blur(8px); +/* Center entire page layout to match header's 72rem container */ +.page { + max-width: 72rem; + margin-inline: auto; } -.hero .action.minimal:hover { - background: rgba(255, 255, 255, 0.1) !important; - border-color: rgba(255, 255, 255, 0.18) !important; - color: #fff !important; +/* Fixed sidebar must respect the centered page */ +@media (min-width: 50rem) { + .sidebar-pane { + left: auto !important; + inset-inline-start: max(0px, calc((100vw - 72rem) / 2)) !important; + } + + header.header { + left: 0 !important; + right: 0 !important; + } } -[data-theme="light"] .hero .action.primary { - background: #000 !important; +/* Content area in docs fills available space */ +.main-pane { + padding-inline: 1.5rem; +} + +/* CTA button — big primary */ +.hero .action { + text-decoration: none !important; + transition: all 0.2s ease !important; +} + +.hero .action.primary { + display: inline-flex; + align-items: center; + gap: 0.5rem; + padding: 0.65rem 1.25rem !important; + border-radius: 10px !important; + font-size: 0.9rem !important; + font-weight: 500 !important; + letter-spacing: -0.01em; + background: linear-gradient(135deg, #2a2a2a 0%, #1a1a1a 100%) !important; color: #fff !important; - border-color: #000 !important; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); + border: 1px solid rgba(255, 255, 255, 0.1) !important; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.06); +} + +.hero .action.primary:hover { + background: linear-gradient(135deg, #383838 0%, #252525 100%) !important; + border-color: rgba(255, 255, 255, 0.18) !important; + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.5), inset 0 1px 0 rgba(255, 255, 255, 0.08); + transform: translateY(-1px); } -[data-theme="light"] .hero .action.minimal { - background: rgba(0, 0, 0, 0.04) !important; - border: 1px solid rgba(0, 0, 0, 0.1) !important; - color: #555 !important; +.hero .action.primary svg { + width: 16px; + height: 16px; + flex-shrink: 0; } /* ────────────────────────────────────────────── @@ -364,11 +395,6 @@ starlight-tabs [role="tab"][aria-selected="true"] { border-color: rgba(255, 255, 255, 0.16) !important; } -[data-theme="light"] .pagination-links a { - background: rgba(0, 0, 0, 0.02) !important; - border: 1px solid rgba(0, 0, 0, 0.08) !important; -} - /* ────────────────────────────────────────────── Scrollbar ────────────────────────────────────────────── */ @@ -455,22 +481,22 @@ dialog { gap: 0.5rem; height: 3.25rem; padding: 0 1.5rem; - border-radius: 10px; - font-size: 0.95rem; - font-weight: 600; + border-radius: 8px; + font-size: 0.9rem; + font-weight: 500; font-family: 'Figtree', sans-serif; - color: #000; - background: linear-gradient(135deg, #fff 0%, #e0e0e0 100%); - border: none; + color: #fff; + background: linear-gradient(135deg, #2a2a2a 0%, #1a1a1a 100%); + border: 1px solid rgba(255, 255, 255, 0.1); cursor: pointer; white-space: nowrap; - transition: all 0.2s ease; - box-shadow: 0 2px 8px rgba(255, 255, 255, 0.12); + transition: all 0.15s ease; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.06); } .aeo-checker-btn:hover { - box-shadow: 0 4px 16px rgba(255, 255, 255, 0.18); - transform: translateY(-1px); + background: linear-gradient(135deg, #333 0%, #222 100%); + border-color: rgba(255, 255, 255, 0.18); } .aeo-checker-btn svg { @@ -478,26 +504,74 @@ dialog { height: 16px; } -[data-theme="light"] .aeo-checker-input-wrap { - background: rgba(0, 0, 0, 0.04); - border-color: rgba(0, 0, 0, 0.12); - box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06); +/* ────────────────────────────────────────────── + Why AEO grid + ────────────────────────────────────────────── */ +.why-aeo-grid { + display: flex !important; + gap: 1rem !important; + margin: 1.5rem 0 !important; +} + +.why-aeo-grid > .why-card { + flex: 1 1 0% !important; + min-width: 0 !important; + height: 180px !important; + margin: 0 !important; + padding: 1.25rem !important; + border-radius: 16px !important; + background: rgba(255, 255, 255, 0.04) !important; + border: 1px solid rgba(255, 255, 255, 0.08) !important; + backdrop-filter: blur(12px); + -webkit-backdrop-filter: blur(12px); + transition: border-color 0.2s ease, background 0.2s ease; + display: flex !important; + flex-direction: column !important; + justify-content: center !important; + box-sizing: border-box !important; } -[data-theme="light"] .aeo-checker-input-wrap:focus-within { - border-color: rgba(0, 0, 0, 0.2); +.why-aeo-grid > .why-card:hover { + border-color: rgba(255, 255, 255, 0.12) !important; } -[data-theme="light"] .aeo-checker-input { - color: #000; +@media (max-width: 50rem) { + .why-aeo-grid { + flex-wrap: wrap !important; + } + .why-aeo-grid > .why-card { + flex: 1 1 calc(50% - 0.5rem) !important; + height: 160px !important; + } } -[data-theme="light"] .aeo-checker-input::placeholder { - color: rgba(0, 0, 0, 0.35); +@media (max-width: 30rem) { + .why-aeo-grid > .why-card { + flex: 1 1 100% !important; + } } -[data-theme="light"] .aeo-checker-btn { - background: linear-gradient(135deg, #111 0%, #333 100%); +.why-stat { + font-family: 'Instrument Serif', Georgia, serif; + font-size: 2rem; + font-weight: 400; + letter-spacing: 0.01em; color: #fff; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + line-height: 1; +} + +.why-label { + font-size: 0.75rem; + font-weight: 500; + color: rgba(255, 255, 255, 0.5); + text-transform: uppercase; + letter-spacing: 0.06em; + margin-top: 0.25rem; +} + +.why-desc { + font-size: 0.8rem; + color: rgba(255, 255, 255, 0.35); + line-height: 1.5; + margin-top: 0.5rem; }