diff --git a/.gitignore b/.gitignore index 10709495a..c4543ceab 100644 --- a/.gitignore +++ b/.gitignore @@ -89,3 +89,5 @@ v2/cmd/wails/internal/commands/initialise/templates/testtemplates/ # Temporary called mkdocs, should be renamed to more standard -website or similar /docs/site .aider* +.cache +.local diff --git a/docs/README.md b/docs/README.md index cf70888f2..108b2a1fa 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,17 +1,22 @@ -# Starlight Starter Kit: Basics +# Wails v3 Documentation [![Built with Starlight](https://astro.badg.es/v2/built-with-starlight/tiny.svg)](https://starlight.astro.build) -```sh -npm create astro@latest -- --template starlight -``` +World-class documentation for Wails v3, redesigned following Netflix documentation principles. -[![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/withastro/starlight/tree/main/examples/basics) -[![Open with CodeSandbox](https://assets.codesandbox.io/github/button-edit-lime.svg)](https://codesandbox.io/p/sandbox/github/withastro/starlight/tree/main/examples/basics) -[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/withastro/starlight&create_from_path=examples/basics) -[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fwithastro%2Fstarlight%2Ftree%2Fmain%2Fexamples%2Fbasics&project-name=my-starlight-docs&repository-name=my-starlight-docs) +## 📚 Documentation Redesign (2025-10-01) -> 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun! +This documentation has been completely redesigned to follow the **Netflix approach** to developer documentation: + +- **Problem-first framing** - Start with why, not what +- **Progressive disclosure** - Multiple entry points for different skill levels +- **Real production examples** - No toy code +- **Story-Code-Context pattern** - Why → How → When +- **Scannable content** - Clear structure, visual aids + +**Status:** Foundation complete (~20%), ready for content migration + +See [IMPLEMENTATION_SUMMARY.md](./IMPLEMENTATION_SUMMARY.md) for full details. ## 🚀 Project Structure diff --git a/docs/Taskfile.yml b/docs/Taskfile.yml index 76515fcd8..844483c5a 100644 --- a/docs/Taskfile.yml +++ b/docs/Taskfile.yml @@ -2,29 +2,37 @@ version: '3' +vars: + # Change this to switch package managers: bun, npm, pnpm, yarn + PKG_MANAGER: bun + tasks: setup: - summary: Setup the project + summary: Setup the project (including D2 diagram tool) preconditions: - - sh: npm --version - msg: "Looks like npm isn't installed." + - sh: '{{.PKG_MANAGER}} --version' + msg: "Looks like {{.PKG_MANAGER}} isn't installed." + - sh: 'go version' + msg: "Go is not installed. Install from https://go.dev/dl/" cmds: - - npm install + - '{{.PKG_MANAGER}} install' + - go install oss.terrastruct.com/d2@latest + - echo "✓ Setup complete. D2 installed to $(go env GOPATH)/bin/d2" dev: summary: Run the dev server preconditions: - - sh: npm --version - msg: "Looks like npm isn't installed." + - sh: '{{.PKG_MANAGER}} --version' + msg: "Looks like {{.PKG_MANAGER}} isn't installed." cmds: - - npm run dev + - '{{.PKG_MANAGER}} run dev' build: summary: Build the docs preconditions: - - sh: npm --version - msg: "Looks like npm isn't installed." + - sh: '{{.PKG_MANAGER}} --version' + msg: "Looks like {{.PKG_MANAGER}} isn't installed." cmds: - - npm run build + - '{{.PKG_MANAGER}} run build' diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index b96e39cdf..7334dbd0a 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -10,7 +10,6 @@ import d2 from 'astro-d2'; // https://astro.build/config export default defineConfig({ - // TODO: update this site: "https://wails.io", trailingSlash: "ignore", compressHTML: true, @@ -18,24 +17,22 @@ export default defineConfig({ build: { format: "directory" }, devToolbar: { enabled: true }, integrations: [ - d2(), + d2(), sitemap(), starlight({ title: "", - // If a title is added, also update the delimiter. titleDelimiter: "", logo: { dark: "./src/assets/wails-logo-horizontal-dark.svg", light: "./src/assets/wails-logo-horizontal-light.svg", }, favicon: "./public/favicon.svg", - description: "Build desktop applications using Go & Web Technologies.", + description: "Build beautiful desktop applications using Go and modern web technologies.", pagefind: true, customCss: ["./src/stylesheets/extra.css"], - lastUpdated: true, // Note, this needs git clone with fetch depth 0 to work + lastUpdated: true, pagination: true, editLink: { - // TODO: update this baseUrl: "https://github.com/wailsapp/wails/edit/v3-alpha/docs", }, social: { @@ -43,35 +40,30 @@ export default defineConfig({ discord: "https://discord.gg/JDdSxwjhGf", "x.com": "https://x.com/wailsapp", }, + head: [ + { + tag: 'script', + content: ` + document.addEventListener('DOMContentLoaded', () => { + const socialLinks = document.querySelector('.social-icons'); + if (socialLinks) { + const sponsorLink = document.createElement('a'); + sponsorLink.href = 'https://github.com/sponsors/leaanthony'; + sponsorLink.className = 'sl-flex'; + sponsorLink.title = 'Sponsor'; + sponsorLink.innerHTML = 'Sponsor'; + socialLinks.appendChild(sponsorLink); + } + }); + `, + }, + ], defaultLocale: "root", locales: { root: { label: "English", lang: "en", dir: "ltr" }, - // Example of how a new language is added. - // After this, you create a directory named after the language inside content/docs/ - // with the same structure as the root language - // eg content/docs/gr/changelog.md or content/docs/gr/api/application.mdx - // gr: { label: "Greek", lang: "el", dir: "ltr" }, }, plugins: [ - // https://starlight-links-validator.vercel.app/configuration/ - // starlightLinksValidator({ - // exclude: [ - // // TODO: Fix these links in the blog/wails-v2-released file - // // "/docs/reference/options#theme", - // // "/docs/reference/options#customtheme", - // // "/docs/guides/application-development#application-menu", - // // "/docs/reference/runtime/dialog", - // // "/docs/reference/options#windowistranslucent", - // // "/docs/reference/options#windowistranslucent-1", - // // "/docs/guides/windows-installer", - // // "/docs/reference/runtime/intro", - // // "/docs/guides/obfuscated", - // // "/docs/howdoesitwork#calling-bound-go-methods", - // ], - // }), - // https://starlight-image-zoom.vercel.app/configuration/ starlightImageZoom(), - // https://starlight-blog-docs.vercel.app/configuration starlightBlog({ title: "Wails Blog", authors: authors, @@ -79,37 +71,239 @@ export default defineConfig({ ], sidebar: [ { label: "Home", link: "/" }, + + // Progressive Onboarding - Netflix Principle: Start with the problem + { label: "Why Wails?", link: "/quick-start/why-wails" }, + { - label: "Getting Started", - autogenerate: { directory: "getting-started", collapsed: false }, + label: "Quick Start", + collapsed: false, + items: [ + { label: "Installation", link: "/quick-start/installation" }, + { label: "Your First App", link: "/quick-start/first-app" }, + { label: "Next Steps", link: "/quick-start/next-steps" }, + ], }, + + // Tutorials { label: "Tutorials", collapsed: true, - autogenerate: { directory: "tutorials", collapsed: true }, + autogenerate: { directory: "tutorials" }, }, + + // Core Concepts { - label: "What's New", - link: "/whats-new", - badge: { text: "New", variant: "tip" }, - }, - { label: "Developer Guide", link: "/developer-guide" }, - { label: "v3 Alpha Feedback", link: "/feedback" }, - { - label: "Learn", + label: "Core Concepts", collapsed: true, - autogenerate: { directory: "learn", collapsed: true }, + items: [ + { label: "How Wails Works", link: "/concepts/architecture" }, + { label: "Manager API", link: "/concepts/manager-api" }, + { label: "Application Lifecycle", link: "/concepts/lifecycle" }, + { label: "Go-Frontend Bridge", link: "/concepts/bridge" }, + { label: "Build System", link: "/concepts/build-system" }, + ], }, + + { + label: "Features", + collapsed: true, + items: [ + { + label: "Windows", + collapsed: true, + items: [ + { label: "Window Basics", link: "/features/windows/basics" }, + { label: "Window Options", link: "/features/windows/options" }, + { label: "Multiple Windows", link: "/features/windows/multiple" }, + { label: "Frameless Windows", link: "/features/windows/frameless" }, + { label: "Window Events", link: "/features/windows/events" }, + ], + }, + { + label: "Menus", + collapsed: true, + items: [ + { label: "Application Menus", link: "/features/menus/application" }, + { label: "Context Menus", link: "/features/menus/context" }, + { label: "System Tray Menus", link: "/features/menus/systray" }, + { label: "Menu Reference", link: "/features/menus/reference" }, + ], + }, + { + label: "Bindings & Services", + collapsed: true, + items: [ + { label: "Method Binding", link: "/features/bindings/methods" }, + { label: "Services", link: "/features/bindings/services" }, + { label: "Advanced Binding", link: "/features/bindings/advanced" }, + { label: "Best Practices", link: "/features/bindings/best-practices" }, + ], + }, + { + label: "Events", + collapsed: true, + items: [ + { label: "Event System", link: "/features/events/system" }, + { label: "Application Events", link: "/features/events/application" }, + { label: "Window Events", link: "/features/events/window" }, + { label: "Custom Events", link: "/features/events/custom" }, + ], + }, + { + label: "Dialogs", + collapsed: true, + items: [ + { label: "File Dialogs", link: "/features/dialogs/file" }, + { label: "Message Dialogs", link: "/features/dialogs/message" }, + { label: "Custom Dialogs", link: "/features/dialogs/custom" }, + ], + }, + { + label: "Clipboard", + collapsed: true, + autogenerate: { directory: "features/clipboard" }, + }, + { + label: "Browser", + collapsed: true, + autogenerate: { directory: "features/browser" }, + }, + { label: "Drag & Drop", link: "/features/drag-drop" }, + { + label: "Keyboard", + collapsed: true, + autogenerate: { directory: "features/keyboard" }, + }, + { + label: "Notifications", + collapsed: true, + autogenerate: { directory: "features/notifications" }, + }, + { + label: "Screens", + collapsed: true, + autogenerate: { directory: "features/screens" }, + }, + { + label: "Environment", + collapsed: true, + autogenerate: { directory: "features/environment" }, + }, + { + label: "Platform-Specific", + collapsed: true, + autogenerate: { directory: "features/platform" }, + }, + ], + }, + + // Guides - Task-oriented patterns (Netflix: When to use it, when not to use it) { label: "Guides", collapsed: true, - autogenerate: { directory: "guides", collapsed: true }, + items: [ + { + label: "Development", + collapsed: true, + items: [ + { label: "Project Structure", link: "/guides/dev/project-structure" }, + { label: "Development Workflow", link: "/guides/dev/workflow" }, + { label: "Debugging", link: "/guides/dev/debugging" }, + { label: "Testing", link: "/guides/dev/testing" }, + ], + }, + { + label: "Building & Packaging", + collapsed: true, + items: [ + { label: "Building Applications", link: "/guides/build/building" }, + { label: "Build Customization", link: "/guides/build/customization" }, + { label: "Cross-Platform Builds", link: "/guides/build/cross-platform" }, + { label: "Code Signing", link: "/guides/build/signing" }, + { label: "Windows Packaging", link: "/guides/build/windows" }, + { label: "macOS Packaging", link: "/guides/build/macos" }, + { label: "Linux Packaging", link: "/guides/build/linux" }, + { label: "MSIX Packaging", link: "/guides/build/msix" }, + ], + }, + { + label: "Distribution", + collapsed: true, + items: [ + { label: "Auto-Updates", link: "/guides/distribution/auto-updates" }, + { label: "File Associations", link: "/guides/distribution/file-associations" }, + { label: "Custom Protocols", link: "/guides/distribution/custom-protocols" }, + { label: "Single Instance", link: "/guides/distribution/single-instance" }, + ], + }, + { + label: "Integration Patterns", + collapsed: true, + items: [ + { label: "Using Gin Router", link: "/guides/patterns/gin-routing" }, + { label: "Gin Services", link: "/guides/patterns/gin-services" }, + { label: "Database Integration", link: "/guides/patterns/database" }, + { label: "REST APIs", link: "/guides/patterns/rest-api" }, + ], + }, + { + label: "Advanced Topics", + collapsed: true, + items: [ + { label: "Custom Templates", link: "/guides/advanced/custom-templates" }, + { label: "WML (Wails Markup)", link: "/guides/advanced/wml" }, + { label: "Panic Handling", link: "/guides/advanced/panic-handling" }, + { label: "Security Best Practices", link: "/guides/advanced/security" }, + ], + }, + ], }, - // { - // label: "API", - // collapsed: true, - // autogenerate: { directory: "api", collapsed: true }, - // }, + + // Reference - Comprehensive API docs (Netflix: Complete technical reference) + { + label: "API Reference", + collapsed: true, + items: [ + { label: "Overview", link: "/reference/overview" }, + { label: "Application", link: "/reference/application" }, + { label: "Window", link: "/reference/window" }, + { label: "Menu", link: "/reference/menu" }, + { label: "Events", link: "/reference/events" }, + { label: "Dialogs", link: "/reference/dialogs" }, + { label: "Frontend Runtime", link: "/reference/frontend-runtime" }, + { label: "CLI", link: "/reference/cli" }, + ], + }, + + // Contributing + { + label: "Contributing", + collapsed: true, + items: [ + { label: "Getting Started", link: "/contributing/getting-started" }, + { label: "Development Setup", link: "/contributing/setup" }, + { label: "Coding Standards", link: "/contributing/standards" }, + ], + }, + + // Migration & Troubleshooting + { + label: "Migration", + collapsed: true, + items: [ + { label: "From v2 to v3", link: "/migration/v2-to-v3" }, + { label: "From Electron", link: "/migration/from-electron" }, + ], + }, + + { + label: "Troubleshooting", + collapsed: true, + autogenerate: { directory: "troubleshooting" }, + }, + + // Community & Resources { label: "Community", collapsed: true, @@ -118,18 +312,22 @@ export default defineConfig({ { label: "Templates", link: "/community/templates" }, { label: "Showcase", - autogenerate: { - directory: "community/showcase", - collapsed: true, - }, + collapsed: true, + items: [ + { label: "Overview", link: "/community/showcase" }, + { + label: "Applications", + autogenerate: { + directory: "community/showcase", + collapsed: true, + }, + }, + ], }, ], }, - // { - // label: "Development", - // collapsed: true, - // autogenerate: { directory: "development", collapsed: true }, - // }, + + { label: "What's New", link: "/whats-new" }, { label: "Status", link: "/status" }, { label: "Changelog", link: "/changelog" }, { @@ -137,11 +335,7 @@ export default defineConfig({ link: "https://github.com/sponsors/leaanthony", badge: { text: "❤️" }, }, - { - label: "Credits", - link: "/credits", - badge: { text: "👑" }, - }, + { label: "Credits", link: "/credits" }, ], }), ], diff --git a/docs/package-lock.json b/docs/package-lock.json index 7f74f495f..abca7acf2 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -8,22 +8,23 @@ "name": "wails-docs", "version": "0.0.1", "dependencies": { - "@astrojs/check": "0.9.4", - "@astrojs/react": "4.1.0", - "@astrojs/starlight": "0.29.2", - "@types/react": "19.0.1", - "@types/react-dom": "19.0.2", - "astro": "4.16.17", - "framer-motion": "11.14.4", - "motion": "11.14.4", - "react": "19.0.0", - "react-dom": "19.0.0", - "sharp": "0.33.5", - "starlight-blog": "0.15.0", - "starlight-image-zoom": "0.9.0", - "starlight-links-validator": "0.13.4", - "starlight-showcases": "0.2.0", - "typescript": "5.7.2" + "@astrojs/check": "^0.9.4", + "@astrojs/react": "^4.1.0", + "@astrojs/starlight": "^0.30.0", + "@types/react": "^19.0.1", + "@types/react-dom": "^19.0.2", + "astro": "^5.0.0", + "astro-d2": "^0.5.0", + "framer-motion": "^11.14.4", + "motion": "^11.14.4", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "sharp": "^0.33.5", + "starlight-blog": "^0.15.0", + "starlight-image-zoom": "^0.9.0", + "starlight-links-validator": "^0.13.4", + "starlight-showcases": "^0.2.0", + "typescript": "^5.7.2" } }, "node_modules/@ampproject/remapping": { @@ -91,15 +92,15 @@ } }, "node_modules/@astrojs/compiler": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.10.3.tgz", - "integrity": "sha512-bL/O7YBxsFt55YHU021oL+xz+B/9HvGNId3F9xURN16aeqDK9juHGktdkCSXz+U4nqFACq6ZFvWomOzhV+zfPw==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.13.0.tgz", + "integrity": "sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw==", "license": "MIT" }, "node_modules/@astrojs/internal-helpers": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.4.1.tgz", - "integrity": "sha512-bMf9jFihO8YP940uD70SI/RDzIhUHJAolWVcO1v5PUivxGKvfLZTLTVVxEYzGYyPsA3ivdLNqMnL5VgmQySa+g==", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.7.4.tgz", + "integrity": "sha512-lDA9MqE8WGi7T/t2BMi+EAXhs4Vcvr94Gqx3q15cFEz8oFZMO4/SFBqYr/UcmNlvW+35alowkVj+w9VhLvs5Cw==", "license": "MIT" }, "node_modules/@astrojs/language-server": { @@ -229,484 +230,6 @@ "react-dom": "^17.0.2 || ^18.0.0 || ^19.0.0" } }, - "node_modules/@astrojs/react/node_modules/@esbuild/aix-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", - "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@astrojs/react/node_modules/@esbuild/android-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", - "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@astrojs/react/node_modules/@esbuild/android-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", - "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@astrojs/react/node_modules/@esbuild/android-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", - "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@astrojs/react/node_modules/@esbuild/darwin-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", - "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@astrojs/react/node_modules/@esbuild/darwin-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", - "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@astrojs/react/node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", - "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@astrojs/react/node_modules/@esbuild/freebsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", - "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@astrojs/react/node_modules/@esbuild/linux-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", - "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@astrojs/react/node_modules/@esbuild/linux-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", - "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@astrojs/react/node_modules/@esbuild/linux-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", - "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@astrojs/react/node_modules/@esbuild/linux-loong64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", - "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@astrojs/react/node_modules/@esbuild/linux-mips64el": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", - "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@astrojs/react/node_modules/@esbuild/linux-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", - "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@astrojs/react/node_modules/@esbuild/linux-riscv64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", - "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@astrojs/react/node_modules/@esbuild/linux-s390x": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", - "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@astrojs/react/node_modules/@esbuild/linux-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", - "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@astrojs/react/node_modules/@esbuild/netbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", - "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@astrojs/react/node_modules/@esbuild/openbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", - "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@astrojs/react/node_modules/@esbuild/sunos-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", - "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@astrojs/react/node_modules/@esbuild/win32-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", - "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@astrojs/react/node_modules/@esbuild/win32-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", - "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@astrojs/react/node_modules/@esbuild/win32-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", - "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@astrojs/react/node_modules/esbuild": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", - "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.0", - "@esbuild/android-arm": "0.24.0", - "@esbuild/android-arm64": "0.24.0", - "@esbuild/android-x64": "0.24.0", - "@esbuild/darwin-arm64": "0.24.0", - "@esbuild/darwin-x64": "0.24.0", - "@esbuild/freebsd-arm64": "0.24.0", - "@esbuild/freebsd-x64": "0.24.0", - "@esbuild/linux-arm": "0.24.0", - "@esbuild/linux-arm64": "0.24.0", - "@esbuild/linux-ia32": "0.24.0", - "@esbuild/linux-loong64": "0.24.0", - "@esbuild/linux-mips64el": "0.24.0", - "@esbuild/linux-ppc64": "0.24.0", - "@esbuild/linux-riscv64": "0.24.0", - "@esbuild/linux-s390x": "0.24.0", - "@esbuild/linux-x64": "0.24.0", - "@esbuild/netbsd-x64": "0.24.0", - "@esbuild/openbsd-arm64": "0.24.0", - "@esbuild/openbsd-x64": "0.24.0", - "@esbuild/sunos-x64": "0.24.0", - "@esbuild/win32-arm64": "0.24.0", - "@esbuild/win32-ia32": "0.24.0", - "@esbuild/win32-x64": "0.24.0" - } - }, - "node_modules/@astrojs/react/node_modules/vite": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.3.tgz", - "integrity": "sha512-Cmuo5P0ENTN6HxLSo6IHsjCLn/81Vgrp81oaiFFMRa8gGDj5xEjIcEpf2ZymZtZR8oU0P2JX5WuUp/rlXcHkAw==", - "license": "MIT", - "dependencies": { - "esbuild": "^0.24.0", - "postcss": "^8.4.49", - "rollup": "^4.23.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, "node_modules/@astrojs/rss": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@astrojs/rss/-/rss-4.0.5.tgz", @@ -729,15 +252,16 @@ } }, "node_modules/@astrojs/starlight": { - "version": "0.29.2", - "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.29.2.tgz", - "integrity": "sha512-xv9AhWkP3fxCB6EF6MlT4yEbxzye3aMSbuVbFEGbQh8G/w1MPhdNCnQakIHpmIwwyxwG9cW3mQdAZum4oOO39w==", + "version": "0.30.6", + "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.30.6.tgz", + "integrity": "sha512-/AoLXjPPD1MqixkTd2Lp3qahSzfCejePWHZQ3+fDjj1CuXI7Gjrr5bR3zNV0b9tynloPAIBM0HOyBNEGAo9uAQ==", "license": "MIT", "dependencies": { - "@astrojs/mdx": "^3.1.3", + "@astrojs/mdx": "^4.0.1", "@astrojs/sitemap": "^3.1.6", "@pagefind/default-ui": "^1.0.3", "@types/hast": "^3.0.4", + "@types/js-yaml": "^4.0.9", "@types/mdast": "^4.0.4", "astro-expressive-code": "^0.38.3", "bcp-47": "^2.1.0", @@ -759,25 +283,187 @@ "vfile": "^6.0.2" }, "peerDependencies": { - "astro": "^4.14.0" + "astro": "^5.0.0" + } + }, + "node_modules/@astrojs/starlight/node_modules/@astrojs/markdown-remark": { + "version": "6.3.8", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-6.3.8.tgz", + "integrity": "sha512-uFNyFWadnULWK2cOw4n0hLKeu+xaVWeuECdP10cQ3K2fkybtTlhb7J7TcScdjmS8Yps7oje9S/ehYMfZrhrgCg==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.7.4", + "@astrojs/prism": "3.3.0", + "github-slugger": "^2.0.0", + "hast-util-from-html": "^2.0.3", + "hast-util-to-text": "^4.0.2", + "import-meta-resolve": "^4.2.0", + "js-yaml": "^4.1.0", + "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", + "shiki": "^3.13.0", + "smol-toml": "^1.4.2", + "unified": "^11.0.5", + "unist-util-remove-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.1", + "vfile": "^6.0.3" + } + }, + "node_modules/@astrojs/starlight/node_modules/@astrojs/mdx": { + "version": "4.3.10", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.3.10.tgz", + "integrity": "sha512-2T5+XIr7PMqMeXhRofXY5NlY4lA0Km+wkfsqmr9lq5KXUHpGlKPQ9dlDZJP9E/CtljJyEBNS17zq66LrIJ1tiQ==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "6.3.8", + "@mdx-js/mdx": "^3.1.1", + "acorn": "^8.15.0", + "es-module-lexer": "^1.7.0", + "estree-util-visit": "^2.0.0", + "hast-util-to-html": "^9.0.5", + "picocolors": "^1.1.1", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", + "remark-smartypants": "^3.0.2", + "source-map": "^0.7.6", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.3" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + }, + "peerDependencies": { + "astro": "^5.0.0" + } + }, + "node_modules/@astrojs/starlight/node_modules/@astrojs/prism": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.3.0.tgz", + "integrity": "sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==", + "license": "MIT", + "dependencies": { + "prismjs": "^1.30.0" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + } + }, + "node_modules/@astrojs/starlight/node_modules/@shikijs/core": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.15.0.tgz", + "integrity": "sha512-8TOG6yG557q+fMsSVa8nkEDOZNTSxjbbR8l6lF2gyr6Np+jrPlslqDxQkN6rMXCECQ3isNPZAGszAfYoJOPGlg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.15.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" + } + }, + "node_modules/@astrojs/starlight/node_modules/@shikijs/engine-javascript": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.15.0.tgz", + "integrity": "sha512-ZedbOFpopibdLmvTz2sJPJgns8Xvyabe2QbmqMTz07kt1pTzfEvKZc5IqPVO/XFiEbbNyaOpjPBkkr1vlwS+qg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.15.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.3" + } + }, + "node_modules/@astrojs/starlight/node_modules/@shikijs/engine-oniguruma": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.15.0.tgz", + "integrity": "sha512-HnqFsV11skAHvOArMZdLBZZApRSYS4LSztk2K3016Y9VCyZISnlYUYsL2hzlS7tPqKHvNqmI5JSUJZprXloMvA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.15.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@astrojs/starlight/node_modules/@shikijs/types": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.15.0.tgz", + "integrity": "sha512-BnP+y/EQnhihgHy4oIAN+6FFtmfTekwOLsQbRw9hOKwqgNy8Bdsjq8B05oAt/ZgvIWWFrshV71ytOrlPfYjIJw==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@astrojs/starlight/node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "license": "MIT" + }, + "node_modules/@astrojs/starlight/node_modules/oniguruma-to-es": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.3.tgz", + "integrity": "sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==", + "license": "MIT", + "dependencies": { + "oniguruma-parser": "^0.12.1", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/@astrojs/starlight/node_modules/regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.0.1.tgz", + "integrity": "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/@astrojs/starlight/node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/@astrojs/starlight/node_modules/shiki": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.15.0.tgz", + "integrity": "sha512-kLdkY6iV3dYbtPwS9KXU7mjfmDm25f5m0IPNFnaXO7TBPcvbUOY72PYXSuSqDzwp+vlH/d7MXpHlKO/x+QoLXw==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "3.15.0", + "@shikijs/engine-javascript": "3.15.0", + "@shikijs/engine-oniguruma": "3.15.0", + "@shikijs/langs": "3.15.0", + "@shikijs/themes": "3.15.0", + "@shikijs/types": "3.15.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" } }, "node_modules/@astrojs/telemetry": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.1.0.tgz", - "integrity": "sha512-/ca/+D8MIKEC8/A9cSaPUqQNZm+Es/ZinRv0ZAzvu2ios7POQSsVD+VOj7/hypWNsNM3T7RpfgNq7H2TU1KEHA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.0.tgz", + "integrity": "sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==", "license": "MIT", "dependencies": { - "ci-info": "^4.0.0", - "debug": "^4.3.4", + "ci-info": "^4.2.0", + "debug": "^4.4.0", "dlv": "^1.1.3", - "dset": "^3.1.3", + "dset": "^3.1.4", "is-docker": "^3.0.0", - "is-wsl": "^3.0.0", + "is-wsl": "^3.1.0", "which-pm-runs": "^1.1.0" }, "engines": { - "node": "^18.17.1 || ^20.3.0 || >=21.0.0" + "node": "18.20.8 || ^20.3.0 || >=22.0.0" } }, "node_modules/@astrojs/yaml2ts": { @@ -867,18 +553,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", - "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-compilation-targets": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", @@ -944,18 +618,18 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -984,12 +658,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "license": "MIT", "dependencies": { - "@babel/types": "^7.26.3" + "@babel/types": "^7.28.5" }, "bin": { "parser": "bin/babel-parser.js" @@ -998,40 +672,6 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", - "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", - "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-syntax-jsx": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", @@ -1107,18 +747,30 @@ } }, "node_modules/@babel/types": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@capsizecss/unpack": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-3.0.1.tgz", + "integrity": "sha512-8XqW8xGn++Eqqbz3e9wKuK7mxryeRjs4LOHLxbh2lwKeSbuNR4NFifDZT4KzvjU6HMOPbiNTsWpniK5EJfTWkg==", + "license": "MIT", + "dependencies": { + "fontkit": "^2.0.2" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@ctrl/tinycolor": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.1.0.tgz", @@ -1184,9 +836,9 @@ "license": "MIT" }, "node_modules/@emnapi/runtime": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", - "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.0.tgz", + "integrity": "sha512-oAYoQnCYaQZKVS53Fq23ceWMRxq5EhQsE0x0RdQ55jT7wagMu5k+fS39v1fiSLrtrLQlXwVINenqhLMtTrV/1Q==", "license": "MIT", "optional": true, "dependencies": { @@ -1194,9 +846,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", "cpu": [ "ppc64" ], @@ -1206,13 +858,13 @@ "aix" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", "cpu": [ "arm" ], @@ -1222,13 +874,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", "cpu": [ "arm64" ], @@ -1238,13 +890,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", "cpu": [ "x64" ], @@ -1254,13 +906,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", "cpu": [ "arm64" ], @@ -1270,13 +922,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", "cpu": [ "x64" ], @@ -1286,13 +938,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", "cpu": [ "arm64" ], @@ -1302,13 +954,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", "cpu": [ "x64" ], @@ -1318,13 +970,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", "cpu": [ "arm" ], @@ -1334,13 +986,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", "cpu": [ "arm64" ], @@ -1350,13 +1002,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", "cpu": [ "ia32" ], @@ -1366,13 +1018,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", "cpu": [ "loong64" ], @@ -1382,13 +1034,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", "cpu": [ "mips64el" ], @@ -1398,13 +1050,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", "cpu": [ "ppc64" ], @@ -1414,13 +1066,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", "cpu": [ "riscv64" ], @@ -1430,13 +1082,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", "cpu": [ "s390x" ], @@ -1446,13 +1098,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", "cpu": [ "x64" ], @@ -1462,13 +1114,29 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", "cpu": [ "x64" ], @@ -1478,13 +1146,13 @@ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", - "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", "cpu": [ "arm64" ], @@ -1498,9 +1166,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", "cpu": [ "x64" ], @@ -1510,13 +1178,29 @@ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", "cpu": [ "x64" ], @@ -1526,13 +1210,13 @@ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", "cpu": [ "arm64" ], @@ -1542,13 +1226,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", "cpu": [ "ia32" ], @@ -1558,13 +1242,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", "cpu": [ "x64" ], @@ -1574,7 +1258,7 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@expressive-code/core": { @@ -1622,6 +1306,16 @@ "@expressive-code/core": "^0.38.3" } }, + "node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, "node_modules/@img/sharp-darwin-arm64": { "version": "0.33.5", "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", @@ -1730,6 +1424,38 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@img/sharp-libvips-linux-s390x": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", @@ -1838,6 +1564,50 @@ "@img/sharp-libvips-linux-arm64": "1.0.4" } }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, "node_modules/@img/sharp-linux-s390x": { "version": "0.33.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", @@ -1945,6 +1715,25 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@img/sharp-win32-ia32": { "version": "0.33.5", "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", @@ -2016,9 +1805,9 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { @@ -2032,15 +1821,16 @@ } }, "node_modules/@mdx-js/mdx": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.0.tgz", - "integrity": "sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", + "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdx": "^2.0.0", + "acorn": "^8.0.0", "collapse-white-space": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", @@ -2180,9 +1970,9 @@ ] }, "node_modules/@rollup/pluginutils": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.3.tgz", - "integrity": "sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -2208,9 +1998,9 @@ "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.1.tgz", - "integrity": "sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.2.tgz", + "integrity": "sha512-yDPzwsgiFO26RJA4nZo8I+xqzh7sJTZIWQOxn+/XOdPE31lAvLIYCKqjV+lNH/vxE2L2iH3plKxDCRK6i+CwhA==", "cpu": [ "arm" ], @@ -2221,9 +2011,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.1.tgz", - "integrity": "sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.2.tgz", + "integrity": "sha512-k8FontTxIE7b0/OGKeSN5B6j25EuppBcWM33Z19JoVT7UTXFSo3D9CdU39wGTeb29NO3XxpMNauh09B+Ibw+9g==", "cpu": [ "arm64" ], @@ -2234,9 +2024,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.1.tgz", - "integrity": "sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.2.tgz", + "integrity": "sha512-A6s4gJpomNBtJ2yioj8bflM2oogDwzUiMl2yNJ2v9E7++sHrSrsQ29fOfn5DM/iCzpWcebNYEdXpaK4tr2RhfQ==", "cpu": [ "arm64" ], @@ -2247,9 +2037,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.1.tgz", - "integrity": "sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.2.tgz", + "integrity": "sha512-e6XqVmXlHrBlG56obu9gDRPW3O3hLxpwHpLsBJvuI8qqnsrtSZ9ERoWUXtPOkY8c78WghyPHZdmPhHLWNdAGEw==", "cpu": [ "x64" ], @@ -2260,9 +2050,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.1.tgz", - "integrity": "sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.2.tgz", + "integrity": "sha512-v0E9lJW8VsrwPux5Qe5CwmH/CF/2mQs6xU1MF3nmUxmZUCHazCjLgYvToOk+YuuUqLQBio1qkkREhxhc656ViA==", "cpu": [ "arm64" ], @@ -2273,9 +2063,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.1.tgz", - "integrity": "sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.2.tgz", + "integrity": "sha512-ClAmAPx3ZCHtp6ysl4XEhWU69GUB1D+s7G9YjHGhIGCSrsg00nEGRRZHmINYxkdoJehde8VIsDC5t9C0gb6yqA==", "cpu": [ "x64" ], @@ -2286,9 +2076,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.1.tgz", - "integrity": "sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.2.tgz", + "integrity": "sha512-EPlb95nUsz6Dd9Qy13fI5kUPXNSljaG9FiJ4YUGU1O/Q77i5DYFW5KR8g1OzTcdZUqQQ1KdDqsTohdFVwCwjqg==", "cpu": [ "arm" ], @@ -2299,9 +2089,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.1.tgz", - "integrity": "sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.2.tgz", + "integrity": "sha512-BOmnVW+khAUX+YZvNfa0tGTEMVVEerOxN0pDk2E6N6DsEIa2Ctj48FOMfNDdrwinocKaC7YXUZ1pHlKpnkja/Q==", "cpu": [ "arm" ], @@ -2312,9 +2102,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.1.tgz", - "integrity": "sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.2.tgz", + "integrity": "sha512-Xt2byDZ+6OVNuREgBXr4+CZDJtrVso5woFtpKdGPhpTPHcNG7D8YXeQzpNbFRxzTVqJf7kvPMCub/pcGUWgBjA==", "cpu": [ "arm64" ], @@ -2325,9 +2115,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.1.tgz", - "integrity": "sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.2.tgz", + "integrity": "sha512-+LdZSldy/I9N8+klim/Y1HsKbJ3BbInHav5qE9Iy77dtHC/pibw1SR/fXlWyAk0ThnpRKoODwnAuSjqxFRDHUQ==", "cpu": [ "arm64" ], @@ -2337,10 +2127,10 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.28.1.tgz", - "integrity": "sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==", + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.2.tgz", + "integrity": "sha512-8ms8sjmyc1jWJS6WdNSA23rEfdjWB30LH8Wqj0Cqvv7qSHnvw6kgMMXRdop6hkmGPlyYBdRPkjJnj3KCUHV/uQ==", "cpu": [ "loong64" ], @@ -2350,10 +2140,10 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.1.tgz", - "integrity": "sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==", + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.2.tgz", + "integrity": "sha512-3HRQLUQbpBDMmzoxPJYd3W6vrVHOo2cVW8RUo87Xz0JPJcBLBr5kZ1pGcQAhdZgX9VV7NbGNipah1omKKe23/g==", "cpu": [ "ppc64" ], @@ -2364,9 +2154,22 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.1.tgz", - "integrity": "sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.2.tgz", + "integrity": "sha512-fMjKi+ojnmIvhk34gZP94vjogXNNUKMEYs+EDaB/5TG/wUkoeua7p7VCHnE6T2Tx+iaghAqQX8teQzcvrYpaQA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.2.tgz", + "integrity": "sha512-XuGFGU+VwUUV5kLvoAdi0Wz5Xbh2SrjIxCtZj6Wq8MDp4bflb/+ThZsVxokM7n0pcbkEr2h5/pzqzDYI7cCgLQ==", "cpu": [ "riscv64" ], @@ -2377,9 +2180,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.1.tgz", - "integrity": "sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.2.tgz", + "integrity": "sha512-w6yjZF0P+NGzWR3AXWX9zc0DNEGdtvykB03uhonSHMRa+oWA6novflo2WaJr6JZakG2ucsyb+rvhrKac6NIy+w==", "cpu": [ "s390x" ], @@ -2390,9 +2193,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.1.tgz", - "integrity": "sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.2.tgz", + "integrity": "sha512-yo8d6tdfdeBArzC7T/PnHd7OypfI9cbuZzPnzLJIyKYFhAQ8SvlkKtKBMbXDxe1h03Rcr7u++nFS7tqXz87Gtw==", "cpu": [ "x64" ], @@ -2403,9 +2206,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.1.tgz", - "integrity": "sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.2.tgz", + "integrity": "sha512-ah59c1YkCxKExPP8O9PwOvs+XRLKwh/mV+3YdKqQ5AMQ0r4M4ZDuOrpWkUaqO7fzAHdINzV9tEVu8vNw48z0lA==", "cpu": [ "x64" ], @@ -2415,10 +2218,23 @@ "linux" ] }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.2.tgz", + "integrity": "sha512-4VEd19Wmhr+Zy7hbUsFZ6YXEiP48hE//KPLCSVNY5RMGX2/7HZ+QkN55a3atM1C/BZCGIgqN+xrVgtdak2S9+A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.1.tgz", - "integrity": "sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.2.tgz", + "integrity": "sha512-IlbHFYc/pQCgew/d5fslcy1KEaYVCJ44G8pajugd8VoOEI8ODhtb/j8XMhLpwHCMB3yk2J07ctup10gpw2nyMA==", "cpu": [ "arm64" ], @@ -2429,9 +2245,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.1.tgz", - "integrity": "sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.2.tgz", + "integrity": "sha512-lNlPEGgdUfSzdCWU176ku/dQRnA7W+Gp8d+cWv73jYrb8uT7HTVVxq62DUYxjbaByuf1Yk0RIIAbDzp+CnOTFg==", "cpu": [ "ia32" ], @@ -2441,10 +2257,23 @@ "win32" ] }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.2.tgz", + "integrity": "sha512-S6YojNVrHybQis2lYov1sd+uj7K0Q05NxHcGktuMMdIQ2VixGwAfbJ23NnlvvVV1bdpR2m5MsNBViHJKcA4ADw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.1.tgz", - "integrity": "sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.2.tgz", + "integrity": "sha512-k+/Rkcyx//P6fetPoLMb8pBeqJBNGx81uuf7iljX9++yNBVRDQgD04L+SVXmXmh5ZP4/WOp4mWF0kmi06PW2tA==", "cpu": [ "x64" ], @@ -2489,6 +2318,56 @@ "@shikijs/vscode-textmate": "^9.3.0" } }, + "node_modules/@shikijs/langs": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.15.0.tgz", + "integrity": "sha512-WpRvEFvkVvO65uKYW4Rzxs+IG0gToyM8SARQMtGGsH4GDMNZrr60qdggXrFOsdfOVssG/QQGEl3FnJ3EZ+8w8A==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.15.0" + } + }, + "node_modules/@shikijs/langs/node_modules/@shikijs/types": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.15.0.tgz", + "integrity": "sha512-BnP+y/EQnhihgHy4oIAN+6FFtmfTekwOLsQbRw9hOKwqgNy8Bdsjq8B05oAt/ZgvIWWFrshV71ytOrlPfYjIJw==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/langs/node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "license": "MIT" + }, + "node_modules/@shikijs/themes": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.15.0.tgz", + "integrity": "sha512-8ow2zWb1IDvCKjYb0KiLNrK4offFdkfNVPXb1OZykpLCzRU6j+efkY+Y7VQjNlNFXonSw+4AOdGYtmqykDbRiQ==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.15.0" + } + }, + "node_modules/@shikijs/themes/node_modules/@shikijs/types": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.15.0.tgz", + "integrity": "sha512-BnP+y/EQnhihgHy4oIAN+6FFtmfTekwOLsQbRw9hOKwqgNy8Bdsjq8B05oAt/ZgvIWWFrshV71ytOrlPfYjIJw==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/themes/node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "license": "MIT" + }, "node_modules/@shikijs/types": { "version": "1.24.1", "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.24.1.tgz", @@ -2505,6 +2384,15 @@ "integrity": "sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==", "license": "MIT" }, + "node_modules/@swc/helpers": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", + "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, "node_modules/@types/acorn": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", @@ -2555,12 +2443,6 @@ "@babel/types": "^7.20.7" } }, - "node_modules/@types/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", - "license": "MIT" - }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", @@ -2571,9 +2453,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "license": "MIT" }, "node_modules/@types/estree-jsx": { @@ -2585,6 +2467,15 @@ "@types/estree": "*" } }, + "node_modules/@types/fontkit": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/fontkit/-/fontkit-2.0.8.tgz", + "integrity": "sha512-wN+8bYxIpJf+5oZdrdtaX04qUuWHcKxcDEgRS9Qm9ZClSHjzEn13SxUC+5eRM+4yXIeTYk8mTzLAWGF64847ew==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/hast": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", @@ -2594,6 +2485,12 @@ "@types/unist": "*" } }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "license": "MIT" + }, "node_modules/@types/mdast": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", @@ -2788,9 +2685,9 @@ "license": "MIT" }, "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -2898,6 +2795,31 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -2939,84 +2861,103 @@ } }, "node_modules/astro": { - "version": "4.16.17", - "resolved": "https://registry.npmjs.org/astro/-/astro-4.16.17.tgz", - "integrity": "sha512-OuD+BP7U6OqQLKtZ/FJkU2S+TOlifxS/OKUbZOb5p6y+LLBa1J3zHRJrIl7DUSq6eXY+9wSWwbJpD9JS+lqhxA==", + "version": "5.15.6", + "resolved": "https://registry.npmjs.org/astro/-/astro-5.15.6.tgz", + "integrity": "sha512-luLcw+FGkeUHYTfbmYjIWHB4T0D+3VSjCy8DKTXglJ2O3lU40AbwmPVBcnqhRnA1SneKzP5V5pzqjsHzUZ1+Rg==", "license": "MIT", "dependencies": { - "@astrojs/compiler": "^2.10.3", - "@astrojs/internal-helpers": "0.4.1", - "@astrojs/markdown-remark": "5.3.0", - "@astrojs/telemetry": "3.1.0", - "@babel/core": "^7.26.0", - "@babel/plugin-transform-react-jsx": "^7.25.9", - "@babel/types": "^7.26.0", + "@astrojs/compiler": "^2.13.0", + "@astrojs/internal-helpers": "0.7.4", + "@astrojs/markdown-remark": "6.3.8", + "@astrojs/telemetry": "3.3.0", + "@capsizecss/unpack": "^3.0.0", "@oslojs/encoding": "^1.1.0", - "@rollup/pluginutils": "^5.1.3", - "@types/babel__core": "^7.20.5", - "@types/cookie": "^0.6.0", - "acorn": "^8.14.0", + "@rollup/pluginutils": "^5.3.0", + "acorn": "^8.15.0", "aria-query": "^5.3.2", "axobject-query": "^4.1.0", "boxen": "8.0.1", - "ci-info": "^4.1.0", + "ci-info": "^4.3.1", "clsx": "^2.1.1", "common-ancestor-path": "^1.0.1", - "cookie": "^0.7.2", + "cookie": "^1.0.2", "cssesc": "^3.0.0", - "debug": "^4.3.7", + "debug": "^4.4.3", "deterministic-object-hash": "^2.0.2", - "devalue": "^5.1.1", + "devalue": "^5.4.2", "diff": "^5.2.0", "dlv": "^1.1.3", "dset": "^3.1.4", - "es-module-lexer": "^1.5.4", - "esbuild": "^0.21.5", + "es-module-lexer": "^1.7.0", + "esbuild": "^0.25.0", "estree-walker": "^3.0.3", - "fast-glob": "^3.3.2", "flattie": "^1.1.1", + "fontace": "~0.3.1", "github-slugger": "^2.0.0", - "gray-matter": "^4.0.3", - "html-escaper": "^3.0.3", - "http-cache-semantics": "^4.1.1", + "html-escaper": "3.0.3", + "http-cache-semantics": "^4.2.0", + "import-meta-resolve": "^4.2.0", "js-yaml": "^4.1.0", - "kleur": "^4.1.5", - "magic-string": "^0.30.14", - "magicast": "^0.3.5", - "micromatch": "^4.0.8", - "mrmime": "^2.0.0", + "magic-string": "^0.30.21", + "magicast": "^0.5.1", + "mrmime": "^2.0.1", "neotraverse": "^0.6.18", - "ora": "^8.1.1", - "p-limit": "^6.1.0", - "p-queue": "^8.0.1", - "preferred-pm": "^4.0.0", + "p-limit": "^6.2.0", + "p-queue": "^8.1.1", + "package-manager-detector": "^1.5.0", + "picocolors": "^1.1.1", + "picomatch": "^4.0.3", "prompts": "^2.4.2", "rehype": "^13.0.2", - "semver": "^7.6.3", - "shiki": "^1.23.1", - "tinyexec": "^0.3.1", - "tsconfck": "^3.1.4", + "semver": "^7.7.3", + "shiki": "^3.15.0", + "smol-toml": "^1.4.2", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tsconfck": "^3.1.6", + "ultrahtml": "^1.6.0", + "unifont": "~0.6.0", "unist-util-visit": "^5.0.0", + "unstorage": "^1.17.2", "vfile": "^6.0.3", - "vite": "^5.4.11", - "vitefu": "^1.0.4", - "which-pm": "^3.0.0", + "vite": "^6.4.1", + "vitefu": "^1.1.1", "xxhash-wasm": "^1.1.0", "yargs-parser": "^21.1.1", - "zod": "^3.23.8", - "zod-to-json-schema": "^3.23.5", + "yocto-spinner": "^0.2.3", + "zod": "^3.25.76", + "zod-to-json-schema": "^3.24.6", "zod-to-ts": "^1.2.0" }, "bin": { "astro": "astro.js" }, "engines": { - "node": "^18.17.1 || ^20.3.0 || >=21.0.0", + "node": "18.20.8 || ^20.3.0 || >=22.0.0", "npm": ">=9.6.5", "pnpm": ">=7.1.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/astrodotbuild" + }, "optionalDependencies": { - "sharp": "^0.33.3" + "sharp": "^0.34.0" + } + }, + "node_modules/astro-d2": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/astro-d2/-/astro-d2-0.5.2.tgz", + "integrity": "sha512-JN5kHalh/dQIZD6JG8y+WXY/j+K9NigyW7dLa+VbPeQnoNkRbvVms6847gqU5czojR7uzpArL7ug27vKae4lQg==", + "license": "MIT", + "dependencies": { + "unist-util-visit": "5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "astro": ">=4.0.0" } }, "node_modules/astro-expressive-code": { @@ -3047,6 +2988,565 @@ "node": ">=18.14.1" } }, + "node_modules/astro/node_modules/@astrojs/markdown-remark": { + "version": "6.3.8", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-6.3.8.tgz", + "integrity": "sha512-uFNyFWadnULWK2cOw4n0hLKeu+xaVWeuECdP10cQ3K2fkybtTlhb7J7TcScdjmS8Yps7oje9S/ehYMfZrhrgCg==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.7.4", + "@astrojs/prism": "3.3.0", + "github-slugger": "^2.0.0", + "hast-util-from-html": "^2.0.3", + "hast-util-to-text": "^4.0.2", + "import-meta-resolve": "^4.2.0", + "js-yaml": "^4.1.0", + "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", + "shiki": "^3.13.0", + "smol-toml": "^1.4.2", + "unified": "^11.0.5", + "unist-util-remove-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.1", + "vfile": "^6.0.3" + } + }, + "node_modules/astro/node_modules/@astrojs/prism": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.3.0.tgz", + "integrity": "sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==", + "license": "MIT", + "dependencies": { + "prismjs": "^1.30.0" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + } + }, + "node_modules/astro/node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@shikijs/core": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.15.0.tgz", + "integrity": "sha512-8TOG6yG557q+fMsSVa8nkEDOZNTSxjbbR8l6lF2gyr6Np+jrPlslqDxQkN6rMXCECQ3isNPZAGszAfYoJOPGlg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.15.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" + } + }, + "node_modules/astro/node_modules/@shikijs/engine-javascript": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.15.0.tgz", + "integrity": "sha512-ZedbOFpopibdLmvTz2sJPJgns8Xvyabe2QbmqMTz07kt1pTzfEvKZc5IqPVO/XFiEbbNyaOpjPBkkr1vlwS+qg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.15.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.3" + } + }, + "node_modules/astro/node_modules/@shikijs/engine-oniguruma": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.15.0.tgz", + "integrity": "sha512-HnqFsV11skAHvOArMZdLBZZApRSYS4LSztk2K3016Y9VCyZISnlYUYsL2hzlS7tPqKHvNqmI5JSUJZprXloMvA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.15.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/astro/node_modules/@shikijs/types": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.15.0.tgz", + "integrity": "sha512-BnP+y/EQnhihgHy4oIAN+6FFtmfTekwOLsQbRw9hOKwqgNy8Bdsjq8B05oAt/ZgvIWWFrshV71ytOrlPfYjIJw==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/astro/node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "license": "MIT" + }, + "node_modules/astro/node_modules/oniguruma-to-es": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.3.tgz", + "integrity": "sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==", + "license": "MIT", + "dependencies": { + "oniguruma-parser": "^0.12.1", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/astro/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/astro/node_modules/regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.0.1.tgz", + "integrity": "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/astro/node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/astro/node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/astro/node_modules/shiki": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.15.0.tgz", + "integrity": "sha512-kLdkY6iV3dYbtPwS9KXU7mjfmDm25f5m0IPNFnaXO7TBPcvbUOY72PYXSuSqDzwp+vlH/d7MXpHlKO/x+QoLXw==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "3.15.0", + "@shikijs/engine-javascript": "3.15.0", + "@shikijs/engine-oniguruma": "3.15.0", + "@shikijs/langs": "3.15.0", + "@shikijs/themes": "3.15.0", + "@shikijs/types": "3.15.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/astro/node_modules/ultrahtml": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.6.0.tgz", + "integrity": "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==", + "license": "MIT" + }, "node_modules/axobject-query": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", @@ -3072,6 +3572,26 @@ "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==", "license": "MIT" }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/bcp-47": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-2.1.0.tgz", @@ -3137,6 +3657,15 @@ "node": ">=8" } }, + "node_modules/brotli": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", + "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.1.2" + } + }, "node_modules/browserslist": { "version": "4.24.2", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", @@ -3264,9 +3793,9 @@ } }, "node_modules/chokidar": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", - "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "license": "MIT", "dependencies": { "readdirp": "^4.0.1" @@ -3279,9 +3808,9 @@ } }, "node_modules/ci-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.1.0.tgz", - "integrity": "sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", "funding": [ { "type": "github", @@ -3305,33 +3834,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "license": "MIT", - "dependencies": { - "restore-cursor": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -3419,6 +3921,15 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -3502,12 +4013,27 @@ "license": "MIT" }, "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=18" + } + }, + "node_modules/cookie-es": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.2.tgz", + "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==", + "license": "MIT" + }, + "node_modules/crossws": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz", + "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==", + "license": "MIT", + "dependencies": { + "uncrypto": "^0.1.3" } }, "node_modules/css-select": { @@ -3542,6 +4068,19 @@ ], "license": "MIT" }, + "node_modules/css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, "node_modules/css-what": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", @@ -3579,9 +4118,9 @@ "license": "MIT" }, "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -3608,6 +4147,12 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "license": "MIT" + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -3617,10 +4162,16 @@ "node": ">=6" } }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "license": "MIT" + }, "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "license": "Apache-2.0", "engines": { "node": ">=8" @@ -3639,9 +4190,9 @@ } }, "node_modules/devalue": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.1.1.tgz", - "integrity": "sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.5.0.tgz", + "integrity": "sha512-69sM5yrHfFLJt0AZ9QqZXGCPfJ7fQjvpln3Rq5+PS03LD32Ost1Q9N+eEnaQwGRIriKkMImXD56ocjQmfjbV3w==", "license": "MIT" }, "node_modules/devlop": { @@ -3657,6 +4208,12 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/dfa": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", + "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==", + "license": "MIT" + }, "node_modules/diff": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", @@ -3796,9 +4353,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", "license": "MIT" }, "node_modules/esast-util-from-estree": { @@ -3834,41 +4391,44 @@ } }, "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", "hasInstallScript": true, "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" } }, "node_modules/escalade": { @@ -4091,6 +4651,23 @@ "reusify": "^1.0.4" } }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -4103,41 +4680,6 @@ "node": ">=8" } }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up-simple": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz", - "integrity": "sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-yarn-workspace-root2": { - "version": "1.2.16", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz", - "integrity": "sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==", - "license": "Apache-2.0", - "dependencies": { - "micromatch": "^4.0.2", - "pkg-dir": "^4.2.0" - } - }, "node_modules/flattie": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz", @@ -4147,6 +4689,33 @@ "node": ">=8" } }, + "node_modules/fontace": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/fontace/-/fontace-0.3.1.tgz", + "integrity": "sha512-9f5g4feWT1jWT8+SbL85aLIRLIXUaDygaM2xPXRmzPYxrOMNok79Lr3FGJoKVNKibE0WCunNiEVG2mwuE+2qEg==", + "license": "MIT", + "dependencies": { + "@types/fontkit": "^2.0.8", + "fontkit": "^2.0.4" + } + }, + "node_modules/fontkit": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-2.0.4.tgz", + "integrity": "sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==", + "license": "MIT", + "dependencies": { + "@swc/helpers": "^0.5.12", + "brotli": "^1.3.2", + "clone": "^2.1.2", + "dfa": "^1.2.0", + "fast-deep-equal": "^3.1.3", + "restructure": "^3.0.0", + "tiny-inflate": "^1.0.3", + "unicode-properties": "^1.4.0", + "unicode-trie": "^2.0.0" + } + }, "node_modules/framer-motion": { "version": "11.14.4", "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.14.4.tgz", @@ -4245,12 +4814,6 @@ "node": ">=4" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, "node_modules/gray-matter": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", @@ -4288,6 +4851,23 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/h3": { + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.4.tgz", + "integrity": "sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==", + "license": "MIT", + "dependencies": { + "cookie-es": "^1.2.2", + "crossws": "^0.3.5", + "defu": "^6.1.4", + "destr": "^2.0.5", + "iron-webcrypto": "^1.2.1", + "node-mock-http": "^1.0.2", + "radix3": "^1.1.2", + "ufo": "^1.6.1", + "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", @@ -4541,9 +5121,9 @@ } }, "node_modules/hast-util-to-html": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.3.tgz", - "integrity": "sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -4553,7 +5133,7 @@ "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", - "property-information": "^6.0.0", + "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" @@ -4563,6 +5143,16 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-to-html/node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/hast-util-to-jsx-runtime": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.2.tgz", @@ -4714,9 +5304,9 @@ } }, "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "license": "BSD-2-Clause" }, "node_modules/i18next": { @@ -4743,9 +5333,9 @@ } }, "node_modules/import-meta-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", - "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", "license": "MIT", "funding": { "type": "github", @@ -4758,6 +5348,15 @@ "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", "license": "MIT" }, + "node_modules/iron-webcrypto": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", + "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/brc-dd" + } + }, "node_modules/is-absolute-url": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", @@ -4892,18 +5491,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -4925,18 +5512,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-unicode-supported": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", - "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-wsl": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", @@ -5043,89 +5618,12 @@ "integrity": "sha512-gFfVVnj6NRjxVfJKo3qoLtpi0v5mn3AcR4eKD45wrxQuxzveFJUb+7Cr6uV6n+DjO8X3p0UzPPquhGt0H/y+NA==", "license": "Apache-2.0" }, - "node_modules/load-yaml-file": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz", - "integrity": "sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.5", - "js-yaml": "^3.13.0", - "pify": "^4.0.1", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/load-yaml-file/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/load-yaml-file/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "license": "MIT" }, - "node_modules/log-symbols": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", - "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "is-unicode-supported": "^1.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", @@ -5146,23 +5644,23 @@ } }, "node_modules/magic-string": { - "version": "0.30.14", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.14.tgz", - "integrity": "sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==", + "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.0" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/magicast": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", - "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.1.tgz", + "integrity": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.25.4", - "@babel/types": "^7.25.4", - "source-map-js": "^1.2.0" + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "source-map-js": "^1.2.1" } }, "node_modules/markdown-extensions": { @@ -5551,6 +6049,12 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "license": "CC0-1.0" + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -6323,18 +6827,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/motion": { "version": "11.14.4", "resolved": "https://registry.npmjs.org/motion/-/motion-11.14.4.tgz", @@ -6374,9 +6866,9 @@ "license": "MIT" }, "node_modules/mrmime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", - "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", "license": "MIT", "engines": { "node": ">=10" @@ -6395,9 +6887,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "funding": [ { "type": "github", @@ -6434,12 +6926,33 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", + "license": "MIT" + }, + "node_modules/node-mock-http": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.3.tgz", + "integrity": "sha512-jN8dK25fsfnMrVsEhluUTPkBFY+6ybu7jSB1n+ri/vOGjJxU8J9CZhpSGkHXSkFjtUhbmoncG/YG9ta5Ludqog==", + "license": "MIT" + }, "node_modules/node-releases": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "license": "MIT" }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -6452,21 +6965,29 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "node_modules/ofetch": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz", + "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==", "license": "MIT", "dependencies": { - "mimic-function": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "destr": "^2.0.5", + "node-fetch-native": "^1.6.7", + "ufo": "^1.6.1" } }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "license": "MIT" + }, + "node_modules/oniguruma-parser": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz", + "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==", + "license": "MIT" + }, "node_modules/oniguruma-to-es": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-0.7.0.tgz", @@ -6478,33 +6999,10 @@ "regex-recursion": "^4.3.0" } }, - "node_modules/ora": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-8.1.1.tgz", - "integrity": "sha512-YWielGi1XzG1UTvOaCFaNgEnuhZVMSHYkW/FQ7UX8O26PtlpdM84c0f7wLPlkvx2RfiQmnzd61d/MGxmpQeJPw==", - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "cli-cursor": "^5.0.0", - "cli-spinners": "^2.9.2", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^2.0.0", - "log-symbols": "^6.0.0", - "stdin-discarder": "^0.2.2", - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-limit": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.1.0.tgz", - "integrity": "sha512-H0jc0q1vOzlEk0TqAKXKZxdl7kX3OFUzCnNVUnq5Pc3DGo0kpeaMuPqxQn235HibwBEb0/pm9dgKTjXy66fBkg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.2.0.tgz", + "integrity": "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==", "license": "MIT", "dependencies": { "yocto-queue": "^1.1.1" @@ -6516,37 +7014,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-queue": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.0.1.tgz", - "integrity": "sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.1.1.tgz", + "integrity": "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==", "license": "MIT", "dependencies": { "eventemitter3": "^5.0.1", @@ -6560,9 +7031,9 @@ } }, "node_modules/p-timeout": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.3.tgz", - "integrity": "sha512-UJUyfKbwvr/uZSV6btANfb+0t/mOhKV/KXcCUTp8FcQI+v/0d+wXqH4htrW0E4rR6WiEO/EPvUFiV9D5OI4vlw==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", "license": "MIT", "engines": { "node": ">=14.16" @@ -6571,14 +7042,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } + "node_modules/package-manager-detector": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.5.0.tgz", + "integrity": "sha512-uBj69dVlYe/+wxj8JOpr97XfsxH/eumMt6HqjNTmJDf/6NO9s+0uxeOneIz3AsPt2m6y9PqzDzd3ATcU17MNfw==", + "license": "MIT" }, "node_modules/pagefind": { "version": "1.2.0", @@ -6596,6 +7064,12 @@ "@pagefind/windows-x64": "1.2.0" } }, + "node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "license": "MIT" + }, "node_modules/parse-entities": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", @@ -6658,15 +7132,6 @@ "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", "license": "MIT" }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -6685,31 +7150,10 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "funding": [ { "type": "opencollective", @@ -6726,7 +7170,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", + "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -6772,24 +7216,10 @@ "node": ">=4" } }, - "node_modules/preferred-pm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-4.0.0.tgz", - "integrity": "sha512-gYBeFTZLu055D8Vv3cSPox/0iTPtkzxpLroSYYA7WXgRi31WCJ51Uyl8ZiPeUUjyvs2MBzK+S8v9JVUgHU/Sqw==", - "license": "MIT", - "dependencies": { - "find-up-simple": "^1.0.0", - "find-yarn-workspace-root2": "1.2.16", - "which-pm": "^3.0.0" - }, - "engines": { - "node": ">=18.12" - } - }, "node_modules/prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", "license": "MIT", "engines": { "node": ">=6" @@ -6847,6 +7277,12 @@ ], "license": "MIT" }, + "node_modules/radix3": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", + "license": "MIT" + }, "node_modules/react": { "version": "19.0.0", "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", @@ -7100,9 +7536,9 @@ } }, "node_modules/remark-gfm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", - "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", @@ -7148,9 +7584,9 @@ } }, "node_modules/remark-rehype": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.1.tgz", - "integrity": "sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==", + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -7218,21 +7654,11 @@ "node": ">=0.10.0" } }, - "node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", - "license": "MIT", - "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/restructure": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/restructure/-/restructure-3.0.2.tgz", + "integrity": "sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==", + "license": "MIT" }, "node_modules/retext": { "version": "9.0.0", @@ -7306,12 +7732,12 @@ } }, "node_modules/rollup": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.28.1.tgz", - "integrity": "sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.2.tgz", + "integrity": "sha512-MHngMYwGJVi6Fmnk6ISmnk7JAHRNF0UkuucA0CUW3N3a4KnONPEZz+vUanQP/ZC/iY1Qkf3bwPWzyY84wEks1g==", "license": "MIT", "dependencies": { - "@types/estree": "1.0.6" + "@types/estree": "1.0.8" }, "bin": { "rollup": "dist/bin/rollup" @@ -7321,25 +7747,28 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.28.1", - "@rollup/rollup-android-arm64": "4.28.1", - "@rollup/rollup-darwin-arm64": "4.28.1", - "@rollup/rollup-darwin-x64": "4.28.1", - "@rollup/rollup-freebsd-arm64": "4.28.1", - "@rollup/rollup-freebsd-x64": "4.28.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.28.1", - "@rollup/rollup-linux-arm-musleabihf": "4.28.1", - "@rollup/rollup-linux-arm64-gnu": "4.28.1", - "@rollup/rollup-linux-arm64-musl": "4.28.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.28.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.28.1", - "@rollup/rollup-linux-riscv64-gnu": "4.28.1", - "@rollup/rollup-linux-s390x-gnu": "4.28.1", - "@rollup/rollup-linux-x64-gnu": "4.28.1", - "@rollup/rollup-linux-x64-musl": "4.28.1", - "@rollup/rollup-win32-arm64-msvc": "4.28.1", - "@rollup/rollup-win32-ia32-msvc": "4.28.1", - "@rollup/rollup-win32-x64-msvc": "4.28.1", + "@rollup/rollup-android-arm-eabi": "4.53.2", + "@rollup/rollup-android-arm64": "4.53.2", + "@rollup/rollup-darwin-arm64": "4.53.2", + "@rollup/rollup-darwin-x64": "4.53.2", + "@rollup/rollup-freebsd-arm64": "4.53.2", + "@rollup/rollup-freebsd-x64": "4.53.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.53.2", + "@rollup/rollup-linux-arm-musleabihf": "4.53.2", + "@rollup/rollup-linux-arm64-gnu": "4.53.2", + "@rollup/rollup-linux-arm64-musl": "4.53.2", + "@rollup/rollup-linux-loong64-gnu": "4.53.2", + "@rollup/rollup-linux-ppc64-gnu": "4.53.2", + "@rollup/rollup-linux-riscv64-gnu": "4.53.2", + "@rollup/rollup-linux-riscv64-musl": "4.53.2", + "@rollup/rollup-linux-s390x-gnu": "4.53.2", + "@rollup/rollup-linux-x64-gnu": "4.53.2", + "@rollup/rollup-linux-x64-musl": "4.53.2", + "@rollup/rollup-openharmony-arm64": "4.53.2", + "@rollup/rollup-win32-arm64-msvc": "4.53.2", + "@rollup/rollup-win32-ia32-msvc": "4.53.2", + "@rollup/rollup-win32-x64-gnu": "4.53.2", + "@rollup/rollup-win32-x64-msvc": "4.53.2", "fsevents": "~2.3.2" } }, @@ -7392,9 +7821,9 @@ } }, "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -7456,18 +7885,6 @@ "@types/hast": "^3.0.4" } }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", @@ -7518,13 +7935,25 @@ "smartypantsu": "bin/smartypantsu.js" } }, - "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "node_modules/smol-toml": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.5.0.tgz", + "integrity": "sha512-Jjsa8LZ+DyLbZ7gVi9d18bS8oxq0PQrTlVDfvYXgh7gxLwbW9QWgvakHD+hBLUtr5NahfStd8LQLGSPchaEJ8Q==", "license": "BSD-3-Clause", "engines": { - "node": ">= 8" + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" } }, "node_modules/source-map-js": { @@ -7648,18 +8077,6 @@ "@astrojs/starlight": ">=0.23.0" } }, - "node_modules/stdin-discarder": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", - "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/stream-replace-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/stream-replace-string/-/stream-replace-string-2.0.0.tgz", @@ -7712,15 +8129,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/strip-bom-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", @@ -7745,12 +8153,49 @@ "inline-style-parser": "0.2.4" } }, - "node_modules/tinyexec": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz", - "integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==", + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", "license": "MIT" }, + "node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -7784,9 +8229,9 @@ } }, "node_modules/tsconfck": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.4.tgz", - "integrity": "sha512-kdqWFGVJqe+KGYvlSO9NIaWn9jT1Ny4oKVzAJsKii5eoE9snzTJzL4+MMVOMn+fikWGFmKEylcXL710V/kIPJQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", + "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", "license": "MIT", "bin": { "tsconfck": "bin/tsconfck.js" @@ -7849,6 +8294,12 @@ "semver": "^7.3.8" } }, + "node_modules/ufo": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", + "license": "MIT" + }, "node_modules/uhyphen": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/uhyphen/-/uhyphen-0.2.0.tgz", @@ -7861,12 +8312,38 @@ "integrity": "sha512-GykOvZwgDWZlTQMtp5jrD4BVL+gNn2NVlVafjcFUJ7taY20tqYdwdoWBFy6GBJsNTZe1GkGPkSl5knQAjtgceg==", "license": "MIT" }, + "node_modules/uncrypto": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", + "license": "MIT" + }, "node_modules/undici-types": { "version": "6.20.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", "license": "MIT" }, + "node_modules/unicode-properties": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz", + "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.0", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/unicode-trie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", + "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "license": "MIT", + "dependencies": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + } + }, "node_modules/unified": { "version": "11.0.5", "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", @@ -7886,6 +8363,17 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unifont": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.6.0.tgz", + "integrity": "sha512-5Fx50fFQMQL5aeHyWnZX9122sSLckcDvcfFiBf3QYeHa7a1MKJooUy52b67moi2MJYkrfo/TWY+CoLdr/w0tTA==", + "license": "MIT", + "dependencies": { + "css-tree": "^3.0.0", + "ofetch": "^1.4.1", + "ohash": "^2.0.0" + } + }, "node_modules/unist-util-find-after": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", @@ -8022,6 +8510,108 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unstorage": { + "version": "1.17.2", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.2.tgz", + "integrity": "sha512-cKEsD6iBWJgOMJ6vW1ID/SYuqNf8oN4yqRk8OYqaVQ3nnkJXOT1PSpaMh2QfzLs78UN5kSNRD2c/mgjT8tX7+w==", + "license": "MIT", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^4.0.3", + "destr": "^2.0.5", + "h3": "^1.15.4", + "lru-cache": "^10.4.3", + "node-fetch-native": "^1.6.7", + "ofetch": "^1.5.0", + "ufo": "^1.6.1" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6.0.3 || ^7.0.0", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/functions": "^2.2.12 || ^3.0.0", + "@vercel/kv": "^1.0.1", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/functions": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { + "optional": true + } + } + }, + "node_modules/unstorage/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, "node_modules/update-browserslist-db": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", @@ -8101,20 +8691,23 @@ } }, "node_modules/vite": { - "version": "5.4.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", - "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "license": "MIT", "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -8123,19 +8716,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", - "terser": "^5.4.0" + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -8156,20 +8755,27 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, "node_modules/vitefu": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.0.4.tgz", - "integrity": "sha512-y6zEE3PQf6uu/Mt6DTJ9ih+kyJLr4XcSgHR2zUkM8SWDhuixEJxfJ6CZGMHh1Ec3vPLoEA0IHU5oWzVqw8ulow==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz", + "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", "license": "MIT", "workspaces": [ "tests/deps/*", - "tests/projects/*" + "tests/projects/*", + "tests/projects/workspace/packages/*" ], "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" }, "peerDependenciesMeta": { "vite": { @@ -8424,18 +9030,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/which-pm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-3.0.0.tgz", - "integrity": "sha512-ysVYmw6+ZBhx3+ZkcPwRuJi38ZOTLJJ33PSHaitLxSKUMsh0LkKd0nC69zZCwt5D+AYUcMK2hhw4yWny20vSGg==", - "license": "MIT", - "dependencies": { - "load-yaml-file": "^0.2.0" - }, - "engines": { - "node": ">=18.12" - } - }, "node_modules/which-pm-runs": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", @@ -8671,9 +9265,9 @@ } }, "node_modules/yocto-queue": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", - "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", "license": "MIT", "engines": { "node": ">=12.20" @@ -8682,22 +9276,49 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/yocto-spinner": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/yocto-spinner/-/yocto-spinner-0.2.3.tgz", + "integrity": "sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ==", + "license": "MIT", + "dependencies": { + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": ">=18.19" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", + "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zod": { - "version": "3.23.8", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", - "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } }, "node_modules/zod-to-json-schema": { - "version": "3.23.5", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.23.5.tgz", - "integrity": "sha512-5wlSS0bXfF/BrL4jPAbz9da5hDlDptdEppYfe+x4eIJ7jioqKG9uUxOwPzqof09u/XeVdrgFu29lZi+8XNDJtA==", + "version": "3.24.6", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", + "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", "license": "ISC", "peerDependencies": { - "zod": "^3.23.3" + "zod": "^3.24.1" } }, "node_modules/zod-to-ts": { diff --git a/docs/package.json b/docs/package.json index e07456279..d144466a2 100644 --- a/docs/package.json +++ b/docs/package.json @@ -10,21 +10,22 @@ "astro": "astro" }, "dependencies": { - "@astrojs/check": "0.9.4", - "@astrojs/react": "4.1.0", - "@astrojs/starlight": "0.29.2", - "@types/react": "19.0.1", - "@types/react-dom": "19.0.2", - "astro": "4.16.17", - "framer-motion": "11.14.4", - "motion": "11.14.4", - "react": "19.0.0", - "react-dom": "19.0.0", - "sharp": "0.33.5", - "starlight-blog": "0.15.0", - "starlight-image-zoom": "0.9.0", - "starlight-links-validator": "0.13.4", - "starlight-showcases": "0.2.0", - "typescript": "5.7.2" + "@astrojs/check": "^0.9.4", + "@astrojs/react": "^4.1.0", + "@astrojs/starlight": "^0.30.0", + "@types/react": "^19.0.1", + "@types/react-dom": "^19.0.2", + "astro": "^5.0.0", + "astro-d2": "^0.5.0", + "framer-motion": "^11.14.4", + "motion": "^11.14.4", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "sharp": "^0.33.5", + "starlight-blog": "^0.15.0", + "starlight-image-zoom": "^0.9.0", + "starlight-links-validator": "^0.13.4", + "starlight-showcases": "^0.2.0", + "typescript": "^5.7.2" } } diff --git a/docs/public/showcase-images/bboard.webp b/docs/public/showcase-images/bboard.webp new file mode 100644 index 000000000..463d25de0 Binary files /dev/null and b/docs/public/showcase-images/bboard.webp differ diff --git a/docs/public/showcase-images/cfntracker.webp b/docs/public/showcase-images/cfntracker.webp new file mode 100644 index 000000000..6a2288a5c Binary files /dev/null and b/docs/public/showcase-images/cfntracker.webp differ diff --git a/docs/public/showcase-images/edex-ui.webp b/docs/public/showcase-images/edex-ui.webp new file mode 100644 index 000000000..110ca1acf Binary files /dev/null and b/docs/public/showcase-images/edex-ui.webp differ diff --git a/docs/public/showcase-images/emailit.webp b/docs/public/showcase-images/emailit.webp new file mode 100644 index 000000000..fc1b9a51a Binary files /dev/null and b/docs/public/showcase-images/emailit.webp differ diff --git a/docs/public/showcase-images/encrypteasy.webp b/docs/public/showcase-images/encrypteasy.webp new file mode 100644 index 000000000..c0789a3e3 Binary files /dev/null and b/docs/public/showcase-images/encrypteasy.webp differ diff --git a/docs/public/showcase-images/filehound.webp b/docs/public/showcase-images/filehound.webp new file mode 100644 index 000000000..92769ca8e Binary files /dev/null and b/docs/public/showcase-images/filehound.webp differ diff --git a/docs/public/showcase-images/gamestacker.webp b/docs/public/showcase-images/gamestacker.webp new file mode 100644 index 000000000..432e6eaed Binary files /dev/null and b/docs/public/showcase-images/gamestacker.webp differ diff --git a/docs/public/showcase-images/hiposter.webp b/docs/public/showcase-images/hiposter.webp new file mode 100644 index 000000000..7c7510ea1 Binary files /dev/null and b/docs/public/showcase-images/hiposter.webp differ diff --git a/docs/public/showcase-images/mchat.webp b/docs/public/showcase-images/mchat.webp new file mode 100644 index 000000000..393b6f77b Binary files /dev/null and b/docs/public/showcase-images/mchat.webp differ diff --git a/docs/public/showcase-images/minecraft-mod-updater.webp b/docs/public/showcase-images/minecraft-mod-updater.webp new file mode 100644 index 000000000..c8e011cf3 Binary files /dev/null and b/docs/public/showcase-images/minecraft-mod-updater.webp differ diff --git a/docs/public/showcase-images/minesweeper-xp.webp b/docs/public/showcase-images/minesweeper-xp.webp new file mode 100644 index 000000000..b3c5ca26b Binary files /dev/null and b/docs/public/showcase-images/minesweeper-xp.webp differ diff --git a/docs/public/showcase-images/modalfilemanager.webp b/docs/public/showcase-images/modalfilemanager.webp new file mode 100644 index 000000000..2fdf219fc Binary files /dev/null and b/docs/public/showcase-images/modalfilemanager.webp differ diff --git a/docs/public/showcase-images/mollywallet.webp b/docs/public/showcase-images/mollywallet.webp new file mode 100644 index 000000000..11641f8ca Binary files /dev/null and b/docs/public/showcase-images/mollywallet.webp differ diff --git a/docs/public/showcase-images/october.webp b/docs/public/showcase-images/october.webp new file mode 100644 index 000000000..ceec1c573 Binary files /dev/null and b/docs/public/showcase-images/october.webp differ diff --git a/docs/public/showcase-images/optimus.webp b/docs/public/showcase-images/optimus.webp new file mode 100644 index 000000000..0aac84058 Binary files /dev/null and b/docs/public/showcase-images/optimus.webp differ diff --git a/docs/public/showcase-images/portfall.webp b/docs/public/showcase-images/portfall.webp new file mode 100644 index 000000000..12f8d6e5b Binary files /dev/null and b/docs/public/showcase-images/portfall.webp differ diff --git a/docs/public/showcase-images/resizem.webp b/docs/public/showcase-images/resizem.webp new file mode 100644 index 000000000..aaee1c806 Binary files /dev/null and b/docs/public/showcase-images/resizem.webp differ diff --git a/docs/public/showcase-images/riftshare-main.webp b/docs/public/showcase-images/riftshare-main.webp new file mode 100644 index 000000000..2d6a8fb3a Binary files /dev/null and b/docs/public/showcase-images/riftshare-main.webp differ diff --git a/docs/public/showcase-images/scriptbar.webp b/docs/public/showcase-images/scriptbar.webp new file mode 100644 index 000000000..92463fdb9 Binary files /dev/null and b/docs/public/showcase-images/scriptbar.webp differ diff --git a/docs/public/showcase-images/tiny-rdm1.webp b/docs/public/showcase-images/tiny-rdm1.webp new file mode 100644 index 000000000..11b375580 Binary files /dev/null and b/docs/public/showcase-images/tiny-rdm1.webp differ diff --git a/docs/public/showcase-images/tiny-rdm2.webp b/docs/public/showcase-images/tiny-rdm2.webp new file mode 100644 index 000000000..9de730fb4 Binary files /dev/null and b/docs/public/showcase-images/tiny-rdm2.webp differ diff --git a/docs/public/showcase-images/varly2.webp b/docs/public/showcase-images/varly2.webp new file mode 100644 index 000000000..6dbe0c9bf Binary files /dev/null and b/docs/public/showcase-images/varly2.webp differ diff --git a/docs/public/showcase-images/wailsterm.webp b/docs/public/showcase-images/wailsterm.webp new file mode 100644 index 000000000..6d4251a75 Binary files /dev/null and b/docs/public/showcase-images/wailsterm.webp differ diff --git a/docs/public/showcase-images/wally.webp b/docs/public/showcase-images/wally.webp new file mode 100644 index 000000000..150c98c74 Binary files /dev/null and b/docs/public/showcase-images/wally.webp differ diff --git a/docs/public/showcase-images/wombat.webp b/docs/public/showcase-images/wombat.webp new file mode 100644 index 000000000..97f965834 Binary files /dev/null and b/docs/public/showcase-images/wombat.webp differ diff --git a/docs/public/showcase-images/ytd.webp b/docs/public/showcase-images/ytd.webp new file mode 100644 index 000000000..c7988cee5 Binary files /dev/null and b/docs/public/showcase-images/ytd.webp differ diff --git a/docs/src/assets/notes-app.png b/docs/src/assets/notes-app.png new file mode 100644 index 000000000..4e4953204 Binary files /dev/null and b/docs/src/assets/notes-app.png differ diff --git a/docs/src/assets/todo-app.png b/docs/src/assets/todo-app.png new file mode 100644 index 000000000..319cc8fbf Binary files /dev/null and b/docs/src/assets/todo-app.png differ diff --git a/docs/src/content/docs/community/showcase/_template.md b/docs/src/content/docs/community/showcase/_template.md index 2ad8aab68..f98a2ef06 100644 --- a/docs/src/content/docs/community/showcase/_template.md +++ b/docs/src/content/docs/community/showcase/_template.md @@ -1,13 +1,25 @@ --- title: My Project +draft: true --- - + -![My Project](../../../../assets/showcase-images/my-project.webp) +![My Project Screenshot](../../../../assets/showcase-images/your-project.webp) - + - +Your project description goes here. Explain what it does, what makes it special, and why you built it with Wails. -[My Project](https://my-project.com) + + +[Visit Project Website](https://your-project.com) | [View on GitHub](https://github.com/yourusername/your-project) diff --git a/docs/src/content/docs/concepts/architecture.mdx b/docs/src/content/docs/concepts/architecture.mdx new file mode 100644 index 000000000..5b4fdd823 --- /dev/null +++ b/docs/src/content/docs/concepts/architecture.mdx @@ -0,0 +1,655 @@ +--- +title: How Wails Works +description: Understanding the Wails architecture and how it achieves native performance +sidebar: + order: 1 +--- + +import { Tabs, TabItem } from "@astrojs/starlight/components"; + +Wails is a framework for building desktop applications using **Go for the backend** and **web technologies for the frontend**. But unlike Electron, Wails doesn't bundle a browser—it uses the **operating system's native WebView**. + +```d2 +direction: right + +User: "User" { + shape: person + style.fill: "#3B82F6" +} + +Application: "Your Wails Application" { + Frontend: "Frontend\n(HTML/CSS/JS)" { + shape: rectangle + style.fill: "#8B5CF6" + } + + Runtime: "Wails Runtime" { + Bridge: "Message Bridge" { + shape: diamond + style.fill: "#10B981" + } + + Bindings: "Type-Safe Bindings" { + shape: rectangle + style.fill: "#10B981" + } + } + + Backend: "Go Backend" { + Services: "Your Services" { + shape: rectangle + style.fill: "#00ADD8" + } + + NativeAPIs: "OS APIs" { + shape: rectangle + style.fill: "#00ADD8" + } + } +} + +OS: "Operating System" { + WebView: "Native WebView\n(WebKit/WebView2/WebKitGTK)" { + shape: rectangle + style.fill: "#6B7280" + } + + SystemAPIs: "System APIs\n(Windows/macOS/Linux)" { + shape: rectangle + style.fill: "#6B7280" + } +} + +User -> Application.Frontend: "Interacts with UI" +Application.Frontend <-> Application.Runtime.Bridge: "JSON messages" +Application.Runtime.Bridge <-> Application.Backend.Services: "Direct function calls" +Application.Runtime.Bindings -> Application.Frontend: "TypeScript definitions" +Application.Frontend -> OS.WebView: "Renders in" +Application.Backend.NativeAPIs -> OS.SystemAPIs: "Native calls" +``` + +**Key differences from Electron:** + +| Aspect | Wails | Electron | +|--------|-------|----------| +| **Browser** | OS-provided WebView | Bundled Chromium (~100MB) | +| **Backend** | Go (compiled) | Node.js (interpreted) | +| **Communication** | In-memory bridge | IPC (inter-process) | +| **Bundle Size** | ~15MB | ~150MB | +| **Memory** | ~10MB | ~100MB+ | +| **Startup** | <0.5s | 2-3s | + +## Core Components + +### 1. Native WebView + +Wails uses the operating system's built-in web rendering engine: + + + + **WebView2** (Microsoft Edge WebView2) + - Based on Chromium (same as Edge browser) + - Pre-installed on Windows 10/11 + - Automatic updates via Windows Update + - Full modern web standards support + + + + **WebKit** (Safari's rendering engine) + - Built into macOS + - Same engine as Safari browser + - Excellent performance and battery life + - Full modern web standards support + + + + **WebKitGTK** (GTK port of WebKit) + - Installed via package manager + - Same engine as GNOME Web (Epiphany) + - Good standards support + - Lightweight and performant + + + +**Why this matters:** +- **No bundled browser** → Smaller app size +- **OS-native** → Better integration and performance +- **Auto-updates** → Security patches from OS updates +- **Familiar rendering** → Same as system browser + +### 2. The Wails Bridge + +The bridge is the heart of Wails—it enables **direct communication** between Go and JavaScript. + +```d2 +direction: down + +Frontend: "Frontend (JavaScript)" { + shape: rectangle + style.fill: "#8B5CF6" +} + +Bridge: "Wails Bridge" { + Encoder: "JSON Encoder" { + shape: rectangle + } + + Router: "Method Router" { + shape: diamond + style.fill: "#10B981" + } + + Decoder: "JSON Decoder" { + shape: rectangle + } +} + +Backend: "Backend (Go)" { + Services: "Registered Services" { + shape: rectangle + style.fill: "#00ADD8" + } +} + +Frontend -> Bridge.Encoder: "1. Call Go method\nGreet('Alice')" +Bridge.Encoder -> Bridge.Router: "2. Encode to JSON\n{method: 'Greet', args: ['Alice']}" +Bridge.Router -> Backend.Services: "3. Route to service\nGreetService.Greet('Alice')" +Backend.Services -> Bridge.Decoder: "4. Return result\n'Hello, Alice!'" +Bridge.Decoder -> Frontend: "5. Decode to JS\nPromise resolves" +``` + +**How it works:** + +1. **Frontend calls a Go method** (via auto-generated binding) +2. **Bridge encodes the call** to JSON (method name + arguments) +3. **Router finds the Go method** in registered services +4. **Go method executes** and returns a value +5. **Bridge decodes the result** and sends back to frontend +6. **Promise resolves** in JavaScript with the result + +**Performance characteristics:** +- **In-memory**: No network overhead, no HTTP +- **Zero-copy** where possible (for large data) +- **Async by default**: Non-blocking on both sides +- **Type-safe**: TypeScript definitions auto-generated + +### 3. Service System + +Services are the recommended way to expose Go functionality to the frontend. + +```go +// Define a service (just a regular Go struct) +type GreetService struct { + prefix string +} + +// Methods with exported names are automatically available +func (g *GreetService) Greet(name string) string { + return g.prefix + name + "!" +} + +func (g *GreetService) GetTime() time.Time { + return time.Now() +} + +// Register the service +app := application.New(application.Options{ + Services: []application.Service{ + application.NewService(&GreetService{prefix: "Hello, "}), + }, +}) +``` + +**Service discovery:** +- Wails **scans your struct** at startup +- **Exported methods** become callable from frontend +- **Type information** is extracted for TypeScript bindings +- **Error handling** is automatic (Go errors → JS exceptions) + +**Generated TypeScript binding:** +```typescript +// Auto-generated in frontend/bindings/GreetService.ts +export function Greet(name: string): Promise +export function GetTime(): Promise +``` + +**Why services?** +- **Type-safe**: Full TypeScript support +- **Auto-discovery**: No manual registration of methods +- **Organised**: Group related functionality +- **Testable**: Services are just Go structs + +[Learn more about services →](/features/bindings/services) + +### 4. Event System + +Events enable **pub/sub communication** between components. + +```d2 +direction: right + +GoService: "Go Service" { + shape: rectangle + style.fill: "#00ADD8" +} + +EventBus: "Event Bus" { + shape: cylinder + style.fill: "#10B981" +} + +Frontend1: "Window 1" { + shape: rectangle + style.fill: "#8B5CF6" +} + +Frontend2: "Window 2" { + shape: rectangle + style.fill: "#8B5CF6" +} + +GoService -> EventBus: "Emit('data-updated', data)" +EventBus -> Frontend1: "Notify subscribers" +EventBus -> Frontend2: "Notify subscribers" +Frontend1 -> EventBus: "On('data-updated', handler)" +Frontend2 -> EventBus: "On('data-updated', handler)" +``` + +**Use cases:** +- **Window communication**: One window notifies others +- **Background tasks**: Go service notifies UI of progress +- **State synchronisation**: Keep multiple windows in sync +- **Loose coupling**: Components don't need direct references + +**Example:** +```go +// Go: Emit an event +app.EmitEvent("user-logged-in", user) +``` + +```javascript +// JavaScript: Listen for event +import { On } from '@wailsio/runtime' + +On('user-logged-in', (user) => { + console.log('User logged in:', user) +}) +``` + +[Learn more about events →](/features/events/system) + +## Application Lifecycle + +Understanding the lifecycle helps you know when to initialise resources and clean up. + +```d2 +direction: down + +Start: "Application Start" { + shape: oval + style.fill: "#10B981" +} + +Init: "Initialisation" { + Create: "Create Application" { + shape: rectangle + } + + Register: "Register Services" { + shape: rectangle + } + + Setup: "Setup Windows/Menus" { + shape: rectangle + } +} + +Run: "Event Loop" { + Events: "Process Events" { + shape: rectangle + } + + Messages: "Handle Messages" { + shape: rectangle + } + + Render: "Update UI" { + shape: rectangle + } +} + +Shutdown: "Shutdown" { + Cleanup: "Cleanup Resources" { + shape: rectangle + } + + Save: "Save State" { + shape: rectangle + } +} + +End: "Application End" { + shape: oval + style.fill: "#EF4444" +} + +Start -> Init.Create +Init.Create -> Init.Register +Init.Register -> Init.Setup +Init.Setup -> Run.Events +Run.Events -> Run.Messages +Run.Messages -> Run.Render +Run.Render -> Run.Events: "Loop" +Run.Events -> Shutdown.Cleanup: "Quit signal" +Shutdown.Cleanup -> Shutdown.Save +Shutdown.Save -> End +``` + +**Lifecycle hooks:** + +```go +app := application.New(application.Options{ + Name: "My App", + + // Called before windows are created + OnStartup: func(ctx context.Context) { + // Initialise database, load config, etc. + }, + + // Called when app is about to quit + OnShutdown: func() { + // Save state, close connections, etc. + }, +}) +``` + +[Learn more about lifecycle →](/concepts/lifecycle) + +## Build Process + +Understanding how Wails builds your application: + +```d2 +direction: down + +Source: "Source Code" { + Go: "Go Code\n(main.go, services)" { + shape: rectangle + style.fill: "#00ADD8" + } + + Frontend: "Frontend Code\n(HTML/CSS/JS)" { + shape: rectangle + style.fill: "#8B5CF6" + } +} + +Build: "Build Process" { + AnalyseGo: "Analyse Go Code" { + shape: rectangle + } + + GenerateBindings: "Generate Bindings" { + shape: rectangle + } + + BuildFrontend: "Build Frontend" { + shape: rectangle + } + + CompileGo: "Compile Go" { + shape: rectangle + } + + Embed: "Embed Assets" { + shape: rectangle + } +} + +Output: "Output" { + Binary: "Native Binary\n(myapp.exe/.app)" { + shape: rectangle + style.fill: "#10B981" + } +} + +Source.Go -> Build.AnalyseGo +Build.AnalyseGo -> Build.GenerateBindings: "Extract types" +Build.GenerateBindings -> Source.Frontend: "TypeScript bindings" +Source.Frontend -> Build.BuildFrontend: "Compile (Vite/webpack)" +Build.BuildFrontend -> Build.Embed: "Bundled assets" +Source.Go -> Build.CompileGo +Build.CompileGo -> Build.Embed +Build.Embed -> Output.Binary +``` + +**Build steps:** + +1. **Analyse Go code** + - Scan services for exported methods + - Extract parameter and return types + - Generate method signatures + +2. **Generate TypeScript bindings** + - Create `.ts` files for each service + - Include full type definitions + - Add JSDoc comments + +3. **Build frontend** + - Run your bundler (Vite, webpack, etc.) + - Minify and optimise + - Output to `frontend/dist/` + +4. **Compile Go** + - Compile with optimisations (`-ldflags="-s -w"`) + - Include build metadata + - Platform-specific compilation + +5. **Embed assets** + - Embed frontend files into Go binary + - Compress assets + - Create single executable + +**Result:** A single native executable with everything embedded. + +[Learn more about building →](/guides/build/building) + +## Development vs Production + +Wails behaves differently in development and production: + + + + **Characteristics:** + - **Hot reload**: Frontend changes reload instantly + - **Source maps**: Debug with original source + - **DevTools**: Browser DevTools available + - **Logging**: Verbose logging enabled + - **External frontend**: Served from dev server (Vite) + + **How it works:** + ```d2 + direction: right + + WailsApp: "Wails App" { + shape: rectangle + style.fill: "#00ADD8" + } + + DevServer: "Vite Dev Server\n(localhost:5173)" { + shape: rectangle + style.fill: "#8B5CF6" + } + + WebView: "WebView" { + shape: rectangle + style.fill: "#6B7280" + } + + WailsApp -> DevServer: "Proxy requests" + DevServer -> WebView: "Serve with HMR" + WebView -> WailsApp: "Call Go methods" + ``` + + **Benefits:** + - Instant feedback on changes + - Full debugging capabilities + - Faster iteration + + + + **Characteristics:** + - **Embedded assets**: Frontend built into binary + - **Optimised**: Minified, compressed + - **No DevTools**: Disabled by default + - **Minimal logging**: Errors only + - **Single file**: Everything in one executable + + **How it works:** + ```d2 + direction: right + + Binary: "Single Binary\n(myapp.exe)" { + GoCode: "Compiled Go" { + shape: rectangle + style.fill: "#00ADD8" + } + + Assets: "Embedded Assets\n(HTML/CSS/JS)" { + shape: rectangle + style.fill: "#8B5CF6" + } + } + + WebView: "WebView" { + shape: rectangle + style.fill: "#6B7280" + } + + Binary.Assets -> WebView: "Serve from memory" + WebView -> Binary.GoCode: "Call Go methods" + ``` + + **Benefits:** + - Single file distribution + - Smaller size (minified) + - Better performance + - No external dependencies + + + +## Memory Model + +Understanding memory usage helps you build efficient applications. + +{/* VISUAL PLACEHOLDER: Memory Diagram +Description: Memory layout diagram showing: +1. Go Heap (services, application state) +2. WebView Memory (DOM, JavaScript heap) +3. Shared Memory (bridge communication) +4. Arrows showing data flow between regions +5. Annotations for zero-copy optimisations +Style: Technical diagram with memory regions as boxes, clear labels, size indicators +*/} + +**Memory regions:** + +1. **Go Heap** + - Your services and application state + - Managed by Go garbage collector + - Typically 5-10MB for simple apps + +2. **WebView Memory** + - DOM, JavaScript heap, CSS + - Managed by WebView's engine + - Typically 10-20MB for simple apps + +3. **Bridge Memory** + - Message buffers for communication + - Minimal overhead (\<1MB) + - Zero-copy for large data where possible + +**Optimisation tips:** +- **Avoid large data transfers**: Pass IDs, fetch details on demand +- **Use events for updates**: Don't poll from frontend +- **Stream large files**: Don't load entirely into memory +- **Clean up listeners**: Remove event listeners when done + +[Learn more about performance →](/guides/advanced/performance) + +## Security Model + +Wails provides a secure-by-default architecture: + +```d2 +direction: down + +Frontend: "Frontend (Untrusted)" { + shape: rectangle + style.fill: "#EF4444" +} + +Bridge: "Wails Bridge (Validation)" { + shape: diamond + style.fill: "#F59E0B" +} + +Backend: "Backend (Trusted)" { + shape: rectangle + style.fill: "#10B981" +} + +Frontend -> Bridge: "Call method" +Bridge -> Bridge: "Validate:\n- Method exists?\n- Types correct?\n- Access allowed?" +Bridge -> Backend: "Execute if valid" +Backend -> Bridge: "Return result" +Bridge -> Frontend: "Send response" +``` + +**Security features:** + +1. **Method whitelisting** + - Only exported methods are callable + - Private methods are inaccessible + - Explicit service registration required + +2. **Type validation** + - Arguments checked against Go types + - Invalid types rejected + - Prevents injection attacks + +3. **No eval()** + - Frontend can't execute arbitrary Go code + - Only predefined methods callable + - No dynamic code execution + +4. **Context isolation** + - Each window has its own context + - Services can check caller context + - Permissions per window possible + +**Best practices:** +- **Validate user input** in Go (don't trust frontend) +- **Use context** for authentication/authorisation +- **Sanitise file paths** before file operations +- **Rate limit** expensive operations + +[Learn more about security →](/guides/advanced/security) + +## Next Steps + +**Application Lifecycle** - Understand startup, shutdown, and lifecycle hooks +[Learn More →](/concepts/lifecycle) + +**Go-Frontend Bridge** - Deep dive into how the bridge works +[Learn More →](/concepts/bridge) + +**Build System** - Understand how Wails builds your application +[Learn More →](/concepts/build-system) + +**Start Building** - Apply what you've learned in a tutorial +[Tutorials →](/tutorials/03-notes-vanilla) + +--- + +**Questions about architecture?** Ask in [Discord](https://discord.gg/JDdSxwjhGf) or check the [API reference](/reference/overview). diff --git a/docs/src/content/docs/concepts/bridge.mdx b/docs/src/content/docs/concepts/bridge.mdx new file mode 100644 index 000000000..6ee3745d1 --- /dev/null +++ b/docs/src/content/docs/concepts/bridge.mdx @@ -0,0 +1,700 @@ +--- +title: Go-Frontend Bridge +description: Deep dive into how Wails enables direct communication between Go and JavaScript +sidebar: + order: 3 +--- + +import { Tabs, TabItem } from "@astrojs/starlight/components"; + +## Direct Go-JavaScript Communication + +Wails provides a **direct, in-memory bridge** between Go and JavaScript, enabling seamless communication without HTTP overhead, process boundaries, or serialisation bottlenecks. + +## The Big Picture + +```d2 +direction: right + +Frontend: "Frontend (JavaScript)" { + UI: "React/Vue/Vanilla" { + shape: rectangle + style.fill: "#8B5CF6" + } + + Bindings: "Auto-Generated Bindings" { + shape: rectangle + style.fill: "#A78BFA" + } +} + +Bridge: "Wails Bridge" { + Encoder: "JSON Encoder" { + shape: rectangle + style.fill: "#10B981" + } + + Router: "Method Router" { + shape: diamond + style.fill: "#10B981" + } + + Decoder: "JSON Decoder" { + shape: rectangle + style.fill: "#10B981" + } + + TypeGen: "Type Generator" { + shape: rectangle + style.fill: "#10B981" + } +} + +Backend: "Backend (Go)" { + Services: "Your Services" { + shape: rectangle + style.fill: "#00ADD8" + } + + Registry: "Service Registry" { + shape: rectangle + style.fill: "#00ADD8" + } +} + +Frontend.UI -> Frontend.Bindings: "import { Method }" +Frontend.Bindings -> Bridge.Encoder: "Call Method('arg')" +Bridge.Encoder -> Bridge.Router: "Encode to JSON" +Bridge.Router -> Backend.Registry: "Find service" +Backend.Registry -> Backend.Services: "Invoke method" +Backend.Services -> Bridge.Decoder: "Return result" +Bridge.Decoder -> Frontend.Bindings: "Decode to JS" +Frontend.Bindings -> Frontend.UI: "Promise resolves" +Bridge.TypeGen -> Frontend.Bindings: "Generate types" +``` + +**Key insight:** No HTTP, no IPC, no process boundaries. Just **direct function calls** with **type safety**. + +## How It Works: Step by Step + +### 1. Service Registration (Startup) + +When your application starts, Wails scans your services: + +```go +type GreetService struct { + prefix string +} + +func (g *GreetService) Greet(name string) string { + return g.prefix + name + "!" +} + +func (g *GreetService) Add(a, b int) int { + return a + b +} + +// Register service +app := application.New(application.Options{ + Services: []application.Service{ + application.NewService(&GreetService{prefix: "Hello, "}), + }, +}) +``` + +**What Wails does:** +1. **Scans the struct** for exported methods +2. **Extracts type information** (parameters, return types) +3. **Builds a registry** mapping method names to functions +4. **Generates TypeScript bindings** with full type definitions + +### 2. Binding Generation (Build Time) + +Wails generates TypeScript bindings automatically: + +```typescript +// Auto-generated: frontend/bindings/GreetService.ts +export function Greet(name: string): Promise +export function Add(a: number, b: number): Promise +``` + +**Type mapping:** + +| Go Type | TypeScript Type | +|---------|-----------------| +| `string` | `string` | +| `int`, `int32`, `int64` | `number` | +| `float32`, `float64` | `number` | +| `bool` | `boolean` | +| `[]T` | `T[]` | +| `map[string]T` | `Record` | +| `struct` | `interface` | +| `time.Time` | `Date` | +| `error` | Exception (thrown) | + +### 3. Frontend Call (Runtime) + +Developer calls the Go method from JavaScript: + +```javascript +import { Greet, Add } from './bindings/GreetService' + +// Call Go from JavaScript +const greeting = await Greet("World") +console.log(greeting) // "Hello, World!" + +const sum = await Add(5, 3) +console.log(sum) // 8 +``` + +**What happens:** +1. **Binding function called** - `Greet("World")` +2. **Message created** - `{ service: "GreetService", method: "Greet", args: ["World"] }` +3. **Sent to bridge** - Via WebView's JavaScript bridge +4. **Promise returned** - Awaits response + +### 4. Bridge Processing (Runtime) + +The bridge receives the message and processes it: + +```d2 +direction: down + +Receive: "Receive Message" { + shape: rectangle + style.fill: "#10B981" +} + +Parse: "Parse JSON" { + shape: rectangle +} + +Validate: "Validate" { + Check: "Service exists?" { + shape: diamond + } + + CheckMethod: "Method exists?" { + shape: diamond + } + + CheckTypes: "Types correct?" { + shape: diamond + } +} + +Invoke: "Invoke Go Method" { + shape: rectangle + style.fill: "#00ADD8" +} + +Encode: "Encode Result" { + shape: rectangle +} + +Send: "Send Response" { + shape: rectangle + style.fill: "#10B981" +} + +Error: "Send Error" { + shape: rectangle + style.fill: "#EF4444" +} + +Receive -> Parse +Parse -> Validate.Check +Validate.Check -> Validate.CheckMethod: "Yes" +Validate.Check -> Error: "No" +Validate.CheckMethod -> Validate.CheckTypes: "Yes" +Validate.CheckMethod -> Error: "No" +Validate.CheckTypes -> Invoke: "Yes" +Validate.CheckTypes -> Error: "No" +Invoke -> Encode: "Success" +Invoke -> Error: "Error" +Encode -> Send +``` + +**Security:** Only registered services and exported methods are callable. + +### 5. Go Execution (Runtime) + +The Go method executes: + +```go +func (g *GreetService) Greet(name string) string { + // This runs in Go + return g.prefix + name + "!" +} +``` + +**Execution context:** +- Runs in a **goroutine** (non-blocking) +- Has access to **all Go features** (file system, network, databases) +- Can call **other Go code** freely +- Returns result or error + +### 6. Response (Runtime) + +Result is sent back to JavaScript: + +```javascript +// Promise resolves with result +const greeting = await Greet("World") +// greeting = "Hello, World!" +``` + +**Error handling:** + +```go +func (g *GreetService) Divide(a, b float64) (float64, error) { + if b == 0 { + return 0, errors.New("division by zero") + } + return a / b, nil +} +``` + +```javascript +try { + const result = await Divide(10, 0) +} catch (error) { + console.error("Go error:", error) // "division by zero" +} +``` + +## Performance Characteristics + +### Speed + +**Typical call overhead:** <1ms + +``` +Frontend Call → Bridge → Go Execution → Bridge → Frontend Response + ↓ ↓ ↓ ↓ ↓ + <0.1ms <0.1ms [varies] <0.1ms <0.1ms +``` + +**Compared to alternatives:** +- **HTTP/REST:** 5-50ms (network stack, serialisation) +- **IPC:** 1-10ms (process boundaries, marshalling) +- **Wails Bridge:** <1ms (in-memory, direct call) + +### Memory + +**Per-call overhead:** ~1KB (message buffer) + +**Zero-copy optimisation:** Large data (>1MB) uses shared memory where possible. + +### Concurrency + +**Calls are concurrent:** +- Each call runs in its own goroutine +- Multiple calls can execute simultaneously +- No blocking between calls + +```javascript +// These run concurrently +const [result1, result2, result3] = await Promise.all([ + SlowOperation1(), + SlowOperation2(), + SlowOperation3(), +]) +``` + +## Type System + +### Supported Types + +#### Primitives + +```go +// Go +func Example( + s string, + i int, + f float64, + b bool, +) (string, int, float64, bool) { + return s, i, f, b +} +``` + +```typescript +// TypeScript (auto-generated) +function Example( + s: string, + i: number, + f: number, + b: boolean, +): Promise<[string, number, number, boolean]> +``` + +#### Slices and Arrays + +```go +// Go +func Sum(numbers []int) int { + total := 0 + for _, n := range numbers { + total += n + } + return total +} +``` + +```typescript +// TypeScript +function Sum(numbers: number[]): Promise + +// Usage +const total = await Sum([1, 2, 3, 4, 5]) // 15 +``` + +#### Maps + +```go +// Go +func GetConfig() map[string]interface{} { + return map[string]interface{}{ + "theme": "dark", + "fontSize": 14, + "enabled": true, + } +} +``` + +```typescript +// TypeScript +function GetConfig(): Promise> + +// Usage +const config = await GetConfig() +console.log(config.theme) // "dark" +``` + +#### Structs + +```go +// Go +type User struct { + ID int `json:"id"` + Name string `json:"name"` + Email string `json:"email"` +} + +func GetUser(id int) (*User, error) { + return &User{ + ID: id, + Name: "Alice", + Email: "alice@example.com", + }, nil +} +``` + +```typescript +// TypeScript (auto-generated) +interface User { + id: number + name: string + email: string +} + +function GetUser(id: number): Promise + +// Usage +const user = await GetUser(1) +console.log(user.name) // "Alice" +``` + +**JSON tags:** Use `json:` tags to control field names in TypeScript. + +#### Time + +```go +// Go +func GetTimestamp() time.Time { + return time.Now() +} +``` + +```typescript +// TypeScript +function GetTimestamp(): Promise + +// Usage +const timestamp = await GetTimestamp() +console.log(timestamp.toISOString()) +``` + +#### Errors + +```go +// Go +func Validate(input string) error { + if input == "" { + return errors.New("input cannot be empty") + } + return nil +} +``` + +```typescript +// TypeScript +function Validate(input: string): Promise + +// Usage +try { + await Validate("") +} catch (error) { + console.error(error) // "input cannot be empty" +} +``` + +### Unsupported Types + +These types **cannot** be passed across the bridge: + +- **Channels** (`chan T`) +- **Functions** (`func()`) +- **Interfaces** (except `interface{}` / `any`) +- **Pointers** (except to structs) +- **Unexported fields** (lowercase) + +**Workaround:** Use IDs or handles: + +```go +// ❌ Can't pass file handle +func OpenFile(path string) (*os.File, error) { + return os.Open(path) +} + +// ✅ Return file ID instead +var files = make(map[string]*os.File) + +func OpenFile(path string) (string, error) { + file, err := os.Open(path) + if err != nil { + return "", err + } + id := generateID() + files[id] = file + return id, nil +} + +func ReadFile(id string) ([]byte, error) { + file := files[id] + return io.ReadAll(file) +} + +func CloseFile(id string) error { + file := files[id] + delete(files, id) + return file.Close() +} +``` + +## Advanced Patterns + +### Context Passing + +Services can access the call context: + +```go +type UserService struct{} + +func (s *UserService) GetCurrentUser(ctx context.Context) (*User, error) { + // Access window that made the call + window := application.ContextWindow(ctx) + + // Access application + app := application.ContextApplication(ctx) + + // Your logic + return getCurrentUser(), nil +} +``` + +**Context provides:** +- Window that made the call +- Application instance +- Request metadata + +### Streaming Data + +For large data, use events instead of return values: + +```go +func ProcessLargeFile(path string) error { + file, err := os.Open(path) + if err != nil { + return err + } + defer file.Close() + + scanner := bufio.NewScanner(file) + lineNum := 0 + + for scanner.Scan() { + lineNum++ + // Emit progress events + app.EmitEvent("file-progress", map[string]interface{}{ + "line": lineNum, + "text": scanner.Text(), + }) + } + + return scanner.Err() +} +``` + +```javascript +import { On } from '@wailsio/runtime' +import { ProcessLargeFile } from './bindings/FileService' + +// Listen for progress +On('file-progress', (data) => { + console.log(`Line ${data.line}: ${data.text}`) +}) + +// Start processing +await ProcessLargeFile('/path/to/large/file.txt') +``` + +### Cancellation + +Use context for cancellable operations: + +```go +func LongRunningTask(ctx context.Context) error { + for i := 0; i < 1000; i++ { + // Check if cancelled + select { + case <-ctx.Done(): + return ctx.Err() + default: + // Continue work + time.Sleep(100 * time.Millisecond) + } + } + return nil +} +``` + +**Note:** Context cancellation on frontend disconnect is automatic. + +### Batch Operations + +Reduce bridge overhead by batching: + +```go +// ❌ Inefficient: N bridge calls +for _, item := range items { + await ProcessItem(item) +} + +// ✅ Efficient: 1 bridge call +await ProcessItems(items) +``` + +```go +func ProcessItems(items []Item) ([]Result, error) { + results := make([]Result, len(items)) + for i, item := range items { + results[i] = processItem(item) + } + return results, nil +} +``` + +## Debugging the Bridge + +### Enable Debug Logging + +```go +app := application.New(application.Options{ + Name: "My App", + Logger: application.NewDefaultLogger(), + LogLevel: logger.DEBUG, +}) +``` + +**Output shows:** +- Method calls +- Parameters +- Return values +- Errors +- Timing information + +### Inspect Generated Bindings + +Check `frontend/bindings/` to see generated TypeScript: + +```typescript +// frontend/bindings/MyService.ts +export function MyMethod(arg: string): Promise { + return window.wails.Call('MyService.MyMethod', arg) +} +``` + +### Test Services Directly + +Test Go services without the frontend: + +```go +func TestGreetService(t *testing.T) { + service := &GreetService{prefix: "Hello, "} + result := service.Greet("Test") + if result != "Hello, Test!" { + t.Errorf("Expected 'Hello, Test!', got '%s'", result) + } +} +``` + +## Performance Tips + +### ✅ Do + +- **Batch operations** - Reduce bridge calls +- **Use events for streaming** - Don't return large arrays +- **Keep methods fast** - <100ms ideal +- **Use goroutines** - For long operations +- **Cache on Go side** - Avoid repeated calculations + +### ❌ Don't + +- **Don't make excessive calls** - Batch when possible +- **Don't return huge data** - Use pagination or streaming +- **Don't block** - Use goroutines for long operations +- **Don't pass complex types** - Keep it simple +- **Don't ignore errors** - Always handle them + +## Security + +The bridge is secure by default: + +1. **Whitelist only** - Only registered services callable +2. **Type validation** - Arguments checked against Go types +3. **No eval()** - Frontend can't execute arbitrary Go code +4. **No reflection abuse** - Only exported methods accessible + +**Best practices:** +- **Validate input** in Go (don't trust frontend) +- **Use context** for authentication/authorisation +- **Rate limit** expensive operations +- **Sanitise** file paths and user input + +## Next Steps + +**Build System** - Learn how Wails builds and bundles your application +[Learn More →](/concepts/build-system) + +**Services** - Deep dive into the service system +[Learn More →](/features/bindings/services) + +**Events** - Use events for pub/sub communication +[Learn More →](/features/events/system) + +--- + +**Questions about the bridge?** Ask in [Discord](https://discord.gg/JDdSxwjhGf) or check the [binding examples](https://github.com/wailsapp/wails/tree/v3-alpha/v3/examples/binding). diff --git a/docs/src/content/docs/concepts/build-system.mdx b/docs/src/content/docs/concepts/build-system.mdx new file mode 100644 index 000000000..51adf4cdd --- /dev/null +++ b/docs/src/content/docs/concepts/build-system.mdx @@ -0,0 +1,759 @@ +--- +title: Build System +description: Understanding how Wails builds and packages your application +sidebar: + order: 4 +--- + +import { Tabs, TabItem } from "@astrojs/starlight/components"; + +## Unified Build System + +Wails provides a **unified build system** that compiles Go code, bundles frontend assets, embeds everything into a single executable, and handles platform-specific builds—all with one command. + +```bash +wails3 build +``` + +**Output:** Native executable with everything embedded. + +## Build Process Overview + +```d2 +direction: down + +Source: "Source Code" { + Go: "Go Code\n(main.go, services)" { + shape: rectangle + style.fill: "#00ADD8" + } + + Frontend: "Frontend Code\n(HTML/CSS/JS)" { + shape: rectangle + style.fill: "#8B5CF6" + } +} + +Analysis: "Analysis Phase" { + ScanGo: "Scan Go Services" { + shape: rectangle + } + + ExtractTypes: "Extract Types" { + shape: rectangle + } +} + +Generation: "Generation Phase" { + GenBindings: "Generate TypeScript Bindings" { + shape: rectangle + style.fill: "#10B981" + } + + BuildFrontend: "Build Frontend\n(Vite/webpack)" { + shape: rectangle + style.fill: "#8B5CF6" + } +} + +Compilation: "Compilation Phase" { + CompileGo: "Compile Go\n(with optimisations)" { + shape: rectangle + style.fill: "#00ADD8" + } + + EmbedAssets: "Embed Frontend Assets" { + shape: rectangle + style.fill: "#10B981" + } +} + +Output: "Output" { + Binary: "Native Binary\n(myapp.exe/.app)" { + shape: rectangle + style.fill: "#10B981" + } +} + +Source.Go -> Analysis.ScanGo +Analysis.ScanGo -> Analysis.ExtractTypes +Analysis.ExtractTypes -> Generation.GenBindings +Generation.GenBindings -> Source.Frontend: "TypeScript types" +Source.Frontend -> Generation.BuildFrontend +Generation.BuildFrontend -> Compilation.EmbedAssets: "Bundled assets" +Source.Go -> Compilation.CompileGo +Compilation.CompileGo -> Compilation.EmbedAssets +Compilation.EmbedAssets -> Output.Binary +``` + +## Build Phases + +### 1. Analysis Phase + +Wails scans your Go code to understand your services: + +```go +type GreetService struct { + prefix string +} + +func (g *GreetService) Greet(name string) string { + return g.prefix + name + "!" +} +``` + +**What Wails extracts:** +- Service name: `GreetService` +- Method name: `Greet` +- Parameter types: `string` +- Return types: `string` + +**Used for:** Generating TypeScript bindings + +### 2. Generation Phase + +#### TypeScript Bindings + +Wails generates type-safe bindings: + +```typescript +// Auto-generated: frontend/bindings/GreetService.ts +export function Greet(name: string): Promise { + return window.wails.Call('GreetService.Greet', name) +} +``` + +**Benefits:** +- Full type safety +- IDE autocomplete +- Compile-time errors +- JSDoc comments + +#### Frontend Build + +Your frontend bundler runs (Vite, webpack, etc.): + +```bash +# Vite example +vite build --outDir dist +``` + +**What happens:** +- JavaScript/TypeScript compiled +- CSS processed and minified +- Assets optimised +- Source maps generated (dev only) +- Output to `frontend/dist/` + +### 3. Compilation Phase + +#### Go Compilation + +Go code is compiled with optimisations: + +```bash +go build -ldflags="-s -w" -o myapp.exe +``` + +**Flags:** +- `-s`: Strip symbol table +- `-w`: Strip DWARF debugging info +- Result: Smaller binary (~30% reduction) + +**Platform-specific:** +- Windows: `.exe` with icon embedded +- macOS: `.app` bundle structure +- Linux: ELF binary + +#### Asset Embedding + +Frontend assets are embedded into the Go binary: + +```go +//go:embed frontend/dist +var assets embed.FS +``` + +**Result:** Single executable with everything inside. + +### 4. Output + +**Single native binary:** +- Windows: `myapp.exe` (~15MB) +- macOS: `myapp.app` (~15MB) +- Linux: `myapp` (~15MB) + +**No dependencies** (except system WebView). + +## Development vs Production + + + + **Optimised for speed:** + + ```bash + wails3 dev + ``` + + **What happens:** + 1. Starts frontend dev server (Vite on port 5173) + 2. Compiles Go without optimisations + 3. Launches app pointing to dev server + 4. Enables hot reload + 5. Includes source maps + + **Characteristics:** + - **Fast rebuilds** (<1s for frontend changes) + - **No asset embedding** (served from dev server) + - **Debug symbols** included + - **Source maps** enabled + - **Verbose logging** + + **File size:** Larger (~50MB with debug symbols) + + + + **Optimised for size and performance:** + + ```bash + wails3 build + ``` + + **What happens:** + 1. Builds frontend for production (minified) + 2. Compiles Go with optimisations + 3. Strips debug symbols + 4. Embeds assets + 5. Creates single binary + + **Characteristics:** + - **Optimised code** (minified, tree-shaken) + - **Assets embedded** (no external files) + - **Debug symbols stripped** + - **No source maps** + - **Minimal logging** + + **File size:** Smaller (~15MB) + + + +## Build Commands + +### Basic Build + +```bash +wails3 build +``` + +**Output:** `build/bin/myapp[.exe]` + +### Build for Specific Platform + +```bash +# Build for Windows (from any OS) +wails3 build -platform windows/amd64 + +# Build for macOS +wails3 build -platform darwin/amd64 +wails3 build -platform darwin/arm64 + +# Build for Linux +wails3 build -platform linux/amd64 +``` + +**Cross-compilation:** Build for any platform from any platform. + +### Build with Options + +```bash +# Custom output directory +wails3 build -o ./dist/myapp + +# Skip frontend build (use existing) +wails3 build -skipbindings + +# Clean build (remove cache) +wails3 build -clean + +# Verbose output +wails3 build -v +``` + +### Build Modes + +```bash +# Debug build (includes symbols) +wails3 build -debug + +# Production build (default, optimised) +wails3 build + +# Development build (fast, unoptimised) +wails3 build -devbuild +``` + +## Build Configuration + +### Taskfile.yml + +Wails uses [Taskfile](https://taskfile.dev/) for build configuration: + +```yaml +# Taskfile.yml +version: '3' + +tasks: + build: + desc: Build the application + cmds: + - wails3 build + + build:windows: + desc: Build for Windows + cmds: + - wails3 build -platform windows/amd64 + + build:macos: + desc: Build for macOS (Universal) + cmds: + - wails3 build -platform darwin/amd64 + - wails3 build -platform darwin/arm64 + - lipo -create -output build/bin/myapp.app build/bin/myapp-amd64.app build/bin/myapp-arm64.app + + build:linux: + desc: Build for Linux + cmds: + - wails3 build -platform linux/amd64 +``` + +**Run tasks:** + +```bash +task build:windows +task build:macos +task build:linux +``` + +### Build Options File + +Create `build/build.json` for persistent configuration: + +```json +{ + "name": "My Application", + "version": "1.0.0", + "author": "Your Name", + "description": "Application description", + "icon": "build/appicon.png", + "outputFilename": "myapp", + "platforms": ["windows/amd64", "darwin/amd64", "linux/amd64"], + "frontend": { + "dir": "./frontend", + "install": "npm install", + "build": "npm run build", + "dev": "npm run dev" + }, + "go": { + "ldflags": "-s -w -X main.version={{.Version}}" + } +} +``` + +## Asset Embedding + +### How It Works + +Wails uses Go's `embed` package: + +```go +package main + +import ( + "embed" + "github.com/wailsapp/wails/v3/pkg/application" +) + +//go:embed frontend/dist +var assets embed.FS + +func main() { + app := application.New(application.Options{ + Name: "My App", + Assets: application.AssetOptions{ + Handler: application.AssetFileServerFS(assets), + }, + }) + + app.NewWebviewWindow() + app.Run() +} +``` + +**At build time:** +1. Frontend built to `frontend/dist/` +2. `//go:embed` directive includes files +3. Files compiled into binary +4. Binary contains everything + +**At runtime:** +1. App starts +2. Assets served from memory +3. No disk I/O for assets +4. Fast loading + +### Custom Assets + +Embed additional files: + +```go +//go:embed frontend/dist +var frontendAssets embed.FS + +//go:embed data/*.json +var dataAssets embed.FS + +//go:embed templates/*.html +var templateAssets embed.FS +``` + +## Build Optimisations + +### Frontend Optimisations + +**Vite (default):** + +```javascript +// vite.config.js +export default { + build: { + minify: 'terser', + terserOptions: { + compress: { + drop_console: true, // Remove console.log + drop_debugger: true, + }, + }, + rollupOptions: { + output: { + manualChunks: { + vendor: ['react', 'react-dom'], // Separate vendor bundle + }, + }, + }, + }, +} +``` + +**Results:** +- JavaScript minified (~70% reduction) +- CSS minified (~60% reduction) +- Images optimised +- Tree-shaking applied + +### Go Optimisations + +**Compiler flags:** + +```bash +-ldflags="-s -w" +``` + +- `-s`: Strip symbol table (~10% reduction) +- `-w`: Strip DWARF debug info (~20% reduction) + +**Additional optimisations:** + +```bash +-ldflags="-s -w -X main.version=1.0.0" +``` + +- `-X`: Set variable values at build time +- Useful for version numbers, build dates + +### Binary Compression + +**UPX (optional):** + +```bash +# After building +upx --best build/bin/myapp.exe +``` + +**Results:** +- ~50% size reduction +- Slightly slower startup (~100ms) +- Not recommended for macOS (code signing issues) + +## Platform-Specific Builds + +### Windows + +**Output:** `myapp.exe` + +**Includes:** +- Application icon +- Version information +- Manifest (UAC settings) + +**Icon:** + +```bash +# Specify icon +wails3 build -icon build/appicon.png +``` + +Wails converts PNG to `.ico` automatically. + +**Manifest:** + +```xml + + + + + + + + + + + + +``` + +### macOS + +**Output:** `myapp.app` (application bundle) + +**Structure:** + +``` +myapp.app/ +├── Contents/ +│ ├── Info.plist # App metadata +│ ├── MacOS/ +│ │ └── myapp # Binary +│ ├── Resources/ +│ │ └── icon.icns # Icon +│ └── _CodeSignature/ # Code signature (if signed) +``` + +**Info.plist:** + +```xml + + + + + CFBundleName + My App + CFBundleIdentifier + com.example.myapp + CFBundleVersion + 1.0.0 + + +``` + +**Universal Binary:** + +```bash +# Build for both architectures +wails3 build -platform darwin/amd64 +wails3 build -platform darwin/arm64 + +# Combine into universal binary +lipo -create -output myapp-universal \ + build/bin/myapp-amd64 \ + build/bin/myapp-arm64 +``` + +### Linux + +**Output:** `myapp` (ELF binary) + +**Dependencies:** +- GTK3 +- WebKitGTK + +**Desktop file:** + +```ini +# myapp.desktop +[Desktop Entry] +Name=My App +Exec=/usr/bin/myapp +Icon=myapp +Type=Application +Categories=Utility; +``` + +**Installation:** + +```bash +# Copy binary +sudo cp myapp /usr/bin/ + +# Copy desktop file +sudo cp myapp.desktop /usr/share/applications/ + +# Copy icon +sudo cp icon.png /usr/share/icons/hicolor/256x256/apps/myapp.png +``` + +## Build Performance + +### Typical Build Times + +| Phase | Time | Notes | +|-------|------|-------| +| Analysis | <1s | Go code scanning | +| Binding Generation | <1s | TypeScript generation | +| Frontend Build | 5-30s | Depends on project size | +| Go Compilation | 2-10s | Depends on code size | +| Asset Embedding | <1s | Embedding frontend | +| **Total** | **10-45s** | First build | +| **Incremental** | **5-15s** | Subsequent builds | + +### Speeding Up Builds + +**1. Use build cache:** + +```bash +# Go build cache is automatic +# Frontend cache (Vite) +npm run build # Uses cache by default +``` + +**2. Skip unchanged steps:** + +```bash +# Skip frontend if unchanged +wails3 build -skipbindings +``` + +**3. Parallel builds:** + +```bash +# Build multiple platforms in parallel +wails3 build -platform windows/amd64 & +wails3 build -platform darwin/amd64 & +wails3 build -platform linux/amd64 & +wait +``` + +**4. Use faster tools:** + +```bash +# Use esbuild instead of webpack +# (Vite uses esbuild by default) +``` + +## Troubleshooting + +### Build Fails + +**Symptom:** `wails3 build` exits with error + +**Common causes:** + +1. **Go compilation error** + ```bash + # Check Go code compiles + go build + ``` + +2. **Frontend build error** + ```bash + # Check frontend builds + cd frontend + npm run build + ``` + +3. **Missing dependencies** + ```bash + # Install dependencies + npm install + go mod download + ``` + +### Binary Too Large + +**Symptom:** Binary is >50MB + +**Solutions:** + +1. **Strip debug symbols** (should be automatic) + ```bash + wails3 build # Already includes -ldflags="-s -w" + ``` + +2. **Check embedded assets** + ```bash + # Remove unnecessary files from frontend/dist/ + # Check for large images, videos, etc. + ``` + +3. **Use UPX compression** + ```bash + upx --best build/bin/myapp.exe + ``` + +### Slow Builds + +**Symptom:** Builds take >1 minute + +**Solutions:** + +1. **Use build cache** + - Go cache is automatic + - Frontend cache (Vite) is automatic + +2. **Skip unchanged steps** + ```bash + wails3 build -skipbindings + ``` + +3. **Optimise frontend build** + ```javascript + // vite.config.js + export default { + build: { + minify: 'esbuild', // Faster than terser + }, + } + ``` + +## Best Practices + +### ✅ Do + +- **Use `wails3 dev` during development** - Fast iteration +- **Use `wails3 build` for releases** - Optimised output +- **Version your builds** - Use `-ldflags` to embed version +- **Test builds on target platforms** - Cross-compilation isn't perfect +- **Keep frontend builds fast** - Optimise bundler config +- **Use build cache** - Speeds up subsequent builds + +### ❌ Don't + +- **Don't commit `build/` directory** - Add to `.gitignore` +- **Don't skip testing builds** - Always test before release +- **Don't embed unnecessary assets** - Keep binaries small +- **Don't use debug builds for production** - Use optimised builds +- **Don't forget code signing** - Required for distribution + +## Next Steps + +**Building Applications** - Detailed guide to building and packaging +[Learn More →](/guides/building) + +**Cross-Platform Builds** - Build for all platforms from one machine +[Learn More →](/guides/cross-platform) + +**Creating Installers** - Create installers for end users +[Learn More →](/guides/installers) + +--- + +**Questions about building?** Ask in [Discord](https://discord.gg/JDdSxwjhGf) or check the [build examples](https://github.com/wailsapp/wails/tree/v3-alpha/v3/examples/build). diff --git a/docs/src/content/docs/concepts/lifecycle.mdx b/docs/src/content/docs/concepts/lifecycle.mdx new file mode 100644 index 000000000..fa8d092dd --- /dev/null +++ b/docs/src/content/docs/concepts/lifecycle.mdx @@ -0,0 +1,612 @@ +--- +title: Application Lifecycle +description: Understanding the Wails application lifecycle from startup to shutdown +sidebar: + order: 2 +--- + +import { Tabs, TabItem } from "@astrojs/starlight/components"; + +## Understanding Application Lifecycle + +Desktop applications have a lifecycle from startup to shutdown. Wails provides hooks at each stage to **initialise resources**, **clean up properly**, **handle errors gracefully**, and **manage multiple windows** effectively. + +## The Lifecycle Stages + +```d2 +direction: down + +Start: "Application Start" { + shape: oval + style.fill: "#10B981" +} + +PreInit: "Pre-Initialisation" { + Parse: "Parse Options" { + shape: rectangle + } + Register: "Register Services" { + shape: rectangle + } + Validate: "Validate Config" { + shape: rectangle + } +} + +OnStartup: "OnStartup Hook" { + shape: rectangle + style.fill: "#3B82F6" +} + +CreateWindows: "Create Windows" { + shape: rectangle +} + +EventLoop: "Event Loop" { + Process: "Process Events" { + shape: rectangle + } + Handle: "Handle Messages" { + shape: rectangle + } + Update: "Update UI" { + shape: rectangle + } +} + +QuitSignal: "Quit Signal" { + shape: diamond + style.fill: "#F59E0B" +} + +OnBeforeClose: "OnBeforeClose Hook" { + shape: rectangle + style.fill: "#3B82F6" +} + +OnShutdown: "OnShutdown Hook" { + shape: rectangle + style.fill: "#3B82F6" +} + +Cleanup: "Cleanup" { + Close: "Close Windows" { + shape: rectangle + } + Release: "Release Resources" { + shape: rectangle + } +} + +End: "Application End" { + shape: oval + style.fill: "#EF4444" +} + +Start -> PreInit.Parse +PreInit.Parse -> PreInit.Register +PreInit.Register -> PreInit.Validate +PreInit.Validate -> OnStartup +OnStartup -> CreateWindows +CreateWindows -> EventLoop.Process +EventLoop.Process -> EventLoop.Handle +EventLoop.Handle -> EventLoop.Update +EventLoop.Update -> EventLoop.Process: "Loop" +EventLoop.Process -> QuitSignal: "User quits" +QuitSignal -> OnBeforeClose: "Can cancel?" +OnBeforeClose -> EventLoop.Process: "Cancelled" +OnBeforeClose -> OnShutdown: "Confirmed" +OnShutdown -> Cleanup.Close +Cleanup.Close -> Cleanup.Release +Cleanup.Release -> End +``` + +### 1. Pre-Initialisation + +Before your code runs, Wails: +1. Parses `application.Options` +2. Registers services +3. Validates configuration +4. Sets up the runtime + +**You don't control this phase** - it happens automatically. + +### 2. OnStartup Hook + +Your first opportunity to run code: + +```go +app := application.New(application.Options{ + Name: "My App", + OnStartup: func(ctx context.Context) { + // Initialise database + db, err := sql.Open("sqlite3", "app.db") + if err != nil { + log.Fatal(err) + } + + // Load configuration + config, err := loadConfig() + if err != nil { + log.Fatal(err) + } + + // Store in context for services to access + ctx = context.WithValue(ctx, "db", db) + ctx = context.WithValue(ctx, "config", config) + }, +}) +``` + +**When it runs:** After Wails initialisation, before windows are created + +**Use it for:** +- Database connections +- Configuration loading +- Resource initialisation +- Authentication checks + +**Context:** The `context.Context` is passed to all services and can store shared state. + +### 3. Window Creation + +After `OnStartup`, you create windows: + +```go +window := app.NewWebviewWindow() +``` + +**What happens:** +1. Window is created (but not shown) +2. WebView is initialised +3. Frontend assets are loaded +4. Window is shown (unless `Hidden: true`) + +### 4. Event Loop + +The application enters the event loop: + +```go +err := app.Run() // Blocks here until quit +``` + +**What happens in the loop:** +- OS events processed (mouse, keyboard, window events) +- Go-to-JS messages handled +- JS-to-Go calls executed +- UI updates rendered + +**This is where your application spends most of its time.** + +### 5. Quit Signal + +User triggers quit via: +- Closing last window (default behaviour) +- Cmd+Q / Alt+F4 / File → Quit +- Your code calling `app.Quit()` + +### 6. OnBeforeClose Hook + +**Optional hook to prevent quit:** + +```go +window := app.NewWebviewWindow(application.WebviewWindowOptions{ + OnBeforeClose: func() bool { + // Return false to cancel quit + // Return true to allow quit + + if hasUnsavedChanges() { + result := showConfirmDialog("Unsaved changes. Quit anyway?") + return result == "yes" + } + return true + }, +}) +``` + +**Use cases:** +- Confirm quit with unsaved changes +- Prevent accidental closure +- Save state before quitting + +**Important:** Only works for window close events, not `app.Quit()`. + +### 7. OnShutdown Hook + +Your last opportunity to run code: + +```go +app := application.New(application.Options{ + OnShutdown: func() { + // Save application state + saveState() + + // Close database + db.Close() + + // Release resources + cleanup() + }, +}) +``` + +**When it runs:** After quit confirmed, before application exits + +**Use it for:** +- Saving state +- Closing connections +- Releasing resources +- Final cleanup + +**Important:** Keep it fast (<1 second). OS may force-kill if too slow. + +### 8. Cleanup & Exit + +Wails automatically: +1. Closes all windows +2. Releases WebView resources +3. Exits the process + +## Lifecycle Hooks Reference + +| Hook | When | Can Cancel? | Use For | +|------|------|-------------|---------| +| `OnStartup` | Before windows created | No | Initialisation | +| `OnBeforeClose` | Window closing | Yes | Confirm quit | +| `OnShutdown` | After quit confirmed | No | Cleanup | + +## Common Patterns + +### Pattern 1: Database Lifecycle + +```go +var db *sql.DB + +app := application.New(application.Options{ + OnStartup: func(ctx context.Context) { + var err error + db, err = sql.Open("sqlite3", "app.db") + if err != nil { + log.Fatal(err) + } + + // Run migrations + if err := runMigrations(db); err != nil { + log.Fatal(err) + } + }, + OnShutdown: func() { + if db != nil { + db.Close() + } + }, +}) +``` + +### Pattern 2: Configuration Management + +```go +type Config struct { + Theme string + Language string + WindowPos Point +} + +var config *Config + +app := application.New(application.Options{ + OnStartup: func(ctx context.Context) { + config = loadConfig() // Load from disk + }, + OnShutdown: func() { + saveConfig(config) // Save to disk + }, +}) +``` + +### Pattern 3: Confirm Quit with Unsaved Changes + +```go +type AppState struct { + hasUnsavedChanges bool +} + +var state AppState + +window := app.NewWebviewWindow(application.WebviewWindowOptions{ + OnBeforeClose: func() bool { + if state.hasUnsavedChanges { + // Show dialog (blocks until user responds) + result := showConfirmdialog("Unsaved changes. Quit anyway?") + return result == "yes" + } + return true + }, +}) +``` + +### Pattern 4: Background Tasks + +```go +app := application.New(application.Options{ + OnStartup: func(ctx context.Context) { + // Start background task + go func() { + ticker := time.NewTicker(5 * time.Minute) + defer ticker.Stop() + + for { + select { + case <-ticker.C: + performBackgroundSync() + case <-ctx.Done(): + // Context cancelled, quit + return + } + } + }() + }, +}) +``` + +**Important:** Use `ctx.Done()` to know when to stop background tasks. + +## Window Lifecycle + +Each window has its own lifecycle: + +```d2 +direction: down + +Create: "Create Window" { + shape: oval + style.fill: "#10B981" +} + +Load: "Load Frontend" { + shape: rectangle +} + +Show: "Show Window" { + shape: rectangle +} + +Active: "Window Active" { + Events: "Handle Events" { + shape: rectangle + } +} + +CloseRequest: "Close Request" { + shape: diamond + style.fill: "#F59E0B" +} + +OnBeforeClose: "OnBeforeClose" { + shape: rectangle + style.fill: "#3B82F6" +} + +Destroy: "Destroy Window" { + shape: rectangle +} + +End: "Window Closed" { + shape: oval + style.fill: "#EF4444" +} + +Create -> Load +Load -> Show +Show -> Active.Events +Active.Events -> Active.Events: "Loop" +Active.Events -> CloseRequest: "User closes" +CloseRequest -> OnBeforeClose +OnBeforeClose -> Active.Events: "Cancelled" +OnBeforeClose -> Destroy: "Confirmed" +Destroy -> End +``` + +**Key points:** +- Each window is independent +- Closing last window quits app (by default) +- Windows can prevent their own closure + +## Multi-Window Lifecycle + +With multiple windows: + +```go +// Create main window +mainWindow := app.NewWebviewWindow() + +// Create secondary window +secondaryWindow := app.NewWebviewWindow(application.WebviewWindowOptions{ + Title: "Settings", + Width: 400, + Height: 600, +}) + +// Closing secondary window doesn't quit app +// Closing main window quits app (closes all windows) +``` + +**Default behaviour:** +- Closing any window closes just that window +- Closing the **last** window quits the application + +**Custom behaviour:** + +```go +// Prevent app quit when last window closes +app := application.New(application.Options{ + Mac: application.MacOptions{ + ApplicationShouldTerminateAfterLastWindowClosed: false, + }, +}) + +// Now app stays running even with no windows +// Useful for menu bar / system tray apps +``` + +## Error Handling During Lifecycle + +### Startup Errors + +```go +app := application.New(application.Options{ + OnStartup: func(ctx context.Context) { + if err := initialise(); err != nil { + // Show error dialog + showErrordialog("Initialisation failed: " + err.Error()) + + // Quit application + app.Quit() + } + }, +}) +``` + +### Shutdown Errors + +```go +app := application.New(application.Options{ + OnShutdown: func() { + if err := saveState(); err != nil { + // Log error (can't show dialog, app is quitting) + log.Printf("Failed to save state: %v", err) + } + }, +}) +``` + +**Important:** `OnShutdown` runs during quit - don't show dialogs or try to cancel. + +## Platform Differences + +### macOS + +- **Application menu** persists even with no windows +- **Cmd+Q** always quits (can't be prevented) +- **Dock icon** remains unless hidden + +### Windows + +- **No application menu** without a window +- **Alt+F4** closes window (can be prevented) +- **System tray** can keep app running + +### Linux + +- **Behaviour varies** by desktop environment +- **Generally similar to Windows** + +## Debugging Lifecycle Issues + +### Problem: Resources Not Cleaned Up + +**Symptom:** Database connections left open, files not closed + +**Solution:** Use `OnShutdown`: + +```go +app := application.New(application.Options{ + OnShutdown: func() { + log.Println("Cleaning up...") + // Your cleanup code + }, +}) +``` + +### Problem: Application Won't Quit + +**Symptom:** App hangs when trying to quit + +**Causes:** +1. `OnBeforeClose` returning `false` +2. `OnShutdown` taking too long +3. Background goroutines not stopping + +**Solution:** + +```go +// 1. Check OnBeforeClose logic +OnBeforeClose: func() bool { + log.Println("OnBeforeClose called") + return true // Allow quit +} + +// 2. Keep OnShutdown fast +OnShutdown: func() { + log.Println("OnShutdown started") + // Fast cleanup only + log.Println("OnShutdown finished") +} + +// 3. Stop background tasks +OnStartup: func(ctx context.Context) { + go func() { + for { + select { + case <-ctx.Done(): + log.Println("Background task stopped") + return + default: + // Work + } + } + }() +} +``` + +### Problem: Initialisation Fails Silently + +**Symptom:** App starts but doesn't work correctly + +**Solution:** Check errors in `OnStartup`: + +```go +OnStartup: func(ctx context.Context) { + if err := initialise(); err != nil { + log.Fatal("Initialisation failed:", err) + // Or show dialog and quit + } +} +``` + +## Best Practices + +### ✅ Do + +- **Initialise in OnStartup** - Database, config, resources +- **Clean up in OnShutdown** - Close connections, save state +- **Keep OnShutdown fast** - <1 second +- **Use context for cancellation** - Stop background tasks +- **Handle errors gracefully** - Show dialogs, log errors +- **Test quit scenarios** - Unsaved changes, background tasks + +### ❌ Don't + +- **Don't block OnStartup** - Keep it fast (<2 seconds) +- **Don't show dialogs in OnShutdown** - App is quitting +- **Don't ignore errors** - Log or show them +- **Don't leak resources** - Always clean up +- **Don't forget background tasks** - Stop them on quit + +## Next Steps + +**Go-Frontend Bridge** - Understand how Go and JavaScript communicate +[Learn More →](/concepts/bridge) + +**Build System** - Learn how Wails builds your application +[Learn More →](/concepts/build-system) + +**Events System** - Use events for communication between components +[Learn More →](/features/events/system) + +**Window Management** - Create and manage multiple windows +[Learn More →](/features/windows/basics) + +--- + +**Questions about lifecycle?** Ask in [Discord](https://discord.gg/JDdSxwjhGf) or check the [examples](https://github.com/wailsapp/wails/tree/v3-alpha/v3/examples). diff --git a/docs/src/content/docs/learn/manager-api.mdx b/docs/src/content/docs/concepts/manager-api.mdx similarity index 98% rename from docs/src/content/docs/learn/manager-api.mdx rename to docs/src/content/docs/concepts/manager-api.mdx index d58445742..26f6de918 100644 --- a/docs/src/content/docs/learn/manager-api.mdx +++ b/docs/src/content/docs/concepts/manager-api.mdx @@ -1,7 +1,8 @@ --- title: Manager API +description: Organized API structure with focused manager interfaces sidebar: - order: 25 + order: 2 --- import { Tabs, TabItem } from "@astrojs/starlight/components"; diff --git a/docs/src/content/docs/contributing.mdx b/docs/src/content/docs/contributing.mdx new file mode 100644 index 000000000..841c30282 --- /dev/null +++ b/docs/src/content/docs/contributing.mdx @@ -0,0 +1,275 @@ +--- +title: Contributing +description: Contribute to Wails +sidebar: + order: 100 +--- + +import { Card, CardGrid } from "@astrojs/starlight/components"; + +## Welcome Contributors! + +We welcome contributions to Wails! Whether you're fixing bugs, adding features, or improving documentation, your help is appreciated. + +## Ways to Contribute + +### 1. Report Issues + +Found a bug? [Open an issue](https://github.com/wailsapp/wails/issues/new) with: +- Clear description +- Steps to reproduce +- Expected vs actual behaviour +- System information +- Code samples + +### 2. Improve Documentation + +Documentation improvements are always welcome: +- Fix typos and errors +- Add examples +- Clarify explanations +- Translate content + +### 3. Submit Code + +Contribute code through pull requests: +- Bug fixes +- New features +- Performance improvements +- Tests + +## Getting Started + +### Fork and Clone + +```bash +# Fork the repository on GitHub +# Then clone your fork +git clone https://github.com/YOUR_USERNAME/wails.git +cd wails + +# Add upstream remote +git remote add upstream https://github.com/wailsapp/wails.git +``` + +### Build from Source + +```bash +# Install dependencies +go mod download + +# Build Wails CLI +cd v3/cmd/wails3 +go build + +# Test your build +./wails3 version +``` + +### Run Tests + +```bash +# Run all tests +go test ./... + +# Run specific package tests +go test ./v3/pkg/application + +# Run with coverage +go test -cover ./... +``` + +## Making Changes + +### Create a Branch + +```bash +# Update main +git checkout main +git pull upstream main + +# Create feature branch +git checkout -b feature/my-feature +``` + +### Make Your Changes + +1. **Write code** following Go conventions +2. **Add tests** for new functionality +3. **Update documentation** if needed +4. **Run tests** to ensure nothing breaks +5. **Commit changes** with clear messages + +### Commit Guidelines + +```bash +# Good commit messages +git commit -m "fix: resolve window focus issue on macOS" +git commit -m "feat: add support for custom window chrome" +git commit -m "docs: improve bindings documentation" + +# Use conventional commits: +# - feat: New feature +# - fix: Bug fix +# - docs: Documentation +# - test: Tests +# - refactor: Code refactoring +# - chore: Maintenance +``` + +### Submit Pull Request + +```bash +# Push to your fork +git push origin feature/my-feature + +# Open pull request on GitHub +# Provide clear description +# Reference related issues +``` + +## Pull Request Guidelines + +### Good PR Description + +```markdown +## Description +Brief description of changes + +## Changes +- Added feature X +- Fixed bug Y +- Updated documentation + +## Testing +- Tested on macOS 14 +- Tested on Windows 11 +- All tests passing + +## Related Issues +Fixes #123 +``` + +### PR Checklist + +- [ ] Code follows Go conventions +- [ ] Tests added/updated +- [ ] Documentation updated +- [ ] All tests passing +- [ ] No breaking changes (or documented) +- [ ] Commit messages clear + +## Code Guidelines + +### Go Code Style + +```go +// ✅ Good: Clear, documented, tested +// ProcessData processes the input data and returns the result. +// It returns an error if the data is invalid. +func ProcessData(data string) (string, error) { + if data == "" { + return "", errors.New("data cannot be empty") + } + + result := process(data) + return result, nil +} + +// ❌ Bad: No docs, no error handling +func ProcessData(data string) string { + return process(data) +} +``` + +### Testing + +```go +func TestProcessData(t *testing.T) { + tests := []struct { + name string + input string + want string + wantErr bool + }{ + {"valid input", "test", "processed", false}, + {"empty input", "", "", true}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := ProcessData(tt.input) + if (err != nil) != tt.wantErr { + t.Errorf("ProcessData() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("ProcessData() = %v, want %v", got, tt.want) + } + }) + } +} +``` + +## Documentation + +### Writing Docs + +Documentation uses Starlight (Astro): + +```bash +cd docs +npm install +npm run dev +``` + +### Documentation Style + +- Use International English spelling +- Start with the problem +- Provide working examples +- Include troubleshooting +- Cross-reference related content + +## Community + +### Get Help + +- **Discord:** [Join our community](https://discord.gg/JDdSxwjhGf) +- **GitHub Discussions:** Ask questions +- **GitHub Issues:** Report bugs + +### Code of Conduct + +Be respectful, inclusive, and professional. We're all here to build great software together. + +## Recognition + +Contributors are recognised in: +- Release notes +- Contributors list +- GitHub insights + +Thank you for contributing to Wails! 🎉 + +## Next Steps + + + + Visit the Wails repository. + + [View on GitHub →](https://github.com/wailsapp/wails) + + + + Join the community. + + [Join Discord →](https://discord.gg/JDdSxwjhGf) + + + + Read the docs. + + [Browse Docs →](/quick-start/why-wails) + + diff --git a/docs/src/content/docs/learn/binding-system.mdx b/docs/src/content/docs/contributing/architecture/bindings.mdx similarity index 97% rename from docs/src/content/docs/learn/binding-system.mdx rename to docs/src/content/docs/contributing/architecture/bindings.mdx index 13ce15932..9cfcfa2b6 100644 --- a/docs/src/content/docs/learn/binding-system.mdx +++ b/docs/src/content/docs/contributing/architecture/bindings.mdx @@ -1,7 +1,8 @@ --- -title: Binding System Internals +title: Binding System +description: How the binding system collects, processes, and generates JavaScript/TypeScript code sidebar: - order: 21 + order: 1 --- import { FileTree } from "@astrojs/starlight/components"; diff --git a/docs/src/content/docs/contributing/getting-started.mdx b/docs/src/content/docs/contributing/getting-started.mdx new file mode 100644 index 000000000..279324a16 --- /dev/null +++ b/docs/src/content/docs/contributing/getting-started.mdx @@ -0,0 +1,369 @@ +--- +title: Getting Started +description: How to start contributing to Wails v3 +--- + +import { Steps, Tabs, TabItem } from '@astrojs/starlight/components'; + +## Welcome, Contributor! + +Thank you for your interest in contributing to Wails! This guide will help you make your first contribution. + +## Prerequisites + +Before you begin, ensure you have: + +- **Go 1.25+** installed ([download](https://go.dev/dl/)) +- **Node.js 20+** and **npm** ([download](https://nodejs.org/)) +- **Git** configured with your GitHub account +- Basic familiarity with Go and JavaScript/TypeScript + +### Platform-Specific Requirements + +**macOS:** +- Xcode Command Line Tools: `xcode-select --install` + +**Windows:** +- MSYS2 or similar Unix-like environment recommended +- WebView2 runtime (usually pre-installed on Windows 11) + +**Linux:** +- `gcc`, `pkg-config`, `libgtk-3-dev`, `libwebkit2gtk-4.0-dev` +- Install via: `sudo apt install build-essential pkg-config libgtk-3-dev libwebkit2gtk-4.0-dev` (Debian/Ubuntu) + +## Contribution Process Overview + +The typical contribution workflow follows these steps: + +1. **Fork & Clone** - Create your own copy of the Wails repository +2. **Setup** - Build the Wails CLI and verify your environment +3. **Branch** - Create a feature branch for your changes +4. **Develop** - Make your changes following our coding standards +5. **Test** - Run tests to ensure everything works +6. **Commit** - Commit with clear, conventional commit messages +7. **Submit** - Open a pull request for review +8. **Iterate** - Respond to feedback and make adjustments +9. **Merge** - Once approved, your changes become part of Wails! + +## Step-by-Step Guide + +Choose your contribution type: + + + + + + +1. **Find or Report the Bug** + + - Check if the bug is already reported in [GitHub Issues](https://github.com/wailsapp/wails/issues) + - If not, create a new issue with steps to reproduce + - Wait for confirmation before starting work + +2. **Fork and Clone** + + Fork the repository at [github.com/wailsapp/wails/fork](https://github.com/wailsapp/wails/fork) + + Clone your fork: + ```bash + git clone https://github.com/YOUR_USERNAME/wails.git + cd wails + git remote add upstream https://github.com/wailsapp/wails.git + ``` + +3. **Build and Verify** + + Build Wails and verify you can reproduce the bug: + ```bash + cd v3 + go build -o ../wails3 ./cmd/wails3 + + # Reproduce the bug to understand it + ``` + +4. **Create a Bug Fix Branch** + + Create a branch for your fix: + ```bash + git checkout -b fix/issue-123-window-crash + ``` + +5. **Fix the Bug** + + - Make the minimal changes needed to fix the bug + - Don't refactor unrelated code + - Add or update tests to prevent regression + + ```bash + # Make your changes + # Add tests in *_test.go files + ``` + +6. **Test Your Fix** + + Run tests to ensure the fix works: + ```bash + go test ./... + + # Test the specific package + go test ./pkg/application -v + + # Run with race detector + go test ./... -race + ``` + +7. **Commit Your Fix** + + Commit with a clear message: + ```bash + git commit -m "fix: prevent window crash when closing during initialization + + Fixes #123" + ``` + +8. **Submit Pull Request** + + Push and create PR: + ```bash + git push origin fix/issue-123-window-crash + ``` + + In your PR description: + - Explain the bug and root cause + - Describe your fix + - Reference the issue: "Fixes #123" + - Include before/after behavior + +9. **Respond to Feedback** + + Address review comments and update your PR as needed. + + + + + + + + +1. **Discuss the Feature** + + - Open a [GitHub Discussion](https://github.com/wailsapp/wails/discussions) or issue + - Describe what you want to add and why + - Wait for maintainer feedback before implementing + - Ensure it aligns with Wails' goals + +2. **Fork and Clone** + + Fork the repository at [github.com/wailsapp/wails/fork](https://github.com/wailsapp/wails/fork) + + Clone your fork: + ```bash + git clone https://github.com/YOUR_USERNAME/wails.git + cd wails + git remote add upstream https://github.com/wailsapp/wails.git + ``` + +3. **Setup Development Environment** + + Build Wails and verify your environment: + ```bash + cd v3 + go build -o ../wails3 ./cmd/wails3 + + # Run tests to ensure everything works + go test ./... + ``` + +4. **Create a Feature Branch** + + Create a descriptive branch: + ```bash + git checkout -b feat/window-transparency-support + ``` + +5. **Implement the Feature** + + - Follow our [Coding Standards](/contributing/standards) + - Keep changes focused on the feature + - Write clean, documented code + - Add comprehensive tests + + ```bash + # Example: Adding a new window method + # 1. Add to window.go interface + # 2. Implement in platform files (darwin, windows, linux) + # 3. Add tests + # 4. Update documentation + ``` + +6. **Test Thoroughly** + + Test your feature: + ```bash + # Unit tests + go test ./pkg/application -v + + # Integration test - create a test app + cd .. + ./wails3 init -n feature-test + cd feature-test + # Add code using your new feature + ../wails3 dev + ``` + +7. **Document Your Feature** + + - Add docstrings to all public APIs + - Update relevant documentation in `/docs` + - Add examples if applicable + +8. **Commit with Convention** + + Use conventional commits: + ```bash + git commit -m "feat: add window transparency support + + - Add SetTransparent() method to Window API + - Implement for macOS, Windows, and Linux + - Add tests and documentation + + Closes #456" + ``` + +9. **Submit Pull Request** + + Push and create PR: + ```bash + git push origin feat/window-transparency-support + ``` + + In your PR: + - Describe the feature and use cases + - Show examples or screenshots + - List any breaking changes + - Reference the discussion/issue + +10. **Iterate Based on Review** + + Maintainers may request changes. Be patient and collaborative. + + + + + + + + +1. **Identify Documentation Needs** + + - Found outdated docs while using Wails? + - Notice missing examples or explanations? + - Want to fix typos or improve clarity? + - Check [documentation issues](https://github.com/wailsapp/wails/labels/documentation) + +2. **Fork and Clone** + + Fork the repository at [github.com/wailsapp/wails/fork](https://github.com/wailsapp/wails/fork) + + Clone your fork: + ```bash + git clone https://github.com/YOUR_USERNAME/wails.git + cd wails + git remote add upstream https://github.com/wailsapp/wails.git + ``` + +3. **Setup Documentation Environment** + + The docs are in `/docs` and built with Astro: + ```bash + cd docs + npm install + npm run dev + ``` + + Open http://localhost:4321/ to preview changes live. + +4. **Create a Documentation Branch** + + Create a branch for your changes: + ```bash + git checkout -b docs/improve-window-api-examples + ``` + +5. **Make Your Changes** + + Documentation files are in `/docs/src/content/docs/`: + ```bash + # Edit MDX files + # Check the preview in your browser + # Ensure formatting is correct + ``` + + **Best Practices:** + - Use clear, concise language + - Include practical code examples + - Add links to related sections + - Check spelling and grammar + - Test all code examples + +6. **Verify Your Changes** + + Check the live preview and ensure: + - Links work correctly + - Code examples are accurate + - Formatting renders properly + - No broken images or references + +7. **Commit Documentation Changes** + + Commit with clear message: + ```bash + git commit -m "docs: add practical examples to Window API guide + + - Add window positioning examples + - Include common patterns section + - Fix broken links to Event API" + ``` + +8. **Submit Pull Request** + + Push and create PR: + ```bash + git push origin docs/improve-window-api-examples + ``` + + In your PR: + - Describe what docs you improved + - Explain why the change helps users + - Include screenshots if visual changes + +9. **Address Review Feedback** + + Documentation PRs are usually quick to review and merge! + + + + + + +## Finding Issues to Work On + +- Look for [`good first issue`](https://github.com/wailsapp/wails/labels/good%20first%20issue) labels +- Check [`help wanted`](https://github.com/wailsapp/wails/labels/help%20wanted) issues +- Browse [open issues](https://github.com/wailsapp/wails/issues) and ask to be assigned + +## Getting Help + +- **Discord:** Join [Wails Discord](https://discord.gg/JDdSxwjhGf) +- **Discussions:** Post in [GitHub Discussions](https://github.com/wailsapp/wails/discussions) +- **Issues:** Open an issue if you find a bug or have a question + +## Code of Conduct + +Be respectful, constructive, and welcoming. We're building a friendly community focused on creating great software together. + +## Next Steps + +- Set up your [Development Environment](/contributing/setup) +- Review our [Coding Standards](/contributing/standards) +- Explore the [Technical Documentation](/contributing) diff --git a/docs/src/content/docs/contributing/index.mdx b/docs/src/content/docs/contributing/index.mdx index d39ee36b2..2855eb222 100644 --- a/docs/src/content/docs/contributing/index.mdx +++ b/docs/src/content/docs/contributing/index.mdx @@ -119,7 +119,7 @@ diagrams, and references to the relevant source files. --- :::note -Prerequisites: You should be comfortable with **Go 1.23+**, basic TypeScript, +Prerequisites: You should be comfortable with **Go 1.25+**, basic TypeScript, and modern frontend build tools. If you are new to Go, consider skimming the official tour first. ::: diff --git a/docs/src/content/docs/contributing/setup.mdx b/docs/src/content/docs/contributing/setup.mdx new file mode 100644 index 000000000..c7750cd89 --- /dev/null +++ b/docs/src/content/docs/contributing/setup.mdx @@ -0,0 +1,297 @@ +--- +title: Development Setup +description: Set up your development environment for Wails v3 development +--- + +## Development Environment Setup + +This guide walks you through setting up a complete development environment for working on Wails v3. + +## Required Tools + +### Go Development + +1. **Install Go 1.25 or later:** + ```bash + # Download from https://go.dev/dl/ + go version # Verify installation + ``` + +2. **Configure Go environment:** + ```bash + # Add to your shell profile (.bashrc, .zshrc, etc.) + export GOPATH=$HOME/go + export PATH=$PATH:$GOPATH/bin + ``` + +3. **Install useful Go tools:** + ```bash + go install golang.org/x/tools/cmd/goimports@latest + go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest + ``` + +### Node.js and npm + +Required for building documentation and testing frontend integrations. + +```bash +# Install Node.js 20+ and npm +node --version # Should be 20+ +npm --version +``` + +### Platform-Specific Dependencies + +**macOS:** + +```bash +# Install Xcode Command Line Tools +xcode-select --install + +# Verify installation +xcode-select -p # Should output a path +``` + +**Windows:** + +1. Install [MSYS2](https://www.msys2.org/) for a Unix-like environment +2. WebView2 Runtime (pre-installed on Windows 11, [download](https://developer.microsoft.com/en-us/microsoft-edge/webview2/) for Windows 10) +3. Optional: Install [Git for Windows](https://git-scm.com/download/win) + +**Linux (Debian/Ubuntu):** + +```bash +sudo apt update +sudo apt install build-essential pkg-config libgtk-3-dev libwebkit2gtk-4.0-dev +``` + +**Linux (Fedora/RHEL):** + +```bash +sudo dnf install gcc pkg-config gtk3-devel webkit2gtk3-devel +``` + +**Linux (Arch):** + +```bash +sudo pacman -S base-devel gtk3 webkit2gtk +``` + +## Repository Setup + +### Clone and Configure + +```bash +# Clone your fork +git clone https://github.com/YOUR_USERNAME/wails.git +cd wails + +# Add upstream remote +git remote add upstream https://github.com/wailsapp/wails.git + +# Verify remotes +git remote -v +``` + +### Build the Wails CLI + +```bash +# Navigate to v3 directory +cd v3 + +# Build the CLI +go build -o ../wails3 ./cmd/wails3 + +# Test the build +cd .. +./wails3 version +``` + +### Add to PATH (Optional) + +**Linux/macOS:** + +```bash +# Add to ~/.bashrc or ~/.zshrc +export PATH=$PATH:/path/to/wails +``` + +**Windows:** + +Add the Wails directory to your PATH environment variable through System Properties. + +## IDE Setup + +### VS Code (Recommended) + +1. **Install VS Code:** [Download](https://code.visualstudio.com/) + +2. **Install extensions:** + - Go (by Go Team at Google) + - ESLint + - Prettier + - MDX (for documentation) + +3. **Configure workspace settings** (`.vscode/settings.json`): + ```json + { + "go.useLanguageServer": true, + "go.lintTool": "golangci-lint", + "go.lintOnSave": "workspace", + "editor.formatOnSave": true, + "go.formatTool": "goimports" + } + ``` + +### GoLand + +1. **Install GoLand:** [Download](https://www.jetbrains.com/go/) + +2. **Configure:** + - Enable Go modules support + - Set up file watchers for `goimports` + - Configure code style to match project conventions + +## Verify Your Setup + +Run these commands to verify everything is working: + +```bash +# Go version check +go version + +# Build Wails +cd v3 +go build ./cmd/wails3 + +# Run tests +go test ./pkg/... + +# Create a test app +cd .. +./wails3 init -n mytest -t vanilla +cd mytest +../wails3 dev +``` + +If the test app builds and runs, your environment is ready! + +## Running Tests + +### Unit Tests + +```bash +cd v3 +go test ./... +``` + +### Specific Package Tests + +```bash +go test ./pkg/application +go test ./pkg/events -v # Verbose output +``` + +### Run with Coverage + +```bash +go test ./... -coverprofile=coverage.out +go tool cover -html=coverage.out +``` + +### Run with Race Detector + +```bash +go test ./... -race +``` + +## Working with Documentation + +The Wails documentation is built with Astro and Starlight. + +```bash +cd docs + +# Install dependencies +npm install + +# Start dev server +npm run dev + +# Build for production +npm run build +``` + +Documentation will be available at `http://localhost:4321/` + +## Debugging + +### Debugging Go Code + +**VS Code:** + +Create `.vscode/launch.json`: + +```json +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Debug Wails CLI", + "type": "go", + "request": "launch", + "mode": "debug", + "program": "${workspaceFolder}/v3/cmd/wails3", + "args": ["dev"] + } + ] +} +``` + +**Command Line:** + +```bash +# Use Delve debugger +go install github.com/go-delve/delve/cmd/dlv@latest +dlv debug ./cmd/wails3 -- dev +``` + +### Debugging Platform Code + +Platform-specific debugging requires platform tools: + +- **macOS:** Xcode Instruments +- **Windows:** Visual Studio Debugger +- **Linux:** GDB + +## Common Issues + +### "command not found: wails3" + +Add the Wails directory to your PATH or use `./wails3` from the project root. + +### "webkit2gtk not found" (Linux) + +Install WebKit2GTK development packages: + +```bash +sudo apt install libwebkit2gtk-4.0-dev # Debian/Ubuntu +``` + +### Build fails with Go module errors + +```bash +cd v3 +go mod tidy +go mod download +``` + +### "CGO_ENABLED" errors on Windows + +Ensure you have a C compiler (MinGW-w64 via MSYS2) in your PATH. + +## Next Steps + +- Review [Coding Standards](/contributing/standards) +- Explore the [Technical Documentation](/contributing) +- Find an issue to work on: [Good First Issues](https://github.com/wailsapp/wails/labels/good%20first%20issue) diff --git a/docs/src/content/docs/contributing/standards.mdx b/docs/src/content/docs/contributing/standards.mdx new file mode 100644 index 000000000..b28a5faa2 --- /dev/null +++ b/docs/src/content/docs/contributing/standards.mdx @@ -0,0 +1,465 @@ +--- +title: Coding Standards +description: Code style, conventions, and best practices for Wails v3 +--- + +## Code Style and Conventions + +Following consistent coding standards makes the codebase easier to read, maintain, and contribute to. + +## Go Code Standards + +### Code Formatting + +Use standard Go formatting tools: + +```bash +# Format all code +gofmt -w . + +# Use goimports for import organization +goimports -w . +``` + +**Required:** All Go code must pass `gofmt` and `goimports` before committing. + +### Naming Conventions + +**Packages:** +- Lowercase, single word when possible +- `package application`, `package events` +- Avoid underscores or mixed caps + +**Exported Names:** +- PascalCase for types, functions, constants +- `type WebviewWindow struct`, `func NewApplication()` + +**Unexported Names:** +- camelCase for internal types, functions, variables +- `type windowImpl struct`, `func createWindow()` + +**Interfaces:** +- Name by behavior: `Reader`, `Writer`, `Handler` +- Single-method interfaces: name with `-er` suffix + +```go +// Good +type Closer interface { + Close() error +} + +// Avoid +type CloseInterface interface { + Close() error +} +``` + +### Error Handling + +**Always check errors:** + +```go +// Good +result, err := doSomething() +if err != nil { + return fmt.Errorf("failed to do something: %w", err) +} + +// Bad - ignoring errors +result, _ := doSomething() +``` + +**Use error wrapping:** + +```go +// Wrap errors to provide context +if err := validate(); err != nil { + return fmt.Errorf("validation failed: %w", err) +} +``` + +**Create custom error types when needed:** + +```go +type ValidationError struct { + Field string + Value string +} + +func (e *ValidationError) Error() string { + return fmt.Sprintf("invalid value %q for field %q", e.Value, e.Field) +} +``` + +### Comments and Documentation + +**Package comments:** + +```go +// Package application provides the core Wails application runtime. +// +// It handles window management, event dispatching, and service lifecycle. +package application +``` + +**Exported declarations:** + +```go +// NewApplication creates a new Wails application with the given options. +// +// The application must be started with Run() or RunWithContext(). +func NewApplication(opts Options) *Application { + // ... +} +``` + +**Implementation comments:** + +```go +// processEvent handles incoming events from the runtime. +// It dispatches to registered handlers and manages event lifecycle. +func (a *Application) processEvent(event *Event) { + // Validate event before processing + if event == nil { + return + } + + // Find and invoke handlers + // ... +} +``` + +### Function and Method Structure + +**Keep functions focused:** + +```go +// Good - single responsibility +func (w *Window) setTitle(title string) { + w.title = title + w.updateNativeTitle() +} + +// Bad - doing too much +func (w *Window) updateEverything() { + w.setTitle(w.title) + w.setSize(w.width, w.height) + w.setPosition(w.x, w.y) + // ... 20 more operations +} +``` + +**Use early returns:** + +```go +// Good +func validate(input string) error { + if input == "" { + return errors.New("empty input") + } + + if len(input) > 100 { + return errors.New("input too long") + } + + return nil +} + +// Avoid deep nesting +``` + +### Concurrency + +**Use context for cancellation:** + +```go +func (a *Application) RunWithContext(ctx context.Context) error { + select { + case <-ctx.Done(): + return ctx.Err() + case <-a.done: + return nil + } +} +``` + +**Protect shared state with mutexes:** + +```go +type SafeCounter struct { + mu sync.Mutex + count int +} + +func (c *SafeCounter) Increment() { + c.mu.Lock() + defer c.mu.Unlock() + c.count++ +} +``` + +**Avoid goroutine leaks:** + +```go +// Good - goroutine has exit condition +func (a *Application) startWorker(ctx context.Context) { + go func() { + for { + select { + case <-ctx.Done(): + return // Clean exit + case work := <-a.workChan: + a.process(work) + } + } + }() +} +``` + +### Testing + +**Test file naming:** + +```go +// Implementation: window.go +// Tests: window_test.go +``` + +**Table-driven tests:** + +```go +func TestValidate(t *testing.T) { + tests := []struct { + name string + input string + wantErr bool + }{ + {"empty input", "", true}, + {"valid input", "hello", false}, + {"too long", strings.Repeat("a", 101), true}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := validate(tt.input) + if (err != nil) != tt.wantErr { + t.Errorf("validate() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} +``` + +## JavaScript/TypeScript Standards + +### Code Formatting + +Use Prettier for consistent formatting: + +```json +{ + "semi": false, + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "es5" +} +``` + +### Naming Conventions + +**Variables and functions:** +- camelCase: `const userName = "John"` + +**Classes and types:** +- PascalCase: `class WindowManager` + +**Constants:** +- UPPER_SNAKE_CASE: `const MAX_RETRIES = 3` + +### TypeScript + +**Use explicit types:** + +```typescript +// Good +function greet(name: string): string { + return `Hello, ${name}` +} + +// Avoid implicit any +function process(data) { // Bad + return data +} +``` + +**Define interfaces:** + +```typescript +interface WindowOptions { + title: string + width: number + height: number +} + +function createWindow(options: WindowOptions): void { + // ... +} +``` + +## Commit Message Format + +Use [Conventional Commits](https://www.conventionalcommits.org/): + +``` +(): + + + +