From d4c75f2c7b78dff53a738a893c8431296f88395e Mon Sep 17 00:00:00 2001 From: Hong Minhee Date: Wed, 17 Jun 2026 16:25:05 +0900 Subject: [PATCH 01/21] Fix JSR ref plugin priority order in docs Previously, JSR reference plugins were applied in their original order, causing packages later in the list to override packages earlier in the list when both matched the same reference. Reversing the application order ensures that packages listed first take precedence, as intended. --- docs/.vitepress/config.mts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index a71503133..8fe95a1a6 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -323,7 +323,7 @@ export default withMermaid(defineConfig({ md.use(footnote); md.use(taskLists); md.use(groupIconMdPlugin); - for (const jsrRefPlugin of jsrRefPlugins) { + for (const jsrRefPlugin of jsrRefPlugins.toReversed()) { md.use(jsrRefPlugin); } }, From 91c00b10112a0f46c873a265a3e96b710db5bbfc Mon Sep 17 00:00:00 2001 From: Hong Minhee Date: Wed, 17 Jun 2026 18:02:21 +0900 Subject: [PATCH 02/21] Upgrade to VitePress 2 and rebrand the docs site Move the documentation site from VitePress 1.6.3 to 2.0.0-alpha.17 (the latest "next" release) and replace the stock default theme with a distinctive Fedify identity. Build/tooling: - Bump VitePress to 2.0.0-alpha.17 (Vite 7, Vue 3.5, Shiki 3), and move @shikijs/vitepress-twoslash to 3.x to match Shiki; bump the group-icons and llms plugins to compatible releases. - Preload the languages used in JSDoc example code fences via markdown.languages: Shiki 3 no longer lazily loads them while Twoslash renders hover tooltips, which otherwise broke the build. - Allow vitepress-plugin-mermaid's unmet VitePress peer in pnpm-workspace.yaml; it has no VitePress 2 release yet, but the withMermaid wrapper works under 2. - Add @fontsource-variable/bricolage-grotesque (display font) and lucide-vue-next (feature icons). Design: - Derive a contrast-checked brand palette from the logo (its blues are Tailwind's sky scale) and apply it through the default theme's CSS variables; use Bricolage Grotesque for headings and the hero. - Replace the default home layout with a custom landing page (HomeLanding.vue): a narrative hero with a federated-network illustration, package-manager install tabs (npm/pnpm/Yarn/Deno/Bun) and a "runs on" runtime strip (Node.js, Deno, Bun, Cloudflare Workers), a feature grid using Lucide icons and the official ActivityPub logo, a code showcase, an interop section, and a closing call to action. - Drop the "Quick demo" playground link from the Tutorials menu. Assisted-by: Claude Code:claude-opus-4-8 --- docs/.vitepress/config.mts | 32 +- docs/.vitepress/theme/brand.css | 64 + .../theme/components/HomeLanding.vue | 1151 ++++++++++++++ docs/.vitepress/theme/index.ts | 6 + docs/index.md | 94 +- docs/package.json | 10 +- pnpm-lock.yaml | 1346 ++++------------- pnpm-workspace.yaml | 8 + 8 files changed, 1554 insertions(+), 1157 deletions(-) create mode 100644 docs/.vitepress/theme/brand.css create mode 100644 docs/.vitepress/theme/components/HomeLanding.vue diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index 8fe95a1a6..305e0d79f 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -106,10 +106,6 @@ function getReferenceItems(): { text: string; link: string }[] { const TUTORIAL = { text: "Tutorials", items: [ - { - text: "Quick demo", - link: "https://dash.deno.com/playground/fedify-demo", - }, { text: "Learning the basics", link: "/tutorial/basics.md" }, { text: "Creating a microblog", link: "/tutorial/microblog.md" }, { @@ -288,6 +284,34 @@ export default withMermaid(defineConfig({ cleanUrls: true, ignoreDeadLinks: true, markdown: { + // Preload the languages that appear in fenced code blocks inside JSDoc + // comments. Twoslash re-highlights those snippets while rendering hover + // tooltips, and Shiki 3 (VitePress 2) throws on a not-yet-loaded language + // instead of lazily loading it the way the old highlighter did. Loading a + // canonical grammar also registers its aliases (e.g. "javascript" covers + // "js", "bash" covers "sh"). + languages: [ + "javascript", + "jsx", + "typescript", + "tsx", + "json", + "jsonc", + "bash", + "html", + "css", + "scss", + "yaml", + "toml", + "ini", + "xml", + "diff", + "http", + "sql", + "markdown", + "haskell", + "docker", + ], codeTransformers: [ transformerTwoslash({ twoslashOptions: { diff --git a/docs/.vitepress/theme/brand.css b/docs/.vitepress/theme/brand.css new file mode 100644 index 000000000..7d290cc76 --- /dev/null +++ b/docs/.vitepress/theme/brand.css @@ -0,0 +1,64 @@ +/* + * Fedify brand theming for the VitePress default theme. + * + * The palette is derived from the Fedify logo, whose blues are Tailwind's `sky` + * scale (#bae6fd = sky-200, #0284c7 = sky-600, #0c4a6e = sky-900). Brand tokens + * below are contrast-checked against WCAG AA. The home page uses a fully custom + * landing layout (see theme/components/HomeLanding.vue); this file only carries + * the global tokens and the documentation-page typography. + */ + +/* ------------------------------------------------------------------ * + * Brand color tokens * + * ------------------------------------------------------------------ */ + +:root { + --vp-c-brand-1: #075985; /* sky-800 — links / active text (~7.4:1 on white) */ + --vp-c-brand-2: #0369a1; /* sky-700 — hover */ + --vp-c-brand-3: #0284c7; /* sky-600 — solid button bg (AA-large on white) */ + --vp-c-brand-soft: rgba(2, 132, 199, 0.14); + + /* Legacy alias still referenced by a few default-theme rules. */ + --vp-c-brand: var(--vp-c-brand-1); +} + +.dark { + --vp-c-brand-1: #7dd3fc; /* sky-300 */ + --vp-c-brand-2: #38bdf8; /* sky-400 */ + --vp-c-brand-3: #0284c7; /* sky-600 */ + --vp-c-brand-soft: rgba(56, 189, 248, 0.16); +} + +/* ------------------------------------------------------------------ * + * Display typography (documentation headings; the landing component * + * applies the same family to its own headings via the variable) * + * ------------------------------------------------------------------ */ + +:root { + --vp-font-family-display: + "Bricolage Grotesque Variable", "Bricolage Grotesque", + var(--vp-font-family-base); +} + +.vp-doc h1, +.vp-doc h2, +.vp-doc h3 { + font-family: var(--vp-font-family-display); + font-optical-sizing: auto; +} + +.vp-doc h1, +.vp-doc h2 { + letter-spacing: -0.02em; +} + +/* ------------------------------------------------------------------ * + * Custom landing layout * + * ------------------------------------------------------------------ */ + +/* The landing uses `isHome: true`, so VPContent gets `.is-home`. Neutralize + its nav-height top padding so HomeLanding's hero owns the offset (consistent + across breakpoints). */ +.VPContent.is-home { + padding-top: 0; +} diff --git a/docs/.vitepress/theme/components/HomeLanding.vue b/docs/.vitepress/theme/components/HomeLanding.vue new file mode 100644 index 000000000..84442c2d5 --- /dev/null +++ b/docs/.vitepress/theme/components/HomeLanding.vue @@ -0,0 +1,1151 @@ + + + + + diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts index 97c17ba1a..f3e7ef9c5 100644 --- a/docs/.vitepress/theme/index.ts +++ b/docs/.vitepress/theme/index.ts @@ -2,10 +2,13 @@ import TwoslashFloatingVue from "@shikijs/vitepress-twoslash/client"; import "virtual:group-icons.css"; import type { EnhanceAppContext } from "vitepress"; import { h } from "vue"; +import HomeLanding from "./components/HomeLanding.vue"; import PageMarkdownActions from "./components/PageMarkdownActions.vue"; import Theme from "vitepress/theme"; +import "@fontsource-variable/bricolage-grotesque"; import "@shikijs/vitepress-twoslash/style.css"; +import "./brand.css"; import "./style.css"; export default { @@ -18,5 +21,8 @@ export default { enhanceApp({ app }: EnhanceAppContext) { app.use(TwoslashFloatingVue); app.component("PageMarkdownActions", PageMarkdownActions); + // Resolved by VitePress via `` when a + // page sets `layout: HomeLanding` (see docs/index.md). + app.component("HomeLanding", HomeLanding); }, }; diff --git a/docs/index.md b/docs/index.md index a1e3591fe..34903ea18 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,98 +1,8 @@ --- -layout: home +layout: HomeLanding +isHome: true description: >- Fedify is a TypeScript library for building federated server apps powered by ActivityPub and other standards, so-called fediverse. - -hero: - name: Fedify - text: ActivityPub server framework - tagline: >- - A TypeScript library for building federated server apps - powered by ActivityPub and other standards, - so-called fediverse - image: /logo.png - actions: - - theme: brand - text: What's Fedify? - link: /intro.md - - theme: brand - text: Why? - link: /why.md - - theme: alt - text: Quick demo - link: https://dash.deno.com/playground/fedify-demo - - theme: alt - text: Tutorial - link: /tutorial/basics.md - - theme: alt - text: GitHub - link: https://github.com/fedify-dev/fedify - -features: -- icon: 🕸️ - title: ActivityPub - details: >- - ActivityPub server and - client -- icon: 📚 - title: Activity Vocabulary - details: >- - Type-safe objects for Activity - Vocabulary (including some vendor-specific extensions) - link: /manual/vocab.md -- icon: 👉 - title: WebFinger - details: >- - WebFinger - client and server -- icon: ✍️ - title: HTTPS Signatures - details: >- - Signing and verifying HTTP - Signatures and HTTP - Message Signatures - link: /manual/send.md#http-signatures -- icon: 🔗 - title: Linked Data Signatures - details: >- - Creating and verifying Linked - Data Signatures - link: /manual/send.md#linked-data-signatures -- icon: 🪪 - title: Object Integrity Proofs (FEP-8b32) - details: >- - Creating and verifying Object Integrity - Proofs - link: /manual/send.md#object-integrity-proofs -- icon: ℹ️ - title: NodeInfo - details: >- - NodeInfo server and client - link: /manual/nodeinfo.md -- icon: 🧩 - title: Integration - details: Integration with various web frameworks - link: /manual/integration.md --- - - -
- -

Meet our sponsors

- -Support Fedify's development and join these amazing individuals and -organizations. - -[See all sponsors →](/sponsors.md) - -
diff --git a/docs/package.json b/docs/package.json index 9d59d59a7..de15632b4 100644 --- a/docs/package.json +++ b/docs/package.json @@ -26,6 +26,7 @@ "@fedify/uri-template": "workspace:^", "@fedify/vocab": "workspace:^", "@fedify/vocab-runtime": "workspace:^", + "@fontsource-variable/bricolage-grotesque": "^5.2.10", "@hackmd/markdown-it-task-lists": "^2.1.4", "@hono/node-server": "^1.13.7", "@js-temporal/polyfill": "catalog:", @@ -37,7 +38,7 @@ "@opentelemetry/sdk-node": "catalog:", "@opentelemetry/sdk-trace-base": "catalog:", "@sentry/node": "^8.47.0", - "@shikijs/vitepress-twoslash": "^1.24.4", + "@shikijs/vitepress-twoslash": "^3.23.0", "@teidesu/deno-types": "^2.1.4", "@types/amqplib": "catalog:", "@types/better-sqlite3": "catalog:", @@ -56,6 +57,7 @@ "hono": "^4.6.14", "ioredis": "catalog:", "koa": "catalog:", + "lucide-vue-next": "^1.0.0", "markdown-it-abbr": "^2.0.0", "markdown-it-deflist": "^3.0.0", "markdown-it-footnote": "^4.0.0", @@ -65,9 +67,9 @@ "srvx": "^0.11.15", "stringify-entities": "^4.0.4", "typescript": "catalog:", - "vitepress": "^1.6.3", - "vitepress-plugin-group-icons": "^1.3.5", - "vitepress-plugin-llms": "^1.1.0", + "vitepress": "^2.0.0-alpha.17", + "vitepress-plugin-group-icons": "^1.7.5", + "vitepress-plugin-llms": "^1.13.1", "vitepress-plugin-mermaid": "^2.0.17", "x-forwarded-fetch": "^0.2.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 84a59ab96..79190b779 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -262,6 +262,9 @@ importers: '@fedify/vocab-runtime': specifier: workspace:^ version: link:../packages/vocab-runtime + '@fontsource-variable/bricolage-grotesque': + specifier: ^5.2.10 + version: 5.2.10 '@hackmd/markdown-it-task-lists': specifier: ^2.1.4 version: 2.1.4 @@ -296,8 +299,8 @@ importers: specifier: ^8.47.0 version: 8.55.0 '@shikijs/vitepress-twoslash': - specifier: ^1.24.4 - version: 1.29.2(typescript@6.0.3) + specifier: ^3.23.0 + version: 3.23.0(typescript@6.0.3) '@teidesu/deno-types': specifier: ^2.1.4 version: 2.1.10 @@ -352,6 +355,9 @@ importers: koa: specifier: 'catalog:' version: 2.16.2 + lucide-vue-next: + specifier: ^1.0.0 + version: 1.0.0(vue@3.5.33(typescript@6.0.3)) markdown-it-abbr: specifier: ^2.0.0 version: 2.0.0 @@ -380,17 +386,17 @@ importers: specifier: 'catalog:' version: 6.0.3 vitepress: - specifier: ^1.6.3 - version: 1.6.3(@algolia/client-search@5.29.0)(@types/node@22.19.1)(@types/react@18.3.23)(fuse.js@7.3.0)(lightningcss@1.30.1)(postcss@8.5.10)(search-insights@2.17.3)(terser@5.46.1)(typescript@6.0.3) + specifier: ^2.0.0-alpha.17 + version: 2.0.0-alpha.17(@types/node@22.19.1)(fuse.js@7.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(oxc-minify@0.117.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(postcss@8.5.10)(terser@5.46.1)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.9.0) vitepress-plugin-group-icons: - specifier: ^1.3.5 - version: 1.6.1(markdown-it@14.1.0)(vite@7.3.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) + specifier: ^1.7.5 + version: 1.7.5(vite@7.3.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)) vitepress-plugin-llms: - specifier: ^1.1.0 - version: 1.6.0 + specifier: ^1.13.1 + version: 1.13.1 vitepress-plugin-mermaid: specifier: ^2.0.17 - version: 2.0.17(mermaid@11.7.0)(vitepress@1.6.3(@algolia/client-search@5.29.0)(@types/node@22.19.1)(@types/react@18.3.23)(fuse.js@7.3.0)(lightningcss@1.30.1)(postcss@8.5.10)(search-insights@2.17.3)(terser@5.46.1)(typescript@6.0.3)) + version: 2.0.17(mermaid@11.7.0)(vitepress@2.0.0-alpha.17(@types/node@22.19.1)(fuse.js@7.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(oxc-minify@0.117.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(postcss@8.5.10)(terser@5.46.1)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.9.0)) x-forwarded-fetch: specifier: ^0.2.0 version: 0.2.0 @@ -1849,78 +1855,6 @@ importers: packages: - '@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.29.0': - resolution: {integrity: sha512-AM/6LYMSTnZvAT5IarLEKjYWOdV+Fb+LVs8JRq88jn8HH6bpVUtjWdOZXqX1hJRXuCAY8SdQfb7F8uEiMNXdYQ==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-analytics@5.29.0': - resolution: {integrity: sha512-La34HJh90l0waw3wl5zETO8TuukeUyjcXhmjYZL3CAPLggmKv74mobiGRIb+mmBENybiFDXf/BeKFLhuDYWMMQ==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-common@5.29.0': - resolution: {integrity: sha512-T0lzJH/JiCxQYtCcnWy7Jf1w/qjGDXTi2npyF9B9UsTvXB97GRC6icyfXxe21mhYvhQcaB1EQ/J2575FXxi2rA==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-insights@5.29.0': - resolution: {integrity: sha512-A39F1zmHY9aev0z4Rt3fTLcGN5AG1VsVUkVWy6yQG5BRDScktH+U5m3zXwThwniBTDV1HrPgiGHZeWb67GkR2Q==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-personalization@5.29.0': - resolution: {integrity: sha512-ibxmh2wKKrzu5du02gp8CLpRMeo+b/75e4ORct98CT7mIxuYFXowULwCd6cMMkz/R0LpKXIbTUl15UL5soaiUQ==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-query-suggestions@5.29.0': - resolution: {integrity: sha512-VZq4/AukOoJC2WSwF6J5sBtt+kImOoBwQc1nH3tgI+cxJBg7B77UsNC+jT6eP2dQCwGKBBRTmtPLUTDDnHpMgA==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-search@5.29.0': - resolution: {integrity: sha512-cZ0Iq3OzFUPpgszzDr1G1aJV5UMIZ4VygJ2Az252q4Rdf5cQMhYEIKArWY/oUjMhQmosM8ygOovNq7gvA9CdCg==} - engines: {node: '>= 14.0.0'} - - '@algolia/ingestion@1.29.0': - resolution: {integrity: sha512-scBXn0wO5tZCxmO6evfa7A3bGryfyOI3aoXqSQBj5SRvNYXaUlFWQ/iKI70gRe/82ICwE0ICXbHT/wIvxOW7vw==} - engines: {node: '>= 14.0.0'} - - '@algolia/monitoring@1.29.0': - resolution: {integrity: sha512-FGWWG9jLFhsKB7YiDjM2dwQOYnWu//7Oxrb2vT96N7+s+hg1mdHHfHNRyEudWdxd4jkMhBjeqNA21VbTiOIPVg==} - engines: {node: '>= 14.0.0'} - - '@algolia/recommend@5.29.0': - resolution: {integrity: sha512-xte5+mpdfEARAu61KXa4ewpjchoZuJlAlvQb8ptK6hgHlBHDnYooy1bmOFpokaAICrq/H9HpoqNUX71n+3249A==} - engines: {node: '>= 14.0.0'} - - '@algolia/requester-browser-xhr@5.29.0': - resolution: {integrity: sha512-og+7Em75aPHhahEUScq2HQ3J7ULN63Levtd87BYMpn6Im5d5cNhaC4QAUsXu6LWqxRPgh4G+i+wIb6tVhDhg2A==} - engines: {node: '>= 14.0.0'} - - '@algolia/requester-fetch@5.29.0': - resolution: {integrity: sha512-JCxapz7neAy8hT/nQpCvOrI5JO8VyQ1kPvBiaXWNC1prVq0UMYHEL52o1BsPvtXfdQ7BVq19OIq6TjOI06mV/w==} - engines: {node: '>= 14.0.0'} - - '@algolia/requester-node-http@5.29.0': - resolution: {integrity: sha512-lVBD81RBW5VTdEYgnzCz7Pf9j2H44aymCP+/eHGJu4vhU+1O8aKf3TVBgbQr5UM6xoe8IkR/B112XY6YIG2vtg==} - engines: {node: '>= 14.0.0'} - '@alinea/suite@0.6.3': resolution: {integrity: sha512-4oGhbwAGq3rQeuuq9ylmybMkIT1mAl6e+DiiTLwwmwNzHFQiVihishgOpkIGrs0fGVSD4T8jOLyNTuQ30RtVuQ==} @@ -2320,28 +2254,14 @@ packages: resolution: {integrity: sha512-OGju/GYp0V72qlZ/Pd4jGEwqBwT/Za/tw+Z3AC7lgMheGqsbhTZrtc5iLz9z59G/Q53QyE2fnjHV8N9wjBpiWA==} engines: {node: '>=18.0'} - '@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==} '@dxup/nuxt@0.4.1': resolution: {integrity: sha512-gtYffW6OfWNvoLW+XD3Mx/K8uUq08PMGLYJoDxc92EzZAWqR0FhcR5iaLm5r/OxyGTKz+P5f5Y7Aoir9+SjYaw==} @@ -2363,12 +2283,6 @@ packages: '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} - '@esbuild/aix-ppc64@0.21.5': - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.25.4': resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} engines: {node: '>=18'} @@ -2387,12 +2301,6 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.21.5': - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.25.4': resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} engines: {node: '>=18'} @@ -2411,12 +2319,6 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm@0.21.5': - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.25.4': resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} engines: {node: '>=18'} @@ -2435,12 +2337,6 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-x64@0.21.5': - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.25.4': resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} engines: {node: '>=18'} @@ -2459,12 +2355,6 @@ packages: cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.21.5': - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.25.4': resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} engines: {node: '>=18'} @@ -2483,12 +2373,6 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.21.5': - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.25.4': resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} engines: {node: '>=18'} @@ -2507,12 +2391,6 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.21.5': - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.25.4': resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} engines: {node: '>=18'} @@ -2531,12 +2409,6 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.21.5': - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.25.4': resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} engines: {node: '>=18'} @@ -2555,12 +2427,6 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.21.5': - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.25.4': resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} engines: {node: '>=18'} @@ -2579,12 +2445,6 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.21.5': - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.25.4': resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} engines: {node: '>=18'} @@ -2603,12 +2463,6 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.21.5': - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.25.4': resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} engines: {node: '>=18'} @@ -2627,12 +2481,6 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.21.5': - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.25.4': resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} engines: {node: '>=18'} @@ -2651,12 +2499,6 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.21.5': - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.25.4': resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} engines: {node: '>=18'} @@ -2675,12 +2517,6 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.21.5': - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.25.4': resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} engines: {node: '>=18'} @@ -2699,12 +2535,6 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.21.5': - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.25.4': resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} engines: {node: '>=18'} @@ -2723,12 +2553,6 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.21.5': - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.25.4': resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} engines: {node: '>=18'} @@ -2747,12 +2571,6 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.21.5': - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.25.4': resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} engines: {node: '>=18'} @@ -2789,12 +2607,6 @@ packages: cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.21.5': - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.25.4': resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} engines: {node: '>=18'} @@ -2831,12 +2643,6 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.21.5': - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.25.4': resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} engines: {node: '>=18'} @@ -2861,12 +2667,6 @@ packages: cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.21.5': - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.25.4': resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} engines: {node: '>=18'} @@ -2885,12 +2685,6 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.21.5': - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.25.4': resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} engines: {node: '>=18'} @@ -2909,12 +2703,6 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.21.5': - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.25.4': resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} engines: {node: '>=18'} @@ -2933,12 +2721,6 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.21.5': - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.25.4': resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} engines: {node: '>=18'} @@ -3053,6 +2835,9 @@ packages: '@floating-ui/utils@0.2.10': resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + '@fontsource-variable/bricolage-grotesque@5.2.10': + resolution: {integrity: sha512-5EDsCqgGpKVcJWE4sg9ydli+t5WM97mISYw5lla/Ev4z71FwXh1oN0YUU8xjkRW9+wBCGD9R+ntAvI8G4bUFJg==} + '@fxts/core@1.20.0': resolution: {integrity: sha512-f6NNS0pu7K72sYKf85GKnkTNGpQsWUNJ3VH8qMTofiRWAksa491Yvne8v0extMjBnI3+aPs4m3OKITgvVyZbeg==} @@ -3107,14 +2892,14 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@iconify-json/logos@1.2.4': - resolution: {integrity: sha512-XC4If5D/hbaZvUkTV8iaZuGlQCyG6CNOlaAaJaGa13V5QMYwYjgtKk3vPP8wz3wtTVNVEVk3LRx1fOJz+YnSMw==} + '@iconify-json/logos@1.2.11': + resolution: {integrity: sha512-fOo4pGEatuyuCFNL+cwquYMa2Im0oJHRHV7lt/Qqs5Ode/lPImHCQcfTtPzZj7qYMPb/h8YHN3TG54uEowrjNQ==} - '@iconify-json/simple-icons@1.2.41': - resolution: {integrity: sha512-4tt29cKzNsxvt6rjAOVhEgpZV0L8jleTDTMdtvIJjF14Afp9aH8peuwGYyX35l6idfFwuzbvjSVfVyVjJtfmYA==} + '@iconify-json/simple-icons@1.2.86': + resolution: {integrity: sha512-t3jck5qPQuK1qy+bRn9eCoDQhIB7XSazKz1Fjp8hcan3XOAsTI5Mq/s3F0ekOKSvMQqkVORYK6ns6o6T9f5EMA==} - '@iconify-json/vscode-icons@1.2.23': - resolution: {integrity: sha512-gFTcKecKra2/b5SbGDgHGI/l8CuikHyBPmqGlK+YCmS8AK72dtDQbUekdoACsju/3TYS37QvdPoOQwnyx2LdYg==} + '@iconify-json/vscode-icons@1.2.58': + resolution: {integrity: sha512-ZM6O1GpImQ+n2+/dVijB4uDR1OVgfwoPgnVlKMnUxzJwExPTzuBb/Hd2iwnHj4gWbgBba9Io1qRolVJwYty50A==} '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} @@ -3122,6 +2907,9 @@ packages: '@iconify/utils@2.3.0': resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==} + '@iconify/utils@3.1.3': + resolution: {integrity: sha512-LPKOXPn/zV+zis1oOfGWogaXVpqUybF3ZS6SCZIsz8vg0ivVp9+fVqyYB7xq0aiST/VhUQYGO1qo6uoYSiEJqw==} + '@img/colour@1.1.0': resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} engines: {node: '>=18'} @@ -3631,14 +3419,6 @@ packages: '@ioredis/commands@1.5.1': resolution: {integrity: sha512-JH8ZL/ywcJyR9MmJ5BNqZllXNZQqQbnVZOqpPQqE1vHiFgAw4NHbvE0FOduNU8IX9babitBT46571OnPTT0Zcw==} - '@isaacs/balanced-match@4.0.1': - resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} - engines: {node: 20 || >=22} - - '@isaacs/brace-expansion@5.0.0': - resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} - engines: {node: 20 || >=22} - '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -5632,73 +5412,49 @@ packages: '@shikijs/core@1.29.2': resolution: {integrity: sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ==} - '@shikijs/core@2.5.0': - resolution: {integrity: sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==} - '@shikijs/core@3.23.0': resolution: {integrity: sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==} - '@shikijs/core@3.7.0': - resolution: {integrity: sha512-yilc0S9HvTPyahHpcum8eonYrQtmGTU0lbtwxhA6jHv4Bm1cAdlPFRCJX4AHebkCm75aKTjjRAW+DezqD1b/cg==} - '@shikijs/engine-javascript@1.29.2': resolution: {integrity: sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A==} - '@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@1.29.2': resolution: {integrity: sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==} - '@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@1.29.2': resolution: {integrity: sha512-FIBA7N3LZ+223U7cJDUYd5shmciFQlYkFXlkKVaHsCPgfVLiO+e12FmQE6Tf9vuyEsFe3dIl8qGWKXgEHL9wmQ==} - '@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@1.29.2': resolution: {integrity: sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g==} - '@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/twoslash@3.7.0': - resolution: {integrity: sha512-EjnV193iasm/M5UHVDJg6WyX6dIMCb0YhsKKlgWv3OK7iLFjuW7sUp978ZkO2OIn3niqBT6e+CX1LgoPM8jYjQ==} + '@shikijs/twoslash@3.23.0': + resolution: {integrity: sha512-pNaLJWMA3LU7PhT8tm9OQBZ1epy0jmdgeJzntBtr1EVXLbHxGzTj3mnf9vOdcl84l96qnlJXkJ/NGXZYBpXl5g==} peerDependencies: typescript: '>=5.5.0' '@shikijs/types@1.29.2': resolution: {integrity: sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==} - '@shikijs/types@2.5.0': - resolution: {integrity: sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==} - '@shikijs/types@3.23.0': resolution: {integrity: sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==} - '@shikijs/types@3.7.0': - resolution: {integrity: sha512-MGaLeaRlSWpnP0XSAum3kP3a8vtcTsITqoEPYdt3lQG3YCdQH4DnEhodkYcNMcU0uW0RffhoD1O3e0vG5eSBBg==} - - '@shikijs/vitepress-twoslash@1.29.2': - resolution: {integrity: sha512-KIwXZBqbKF0+9mLtV5IyiSBiflXm8vSGyCwFKVttpXRxpepMOcqqo1YGMW8Hd1qpt9XFqF/mRlihCSwHPXSh9A==} + '@shikijs/vitepress-twoslash@3.23.0': + resolution: {integrity: sha512-CnNsKIxxkRxRkL5+m6TNPit563TYfEEqlod8C6N1rfeZvX4xUlRrpoKyoWKmpGSNyjWWeYpMZTUH18YTTOxKfw==} '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} @@ -6566,8 +6322,8 @@ packages: resolution: {integrity: sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript/vfs@1.6.1': - resolution: {integrity: sha512-JwoxboBh7Oz1v38tPbkrZ62ZXNHAk9bJ7c9x0eI5zBfBnBYGhURdbnh7Z4smN/MV48Y5OCcZb58n972UtbazsA==} + '@typescript/vfs@1.6.4': + resolution: {integrity: sha512-PJFXFS4ZJKiJ9Qiuix6Dz/OwEIqHD7Dme1UwZhTK11vR+5dqW2ACbdndWQexBzCx+CPuMe5WBYQWCsFyGlQLlQ==} peerDependencies: typescript: '*' @@ -6701,13 +6457,6 @@ packages: vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 vue: ^3.0.0 - '@vitejs/plugin-vue@5.2.4': - resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} - engines: {node: ^18.0.0 || >=20.0.0} - peerDependencies: - vite: ^5.0.0 || ^6.0.0 - vue: ^3.2.25 - '@vitejs/plugin-vue@6.0.6': resolution: {integrity: sha512-u9HHgfrq3AjXlysn0eINFnWQOJQLO9WN6VprZ8FXl7A2bYisv3Hui9Ij+7QZ41F/WYWarHjwBbXtD7dKg3uxbg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6744,11 +6493,11 @@ packages: '@vitest/utils@3.2.4': resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} - '@volar/language-core@2.4.15': - resolution: {integrity: sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==} + '@volar/language-core@2.4.28': + resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==} - '@volar/source-map@2.4.15': - resolution: {integrity: sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==} + '@volar/source-map@2.4.28': + resolution: {integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==} '@vue-macros/common@3.1.2': resolution: {integrity: sha512-h9t4ArDdniO9ekYHAD95t9AZcAbb19lEGK+26iAjUODOIJKmObDNBSe4+6ELQAA3vtYiFPPBtHh7+cQCKi3Dng==} @@ -6775,36 +6524,18 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@vue/compiler-core@3.5.17': - resolution: {integrity: sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==} - '@vue/compiler-core@3.5.33': resolution: {integrity: sha512-3PZLQwFw4Za3TC8t0FvTy3wI16Kt+pmwcgNZca4Pj9iWL2E72a/gZlpBtAJvEdDMdCxdG/qq0C7PN0bsJuv0Rw==} - '@vue/compiler-dom@3.5.17': - resolution: {integrity: sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ==} - '@vue/compiler-dom@3.5.33': resolution: {integrity: sha512-PXq0yrfCLzzL07rbXO4awtXY1Z06LG2eu6Adg3RJFa/j3Cii217XxxLXG22N330gw7GmALCY0Z8RgXEviwgpjA==} - '@vue/compiler-sfc@3.5.17': - resolution: {integrity: sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww==} - '@vue/compiler-sfc@3.5.33': resolution: {integrity: sha512-UTUvRO9cY+rROrx/pvN9P5Z7FgA6QGfokUCfhQE4EnmUj3rVnK+CHI0LsEO1pg+I7//iRYMUfcNcCPe7tg0CoA==} - '@vue/compiler-ssr@3.5.17': - resolution: {integrity: sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ==} - '@vue/compiler-ssr@3.5.33': resolution: {integrity: sha512-IErjYdnj1qIupG5xxiVIYiiRvDhGWV4zuh/RCrwfYpuL+HWQzeU6lCk/nF9r7olWMnjKxCAkOctT2qFWFkzb1A==} - '@vue/compiler-vue2@2.7.16': - resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} - - '@vue/devtools-api@7.7.7': - resolution: {integrity: sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==} - '@vue/devtools-api@8.1.1': resolution: {integrity: sha512-bsDMJ07b3GN1puVwJb/fyFnj/U2imyswK5UQVLZwVl7O05jDrt6BHxeG5XffmOOdasOj/bOmIjxJvGPxU7pcqw==} @@ -6813,78 +6544,53 @@ packages: peerDependencies: vue: ^3.0.0 - '@vue/devtools-kit@7.7.7': - resolution: {integrity: sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==} - '@vue/devtools-kit@8.1.1': resolution: {integrity: sha512-gVBaBv++i+adg4JpH71k9ppl4soyR7Y2McEqO5YNgv0BI1kMZ7BDX5gnwkZ5COYgiCyhejZG+yGNrBAjj6Coqg==} - '@vue/devtools-shared@7.7.7': - resolution: {integrity: sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==} - '@vue/devtools-shared@8.1.1': resolution: {integrity: sha512-+h4ttmJYl/txpxHKaoZcaKpC+pvckgLzIDiSQlaQ7kKthKh8KuwoLW2D8hPJEnqKzXOvu15UHEoGyngAXCz0EQ==} - '@vue/language-core@2.1.10': - resolution: {integrity: sha512-DAI289d0K3AB5TUG3xDp9OuQ71CnrujQwJrQnfuZDwo6eGNf0UoRlPuaVNO+Zrn65PC3j0oB2i7mNmVPggeGeQ==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@vue/reactivity@3.5.17': - resolution: {integrity: sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw==} + '@vue/language-core@3.3.5': + resolution: {integrity: sha512-UkKu5nhX89fg4VhlG/FOeI10G3cj/7radKT/cy9BT4Q9qJmJlSTAc/dP63Xqs29aypN4f39xUV6PsLNk/dcD6g==} '@vue/reactivity@3.5.33': resolution: {integrity: sha512-p8UfIqyIhb0rYGlSgSBV+lPhF2iUSBcRy7enhTmPqKWadHy9kcOFYF1AejYBP9P+avnd3OBbD49DU4pLWX/94A==} - '@vue/runtime-core@3.5.17': - resolution: {integrity: sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q==} - '@vue/runtime-core@3.5.33': resolution: {integrity: sha512-UpFF45RI9//a7rvq7RdOQblb4tup7hHG9QsmIrxkFQLzQ7R8/iNQ5LE15NhLZ1/WcHMU2b47u6P33CPUelHyIQ==} - '@vue/runtime-dom@3.5.17': - resolution: {integrity: sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g==} - '@vue/runtime-dom@3.5.33': resolution: {integrity: sha512-IOxMsAOwquhfITgmOgaPYl7/j8gKUxUFoflRc+u4LxyD3+783xne8vNta1PONVCvCV9A0w7hkyEepINDqfO0tw==} - '@vue/server-renderer@3.5.17': - resolution: {integrity: sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA==} - peerDependencies: - vue: 3.5.17 - '@vue/server-renderer@3.5.33': resolution: {integrity: sha512-0xylq/8/h44lVG0pZFknv1XIdEgymq2E9n59uTWJBG+dIgiT0TMCSsxrN7nO16Z0MU0MPjFcguBbZV8Itk52Hw==} peerDependencies: vue: 3.5.33 - '@vue/shared@3.5.17': - resolution: {integrity: sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==} - '@vue/shared@3.5.33': resolution: {integrity: sha512-5vR2QIlmaLG77Ygd4pMP6+SGQ5yox9VhtnbDWTy9DzMzdmeLxZ1QqxrywEZ9sa1AVubfIJyaCG3ytyWU81ufcQ==} - '@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 @@ -6911,11 +6617,13 @@ 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 abbrev@3.0.1: resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} @@ -6988,12 +6696,8 @@ packages: ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - algoliasearch@5.29.0: - resolution: {integrity: sha512-E2l6AlTWGznM2e7vEE6T6hzObvEyXukxMOlBmVlMyixZyK1umuO/CiVc6sDBbzVH0oEviCE5IfVY1oZBmccYPQ==} - engines: {node: '>= 14.0.0'} - - alien-signals@0.2.2: - resolution: {integrity: sha512-cZIRkbERILsBOXTQmMrxc9hgpxglstn69zm+F1ARf4aPAzdAFYd6sBq87ErO0Fj3DV94tglcyHG5kQz9nDC/8A==} + alien-signals@3.2.1: + resolution: {integrity: sha512-I8FjmltrfnDFoZedi5CG8DghVYNhzb/Ijluz7tCSJH0xpd0484Kowhbb1XDYOxfJpU1p5wnM2X54dA+IfGyD1g==} amqplib@0.10.9: resolution: {integrity: sha512-jwSftI4QjS3mizvnSnOrPGYiUnm1vI2OP1iXeOUz5pb74Ua0nbf6nPyyTzuiCLEE3fMpaJORXh2K/TQ08H5xGA==} @@ -7379,15 +7083,6 @@ packages: byte-encodings@1.0.11: resolution: {integrity: sha512-+/xR2+ySc2yKGtud3DGkGSH1DNwHfRVK0KTnMhoeH36/KwG+tHQ4d9B3jxJFq7dW27YcfudkywaYJRPA2dmxzg==} - byte-size@9.0.1: - resolution: {integrity: sha512-YLe9x3rabBrcI0cueCdLS2l5ONUKywcRpTs02B8KP9/Cimhj7o3ZccGrPnRvcbyHMbb7W79/3MUJl7iGgTXKEw==} - engines: {node: '>=12.17'} - peerDependencies: - '@75lb/nature': latest - peerDependenciesMeta: - '@75lb/nature': - optional: true - bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -7688,10 +7383,6 @@ packages: resolution: {integrity: sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==} engines: {node: '>= 0.8'} - copy-anything@3.0.5: - resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} - engines: {node: '>=12.13'} - core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -7982,9 +7673,6 @@ packages: sqlite3: optional: true - de-indent@1.0.2: - resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} - debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -8403,11 +8091,6 @@ packages: es-toolkit@1.46.1: resolution: {integrity: sha512-5eNtXOs3tbfxXOj04tjjseeWkRWaoCjdEI+96DgwzZoe6c9juL49pXlzAFTI72aWC9Y8p7168g6XIKjh7k6pyQ==} - esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} - hasBin: true - esbuild@0.25.4: resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} engines: {node: '>=18'} @@ -8841,8 +8524,8 @@ packages: '@nuxt/kit': optional: true - focus-trap@7.6.5: - resolution: {integrity: sha512-7Ke1jyybbbPZyZXFxEftUtxFGLMpE2n6A+z//m4CRDlj0hW+o3iYSmh8nFlYMurOiJVDmJRilUQtJr08KfIxlg==} + focus-trap@8.2.1: + resolution: {integrity: sha512-6CxwrrFRquH7pDXb1mWxudkU9LSfYBMRZutpgddb2o6iwCk7cIRrBhyY3c8SGKcmIKdeMTrGSNg4Bedh2RSF/w==} follow-redirects@1.16.0: resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} @@ -9123,10 +8806,6 @@ packages: hastscript@9.0.1: resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - hermes-estree@0.25.1: resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} @@ -9778,6 +9457,9 @@ packages: linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + linkify-it@5.0.1: + resolution: {integrity: sha512-wVoTjP4Q6R0NW5hiZkVJaFZPWgtXfoGF+6LucL3/FtiNjmcHhYjEr5f1Kqjirc1nBW07J/ZuRFumqr2oqccEWg==} + listhen@1.9.1: resolution: {integrity: sha512-4EhoyVcXEpNlY5HJRSQpH7Rba94M8N2JmI62ePjl0lrJKXSfG0F1FAgHGxBoz/T3pe41sUEwkIRRIcaUL0/Ofw==} hasBin: true @@ -9856,6 +9538,16 @@ packages: resolution: {integrity: sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA==} engines: {bun: '>=1.0.0', deno: '>=1.30.0', node: '>=8.0.0'} + lucide-vue-next@1.0.0: + resolution: {integrity: sha512-V6SPvx1IHTj/UY+FrIYWV5faISsPSb8BnWSFDxAtezWKvWc9ZZ40PDrdu1/Qb5vg4lHWr1hs1BAMGVGm6V1Xdg==} + deprecated: Package deprecated. Please use @lucide/vue instead. + peerDependencies: + vue: '>=3.0.1' + + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + magic-regexp@0.10.0: resolution: {integrity: sha512-Uly1Bu4lO1hwHUW0CQeSWuRtzCMNO00CmXtS8N6fyvB3B979GOEEeAkiTUDsmbYLAbvpUS/Kt5c4ibosAzVyVg==} @@ -9894,6 +9586,10 @@ packages: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true + markdown-it@14.2.0: + resolution: {integrity: sha512-1TGiQiJVRQ3NPmZH6sx5Cfnmg6GQm9jvC1ch4TK511NjSJvjzKLzn5pPfZRNZkRPZP0HqCioSndqH8v2nRaWVQ==} + hasBin: true + markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} @@ -9919,6 +9615,9 @@ packages: mdast-util-from-markdown@2.0.2: resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + mdast-util-from-markdown@2.0.3: + resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==} + mdast-util-frontmatter@2.0.1: resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} @@ -9946,6 +9645,9 @@ packages: mdast-util-to-hast@13.2.0: resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + mdast-util-to-markdown@2.1.2: resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} @@ -10142,10 +9844,6 @@ packages: engines: {node: '>=18.0.0'} hasBin: true - minimatch@10.0.3: - resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} - engines: {node: 20 || >=22} - minimatch@10.2.5: resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} @@ -10168,16 +9866,13 @@ packages: resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} - minisearch@7.1.2: - resolution: {integrity: sha512-R1Pd9eF+MD5JYDDSPAp/q1ougKglm14uEkPMvQ/05RGmx6G9wvmLTrTI/Q5iPNJLYqNdsDQ7qTGIcNWR+FrHmA==} + minisearch@7.2.0: + resolution: {integrity: sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==} minizlib@3.0.2: resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} engines: {node: '>= 18'} - mitt@3.0.1: - resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} - mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} @@ -10493,9 +10188,6 @@ packages: oniguruma-to-es@2.3.0: resolution: {integrity: sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==} - oniguruma-to-es@3.1.1: - resolution: {integrity: sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==} - oniguruma-to-es@4.3.6: resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} @@ -10645,10 +10337,6 @@ packages: path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} - path-to-regexp@8.2.0: - resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} - engines: {node: '>=16'} - path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -10671,9 +10359,6 @@ packages: resolution: {integrity: sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg==} engines: {node: '>=14.16'} - perfect-debounce@1.0.0: - resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} - perfect-debounce@2.1.0: resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} @@ -11031,9 +10716,6 @@ packages: resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} engines: {node: '>=20'} - preact@10.26.9: - resolution: {integrity: sha512-SSjF9vcnF27mJK1XyFMNJzFd5u3pQiATFqoaDy03XuN00u4ziveVVEGt5RKJrDR8MHE/wJo9Nnad56RLzS2RMA==} - prebuild-install@7.1.3: resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} engines: {node: '>=10'} @@ -11329,9 +11011,6 @@ packages: regex@5.1.1: resolution: {integrity: sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==} - regex@6.0.1: - resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} - regex@6.1.0: resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} @@ -11578,9 +11257,6 @@ packages: scule@1.3.0: resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} - search-insights@2.17.3: - resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} - section-matter@1.0.0: resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} engines: {node: '>=4'} @@ -11691,9 +11367,6 @@ packages: shiki@1.29.2: resolution: {integrity: sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg==} - shiki@2.5.0: - resolution: {integrity: sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==} - shiki@3.23.0: resolution: {integrity: sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==} @@ -11808,10 +11481,6 @@ 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'} - split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} @@ -12022,10 +11691,6 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true - superjson@2.2.2: - resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==} - engines: {node: '>=16'} - supports-color@10.2.2: resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} engines: {node: '>=18'} @@ -12068,8 +11733,8 @@ packages: resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} engines: {node: '>=18'} - tabbable@6.2.0: - resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + tabbable@6.4.0: + resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} tagged-tag@1.0.0: resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} @@ -12217,8 +11882,8 @@ packages: resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==} engines: {node: '>=14.16'} - tokenx@1.1.0: - resolution: {integrity: sha512-KCjtiC2niPwTSuz4ktM82Ki5bjqBwYpssiHDsGr5BpejN/B3ksacRvrsdoxljdMIh2nCX78alnDkeemBmYUmTA==} + tokenx@1.3.0: + resolution: {integrity: sha512-NLdXTEZkKiO0gZuLtMoZKjCXTREXeZZt8nnnNeyoXtNZAfG/GKGSbQtLU5STspc0rMSwcA+UJfWZkbNU01iKmQ==} totalist@3.0.1: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} @@ -12324,26 +11989,18 @@ packages: tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - twoslash-protocol@0.2.12: - resolution: {integrity: sha512-5qZLXVYfZ9ABdjqbvPc4RWMr7PrpPaaDSeaYY55vl/w1j6H6kzsWK/urAEIXlzYlyrFmyz1UbwIt+AA0ck+wbg==} + twoslash-protocol@0.3.8: + resolution: {integrity: sha512-HmvAHoiEviK8LqvAQyc9/irkdvwTUiR1fHmNwH/0gq8EHxyBt4PWVPixjEXg6wJu1u6yBrILEWXGK9Kw58/8yQ==} - twoslash-protocol@0.3.1: - resolution: {integrity: sha512-BMePTL9OkuNISSyyMclBBhV2s9++DiOCyhhCoV5Kaht6eaWLwVjCCUJHY33eZJPsyKeZYS8Wzz0h+XI01VohVw==} - - twoslash-vue@0.2.12: - resolution: {integrity: sha512-kxH60DLn2QBcN2wjqxgMDkyRgmPXsytv7fJIlsyFMDPSkm1/lMrI/UMrNAshNaRHcI+hv8x3h/WBgcvlb2RNAQ==} + twoslash-vue@0.3.8: + resolution: {integrity: sha512-5HZAnkQ1R6NXqW9mqsHx4aHVWPb5gb4gfEKiaNczi3q6U7vDZeVv9eONRuPs4qdCd5OJSAIpHeXxIDZmjr0Jww==} peerDependencies: - typescript: '*' - - twoslash@0.2.12: - resolution: {integrity: sha512-tEHPASMqi7kqwfJbkk7hc/4EhlrKCSLcur+TcvYki3vhIfaRMXnXjaYFgXpoZRbT6GdprD4tGuVBEmTpUgLBsw==} - peerDependencies: - typescript: '*' + typescript: ^5.5.0 || ^6.0.0 - twoslash@0.3.1: - resolution: {integrity: sha512-OGqMTGvqXTcb92YQdwGfEdK0nZJA64Aj/ChLOelbl3TfYch2IoBST0Yx4C0LQ7Lzyqm9RpgcpgDxeXQIz4p2Kg==} + twoslash@0.3.8: + resolution: {integrity: sha512-OeDz0kDl8sqPUN3nr7gqcvOs70f5lZsdhKYTX3/SgB9OvdadzzoYJI/4SBXhXV1HG8E9fLc+e17itoRYTxmoig==} peerDependencies: - typescript: ^5.5.0 + typescript: ^5.5.0 || ^6.0.0 type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} @@ -12543,6 +12200,9 @@ packages: unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} @@ -12788,37 +12448,6 @@ packages: vite: ^6.0.0 || ^7.0.0 vue: ^3.5.0 - vite@5.4.19: - resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - vite@6.4.2: resolution: {integrity: sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -12947,14 +12576,17 @@ packages: vite: optional: true - vitepress-plugin-group-icons@1.6.1: - resolution: {integrity: sha512-eoFlFAhAy/yTZDbaIgA/nMbjVYXkf8pz8rr75MN2VCw7yH60I3cw6bW5EuwddAeafZtBqbo8OsEGU7TIWFiAjg==} + vitepress-plugin-group-icons@1.7.5: + resolution: {integrity: sha512-QzcroUuIiVKyXpmEiiHVbfRTQIy9Zbwxpk5JC/zavO8mavitwumz2RZWlwTchMCCHducYyPptkYvXvdnNUWkog==} peerDependencies: - markdown-it: '>=14' vite: '>=3' + peerDependenciesMeta: + vite: + optional: true - vitepress-plugin-llms@1.6.0: - resolution: {integrity: sha512-5EjrMvtggY61fAnhC+rldzw1UqPxwdbtsh/w15Z/Gy7u/SOsPQgSdDzoQm1iFet6ofAzUB2TXA8wj5KZX9TKSA==} + vitepress-plugin-llms@1.13.1: + resolution: {integrity: sha512-m+rxyghF5INi8hBw0huFPx6+VvaX1tDGvw1H7FdXowaZJ3dcRY5ShgbmK1AQlmeOFMdd16H8WarhSHLPXF/2OA==} + engines: {node: '>=18'} vitepress-plugin-mermaid@2.0.17: resolution: {integrity: sha512-IUzYpwf61GC6k0XzfmAmNrLvMi9TRrVRMsUyCA8KNXhg/mQ1VqWnO0/tBVPiX5UoKF1mDUwqn5QV4qAJl6JnUg==} @@ -12962,15 +12594,18 @@ packages: mermaid: 10 || 11 vitepress: ^1.0.0 || ^1.0.0-alpha - vitepress@1.6.3: - resolution: {integrity: sha512-fCkfdOk8yRZT8GD9BFqusW3+GggWYZ/rYncOfmgcDtP3ualNHCAg+Robxp2/6xfH1WwPHtGpPwv7mbA3qomtBw==} + vitepress@2.0.0-alpha.17: + resolution: {integrity: sha512-Z3VPUpwk/bHYqt1uMVOOK1/4xFiWQov1GNc2FvMdz6kvje4JRXEOngVI9C+bi5jeedMSHiA4dwKkff1NCvbZ9Q==} hasBin: true peerDependencies: markdown-it-mathjax3: ^4 + oxc-minify: '*' postcss: ^8 peerDependenciesMeta: markdown-it-mathjax3: optional: true + oxc-minify: + optional: true postcss: optional: true @@ -13051,14 +12686,6 @@ packages: pinia: optional: true - vue@3.5.17: - resolution: {integrity: sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - vue@3.5.33: resolution: {integrity: sha512-1AgChhx5w3ALgT4oK3acm2Es/7jyZhWSVUfs3rOBlGQC0rjEDkS7G4lWlJJGGNQD+BV3reCwbQrOe1mPNwKHBQ==} peerDependencies: @@ -13356,111 +12983,6 @@ packages: snapshots: - '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.29.0)(algoliasearch@5.29.0)(search-insights@2.17.3)': - dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.29.0)(algoliasearch@5.29.0)(search-insights@2.17.3) - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.29.0)(algoliasearch@5.29.0) - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - - search-insights - - '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.29.0)(algoliasearch@5.29.0)(search-insights@2.17.3)': - dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.29.0)(algoliasearch@5.29.0) - search-insights: 2.17.3 - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - - '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.29.0)(algoliasearch@5.29.0)': - dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.29.0)(algoliasearch@5.29.0) - '@algolia/client-search': 5.29.0 - algoliasearch: 5.29.0 - - '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.29.0)(algoliasearch@5.29.0)': - dependencies: - '@algolia/client-search': 5.29.0 - algoliasearch: 5.29.0 - - '@algolia/client-abtesting@5.29.0': - dependencies: - '@algolia/client-common': 5.29.0 - '@algolia/requester-browser-xhr': 5.29.0 - '@algolia/requester-fetch': 5.29.0 - '@algolia/requester-node-http': 5.29.0 - - '@algolia/client-analytics@5.29.0': - dependencies: - '@algolia/client-common': 5.29.0 - '@algolia/requester-browser-xhr': 5.29.0 - '@algolia/requester-fetch': 5.29.0 - '@algolia/requester-node-http': 5.29.0 - - '@algolia/client-common@5.29.0': {} - - '@algolia/client-insights@5.29.0': - dependencies: - '@algolia/client-common': 5.29.0 - '@algolia/requester-browser-xhr': 5.29.0 - '@algolia/requester-fetch': 5.29.0 - '@algolia/requester-node-http': 5.29.0 - - '@algolia/client-personalization@5.29.0': - dependencies: - '@algolia/client-common': 5.29.0 - '@algolia/requester-browser-xhr': 5.29.0 - '@algolia/requester-fetch': 5.29.0 - '@algolia/requester-node-http': 5.29.0 - - '@algolia/client-query-suggestions@5.29.0': - dependencies: - '@algolia/client-common': 5.29.0 - '@algolia/requester-browser-xhr': 5.29.0 - '@algolia/requester-fetch': 5.29.0 - '@algolia/requester-node-http': 5.29.0 - - '@algolia/client-search@5.29.0': - dependencies: - '@algolia/client-common': 5.29.0 - '@algolia/requester-browser-xhr': 5.29.0 - '@algolia/requester-fetch': 5.29.0 - '@algolia/requester-node-http': 5.29.0 - - '@algolia/ingestion@1.29.0': - dependencies: - '@algolia/client-common': 5.29.0 - '@algolia/requester-browser-xhr': 5.29.0 - '@algolia/requester-fetch': 5.29.0 - '@algolia/requester-node-http': 5.29.0 - - '@algolia/monitoring@1.29.0': - dependencies: - '@algolia/client-common': 5.29.0 - '@algolia/requester-browser-xhr': 5.29.0 - '@algolia/requester-fetch': 5.29.0 - '@algolia/requester-node-http': 5.29.0 - - '@algolia/recommend@5.29.0': - dependencies: - '@algolia/client-common': 5.29.0 - '@algolia/requester-browser-xhr': 5.29.0 - '@algolia/requester-fetch': 5.29.0 - '@algolia/requester-node-http': 5.29.0 - - '@algolia/requester-browser-xhr@5.29.0': - dependencies: - '@algolia/client-common': 5.29.0 - - '@algolia/requester-fetch@5.29.0': - dependencies: - '@algolia/client-common': 5.29.0 - - '@algolia/requester-node-http@5.29.0': - dependencies: - '@algolia/client-common': 5.29.0 - '@alinea/suite@0.6.3': {} '@alloc/quick-lru@5.2.0': {} @@ -13902,30 +13424,11 @@ snapshots: ky: 1.14.0 undici: 6.22.0 - '@docsearch/css@3.8.2': {} + '@docsearch/css@4.6.3': {} - '@docsearch/js@3.8.2(@algolia/client-search@5.29.0)(@types/react@18.3.23)(search-insights@2.17.3)': - dependencies: - '@docsearch/react': 3.8.2(@algolia/client-search@5.29.0)(@types/react@18.3.23)(search-insights@2.17.3) - preact: 10.26.9 - transitivePeerDependencies: - - '@algolia/client-search' - - '@types/react' - - react - - react-dom - - search-insights - - '@docsearch/react@3.8.2(@algolia/client-search@5.29.0)(@types/react@18.3.23)(search-insights@2.17.3)': - dependencies: - '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.29.0)(algoliasearch@5.29.0)(search-insights@2.17.3) - '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.29.0)(algoliasearch@5.29.0) - '@docsearch/css': 3.8.2 - algoliasearch: 5.29.0 - optionalDependencies: - '@types/react': 18.3.23 - search-insights: 2.17.3 - transitivePeerDependencies: - - '@algolia/client-search' + '@docsearch/js@4.6.3': {} + + '@docsearch/sidepanel-js@4.6.3': {} '@dxup/nuxt@0.4.1(magicast@0.5.2)(typescript@6.0.3)': dependencies: @@ -13957,9 +13460,6 @@ snapshots: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.21.5': - optional: true - '@esbuild/aix-ppc64@0.25.4': optional: true @@ -13969,9 +13469,6 @@ snapshots: '@esbuild/aix-ppc64@0.27.7': optional: true - '@esbuild/android-arm64@0.21.5': - optional: true - '@esbuild/android-arm64@0.25.4': optional: true @@ -13981,9 +13478,6 @@ snapshots: '@esbuild/android-arm64@0.27.7': optional: true - '@esbuild/android-arm@0.21.5': - optional: true - '@esbuild/android-arm@0.25.4': optional: true @@ -13993,9 +13487,6 @@ snapshots: '@esbuild/android-arm@0.27.7': optional: true - '@esbuild/android-x64@0.21.5': - optional: true - '@esbuild/android-x64@0.25.4': optional: true @@ -14005,9 +13496,6 @@ snapshots: '@esbuild/android-x64@0.27.7': optional: true - '@esbuild/darwin-arm64@0.21.5': - optional: true - '@esbuild/darwin-arm64@0.25.4': optional: true @@ -14017,9 +13505,6 @@ snapshots: '@esbuild/darwin-arm64@0.27.7': optional: true - '@esbuild/darwin-x64@0.21.5': - optional: true - '@esbuild/darwin-x64@0.25.4': optional: true @@ -14029,9 +13514,6 @@ snapshots: '@esbuild/darwin-x64@0.27.7': optional: true - '@esbuild/freebsd-arm64@0.21.5': - optional: true - '@esbuild/freebsd-arm64@0.25.4': optional: true @@ -14041,19 +13523,13 @@ snapshots: '@esbuild/freebsd-arm64@0.27.7': optional: true - '@esbuild/freebsd-x64@0.21.5': - optional: true - '@esbuild/freebsd-x64@0.25.4': optional: true '@esbuild/freebsd-x64@0.25.5': optional: true - '@esbuild/freebsd-x64@0.27.7': - optional: true - - '@esbuild/linux-arm64@0.21.5': + '@esbuild/freebsd-x64@0.27.7': optional: true '@esbuild/linux-arm64@0.25.4': @@ -14065,9 +13541,6 @@ snapshots: '@esbuild/linux-arm64@0.27.7': optional: true - '@esbuild/linux-arm@0.21.5': - optional: true - '@esbuild/linux-arm@0.25.4': optional: true @@ -14077,9 +13550,6 @@ snapshots: '@esbuild/linux-arm@0.27.7': optional: true - '@esbuild/linux-ia32@0.21.5': - optional: true - '@esbuild/linux-ia32@0.25.4': optional: true @@ -14089,9 +13559,6 @@ snapshots: '@esbuild/linux-ia32@0.27.7': optional: true - '@esbuild/linux-loong64@0.21.5': - optional: true - '@esbuild/linux-loong64@0.25.4': optional: true @@ -14101,9 +13568,6 @@ snapshots: '@esbuild/linux-loong64@0.27.7': optional: true - '@esbuild/linux-mips64el@0.21.5': - optional: true - '@esbuild/linux-mips64el@0.25.4': optional: true @@ -14113,9 +13577,6 @@ snapshots: '@esbuild/linux-mips64el@0.27.7': optional: true - '@esbuild/linux-ppc64@0.21.5': - optional: true - '@esbuild/linux-ppc64@0.25.4': optional: true @@ -14125,9 +13586,6 @@ snapshots: '@esbuild/linux-ppc64@0.27.7': optional: true - '@esbuild/linux-riscv64@0.21.5': - optional: true - '@esbuild/linux-riscv64@0.25.4': optional: true @@ -14137,9 +13595,6 @@ snapshots: '@esbuild/linux-riscv64@0.27.7': optional: true - '@esbuild/linux-s390x@0.21.5': - optional: true - '@esbuild/linux-s390x@0.25.4': optional: true @@ -14149,9 +13604,6 @@ snapshots: '@esbuild/linux-s390x@0.27.7': optional: true - '@esbuild/linux-x64@0.21.5': - optional: true - '@esbuild/linux-x64@0.25.4': optional: true @@ -14170,9 +13622,6 @@ snapshots: '@esbuild/netbsd-arm64@0.27.7': optional: true - '@esbuild/netbsd-x64@0.21.5': - optional: true - '@esbuild/netbsd-x64@0.25.4': optional: true @@ -14191,9 +13640,6 @@ snapshots: '@esbuild/openbsd-arm64@0.27.7': optional: true - '@esbuild/openbsd-x64@0.21.5': - optional: true - '@esbuild/openbsd-x64@0.25.4': optional: true @@ -14206,9 +13652,6 @@ snapshots: '@esbuild/openharmony-arm64@0.27.7': optional: true - '@esbuild/sunos-x64@0.21.5': - optional: true - '@esbuild/sunos-x64@0.25.4': optional: true @@ -14218,9 +13661,6 @@ snapshots: '@esbuild/sunos-x64@0.27.7': optional: true - '@esbuild/win32-arm64@0.21.5': - optional: true - '@esbuild/win32-arm64@0.25.4': optional: true @@ -14230,9 +13670,6 @@ snapshots: '@esbuild/win32-arm64@0.27.7': optional: true - '@esbuild/win32-ia32@0.21.5': - optional: true - '@esbuild/win32-ia32@0.25.4': optional: true @@ -14242,9 +13679,6 @@ snapshots: '@esbuild/win32-ia32@0.27.7': optional: true - '@esbuild/win32-x64@0.21.5': - optional: true - '@esbuild/win32-x64@0.25.4': optional: true @@ -14365,6 +13799,8 @@ snapshots: '@floating-ui/utils@0.2.10': {} + '@fontsource-variable/bricolage-grotesque@5.2.10': {} + '@fxts/core@1.20.0': dependencies: tslib: 2.8.1 @@ -14414,15 +13850,15 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@iconify-json/logos@1.2.4': + '@iconify-json/logos@1.2.11': dependencies: '@iconify/types': 2.0.0 - '@iconify-json/simple-icons@1.2.41': + '@iconify-json/simple-icons@1.2.86': dependencies: '@iconify/types': 2.0.0 - '@iconify-json/vscode-icons@1.2.23': + '@iconify-json/vscode-icons@1.2.58': dependencies: '@iconify/types': 2.0.0 @@ -14441,6 +13877,12 @@ snapshots: transitivePeerDependencies: - supports-color + '@iconify/utils@3.1.3': + dependencies: + '@antfu/install-pkg': 1.1.0 + '@iconify/types': 2.0.0 + import-meta-resolve: 4.2.0 + '@img/colour@1.1.0': optional: true @@ -14846,12 +14288,6 @@ snapshots: '@ioredis/commands@1.5.1': {} - '@isaacs/balanced-match@4.0.1': {} - - '@isaacs/brace-expansion@5.0.0': - dependencies: - '@isaacs/balanced-match': 4.0.1 - '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -16915,15 +16351,6 @@ snapshots: '@types/hast': 3.0.4 hast-util-to-html: 9.0.5 - '@shikijs/core@2.5.0': - dependencies: - '@shikijs/engine-javascript': 2.5.0 - '@shikijs/engine-oniguruma': 2.5.0 - '@shikijs/types': 2.5.0 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - hast-util-to-html: 9.0.5 - '@shikijs/core@3.23.0': dependencies: '@shikijs/types': 3.23.0 @@ -16931,25 +16358,12 @@ snapshots: '@types/hast': 3.0.4 hast-util-to-html: 9.0.5 - '@shikijs/core@3.7.0': - dependencies: - '@shikijs/types': 3.7.0 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - hast-util-to-html: 9.0.5 - '@shikijs/engine-javascript@1.29.2': dependencies: '@shikijs/types': 1.29.2 '@shikijs/vscode-textmate': 10.0.2 oniguruma-to-es: 2.3.0 - '@shikijs/engine-javascript@2.5.0': - dependencies: - '@shikijs/types': 2.5.0 - '@shikijs/vscode-textmate': 10.0.2 - oniguruma-to-es: 3.1.1 - '@shikijs/engine-javascript@3.23.0': dependencies: '@shikijs/types': 3.23.0 @@ -16961,11 +16375,6 @@ snapshots: '@shikijs/types': 1.29.2 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/engine-oniguruma@2.5.0': - dependencies: - '@shikijs/types': 2.5.0 - '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/engine-oniguruma@3.23.0': dependencies: '@shikijs/types': 3.23.0 @@ -16975,10 +16384,6 @@ snapshots: dependencies: '@shikijs/types': 1.29.2 - '@shikijs/langs@2.5.0': - dependencies: - '@shikijs/types': 2.5.0 - '@shikijs/langs@3.23.0': dependencies: '@shikijs/types': 3.23.0 @@ -16987,24 +16392,20 @@ snapshots: dependencies: '@shikijs/types': 1.29.2 - '@shikijs/themes@2.5.0': - dependencies: - '@shikijs/types': 2.5.0 - '@shikijs/themes@3.23.0': dependencies: '@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/twoslash@3.7.0(typescript@6.0.3)': + '@shikijs/twoslash@3.23.0(typescript@6.0.3)': dependencies: - '@shikijs/core': 3.7.0 - '@shikijs/types': 3.7.0 - twoslash: 0.3.1(typescript@6.0.3) + '@shikijs/core': 3.23.0 + '@shikijs/types': 3.23.0 + twoslash: 0.3.8(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -17014,32 +16415,26 @@ snapshots: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 - '@shikijs/types@2.5.0': - dependencies: - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - '@shikijs/types@3.23.0': dependencies: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 - '@shikijs/types@3.7.0': - dependencies: - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - - '@shikijs/vitepress-twoslash@1.29.2(typescript@6.0.3)': + '@shikijs/vitepress-twoslash@3.23.0(typescript@6.0.3)': dependencies: - '@shikijs/twoslash': 3.7.0(typescript@6.0.3) - floating-vue: 5.2.2(vue@3.5.17(typescript@6.0.3)) - mdast-util-from-markdown: 2.0.2 + '@shikijs/twoslash': 3.23.0(typescript@6.0.3) + floating-vue: 5.2.2(vue@3.5.33(typescript@6.0.3)) + lz-string: 1.5.0 + magic-string: 0.30.21 + markdown-it: 14.2.0 + mdast-util-from-markdown: 2.0.3 mdast-util-gfm: 3.1.0 - mdast-util-to-hast: 13.2.0 - shiki: 1.29.2 - twoslash: 0.2.12(typescript@6.0.3) - twoslash-vue: 0.2.12(typescript@6.0.3) - vue: 3.5.17(typescript@6.0.3) + mdast-util-to-hast: 13.2.1 + ohash: 2.0.11 + shiki: 3.23.0 + twoslash: 0.3.8(typescript@6.0.3) + twoslash-vue: 0.3.8(typescript@6.0.3) + vue: 3.5.33(typescript@6.0.3) transitivePeerDependencies: - '@nuxt/kit' - supports-color @@ -18223,7 +17618,7 @@ snapshots: '@typescript-eslint/types': 8.59.0 eslint-visitor-keys: 5.0.1 - '@typescript/vfs@1.6.1(typescript@6.0.3)': + '@typescript/vfs@1.6.4(typescript@6.0.3)': dependencies: debug: 4.4.3 typescript: 6.0.3 @@ -18372,11 +17767,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.2.4(vite@5.4.19(@types/node@22.19.1)(lightningcss@1.30.1)(terser@5.46.1))(vue@3.5.17(typescript@6.0.3))': - dependencies: - vite: 5.4.19(@types/node@22.19.1)(lightningcss@1.30.1)(terser@5.46.1) - vue: 3.5.17(typescript@6.0.3) - '@vitejs/plugin-vue@6.0.6(vite@7.3.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0))(vue@3.5.33(typescript@6.0.3))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.13 @@ -18425,11 +17815,11 @@ snapshots: loupe: 3.2.1 tinyrainbow: 2.0.0 - '@volar/language-core@2.4.15': + '@volar/language-core@2.4.28': dependencies: - '@volar/source-map': 2.4.15 + '@volar/source-map': 2.4.28 - '@volar/source-map@2.4.15': {} + '@volar/source-map@2.4.28': {} '@vue-macros/common@3.1.2(vue@3.5.33(typescript@6.0.3))': dependencies: @@ -18470,14 +17860,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@vue/compiler-core@3.5.17': - dependencies: - '@babel/parser': 7.29.2 - '@vue/shared': 3.5.17 - entities: 4.5.0 - estree-walker: 2.0.2 - source-map-js: 1.2.1 - '@vue/compiler-core@3.5.33': dependencies: '@babel/parser': 7.29.2 @@ -18486,28 +17868,11 @@ snapshots: estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.5.17': - dependencies: - '@vue/compiler-core': 3.5.17 - '@vue/shared': 3.5.17 - '@vue/compiler-dom@3.5.33': dependencies: '@vue/compiler-core': 3.5.33 '@vue/shared': 3.5.33 - '@vue/compiler-sfc@3.5.17': - dependencies: - '@babel/parser': 7.29.2 - '@vue/compiler-core': 3.5.17 - '@vue/compiler-dom': 3.5.17 - '@vue/compiler-ssr': 3.5.17 - '@vue/shared': 3.5.17 - estree-walker: 2.0.2 - magic-string: 0.30.21 - postcss: 8.5.10 - source-map-js: 1.2.1 - '@vue/compiler-sfc@3.5.33': dependencies: '@babel/parser': 7.29.2 @@ -18520,25 +17885,11 @@ snapshots: postcss: 8.5.10 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.5.17': - dependencies: - '@vue/compiler-dom': 3.5.17 - '@vue/shared': 3.5.17 - '@vue/compiler-ssr@3.5.33': dependencies: '@vue/compiler-dom': 3.5.33 '@vue/shared': 3.5.33 - '@vue/compiler-vue2@2.7.16': - dependencies: - de-indent: 1.0.2 - he: 1.2.0 - - '@vue/devtools-api@7.7.7': - dependencies: - '@vue/devtools-kit': 7.7.7 - '@vue/devtools-api@8.1.1': dependencies: '@vue/devtools-kit': 8.1.1 @@ -18549,16 +17900,6 @@ snapshots: '@vue/devtools-shared': 8.1.1 vue: 3.5.33(typescript@6.0.3) - '@vue/devtools-kit@7.7.7': - dependencies: - '@vue/devtools-shared': 7.7.7 - birpc: 2.9.0 - hookable: 5.5.3 - mitt: 3.0.1 - perfect-debounce: 1.0.0 - speakingurl: 14.0.1 - superjson: 2.2.2 - '@vue/devtools-kit@8.1.1': dependencies: '@vue/devtools-shared': 8.1.1 @@ -18566,50 +17907,27 @@ snapshots: hookable: 5.5.3 perfect-debounce: 2.1.0 - '@vue/devtools-shared@7.7.7': - dependencies: - rfdc: 1.4.1 - '@vue/devtools-shared@8.1.1': {} - '@vue/language-core@2.1.10(typescript@6.0.3)': + '@vue/language-core@3.3.5': dependencies: - '@volar/language-core': 2.4.15 + '@volar/language-core': 2.4.28 '@vue/compiler-dom': 3.5.33 - '@vue/compiler-vue2': 2.7.16 '@vue/shared': 3.5.33 - alien-signals: 0.2.2 - minimatch: 9.0.5 + alien-signals: 3.2.1 muggle-string: 0.4.1 path-browserify: 1.0.1 - optionalDependencies: - typescript: 6.0.3 - - '@vue/reactivity@3.5.17': - dependencies: - '@vue/shared': 3.5.17 + picomatch: 4.0.4 '@vue/reactivity@3.5.33': dependencies: '@vue/shared': 3.5.33 - '@vue/runtime-core@3.5.17': - dependencies: - '@vue/reactivity': 3.5.17 - '@vue/shared': 3.5.17 - '@vue/runtime-core@3.5.33': dependencies: '@vue/reactivity': 3.5.33 '@vue/shared': 3.5.33 - '@vue/runtime-dom@3.5.17': - dependencies: - '@vue/reactivity': 3.5.17 - '@vue/runtime-core': 3.5.17 - '@vue/shared': 3.5.17 - csstype: 3.2.3 - '@vue/runtime-dom@3.5.33': dependencies: '@vue/reactivity': 3.5.33 @@ -18617,49 +17935,35 @@ snapshots: '@vue/shared': 3.5.33 csstype: 3.2.3 - '@vue/server-renderer@3.5.17(vue@3.5.17(typescript@6.0.3))': - dependencies: - '@vue/compiler-ssr': 3.5.17 - '@vue/shared': 3.5.17 - vue: 3.5.17(typescript@6.0.3) - '@vue/server-renderer@3.5.33(vue@3.5.33(typescript@6.0.3))': dependencies: '@vue/compiler-ssr': 3.5.33 '@vue/shared': 3.5.33 vue: 3.5.33(typescript@6.0.3) - '@vue/shared@3.5.17': {} - '@vue/shared@3.5.33': {} - '@vueuse/core@12.8.2(typescript@6.0.3)': + '@vueuse/core@14.3.0(vue@3.5.33(typescript@6.0.3))': dependencies: '@types/web-bluetooth': 0.0.21 - '@vueuse/metadata': 12.8.2 - '@vueuse/shared': 12.8.2(typescript@6.0.3) + '@vueuse/metadata': 14.3.0 + '@vueuse/shared': 14.3.0(vue@3.5.33(typescript@6.0.3)) vue: 3.5.33(typescript@6.0.3) - transitivePeerDependencies: - - typescript - '@vueuse/integrations@12.8.2(focus-trap@7.6.5)(fuse.js@7.3.0)(typescript@6.0.3)': + '@vueuse/integrations@14.3.0(focus-trap@8.2.1)(fuse.js@7.3.0)(vue@3.5.33(typescript@6.0.3))': dependencies: - '@vueuse/core': 12.8.2(typescript@6.0.3) - '@vueuse/shared': 12.8.2(typescript@6.0.3) + '@vueuse/core': 14.3.0(vue@3.5.33(typescript@6.0.3)) + '@vueuse/shared': 14.3.0(vue@3.5.33(typescript@6.0.3)) vue: 3.5.33(typescript@6.0.3) optionalDependencies: - focus-trap: 7.6.5 + focus-trap: 8.2.1 fuse.js: 7.3.0 - transitivePeerDependencies: - - typescript - '@vueuse/metadata@12.8.2': {} + '@vueuse/metadata@14.3.0': {} - '@vueuse/shared@12.8.2(typescript@6.0.3)': + '@vueuse/shared@14.3.0(vue@3.5.33(typescript@6.0.3))': dependencies: vue: 3.5.33(typescript@6.0.3) - transitivePeerDependencies: - - typescript abbrev@3.0.1: {} @@ -18718,23 +18022,7 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - algoliasearch@5.29.0: - dependencies: - '@algolia/client-abtesting': 5.29.0 - '@algolia/client-analytics': 5.29.0 - '@algolia/client-common': 5.29.0 - '@algolia/client-insights': 5.29.0 - '@algolia/client-personalization': 5.29.0 - '@algolia/client-query-suggestions': 5.29.0 - '@algolia/client-search': 5.29.0 - '@algolia/ingestion': 1.29.0 - '@algolia/monitoring': 1.29.0 - '@algolia/recommend': 5.29.0 - '@algolia/requester-browser-xhr': 5.29.0 - '@algolia/requester-fetch': 5.29.0 - '@algolia/requester-node-http': 5.29.0 - - alien-signals@0.2.2: {} + alien-signals@3.2.1: {} amqplib@0.10.9: dependencies: @@ -19251,8 +18539,6 @@ snapshots: byte-encodings@1.0.11: {} - byte-size@9.0.1: {} - bytes@3.1.2: {} bytestreamjs@2.0.1: {} @@ -19532,10 +18818,6 @@ snapshots: depd: 2.0.0 keygrip: 1.1.0 - copy-anything@3.0.5: - dependencies: - is-what: 4.1.16 - core-util-is@1.0.3: {} cose-base@1.0.3: @@ -19872,8 +19154,6 @@ snapshots: drizzle-orm: 0.45.2(@cloudflare/workers-types@4.20260511.1)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.6.1)(better-sqlite3@12.9.0)(bun-types@1.3.3)(mysql2@3.22.3(@types/node@24.3.0))(postgres@3.4.7) mysql2: 3.22.3(@types/node@24.3.0) - de-indent@1.0.2: {} - debug@2.6.9: dependencies: ms: 2.0.0 @@ -20230,32 +19510,6 @@ snapshots: es-toolkit@1.46.1: {} - esbuild@0.21.5: - optionalDependencies: - '@esbuild/aix-ppc64': 0.21.5 - '@esbuild/android-arm': 0.21.5 - '@esbuild/android-arm64': 0.21.5 - '@esbuild/android-x64': 0.21.5 - '@esbuild/darwin-arm64': 0.21.5 - '@esbuild/darwin-x64': 0.21.5 - '@esbuild/freebsd-arm64': 0.21.5 - '@esbuild/freebsd-x64': 0.21.5 - '@esbuild/linux-arm': 0.21.5 - '@esbuild/linux-arm64': 0.21.5 - '@esbuild/linux-ia32': 0.21.5 - '@esbuild/linux-loong64': 0.21.5 - '@esbuild/linux-mips64el': 0.21.5 - '@esbuild/linux-ppc64': 0.21.5 - '@esbuild/linux-riscv64': 0.21.5 - '@esbuild/linux-s390x': 0.21.5 - '@esbuild/linux-x64': 0.21.5 - '@esbuild/netbsd-x64': 0.21.5 - '@esbuild/openbsd-x64': 0.21.5 - '@esbuild/sunos-x64': 0.21.5 - '@esbuild/win32-arm64': 0.21.5 - '@esbuild/win32-ia32': 0.21.5 - '@esbuild/win32-x64': 0.21.5 - esbuild@0.25.4: optionalDependencies: '@esbuild/aix-ppc64': 0.25.4 @@ -21113,15 +20367,15 @@ snapshots: flattie@1.1.1: {} - floating-vue@5.2.2(vue@3.5.17(typescript@6.0.3)): + floating-vue@5.2.2(vue@3.5.33(typescript@6.0.3)): dependencies: '@floating-ui/dom': 1.1.1 - vue: 3.5.17(typescript@6.0.3) - vue-resize: 2.0.0-alpha.1(vue@3.5.17(typescript@6.0.3)) + vue: 3.5.33(typescript@6.0.3) + vue-resize: 2.0.0-alpha.1(vue@3.5.33(typescript@6.0.3)) - focus-trap@7.6.5: + focus-trap@8.2.1: dependencies: - tabbable: 6.2.0 + tabbable: 6.4.0 follow-redirects@1.16.0: {} @@ -21470,8 +20724,6 @@ snapshots: property-information: 7.1.0 space-separated-tokens: 2.0.2 - he@1.2.0: {} - hermes-estree@0.25.1: {} hermes-parser@0.25.1: @@ -22153,6 +21405,10 @@ snapshots: dependencies: uc.micro: 2.1.0 + linkify-it@5.0.1: + dependencies: + uc.micro: 2.1.0 + listhen@1.9.1: dependencies: '@parcel/watcher': 2.5.6 @@ -22233,6 +21489,12 @@ snapshots: lru.min@1.1.4: {} + lucide-vue-next@1.0.0(vue@3.5.33(typescript@6.0.3)): + dependencies: + vue: 3.5.33(typescript@6.0.3) + + lz-string@1.5.0: {} + magic-regexp@0.10.0: dependencies: estree-walker: 3.0.3 @@ -22289,6 +21551,15 @@ snapshots: punycode.js: 2.3.1 uc.micro: 2.1.0 + markdown-it@14.2.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.1 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + markdown-table@3.0.4: {} markdown-title@1.0.2: {} @@ -22308,7 +21579,7 @@ snapshots: '@types/mdast': 4.0.4 escape-string-regexp: 5.0.0 unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 + unist-util-visit-parents: 6.0.2 mdast-util-from-markdown@2.0.2: dependencies: @@ -22327,12 +21598,29 @@ snapshots: transitivePeerDependencies: - supports-color + mdast-util-from-markdown@2.0.3: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + mdast-util-frontmatter@2.0.1: dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 escape-string-regexp: 5.0.0 - mdast-util-from-markdown: 2.0.2 + mdast-util-from-markdown: 2.0.3 mdast-util-to-markdown: 2.1.2 micromark-extension-frontmatter: 2.0.0 transitivePeerDependencies: @@ -22350,7 +21638,7 @@ snapshots: dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.2 + mdast-util-from-markdown: 2.0.3 mdast-util-to-markdown: 2.1.2 micromark-util-normalize-identifier: 2.0.1 transitivePeerDependencies: @@ -22359,7 +21647,7 @@ snapshots: mdast-util-gfm-strikethrough@2.0.0: dependencies: '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.2 + mdast-util-from-markdown: 2.0.3 mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color @@ -22369,7 +21657,7 @@ snapshots: '@types/mdast': 4.0.4 devlop: 1.1.0 markdown-table: 3.0.4 - mdast-util-from-markdown: 2.0.2 + mdast-util-from-markdown: 2.0.3 mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color @@ -22378,14 +21666,14 @@ snapshots: dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.2 + mdast-util-from-markdown: 2.0.3 mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color mdast-util-gfm@3.1.0: dependencies: - mdast-util-from-markdown: 2.0.2 + mdast-util-from-markdown: 2.0.3 mdast-util-gfm-autolink-literal: 2.0.1 mdast-util-gfm-footnote: 2.1.0 mdast-util-gfm-strikethrough: 2.0.0 @@ -22412,6 +21700,18 @@ snapshots: unist-util-visit: 5.0.0 vfile: 6.0.3 + mdast-util-to-hast@13.2.1: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + mdast-util-to-markdown@2.1.2: dependencies: '@types/mdast': 4.0.4 @@ -22746,10 +22046,6 @@ snapshots: - bufferutil - utf-8-validate - minimatch@10.0.3: - dependencies: - '@isaacs/brace-expansion': 5.0.0 - minimatch@10.2.5: dependencies: brace-expansion: 5.0.5 @@ -22770,14 +22066,12 @@ snapshots: minipass@7.1.3: {} - minisearch@7.1.2: {} + minisearch@7.2.0: {} minizlib@3.0.2: dependencies: minipass: 7.1.3 - mitt@3.0.1: {} - mkdirp-classic@0.5.3: {} mkdirp@3.0.1: {} @@ -23411,12 +22705,6 @@ snapshots: regex: 5.1.1 regex-recursion: 5.1.1 - oniguruma-to-es@3.1.1: - dependencies: - emoji-regex-xs: 1.0.0 - regex: 6.0.1 - regex-recursion: 6.0.2 - oniguruma-to-es@4.3.6: dependencies: oniguruma-parser: 0.12.2 @@ -23647,8 +22935,6 @@ snapshots: path-to-regexp@6.3.0: {} - path-to-regexp@8.2.0: {} - path-type@4.0.0: {} pathe@1.1.2: {} @@ -23661,8 +22947,6 @@ snapshots: peek-readable@5.4.2: {} - perfect-debounce@1.0.0: {} - perfect-debounce@2.1.0: {} pg-int8@1.0.1: {} @@ -23994,8 +23278,6 @@ snapshots: powershell-utils@0.1.0: {} - preact@10.26.9: {} - prebuild-install@7.1.3: dependencies: detect-libc: 2.1.2 @@ -24261,10 +23543,6 @@ snapshots: dependencies: regex-utilities: 2.3.0 - regex@6.0.1: - dependencies: - regex-utilities: 2.3.0 - regex@6.1.0: dependencies: regex-utilities: 2.3.0 @@ -24644,8 +23922,6 @@ snapshots: scule@1.3.0: {} - search-insights@2.17.3: {} - section-matter@1.0.0: dependencies: extend-shallow: 2.0.1 @@ -24862,17 +24138,6 @@ snapshots: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 - shiki@2.5.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/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - shiki@3.23.0: dependencies: '@shikijs/core': 3.23.0 @@ -25004,8 +24269,6 @@ snapshots: space-separated-tokens@2.0.2: {} - speakingurl@14.0.1: {} - split2@4.2.0: {} sprintf-js@1.0.3: {} @@ -25217,10 +24480,6 @@ snapshots: pirates: 4.0.7 ts-interface-checker: 0.1.13 - superjson@2.2.2: - dependencies: - copy-anything: 3.0.5 - supports-color@10.2.2: {} supports-color@7.2.0: @@ -25281,7 +24540,7 @@ snapshots: system-architecture@0.1.0: {} - tabbable@6.2.0: {} + tabbable@6.4.0: {} tagged-tag@1.0.0: {} @@ -25457,7 +24716,7 @@ snapshots: '@tokenizer/token': 0.3.0 ieee754: 1.2.1 - tokenx@1.1.0: {} + tokenx@1.3.0: {} totalist@3.0.1: {} @@ -25542,31 +24801,21 @@ snapshots: dependencies: safe-buffer: 5.2.1 - twoslash-protocol@0.2.12: {} + twoslash-protocol@0.3.8: {} - twoslash-protocol@0.3.1: {} - - twoslash-vue@0.2.12(typescript@6.0.3): - dependencies: - '@vue/language-core': 2.1.10(typescript@6.0.3) - twoslash: 0.2.12(typescript@6.0.3) - twoslash-protocol: 0.2.12 - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - twoslash@0.2.12(typescript@6.0.3): + twoslash-vue@0.3.8(typescript@6.0.3): dependencies: - '@typescript/vfs': 1.6.1(typescript@6.0.3) - twoslash-protocol: 0.2.12 + '@vue/language-core': 3.3.5 + twoslash: 0.3.8(typescript@6.0.3) + twoslash-protocol: 0.3.8 typescript: 6.0.3 transitivePeerDependencies: - supports-color - twoslash@0.3.1(typescript@6.0.3): + twoslash@0.3.8(typescript@6.0.3): dependencies: - '@typescript/vfs': 1.6.1(typescript@6.0.3) - twoslash-protocol: 0.3.1 + '@typescript/vfs': 1.6.4(typescript@6.0.3) + twoslash-protocol: 0.3.8 typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -25804,7 +25053,7 @@ snapshots: dependencies: '@types/unist': 3.0.3 unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 + unist-util-visit-parents: 6.0.2 unist-util-stringify-position@4.0.0: dependencies: @@ -25830,6 +25079,12 @@ snapshots: unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 + unist-util-visit@5.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.2 + unpipe@1.0.0: {} unplugin-utils@0.3.1: @@ -26176,17 +25431,6 @@ snapshots: vite: 7.3.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) vue: 3.5.33(typescript@6.0.3) - vite@5.4.19(@types/node@22.19.1)(lightningcss@1.30.1)(terser@5.46.1): - dependencies: - esbuild: 0.21.5 - postcss: 8.5.10 - rollup: 4.44.1 - optionalDependencies: - '@types/node': 22.19.1 - fsevents: 2.3.3 - lightningcss: 1.30.1 - terser: 5.46.1 - vite@6.4.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0): dependencies: esbuild: 0.25.5 @@ -26267,90 +25511,88 @@ snapshots: optionalDependencies: vite: 7.3.2(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) - vitepress-plugin-group-icons@1.6.1(markdown-it@14.1.0)(vite@7.3.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)): + vitepress-plugin-group-icons@1.7.5(vite@7.3.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)): dependencies: - '@iconify-json/logos': 1.2.4 - '@iconify-json/vscode-icons': 1.2.23 - '@iconify/utils': 2.3.0 - markdown-it: 14.1.0 + '@iconify-json/logos': 1.2.11 + '@iconify-json/vscode-icons': 1.2.58 + '@iconify/utils': 3.1.3 + optionalDependencies: vite: 7.3.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) - transitivePeerDependencies: - - supports-color - vitepress-plugin-llms@1.6.0: + vitepress-plugin-llms@1.13.1: dependencies: - byte-size: 9.0.1 gray-matter: 4.0.3 markdown-it: 14.1.0 markdown-title: 1.0.2 + mdast-util-from-markdown: 2.0.3 millify: 6.1.0 - minimatch: 10.0.3 - path-to-regexp: 8.2.0 + minimatch: 10.2.5 + path-to-regexp: 6.3.0 picocolors: 1.1.1 + pretty-bytes: 7.1.0 remark: 15.0.1 remark-frontmatter: 5.0.0 - tokenx: 1.1.0 + tokenx: 1.3.0 unist-util-remove: 4.0.0 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 transitivePeerDependencies: - - '@75lb/nature' - supports-color - vitepress-plugin-mermaid@2.0.17(mermaid@11.7.0)(vitepress@1.6.3(@algolia/client-search@5.29.0)(@types/node@22.19.1)(@types/react@18.3.23)(fuse.js@7.3.0)(lightningcss@1.30.1)(postcss@8.5.10)(search-insights@2.17.3)(terser@5.46.1)(typescript@6.0.3)): + vitepress-plugin-mermaid@2.0.17(mermaid@11.7.0)(vitepress@2.0.0-alpha.17(@types/node@22.19.1)(fuse.js@7.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(oxc-minify@0.117.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(postcss@8.5.10)(terser@5.46.1)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.9.0)): dependencies: mermaid: 11.7.0 - vitepress: 1.6.3(@algolia/client-search@5.29.0)(@types/node@22.19.1)(@types/react@18.3.23)(fuse.js@7.3.0)(lightningcss@1.30.1)(postcss@8.5.10)(search-insights@2.17.3)(terser@5.46.1)(typescript@6.0.3) + vitepress: 2.0.0-alpha.17(@types/node@22.19.1)(fuse.js@7.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(oxc-minify@0.117.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(postcss@8.5.10)(terser@5.46.1)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.9.0) optionalDependencies: '@mermaid-js/mermaid-mindmap': 9.3.0 - vitepress@1.6.3(@algolia/client-search@5.29.0)(@types/node@22.19.1)(@types/react@18.3.23)(fuse.js@7.3.0)(lightningcss@1.30.1)(postcss@8.5.10)(search-insights@2.17.3)(terser@5.46.1)(typescript@6.0.3): + vitepress@2.0.0-alpha.17(@types/node@22.19.1)(fuse.js@7.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(oxc-minify@0.117.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(postcss@8.5.10)(terser@5.46.1)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.9.0): dependencies: - '@docsearch/css': 3.8.2 - '@docsearch/js': 3.8.2(@algolia/client-search@5.29.0)(@types/react@18.3.23)(search-insights@2.17.3) - '@iconify-json/simple-icons': 1.2.41 - '@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.86 + '@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@5.4.19(@types/node@22.19.1)(lightningcss@1.30.1)(terser@5.46.1))(vue@3.5.17(typescript@6.0.3)) - '@vue/devtools-api': 7.7.7 - '@vue/shared': 3.5.17 - '@vueuse/core': 12.8.2(typescript@6.0.3) - '@vueuse/integrations': 12.8.2(focus-trap@7.6.5)(fuse.js@7.3.0)(typescript@6.0.3) - focus-trap: 7.6.5 + '@vitejs/plugin-vue': 6.0.6(vite@7.3.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0))(vue@3.5.33(typescript@6.0.3)) + '@vue/devtools-api': 8.1.1 + '@vue/shared': 3.5.33 + '@vueuse/core': 14.3.0(vue@3.5.33(typescript@6.0.3)) + '@vueuse/integrations': 14.3.0(focus-trap@8.2.1)(fuse.js@7.3.0)(vue@3.5.33(typescript@6.0.3)) + focus-trap: 8.2.1 mark.js: 8.11.1 - minisearch: 7.1.2 - shiki: 2.5.0 - vite: 5.4.19(@types/node@22.19.1)(lightningcss@1.30.1)(terser@5.46.1) - vue: 3.5.17(typescript@6.0.3) + minisearch: 7.2.0 + shiki: 3.23.0 + vite: 7.3.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0) + vue: 3.5.33(typescript@6.0.3) optionalDependencies: + oxc-minify: 0.117.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) postcss: 8.5.10 transitivePeerDependencies: - - '@algolia/client-search' - '@types/node' - - '@types/react' - async-validator - axios - change-case - drauu - fuse.js - idb-keyval + - jiti - jwt-decode - less - lightningcss - nprogress - qrcode - - react - - react-dom - sass - sass-embedded - - search-insights - sortablejs - stylus - sugarss - terser + - tsx - typescript - universal-cookie + - yaml vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0): dependencies: @@ -26419,9 +25661,9 @@ snapshots: vue-devtools-stub@0.1.0: {} - vue-resize@2.0.0-alpha.1(vue@3.5.17(typescript@6.0.3)): + vue-resize@2.0.0-alpha.1(vue@3.5.33(typescript@6.0.3)): dependencies: - vue: 3.5.17(typescript@6.0.3) + vue: 3.5.33(typescript@6.0.3) vue-router@5.0.6(@vue/compiler-sfc@3.5.33)(vue@3.5.33(typescript@6.0.3)): dependencies: @@ -26446,16 +25688,6 @@ snapshots: optionalDependencies: '@vue/compiler-sfc': 3.5.33 - vue@3.5.17(typescript@6.0.3): - dependencies: - '@vue/compiler-dom': 3.5.17 - '@vue/compiler-sfc': 3.5.17 - '@vue/runtime-dom': 3.5.17 - '@vue/server-renderer': 3.5.17(vue@3.5.17(typescript@6.0.3)) - '@vue/shared': 3.5.17 - optionalDependencies: - typescript: 6.0.3 - vue@3.5.33(typescript@6.0.3): dependencies: '@vue/compiler-dom': 3.5.33 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 896419acb..3cd83d3a4 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -111,3 +111,11 @@ catalog: tsdown: ^0.22.0 typescript: ^6.0.0 urlpattern-polyfill: "^10.1.0" + +# vitepress-plugin-mermaid hasn't published a VitePress 2 compatible release yet; +# it only declares `vitepress: ^1` as a peer. The `withMermaid()` wrapper merely +# augments the config object, so it works under VitePress 2 — this rule silences +# the otherwise-spurious peer warning. +peerDependencyRules: + allowedVersions: + "vitepress-plugin-mermaid>vitepress": "2" From 70dacdcc5387ec7b072ab99925d26903f132cc2d Mon Sep 17 00:00:00 2001 From: Hong Minhee Date: Wed, 17 Jun 2026 18:30:08 +0900 Subject: [PATCH 03/21] Merge the feature grid into the Why Fedify? stack The landing page's "Batteries included" feature grid largely duplicated the "Why Fedify?" spec stack, so fold the two together. - Remove the feature grid section (component data, markup, and CSS). - Give each spec in the stack its own vector icon in place of the generic check mark: the official ActivityPub logo, plus Lucide icons (braces, file-pen, signature, user-search, server, badge-check, link) for the rest. - Annotate specs that have a formal designation with a small muted monospace id (e.g. RFC 9421, FEP-8b32, draft-cavage-http-signatures-12) and add Activity Streams 2.0, linking each row to its manual page. - Re-balance the alternating section backgrounds now that a section is gone, and tighten the stack rows on mobile so they stay compact instead of wrapping into bulky two-line rows. Assisted-by: Claude Code:claude-opus-4-8 --- .../theme/components/HomeLanding.vue | 332 +++++++----------- 1 file changed, 122 insertions(+), 210 deletions(-) diff --git a/docs/.vitepress/theme/components/HomeLanding.vue b/docs/.vitepress/theme/components/HomeLanding.vue index 84442c2d5..342803387 100644 --- a/docs/.vitepress/theme/components/HomeLanding.vue +++ b/docs/.vitepress/theme/components/HomeLanding.vue @@ -5,85 +5,18 @@ import { computed, ref, type Component } from "vue"; import { BadgeCheck, - Blocks, Braces, - FileSignature, + FilePen, Link2, Server, + Signature, UserSearch, } from "lucide-vue-next"; -interface Feature { - title: string; - desc: string; - link?: string; - icon?: Component; // Lucide icon component - logo?: string; // inline brand mark (trusted SVG) -} - // Official ActivityPub logo (Simple Icons, CC0). const activityPubLogo = ''; -const features: Feature[] = [ - { - title: "ActivityPub", - desc: - "A complete ActivityPub server and client, wired together so you can focus on your app.", - link: "/manual/federation", - logo: activityPubLogo, - }, - { - title: "Type-safe vocabulary", - desc: - "The Activity Vocabulary as fully typed objects, including popular vendor extensions.", - link: "/manual/vocab", - icon: Braces, - }, - { - title: "HTTP Signatures", - desc: - "Sign and verify HTTP Signatures and RFC 9421 HTTP Message Signatures out of the box.", - link: "/manual/send#http-signatures", - icon: FileSignature, - }, - { - title: "Object Integrity Proofs", - desc: - "Create and verify FEP-8b32 proofs for tamper-evident, forwardable activities.", - link: "/manual/send#object-integrity-proofs", - icon: BadgeCheck, - }, - { - title: "WebFinger", - desc: - "A built-in WebFinger client and server so actors can be discovered across the network.", - link: "/manual/webfinger", - icon: UserSearch, - }, - { - title: "NodeInfo", - desc: - "Publish and read NodeInfo so the rest of the fediverse knows what your server runs.", - link: "/manual/nodeinfo", - icon: Server, - }, - { - title: "Linked Data Signatures", - desc: - "Legacy LD Signatures too, for interoperability with older fediverse software.", - link: "/manual/send#linked-data-signatures", - icon: Link2, - }, - { - title: "Framework integration", - desc: - "Drop Fedify into Hono, Express, Nest, Next.js, SvelteKit, and more with thin adapters.", - link: "/manual/integration", - icon: Blocks, - }, -]; - // Install commands per package manager (kept on one axis; runtimes are shown // separately below). npm is the default since most users are on Node.js. const installs = [ @@ -132,15 +65,48 @@ const runtimes: { name: string; logo: string }[] = [ }, ]; -// The specs Fedify implements, shown as a "stack" in the why section. -const stack = [ - "ActivityPub", - "HTTP Signatures", - "HTTP Message Signatures", - "WebFinger", - "NodeInfo", - "Object Integrity Proofs", - "Linked Data Signatures", +// The specs Fedify implements, shown as a "stack" in the why section. Each +// links to the most specific manual page that documents it; `spec` carries the +// formal designation where one exists, and `icon`/`logo` the related artwork. +const stack: { + name: string; + spec?: string; + link?: string; + icon?: Component; + logo?: string; +}[] = [ + { name: "ActivityPub", link: "/manual/federation", logo: activityPubLogo }, + { name: "Activity Streams 2.0", link: "/manual/vocab", icon: Braces }, + { + name: "HTTP Signatures", + spec: "draft-cavage-http-signatures-12", + link: "/manual/send#http-signatures", + icon: FilePen, + }, + { + name: "HTTP Message Signatures", + spec: "RFC 9421", + link: "/manual/send#http-message-signatures", + icon: Signature, + }, + { + name: "WebFinger", + spec: "RFC 7033", + link: "/manual/webfinger", + icon: UserSearch, + }, + { name: "NodeInfo", link: "/manual/nodeinfo", icon: Server }, + { + name: "Object Integrity Proofs", + spec: "FEP-8b32", + link: "/manual/send#object-integrity-proofs", + icon: BadgeCheck, + }, + { + name: "Linked Data Signatures", + link: "/manual/send#linked-data-signatures", + icon: Link2, + }, ]; // Fediverse software Fedify-built apps can talk to. @@ -308,49 +274,27 @@ federation.setActorDispatcher( See the full rationale →
    -
  • -
  • +
- -
-
-
-

Batteries included

-

Everything you need to federate

-
-
- - - -

{{ f.title }}

-

{{ f.desc }}

- -
-
-
-
- -
+

Looks like this

@@ -373,7 +317,7 @@ federation.setActorDispatcher(
-
+

Plays well with others

Interoperates with the software people already use

@@ -789,11 +733,6 @@ federation.setActorDispatcher( .lp-textlink:hover { color: var(--vp-c-brand-2); } -.lp-section-head { - text-align: center; - max-width: 640px; - margin: 0 auto 3rem; -} /* ----------------------------- Why ----------------------------- */ .lp-why { @@ -810,6 +749,7 @@ federation.setActorDispatcher( gap: 0.6rem; } .lp-stack li { + position: relative; display: flex; align-items: center; gap: 0.8rem; @@ -819,112 +759,67 @@ federation.setActorDispatcher( border: 1px solid var(--vp-c-divider); font-weight: 600; color: var(--vp-c-text-1); + transition: + border-color 0.2s ease, + color 0.2s ease; } -.lp-stack-check { - display: inline-flex; - align-items: center; - justify-content: center; - width: 26px; - height: 26px; - flex: none; - border-radius: 8px; - color: #fff; - background: linear-gradient(135deg, #0ea5e9, #0369a1); -} -.lp-stack-check svg { - width: 16px; - height: 16px; +.lp-stack-name { + color: inherit; + text-decoration: none; } - -/* --------------------------- Features -------------------------- */ -.lp-features { - display: grid; - grid-template-columns: repeat(4, 1fr); - gap: 1rem; -} -.lp-feat { - position: relative; - display: block; - padding: 1.6rem; - border-radius: 16px; - background: var(--vp-c-bg-soft); - border: 1px solid var(--vp-c-divider); - overflow: clip; - transition: - transform 0.25s ease, - border-color 0.25s ease, - box-shadow 0.25s ease; +.lp-stack-spec { + font-family: var(--vp-font-family-mono); + font-size: 0.72rem; + font-weight: 500; + color: var(--vp-c-text-3, var(--vp-c-text-2)); + white-space: nowrap; } -.lp-feat::after { +/* Make the whole row clickable for linked specs. */ +a.lp-stack-name::after { content: ""; position: absolute; - top: -40%; - right: -25%; - width: 70%; - height: 80%; - background: radial-gradient(circle, rgba(2, 132, 199, 0.16), transparent 70%); + inset: 0; +} +.lp-stack-go { + margin-left: auto; + font-weight: 700; + color: var(--vp-c-brand-1); opacity: 0; - transition: opacity 0.3s ease; - pointer-events: none; + transform: translateX(-4px); + transition: + opacity 0.2s ease, + transform 0.2s ease; } -.lp-feat.is-link:hover { - transform: translateY(-4px); +.lp-stack li.has-link:hover { border-color: var(--vp-c-brand-1); - box-shadow: 0 16px 36px -18px rgba(2, 132, 199, 0.5); + color: var(--vp-c-brand-1); } -.lp-feat.is-link:hover::after { +.lp-stack li.has-link:hover .lp-stack-go { opacity: 1; + transform: translateX(0); } -.feat-icon { +/* Topical icon chip on the left of each spec (sky-tinted, brand-colored). */ +.lp-stack-icon { display: inline-flex; align-items: center; justify-content: center; - width: 48px; - height: 48px; - border-radius: 13px; + width: 36px; + height: 36px; + flex: none; + border-radius: 10px; color: var(--vp-c-brand-1); background: linear-gradient(135deg, var(--vp-c-brand-soft), transparent); border: 1px solid rgba(2, 132, 199, 0.18); } -.dark .feat-icon { +.dark .lp-stack-icon { border-color: rgba(56, 189, 248, 0.22); } -.feat-logo { +.lp-stack-logo { display: inline-flex; } -.feat-icon :deep(svg) { - width: 26px; - height: 26px; -} -.feat-title { - font-family: var(--vp-font-family-display); - font-size: 1.12rem; - font-weight: 700; - margin: 1.1rem 0 0.5rem; - color: var(--vp-c-text-1); - letter-spacing: -0.01em; -} -.feat-desc { - margin: 0; - font-size: 0.92rem; - line-height: 1.6; - color: var(--vp-c-text-2); -} -.feat-go { - position: absolute; - top: 1.6rem; - right: 1.6rem; - font-weight: 700; - color: var(--vp-c-brand-1); - opacity: 0; - transform: translateX(-6px); - transition: - opacity 0.25s ease, - transform 0.25s ease; -} -.lp-feat.is-link:hover .feat-go { - opacity: 1; - transform: translateX(0); +.lp-stack-icon :deep(svg) { + width: 20px; + height: 20px; } /* ------------------------- Code showcase ----------------------- */ @@ -1134,18 +1029,35 @@ federation.setActorDispatcher( width: min(360px, 80%); margin-bottom: 1rem; } - .lp-features { - grid-template-columns: repeat(2, 1fr); - } .lp-section { padding: 4rem 0; } } @media (max-width: 520px) { - .lp-features { - grid-template-columns: 1fr; - } .lp-hero { padding-top: calc(var(--vp-nav-height) + 2rem); } + /* Keep each spec name on one line; let the formal id stay inline and wrap to + a second line only when it genuinely doesn't fit. Tighten the chip, gaps, + and row-gap so single-line rows stay compact and any wrapped row doesn't + look bulky. */ + .lp-stack li { + flex-wrap: wrap; + gap: 0.2rem 0.6rem; + padding: 0.65rem 0.85rem; + } + .lp-stack-name { + white-space: nowrap; + } + .lp-stack-icon { + width: 30px; + height: 30px; + } + .lp-stack-icon :deep(svg) { + width: 18px; + height: 18px; + } + .lp-stack-spec { + font-size: 0.68rem; + } } From 7cacd1b01d58137877eebe41842b01ef8358cc98 Mon Sep 17 00:00:00 2001 From: Hong Minhee Date: Wed, 17 Jun 2026 21:57:33 +0900 Subject: [PATCH 04/21] Show interop software as a linked logo wall Replace the text chips in the landing page's "Plays well with others" section with a monochrome logo wall, where each logo links to that project's official website in a new tab. - Most marks are inline currentColor SVGs from Simple Icons (Mastodon, Misskey, Lemmy, Pleroma, PeerTube, Pixelfed, Ghost). - Akkoma and Hollo aren't in Simple Icons, so their SVGs are vendored under docs/public/logos/ (from the FediverseIconography project) and rendered through a CSS mask so they also follow currentColor and adapt to light and dark themes. Assisted-by: Claude Code:claude-opus-4-8 --- .../theme/components/HomeLanding.vue | 132 ++++++++++++++---- docs/public/logos/akkoma.svg | 7 + docs/public/logos/hollo.svg | 1 + 3 files changed, 109 insertions(+), 31 deletions(-) create mode 100644 docs/public/logos/akkoma.svg create mode 100644 docs/public/logos/hollo.svg diff --git a/docs/.vitepress/theme/components/HomeLanding.vue b/docs/.vitepress/theme/components/HomeLanding.vue index 342803387..454b3d720 100644 --- a/docs/.vitepress/theme/components/HomeLanding.vue +++ b/docs/.vitepress/theme/components/HomeLanding.vue @@ -109,17 +109,55 @@ const stack: { }, ]; -// Fediverse software Fedify-built apps can talk to. -const interop = [ - "Mastodon", - "Misskey", - "Lemmy", - "Pleroma", - "PeerTube", - "Pixelfed", - "Akkoma", - "Hollo", - "Ghost", +// Fediverse software Fedify-built apps can talk to, shown as a monochrome logo +// wall. `svg` is an inline currentColor mark (Simple Icons, CC0); `mask` points +// to a logo rendered via CSS mask so it also takes currentColor (Akkoma & Hollo +// come from the FediverseIconography project). +const interop: { name: string; url: string; svg?: string; mask?: string }[] = [ + { + name: "Mastodon", + url: "https://joinmastodon.org", + svg: + '', + }, + { + name: "Misskey", + url: "https://misskey-hub.net", + svg: + '', + }, + { + name: "Lemmy", + url: "https://join-lemmy.org", + svg: + '', + }, + { + name: "Pleroma", + url: "https://pleroma.social", + svg: + '', + }, + { + name: "PeerTube", + url: "https://joinpeertube.org", + svg: + '', + }, + { + name: "Pixelfed", + url: "https://pixelfed.org", + svg: + '', + }, + { name: "Akkoma", url: "https://akkoma.social", mask: "/logos/akkoma.svg" }, + { name: "Hollo", url: "https://docs.hollo.social", mask: "/logos/hollo.svg" }, + { + name: "Ghost", + url: "https://ghost.org", + svg: + '', + }, ]; // Lightly highlighted showcase snippet (authored string, rendered with v-html). @@ -321,9 +359,22 @@ federation.setActorDispatcher(

Plays well with others

Interoperates with the software people already use

-
    -
  • {{ name }}
  • -
  • and more
  • +
@@ -881,33 +932,52 @@ a.lp-stack-name::after { .lp-interop .lp-h2 { text-align: center; } -.lp-chips { +.lp-logos { list-style: none; - margin: 2.2rem 0 0; + margin: 2.6rem 0 0; padding: 0; display: flex; flex-wrap: wrap; + align-items: center; justify-content: center; - gap: 0.7rem; + gap: 1.5rem 2.4rem; } -.lp-chips li { - padding: 0.5rem 1.1rem; - border-radius: 999px; - background: var(--vp-c-bg-soft); - border: 1px solid var(--vp-c-divider); - font-weight: 600; - font-size: 0.92rem; +.lp-logo { + display: inline-flex; + align-items: center; + color: var(--vp-c-text-2); + text-decoration: none; + opacity: 0.65; + transition: + color 0.2s ease, + opacity 0.2s ease; +} +.lp-logo:hover { color: var(--vp-c-text-1); - transition: border-color 0.2s ease, color 0.2s ease; + opacity: 1; } -.lp-chips li:hover { - border-color: var(--vp-c-brand-1); - color: var(--vp-c-brand-1); +.lp-logo-svg { + display: inline-flex; } -.lp-chips .more { - background: transparent; - border-style: dashed; +.lp-logo-svg :deep(svg) { + height: 30px; + width: auto; + display: block; +} +/* Logos shipped as files are tinted to currentColor via a CSS mask so they + adapt to light/dark like the inline ones. */ +.lp-logo--mask { + width: 30px; + height: 30px; + background-color: currentColor; + -webkit-mask: var(--mask) center / contain no-repeat; + mask: var(--mask) center / contain no-repeat; +} +.lp-logo-more { + font-size: 0.9rem; + font-weight: 600; color: var(--vp-c-text-2); + opacity: 0.65; } /* --------------------------- Final CTA ------------------------- */ diff --git a/docs/public/logos/akkoma.svg b/docs/public/logos/akkoma.svg new file mode 100644 index 000000000..db6fbd537 --- /dev/null +++ b/docs/public/logos/akkoma.svg @@ -0,0 +1,7 @@ + + + Akkoma + + + + \ No newline at end of file diff --git a/docs/public/logos/hollo.svg b/docs/public/logos/hollo.svg new file mode 100644 index 000000000..c1caf81ce --- /dev/null +++ b/docs/public/logos/hollo.svg @@ -0,0 +1 @@ + \ No newline at end of file From 1a3e38c6428bae0bbd28aeeeede19e1d8379478d Mon Sep 17 00:00:00 2001 From: Hong Minhee Date: Wed, 17 Jun 2026 22:37:42 +0900 Subject: [PATCH 05/21] Add a web framework integration section Add a "Works with your stack" section to the landing page to highlight one of Fedify's strengths: it slots into the web framework you already use, and even without a first-party package it is easy to wire up yourself because it is built on the web-standard Request and Response. - Show a logo wall of the frameworks with an official integration package (Express, Fastify, Koa, Hono, h3, Nuxt, SvelteKit, NestJS, Next.js, Astro, SolidStart, Fresh), each linking to its section in the integration manual. - Add a "No official package? No problem." callout with a compact custom-middleware snippet, linking Request and Response to MDN and pointing to the custom middleware guide. See: https://github.com/fedify-dev/fedify/blob/main/docs/manual/integration.md Assisted-by: Claude Code:claude-opus-4-8 --- .../theme/components/HomeLanding.vue | 202 +++++++++++++++++- 1 file changed, 200 insertions(+), 2 deletions(-) diff --git a/docs/.vitepress/theme/components/HomeLanding.vue b/docs/.vitepress/theme/components/HomeLanding.vue index 454b3d720..cc7da5635 100644 --- a/docs/.vitepress/theme/components/HomeLanding.vue +++ b/docs/.vitepress/theme/components/HomeLanding.vue @@ -160,6 +160,93 @@ const interop: { name: string; url: string; svg?: string; mask?: string }[] = [ }, ]; +// Web frameworks with a first-party Fedify integration package, shown as a logo +// wall. Each links to the framework's official site (logos: Simple Icons, CC0). +const frameworks: { name: string; url: string; svg: string }[] = [ + { + name: "Express", + url: "/manual/integration#express", + svg: + '', + }, + { + name: "Fastify", + url: "/manual/integration#fastify", + svg: + '', + }, + { + name: "Koa", + url: "/manual/integration#koa", + svg: + '', + }, + { + name: "Hono", + url: "/manual/integration#hono", + svg: + '', + }, + { + name: "h3", + url: "/manual/integration#h3", + svg: + '', + }, + { + name: "Nuxt", + url: "/manual/integration#nuxt", + svg: + '', + }, + { + name: "SvelteKit", + url: "/manual/integration#sveltekit", + svg: + '', + }, + { + name: "NestJS", + url: "/manual/integration#nestjs", + svg: + '', + }, + { + name: "Next.js", + url: "/manual/integration#next-js", + svg: + '', + }, + { + name: "Astro", + url: "/manual/integration#astro", + svg: + '', + }, + { + name: "SolidStart", + url: "/manual/integration#solidstart", + svg: + '', + }, + { + name: "Fresh", + url: "/manual/integration#fresh", + svg: + '', + }, +]; + +// Compact "bring your own framework" snippet for the integration section. +const byoCode = `import { federation } from "./federation.ts"; + +export default (request: Request, next) => + federation.fetch(request, { + contextData: undefined, + onNotFound: next, // not a federation request + onNotAcceptable: next, // fall back to your HTML + });`; + // Lightly highlighted showcase snippet (authored string, rendered with v-html). const code = `import { createFederation, Person } from "@fedify/fedify"; @@ -354,8 +441,67 @@ federation.setActorDispatcher(
- +
+
+
+

Works with your stack

+

Drops into the framework you already use

+

+ Fedify runs as middleware that shares your app's domain and port + through content negotiation. First-party packages cover the + frameworks below, and fedify init scaffolds a project + for you. +

+
+ + +
+
+

No official package? No problem.

+

+ Fedify is built on the web-standard + Request and + Response, so dropping it into anything with + middleware takes about a dozen lines. +

+ + Custom middleware guide → + +
+
+ +
+
+
+
+
+ + +

Plays well with others

Interoperates with the software people already use

@@ -784,6 +930,11 @@ federation.setActorDispatcher( .lp-textlink:hover { color: var(--vp-c-brand-2); } +.lp-section-head { + text-align: center; + max-width: 680px; + margin: 0 auto 2.5rem; +} /* ----------------------------- Why ----------------------------- */ .lp-why { @@ -923,6 +1074,52 @@ a.lp-stack-name::after { .lp-code :deep(.c-st) { color: #86efac; } .lp-code :deep(.c-ty) { color: #fcd34d; } .lp-code :deep(.c-fn) { color: #93c5fd; } +.lp-code :deep(.c-cm) { color: #64748b; font-style: italic; } + +/* ----------------------- Framework section --------------------- */ +.lp-byo { + display: grid; + grid-template-columns: 1fr 1.1fr; + gap: 2.5rem; + align-items: center; + max-width: 960px; + margin: 5.5rem auto 0; + padding: 2rem; + border-radius: 16px; + background: var(--vp-c-bg); + border: 1px solid var(--vp-c-divider); +} +.lp-byo-title { + font-family: var(--vp-font-family-display); + font-size: 1.3rem; + font-weight: 700; + letter-spacing: -0.01em; + margin: 0; + color: var(--vp-c-text-1); +} +.lp-byo-text { + margin: 0.8rem 0 0; + font-size: 1rem; + line-height: 1.65; + color: var(--vp-c-text-2); +} +.lp-byo-text code { + font-family: var(--vp-font-family-mono); + font-size: 0.85em; + padding: 0.1em 0.4em; + border-radius: 5px; + background: var(--vp-c-brand-soft); + color: var(--vp-c-brand-1); +} +.lp-byo-text a { + text-decoration: none; +} +.lp-byo-text a:hover code { + text-decoration: underline; +} +.lp-byo-window { + margin: 0; +} /* ---------------------------- Interop -------------------------- */ .lp-interop { @@ -1091,7 +1288,8 @@ a.lp-stack-name::after { @media (max-width: 900px) { .lp-hero-grid, .lp-why, - .lp-code-grid { + .lp-code-grid, + .lp-byo { grid-template-columns: 1fr; } .lp-hero-art { From a4cbb114e7fff497a43dbdca99af4603631a69ba Mon Sep 17 00:00:00 2001 From: Hong Minhee Date: Wed, 17 Jun 2026 23:50:17 +0900 Subject: [PATCH 06/21] Add a reliable delivery section to the landing page Highlight another of Fedify's strengths: reliable activity delivery through a message queue, and the variety of broker backends it can run on. - Three points: activities are queued and retried with exponential backoff; a two-stage fan-out keeps delivery to large audiences fast while retrying each inbox independently; and the queue backend is pluggable. - A broker logo wall (Redis, PostgreSQL, RabbitMQ, MySQL, MariaDB, SQLite, Deno KV, Cloudflare Queues, and more), each linking to its section in the message queue manual. - Re-balance the alternating section backgrounds for the inserted section. See: https://github.com/fedify-dev/fedify/blob/main/docs/manual/send.md See: https://github.com/fedify-dev/fedify/blob/main/docs/manual/mq.md Assisted-by: Claude Code:claude-opus-4-8 --- .../theme/components/HomeLanding.vue | 174 +++++++++++++++++- 1 file changed, 171 insertions(+), 3 deletions(-) diff --git a/docs/.vitepress/theme/components/HomeLanding.vue b/docs/.vitepress/theme/components/HomeLanding.vue index cc7da5635..415bcb451 100644 --- a/docs/.vitepress/theme/components/HomeLanding.vue +++ b/docs/.vitepress/theme/components/HomeLanding.vue @@ -6,9 +6,12 @@ import { computed, ref, type Component } from "vue"; import { BadgeCheck, Braces, + DatabaseZap, FilePen, Link2, + RotateCw, Server, + Share2, Signature, UserSearch, } from "lucide-vue-next"; @@ -247,6 +250,81 @@ const byoCode = `import { federation } // fall back to your HTML });`; +// Reliability/scale highlights for the message-queue section. +const deliveryPoints: { icon: Component; title: string; desc: string }[] = [ + { + icon: RotateCw, + title: "Queued and retried", + desc: + "Outgoing activities go through a queue and retry with exponential backoff, so a flaky server never costs you a post.", + }, + { + icon: Share2, + title: "Fan-out for scale", + desc: + "A two-stage fan-out returns instantly and delivers to thousands of inboxes in the background, each retried on its own.", + }, + { + icon: DatabaseZap, + title: "Pluggable brokers", + desc: + "Run the queue on the backend you already operate, and swap it later without touching your application code.", + }, +]; + +// Message queue broker backends, linking to their section in the message queue +// manual (logos: Simple Icons, CC0). +const brokers: { name: string; url: string; svg: string }[] = [ + { + name: "Redis", + url: "/manual/mq#redismessagequeue", + svg: + '', + }, + { + name: "PostgreSQL", + url: "/manual/mq#postgresmessagequeue", + svg: + '', + }, + { + name: "RabbitMQ", + url: "/manual/mq#amqpmessagequeue", + svg: + '', + }, + { + name: "MySQL", + url: "/manual/mq#mysqlmessagequeue", + svg: + '', + }, + { + name: "MariaDB", + url: "/manual/mq#mysqlmessagequeue", + svg: + '', + }, + { + name: "SQLite", + url: "/manual/mq#sqlitemessagequeue", + svg: + '', + }, + { + name: "Deno KV", + url: "/manual/mq#denokvmessagequeue-deno-only", + svg: + '', + }, + { + name: "Cloudflare Queues", + url: "/manual/mq#workersmessagequeue-cloudflare-workers-only", + svg: + '', + }, +]; + // Lightly highlighted showcase snippet (authored string, rendered with v-html). const code = `import { createFederation, Person } from "@fedify/fedify"; @@ -441,8 +519,46 @@ federation.setActorDispatcher(
- +
+
+
+

Reliable at scale

+

Reliable delivery, even to huge audiences

+

+ Outgoing activities go through a message queue, so a flaky recipient + never costs you a post. For large audiences, a two-stage fan-out + returns instantly and delivers to every inbox in the background. +

+
+
+
+ +

{{ p.title }}

+

{{ p.desc }}

+
+
+

Run the queue on the broker you prefer

+ +
+
+ + +

Works with your stack

@@ -501,7 +617,7 @@ federation.setActorDispatcher(
-
+

Plays well with others

Interoperates with the software people already use

@@ -1121,6 +1237,57 @@ a.lp-stack-name::after { margin: 0; } +/* --------------------- Reliable delivery ----------------------- */ +.lp-points { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 1.25rem; +} +.lp-point { + padding: 1.5rem; + border-radius: 16px; + background: var(--vp-c-bg); + border: 1px solid var(--vp-c-divider); +} +.lp-point-icon { + display: inline-flex; + align-items: center; + justify-content: center; + width: 42px; + height: 42px; + border-radius: 11px; + color: var(--vp-c-brand-1); + background: linear-gradient(135deg, var(--vp-c-brand-soft), transparent); + border: 1px solid rgba(2, 132, 199, 0.18); +} +.dark .lp-point-icon { + border-color: rgba(56, 189, 248, 0.22); +} +.lp-point-title { + font-family: var(--vp-font-family-display); + font-size: 1.1rem; + font-weight: 700; + letter-spacing: -0.01em; + margin: 1rem 0 0.45rem; + color: var(--vp-c-text-1); +} +.lp-point-desc { + margin: 0; + font-size: 0.94rem; + line-height: 1.6; + color: var(--vp-c-text-2); +} +.lp-brokers-label { + margin: 3.5rem 0 0; + text-align: center; + font-size: 0.78rem; + font-weight: 700; + letter-spacing: 0.05em; + text-transform: uppercase; + color: var(--vp-c-text-2); + opacity: 0.7; +} + /* ---------------------------- Interop -------------------------- */ .lp-interop { text-align: center; @@ -1289,7 +1456,8 @@ a.lp-stack-name::after { .lp-hero-grid, .lp-why, .lp-code-grid, - .lp-byo { + .lp-byo, + .lp-points { grid-template-columns: 1fr; } .lp-hero-art { From 59c83751275b5e682527d27ec0194e966990b533 Mon Sep 17 00:00:00 2001 From: Hong Minhee Date: Thu, 18 Jun 2026 00:01:35 +0900 Subject: [PATCH 07/21] Add an observability section to the landing page Highlight that Fedify is instrumented with OpenTelemetry out of the box, which is invaluable when operating a federated server in production, with detailed structured logging as a bonus. - Spell out the appeal: distributed traces for every operation, metrics for delivery, queue depth, signature verification, and more, export to any OTLP backend, plus traceable structured logs through LogTape. - Pair the copy with a trace-waterfall mock built from real Fedify span names, rather than a fourth logo wall, for visual variety. - Link to the OpenTelemetry manual, and keep the alternating section backgrounds intact by inserting the section before the call to action. See: https://github.com/fedify-dev/fedify/blob/main/docs/manual/opentelemetry.md See: https://github.com/fedify-dev/fedify/blob/main/docs/manual/log.md Assisted-by: Claude Code:claude-opus-4-8 --- .../theme/components/HomeLanding.vue | 199 +++++++++++++++++- 1 file changed, 198 insertions(+), 1 deletion(-) diff --git a/docs/.vitepress/theme/components/HomeLanding.vue b/docs/.vitepress/theme/components/HomeLanding.vue index 415bcb451..33251db67 100644 --- a/docs/.vitepress/theme/components/HomeLanding.vue +++ b/docs/.vitepress/theme/components/HomeLanding.vue @@ -325,6 +325,39 @@ const brokers: { name: string; url: string; svg: string }[] = [ }, ]; +// Observability highlights for the OpenTelemetry section. +const otelPoints: { term: string; desc: string }[] = [ + { + term: "Distributed traces", + desc: + "every step is a span: HTTP, inbox, outbox, fan-out, signatures, and WebFinger.", + }, + { + term: "Rich metrics", + desc: + "counters and histograms for delivery, queue depth, signature verification, and more.", + }, + { + term: "Any OTLP backend", + desc: + "ship to Grafana, Jaeger, Sentry, or Deno's built-in OpenTelemetry.", + }, + { + term: "Structured logs too", + desc: + "traceable JSON logging via LogTape, correlated by request and message IDs.", + }, +]; + +// A mock trace waterfall (real Fedify span names) for the observability visual. +const traceSpans: { label: string; depth: number; start: number; width: number }[] = [ + { label: "activitypub.inbox", depth: 0, start: 0, width: 100 }, + { label: "http_signatures.verify", depth: 1, start: 3, width: 19 }, + { label: "activitypub.dispatch_inbox_listener", depth: 1, start: 25, width: 34 }, + { label: "activitypub.send_activity", depth: 1, start: 62, width: 31 }, + { label: "http_signatures.sign", depth: 2, start: 65, width: 13 }, +]; + // Lightly highlighted showcase snippet (authored string, rendered with v-html). const code = `import { createFederation, Person } from "@fedify/fedify"; @@ -641,6 +674,62 @@ federation.setActorDispatcher(
+ +
+
+
+

Built for production

+

See exactly what your server is doing

+

+ Fedify is instrumented with OpenTelemetry out of the box, so the + whole federation lifecycle shows up as traces and metrics in the + observability stack you already run. +

+
    +
  • + + + {{ p.term }} + {{ p.desc }} + +
  • +
+ + OpenTelemetry guide → + +
+ +
+
+
- +
+
+
+

Type-safe vocabulary

+

Type-safe objects, no JSON-LD headaches

+

+ Fedify models the whole Activity Vocabulary as immutable, type-safe + objects, backed by a real JSON-LD processor and exposed as a fully + typed API. +

+
    +
  • + + + {{ p.term }} + + +
  • +
+ Vocabulary guide → +
+
+
+ +
+
+
+ +
+
+
+
+
+ + +

Reliable at scale

@@ -591,7 +721,7 @@ federation.setActorDispatcher(
-
+

Works with your stack

@@ -650,7 +780,7 @@ federation.setActorDispatcher(
-
+

Plays well with others

Interoperates with the software people already use

@@ -675,7 +805,7 @@ federation.setActorDispatcher(
-
+

Built for production

@@ -730,6 +860,37 @@ federation.setActorDispatcher(
+ +
+
+
+

Developer tooling

+

A CLI made for fediverse debugging

+

+ The fedify command-line toolchain turns the fiddly parts + of ActivityPub development into one-liners, from inspecting remote + objects to watching exactly what your own server sends. +

+ + Explore the CLI → +
+ +
+
+
+ +
+
+
+

ActivityPub API

+

Accept posts straight from your clients

+

+ The ActivityPub API, the client-to-server (C2S) side of the + protocol, is something of a holy grail in the fediverse, and Fedify + is ready for it. Route POST requests to an actor's + outbox through typed listeners and authorize them however you like. +

+
    +
  • + + + {{ p.term }} + + +
  • +
+ Outbox listeners guide → +
+
+ +
+
+
+
+
+

+ Need a hand? Ask the community on + GitHub Discussions + or + Matrix, or tag + #Fedify + in the fediverse. +

Fedify is free and open source. Meet our sponsors → @@ -1954,11 +1974,20 @@ a.lp-stack-name::after { .lp-cta-band .lp-cta { justify-content: center; } -.lp-sponsors { +.lp-community { margin-top: 2.2rem; font-size: 0.92rem; color: var(--vp-c-text-2); } +.lp-community a { + color: var(--vp-c-brand-1); + font-weight: 600; +} +.lp-sponsors { + margin-top: 0.6rem; + font-size: 0.92rem; + color: var(--vp-c-text-2); +} .lp-sponsors a { color: var(--vp-c-brand-1); font-weight: 600; From 6f21f88e9106a2ff48fbd1786508000ca0a71e16 Mon Sep 17 00:00:00 2001 From: Hong Minhee Date: Thu, 18 Jun 2026 01:14:10 +0900 Subject: [PATCH 11/21] Add Sovereign Tech Agency credit to landing page Add a "Backed by an investment from" strip to the bottom of the docs landing page that credits the Sovereign Tech Agency, whose Sovereign Tech Fund invested in Fedify. The credit shows the official Sovereign Tech Agency logo rather than a plain text wordmark. The SVG was taken from the agency's own site, had its framework-specific fill classes stripped, and a solid fill baked in so it can be used as a CSS mask. Rendering it through a mask with background-color: currentColor lets the mark follow the active theme, appearing dark on the light theme and light on the dark theme, and turn the brand color on hover. The link points at the project's page and carries an aria-label for accessibility. https://www.sovereign.tech/tech/fedify --- .../theme/components/HomeLanding.vue | 48 +++++++++++++++++++ docs/public/logos/sovereign-tech.svg | 1 + 2 files changed, 49 insertions(+) create mode 100644 docs/public/logos/sovereign-tech.svg diff --git a/docs/.vitepress/theme/components/HomeLanding.vue b/docs/.vitepress/theme/components/HomeLanding.vue index d6c1bcba6..51a4e963a 100644 --- a/docs/.vitepress/theme/components/HomeLanding.vue +++ b/docs/.vitepress/theme/components/HomeLanding.vue @@ -1003,6 +1003,20 @@ federation.setActorDispatcher(

+ + +
+

Backed by an investment from

+ + +
@@ -1993,6 +2007,40 @@ a.lp-stack-name::after { font-weight: 600; } +/* --------------------------- Backed by ------------------------- */ +.lp-backer { + padding: 2.75rem 24px 3.5rem; + text-align: center; + border-top: 1px solid var(--vp-c-divider); +} +.lp-backer-label { + margin: 0 0 0.55rem; + font-size: 0.72rem; + font-weight: 700; + letter-spacing: 0.06em; + text-transform: uppercase; + color: var(--vp-c-text-2); + opacity: 0.7; +} +.lp-backer-link { + display: inline-block; + color: var(--vp-c-text-1); + transition: color 0.2s ease; +} +.lp-backer-link:hover { + color: var(--vp-c-brand-1); +} +/* Sovereign Tech Agency logo (104x33), tinted via CSS mask so it follows the + theme. The asset bakes in a solid fill so the mask has a shape to clip. */ +.lp-backer-logo { + display: block; + width: 132px; + height: 42px; + background-color: currentColor; + -webkit-mask: url(/logos/sovereign-tech.svg) center / contain no-repeat; + mask: url(/logos/sovereign-tech.svg) center / contain no-repeat; +} + /* --------------------------- Animation ------------------------- */ @media (prefers-reduced-motion: no-preference) { .lp-hero-copy > * { diff --git a/docs/public/logos/sovereign-tech.svg b/docs/public/logos/sovereign-tech.svg new file mode 100644 index 000000000..930698fed --- /dev/null +++ b/docs/public/logos/sovereign-tech.svg @@ -0,0 +1 @@ + From 0cd87fd026147143a423b1af15fbd03c720b79b8 Mon Sep 17 00:00:00 2001 From: Hong Minhee Date: Thu, 18 Jun 2026 01:23:06 +0900 Subject: [PATCH 12/21] Enlarge hero logo on desktop viewports On wide desktop screens the hero's right column has space to spare, so the artwork looked a little small. Add a min-width: 1080px rule that grows the hero artwork to fill more of the column and bumps the Fedify mark at its center from 38% to 42%, giving the logo noticeably more presence (about 167px to 210px wide) while the surrounding rings and nodes scale with it. The rule is gated behind the breakpoint and bounded by the column, so tablet and mobile layouts are untouched and the artwork cannot overflow. Assisted-by: Claude Code:claude-opus-4-8 --- docs/.vitepress/theme/components/HomeLanding.vue | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/.vitepress/theme/components/HomeLanding.vue b/docs/.vitepress/theme/components/HomeLanding.vue index 51a4e963a..b5ba78e0c 100644 --- a/docs/.vitepress/theme/components/HomeLanding.vue +++ b/docs/.vitepress/theme/components/HomeLanding.vue @@ -2105,6 +2105,17 @@ a.lp-stack-name::after { .lp-section { padding: 4rem 0; } } +/* On wider desktop viewports the right column has room to spare, so let the hero + artwork (and the Fedify mark at its center) grow to fill more of it. */ +@media (min-width: 1080px) { + .lp-hero-art { + width: min(500px, 100%); + } + .lp-net-logo { + width: 42%; + } +} + @media (max-width: 520px) { .lp-hero { padding-top: calc(var(--vp-nav-height) + 2rem); From d04e2dbf1f2528706bebcd1aaba682d579d33026 Mon Sep 17 00:00:00 2001 From: Hong Minhee Date: Thu, 18 Jun 2026 01:35:30 +0900 Subject: [PATCH 13/21] Reframe landing copy as a modular framework Tune the landing page wording so Fedify reads as what it is, a full-featured framework for federation rather than merely an ActivityPub or protocol library, while making clear that it stays modular and does not impose an application architecture. The change touches the few beats that carry positioning, leaving the feature sections to demonstrate the breadth on their own and keeping the existing plain, non-promotional voice: - Hero lede now opens with "a TypeScript framework that handles federation, signatures, discovery, activity vocabulary, and delivery behind type-safe APIs" and adds that it is modular, so you can adopt the whole thing or just the parts you need and it never dictates how your app is built. - The "What's Fedify?" headline changes from "One library that lets your app speak to the entire fediverse" to "A federation framework, not just a protocol library," and its body lists what Fedify covers before noting it is that broad yet modular and won't decide how the rest of your app is structured. - The frameworks section leads with "Fedify doesn't take over your app," reinforcing that it runs as middleware alongside your existing routes, and the heading now says "web framework" to avoid clashing with Fedify-as-framework. Assisted-by: Claude Code:claude-opus-4-8 --- .../theme/components/HomeLanding.vue | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/docs/.vitepress/theme/components/HomeLanding.vue b/docs/.vitepress/theme/components/HomeLanding.vue index b5ba78e0c..f18badf29 100644 --- a/docs/.vitepress/theme/components/HomeLanding.vue +++ b/docs/.vitepress/theme/components/HomeLanding.vue @@ -510,9 +510,11 @@ federation.setActorDispatcher( skip the boilerplate.

- Fedify turns the hard parts of federation, signatures, - discovery, activity vocabulary, and delivery, into a handful of - type-safe function calls. So you ship features, not specs. + Fedify is a TypeScript framework that handles + federation, signatures, discovery, activity vocabulary, and delivery + behind type-safe APIs, so you ship features, not specs. It's modular, + too: adopt the whole thing or just the parts you need, and it never + dictates how your app is built.

@@ -594,15 +596,17 @@ federation.setActorDispatcher( @@ -753,12 +757,13 @@ federation.setActorDispatcher(

Works with your stack

-

Drops into the framework you already use

+

Drops into the web framework you already use

- Fedify runs as middleware that shares your app's domain and port - through content negotiation. First-party packages cover the - frameworks below, and fedify init scaffolds a project - for you. + Fedify doesn't take over your app. It runs as middleware on the + domain and port you already have, using content negotiation to pick + out federation traffic and leaving the rest of your routes alone. + First-party packages cover the frameworks below, and + fedify init scaffolds a project for you.

    From 80bb3912a0d762d5662e178b23b38daa40a28e6e Mon Sep 17 00:00:00 2001 From: Hong Minhee Date: Thu, 18 Jun 2026 02:05:59 +0900 Subject: [PATCH 14/21] Expand and reorder landing page sections Following a holistic review of the landing page, add the capabilities it undersold, broaden the tooling story, and regroup the sections so related beats sit together. Content: - Add a data-ownership section ("Your data, your schema"): your actors, posts, and followers stay in your own database and schema, read through dispatcher callbacks, while Fedify keeps only its internal state in a pluggable KvStore (in memory, or Redis, PostgreSQL, MySQL, SQLite, Deno KV, or Cloudflare Workers KV). This is the clearest proof of the framework-yet-modular positioning. - Broaden the CLI section into a developer-tooling beat: add the fedify tunnel command, and mention @fedify/lint (catches common federation mistakes) and @fedify/debugger (a live inbox and outbox dashboard) so the whole development loop is visible. - Drop the lone first-person voice ("We implement it" becomes "Fedify implements it") and the mild overclaim "every time" from the vocabulary point. Order: - Pair the two "fits into your app" beats by moving the data-ownership section up next to the web framework section (your framework, then your data), which also separates the framework and interop logo walls with a text section for better rhythm. - Move the CLI tooling beat ahead of observability, following the natural build-then-operate progression. - Section background banding still alternates throughout. Assisted-by: Claude Code:claude-opus-4-8 Assisted-by: Codex:gpt-5.2-codex --- .../theme/components/HomeLanding.vue | 102 ++++++++++++------ 1 file changed, 67 insertions(+), 35 deletions(-) diff --git a/docs/.vitepress/theme/components/HomeLanding.vue b/docs/.vitepress/theme/components/HomeLanding.vue index f18badf29..6e85917ad 100644 --- a/docs/.vitepress/theme/components/HomeLanding.vue +++ b/docs/.vitepress/theme/components/HomeLanding.vue @@ -373,6 +373,12 @@ const cliCommands: { cmd: string; url: string; desc: string }[] = [ desc: "Spin up an ephemeral, public inbox to see exactly what your server sends.", }, + { + cmd: "fedify tunnel", + url: "/cli#fedify-tunnel-exposing-a-local-http-server-to-the-public-internet", + desc: + "Expose your local server to the public internet for live testing.", + }, { cmd: "fedify init", url: "/cli#fedify-init-initializing-a-fedify-project", @@ -402,7 +408,7 @@ const vocabPoints: { term: string; desc: string }[] = [ { term: "Standard-compliant output", desc: - "build an object and toJsonLd() emits valid, interoperable JSON-LD every time.", + "build an object and toJsonLd() emits valid, interoperable JSON-LD.", }, { term: "One shape to read", @@ -617,7 +623,7 @@ federation.setActorDispatcher(

    Why Fedify?

    -

    Federation is a stack of specs. We implement it.

    +

    Federation is a stack of specs. Fedify implements it.

    Going federated means getting a whole pile of standards right, and keeping them right as they evolve. Fedify implements them so you @@ -812,8 +818,26 @@ federation.setActorDispatcher(

- +
+
+

Your data, your schema

+

Fedify never owns your data model

+

+ Your actors, posts, and followers live in your own database, in + whatever schema you already have. Fedify reads them through dispatcher + callbacks you write, so the data model stays yours. For its own + internal state, a cache and some federation bookkeeping, it relies on a + pluggable KvStore: keep it in memory while you develop, or + back it with Redis, PostgreSQL, MySQL, SQLite, Deno KV, or Cloudflare + Workers KV. +

+ Key–value store guide → +
+
+ + +

Plays well with others

Interoperates with the software people already use

@@ -837,6 +861,45 @@ federation.setActorDispatcher(
+ +
+
+
+

Developer tooling

+

A toolchain for building and debugging

+

+ The fedify command-line tool turns the fiddly parts of + ActivityPub development into one-liners, from inspecting remote + objects to watching exactly what your own server sends. Alongside it, + @fedify/lint catches common federation mistakes as + you write, and + @fedify/debugger adds a live + dashboard of inbox and outbox activity. +

+ + Explore the CLI → +
+ +
+
+
@@ -893,39 +956,8 @@ federation.setActorDispatcher(
- -
-
-
-

Developer tooling

-

A CLI made for fediverse debugging

-

- The fedify command-line toolchain turns the fiddly parts - of ActivityPub development into one-liners, from inspecting remote - objects to watching exactly what your own server sends. -

- - Explore the CLI → -
- -
-
- -
+

ActivityPub API

From c8f4377a350090d5dc859ec8b8334e2084ba44e5 Mon Sep 17 00:00:00 2001 From: Hong Minhee Date: Thu, 18 Jun 2026 02:21:47 +0900 Subject: [PATCH 15/21] Use meaningful icons in landing checklists The vocabulary, observability, and ActivityPub API sections marked each list item with the same generic checkmark, which read like a checkbox and carried no meaning. Replace it with a per-item Lucide icon, drawn from the lucide-vue-next set already used by the stack and delivery sections, and restyle the icon badge to match those sections (a brand colored line icon on a soft tint with a subtle border) rather than the solid blue check. Icon choices: - Vocabulary: badge-check, shapes, external-link, shield-check. - Observability: activity, gauge, plug, scroll-text. - ActivityPub API: webhook, key-round, blocks. Every icon name was checked against the installed lucide-vue-next declarations before use, and all three sections were verified in light and dark. Assisted-by: Claude Code:claude-opus-4-8 --- .../theme/components/HomeLanding.vue | 65 ++++++++++++------- 1 file changed, 41 insertions(+), 24 deletions(-) diff --git a/docs/.vitepress/theme/components/HomeLanding.vue b/docs/.vitepress/theme/components/HomeLanding.vue index 6e85917ad..e0d1e4433 100644 --- a/docs/.vitepress/theme/components/HomeLanding.vue +++ b/docs/.vitepress/theme/components/HomeLanding.vue @@ -4,16 +4,26 @@ // narrative landing page rather than the default hero + emoji-feature grid. import { computed, ref, type Component } from "vue"; import { + Activity, BadgeCheck, + Blocks, Braces, DatabaseZap, + ExternalLink, FilePen, + Gauge, + KeyRound, Link2, + Plug, RotateCw, + ScrollText, Server, + Shapes, Share2, + ShieldCheck, Signature, UserSearch, + Webhook, } from "lucide-vue-next"; // Official ActivityPub logo (Simple Icons, CC0). @@ -326,23 +336,27 @@ const brokers: { name: string; url: string; svg: string }[] = [ ]; // Observability highlights for the OpenTelemetry section. -const otelPoints: { term: string; desc: string }[] = [ +const otelPoints: { icon: Component; term: string; desc: string }[] = [ { + icon: Activity, term: "Distributed traces", desc: "every step is a span: HTTP, inbox, outbox, fan-out, signatures, and WebFinger.", }, { + icon: Gauge, term: "Rich metrics", desc: "counters and histograms for delivery, queue depth, signature verification, and more.", }, { + icon: Plug, term: "Any OTLP backend", desc: "ship to Grafana, Jaeger, Sentry, or Deno's built-in OpenTelemetry.", }, { + icon: ScrollText, term: "Structured logs too", desc: "traceable JSON logging via LogTape, correlated by request and message IDs.", @@ -404,22 +418,26 @@ const cliTerminal = `$ fedify inbox ▸ Received Follow POST /i/inbox 202`; // Vocabulary API highlights. -const vocabPoints: { term: string; desc: string }[] = [ +const vocabPoints: { icon: Component; term: string; desc: string }[] = [ { + icon: BadgeCheck, term: "Standard-compliant output", desc: "build an object and toJsonLd() emits valid, interoperable JSON-LD.", }, { + icon: Shapes, term: "One shape to read", desc: "every equivalent JSON-LD form normalizes to the same typed value.", }, { + icon: ExternalLink, term: "References, dereferenced", desc: "getActor() and getObject() accessors fetch and hydrate remote objects on demand.", }, { + icon: ShieldCheck, term: "Secure by default", desc: 'an origin-based security model (FEP-fe34) re-fetches cross-origin objects to prevent spoofing.', @@ -449,18 +467,21 @@ activity.actorId; actor?.name; // "Alice"`; // Client-to-server (C2S) highlights for the outbox-listener section. -const c2sPoints: { term: string; desc: string }[] = [ +const c2sPoints: { icon: Component; term: string; desc: string }[] = [ { + icon: Webhook, term: "Typed outbox listeners", desc: "handle client posts per activity type, exactly like inbox listeners.", }, { + icon: KeyRound, term: "Auth your way", desc: "an authorize() hook plugs in OAuth, access tokens, or sessions.", }, { + icon: Blocks, term: "Standard, not bespoke", desc: "clients speak the real ActivityPub outbox, so there's no custom API to maintain.", @@ -688,10 +709,7 @@ federation.setActorDispatcher(
@@ -2066,6 +2097,31 @@ a.lp-stack-name::after { color: var(--vp-c-brand-1); font-weight: 600; } +.lp-also { + margin-top: 0.6rem; + font-size: 0.92rem; + color: var(--vp-c-text-2); +} +.lp-also-label { + vertical-align: middle; +} +.lp-also-link { + display: inline-flex; + align-items: center; + gap: 0.3rem; + margin-left: 0.6rem; + vertical-align: middle; + color: var(--vp-c-text-1); + font-weight: 600; + text-decoration: none; +} +.lp-also-link:hover { + color: var(--vp-c-brand-1); +} +.lp-also-link img { + height: 19px; + width: auto; +} /* --------------------------- Backed by ------------------------- */ .lp-backer { diff --git a/docs/public/logos/botkit.svg b/docs/public/logos/botkit.svg new file mode 100644 index 000000000..47eba0199 --- /dev/null +++ b/docs/public/logos/botkit.svg @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/public/logos/drfed.svg b/docs/public/logos/drfed.svg new file mode 100644 index 000000000..683340ec7 --- /dev/null +++ b/docs/public/logos/drfed.svg @@ -0,0 +1,395 @@ + +DrFedDrFed2026-06-17Hong Minhee From 7fc695d6bf844b2c926b51268469514d78801a14 Mon Sep 17 00:00:00 2001 From: Hong Minhee Date: Thu, 18 Jun 2026 17:04:12 +0900 Subject: [PATCH 21/21] Comment why JSR ref plugins apply in reverse A review noted that the jsrRefPlugins.toReversed() loop gave no reason for iterating in reverse, which is easy to misread as accidental. Add a comment recording the rationale behind the earlier priority fix: the package list is ordered by precedence, but a later-registered jsrRef plugin overrides earlier ones for the same reference, so the plugins are applied in reverse to let the first-listed package win. No behavior change. Assisted-by: Claude Code:claude-opus-4-8 --- docs/.vitepress/config.mts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index 50e7fb589..fef4a8dc4 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -383,6 +383,10 @@ export default withMermaid(defineConfig({ md.use(footnote); md.use(taskLists); md.use(groupIconMdPlugin); + // jsrRefPackages is ordered by precedence (first = highest), but a + // later-registered jsrRef plugin overrides earlier ones when both match + // the same reference. Apply them in reverse so the first-listed package + // is registered last and therefore wins. for (const jsrRefPlugin of jsrRefPlugins.toReversed()) { md.use(jsrRefPlugin); }