diff --git a/.github/workflows/check-format.yml b/.github/workflows/check-format.yml index 49d37529..b37ba9c3 100644 --- a/.github/workflows/check-format.yml +++ b/.github/workflows/check-format.yml @@ -44,4 +44,6 @@ jobs: - run: pnpm install --frozen-lockfile + - run: pnpm check:types + - run: pnpm build diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 87c7b4bf..919492ab 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -45,11 +45,12 @@ Thank you for your interest in contributing to Plane's developer documentation. ### Configuration Files -| File | Purpose | -| ----------------------------------- | -------------------------------------- | -| `docs/.vitepress/config.mts` | Navigation, sidebar, and site settings | -| `docs/.vitepress/theme/style.css` | Global CSS styles | -| `docs/.vitepress/theme/components/` | Custom Vue components | +| File | Purpose | +| ------------------------------------------- | ----------------------------------------- | +| `docs/.vitepress/config.mts` | Navigation, sidebar, and site settings | +| `docs/.vitepress/theme/styles.css` | Global CSS styles (VoidZero/Vitest theme) | +| `docs/.vitepress/theme/plane-overrides.css` | Plane-specific CSS overrides | +| `docs/.vitepress/theme/components/` | Custom Vue components | ## Writing Documentation diff --git a/README.md b/README.md index 9ec960e7..1505303c 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,8 @@ docs/ │ ├── config.mts # VitePress configuration │ ├── theme/ # Custom Vue theme │ │ ├── components/ # Custom Vue components -│ │ └── style.css # Global styles +│ │ ├── styles.css # VoidZero/Vitest theme styles +│ │ └── plane-overrides.css # Plane-specific overrides │ └── public/ # Static assets (images, logos) ├── api-reference/ # REST API documentation ├── self-hosting/ # Deployment and configuration guides diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index 1dcae9bd..3695e7e1 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -1,8 +1,11 @@ -import { defineConfig, type HeadConfig } from "vitepress"; +/// +import { defineConfig, type HeadConfig, type PageData } from "vitepress"; import { tabsMarkdownPlugin } from "vitepress-plugin-tabs"; import { withMermaid } from "vitepress-plugin-mermaid"; +import { extendConfig } from "@voidzero-dev/vitepress-theme/config"; import { readFileSync, readdirSync, statSync, mkdirSync, copyFileSync } from "node:fs"; import { resolve, join, relative, dirname } from "node:path"; +import { fileURLToPath } from "node:url"; function loadEnvVar(key: string): string | undefined { // process.env takes precedence (CI/hosting platforms set vars here) @@ -48,90 +51,105 @@ const posthogHead: HeadConfig[] = posthogKey ] : []; -export default withMermaid( - defineConfig({ - markdown: { - config(md) { - md.use(tabsMarkdownPlugin); +export default extendConfig( + withMermaid( + defineConfig({ + markdown: { + config(md) { + md.use(tabsMarkdownPlugin); + }, }, - }, - mermaid: { - // Mermaid configuration options - }, - vite: { - optimizeDeps: { - include: [ - "lucide-vue-next", - "mermaid", - "@braintree/sanitize-url", - "dayjs", - "cytoscape", - "cytoscape-cose-bilkent", - "d3", - "khroma", - "dagre-d3-es", - "lodash-es", - "dompurify", - ], + mermaid: { + // Mermaid configuration options + }, + vite: { + resolve: { + alias: { + "@vp-default/VPNavBarSearchButton.vue": fileURLToPath( + new URL("./theme/components/PlaneSearchButton.vue", import.meta.url) + ), + }, + }, + optimizeDeps: { + include: [ + "lucide-vue-next", + "mermaid", + "@braintree/sanitize-url", + "dayjs", + "cytoscape", + "cytoscape-cose-bilkent", + "d3", + "khroma", + "dagre-d3-es", + "lodash-es", + "dompurify", + ], + }, }, - }, - buildEnd(siteConfig) { - // Copy source .md files into dist/ for Accept: text/markdown negotiation. - const srcDir = siteConfig.srcDir; - const outDir = siteConfig.outDir; - - function walk(dir: string): void { - for (const entry of readdirSync(dir)) { - if (entry === ".vitepress" || entry === "public" || entry === "node_modules") continue; - const abs = join(dir, entry); - const stat = statSync(abs); - if (stat.isDirectory()) { - walk(abs); - } else if (stat.isFile() && abs.endsWith(".md")) { - const rel = relative(srcDir, abs); - const dest = join(outDir, rel); - mkdirSync(dirname(dest), { recursive: true }); - copyFileSync(abs, dest); + buildEnd(siteConfig) { + // Copy source .md files into dist/ for Accept: text/markdown negotiation. + const srcDir = siteConfig.srcDir; + const outDir = siteConfig.outDir; + + function walk(dir: string): void { + for (const entry of readdirSync(dir)) { + if (entry === ".vitepress" || entry === "public" || entry === "node_modules") continue; + const abs = join(dir, entry); + const stat = statSync(abs); + if (stat.isDirectory()) { + walk(abs); + } else if (stat.isFile() && abs.endsWith(".md")) { + const rel = relative(srcDir, abs); + const dest = join(outDir, rel); + mkdirSync(dirname(dest), { recursive: true }); + copyFileSync(abs, dest); + } } } - } - walk(srcDir); - }, - title: "Plane developer documentation", - description: - "Self-host Plane, integrate with our API, configure webhooks, and extend your project management platform. Complete guides for developers building on Plane.", + walk(srcDir); + }, + title: "Plane developer documentation", + description: + "Self-host Plane, integrate with our API, configure webhooks, and extend your project management platform. Complete guides for developers building on Plane.", - // SEO: Generate sitemap automatically - sitemap: { - hostname: "https://developers.plane.so", - }, + // SEO: Generate sitemap automatically + sitemap: { + hostname: "https://developers.plane.so", + }, - // SEO: Clean URLs without .html extension - cleanUrls: true, + // SEO: Clean URLs without .html extension + cleanUrls: true, - // SEO: Title template for all pages - titleTemplate: ":title | Plane", + // SEO: Title template for all pages + titleTemplate: ":title | Plane", - head: [ - ["link", { rel: "icon", href: "/logo/favicon-32x32.png" }], - [ - "link", - { - rel: "preload", - href: "/fonts/Inter/InterVariable.woff2", - as: "font", - type: "font/woff2", - crossorigin: "", - }, - ], + head: [ + ["link", { rel: "icon", href: "/logo/favicon-32x32.png" }], + [ + "link", + { + rel: "preload", + href: "/fonts/Inter/InterVariable.woff2", + as: "font", + type: "font/woff2", + crossorigin: "", + }, + ], - // Google Analytics with Consent Mode v2 - ["script", { async: "", src: "https://www.googletagmanager.com/gtag/js?id=G-JF828SKW90" }], - [ - "script", - {}, - `window.dataLayer = window.dataLayer || []; + // Sync OSS header data-theme with html.dark after hydration + [ + "script", + {}, + `(function(){function s(){var d=document.documentElement.classList.contains("dark");document.querySelectorAll("header.wrapper").forEach(function(h){d?h.setAttribute("data-theme","dark"):h.removeAttribute("data-theme")})}s();new MutationObserver(s).observe(document.documentElement,{attributes:true,attributeFilter:["class"]})})();`, + ], + + // Google Analytics with Consent Mode v2 + ["script", { async: "", src: "https://www.googletagmanager.com/gtag/js?id=G-JF828SKW90" }], + [ + "script", + {}, + `window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('consent', 'default', { 'analytics_storage': 'denied', @@ -141,865 +159,911 @@ export default withMermaid( }); gtag('js', new Date()); gtag('config', 'G-JF828SKW90');`, - ], + ], - // PostHog Analytics (loaded only when VITE_POSTHOG_KEY is set) - ...posthogHead, + // PostHog Analytics (loaded only when VITE_POSTHOG_KEY is set) + ...posthogHead, - // SEO: Basic meta tags - ["meta", { name: "viewport", content: "width=device-width, initial-scale=1.0" }], - ["meta", { name: "author", content: "Plane" }], - ["meta", { name: "robots", content: "index, follow" }], - [ - "meta", - { - name: "keywords", - content: - "plane, api, self-hosting, project management, developer documentation, kubernetes, docker, rest api, webhooks, plane api", - }, - ], - ["meta", { name: "theme-color", content: "#3b82f6" }], + // SEO: Basic meta tags + ["meta", { name: "viewport", content: "width=device-width, initial-scale=1.0" }], + ["meta", { name: "author", content: "Plane" }], + ["meta", { name: "robots", content: "index, follow" }], + [ + "meta", + { + name: "keywords", + content: + "plane, api, self-hosting, project management, developer documentation, kubernetes, docker, rest api, webhooks, plane api", + }, + ], + ["meta", { name: "theme-color", content: "#3b82f6" }], - // Open Graph meta tags - ["meta", { property: "og:type", content: "website" }], - ["meta", { property: "og:title", content: "Developer documentation | Plane" }], - [ - "meta", - { - property: "og:description", - content: - "Self-host Plane, integrate with our API, configure webhooks, and extend your project management platform.", - }, - ], - ["meta", { property: "og:image", content: "https://media.docs.plane.so/logo/og-docs.webp#hero" }], - ["meta", { property: "og:url", content: "https://developers.plane.so" }], + // Open Graph meta tags + ["meta", { property: "og:type", content: "website" }], + ["meta", { property: "og:title", content: "Developer documentation | Plane" }], + [ + "meta", + { + property: "og:description", + content: + "Self-host Plane, integrate with our API, configure webhooks, and extend your project management platform.", + }, + ], + ["meta", { property: "og:image", content: "https://media.docs.plane.so/logo/og-docs.webp#hero" }], + ["meta", { property: "og:url", content: "https://developers.plane.so" }], - // Twitter Card meta tags - ["meta", { name: "twitter:card", content: "summary_large_image" }], - ["meta", { name: "twitter:title", content: "Developer documentation | Plane" }], - [ - "meta", - { - name: "twitter:description", - content: - "Self-host Plane, integrate with our API, configure webhooks, and extend your project management platform.", - }, + // Twitter Card meta tags + ["meta", { name: "twitter:card", content: "summary_large_image" }], + ["meta", { name: "twitter:title", content: "Developer documentation | Plane" }], + [ + "meta", + { + name: "twitter:description", + content: + "Self-host Plane, integrate with our API, configure webhooks, and extend your project management platform.", + }, + ], + ["meta", { name: "twitter:image", content: "https://media.docs.plane.so/logo/og-docs.webp#hero" }], ], - ["meta", { name: "twitter:image", content: "https://media.docs.plane.so/logo/og-docs.webp#hero" }], - ], - - transformPageData(pageData) { - const head = (pageData.frontmatter.head ??= []); - - // Inject canonical URL if not already defined in frontmatter - const hasCanonical = head.some(([tag, attrs]) => tag === "link" && attrs?.rel === "canonical"); - if (!hasCanonical) { - const canonicalUrl = `https://developers.plane.so/${pageData.relativePath}` - .replace(/index\.md$/, "") - .replace(/\.md$/, ""); - head.push(["link", { rel: "canonical", href: canonicalUrl }]); - } - // Inject frontmatter keywords as a meta tag (VitePress doesn't do this natively) - const keywords = pageData.frontmatter.keywords; - if (keywords) { - head.push(["meta", { name: "keywords", content: keywords }]); - } - }, + transformPageData(pageData: PageData) { + const head = (pageData.frontmatter.head ??= []); - themeConfig: { - siteTitle: false, - logo: { - light: "/logo/dev-logo-watermark-light.png", - dark: "/logo/dev-logo-watermark-dark.png", - }, + // Inject canonical URL if not already defined in frontmatter + const hasCanonical = (head as HeadConfig[]).some( + ([tag, attrs]) => tag === "link" && attrs?.rel === "canonical" + ); + if (!hasCanonical) { + const canonicalUrl = `https://developers.plane.so/${pageData.relativePath}` + .replace(/index\.md$/, "") + .replace(/\.md$/, ""); + head.push(["link", { rel: "canonical", href: canonicalUrl }]); + } - outline: { - level: [2, 3], - label: "On this page", + // Inject frontmatter keywords as a meta tag (VitePress doesn't do this natively) + const keywords = pageData.frontmatter.keywords; + if (keywords) { + head.push(["meta", { name: "keywords", content: keywords }]); + } }, - nav: [ - { text: "Self-hosting", link: "/self-hosting/overview" }, - { text: "API Reference", link: "/api-reference/introduction" }, - { text: "Build and extend", link: "/dev-tools/build-plane-app/overview" }, - { text: "Plane Docs", link: "https://docs.plane.so" }, - { text: "Sign in", link: "https://app.plane.so/sign-in" }, - ], + themeConfig: { + variant: "voidzero", + siteTitle: "Plane", + logo: { + light: "/logo/dev-logo-watermark-light.png", + dark: "/logo/dev-logo-watermark-dark.png", + }, - sidebar: { - "/self-hosting/": [ - { - text: "Self-host Plane", - items: [ - { text: "Overview", link: "/self-hosting/overview" }, - { text: "Self-hosting 101", link: "/self-hosting/self-hosting-101" }, - { text: "Plane Editions", link: "/self-hosting/editions-and-versions" }, - { text: "Plane Architecture", link: "/self-hosting/plane-architecture" }, - ], - }, - { - text: "Install", - items: [ - { text: "Overview", link: "/self-hosting/methods/overview" }, - { - text: "Docker", - collapsed: true, - items: [ - { text: "Docker Compose", link: "/self-hosting/methods/docker-compose" }, - { text: "Docker AIO", link: "/self-hosting/methods/docker-aio" }, - { text: "Docker Swarm", link: "/self-hosting/methods/docker-swarm" }, - { text: "Download config files", link: "/self-hosting/methods/download-config" }, - ], - }, - { - text: "Kubernetes", - link: "/self-hosting/methods/kubernetes", - collapsed: true, - items: [{ text: "High availability", link: "/self-hosting/govern/high-availability" }], - }, - { text: "Podman Quadlets", link: "/self-hosting/methods/podman-quadlets" }, - { - text: "Airgapped Edition", - collapsed: true, - items: [ - { text: "Overview", link: "/self-hosting/methods/airgapped-requirements" }, - { text: "On Docker", link: "/self-hosting/methods/airgapped-edition" }, - { text: "On Kubernetes", link: "/self-hosting/methods/airgapped-edition-kubernetes" }, - { text: "Clone Docker Images", link: "/self-hosting/methods/clone-docker-images" }, - ], - }, - { - text: "Managed Platforms", - collapsed: true, - items: [ - { text: "Coolify", link: "/self-hosting/methods/coolify" }, - { text: "Portainer", link: "/self-hosting/methods/portainer" }, - ], - }, - ], - }, - { - text: "Configure", - items: [ - { text: "Instance Admin", link: "/self-hosting/govern/instance-admin" }, - { - text: "Authentication", - collapsed: true, - items: [ - { text: "Overview", link: "/self-hosting/govern/authentication" }, - { text: "Google OAuth", link: "/self-hosting/govern/google-oauth" }, - { text: "GitHub OAuth", link: "/self-hosting/govern/github-oauth" }, - { text: "OIDC SSO", link: "/self-hosting/govern/oidc-sso" }, - { text: "SAML SSO", link: "/self-hosting/govern/saml-sso" }, - { text: "LDAP", link: "/self-hosting/govern/ldap" }, - { text: "Reset Password", link: "/self-hosting/govern/reset-password" }, - ], - }, - { text: "SMTP for email", link: "/self-hosting/govern/communication" }, - { text: "External services", link: "/self-hosting/govern/database-and-storage" }, - { text: "Custom domain", link: "/self-hosting/govern/custom-domain" }, - { text: "SSL", link: "/self-hosting/govern/configure-ssl" }, - { - text: "Integrations", - collapsed: true, - items: [ - { text: "GitHub", link: "/self-hosting/govern/integrations/github" }, - { text: "GitLab", link: "/self-hosting/govern/integrations/gitlab" }, - { text: "Sentry", link: "/self-hosting/govern/integrations/sentry" }, - { text: "Slack", link: "/self-hosting/govern/integrations/slack" }, - ], - }, - { text: "DNS for Intake Email", link: "/self-hosting/govern/configure-dns-email-service" }, - { text: "OpenSearch for search", link: "/self-hosting/govern/advanced-search" }, - { - text: "Plane AI", - link: "/self-hosting/govern/plane-ai/configure-plane-ai", - collapsed: true, - items: [ - { text: "Embedding model", link: "/self-hosting/govern/plane-ai/configure-embedding-model" }, - { text: "AWS OpenSearch embedding", link: "/self-hosting/govern/plane-ai/aws-opensearch-embedding" }, - ], - }, - { text: "External secrets", link: "/self-hosting/govern/external-secrets" }, - { text: "External reverse proxy", link: "/self-hosting/govern/reverse-proxy" }, - { text: "Private storage buckets", link: "/self-hosting/govern/private-bucket" }, - { text: "Environment variables", link: "/self-hosting/govern/environment-variables" }, - { text: "Telemetry", link: "/self-hosting/telemetry" }, - ], - }, - { - text: "Manage", - items: [ - { - text: "Update Plane", - collapsed: true, - items: [ - { text: "Update to latest version", link: "/self-hosting/manage/upgrade-plane" }, - { text: "For versions before 0.14.0", link: "/self-hosting/manage/upgrade-from-0.13.2-0.14.0" }, - { - text: "Airgapped Edition", - collapsed: true, - items: [ - { - text: "On Docker", - link: "/self-hosting/manage/update-plane/airgapped-edition/update-airgapped-docker", - }, - { - text: "On Kubernetes", - link: "/self-hosting/manage/update-plane/airgapped-edition/update-airgapped-kubernetes", - }, - ], - }, - ], - }, - { - text: "Manage licenses", - collapsed: true, - items: [ - { - text: "Commercial Edition", - collapsed: true, - items: [ - { - text: "Pro or Business", - link: "/self-hosting/manage/manage-licenses/activate-pro-and-business", - }, - { text: "Enterprise Grid", link: "/self-hosting/manage/manage-licenses/activate-enterprise" }, - ], - }, - - { - text: "Airgapped Edition", - collapsed: true, - items: [ - { text: "Pro or Business", link: "/self-hosting/manage/manage-licenses/activate-airgapped" }, - { - text: "Enterprise Grid", - link: "/self-hosting/manage/manage-licenses/activate-airgapped-enterprise", - }, - ], - }, - ], - }, - { text: "Backup and restore", link: "/self-hosting/manage/backup-restore" }, - { text: "Upgrade Community to Commercial Edition", link: "/self-hosting/upgrade-from-community" }, - { text: "Upgrade Community to Airgapped Edition", link: "/self-hosting/manage/community-to-airgapped" }, - { text: "View Logs", link: "/self-hosting/manage/view-logs" }, - { text: "Health checks", link: "/self-hosting/manage/health-checks" }, - { text: "Migrate Plane", link: "/self-hosting/manage/migrate-plane" }, - { text: "Prime CLI", link: "/self-hosting/manage/prime-cli" }, - { text: "Manage users", link: "/self-hosting/manage/manage-instance-users" }, - ], - }, - { - text: "Troubleshoot", - items: [ - { text: "Overview", link: "/self-hosting/troubleshoot/overview" }, - { text: "Installation Errors", link: "/self-hosting/troubleshoot/installation-errors" }, - { text: "License Errors", link: "/self-hosting/troubleshoot/license-errors" }, - { text: "CLI Errors", link: "/self-hosting/troubleshoot/cli-errors" }, - { text: "Storage Errors", link: "/self-hosting/troubleshoot/storage-errors" }, - ], - }, - ], + outline: { + level: [2, 3], + label: "On this page", + }, - "/api-reference/": [ - { - text: "API Reference", - items: [ - { text: "Introduction", link: "/api-reference/introduction" }, - { - text: "Project", - collapsed: true, - items: [ - { text: "Overview", link: "/api-reference/project/overview" }, - { text: "Create Project", link: "/api-reference/project/add-project" }, - { text: "List Projects", link: "/api-reference/project/list-projects" }, - { text: "Get Project", link: "/api-reference/project/get-project-detail" }, - { text: "Update Project", link: "/api-reference/project/update-project-detail" }, - { text: "Archive Project", link: "/api-reference/project/archive-project" }, - { text: "Unarchive Project", link: "/api-reference/project/unarchive-project" }, - { text: "Delete Project", link: "/api-reference/project/delete-project" }, - ], - }, - { - text: "Project Features", - collapsed: true, - items: [ - { text: "Overview", link: "/api-reference/project-features/overview" }, - { text: "Get Project Features", link: "/api-reference/project-features/get-project-features" }, - { - text: "Update Project Features", - link: "/api-reference/project-features/update-project-features", - }, - ], - }, - { - text: "Project Labels", - collapsed: true, - items: [ - { text: "Overview", link: "/api-reference/project-labels/overview" }, - { text: "Create Project Label", link: "/api-reference/project-labels/add-project-label" }, - { text: "List Project Labels", link: "/api-reference/project-labels/list-project-labels" }, - { - text: "Get Project Label", - link: "/api-reference/project-labels/get-project-label-detail", - }, - { - text: "Update Project Label", - link: "/api-reference/project-labels/update-project-label-detail", - }, - { text: "Delete Project Label", link: "/api-reference/project-labels/delete-project-label" }, - ], - }, - { - text: "Work Item", - collapsed: true, - items: [ - { text: "Overview", link: "/api-reference/issue/overview" }, - { text: "Create Work Item", link: "/api-reference/issue/add-issue" }, - { text: "List Work Items", link: "/api-reference/issue/list-issues" }, - { text: "Get Work Item", link: "/api-reference/issue/get-issue-detail" }, - { text: "Get by identifier", link: "/api-reference/issue/get-issue-sequence-id" }, - { text: "Search Work Items", link: "/api-reference/issue/search-issues" }, - { text: "Advanced Search", link: "/api-reference/issue/advanced-search-work-items" }, - { text: "Update Work Item", link: "/api-reference/issue/update-issue-detail" }, - { text: "Delete Work Item", link: "/api-reference/issue/delete-issue" }, - ], - }, - { - text: "Work Item States", - collapsed: true, - items: [ - { text: "Overview", link: "/api-reference/state/overview" }, - { text: "Create State", link: "/api-reference/state/add-state" }, - { text: "List States", link: "/api-reference/state/list-states" }, - { text: "Get State", link: "/api-reference/state/get-state-detail" }, - { text: "Update State", link: "/api-reference/state/update-state-detail" }, - { text: "Delete State", link: "/api-reference/state/delete-state" }, - ], - }, - { - text: "Work Item Labels", - collapsed: true, - items: [ - { text: "Overview", link: "/api-reference/label/overview" }, - { text: "Create Label", link: "/api-reference/label/add-label" }, - { text: "List Labels", link: "/api-reference/label/list-labels" }, - { text: "Get Label", link: "/api-reference/label/get-label-detail" }, - { text: "Update Label", link: "/api-reference/label/update-label-detail" }, - { text: "Delete Label", link: "/api-reference/label/delete-label" }, - ], - }, - { - text: "Work Item Types", - collapsed: true, - items: [ - { text: "Overview", link: "/api-reference/issue-types/types/overview" }, - { text: "Add Type", link: "/api-reference/issue-types/types/add-issue-type" }, - { text: "List Types", link: "/api-reference/issue-types/types/list-issue-types" }, - { text: "Get Type Details", link: "/api-reference/issue-types/types/get-issue-type-details" }, - { text: "Get Type Schema", link: "/api-reference/issue-types/types/get-work-item-type-schema" }, - { text: "Update Type", link: "/api-reference/issue-types/types/update-issue-types" }, - { text: "Delete Type", link: "/api-reference/issue-types/types/delete-issue-type" }, - ], - }, - { - text: "Custom Properties", - collapsed: true, - items: [ - { text: "Overview", link: "/api-reference/issue-types/properties/overview" }, - { text: "Add Property", link: "/api-reference/issue-types/properties/add-property" }, - { text: "List Properties", link: "/api-reference/issue-types/properties/list-properties" }, - { text: "Get Property Details", link: "/api-reference/issue-types/properties/get-property-details" }, - { text: "Update Property", link: "/api-reference/issue-types/properties/update-property" }, - { text: "Delete Property", link: "/api-reference/issue-types/properties/delete-property" }, - ], - }, - { - text: "Custom Property Values", - collapsed: true, - items: [ - { text: "Overview", link: "/api-reference/issue-types/values/overview" }, - { text: "Add Property Values", link: "/api-reference/issue-types/values/add-property-values" }, - { text: "List Property Values", link: "/api-reference/issue-types/values/list-property-values" }, - { text: "Get Property Value", link: "/api-reference/issue-types/values/get-property-value-detail" }, - { text: "Update Property Value", link: "/api-reference/issue-types/values/update-property-value" }, - { text: "Delete Property Value", link: "/api-reference/issue-types/values/delete-property-value" }, - ], - }, - { - text: "Custom Property Options", - collapsed: true, - items: [ - { text: "Overview", link: "/api-reference/issue-types/options/overview" }, - { text: "Add Dropdown Options", link: "/api-reference/issue-types/options/add-dropdown-options" }, - { text: "List Dropdown Options", link: "/api-reference/issue-types/options/list-dropdown-options" }, - { text: "Get Option Details", link: "/api-reference/issue-types/options/get-option-details" }, - { - text: "Update Dropdown Options", - link: "/api-reference/issue-types/options/update-dropdown-options", - }, - { - text: "Delete Dropdown Options", - link: "/api-reference/issue-types/options/delete-dropdown-options", - }, - ], - }, - { - text: "Work Item Links", - collapsed: true, - items: [ - { text: "Overview", link: "/api-reference/link/overview" }, - { text: "Add Link", link: "/api-reference/link/add-link" }, - { text: "List Links", link: "/api-reference/link/list-links" }, - { text: "Get Link", link: "/api-reference/link/get-link-detail" }, - { text: "Update Link", link: "/api-reference/link/update-link-detail" }, - { text: "Delete Link", link: "/api-reference/link/delete-link" }, - ], - }, - { - text: "Work Item Activity", - collapsed: true, - items: [ - { text: "Overview", link: "/api-reference/issue-activity/overview" }, - { text: "List Activities", link: "/api-reference/issue-activity/list-issue-activities" }, - { text: "Get Activity", link: "/api-reference/issue-activity/get-issue-activity-detail" }, - ], - }, - { - text: "Work Item Comments", - collapsed: true, - items: [ - { text: "Overview", link: "/api-reference/issue-comment/overview" }, - { text: "Add Comment", link: "/api-reference/issue-comment/add-issue-comment" }, - { text: "List Comments", link: "/api-reference/issue-comment/list-issue-comments" }, - { text: "Get Comment", link: "/api-reference/issue-comment/get-issue-comment-detail" }, - { text: "Update Comment", link: "/api-reference/issue-comment/update-issue-comment-detail" }, - { text: "Delete Comment", link: "/api-reference/issue-comment/delete-issue-comment" }, - ], - }, - { - text: "Work Item Attachments", - collapsed: true, - items: [ - { text: "Overview", link: "/api-reference/issue-attachments/overview" }, - { text: "Get Attachments", link: "/api-reference/issue-attachments/get-attachments" }, - { text: "Get Attachment Detail", link: "/api-reference/issue-attachments/get-attachment-detail" }, - { text: "Get Upload Credentials", link: "/api-reference/issue-attachments/get-upload-credentials" }, - { text: "Upload File", link: "/api-reference/issue-attachments/upload-file" }, - { text: "Complete Upload", link: "/api-reference/issue-attachments/complete-upload" }, - { text: "Update Attachment", link: "/api-reference/issue-attachments/update-attachment" }, - { text: "Delete Attachment", link: "/api-reference/issue-attachments/delete-attachment" }, - ], - }, - { - text: "Work Item Page Links", - collapsed: true, - items: [ - { text: "Overview", link: "/api-reference/work-item-pages/overview" }, - { text: "Create Work Item Page Link", link: "/api-reference/work-item-pages/add-work-item-page" }, - { text: "List Work Item Pages", link: "/api-reference/work-item-pages/list-work-item-pages" }, - { - text: "Get Work Item Page Link", - link: "/api-reference/work-item-pages/get-work-item-page-detail", - }, - { - text: "Delete Work Item Page Link", - link: "/api-reference/work-item-pages/delete-work-item-page", - }, - ], - }, - - { - text: "Cycles", - collapsed: true, - items: [ - { text: "Overview", link: "/api-reference/cycle/overview" }, - { text: "Create Cycle", link: "/api-reference/cycle/add-cycle" }, - { text: "Add Work Items", link: "/api-reference/cycle/add-cycle-work-items" }, - { text: "Transfer Work Items", link: "/api-reference/cycle/transfer-cycle-work-items" }, - { text: "Archive Cycle", link: "/api-reference/cycle/archive-cycle" }, - { text: "List Cycles", link: "/api-reference/cycle/list-cycles" }, - { text: "Get Cycle", link: "/api-reference/cycle/get-cycle-detail" }, - { text: "List Cycle Work Items", link: "/api-reference/cycle/list-cycle-work-items" }, - { text: "List Archived Cycles", link: "/api-reference/cycle/list-archived-cycles" }, - { text: "Update Cycle", link: "/api-reference/cycle/update-cycle-detail" }, - { text: "Unarchive Cycle", link: "/api-reference/cycle/unarchive-cycle" }, - { text: "Remove Work Item", link: "/api-reference/cycle/remove-cycle-work-item" }, - { text: "Delete Cycle", link: "/api-reference/cycle/delete-cycle" }, - ], - }, - { - text: "Modules", - collapsed: true, - items: [ - { text: "Overview", link: "/api-reference/module/overview" }, - { text: "Create Module", link: "/api-reference/module/add-module" }, - { text: "Add Work Items", link: "/api-reference/module/add-module-work-items" }, - { text: "Archive Module", link: "/api-reference/module/archive-module" }, - { text: "List Modules", link: "/api-reference/module/list-modules" }, - { text: "Get Module", link: "/api-reference/module/get-module-detail" }, - { text: "List Module Work Items", link: "/api-reference/module/list-module-work-items" }, - { text: "List Archived Modules", link: "/api-reference/module/list-archived-modules" }, - { text: "Update Module", link: "/api-reference/module/update-module-detail" }, - { text: "Unarchive Module", link: "/api-reference/module/unarchive-module" }, - { text: "Remove Work Item", link: "/api-reference/module/remove-module-work-item" }, - { text: "Delete Module", link: "/api-reference/module/delete-module" }, - ], - }, - { - text: "Pages", - collapsed: true, - items: [ - { text: "Overview", link: "/api-reference/page/overview" }, - { text: "List Workspace Pages", link: "/api-reference/page/list-workspace-pages" }, - { text: "Add Workspace Page", link: "/api-reference/page/add-workspace-page" }, - { text: "List Project Pages", link: "/api-reference/page/list-project-pages" }, - { text: "Add Project Page", link: "/api-reference/page/add-project-page" }, - { text: "Get Workspace Page", link: "/api-reference/page/get-workspace-page" }, - { text: "Get Project Page", link: "/api-reference/page/get-project-page" }, - ], - }, - { - text: "Intake", - collapsed: true, - items: [ - { text: "Overview", link: "/api-reference/intake-issue/overview" }, - { text: "Add Intake Issue", link: "/api-reference/intake-issue/add-intake-issue" }, - { text: "List Intake Issues", link: "/api-reference/intake-issue/list-intake-issues" }, - { text: "Get Intake Issue", link: "/api-reference/intake-issue/get-intake-issue-detail" }, - { text: "Update Intake Issue", link: "/api-reference/intake-issue/update-intake-issue-detail" }, - { text: "Delete Intake Issue", link: "/api-reference/intake-issue/delete-intake-issue" }, - ], - }, - { - text: "Assets", - collapsed: true, - items: [ - { text: "Overview", link: "/api-reference/assets/overview" }, - { text: "Create User Asset Upload", link: "/api-reference/assets/create-user-asset-upload" }, - { text: "Update User Asset", link: "/api-reference/assets/update-user-asset" }, - { text: "Delete User Asset", link: "/api-reference/assets/delete-user-asset" }, - { - text: "Create Workspace Asset Upload", - link: "/api-reference/assets/create-workspace-asset-upload", - }, - { text: "Get Workspace Asset", link: "/api-reference/assets/get-workspace-asset" }, - { text: "Update Workspace Asset", link: "/api-reference/assets/update-workspace-asset" }, - ], - }, - { - text: "Milestones", - collapsed: true, - items: [ - { text: "Overview", link: "/api-reference/milestones/overview" }, - { text: "Create Milestone", link: "/api-reference/milestones/add-milestone" }, - { text: "List Milestones", link: "/api-reference/milestones/list-milestones" }, - { text: "Get Milestone", link: "/api-reference/milestones/get-milestone-detail" }, - { text: "List Milestone Work Items", link: "/api-reference/milestones/list-milestone-work-items" }, - { text: "Update Milestone", link: "/api-reference/milestones/update-milestone-detail" }, - { text: "Delete Milestone", link: "/api-reference/milestones/delete-milestone" }, - ], - }, - { - text: "Estimates", - collapsed: true, - items: [ - { text: "Overview", link: "/api-reference/estimate/overview" }, - { text: "Create Estimate", link: "/api-reference/estimate/add-estimate" }, - { text: "Get Estimate", link: "/api-reference/estimate/get-estimate" }, - { text: "Update Estimate", link: "/api-reference/estimate/update-estimate" }, - { text: "Delete Estimate", link: "/api-reference/estimate/delete-estimate" }, - { text: "List Estimate Points", link: "/api-reference/estimate/list-estimate-points" }, - { text: "Create Estimate Points", link: "/api-reference/estimate/add-estimate-points" }, - { text: "Update Estimate Point", link: "/api-reference/estimate/update-estimate-point" }, - { text: "Delete Estimate Point", link: "/api-reference/estimate/delete-estimate-point" }, - ], - }, - { - text: "Time Tracking", - collapsed: true, - items: [ - { text: "Overview", link: "/api-reference/worklogs/overview" }, - { text: "Create Worklog", link: "/api-reference/worklogs/create-worklog" }, - { text: "Get Worklogs for Issue", link: "/api-reference/worklogs/get-worklogs-for-issue" }, - { text: "Get Total Time", link: "/api-reference/worklogs/get-total-time" }, - { text: "Update Worklog", link: "/api-reference/worklogs/update-worklog" }, - { text: "Delete Worklog", link: "/api-reference/worklogs/delete-worklog" }, - ], - }, - { - text: "Epics", - collapsed: true, - items: [ - { text: "Overview", link: "/api-reference/epics/overview" }, - { text: "Create Epic", link: "/api-reference/epics/create-epic" }, - { text: "List Epics", link: "/api-reference/epics/list-epics" }, - { text: "Get Epic", link: "/api-reference/epics/get-epic-detail" }, - { text: "Update Epic", link: "/api-reference/epics/update-epic" }, - { text: "Delete Epic", link: "/api-reference/epics/delete-epic" }, - { text: "Add Epic Work Items", link: "/api-reference/epics/add-epic-work-items" }, - { text: "List Epic Work Items", link: "/api-reference/epics/list-epic-work-items" }, - ], - }, - { - text: "Initiatives", - collapsed: true, - items: [ - { text: "Overview", link: "/api-reference/initiative/overview" }, - { text: "Create Initiative", link: "/api-reference/initiative/add-initiative" }, - { text: "List Initiatives", link: "/api-reference/initiative/list-initiatives" }, - { text: "Get Initiative", link: "/api-reference/initiative/get-initiative-detail" }, - { text: "Update Initiative", link: "/api-reference/initiative/update-initiative-detail" }, - { text: "Delete Initiative", link: "/api-reference/initiative/delete-initiative" }, - ], - }, - { - text: "Initiative Labels", - collapsed: true, - items: [ - { text: "Add Label", link: "/api-reference/initiative/add-initiative-label" }, - { text: "Add Labels to Initiative", link: "/api-reference/initiative/add-labels-to-initiative" }, - { text: "List Initiative Labels", link: "/api-reference/initiative/list-initiative-labels" }, - { text: "Get Label Detail", link: "/api-reference/initiative/get-initiative-label-detail" }, - { - text: "List Labels for Initiative", - link: "/api-reference/initiative/list-initiative-labels-for-initiative", - }, - { text: "Update Label", link: "/api-reference/initiative/update-initiative-label-detail" }, - { text: "Remove Labels", link: "/api-reference/initiative/remove-labels-from-initiative" }, - { text: "Delete Label", link: "/api-reference/initiative/delete-initiative-label" }, - ], - }, - { - text: "Initiative Projects", - collapsed: true, - items: [ - { text: "Add Projects", link: "/api-reference/initiative/add-projects-to-initiative" }, - { text: "List Projects", link: "/api-reference/initiative/list-initiative-projects" }, - { text: "Remove Projects", link: "/api-reference/initiative/remove-projects-from-initiative" }, - ], - }, - { - text: "Initiative Epics", - collapsed: true, - items: [ - { text: "Add Epics", link: "/api-reference/initiative/add-epics-to-initiative" }, - { text: "List Epics", link: "/api-reference/initiative/list-initiative-epics" }, - { text: "Remove Epics", link: "/api-reference/initiative/remove-epics-from-initiative" }, - ], - }, - { - text: "Customers", - collapsed: true, - items: [ - { text: "Overview", link: "/api-reference/customer/overview" }, - { text: "Add Customer", link: "/api-reference/customer/add-customer" }, - { text: "Link Work Items", link: "/api-reference/customer/link-work-items-to-customer" }, - { text: "List Customers", link: "/api-reference/customer/list-customers" }, - { text: "Get Customer", link: "/api-reference/customer/get-customer-detail" }, - { text: "List Customer Work Items", link: "/api-reference/customer/list-customer-work-items" }, - { text: "Update Customer", link: "/api-reference/customer/update-customer-detail" }, - { text: "Unlink Work Item", link: "/api-reference/customer/unlink-work-item-from-customer" }, - { text: "Delete Customer", link: "/api-reference/customer/delete-customer" }, - ], - }, - { - text: "Customer Properties", - collapsed: true, - items: [ - { text: "Add Property", link: "/api-reference/customer/add-customer-property" }, - { text: "List Properties", link: "/api-reference/customer/list-customer-properties" }, - { text: "Get Property Detail", link: "/api-reference/customer/get-customer-property-detail" }, - { text: "List Property Values", link: "/api-reference/customer/list-customer-property-values" }, - { text: "Get Property Value", link: "/api-reference/customer/get-customer-property-value" }, - { text: "Update Property", link: "/api-reference/customer/update-customer-property-detail" }, - { text: "Update Property Value", link: "/api-reference/customer/update-customer-property-value" }, - { text: "Delete Property", link: "/api-reference/customer/delete-customer-property" }, - ], - }, - { - text: "Customer Requests", - collapsed: true, - items: [ - { text: "Add Request", link: "/api-reference/customer/add-customer-request" }, - { text: "List Requests", link: "/api-reference/customer/list-customer-requests" }, - { text: "Get Request Detail", link: "/api-reference/customer/get-customer-request-detail" }, - { text: "Update Request", link: "/api-reference/customer/update-customer-request-detail" }, - { text: "Delete Request", link: "/api-reference/customer/delete-customer-request" }, - ], - }, - { - text: "Teamspaces", - collapsed: true, - items: [ - { text: "Overview", link: "/api-reference/teamspace/overview" }, - { text: "Create Teamspace", link: "/api-reference/teamspace/add-teamspace" }, - { text: "List Teamspaces", link: "/api-reference/teamspace/list-teamspaces" }, - { text: "Get Teamspace", link: "/api-reference/teamspace/get-teamspace-detail" }, - { text: "Update Teamspace", link: "/api-reference/teamspace/update-teamspace-detail" }, - { text: "Delete Teamspace", link: "/api-reference/teamspace/delete-teamspace" }, - ], - }, - { - text: "Teamspace Members", - collapsed: true, - items: [ - { text: "List Members", link: "/api-reference/teamspace/list-teamspace-members" }, - { text: "Add Members", link: "/api-reference/teamspace/add-teamspace-members" }, - { text: "Remove Members", link: "/api-reference/teamspace/remove-teamspace-members" }, - ], - }, - { - text: "Teamspace Projects", - collapsed: true, - items: [ - { text: "List Projects", link: "/api-reference/teamspace/list-teamspace-projects" }, - { text: "Add Projects", link: "/api-reference/teamspace/add-projects-to-teamspace" }, - { text: "Remove Projects", link: "/api-reference/teamspace/remove-projects-from-teamspace" }, - ], - }, - { - text: "Stickies", - collapsed: true, - items: [ - { text: "Overview", link: "/api-reference/sticky/overview" }, - { text: "Add Sticky", link: "/api-reference/sticky/add-sticky" }, - { text: "List Stickies", link: "/api-reference/sticky/list-stickies" }, - { text: "Get Sticky", link: "/api-reference/sticky/get-sticky-detail" }, - { text: "Update Sticky", link: "/api-reference/sticky/update-sticky-detail" }, - { text: "Delete Sticky", link: "/api-reference/sticky/delete-sticky" }, - ], - }, - { - text: "Workspace Features", - collapsed: true, - items: [ - { text: "Overview", link: "/api-reference/workspace-features/overview" }, - { - text: "Get Workspace Features", - link: "/api-reference/workspace-features/get-workspace-features", - }, - { - text: "Update Workspace Features", - link: "/api-reference/workspace-features/update-workspace-features", - }, - ], - }, - { - text: "Workspace Invitations", - collapsed: true, - items: [ - { text: "Overview", link: "/api-reference/workspace-invitations/overview" }, - { - text: "Create Workspace Invitation", - link: "/api-reference/workspace-invitations/add-workspace-invitation", - }, - { - text: "List Workspace Invitations", - link: "/api-reference/workspace-invitations/list-workspace-invitations", - }, - { - text: "Get Workspace Invitation", - link: "/api-reference/workspace-invitations/get-workspace-invitation-detail", - }, - { - text: "Update Workspace Invitation", - link: "/api-reference/workspace-invitations/update-workspace-invitation", - }, - { - text: "Delete Workspace Invitation", - link: "/api-reference/workspace-invitations/delete-workspace-invitation", - }, - ], - }, - { - text: "Members", - collapsed: true, - items: [ - { text: "Overview", link: "/api-reference/members/overview" }, - { text: "Get Workspace Members", link: "/api-reference/members/get-workspace-members" }, - { text: "Get Project Members", link: "/api-reference/members/get-project-members" }, - { text: "Create Project Member", link: "/api-reference/members/add-project-member" }, - { text: "Get Project Member", link: "/api-reference/members/get-project-member-detail" }, - { text: "Update Project Member", link: "/api-reference/members/update-project-member" }, - { text: "Delete Project Member", link: "/api-reference/members/delete-project-member" }, - { text: "Remove Workspace Members", link: "/api-reference/members/remove-workspace-member" }, - ], - }, - { - text: "User", - collapsed: true, - items: [ - { text: "Overview", link: "/api-reference/user/overview" }, - { text: "Get Current User", link: "/api-reference/user/get-current-user" }, - ], - }, - ], - }, + nav: [ + { text: "Self-hosting", link: "/self-hosting/overview" }, + { text: "API Reference", link: "/api-reference/introduction" }, + { text: "Build and extend", link: "/dev-tools/build-plane-app/overview" }, + { text: "Plane Docs", link: "https://docs.plane.so", noIcon: true }, + { text: "Sign in", link: "https://app.plane.so/sign-in" }, ], - "/dev-tools/": [ + sidebar: { + "/": [ + { + text: "Developer documentation", + items: [ + { text: "Home", link: "/" }, + { text: "Self-hosting", link: "/self-hosting/overview" }, + { text: "API Reference", link: "/api-reference/introduction" }, + { text: "Build and extend", link: "/dev-tools/build-plane-app/overview" }, + ], + }, + { + text: "Self-host Plane", + collapsed: true, + items: [ + { text: "Overview", link: "/self-hosting/overview" }, + { text: "Self-hosting 101", link: "/self-hosting/self-hosting-101" }, + { text: "Docker Compose", link: "/self-hosting/methods/docker-compose" }, + { text: "Kubernetes", link: "/self-hosting/methods/kubernetes" }, + ], + }, + { + text: "API Reference", + collapsed: true, + items: [ + { text: "Introduction", link: "/api-reference/introduction" }, + { text: "Work items", link: "/api-reference/issue/overview" }, + { text: "Projects", link: "/api-reference/project/overview" }, + ], + }, + { + text: "Build and extend", + collapsed: true, + items: [ + { text: "Webhooks", link: "/dev-tools/intro-webhooks" }, + { text: "Build Plane App", link: "/dev-tools/build-plane-app/overview" }, + { text: "MCP Server", link: "/dev-tools/mcp-server" }, + { text: "Agents", link: "/dev-tools/agents/overview" }, + ], + }, + ], + "/self-hosting/": [ + { + text: "Self-host Plane", + items: [ + { text: "Overview", link: "/self-hosting/overview" }, + { text: "Self-hosting 101", link: "/self-hosting/self-hosting-101" }, + { text: "Plane Editions", link: "/self-hosting/editions-and-versions" }, + { text: "Plane Architecture", link: "/self-hosting/plane-architecture" }, + ], + }, + { + text: "Install", + items: [ + { text: "Overview", link: "/self-hosting/methods/overview" }, + { + text: "Docker", + collapsed: true, + items: [ + { text: "Docker Compose", link: "/self-hosting/methods/docker-compose" }, + { text: "Docker AIO", link: "/self-hosting/methods/docker-aio" }, + { text: "Docker Swarm", link: "/self-hosting/methods/docker-swarm" }, + { text: "Download config files", link: "/self-hosting/methods/download-config" }, + ], + }, + { text: "Kubernetes", link: "/self-hosting/methods/kubernetes" }, + { text: "Podman Quadlets", link: "/self-hosting/methods/podman-quadlets" }, + { + text: "Airgapped Edition", + collapsed: true, + items: [ + { text: "Overview", link: "/self-hosting/methods/airgapped-requirements" }, + { text: "On Docker", link: "/self-hosting/methods/airgapped-edition" }, + { text: "On Kubernetes", link: "/self-hosting/methods/airgapped-edition-kubernetes" }, + { text: "Clone Docker Images", link: "/self-hosting/methods/clone-docker-images" }, + ], + }, + { + text: "Managed Platforms", + collapsed: true, + items: [ + { text: "Coolify", link: "/self-hosting/methods/coolify" }, + { text: "Portainer", link: "/self-hosting/methods/portainer" }, + ], + }, + ], + }, + { + text: "Configure", + items: [ + { text: "Instance Admin", link: "/self-hosting/govern/instance-admin" }, + { + text: "Authentication", + collapsed: true, + items: [ + { text: "Overview", link: "/self-hosting/govern/authentication" }, + { text: "Google OAuth", link: "/self-hosting/govern/google-oauth" }, + { text: "GitHub OAuth", link: "/self-hosting/govern/github-oauth" }, + { text: "OIDC SSO", link: "/self-hosting/govern/oidc-sso" }, + { text: "SAML SSO", link: "/self-hosting/govern/saml-sso" }, + { text: "LDAP", link: "/self-hosting/govern/ldap" }, + { text: "Reset Password", link: "/self-hosting/govern/reset-password" }, + ], + }, + { text: "SMTP for email", link: "/self-hosting/govern/communication" }, + { text: "External services", link: "/self-hosting/govern/database-and-storage" }, + { text: "Custom domain", link: "/self-hosting/govern/custom-domain" }, + { text: "SSL", link: "/self-hosting/govern/configure-ssl" }, + { + text: "Integrations", + collapsed: true, + items: [ + { text: "GitHub", link: "/self-hosting/govern/integrations/github" }, + { text: "GitLab", link: "/self-hosting/govern/integrations/gitlab" }, + { text: "Sentry", link: "/self-hosting/govern/integrations/sentry" }, + { text: "Slack", link: "/self-hosting/govern/integrations/slack" }, + ], + }, + { text: "DNS for Intake Email", link: "/self-hosting/govern/configure-dns-email-service" }, + { text: "OpenSearch for search", link: "/self-hosting/govern/advanced-search" }, + { + text: "Plane AI", + link: "/self-hosting/govern/plane-ai", + collapsed: true, + items: [{ text: "AWS OpenSearch embedding", link: "/self-hosting/govern/aws-opensearch-embedding" }], + }, + { text: "External secrets", link: "/self-hosting/govern/external-secrets" }, + { text: "External reverse proxy", link: "/self-hosting/govern/reverse-proxy" }, + { text: "Private storage buckets", link: "/self-hosting/govern/private-bucket" }, + { text: "Environment variables", link: "/self-hosting/govern/environment-variables" }, + { text: "Telemetry", link: "/self-hosting/telemetry" }, + ], + }, + { + text: "Manage", + items: [ + { + text: "Update Plane", + collapsed: true, + items: [ + { text: "Update to latest version", link: "/self-hosting/manage/upgrade-plane" }, + { text: "For versions before 0.14.0", link: "/self-hosting/manage/upgrade-from-0.13.2-0.14.0" }, + { + text: "Airgapped Edition", + collapsed: true, + items: [ + { + text: "On Docker", + link: "/self-hosting/manage/update-plane/airgapped-edition/update-airgapped-docker", + }, + { + text: "On Kubernetes", + link: "/self-hosting/manage/update-plane/airgapped-edition/update-airgapped-kubernetes", + }, + ], + }, + ], + }, + { + text: "Manage licenses", + collapsed: true, + items: [ + { + text: "Commercial Edition", + collapsed: true, + items: [ + { + text: "Pro or Business", + link: "/self-hosting/manage/manage-licenses/activate-pro-and-business", + }, + { text: "Enterprise Grid", link: "/self-hosting/manage/manage-licenses/activate-enterprise" }, + ], + }, + + { + text: "Airgapped Edition", + collapsed: true, + items: [ + { text: "Pro or Business", link: "/self-hosting/manage/manage-licenses/activate-airgapped" }, + { + text: "Enterprise Grid", + link: "/self-hosting/manage/manage-licenses/activate-airgapped-enterprise", + }, + ], + }, + ], + }, + { text: "Backup and restore", link: "/self-hosting/manage/backup-restore" }, + { text: "Upgrade Community to Commercial Edition", link: "/self-hosting/upgrade-from-community" }, + { text: "Upgrade Community to Airgapped Edition", link: "/self-hosting/manage/community-to-airgapped" }, + { text: "View Logs", link: "/self-hosting/manage/view-logs" }, + { text: "Migrate Plane", link: "/self-hosting/manage/migrate-plane" }, + { text: "Prime CLI", link: "/self-hosting/manage/prime-cli" }, + { text: "Manage users", link: "/self-hosting/manage/manage-instance-users" }, + ], + }, + { + text: "Troubleshoot", + items: [ + { text: "Overview", link: "/self-hosting/troubleshoot/overview" }, + { text: "Installation Errors", link: "/self-hosting/troubleshoot/installation-errors" }, + { text: "License Errors", link: "/self-hosting/troubleshoot/license-errors" }, + { text: "CLI Errors", link: "/self-hosting/troubleshoot/cli-errors" }, + { text: "Storage Errors", link: "/self-hosting/troubleshoot/storage-errors" }, + ], + }, + ], + + "/api-reference/": [ + { + text: "API Reference", + items: [ + { text: "Introduction", link: "/api-reference/introduction" }, + { + text: "Project", + collapsed: true, + items: [ + { text: "Overview", link: "/api-reference/project/overview" }, + { text: "Create Project", link: "/api-reference/project/add-project" }, + { text: "List Projects", link: "/api-reference/project/list-projects" }, + { text: "Get Project", link: "/api-reference/project/get-project-detail" }, + { text: "Update Project", link: "/api-reference/project/update-project-detail" }, + { text: "Archive Project", link: "/api-reference/project/archive-project" }, + { text: "Unarchive Project", link: "/api-reference/project/unarchive-project" }, + { text: "Delete Project", link: "/api-reference/project/delete-project" }, + ], + }, + { + text: "Project Features", + collapsed: true, + items: [ + { text: "Overview", link: "/api-reference/project-features/overview" }, + { text: "Get Project Features", link: "/api-reference/project-features/get-project-features" }, + { + text: "Update Project Features", + link: "/api-reference/project-features/update-project-features", + }, + ], + }, + { + text: "Project Labels", + collapsed: true, + items: [ + { text: "Overview", link: "/api-reference/project-labels/overview" }, + { text: "Create Project Label", link: "/api-reference/project-labels/add-project-label" }, + { text: "List Project Labels", link: "/api-reference/project-labels/list-project-labels" }, + { + text: "Get Project Label", + link: "/api-reference/project-labels/get-project-label-detail", + }, + { + text: "Update Project Label", + link: "/api-reference/project-labels/update-project-label-detail", + }, + { text: "Delete Project Label", link: "/api-reference/project-labels/delete-project-label" }, + ], + }, + { + text: "Work Item", + collapsed: true, + items: [ + { text: "Overview", link: "/api-reference/issue/overview" }, + { text: "Create Work Item", link: "/api-reference/issue/add-issue" }, + { text: "List Work Items", link: "/api-reference/issue/list-issues" }, + { text: "Get Work Item", link: "/api-reference/issue/get-issue-detail" }, + { text: "Get by identifier", link: "/api-reference/issue/get-issue-sequence-id" }, + { text: "Search Work Items", link: "/api-reference/issue/search-issues" }, + { text: "Advanced Search", link: "/api-reference/issue/advanced-search-work-items" }, + { text: "Update Work Item", link: "/api-reference/issue/update-issue-detail" }, + { text: "Delete Work Item", link: "/api-reference/issue/delete-issue" }, + ], + }, + { + text: "Work Item States", + collapsed: true, + items: [ + { text: "Overview", link: "/api-reference/state/overview" }, + { text: "Create State", link: "/api-reference/state/add-state" }, + { text: "List States", link: "/api-reference/state/list-states" }, + { text: "Get State", link: "/api-reference/state/get-state-detail" }, + { text: "Update State", link: "/api-reference/state/update-state-detail" }, + { text: "Delete State", link: "/api-reference/state/delete-state" }, + ], + }, + { + text: "Work Item Labels", + collapsed: true, + items: [ + { text: "Overview", link: "/api-reference/label/overview" }, + { text: "Create Label", link: "/api-reference/label/add-label" }, + { text: "List Labels", link: "/api-reference/label/list-labels" }, + { text: "Get Label", link: "/api-reference/label/get-label-detail" }, + { text: "Update Label", link: "/api-reference/label/update-label-detail" }, + { text: "Delete Label", link: "/api-reference/label/delete-label" }, + ], + }, + { + text: "Work Item Types", + collapsed: true, + items: [ + { text: "Overview", link: "/api-reference/issue-types/types/overview" }, + { text: "Add Type", link: "/api-reference/issue-types/types/add-issue-type" }, + { text: "List Types", link: "/api-reference/issue-types/types/list-issue-types" }, + { text: "Get Type Details", link: "/api-reference/issue-types/types/get-issue-type-details" }, + { text: "Get Type Schema", link: "/api-reference/issue-types/types/get-work-item-type-schema" }, + { text: "Update Type", link: "/api-reference/issue-types/types/update-issue-types" }, + { text: "Delete Type", link: "/api-reference/issue-types/types/delete-issue-type" }, + ], + }, + { + text: "Custom Properties", + collapsed: true, + items: [ + { text: "Overview", link: "/api-reference/issue-types/properties/overview" }, + { text: "Add Property", link: "/api-reference/issue-types/properties/add-property" }, + { text: "List Properties", link: "/api-reference/issue-types/properties/list-properties" }, + { + text: "Get Property Details", + link: "/api-reference/issue-types/properties/get-property-details", + }, + { text: "Update Property", link: "/api-reference/issue-types/properties/update-property" }, + { text: "Delete Property", link: "/api-reference/issue-types/properties/delete-property" }, + ], + }, + { + text: "Custom Property Values", + collapsed: true, + items: [ + { text: "Overview", link: "/api-reference/issue-types/values/overview" }, + { text: "Add Property Values", link: "/api-reference/issue-types/values/add-property-values" }, + { text: "List Property Values", link: "/api-reference/issue-types/values/list-property-values" }, + { text: "Get Property Value", link: "/api-reference/issue-types/values/get-property-value-detail" }, + { text: "Update Property Value", link: "/api-reference/issue-types/values/update-property-value" }, + { text: "Delete Property Value", link: "/api-reference/issue-types/values/delete-property-value" }, + ], + }, + { + text: "Custom Property Options", + collapsed: true, + items: [ + { text: "Overview", link: "/api-reference/issue-types/options/overview" }, + { text: "Add Dropdown Options", link: "/api-reference/issue-types/options/add-dropdown-options" }, + { text: "List Dropdown Options", link: "/api-reference/issue-types/options/list-dropdown-options" }, + { text: "Get Option Details", link: "/api-reference/issue-types/options/get-option-details" }, + { + text: "Update Dropdown Options", + link: "/api-reference/issue-types/options/update-dropdown-options", + }, + { + text: "Delete Dropdown Options", + link: "/api-reference/issue-types/options/delete-dropdown-options", + }, + ], + }, + { + text: "Work Item Links", + collapsed: true, + items: [ + { text: "Overview", link: "/api-reference/link/overview" }, + { text: "Add Link", link: "/api-reference/link/add-link" }, + { text: "List Links", link: "/api-reference/link/list-links" }, + { text: "Get Link", link: "/api-reference/link/get-link-detail" }, + { text: "Update Link", link: "/api-reference/link/update-link-detail" }, + { text: "Delete Link", link: "/api-reference/link/delete-link" }, + ], + }, + { + text: "Work Item Activity", + collapsed: true, + items: [ + { text: "Overview", link: "/api-reference/issue-activity/overview" }, + { text: "List Activities", link: "/api-reference/issue-activity/list-issue-activities" }, + { text: "Get Activity", link: "/api-reference/issue-activity/get-issue-activity-detail" }, + ], + }, + { + text: "Work Item Comments", + collapsed: true, + items: [ + { text: "Overview", link: "/api-reference/issue-comment/overview" }, + { text: "Add Comment", link: "/api-reference/issue-comment/add-issue-comment" }, + { text: "List Comments", link: "/api-reference/issue-comment/list-issue-comments" }, + { text: "Get Comment", link: "/api-reference/issue-comment/get-issue-comment-detail" }, + { text: "Update Comment", link: "/api-reference/issue-comment/update-issue-comment-detail" }, + { text: "Delete Comment", link: "/api-reference/issue-comment/delete-issue-comment" }, + ], + }, + { + text: "Work Item Attachments", + collapsed: true, + items: [ + { text: "Overview", link: "/api-reference/issue-attachments/overview" }, + { text: "Get Attachments", link: "/api-reference/issue-attachments/get-attachments" }, + { text: "Get Attachment Detail", link: "/api-reference/issue-attachments/get-attachment-detail" }, + { text: "Get Upload Credentials", link: "/api-reference/issue-attachments/get-upload-credentials" }, + { text: "Upload File", link: "/api-reference/issue-attachments/upload-file" }, + { text: "Complete Upload", link: "/api-reference/issue-attachments/complete-upload" }, + { text: "Update Attachment", link: "/api-reference/issue-attachments/update-attachment" }, + { text: "Delete Attachment", link: "/api-reference/issue-attachments/delete-attachment" }, + ], + }, + { + text: "Work Item Page Links", + collapsed: true, + items: [ + { text: "Overview", link: "/api-reference/work-item-pages/overview" }, + { text: "Create Work Item Page Link", link: "/api-reference/work-item-pages/add-work-item-page" }, + { text: "List Work Item Pages", link: "/api-reference/work-item-pages/list-work-item-pages" }, + { + text: "Get Work Item Page Link", + link: "/api-reference/work-item-pages/get-work-item-page-detail", + }, + { + text: "Delete Work Item Page Link", + link: "/api-reference/work-item-pages/delete-work-item-page", + }, + ], + }, + + { + text: "Cycles", + collapsed: true, + items: [ + { text: "Overview", link: "/api-reference/cycle/overview" }, + { text: "Create Cycle", link: "/api-reference/cycle/add-cycle" }, + { text: "Add Work Items", link: "/api-reference/cycle/add-cycle-work-items" }, + { text: "Transfer Work Items", link: "/api-reference/cycle/transfer-cycle-work-items" }, + { text: "Archive Cycle", link: "/api-reference/cycle/archive-cycle" }, + { text: "List Cycles", link: "/api-reference/cycle/list-cycles" }, + { text: "Get Cycle", link: "/api-reference/cycle/get-cycle-detail" }, + { text: "List Cycle Work Items", link: "/api-reference/cycle/list-cycle-work-items" }, + { text: "List Archived Cycles", link: "/api-reference/cycle/list-archived-cycles" }, + { text: "Update Cycle", link: "/api-reference/cycle/update-cycle-detail" }, + { text: "Unarchive Cycle", link: "/api-reference/cycle/unarchive-cycle" }, + { text: "Remove Work Item", link: "/api-reference/cycle/remove-cycle-work-item" }, + { text: "Delete Cycle", link: "/api-reference/cycle/delete-cycle" }, + ], + }, + { + text: "Modules", + collapsed: true, + items: [ + { text: "Overview", link: "/api-reference/module/overview" }, + { text: "Create Module", link: "/api-reference/module/add-module" }, + { text: "Add Work Items", link: "/api-reference/module/add-module-work-items" }, + { text: "Archive Module", link: "/api-reference/module/archive-module" }, + { text: "List Modules", link: "/api-reference/module/list-modules" }, + { text: "Get Module", link: "/api-reference/module/get-module-detail" }, + { text: "List Module Work Items", link: "/api-reference/module/list-module-work-items" }, + { text: "List Archived Modules", link: "/api-reference/module/list-archived-modules" }, + { text: "Update Module", link: "/api-reference/module/update-module-detail" }, + { text: "Unarchive Module", link: "/api-reference/module/unarchive-module" }, + { text: "Remove Work Item", link: "/api-reference/module/remove-module-work-item" }, + { text: "Delete Module", link: "/api-reference/module/delete-module" }, + ], + }, + { + text: "Pages", + collapsed: true, + items: [ + { text: "Overview", link: "/api-reference/page/overview" }, + { text: "List Workspace Pages", link: "/api-reference/page/list-workspace-pages" }, + { text: "Add Workspace Page", link: "/api-reference/page/add-workspace-page" }, + { text: "List Project Pages", link: "/api-reference/page/list-project-pages" }, + { text: "Add Project Page", link: "/api-reference/page/add-project-page" }, + { text: "Get Workspace Page", link: "/api-reference/page/get-workspace-page" }, + { text: "Get Project Page", link: "/api-reference/page/get-project-page" }, + ], + }, + { + text: "Intake", + collapsed: true, + items: [ + { text: "Overview", link: "/api-reference/intake-issue/overview" }, + { text: "Add Intake Issue", link: "/api-reference/intake-issue/add-intake-issue" }, + { text: "List Intake Issues", link: "/api-reference/intake-issue/list-intake-issues" }, + { text: "Get Intake Issue", link: "/api-reference/intake-issue/get-intake-issue-detail" }, + { text: "Update Intake Issue", link: "/api-reference/intake-issue/update-intake-issue-detail" }, + { text: "Delete Intake Issue", link: "/api-reference/intake-issue/delete-intake-issue" }, + ], + }, + { + text: "Assets", + collapsed: true, + items: [ + { text: "Overview", link: "/api-reference/assets/overview" }, + { text: "Create User Asset Upload", link: "/api-reference/assets/create-user-asset-upload" }, + { text: "Update User Asset", link: "/api-reference/assets/update-user-asset" }, + { text: "Delete User Asset", link: "/api-reference/assets/delete-user-asset" }, + { + text: "Create Workspace Asset Upload", + link: "/api-reference/assets/create-workspace-asset-upload", + }, + { text: "Get Workspace Asset", link: "/api-reference/assets/get-workspace-asset" }, + { text: "Update Workspace Asset", link: "/api-reference/assets/update-workspace-asset" }, + ], + }, + { + text: "Milestones", + collapsed: true, + items: [ + { text: "Overview", link: "/api-reference/milestones/overview" }, + { text: "Create Milestone", link: "/api-reference/milestones/add-milestone" }, + { text: "List Milestones", link: "/api-reference/milestones/list-milestones" }, + { text: "Get Milestone", link: "/api-reference/milestones/get-milestone-detail" }, + { text: "List Milestone Work Items", link: "/api-reference/milestones/list-milestone-work-items" }, + { text: "Update Milestone", link: "/api-reference/milestones/update-milestone-detail" }, + { text: "Delete Milestone", link: "/api-reference/milestones/delete-milestone" }, + ], + }, + { + text: "Estimates", + collapsed: true, + items: [ + { text: "Overview", link: "/api-reference/estimate/overview" }, + { text: "Create Estimate", link: "/api-reference/estimate/add-estimate" }, + { text: "Get Estimate", link: "/api-reference/estimate/get-estimate" }, + { text: "Update Estimate", link: "/api-reference/estimate/update-estimate" }, + { text: "Delete Estimate", link: "/api-reference/estimate/delete-estimate" }, + { text: "List Estimate Points", link: "/api-reference/estimate/list-estimate-points" }, + { text: "Create Estimate Points", link: "/api-reference/estimate/add-estimate-points" }, + { text: "Update Estimate Point", link: "/api-reference/estimate/update-estimate-point" }, + { text: "Delete Estimate Point", link: "/api-reference/estimate/delete-estimate-point" }, + ], + }, + { + text: "Time Tracking", + collapsed: true, + items: [ + { text: "Overview", link: "/api-reference/worklogs/overview" }, + { text: "Create Worklog", link: "/api-reference/worklogs/create-worklog" }, + { text: "Get Worklogs for Issue", link: "/api-reference/worklogs/get-worklogs-for-issue" }, + { text: "Get Total Time", link: "/api-reference/worklogs/get-total-time" }, + { text: "Update Worklog", link: "/api-reference/worklogs/update-worklog" }, + { text: "Delete Worklog", link: "/api-reference/worklogs/delete-worklog" }, + ], + }, + { + text: "Epics", + collapsed: true, + items: [ + { text: "Overview", link: "/api-reference/epics/overview" }, + { text: "Create Epic", link: "/api-reference/epics/create-epic" }, + { text: "List Epics", link: "/api-reference/epics/list-epics" }, + { text: "Get Epic", link: "/api-reference/epics/get-epic-detail" }, + { text: "Update Epic", link: "/api-reference/epics/update-epic" }, + { text: "Delete Epic", link: "/api-reference/epics/delete-epic" }, + { text: "Add Epic Work Items", link: "/api-reference/epics/add-epic-work-items" }, + { text: "List Epic Work Items", link: "/api-reference/epics/list-epic-work-items" }, + ], + }, + { + text: "Initiatives", + collapsed: true, + items: [ + { text: "Overview", link: "/api-reference/initiative/overview" }, + { text: "Create Initiative", link: "/api-reference/initiative/add-initiative" }, + { text: "List Initiatives", link: "/api-reference/initiative/list-initiatives" }, + { text: "Get Initiative", link: "/api-reference/initiative/get-initiative-detail" }, + { text: "Update Initiative", link: "/api-reference/initiative/update-initiative-detail" }, + { text: "Delete Initiative", link: "/api-reference/initiative/delete-initiative" }, + ], + }, + { + text: "Initiative Labels", + collapsed: true, + items: [ + { text: "Add Label", link: "/api-reference/initiative/add-initiative-label" }, + { text: "Add Labels to Initiative", link: "/api-reference/initiative/add-labels-to-initiative" }, + { text: "List Initiative Labels", link: "/api-reference/initiative/list-initiative-labels" }, + { text: "Get Label Detail", link: "/api-reference/initiative/get-initiative-label-detail" }, + { + text: "List Labels for Initiative", + link: "/api-reference/initiative/list-initiative-labels-for-initiative", + }, + { text: "Update Label", link: "/api-reference/initiative/update-initiative-label-detail" }, + { text: "Remove Labels", link: "/api-reference/initiative/remove-labels-from-initiative" }, + { text: "Delete Label", link: "/api-reference/initiative/delete-initiative-label" }, + ], + }, + { + text: "Initiative Projects", + collapsed: true, + items: [ + { text: "Add Projects", link: "/api-reference/initiative/add-projects-to-initiative" }, + { text: "List Projects", link: "/api-reference/initiative/list-initiative-projects" }, + { text: "Remove Projects", link: "/api-reference/initiative/remove-projects-from-initiative" }, + ], + }, + { + text: "Initiative Epics", + collapsed: true, + items: [ + { text: "Add Epics", link: "/api-reference/initiative/add-epics-to-initiative" }, + { text: "List Epics", link: "/api-reference/initiative/list-initiative-epics" }, + { text: "Remove Epics", link: "/api-reference/initiative/remove-epics-from-initiative" }, + ], + }, + { + text: "Customers", + collapsed: true, + items: [ + { text: "Overview", link: "/api-reference/customer/overview" }, + { text: "Add Customer", link: "/api-reference/customer/add-customer" }, + { text: "Link Work Items", link: "/api-reference/customer/link-work-items-to-customer" }, + { text: "List Customers", link: "/api-reference/customer/list-customers" }, + { text: "Get Customer", link: "/api-reference/customer/get-customer-detail" }, + { text: "List Customer Work Items", link: "/api-reference/customer/list-customer-work-items" }, + { text: "Update Customer", link: "/api-reference/customer/update-customer-detail" }, + { text: "Unlink Work Item", link: "/api-reference/customer/unlink-work-item-from-customer" }, + { text: "Delete Customer", link: "/api-reference/customer/delete-customer" }, + ], + }, + { + text: "Customer Properties", + collapsed: true, + items: [ + { text: "Add Property", link: "/api-reference/customer/add-customer-property" }, + { text: "List Properties", link: "/api-reference/customer/list-customer-properties" }, + { text: "Get Property Detail", link: "/api-reference/customer/get-customer-property-detail" }, + { text: "List Property Values", link: "/api-reference/customer/list-customer-property-values" }, + { text: "Get Property Value", link: "/api-reference/customer/get-customer-property-value" }, + { text: "Update Property", link: "/api-reference/customer/update-customer-property-detail" }, + { text: "Update Property Value", link: "/api-reference/customer/update-customer-property-value" }, + { text: "Delete Property", link: "/api-reference/customer/delete-customer-property" }, + ], + }, + { + text: "Customer Requests", + collapsed: true, + items: [ + { text: "Add Request", link: "/api-reference/customer/add-customer-request" }, + { text: "List Requests", link: "/api-reference/customer/list-customer-requests" }, + { text: "Get Request Detail", link: "/api-reference/customer/get-customer-request-detail" }, + { text: "Update Request", link: "/api-reference/customer/update-customer-request-detail" }, + { text: "Delete Request", link: "/api-reference/customer/delete-customer-request" }, + ], + }, + { + text: "Teamspaces", + collapsed: true, + items: [ + { text: "Overview", link: "/api-reference/teamspace/overview" }, + { text: "Create Teamspace", link: "/api-reference/teamspace/add-teamspace" }, + { text: "List Teamspaces", link: "/api-reference/teamspace/list-teamspaces" }, + { text: "Get Teamspace", link: "/api-reference/teamspace/get-teamspace-detail" }, + { text: "Update Teamspace", link: "/api-reference/teamspace/update-teamspace-detail" }, + { text: "Delete Teamspace", link: "/api-reference/teamspace/delete-teamspace" }, + ], + }, + { + text: "Teamspace Members", + collapsed: true, + items: [ + { text: "List Members", link: "/api-reference/teamspace/list-teamspace-members" }, + { text: "Add Members", link: "/api-reference/teamspace/add-teamspace-members" }, + { text: "Remove Members", link: "/api-reference/teamspace/remove-teamspace-members" }, + ], + }, + { + text: "Teamspace Projects", + collapsed: true, + items: [ + { text: "List Projects", link: "/api-reference/teamspace/list-teamspace-projects" }, + { text: "Add Projects", link: "/api-reference/teamspace/add-projects-to-teamspace" }, + { text: "Remove Projects", link: "/api-reference/teamspace/remove-projects-from-teamspace" }, + ], + }, + { + text: "Stickies", + collapsed: true, + items: [ + { text: "Overview", link: "/api-reference/sticky/overview" }, + { text: "Add Sticky", link: "/api-reference/sticky/add-sticky" }, + { text: "List Stickies", link: "/api-reference/sticky/list-stickies" }, + { text: "Get Sticky", link: "/api-reference/sticky/get-sticky-detail" }, + { text: "Update Sticky", link: "/api-reference/sticky/update-sticky-detail" }, + { text: "Delete Sticky", link: "/api-reference/sticky/delete-sticky" }, + ], + }, + { + text: "Workspace Features", + collapsed: true, + items: [ + { text: "Overview", link: "/api-reference/workspace-features/overview" }, + { + text: "Get Workspace Features", + link: "/api-reference/workspace-features/get-workspace-features", + }, + { + text: "Update Workspace Features", + link: "/api-reference/workspace-features/update-workspace-features", + }, + ], + }, + { + text: "Workspace Invitations", + collapsed: true, + items: [ + { text: "Overview", link: "/api-reference/workspace-invitations/overview" }, + { + text: "Create Workspace Invitation", + link: "/api-reference/workspace-invitations/add-workspace-invitation", + }, + { + text: "List Workspace Invitations", + link: "/api-reference/workspace-invitations/list-workspace-invitations", + }, + { + text: "Get Workspace Invitation", + link: "/api-reference/workspace-invitations/get-workspace-invitation-detail", + }, + { + text: "Update Workspace Invitation", + link: "/api-reference/workspace-invitations/update-workspace-invitation", + }, + { + text: "Delete Workspace Invitation", + link: "/api-reference/workspace-invitations/delete-workspace-invitation", + }, + ], + }, + { + text: "Members", + collapsed: true, + items: [ + { text: "Overview", link: "/api-reference/members/overview" }, + { text: "Get Workspace Members", link: "/api-reference/members/get-workspace-members" }, + { text: "Get Project Members", link: "/api-reference/members/get-project-members" }, + { text: "Create Project Member", link: "/api-reference/members/add-project-member" }, + { text: "Get Project Member", link: "/api-reference/members/get-project-member-detail" }, + { text: "Update Project Member", link: "/api-reference/members/update-project-member" }, + { text: "Delete Project Member", link: "/api-reference/members/delete-project-member" }, + { text: "Remove Workspace Members", link: "/api-reference/members/remove-workspace-member" }, + ], + }, + { + text: "User", + collapsed: true, + items: [ + { text: "Overview", link: "/api-reference/user/overview" }, + { text: "Get Current User", link: "/api-reference/user/get-current-user" }, + ], + }, + ], + }, + ], + + "/dev-tools/": [ + { + text: "Build on and extend Plane", + items: [ + { + text: "Agents", + link: "/dev-tools/agents/overview", + collapsed: false, + items: [ + { text: "Building an agent", link: "/dev-tools/agents/building-an-agent" }, + { text: "Best practices", link: "/dev-tools/agents/best-practices" }, + { text: "Signals and content payload", link: "/dev-tools/agents/signals-content-payload" }, + ], + }, + { + text: "Build Plane App", + link: "/dev-tools/build-plane-app/overview", + collapsed: false, + items: [ + { + text: "Create an OAuth application", + link: "/dev-tools/build-plane-app/create-oauth-application", + }, + { text: "Choose token Flow", link: "/dev-tools/build-plane-app/choose-token-flow" }, + { text: "Handling webhooks", link: "/dev-tools/build-plane-app/webhooks" }, + { text: "OAuth scopes", link: "/dev-tools/build-plane-app/oauth-scopes" }, + { text: "SDKs", link: "/dev-tools/build-plane-app/sdks" }, + { text: "Complete examples", link: "/dev-tools/build-plane-app/examples" }, + ], + }, + + { + text: "MCP Server", + link: "/dev-tools/mcp-server", + collapsed: false, + items: [{ text: "For Claude Code", link: "/dev-tools/mcp-server-claude-code" }], + }, + { text: "Plane Compose", link: "/dev-tools/plane-compose" }, + { text: "OpenAPI Specification", link: "/dev-tools/openapi-specification" }, + { text: "Webhooks", link: "/dev-tools/intro-webhooks" }, + ], + }, + ], + }, + + socialLinks: [ { - text: "Build on and extend Plane", - items: [ - { - text: "Agents", - link: "/dev-tools/agents/overview", - collapsed: false, - items: [ - { text: "Building an agent", link: "/dev-tools/agents/building-an-agent" }, - { text: "Best practices", link: "/dev-tools/agents/best-practices" }, - { text: "Signals and content payload", link: "/dev-tools/agents/signals-content-payload" }, - ], - }, - { - text: "Build Plane App", - link: "/dev-tools/build-plane-app/overview", - collapsed: false, - items: [ - { text: "Create an OAuth application", link: "/dev-tools/build-plane-app/create-oauth-application" }, - { text: "Choose token Flow", link: "/dev-tools/build-plane-app/choose-token-flow" }, - { text: "Handling webhooks", link: "/dev-tools/build-plane-app/webhooks" }, - { text: "OAuth scopes", link: "/dev-tools/build-plane-app/oauth-scopes" }, - { text: "SDKs", link: "/dev-tools/build-plane-app/sdks" }, - { text: "Complete examples", link: "/dev-tools/build-plane-app/examples" }, - ], - }, - - { - text: "MCP Server", - link: "/dev-tools/mcp-server", - collapsed: false, - items: [{ text: "For Claude Code", link: "/dev-tools/mcp-server-claude-code" }], - }, - { text: "Plane Compose", link: "/dev-tools/plane-compose" }, - { text: "OpenAPI Specification", link: "/dev-tools/openapi-specification" }, - { text: "Webhooks", link: "/dev-tools/intro-webhooks" }, - ], + icon: { + svg: '', + }, + link: "https://forum.plane.so", }, + { icon: "github", link: "https://github.com/makeplane/plane" }, + { icon: "twitter", link: "https://twitter.com/planepowers" }, + { icon: "linkedin", link: "https://www.linkedin.com/company/planepowers/" }, ], - }, - socialLinks: [ - { icon: "github", link: "https://github.com/makeplane/plane" }, - { icon: "discord", link: "https://discord.com/invite/A92xrEGCge" }, - { icon: "twitter", link: "https://twitter.com/planepowers" }, - { icon: "linkedin", link: "https://www.linkedin.com/company/planepowers/" }, - ], + search: searchConfig, - search: searchConfig, - - editLink: { - pattern: "https://github.com/makeplane/developer-docs/edit/main/:path", - }, + editLink: { + pattern: "https://github.com/makeplane/developer-docs/edit/main/:path", + }, - /*footer: { - message: 'Released under the Apache License 2.0.', - copyright: 'Copyright © 2024 Plane' + /*footer: { + message: 'Released under the Apache License 2.0.', + copyright: 'Copyright © 2024 Plane' }*/ - }, - }) + }, + }) + ) ); diff --git a/docs/.vitepress/env.d.ts b/docs/.vitepress/env.d.ts new file mode 100644 index 00000000..9ae6cdff --- /dev/null +++ b/docs/.vitepress/env.d.ts @@ -0,0 +1,13 @@ +/// +/// +/// + +import type {} from "vitepress"; + +declare module "vitepress" { + namespace DefaultTheme { + interface Config { + variant?: "voidzero" | "viteplus" | "vite" | "vitest" | "rolldown" | "oxc"; + } + } +} diff --git a/docs/.vitepress/theme/Layout.d.vue.ts b/docs/.vitepress/theme/Layout.d.vue.ts new file mode 100644 index 00000000..9df0577c --- /dev/null +++ b/docs/.vitepress/theme/Layout.d.vue.ts @@ -0,0 +1,4 @@ +import type { DefineComponent } from "vue"; + +declare const component: DefineComponent; +export default component; diff --git a/docs/.vitepress/theme/Layout.vue b/docs/.vitepress/theme/Layout.vue new file mode 100644 index 00000000..5780f45c --- /dev/null +++ b/docs/.vitepress/theme/Layout.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/docs/.vitepress/theme/components/ApiParam.d.vue.ts b/docs/.vitepress/theme/components/ApiParam.d.vue.ts new file mode 100644 index 00000000..9df0577c --- /dev/null +++ b/docs/.vitepress/theme/components/ApiParam.d.vue.ts @@ -0,0 +1,4 @@ +import type { DefineComponent } from "vue"; + +declare const component: DefineComponent; +export default component; diff --git a/docs/.vitepress/theme/components/Card.d.vue.ts b/docs/.vitepress/theme/components/Card.d.vue.ts new file mode 100644 index 00000000..9df0577c --- /dev/null +++ b/docs/.vitepress/theme/components/Card.d.vue.ts @@ -0,0 +1,4 @@ +import type { DefineComponent } from "vue"; + +declare const component: DefineComponent; +export default component; diff --git a/docs/.vitepress/theme/components/Card.vue b/docs/.vitepress/theme/components/Card.vue index 015bf1d6..10112734 100644 --- a/docs/.vitepress/theme/components/Card.vue +++ b/docs/.vitepress/theme/components/Card.vue @@ -1,72 +1,225 @@ + + diff --git a/docs/.vitepress/theme/components/CardGroup.d.vue.ts b/docs/.vitepress/theme/components/CardGroup.d.vue.ts new file mode 100644 index 00000000..9df0577c --- /dev/null +++ b/docs/.vitepress/theme/components/CardGroup.d.vue.ts @@ -0,0 +1,4 @@ +import type { DefineComponent } from "vue"; + +declare const component: DefineComponent; +export default component; diff --git a/docs/.vitepress/theme/components/CardGroup.vue b/docs/.vitepress/theme/components/CardGroup.vue index 260208e4..d59258d9 100644 --- a/docs/.vitepress/theme/components/CardGroup.vue +++ b/docs/.vitepress/theme/components/CardGroup.vue @@ -1,9 +1,21 @@ @@ -11,9 +23,9 @@ defineProps({
diff --git a/docs/.vitepress/theme/components/CodePanel.d.vue.ts b/docs/.vitepress/theme/components/CodePanel.d.vue.ts new file mode 100644 index 00000000..9df0577c --- /dev/null +++ b/docs/.vitepress/theme/components/CodePanel.d.vue.ts @@ -0,0 +1,4 @@ +import type { DefineComponent } from "vue"; + +declare const component: DefineComponent; +export default component; diff --git a/docs/.vitepress/theme/components/CookieConsent.d.vue.ts b/docs/.vitepress/theme/components/CookieConsent.d.vue.ts new file mode 100644 index 00000000..9df0577c --- /dev/null +++ b/docs/.vitepress/theme/components/CookieConsent.d.vue.ts @@ -0,0 +1,4 @@ +import type { DefineComponent } from "vue"; + +declare const component: DefineComponent; +export default component; diff --git a/docs/.vitepress/theme/components/PlaneHeader.vue b/docs/.vitepress/theme/components/PlaneHeader.vue new file mode 100644 index 00000000..f3a133ff --- /dev/null +++ b/docs/.vitepress/theme/components/PlaneHeader.vue @@ -0,0 +1,745 @@ + + + + + diff --git a/docs/.vitepress/theme/components/PlaneSearchButton.vue b/docs/.vitepress/theme/components/PlaneSearchButton.vue new file mode 100644 index 00000000..36ff15b0 --- /dev/null +++ b/docs/.vitepress/theme/components/PlaneSearchButton.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/docs/.vitepress/theme/components/ResponsePanel.d.vue.ts b/docs/.vitepress/theme/components/ResponsePanel.d.vue.ts new file mode 100644 index 00000000..9df0577c --- /dev/null +++ b/docs/.vitepress/theme/components/ResponsePanel.d.vue.ts @@ -0,0 +1,4 @@ +import type { DefineComponent } from "vue"; + +declare const component: DefineComponent; +export default component; diff --git a/docs/.vitepress/theme/components/Tags.vue b/docs/.vitepress/theme/components/Tags.vue new file mode 100644 index 00000000..5c01d6ff --- /dev/null +++ b/docs/.vitepress/theme/components/Tags.vue @@ -0,0 +1,17 @@ + + + diff --git a/docs/.vitepress/theme/components/card-brand-icons.js b/docs/.vitepress/theme/components/card-brand-icons.js new file mode 100644 index 00000000..65cd6844 --- /dev/null +++ b/docs/.vitepress/theme/components/card-brand-icons.js @@ -0,0 +1,27 @@ +/** Brand SVG icons for Card (deployment methods, etc.) */ +export const cardBrandIcons = { + docker: ``, + kubernetes: ``, + podman: ` +`, + portainer: ` + + + + + + + +`, + coolify: ``, + + // Add more icons as needed +}; diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts index 37182ad6..a592b970 100644 --- a/docs/.vitepress/theme/index.ts +++ b/docs/.vitepress/theme/index.ts @@ -1,11 +1,14 @@ -import DefaultTheme from "vitepress/theme"; import type { Theme } from "vitepress"; -import { onMounted, watch, nextTick, h } from "vue"; -import { useRoute } from "vitepress"; +import { onMounted, onUnmounted, watch, nextTick, h } from "vue"; +import { useRoute, useData } from "vitepress"; import { enhanceAppWithTabs } from "vitepress-plugin-tabs/client"; import mediumZoom from "medium-zoom"; +import VoidZeroTheme from "@voidzero-dev/vitepress-theme"; +import { themeContextKey } from "@voidzero-dev/vitepress-theme"; -import "./style.css"; +import "./styles.css"; +import "./plane-overrides.css"; +import "./plane-ui.css"; import "vitepress-plugin-tabs/client"; import ApiParam from "./components/ApiParam.vue"; @@ -13,11 +16,13 @@ import CodePanel from "./components/CodePanel.vue"; import ResponsePanel from "./components/ResponsePanel.vue"; import Card from "./components/Card.vue"; import CardGroup from "./components/CardGroup.vue"; +import Tags from "./components/Tags.vue"; import CookieConsent from "./components/CookieConsent.vue"; +import PlaneLayout from "./Layout.vue"; + +const PLANE_FOOTER_BG = "https://media.docs.plane.so/logo/og-docs.webp"; +const PLANE_MONO_ICON = "/logo/favicon-32x32.png"; -/** - * Adds 'api-page' class to hide the aside on API reference pages - */ function updateLayout() { if (typeof document === "undefined") return; @@ -31,69 +36,53 @@ function updateLayout() { } } -/** - * Handles tab activation based on URL hash - */ +/** Keep OSS header data-theme aligned with html.dark after hydration */ +function syncHeaderTheme() { + if (typeof document === "undefined") return; + + const isDark = document.documentElement.classList.contains("dark"); + document.querySelectorAll("header.plane-header, header.wrapper").forEach((header) => { + if (isDark) { + header.setAttribute("data-theme", "dark"); + } else { + header.removeAttribute("data-theme"); + } + }); +} + function handleTabHash() { if (typeof document === "undefined") return; - const hash = window.location.hash.slice(1); // Remove the '#' + const hash = window.location.hash.slice(1); if (!hash) return; - console.log("Looking for hash:", hash); - const tabButtons = document.querySelectorAll('[role="tab"]'); - - if (tabButtons.length === 0) { - console.log("No tabs found on page"); - return; - } - - console.log("Found tabs:", tabButtons); + if (tabButtons.length === 0) return; tabButtons.forEach((button) => { const labelText = button.textContent?.trim().toLowerCase().replace(/\s+/g, "-"); - console.log("Tab label text:", labelText); - if (labelText === hash) { - console.log("Activating tab:", button); - - // Trigger multiple event types to ensure Vue picks it up const element = button as HTMLElement; - - // Dispatch a proper mouse event - const clickEvent = new MouseEvent("click", { - view: window, - bubbles: true, - cancelable: true, - }); - - element.dispatchEvent(clickEvent); - - // Also try direct click + element.dispatchEvent( + new MouseEvent("click", { + view: window, + bubbles: true, + cancelable: true, + }) + ); element.click(); - - // Set focus as well element.focus(); } }); } -/** - * Adds click listeners to tabs to update URL hash - */ function setupTabHashUpdates() { if (typeof document === "undefined") return; const tabButtons = document.querySelectorAll('[role="tab"]'); - tabButtons.forEach((button) => { const element = button as HTMLElement; - - // Remove existing listener if any element.removeEventListener("click", updateHashOnTabClick); - - // Add new listener element.addEventListener("click", updateHashOnTabClick); }); } @@ -101,21 +90,35 @@ function setupTabHashUpdates() { function updateHashOnTabClick(event: Event) { const button = event.currentTarget as HTMLElement; const labelText = button.textContent?.trim().toLowerCase().replace(/\s+/g, "-"); - if (labelText) { - // Update URL hash without triggering scroll history.replaceState(null, "", `#${labelText}`); } } +function runDomEnhancements() { + syncHeaderTheme(); +} + export default { - extends: DefaultTheme, + extends: VoidZeroTheme, Layout() { - return h(DefaultTheme.Layout, null, { + return h(PlaneLayout, null, { "layout-bottom": () => h(CookieConsent), }); }, - enhanceApp({ app, router }) { + enhanceApp(ctx) { + VoidZeroTheme.enhanceApp?.(ctx); + const { app } = ctx; + + app.provide(themeContextKey, { + /* dark mark on light bg | light/white mark on dark bg (VoidZero naming) */ + logoDark: "/logo/dev-logo-watermark-light.png", + logoLight: "/logo/dev-logo-watermark-dark.png", + logoAlt: "Plane", + footerBg: PLANE_FOOTER_BG, + monoIcon: PLANE_MONO_ICON, + }); + enhanceAppWithTabs(app); app.component("ApiParam", ApiParam); @@ -123,20 +126,16 @@ export default { app.component("ResponsePanel", ResponsePanel); app.component("Card", Card); app.component("CardGroup", CardGroup); - - if (typeof window !== "undefined") { - router.onAfterRouteChanged = () => { - nextTick(() => { - updateLayout(); - }); - }; - } + app.component("Tags", Tags); }, setup() { if (typeof window === "undefined") return; const route = useRoute(); + const { isDark } = useData(); let zoom: ReturnType | null = null; + let headerObserver: MutationObserver | null = null; + let htmlClassObserver: MutationObserver | null = null; const initZoom = () => { zoom?.detach(); @@ -145,29 +144,67 @@ export default { }); }; + const scheduleEnhancements = () => { + nextTick(() => { + runDomEnhancements(); + requestAnimationFrame(runDomEnhancements); + }); + }; + + watch(isDark, () => { + syncHeaderTheme(); + }); + onMounted(() => { - initZoom(); + nextTick(() => { + updateLayout(); + initZoom(); + scheduleEnhancements(); + }); - // Delay tab hash handling to ensure tabs are rendered setTimeout(() => { handleTabHash(); setupTabHashUpdates(); + runDomEnhancements(); }, 100); - // Listen for hash changes window.addEventListener("hashchange", () => { nextTick(handleTabHash); }); + + window.addEventListener("resize", scheduleEnhancements); + + htmlClassObserver = new MutationObserver(() => { + syncHeaderTheme(); + }); + htmlClassObserver.observe(document.documentElement, { + attributes: true, + attributeFilter: ["class"], + }); + + const navRoot = document.querySelector(".VPNav"); + if (navRoot) { + headerObserver = new MutationObserver(scheduleEnhancements); + headerObserver.observe(navRoot, { childList: true, subtree: true }); + } + }); + + onUnmounted(() => { + htmlClassObserver?.disconnect(); + headerObserver?.disconnect(); + window.removeEventListener("resize", scheduleEnhancements); + zoom?.detach(); }); - // Watch for route changes watch( () => route.path, () => { nextTick(() => { + updateLayout(); initZoom(); handleTabHash(); setupTabHashUpdates(); + scheduleEnhancements(); }); } ); diff --git a/docs/.vitepress/theme/plane-overrides.css b/docs/.vitepress/theme/plane-overrides.css new file mode 100644 index 00000000..b8886653 --- /dev/null +++ b/docs/.vitepress/theme/plane-overrides.css @@ -0,0 +1,526 @@ +/* ================================================ + PLANE BRAND THEME — component overrides + ================================================ */ + +/* --- Doc links (exclude home hero CTAs) --- */ +.vp-doc + a:not(.header-anchor):not(.vp-button):not(.card-link):not(.home-doc-actions__btn):not( + :where(.home-doc-actions *) + ):not(:where(.card-links *)) { + color: var(--vp-c-brand-1); +} + +.vp-doc + a:not(.header-anchor):not(.vp-button):not(.card-link):not(.home-doc-actions__btn):not( + :where(.home-doc-actions *) + ):not(:where(.card-links *)):hover { + color: var(--plane-link-hover); +} + +/* --- Navbar / header --- */ +header.plane-header.wrapper, +.plane-header-shell { + --font-heading: var(--vp-font-family-base); + font-family: var(--vp-font-family-base); + background-color: var(--plane-header-bg) !important; + border-bottom-color: var(--plane-header-border) !important; +} + +@media (min-width: 768px) { + .docs-layout header.plane-header.wrapper, + .docs-layout .plane-header-shell .wrapper { + border-left-color: var(--docs-divider) !important; + border-right-color: var(--docs-divider) !important; + } +} + +.docs-layout .border-stroke, +html.dark .docs-layout .border-stroke, +[data-theme="dark"] .docs-layout .border-stroke { + border-color: var(--docs-divider) !important; +} + +@media (min-width: 1024px) { + .plane-header__nav .VPLink.text-base, + .plane-header__nav a.text-base { + font-size: 14px !important; + } +} + +@media (min-width: 768px) { + .plane-header .VPNavBarSearchButton, + .plane-header .search-bar { + background-color: var(--plane-header-search-bg) !important; + border: 1px solid var(--plane-header-search-border) !important; + border-radius: 12px; + color: var(--plane-header-search-text) !important; + } +} + +/* --- Home feature cards --- */ +.VPHomeFeatures .VPFeature { + background-color: #f7f8f9; + border-color: #f7f8f9; +} + +.VPHomeFeatures .VPFeature.link:hover { + background-color: #eef0f2; + border-color: #eef0f2; +} + +.VPHomeFeatures .VPFeature .icon { + background-color: transparent; + color: #0a0a0a; +} + +.VPHomeFeatures .VPFeature .title { + color: #0a0a0a; +} + +.VPHomeFeatures .VPFeature.link:hover .title { + color: #111827; +} + +.VPHomeFeatures .VPFeature .details { + color: #4a5568; +} + +.VPHomeFeatures .VPFeature .link-text-value { + color: var(--vp-c-brand-1); +} + +.VPHomeFeatures .VPFeature.link:hover .link-text-value { + color: var(--plane-brand-hover); +} + +.dark .VPHomeFeatures .VPFeature, +html.dark .VPHomeFeatures .VPFeature, +[data-theme="dark"] .VPHomeFeatures .VPFeature { + background-color: #181a1b; + border-color: #181a1b; +} + +.dark .VPHomeFeatures .VPFeature.link:hover, +html.dark .VPHomeFeatures .VPFeature.link:hover, +[data-theme="dark"] .VPHomeFeatures .VPFeature.link:hover { + background-color: #1d1f20; + border-color: #1d1f20; +} + +.dark .VPHomeFeatures .VPFeature .icon, +html.dark .VPHomeFeatures .VPFeature .icon, +[data-theme="dark"] .VPHomeFeatures .VPFeature .icon { + color: #f4f4f4; +} + +.dark .VPHomeFeatures .VPFeature .title, +html.dark .VPHomeFeatures .VPFeature .title, +[data-theme="dark"] .VPHomeFeatures .VPFeature .title { + color: #f4f4f4; +} + +.dark .VPHomeFeatures .VPFeature .details, +html.dark .VPHomeFeatures .VPFeature .details, +[data-theme="dark"] .VPHomeFeatures .VPFeature .details { + color: #a1a1aa; +} + +/* --- Hero images in markdown --- */ +.vp-doc p:has(> img[src$="#hero"]), +.vp-doc p:has(> img[src$="#hero-tl"]), +.vp-doc p:has(> img[src$="#hero-tr"]), +.vp-doc p:has(> img[src$="#hero-bl"]), +.vp-doc p:has(> img[src$="#hero-br"]), +article p:has(> img[src$="#hero"]), +article p:has(> img[src$="#hero-tl"]), +article p:has(> img[src$="#hero-tr"]), +article p:has(> img[src$="#hero-bl"]), +article p:has(> img[src$="#hero-br"]) { + background: #f1f3f3; +} + +.vp-doc img[src$="#hero"], +.vp-doc img[src$="#hero-tl"], +.vp-doc img[src$="#hero-tr"], +.vp-doc img[src$="#hero-bl"], +.vp-doc img[src$="#hero-br"], +article img[src$="#hero"], +article img[src$="#hero-tl"], +article img[src$="#hero-tr"], +article img[src$="#hero-bl"], +article img[src$="#hero-br"] { + border-color: #eaebeb; + box-shadow: + 0 1px 2px rgba(41, 47, 61, 0.04), + 0 4px 12px rgba(41, 47, 61, 0.05); +} + +/* --- HR / borders --- */ +.vp-doc hr { + border-color: #e5e7eb; +} + +.dark .vp-doc hr, +html.dark .vp-doc hr, +[data-theme="dark"] .vp-doc hr { + border-color: #2a2a2a; +} + +/* ================================================ + PLANE-SPECIFIC OVERRIDES (API docs, components) + ================================================ */ + +/* Hide aside for API reference pages */ +.api-page .aside, +.api-page .aside-container, +.api-page .VPDocAside, +.api-page aside, +.api-page .VPDocAsideOutline { + display: none !important; + width: 0 !important; + min-width: 0 !important; + opacity: 0 !important; + visibility: hidden !important; +} + +.api-page.VPDoc > .container { + display: block !important; + max-width: 100% !important; +} + +.api-page .VPDoc > .container > .content { + max-width: 100% !important; + padding-right: 24px !important; +} + +.api-page .content-container, +.api-page .main, +.api-page .vp-doc { + max-width: 100% !important; +} + +/* Two-column API layout */ +.api-two-column { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); + gap: 40px; + align-items: start; +} + +@media (max-width: 1100px) { + .api-two-column { + grid-template-columns: 1fr; + gap: 24px; + } +} + +.api-left { + min-width: 0; +} + +.api-right { + position: sticky; + top: 100px; + min-width: 0; +} + +@media (max-width: 1100px) { + .api-right { + position: static; + } +} + +/* API endpoint badge */ +.api-endpoint-badge { + display: inline-flex; + align-items: center; + gap: 12px; + margin-bottom: 20px; +} + +.api-endpoint-badge .method { + font-size: 12px; + font-weight: 700; + padding: 5px 12px; + border-radius: 6px; + font-family: var(--vp-font-family-mono); + text-transform: uppercase; +} + +.api-endpoint-badge .method.get { + background: #dcfce7; + color: #166534; +} + +.api-endpoint-badge .method.post { + background: #dbeafe; + color: #1e40af; +} + +.api-endpoint-badge .method.patch, +.api-endpoint-badge .method.put { + background: #fef3c7; + color: #92400e; +} + +.api-endpoint-badge .method.delete { + background: #fee2e2; + color: #991b1b; +} + +.dark .api-endpoint-badge .method.get { + background: rgba(34, 197, 94, 0.15); + color: #4ade80; +} + +.dark .api-endpoint-badge .method.post { + background: rgba(59, 130, 246, 0.15); + color: #60a5fa; +} + +.dark .api-endpoint-badge .method.patch, +.dark .api-endpoint-badge .method.put { + background: rgba(251, 191, 36, 0.15); + color: #fbbf24; +} + +.dark .api-endpoint-badge .method.delete { + background: rgba(239, 68, 68, 0.15); + color: #f87171; +} + +.api-endpoint-badge .path { + font-family: var(--vp-font-family-mono); + font-size: 14px; + color: var(--vp-c-text-2); +} + +/* Section headers */ +.params-section h3, +.returns-section h3 { + font-size: 13px !important; + font-weight: 600 !important; + color: var(--vp-c-text-2) !important; + text-transform: uppercase; + letter-spacing: 0.05em; + margin: 0 0 12px 0 !important; + padding: 0 !important; + border: none !important; +} + +.params-list { + border-top: 1px solid var(--vp-c-divider); +} + +/* Card components */ +.card-group { + display: grid; + gap: 16px; + margin: 24px 0; +} + +.card-group-2 { + grid-template-columns: 1fr; +} + +@media (min-width: 768px) { + .card-group-2 { + grid-template-columns: repeat(2, 1fr); + } +} + +.card-group-3 { + grid-template-columns: 1fr; +} + +@media (min-width: 768px) { + .card-group-3 { + grid-template-columns: repeat(2, 1fr); + } +} + +@media (min-width: 1024px) { + .card-group-3 { + grid-template-columns: repeat(3, 1fr); + } +} + +.card-group-4 { + grid-template-columns: 1fr; +} + +@media (min-width: 768px) { + .card-group-4 { + grid-template-columns: repeat(2, 1fr); + } +} + +@media (min-width: 1024px) { + .card-group-4 { + grid-template-columns: repeat(4, 1fr); + } +} + +.card-link { + display: block; + padding: 24px; + border-radius: 12px; + border: 1px solid #e5e7eb; + background: #ffffff; + transition: all 0.2s ease; + text-decoration: none !important; + color: inherit; +} + +.card-link:hover { + border-color: var(--vp-c-brand-1); + box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1); + text-decoration: none !important; +} + +.dark .card-link, +html.dark .card-link, +[data-theme="dark"] .card-link { + border-color: #2a2a2a; + background: rgba(20, 20, 20, 0.5); +} + +.dark .card-link:hover, +html.dark .card-link:hover, +[data-theme="dark"] .card-link:hover { + border-color: var(--vp-c-brand-1); +} + +.card-head { + margin-bottom: 0; +} + +.card-title { + font-size: 1.0625rem !important; + font-weight: 600 !important; + line-height: 1.35 !important; + letter-spacing: -0.01em; + color: #111827 !important; + border: none !important; + transition: color 0.2s ease; +} + +.card-link:hover .card-title { + color: var(--vp-c-brand-1) !important; +} + +.dark .card-title, +html.dark .card-title, +[data-theme="dark"] .card-title { + color: #f9fafb !important; +} + +.dark .card-link:hover .card-title, +html.dark .card-link:hover .card-title, +[data-theme="dark"] .card-link:hover .card-title { + color: #f9fafb !important; +} + +.card-description { + font-size: 14px; + color: #6b7280; + line-height: 1.6; + margin: 0; +} + +.dark .card-description, +html.dark .card-description, +[data-theme="dark"] .card-description { + color: #9ca3af; +} + +/* Card CTA link (optional slot / future use) */ +.card-cta { + color: var(--vp-c-brand-1); + font-weight: 500; + transition: color 0.2s ease; +} + +.card-link:hover .card-cta { + color: var(--plane-brand-hover); +} + +/* Hero image layout in markdown */ +.vp-doc p:has(> img[src$="#hero"]), +.vp-doc p:has(> img[src$="#hero-tl"]), +.vp-doc p:has(> img[src$="#hero-tr"]), +.vp-doc p:has(> img[src$="#hero-bl"]), +.vp-doc p:has(> img[src$="#hero-br"]), +article p:has(> img[src$="#hero"]), +article p:has(> img[src$="#hero-tl"]), +article p:has(> img[src$="#hero-tr"]), +article p:has(> img[src$="#hero-bl"]), +article p:has(> img[src$="#hero-br"]) { + max-width: 841px; + padding: 36px 56px 0; + border-radius: 12px; + box-sizing: border-box; + overflow: hidden; +} + +.vp-doc img[src$="#hero"], +.vp-doc img[src$="#hero-tl"], +.vp-doc img[src$="#hero-tr"], +.vp-doc img[src$="#hero-bl"], +.vp-doc img[src$="#hero-br"], +article img[src$="#hero"], +article img[src$="#hero-tl"], +article img[src$="#hero-tr"], +article img[src$="#hero-bl"], +article img[src$="#hero-br"] { + width: 100%; + height: auto; + display: block; + margin: 0; + border-radius: 8px 8px 0 0; + border: 1px solid #eaebeb; + border-bottom: none; + object-fit: cover; +} + +/* Medium zoom */ +.vp-doc img { + cursor: zoom-in; +} + +.medium-zoom-overlay { + z-index: 9999 !important; + background: rgba(0, 0, 0, 0.8) !important; +} + +.medium-zoom-image, +.medium-zoom-image--opened { + z-index: 10000 !important; +} + +.medium-zoom-image--opened { + cursor: zoom-out; +} + +.hidden { + display: none !important; +} + +.mobile-img-container { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + flex-wrap: wrap; +} + +.mobile-img-box { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + max-width: 25rem; + min-width: 15rem; + text-align: center; + margin: 10px; +} diff --git a/docs/.vitepress/theme/plane-ui.css b/docs/.vitepress/theme/plane-ui.css new file mode 100644 index 00000000..507e90fc --- /dev/null +++ b/docs/.vitepress/theme/plane-ui.css @@ -0,0 +1,852 @@ +/* ================================================ + PLANE UI — layout, typography, shell, header + (VoidZero base + Plane overrides) + ================================================ */ + +:root { + --vp-layout-top-height: 0; + --plane-header-padding-y: 1.125rem; + --plane-header-padding-x: 1.375rem; + --plane-header-logo-height: 1.6875rem; + --vp-nav-height: 84px; + + /* Navbar tokens (fallback outside .docs-layout) */ + --plane-header-bg: #ffffff; + --plane-header-border: var(--docs-divider, #ececec); + --plane-header-text: var(--color-primary, #0a0a0a); + --plane-header-muted: var(--vp-c-text-2, #6b7280); + --plane-header-divider: var(--docs-divider, #ececec); + --plane-header-search-bg: #ffffff; + --plane-header-search-border: #e7e7e7; + --plane-header-search-text: #867e8e; + --plane-header-search-keys-border: #e5e4e7; +} + +html.dark, +html.dark .plane-header-shell, +[data-theme="dark"], +[data-theme="dark"] .plane-header-shell { + --plane-header-bg: var(--color-primary, #141415); + --plane-header-border: var(--docs-divider, #2a2a2a); + --plane-header-text: #ffffff; + --plane-header-muted: var(--vp-c-text-2, #9ca3af); + --plane-header-divider: var(--docs-divider, #2a2a2a); + --plane-header-search-bg: #111111; + --plane-header-search-border: #323232; + --plane-header-search-text: #867e8e; + --plane-header-search-keys-border: #323232; +} + +/* --- Fonts & body --- */ +body, +.docs-layout { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-rendering: optimizeLegibility; + font-feature-settings: + "cv01" on, + "cv02" on, + "zero" on; +} + +html.dark .docs-layout, +html.dark body { + background-color: #141415; + color-scheme: dark; +} + +.docs-layout { + --vp-font-family-base: var(--vp-font-family-base, "Inter", system-ui, sans-serif); + --vp-font-family-mono: var(--vp-font-family-mono, "IBM Plex Mono", ui-monospace, monospace); + /* Plane header row — keep in sync with .plane-header padding + content */ + --plane-header-padding-y: 1.125rem; + --plane-header-padding-x: 1.375rem; + --plane-header-logo-height: 1.6875rem; + --vp-nav-height: 84px; + + /* Navbar — Plane theme tokens (light) */ + --plane-header-bg: #ffffff; + --plane-header-border: var(--docs-divider); + --plane-header-text: var(--color-primary, #0a0a0a); + --plane-header-muted: var(--vp-c-text-2); + --plane-header-divider: var(--docs-divider); + --plane-header-search-bg: #ffffff; + --plane-header-search-border: #e7e7e7; + --plane-header-search-text: #867e8e; + --plane-header-search-keys-border: #e5e4e7; +} + +html.dark .docs-layout, +html.dark .docs-layout .plane-header-shell, +[data-theme="dark"] .docs-layout, +[data-theme="dark"] .plane-header-shell { + --plane-header-bg: var(--color-primary, #141415); + --plane-header-border: var(--docs-divider); + --plane-header-text: #ffffff; + --plane-header-muted: var(--vp-c-text-2); + --plane-header-divider: var(--docs-divider); + --plane-header-search-bg: #111111; + --plane-header-search-border: #323232; + --plane-header-search-text: #867e8e; + --plane-header-search-keys-border: #323232; +} + +/* --- Doc prose --- */ +.vp-doc { + line-height: 1.7; + letter-spacing: -0.011em; +} + +.vp-doc h1 { + letter-spacing: -0.022em; + line-height: 1.2; +} + +.vp-doc h2 { + border-top: none !important; + margin-top: 32px; + letter-spacing: -0.017em; + line-height: 1.3; +} + +.vp-doc h3 { + border-top: none !important; + letter-spacing: -0.014em; + line-height: 1.4; +} + +/* --- Sidebars: flush under OSS navbar --- */ +@media (min-width: 1024px) { + .docs-layout .VPSidebar { + padding-top: 0; + top: calc(var(--vp-nav-height) + var(--vp-banner-height, 0px) - 4px); + } + + .docs-layout .VPDoc .aside-container { + padding-top: 0; + top: calc(var(--vp-nav-height) + var(--vp-banner-height, 0px) - 4px); + } +} + +/* --- Doc layout shell (1280px+) --- */ +@media (min-width: 1280px) { + .docs-layout .VPSidebar .nav { + padding-top: 0; + } + + .docs-layout .VPDoc .content { + padding-top: 32px; + } + + .docs-layout .VPDoc .aside { + max-width: 256px; + } + + .docs-layout .VPDoc .aside-container { + width: 256px; + padding-left: 24px; + border-left-color: var(--docs-divider); + } + + .docs-layout .VPDocOutlineItem .outline-link { + white-space: normal; + text-overflow: unset; + overflow: visible; + } +} + +/* No right outline (aside: false) — widen main column */ +.docs-layout .VPDoc:not(.has-aside) .content-container { + max-width: 960px; + padding-left: 24px; + padding-right: 24px; +} + +@media (min-width: 1280px) { + .docs-layout .VPDoc:not(.has-aside) .content-container { + max-width: 1104px; + padding-left: 48px; + padding-right: 48px; + } +} + +/* Unified layout borders & corner ticks */ +@media (min-width: 768px) { + .docs-layout .content-wrapper, + .docs-layout .wrapper { + border-left-color: var(--docs-divider); + border-right-color: var(--docs-divider); + } +} + +.docs-layout .tick-left::before { + border-left-color: var(--docs-divider); +} + +.docs-layout .tick-right::after { + border-right-color: var(--docs-divider); +} + +.docs-layout .VPSidebar { + border-right: 1px solid var(--docs-divider); +} + +/* Hide local nav when sidebar is present */ +@media (min-width: 1024px) { + .docs-layout .VPLocalNav { + display: none !important; + } +} + +/* --- Plane header — match content-wrapper width (centered when fixed) --- */ +@media (min-width: 768px) { + .docs-layout .plane-header-shell { + width: calc(100vw - 2rem); + max-width: calc(100vw - 2rem); + margin-left: auto; + margin-right: auto; + box-sizing: border-box; + } +} + +@media (min-width: 90rem) { + .docs-layout .plane-header-shell { + width: 90rem; + max-width: 90rem; + } +} + +@media (min-width: 1024px) { + .docs-layout .plane-header-shell--docs { + left: 50%; + right: auto; + transform: translateX(-50%); + width: calc(100vw - 2rem); + max-width: calc(100vw - 2rem); + } + + .docs-layout .plane-header-shell--docs.plane-header-shell { + overflow-x: clip; + } +} + +@media (min-width: 90rem) { + .docs-layout .plane-header-shell--docs { + width: 90rem; + max-width: 90rem; + } +} + +@media (min-width: 1024px) { + .plane-header-shell { + overflow-x: clip; + } + + .docs-layout .plane-header.wrapper { + width: 100%; + max-width: 100%; + margin-left: auto; + margin-right: auto; + box-sizing: border-box; + overflow-x: clip; + } + + .plane-header .plane-header__start, + .plane-header .plane-header__actions { + min-width: 0; + overflow: hidden; + } + + .plane-header .plane-header__search { + width: 240px; + max-width: 240px; + } + + .plane-header .VPNavBarSearch { + width: 100%; + min-width: 0; + max-width: 240px; + } + + .plane-header .VPNavBarSearchButton, + .plane-header .DocSearch.DocSearch-Button { + width: 100% !important; + max-width: 240px !important; + min-width: 0 !important; + } + + .plane-header .DocSearch.DocSearch-Button, + .plane-header .VPNavBarSearchButton, + .plane-header .search-bar { + height: 36px; + border-radius: 12px; + background: var(--plane-header-search-bg) !important; + border: 1px solid var(--plane-header-search-border) !important; + color: var(--plane-header-search-text) !important; + justify-content: flex-start !important; + text-align: left !important; + gap: 8px; + } + + .plane-header .DocSearch-Button-Container { + justify-content: flex-start !important; + flex: 1; + min-width: 0; + gap: 0.5rem; + } + + .plane-header .DocSearch-Search-Icon { + color: var(--plane-header-search-text) !important; + } + + .plane-header .DocSearch-Button-Placeholder, + .plane-header .VPNavBarSearchButton .text, + .plane-header .search-bar__text { + color: var(--plane-header-search-text) !important; + text-align: left !important; + flex: 0 1 auto; + font-size: 13px; + } + + .plane-header .DocSearch-Button-Keys, + .plane-header .VPNavBarSearchButton .keys, + .plane-header .search-bar__keys { + color: var(--plane-header-search-text) !important; + border: 1px solid var(--plane-header-search-keys-border) !important; + margin-left: auto !important; + flex-shrink: 0; + font-size: 12px; + font-weight: 500; + } + + .plane-header__nav .VPLink.link, + .plane-header__nav .VPLink.text-base, + .plane-header .VPNavBarMenuLink:not(.home-doc-actions__btn), + .plane-header .VPNavBarMenuGroup .button { + color: var(--plane-header-text) !important; + font-size: 14px !important; + font-weight: 400; + padding: 0.375rem 0.5rem; + min-width: 0; + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + transition: color 0.2s ease; + } + + .plane-header__nav .VPLink.link:hover, + .plane-header .VPNavBarMenuLink:not(.home-doc-actions__btn):hover, + .plane-header .VPNavBarMenuGroup .button:hover { + color: var(--vp-c-brand-1) !important; + opacity: 1; + } + + .plane-header a.home-doc-actions__btn--secondary.VPNavBarMenuLink, + .plane-header a.home-doc-actions__btn--secondary.VPNavBarMenuLink:hover { + color: inherit !important; + opacity: 1 !important; + } + + .plane-header .VPNavBarMenuLink.active, + .plane-header__nav .VPLink.link.active { + color: var(--vp-c-brand-1) !important; + } + + .plane-header .VPNavBarAppearance, + .plane-header .VPNavBarSocialLinks { + display: flex !important; + align-items: center; + flex-shrink: 0; + } + + .plane-header .VPNavBarSocialLinks { + gap: 0.25rem; + } + + .plane-header .VPNavBarSocialLinks .VPSocialLink { + color: var(--plane-header-text); + transition: color 0.2s ease; + } + + .plane-header .VPNavBarSocialLinks .VPSocialLink:hover { + color: var(--vp-c-brand-1); + } + + .plane-header .VPSwitchAppearance { + --vp-c-bg: var(--plane-header-search-bg); + } +} + +/* Theme switcher border: --vp-input-border-color → --vp-c-border → stroke / nickel */ +.docs-layout .VPSwitchAppearance { + --vp-c-border: var(--color-stroke); + --vp-input-border-color: var(--vp-c-border); +} + +html.dark .docs-layout .VPSwitchAppearance, +[data-theme="dark"] .docs-layout .VPSwitchAppearance { + --vp-c-border: var(--color-nickel); + --vp-input-border-color: var(--vp-c-border); +} + +@media (min-width: 1024px) and (max-width: 1279px) { + .plane-header__title { + display: none; + } +} + +@media (min-width: 1280px) { + .plane-header { + gap: 0.5rem 1.25rem; + --plane-header-padding-x: 1.5rem; + } + + .plane-header__nav .VPLink.link, + .plane-header__nav .VPLink.text-base, + .plane-header .VPNavBarMenuLink:not(.home-doc-actions__btn), + .plane-header .VPNavBarMenuGroup .button { + font-size: 14px !important; + padding: 0.375rem 0.75rem; + } +} + +/* --- Code blocks --- */ +div[class*="language-"] { + border-radius: 8px !important; + overflow: hidden; + border: 1px solid #e5e7eb; + background: #fafafa !important; +} + +.dark div[class*="language-"], +html.dark div[class*="language-"], +[data-theme="dark"] div[class*="language-"] { + background: #0f0f0f !important; + border-color: #2a2a2a !important; +} + +div[class*="language-"] pre { + background: transparent !important; +} + +.dark .shiki, +.dark .shiki span, +html.dark .shiki, +html.dark .shiki span { + background: transparent !important; +} + +div[class*="language-"] > span.lang { + color: #9ca3af; + font-size: 12px; +} + +/* --- Home page (layout: doc) --- */ +.vp-doc .home-hero { + margin-bottom: 2rem; +} + +.vp-doc .home-hero h1 { + font-size: 2.5rem; + font-weight: 600; + letter-spacing: -0.02em; + margin: 0 0 0.5rem; + line-height: 1.15; +} + +.vp-doc .home-hero .home-hero-text { + font-size: 1.75rem; + font-weight: 600; + letter-spacing: -0.02em; + margin: 0 0 1rem; + color: var(--vp-c-text-1); +} + +.vp-doc .home-hero .home-hero-tagline { + font-size: 1.125rem; + color: var(--vp-c-text-2); + max-width: 42rem; + margin: 0 0 1.5rem; + line-height: 1.6; +} + +.home-doc-actions { + display: flex; + flex-wrap: wrap; + gap: 12px; + margin-bottom: 3rem; +} + +/* --- Plane buttons: shared base --- */ +a.home-doc-actions__btn, +.home-doc-actions__btn { + display: inline-flex; + align-items: center; + justify-content: center; + min-height: 40px; + padding: 9px 18px; + border-radius: 8px; + border: 1px solid transparent; + font-size: 15px; + font-weight: 500; + line-height: 1.25; + text-decoration: none !important; + cursor: pointer; + transition: + background 0.2s ease, + color 0.2s ease, + border-color 0.2s ease, + box-shadow 0.2s ease, + transform 0.2s ease; +} + +/* Navbar — smaller primary variant */ +a.home-doc-actions__btn--nav, +.home-doc-actions__btn--nav { + min-height: auto; + padding: 4px 15px; + border-radius: 6px; + font-size: 14px; + margin: 0 !important; +} + +/* Primary */ +a.home-doc-actions__btn--primary, +a.home-doc-actions__btn--primary:is(:link, :visited, :focus, :active) { + background: #006399 !important; + border-color: #006399 !important; + color: #ffffff !important; +} + +a.home-doc-actions__btn--primary:hover { + background: #0078b8 !important; + border-color: #0078b8 !important; + color: #ffffff !important; + box-shadow: 0 2px 8px rgba(0, 99, 153, 0.25); +} + +a.home-doc-actions__btn--primary.home-doc-actions__btn--nav:hover { + transform: translateY(-1px); +} + +.dark a.home-doc-actions__btn--primary, +.dark a.home-doc-actions__btn--primary:is(:link, :visited, :focus, :active), +html.dark a.home-doc-actions__btn--primary, +html.dark a.home-doc-actions__btn--primary:is(:link, :visited, :focus, :active), +[data-theme="dark"] a.home-doc-actions__btn--primary, +[data-theme="dark"] a.home-doc-actions__btn--primary:is(:link, :visited, :focus, :active) { + background: #2893cc !important; + border-color: #2893cc !important; + color: #ffffff !important; +} + +.dark a.home-doc-actions__btn--primary:hover, +html.dark a.home-doc-actions__btn--primary:hover, +[data-theme="dark"] a.home-doc-actions__btn--primary:hover { + background: #3aa5d4 !important; + border-color: #3aa5d4 !important; + color: #ffffff !important; +} + +.dark a.home-doc-actions__btn--primary.home-doc-actions__btn--nav:hover, +html.dark a.home-doc-actions__btn--primary.home-doc-actions__btn--nav:hover, +[data-theme="dark"] a.home-doc-actions__btn--primary.home-doc-actions__btn--nav:hover { + box-shadow: 0 2px 8px rgba(40, 147, 204, 0.25); +} + +/* Secondary */ +a.home-doc-actions__btn--secondary, +a.home-doc-actions__btn--secondary:is(:link, :visited, :focus, :active) { + background: transparent !important; + border-color: #e5e7eb !important; + color: #0a0a0a !important; +} + +a.home-doc-actions__btn--secondary:hover { + background: #f7f8f9 !important; + border-color: #d1d5db !important; + color: #0a0a0a !important; +} + +.dark a.home-doc-actions__btn--secondary, +.dark a.home-doc-actions__btn--secondary:is(:link, :visited, :focus, :active), +html.dark a.home-doc-actions__btn--secondary, +html.dark a.home-doc-actions__btn--secondary:is(:link, :visited, :focus, :active), +[data-theme="dark"] a.home-doc-actions__btn--secondary, +[data-theme="dark"] a.home-doc-actions__btn--secondary:is(:link, :visited, :focus, :active) { + background: #252829 !important; + border-color: #3f4244 !important; + color: #ffffff !important; +} + +.dark a.home-doc-actions__btn--secondary:hover, +html.dark a.home-doc-actions__btn--secondary:hover, +[data-theme="dark"] a.home-doc-actions__btn--secondary:hover { + background: #2f3236 !important; + border-color: #4a4e52 !important; + color: #ffffff !important; +} + +/* Navbar buttons — hide external-link ↗ icon */ +.plane-header a.home-doc-actions__btn.vp-external-link-icon::after, +.plane-header .VPLink.home-doc-actions__btn.vp-external-link-icon::after, +.plane-header a.home-doc-actions__btn.no-icon::after, +.plane-header .VPLink.home-doc-actions__btn.no-icon::after { + display: none !important; + content: none !important; +} + +.plane-header a.home-doc-actions__btn .vp-external-link-icon, +.plane-header a.home-doc-actions__btn svg { + display: none !important; +} + +/* Navbar primary & secondary buttons */ +.plane-header a.home-doc-actions__btn--primary.VPNavBarMenuLink, +.plane-header a.home-doc-actions__btn--secondary.VPNavBarMenuLink, +.plane-header .VPLink.home-doc-actions__btn--primary, +.plane-header .VPLink.home-doc-actions__btn--secondary { + padding: 4px 15px !important; + font-size: 14px !important; + border-radius: 6px !important; + min-height: auto !important; + line-height: 1.25 !important; + font-weight: 500 !important; + white-space: nowrap; +} + +/* Don't apply nav text-link hover to Sign in button */ +.plane-header .VPNavBarMenuLink.home-doc-actions__btn:hover { + opacity: 1 !important; +} + +.home-feature-cards { + margin: 2rem 0 3rem; +} + +.home-quick-start { + margin: 1.5rem 0 3rem; +} + +.home-feature-cards .card-group, +.home-quick-start .card-group { + display: grid; + gap: 16px; + grid-template-columns: 1fr; +} + +@media (min-width: 640px) { + .home-feature-cards .card-group, + .home-quick-start .card-group { + grid-template-columns: repeat(2, 1fr); + } +} + +@media (min-width: 960px) { + .home-feature-cards .card-group, + .home-quick-start .card-group { + grid-template-columns: repeat(3, 1fr); + } +} + +.home-feature-cards .card-group, +.home-quick-start .card-group { + gap: 1rem; +} + +.home-feature-cards .card-link, +.home-quick-start .card-link { + display: flex; + flex-direction: column; + height: 100%; + min-height: 10rem; + border: 1px solid transparent; + background: #f7f8f9; + padding: 1.5rem; + border-radius: 0.875rem; + box-shadow: none; + transition: + background 0.2s ease, + border-color 0.2s ease, + transform 0.2s ease; +} + +.home-feature-cards .card-link:hover, +.home-quick-start .card-link:hover { + background: #eef0f2; + border-color: color-mix(in srgb, var(--vp-c-brand-1) 12%, transparent); + box-shadow: none; + transform: translateY(-1px); + text-decoration: none !important; +} + +.home-quick-start .card-link--static { + cursor: default; +} + +.home-quick-start .card-link--static:hover { + background: #f7f8f9; + border-color: transparent; + box-shadow: none; + transform: none; + text-decoration: none !important; +} + +.home-quick-start .card-link--static:hover .card-title { + color: #0a0a0a !important; +} + +.home-quick-start .card-link--static:hover .card-icon__surface { + background: color-mix(in srgb, var(--vp-c-brand-1) 10%, transparent); +} + +.dark .home-quick-start .card-link--static:hover, +html.dark .home-quick-start .card-link--static:hover, +[data-theme="dark"] .home-quick-start .card-link--static:hover { + background: #181a1b; + border-color: transparent; +} + +.dark .home-quick-start .card-link--static:hover .card-title, +html.dark .home-quick-start .card-link--static:hover .card-title, +[data-theme="dark"] .home-quick-start .card-link--static:hover .card-title { + color: #f4f4f4 !important; +} + +.dark .home-feature-cards .card-link, +html.dark .home-feature-cards .card-link, +[data-theme="dark"] .home-feature-cards .card-link, +.dark .home-quick-start .card-link, +html.dark .home-quick-start .card-link, +[data-theme="dark"] .home-quick-start .card-link { + background: #181a1b; + border-color: transparent; +} + +.dark .home-feature-cards .card-link:hover, +html.dark .home-feature-cards .card-link:hover, +[data-theme="dark"] .home-feature-cards .card-link:hover, +.dark .home-quick-start .card-link:hover, +html.dark .home-quick-start .card-link:hover, +[data-theme="dark"] .home-quick-start .card-link:hover { + background: #1f2224; + border-color: color-mix(in srgb, var(--vp-c-brand-1) 22%, transparent); + box-shadow: none; +} + +.home-feature-cards .card-head, +.home-quick-start .card-head { + margin-bottom: 0.625rem; +} + +.home-feature-cards .card-title, +.home-quick-start .card-title { + color: #0a0a0a !important; + font-size: 1rem !important; +} + +.dark .home-feature-cards .card-title, +html.dark .home-feature-cards .card-title, +[data-theme="dark"] .home-feature-cards .card-title, +.dark .home-quick-start .card-title, +html.dark .home-quick-start .card-title, +[data-theme="dark"] .home-quick-start .card-title { + color: #f4f4f4 !important; +} + +.home-feature-cards .card-link:hover .card-title, +.home-quick-start .card-link:hover .card-title { + color: #0a0a0a !important; +} + +.dark .home-feature-cards .card-link:hover .card-title, +html.dark .home-feature-cards .card-link:hover .card-title, +[data-theme="dark"] .home-feature-cards .card-link:hover .card-title, +.dark .home-quick-start .card-link:hover .card-title, +html.dark .home-quick-start .card-link:hover .card-title, +[data-theme="dark"] .home-quick-start .card-link:hover .card-title { + color: #f4f4f4 !important; +} + +.home-feature-cards .card-description, +.home-quick-start .card-description { + font-size: 0.875rem; + line-height: 1.55; + color: #5c6570; +} + +.dark .home-feature-cards .card-description, +html.dark .home-feature-cards .card-description, +[data-theme="dark"] .home-feature-cards .card-description, +.dark .home-quick-start .card-description, +html.dark .home-quick-start .card-description, +[data-theme="dark"] .home-quick-start .card-description { + color: #9ca3af; +} + +.home-feature-cards .card-cta, +.home-quick-start .card-links { + margin-top: auto; +} + +.home-feature-cards .card-cta { + padding-top: 1rem; +} + +.home-quick-start .card-links { + padding-top: 1rem; +} + +.home-feature-cards .card-icon__surface, +.home-quick-start .card-icon__surface { + width: 2.75rem; + height: 2.75rem; + border-radius: 0.6875rem; +} + +.home-feature-cards .card-icon__custom svg, +.home-quick-start .card-icon__custom svg { + width: 1.375rem; + height: 1.375rem; +} + +/* Hide footer prev/next on home when card grids are present */ +.Layout:has(.home-feature-cards) .VPDocFooter .prev, +.Layout:has(.home-feature-cards) .VPDocFooter .next, +.Layout:has(.home-feature-cards) .VPDocFooter .pager-link, +.Layout:has(.home-quick-start) .VPDocFooter .prev, +.Layout:has(.home-quick-start) .VPDocFooter .next, +.Layout:has(.home-quick-start) .VPDocFooter .pager-link { + display: none; +} + +/* Legacy VPFeature icons in dark mode */ +.dark .VPFeature .VPImage, +html.dark .VPFeature .VPImage { + filter: invert(1) hue-rotate(180deg); +} + +.dark .VPFeatures .VPFeature .icon img, +html.dark .VPFeatures .VPFeature .icon img { + filter: invert(1) hue-rotate(180deg); +} + +/* --- Tags --- */ +.plantag, +a.plantag { + display: inline-flex; + align-items: center; + padding: 2px 8px; + border-radius: 4px; + font-size: 12px; + font-weight: 500; + background: var(--vp-c-brand-soft); + color: var(--vp-c-brand-1); + text-decoration: none; + line-height: 1.4; +} + +a.plantag:hover { + color: var(--plane-brand-hover); +} diff --git a/docs/.vitepress/theme/style.css b/docs/.vitepress/theme/style.css deleted file mode 100644 index f14ef8f4..00000000 --- a/docs/.vitepress/theme/style.css +++ /dev/null @@ -1,859 +0,0 @@ -/* ================================================ - TAILWIND CSS - ================================================ */ -/* Import Tailwind theme + utilities WITHOUT Preflight (CSS reset). - VitePress has its own base/reset styles for markdown rendering, - so Tailwind's Preflight conflicts with headings, links, lists, etc. - The layer() wrappers ensure Tailwind utilities don't override - VitePress's unlayered default theme styles. */ -@import "tailwindcss/theme" layer(theme); -@import "tailwindcss/utilities" layer(utilities); - -@source "../../**/*.{vue,md}"; -@source "../**/*.{vue,md}"; - -@theme { - --color-plane-400: #0088cc; - --color-plane-500: #006399; - --color-plane-600: #005280; -} - -/* ================================================ - THEME VARIANTS - ================================================ */ - -@custom-variant light (&:where([data-theme*="light"], [data-theme*="light"] *)); -@custom-variant dark (&:where([data-theme*="dark"], [data-theme*="dark"] *)); - -/* ================================================ - COLOR SYSTEM - ================================================ */ - -@layer base { - :root { - /* Alpha colors - for transparency effects */ - --alpha-white-0: oklch(1 0 0 / 0%); - --alpha-white-200: oklch(1 0 0 / 10%); - --alpha-white-500: oklch(1 0 0 / 30%); - --alpha-white-700: oklch(1 0 0 / 50%); - --alpha-black-0: oklch(0.1482 0.0034 196.79 / 0%); - --alpha-black-200: oklch(0.1482 0.0034 196.79 / 10%); - --alpha-black-500: oklch(0.1482 0.0034 196.79 / 30%); - --alpha-black-700: oklch(0.1482 0.0034 196.79 / 50%); - - /* Neutral colors - for text and backgrounds */ - --neutral-white: oklch(1 0 0); - --neutral-100: oklch(0.9848 0.0003 230.66); - --neutral-200: oklch(0.9696 0.0007 230.67); - --neutral-300: oklch(0.9543 0.001 230.67); - --neutral-500: oklch(0.9235 0.001733 230.6853); - --neutral-700: oklch(0.8612 0.0032 230.71); - --neutral-800: oklch(0.6668 0.0079 230.82); - --neutral-1000: oklch(0.5288 0.0083 230.88); - --neutral-1100: oklch(0.4377 0.0066 230.87); - --neutral-1200: oklch(0.2378 0.0029 230.83); - --neutral-black: oklch(0.1472 0.0034 230.83); - - /* Brand colors */ - --brand-100: oklch(0.9847 0.0083 236.56); - --brand-300: oklch(0.9428 0.0341 230.22); - --brand-500: oklch(0.8414 0.0947 233.08); - --brand-700: oklch(0.6766 0.1665 243.91); - --brand-900: oklch(0.4347 0.104093 242.4823); - --brand-default: oklch(0.4799 0.1158 242.91); - - /* Semantic colors */ - --green-100: oklch(0.9819 0.0181 155.83); - --green-500: oklch(0.7914 0.2091 151.66); - --green-700: oklch(0.632 0.185972 147.3695); - --amber-100: oklch(0.9869 0.0214 95.28); - --amber-500: oklch(0.829 0.1712 81.04); - --amber-700: oklch(0.6671 0.1685 53.38); - --red-100: oklch(0.9705 0.0129 17.38); - --red-500: oklch(0.7022 0.1892 22.23); - --red-700: oklch(0.583 0.238666 28.4765); - - /* Font sizes */ - --text-xs: 0.75rem; /* 12px */ - --text-sm: 0.875rem; /* 14px */ - --text-base: 1rem; /* 16px */ - --text-lg: 1.125rem; /* 18px */ - --text-xl: 1.25rem; /* 20px */ - --text-2xl: 1.5rem; /* 24px */ - --text-3xl: 1.875rem; /* 30px */ - --text-4xl: 2.25rem; /* 36px */ - - /* Font weights */ - --font-weight-light: 300; - --font-weight-normal: 400; - --font-weight-medium: 500; - --font-weight-semibold: 600; - --font-weight-bold: 700; - } -} - -/* ================================================ - INTER VARIABLE FONT - ================================================ */ - -@font-face { - font-family: "Inter"; - src: url("/fonts/Inter/InterVariable.woff2") format("woff2"); - font-weight: 100 900; - font-style: normal; - font-display: swap; -} - -/* ================================================ - IBM PLEX MONO FONT (FOR CODE BLOCKS) - ================================================ */ - -@font-face { - font-family: "IBM Plex Mono"; - src: url("/fonts/IBMPlexMono/IBMPlexMono-Regular.ttf") format("truetype"); - font-weight: 400; - font-style: normal; - font-display: swap; -} - -@font-face { - font-family: "IBM Plex Mono"; - src: url("/fonts/IBMPlexMono/IBMPlexMono-Medium.ttf") format("truetype"); - font-weight: 500; - font-style: normal; - font-display: swap; -} - -@font-face { - font-family: "IBM Plex Mono"; - src: url("/fonts/IBMPlexMono/IBMPlexMono-SemiBold.ttf") format("truetype"); - font-weight: 600; - font-style: normal; - font-display: swap; -} - -@font-face { - font-family: "IBM Plex Mono"; - src: url("/fonts/IBMPlexMono/IBMPlexMono-Bold.ttf") format("truetype"); - font-weight: 700; - font-style: normal; - font-display: swap; -} - -/* ================================================ - PLANE DEVELOPER DOCS - CUSTOM STYLES - ================================================ */ - -/* Brand colors and fonts */ -:root { - /* Brand colors */ - --vp-c-brand-1: #006399; - --vp-c-brand-2: #006399; - --vp-c-brand-3: #006399; - --vp-c-brand-soft: rgba(0, 99, 153, 0.14); - --plane-500: #006399; - - /* Fonts */ - --vp-font-family-base: - "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, sans-serif; - --vp-font-family-mono: - "IBM Plex Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", - monospace; -} - -/* Font rendering optimizations */ -body { - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - text-rendering: optimizeLegibility; - font-feature-settings: - "cv01" on, - "cv02" on, - "zero" on; -} - -/* Typography tuning for Inter readability */ -.vp-doc { - line-height: 1.7; - letter-spacing: -0.011em; -} - -.vp-doc h1 { - letter-spacing: -0.022em; - line-height: 1.2; -} - -.vp-doc h2 { - letter-spacing: -0.017em; - line-height: 1.3; -} - -.vp-doc h3 { - letter-spacing: -0.014em; - line-height: 1.4; -} - -/* Dark mode */ -.dark { - --vp-c-bg: #0a0a0a; - --vp-c-bg-soft: #141414; - --vp-c-bg-mute: #1f1f1f; - - /* Brand colors */ - --vp-c-brand-1: #2f9bd5; - --vp-c-brand-2: #2f9bd5; - --vp-c-brand-3: #2f9bd5; - --vp-c-brand-soft: rgba(0, 99, 153, 0.14); - --plane-500: #2f9bd5; -} - -/* ================================================ - HIDE ASIDE FOR API PAGES - ================================================ */ - -/* Hide ALL aside elements when .api-page is present */ -.api-page .aside, -.api-page .aside-container, -.api-page .VPDocAside, -.api-page aside, -.api-page .VPDocAsideOutline { - display: none !important; - width: 0 !important; - min-width: 0 !important; - opacity: 0 !important; - visibility: hidden !important; -} - -/* Remove the aside column entirely */ -.api-page.VPDoc > .container { - display: block !important; - max-width: 100% !important; -} - -.api-page .VPDoc > .container > .content { - max-width: 100% !important; - padding-right: 24px !important; -} - -/* Target specific VitePress structure */ -.api-page .content-container { - max-width: 100% !important; -} - -.api-page .main { - max-width: 100% !important; -} - -/* Force full width on content */ -.api-page .vp-doc { - max-width: 100% !important; -} - -/* ================================================ - TWO-COLUMN API LAYOUT - ================================================ */ - -.api-two-column { - display: grid; - grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); - gap: 40px; - align-items: start; -} - -@media (max-width: 1100px) { - .api-two-column { - grid-template-columns: 1fr; - gap: 24px; - } -} - -.api-left { - min-width: 0; -} - -.api-right { - position: sticky; - top: 100px; - min-width: 0; -} - -@media (max-width: 1100px) { - .api-right { - position: static; - } -} - -/* ================================================ - API ENDPOINT BADGE - ================================================ */ - -.api-endpoint-badge { - display: inline-flex; - align-items: center; - gap: 12px; - margin-bottom: 20px; -} - -.api-endpoint-badge .method { - font-size: 12px; - font-weight: 700; - padding: 5px 12px; - border-radius: 6px; - font-family: var(--vp-font-family-mono); - text-transform: uppercase; -} - -.api-endpoint-badge .method.get { - background: #dcfce7; - color: #166534; -} - -.api-endpoint-badge .method.post { - background: #dbeafe; - color: #1e40af; -} - -.api-endpoint-badge .method.patch, -.api-endpoint-badge .method.put { - background: #fef3c7; - color: #92400e; -} - -.api-endpoint-badge .method.delete { - background: #fee2e2; - color: #991b1b; -} - -.dark .api-endpoint-badge .method.get { - background: rgba(34, 197, 94, 0.15); - color: #4ade80; -} - -.dark .api-endpoint-badge .method.post { - background: rgba(59, 130, 246, 0.15); - color: #60a5fa; -} - -.dark .api-endpoint-badge .method.patch, -.dark .api-endpoint-badge .method.put { - background: rgba(251, 191, 36, 0.15); - color: #fbbf24; -} - -.dark .api-endpoint-badge .method.delete { - background: rgba(239, 68, 68, 0.15); - color: #f87171; -} - -.api-endpoint-badge .path { - font-family: var(--vp-font-family-mono); - font-size: 14px; - color: #6b7280; -} - -.dark .api-endpoint-badge .path { - color: #9ca3af; -} - -/* ================================================ - SECTION HEADERS - ================================================ */ - -.params-section { - margin: 24px 0; -} - -.params-section h3 { - font-size: 13px !important; - font-weight: 600 !important; - color: #6b7280 !important; - text-transform: uppercase; - letter-spacing: 0.05em; - margin: 0 0 12px 0 !important; - padding: 0 !important; - border: none !important; -} - -.dark .params-section h3 { - color: #9ca3af !important; -} - -.params-list { - border-top: 1px solid #e5e7eb; -} - -.dark .params-list { - border-top-color: #2a2a2a; -} - -.returns-section { - margin: 24px 0; -} - -.returns-section h3 { - font-size: 13px !important; - font-weight: 600 !important; - color: #6b7280 !important; - text-transform: uppercase; - letter-spacing: 0.05em; - margin: 0 0 12px 0 !important; - padding: 0 !important; - border: none !important; -} - -.dark .returns-section h3 { - color: #9ca3af !important; -} - -/* ================================================ - CODE BLOCKS - DARK MODE FIX - ================================================ */ - -div[class*="language-"] { - border-radius: 8px !important; - overflow: hidden; - border: 1px solid #e5e7eb; - background: #fafafa !important; -} - -.dark div[class*="language-"] { - background: #0f0f0f !important; - border-color: #2a2a2a !important; -} - -div[class*="language-"] pre { - background: transparent !important; -} - -.dark div[class*="language-"] pre { - background: transparent !important; -} - -.dark .shiki, -.dark .shiki span { - background: transparent !important; -} - -/* Language label */ -div[class*="language-"] > span.lang { - color: #9ca3af; - font-size: 12px; -} - -/* ================================================ - UTILITY CLASSES - ================================================ */ - -.hidden { - display: none !important; -} - -/* Remove default VitePress h2/h3 borders */ -.vp-doc h2 { - border-top: none !important; - margin-top: 32px; -} - -.vp-doc h3 { - border-top: none !important; -} - -/* ================================================ - CARD GROUP COMPONENT STYLES - ================================================ */ - -.card-group { - display: grid; - gap: 16px; - margin: 24px 0; -} - -.card-group-2 { - grid-template-columns: 1fr; -} - -@media (min-width: 768px) { - .card-group-2 { - grid-template-columns: repeat(2, 1fr); - } -} - -.card-group-3 { - grid-template-columns: 1fr; -} - -@media (min-width: 768px) { - .card-group-3 { - grid-template-columns: repeat(2, 1fr); - } -} - -@media (min-width: 1024px) { - .card-group-3 { - grid-template-columns: repeat(3, 1fr); - } -} - -.card-group-4 { - grid-template-columns: 1fr; -} - -@media (min-width: 768px) { - .card-group-4 { - grid-template-columns: repeat(2, 1fr); - } -} - -@media (min-width: 1024px) { - .card-group-4 { - grid-template-columns: repeat(4, 1fr); - } -} - -/* ================================================ - CARD COMPONENT STYLES - ================================================ */ - -.card-link { - display: block; - padding: 24px; - border-radius: 12px; - border: 1px solid #e5e7eb; - background: #ffffff; - transition: all 0.2s ease; - text-decoration: none !important; - color: inherit; -} - -.card-link:hover { - border-color: #006399; - box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1); - text-decoration: none !important; -} - -.dark .card-link { - border-color: #2a2a2a; - background: rgba(20, 20, 20, 0.5); -} - -.dark .card-link:hover { - border-color: #0088cc; - box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.5); -} - -.card-icon { - font-size: 32px; - margin-bottom: 16px; - line-height: 1; -} - -.card-title { - font-size: 16px !important; - font-weight: 600 !important; - color: #111827 !important; - margin: 0 0 12px 0 !important; - padding: 0 !important; - border: none !important; - transition: color 0.2s ease; -} - -.card-link:hover .card-title { - color: #006399 !important; -} - -.dark .card-title { - color: #f9fafb !important; -} - -.dark .card-link:hover .card-title { - color: #0088cc !important; -} - -.card-description { - font-size: 14px; - color: #6b7280; - line-height: 1.6; - margin: 0; -} - -.dark .card-description { - color: #9ca3af; -} - -/* ================================================ - SEARCH BOX WIDTH IN HEADER - ================================================ */ - -/* Make the header search box wider */ -.DocSearch.DocSearch-Button { - justify-content: space-between !important; -} - -@media (min-width: 768px) { - .DocSearch.DocSearch-Button { - width: 230px !important; - } -} - -@media (min-width: 1024px) { - .DocSearch.DocSearch-Button { - width: 310px !important; - } -} - -/* ================================================ - SIGN IN BUTTON STYLING - ================================================ */ - -/* Target the Sign in link using multiple class combinations */ -.VPNavBarMenuLink.VPLink[href*="sign-in"], -a.VPLink.VPNavBarMenuLink[href*="sign-in"], -.VPNavBarMenu .VPLink[href="https://app.plane.so/sign-in"] { - background: #006399 !important; - color: #ffffff !important; - padding: 6px 14px !important; - margin-top: 15px !important; - margin-bottom: 15px !important; - border-radius: 6px !important; - font-weight: 500 !important; - font-size: 14px !important; - transition: all 0.2s ease !important; - line-height: normal !important; - text-decoration: none !important; - display: inline-flex !important; - align-items: center !important; - vertical-align: middle !important; -} - -/* Hide the external link arrow icon */ -.VPNavBarMenuLink.VPLink[href*="sign-in"] .vp-external-link-icon, -a.VPLink.VPNavBarMenuLink[href*="sign-in"] .vp-external-link-icon, -.VPNavBarMenu .VPLink[href="https://app.plane.so/sign-in"] .vp-external-link-icon, -.VPNavBarMenuLink.VPLink[href*="sign-in"] svg, -a.VPLink.VPNavBarMenuLink[href*="sign-in"] svg, -.VPNavBarMenuLink.VPLink[href*="sign-in"] .VPImage, -a.VPLink.VPNavBarMenuLink[href*="sign-in"] .VPImage { - display: none !important; -} - -/* Also hide the icon using ::after if it's a pseudo-element */ -.VPNavBarMenuLink.VPLink[href*="sign-in"]::after, -a.VPLink.VPNavBarMenuLink[href*="sign-in"]::after { - display: none !important; - content: none !important; -} - -.VPNavBarMenuLink.VPLink[href*="sign-in"]:hover, -a.VPLink.VPNavBarMenuLink[href*="sign-in"]:hover { - background: #0078b8 !important; - transform: translateY(-1px) !important; - box-shadow: 0 2px 8px rgba(0, 99, 153, 0.25) !important; - text-decoration: none !important; -} - -/* Dark mode variant */ -.dark .VPNavBarMenuLink.VPLink[href*="sign-in"], -.dark a.VPLink.VPNavBarMenuLink[href*="sign-in"] { - background: #006399 !important; - color: #ffffff !important; -} - -.dark .VPNavBarMenuLink.VPLink[href*="sign-in"]:hover, -.dark a.VPLink.VPNavBarMenuLink[href*="sign-in"]:hover { - background: #0078b8 !important; - box-shadow: 0 2px 8px rgba(0, 99, 153, 0.35) !important; -} - -/* ================================================ - HERO IMAGE STYLES - ================================================ */ - -.vp-doc p:has(> img[src$="#hero"]), -article p:has(> img[src$="#hero"]) { - max-width: 841px; - padding: 36px 56px 0px 56px; - background: #f1f3f3; - border-radius: 12px; - box-sizing: border-box; - overflow: hidden; -} - -.vp-doc img[src$="#hero"], -article img[src$="#hero"] { - width: 100%; - height: auto; - display: block; - margin: 0; - border-radius: 8px 8px 0px 0px; - border-width: 1px 1px 0px 1px; - border-style: solid; - border-color: #eaebeb; - object-fit: cover; - box-shadow: - 0px 2px 4px -1px rgba(41, 47, 61, 0.04), - 0px 4px 6px -1px rgba(41, 47, 61, 0.05); -} - -.vp-doc p:has(> img[src$="#hero-tl"]), -article p:has(> img[src$="#hero-tl"]) { - max-width: 841px; - padding: 36px 0px 0px 56px; - background: #f1f3f3; - border-radius: 12px; - box-sizing: border-box; - overflow: hidden; -} - -.vp-doc img[src$="#hero-tl"], -article img[src$="#hero-tl"] { - width: 100%; - height: auto; - display: block; - margin: 0; - border-radius: 8px 0px 0px 0px; - border-width: 1px 0px 0px 1px; - border-style: solid; - border-color: #eaebeb; - object-fit: cover; - box-shadow: - 0px 2px 4px -1px rgba(41, 47, 61, 0.04), - 0px 4px 6px -1px rgba(41, 47, 61, 0.05); -} - -.vp-doc p:has(> img[src$="#hero-tr"]), -article p:has(> img[src$="#hero-tr"]) { - max-width: 841px; - padding: 36px 56px 0px 0px; - background: #f1f3f3; - border-radius: 12px; - box-sizing: border-box; - overflow: hidden; -} - -.vp-doc img[src$="#hero-tr"], -article img[src$="#hero-tr"] { - width: 100%; - height: auto; - display: block; - margin: 0; - border-radius: 0px 8px 0px 0px; - border-width: 1px 1px 0px 0px; - border-style: solid; - border-color: #eaebeb; - object-fit: cover; - box-shadow: - 0px 2px 4px -1px rgba(41, 47, 61, 0.04), - 0px 4px 6px -1px rgba(41, 47, 61, 0.05); -} - -.vp-doc p:has(> img[src$="#hero-bl"]), -article p:has(> img[src$="#hero-bl"]) { - max-width: 841px; - padding: 0px 0px 36px 56px; - background: #f1f3f3; - border-radius: 12px; - box-sizing: border-box; - overflow: hidden; -} - -.vp-doc img[src$="#hero-bl"], -article img[src$="#hero-bl"] { - width: 100%; - height: auto; - display: block; - margin: 0; - border-radius: 0px 0px 0px 8px; - border-width: 0px 0px 1px 1px; - border-style: solid; - border-color: #eaebeb; - object-fit: cover; - box-shadow: - 0px 2px 4px -1px rgba(41, 47, 61, 0.04), - 0px 4px 6px -1px rgba(41, 47, 61, 0.05); -} - -.vp-doc p:has(> img[src$="#hero-br"]), -article p:has(> img[src$="#hero-br"]) { - max-width: 841px; - padding: 0px 56px 36px 0px; - background: #f1f3f3; - border-radius: 12px; - box-sizing: border-box; - overflow: hidden; -} - -.vp-doc img[src$="#hero-br"], -article img[src$="#hero-br"] { - width: 100%; - height: auto; - display: block; - margin: 0; - border-radius: 0px 0px 8px 0px; - border-width: 0px 1px 1px 0px; - border-style: solid; - border-color: #eaebeb; - object-fit: cover; - box-shadow: - 0px 2px 4px -1px rgba(41, 47, 61, 0.04), - 0px 4px 6px -1px rgba(41, 47, 61, 0.05); -} - -/* ================================================ - MOBILE IMAGE LAYOUT - ================================================ */ - -.mobile-img-container { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - flex-wrap: wrap; -} - -.mobile-img-box { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - max-width: 25rem; - min-width: 15rem; - text-align: center; - margin: 10px; -} - -/* ================================================ - HOMEPAGE FEATURE ICONS - DARK MODE - ================================================ */ - -/* Feature card icons use currentColor in SVG, but since they're - loaded as tags, currentColor defaults to black. This filter - inverts them for visibility in dark mode. */ -.dark .VPFeature .VPImage { - filter: invert(1) hue-rotate(180deg); -} - -.dark .VPFeatures .VPFeature .icon img { - filter: invert(1) hue-rotate(180deg); -} - -/* ================================================ - MEDIUM ZOOM - IMAGE LIGHTBOX - ================================================ */ - -.vp-doc img { - cursor: zoom-in; -} - -.medium-zoom-overlay { - z-index: 9999 !important; - background: rgba(0, 0, 0, 0.8) !important; -} - -.medium-zoom-image { - z-index: 10000 !important; -} - -.medium-zoom-image--opened { - z-index: 10000 !important; - cursor: zoom-out; -} diff --git a/docs/.vitepress/theme/styles.css b/docs/.vitepress/theme/styles.css new file mode 100644 index 00000000..77209c07 --- /dev/null +++ b/docs/.vitepress/theme/styles.css @@ -0,0 +1,269 @@ +@import "@voidzero-dev/vitepress-theme/src/styles/index.css"; + +@source "./**/*.vue"; +@source "../../**/*.{vue,md}"; + +/* Inter + IBM Plex Mono (Plane docs) */ +@font-face { + font-family: "Inter"; + src: url("/fonts/Inter/InterVariable.woff2") format("woff2"); + font-weight: 100 900; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "IBM Plex Mono"; + src: url("/fonts/IBMPlexMono/IBMPlexMono-Regular.ttf") format("truetype"); + font-weight: 400; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "IBM Plex Mono"; + src: url("/fonts/IBMPlexMono/IBMPlexMono-Medium.ttf") format("truetype"); + font-weight: 500; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "IBM Plex Mono"; + src: url("/fonts/IBMPlexMono/IBMPlexMono-SemiBold.ttf") format("truetype"); + font-weight: 600; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "IBM Plex Mono"; + src: url("/fonts/IBMPlexMono/IBMPlexMono-Bold.ttf") format("truetype"); + font-weight: 700; + font-style: normal; + font-display: swap; +} + +/* ================================================ + PLANE BRAND TOKENS (replaces VoidZero purple) + ================================================ */ + +@theme { + --color-plane-400: #0088cc; + --color-plane-500: #006399; + --color-plane-600: #005280; +} + +@layer base { + :root { + --neutral-50: oklch(0.99 0.002 250); + --neutral-100: oklch(0.97 0.004 250); + --neutral-200: oklch(0.92 0.006 250); + --neutral-500: oklch(0.55 0.02 250); + --neutral-900: oklch(0.2 0.01 250); + --brand-400: oklch(0.62 0.12 230); + --brand-500: oklch(0.48 0.1 230); + --brand-600: oklch(0.4 0.09 230); + --green-400: oklch(0.72 0.17 145); + --green-500: oklch(0.55 0.15 145); + } +} + +/* Plane font stacks (override VoidZero APK / KH Teka) */ +:root, +:root[data-variant="voidzero"], +:root[data-variant="vitest"] { + --vp-font-family-base: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; + --vp-font-family-mono: + "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace; + --font-sans: var(--vp-font-family-base); + --font-mono: var(--vp-font-family-mono); +} + +/* --- Light mode --- */ +:root, +:root[data-theme="light"], +html:not(.dark):not([data-theme="dark"]) { + --color-brand: #006399; + --color-primary: #0a0a0a; + + --vp-c-brand-1: #006399; + --vp-c-brand-2: #006399; + --vp-c-brand-3: #006399; + --vp-c-brand-soft: rgba(0, 99, 153, 0.14); + + --plane-500: #006399; + --color-plane-400: #0088cc; + --color-plane-500: #006399; + --color-plane-600: #005280; + + --docs-divider: #ececec; + + --vp-c-bg: #ffffff; + --vp-c-text-1: #0a0a0a; + + --plane-link-hover: #0078b8; + --plane-brand-hover: #0078b8; + + --vp-c-text-2: #6b7280; + --vp-c-divider: #e5e7eb; + --vp-c-border: #e5e7eb; + + --vp-code-block-bg: #fafafa; + + /* Hero / CTA buttons */ + --vp-button-brand-border: #006399; + --vp-button-brand-bg: #006399; + --vp-button-brand-text: #ffffff; + --vp-button-brand-hover-border: #0078b8; + --vp-button-brand-hover-bg: #0078b8; + --vp-button-brand-hover-text: #ffffff; + + --vp-button-alt-border: #e5e7eb; + --vp-button-alt-text: #0a0a0a; + --vp-button-alt-bg: transparent; + --vp-button-alt-hover-border: #d1d5db; + --vp-button-alt-hover-text: #0a0a0a; + --vp-button-alt-hover-bg: #f7f8f9; + + /* Custom blocks */ + --vp-c-tip-1: #166534; + --vp-c-tip-2: #166534; + --vp-c-tip-3: #166534; + --vp-c-tip-soft: #dcfce7; + --vp-custom-block-tip-text: #166534; + --vp-custom-block-tip-bg: #dcfce7; + --vp-custom-block-tip-code-bg: #dcfce7; + + --vp-custom-block-info-text: #1e40af; + --vp-custom-block-info-bg: #dbeafe; + --vp-custom-block-info-code-bg: #dbeafe; + + --vp-c-warning-1: #92400e; + --vp-custom-block-warning-text: #92400e; + --vp-custom-block-warning-bg: #fef3c7; + --vp-custom-block-warning-code-bg: #fef3c7; + + --vp-c-danger-1: #991b1b; + --vp-custom-block-danger-text: #991b1b; + --vp-custom-block-danger-bg: #fee2e2; + --vp-custom-block-danger-code-bg: #fee2e2; +} + +/* VoidZero / vitest variant — Plane brand (not electric purple) */ +:root[data-variant="voidzero"], +:root[data-variant="vitest"], +:root[data-variant="voidzero"][data-theme="light"], +:root[data-variant="vitest"][data-theme="light"], +:root[data-variant="voidzero"]:not(.dark):not([data-theme="dark"]), +:root[data-variant="vitest"]:not(.dark):not([data-theme="dark"]) { + --color-brand: #006399; + --vp-code-color: #006399; +} + +/* --- Dark mode --- */ +.dark, +html.dark, +[data-theme="dark"], +:root.dark:not([data-theme]), +:root[data-theme="dark"][data-variant="voidzero"], +:root[data-theme="dark"][data-variant="vitest"] { + --color-brand: #2893cc; + --color-primary: #141415; + + --vp-c-bg: #141415; + --vp-c-bg-soft: #1f2122; + --vp-c-bg-alt: #141618; + --vp-c-bg-mute: #252829; + --vp-c-bg-elv: #141618; + + --vp-c-brand-1: #2893cc; + --vp-c-brand-2: #2893cc; + --vp-c-brand-3: #2893cc; + --vp-c-brand-soft: rgba(40, 147, 204, 0.14); + + --plane-500: #2893cc; + --color-plane-400: #0088cc; + --color-plane-500: #2893cc; + --color-plane-600: #005280; + + --docs-divider: #2a2a2a; + + --vp-c-text-1: rgba(255, 255, 255, 0.9); + + --plane-link-hover: #3aa5d4; + --plane-brand-hover: #3aa5d4; + + --vp-c-text-2: #9ca3af; + --vp-c-divider: #2a2a2a; + --vp-c-border: #2a2a2a; + + --vp-code-block-bg: #0f0f0f; + + --vp-button-brand-border: #2893cc; + --vp-button-brand-bg: #2893cc; + --vp-button-brand-text: #ffffff; + --vp-button-brand-hover-border: #3aa5d4; + --vp-button-brand-hover-bg: #3aa5d4; + --vp-button-brand-hover-text: #ffffff; + + --vp-button-alt-border: #3f4244; + --vp-button-alt-text: #ffffff; + --vp-button-alt-bg: transparent; + --vp-button-alt-hover-border: #4a4e52; + --vp-button-alt-hover-text: #ffffff; + --vp-button-alt-hover-bg: #252829; + --vp-button-alt-active-bg: #2f3236; + + --vp-c-tip-1: #4ade80; + --vp-c-tip-soft: rgba(34, 197, 94, 0.15); + --vp-custom-block-tip-text: #4ade80; + --vp-custom-block-tip-bg: rgba(34, 197, 94, 0.15); + --vp-custom-block-tip-code-bg: rgba(34, 197, 94, 0.15); + + --vp-custom-block-info-text: #60a5fa; + --vp-custom-block-info-bg: rgba(59, 130, 246, 0.15); + --vp-custom-block-info-code-bg: rgba(59, 130, 246, 0.15); + + --vp-c-warning-1: #fbbf24; + --vp-custom-block-warning-text: #fbbf24; + --vp-custom-block-warning-bg: rgba(251, 191, 36, 0.15); + --vp-custom-block-warning-code-bg: rgba(251, 191, 36, 0.15); + + --vp-c-danger-1: #f87171; + --vp-custom-block-danger-text: #f87171; + --vp-custom-block-danger-bg: rgba(239, 68, 68, 0.15); + --vp-custom-block-danger-code-bg: rgba(239, 68, 68, 0.15); +} + +.highlighted-word { + background-color: var(--vp-code-line-highlight-color); + transition: background-color 0.5s; + display: inline-block; +} + +html:not(.dark) .VPContent kbd { + --kbd-color-background: #f7f7f7; + --kbd-color-border: #cbcccd; + --kbd-color-text: #222325; +} + +.VPContent kbd { + --kbd-color-background: #898b90; + --kbd-color-border: #3d3e42; + --kbd-color-text: #222325; + + background-color: var(--kbd-color-background); + color: var(--kbd-color-text); + border-radius: 0.25rem; + border: 1px solid var(--kbd-color-border); + box-shadow: 0 2px 0 1px var(--kbd-color-border); + font-family: var(--font-family-sans-serif); + font-size: 0.75em; + line-height: 1; + min-width: 0.75rem; + text-align: center; + padding: 2px 5px; + position: relative; + top: -1px; +} diff --git a/docs/.vitepress/theme/tsconfig.json b/docs/.vitepress/theme/tsconfig.json new file mode 100644 index 00000000..de924a2b --- /dev/null +++ b/docs/.vitepress/theme/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "../tsconfig.json", + "include": ["./**/*.ts", "./**/*.vue", "../types/**/*.ts", "../types/**/*.d.ts", "../env.d.ts"] +} diff --git a/docs/.vitepress/theme/voidzero/default-layout.ts b/docs/.vitepress/theme/voidzero/default-layout.ts new file mode 100644 index 00000000..41b63b86 --- /dev/null +++ b/docs/.vitepress/theme/voidzero/default-layout.ts @@ -0,0 +1,10 @@ +import { defineComponent, h } from "vue"; +import Layout from "./doc-layout.vue"; +import { slotsToChildren } from "./slots"; + +export default defineComponent({ + name: "PlaneVoidzeroDefaultLayout", + setup(_, { slots }) { + return () => h(Layout, null, slotsToChildren(slots)); + }, +}); diff --git a/docs/.vitepress/theme/voidzero/doc-layout.vue b/docs/.vitepress/theme/voidzero/doc-layout.vue new file mode 100644 index 00000000..2ff8c45b --- /dev/null +++ b/docs/.vitepress/theme/voidzero/doc-layout.vue @@ -0,0 +1,179 @@ + + + + + + + diff --git a/docs/.vitepress/theme/voidzero/header.ts b/docs/.vitepress/theme/voidzero/header.ts new file mode 100644 index 00000000..600b3d49 --- /dev/null +++ b/docs/.vitepress/theme/voidzero/header.ts @@ -0,0 +1,10 @@ +import { defineComponent, h } from "vue"; +import Header from "../components/PlaneHeader.vue"; +import { slotsToChildren } from "./slots"; + +export default defineComponent({ + name: "PlaneVoidzeroHeader", + setup(_, { slots }) { + return () => h(Header, null, slotsToChildren(slots)); + }, +}); diff --git a/docs/.vitepress/theme/voidzero/slots.ts b/docs/.vitepress/theme/voidzero/slots.ts new file mode 100644 index 00000000..eb223fb9 --- /dev/null +++ b/docs/.vitepress/theme/voidzero/slots.ts @@ -0,0 +1,13 @@ +import type { Slots, VNode } from "vue"; + +/** Normalize Vue 3 slots for use with `h(Component, props, children)` */ +export function slotsToChildren(slots: Slots): Record VNode[]> { + const children: Record VNode[]> = {}; + for (const name of Object.keys(slots)) { + const slot = slots[name]; + if (slot) { + children[name] = () => slot() as VNode[]; + } + } + return children; +} diff --git a/docs/.vitepress/theme/voidzero/top-banner.ts b/docs/.vitepress/theme/voidzero/top-banner.ts new file mode 100644 index 00000000..02492af3 --- /dev/null +++ b/docs/.vitepress/theme/voidzero/top-banner.ts @@ -0,0 +1,9 @@ +import { defineComponent, h } from "vue"; +import Banner from "@voidzero-dev/vitepress-theme/src/components/oss/TopBanner.vue"; + +export default defineComponent({ + name: "PlaneVoidzeroTopBanner", + setup() { + return () => h(Banner); + }, +}); diff --git a/docs/.vitepress/tsconfig.json b/docs/.vitepress/tsconfig.json new file mode 100644 index 00000000..14befa79 --- /dev/null +++ b/docs/.vitepress/tsconfig.json @@ -0,0 +1,46 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "bundler", + "strict": true, + "jsx": "preserve", + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "skipLibCheck": true, + "ignoreDeprecations": "6.0", + "allowArbitraryExtensions": true, + "noEmit": true, + "lib": ["ESNext", "DOM"], + "types": ["vitepress/client", "node", "vue"], + "paths": { + "@voidzero-dev/vitepress-theme": ["./types/voidzero-theme.ts"], + "@voidzero-dev/vitepress-theme/src/vitest": ["./types/vitest-theme.ts"], + "@voidzero-dev/vitepress-theme/src/components/vitepress-default/Layout.vue": [ + "../../node_modules/@voidzero-dev/vitepress-theme/src/components/vitepress-default/Layout.vue" + ], + "@voidzero-dev/vitepress-theme/src/components/oss/Header.vue": [ + "../../node_modules/@voidzero-dev/vitepress-theme/src/components/oss/Header.vue" + ], + "@voidzero-dev/vitepress-theme/src/components/oss/TopBanner.vue": [ + "../../node_modules/@voidzero-dev/vitepress-theme/src/components/oss/TopBanner.vue" + ], + "@voidzero-dev/vitepress-theme/src/types/theme-context": [ + "../../node_modules/@voidzero-dev/vitepress-theme/src/types/theme-context.ts" + ], + "@vp-default/*": ["../../node_modules/@voidzero-dev/vitepress-theme/src/components/vitepress-default/*"], + "@vp-composables/*": ["../../node_modules/@voidzero-dev/vitepress-theme/src/composables/vitepress-default/*"], + "@vp-support/*": ["../../node_modules/@voidzero-dev/vitepress-theme/src/support/vitepress-default/*"], + "@components/*": ["../../node_modules/@voidzero-dev/vitepress-theme/src/components/*"] + } + }, + "include": [ + "./config.mts", + "./theme/**/*.ts", + "./theme/**/*.vue", + "./env.d.ts", + "./types/**/*.ts", + "./types/**/*.d.ts" + ] +} diff --git a/docs/.vitepress/types/ambient-modules.d.ts b/docs/.vitepress/types/ambient-modules.d.ts new file mode 100644 index 00000000..6bf6d613 --- /dev/null +++ b/docs/.vitepress/types/ambient-modules.d.ts @@ -0,0 +1,35 @@ +declare module "*.vue" { + import type { DefineComponent } from "vue"; + const component: DefineComponent; + export default component; +} + +/** Deep imports from @voidzero-dev/vitepress-theme (package does not export .vue types) */ +declare module "@voidzero-dev/vitepress-theme/src/components/vitepress-default/Layout.vue" { + import type { DefineComponent } from "vue"; + const component: DefineComponent; + export default component; +} + +declare module "@voidzero-dev/vitepress-theme/src/components/oss/Header.vue" { + import type { DefineComponent } from "vue"; + const component: DefineComponent; + export default component; +} + +declare module "@voidzero-dev/vitepress-theme/src/components/oss/TopBanner.vue" { + import type { DefineComponent } from "vue"; + const component: DefineComponent; + export default component; +} + +declare module "@voidzero-dev/vitepress-theme/src/types/theme-context" { + export const themeContextKey: symbol; + export interface ThemeContext { + logoDark: string; + logoLight: string; + logoAlt: string; + footerBg: string; + monoIcon: string; + } +} diff --git a/docs/.vitepress/types/vitest-theme.ts b/docs/.vitepress/types/vitest-theme.ts new file mode 100644 index 00000000..f5deaf18 --- /dev/null +++ b/docs/.vitepress/types/vitest-theme.ts @@ -0,0 +1,4 @@ +import type { Theme } from "vitepress"; + +declare const VitestTheme: Theme; +export default VitestTheme; diff --git a/docs/.vitepress/types/voidzero-theme.ts b/docs/.vitepress/types/voidzero-theme.ts new file mode 100644 index 00000000..a2ab1706 --- /dev/null +++ b/docs/.vitepress/types/voidzero-theme.ts @@ -0,0 +1,11 @@ +import type { Component } from "vue"; +import type { Theme } from "vitepress"; + +export { themeContextKey, type ThemeContext } from "@voidzero-dev/vitepress-theme/src/types/theme-context"; + +export const VPHomeHero = {} as Component; +export const VPHomeFeatures = {} as Component; + +declare const VoidZeroTheme: Theme; +export { VoidZeroTheme }; +export default VoidZeroTheme; diff --git a/docs/.vitepress/types/vp-theme-modules.d.ts b/docs/.vitepress/types/vp-theme-modules.d.ts new file mode 100644 index 00000000..cb2cbb6a --- /dev/null +++ b/docs/.vitepress/types/vp-theme-modules.d.ts @@ -0,0 +1,110 @@ +/** + * Explicit module declarations for VoidZero VitePress theme aliases. + * Wildcard patterns are unreliable in Vetur / some IDE resolvers; list each import path. + */ +import type { DefineComponent } from "vue"; + +type VueModule = DefineComponent; + +declare module "@vp-default/VPNavBarSearch.vue" { + const component: VueModule; + export default component; +} + +declare module "@vp-default/VPNavBarMenuLink.vue" { + const component: VueModule; + export default component; +} + +declare module "@vp-default/VPNavBarMenuGroup.vue" { + const component: VueModule; + export default component; +} + +declare module "@vp-default/VPNavBarAppearance.vue" { + const component: VueModule; + export default component; +} + +declare module "@vp-default/VPSwitchAppearance.vue" { + const component: VueModule; + export default component; +} + +declare module "@vp-default/VPNavBarSocialLinks.vue" { + const component: VueModule; + export default component; +} + +declare module "@vp-default/VPSocialLinks.vue" { + const component: VueModule; + export default component; +} + +declare module "@vp-default/VPBackdrop.vue" { + const component: VueModule; + export default component; +} + +declare module "@vp-default/VPContent.vue" { + const component: VueModule; + export default component; +} + +declare module "@vp-default/VPFooter.vue" { + const component: VueModule; + export default component; +} + +declare module "@vp-default/VPLocalNav.vue" { + const component: VueModule; + export default component; +} + +declare module "@vp-default/VPSidebar.vue" { + const component: VueModule; + export default component; +} + +declare module "@vp-default/VPSkipLink.vue" { + const component: VueModule; + export default component; +} + +declare module "@components/oss/TopBanner.vue" { + const component: VueModule; + export default component; +} + +declare module "@vp-composables/langs" { + export function useLangs(options?: { correspondingLink?: boolean }): { + localeLinks: { link: string; text: string }[]; + currentLang: { label?: string }; + }; +} + +declare module "@vp-composables/data" { + export function useData(): ReturnType; +} + +declare module "@vp-composables/layout" { + export const layoutInfoInjectionKey: symbol; + export function registerWatchers(options: { closeSidebar: () => void }): void; + export function useLayout(): { hasSidebar: import("vue").ComputedRef }; +} + +declare module "@vp-composables/sidebar" { + export function useSidebarControl(): { + isOpen: import("vue").Ref; + open: () => void; + close: () => void; + }; +} + +declare module "@vp-support/utils" { + export function normalizeLink(path: string): string; +} + +declare module "@vp-support/search-config" { + export function getSearchProvider(theme: unknown): "local" | "algolia" | undefined; +} diff --git a/docs/dev-tools/openapi-specification.md b/docs/dev-tools/openapi-specification.md index 6ce11d75..932f43f4 100644 --- a/docs/dev-tools/openapi-specification.md +++ b/docs/dev-tools/openapi-specification.md @@ -12,7 +12,7 @@ Plane uses [drf-spectacular](https://drf-spectacular.readthedocs.io/) to generat Add the following to your `.env` file (at the project root or `apps/api/.env`): -```env +```ini ENABLE_DRF_SPECTACULAR=1 ``` diff --git a/docs/index.md b/docs/index.md index b78340ba..c10dbb1a 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,80 +1,110 @@ --- -layout: home +layout: doc title: Plane Developer Documentation - API Reference & Self-Hosting Guides description: Build integrations with Plane's REST API and deploy on your infrastructure. Complete guides for self-hosting with Docker, Kubernetes, webhooks, and OAuth apps. keywords: plane developer docs, plane api, self-hosting plane, kubernetes deployment, docker compose, plane webhooks, plane oauth, project management api -hero: - name: Developer docs - text: Build, deploy, and integrate - tagline: Everything you need to self-host Plane, integrate with the REST API, and build powerful custom workflows. - actions: - - theme: brand - text: Get Started - link: /self-hosting/overview - - theme: alt - text: API Reference - link: /api-reference/introduction - -features: - - icon: 🚀 - title: Self-hosting - details: Deploy Plane on your infrastructure with Docker, Kubernetes, or other methods. Complete guides for configuration, authentication, and management. - link: /self-hosting/overview - linkText: View deployment guides - - icon: 📡 - title: REST API - details: 180+ endpoints to manage projects, work items, cycles, modules, and more. - link: /api-reference/introduction - linkText: Explore API docs - - icon: 🔧 - title: Webhooks - details: Automate workflows with real-time webhooks for project events, work item updates, and team activities. - link: /dev-tools/intro-webhooks - linkText: Configure webhooks - - icon: 🔌 - title: OAuth Apps - details: Build custom integrations using OAuth 2.0. Complete guides for app registration, token management, and API access. - link: /dev-tools/build-plane-app/overview - linkText: Build an app - - icon: 🤖 - title: MCP Server - details: Integrate Plane with AI agents using Model Context Protocol for intelligent project management automation. - link: /dev-tools/mcp-server - linkText: Setup MCP +aside: false --- -## Quick start guides +
+ +# Developer docs + +
Build, deploy, and integrate
+ +

Everything you need to self-host Plane, integrate with the REST API, and build powerful custom workflows.

+ +
+ + + +
+ + + + + +Deploy Plane on your infrastructure with Docker, Kubernetes, or other methods. Complete guides for configuration, authentication, and management. + + + + + +180+ endpoints to manage projects, work items, cycles, modules, and more. + + + + -
+Automate workflows with real-time webhooks for project events, work item updates, and team activities. -
+ -### Deploy with Docker + -Get Plane running in minutes with Docker Compose +Build custom integrations using OAuth 2.0. Complete guides for app registration, token management, and API access. -[Docker Compose](/self-hosting/methods/docker-compose) + + + + +Integrate Plane with AI agents using Model Context Protocol for intelligent project management automation. + + + + + +Create and deploy agents that work with Plane using signals, webhooks, and the REST API. + + + +
-
+## Quick start guides -### Configure Your Instance +
-Set up authentication and connect external services to your Plane deployment. + -[Instance Admin](/self-hosting/govern/instance-admin) • [Configure SSO](/self-hosting/govern/authentication) + +Get Plane running in minutes with Docker Compose. + + -
+ + + + +Set up authentication and connect external services to your Plane deployment. + + -### Manage instance + -Keep your instance up-to-date with the latest features and security patches. + -[Update guide](/self-hosting/manage/upgrade-plane) • [Manage licenses](/self-hosting/manage/manage-licenses/activate-pro-and-business) +Keep your instance up to date with the latest features and security patches. + + + + +
diff --git a/docs/public/robots.txt b/docs/public/robots.txt index 6d7bcdd4..4b66bd3f 100644 --- a/docs/public/robots.txt +++ b/docs/public/robots.txt @@ -8,9 +8,9 @@ Allow: / # Disallow crawling of search results (if any) Disallow: /search -# Content Signals — AI content usage preferences +# Content Signals — AI content usage preferences (comment only; not a standard robots directive) # https://contentsignals.org/ -Content-Signal: search=yes, ai-train=yes, ai-input=yes +# Content-Signal: search=yes, ai-train=yes, ai-input=yes # Disallow crawling of any internal/private paths (add as needed) # Disallow: /private/ @@ -20,9 +20,9 @@ Content-Signal: search=yes, ai-train=yes, ai-input=yes # Sitemap location Sitemap: https://developers.plane.so/sitemap.xml -# LLMs.txt - AI-friendly site documentation +# LLMs.txt — AI-friendly site documentation (discoverable via Link response header) # https://llmstxt.org/ -LLMs-txt: https://developers.plane.so/llms.txt +# https://developers.plane.so/llms.txt # Crawl-delay for polite crawling (optional) # Crawl-delay: 1 diff --git a/package.json b/package.json index df5f14e0..857ff8b0 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,8 @@ "build": "vitepress build docs", "preview": "vitepress preview docs", "fix:format": "prettier --write .", - "check:format": "prettier --check ." + "check:format": "prettier --check .", + "check:types": "tsc --noEmit -p docs/.vitepress/tsconfig.json" }, "keywords": [ "plane", @@ -18,15 +19,14 @@ "author": "Plane", "license": "Apache-2.0", "devDependencies": { - "@tailwindcss/postcss": "^4.1.18", - "autoprefixer": "^10.4.23", + "@types/node": "^25.9.0", + "@voidzero-dev/vitepress-theme": "^4.8.4", "mermaid": "^11.12.2", - "postcss": "^8.5.6", "prettier": "^3.8.1", - "tailwindcss": "^4.1.18", - "vitepress": "^1.6.4", + "typescript": "^6.0.3", + "vitepress": "2.0.0-alpha.16", "vitepress-plugin-mermaid": "^2.0.17", - "vitepress-plugin-tabs": "^0.7.3", + "vitepress-plugin-tabs": "^0.8.0", "vue": "^3.5.26" }, "dependencies": { @@ -34,6 +34,11 @@ "medium-zoom": "^1.1.0" }, "pnpm": { + "peerDependencyRules": { + "allowedVersions": { + "vitepress": "2" + } + }, "overrides": { "rollup": "4.59.0", "lodash-es": "4.18.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 792552eb..0c187330 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,124 +17,41 @@ importers: dependencies: lucide-vue-next: specifier: ^0.562.0 - version: 0.562.0(vue@3.5.27) + version: 0.562.0(vue@3.5.27(typescript@6.0.3)) medium-zoom: specifier: ^1.1.0 version: 1.1.0 devDependencies: - '@tailwindcss/postcss': - specifier: ^4.1.18 - version: 4.1.18 - autoprefixer: - specifier: ^10.4.23 - version: 10.4.23(postcss@8.5.6) + '@types/node': + specifier: ^25.9.0 + version: 25.9.0 + '@voidzero-dev/vitepress-theme': + specifier: ^4.8.4 + version: 4.8.4(focus-trap@7.8.0)(vite@6.4.2(@types/node@25.9.0)(jiti@2.6.1)(lightningcss@1.32.0))(vitepress@2.0.0-alpha.16(@types/node@25.9.0)(jiti@2.6.1)(lightningcss@1.32.0)(postcss@8.5.6)(typescript@6.0.3))(vue@3.5.27(typescript@6.0.3)) mermaid: specifier: ^11.12.2 version: 11.12.2 - postcss: - specifier: ^8.5.6 - version: 8.5.6 prettier: specifier: ^3.8.1 version: 3.8.1 - tailwindcss: - specifier: ^4.1.18 - version: 4.1.18 + typescript: + specifier: ^6.0.3 + version: 6.0.3 vitepress: - specifier: ^1.6.4 - version: 1.6.4(@algolia/client-search@5.47.0)(jiti@2.6.1)(lightningcss@1.30.2)(postcss@8.5.6)(search-insights@2.17.3) + specifier: 2.0.0-alpha.16 + version: 2.0.0-alpha.16(@types/node@25.9.0)(jiti@2.6.1)(lightningcss@1.32.0)(postcss@8.5.6)(typescript@6.0.3) vitepress-plugin-mermaid: specifier: ^2.0.17 - version: 2.0.17(mermaid@11.12.2)(vitepress@1.6.4(@algolia/client-search@5.47.0)(jiti@2.6.1)(lightningcss@1.30.2)(postcss@8.5.6)(search-insights@2.17.3)) + version: 2.0.17(mermaid@11.12.2)(vitepress@2.0.0-alpha.16(@types/node@25.9.0)(jiti@2.6.1)(lightningcss@1.32.0)(postcss@8.5.6)(typescript@6.0.3)) vitepress-plugin-tabs: - specifier: ^0.7.3 - version: 0.7.3(vitepress@1.6.4(@algolia/client-search@5.47.0)(jiti@2.6.1)(lightningcss@1.30.2)(postcss@8.5.6)(search-insights@2.17.3))(vue@3.5.27) + specifier: ^0.8.0 + version: 0.8.0(vitepress@2.0.0-alpha.16(@types/node@25.9.0)(jiti@2.6.1)(lightningcss@1.32.0)(postcss@8.5.6)(typescript@6.0.3))(vue@3.5.27(typescript@6.0.3)) vue: specifier: ^3.5.26 - version: 3.5.27 + version: 3.5.27(typescript@6.0.3) packages: - '@algolia/abtesting@1.13.0': - resolution: {integrity: sha512-Zrqam12iorp3FjiKMXSTpedGYznZ3hTEOAr2oCxI8tbF8bS1kQHClyDYNq/eV0ewMNLyFkgZVWjaS+8spsOYiQ==} - engines: {node: '>= 14.0.0'} - - '@algolia/autocomplete-core@1.17.7': - resolution: {integrity: sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==} - - '@algolia/autocomplete-plugin-algolia-insights@1.17.7': - resolution: {integrity: sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==} - peerDependencies: - search-insights: '>= 1 < 3' - - '@algolia/autocomplete-preset-algolia@1.17.7': - resolution: {integrity: sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==} - peerDependencies: - '@algolia/client-search': '>= 4.9.1 < 6' - algoliasearch: '>= 4.9.1 < 6' - - '@algolia/autocomplete-shared@1.17.7': - resolution: {integrity: sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==} - peerDependencies: - '@algolia/client-search': '>= 4.9.1 < 6' - algoliasearch: '>= 4.9.1 < 6' - - '@algolia/client-abtesting@5.47.0': - resolution: {integrity: sha512-aOpsdlgS9xTEvz47+nXmw8m0NtUiQbvGWNuSEb7fA46iPL5FxOmOUZkh8PREBJpZ0/H8fclSc7BMJCVr+Dn72w==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-analytics@5.47.0': - resolution: {integrity: sha512-EcF4w7IvIk1sowrO7Pdy4Ako7x/S8+nuCgdk6En+u5jsaNQM4rTT09zjBPA+WQphXkA2mLrsMwge96rf6i7Mow==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-common@5.47.0': - resolution: {integrity: sha512-Wzg5Me2FqgRDj0lFuPWFK05UOWccSMsIBL2YqmTmaOzxVlLZ+oUqvKbsUSOE5ud8Fo1JU7JyiLmEXBtgDKzTwg==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-insights@5.47.0': - resolution: {integrity: sha512-Ci+cn/FDIsDxSKMRBEiyKrqybblbk8xugo6ujDN1GSTv9RIZxwxqZYuHfdLnLEwLlX7GB8pqVyqrUSlRnR+sJA==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-personalization@5.47.0': - resolution: {integrity: sha512-gsLnHPZmWcX0T3IigkDL2imCNtsQ7dR5xfnwiFsb+uTHCuYQt+IwSNjsd8tok6HLGLzZrliSaXtB5mfGBtYZvQ==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-query-suggestions@5.47.0': - resolution: {integrity: sha512-PDOw0s8WSlR2fWFjPQldEpmm/gAoUgLigvC3k/jCSi/DzigdGX6RdC0Gh1RR1P8Cbk5KOWYDuL3TNzdYwkfDyA==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-search@5.47.0': - resolution: {integrity: sha512-b5hlU69CuhnS2Rqgsz7uSW0t4VqrLMLTPbUpEl0QVz56rsSwr1Sugyogrjb493sWDA+XU1FU5m9eB8uH7MoI0g==} - engines: {node: '>= 14.0.0'} - - '@algolia/ingestion@1.47.0': - resolution: {integrity: sha512-WvwwXp5+LqIGISK3zHRApLT1xkuEk320/EGeD7uYy+K8WwDd5OjXnhjuXRhYr1685KnkvWkq1rQ/ihCJjOfHpQ==} - engines: {node: '>= 14.0.0'} - - '@algolia/monitoring@1.47.0': - resolution: {integrity: sha512-j2EUFKAlzM0TE4GRfkDE3IDfkVeJdcbBANWzK16Tb3RHz87WuDfQ9oeEW6XiRE1/bEkq2xf4MvZesvSeQrZRDA==} - engines: {node: '>= 14.0.0'} - - '@algolia/recommend@5.47.0': - resolution: {integrity: sha512-+kTSE4aQ1ARj2feXyN+DMq0CIDHJwZw1kpxIunedkmpWUg8k3TzFwWsMCzJVkF2nu1UcFbl7xsIURz3Q3XwOXA==} - engines: {node: '>= 14.0.0'} - - '@algolia/requester-browser-xhr@5.47.0': - resolution: {integrity: sha512-Ja+zPoeSA2SDowPwCNRbm5Q2mzDvVV8oqxCQ4m6SNmbKmPlCfe30zPfrt9ho3kBHnsg37pGucwOedRIOIklCHw==} - engines: {node: '>= 14.0.0'} - - '@algolia/requester-fetch@5.47.0': - resolution: {integrity: sha512-N6nOvLbaR4Ge+oVm7T4W/ea1PqcSbsHR4O58FJ31XtZjFPtOyxmnhgCmGCzP9hsJI6+x0yxJjkW5BMK/XI8OvA==} - engines: {node: '>= 14.0.0'} - - '@algolia/requester-node-http@5.47.0': - resolution: {integrity: sha512-z1oyLq5/UVkohVXNDEY70mJbT/sv/t6HYtCvCwNrOri6pxBJDomP9R83KOlwcat+xqBQEdJHjbrPh36f1avmZA==} - engines: {node: '>= 14.0.0'} - - '@alloc/quick-lru@5.2.0': - resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} - engines: {node: '>=10'} - '@antfu/install-pkg@1.1.0': resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} @@ -176,28 +93,14 @@ packages: '@chevrotain/utils@11.0.3': resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==} - '@docsearch/css@3.8.2': - resolution: {integrity: sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==} + '@docsearch/css@4.6.3': + resolution: {integrity: sha512-nlOwcXcsNAptQl4vlL4MA78qNJKO0Qlds5GuBjCoePgkebTXLSf8Qt1oyZ3YBshYupKXG9VRGEsk1zr23d+bzQ==} - '@docsearch/js@3.8.2': - resolution: {integrity: sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==} + '@docsearch/js@4.6.3': + resolution: {integrity: sha512-qUIX2b4Apew3tv4F0qhmgShsl/Lfw4m6mqv/5/5dWNxwTcDdLMp2s3YwZ+NMGh3IKCg0pBaXm7Q5VdyU5Rj+cQ==} - '@docsearch/react@3.8.2': - resolution: {integrity: sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==} - peerDependencies: - '@types/react': '>= 16.8.0 < 19.0.0' - react: '>= 16.8.0 < 19.0.0' - react-dom: '>= 16.8.0 < 19.0.0' - search-insights: '>= 1 < 3' - peerDependenciesMeta: - '@types/react': - optional: true - react: - optional: true - react-dom: - optional: true - search-insights: - optional: true + '@docsearch/sidepanel-js@4.6.3': + resolution: {integrity: sha512-grGSmvXzG0if+mrzdIKykvpIAuEQ9u0sEJ2eLRRCaQfJvsWqh2C2/aY04bIzWvDh7myi5rvl8D+tUNsVrjYQ3A==} '@esbuild/aix-ppc64@0.25.0': resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==} @@ -349,8 +252,20 @@ packages: cpu: [x64] os: [win32] - '@iconify-json/simple-icons@1.2.67': - resolution: {integrity: sha512-RGJRwlxyup54L1UDAjCshy3ckX5zcvYIU74YLSnUgHGvqh6B4mvksbGNHAIEp7dZQ6cM13RZVT5KC07CmnFNew==} + '@floating-ui/core@1.7.5': + resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} + + '@floating-ui/dom@1.7.6': + resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} + + '@floating-ui/utils@0.2.11': + resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + + '@floating-ui/vue@1.1.11': + resolution: {integrity: sha512-HzHKCNVxnGS35r9fCHBc3+uCnjw9IWIlCPL683cGgM9Kgj2BiAl8x1mS7vtvP6F9S/e/q4O6MApwSHj8hNLGfw==} + + '@iconify-json/simple-icons@1.2.83': + resolution: {integrity: sha512-6Pp9V++XisT9RKH7FB4RLPqUDzcmLtSma0ovOEIoEWGrXtHwBFsH7oN1z8vvCVCb95fb87QgR46/zRLyN9Y3kg==} '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} @@ -358,6 +273,17 @@ packages: '@iconify/utils@3.1.0': resolution: {integrity: sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==} + '@iconify/vue@5.0.1': + resolution: {integrity: sha512-aumwwooJlFJ5H5qYWB6ZTAyM0C8hpfcSVLB9/a3qnH1GGvIJ+FEbpEs4s/HfErYe/M5qZeLjwmESR5fFm3lXEw==} + peerDependencies: + vue: '>=3.0.0' + + '@internationalized/date@3.12.1': + resolution: {integrity: sha512-6IedsVWXyq4P9Tj+TxuU8WGWM70hYLl12nbYU8jkikVpa6WXapFazPUcHUMDMoWftIDE2ILDkFFte6W2nFCkRQ==} + + '@internationalized/number@3.6.6': + resolution: {integrity: sha512-iFgmQaXHE0vytNfpLZWOC2mEJCBRzcUxt53Xf/yCXG93lRvqas237i3r7X4RKMwO3txiyZD4mQjKAByFv6UGSQ==} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -380,6 +306,12 @@ packages: '@mermaid-js/parser@0.6.3': resolution: {integrity: sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA==} + '@rive-app/canvas-lite@2.37.7': + resolution: {integrity: sha512-PPxFyPZ85NfB260tDqynU2yajlZRvujc1qFR7GB3b+7etnmumTPtCmYyjkkj2m0ZXVjPpuf97TkqSsZ4sgXb3w==} + + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + '@rollup/rollup-android-arm-eabi@4.59.0': resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==} cpu: [arm] @@ -518,93 +450,96 @@ packages: cpu: [x64] os: [win32] - '@shikijs/core@2.5.0': - resolution: {integrity: sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==} + '@shikijs/core@3.23.0': + resolution: {integrity: sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==} - '@shikijs/engine-javascript@2.5.0': - resolution: {integrity: sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==} + '@shikijs/engine-javascript@3.23.0': + resolution: {integrity: sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==} - '@shikijs/engine-oniguruma@2.5.0': - resolution: {integrity: sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==} + '@shikijs/engine-oniguruma@3.23.0': + resolution: {integrity: sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==} - '@shikijs/langs@2.5.0': - resolution: {integrity: sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==} + '@shikijs/langs@3.23.0': + resolution: {integrity: sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==} - '@shikijs/themes@2.5.0': - resolution: {integrity: sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==} + '@shikijs/themes@3.23.0': + resolution: {integrity: sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==} - '@shikijs/transformers@2.5.0': - resolution: {integrity: sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==} + '@shikijs/transformers@3.23.0': + resolution: {integrity: sha512-F9msZVxdF+krQNSdQ4V+Ja5QemeAoTQ2jxt7nJCwhDsdF1JWS3KxIQXA3lQbyKwS3J61oHRUSv4jYWv3CkaKTQ==} - '@shikijs/types@2.5.0': - resolution: {integrity: sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==} + '@shikijs/types@3.23.0': + resolution: {integrity: sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==} '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - '@tailwindcss/node@4.1.18': - resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==} + '@swc/helpers@0.5.21': + resolution: {integrity: sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==} - '@tailwindcss/oxide-android-arm64@4.1.18': - resolution: {integrity: sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==} - engines: {node: '>= 10'} + '@tailwindcss/node@4.3.0': + resolution: {integrity: sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==} + + '@tailwindcss/oxide-android-arm64@4.3.0': + resolution: {integrity: sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==} + engines: {node: '>= 20'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.1.18': - resolution: {integrity: sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-darwin-arm64@4.3.0': + resolution: {integrity: sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==} + engines: {node: '>= 20'} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.1.18': - resolution: {integrity: sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-darwin-x64@4.3.0': + resolution: {integrity: sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==} + engines: {node: '>= 20'} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.1.18': - resolution: {integrity: sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-freebsd-x64@4.3.0': + resolution: {integrity: sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==} + engines: {node: '>= 20'} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': - resolution: {integrity: sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': + resolution: {integrity: sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==} + engines: {node: '>= 20'} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': - resolution: {integrity: sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': + resolution: {integrity: sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==} + engines: {node: '>= 20'} cpu: [arm64] os: [linux] libc: [glibc] - '@tailwindcss/oxide-linux-arm64-musl@4.1.18': - resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': + resolution: {integrity: sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==} + engines: {node: '>= 20'} cpu: [arm64] os: [linux] libc: [musl] - '@tailwindcss/oxide-linux-x64-gnu@4.1.18': - resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': + resolution: {integrity: sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==} + engines: {node: '>= 20'} cpu: [x64] os: [linux] libc: [glibc] - '@tailwindcss/oxide-linux-x64-musl@4.1.18': - resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-linux-x64-musl@4.3.0': + resolution: {integrity: sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==} + engines: {node: '>= 20'} cpu: [x64] os: [linux] libc: [musl] - '@tailwindcss/oxide-wasm32-wasi@4.1.18': - resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==} + '@tailwindcss/oxide-wasm32-wasi@4.3.0': + resolution: {integrity: sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==} engines: {node: '>=14.0.0'} cpu: [wasm32] bundledDependencies: @@ -615,24 +550,39 @@ packages: - '@emnapi/wasi-threads' - tslib - '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': - resolution: {integrity: sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': + resolution: {integrity: sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==} + engines: {node: '>= 20'} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.1.18': - resolution: {integrity: sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': + resolution: {integrity: sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==} + engines: {node: '>= 20'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.1.18': - resolution: {integrity: sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==} - engines: {node: '>= 10'} + '@tailwindcss/oxide@4.3.0': + resolution: {integrity: sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==} + engines: {node: '>= 20'} - '@tailwindcss/postcss@4.1.18': - resolution: {integrity: sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==} + '@tailwindcss/typography@0.5.19': + resolution: {integrity: sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' + + '@tailwindcss/vite@4.3.0': + resolution: {integrity: sha512-t6J3OrB5Fc0ExuhohouH0fWUGMYL6PTLhW+E7zIk/pdbnJARZDCwjBznFnkh5ynRnIRSI4YjtTH0t6USjJISrw==} + peerDependencies: + vite: 6.4.2 + + '@tanstack/virtual-core@3.14.0': + resolution: {integrity: sha512-JLANqGy/D6k4Ujmh8Tr25lGimuOXNiaVyXaCAZS0W+1390sADdGnyUdSWNIfd49gebtIxGMij4IktRVzrdr12Q==} + + '@tanstack/vue-virtual@3.13.24': + resolution: {integrity: sha512-A0k2qF0zFSUStXSZkGXABouXr2Tw2Ztl/cVIYG9qy84uR8W7UNjAcX3DvzBS3YnDcwvLxab8v7dbmYBZ39itDA==} + peerDependencies: + vue: ^2.7.0 || ^3.0.0 '@types/d3-array@3.2.2': resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} @@ -748,6 +698,9 @@ packages: '@types/mdurl@2.0.0': resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + '@types/node@25.9.0': + resolution: {integrity: sha512-AOQwYUNolgy3VosiRqXrACUXTN8nJUtPl7FJXMqZVyxiiCLhQuG3jXKvCS1ALr+Y2OmZhzzLVlYPEqJaiqkaJQ==} + '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -759,14 +712,21 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + deprecated: Potential CWE-502 - Update to 1.3.1 or higher - '@vitejs/plugin-vue@5.2.4': - resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} - engines: {node: ^18.0.0 || >=20.0.0} + '@vitejs/plugin-vue@6.0.7': + resolution: {integrity: sha512-km+p+XdSz9Sxm5rqUbqcSfZYaAniKxWBj1KURl+Jr7UaPvvX7BmaWMdP69I5rrFDeQGyxAG7NXdc57vz+snhWg==} + engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: vite: 6.4.2 vue: ^3.2.25 + '@voidzero-dev/vitepress-theme@4.8.4': + resolution: {integrity: sha512-o7R2g9OPu5iLW3R4PNkj+JRSIncO8f1hTY0YvO13OMP/kytKUn8MLhy4kTvx+IMRSLeqrGfrBpze/OEPKzcLUQ==} + peerDependencies: + vitepress: ^2.0.0-alpha.16 + vue: ^3.5.0 + '@vue/compiler-core@3.5.27': resolution: {integrity: sha512-gnSBQjZA+//qDZen+6a2EdHqJ68Z7uybrMf3SPjEGgG4dicklwDVmMC1AeIHxtLVPT7sn6sH1KOO+tS6gwOUeQ==} @@ -779,14 +739,14 @@ packages: '@vue/compiler-ssr@3.5.27': resolution: {integrity: sha512-Sj7h+JHt512fV1cTxKlYhg7qxBvack+BGncSpH+8vnN+KN95iPIcqB5rsbblX40XorP+ilO7VIKlkuu3Xq2vjw==} - '@vue/devtools-api@7.7.9': - resolution: {integrity: sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==} + '@vue/devtools-api@8.1.2': + resolution: {integrity: sha512-vA0O112YqyDuNA1s7Yb2gCgToQ/OxOWiFDO5ThLCcDy0ldHnSd1dUTaSYhOldbqoNgumE4dxtGAoAaSUKUD1Zg==} - '@vue/devtools-kit@7.7.9': - resolution: {integrity: sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==} + '@vue/devtools-kit@8.1.2': + resolution: {integrity: sha512-f75/upc+GCyjXErpgPGz4582ujS0L/adAltGy+tqXMGUJpgAcfGr6CxnnhpZY8BHuMYt6KpbF8uaFrrQG66rGQ==} - '@vue/devtools-shared@7.7.9': - resolution: {integrity: sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==} + '@vue/devtools-shared@8.1.2': + resolution: {integrity: sha512-X9RyVFYAdkBe4IUf5v48TxBF/6QPmF8CmWrDAjXzfUHrgQ/HGfTC1A6TqgXqZ03ye66l3AD51BAGD69IvKM9sw==} '@vue/reactivity@3.5.27': resolution: {integrity: sha512-vvorxn2KXfJ0nBEnj4GYshSgsyMNFnIQah/wczXlsNXt+ijhugmW+PpJ2cNPe4V6jpnBcs0MhCODKllWG+nvoQ==} @@ -805,24 +765,27 @@ packages: '@vue/shared@3.5.27': resolution: {integrity: sha512-dXr/3CgqXsJkZ0n9F3I4elY8wM9jMJpP3pvRG52r6m0tu/MsAFIe6JpXVGeNMd/D9F4hQynWT8Rfuj0bdm9kFQ==} - '@vueuse/core@12.8.2': - resolution: {integrity: sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==} + '@vueuse/core@14.3.0': + resolution: {integrity: sha512-aHfz47g0ZhMtTVHmIzMVpJy8ePhhOy68GY5bv110+5DVtZ+W7BsOx+m61UNQqfrWyPztIHIanWa3E2tib3NFIw==} + peerDependencies: + vue: ^3.5.0 - '@vueuse/integrations@12.8.2': - resolution: {integrity: sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==} + '@vueuse/integrations@14.3.0': + resolution: {integrity: sha512-76I5FT2ESvCmCaSwapI+a/u/CFtNXmzl9f9lNp1hRtx8vKB8hfiokJr8IvQqcQG5ckGXElyXK516b54ozV3MvA==} peerDependencies: async-validator: ^4 axios: ^1 change-case: ^5 drauu: ^0.4 - focus-trap: ^7 + focus-trap: ^7 || ^8 fuse.js: ^7 idb-keyval: ^6 jwt-decode: ^4 nprogress: ^0.2 qrcode: ^1.5 sortablejs: ^1 - universal-cookie: ^7 + universal-cookie: ^7 || ^8 + vue: ^3.5.0 peerDependenciesMeta: async-validator: optional: true @@ -849,43 +812,26 @@ packages: universal-cookie: optional: true - '@vueuse/metadata@12.8.2': - resolution: {integrity: sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==} + '@vueuse/metadata@14.3.0': + resolution: {integrity: sha512-BwxmbAzwAVF50+MW57GXOUEV61nFBGnlBvrTqj49PqWJu3uw7hdu72ztXeZ33RdZtDY6kO+bfCAE1PCn88Tktw==} - '@vueuse/shared@12.8.2': - resolution: {integrity: sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==} + '@vueuse/shared@14.3.0': + resolution: {integrity: sha512-bZpge9eSXwa4ToSiqJ7j6KRwhAsneMFoSz3LMWKQDkqimm3D/tbFlrklrs/IOqC8tEcYmXQZJ6N0UrjhBirVCg==} + peerDependencies: + vue: ^3.5.0 acorn@8.15.0: resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true - algoliasearch@5.47.0: - resolution: {integrity: sha512-AGtz2U7zOV4DlsuYV84tLp2tBbA7RPtLA44jbVH4TTpDcc1dIWmULjHSsunlhscbzDydnjuFlNhflR3nV4VJaQ==} - engines: {node: '>= 14.0.0'} - - autoprefixer@10.4.23: - resolution: {integrity: sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 - - baseline-browser-mapping@2.9.17: - resolution: {integrity: sha512-agD0MgJFUP/4nvjqzIB29zRPUuCF7Ge6mEv9s8dHrtYD7QWXRcx75rOADE/d5ah1NI+0vkDl0yorDd5U852IQQ==} - hasBin: true + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} birpc@2.9.0: resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} - browserslist@4.28.1: - resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - - caniuse-lite@1.0.30001766: - resolution: {integrity: sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==} - ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -917,16 +863,17 @@ packages: confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - copy-anything@4.0.5: - resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==} - engines: {node: '>=18'} - cose-base@1.0.3: resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} cose-base@2.2.0: resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} @@ -1089,6 +1036,9 @@ packages: dayjs@1.11.19: resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + delaunator@5.0.1: resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} @@ -1106,14 +1056,8 @@ packages: dompurify@3.4.0: resolution: {integrity: sha512-nolgK9JcaUXMSmW+j1yaSvaEaoXYHwWyGJlkoCTghc97KgGDDSnpoU/PlEnw63Ah+TGKFOyY+X5LnxaWbCSfXg==} - electron-to-chromium@1.5.277: - resolution: {integrity: sha512-wKXFZw4erWmmOz5N/grBoJ2XrNJGDFMu2+W5ACHza5rHtvsqrK4gb6rnLC7XxKB9WlJ+RmyQatuEXmtm86xbnw==} - - emoji-regex-xs@1.0.0: - resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} - - enhanced-resolve@5.18.4: - resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} + enhanced-resolve@5.21.5: + resolution: {integrity: sha512-mLCNbrQli11K1ySUmuNt4ZUB3OpGIDq4q2vTBTf5cL2lpsRjI9QKqSD0ndjW8FyvcW/Jj46gMe9syyHAsvMa/A==} engines: {node: '>=10.13.0'} entities@7.0.1: @@ -1125,10 +1069,6 @@ packages: engines: {node: '>=18'} hasBin: true - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} @@ -1144,9 +1084,6 @@ packages: focus-trap@7.8.0: resolution: {integrity: sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==} - fraction.js@5.3.4: - resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1181,10 +1118,6 @@ packages: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} - is-what@5.5.0: - resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==} - engines: {node: '>=18'} - jiti@2.6.1: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true @@ -1206,78 +1139,78 @@ packages: layout-base@2.0.1: resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} - lightningcss-android-arm64@1.30.2: - resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [android] - lightningcss-darwin-arm64@1.30.2: - resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] - lightningcss-darwin-x64@1.30.2: - resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] - lightningcss-freebsd-x64@1.30.2: - resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] - lightningcss-linux-arm-gnueabihf@1.30.2: - resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] - lightningcss-linux-arm64-gnu@1.30.2: - resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [glibc] - lightningcss-linux-arm64-musl@1.30.2: - resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [musl] - lightningcss-linux-x64-gnu@1.30.2: - resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [glibc] - lightningcss-linux-x64-musl@1.30.2: - resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [musl] - lightningcss-win32-arm64-msvc@1.30.2: - resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] - lightningcss-win32-x64-msvc@1.30.2: - resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] - lightningcss@1.30.2: - resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} engines: {node: '>= 12.0.0'} lodash-es@4.18.1: @@ -1326,9 +1259,6 @@ packages: minisearch@7.2.0: resolution: {integrity: sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==} - mitt@3.0.1: - resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} - mlly@1.8.0: resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} @@ -1337,14 +1267,17 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - node-releases@2.0.27: - resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} - non-layered-tidy-tree-layout@2.0.2: resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} - oniguruma-to-es@3.1.1: - resolution: {integrity: sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==} + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + + oniguruma-parser@0.12.2: + resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} + + oniguruma-to-es@4.3.6: + resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} package-manager-detector@1.6.0: resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} @@ -1355,8 +1288,8 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - perfect-debounce@1.0.0: - resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + perfect-debounce@2.1.0: + resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -1374,16 +1307,14 @@ packages: points-on-path@0.2.1: resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} - postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} postcss@8.5.6: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - preact@10.28.2: - resolution: {integrity: sha512-lbteaWGzGHdlIuiJ0l2Jq454m6kcpI1zNje6d8MlGAFlYvP2GO4ibnat7P74Esfz4sPTdM6UxtTwh/d3pwM9JA==} - prettier@3.8.1: resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} engines: {node: '>=14'} @@ -1401,8 +1332,10 @@ packages: regex@6.1.0: resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} - rfdc@1.4.1: - resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + reka-ui@2.9.7: + resolution: {integrity: sha512-aX7foYYR20v4+majO58OJJdBNfLMm0eJb448l9N4JVy8JB7GXOr4H/S4a+J1pkcoxZH8Cb7YHpJ855+miAm7sA==} + peerDependencies: + vue: '>= 3.4.0' robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} @@ -1421,11 +1354,8 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - search-insights@2.17.3: - resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} - - shiki@2.5.0: - resolution: {integrity: sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==} + shiki@3.23.0: + resolution: {integrity: sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==} source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} @@ -1434,28 +1364,23 @@ packages: space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - speakingurl@14.0.1: - resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} - engines: {node: '>=0.10.0'} - stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} stylis@4.3.6: resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} - superjson@2.2.6: - resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==} - engines: {node: '>=16'} - tabbable@6.4.0: resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} tailwindcss@4.1.18: resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==} - tapable@2.3.0: - resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + tailwindcss@4.3.0: + resolution: {integrity: sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==} + + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} tinyexec@1.0.2: @@ -1473,9 +1398,20 @@ packages: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} engines: {node: '>=6.10'} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} + engines: {node: '>=14.17'} + hasBin: true + ufo@1.6.3: resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} + undici-types@7.24.6: + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + unist-util-is@6.0.1: resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} @@ -1491,11 +1427,8 @@ packages: unist-util-visit@5.1.0: resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} - update-browserslist-db@1.2.3: - resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} uuid@11.1.0: resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} @@ -1553,21 +1486,24 @@ packages: mermaid: 10 || 11 vitepress: ^1.0.0 || ^1.0.0-alpha - vitepress-plugin-tabs@0.7.3: - resolution: {integrity: sha512-CkUz49UrTLcVOszuiHIA7ZBvfsg9RluRkFjRG1KvCg/NwuOTLZwcBRv7vBB3vMlDp0bWXIFOIwdI7bE93cV3Hw==} + vitepress-plugin-tabs@0.8.0: + resolution: {integrity: sha512-86FWHAuS9XCyTMDpMd5MELwp3bQyITDf/+IdZ20+iYbB8TIR8yoCp08PkDHxi4WWSVsCZ3n1uUIC7YCVhMsI3A==} peerDependencies: vitepress: ^1.0.0 vue: ^3.5.0 - vitepress@1.6.4: - resolution: {integrity: sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==} + vitepress@2.0.0-alpha.16: + resolution: {integrity: sha512-w1nwsefDVIsje7BZr2tsKxkZutDGjG0YoQ2yxO7+a9tvYVqfljYbwj5LMYkPy8Tb7YbPwa22HtIhk62jbrvuEQ==} hasBin: true peerDependencies: markdown-it-mathjax3: ^4 + oxc-minify: '*' postcss: ^8 peerDependenciesMeta: markdown-it-mathjax3: optional: true + oxc-minify: + optional: true postcss: optional: true @@ -1591,6 +1527,17 @@ packages: vscode-uri@3.0.8: resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + vue@3.5.27: resolution: {integrity: sha512-aJ/UtoEyFySPBGarREmN4z6qNKpbEguYHMmXSiOGk69czc+zhs0NF6tEFrY8TZKAl8N/LYAkd4JHVd5E/AsSmw==} peerDependencies: @@ -1604,120 +1551,6 @@ packages: snapshots: - '@algolia/abtesting@1.13.0': - dependencies: - '@algolia/client-common': 5.47.0 - '@algolia/requester-browser-xhr': 5.47.0 - '@algolia/requester-fetch': 5.47.0 - '@algolia/requester-node-http': 5.47.0 - - '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.47.0)(algoliasearch@5.47.0)(search-insights@2.17.3)': - dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.47.0)(algoliasearch@5.47.0)(search-insights@2.17.3) - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.47.0)(algoliasearch@5.47.0) - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - - search-insights - - '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.47.0)(algoliasearch@5.47.0)(search-insights@2.17.3)': - dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.47.0)(algoliasearch@5.47.0) - search-insights: 2.17.3 - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - - '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.47.0)(algoliasearch@5.47.0)': - dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.47.0)(algoliasearch@5.47.0) - '@algolia/client-search': 5.47.0 - algoliasearch: 5.47.0 - - '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.47.0)(algoliasearch@5.47.0)': - dependencies: - '@algolia/client-search': 5.47.0 - algoliasearch: 5.47.0 - - '@algolia/client-abtesting@5.47.0': - dependencies: - '@algolia/client-common': 5.47.0 - '@algolia/requester-browser-xhr': 5.47.0 - '@algolia/requester-fetch': 5.47.0 - '@algolia/requester-node-http': 5.47.0 - - '@algolia/client-analytics@5.47.0': - dependencies: - '@algolia/client-common': 5.47.0 - '@algolia/requester-browser-xhr': 5.47.0 - '@algolia/requester-fetch': 5.47.0 - '@algolia/requester-node-http': 5.47.0 - - '@algolia/client-common@5.47.0': {} - - '@algolia/client-insights@5.47.0': - dependencies: - '@algolia/client-common': 5.47.0 - '@algolia/requester-browser-xhr': 5.47.0 - '@algolia/requester-fetch': 5.47.0 - '@algolia/requester-node-http': 5.47.0 - - '@algolia/client-personalization@5.47.0': - dependencies: - '@algolia/client-common': 5.47.0 - '@algolia/requester-browser-xhr': 5.47.0 - '@algolia/requester-fetch': 5.47.0 - '@algolia/requester-node-http': 5.47.0 - - '@algolia/client-query-suggestions@5.47.0': - dependencies: - '@algolia/client-common': 5.47.0 - '@algolia/requester-browser-xhr': 5.47.0 - '@algolia/requester-fetch': 5.47.0 - '@algolia/requester-node-http': 5.47.0 - - '@algolia/client-search@5.47.0': - dependencies: - '@algolia/client-common': 5.47.0 - '@algolia/requester-browser-xhr': 5.47.0 - '@algolia/requester-fetch': 5.47.0 - '@algolia/requester-node-http': 5.47.0 - - '@algolia/ingestion@1.47.0': - dependencies: - '@algolia/client-common': 5.47.0 - '@algolia/requester-browser-xhr': 5.47.0 - '@algolia/requester-fetch': 5.47.0 - '@algolia/requester-node-http': 5.47.0 - - '@algolia/monitoring@1.47.0': - dependencies: - '@algolia/client-common': 5.47.0 - '@algolia/requester-browser-xhr': 5.47.0 - '@algolia/requester-fetch': 5.47.0 - '@algolia/requester-node-http': 5.47.0 - - '@algolia/recommend@5.47.0': - dependencies: - '@algolia/client-common': 5.47.0 - '@algolia/requester-browser-xhr': 5.47.0 - '@algolia/requester-fetch': 5.47.0 - '@algolia/requester-node-http': 5.47.0 - - '@algolia/requester-browser-xhr@5.47.0': - dependencies: - '@algolia/client-common': 5.47.0 - - '@algolia/requester-fetch@5.47.0': - dependencies: - '@algolia/client-common': 5.47.0 - - '@algolia/requester-node-http@5.47.0': - dependencies: - '@algolia/client-common': 5.47.0 - - '@alloc/quick-lru@5.2.0': {} - '@antfu/install-pkg@1.1.0': dependencies: package-manager-detector: 1.6.0 @@ -1758,29 +1591,11 @@ snapshots: '@chevrotain/utils@11.0.3': {} - '@docsearch/css@3.8.2': {} + '@docsearch/css@4.6.3': {} - '@docsearch/js@3.8.2(@algolia/client-search@5.47.0)(search-insights@2.17.3)': - dependencies: - '@docsearch/react': 3.8.2(@algolia/client-search@5.47.0)(search-insights@2.17.3) - preact: 10.28.2 - transitivePeerDependencies: - - '@algolia/client-search' - - '@types/react' - - react - - react-dom - - search-insights - - '@docsearch/react@3.8.2(@algolia/client-search@5.47.0)(search-insights@2.17.3)': - dependencies: - '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.47.0)(algoliasearch@5.47.0)(search-insights@2.17.3) - '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.47.0)(algoliasearch@5.47.0) - '@docsearch/css': 3.8.2 - algoliasearch: 5.47.0 - optionalDependencies: - search-insights: 2.17.3 - transitivePeerDependencies: - - '@algolia/client-search' + '@docsearch/js@4.6.3': {} + + '@docsearch/sidepanel-js@4.6.3': {} '@esbuild/aix-ppc64@0.25.0': optional: true @@ -1857,7 +1672,27 @@ snapshots: '@esbuild/win32-x64@0.25.0': optional: true - '@iconify-json/simple-icons@1.2.67': + '@floating-ui/core@1.7.5': + dependencies: + '@floating-ui/utils': 0.2.11 + + '@floating-ui/dom@1.7.6': + dependencies: + '@floating-ui/core': 1.7.5 + '@floating-ui/utils': 0.2.11 + + '@floating-ui/utils@0.2.11': {} + + '@floating-ui/vue@1.1.11(vue@3.5.27(typescript@6.0.3))': + dependencies: + '@floating-ui/dom': 1.7.6 + '@floating-ui/utils': 0.2.11 + vue-demi: 0.14.10(vue@3.5.27(typescript@6.0.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@iconify-json/simple-icons@1.2.83': dependencies: '@iconify/types': 2.0.0 @@ -1869,6 +1704,19 @@ snapshots: '@iconify/types': 2.0.0 mlly: 1.8.0 + '@iconify/vue@5.0.1(vue@3.5.27(typescript@6.0.3))': + dependencies: + '@iconify/types': 2.0.0 + vue: 3.5.27(typescript@6.0.3) + + '@internationalized/date@3.12.1': + dependencies: + '@swc/helpers': 0.5.21 + + '@internationalized/number@3.6.6': + dependencies: + '@swc/helpers': 0.5.21 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -1903,6 +1751,10 @@ snapshots: dependencies: langium: 3.3.1 + '@rive-app/canvas-lite@2.37.7': {} + + '@rolldown/pluginutils@1.0.1': {} + '@rollup/rollup-android-arm-eabi@4.59.0': optional: true @@ -1978,115 +1830,128 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.59.0': optional: true - '@shikijs/core@2.5.0': + '@shikijs/core@3.23.0': dependencies: - '@shikijs/engine-javascript': 2.5.0 - '@shikijs/engine-oniguruma': 2.5.0 - '@shikijs/types': 2.5.0 + '@shikijs/types': 3.23.0 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 hast-util-to-html: 9.0.5 - '@shikijs/engine-javascript@2.5.0': + '@shikijs/engine-javascript@3.23.0': dependencies: - '@shikijs/types': 2.5.0 + '@shikijs/types': 3.23.0 '@shikijs/vscode-textmate': 10.0.2 - oniguruma-to-es: 3.1.1 + oniguruma-to-es: 4.3.6 - '@shikijs/engine-oniguruma@2.5.0': + '@shikijs/engine-oniguruma@3.23.0': dependencies: - '@shikijs/types': 2.5.0 + '@shikijs/types': 3.23.0 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/langs@2.5.0': + '@shikijs/langs@3.23.0': dependencies: - '@shikijs/types': 2.5.0 + '@shikijs/types': 3.23.0 - '@shikijs/themes@2.5.0': + '@shikijs/themes@3.23.0': dependencies: - '@shikijs/types': 2.5.0 + '@shikijs/types': 3.23.0 - '@shikijs/transformers@2.5.0': + '@shikijs/transformers@3.23.0': dependencies: - '@shikijs/core': 2.5.0 - '@shikijs/types': 2.5.0 + '@shikijs/core': 3.23.0 + '@shikijs/types': 3.23.0 - '@shikijs/types@2.5.0': + '@shikijs/types@3.23.0': dependencies: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 '@shikijs/vscode-textmate@10.0.2': {} - '@tailwindcss/node@4.1.18': + '@swc/helpers@0.5.21': + dependencies: + tslib: 2.8.1 + + '@tailwindcss/node@4.3.0': dependencies: '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.18.4 + enhanced-resolve: 5.21.5 jiti: 2.6.1 - lightningcss: 1.30.2 + lightningcss: 1.32.0 magic-string: 0.30.21 source-map-js: 1.2.1 - tailwindcss: 4.1.18 + tailwindcss: 4.3.0 - '@tailwindcss/oxide-android-arm64@4.1.18': + '@tailwindcss/oxide-android-arm64@4.3.0': optional: true - '@tailwindcss/oxide-darwin-arm64@4.1.18': + '@tailwindcss/oxide-darwin-arm64@4.3.0': optional: true - '@tailwindcss/oxide-darwin-x64@4.1.18': + '@tailwindcss/oxide-darwin-x64@4.3.0': optional: true - '@tailwindcss/oxide-freebsd-x64@4.1.18': + '@tailwindcss/oxide-freebsd-x64@4.3.0': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.1.18': + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.1.18': + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.1.18': + '@tailwindcss/oxide-linux-x64-musl@4.3.0': optional: true - '@tailwindcss/oxide-wasm32-wasi@4.1.18': + '@tailwindcss/oxide-wasm32-wasi@4.3.0': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': + '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.1.18': + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': optional: true - '@tailwindcss/oxide@4.1.18': + '@tailwindcss/oxide@4.3.0': optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.1.18 - '@tailwindcss/oxide-darwin-arm64': 4.1.18 - '@tailwindcss/oxide-darwin-x64': 4.1.18 - '@tailwindcss/oxide-freebsd-x64': 4.1.18 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.18 - '@tailwindcss/oxide-linux-arm64-gnu': 4.1.18 - '@tailwindcss/oxide-linux-arm64-musl': 4.1.18 - '@tailwindcss/oxide-linux-x64-gnu': 4.1.18 - '@tailwindcss/oxide-linux-x64-musl': 4.1.18 - '@tailwindcss/oxide-wasm32-wasi': 4.1.18 - '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18 - '@tailwindcss/oxide-win32-x64-msvc': 4.1.18 - - '@tailwindcss/postcss@4.1.18': - dependencies: - '@alloc/quick-lru': 5.2.0 - '@tailwindcss/node': 4.1.18 - '@tailwindcss/oxide': 4.1.18 - postcss: 8.5.6 + '@tailwindcss/oxide-android-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-x64': 4.3.0 + '@tailwindcss/oxide-freebsd-x64': 4.3.0 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.0 + '@tailwindcss/oxide-linux-arm64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-arm64-musl': 4.3.0 + '@tailwindcss/oxide-linux-x64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-x64-musl': 4.3.0 + '@tailwindcss/oxide-wasm32-wasi': 4.3.0 + '@tailwindcss/oxide-win32-arm64-msvc': 4.3.0 + '@tailwindcss/oxide-win32-x64-msvc': 4.3.0 + + '@tailwindcss/typography@0.5.19(tailwindcss@4.1.18)': + dependencies: + postcss-selector-parser: 6.0.10 tailwindcss: 4.1.18 + '@tailwindcss/vite@4.3.0(vite@6.4.2(@types/node@25.9.0)(jiti@2.6.1)(lightningcss@1.32.0))': + dependencies: + '@tailwindcss/node': 4.3.0 + '@tailwindcss/oxide': 4.3.0 + tailwindcss: 4.3.0 + vite: 6.4.2(@types/node@25.9.0)(jiti@2.6.1)(lightningcss@1.32.0) + + '@tanstack/virtual-core@3.14.0': {} + + '@tanstack/vue-virtual@3.13.24(vue@3.5.27(typescript@6.0.3))': + dependencies: + '@tanstack/virtual-core': 3.14.0 + vue: 3.5.27(typescript@6.0.3) + '@types/d3-array@3.2.2': {} '@types/d3-axis@3.0.6': @@ -2225,6 +2090,10 @@ snapshots: '@types/mdurl@2.0.0': {} + '@types/node@25.9.0': + dependencies: + undici-types: 7.24.6 + '@types/trusted-types@2.0.7': optional: true @@ -2234,10 +2103,46 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-vue@5.2.4(vite@6.4.2(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.27)': + '@vitejs/plugin-vue@6.0.7(vite@6.4.2(@types/node@25.9.0)(jiti@2.6.1)(lightningcss@1.32.0))(vue@3.5.27(typescript@6.0.3))': dependencies: - vite: 6.4.2(jiti@2.6.1)(lightningcss@1.30.2) - vue: 3.5.27 + '@rolldown/pluginutils': 1.0.1 + vite: 6.4.2(@types/node@25.9.0)(jiti@2.6.1)(lightningcss@1.32.0) + vue: 3.5.27(typescript@6.0.3) + + '@voidzero-dev/vitepress-theme@4.8.4(focus-trap@7.8.0)(vite@6.4.2(@types/node@25.9.0)(jiti@2.6.1)(lightningcss@1.32.0))(vitepress@2.0.0-alpha.16(@types/node@25.9.0)(jiti@2.6.1)(lightningcss@1.32.0)(postcss@8.5.6)(typescript@6.0.3))(vue@3.5.27(typescript@6.0.3))': + dependencies: + '@docsearch/css': 4.6.3 + '@docsearch/js': 4.6.3 + '@docsearch/sidepanel-js': 4.6.3 + '@iconify/vue': 5.0.1(vue@3.5.27(typescript@6.0.3)) + '@rive-app/canvas-lite': 2.37.7 + '@tailwindcss/typography': 0.5.19(tailwindcss@4.1.18) + '@tailwindcss/vite': 4.3.0(vite@6.4.2(@types/node@25.9.0)(jiti@2.6.1)(lightningcss@1.32.0)) + '@vue/shared': 3.5.27 + '@vueuse/core': 14.3.0(vue@3.5.27(typescript@6.0.3)) + '@vueuse/integrations': 14.3.0(focus-trap@7.8.0)(vue@3.5.27(typescript@6.0.3)) + '@vueuse/shared': 14.3.0(vue@3.5.27(typescript@6.0.3)) + mark.js: 8.11.1 + minisearch: 7.2.0 + reka-ui: 2.9.7(vue@3.5.27(typescript@6.0.3)) + tailwindcss: 4.1.18 + vitepress: 2.0.0-alpha.16(@types/node@25.9.0)(jiti@2.6.1)(lightningcss@1.32.0)(postcss@8.5.6)(typescript@6.0.3) + vue: 3.5.27(typescript@6.0.3) + transitivePeerDependencies: + - '@vue/composition-api' + - async-validator + - axios + - change-case + - drauu + - focus-trap + - fuse.js + - idb-keyval + - jwt-decode + - nprogress + - qrcode + - sortablejs + - universal-cookie + - vite '@vue/compiler-core@3.5.27': dependencies: @@ -2269,23 +2174,18 @@ snapshots: '@vue/compiler-dom': 3.5.27 '@vue/shared': 3.5.27 - '@vue/devtools-api@7.7.9': + '@vue/devtools-api@8.1.2': dependencies: - '@vue/devtools-kit': 7.7.9 + '@vue/devtools-kit': 8.1.2 - '@vue/devtools-kit@7.7.9': + '@vue/devtools-kit@8.1.2': dependencies: - '@vue/devtools-shared': 7.7.9 + '@vue/devtools-shared': 8.1.2 birpc: 2.9.0 hookable: 5.5.3 - mitt: 3.0.1 - perfect-debounce: 1.0.0 - speakingurl: 14.0.1 - superjson: 2.2.6 + perfect-debounce: 2.1.0 - '@vue/devtools-shared@7.7.9': - dependencies: - rfdc: 1.4.1 + '@vue/devtools-shared@8.1.2': {} '@vue/reactivity@3.5.27': dependencies: @@ -2303,82 +2203,42 @@ snapshots: '@vue/shared': 3.5.27 csstype: 3.2.3 - '@vue/server-renderer@3.5.27(vue@3.5.27)': + '@vue/server-renderer@3.5.27(vue@3.5.27(typescript@6.0.3))': dependencies: '@vue/compiler-ssr': 3.5.27 '@vue/shared': 3.5.27 - vue: 3.5.27 + vue: 3.5.27(typescript@6.0.3) '@vue/shared@3.5.27': {} - '@vueuse/core@12.8.2': + '@vueuse/core@14.3.0(vue@3.5.27(typescript@6.0.3))': dependencies: '@types/web-bluetooth': 0.0.21 - '@vueuse/metadata': 12.8.2 - '@vueuse/shared': 12.8.2 - vue: 3.5.27 - transitivePeerDependencies: - - typescript + '@vueuse/metadata': 14.3.0 + '@vueuse/shared': 14.3.0(vue@3.5.27(typescript@6.0.3)) + vue: 3.5.27(typescript@6.0.3) - '@vueuse/integrations@12.8.2(focus-trap@7.8.0)': + '@vueuse/integrations@14.3.0(focus-trap@7.8.0)(vue@3.5.27(typescript@6.0.3))': dependencies: - '@vueuse/core': 12.8.2 - '@vueuse/shared': 12.8.2 - vue: 3.5.27 + '@vueuse/core': 14.3.0(vue@3.5.27(typescript@6.0.3)) + '@vueuse/shared': 14.3.0(vue@3.5.27(typescript@6.0.3)) + vue: 3.5.27(typescript@6.0.3) optionalDependencies: focus-trap: 7.8.0 - transitivePeerDependencies: - - typescript - '@vueuse/metadata@12.8.2': {} + '@vueuse/metadata@14.3.0': {} - '@vueuse/shared@12.8.2': + '@vueuse/shared@14.3.0(vue@3.5.27(typescript@6.0.3))': dependencies: - vue: 3.5.27 - transitivePeerDependencies: - - typescript + vue: 3.5.27(typescript@6.0.3) acorn@8.15.0: {} - algoliasearch@5.47.0: - dependencies: - '@algolia/abtesting': 1.13.0 - '@algolia/client-abtesting': 5.47.0 - '@algolia/client-analytics': 5.47.0 - '@algolia/client-common': 5.47.0 - '@algolia/client-insights': 5.47.0 - '@algolia/client-personalization': 5.47.0 - '@algolia/client-query-suggestions': 5.47.0 - '@algolia/client-search': 5.47.0 - '@algolia/ingestion': 1.47.0 - '@algolia/monitoring': 1.47.0 - '@algolia/recommend': 5.47.0 - '@algolia/requester-browser-xhr': 5.47.0 - '@algolia/requester-fetch': 5.47.0 - '@algolia/requester-node-http': 5.47.0 - - autoprefixer@10.4.23(postcss@8.5.6): - dependencies: - browserslist: 4.28.1 - caniuse-lite: 1.0.30001766 - fraction.js: 5.3.4 - picocolors: 1.1.1 - postcss: 8.5.6 - postcss-value-parser: 4.2.0 - - baseline-browser-mapping@2.9.17: {} - - birpc@2.9.0: {} - - browserslist@4.28.1: + aria-hidden@1.2.6: dependencies: - baseline-browser-mapping: 2.9.17 - caniuse-lite: 1.0.30001766 - electron-to-chromium: 1.5.277 - node-releases: 2.0.27 - update-browserslist-db: 1.2.3(browserslist@4.28.1) + tslib: 2.8.1 - caniuse-lite@1.0.30001766: {} + birpc@2.9.0: {} ccount@2.0.1: {} @@ -2408,10 +2268,6 @@ snapshots: confbox@0.1.8: {} - copy-anything@4.0.5: - dependencies: - is-what: 5.5.0 - cose-base@1.0.3: dependencies: layout-base: 1.0.2 @@ -2420,6 +2276,8 @@ snapshots: dependencies: layout-base: 2.0.1 + cssesc@3.0.0: {} + csstype@3.2.3: {} cytoscape-cose-bilkent@4.1.0(cytoscape@3.33.1): @@ -2608,6 +2466,8 @@ snapshots: dayjs@1.11.19: {} + defu@6.1.7: {} + delaunator@5.0.1: dependencies: robust-predicates: 3.0.2 @@ -2624,14 +2484,10 @@ snapshots: optionalDependencies: '@types/trusted-types': 2.0.7 - electron-to-chromium@1.5.277: {} - - emoji-regex-xs@1.0.0: {} - - enhanced-resolve@5.18.4: + enhanced-resolve@5.21.5: dependencies: graceful-fs: 4.2.11 - tapable: 2.3.0 + tapable: 2.3.3 entities@7.0.1: {} @@ -2663,8 +2519,6 @@ snapshots: '@esbuild/win32-ia32': 0.25.0 '@esbuild/win32-x64': 0.25.0 - escalade@3.2.0: {} - estree-walker@2.0.2: {} fdir@6.5.0(picomatch@4.0.4): @@ -2675,8 +2529,6 @@ snapshots: dependencies: tabbable: 6.4.0 - fraction.js@5.3.4: {} - fsevents@2.3.3: optional: true @@ -2714,8 +2566,6 @@ snapshots: internmap@2.0.3: {} - is-what@5.5.0: {} - jiti@2.6.1: {} katex@0.16.28: @@ -2736,60 +2586,60 @@ snapshots: layout-base@2.0.1: {} - lightningcss-android-arm64@1.30.2: + lightningcss-android-arm64@1.32.0: optional: true - lightningcss-darwin-arm64@1.30.2: + lightningcss-darwin-arm64@1.32.0: optional: true - lightningcss-darwin-x64@1.30.2: + lightningcss-darwin-x64@1.32.0: optional: true - lightningcss-freebsd-x64@1.30.2: + lightningcss-freebsd-x64@1.32.0: optional: true - lightningcss-linux-arm-gnueabihf@1.30.2: + lightningcss-linux-arm-gnueabihf@1.32.0: optional: true - lightningcss-linux-arm64-gnu@1.30.2: + lightningcss-linux-arm64-gnu@1.32.0: optional: true - lightningcss-linux-arm64-musl@1.30.2: + lightningcss-linux-arm64-musl@1.32.0: optional: true - lightningcss-linux-x64-gnu@1.30.2: + lightningcss-linux-x64-gnu@1.32.0: optional: true - lightningcss-linux-x64-musl@1.30.2: + lightningcss-linux-x64-musl@1.32.0: optional: true - lightningcss-win32-arm64-msvc@1.30.2: + lightningcss-win32-arm64-msvc@1.32.0: optional: true - lightningcss-win32-x64-msvc@1.30.2: + lightningcss-win32-x64-msvc@1.32.0: optional: true - lightningcss@1.30.2: + lightningcss@1.32.0: dependencies: detect-libc: 2.1.2 optionalDependencies: - lightningcss-android-arm64: 1.30.2 - lightningcss-darwin-arm64: 1.30.2 - lightningcss-darwin-x64: 1.30.2 - lightningcss-freebsd-x64: 1.30.2 - lightningcss-linux-arm-gnueabihf: 1.30.2 - lightningcss-linux-arm64-gnu: 1.30.2 - lightningcss-linux-arm64-musl: 1.30.2 - lightningcss-linux-x64-gnu: 1.30.2 - lightningcss-linux-x64-musl: 1.30.2 - lightningcss-win32-arm64-msvc: 1.30.2 - lightningcss-win32-x64-msvc: 1.30.2 + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 lodash-es@4.18.1: {} - lucide-vue-next@0.562.0(vue@3.5.27): + lucide-vue-next@0.562.0(vue@3.5.27(typescript@6.0.3)): dependencies: - vue: 3.5.27 + vue: 3.5.27(typescript@6.0.3) magic-string@0.30.21: dependencies: @@ -2855,8 +2705,6 @@ snapshots: minisearch@7.2.0: {} - mitt@3.0.1: {} - mlly@1.8.0: dependencies: acorn: 8.15.0 @@ -2866,14 +2714,16 @@ snapshots: nanoid@3.3.11: {} - node-releases@2.0.27: {} - non-layered-tidy-tree-layout@2.0.2: optional: true - oniguruma-to-es@3.1.1: + ohash@2.0.11: {} + + oniguruma-parser@0.12.2: {} + + oniguruma-to-es@4.3.6: dependencies: - emoji-regex-xs: 1.0.0 + oniguruma-parser: 0.12.2 regex: 6.1.0 regex-recursion: 6.0.2 @@ -2883,7 +2733,7 @@ snapshots: pathe@2.0.3: {} - perfect-debounce@1.0.0: {} + perfect-debounce@2.1.0: {} picocolors@1.1.1: {} @@ -2902,7 +2752,10 @@ snapshots: path-data-parser: 0.1.0 points-on-curve: 0.2.0 - postcss-value-parser@4.2.0: {} + postcss-selector-parser@6.0.10: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 postcss@8.5.6: dependencies: @@ -2910,8 +2763,6 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - preact@10.28.2: {} - prettier@3.8.1: {} property-information@7.1.0: {} @@ -2926,7 +2777,21 @@ snapshots: dependencies: regex-utilities: 2.3.0 - rfdc@1.4.1: {} + reka-ui@2.9.7(vue@3.5.27(typescript@6.0.3)): + dependencies: + '@floating-ui/dom': 1.7.6 + '@floating-ui/vue': 1.1.11(vue@3.5.27(typescript@6.0.3)) + '@internationalized/date': 3.12.1 + '@internationalized/number': 3.6.6 + '@tanstack/vue-virtual': 3.13.24(vue@3.5.27(typescript@6.0.3)) + '@vueuse/core': 14.3.0(vue@3.5.27(typescript@6.0.3)) + '@vueuse/shared': 14.3.0(vue@3.5.27(typescript@6.0.3)) + aria-hidden: 1.2.6 + defu: 6.1.7 + ohash: 2.0.11 + vue: 3.5.27(typescript@6.0.3) + transitivePeerDependencies: + - '@vue/composition-api' robust-predicates@3.0.2: {} @@ -2972,16 +2837,14 @@ snapshots: safer-buffer@2.1.2: {} - search-insights@2.17.3: {} - - shiki@2.5.0: + shiki@3.23.0: dependencies: - '@shikijs/core': 2.5.0 - '@shikijs/engine-javascript': 2.5.0 - '@shikijs/engine-oniguruma': 2.5.0 - '@shikijs/langs': 2.5.0 - '@shikijs/themes': 2.5.0 - '@shikijs/types': 2.5.0 + '@shikijs/core': 3.23.0 + '@shikijs/engine-javascript': 3.23.0 + '@shikijs/engine-oniguruma': 3.23.0 + '@shikijs/langs': 3.23.0 + '@shikijs/themes': 3.23.0 + '@shikijs/types': 3.23.0 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 @@ -2989,8 +2852,6 @@ snapshots: space-separated-tokens@2.0.2: {} - speakingurl@14.0.1: {} - stringify-entities@4.0.4: dependencies: character-entities-html4: 2.1.0 @@ -2998,15 +2859,13 @@ snapshots: stylis@4.3.6: {} - superjson@2.2.6: - dependencies: - copy-anything: 4.0.5 - tabbable@6.4.0: {} tailwindcss@4.1.18: {} - tapable@2.3.0: {} + tailwindcss@4.3.0: {} + + tapable@2.3.3: {} tinyexec@1.0.2: {} @@ -3019,8 +2878,14 @@ snapshots: ts-dedent@2.2.0: {} + tslib@2.8.1: {} + + typescript@6.0.3: {} + ufo@1.6.3: {} + undici-types@7.24.6: {} + unist-util-is@6.0.1: dependencies: '@types/unist': 3.0.3 @@ -3044,11 +2909,7 @@ snapshots: unist-util-is: 6.0.1 unist-util-visit-parents: 6.0.2 - update-browserslist-db@1.2.3(browserslist@4.28.1): - dependencies: - browserslist: 4.28.1 - escalade: 3.2.0 - picocolors: 1.1.1 + util-deprecate@1.0.2: {} uuid@11.1.0: {} @@ -3062,7 +2923,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@6.4.2(jiti@2.6.1)(lightningcss@1.30.2): + vite@6.4.2(@types/node@25.9.0)(jiti@2.6.1)(lightningcss@1.32.0): dependencies: esbuild: 0.25.0 fdir: 6.5.0(picomatch@4.0.4) @@ -3071,48 +2932,48 @@ snapshots: rollup: 4.59.0 tinyglobby: 0.2.16 optionalDependencies: + '@types/node': 25.9.0 fsevents: 2.3.3 jiti: 2.6.1 - lightningcss: 1.30.2 + lightningcss: 1.32.0 - vitepress-plugin-mermaid@2.0.17(mermaid@11.12.2)(vitepress@1.6.4(@algolia/client-search@5.47.0)(jiti@2.6.1)(lightningcss@1.30.2)(postcss@8.5.6)(search-insights@2.17.3)): + vitepress-plugin-mermaid@2.0.17(mermaid@11.12.2)(vitepress@2.0.0-alpha.16(@types/node@25.9.0)(jiti@2.6.1)(lightningcss@1.32.0)(postcss@8.5.6)(typescript@6.0.3)): dependencies: mermaid: 11.12.2 - vitepress: 1.6.4(@algolia/client-search@5.47.0)(jiti@2.6.1)(lightningcss@1.30.2)(postcss@8.5.6)(search-insights@2.17.3) + vitepress: 2.0.0-alpha.16(@types/node@25.9.0)(jiti@2.6.1)(lightningcss@1.32.0)(postcss@8.5.6)(typescript@6.0.3) optionalDependencies: '@mermaid-js/mermaid-mindmap': 9.3.0 - vitepress-plugin-tabs@0.7.3(vitepress@1.6.4(@algolia/client-search@5.47.0)(jiti@2.6.1)(lightningcss@1.30.2)(postcss@8.5.6)(search-insights@2.17.3))(vue@3.5.27): + vitepress-plugin-tabs@0.8.0(vitepress@2.0.0-alpha.16(@types/node@25.9.0)(jiti@2.6.1)(lightningcss@1.32.0)(postcss@8.5.6)(typescript@6.0.3))(vue@3.5.27(typescript@6.0.3)): dependencies: - vitepress: 1.6.4(@algolia/client-search@5.47.0)(jiti@2.6.1)(lightningcss@1.30.2)(postcss@8.5.6)(search-insights@2.17.3) - vue: 3.5.27 + vitepress: 2.0.0-alpha.16(@types/node@25.9.0)(jiti@2.6.1)(lightningcss@1.32.0)(postcss@8.5.6)(typescript@6.0.3) + vue: 3.5.27(typescript@6.0.3) - vitepress@1.6.4(@algolia/client-search@5.47.0)(jiti@2.6.1)(lightningcss@1.30.2)(postcss@8.5.6)(search-insights@2.17.3): + vitepress@2.0.0-alpha.16(@types/node@25.9.0)(jiti@2.6.1)(lightningcss@1.32.0)(postcss@8.5.6)(typescript@6.0.3): dependencies: - '@docsearch/css': 3.8.2 - '@docsearch/js': 3.8.2(@algolia/client-search@5.47.0)(search-insights@2.17.3) - '@iconify-json/simple-icons': 1.2.67 - '@shikijs/core': 2.5.0 - '@shikijs/transformers': 2.5.0 - '@shikijs/types': 2.5.0 + '@docsearch/css': 4.6.3 + '@docsearch/js': 4.6.3 + '@docsearch/sidepanel-js': 4.6.3 + '@iconify-json/simple-icons': 1.2.83 + '@shikijs/core': 3.23.0 + '@shikijs/transformers': 3.23.0 + '@shikijs/types': 3.23.0 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 5.2.4(vite@6.4.2(jiti@2.6.1)(lightningcss@1.30.2))(vue@3.5.27) - '@vue/devtools-api': 7.7.9 + '@vitejs/plugin-vue': 6.0.7(vite@6.4.2(@types/node@25.9.0)(jiti@2.6.1)(lightningcss@1.32.0))(vue@3.5.27(typescript@6.0.3)) + '@vue/devtools-api': 8.1.2 '@vue/shared': 3.5.27 - '@vueuse/core': 12.8.2 - '@vueuse/integrations': 12.8.2(focus-trap@7.8.0) + '@vueuse/core': 14.3.0(vue@3.5.27(typescript@6.0.3)) + '@vueuse/integrations': 14.3.0(focus-trap@7.8.0)(vue@3.5.27(typescript@6.0.3)) focus-trap: 7.8.0 mark.js: 8.11.1 minisearch: 7.2.0 - shiki: 2.5.0 - vite: 6.4.2(jiti@2.6.1)(lightningcss@1.30.2) - vue: 3.5.27 + shiki: 3.23.0 + vite: 6.4.2(@types/node@25.9.0)(jiti@2.6.1)(lightningcss@1.32.0) + vue: 3.5.27(typescript@6.0.3) optionalDependencies: postcss: 8.5.6 transitivePeerDependencies: - - '@algolia/client-search' - '@types/node' - - '@types/react' - async-validator - axios - change-case @@ -3125,11 +2986,8 @@ snapshots: - lightningcss - nprogress - qrcode - - react - - react-dom - sass - sass-embedded - - search-insights - sortablejs - stylus - sugarss @@ -3156,12 +3014,18 @@ snapshots: vscode-uri@3.0.8: {} - vue@3.5.27: + vue-demi@0.14.10(vue@3.5.27(typescript@6.0.3)): + dependencies: + vue: 3.5.27(typescript@6.0.3) + + vue@3.5.27(typescript@6.0.3): dependencies: '@vue/compiler-dom': 3.5.27 '@vue/compiler-sfc': 3.5.27 '@vue/runtime-dom': 3.5.27 - '@vue/server-renderer': 3.5.27(vue@3.5.27) + '@vue/server-renderer': 3.5.27(vue@3.5.27(typescript@6.0.3)) '@vue/shared': 3.5.27 + optionalDependencies: + typescript: 6.0.3 zwitch@2.0.4: {} diff --git a/postcss.config.js b/postcss.config.js index f69c5d41..ff8b4c56 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -1,6 +1 @@ -export default { - plugins: { - "@tailwindcss/postcss": {}, - autoprefixer: {}, - }, -}; +export default {}; diff --git a/vercel.json b/vercel.json index 4d4d9e6a..0a3e7bef 100644 --- a/vercel.json +++ b/vercel.json @@ -7,6 +7,10 @@ { "key": "Link", "value": "; rel=\"describedby\"; type=\"text/plain\", ; rel=\"service-doc\"; type=\"text/html\", ; rel=\"sitemap\"; type=\"application/xml\"" + }, + { + "key": "X-Robots-Tag", + "value": "index, follow" } ] }