diff --git a/.github/github-app.yml b/.github/github-app.yml new file mode 100644 index 00000000..d3a61e32 --- /dev/null +++ b/.github/github-app.yml @@ -0,0 +1,10 @@ +scripts: + - name: Generate readme + command: npm run build + - name: Run website + command: "npm run website:dev" + - name: Install dependencies + command: npm install && cd website && npm install +automation: + auto_issue_session: true + remote_control: false \ No newline at end of file diff --git a/.github/workflows/deploy-website-preview.yml b/.github/workflows/deploy-website-preview.yml index c0a59a5e..9bd24f8b 100644 --- a/.github/workflows/deploy-website-preview.yml +++ b/.github/workflows/deploy-website-preview.yml @@ -44,7 +44,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: "22" + node-version: "24" cache: "npm" - name: Install root dependencies diff --git a/.github/workflows/deploy-website.yml b/.github/workflows/deploy-website.yml index 03f883f6..e996f2ee 100644 --- a/.github/workflows/deploy-website.yml +++ b/.github/workflows/deploy-website.yml @@ -32,7 +32,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: "22" + node-version: "24" cache: "npm" - name: Install root dependencies diff --git a/.gitignore b/.gitignore index 36d3cb06..d2a8cb48 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,4 @@ website/public/llms.txt obj/ bin/ .impeccable +.playwright-mcp diff --git a/eng/generate-website-data.mjs b/eng/generate-website-data.mjs index 0bcd5809..d1d16838 100755 --- a/eng/generate-website-data.mjs +++ b/eng/generate-website-data.mjs @@ -1389,7 +1389,7 @@ function generateCanvasManifest(gitDates, commitSha) { canvasId: id, extensionId: id, extensionName: name, - pluginName: null, + pluginName: name, name: displayName, version: normalizeText(ext?.version, "1.0.0"), readmeFile: null, @@ -1414,7 +1414,10 @@ function generateCanvasManifest(gitDates, commitSha) { imageUrl, assetPath: null, installUrl: null, - installCommand: null, + // Registered in plugins/external.json, so it is installable from the + // awesome-copilot marketplace by plugin name even though it is hosted + // externally. + installCommand: `copilot plugin install ${name}@awesome-copilot`, sourceUrl, externalSource, external: true, @@ -1463,7 +1466,8 @@ function generateSearchIndex( agents, instructions, skills, - plugins + plugins, + extensions ) { const index = []; @@ -1519,6 +1523,20 @@ function generateSearchIndex( }); } + for (const extension of extensions) { + index.push({ + type: "extension", + id: extension.id, + title: extension.name || extension.title || extension.id, + description: extension.description || "", + path: extension.path, + lastUpdated: extension.lastUpdated, + searchText: + extension.searchText || + `${extension.name || extension.title || extension.id} ${extension.description || ""}`.toLowerCase(), + }); + } + return index; } @@ -1724,7 +1742,8 @@ async function main() { agents, instructions, skills, - plugins + plugins, + extensions ); console.log(`✓ Generated search index with ${searchIndex.length} items`); diff --git a/eng/yaml-parser.mjs b/eng/yaml-parser.mjs index d3850766..99a44851 100644 --- a/eng/yaml-parser.mjs +++ b/eng/yaml-parser.mjs @@ -32,6 +32,8 @@ function skipsAsBundledAsset(filePath) { } } +const BUILD_OUTPUT_DIRECTORIES = new Set(["bin", "obj"]); + /** * Parse frontmatter from a markdown file using vfile-matter * Works with any markdown file that has YAML frontmatter (agents, prompts, instructions) @@ -168,9 +170,7 @@ function parseSkillMetadata(skillPath) { entries.forEach((entry) => { const filePath = path.join(dirPath, entry.name); if (entry.isDirectory()) { - if (entry.name === "bin" || entry.name === "obj") { - return; // Skip bin and obj directories as they are .NET project output folders and not part of the skill assets - } + if (BUILD_OUTPUT_DIRECTORIES.has(entry.name)) return; arrayOfFiles = getAllFiles(filePath, arrayOfFiles); } else if ( !entry.isSymbolicLink() || diff --git a/eng/yaml-parser.test.mjs b/eng/yaml-parser.test.mjs index 5d66a394..5e886f66 100644 --- a/eng/yaml-parser.test.mjs +++ b/eng/yaml-parser.test.mjs @@ -72,6 +72,19 @@ test("recurses into nested and non-spec subdirectories instead of listing the di } }); +test("excludes ignored build output directories from bundled assets", () => { + const skillPath = createSkill({ + "SKILL.md": SKILL_MD, + "scripts/generate.cs": "source", + "scripts/bin/Debug/tool.dll": "build output", + "scripts/obj/project.assets.json": "build output", + }); + + const metadata = parseSkillMetadata(skillPath); + + assert.deepEqual(metadata.assets, ["scripts/generate.cs"]); +}); + test("excludes only the root SKILL.md, keeping nested ones as bundled assets", () => { const skillPath = createSkill({ "SKILL.md": SKILL_MD, diff --git a/skills/acquire-codebase-knowledge/SKILL.md b/skills/acquire-codebase-knowledge/SKILL.md index b449afdb..0ef102e7 100644 --- a/skills/acquire-codebase-knowledge/SKILL.md +++ b/skills/acquire-codebase-knowledge/SKILL.md @@ -157,7 +157,6 @@ Use these sections during Phase 2 to inform investigation questions and identify | Asset | When to load | |-------|-------------| | [`scripts/scan.py`](scripts/scan.py) | Phase 1 — run first, before reading any code (Python 3.8+ required) | - | [`references/inquiry-checkpoints.md`](references/inquiry-checkpoints.md) | Phase 2 — load for per-template investigation questions | | [`references/stack-detection.md`](references/stack-detection.md) | Phase 2 — only if stack is ambiguous | | [`assets/templates/STACK.md`](assets/templates/STACK.md) | Phase 3 step 1 | diff --git a/website/astro.config.mjs b/website/astro.config.mjs index 80e63448..6d8e98bf 100644 --- a/website/astro.config.mjs +++ b/website/astro.config.mjs @@ -1,15 +1,44 @@ -import { unified } from "@astrojs/markdown-remark"; import sitemap from "@astrojs/sitemap"; -import starlight from "@astrojs/starlight"; +import react from "@astrojs/react"; +import { unified } from "@astrojs/markdown-remark"; +import fs from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; import { defineConfig } from "astro/config"; import remarkGithubAdmonitionsToDirectives from "remark-github-admonitions-to-directives"; import pagefindResources from "./src/integrations/pagefind-resources"; -// Learning Hub course content mirrored from external workshop repos is authored -// in GitHub admonition syntax (`> [!NOTE]`). This remark plugin rewrites those -// callouts into Starlight aside directives before Starlight renders them, so the -// same syntax used in the source repos and on github.com also produces styled -// callouts here. The mapping targets Starlight's aside types (note / tip / caution). +// The contributor count is read from the repo's all-contributors manifest at +// build time and inlined as a literal into both the server render and the +// client bundle. It cannot be read at module scope in src/ because the shells +// that display it are `client:load` hydrated: `node:fs` is unavailable in the +// browser, so the read would fail there and the badge would reset to 0 on +// hydration even though the server-rendered HTML had the right number. +function readContributorsTotal() { + const here = path.dirname(fileURLToPath(import.meta.url)); + const manifest = path.resolve(here, "..", ".all-contributorsrc"); + try { + const rc = JSON.parse(fs.readFileSync(manifest, "utf8")); + if (!Array.isArray(rc.contributors)) { + throw new Error("`contributors` is missing or is not an array"); + } + return rc.contributors.length; + } catch (error) { + const message = `Could not read the contributor count from ${manifest}: ${error.message}`; + // Falling back to 0 silently is how this badge regressed before, so make a + // broken manifest fail the production build rather than ship a wrong count. + if (process.env.NODE_ENV === "production") { + throw new Error(message); + } + console.warn(`[contributors] ${message}`); + return 0; + } +} + +// Learning Hub course content mirrored from external workshop repos is authored in +// GitHub admonition syntax (`> [!NOTE]`). This remark plugin rewrites those +// callouts into directives before rendering, so the same syntax used in the +// source repos and on github.com also produces styled callouts here. const githubAdmonitionMapping = { NOTE: "note", TIP: "tip", @@ -19,15 +48,6 @@ const githubAdmonitionMapping = { }; const site = "https://awesome-copilot.github.com/"; -const siteDescription = - "Community-contributed agents, instructions, and skills to enhance your GitHub Copilot experience"; -// Social preview image used for all Open Graph / Twitter cards (e.g. LinkedIn, which is -// Open Graph-driven). socialImageWidth/Height MUST match the actual pixels of social-image.png. -// If a page ever overrides og:image, also override og:image:width/height and twitter:image -// (Head.astro derives og:image:secure_url from twitter:image first). -const socialImageUrl = new URL("/images/social-image.png", site).toString(); -const socialImageWidth = "2400"; -const socialImageHeight = "1260"; // https://astro.build/config export default defineConfig({ @@ -35,270 +55,84 @@ export default defineConfig({ base: "/", output: "static", markdown: { - // Astro 7.1+ uses Sätteri as the default Markdown processor, but its plugin - // API is incompatible with remark/rehype plugins. We explicitly opt into the - // unified() (remark/rehype) processor so we can keep using - // remark-github-admonitions-to-directives, which rewrites > [!NOTE] callouts - // from Learning Hub course content into Starlight aside directives. + // Astro 7 deprecated top-level `remarkPlugins`/`rehypePlugins`/ + // `remarkRehype` in favour of configuring the unified pipeline directly. processor: unified({ remarkPlugins: [ - [remarkGithubAdmonitionsToDirectives, { mapping: githubAdmonitionMapping }], + [ + remarkGithubAdmonitionsToDirectives, + { mapping: githubAdmonitionMapping }, + ], ], }), + // The prototype's own code blocks (SyntaxHighlightedCode.tsx) are styled + // entirely through brand CSS tokens rather than baked-in theme colours, so + // they automatically match the site's light/dark mode. Raw markdown code + // fences render through Shiki instead, which by default bakes a fixed + // "github-dark" theme's literal colours into inline styles — that ignores + // the site's actual colour mode and clashes with the prototype's bordered, + // canvas-subtle code block styling. The "css-variables" theme emits + // `var(--astro-code-*)` custom properties instead of literal colours, + // which are mapped to the same brand tokens in + // src/components/brand/styles/{dotnet-upgrade,github-copilot-app}.module.css. + shikiConfig: { + theme: "css-variables", + }, }, - integrations: [ - starlight({ - title: "Awesome GitHub Copilot", - favicon: "/images/favicon.svg", - description: siteDescription, - social: [], - head: [ - { - tag: "meta", - attrs: { - property: "og:image", - content: socialImageUrl, - }, - }, - { - tag: "meta", - attrs: { - property: "og:image:width", - content: socialImageWidth, - }, - }, - { - tag: "meta", - attrs: { - property: "og:image:height", - content: socialImageHeight, - }, - }, - { - tag: "meta", - attrs: { - property: "og:image:alt", - content: siteDescription, - }, - }, - { - tag: "meta", - attrs: { - name: "twitter:image", - content: socialImageUrl, - }, - }, - ], - customCss: [ - "./src/styles/starlight-overrides.css", - "./src/styles/global.css", - ], - // English is served at the site root (no locale prefix), preserving all - // existing URLs. Additional locales are served under a locale prefix - // (e.g. /es-es/…) and fall back to the English page when a translation - // does not yet exist. These keys match the locale directory names used by - // mirrored Learning Hub course content (website/src/content/docs//…). - defaultLocale: "root", - locales: { - root: { label: "English", lang: "en" }, - "es-es": { label: "Español", lang: "es-ES" }, - "ja-jp": { label: "日本語", lang: "ja-JP" }, - "ko-kr": { label: "한국어", lang: "ko-KR" }, - "pt-br": { label: "Português (Brasil)", lang: "pt-BR" }, - "zh-cn": { label: "简体中文", lang: "zh-CN" }, - }, - editLink: { - baseUrl: - "https://github.com/github/awesome-copilot/edit/staged/website/", - }, - sidebar: [ - { - label: "Fundamentals", - items: [ - "learning-hub/github-copilot-app", - "learning-hub/working-with-canvas-extensions", - "learning-hub/using-automations-in-copilot-app", - "learning-hub/what-are-agents-skills-instructions", - "learning-hub/agents-and-subagents", - "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: "Copilot CLI for Beginners", - items: [ - { - label: "Overview", - link: "/learning-hub/cli-for-beginners/", - }, - "learning-hub/cli-for-beginners/00-quick-start", - "learning-hub/cli-for-beginners/01-setup-and-first-steps", - "learning-hub/cli-for-beginners/02-context-and-conversations", - "learning-hub/cli-for-beginners/03-development-workflows", - "learning-hub/cli-for-beginners/04-agents-and-custom-instructions", - "learning-hub/cli-for-beginners/05-skills", - "learning-hub/cli-for-beginners/06-mcp-servers", - "learning-hub/cli-for-beginners/07-putting-it-all-together", - ], - }, - { - label: "Advanced Copilot CLI", - items: [ - { - label: "Overview", - link: "/learning-hub/advanced-copilot-cli/", - }, - "learning-hub/advanced-copilot-cli/00-prerequisites", - "learning-hub/advanced-copilot-cli/01-working-with-copilot-cli", - "learning-hub/advanced-copilot-cli/02-building-ai-infrastructure", - "learning-hub/advanced-copilot-cli/03-test-suite-remote-delegation", - "learning-hub/advanced-copilot-cli/04-lifecycle-hooks", - "learning-hub/advanced-copilot-cli/05-add-feature-barcode", - "learning-hub/advanced-copilot-cli/06-modernize-apps", - "learning-hub/advanced-copilot-cli/07-manage-infrastructure", - "learning-hub/advanced-copilot-cli/08-wrap-up", - ], - }, - { - label: "Copilot Workshops", - items: [ - { - label: "Overview", - link: "/learning-hub/copilot-workshops/", - }, - { - label: "VS Code", - items: [ - { - label: "Overview", - link: "/learning-hub/copilot-workshops/vscode/", - }, - "learning-hub/copilot-workshops/vscode/0-prerequisites", - "learning-hub/copilot-workshops/vscode/1-custom-instructions", - "learning-hub/copilot-workshops/vscode/2-agent-mode", - "learning-hub/copilot-workshops/vscode/3-mcp", - "learning-hub/copilot-workshops/vscode/4-custom-agents", - "learning-hub/copilot-workshops/vscode/5-managing-agents", - "learning-hub/copilot-workshops/vscode/6-iterating", - ], - }, - { - label: "Copilot CLI", - items: [ - { - label: "Overview", - link: "/learning-hub/copilot-workshops/cli/", - }, - "learning-hub/copilot-workshops/cli/0-prerequisites", - "learning-hub/copilot-workshops/cli/1-install-copilot-cli", - "learning-hub/copilot-workshops/cli/2-custom-instructions", - "learning-hub/copilot-workshops/cli/3-generating-code", - "learning-hub/copilot-workshops/cli/4-mcp", - "learning-hub/copilot-workshops/cli/5-agent-skills", - "learning-hub/copilot-workshops/cli/6-custom-agents", - "learning-hub/copilot-workshops/cli/7-slash-commands", - "learning-hub/copilot-workshops/cli/8-review", - ], - }, - { - label: "Copilot App", - items: [ - { - label: "Overview", - link: "/learning-hub/copilot-workshops/app/", - }, - "learning-hub/copilot-workshops/app/0-prerequisites", - "learning-hub/copilot-workshops/app/1-install-copilot-app", - "learning-hub/copilot-workshops/app/2-add-star-rating", - "learning-hub/copilot-workshops/app/3-custom-instructions", - "learning-hub/copilot-workshops/app/4-build-filtering", - "learning-hub/copilot-workshops/app/5-mcp-playwright", - "learning-hub/copilot-workshops/app/6-agent-merge", - "learning-hub/copilot-workshops/app/7-canvases", - "learning-hub/copilot-workshops/app/8-review", - ], - }, - { - label: "Copilot Cloud Agent", - items: [ - { - label: "Overview", - link: "/learning-hub/copilot-workshops/cloud/", - }, - "learning-hub/copilot-workshops/cloud/0-prerequisites", - "learning-hub/copilot-workshops/cloud/1-custom-instructions", - "learning-hub/copilot-workshops/cloud/2-cloud-agent", - "learning-hub/copilot-workshops/cloud/3-custom-agents", - "learning-hub/copilot-workshops/cloud/4-managing-agents", - "learning-hub/copilot-workshops/cloud/5-iterating", - ], - }, - ], - }, - { - label: "Hands-on", - items: [ - { - label: "Cookbook", - link: "/learning-hub/cookbook/", - }, - ], - }, - { - label: "Browse Resources", - items: [ - { label: "Home", link: "/" }, - { label: "Agents", link: "/agents/" }, - { label: "Instructions", link: "/instructions/" }, - { label: "Skills", link: "/skills/" }, - { label: "Canvas Extensions", link: "/extensions/" }, - { label: "Plugins", link: "/plugins/" }, - { label: "Contributors", link: "/contributors/" }, - ], - }, - ], - 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", - Footer: "./src/components/Footer.astro", - Search: "./src/components/Search.astro", - LanguageSelect: "./src/components/LanguageSelect.astro", - }, - }), - sitemap(), - pagefindResources(), - ], + // English is served at the site root (no locale prefix), preserving all + // existing URLs. Additional locales are served under a locale prefix + // (e.g. /es-es/…) and fall back to the English page when a translation does + // not yet exist. These keys match the locale directory names used by mirrored + // Learning Hub course content (website/src/content/docs//…). + i18n: { + defaultLocale: "en", + locales: ["en", "es-es", "ja-jp", "ko-kr", "pt-br", "zh-cn"], + routing: { + prefixDefaultLocale: false, + fallbackType: "rewrite", + }, + fallback: { + "es-es": "en", + "ja-jp": "en", + "ko-kr": "en", + "pt-br": "en", + "zh-cn": "en", + }, + }, + integrations: [react(), sitemap(), pagefindResources()], redirects: { "/samples/": "/learning-hub/cookbook/", + "/hooks/": "https://github.com/github/awesome-copilot/tree/main/hooks", + "/workflows/": "https://github.com/github/awesome-copilot/tree/main/workflows", + "/tools/": "https://github.com/github/awesome-copilot/blob/main/website/data/tools.yml", }, build: { assets: "assets", }, trailingSlash: "always", vite: { + define: { + __CONTRIBUTORS_TOTAL__: JSON.stringify(readContributorsTotal()), + }, + // @primer/react-brand's default entrypoint is CJS, so Node's ESM loader + // cannot detect its named exports during SSR. The package also ships a + // proper ESM build; alias to it so named imports resolve in both the + // server render and the client bundle. + resolve: { + alias: [ + { + // Only the bare package specifier (the JS entrypoint) is redirected; + // subpath imports such as `/lib/css/main.css` must resolve normally. + find: /^@primer\/react-brand$/, + replacement: "@primer/react-brand/esm", + }, + ], + // The ESM build imports its own .css files, which Node's loader cannot + // handle, so it has to be bundled rather than externalised for SSR. + noExternal: ["@primer/react-brand"], + }, build: { - // Production sourcemaps trigger a known warning in the expressive-code Vite plugin. - // The docs site does not need emitted JS sourcemaps for its validation build. sourcemap: false, - // Starlight ships large syntax-highlighting chunks that are expected for this site. - // Raise the threshold so Vite only warns on materially larger regressions. chunkSizeWarningLimit: 900, }, css: { diff --git a/website/package-lock.json b/website/package-lock.json index 5109d345..99e6e5ab 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -10,20 +10,26 @@ "license": "MIT", "dependencies": { "@astrojs/markdown-remark": "^7.2.0", + "@astrojs/react": "^6.0.2", "@astrojs/sitemap": "^3.7.2", - "@astrojs/starlight": "^0.41.1", + "@primer/octicons-react": "^19.33.0", + "@primer/react-brand": "^0.72.1-rc.c5f3a3b5", "astro": "^7.3.2", "choices.js": "^11.2.2", + "clsx": "^2.1.1", "front-matter": "^4.0.2", "gray-matter": "^4.0.3", "isomorphic-dompurify": "^2.36.0", "jszip": "^3.10.1", "marked": "^18.0.2", + "react": "^19.2.8", + "react-dom": "^19.2.8", "remark-github-admonitions-to-directives": "^2.1.0", "shiki": "^4.0.2" }, "devDependencies": { "axe-core": "^4.10.2", + "pagefind": "^1.5.2", "playwright": "^1.49.0" } }, @@ -265,22 +271,6 @@ "node": ">=22.12.0" } }, - "node_modules/@astrojs/internal-helpers": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.10.0.tgz", - "integrity": "sha512-Ry2R3VPeIN4uPCSA4xQc+e+vsJXkalKpEbDc07hV+a/o5Bs2N/s/uDcPJH/05L19DKh9tAy7e6JM3YZ6Cxfezw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.4", - "@types/mdast": "^4.0.4", - "js-yaml": "^4.1.1", - "picomatch": "^4.0.4", - "retext-smartypants": "^6.2.0", - "shiki": "^4.0.2", - "smol-toml": "^1.6.0", - "unified": "^11.0.5" - } - }, "node_modules/@astrojs/markdown-remark": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-7.3.1.tgz", @@ -327,94 +317,6 @@ "unified": "^11.0.5" } }, - "node_modules/@astrojs/markdown-satteri": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@astrojs/markdown-satteri/-/markdown-satteri-0.3.4.tgz", - "integrity": "sha512-6Lvt/bQZEBW+zzdhPblvfZEy5PGEYJaUsUqaCgwHeRPxZJL1gc9I+DRLKWJjjYTWDzVUTzXlMq4WwSK+X34CVw==", - "license": "MIT", - "dependencies": { - "@astrojs/internal-helpers": "0.10.1", - "@astrojs/prism": "4.0.2", - "github-slugger": "^2.0.0", - "hast-util-from-html": "^2.0.3", - "satteri": "^0.9.1" - } - }, - "node_modules/@astrojs/markdown-satteri/node_modules/@astrojs/internal-helpers": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.10.1.tgz", - "integrity": "sha512-5phcroT/vmOOrYuuAxtkbPixy5hePtlz9i8K4OeDv3dNK6/UQRuXPOSRTxIOBbUY5Sonw2UaxjbuVc43Mcir6Q==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.4", - "@types/mdast": "^4.0.4", - "js-yaml": "^4.1.1", - "picomatch": "^4.0.4", - "retext-smartypants": "^6.2.0", - "shiki": "^4.0.2", - "smol-toml": "^1.6.0", - "unified": "^11.0.5" - } - }, - "node_modules/@astrojs/mdx": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-7.0.0.tgz", - "integrity": "sha512-LKwNA8nnLtEM0auoP6OfH/UnlKe1Ub59qZjbcYkZjPBGw6PkJewWkA/1qwLpECvV6gMDd6TR6eqV9p/VYZrcrQ==", - "license": "MIT", - "dependencies": { - "@astrojs/internal-helpers": "0.10.0", - "@astrojs/markdown-remark": "7.2.0", - "@mdx-js/mdx": "^3.1.1", - "acorn": "^8.16.0", - "es-module-lexer": "^2.0.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.1.0", - "vfile": "^6.0.3" - }, - "engines": { - "node": ">=22.12.0" - }, - "peerDependencies": { - "@astrojs/markdown-satteri": "^0.3.1-alpha.0", - "astro": "^7.0.0-alpha.0" - }, - "peerDependenciesMeta": { - "@astrojs/markdown-satteri": { - "optional": true - } - } - }, - "node_modules/@astrojs/mdx/node_modules/@astrojs/markdown-remark": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-7.2.0.tgz", - "integrity": "sha512-+YxmVQu1Bd+MFfSzjq1rOJvD9+nIOJzz5YIIhdIH01RrxRkKbyKoEgyIqP3yv51MhzMDgd79QaPv+kCVPT8vHw==", - "license": "MIT", - "dependencies": { - "@astrojs/internal-helpers": "0.10.0", - "@astrojs/prism": "4.0.2", - "github-slugger": "^2.0.0", - "hast-util-from-html": "^2.0.3", - "hast-util-to-text": "^4.0.2", - "mdast-util-definitions": "^6.0.0", - "rehype-raw": "^7.0.0", - "rehype-stringify": "^10.0.1", - "remark-gfm": "^4.0.1", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.1.2", - "remark-smartypants": "^3.0.2", - "unified": "^11.0.5", - "unist-util-remove-position": "^5.0.0", - "unist-util-visit": "^5.1.0", - "unist-util-visit-parents": "^6.0.2", - "vfile": "^6.0.3" - } - }, "node_modules/@astrojs/prism": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-4.0.2.tgz", @@ -427,6 +329,44 @@ "node": ">=22.12.0" } }, + "node_modules/@astrojs/react": { + "version": "6.0.5", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@astrojs/react/-/react-6.0.5.tgz", + "integrity": "sha1-qsfXpUuQ0k7fLXiUmnH5uch+OJs=", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.11.0", + "@vitejs/plugin-react": "^5.2.0", + "devalue": "^5.8.1", + "ultrahtml": "^1.6.0", + "vite": "^8.0.13" + }, + "engines": { + "node": ">=22.12.0" + }, + "peerDependencies": { + "@types/react": "^17.0.50 || ^18.0.21 || ^19.0.0", + "@types/react-dom": "^17.0.17 || ^18.0.6 || ^19.0.0", + "react": "^17.0.2 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.2 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@astrojs/react/node_modules/@astrojs/internal-helpers": { + "version": "0.11.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@astrojs/internal-helpers/-/internal-helpers-0.11.0.tgz", + "integrity": "sha1-5bYRnnzBo1IP5D4w0lowthV2u0k=", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.4", + "@types/mdast": "^4.0.4", + "js-yaml": "^4.3.0", + "picomatch": "^4.0.4", + "retext-smartypants": "^6.2.0", + "shiki": "^4.0.2", + "smol-toml": "^1.6.0", + "unified": "^11.0.5" + } + }, "node_modules/@astrojs/sitemap": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.7.2.tgz", @@ -438,52 +378,6 @@ "zod": "^4.3.6" } }, - "node_modules/@astrojs/starlight": { - "version": "0.41.1", - "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.41.1.tgz", - "integrity": "sha512-avf2OmrVg6GdVU18juebjjIIuLa+uS3syHuJ/3yDaEFP/8it+YvcxRrYDSf7K6rC4v770UxIddba2hAqQyTeYA==", - "license": "MIT", - "dependencies": { - "@astrojs/markdown-satteri": "^0.3.2", - "@astrojs/mdx": "^7.0.0", - "@astrojs/sitemap": "^3.7.2", - "@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.44.0", - "bcp-47": "^2.1.0", - "hast-util-from-html": "^2.0.3", - "hast-util-select": "^6.0.4", - "hast-util-to-string": "^3.0.1", - "hastscript": "^9.0.1", - "i18next": "^26.0.7", - "js-yaml": "^4.1.1", - "klona": "^2.0.6", - "magic-string": "^0.30.21", - "mdast-util-directive": "^3.1.0", - "mdast-util-to-markdown": "^2.1.2", - "mdast-util-to-string": "^4.0.0", - "pagefind": "^1.5.2", - "rehype": "^13.0.2", - "rehype-format": "^5.0.1", - "remark-directive": "^4.0.0", - "satteri": "^0.9.1", - "ultrahtml": "^1.6.0", - "unified": "^11.0.5", - "unist-util-visit": "^5.1.0", - "vfile": "^6.0.3" - }, - "peerDependencies": { - "@astrojs/markdown-remark": "^7.2.0", - "astro": "^7.0.2" - }, - "peerDependenciesMeta": { - "@astrojs/markdown-remark": { - "optional": true - } - } - }, "node_modules/@astrojs/telemetry": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.3.tgz", @@ -499,6 +393,166 @@ "node": "18.20.8 || ^20.3.0 || >=22.0.0" } }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha1-8vu/6ofESiFZDsUVt3iywm2IZuc=", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha1-bwI38PNtLlHAVwpjb67Z0tDv5ik=", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha1-gMELFySAgpaLV6hXuRZAlx8gcPc=", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/semver/-/semver-6.3.1.tgz", + "integrity": "sha1-VW0u+GiRRuRtzqS/3QlfNDTf/LQ=", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.8", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha1-SwuIeIVCJkMzngkCIUikxOuqSXk=", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha1-eh3vcEMCQBxH9k+oVYnpdK4hcEI=", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/semver/-/semver-6.3.1.tgz", + "integrity": "sha1-VW0u+GiRRuRtzqS/3QlfNDTf/LQ=", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha1-8EqW+9hHMkGxB5JD9bPwOjAQq3s=", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha1-7yUEilGOgo1zk/rFiC3dc5Idc5Y=", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha1-sGJ0elmXuhOGNyATKLv/d5YFdK4=", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha1-wKB2bxoTYX2KF0B9erj51IYiXqQ=", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-string-parser": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", @@ -517,14 +571,36 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/parser": { + "node_modules/@babel/helper-validator-option": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", - "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha1-zzFb6UAhOzVOtKvMC9Aevj9zvCo=", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha1-Rav951SJl+NDdsPmn+tHXP+0pgc=", "license": "MIT", "dependencies": { + "@babel/template": "^7.29.7", "@babel/types": "^7.29.7" }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha1-llNxai8Qxne5j7xj1L+wAMMCzxc=", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -532,10 +608,72 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/types": { + "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", - "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", + "integrity": "sha1-wkQkUnhYIgYk/Vmlseq0+kE8gDo=", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.29.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", + "integrity": "sha1-XPJaNomQa1ji8KLys3R4nmYnsV8=", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha1-TZ1ABPZFzdME3pWMclFieE7KxwA=", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.8", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha1-QREBTNxxoPldlHGQdZC6oLimsoo=", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha1-Einu8x2FFW1w+j9M2Fk3bQ6vaGM=", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.29.7", @@ -557,119 +695,6 @@ "specificity": "bin/cli.js" } }, - "node_modules/@bruits/satteri-darwin-arm64": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@bruits/satteri-darwin-arm64/-/satteri-darwin-arm64-0.9.4.tgz", - "integrity": "sha512-W3MSUkr2mZRR8Stoe+lqNAyzQzRuFMU8WffV9IvFSxTok0LGWR0ZZQPLELU4QTRiUbhL2Y4VUP9vV7pj8rHjgg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@bruits/satteri-darwin-x64": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@bruits/satteri-darwin-x64/-/satteri-darwin-x64-0.9.4.tgz", - "integrity": "sha512-DXOuuaE1lsv7mpk2mOvGrzqoEWEvOIZEO/fXVa7zfM23Iob+CBjBkRAMwpHA4pmZ3j6Gj7WJzPKw0kQ7w741AQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@bruits/satteri-linux-arm64-gnu": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-arm64-gnu/-/satteri-linux-arm64-gnu-0.9.4.tgz", - "integrity": "sha512-gJxU9rGGoqIznSEgEzpjxkry24jeHuMpoo1tCIAhHYh7WaD3j5F8zt3jmHxEaN1Uwa+K5+wFgIR2uIGOnMzEmw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@bruits/satteri-linux-arm64-musl": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-arm64-musl/-/satteri-linux-arm64-musl-0.9.4.tgz", - "integrity": "sha512-Wjzu9hmmAbfmDkBfPI1VdZygJtYz9uYZQnkEyrXi6S2JFi+2pXQ1A5irj38bqm0IZmWcTbk0cVG4NZnPdtVNJA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@bruits/satteri-linux-x64-gnu": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-x64-gnu/-/satteri-linux-x64-gnu-0.9.4.tgz", - "integrity": "sha512-MR1Q+wMx65FQlbSV7cRqWW87Knp0zkoaIV55Dt+xZl028wJABXEPEEmG3670SLq7lVZvcGIDwCgSg2kCYxvRwA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@bruits/satteri-linux-x64-musl": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-x64-musl/-/satteri-linux-x64-musl-0.9.4.tgz", - "integrity": "sha512-T4gxhXve3zyNAZesrXAd/rDZOGRkbfFIUFld4TGsw6BsjoIteCcDji6IMqeXyaWEVSykY2X8Eid2hr6aXGYAaw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@bruits/satteri-wasm32-wasi": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@bruits/satteri-wasm32-wasi/-/satteri-wasm32-wasi-0.9.4.tgz", - "integrity": "sha512-/CEG8LUlpaBEnhFnYVn0UnlHFLs51UhrkJBUPDUXLzkadzAcnR88iRA/nOl7Zwhjb4WhfBV4p3P5qeOJMtH0iA==", - "cpu": [ - "wasm32" - ], - "optional": true, - "dependencies": { - "@emnapi/core": "1.11.1", - "@emnapi/runtime": "1.11.1", - "@napi-rs/wasm-runtime": "^1.1.6" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@bruits/satteri-win32-arm64-msvc": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@bruits/satteri-win32-arm64-msvc/-/satteri-win32-arm64-msvc-0.9.4.tgz", - "integrity": "sha512-E1ZPQbgCtFKiU7pFYVndynvY7ne4coeVDUgnVThErSFlJ2ceQCBZrfRTD1lzrIDy63Bbqo+g/cZY9duw+JYjIw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@bruits/satteri-win32-x64-msvc": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@bruits/satteri-win32-x64-msvc/-/satteri-win32-x64-msvc-0.9.4.tgz", - "integrity": "sha512-5I7SiarsNdAUuhJb50CXJPTwr/ECVrBoU+fymoLjChK5fW//+srhY4lstcNTzgFRtQSYfVtm4OQZz16CVMeTeA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@capsizecss/unpack": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-4.0.1.tgz", @@ -844,15 +869,6 @@ "node": ">=20.19.0" } }, - "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/core": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", @@ -1317,51 +1333,6 @@ } } }, - "node_modules/@expressive-code/core": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@expressive-code/core/-/core-0.44.0.tgz", - "integrity": "sha512-xgiF2P6tYUbrhi3+x0S8xHZWT1t3Bvb3U91tAtRbLb9HLejLvYc5GZUqKICKLaUN4iSGhhNJu2fM/aH8e5yCMg==", - "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.44.0", - "resolved": "https://registry.npmjs.org/@expressive-code/plugin-frames/-/plugin-frames-0.44.0.tgz", - "integrity": "sha512-V6M6+zVc1GzqCvXkQHc2m5rcFOIVzJgMq5gnfrMnVf2gwtj/sg4H93c1f/mGeqHycubwkHFUDyParAOiGeDZeA==", - "license": "MIT", - "dependencies": { - "@expressive-code/core": "^0.44.0" - } - }, - "node_modules/@expressive-code/plugin-shiki": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@expressive-code/plugin-shiki/-/plugin-shiki-0.44.0.tgz", - "integrity": "sha512-RZsdaqlbGqyAQKuoX4myQXxjmiE2l5KBpJ/gKPh62tCdIdpWyjbzVqSo8+5XsezZxkfi8AJ/J6EUaBTPROFX/Q==", - "license": "MIT", - "dependencies": { - "@expressive-code/core": "^0.44.0", - "shiki": "^4.0.2" - } - }, - "node_modules/@expressive-code/plugin-text-markers": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@expressive-code/plugin-text-markers/-/plugin-text-markers-0.44.0.tgz", - "integrity": "sha512-0/m3A5b+lz2upyNq+wzZ1S69HRoJmyFs5LsR42lVZ9pmGRlBiSBYQpvqlji4DBj1+Riamxc0AvcCr5kuzOQeWA==", - "license": "MIT", - "dependencies": { - "@expressive-code/core": "^0.44.0" - } - }, "node_modules/@img/colour": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", @@ -1921,12 +1892,51 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha1-Y0Khn0Q0dRjJPkOxrGnes8Rlah8=", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha1-N1xHbRlylHhRuh4Vro8SMEdEWqE=", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha1-eg7mAfYPmaIMfHxf8MgDiMEYm9Y=", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", "license": "MIT" }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha1-2xXWeByTHzolGj2sOVAcmKYIL9A=", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@mdx-js/mdx": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", @@ -1985,6 +1995,12 @@ "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4" } }, + "node_modules/@oddbird/popover-polyfill": { + "version": "0.5.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@oddbird/popover-polyfill/-/popover-polyfill-0.5.2.tgz", + "integrity": "sha1-mhQsrlS25IgkvsYelOOVQcl0a2k=", + "license": "BSD-3-Clause" + }, "node_modules/@oslojs/encoding": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz", @@ -2007,6 +2023,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2020,18 +2037,13 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" ] }, - "node_modules/@pagefind/default-ui": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@pagefind/default-ui/-/default-ui-1.5.2.tgz", - "integrity": "sha512-pm1LMnQg8N2B3n2TnjKlhaFihpz6zTiA4HiGQ6/slKO/+8K9CAU5kcjdSSPgpuk1PMuuN4hxLipUIifnrkl3Sg==", - "license": "MIT" - }, "node_modules/@pagefind/freebsd-x64": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/@pagefind/freebsd-x64/-/freebsd-x64-1.5.2.tgz", @@ -2039,6 +2051,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2052,6 +2065,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2065,6 +2079,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2078,6 +2093,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2091,12 +2107,59 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ] }, + "node_modules/@primer/behaviors": { + "version": "1.10.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@primer/behaviors/-/behaviors-1.10.3.tgz", + "integrity": "sha1-/TNGsj+14V5M5gWQs111CqrqYWg=", + "license": "MIT" + }, + "node_modules/@primer/octicons-react": { + "version": "19.33.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@primer/octicons-react/-/octicons-react-19.33.0.tgz", + "integrity": "sha1-XWqIDIAMgpaJiA57PfPesrc1+fs=", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": ">=16.3" + } + }, + "node_modules/@primer/react-brand": { + "version": "0.72.1-rc.c5f3a3b5", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@primer/react-brand/-/react-brand-0.72.1-rc.c5f3a3b5.tgz", + "integrity": "sha1-yZSBmtUQOMVkcn7FQMTD/ByqdSo=", + "license": "MIT", + "dependencies": { + "@oddbird/popover-polyfill": "0.5.2", + "@primer/behaviors": "^1.8.2" + }, + "engines": { + "node": ">=24.0.0", + "npm": ">=8.0.0" + }, + "peerDependencies": { + "@types/react": ">=18 <20", + "@types/react-dom": ">=18 <20", + "react": ">=18 <20", + "react-dom": ">=18 <20" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@rolldown/binding-android-arm64": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.3.tgz", @@ -2455,6 +2518,47 @@ "tslib": "^2.4.0" } }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha1-PfFfJ7qFMZyqB7oI0HIYibs5wBc=", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha1-tYGSlMUReZV6+uw0FEL5NB5BCKk=", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha1-VnJRNwHBshmbxtrWNqnXSRWGdm8=", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha1-B9cT1szg0mXJhJ2wy+YtP2Hzb3Q=", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, "node_modules/@types/debug": { "version": "4.1.13", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", @@ -2488,12 +2592,6 @@ "@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", @@ -2533,6 +2631,26 @@ "undici-types": "~7.16.0" } }, + "node_modules/@types/react": { + "version": "19.2.18", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/react/-/react-19.2.18.tgz", + "integrity": "sha1-6wtqH7Y10alpLV+Eo0lb2K0VNwc=", + "license": "MIT", + "peer": true, + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/react-dom/-/react-dom-19.2.7.tgz", + "integrity": "sha1-66ePxiAeVkmG7EDVbIbIQ0WTys4=", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, "node_modules/@types/sax": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", @@ -2561,6 +2679,32 @@ "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "license": "ISC" }, + "node_modules/@vitejs/plugin-react": { + "version": "5.2.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@vitejs/plugin-react/-/plugin-react-5.2.0.tgz", + "integrity": "sha1-EIvQ9WbyiM41Zpgt9O/xN97XsV8=", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.29.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-rc.3", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.18.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@vitejs/plugin-react/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.3.tgz", + "integrity": "sha1-iojMkqD3Qb78e8EJyxpMa5QI4cU=", + "license": "MIT" + }, "node_modules/acorn": { "version": "8.17.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", @@ -2752,19 +2896,6 @@ } } }, - "node_modules/astro-expressive-code": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/astro-expressive-code/-/astro-expressive-code-0.44.0.tgz", - "integrity": "sha512-b1wN/ZvbJprzxlGKIpIes2kQrCY5KRLwys2tWbZAZyjGZcW5ZtgneZnBwzNRiBna9/48d4mQl19KLjcRuhO1hw==", - "license": "MIT", - "dependencies": { - "rehype-expressive-code": "^0.44.0", - "url-extras": "^0.1.0" - }, - "peerDependencies": { - "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta || ^7.0.0" - } - }, "node_modules/astro/node_modules/@astrojs/internal-helpers": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.11.0.tgz", @@ -2988,29 +3119,16 @@ "url": "https://github.com/sponsors/wooorm" } }, - "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" + "node_modules/baseline-browser-mapping": { + "version": "2.11.21", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/baseline-browser-mapping/-/baseline-browser-mapping-2.11.21.tgz", + "integrity": "sha1-ma9zy45UAH5PU0XhMieOJsJmLyw=", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" }, - "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" + "engines": { + "node": ">=6.0.0" } }, "node_modules/bidi-js": { @@ -3028,6 +3146,59 @@ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "license": "ISC" }, + "node_modules/browserslist": { + "version": "4.28.9", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/browserslist/-/browserslist-4.28.9.tgz", + "integrity": "sha1-B85rRJuQr4gOub+3zTk3LMT3HIw=", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.11.20", + "caniuse-lite": "^1.0.30001810", + "electron-to-chromium": "^1.5.420", + "node-releases": "^2.0.54", + "update-browserslist-db": "^1.3.2" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001810", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", + "integrity": "sha1-SXC0d96jJ4N03pvEOqj105/DzaI=", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, "node_modules/ccount": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", @@ -3164,6 +3335,12 @@ "node": ">= 18" } }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha1-S1YPZJ/E6RjdCrdc9JYei8iC2Co=", + "license": "MIT" + }, "node_modules/cookie": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-2.0.1.tgz", @@ -3214,22 +3391,6 @@ "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.2.1", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", @@ -3255,18 +3416,6 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/csso": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", @@ -3315,6 +3464,13 @@ "node": ">=20" } }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha1-7EjA8+mT5QZIyG2lWeJhCZXPmJo=", + "license": "MIT", + "peer": true + }, "node_modules/data-urls": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz", @@ -3422,19 +3578,6 @@ "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/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -3520,6 +3663,12 @@ "node": ">=4" } }, + "node_modules/electron-to-chromium": { + "version": "1.5.422", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/electron-to-chromium/-/electron-to-chromium-1.5.422.tgz", + "integrity": "sha1-4n+xyg5r72EqZHAi4UaXAf6p7h8=", + "license": "ISC" + }, "node_modules/entities": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", @@ -3611,6 +3760,15 @@ "@esbuild/win32-x64": "0.28.1" } }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha1-ARo/aYVroYnf+n3I/M6Z0qh5A+U=", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", @@ -3733,18 +3891,6 @@ "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", "license": "MIT" }, - "node_modules/expressive-code": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/expressive-code/-/expressive-code-0.44.0.tgz", - "integrity": "sha512-JXVWVNCKlLuZLMQH8cOiDUSosT0Bb+elwE/dbAkpwFwDFmyFyWlECoWZIohh2FkIF1iI67TQJ+Ts9k7oNDh2qA==", - "license": "MIT", - "dependencies": { - "@expressive-code/core": "^0.44.0", - "@expressive-code/plugin-frames": "^0.44.0", - "@expressive-code/plugin-shiki": "^0.44.0", - "@expressive-code/plugin-text-markers": "^0.44.0" - } - }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -3901,6 +4047,15 @@ "url": "https://github.com/sponsors/krisk" } }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha1-MqbudsPX9S1GsrGuXZP+qFgKJeA=", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/get-tsconfig": { "version": "5.0.0-beta.4", "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-5.0.0-beta.4.tgz", @@ -3976,39 +4131,6 @@ "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", @@ -4047,32 +4169,6 @@ "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", @@ -4086,23 +4182,6 @@ "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", @@ -4116,23 +4195,6 @@ "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", @@ -4158,33 +4220,6 @@ "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", @@ -4282,19 +4317,6 @@ "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", @@ -4369,16 +4391,6 @@ "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", @@ -4411,34 +4423,6 @@ "node": ">= 14" } }, - "node_modules/i18next": { - "version": "26.3.3", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-26.3.3.tgz", - "integrity": "sha512-aYVegyBdXSO93CMMihvr47jI7GHSOcIahMpJX+qzUXDzW4xDJf2uenIA+45vDU+YhiVdcfsql70AC9RVdMNrHg==", - "funding": [ - { - "type": "individual", - "url": "https://www.locize.com/i18next" - }, - { - "type": "individual", - "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" - }, - { - "type": "individual", - "url": "https://www.locize.com" - } - ], - "license": "MIT", - "peerDependencies": { - "typescript": "^5 || ^6" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/immediate": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", @@ -4571,6 +4555,12 @@ "node": ">=20.19.5" } }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=", + "license": "MIT" + }, "node_modules/js-yaml": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", @@ -4657,6 +4647,30 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha1-dNM1ojT2ftGZB/2t+sfM+dQJgl0=", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/json5/-/json5-2.2.3.tgz", + "integrity": "sha1-eM1vGhm9wStz21rQxh79ZsHikoM=", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/jsonc-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", @@ -4684,15 +4698,6 @@ "node": ">=0.10.0" } }, - "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", @@ -4970,15 +4975,6 @@ "node": "20 || >=22" } }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, "node_modules/magicast": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.3.tgz", @@ -5422,25 +5418,6 @@ "micromark-util-types": "^2.0.0" } }, - "node_modules/micromark-extension-directive": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-4.0.0.tgz", - "integrity": "sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==", - "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", @@ -6156,6 +6133,15 @@ "integrity": "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==", "license": "MIT" }, + "node_modules/node-releases": { + "version": "2.0.54", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/node-releases/-/node-releases-2.0.54.tgz", + "integrity": "sha1-Ca8X1WR6qfIh7FzyvsuVtoqYGv4=", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -6277,6 +6263,7 @@ "version": "1.5.2", "resolved": "https://registry.npmjs.org/pagefind/-/pagefind-1.5.2.tgz", "integrity": "sha512-XTUaK0hXMCu2jszWE584JGQT7y284TmMV9l/HX3rnG5uo3rHI/uHU56XTyyyPFjeWEBxECbAi0CaFDJOONtG0Q==", + "dev": true, "license": "MIT", "bin": { "pagefind": "lib/runner/bin.cjs" @@ -6451,44 +6438,6 @@ "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.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz", - "integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==", - "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", @@ -6538,6 +6487,36 @@ "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", "license": "MIT" }, + "node_modules/react": { + "version": "19.2.8", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/react/-/react-19.2.8.tgz", + "integrity": "sha1-qAZj27WNacb+P9KR08syTop9/y0=", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.8", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha1-O0a57tqHfN/yzxPSdw//SuNsLsI=", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.8" + } + }, + "node_modules/react-refresh": { + "version": "0.18.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/react-refresh/-/react-refresh-0.18.0.tgz", + "integrity": "sha1-Lc6X9P6TKk2BQvoWMOR1wXKcgGI=", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -6657,60 +6636,6 @@ "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", "license": "MIT" }, - "node_modules/rehype": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.2.tgz", - "integrity": "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "rehype-parse": "^9.0.0", - "rehype-stringify": "^10.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-expressive-code": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/rehype-expressive-code/-/rehype-expressive-code-0.44.0.tgz", - "integrity": "sha512-5r74C5F2sMR3X+QJH8OKWgZBO/cqRw5W1fLT6GVlSfLqepk+4j8tGFkyPqZYWjwntsBHzKPDH2zI68sZ7ScLfA==", - "license": "MIT", - "dependencies": { - "expressive-code": "^0.44.0" - } - }, - "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", - "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-from-html": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/rehype-raw": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", @@ -6756,22 +6681,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/remark-directive": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-4.0.0.tgz", - "integrity": "sha512-7sxn4RfF1o3izevPV1DheyGDD6X4c9hrGpfdUpm7uC++dqrnJxIZVkk7CoKqcLm0VUMAuOol7Mno3m6g8cfMuA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-directive": "^3.0.0", - "micromark-extension-directive": "^4.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", @@ -7000,28 +6909,6 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "license": "MIT" }, - "node_modules/satteri": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/satteri/-/satteri-0.9.4.tgz", - "integrity": "sha512-BKob126Tay84diOZsnVNH/Q/c+3njPJTCad3w5zLKa6j8bVjxskPNHDtxrMwYK4bN/RlqUSdMnPwKY4k65EMOQ==", - "dependencies": { - "@types/estree-jsx": "^1.0.5", - "@types/hast": "^3.0.4", - "@types/mdast": "^4.0.4", - "@types/unist": "^3.0.3" - }, - "optionalDependencies": { - "@bruits/satteri-darwin-arm64": "0.9.4", - "@bruits/satteri-darwin-x64": "0.9.4", - "@bruits/satteri-linux-arm64-gnu": "0.9.4", - "@bruits/satteri-linux-arm64-musl": "0.9.4", - "@bruits/satteri-linux-x64-gnu": "0.9.4", - "@bruits/satteri-linux-x64-musl": "0.9.4", - "@bruits/satteri-wasm32-wasi": "0.9.4", - "@bruits/satteri-win32-arm64-msvc": "0.9.4", - "@bruits/satteri-win32-x64-msvc": "0.9.4" - } - }, "node_modules/sax": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz", @@ -7043,6 +6930,12 @@ "node": ">=v12.22.7" } }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha1-DE74LWfR5cHjWej8dtOofwRf5b0=", + "license": "MIT" + }, "node_modules/section-matter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", @@ -7714,16 +7607,34 @@ } } }, - "node_modules/url-extras": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/url-extras/-/url-extras-0.1.0.tgz", - "integrity": "sha512-8tzwTeXFPuX/5PHuCDQE5Dd9Ts4rwoq2t9aIT+HS4iAVpmj5l4Ao7Q+BuuFjvWRqrLswBhQDk8O96ZicgCqQqw==", + "node_modules/update-browserslist-db": { + "version": "1.3.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/update-browserslist-db/-/update-browserslist-db-1.3.2.tgz", + "integrity": "sha1-nZn7/1bFC7Ebpf01zs5ZFtpZWDY=", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", - "engines": { - "node": ">=20" + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, "node_modules/util-deprecate": { @@ -7945,6 +7856,12 @@ "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==", "license": "MIT" }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=", + "license": "ISC" + }, "node_modules/yargs-parser": { "version": "22.0.0", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", diff --git a/website/package.json b/website/package.json index 5b976841..150f8aff 100644 --- a/website/package.json +++ b/website/package.json @@ -20,20 +20,35 @@ "license": "MIT", "dependencies": { "@astrojs/markdown-remark": "^7.2.0", + "@astrojs/react": "^6.0.2", "@astrojs/sitemap": "^3.7.2", - "@astrojs/starlight": "^0.41.1", + "@primer/octicons-react": "^19.33.0", + "@primer/react-brand": "^0.72.1-rc.c5f3a3b5", "astro": "^7.3.2", "choices.js": "^11.2.2", + "clsx": "^2.1.1", "front-matter": "^4.0.2", "gray-matter": "^4.0.3", "isomorphic-dompurify": "^2.36.0", "jszip": "^3.10.1", "marked": "^18.0.2", + "react": "^19.2.8", + "react-dom": "^19.2.8", "remark-github-admonitions-to-directives": "^2.1.0", "shiki": "^4.0.2" }, "devDependencies": { "axe-core": "^4.10.2", + "pagefind": "^1.5.2", "playwright": "^1.49.0" + }, + "overrides": { + "js-yaml": "^4.3.2", + "front-matter": { + "js-yaml": "^3.15.2" + }, + "gray-matter": { + "js-yaml": "^3.15.2" + } } } diff --git a/website/public/images/favicon.svg b/website/public/images/favicon.svg index 0411bb16..998ae699 100755 --- a/website/public/images/favicon.svg +++ b/website/public/images/favicon.svg @@ -1,9 +1,15 @@ + - - - + + + diff --git a/website/public/images/learning-hub/github-copilot-app/copilot-app-centralized-inbox-poster.webp b/website/public/images/learning-hub/github-copilot-app/copilot-app-centralized-inbox-poster.webp new file mode 100644 index 00000000..6b469566 Binary files /dev/null and b/website/public/images/learning-hub/github-copilot-app/copilot-app-centralized-inbox-poster.webp differ diff --git a/website/public/images/learning-hub/github-copilot-app/copilot-app-delegate-to-agents.webp b/website/public/images/learning-hub/github-copilot-app/copilot-app-delegate-to-agents.webp new file mode 100644 index 00000000..854ced8b Binary files /dev/null and b/website/public/images/learning-hub/github-copilot-app/copilot-app-delegate-to-agents.webp differ diff --git a/website/public/images/learning-hub/using-automations-in-copilot-app/copilot-app-delegate-to-agents.webp b/website/public/images/learning-hub/using-automations-in-copilot-app/copilot-app-delegate-to-agents.webp new file mode 100644 index 00000000..854ced8b Binary files /dev/null and b/website/public/images/learning-hub/using-automations-in-copilot-app/copilot-app-delegate-to-agents.webp differ diff --git a/website/public/images/learning-hub/working-with-canvas-extensions/canvases-light.webp b/website/public/images/learning-hub/working-with-canvas-extensions/canvases-light.webp new file mode 100644 index 00000000..75689023 Binary files /dev/null and b/website/public/images/learning-hub/working-with-canvas-extensions/canvases-light.webp differ diff --git a/website/public/media/automations-dark.webp b/website/public/media/automations-dark.webp new file mode 100644 index 00000000..52c995fe Binary files /dev/null and b/website/public/media/automations-dark.webp differ diff --git a/website/public/media/automations-light.webp b/website/public/media/automations-light.webp new file mode 100644 index 00000000..9a3036b0 Binary files /dev/null and b/website/public/media/automations-light.webp differ diff --git a/website/public/media/brand-divider-copilot-jumping.webp b/website/public/media/brand-divider-copilot-jumping.webp new file mode 100644 index 00000000..7664533b Binary files /dev/null and b/website/public/media/brand-divider-copilot-jumping.webp differ diff --git a/website/public/media/brand-divider-copilot-sitting.webp b/website/public/media/brand-divider-copilot-sitting.webp new file mode 100644 index 00000000..679197eb Binary files /dev/null and b/website/public/media/brand-divider-copilot-sitting.webp differ diff --git a/website/public/media/canvases-dark.webp b/website/public/media/canvases-dark.webp new file mode 100644 index 00000000..9ba4c831 Binary files /dev/null and b/website/public/media/canvases-dark.webp differ diff --git a/website/public/media/canvases-light.webp b/website/public/media/canvases-light.webp new file mode 100644 index 00000000..75689023 Binary files /dev/null and b/website/public/media/canvases-light.webp differ diff --git a/website/public/media/cli-for-beginners-intro.mp4 b/website/public/media/cli-for-beginners-intro.mp4 new file mode 100644 index 00000000..4e5bfe5c Binary files /dev/null and b/website/public/media/cli-for-beginners-intro.mp4 differ diff --git a/website/public/media/copilot-app-centralized-inbox-poster.webp b/website/public/media/copilot-app-centralized-inbox-poster.webp new file mode 100644 index 00000000..6b469566 Binary files /dev/null and b/website/public/media/copilot-app-centralized-inbox-poster.webp differ diff --git a/website/public/media/copilot-app-delegate-to-agents.webp b/website/public/media/copilot-app-delegate-to-agents.webp new file mode 100644 index 00000000..854ced8b Binary files /dev/null and b/website/public/media/copilot-app-delegate-to-agents.webp differ diff --git a/website/public/media/desktop-app-light.webp b/website/public/media/desktop-app-light.webp new file mode 100644 index 00000000..77835a18 Binary files /dev/null and b/website/public/media/desktop-app-light.webp differ diff --git a/website/public/media/desktop-app.webp b/website/public/media/desktop-app.webp new file mode 100644 index 00000000..21569d39 Binary files /dev/null and b/website/public/media/desktop-app.webp differ diff --git a/website/public/media/dither-dark.webp b/website/public/media/dither-dark.webp new file mode 100644 index 00000000..dff98001 Binary files /dev/null and b/website/public/media/dither-dark.webp differ diff --git a/website/public/media/dither-light.webp b/website/public/media/dither-light.webp new file mode 100644 index 00000000..71ee7b67 Binary files /dev/null and b/website/public/media/dither-light.webp differ diff --git a/website/public/media/duck-progress.svg b/website/public/media/duck-progress.svg new file mode 100644 index 00000000..61252b14 --- /dev/null +++ b/website/public/media/duck-progress.svg @@ -0,0 +1,3 @@ + + + diff --git a/website/public/media/fundamentals-light.webp b/website/public/media/fundamentals-light.webp new file mode 100644 index 00000000..248dfcdb Binary files /dev/null and b/website/public/media/fundamentals-light.webp differ diff --git a/website/public/media/fundamentals.webp b/website/public/media/fundamentals.webp new file mode 100644 index 00000000..d76ea005 Binary files /dev/null and b/website/public/media/fundamentals.webp differ diff --git a/website/public/media/reference-dark.webp b/website/public/media/reference-dark.webp new file mode 100644 index 00000000..f076c8f1 Binary files /dev/null and b/website/public/media/reference-dark.webp differ diff --git a/website/public/media/reference-light.webp b/website/public/media/reference-light.webp new file mode 100644 index 00000000..0cd9ea6c Binary files /dev/null and b/website/public/media/reference-light.webp differ diff --git a/website/public/media/terminal-light.webp b/website/public/media/terminal-light.webp new file mode 100644 index 00000000..4dc677a2 Binary files /dev/null and b/website/public/media/terminal-light.webp differ diff --git a/website/public/media/terminal.webp b/website/public/media/terminal.webp new file mode 100644 index 00000000..5e6ebe1e Binary files /dev/null and b/website/public/media/terminal.webp differ diff --git a/website/scripts/a11y-audit.mjs b/website/scripts/a11y-audit.mjs index ac130494..603a8802 100644 --- a/website/scripts/a11y-audit.mjs +++ b/website/scripts/a11y-audit.mjs @@ -28,21 +28,19 @@ const routes = [ '/agents/', '/instructions/', '/skills/', - '/hooks/', - '/workflows/', '/extensions/', '/plugins/', - '/tools/', '/contributors/', - '/learning-hub/cookbook/', + '/learning-hub/', + // Keep a representative Learning Hub article in the matrix so the article + // chassis is audited in addition to the Learning Hub landing page. '/learning-hub/github-copilot-app/', + '/learning-hub/cookbook/', // Representative dedicated detail pages (one per resource type) so the audit // covers the shared detail layout, sidebar, install buttons, and file browser. '/agent/accessibility/', '/instruction/a11y/', '/skill/acquire-codebase-knowledge/', - '/hook/dependency-license-checker/', - '/workflow/daily-issues-report/', '/plugin/accessibility-kanban/', '/extension/accessibility-kanban/', ]; diff --git a/website/src/components/BackToTop.astro b/website/src/components/BackToTop.astro deleted file mode 100644 index d6518283..00000000 --- a/website/src/components/BackToTop.astro +++ /dev/null @@ -1,129 +0,0 @@ ---- -// Back to Top Button Component ---- - - - - - - diff --git a/website/src/components/ContributeCTA.astro b/website/src/components/ContributeCTA.astro deleted file mode 100644 index 70078f29..00000000 --- a/website/src/components/ContributeCTA.astro +++ /dev/null @@ -1,108 +0,0 @@ ---- -interface Props { - resourceType: string; -} - -const { resourceType } = Astro.props; -const contributingUrl = 'https://github.com/github/awesome-copilot/blob/main/CONTRIBUTING.md'; -const newIssueUrl = 'https://github.com/github/awesome-copilot/issues/new'; ---- - -
-
-

Don't see what you're looking for?

-

This collection is community-driven. Share your own {resourceType} to help others get more out of GitHub Copilot.

-
- -
- - - diff --git a/website/src/components/EmbeddedPageData.astro b/website/src/components/EmbeddedPageData.astro deleted file mode 100644 index 61a03455..00000000 --- a/website/src/components/EmbeddedPageData.astro +++ /dev/null @@ -1,19 +0,0 @@ ---- -import { - getEmbeddedDataElementId, - serializeEmbeddedData, -} from "../scripts/embedded-data"; - -interface Props { - filename: string; - data: unknown; -} - -const { filename, data } = Astro.props; ---- - - diff --git a/website/src/components/Footer.astro b/website/src/components/Footer.astro deleted file mode 100644 index ddfdf99f..00000000 --- a/website/src/components/Footer.astro +++ /dev/null @@ -1,257 +0,0 @@ ---- -import EditLink from "@astrojs/starlight/components/EditLink.astro"; -import LastUpdated from "@astrojs/starlight/components/LastUpdated.astro"; -import Pagination from "@astrojs/starlight/components/Pagination.astro"; -import config from "virtual:starlight/user-config"; -import { Icon } from "@astrojs/starlight/components"; -import ThemeToggle from "./ThemeToggle.astro"; -const currentYear = new Date().getFullYear(); ---- - - - - - - diff --git a/website/src/components/Head.astro b/website/src/components/Head.astro deleted file mode 100644 index 53ded830..00000000 --- a/website/src/components/Head.astro +++ /dev/null @@ -1,116 +0,0 @@ ---- -import Default from '@astrojs/starlight/components/Head.astro'; -const { head, entry } = Astro.locals.starlightRoute; -const basePath = import.meta.env.BASE_URL; - -const getMetaContent = (key: string, attribute: 'name' | 'property' = 'name') => - head.find((tag) => tag.tag === 'meta' && tag.attrs?.[attribute] === key)?.attrs?.content; - -const getLinkHref = (rel: string) => - head.find((tag) => tag.tag === 'link' && tag.attrs?.rel === rel)?.attrs?.href; - -const twitterTitle = entry.data.title; -const description = - entry.data.description ?? - getMetaContent('description') ?? - getMetaContent('og:description', 'property'); -const canonicalUrl = - getLinkHref('canonical') ?? getMetaContent('og:url', 'property'); -const socialImageUrl = - getMetaContent('twitter:image') ?? getMetaContent('og:image', 'property'); -const socialImageAlt = - getMetaContent('twitter:image:alt') ?? - getMetaContent('og:image:alt', 'property') ?? - description; -const socialImageType = socialImageUrl?.endsWith('.png') - ? 'image/png' - : socialImageUrl?.endsWith('.jpg') || socialImageUrl?.endsWith('.jpeg') - ? 'image/jpeg' - : socialImageUrl?.endsWith('.webp') - ? 'image/webp' - : undefined; - -const twitterDomain = - canonicalUrl && URL.canParse(canonicalUrl) - ? new URL(canonicalUrl).hostname - : undefined; -const contentSecurityPolicy = [ - "default-src 'self'", - "base-uri 'self'", - "object-src 'none'", - "form-action 'none'", - "script-src 'self' 'unsafe-inline' 'wasm-unsafe-eval' https://analytics.githubassets.com", - "style-src 'self' 'unsafe-inline'", - "img-src 'self' data: https:", - "font-src 'self' data:", - "connect-src 'self' https://raw.githubusercontent.com https://collector.githubapp.com", - "worker-src 'self' blob:", - "upgrade-insecure-requests", -].join("; "); ---- - - - - -{twitterTitle && } -{description && } -{canonicalUrl && } -{twitterDomain && } -{socialImageUrl && } -{socialImageType && } -{socialImageAlt && } - - - - - -{import.meta.env.PROD && ( - <> - - - -)} diff --git a/website/src/components/Icon.astro b/website/src/components/Icon.astro deleted file mode 100644 index 4ffcc2bc..00000000 --- a/website/src/components/Icon.astro +++ /dev/null @@ -1,120 +0,0 @@ ---- -// Icon component with SVG icons -// Icons are either fill-based (from GitHub Primer) or stroke-based (custom) -// GitHub Primer icons are sourced from https://primer.style/foundations/icons/ - -export interface Props { - name: 'agents' | 'instructions' | 'skills' | 'hooks' | 'workflows' | 'plugins' | 'tools' | 'learning' | 'close' | 'copy' | 'download' | 'share' | 'external' | 'plus' | 'search' | 'chevron-down' | 'document' | 'lightning' | 'hook' | 'workflow' | 'plug' | 'wrench' | 'book' | 'robot' | 'sync'; - size?: number; - class?: string; -} - -const { name, size = 24, class: className = '' } = Astro.props; - -// Icon definitions: { path: SVG path(s), fill: true for fill-based icons } -const icons: Record = { - // Resource type icons - using GitHub Primer icons where available - - // Agent icon - using GitHub Primer's agent-24 (sparkle over workflow) - // Source: https://primer.style/foundations/icons/agent-24 - 'robot': { - fill: true, - path: `` - }, - - // Document icon - custom stroke-based - 'document': { - path: `` - }, - - // Lightning icon - custom stroke-based (for skills) - 'lightning': { - path: `` - }, - - // Hook icon - using GitHub Primer's sync-24 (represents hooks/iterations) - // Source: https://primer.style/foundations/icons/sync-24 - 'hook': { - fill: true, - path: `` - }, - - // Workflow icon - using GitHub Primer's workflow-24 - // Source: https://primer.style/foundations/icons/workflow-24 - // Also used by https://github.github.com/gh-aw/ - 'workflow': { - fill: true, - path: `` - }, - - // Plug icon - using GitHub Primer's plug-24 - // Source: https://primer.style/foundations/icons/plug-24 - 'plug': { - fill: true, - path: `` - }, - - // Wrench icon - custom stroke-based (for tools) - 'wrench': { - path: `` - }, - - // Book icon - custom stroke-based (for learning) - 'book': { - path: `` - }, - - // Action icons - all custom stroke-based - 'close': { - path: `` - }, - - 'copy': { - path: `` - }, - - 'download': { - path: `` - }, - - 'share': { - path: `` - }, - - 'external': { - path: `` - }, - - 'plus': { - path: `` - }, - - 'search': { - path: `` - }, - - 'chevron-down': { - path: `` - }, - - // Alias for hook - same as 'hook' - 'sync': { - fill: true, - path: `` - }, -}; - -const iconData = icons[name] || { path: '' }; -const isFill = iconData.fill ?? false; -const iconPath = iconData.path; ---- - - \ No newline at end of file diff --git a/website/src/components/LanguageSelect.astro b/website/src/components/LanguageSelect.astro deleted file mode 100644 index 7d930795..00000000 --- a/website/src/components/LanguageSelect.astro +++ /dev/null @@ -1,40 +0,0 @@ ---- -// Custom override of Starlight's LanguageSelect. -// -// By default Starlight renders the language dropdown on every page as soon as -// more than one locale is configured. Most of this site's docs are English-only, -// so we only want the picker to appear on pages that actually have a translation -// in a non-English locale. This override checks the docs collection for a -// translated version of the current page and renders the stock picker only when -// one exists; otherwise it renders nothing (no dropdown). -import Default from "@astrojs/starlight/components/LanguageSelect.astro"; -import config from "virtual:starlight/user-config"; -import { getCollection } from "astro:content"; - -// Locale directory names configured for the site, excluding the English root. -const localeCodes = Object.keys(config.locales ?? {}).filter( - (code) => code !== "root" -); - -/** Strip a leading `/` segment from a docs entry id, if present. */ -function baseSlug(id) { - const [first, ...rest] = id.split("/"); - return localeCodes.includes(first) ? rest.join("/") : id; -} - -// Set of base slugs (locale-stripped) that have at least one non-English -// translation available in the docs collection. -const docs = await getCollection("docs"); -const translatedBaseSlugs = new Set(); -for (const entry of docs) { - const [first, ...rest] = entry.id.split("/"); - if (localeCodes.includes(first)) { - translatedBaseSlugs.add(rest.join("/")); - } -} - -const currentBaseSlug = baseSlug(Astro.locals.starlightRoute.id); -const hasTranslations = translatedBaseSlugs.has(currentBaseSlug); ---- - -{hasTranslations && } diff --git a/website/src/components/PageHeader.astro b/website/src/components/PageHeader.astro deleted file mode 100644 index 4719267a..00000000 --- a/website/src/components/PageHeader.astro +++ /dev/null @@ -1,38 +0,0 @@ ---- -import Icon from './Icon.astro'; - -interface Props { - title: string; - description: string; - icon?: 'robot' | 'document' | 'lightning' | 'hook' | 'workflow' | 'plug' | 'wrench' | 'book'; -} - -const { title, description, icon } = Astro.props; -const contributingUrl = 'https://github.com/github/awesome-copilot/blob/main/CONTRIBUTING.md'; ---- - - - - diff --git a/website/src/components/Search.astro b/website/src/components/Search.astro deleted file mode 100644 index 6a34da31..00000000 --- a/website/src/components/Search.astro +++ /dev/null @@ -1,516 +0,0 @@ ---- -import Icon from './Icon.astro'; -import project from 'virtual:starlight/project-context'; - -const pagefindTranslations = { - placeholder: Astro.locals.t('search.label'), - ...Object.fromEntries( - Object.entries(Astro.locals.t.all()) - .filter(([key]) => key.startsWith('pagefind.')) - .map(([key, value]) => [key.replace('pagefind.', ''), value]) - ), -}; - -const dataAttributes: DOMStringMap = { 'data-translations': JSON.stringify(pagefindTranslations) }; -if (project.trailingSlash === 'never') dataAttributes['data-strip-trailing-slash'] = ''; ---- - - - - - -
- { - /* TODO: Make the layout of this button flexible to accommodate different word lengths. Currently hard-coded for English: “Cancel” */ - } - - { - import.meta.env.DEV ? ( -
-

{Astro.locals.t('search.devWarning')}

-
- ) : ( -
- - ) - } -
-
-
- -{ - /** - * This is intentionally inlined to avoid briefly showing an invalid shortcut. - * Purposely using the deprecated `navigator.platform` property to detect Apple devices, as the - * user agent is spoofed by some browsers when opening the devtools. - */ -} - - - - - - - diff --git a/website/src/components/ThemeToggle.astro b/website/src/components/ThemeToggle.astro deleted file mode 100644 index 55077f3a..00000000 --- a/website/src/components/ThemeToggle.astro +++ /dev/null @@ -1,170 +0,0 @@ ---- -// Theme Toggle Component - 3 state slider: Auto | Dark | Light ---- - -
- -
- - - - diff --git a/website/src/components/brand/AgentDetail.tsx b/website/src/components/brand/AgentDetail.tsx new file mode 100644 index 00000000..d94e8676 --- /dev/null +++ b/website/src/components/brand/AgentDetail.tsx @@ -0,0 +1,164 @@ +import { DownloadIcon, MarkGithubIcon, PlusIcon } from "@primer/octicons-react"; +import React from "react"; + +import { ActionMenu, Button } from "@primer/react-brand"; + +import { DetailChassis, type DetailSibling } from "./DetailChassis"; +import { ResourceMeta } from "./ResourceMeta"; +import { pageHref } from "./pageHref"; +import { downloadFile } from "./resourceActions"; +import type { SearchItem } from "./searchIndex"; +import styles from "./styles/dotnet-upgrade.module.css"; + +export type AgentDetailItem = { + id: string; + title: string; + description?: string; + model?: string | string[]; + tools?: string[]; + handoffs?: (string | { label?: string; agent?: string })[]; + mcpServers?: string[]; + path: string; + filename?: string; +}; + +export type AgentDetailProps = { + item: AgentDetailItem; + /** Rendered, sanitized markdown body with heading ids already stamped. */ + markdownHtml: string; + vscodeUrl: string; + insidersUrl: string; + githubUrl: string; + downloadUrl: string; + rawMarkdown: string; + lastUpdated?: string | null; + previous?: DetailSibling; + next?: DetailSibling; + searchIndex?: SearchItem[]; + contributorsTotal?: number; +}; + +export function AgentDetail({ + item, + markdownHtml, + vscodeUrl, + insidersUrl, + githubUrl, + downloadUrl, + rawMarkdown, + lastUpdated, + previous, + next, + searchIndex, + contributorsTotal, +}: AgentDetailProps) { + const models = Array.isArray(item.model) + ? item.model + : item.model + ? [item.model] + : []; + + // Handoffs are recorded as `{ label, agent }` records; the chip shows the + // human label, falling back to the agent id. + const handoffs = (item.handoffs ?? []) + .map((handoff) => + typeof handoff === "string" + ? handoff + : (handoff.label ?? handoff.agent ?? ""), + ) + .filter(Boolean); + + const handleCopyMarkdown = React.useCallback(async () => { + try { + await navigator.clipboard.writeText(rawMarkdown); + } catch { + /* clipboard unavailable */ + } + }, [rawMarkdown]); + + const handleDownload = React.useCallback( + () => downloadFile(downloadUrl, item.filename ?? `${item.id}.agent.md`), + [downloadUrl, item.filename, item.id], + ); + + const install = ( + <> + + + Install + + + + Install in VS Code + + + Install in VS Code Insiders + + void handleDownload()}> + Download file + + + Copy markdown + + + + + + + ); + + return ( + + } + previous={previous} + next={next} + currentPage="agents" + searchIndex={searchIndex} + contributorsTotal={contributorsTotal} + > +
+
+
+
+ ); +} diff --git a/website/src/components/brand/AgentsCatalog.tsx b/website/src/components/brand/AgentsCatalog.tsx new file mode 100644 index 00000000..dfd6d321 --- /dev/null +++ b/website/src/components/brand/AgentsCatalog.tsx @@ -0,0 +1,503 @@ +import { ChevronDownIcon, DownloadIcon, MarkGithubIcon } from "@primer/octicons-react"; +import { + ActionMenu, + Box, + Button, + CTABanner, + Card, + Checkbox, + FormControl, + Grid, + Heading, + Pagination, + Section, + Stack, + Text, + useTheme, +} from "@primer/react-brand"; +import { clsx } from "clsx"; +import { useEffect, useMemo, useRef, useState } from "react"; + +import { PageShell } from "./PageShell"; +import { CatalogSortControl, CATALOG_SORT_OPTIONS } from "./CatalogSortControl"; +import { daysSince, toggleValue, updatedBuckets, updatedBucketOf } from "./catalogFilters"; +import { pageHref } from "./pageHref"; +import { downloadFile } from "./resourceActions"; +import { getScrollBehavior } from "./scrollBehavior"; +import type { SearchItem } from "./searchIndex"; +import styles from "./styles/agents.module.css"; + +const CONTRIBUTE_URL = + "https://github.com/github/awesome-copilot/blob/main/docs/README.agents.md#how-to-contribute"; +const REQUEST_URL = "https://github.com/github/awesome-copilot/issues/new"; + +const RAW_BASE = "https://raw.githubusercontent.com/github/awesome-copilot/main"; +const GITHUB_BASE = "https://github.com/github/awesome-copilot/blob/main"; +const INSTALL_REDIRECT = "https://aka.ms/awesome-copilot/install/agent"; + +/** An agent record as emitted into public/data/agents.json. */ +export type AgentItem = { + id: string; + title: string; + description: string; + model?: unknown; + tools?: string[]; + path: string; + filename: string; + lastUpdated: string; +}; + +/** Filter facets emitted alongside the items in public/data/agents.json. */ +export type AgentFilters = { + models?: unknown[]; + tools?: string[]; +}; + +export const agentSourceUrl = (agent: AgentItem) => `${GITHUB_BASE}/${agent.path}`; + +export const downloadUrl = (agent: AgentItem) => `${RAW_BASE}/${agent.path}`; + +/** + * VS Code deep link, matching the scheme used by the agent detail pages + * (`src/lib/detail-page.ts`): an `aka.ms` redirect wrapping the editor URI. + */ +export const installUrl = (agent: AgentItem, insiders = false) => { + const editor = insiders ? "vscode-insiders" : "vscode"; + const innerUrl = `${editor}:chat-agent/install?url=${encodeURIComponent( + downloadUrl(agent), + )}`; + return `${INSTALL_REDIRECT}?url=${encodeURIComponent(innerUrl)}`; +}; + +const agentDetailHref = (agent: AgentItem) => pageHref(`agent/${agent.id}`); + +/** `model` may be a single name or a list of accepted models. */ +const modelsOf = (agent: AgentItem): string[] => flattenNames(agent.model); + +function flattenNames(value: unknown): string[] { + if (typeof value === "string") return [value]; + if (Array.isArray(value)) return value.flatMap(flattenNames); + return []; +} + +const uniqueSorted = (values: string[]) => + Array.from(new Set(values)).sort((a, b) => a.localeCompare(b)); + +type FilterGroupId = "model" | "tools" | "updated"; + +type FilterState = Record; + +const emptyFilters: FilterState = { model: [], tools: [], updated: [] }; + +type SortMode = "az" | "newest"; + +const PAGE_SIZE = 6; + +/** + * Long facets collapse behind a "Show N more" toggle, matching the prototype's + * extensions page. Real data produces far longer option lists than the + * prototype's hardcoded arrays, so every catalog needs this. + */ +const FILTER_COLLAPSE_LIMIT = 10; + +/** + * The Agents catalog, ported from the design prototype's `agents.tsx`. The + * prototype's hardcoded array and hardcoded model/capability options are + * replaced by build-time data; the layout, filters, and interactions are + * unchanged. + */ +export function AgentsCatalog({ + agents, + filters: dataFilters, + searchIndex, + contributorsTotal, +}: { + agents: AgentItem[]; + filters?: AgentFilters; + searchIndex?: SearchItem[]; + contributorsTotal?: number; +}) { + const { colorMode } = useTheme(); + const [sortMode, setSortMode] = useState("az"); + const [currentPage, setCurrentPage] = useState(1); + const previousPage = useRef(currentPage); + const [mobileFiltersOpen, setMobileFiltersOpen] = useState(false); + const [filters, setFilters] = useState(emptyFilters); + const [expandedGroups, setExpandedGroups] = useState< + Record + >({ model: false, tools: false, updated: false }); + const toggleGroupExpanded = (groupId: FilterGroupId) => { + setExpandedGroups((prev) => ({ ...prev, [groupId]: !prev[groupId] })); + }; + + const filterGroups = useMemo< + { id: FilterGroupId; label: string; options: string[] }[] + >(() => { + const models = dataFilters?.models + ? uniqueSorted(flattenNames(dataFilters.models)) + : uniqueSorted(agents.flatMap(modelsOf)); + const tools = dataFilters?.tools + ? uniqueSorted(dataFilters.tools) + : uniqueSorted(agents.flatMap((agent) => agent.tools ?? [])); + return [ + { id: "model", label: "Model", options: models }, + { id: "tools", label: "Tools", options: tools }, + { + id: "updated", + label: "Last updated", + options: updatedBuckets.map((bucket) => bucket.label), + }, + ]; + }, [agents, dataFilters]); + + const sortedAgents = useMemo(() => { + const copy = agents.filter((agent) => { + const models = modelsOf(agent); + const modelOk = + filters.model.length === 0 || + filters.model.some((model) => models.includes(model)); + const toolsOk = + filters.tools.length === 0 || + filters.tools.every((tool) => (agent.tools ?? []).includes(tool)); + const updatedOk = + filters.updated.length === 0 || + filters.updated.includes(updatedBucketOf(daysSince(agent.lastUpdated))); + return modelOk && toolsOk && updatedOk; + }); + if (sortMode === "newest") { + copy.sort((a, b) => daysSince(a.lastUpdated) - daysSince(b.lastUpdated)); + } else { + copy.sort((a, b) => a.title.localeCompare(b.title)); + } + return copy; + }, [agents, filters, sortMode]); + + const toggleFilter = (groupId: FilterGroupId, option: string) => { + setFilters((prev) => ({ + ...prev, + [groupId]: toggleValue(prev[groupId], option), + })); + setCurrentPage(1); + }; + + const clearFilters = () => { + setFilters(emptyFilters); + setCurrentPage(1); + }; + + const activeFilterCount = + filters.model.length + filters.tools.length + filters.updated.length; + const hasActiveFilters = activeFilterCount > 0; + const pageCount = Math.max(1, Math.ceil(sortedAgents.length / PAGE_SIZE)); + const page = Math.min(currentPage, pageCount); + const visibleAgents = sortedAgents.slice((page - 1) * PAGE_SIZE, page * PAGE_SIZE); + + useEffect(() => { + if (previousPage.current === currentPage) return; + previousPage.current = currentPage; + const frame = window.requestAnimationFrame(() => { + const catalog = document.getElementById("catalog"); + if (!catalog) return; + catalog.scrollIntoView({ behavior: getScrollBehavior(), block: "start" }); + catalog.focus({ preventScroll: true }); + }); + return () => window.cancelAnimationFrame(frame); + }, [currentPage]); + + return ( + + +
+ + + Agents + + + Specialized agents that enhance GitHub Copilot for specific + technologies, workflows, and domains — contributed and curated by + the community. + +
+
+ +
+ + + + + + { + setSortMode(value); + setCurrentPage(1); + }} + /> + + + + + {visibleAgents.map((agent) => ( + + + + {agent.title} + + + {agent.description} + + + +
+ + + Install + + + + VS Code + + + VS Code Insiders + + + + + +
+
+
+ ))} +
+
+
+ + {sortedAgents.length === 0 ? ( + + + No agents match the selected filters. + + + ) : null} +
+
+
+ +