From 40fd1a6c7249c3c4cbe7cd8714a6bb269132e6df Mon Sep 17 00:00:00 2001 From: Aaron Powell Date: Thu, 5 Mar 2026 21:50:44 +1100 Subject: [PATCH] Migrate website to Starlight with full-text resource search (#883) * Add search functionality to Learning Hub index page Add a client-side search bar that filters articles by title, description, and tags. Sections with no matching results are hidden automatically. Uses the existing .search-bar CSS pattern from the cookbook page. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * chore: remove deprecated layouts, theme script, and learning-hub config Phase 5 cleanup of Starlight migration: - Delete BaseLayout.astro (replaced by StarlightPage) - Delete ArticleLayout.astro (replaced by Starlight docs rendering) - Delete theme.ts (Starlight has built-in theme toggle) - Delete src/config/learning-hub.ts (sidebar order now in astro.config.mjs) - Replace learning-hub glob collection with Starlight docs collection in content.config.ts - Keep search.ts (still used by homepage and all resource page scripts) Build verified: 23 pages, no errors. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Migrate website to Starlight with full-text resource search - Replace bespoke Astro layouts with Starlight integration - Homepage and resource pages use StarlightPage wrapper - Learning Hub articles rendered via Starlight docs collection - Starlight provides search, theme toggle, sidebar, ToC, a11y - Add custom Pagefind integration for resource search - All 614 agents/skills/instructions/hooks/workflows/plugins indexed as custom records with deep-link URLs - Type filter pills (horizontal pill toggles) above results - Search results link directly to resource modals via #file= hash - Move global.css to src/styles/ for Vite processing - Scope CSS reset to #main-content to avoid Starlight conflicts - Full-width page gradient via body:has(#main-content) - Light/dark theme support with Starlight gray scale inversion - Delete old layouts (BaseLayout, ArticleLayout), theme.ts, config Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Address PR review feedback - Fix pagefind-resources.ts header comment (pagefind:true not false) - Remove unused base variable in cookbook/index.astro - Replace hardcoded /awesome-copilot/ paths with relative links in index.md - Delete stale public/styles/global.css (source of truth is src/styles/) - Replace fragile getBasePath() with Astro config base in pagefind integration - Document pagefind:true reasoning in astro.config.mjs - Use proper visually-hidden pattern + :focus-visible ring for filter pills - Remove dead header/nav/theme CSS from global.css (~160 lines) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- website/astro.config.mjs | 75 +- website/package-lock.json | 1320 +++++++++++++++++ website/package.json | 1 + website/src/components/Head.astro | 11 + website/src/config/learning-hub.ts | 21 - website/src/content.config.ts | 26 +- .../docs/learning-hub/agentic-workflows.md | 1 + .../learning-hub/automating-with-hooks.md | 1 + .../before-after-customization-examples.md | 1 + .../learning-hub/building-custom-agents.md | 1 + .../copilot-configuration-basics.md | 1 + .../learning-hub/creating-effective-skills.md | 1 + .../defining-custom-instructions.md | 1 + .../github-copilot-terminology-glossary.md | 1 + .../src/content/docs/learning-hub/index.md | 32 + .../installing-and-using-plugins.md | 1 + .../understanding-copilot-context.md | 1 + .../learning-hub/understanding-mcp-servers.md | 1 + .../using-copilot-coding-agent.md | 1 + .../what-are-agents-skills-instructions.md | 1 + .../content/learning-hub/agentic-workflows.md | 2 +- .../learning-hub/automating-with-hooks.md | 2 +- .../before-after-customization-examples.md | 2 +- .../learning-hub/building-custom-agents.md | 2 +- .../copilot-configuration-basics.md | 2 +- .../learning-hub/creating-effective-skills.md | 2 +- .../defining-custom-instructions.md | 2 +- .../github-copilot-terminology-glossary.md | 2 +- .../installing-and-using-plugins.md | 2 +- .../understanding-copilot-context.md | 2 +- .../learning-hub/understanding-mcp-servers.md | 2 +- .../using-copilot-coding-agent.md | 2 +- .../what-are-agents-skills-instructions.md | 3 +- .../src/integrations/pagefind-resources.ts | 142 ++ website/src/layouts/ArticleLayout.astro | 132 -- website/src/layouts/BaseLayout.astro | 199 --- website/src/pages/agents.astro | 6 +- website/src/pages/hooks.astro | 6 +- website/src/pages/index.astro | 6 +- website/src/pages/instructions.astro | 6 +- website/src/pages/learning-hub/[slug].astro | 25 - .../pages/learning-hub/cookbook/index.astro | 66 +- website/src/pages/learning-hub/index.astro | 158 -- website/src/pages/plugins.astro | 6 +- website/src/pages/skills.astro | 6 +- website/src/pages/tools.astro | 10 +- website/src/pages/workflows.astro | 6 +- website/src/scripts/theme.ts | 65 - website/{public => src}/styles/global.css | 233 +-- website/src/styles/starlight-overrides.css | 181 +++ 50 files changed, 1891 insertions(+), 888 deletions(-) create mode 100644 website/src/components/Head.astro delete mode 100644 website/src/config/learning-hub.ts create mode 120000 website/src/content/docs/learning-hub/agentic-workflows.md create mode 120000 website/src/content/docs/learning-hub/automating-with-hooks.md create mode 120000 website/src/content/docs/learning-hub/before-after-customization-examples.md create mode 120000 website/src/content/docs/learning-hub/building-custom-agents.md create mode 120000 website/src/content/docs/learning-hub/copilot-configuration-basics.md create mode 120000 website/src/content/docs/learning-hub/creating-effective-skills.md create mode 120000 website/src/content/docs/learning-hub/defining-custom-instructions.md create mode 120000 website/src/content/docs/learning-hub/github-copilot-terminology-glossary.md create mode 100644 website/src/content/docs/learning-hub/index.md create mode 120000 website/src/content/docs/learning-hub/installing-and-using-plugins.md create mode 120000 website/src/content/docs/learning-hub/understanding-copilot-context.md create mode 120000 website/src/content/docs/learning-hub/understanding-mcp-servers.md create mode 120000 website/src/content/docs/learning-hub/using-copilot-coding-agent.md create mode 120000 website/src/content/docs/learning-hub/what-are-agents-skills-instructions.md create mode 100644 website/src/integrations/pagefind-resources.ts delete mode 100644 website/src/layouts/ArticleLayout.astro delete mode 100644 website/src/layouts/BaseLayout.astro delete mode 100644 website/src/pages/learning-hub/[slug].astro delete mode 100644 website/src/pages/learning-hub/index.astro delete mode 100644 website/src/scripts/theme.ts rename website/{public => src}/styles/global.css (89%) create mode 100644 website/src/styles/starlight-overrides.css diff --git a/website/astro.config.mjs b/website/astro.config.mjs index af35479a..76a8d50a 100644 --- a/website/astro.config.mjs +++ b/website/astro.config.mjs @@ -1,12 +1,85 @@ import sitemap from "@astrojs/sitemap"; +import starlight from "@astrojs/starlight"; import { defineConfig } from "astro/config"; +import pagefindResources from "./src/integrations/pagefind-resources"; // https://astro.build/config export default defineConfig({ site: "https://github.github.com/", base: "/awesome-copilot/", output: "static", - integrations: [sitemap()], + integrations: [ + starlight({ + title: "Awesome GitHub Copilot", + social: [ + { + icon: "github", + label: "GitHub", + href: "https://github.com/github/awesome-copilot", + }, + ], + customCss: ["./src/styles/starlight-overrides.css", "./src/styles/global.css"], + editLink: { + baseUrl: + "https://github.com/github/awesome-copilot/edit/staged/website/", + }, + sidebar: [ + { + label: "Browse Resources", + items: [ + { label: "Home", link: "/" }, + { label: "Agents", link: "/agents/" }, + { label: "Instructions", link: "/instructions/" }, + { label: "Skills", link: "/skills/" }, + { label: "Hooks", link: "/hooks/" }, + { label: "Workflows", link: "/workflows/" }, + { label: "Plugins", link: "/plugins/" }, + { label: "Tools", link: "/tools/" }, + ], + }, + { + label: "Fundamentals", + items: [ + "learning-hub/what-are-agents-skills-instructions", + "learning-hub/understanding-copilot-context", + "learning-hub/copilot-configuration-basics", + "learning-hub/defining-custom-instructions", + "learning-hub/creating-effective-skills", + "learning-hub/building-custom-agents", + "learning-hub/understanding-mcp-servers", + "learning-hub/automating-with-hooks", + "learning-hub/agentic-workflows", + "learning-hub/using-copilot-coding-agent", + "learning-hub/installing-and-using-plugins", + "learning-hub/before-after-customization-examples", + ], + }, + { + label: "Reference", + items: ["learning-hub/github-copilot-terminology-glossary"], + }, + { + label: "Hands-on", + items: [ + { + label: "Cookbook", + link: "/learning-hub/cookbook/", + }, + ], + }, + ], + disable404Route: true, + // pagefind: true is required so Starlight renders the search UI. + // Our pagefindResources() integration overwrites the index after build. + pagefind: true, + tableOfContents: { minHeadingLevel: 2, maxHeadingLevel: 3 }, + components: { + Head: "./src/components/Head.astro", + }, + }), + sitemap(), + pagefindResources(), + ], redirects: { "/samples/": "/learning-hub/cookbook/", }, diff --git a/website/package-lock.json b/website/package-lock.json index 804ee3ea..50914c9a 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -10,6 +10,7 @@ "license": "MIT", "dependencies": { "@astrojs/sitemap": "^3.7.0", + "@astrojs/starlight": "^0.37.6", "astro": "^5.16.15", "choices.js": "^11.1.0", "jszip": "^3.10.1" @@ -56,6 +57,33 @@ "vfile": "^6.0.3" } }, + "node_modules/@astrojs/mdx": { + "version": "4.3.13", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.3.13.tgz", + "integrity": "sha512-IHDHVKz0JfKBy3//52JSiyWv089b7GVSChIXLrlUOoTLWowG3wr2/8hkaEgEyd/vysvNQvGk+QhysXpJW5ve6Q==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "6.3.10", + "@mdx-js/mdx": "^3.1.1", + "acorn": "^8.15.0", + "es-module-lexer": "^1.7.0", + "estree-util-visit": "^2.0.0", + "hast-util-to-html": "^9.0.5", + "piccolore": "^0.1.3", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", + "remark-smartypants": "^3.0.2", + "source-map": "^0.7.6", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.3" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + }, + "peerDependencies": { + "astro": "^5.0.0" + } + }, "node_modules/@astrojs/prism": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.3.0.tgz", @@ -79,6 +107,45 @@ "zod": "^3.25.76" } }, + "node_modules/@astrojs/starlight": { + "version": "0.37.6", + "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.37.6.tgz", + "integrity": "sha512-wQrKwH431q+8FsLBnNQeG+R36TMtEGxTQ2AuiVpcx9APcazvL3n7wVW8mMmYyxX0POjTnxlcWPkdMGR3Yj1L+w==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "^6.3.1", + "@astrojs/mdx": "^4.2.3", + "@astrojs/sitemap": "^3.3.0", + "@pagefind/default-ui": "^1.3.0", + "@types/hast": "^3.0.4", + "@types/js-yaml": "^4.0.9", + "@types/mdast": "^4.0.4", + "astro-expressive-code": "^0.41.1", + "bcp-47": "^2.1.0", + "hast-util-from-html": "^2.0.1", + "hast-util-select": "^6.0.2", + "hast-util-to-string": "^3.0.0", + "hastscript": "^9.0.0", + "i18next": "^23.11.5", + "js-yaml": "^4.1.0", + "klona": "^2.0.6", + "magic-string": "^0.30.17", + "mdast-util-directive": "^3.0.0", + "mdast-util-to-markdown": "^2.1.0", + "mdast-util-to-string": "^4.0.0", + "pagefind": "^1.3.0", + "rehype": "^13.0.1", + "rehype-format": "^5.0.0", + "remark-directive": "^3.0.0", + "ultrahtml": "^1.6.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.2" + }, + "peerDependencies": { + "astro": "^5.5.0" + } + }, "node_modules/@astrojs/telemetry": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.0.tgz", @@ -130,6 +197,15 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/runtime": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/types": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", @@ -155,6 +231,15 @@ "node": ">=18" } }, + "node_modules/@ctrl/tinycolor": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.2.0.tgz", + "integrity": "sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, "node_modules/@emnapi/runtime": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", @@ -581,6 +666,51 @@ "node": ">=18" } }, + "node_modules/@expressive-code/core": { + "version": "0.41.7", + "resolved": "https://registry.npmjs.org/@expressive-code/core/-/core-0.41.7.tgz", + "integrity": "sha512-ck92uZYZ9Wba2zxkiZLsZGi9N54pMSAVdrI9uW3Oo9AtLglD5RmrdTwbYPCT2S/jC36JGB2i+pnQtBm/Ib2+dg==", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^4.0.4", + "hast-util-select": "^6.0.2", + "hast-util-to-html": "^9.0.1", + "hast-util-to-text": "^4.0.1", + "hastscript": "^9.0.0", + "postcss": "^8.4.38", + "postcss-nested": "^6.0.1", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.1" + } + }, + "node_modules/@expressive-code/plugin-frames": { + "version": "0.41.7", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-frames/-/plugin-frames-0.41.7.tgz", + "integrity": "sha512-diKtxjQw/979cTglRFaMCY/sR6hWF0kSMg8jsKLXaZBSfGS0I/Hoe7Qds3vVEgeoW+GHHQzMcwvgx/MOIXhrTA==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.7" + } + }, + "node_modules/@expressive-code/plugin-shiki": { + "version": "0.41.7", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-shiki/-/plugin-shiki-0.41.7.tgz", + "integrity": "sha512-DL605bLrUOgqTdZ0Ot5MlTaWzppRkzzqzeGEu7ODnHF39IkEBbFdsC7pbl3LbUQ1DFtnfx6rD54k/cdofbW6KQ==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.7", + "shiki": "^3.2.2" + } + }, + "node_modules/@expressive-code/plugin-text-markers": { + "version": "0.41.7", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-text-markers/-/plugin-text-markers-0.41.7.tgz", + "integrity": "sha512-Ewpwuc5t6eFdZmWlFyeuy3e1PTQC0jFvw2Q+2bpcWXbOZhPLsT7+h8lsSIJxb5mS7wZko7cKyQ2RLYDyK6Fpmw==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.7" + } + }, "node_modules/@img/colour": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", @@ -1053,12 +1183,133 @@ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "license": "MIT" }, + "node_modules/@mdx-js/mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", + "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "acorn": "^8.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-scope": "^1.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/@oslojs/encoding": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz", "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==", "license": "MIT" }, + "node_modules/@pagefind/darwin-arm64": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-arm64/-/darwin-arm64-1.4.0.tgz", + "integrity": "sha512-2vMqkbv3lbx1Awea90gTaBsvpzgRs7MuSgKDxW0m9oV1GPZCZbZBJg/qL83GIUEN2BFlY46dtUZi54pwH+/pTQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@pagefind/darwin-x64": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-x64/-/darwin-x64-1.4.0.tgz", + "integrity": "sha512-e7JPIS6L9/cJfow+/IAqknsGqEPjJnVXGjpGm25bnq+NPdoD3c/7fAwr1OXkG4Ocjx6ZGSCijXEV4ryMcH2E3A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@pagefind/default-ui": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@pagefind/default-ui/-/default-ui-1.4.0.tgz", + "integrity": "sha512-wie82VWn3cnGEdIjh4YwNESyS1G6vRHwL6cNjy9CFgNnWW/PGRjsLq300xjVH5sfPFK3iK36UxvIBymtQIEiSQ==", + "license": "MIT" + }, + "node_modules/@pagefind/freebsd-x64": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@pagefind/freebsd-x64/-/freebsd-x64-1.4.0.tgz", + "integrity": "sha512-WcJVypXSZ+9HpiqZjFXMUobfFfZZ6NzIYtkhQ9eOhZrQpeY5uQFqNWLCk7w9RkMUwBv1HAMDW3YJQl/8OqsV0Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@pagefind/linux-arm64": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@pagefind/linux-arm64/-/linux-arm64-1.4.0.tgz", + "integrity": "sha512-PIt8dkqt4W06KGmQjONw7EZbhDF+uXI7i0XtRLN1vjCUxM9vGPdtJc2mUyVPevjomrGz5M86M8bqTr6cgDp1Uw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@pagefind/linux-x64": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@pagefind/linux-x64/-/linux-x64-1.4.0.tgz", + "integrity": "sha512-z4oddcWwQ0UHrTHR8psLnVlz6USGJ/eOlDPTDYZ4cI8TK8PgwRUPQZp9D2iJPNIPcS6Qx/E4TebjuGJOyK8Mmg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@pagefind/windows-x64": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@pagefind/windows-x64/-/windows-x64-1.4.0.tgz", + "integrity": "sha512-NkT+YAdgS2FPCn8mIA9bQhiBs+xmniMGq1LFPDhcFn0+2yIUEiIG06t7bsZlhdjknEQRTSdT7YitP6fC5qwP0g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@rollup/pluginutils": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", @@ -1494,6 +1745,15 @@ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "license": "MIT" }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, "node_modules/@types/hast": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", @@ -1503,6 +1763,12 @@ "@types/unist": "*" } }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "license": "MIT" + }, "node_modules/@types/mdast": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", @@ -1512,6 +1778,12 @@ "@types/unist": "*" } }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "license": "MIT" + }, "node_modules/@types/ms": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", @@ -1569,6 +1841,15 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", @@ -1699,6 +1980,15 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, "node_modules/astro": { "version": "5.16.15", "resolved": "https://registry.npmjs.org/astro/-/astro-5.16.15.tgz", @@ -1785,6 +2075,18 @@ "sharp": "^0.34.0" } }, + "node_modules/astro-expressive-code": { + "version": "0.41.7", + "resolved": "https://registry.npmjs.org/astro-expressive-code/-/astro-expressive-code-0.41.7.tgz", + "integrity": "sha512-hUpogGc6DdAd+I7pPXsctyYPRBJDK7Q7d06s4cyP0Vz3OcbziP3FNzN0jZci1BpCvLn9675DvS7B9ctKKX64JQ==", + "license": "MIT", + "dependencies": { + "rehype-expressive-code": "^0.41.7" + }, + "peerDependencies": { + "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta" + } + }, "node_modules/axobject-query": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", @@ -1810,6 +2112,31 @@ "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==", "license": "MIT" }, + "node_modules/bcp-47": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-2.1.0.tgz", + "integrity": "sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bcp-47-match": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz", + "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -1902,6 +2229,16 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/choices.js": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/choices.js/-/choices.js-11.1.0.tgz", @@ -1962,6 +2299,16 @@ "node": ">=6" } }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/comma-separated-tokens": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", @@ -2037,6 +2384,22 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/css-selector-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.3.0.tgz", + "integrity": "sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, "node_modules/css-tree": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", @@ -2208,6 +2571,19 @@ "node": ">=0.3.1" } }, + "node_modules/direction": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/direction/-/direction-2.0.1.tgz", + "integrity": "sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==", + "license": "MIT", + "bin": { + "direction": "cli.js" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", @@ -2314,6 +2690,38 @@ "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", "license": "MIT" }, + "node_modules/esast-util-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", + "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esast-util-from-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", + "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/esbuild": { "version": "0.25.12", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", @@ -2367,6 +2775,88 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-scope": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", + "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", @@ -2382,6 +2872,18 @@ "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", "license": "MIT" }, + "node_modules/expressive-code": { + "version": "0.41.7", + "resolved": "https://registry.npmjs.org/expressive-code/-/expressive-code-0.41.7.tgz", + "integrity": "sha512-2wZjC8OQ3TaVEMcBtYY4Va3lo6J+Ai9jf3d4dbhURMJcU4Pbqe6EcHe424MIZI0VHUA1bR6xdpoHYi3yxokWqA==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.7", + "@expressive-code/plugin-frames": "^0.41.7", + "@expressive-code/plugin-shiki": "^0.41.7", + "@expressive-code/plugin-text-markers": "^0.41.7" + } + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -2493,6 +2995,39 @@ "uncrypto": "^0.1.3" } }, + "node_modules/hast-util-embedded": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz", + "integrity": "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-is-element": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-format": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hast-util-format/-/hast-util-format-1.1.0.tgz", + "integrity": "sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-minify-whitespace": "^1.0.0", + "hast-util-phrasing": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "html-whitespace-sensitive-tag-names": "^3.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-from-html": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", @@ -2531,6 +3066,32 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-has-property": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz", + "integrity": "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-body-ok-link": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.1.tgz", + "integrity": "sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-is-element": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", @@ -2544,6 +3105,23 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-minify-whitespace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hast-util-minify-whitespace/-/hast-util-minify-whitespace-1.0.1.tgz", + "integrity": "sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-parse-selector": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", @@ -2557,6 +3135,23 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-has-property": "^3.0.0", + "hast-util-is-body-ok-link": "^3.0.0", + "hast-util-is-element": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-raw": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", @@ -2582,6 +3177,61 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-select": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/hast-util-select/-/hast-util-select-6.0.4.tgz", + "integrity": "sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "bcp-47-match": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "css-selector-parser": "^3.0.0", + "devlop": "^1.0.0", + "direction": "^2.0.0", + "hast-util-has-property": "^3.0.0", + "hast-util-to-string": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "nth-check": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", + "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-to-html": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", @@ -2605,6 +3255,33 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-to-parse5": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", @@ -2624,6 +3301,19 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-to-string": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz", + "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-to-text": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", @@ -2686,12 +3376,45 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/html-whitespace-sensitive-tag-names": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-3.0.1.tgz", + "integrity": "sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/http-cache-semantics": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "license": "BSD-2-Clause" }, + "node_modules/i18next": { + "version": "23.16.8", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.16.8.tgz", + "integrity": "sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2" + } + }, "node_modules/immediate": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", @@ -2714,6 +3437,12 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "license": "MIT" + }, "node_modules/iron-webcrypto": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", @@ -2723,6 +3452,40 @@ "url": "https://github.com/sponsors/brc-dd" } }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-docker": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", @@ -2747,6 +3510,16 @@ "node": ">=8" } }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-inside-container": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", @@ -2831,6 +3604,15 @@ "node": ">=6" } }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, "node_modules/lie": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", @@ -2879,6 +3661,18 @@ "source-map-js": "^1.2.1" } }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/markdown-table": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", @@ -2904,6 +3698,27 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-directive": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", + "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-find-and-replace": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", @@ -3045,6 +3860,83 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-phrasing": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", @@ -3189,6 +4081,25 @@ "micromark-util-types": "^2.0.0" } }, + "node_modules/micromark-extension-directive": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", + "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/micromark-extension-gfm": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", @@ -3310,6 +4221,108 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", + "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", + "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/micromark-factory-destination": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", @@ -3353,6 +4366,33 @@ "micromark-util-types": "^2.0.0" } }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", + "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, "node_modules/micromark-factory-space": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", @@ -3554,6 +4594,31 @@ ], "license": "MIT" }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", + "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, "node_modules/micromark-util-html-tag-name": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", @@ -3854,12 +4919,54 @@ "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", "license": "MIT" }, + "node_modules/pagefind": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/pagefind/-/pagefind-1.4.0.tgz", + "integrity": "sha512-z2kY1mQlL4J8q5EIsQkLzQjilovKzfNVhX8De6oyE6uHpfFtyBaqUpcl/XzJC/4fjD8vBDyh1zolimIcVrCn9g==", + "license": "MIT", + "bin": { + "pagefind": "lib/runner/bin.cjs" + }, + "optionalDependencies": { + "@pagefind/darwin-arm64": "1.4.0", + "@pagefind/darwin-x64": "1.4.0", + "@pagefind/freebsd-x64": "1.4.0", + "@pagefind/linux-arm64": "1.4.0", + "@pagefind/linux-x64": "1.4.0", + "@pagefind/windows-x64": "1.4.0" + } + }, "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "license": "(MIT AND Zlib)" }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, "node_modules/parse-latin": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-7.0.0.tgz", @@ -3942,6 +5049,44 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/prismjs": { "version": "1.30.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", @@ -4014,6 +5159,73 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/recma-build-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-jsx": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", + "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", + "license": "MIT", + "dependencies": { + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/recma-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/regex": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", @@ -4054,6 +5266,29 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/rehype-expressive-code": { + "version": "0.41.7", + "resolved": "https://registry.npmjs.org/rehype-expressive-code/-/rehype-expressive-code-0.41.7.tgz", + "integrity": "sha512-25f8ZMSF1d9CMscX7Cft0TSQIqdwjce2gDOvQ+d/w0FovsMwrSt3ODP4P3Z7wO1jsIJ4eYyaDRnIR/27bd/EMQ==", + "license": "MIT", + "dependencies": { + "expressive-code": "^0.41.7" + } + }, + "node_modules/rehype-format": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/rehype-format/-/rehype-format-5.0.1.tgz", + "integrity": "sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-format": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/rehype-parse": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz", @@ -4084,6 +5319,21 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/rehype-recma": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/rehype-stringify": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", @@ -4099,6 +5349,22 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-directive": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.1.tgz", + "integrity": "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^3.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-gfm": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", @@ -4117,6 +5383,20 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", + "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-parse": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", @@ -4422,6 +5702,15 @@ "url": "https://github.com/sponsors/cyyynthia" } }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -4502,6 +5791,24 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/style-to-js": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, "node_modules/svgo": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.0.tgz", @@ -4739,6 +6046,19 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unist-util-remove-position": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", diff --git a/website/package.json b/website/package.json index 8cc55295..dc789707 100644 --- a/website/package.json +++ b/website/package.json @@ -19,6 +19,7 @@ "license": "MIT", "dependencies": { "@astrojs/sitemap": "^3.7.0", + "@astrojs/starlight": "^0.37.6", "astro": "^5.16.15", "choices.js": "^11.1.0", "jszip": "^3.10.1" diff --git a/website/src/components/Head.astro b/website/src/components/Head.astro new file mode 100644 index 00000000..bf25df34 --- /dev/null +++ b/website/src/components/Head.astro @@ -0,0 +1,11 @@ +--- +import Default from '@astrojs/starlight/components/Head.astro'; +const basePath = import.meta.env.BASE_URL; +--- + + + diff --git a/website/src/config/learning-hub.ts b/website/src/config/learning-hub.ts deleted file mode 100644 index b68a57e3..00000000 --- a/website/src/config/learning-hub.ts +++ /dev/null @@ -1,21 +0,0 @@ -// Shared article ordering for the Learning Hub. -// Used by both the index page and the article sidebar layout. - -export const fundamentalsOrder = [ - 'what-are-agents-skills-instructions', - 'understanding-copilot-context', - 'copilot-configuration-basics', - 'defining-custom-instructions', - 'creating-effective-skills', - 'building-custom-agents', - 'understanding-mcp-servers', - 'automating-with-hooks', - 'agentic-workflows', - 'using-copilot-coding-agent', - 'installing-and-using-plugins', - 'before-after-customization-examples', -]; - -export const referenceOrder = [ - 'github-copilot-terminology-glossary', -]; diff --git a/website/src/content.config.ts b/website/src/content.config.ts index 78738c96..97322bbb 100644 --- a/website/src/content.config.ts +++ b/website/src/content.config.ts @@ -1,20 +1,20 @@ import { defineCollection, z } from "astro:content"; -import { glob } from "astro/loaders"; +import { docsLoader } from "@astrojs/starlight/loaders"; +import { docsSchema } from "@astrojs/starlight/schema"; -const learningHub = defineCollection({ - loader: glob({ pattern: "**/*.md", base: "./src/content/learning-hub" }), - schema: z.object({ - title: z.string(), - description: z.string(), - authors: z.array(z.string()).optional(), - lastUpdated: z.string().optional(), - estimatedReadingTime: z.string().optional(), - tags: z.array(z.string()).optional(), - relatedArticles: z.array(z.string()).optional(), - prerequisites: z.array(z.string()).optional(), +const docs = defineCollection({ + loader: docsLoader(), + schema: docsSchema({ + extend: z.object({ + authors: z.array(z.string()).optional(), + estimatedReadingTime: z.string().optional(), + tags: z.array(z.string()).optional(), + relatedArticles: z.array(z.string()).optional(), + prerequisites: z.array(z.string()).optional(), + }), }), }); export const collections = { - "learning-hub": learningHub, + docs, }; diff --git a/website/src/content/docs/learning-hub/agentic-workflows.md b/website/src/content/docs/learning-hub/agentic-workflows.md new file mode 120000 index 00000000..024b508b --- /dev/null +++ b/website/src/content/docs/learning-hub/agentic-workflows.md @@ -0,0 +1 @@ +../../learning-hub/agentic-workflows.md \ No newline at end of file diff --git a/website/src/content/docs/learning-hub/automating-with-hooks.md b/website/src/content/docs/learning-hub/automating-with-hooks.md new file mode 120000 index 00000000..17cbc9a5 --- /dev/null +++ b/website/src/content/docs/learning-hub/automating-with-hooks.md @@ -0,0 +1 @@ +../../learning-hub/automating-with-hooks.md \ No newline at end of file diff --git a/website/src/content/docs/learning-hub/before-after-customization-examples.md b/website/src/content/docs/learning-hub/before-after-customization-examples.md new file mode 120000 index 00000000..51038632 --- /dev/null +++ b/website/src/content/docs/learning-hub/before-after-customization-examples.md @@ -0,0 +1 @@ +../../learning-hub/before-after-customization-examples.md \ No newline at end of file diff --git a/website/src/content/docs/learning-hub/building-custom-agents.md b/website/src/content/docs/learning-hub/building-custom-agents.md new file mode 120000 index 00000000..77a7726d --- /dev/null +++ b/website/src/content/docs/learning-hub/building-custom-agents.md @@ -0,0 +1 @@ +../../learning-hub/building-custom-agents.md \ No newline at end of file diff --git a/website/src/content/docs/learning-hub/copilot-configuration-basics.md b/website/src/content/docs/learning-hub/copilot-configuration-basics.md new file mode 120000 index 00000000..69fe04cd --- /dev/null +++ b/website/src/content/docs/learning-hub/copilot-configuration-basics.md @@ -0,0 +1 @@ +../../learning-hub/copilot-configuration-basics.md \ No newline at end of file diff --git a/website/src/content/docs/learning-hub/creating-effective-skills.md b/website/src/content/docs/learning-hub/creating-effective-skills.md new file mode 120000 index 00000000..bd635107 --- /dev/null +++ b/website/src/content/docs/learning-hub/creating-effective-skills.md @@ -0,0 +1 @@ +../../learning-hub/creating-effective-skills.md \ No newline at end of file diff --git a/website/src/content/docs/learning-hub/defining-custom-instructions.md b/website/src/content/docs/learning-hub/defining-custom-instructions.md new file mode 120000 index 00000000..eb8dedc8 --- /dev/null +++ b/website/src/content/docs/learning-hub/defining-custom-instructions.md @@ -0,0 +1 @@ +../../learning-hub/defining-custom-instructions.md \ No newline at end of file diff --git a/website/src/content/docs/learning-hub/github-copilot-terminology-glossary.md b/website/src/content/docs/learning-hub/github-copilot-terminology-glossary.md new file mode 120000 index 00000000..797c2bdb --- /dev/null +++ b/website/src/content/docs/learning-hub/github-copilot-terminology-glossary.md @@ -0,0 +1 @@ +../../learning-hub/github-copilot-terminology-glossary.md \ No newline at end of file diff --git a/website/src/content/docs/learning-hub/index.md b/website/src/content/docs/learning-hub/index.md new file mode 100644 index 00000000..538e51ec --- /dev/null +++ b/website/src/content/docs/learning-hub/index.md @@ -0,0 +1,32 @@ +--- +title: Learning Hub +description: 'Curated articles, walkthroughs, and reference material to help you unlock everything you can do with GitHub Copilot' +template: splash +hero: + tagline: 'Curated articles, walkthroughs, and reference material to help you unlock everything you can do with GitHub Copilot' + actions: + - text: Start with Fundamentals + link: /learning-hub/what-are-agents-skills-instructions/ + icon: right-arrow +sidebar: + hidden: true +tableOfContents: false +--- + +## Fundamentals + +Essential concepts to tailor GitHub Copilot beyond its default experience. Start with +[What are Agents, Skills, and Instructions](/learning-hub/what-are-agents-skills-instructions/) +and work through the full track to master every customization primitive. + +## Reference + +Quick-lookup resources to keep handy while you work. Browse the +[GitHub Copilot Terminology Glossary](/learning-hub/github-copilot-terminology-glossary/) +for definitions of common terms and concepts. + +## Hands-on + +Interactive samples and recipes to learn by doing. Jump into the +[Cookbook](/learning-hub/cookbook/) for code samples, recipes, +and examples you can use right away. diff --git a/website/src/content/docs/learning-hub/installing-and-using-plugins.md b/website/src/content/docs/learning-hub/installing-and-using-plugins.md new file mode 120000 index 00000000..3cc64d0b --- /dev/null +++ b/website/src/content/docs/learning-hub/installing-and-using-plugins.md @@ -0,0 +1 @@ +../../learning-hub/installing-and-using-plugins.md \ No newline at end of file diff --git a/website/src/content/docs/learning-hub/understanding-copilot-context.md b/website/src/content/docs/learning-hub/understanding-copilot-context.md new file mode 120000 index 00000000..73f716ad --- /dev/null +++ b/website/src/content/docs/learning-hub/understanding-copilot-context.md @@ -0,0 +1 @@ +../../learning-hub/understanding-copilot-context.md \ No newline at end of file diff --git a/website/src/content/docs/learning-hub/understanding-mcp-servers.md b/website/src/content/docs/learning-hub/understanding-mcp-servers.md new file mode 120000 index 00000000..07b4369c --- /dev/null +++ b/website/src/content/docs/learning-hub/understanding-mcp-servers.md @@ -0,0 +1 @@ +../../learning-hub/understanding-mcp-servers.md \ No newline at end of file diff --git a/website/src/content/docs/learning-hub/using-copilot-coding-agent.md b/website/src/content/docs/learning-hub/using-copilot-coding-agent.md new file mode 120000 index 00000000..bf069545 --- /dev/null +++ b/website/src/content/docs/learning-hub/using-copilot-coding-agent.md @@ -0,0 +1 @@ +../../learning-hub/using-copilot-coding-agent.md \ No newline at end of file diff --git a/website/src/content/docs/learning-hub/what-are-agents-skills-instructions.md b/website/src/content/docs/learning-hub/what-are-agents-skills-instructions.md new file mode 120000 index 00000000..8fe9e73f --- /dev/null +++ b/website/src/content/docs/learning-hub/what-are-agents-skills-instructions.md @@ -0,0 +1 @@ +../../learning-hub/what-are-agents-skills-instructions.md \ No newline at end of file diff --git a/website/src/content/learning-hub/agentic-workflows.md b/website/src/content/learning-hub/agentic-workflows.md index ccc95a16..131fc6e9 100644 --- a/website/src/content/learning-hub/agentic-workflows.md +++ b/website/src/content/learning-hub/agentic-workflows.md @@ -3,7 +3,7 @@ title: 'Agentic Workflows' description: 'Learn what GitHub Agentic Workflows are, how to use community workflows from Awesome Copilot, and how to contribute your own.' authors: - GitHub Copilot Learning Hub Team -lastUpdated: '2026-02-27' +lastUpdated: 2026-02-27 estimatedReadingTime: '7 minutes' tags: - workflows diff --git a/website/src/content/learning-hub/automating-with-hooks.md b/website/src/content/learning-hub/automating-with-hooks.md index 79be9dd0..1a688226 100644 --- a/website/src/content/learning-hub/automating-with-hooks.md +++ b/website/src/content/learning-hub/automating-with-hooks.md @@ -3,7 +3,7 @@ title: 'Automating with Hooks' description: 'Learn how to use hooks to automate lifecycle events like formatting, linting, and governance checks during Copilot agent sessions.' authors: - GitHub Copilot Learning Hub Team -lastUpdated: '2026-02-26' +lastUpdated: 2026-02-26 estimatedReadingTime: '8 minutes' tags: - hooks diff --git a/website/src/content/learning-hub/before-after-customization-examples.md b/website/src/content/learning-hub/before-after-customization-examples.md index e514b524..3cd34430 100644 --- a/website/src/content/learning-hub/before-after-customization-examples.md +++ b/website/src/content/learning-hub/before-after-customization-examples.md @@ -3,7 +3,7 @@ title: 'Before/After Customization Examples' description: 'See real-world transformations showing how custom agents, skills, and instructions dramatically improve GitHub Copilot effectiveness.' authors: - GitHub Copilot Learning Hub Team -lastUpdated: '2025-12-12' +lastUpdated: 2025-12-12 estimatedReadingTime: '12 minutes' tags: - customization diff --git a/website/src/content/learning-hub/building-custom-agents.md b/website/src/content/learning-hub/building-custom-agents.md index 077bace0..95e8beb9 100644 --- a/website/src/content/learning-hub/building-custom-agents.md +++ b/website/src/content/learning-hub/building-custom-agents.md @@ -3,7 +3,7 @@ title: 'Building Custom Agents' description: 'Learn how to create specialized GitHub Copilot agents with custom personas, tool integrations, and domain expertise.' authors: - GitHub Copilot Learning Hub Team -lastUpdated: '2026-02-26' +lastUpdated: 2026-02-26 estimatedReadingTime: '10 minutes' tags: - agents diff --git a/website/src/content/learning-hub/copilot-configuration-basics.md b/website/src/content/learning-hub/copilot-configuration-basics.md index 6b15ac1c..f6eb65df 100644 --- a/website/src/content/learning-hub/copilot-configuration-basics.md +++ b/website/src/content/learning-hub/copilot-configuration-basics.md @@ -3,7 +3,7 @@ title: 'Copilot Configuration Basics' description: 'Learn how to configure GitHub Copilot at user, workspace, and repository levels to optimize your AI-assisted development experience.' authors: - GitHub Copilot Learning Hub Team -lastUpdated: '2025-11-28' +lastUpdated: 2025-11-28 estimatedReadingTime: '10 minutes' tags: - configuration diff --git a/website/src/content/learning-hub/creating-effective-skills.md b/website/src/content/learning-hub/creating-effective-skills.md index 2c047702..1cf91101 100644 --- a/website/src/content/learning-hub/creating-effective-skills.md +++ b/website/src/content/learning-hub/creating-effective-skills.md @@ -3,7 +3,7 @@ title: 'Creating Effective Skills' description: 'Master the art of writing reusable, shareable skill folders that deliver consistent results across your team.' authors: - GitHub Copilot Learning Hub Team -lastUpdated: '2026-02-26' +lastUpdated: 2026-02-26 estimatedReadingTime: '9 minutes' tags: - skills diff --git a/website/src/content/learning-hub/defining-custom-instructions.md b/website/src/content/learning-hub/defining-custom-instructions.md index 6b4465f2..4ba2ead4 100644 --- a/website/src/content/learning-hub/defining-custom-instructions.md +++ b/website/src/content/learning-hub/defining-custom-instructions.md @@ -3,7 +3,7 @@ title: 'Defining Custom Instructions' description: 'Learn how to create persistent, context-aware instructions that guide GitHub Copilot automatically across your codebase.' authors: - GitHub Copilot Learning Hub Team -lastUpdated: '2025-12-02' +lastUpdated: 2025-12-02 estimatedReadingTime: '8 minutes' tags: - instructions diff --git a/website/src/content/learning-hub/github-copilot-terminology-glossary.md b/website/src/content/learning-hub/github-copilot-terminology-glossary.md index 0caa5722..0d76aa03 100644 --- a/website/src/content/learning-hub/github-copilot-terminology-glossary.md +++ b/website/src/content/learning-hub/github-copilot-terminology-glossary.md @@ -3,7 +3,7 @@ title: 'GitHub Copilot Terminology Glossary' description: 'A quick reference guide defining common GitHub Copilot and platform-specific terms.' authors: - GitHub Copilot Learning Hub Team -lastUpdated: '2025-12-15' +lastUpdated: 2025-12-15 estimatedReadingTime: '8 minutes' tags: - glossary diff --git a/website/src/content/learning-hub/installing-and-using-plugins.md b/website/src/content/learning-hub/installing-and-using-plugins.md index d66b2682..94eb44d5 100644 --- a/website/src/content/learning-hub/installing-and-using-plugins.md +++ b/website/src/content/learning-hub/installing-and-using-plugins.md @@ -3,7 +3,7 @@ title: 'Installing and Using Plugins' description: 'Learn how to find, install, and manage plugins that extend GitHub Copilot CLI with reusable agents, skills, hooks, and integrations.' authors: - GitHub Copilot Learning Hub Team -lastUpdated: '2026-02-26' +lastUpdated: 2026-02-26 estimatedReadingTime: '8 minutes' tags: - plugins diff --git a/website/src/content/learning-hub/understanding-copilot-context.md b/website/src/content/learning-hub/understanding-copilot-context.md index 067bee56..33a82b69 100644 --- a/website/src/content/learning-hub/understanding-copilot-context.md +++ b/website/src/content/learning-hub/understanding-copilot-context.md @@ -3,7 +3,7 @@ title: 'Understanding Copilot Context' description: 'Learn how GitHub Copilot uses context from your code, workspace, and conversation to generate relevant suggestions.' authors: - GitHub Copilot Learning Hub Team -lastUpdated: '2025-11-28' +lastUpdated: 2025-11-28 estimatedReadingTime: '8 minutes' tags: - context diff --git a/website/src/content/learning-hub/understanding-mcp-servers.md b/website/src/content/learning-hub/understanding-mcp-servers.md index ef4b0277..482b9181 100644 --- a/website/src/content/learning-hub/understanding-mcp-servers.md +++ b/website/src/content/learning-hub/understanding-mcp-servers.md @@ -3,7 +3,7 @@ title: 'Understanding MCP Servers' description: 'Learn how Model Context Protocol servers extend GitHub Copilot with access to external tools, databases, and APIs.' authors: - GitHub Copilot Learning Hub Team -lastUpdated: '2026-02-26' +lastUpdated: 2026-02-26 estimatedReadingTime: '8 minutes' tags: - mcp diff --git a/website/src/content/learning-hub/using-copilot-coding-agent.md b/website/src/content/learning-hub/using-copilot-coding-agent.md index 4a4f467a..fcc96b63 100644 --- a/website/src/content/learning-hub/using-copilot-coding-agent.md +++ b/website/src/content/learning-hub/using-copilot-coding-agent.md @@ -3,7 +3,7 @@ title: 'Using the Copilot Coding Agent' description: 'Learn how to use GitHub Copilot coding agent to autonomously work on issues, generate pull requests, and automate development tasks.' authors: - GitHub Copilot Learning Hub Team -lastUpdated: '2026-02-26' +lastUpdated: 2026-02-26 estimatedReadingTime: '12 minutes' tags: - coding-agent diff --git a/website/src/content/learning-hub/what-are-agents-skills-instructions.md b/website/src/content/learning-hub/what-are-agents-skills-instructions.md index a5a70e01..2eb66e85 100644 --- a/website/src/content/learning-hub/what-are-agents-skills-instructions.md +++ b/website/src/content/learning-hub/what-are-agents-skills-instructions.md @@ -3,8 +3,9 @@ title: 'What are Agents, Skills, and Instructions' description: 'Understand the primary customization primitives that extend GitHub Copilot for specific workflows.' authors: - GitHub Copilot Learning Hub Team -lastUpdated: '2026-02-26' +lastUpdated: 2026-02-26 estimatedReadingTime: '7 minutes' +prev: false --- Building great experiences with GitHub Copilot starts with understanding the core primitives that shape how Copilot behaves in different contexts. This article clarifies what each artifact does, how it is packaged inside this repository, and when to use it. diff --git a/website/src/integrations/pagefind-resources.ts b/website/src/integrations/pagefind-resources.ts new file mode 100644 index 00000000..1a7efab5 --- /dev/null +++ b/website/src/integrations/pagefind-resources.ts @@ -0,0 +1,142 @@ +/** + * Custom Pagefind integration that extends Starlight's search index + * with resource records (agents, skills, instructions, hooks, workflows, plugins). + * + * Starlight's pagefind is enabled (pagefind: true) so the search UI renders, + * but this integration runs AFTER Starlight's and overwrites the index with + * HTML pages + custom resource records combined. + */ +import type { AstroIntegration } from "astro"; +import { readFileSync } from "node:fs"; +import { fileURLToPath } from "node:url"; +import * as pagefind from "pagefind"; + +interface SearchRecord { + type: string; + id: string; + title: string; + description: string; + path: string; + tags?: string[]; + searchText: string; +} + +const TYPE_LABELS: Record = { + agent: "Agent", + instruction: "Instruction", + skill: "Skill", + hook: "Hook", + workflow: "Workflow", + plugin: "Plugin", + tool: "Tool", +}; + +const TYPE_PAGES: Record = { + agent: "/agents/", + instruction: "/instructions/", + skill: "/skills/", + hook: "/hooks/", + workflow: "/workflows/", + plugin: "/plugins/", + tool: "/tools/", +}; + +export default function pagefindResources(): AstroIntegration { + let siteBase = "/"; + + return { + name: "pagefind-resources", + hooks: { + "astro:config:done": ({ config }) => { + siteBase = config.base; + }, + "astro:build:done": async ({ dir, logger }) => { + const log = logger.fork("pagefind-resources"); + const now = performance.now(); + + try { + log.info("Building search index with Pagefind + resource records..."); + + const response = await pagefind.createIndex(); + if (response.errors.length > 0) { + for (const err of response.errors) log.error(err); + throw new Error("Failed to create Pagefind index"); + } + const { index } = response; + + // Index all built HTML pages (same as Starlight's default) + const indexResult = await index.addDirectory({ + path: fileURLToPath(dir), + }); + if (indexResult.errors.length > 0) { + for (const err of indexResult.errors) log.error(err); + throw new Error("Failed to index HTML directory"); + } + log.info(`Indexed ${indexResult.page_count} HTML pages.`); + + // Read and index resource records from search-index.json + const searchIndexPath = fileURLToPath( + new URL("./data/search-index.json", dir) + ); + let records: SearchRecord[]; + try { + records = JSON.parse(readFileSync(searchIndexPath, "utf-8")); + } catch { + log.warn("Could not read search-index.json, skipping resource indexing."); + records = []; + } + + // Use the base path from Astro config (e.g. "/awesome-copilot/") + const base = siteBase.endsWith("/") ? siteBase : `${siteBase}/`; + + let added = 0; + for (const record of records) { + const typePage = TYPE_PAGES[record.type]; + if (!typePage) continue; + + const url = `${base}${typePage.slice(1)}#file=${encodeURIComponent(record.path)}`; + const typeLabel = TYPE_LABELS[record.type] || record.type; + + const addResult = await index.addCustomRecord({ + url, + content: record.searchText || `${record.title} ${record.description}`, + language: "en", + meta: { + title: `${record.title} โ€” ${typeLabel}`, + }, + filters: { + type: [record.type], + }, + }); + + if (addResult.errors.length > 0) { + for (const err of addResult.errors) log.warn(`Record ${record.id}: ${err}`); + } else { + added++; + } + } + + log.info(`Added ${added} resource records.`); + + // Write the combined index + const writeResult = await index.writeFiles({ + outputPath: fileURLToPath(new URL("./pagefind/", dir)), + }); + if (writeResult.errors.length > 0) { + for (const err of writeResult.errors) log.error(err); + throw new Error("Failed to write Pagefind files"); + } + + const elapsed = performance.now() - now; + log.info( + `Search index built in ${elapsed < 750 ? `${Math.round(elapsed)}ms` : `${(elapsed / 1000).toFixed(2)}s`}.` + ); + } catch (cause) { + throw new Error("Failed to build Pagefind search index.", { cause }); + } finally { + await pagefind.close(); + } + }, + }, + }; +} diff --git a/website/src/layouts/ArticleLayout.astro b/website/src/layouts/ArticleLayout.astro deleted file mode 100644 index 9eb2dc48..00000000 --- a/website/src/layouts/ArticleLayout.astro +++ /dev/null @@ -1,132 +0,0 @@ ---- -import BaseLayout from './BaseLayout.astro'; -import { getCollection } from 'astro:content'; -import { fundamentalsOrder, referenceOrder } from '../config/learning-hub'; - -interface Props { - title: string; - description?: string; - estimatedReadingTime?: string; - lastUpdated?: string; - tags?: string[]; -} - -const { title, description, estimatedReadingTime, lastUpdated, tags } = Astro.props; -const base = import.meta.env.BASE_URL; - -const createOrderIndexMap = (order: string[]) => { - const map = new Map(); - for (let i = 0; i < order.length; i += 1) { - map.set(order[i], i); - } - return map; -}; - -const articles = await getCollection('learning-hub'); - -const fundamentalsOrderIndex = createOrderIndexMap(fundamentalsOrder); -const referenceOrderIndex = createOrderIndexMap(referenceOrder); - -const fundamentals = articles - .filter((a) => fundamentalsOrderIndex.has(a.id)) - .sort( - (a, b) => - (fundamentalsOrderIndex.get(a.id) ?? 0) - (fundamentalsOrderIndex.get(b.id) ?? 0), - ); - -const reference = articles - .filter((a) => referenceOrderIndex.has(a.id)) - .sort( - (a, b) => - (referenceOrderIndex.get(a.id) ?? 0) - (referenceOrderIndex.get(b.id) ?? 0), - ); - -const currentSlug = Astro.url.pathname.replace(/\/$/, '').split('/').pop(); ---- - - -
- - -
-
-
- -
- -
-
-
-
-
-
diff --git a/website/src/layouts/BaseLayout.astro b/website/src/layouts/BaseLayout.astro deleted file mode 100644 index 9f36f048..00000000 --- a/website/src/layouts/BaseLayout.astro +++ /dev/null @@ -1,199 +0,0 @@ ---- -import { execSync } from "child_process"; - -interface Props { - title: string; - description?: string; - activeNav?: string; -} - -const { - title, - description = "Community-driven collection of custom agents, instructions, and skills for GitHub Copilot", - activeNav = "", -} = Astro.props; -const base = import.meta.env.BASE_URL; -const canonicalUrl = new URL(Astro.url.pathname, Astro.site); -const socialImageUrl = new URL(`${base}images/social-image.png`, Astro.site); - -// Get git commit SHA and build date at build time -let commitSha = "unknown"; -let buildDate = new Date().toISOString().split("T")[0]; -try { - // Use GITHUB_SHA env var in GitHub Actions, fallback to git command locally - const githubSha = process.env.GITHUB_SHA; - if (githubSha) { - commitSha = githubSha.substring(0, 7); - } else { - commitSha = execSync("git rev-parse --short HEAD", { encoding: "utf-8" }).trim(); - } -} catch { - // Fallback if git is not available -} ---- - - - - - - - {title} | Awesome GitHub Copilot - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/website/src/pages/agents.astro b/website/src/pages/agents.astro index 901e8f85..d55a0788 100644 --- a/website/src/pages/agents.astro +++ b/website/src/pages/agents.astro @@ -1,11 +1,11 @@ --- -import BaseLayout from '../layouts/BaseLayout.astro'; +import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro'; import Modal from '../components/Modal.astro'; import ContributeCTA from '../components/ContributeCTA.astro'; import PageHeader from '../components/PageHeader.astro'; --- - +
@@ -56,4 +56,4 @@ import PageHeader from '../components/PageHeader.astro'; - + diff --git a/website/src/pages/hooks.astro b/website/src/pages/hooks.astro index f6b7606f..34b39d6d 100644 --- a/website/src/pages/hooks.astro +++ b/website/src/pages/hooks.astro @@ -1,11 +1,11 @@ --- -import BaseLayout from '../layouts/BaseLayout.astro'; +import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro'; import Modal from '../components/Modal.astro'; import ContributeCTA from '../components/ContributeCTA.astro'; import PageHeader from '../components/PageHeader.astro'; --- - +
@@ -49,4 +49,4 @@ import PageHeader from '../components/PageHeader.astro'; - + diff --git a/website/src/pages/index.astro b/website/src/pages/index.astro index bcfcab4f..7ed485a9 100644 --- a/website/src/pages/index.astro +++ b/website/src/pages/index.astro @@ -1,11 +1,11 @@ --- -import BaseLayout from '../layouts/BaseLayout.astro'; +import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro'; import Modal from '../components/Modal.astro'; const base = import.meta.env.BASE_URL; --- - +
@@ -132,4 +132,4 @@ const base = import.meta.env.BASE_URL; - + diff --git a/website/src/pages/instructions.astro b/website/src/pages/instructions.astro index 9009360d..5595c023 100644 --- a/website/src/pages/instructions.astro +++ b/website/src/pages/instructions.astro @@ -1,11 +1,11 @@ --- -import BaseLayout from '../layouts/BaseLayout.astro'; +import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro'; import Modal from '../components/Modal.astro'; import ContributeCTA from '../components/ContributeCTA.astro'; import PageHeader from '../components/PageHeader.astro'; --- - +
@@ -45,4 +45,4 @@ import PageHeader from '../components/PageHeader.astro'; - + diff --git a/website/src/pages/learning-hub/[slug].astro b/website/src/pages/learning-hub/[slug].astro deleted file mode 100644 index 689431d4..00000000 --- a/website/src/pages/learning-hub/[slug].astro +++ /dev/null @@ -1,25 +0,0 @@ ---- -import ArticleLayout from '../../layouts/ArticleLayout.astro'; -import { getCollection, render } from 'astro:content'; - -export async function getStaticPaths() { - const articles = await getCollection('learning-hub'); - return articles.map((article) => ({ - params: { slug: article.id }, - props: { article }, - })); -} - -const { article } = Astro.props; -const { Content } = await render(article); ---- - - - - diff --git a/website/src/pages/learning-hub/cookbook/index.astro b/website/src/pages/learning-hub/cookbook/index.astro index 9187ea44..c2921a66 100644 --- a/website/src/pages/learning-hub/cookbook/index.astro +++ b/website/src/pages/learning-hub/cookbook/index.astro @@ -1,51 +1,35 @@ --- -import BaseLayout from '../../../layouts/BaseLayout.astro'; +import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro'; import Modal from '../../../components/Modal.astro'; - -const base = import.meta.env.BASE_URL; --- - -
-
+ +
+ +
+
Loading samples...
+
+ @@ -281,4 +265,4 @@ const base = import.meta.env.BASE_URL; -
+ diff --git a/website/src/pages/learning-hub/index.astro b/website/src/pages/learning-hub/index.astro deleted file mode 100644 index b350c4a1..00000000 --- a/website/src/pages/learning-hub/index.astro +++ /dev/null @@ -1,158 +0,0 @@ ---- -import BaseLayout from '../../layouts/BaseLayout.astro'; -import { getCollection } from 'astro:content'; -import { fundamentalsOrder, referenceOrder } from '../../config/learning-hub'; - -const base = import.meta.env.BASE_URL; -const articles = await getCollection('learning-hub'); - -const createOrderIndexMap = (order) => { - const map = new Map(); - order.forEach((id, index) => { - map.set(id, index); - }); - return map; -}; - -const fundamentalsOrderIndex = createOrderIndexMap(fundamentalsOrder); -const referenceOrderIndex = createOrderIndexMap(referenceOrder); - -const fundamentals = articles - .filter((a) => fundamentalsOrder.includes(a.id)) - .sort((a, b) => fundamentalsOrderIndex.get(a.id) - fundamentalsOrderIndex.get(b.id)); - -const reference = articles - .filter((a) => referenceOrder.includes(a.id)) - .sort((a, b) => referenceOrderIndex.get(a.id) - referenceOrderIndex.get(b.id)); ---- - - -
- - -
- -
-
-
diff --git a/website/src/pages/plugins.astro b/website/src/pages/plugins.astro index 34c73280..52bff369 100644 --- a/website/src/pages/plugins.astro +++ b/website/src/pages/plugins.astro @@ -1,11 +1,11 @@ --- -import BaseLayout from '../layouts/BaseLayout.astro'; +import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro'; import Modal from '../components/Modal.astro'; import ContributeCTA from '../components/ContributeCTA.astro'; import PageHeader from '../components/PageHeader.astro'; --- - +
@@ -44,4 +44,4 @@ import PageHeader from '../components/PageHeader.astro'; - + diff --git a/website/src/pages/skills.astro b/website/src/pages/skills.astro index afe8e83e..6ca0d001 100644 --- a/website/src/pages/skills.astro +++ b/website/src/pages/skills.astro @@ -1,11 +1,11 @@ --- -import BaseLayout from '../layouts/BaseLayout.astro'; +import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro'; import Modal from '../components/Modal.astro'; import ContributeCTA from '../components/ContributeCTA.astro'; import PageHeader from '../components/PageHeader.astro'; --- - +
@@ -51,4 +51,4 @@ import PageHeader from '../components/PageHeader.astro'; - + diff --git a/website/src/pages/tools.astro b/website/src/pages/tools.astro index 19488c71..f011bb6c 100644 --- a/website/src/pages/tools.astro +++ b/website/src/pages/tools.astro @@ -1,14 +1,10 @@ --- -import BaseLayout from "../layouts/BaseLayout.astro"; +import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro'; import ContributeCTA from "../components/ContributeCTA.astro"; import PageHeader from "../components/PageHeader.astro"; --- - +
@@ -306,4 +302,4 @@ import PageHeader from "../components/PageHeader.astro"; import { initToolsPage } from "../scripts/pages/tools"; initToolsPage(); - + diff --git a/website/src/pages/workflows.astro b/website/src/pages/workflows.astro index 43a992d4..dd4f4663 100644 --- a/website/src/pages/workflows.astro +++ b/website/src/pages/workflows.astro @@ -1,11 +1,11 @@ --- -import BaseLayout from '../layouts/BaseLayout.astro'; +import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro'; import Modal from '../components/Modal.astro'; import ContributeCTA from '../components/ContributeCTA.astro'; import PageHeader from '../components/PageHeader.astro'; --- - +
AI-powered repository automations that run coding agents in GitHub Actions @@ -47,4 +47,4 @@ import PageHeader from '../components/PageHeader.astro'; - + diff --git a/website/src/scripts/theme.ts b/website/src/scripts/theme.ts deleted file mode 100644 index d0a9cf68..00000000 --- a/website/src/scripts/theme.ts +++ /dev/null @@ -1,65 +0,0 @@ -/** - * Theme management for the Awesome Copilot website - * Supports light/dark mode with user preference storage - */ - -const THEME_KEY = 'theme'; - -/** - * Get the current theme preference - */ -function getThemePreference(): 'light' | 'dark' { - const stored = localStorage.getItem(THEME_KEY); - if (stored === 'light' || stored === 'dark') { - return stored; - } - // Check system preference - if (window.matchMedia && window.matchMedia('(prefers-color-scheme: light)').matches) { - return 'light'; - } - return 'dark'; -} - -/** - * Apply theme to the document - */ -function applyTheme(theme: 'light' | 'dark'): void { - document.documentElement.setAttribute('data-theme', theme); -} - -const initialTheme = getThemePreference(); -applyTheme(initialTheme); - -/** - * Toggle between light and dark theme - */ -export function toggleTheme(): void { - const current = document.documentElement.getAttribute('data-theme') as 'light' | 'dark'; - const newTheme = current === 'light' ? 'dark' : 'light'; - applyTheme(newTheme); - localStorage.setItem(THEME_KEY, newTheme); -} - -/** - * Initialize theme toggle button - */ -export function initThemeToggle(): void { - const toggleBtn = document.getElementById('theme-toggle'); - if (toggleBtn) { - toggleBtn.addEventListener('click', toggleTheme); - } - - // Listen for system theme changes - if (window.matchMedia) { - window.matchMedia('(prefers-color-scheme: light)').addEventListener('change', (e) => { - // Only auto-switch if user hasn't set a preference - const stored = localStorage.getItem(THEME_KEY); - if (!stored) { - applyTheme(e.matches ? 'light' : 'dark'); - } - }); - } -} - -// Auto-initialize when DOM is ready -document.addEventListener('DOMContentLoaded', initThemeToggle); diff --git a/website/public/styles/global.css b/website/src/styles/global.css similarity index 89% rename from website/public/styles/global.css rename to website/src/styles/global.css index 671eff26..782a4f34 100644 --- a/website/public/styles/global.css +++ b/website/src/styles/global.css @@ -69,17 +69,17 @@ --color-bg-tertiary: #f5f5f7; --color-border: #e4e4e7; --color-text: #3f3f46; - --color-text-muted: #71717a; + --color-text-muted: #52525b; --color-text-emphasis: #18181b; --color-link: #8534F3; --color-link-hover: #43179E; --color-card-bg: rgba(255, 255, 255, 0.9); --color-card-hover: rgba(255, 255, 255, 1); - --color-glass: rgba(255, 255, 255, 0.7); - --color-glass-border: rgba(0, 0, 0, 0.08); - --gradient-hero: radial-gradient(ellipse 80% 50% at 50% -20%, rgba(133, 52, 243, 0.12), transparent), - radial-gradient(ellipse 60% 40% at 80% 50%, rgba(254, 76, 37, 0.06), transparent), - radial-gradient(ellipse 60% 40% at 20% 50%, rgba(184, 112, 255, 0.06), transparent); + --color-glass: rgba(255, 255, 255, 0.85); + --color-glass-border: rgba(0, 0, 0, 0.12); + --gradient-hero: radial-gradient(ellipse 80% 50% at 50% -20%, rgba(133, 52, 243, 0.18), transparent), + radial-gradient(ellipse 60% 40% at 80% 50%, rgba(254, 76, 37, 0.10), transparent), + radial-gradient(ellipse 60% 40% at 20% 50%, rgba(184, 112, 255, 0.10), transparent); --shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.08), 0 2px 4px -2px rgba(0, 0, 0, 0.06); --shadow-lg: 0 20px 40px -12px rgba(0, 0, 0, 0.15); --shadow-glow: 0 0 40px -10px rgba(133, 52, 243, 0.3); @@ -93,40 +93,46 @@ --color-bg-tertiary: #f5f5f7; --color-border: #e4e4e7; --color-text: #3f3f46; - --color-text-muted: #71717a; + --color-text-muted: #52525b; --color-text-emphasis: #18181b; --color-link: #8534F3; --color-link-hover: #43179E; --color-card-bg: rgba(255, 255, 255, 0.9); --color-card-hover: rgba(255, 255, 255, 1); - --color-glass: rgba(255, 255, 255, 0.7); - --color-glass-border: rgba(0, 0, 0, 0.08); - --gradient-hero: radial-gradient(ellipse 80% 50% at 50% -20%, rgba(133, 52, 243, 0.12), transparent), - radial-gradient(ellipse 60% 40% at 80% 50%, rgba(254, 76, 37, 0.06), transparent), - radial-gradient(ellipse 60% 40% at 20% 50%, rgba(184, 112, 255, 0.06), transparent); + --color-glass: rgba(255, 255, 255, 0.85); + --color-glass-border: rgba(0, 0, 0, 0.12); + --gradient-hero: radial-gradient(ellipse 80% 50% at 50% -20%, rgba(133, 52, 243, 0.18), transparent), + radial-gradient(ellipse 60% 40% at 80% 50%, rgba(254, 76, 37, 0.10), transparent), + radial-gradient(ellipse 60% 40% at 20% 50%, rgba(184, 112, 255, 0.10), transparent); --shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.08), 0 2px 4px -2px rgba(0, 0, 0, 0.06); --shadow-lg: 0 20px 40px -12px rgba(0, 0, 0, 0.15); --shadow-glow: 0 0 40px -10px rgba(133, 52, 243, 0.3); } } -* { +/* Scoped reset: only apply inside custom page content areas. + Starlight handles its own box-sizing and reset. */ +#main-content *, +#main-content *::before, +#main-content *::after { box-sizing: border-box; +} + +#main-content { margin: 0; padding: 0; } -html { - scroll-behavior: smooth; +/* Full-width page gradient on custom pages (not Starlight docs). + Applied to body so it spans the entire viewport width, + similar to how github.github.com/gh-aw/ handles its gradient. */ +body:has(#main-content) { + background-image: var(--gradient-hero); + background-attachment: fixed; } -body { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif; - background-color: var(--color-bg); - color: var(--color-text); - line-height: 1.6; - min-height: 100vh; -} +/* body styles removed โ€” Starlight handles base body styling. + Custom page content inherits via scoped selectors below. */ /* Accessibility Utilities */ .sr-only { @@ -167,180 +173,18 @@ body { padding: 0 24px; } -a { +#main-content a { color: var(--color-link); text-decoration: none; transition: color var(--transition); } -a:hover { +#main-content a:hover { color: var(--color-link-hover); } -/* Header */ -.site-header { - background: var(--color-glass); - backdrop-filter: blur(20px); - -webkit-backdrop-filter: blur(20px); - border-bottom: 1px solid var(--color-glass-border); - position: sticky; - top: 0; - z-index: 100; - height: var(--header-height); -} - -.header-content { - display: flex; - align-items: center; - justify-content: space-between; - height: var(--header-height); -} - -.logo { - display: flex; - align-items: center; - gap: 10px; - font-weight: 700; - font-size: 20px; - color: var(--color-text-emphasis); - transition: all var(--transition); -} - -.logo:hover { - color: var(--color-text-emphasis); - transform: scale(1.02); -} - -.logo-icon { - width: 32px; - height: 32px; -} - -/* Show white logo by default (dark theme) */ -.logo-icon-light { - display: none; -} - -.logo-icon-dark { - display: block; -} - -/* Light theme: show black logo */ -[data-theme="light"] .logo-icon-light { - display: block; -} - -[data-theme="light"] .logo-icon-dark { - display: none; -} - -/* Auto theme based on system preference */ -@media (prefers-color-scheme: light) { - :root:not([data-theme="dark"]) .logo-icon-light { - display: block; - } - - :root:not([data-theme="dark"]) .logo-icon-dark { - display: none; - } -} - -.main-nav { - display: flex; - gap: 8px; -} - -.main-nav a { - color: var(--color-text-muted); - font-size: 14px; - font-weight: 500; - padding: 8px 14px; - border-radius: var(--border-radius); - transition: all var(--transition); -} - -.main-nav a:hover, -.main-nav a.active { - color: var(--color-text-emphasis); - background: var(--color-bg-tertiary); -} - -.github-link { - color: var(--color-text); - display: flex; - align-items: center; -} - -.github-link:hover { - color: var(--color-text-emphasis); -} - -/* Theme Toggle */ -.header-actions { - display: flex; - align-items: center; - gap: 16px; -} - -.theme-toggle { - background: none; - border: none; - cursor: pointer; - padding: 8px; - border-radius: var(--border-radius); - color: var(--color-text); - display: flex; - align-items: center; - justify-content: center; - transition: all var(--transition); -} - -.theme-toggle:hover { - background-color: var(--color-bg-tertiary); - color: var(--color-text-emphasis); -} - -.theme-toggle svg { - width: 20px; - height: 20px; -} - -.theme-toggle .icon-sun, -.theme-toggle .icon-moon { - display: none; -} - -/* Show sun icon in dark mode (click to switch to light) */ -:root:not([data-theme="light"]) .theme-toggle .icon-sun { - display: block; -} - -:root:not([data-theme="light"]) .theme-toggle .icon-moon { - display: none; -} - -/* Show moon icon in light mode (click to switch to dark) */ -[data-theme="light"] .theme-toggle .icon-sun { - display: none; -} - -[data-theme="light"] .theme-toggle .icon-moon { - display: block; -} - -/* Handle auto mode with prefers-color-scheme */ -@media (prefers-color-scheme: light) { - :root:not([data-theme="dark"]):not([data-theme="light"]) .theme-toggle .icon-sun { - display: none; - } - :root:not([data-theme="dark"]):not([data-theme="light"]) .theme-toggle .icon-moon { - display: block; - } -} - /* Hero Section */ .hero { - background: var(--gradient-hero), var(--color-bg); padding: 50px 0 20px; text-align: center; position: relative; @@ -608,7 +452,6 @@ a:hover { /* Getting Started */ .getting-started { padding: 100px 0; - background: var(--gradient-hero), var(--color-bg); } .getting-started h2 { @@ -1060,7 +903,6 @@ a:hover { /* Page Layouts */ .page-header { padding: 56px 0 40px; - background: var(--gradient-hero), var(--color-bg); border-bottom: 1px solid var(--color-glass-border); } @@ -1538,10 +1380,6 @@ a:hover { /* Responsive */ @media (max-width: 768px) { - .main-nav { - display: none; - } - .hero h1 { font-size: 32px; } @@ -1885,6 +1723,17 @@ a:hover { } /* Learning Hub - Index Page */ +.learning-hub-no-results { + text-align: center; + color: var(--color-text-muted); + padding: 48px 24px; + font-size: 16px; +} + +.learning-hub-no-results.hidden { + display: none; +} + .learning-hub-section h2 { font-size: 24px; font-weight: 700; diff --git a/website/src/styles/starlight-overrides.css b/website/src/styles/starlight-overrides.css new file mode 100644 index 00000000..c1d55cb6 --- /dev/null +++ b/website/src/styles/starlight-overrides.css @@ -0,0 +1,181 @@ +/* Brand color overrides for Starlight */ +/* Purple (#8534F3) and Orange (#FE4C25) theme */ + +/* โ”€โ”€ Dark theme (default) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ +:root { + --sl-color-accent-low: #1a0d33; + --sl-color-accent: #8534f3; + --sl-color-accent-high: #c9a5fa; + --sl-color-text-accent: #c9a5fa; + + --sl-color-white: #f0f0f5; + --sl-color-gray-1: #d0d0da; + --sl-color-gray-2: #9898a6; + --sl-color-gray-3: #60607a; + --sl-color-gray-4: #30304a; + --sl-color-gray-5: #1a1a2e; + --sl-color-gray-6: #111120; + --sl-color-black: #0a0a0f; + + --sl-font-system: system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, + Arial, sans-serif; +} + +/* โ”€โ”€ Light theme โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ +/* Starlight inverts the gray scale for light mode. + Because our customCss is unlayered it overrides Starlight's layered + theme swap, so we must provide the inverted palette ourselves. */ +:root[data-theme="light"] { + --sl-color-accent-low: #f0e6ff; + --sl-color-accent: #6b21c8; + --sl-color-accent-high: #3b0d7a; + --sl-color-text-accent: #6b21c8; + + --sl-color-white: #0a0a0f; + --sl-color-gray-1: #111120; + --sl-color-gray-2: #1a1a2e; + --sl-color-gray-3: #30304a; + --sl-color-gray-4: #60607a; + --sl-color-gray-5: #9898a6; + --sl-color-gray-6: #d0d0da; + --sl-color-black: #f0f0f5; +} + +/* โ”€โ”€ Sidebar active item โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ +nav[aria-label="Main"] a[aria-current="page"] { + color: var(--sl-color-accent) !important; + font-weight: 600; + border-inline-start-color: var(--sl-color-accent) !important; +} + +/* โ”€โ”€ Header brand styling โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ +.site-title { + font-weight: 700 !important; +} +header .site-title:hover { + color: var(--sl-color-accent-high) !important; +} + +/* โ”€โ”€ Browse Resources sidebar group โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ +nav[aria-label="Main"] > ul > li:first-child details summary, +nav[aria-label="Main"] > ul > li:first-child > a { + font-weight: 600; +} + +/* โ”€โ”€ Hide Starlight's auto-generated page title on custom splash pages โ”€โ”€ */ +/* Only affects pages that have their own #main-content (custom pages) */ +/* Starlight generates a title h1; custom pages render their own h1 */ +main:has(#main-content) > .content-panel:has(h1#_top) { + display: none !important; +} + +/* โ”€โ”€ Pagefind search filter pills โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */ +/* Restyle the default checkbox filters as horizontal pill toggles above results */ + +/* Stack filters above results instead of side-by-side */ +#starlight__search .pagefind-ui__drawer { + flex-direction: column !important; +} + +#starlight__search .pagefind-ui__filter-panel { + border: none; + padding: 0; + margin: 0; + width: 100% !important; + min-width: 0 !important; + flex: none !important; +} + +#starlight__search .pagefind-ui__filter-panel-label { + display: none; +} + +/* Remove the collapsible
wrapper โ€” always show filters */ +#starlight__search .pagefind-ui__filter-block { + border: none; + margin: 0; + padding: 0; +} + +#starlight__search .pagefind-ui__filter-block > summary { + display: none; +} + +/* Hide the "type" group legend */ +#starlight__search .pagefind-ui__filter-group-label { + display: none; +} + +/* Lay out filter values as a horizontal pill row */ +#starlight__search .pagefind-ui__filter-group { + display: flex !important; + flex-direction: row !important; + flex-wrap: wrap !important; + align-items: center !important; + gap: 0.375rem; + padding: 0.375rem 0 0.625rem; + border: none; + margin: 0; +} + +/* Each pill: hide the checkbox, style the label as a pill */ +#starlight__search .pagefind-ui__filter-value { + display: contents; +} + +/* Visually hidden but still focusable for keyboard a11y */ +#starlight__search .pagefind-ui__filter-checkbox { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +#starlight__search .pagefind-ui__filter-value::before { + display: none !important; +} + +#starlight__search .pagefind-ui__filter-label { + display: inline-flex !important; + width: auto !important; + align-items: center; + padding: 0.2rem 0.625rem; + border-radius: 9999px; + font-size: 0.75rem; + font-weight: 500; + line-height: 1.4; + cursor: pointer; + user-select: none; + transition: all 0.15s ease; + border: 1px solid var(--sl-color-gray-5); + color: var(--sl-color-gray-2); + background: transparent; + text-transform: capitalize; +} + +#starlight__search .pagefind-ui__filter-label:hover { + border-color: var(--sl-color-accent); + color: var(--sl-color-accent-high); +} + +/* Keyboard focus ring for pill filters */ +#starlight__search .pagefind-ui__filter-checkbox:focus-visible + .pagefind-ui__filter-label { + outline: 2px solid var(--sl-color-accent); + outline-offset: 2px; +} + +/* Active/checked pill state */ +#starlight__search .pagefind-ui__filter-checkbox:checked + .pagefind-ui__filter-label { + background: var(--sl-color-accent); + border-color: var(--sl-color-accent); + color: white; +} + +#starlight__search .pagefind-ui__filter-checkbox:checked + .pagefind-ui__filter-label:hover { + opacity: 0.9; +}