From 4a27567c1b47e08449c2845035364bf4e2ef4bff Mon Sep 17 00:00:00 2001 From: jxom <7336481+jxom@users.noreply.github.com> Date: Mon, 25 May 2026 15:07:35 +1000 Subject: [PATCH 1/5] perf: gate interactive docs providers --- src/lib/useRootWebAuthnAccount.ts | 7 +++++-- src/pages/_mdx-wrapper.tsx | 17 ++++++++++------- src/pages/index.mdx | 2 +- src/wagmi.config.ts | 2 -- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/lib/useRootWebAuthnAccount.ts b/src/lib/useRootWebAuthnAccount.ts index 9da27db2..968aab73 100644 --- a/src/lib/useRootWebAuthnAccount.ts +++ b/src/lib/useRootWebAuthnAccount.ts @@ -3,8 +3,8 @@ import { useQuery } from '@tanstack/react-query' import type { WebAuthnP256 } from 'viem/tempo' import { Account } from 'viem/tempo' -import { useConnection } from 'wagmi' -import { config, webAuthnRpId } from '../wagmi.config.ts' +import { useConfig, useConnection } from 'wagmi' +import { webAuthnRpId } from '../wagmi.config.ts' type RootWebAuthnAccount = ReturnType type RootWebAuthnCredential = WebAuthnP256.P256Credential @@ -20,6 +20,7 @@ type RootWebAuthnAccountProvider = { const rootWebAuthnAccountTimeoutMs = 30_000 export function useRootWebAuthnAccount() { + const config = useConfig() const { address, connector } = useConnection() return useQuery({ @@ -45,6 +46,7 @@ export function useRootWebAuthnAccount() { } const credential = await waitForStoredCredential( + config, address as `0x${string}`, rootWebAuthnAccountTimeoutMs, ) @@ -92,6 +94,7 @@ async function waitForProviderAccount( } async function waitForStoredCredential( + config: ReturnType, address: `0x${string}`, timeoutMs = 5_000, ): Promise { diff --git a/src/pages/_mdx-wrapper.tsx b/src/pages/_mdx-wrapper.tsx index 4a28aa90..63f9a4dd 100644 --- a/src/pages/_mdx-wrapper.tsx +++ b/src/pages/_mdx-wrapper.tsx @@ -1,7 +1,7 @@ 'use client' /** - * MDX page wrapper — wraps every MDX page rendered by Vocs. + * MDX page wrapper: wraps every MDX page rendered by Vocs. * * ## Conditional Providers * @@ -20,18 +20,19 @@ * * ## Frontmatter flags * - * - `interactive` — loads the Wagmi/QueryClient provider tree. Required for + * - `interactive` loads the Wagmi/QueryClient provider tree. Required for * any page that uses wallet hooks, Demo components, or guide steps. - * - `mipd` — enables Multi Injected Provider Discovery (auto-detects browser + * - `mipd` enables Multi Injected Provider Discovery (auto-detects browser * extension wallets like MetaMask). Implies `interactive`. Only needed on * pages where users connect external wallets. */ -import type React from 'react' +import { lazy, type ReactNode, Suspense } from 'react' import { Layout, MdxPageContext } from 'vocs' -import Providers from '../components/Providers' -export default function MDXWrapper({ children }: { children: React.ReactNode }) { +const Providers = lazy(() => import('../components/Providers')) + +export default function MDXWrapper({ children }: { children: ReactNode }) { const context = MdxPageContext.use() const frontmatter = context.frontmatter as Record | undefined const needsProviders = Boolean(frontmatter?.interactive || frontmatter?.mipd) @@ -39,7 +40,9 @@ export default function MDXWrapper({ children }: { children: React.ReactNode }) return ( {needsProviders ? ( - {children} + + {children} + ) : ( children )} diff --git a/src/pages/index.mdx b/src/pages/index.mdx index 4b8658bc..22f03a41 100644 --- a/src/pages/index.mdx +++ b/src/pages/index.mdx @@ -35,7 +35,7 @@ These docs cover everything from creating a wallet to building payment systems o /> diff --git a/src/wagmi.config.ts b/src/wagmi.config.ts index db3f9e7b..e50afe72 100644 --- a/src/wagmi.config.ts +++ b/src/wagmi.config.ts @@ -109,8 +109,6 @@ export namespace getConfig { export type Config = ReturnType -export const config = getConfig() - export const queryClient = new QueryClient() export function useTempoWalletConnector() { From c46af64e1f75d0d8915e3b94789237cc820e7b3d Mon Sep 17 00:00:00 2001 From: jxom <7336481+jxom@users.noreply.github.com> Date: Mon, 25 May 2026 15:37:30 +1000 Subject: [PATCH 2/5] perf: defer docs instrumentation --- patches/vocs@2.0.0-rc.0.patch | 450 ++++++++++++++++++++++++++++++++ pnpm-lock.yaml | 7 +- pnpm-workspace.yaml | 1 + src/components/PostHogSetup.tsx | 13 +- src/lib/pageSettled.ts | 44 ++++ src/pages/_layout.tsx | 65 +++-- 6 files changed, 549 insertions(+), 31 deletions(-) create mode 100644 patches/vocs@2.0.0-rc.0.patch create mode 100644 src/lib/pageSettled.ts diff --git a/patches/vocs@2.0.0-rc.0.patch b/patches/vocs@2.0.0-rc.0.patch new file mode 100644 index 00000000..66f74f04 --- /dev/null +++ b/patches/vocs@2.0.0-rc.0.patch @@ -0,0 +1,450 @@ +diff --git a/dist/react/Card.client.d.ts b/dist/react/Card.client.d.ts +new file mode 100644 +index 0000000000000000000000000000000000000000..2f17f253a95dda122e2be4535832f18a36081dbb +--- /dev/null ++++ b/dist/react/Card.client.d.ts +@@ -0,0 +1,12 @@ ++import type { ReactNode } from 'react'; ++export declare function CardLink(props: CardLink.Props): import("react/jsx-runtime").JSX.Element; ++export declare namespace CardLink { ++ type Props = { ++ descriptionHtml: string; ++ iconHtml: string | null; ++ title: string; ++ to: string; ++ topRight?: ReactNode | undefined; ++ }; ++} ++//# sourceMappingURL=Card.client.d.ts.map +\ No newline at end of file +diff --git a/dist/react/Card.client.d.ts.map b/dist/react/Card.client.d.ts.map +new file mode 100644 +index 0000000000000000000000000000000000000000..2a395416f457f53945489c752ee00a1aaf4a685e +--- /dev/null ++++ b/dist/react/Card.client.d.ts.map +@@ -0,0 +1 @@ ++{"version":3,"file":"Card.client.d.ts","sourceRoot":"","sources":["../../src/react/Card.client.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGtC,wBAAgB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,2CA2B7C;AAED,MAAM,CAAC,OAAO,WAAW,QAAQ,CAAC;IAChC,KAAY,KAAK,GAAG;QAClB,eAAe,EAAE,MAAM,CAAA;QACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;QACvB,KAAK,EAAE,MAAM,CAAA;QACb,EAAE,EAAE,MAAM,CAAA;QACV,QAAQ,CAAC,EAAE,SAAS,GAAG,SAAS,CAAA;KACjC,CAAA;CACF"} +\ No newline at end of file +diff --git a/dist/react/Card.client.js b/dist/react/Card.client.js +new file mode 100644 +index 0000000000000000000000000000000000000000..715ab09fab71ed44f87da81b1cac1ebae3bc4b3a +--- /dev/null ++++ b/dist/react/Card.client.js +@@ -0,0 +1,12 @@ ++'use client'; ++import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; ++import { Link } from './Link.js'; ++export function CardLink(props) { ++ const { descriptionHtml, iconHtml, title, to, topRight } = props; ++ return (_jsxs(Link, { to: to, className: "vocs:relative vocs:flex vocs:flex-col vocs:space-y-2 vocs:rounded-md vocs:bg-surfaceTint/70 vocs:border vocs:border-primary vocs:p-4 vocs:no-underline vocs:transition-colors vocs:hover:bg-surfaceTint", children: [topRight ? _jsx("div", { className: "vocs:absolute vocs:top-4 vocs:right-4", children: topRight }) : null, iconHtml ? (_jsx("div", { className: "vocs:size-8 vocs:flex vocs:items-center vocs:justify-center vocs:rounded-lg vocs:border vocs:border-primary vocs:bg-surface vocs:text-accent", ++ // biome-ignore lint/security/noDangerouslySetInnerHtml: user-provided icon strings are already supported by Card. ++ dangerouslySetInnerHTML: { __html: iconHtml } })) : null, _jsx("div", { className: "vocs:text-[15px] vocs:font-medium vocs:text-heading", children: title }), _jsx("div", { className: "vocs:text-sm vocs:leading-relaxed vocs:text-secondary", ++ // biome-ignore lint/security/noDangerouslySetInnerHtml: markdown descriptions are rendered before they reach the client. ++ dangerouslySetInnerHTML: { __html: descriptionHtml } })] })); ++} ++//# sourceMappingURL=Card.client.js.map +\ No newline at end of file +diff --git a/dist/react/Card.client.js.map b/dist/react/Card.client.js.map +new file mode 100644 +index 0000000000000000000000000000000000000000..f5399a94d3885672ade5a0887b6ec8d5770ddc42 +--- /dev/null ++++ b/dist/react/Card.client.js.map +@@ -0,0 +1 @@ ++{"version":3,"file":"Card.client.js","sourceRoot":"","sources":["../../src/react/Card.client.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAGZ,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,MAAM,UAAU,QAAQ,CAAC,KAAqB;IAC5C,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAA;IAEhE,OAAO,CACL,MAAC,IAAI,IACH,EAAE,EAAE,EAAE,EACN,SAAS,EAAC,yMAAyM,aAElN,QAAQ,CAAC,CAAC,CAAC,cAAK,SAAS,EAAC,uCAAuC,YAAE,QAAQ,GAAO,CAAC,CAAC,CAAC,IAAI,EAEzF,QAAQ,CAAC,CAAC,CAAC,CACV,cACE,SAAS,EAAC,8IAA8I;gBACxJ,kHAAkH;gBAClH,uBAAuB,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,GAC7C,CACH,CAAC,CAAC,CAAC,IAAI,EAER,cAAK,SAAS,EAAC,qDAAqD,YAAE,KAAK,GAAO,EAElF,cACE,SAAS,EAAC,uDAAuD;gBACjE,yHAAyH;gBACzH,uBAAuB,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,GACpD,IACG,CACR,CAAA;AACH,CAAC"} +\ No newline at end of file +diff --git a/dist/react/Cards.d.ts.map b/dist/react/Cards.d.ts.map +index 0ecfe8082dd19fa612dca2811751986082d113b8..94462896134079c9347bcd9438ff98489e6d00ab 100644 +--- a/dist/react/Cards.d.ts.map ++++ b/dist/react/Cards.d.ts.map +@@ -1 +1 @@ +-{"version":3,"file":"Cards.d.ts","sourceRoot":"","sources":["../../src/react/Cards.tsx"],"names":[],"mappings":"AAIA,wBAAgB,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,2CAMvC;AAED,MAAM,CAAC,OAAO,WAAW,KAAK,CAAC;IAC7B,KAAY,KAAK,GAAG;QAClB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;KAC1B,CAAA;CACF;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,2CA8BrC;AAED,MAAM,CAAC,OAAO,WAAW,IAAI,CAAC;IAC5B,KAAY,KAAK,GAAG;QAClB,KAAK,EAAE,MAAM,CAAA;QACb,WAAW,EAAE,MAAM,CAAA;QACnB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACzB,EAAE,EAAE,MAAM,CAAA;QACV,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,SAAS,CAAA;KACvC,CAAA;CACF"} +\ No newline at end of file ++{"version":3,"file":"Cards.d.ts","sourceRoot":"","sources":["../../src/react/Cards.tsx"],"names":[],"mappings":"AAIA,wBAAgB,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,2CAMvC;AAED,MAAM,CAAC,OAAO,WAAW,KAAK,CAAC;IAC7B,KAAY,KAAK,GAAG;QAClB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;KAC1B,CAAA;CACF;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,2CAerC;AAED,MAAM,CAAC,OAAO,WAAW,IAAI,CAAC;IAC5B,KAAY,KAAK,GAAG;QAClB,KAAK,EAAE,MAAM,CAAA;QACb,WAAW,EAAE,MAAM,CAAA;QACnB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACzB,EAAE,EAAE,MAAM,CAAA;QACV,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,SAAS,CAAA;KACvC,CAAA;CACF"} +\ No newline at end of file +diff --git a/dist/react/Cards.js b/dist/react/Cards.js +index cb477213ac40537369740c0b8f19b9da070300df..fcb23ef9538b8c04f24413e25469b0dfc8bb7ed8 100644 +--- a/dist/react/Cards.js ++++ b/dist/react/Cards.js +@@ -1,7 +1,7 @@ +-import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; ++import { jsx as _jsx } from "react/jsx-runtime"; + import * as Icons from '../internal/icons.js'; + import * as Markdown from '../internal/markdown.js'; +-import { Link } from './Link.js'; ++import { CardLink } from './Card.client.js'; + export function Cards(props) { + return (_jsx("div", { className: "vocs:grid vocs:grid-cols-1 vocs:md:grid-cols-2 vocs:gap-4", children: props.children })); + } +@@ -9,10 +9,6 @@ export function Card(props) { + const { title, description, icon, to, topRight } = props; + const iconHtml = icon ? (Icons.resolveIconSync(icon) ?? null) : null; + const descriptionHtml = Markdown.toHtml(description); +- return (_jsxs(Link, { to: to, className: "vocs:relative vocs:flex vocs:flex-col vocs:space-y-2 vocs:rounded-md vocs:bg-surfaceTint/70 vocs:border vocs:border-primary vocs:p-4 vocs:no-underline vocs:transition-colors vocs:hover:bg-surfaceTint", children: [topRight ? _jsx("div", { className: "vocs:absolute vocs:top-4 vocs:right-4", children: topRight }) : null, iconHtml ? (_jsx("div", { className: "vocs:size-8 vocs:flex vocs:items-center vocs:justify-center vocs:rounded-lg vocs:border vocs:border-primary vocs:bg-surface vocs:text-accent", +- // biome-ignore lint/security/noDangerouslySetInnerHtml: _ +- dangerouslySetInnerHTML: { __html: iconHtml } })) : null, _jsx("div", { className: "vocs:text-[15px] vocs:font-medium vocs:text-heading", children: title }), _jsx("div", { className: "vocs:text-sm vocs:leading-relaxed vocs:text-secondary", +- // biome-ignore lint/security/noDangerouslySetInnerHtml: _ +- dangerouslySetInnerHTML: { __html: descriptionHtml } })] })); ++ return (_jsx(CardLink, { to: to, title: title, descriptionHtml: descriptionHtml, iconHtml: iconHtml, topRight: topRight })); + } + //# sourceMappingURL=Cards.js.map +\ No newline at end of file +diff --git a/dist/react/Cards.js.map b/dist/react/Cards.js.map +index 6d2b42bde2f3bc2f447aa8ed264174fd51a29009..89ac8f58ecd294fdad11e8f83647e951ed3e79ea 100644 +--- a/dist/react/Cards.js.map ++++ b/dist/react/Cards.js.map +@@ -1 +1 @@ +-{"version":3,"file":"Cards.js","sourceRoot":"","sources":["../../src/react/Cards.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,sBAAsB,CAAA;AAC7C,OAAO,KAAK,QAAQ,MAAM,yBAAyB,CAAA;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,MAAM,UAAU,KAAK,CAAC,KAAkB;IACtC,OAAO,CACL,cAAK,SAAS,EAAC,2DAA2D,YACvE,KAAK,CAAC,QAAQ,GACX,CACP,CAAA;AACH,CAAC;AAQD,MAAM,UAAU,IAAI,CAAC,KAAiB;IACpC,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAA;IAExD,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACpE,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;IAEpD,OAAO,CACL,MAAC,IAAI,IACH,EAAE,EAAE,EAAE,EACN,SAAS,EAAC,yMAAyM,aAElN,QAAQ,CAAC,CAAC,CAAC,cAAK,SAAS,EAAC,uCAAuC,YAAE,QAAQ,GAAO,CAAC,CAAC,CAAC,IAAI,EAEzF,QAAQ,CAAC,CAAC,CAAC,CACV,cACE,SAAS,EAAC,8IAA8I;gBACxJ,0DAA0D;gBAC1D,uBAAuB,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,GAC7C,CACH,CAAC,CAAC,CAAC,IAAI,EAER,cAAK,SAAS,EAAC,qDAAqD,YAAE,KAAK,GAAO,EAElF,cACE,SAAS,EAAC,uDAAuD;gBACjE,0DAA0D;gBAC1D,uBAAuB,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,GACpD,IACG,CACR,CAAA;AACH,CAAC"} +\ No newline at end of file ++{"version":3,"file":"Cards.js","sourceRoot":"","sources":["../../src/react/Cards.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,sBAAsB,CAAA;AAC7C,OAAO,KAAK,QAAQ,MAAM,yBAAyB,CAAA;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAE3C,MAAM,UAAU,KAAK,CAAC,KAAkB;IACtC,OAAO,CACL,cAAK,SAAS,EAAC,2DAA2D,YACvE,KAAK,CAAC,QAAQ,GACX,CACP,CAAA;AACH,CAAC;AAQD,MAAM,UAAU,IAAI,CAAC,KAAiB;IACpC,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAA;IAExD,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACpE,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;IAEpD,OAAO,CACL,KAAC,QAAQ,IACP,EAAE,EAAE,EAAE,EACN,KAAK,EAAE,KAAK,EACZ,eAAe,EAAE,eAAe,EAChC,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,GAClB,CACH,CAAA;AACH,CAAC"} +\ No newline at end of file +diff --git a/dist/react/Link.d.ts.map b/dist/react/Link.d.ts.map +index c44d3e250b534f41d6947b224e8af8f5d76cc359..e0cbb47c909820d32048aa175f6fc3a7dedb0d3c 100644 +--- a/dist/react/Link.d.ts.map ++++ b/dist/react/Link.d.ts.map +@@ -1 +1 @@ +-{"version":3,"file":"Link.d.ts","sourceRoot":"","sources":["../../src/react/Link.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAa,IAAI,IAAI,QAAQ,EAAE,MAAM,MAAM,CAAA;AAGlD,wBAAgB,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,2CAiBrC;AAED,yBAAiB,IAAI,CAAC;IACpB,KAAY,KAAK,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,QAAQ,CAAC,CAAA;CAC1D"} +\ No newline at end of file ++{"version":3,"file":"Link.d.ts","sourceRoot":"","sources":["../../src/react/Link.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAa,IAAI,IAAI,QAAQ,EAAE,MAAM,MAAM,CAAA;AAsDlD,wBAAgB,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,2CAuBrC;AAED,yBAAiB,IAAI,CAAC;IACpB,KAAY,KAAK,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,QAAQ,CAAC,CAAA;CAC1D"} +\ No newline at end of file +diff --git a/dist/react/Link.js b/dist/react/Link.js +index d70d5ca7debf0766d78276d62d7925e2a72b5b3c..730062e01544917b67b237c81ec513b46a37c7f0 100644 +--- a/dist/react/Link.js ++++ b/dist/react/Link.js +@@ -1,14 +1,62 @@ + 'use client'; + import { jsx as _jsx } from "react/jsx-runtime"; ++import { useEffect, useState } from 'react'; + import { useRouter, Link as WakuLink } from 'waku'; + import * as Path from '../internal/path.js'; ++const viewportPrefetchDelayMs = 4_000; ++let viewportPrefetchReady = false; ++let viewportPrefetchScheduled = false; ++const viewportPrefetchListeners = new Set(); ++function markViewportPrefetchReady() { ++ viewportPrefetchReady = true; ++ for (const listener of viewportPrefetchListeners) ++ listener(); ++ viewportPrefetchListeners.clear(); ++} ++function scheduleViewportPrefetch() { ++ if (viewportPrefetchReady || viewportPrefetchScheduled || typeof window === 'undefined') ++ return; ++ viewportPrefetchScheduled = true; ++ const scheduleAfterLoad = () => { ++ window.setTimeout(() => { ++ if ('requestIdleCallback' in window) { ++ window.requestIdleCallback(markViewportPrefetchReady, { timeout: 2_000 }); ++ return; ++ } ++ markViewportPrefetchReady(); ++ }, viewportPrefetchDelayMs); ++ }; ++ if (document.readyState === 'complete') ++ scheduleAfterLoad(); ++ else ++ window.addEventListener('load', scheduleAfterLoad, { once: true }); ++} ++function useViewportPrefetchReady(enabled) { ++ const [ready, setReady] = useState(viewportPrefetchReady); ++ useEffect(() => { ++ if (!enabled) ++ return; ++ if (viewportPrefetchReady) { ++ setReady(true); ++ return; ++ } ++ const listener = () => setReady(true); ++ viewportPrefetchListeners.add(listener); ++ scheduleViewportPrefetch(); ++ return () => { ++ viewportPrefetchListeners.delete(listener); ++ }; ++ }, [enabled]); ++ return enabled && ready; ++} + export function Link(props) { +- const { to, ...rest } = props; ++ const { to, unstable_prefetchOnEnter = !import.meta.env.DEV, unstable_prefetchOnView = !import.meta.env.DEV, ...rest } = props; + const { path } = useRouter(); ++ const prefetchOnView = useViewportPrefetchReady(Boolean(unstable_prefetchOnView)); + if (Path.isExternal(props.to)) + return _jsx("a", { ...rest, href: props.to, rel: "noopener noreferrer", target: "_blank" }); + const [before, after] = (props.to || '').split('#'); + const resolvedTo = `${before ? before : path}${after ? `#${after}` : ''}`; +- return (_jsx(WakuLink, { ...rest, to: resolvedTo, unstable_prefetchOnEnter: !import.meta.env.DEV, unstable_prefetchOnView: !import.meta.env.DEV })); ++ return (_jsx(WakuLink, { ...rest, to: resolvedTo, unstable_prefetchOnEnter: unstable_prefetchOnEnter, unstable_prefetchOnView: prefetchOnView })); + } + //# sourceMappingURL=Link.js.map +\ No newline at end of file +diff --git a/dist/react/Link.js.map b/dist/react/Link.js.map +index fce9b74d8f74281580086e5ea318199aa91988ba..15e92f2d55882a7abd625ca13c360025209401a8 100644 +--- a/dist/react/Link.js.map ++++ b/dist/react/Link.js.map +@@ -1 +1 @@ +-{"version":3,"file":"Link.js","sourceRoot":"","sources":["../../src/react/Link.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,MAAM,CAAA;AAClD,OAAO,KAAK,IAAI,MAAM,qBAAqB,CAAA;AAE3C,MAAM,UAAU,IAAI,CAAC,KAAiB;IACpC,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAA;IAC7B,MAAM,EAAE,IAAI,EAAE,GAAG,SAAS,EAAE,CAAA;IAE5B,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,eAAO,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,EAAC,qBAAqB,EAAC,MAAM,EAAC,QAAQ,GAAG,CAAA;IAElF,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACnD,MAAM,UAAU,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;IACzE,OAAO,CACL,KAAC,QAAQ,OACH,IAAI,EACR,EAAE,EAAE,UAAU,EACd,wBAAwB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAC9C,uBAAuB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAC7C,CACH,CAAA;AACH,CAAC"} +\ No newline at end of file ++{"version":3,"file":"Link.js","sourceRoot":"","sources":["../../src/react/Link.tsx"],"names":[],"mappings":"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"} +\ No newline at end of file +diff --git a/dist/react/internal/CodeBlock.client.d.ts.map b/dist/react/internal/CodeBlock.client.d.ts.map +index 8d52b506a29db34b244d1a1feac2dd788bfd23c1..e6dc02c09b771544b9b45a05b526a702a63adf3f 100644 +--- a/dist/react/internal/CodeBlock.client.d.ts.map ++++ b/dist/react/internal/CodeBlock.client.d.ts.map +@@ -1 +1 @@ +-{"version":3,"file":"CodeBlock.client.d.ts","sourceRoot":"","sources":["../../../src/react/internal/CodeBlock.client.tsx"],"names":[],"mappings":"AAQA,wBAAgB,UAAU,4CAmCzB;AAED,wBAAgB,UAAU,mDAsDzB;AAWD,wBAAgB,oBAAoB,4CA4EnC"} +\ No newline at end of file ++{"version":3,"file":"CodeBlock.client.d.ts","sourceRoot":"","sources":["../../../src/react/internal/CodeBlock.client.tsx"],"names":[],"mappings":"AAOA,wBAAgB,UAAU,4CAmCzB;AAED,wBAAgB,UAAU,mDAsDzB;AAaD,wBAAgB,oBAAoB,4CA4EnC"} +\ No newline at end of file +diff --git a/dist/react/internal/CodeBlock.client.js b/dist/react/internal/CodeBlock.client.js +index 9f12507c40cab021547278aa82ab855f7bad881b..d6c8f211c250181fd90f952a3069689a7d91d9ac 100644 +--- a/dist/react/internal/CodeBlock.client.js ++++ b/dist/react/internal/CodeBlock.client.js +@@ -4,7 +4,6 @@ import * as React from 'react'; + import LucideCheck from '~icons/lucide/check'; + import LucideClipboard from '~icons/lucide/clipboard'; + import LucideWrapText from '~icons/lucide/wrap-text'; +-import { getIconHtml } from './utils.js'; + export function WrapButton() { + const buttonRef = React.useRef(null); + const [wrapped, setWrapped] = React.useState(false); +@@ -66,8 +65,8 @@ export function CopyButton() { + return null; + return (_jsx("button", { ref: buttonRef, "aria-label": copied ? 'Copied' : 'Copy code', className: "vocs:absolute vocs:top-2.5 vocs:data-[single-line=true]:top-1/2 vocs:data-[single-line=true]:-translate-y-1/2 vocs:right-2.5 vocs:p-1.5 vocs:rounded-md vocs:opacity-0 vocs:transition-opacity vocs:duration-150 vocs:text-secondary vocs:hover:text-heading vocs:cursor-pointer vocs:group-hover/code:opacity-100 vocs:data-[copied=true]:opacity-100 vocs:data-[copied=true]:text-success", "data-copied": copied, "data-single-line": singleLine, onClick: copy, type: "button", children: copied ? (_jsx(LucideCheck, { className: "vocs:size-4" })) : (_jsx(LucideClipboard, { className: "vocs:size-4" })) })); + } +-const clipboardIconHtml = getIconHtml('clipboard', 'vocs:size-3.5'); +-const checkIconHtml = getIconHtml('check', 'vocs:size-3.5'); ++const clipboardIconHtml = ''; ++const checkIconHtml = ''; + function createIconElement(html) { + const template = document.createElement('template'); + template.innerHTML = html.trim(); +diff --git a/dist/react/internal/CodeBlock.client.js.map b/dist/react/internal/CodeBlock.client.js.map +index af9b062a05aa08356b1875beade55cdaac534e06..ff1f082b358d7cce288815b14e37e6d4cd617c01 100644 +--- a/dist/react/internal/CodeBlock.client.js.map ++++ b/dist/react/internal/CodeBlock.client.js.map +@@ -1 +1 @@ +-{"version":3,"file":"CodeBlock.client.js","sourceRoot":"","sources":["../../../src/react/internal/CodeBlock.client.tsx"],"names":[],"mappings":"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"} +\ No newline at end of file ++{"version":3,"file":"CodeBlock.client.js","sourceRoot":"","sources":["../../../src/react/internal/CodeBlock.client.tsx"],"names":[],"mappings":"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"} +\ No newline at end of file +diff --git a/dist/react/internal/utils.d.ts b/dist/react/internal/utils.d.ts +deleted file mode 100644 +index e3cfff823b0f82f93a81e068269d6e00ed9fcbe6..0000000000000000000000000000000000000000 +diff --git a/dist/react/internal/utils.d.ts.map b/dist/react/internal/utils.d.ts.map +deleted file mode 100644 +index fd9bfbdc4bc0b4ef4b1fc58082f8c96659a2ea8c..0000000000000000000000000000000000000000 +diff --git a/dist/react/internal/utils.js b/dist/react/internal/utils.js +deleted file mode 100644 +index e0cf6d1ac9e15aa865da38bac456ee91765f2587..0000000000000000000000000000000000000000 +diff --git a/dist/react/internal/utils.js.map b/dist/react/internal/utils.js.map +deleted file mode 100644 +index 945f9377aadcd43f52949998bfdc24ed00ecb9d1..0000000000000000000000000000000000000000 +diff --git a/src/react/Card.client.tsx b/src/react/Card.client.tsx +new file mode 100644 +index 0000000000000000000000000000000000000000..a03cb6d78f6f6604e194653579bc46c3bf67ad4f +--- /dev/null ++++ b/src/react/Card.client.tsx +@@ -0,0 +1,43 @@ ++'use client' ++ ++import type { ReactNode } from 'react' ++import { Link } from './Link.js' ++ ++export function CardLink(props: CardLink.Props) { ++ const { descriptionHtml, iconHtml, title, to, topRight } = props ++ ++ return ( ++ ++ {topRight ?
{topRight}
: null} ++ ++ {iconHtml ? ( ++
++ ) : null} ++ ++
{title}
++ ++
++ ++ ) ++} ++ ++export declare namespace CardLink { ++ export type Props = { ++ descriptionHtml: string ++ iconHtml: string | null ++ title: string ++ to: string ++ topRight?: ReactNode | undefined ++ } ++} +diff --git a/src/react/Cards.tsx b/src/react/Cards.tsx +index b54a1d032e8bcfa60295217f9b1a1395c8920620..1b5c2a28414a9b79e145ff603e21e28e942e637c 100644 +--- a/src/react/Cards.tsx ++++ b/src/react/Cards.tsx +@@ -1,6 +1,6 @@ + import * as Icons from '../internal/icons.js' + import * as Markdown from '../internal/markdown.js' +-import { Link } from './Link.js' ++import { CardLink } from './Card.client.js' + + export function Cards(props: Cards.Props) { + return ( +@@ -23,28 +23,13 @@ export function Card(props: Card.Props) { + const descriptionHtml = Markdown.toHtml(description) + + return ( +- +- {topRight ?
{topRight}
: null} +- +- {iconHtml ? ( +-
+- ) : null} +- +-
{title}
+- +-
+- ++ title={title} ++ descriptionHtml={descriptionHtml} ++ iconHtml={iconHtml} ++ topRight={topRight} ++ /> + ) + } + +diff --git a/src/react/Link.tsx b/src/react/Link.tsx +index 693388efe03232cd3b0c0fe888c4e7e300a8e81d..4a1c70e292bc43d82ee6f6204f772ca10d68869c 100644 +--- a/src/react/Link.tsx ++++ b/src/react/Link.tsx +@@ -1,11 +1,69 @@ + 'use client' + ++import { useEffect, useState } from 'react' + import { useRouter, Link as WakuLink } from 'waku' + import * as Path from '../internal/path.js' + ++const viewportPrefetchDelayMs = 4_000 ++ ++let viewportPrefetchReady = false ++let viewportPrefetchScheduled = false ++const viewportPrefetchListeners = new Set<() => void>() ++ ++function markViewportPrefetchReady() { ++ viewportPrefetchReady = true ++ for (const listener of viewportPrefetchListeners) listener() ++ viewportPrefetchListeners.clear() ++} ++ ++function scheduleViewportPrefetch() { ++ if (viewportPrefetchReady || viewportPrefetchScheduled || typeof window === 'undefined') return ++ viewportPrefetchScheduled = true ++ ++ const scheduleAfterLoad = () => { ++ window.setTimeout(() => { ++ if ('requestIdleCallback' in window) { ++ window.requestIdleCallback(markViewportPrefetchReady, { timeout: 2_000 }) ++ return ++ } ++ markViewportPrefetchReady() ++ }, viewportPrefetchDelayMs) ++ } ++ ++ if (document.readyState === 'complete') scheduleAfterLoad() ++ else window.addEventListener('load', scheduleAfterLoad, { once: true }) ++} ++ ++function useViewportPrefetchReady(enabled: boolean) { ++ const [ready, setReady] = useState(viewportPrefetchReady) ++ ++ useEffect(() => { ++ if (!enabled) return ++ if (viewportPrefetchReady) { ++ setReady(true) ++ return ++ } ++ ++ const listener = () => setReady(true) ++ viewportPrefetchListeners.add(listener) ++ scheduleViewportPrefetch() ++ return () => { ++ viewportPrefetchListeners.delete(listener) ++ } ++ }, [enabled]) ++ ++ return enabled && ready ++} ++ + export function Link(props: Link.Props) { +- const { to, ...rest } = props ++ const { ++ to, ++ unstable_prefetchOnEnter = !import.meta.env.DEV, ++ unstable_prefetchOnView = !import.meta.env.DEV, ++ ...rest ++ } = props + const { path } = useRouter() ++ const prefetchOnView = useViewportPrefetchReady(Boolean(unstable_prefetchOnView)) + + if (Path.isExternal(props.to)) + return +@@ -16,8 +74,8 @@ export function Link(props: Link.Props) { + + ) + } +diff --git a/src/react/internal/CodeBlock.client.tsx b/src/react/internal/CodeBlock.client.tsx +index 55ae13e0fd2b6be557d32849b1b20b957123c0f6..c92f6c6c35e2ce3729111fff57f00152eb021794 100644 +--- a/src/react/internal/CodeBlock.client.tsx ++++ b/src/react/internal/CodeBlock.client.tsx +@@ -4,7 +4,6 @@ import * as React from 'react' + import LucideCheck from '~icons/lucide/check' + import LucideClipboard from '~icons/lucide/clipboard' + import LucideWrapText from '~icons/lucide/wrap-text' +-import { getIconHtml } from './utils.js' + + export function WrapButton() { + const buttonRef = React.useRef(null) +@@ -99,8 +98,10 @@ export function CopyButton() { + ) + } + +-const clipboardIconHtml = getIconHtml('clipboard', 'vocs:size-3.5') +-const checkIconHtml = getIconHtml('check', 'vocs:size-3.5') ++const clipboardIconHtml = ++ '' ++const checkIconHtml = ++ '' + + function createIconElement(html: string): HTMLElement { + const template = document.createElement('template') +diff --git a/src/react/internal/utils.ts b/src/react/internal/utils.ts +deleted file mode 100644 +index 4e616a93382029a7c71da95db2cfc7d1f3c74a0b..0000000000000000000000000000000000000000 diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index db1dcaed..e96f39ee 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,6 +16,9 @@ patchedDependencies: dayjs@1.11.20: hash: 47bfcf62e3c84ba85d881815422a02e23f372df46bddb9b022eb3705361fd165 path: patches/dayjs@1.11.20.patch + vocs@2.0.0-rc.0: + hash: f452b57a515ac852fa14bcf54c19799dde7bfcb011330ad5e0912329fc583fcf + path: patches/vocs@2.0.0-rc.0.patch importers: @@ -107,7 +110,7 @@ importers: version: 2.48.8(typescript@5.9.3)(zod@4.3.6) vocs: specifier: 2.0.0-rc.0 - version: 2.0.0-rc.0(@cfworker/json-schema@4.1.1)(@types/react@19.2.14)(mermaid@11.14.0)(react-dom@19.2.6(react@19.2.6))(react-server-dom-webpack@19.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(webpack@5.104.1(esbuild@0.27.7)))(react@19.2.6)(rollup@4.60.1)(typescript@5.9.3)(vite@8.0.14(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4))(waku@1.0.0-beta.0(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(react-dom@19.2.6(react@19.2.6))(react-server-dom-webpack@19.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(webpack@5.104.1(esbuild@0.27.7)))(react@19.2.6)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4)) + version: 2.0.0-rc.0(patch_hash=f452b57a515ac852fa14bcf54c19799dde7bfcb011330ad5e0912329fc583fcf)(@cfworker/json-schema@4.1.1)(@types/react@19.2.14)(mermaid@11.14.0)(react-dom@19.2.6(react@19.2.6))(react-server-dom-webpack@19.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(webpack@5.104.1(esbuild@0.27.7)))(react@19.2.6)(rollup@4.60.1)(typescript@5.9.3)(vite@8.0.14(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4))(waku@1.0.0-beta.0(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(react-dom@19.2.6(react@19.2.6))(react-server-dom-webpack@19.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(webpack@5.104.1(esbuild@0.27.7)))(react@19.2.6)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4)) wagmi: specifier: 3.6.14 version: 3.6.14(@tanstack/query-core@5.99.0)(@tanstack/react-query@5.99.0(react@19.2.6))(@types/react@19.2.14)(accounts@0.10.7)(react@19.2.6)(typescript@5.9.3)(viem@2.48.8(typescript@5.9.3)(zod@4.3.6)) @@ -8338,7 +8341,7 @@ snapshots: optionalDependencies: vite: 8.0.14(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4) - vocs@2.0.0-rc.0(@cfworker/json-schema@4.1.1)(@types/react@19.2.14)(mermaid@11.14.0)(react-dom@19.2.6(react@19.2.6))(react-server-dom-webpack@19.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(webpack@5.104.1(esbuild@0.27.7)))(react@19.2.6)(rollup@4.60.1)(typescript@5.9.3)(vite@8.0.14(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4))(waku@1.0.0-beta.0(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(react-dom@19.2.6(react@19.2.6))(react-server-dom-webpack@19.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(webpack@5.104.1(esbuild@0.27.7)))(react@19.2.6)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4)): + vocs@2.0.0-rc.0(patch_hash=f452b57a515ac852fa14bcf54c19799dde7bfcb011330ad5e0912329fc583fcf)(@cfworker/json-schema@4.1.1)(@types/react@19.2.14)(mermaid@11.14.0)(react-dom@19.2.6(react@19.2.6))(react-server-dom-webpack@19.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(webpack@5.104.1(esbuild@0.27.7)))(react@19.2.6)(rollup@4.60.1)(typescript@5.9.3)(vite@8.0.14(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4))(waku@1.0.0-beta.0(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(react-dom@19.2.6(react@19.2.6))(react-server-dom-webpack@19.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(webpack@5.104.1(esbuild@0.27.7)))(react@19.2.6)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4)): dependencies: '@base-ui/react': 1.3.0(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@codesandbox/sandpack-react': 2.20.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 3aba6143..122c3a50 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -33,3 +33,4 @@ overrides: patchedDependencies: '@braintree/sanitize-url@7.1.2': patches/@braintree__sanitize-url@7.1.2.patch dayjs@1.11.20: patches/dayjs@1.11.20.patch + vocs@2.0.0-rc.0: patches/vocs@2.0.0-rc.0.patch diff --git a/src/components/PostHogSetup.tsx b/src/components/PostHogSetup.tsx index 89cb48b0..c0afb351 100644 --- a/src/components/PostHogSetup.tsx +++ b/src/components/PostHogSetup.tsx @@ -1,6 +1,5 @@ 'use client' -import posthog from 'posthog-js' import { useEffect } from 'react' function PostHogInitializer() { @@ -10,7 +9,9 @@ function PostHogInitializer() { if (!posthogKey || !posthogHost) return - const init = () => { + const init = async () => { + const { default: posthog } = await import('posthog-js') + posthog.init(posthogKey, { api_host: '/ingest', ui_host: posthogHost, @@ -28,10 +29,12 @@ function PostHogInitializer() { } if ('requestIdleCallback' in window) { - window.requestIdleCallback(init) - } else { - setTimeout(init, 1) + const idleId = window.requestIdleCallback(init, { timeout: 2_000 }) + return () => window.cancelIdleCallback(idleId) } + + const timeoutId = globalThis.setTimeout(init, 1) + return () => globalThis.clearTimeout(timeoutId) }, []) return null diff --git a/src/lib/pageSettled.ts b/src/lib/pageSettled.ts new file mode 100644 index 00000000..aab11ce9 --- /dev/null +++ b/src/lib/pageSettled.ts @@ -0,0 +1,44 @@ +'use client' + +import { useEffect, useState } from 'react' + +const pageSettledDelayMs = 4_000 + +export function onPageSettled(callback: () => void) { + if (typeof window === 'undefined') return () => {} + + let cancelled = false + let timeoutId: number | undefined + let idleId: number | undefined + + const run = () => { + if (cancelled) return + if ('requestIdleCallback' in window) { + idleId = window.requestIdleCallback(callback, { timeout: 2_000 }) + return + } + callback() + } + + const schedule = () => { + timeoutId = window.setTimeout(run, pageSettledDelayMs) + } + + if (document.readyState === 'complete') schedule() + else window.addEventListener('load', schedule, { once: true }) + + return () => { + cancelled = true + window.removeEventListener('load', schedule) + if (timeoutId) window.clearTimeout(timeoutId) + if (idleId && 'cancelIdleCallback' in window) window.cancelIdleCallback(idleId) + } +} + +export function usePageSettled() { + const [settled, setSettled] = useState(false) + + useEffect(() => onPageSettled(() => setSettled(true)), []) + + return settled +} diff --git a/src/pages/_layout.tsx b/src/pages/_layout.tsx index a44a84f4..76e56fdf 100644 --- a/src/pages/_layout.tsx +++ b/src/pages/_layout.tsx @@ -1,11 +1,17 @@ 'use client' -import { Analytics } from '@vercel/analytics/react' -import { SpeedInsights } from '@vercel/speed-insights/react' -import type React from 'react' -import { Toaster } from 'sonner' -import GoogleAnalytics from '../components/GoogleAnalytics' -import PostHogSetup from '../components/PostHogSetup' +import { lazy, type PropsWithChildren, Suspense } from 'react' +import { usePageSettled } from '../lib/pageSettled' + +const Analytics = lazy(() => + import('@vercel/analytics/react').then((module) => ({ default: module.Analytics })), +) +const SpeedInsights = lazy(() => + import('@vercel/speed-insights/react').then((module) => ({ default: module.SpeedInsights })), +) +const Toaster = lazy(() => import('sonner').then((module) => ({ default: module.Toaster }))) +const GoogleAnalytics = lazy(() => import('../components/GoogleAnalytics')) +const PostHogSetup = lazy(() => import('../components/PostHogSetup')) if (typeof window !== 'undefined') { window.addEventListener('vite:preloadError', (event) => { @@ -18,30 +24,41 @@ if (typeof window !== 'undefined') { } export default function Layout( - props: React.PropsWithChildren<{ + props: PropsWithChildren<{ path: string - frontmatter?: { mipd?: boolean } + frontmatter?: { interactive?: boolean; mipd?: boolean } }>, ) { + const pageSettled = usePageSettled() + const needsToaster = Boolean(props.frontmatter?.interactive || props.frontmatter?.mipd) + return ( <> {props.children} - - - - - + + {needsToaster && ( + + )} + {pageSettled && ( + <> + + + + + + )} + ) } From 8565e95a81d0d2a5975d4ddec57d9e2ec74f1d04 Mon Sep 17 00:00:00 2001 From: jxom <7336481+jxom@users.noreply.github.com> Date: Mon, 25 May 2026 15:47:42 +1000 Subject: [PATCH 3/5] perf: tune docs viewport prefetch patch --- patches/vocs@2.0.0-rc.0.patch | 8 ++++---- pnpm-lock.yaml | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/patches/vocs@2.0.0-rc.0.patch b/patches/vocs@2.0.0-rc.0.patch index 66f74f04..34d8e60e 100644 --- a/patches/vocs@2.0.0-rc.0.patch +++ b/patches/vocs@2.0.0-rc.0.patch @@ -107,7 +107,7 @@ index c44d3e250b534f41d6947b224e8af8f5d76cc359..e0cbb47c909820d32048aa175f6fc3a7 +{"version":3,"file":"Link.d.ts","sourceRoot":"","sources":["../../src/react/Link.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAa,IAAI,IAAI,QAAQ,EAAE,MAAM,MAAM,CAAA;AAsDlD,wBAAgB,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,2CAuBrC;AAED,yBAAiB,IAAI,CAAC;IACpB,KAAY,KAAK,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,QAAQ,CAAC,CAAA;CAC1D"} \ No newline at end of file diff --git a/dist/react/Link.js b/dist/react/Link.js -index d70d5ca7debf0766d78276d62d7925e2a72b5b3c..730062e01544917b67b237c81ec513b46a37c7f0 100644 +index d70d5ca7debf0766d78276d62d7925e2a72b5b3c..5bcb27626d710633997dd4019ae05e87ab93e296 100644 --- a/dist/react/Link.js +++ b/dist/react/Link.js @@ -1,14 +1,62 @@ @@ -116,7 +116,7 @@ index d70d5ca7debf0766d78276d62d7925e2a72b5b3c..730062e01544917b67b237c81ec513b4 +import { useEffect, useState } from 'react'; import { useRouter, Link as WakuLink } from 'waku'; import * as Path from '../internal/path.js'; -+const viewportPrefetchDelayMs = 4_000; ++const viewportPrefetchDelayMs = 2_000; +let viewportPrefetchReady = false; +let viewportPrefetchScheduled = false; +const viewportPrefetchListeners = new Set(); @@ -335,7 +335,7 @@ index b54a1d032e8bcfa60295217f9b1a1395c8920620..1b5c2a28414a9b79e145ff603e21e28e } diff --git a/src/react/Link.tsx b/src/react/Link.tsx -index 693388efe03232cd3b0c0fe888c4e7e300a8e81d..4a1c70e292bc43d82ee6f6204f772ca10d68869c 100644 +index 693388efe03232cd3b0c0fe888c4e7e300a8e81d..c9680b2290a952e04241e3408bef563f1eb70b95 100644 --- a/src/react/Link.tsx +++ b/src/react/Link.tsx @@ -1,11 +1,69 @@ @@ -345,7 +345,7 @@ index 693388efe03232cd3b0c0fe888c4e7e300a8e81d..4a1c70e292bc43d82ee6f6204f772ca1 import { useRouter, Link as WakuLink } from 'waku' import * as Path from '../internal/path.js' -+const viewportPrefetchDelayMs = 4_000 ++const viewportPrefetchDelayMs = 2_000 + +let viewportPrefetchReady = false +let viewportPrefetchScheduled = false diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e96f39ee..64c4cb5e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,7 +17,7 @@ patchedDependencies: hash: 47bfcf62e3c84ba85d881815422a02e23f372df46bddb9b022eb3705361fd165 path: patches/dayjs@1.11.20.patch vocs@2.0.0-rc.0: - hash: f452b57a515ac852fa14bcf54c19799dde7bfcb011330ad5e0912329fc583fcf + hash: 6954b63892a8203309b60825d78f5737f592b4f89d7ae2fda04787575285c41b path: patches/vocs@2.0.0-rc.0.patch importers: @@ -110,7 +110,7 @@ importers: version: 2.48.8(typescript@5.9.3)(zod@4.3.6) vocs: specifier: 2.0.0-rc.0 - version: 2.0.0-rc.0(patch_hash=f452b57a515ac852fa14bcf54c19799dde7bfcb011330ad5e0912329fc583fcf)(@cfworker/json-schema@4.1.1)(@types/react@19.2.14)(mermaid@11.14.0)(react-dom@19.2.6(react@19.2.6))(react-server-dom-webpack@19.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(webpack@5.104.1(esbuild@0.27.7)))(react@19.2.6)(rollup@4.60.1)(typescript@5.9.3)(vite@8.0.14(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4))(waku@1.0.0-beta.0(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(react-dom@19.2.6(react@19.2.6))(react-server-dom-webpack@19.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(webpack@5.104.1(esbuild@0.27.7)))(react@19.2.6)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4)) + version: 2.0.0-rc.0(patch_hash=6954b63892a8203309b60825d78f5737f592b4f89d7ae2fda04787575285c41b)(@cfworker/json-schema@4.1.1)(@types/react@19.2.14)(mermaid@11.14.0)(react-dom@19.2.6(react@19.2.6))(react-server-dom-webpack@19.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(webpack@5.104.1(esbuild@0.27.7)))(react@19.2.6)(rollup@4.60.1)(typescript@5.9.3)(vite@8.0.14(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4))(waku@1.0.0-beta.0(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(react-dom@19.2.6(react@19.2.6))(react-server-dom-webpack@19.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(webpack@5.104.1(esbuild@0.27.7)))(react@19.2.6)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4)) wagmi: specifier: 3.6.14 version: 3.6.14(@tanstack/query-core@5.99.0)(@tanstack/react-query@5.99.0(react@19.2.6))(@types/react@19.2.14)(accounts@0.10.7)(react@19.2.6)(typescript@5.9.3)(viem@2.48.8(typescript@5.9.3)(zod@4.3.6)) @@ -8341,7 +8341,7 @@ snapshots: optionalDependencies: vite: 8.0.14(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4) - vocs@2.0.0-rc.0(patch_hash=f452b57a515ac852fa14bcf54c19799dde7bfcb011330ad5e0912329fc583fcf)(@cfworker/json-schema@4.1.1)(@types/react@19.2.14)(mermaid@11.14.0)(react-dom@19.2.6(react@19.2.6))(react-server-dom-webpack@19.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(webpack@5.104.1(esbuild@0.27.7)))(react@19.2.6)(rollup@4.60.1)(typescript@5.9.3)(vite@8.0.14(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4))(waku@1.0.0-beta.0(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(react-dom@19.2.6(react@19.2.6))(react-server-dom-webpack@19.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(webpack@5.104.1(esbuild@0.27.7)))(react@19.2.6)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4)): + vocs@2.0.0-rc.0(patch_hash=6954b63892a8203309b60825d78f5737f592b4f89d7ae2fda04787575285c41b)(@cfworker/json-schema@4.1.1)(@types/react@19.2.14)(mermaid@11.14.0)(react-dom@19.2.6(react@19.2.6))(react-server-dom-webpack@19.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(webpack@5.104.1(esbuild@0.27.7)))(react@19.2.6)(rollup@4.60.1)(typescript@5.9.3)(vite@8.0.14(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4))(waku@1.0.0-beta.0(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(react-dom@19.2.6(react@19.2.6))(react-server-dom-webpack@19.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(webpack@5.104.1(esbuild@0.27.7)))(react@19.2.6)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4)): dependencies: '@base-ui/react': 1.3.0(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@codesandbox/sandpack-react': 2.20.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) From 9420656fa2ea256723b1e620d7f488f7d3597a60 Mon Sep 17 00:00:00 2001 From: jxom <7336481+jxom@users.noreply.github.com> Date: Mon, 25 May 2026 16:51:34 +1000 Subject: [PATCH 4/5] perf: use vocs rc2 --- package.json | 2 +- patches/vocs@2.0.0-rc.0.patch | 450 ---------------------------------- pnpm-lock.yaml | 14 +- pnpm-workspace.yaml | 1 - 4 files changed, 7 insertions(+), 460 deletions(-) delete mode 100644 patches/vocs@2.0.0-rc.0.patch diff --git a/package.json b/package.json index 8f0f2c86..37048339 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "unplugin-auto-import": "^21.0.0", "unplugin-icons": "^23.0.1", "viem": "^2.48.8", - "vocs": "2.0.0-rc.0", + "vocs": "2.0.0-rc.2", "wagmi": "3.6.14", "waku": "1.0.0-beta.0", "webauthx": "~0.1.1", diff --git a/patches/vocs@2.0.0-rc.0.patch b/patches/vocs@2.0.0-rc.0.patch deleted file mode 100644 index 34d8e60e..00000000 --- a/patches/vocs@2.0.0-rc.0.patch +++ /dev/null @@ -1,450 +0,0 @@ -diff --git a/dist/react/Card.client.d.ts b/dist/react/Card.client.d.ts -new file mode 100644 -index 0000000000000000000000000000000000000000..2f17f253a95dda122e2be4535832f18a36081dbb ---- /dev/null -+++ b/dist/react/Card.client.d.ts -@@ -0,0 +1,12 @@ -+import type { ReactNode } from 'react'; -+export declare function CardLink(props: CardLink.Props): import("react/jsx-runtime").JSX.Element; -+export declare namespace CardLink { -+ type Props = { -+ descriptionHtml: string; -+ iconHtml: string | null; -+ title: string; -+ to: string; -+ topRight?: ReactNode | undefined; -+ }; -+} -+//# sourceMappingURL=Card.client.d.ts.map -\ No newline at end of file -diff --git a/dist/react/Card.client.d.ts.map b/dist/react/Card.client.d.ts.map -new file mode 100644 -index 0000000000000000000000000000000000000000..2a395416f457f53945489c752ee00a1aaf4a685e ---- /dev/null -+++ b/dist/react/Card.client.d.ts.map -@@ -0,0 +1 @@ -+{"version":3,"file":"Card.client.d.ts","sourceRoot":"","sources":["../../src/react/Card.client.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGtC,wBAAgB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,2CA2B7C;AAED,MAAM,CAAC,OAAO,WAAW,QAAQ,CAAC;IAChC,KAAY,KAAK,GAAG;QAClB,eAAe,EAAE,MAAM,CAAA;QACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;QACvB,KAAK,EAAE,MAAM,CAAA;QACb,EAAE,EAAE,MAAM,CAAA;QACV,QAAQ,CAAC,EAAE,SAAS,GAAG,SAAS,CAAA;KACjC,CAAA;CACF"} -\ No newline at end of file -diff --git a/dist/react/Card.client.js b/dist/react/Card.client.js -new file mode 100644 -index 0000000000000000000000000000000000000000..715ab09fab71ed44f87da81b1cac1ebae3bc4b3a ---- /dev/null -+++ b/dist/react/Card.client.js -@@ -0,0 +1,12 @@ -+'use client'; -+import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; -+import { Link } from './Link.js'; -+export function CardLink(props) { -+ const { descriptionHtml, iconHtml, title, to, topRight } = props; -+ return (_jsxs(Link, { to: to, className: "vocs:relative vocs:flex vocs:flex-col vocs:space-y-2 vocs:rounded-md vocs:bg-surfaceTint/70 vocs:border vocs:border-primary vocs:p-4 vocs:no-underline vocs:transition-colors vocs:hover:bg-surfaceTint", children: [topRight ? _jsx("div", { className: "vocs:absolute vocs:top-4 vocs:right-4", children: topRight }) : null, iconHtml ? (_jsx("div", { className: "vocs:size-8 vocs:flex vocs:items-center vocs:justify-center vocs:rounded-lg vocs:border vocs:border-primary vocs:bg-surface vocs:text-accent", -+ // biome-ignore lint/security/noDangerouslySetInnerHtml: user-provided icon strings are already supported by Card. -+ dangerouslySetInnerHTML: { __html: iconHtml } })) : null, _jsx("div", { className: "vocs:text-[15px] vocs:font-medium vocs:text-heading", children: title }), _jsx("div", { className: "vocs:text-sm vocs:leading-relaxed vocs:text-secondary", -+ // biome-ignore lint/security/noDangerouslySetInnerHtml: markdown descriptions are rendered before they reach the client. -+ dangerouslySetInnerHTML: { __html: descriptionHtml } })] })); -+} -+//# sourceMappingURL=Card.client.js.map -\ No newline at end of file -diff --git a/dist/react/Card.client.js.map b/dist/react/Card.client.js.map -new file mode 100644 -index 0000000000000000000000000000000000000000..f5399a94d3885672ade5a0887b6ec8d5770ddc42 ---- /dev/null -+++ b/dist/react/Card.client.js.map -@@ -0,0 +1 @@ -+{"version":3,"file":"Card.client.js","sourceRoot":"","sources":["../../src/react/Card.client.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAGZ,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,MAAM,UAAU,QAAQ,CAAC,KAAqB;IAC5C,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAA;IAEhE,OAAO,CACL,MAAC,IAAI,IACH,EAAE,EAAE,EAAE,EACN,SAAS,EAAC,yMAAyM,aAElN,QAAQ,CAAC,CAAC,CAAC,cAAK,SAAS,EAAC,uCAAuC,YAAE,QAAQ,GAAO,CAAC,CAAC,CAAC,IAAI,EAEzF,QAAQ,CAAC,CAAC,CAAC,CACV,cACE,SAAS,EAAC,8IAA8I;gBACxJ,kHAAkH;gBAClH,uBAAuB,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,GAC7C,CACH,CAAC,CAAC,CAAC,IAAI,EAER,cAAK,SAAS,EAAC,qDAAqD,YAAE,KAAK,GAAO,EAElF,cACE,SAAS,EAAC,uDAAuD;gBACjE,yHAAyH;gBACzH,uBAAuB,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,GACpD,IACG,CACR,CAAA;AACH,CAAC"} -\ No newline at end of file -diff --git a/dist/react/Cards.d.ts.map b/dist/react/Cards.d.ts.map -index 0ecfe8082dd19fa612dca2811751986082d113b8..94462896134079c9347bcd9438ff98489e6d00ab 100644 ---- a/dist/react/Cards.d.ts.map -+++ b/dist/react/Cards.d.ts.map -@@ -1 +1 @@ --{"version":3,"file":"Cards.d.ts","sourceRoot":"","sources":["../../src/react/Cards.tsx"],"names":[],"mappings":"AAIA,wBAAgB,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,2CAMvC;AAED,MAAM,CAAC,OAAO,WAAW,KAAK,CAAC;IAC7B,KAAY,KAAK,GAAG;QAClB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;KAC1B,CAAA;CACF;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,2CA8BrC;AAED,MAAM,CAAC,OAAO,WAAW,IAAI,CAAC;IAC5B,KAAY,KAAK,GAAG;QAClB,KAAK,EAAE,MAAM,CAAA;QACb,WAAW,EAAE,MAAM,CAAA;QACnB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACzB,EAAE,EAAE,MAAM,CAAA;QACV,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,SAAS,CAAA;KACvC,CAAA;CACF"} -\ No newline at end of file -+{"version":3,"file":"Cards.d.ts","sourceRoot":"","sources":["../../src/react/Cards.tsx"],"names":[],"mappings":"AAIA,wBAAgB,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,2CAMvC;AAED,MAAM,CAAC,OAAO,WAAW,KAAK,CAAC;IAC7B,KAAY,KAAK,GAAG;QAClB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;KAC1B,CAAA;CACF;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,2CAerC;AAED,MAAM,CAAC,OAAO,WAAW,IAAI,CAAC;IAC5B,KAAY,KAAK,GAAG;QAClB,KAAK,EAAE,MAAM,CAAA;QACb,WAAW,EAAE,MAAM,CAAA;QACnB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACzB,EAAE,EAAE,MAAM,CAAA;QACV,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,SAAS,CAAA;KACvC,CAAA;CACF"} -\ No newline at end of file -diff --git a/dist/react/Cards.js b/dist/react/Cards.js -index cb477213ac40537369740c0b8f19b9da070300df..fcb23ef9538b8c04f24413e25469b0dfc8bb7ed8 100644 ---- a/dist/react/Cards.js -+++ b/dist/react/Cards.js -@@ -1,7 +1,7 @@ --import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; -+import { jsx as _jsx } from "react/jsx-runtime"; - import * as Icons from '../internal/icons.js'; - import * as Markdown from '../internal/markdown.js'; --import { Link } from './Link.js'; -+import { CardLink } from './Card.client.js'; - export function Cards(props) { - return (_jsx("div", { className: "vocs:grid vocs:grid-cols-1 vocs:md:grid-cols-2 vocs:gap-4", children: props.children })); - } -@@ -9,10 +9,6 @@ export function Card(props) { - const { title, description, icon, to, topRight } = props; - const iconHtml = icon ? (Icons.resolveIconSync(icon) ?? null) : null; - const descriptionHtml = Markdown.toHtml(description); -- return (_jsxs(Link, { to: to, className: "vocs:relative vocs:flex vocs:flex-col vocs:space-y-2 vocs:rounded-md vocs:bg-surfaceTint/70 vocs:border vocs:border-primary vocs:p-4 vocs:no-underline vocs:transition-colors vocs:hover:bg-surfaceTint", children: [topRight ? _jsx("div", { className: "vocs:absolute vocs:top-4 vocs:right-4", children: topRight }) : null, iconHtml ? (_jsx("div", { className: "vocs:size-8 vocs:flex vocs:items-center vocs:justify-center vocs:rounded-lg vocs:border vocs:border-primary vocs:bg-surface vocs:text-accent", -- // biome-ignore lint/security/noDangerouslySetInnerHtml: _ -- dangerouslySetInnerHTML: { __html: iconHtml } })) : null, _jsx("div", { className: "vocs:text-[15px] vocs:font-medium vocs:text-heading", children: title }), _jsx("div", { className: "vocs:text-sm vocs:leading-relaxed vocs:text-secondary", -- // biome-ignore lint/security/noDangerouslySetInnerHtml: _ -- dangerouslySetInnerHTML: { __html: descriptionHtml } })] })); -+ return (_jsx(CardLink, { to: to, title: title, descriptionHtml: descriptionHtml, iconHtml: iconHtml, topRight: topRight })); - } - //# sourceMappingURL=Cards.js.map -\ No newline at end of file -diff --git a/dist/react/Cards.js.map b/dist/react/Cards.js.map -index 6d2b42bde2f3bc2f447aa8ed264174fd51a29009..89ac8f58ecd294fdad11e8f83647e951ed3e79ea 100644 ---- a/dist/react/Cards.js.map -+++ b/dist/react/Cards.js.map -@@ -1 +1 @@ --{"version":3,"file":"Cards.js","sourceRoot":"","sources":["../../src/react/Cards.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,sBAAsB,CAAA;AAC7C,OAAO,KAAK,QAAQ,MAAM,yBAAyB,CAAA;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,MAAM,UAAU,KAAK,CAAC,KAAkB;IACtC,OAAO,CACL,cAAK,SAAS,EAAC,2DAA2D,YACvE,KAAK,CAAC,QAAQ,GACX,CACP,CAAA;AACH,CAAC;AAQD,MAAM,UAAU,IAAI,CAAC,KAAiB;IACpC,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAA;IAExD,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACpE,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;IAEpD,OAAO,CACL,MAAC,IAAI,IACH,EAAE,EAAE,EAAE,EACN,SAAS,EAAC,yMAAyM,aAElN,QAAQ,CAAC,CAAC,CAAC,cAAK,SAAS,EAAC,uCAAuC,YAAE,QAAQ,GAAO,CAAC,CAAC,CAAC,IAAI,EAEzF,QAAQ,CAAC,CAAC,CAAC,CACV,cACE,SAAS,EAAC,8IAA8I;gBACxJ,0DAA0D;gBAC1D,uBAAuB,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,GAC7C,CACH,CAAC,CAAC,CAAC,IAAI,EAER,cAAK,SAAS,EAAC,qDAAqD,YAAE,KAAK,GAAO,EAElF,cACE,SAAS,EAAC,uDAAuD;gBACjE,0DAA0D;gBAC1D,uBAAuB,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,GACpD,IACG,CACR,CAAA;AACH,CAAC"} -\ No newline at end of file -+{"version":3,"file":"Cards.js","sourceRoot":"","sources":["../../src/react/Cards.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,sBAAsB,CAAA;AAC7C,OAAO,KAAK,QAAQ,MAAM,yBAAyB,CAAA;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAE3C,MAAM,UAAU,KAAK,CAAC,KAAkB;IACtC,OAAO,CACL,cAAK,SAAS,EAAC,2DAA2D,YACvE,KAAK,CAAC,QAAQ,GACX,CACP,CAAA;AACH,CAAC;AAQD,MAAM,UAAU,IAAI,CAAC,KAAiB;IACpC,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAA;IAExD,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACpE,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;IAEpD,OAAO,CACL,KAAC,QAAQ,IACP,EAAE,EAAE,EAAE,EACN,KAAK,EAAE,KAAK,EACZ,eAAe,EAAE,eAAe,EAChC,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,GAClB,CACH,CAAA;AACH,CAAC"} -\ No newline at end of file -diff --git a/dist/react/Link.d.ts.map b/dist/react/Link.d.ts.map -index c44d3e250b534f41d6947b224e8af8f5d76cc359..e0cbb47c909820d32048aa175f6fc3a7dedb0d3c 100644 ---- a/dist/react/Link.d.ts.map -+++ b/dist/react/Link.d.ts.map -@@ -1 +1 @@ --{"version":3,"file":"Link.d.ts","sourceRoot":"","sources":["../../src/react/Link.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAa,IAAI,IAAI,QAAQ,EAAE,MAAM,MAAM,CAAA;AAGlD,wBAAgB,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,2CAiBrC;AAED,yBAAiB,IAAI,CAAC;IACpB,KAAY,KAAK,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,QAAQ,CAAC,CAAA;CAC1D"} -\ No newline at end of file -+{"version":3,"file":"Link.d.ts","sourceRoot":"","sources":["../../src/react/Link.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAa,IAAI,IAAI,QAAQ,EAAE,MAAM,MAAM,CAAA;AAsDlD,wBAAgB,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,2CAuBrC;AAED,yBAAiB,IAAI,CAAC;IACpB,KAAY,KAAK,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,QAAQ,CAAC,CAAA;CAC1D"} -\ No newline at end of file -diff --git a/dist/react/Link.js b/dist/react/Link.js -index d70d5ca7debf0766d78276d62d7925e2a72b5b3c..5bcb27626d710633997dd4019ae05e87ab93e296 100644 ---- a/dist/react/Link.js -+++ b/dist/react/Link.js -@@ -1,14 +1,62 @@ - 'use client'; - import { jsx as _jsx } from "react/jsx-runtime"; -+import { useEffect, useState } from 'react'; - import { useRouter, Link as WakuLink } from 'waku'; - import * as Path from '../internal/path.js'; -+const viewportPrefetchDelayMs = 2_000; -+let viewportPrefetchReady = false; -+let viewportPrefetchScheduled = false; -+const viewportPrefetchListeners = new Set(); -+function markViewportPrefetchReady() { -+ viewportPrefetchReady = true; -+ for (const listener of viewportPrefetchListeners) -+ listener(); -+ viewportPrefetchListeners.clear(); -+} -+function scheduleViewportPrefetch() { -+ if (viewportPrefetchReady || viewportPrefetchScheduled || typeof window === 'undefined') -+ return; -+ viewportPrefetchScheduled = true; -+ const scheduleAfterLoad = () => { -+ window.setTimeout(() => { -+ if ('requestIdleCallback' in window) { -+ window.requestIdleCallback(markViewportPrefetchReady, { timeout: 2_000 }); -+ return; -+ } -+ markViewportPrefetchReady(); -+ }, viewportPrefetchDelayMs); -+ }; -+ if (document.readyState === 'complete') -+ scheduleAfterLoad(); -+ else -+ window.addEventListener('load', scheduleAfterLoad, { once: true }); -+} -+function useViewportPrefetchReady(enabled) { -+ const [ready, setReady] = useState(viewportPrefetchReady); -+ useEffect(() => { -+ if (!enabled) -+ return; -+ if (viewportPrefetchReady) { -+ setReady(true); -+ return; -+ } -+ const listener = () => setReady(true); -+ viewportPrefetchListeners.add(listener); -+ scheduleViewportPrefetch(); -+ return () => { -+ viewportPrefetchListeners.delete(listener); -+ }; -+ }, [enabled]); -+ return enabled && ready; -+} - export function Link(props) { -- const { to, ...rest } = props; -+ const { to, unstable_prefetchOnEnter = !import.meta.env.DEV, unstable_prefetchOnView = !import.meta.env.DEV, ...rest } = props; - const { path } = useRouter(); -+ const prefetchOnView = useViewportPrefetchReady(Boolean(unstable_prefetchOnView)); - if (Path.isExternal(props.to)) - return _jsx("a", { ...rest, href: props.to, rel: "noopener noreferrer", target: "_blank" }); - const [before, after] = (props.to || '').split('#'); - const resolvedTo = `${before ? before : path}${after ? `#${after}` : ''}`; -- return (_jsx(WakuLink, { ...rest, to: resolvedTo, unstable_prefetchOnEnter: !import.meta.env.DEV, unstable_prefetchOnView: !import.meta.env.DEV })); -+ return (_jsx(WakuLink, { ...rest, to: resolvedTo, unstable_prefetchOnEnter: unstable_prefetchOnEnter, unstable_prefetchOnView: prefetchOnView })); - } - //# sourceMappingURL=Link.js.map -\ No newline at end of file -diff --git a/dist/react/Link.js.map b/dist/react/Link.js.map -index fce9b74d8f74281580086e5ea318199aa91988ba..15e92f2d55882a7abd625ca13c360025209401a8 100644 ---- a/dist/react/Link.js.map -+++ b/dist/react/Link.js.map -@@ -1 +1 @@ --{"version":3,"file":"Link.js","sourceRoot":"","sources":["../../src/react/Link.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,MAAM,CAAA;AAClD,OAAO,KAAK,IAAI,MAAM,qBAAqB,CAAA;AAE3C,MAAM,UAAU,IAAI,CAAC,KAAiB;IACpC,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAA;IAC7B,MAAM,EAAE,IAAI,EAAE,GAAG,SAAS,EAAE,CAAA;IAE5B,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,eAAO,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,EAAC,qBAAqB,EAAC,MAAM,EAAC,QAAQ,GAAG,CAAA;IAElF,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACnD,MAAM,UAAU,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;IACzE,OAAO,CACL,KAAC,QAAQ,OACH,IAAI,EACR,EAAE,EAAE,UAAU,EACd,wBAAwB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAC9C,uBAAuB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAC7C,CACH,CAAA;AACH,CAAC"} -\ No newline at end of file -+{"version":3,"file":"Link.js","sourceRoot":"","sources":["../../src/react/Link.tsx"],"names":[],"mappings":"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"} -\ No newline at end of file -diff --git a/dist/react/internal/CodeBlock.client.d.ts.map b/dist/react/internal/CodeBlock.client.d.ts.map -index 8d52b506a29db34b244d1a1feac2dd788bfd23c1..e6dc02c09b771544b9b45a05b526a702a63adf3f 100644 ---- a/dist/react/internal/CodeBlock.client.d.ts.map -+++ b/dist/react/internal/CodeBlock.client.d.ts.map -@@ -1 +1 @@ --{"version":3,"file":"CodeBlock.client.d.ts","sourceRoot":"","sources":["../../../src/react/internal/CodeBlock.client.tsx"],"names":[],"mappings":"AAQA,wBAAgB,UAAU,4CAmCzB;AAED,wBAAgB,UAAU,mDAsDzB;AAWD,wBAAgB,oBAAoB,4CA4EnC"} -\ No newline at end of file -+{"version":3,"file":"CodeBlock.client.d.ts","sourceRoot":"","sources":["../../../src/react/internal/CodeBlock.client.tsx"],"names":[],"mappings":"AAOA,wBAAgB,UAAU,4CAmCzB;AAED,wBAAgB,UAAU,mDAsDzB;AAaD,wBAAgB,oBAAoB,4CA4EnC"} -\ No newline at end of file -diff --git a/dist/react/internal/CodeBlock.client.js b/dist/react/internal/CodeBlock.client.js -index 9f12507c40cab021547278aa82ab855f7bad881b..d6c8f211c250181fd90f952a3069689a7d91d9ac 100644 ---- a/dist/react/internal/CodeBlock.client.js -+++ b/dist/react/internal/CodeBlock.client.js -@@ -4,7 +4,6 @@ import * as React from 'react'; - import LucideCheck from '~icons/lucide/check'; - import LucideClipboard from '~icons/lucide/clipboard'; - import LucideWrapText from '~icons/lucide/wrap-text'; --import { getIconHtml } from './utils.js'; - export function WrapButton() { - const buttonRef = React.useRef(null); - const [wrapped, setWrapped] = React.useState(false); -@@ -66,8 +65,8 @@ export function CopyButton() { - return null; - return (_jsx("button", { ref: buttonRef, "aria-label": copied ? 'Copied' : 'Copy code', className: "vocs:absolute vocs:top-2.5 vocs:data-[single-line=true]:top-1/2 vocs:data-[single-line=true]:-translate-y-1/2 vocs:right-2.5 vocs:p-1.5 vocs:rounded-md vocs:opacity-0 vocs:transition-opacity vocs:duration-150 vocs:text-secondary vocs:hover:text-heading vocs:cursor-pointer vocs:group-hover/code:opacity-100 vocs:data-[copied=true]:opacity-100 vocs:data-[copied=true]:text-success", "data-copied": copied, "data-single-line": singleLine, onClick: copy, type: "button", children: copied ? (_jsx(LucideCheck, { className: "vocs:size-4" })) : (_jsx(LucideClipboard, { className: "vocs:size-4" })) })); - } --const clipboardIconHtml = getIconHtml('clipboard', 'vocs:size-3.5'); --const checkIconHtml = getIconHtml('check', 'vocs:size-3.5'); -+const clipboardIconHtml = ''; -+const checkIconHtml = ''; - function createIconElement(html) { - const template = document.createElement('template'); - template.innerHTML = html.trim(); -diff --git a/dist/react/internal/CodeBlock.client.js.map b/dist/react/internal/CodeBlock.client.js.map -index af9b062a05aa08356b1875beade55cdaac534e06..ff1f082b358d7cce288815b14e37e6d4cd617c01 100644 ---- a/dist/react/internal/CodeBlock.client.js.map -+++ b/dist/react/internal/CodeBlock.client.js.map -@@ -1 +1 @@ --{"version":3,"file":"CodeBlock.client.js","sourceRoot":"","sources":["../../../src/react/internal/CodeBlock.client.tsx"],"names":[],"mappings":"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"} -\ No newline at end of file -+{"version":3,"file":"CodeBlock.client.js","sourceRoot":"","sources":["../../../src/react/internal/CodeBlock.client.tsx"],"names":[],"mappings":"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"} -\ No newline at end of file -diff --git a/dist/react/internal/utils.d.ts b/dist/react/internal/utils.d.ts -deleted file mode 100644 -index e3cfff823b0f82f93a81e068269d6e00ed9fcbe6..0000000000000000000000000000000000000000 -diff --git a/dist/react/internal/utils.d.ts.map b/dist/react/internal/utils.d.ts.map -deleted file mode 100644 -index fd9bfbdc4bc0b4ef4b1fc58082f8c96659a2ea8c..0000000000000000000000000000000000000000 -diff --git a/dist/react/internal/utils.js b/dist/react/internal/utils.js -deleted file mode 100644 -index e0cf6d1ac9e15aa865da38bac456ee91765f2587..0000000000000000000000000000000000000000 -diff --git a/dist/react/internal/utils.js.map b/dist/react/internal/utils.js.map -deleted file mode 100644 -index 945f9377aadcd43f52949998bfdc24ed00ecb9d1..0000000000000000000000000000000000000000 -diff --git a/src/react/Card.client.tsx b/src/react/Card.client.tsx -new file mode 100644 -index 0000000000000000000000000000000000000000..a03cb6d78f6f6604e194653579bc46c3bf67ad4f ---- /dev/null -+++ b/src/react/Card.client.tsx -@@ -0,0 +1,43 @@ -+'use client' -+ -+import type { ReactNode } from 'react' -+import { Link } from './Link.js' -+ -+export function CardLink(props: CardLink.Props) { -+ const { descriptionHtml, iconHtml, title, to, topRight } = props -+ -+ return ( -+ -+ {topRight ?
{topRight}
: null} -+ -+ {iconHtml ? ( -+
-+ ) : null} -+ -+
{title}
-+ -+
-+ -+ ) -+} -+ -+export declare namespace CardLink { -+ export type Props = { -+ descriptionHtml: string -+ iconHtml: string | null -+ title: string -+ to: string -+ topRight?: ReactNode | undefined -+ } -+} -diff --git a/src/react/Cards.tsx b/src/react/Cards.tsx -index b54a1d032e8bcfa60295217f9b1a1395c8920620..1b5c2a28414a9b79e145ff603e21e28e942e637c 100644 ---- a/src/react/Cards.tsx -+++ b/src/react/Cards.tsx -@@ -1,6 +1,6 @@ - import * as Icons from '../internal/icons.js' - import * as Markdown from '../internal/markdown.js' --import { Link } from './Link.js' -+import { CardLink } from './Card.client.js' - - export function Cards(props: Cards.Props) { - return ( -@@ -23,28 +23,13 @@ export function Card(props: Card.Props) { - const descriptionHtml = Markdown.toHtml(description) - - return ( -- -- {topRight ?
{topRight}
: null} -- -- {iconHtml ? ( --
-- ) : null} -- --
{title}
-- --
-- -+ title={title} -+ descriptionHtml={descriptionHtml} -+ iconHtml={iconHtml} -+ topRight={topRight} -+ /> - ) - } - -diff --git a/src/react/Link.tsx b/src/react/Link.tsx -index 693388efe03232cd3b0c0fe888c4e7e300a8e81d..c9680b2290a952e04241e3408bef563f1eb70b95 100644 ---- a/src/react/Link.tsx -+++ b/src/react/Link.tsx -@@ -1,11 +1,69 @@ - 'use client' - -+import { useEffect, useState } from 'react' - import { useRouter, Link as WakuLink } from 'waku' - import * as Path from '../internal/path.js' - -+const viewportPrefetchDelayMs = 2_000 -+ -+let viewportPrefetchReady = false -+let viewportPrefetchScheduled = false -+const viewportPrefetchListeners = new Set<() => void>() -+ -+function markViewportPrefetchReady() { -+ viewportPrefetchReady = true -+ for (const listener of viewportPrefetchListeners) listener() -+ viewportPrefetchListeners.clear() -+} -+ -+function scheduleViewportPrefetch() { -+ if (viewportPrefetchReady || viewportPrefetchScheduled || typeof window === 'undefined') return -+ viewportPrefetchScheduled = true -+ -+ const scheduleAfterLoad = () => { -+ window.setTimeout(() => { -+ if ('requestIdleCallback' in window) { -+ window.requestIdleCallback(markViewportPrefetchReady, { timeout: 2_000 }) -+ return -+ } -+ markViewportPrefetchReady() -+ }, viewportPrefetchDelayMs) -+ } -+ -+ if (document.readyState === 'complete') scheduleAfterLoad() -+ else window.addEventListener('load', scheduleAfterLoad, { once: true }) -+} -+ -+function useViewportPrefetchReady(enabled: boolean) { -+ const [ready, setReady] = useState(viewportPrefetchReady) -+ -+ useEffect(() => { -+ if (!enabled) return -+ if (viewportPrefetchReady) { -+ setReady(true) -+ return -+ } -+ -+ const listener = () => setReady(true) -+ viewportPrefetchListeners.add(listener) -+ scheduleViewportPrefetch() -+ return () => { -+ viewportPrefetchListeners.delete(listener) -+ } -+ }, [enabled]) -+ -+ return enabled && ready -+} -+ - export function Link(props: Link.Props) { -- const { to, ...rest } = props -+ const { -+ to, -+ unstable_prefetchOnEnter = !import.meta.env.DEV, -+ unstable_prefetchOnView = !import.meta.env.DEV, -+ ...rest -+ } = props - const { path } = useRouter() -+ const prefetchOnView = useViewportPrefetchReady(Boolean(unstable_prefetchOnView)) - - if (Path.isExternal(props.to)) - return -@@ -16,8 +74,8 @@ export function Link(props: Link.Props) { - - ) - } -diff --git a/src/react/internal/CodeBlock.client.tsx b/src/react/internal/CodeBlock.client.tsx -index 55ae13e0fd2b6be557d32849b1b20b957123c0f6..c92f6c6c35e2ce3729111fff57f00152eb021794 100644 ---- a/src/react/internal/CodeBlock.client.tsx -+++ b/src/react/internal/CodeBlock.client.tsx -@@ -4,7 +4,6 @@ import * as React from 'react' - import LucideCheck from '~icons/lucide/check' - import LucideClipboard from '~icons/lucide/clipboard' - import LucideWrapText from '~icons/lucide/wrap-text' --import { getIconHtml } from './utils.js' - - export function WrapButton() { - const buttonRef = React.useRef(null) -@@ -99,8 +98,10 @@ export function CopyButton() { - ) - } - --const clipboardIconHtml = getIconHtml('clipboard', 'vocs:size-3.5') --const checkIconHtml = getIconHtml('check', 'vocs:size-3.5') -+const clipboardIconHtml = -+ '' -+const checkIconHtml = -+ '' - - function createIconElement(html: string): HTMLElement { - const template = document.createElement('template') -diff --git a/src/react/internal/utils.ts b/src/react/internal/utils.ts -deleted file mode 100644 -index 4e616a93382029a7c71da95db2cfc7d1f3c74a0b..0000000000000000000000000000000000000000 diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 64c4cb5e..09472b8a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,9 +16,6 @@ patchedDependencies: dayjs@1.11.20: hash: 47bfcf62e3c84ba85d881815422a02e23f372df46bddb9b022eb3705361fd165 path: patches/dayjs@1.11.20.patch - vocs@2.0.0-rc.0: - hash: 6954b63892a8203309b60825d78f5737f592b4f89d7ae2fda04787575285c41b - path: patches/vocs@2.0.0-rc.0.patch importers: @@ -109,8 +106,8 @@ importers: specifier: ^2.48.8 version: 2.48.8(typescript@5.9.3)(zod@4.3.6) vocs: - specifier: 2.0.0-rc.0 - version: 2.0.0-rc.0(patch_hash=6954b63892a8203309b60825d78f5737f592b4f89d7ae2fda04787575285c41b)(@cfworker/json-schema@4.1.1)(@types/react@19.2.14)(mermaid@11.14.0)(react-dom@19.2.6(react@19.2.6))(react-server-dom-webpack@19.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(webpack@5.104.1(esbuild@0.27.7)))(react@19.2.6)(rollup@4.60.1)(typescript@5.9.3)(vite@8.0.14(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4))(waku@1.0.0-beta.0(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(react-dom@19.2.6(react@19.2.6))(react-server-dom-webpack@19.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(webpack@5.104.1(esbuild@0.27.7)))(react@19.2.6)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4)) + specifier: 2.0.0-rc.2 + version: 2.0.0-rc.2(@cfworker/json-schema@4.1.1)(@types/react@19.2.14)(mermaid@11.14.0)(react-dom@19.2.6(react@19.2.6))(react-server-dom-webpack@19.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(webpack@5.104.1(esbuild@0.27.7)))(react@19.2.6)(rollup@4.60.1)(typescript@5.9.3)(vite@8.0.14(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4))(waku@1.0.0-beta.0(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(react-dom@19.2.6(react@19.2.6))(react-server-dom-webpack@19.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(webpack@5.104.1(esbuild@0.27.7)))(react@19.2.6)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4)) wagmi: specifier: 3.6.14 version: 3.6.14(@tanstack/query-core@5.99.0)(@tanstack/react-query@5.99.0(react@19.2.6))(@types/react@19.2.14)(accounts@0.10.7)(react@19.2.6)(typescript@5.9.3)(viem@2.48.8(typescript@5.9.3)(zod@4.3.6)) @@ -4013,8 +4010,8 @@ packages: vite: optional: true - vocs@2.0.0-rc.0: - resolution: {integrity: sha512-GJdTZADwN6IKsWHITsffMJP15d50kVbHk/g1SDiW4Jh9OVszjiEhT5quQ5krR0wVZCErq49ORr4x5QSJGQNnEQ==} + vocs@2.0.0-rc.2: + resolution: {integrity: sha512-oP1pfLJnlnXPzApgu5JxI7M53A5z0RlkkTy1aHJg/bYFdnsM00ZLjcFCkL/UV/CYmqiahn9T4yP1gLoztnW9FA==} hasBin: true peerDependencies: '@vocs/twoslash-rust': ^0.1.0-rc.0 @@ -8341,10 +8338,11 @@ snapshots: optionalDependencies: vite: 8.0.14(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4) - vocs@2.0.0-rc.0(patch_hash=6954b63892a8203309b60825d78f5737f592b4f89d7ae2fda04787575285c41b)(@cfworker/json-schema@4.1.1)(@types/react@19.2.14)(mermaid@11.14.0)(react-dom@19.2.6(react@19.2.6))(react-server-dom-webpack@19.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(webpack@5.104.1(esbuild@0.27.7)))(react@19.2.6)(rollup@4.60.1)(typescript@5.9.3)(vite@8.0.14(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4))(waku@1.0.0-beta.0(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(react-dom@19.2.6(react@19.2.6))(react-server-dom-webpack@19.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(webpack@5.104.1(esbuild@0.27.7)))(react@19.2.6)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4)): + vocs@2.0.0-rc.2(@cfworker/json-schema@4.1.1)(@types/react@19.2.14)(mermaid@11.14.0)(react-dom@19.2.6(react@19.2.6))(react-server-dom-webpack@19.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(webpack@5.104.1(esbuild@0.27.7)))(react@19.2.6)(rollup@4.60.1)(typescript@5.9.3)(vite@8.0.14(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4))(waku@1.0.0-beta.0(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(react-dom@19.2.6(react@19.2.6))(react-server-dom-webpack@19.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(webpack@5.104.1(esbuild@0.27.7)))(react@19.2.6)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4)): dependencies: '@base-ui/react': 1.3.0(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@codesandbox/sandpack-react': 2.20.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@hono/node-server': 2.0.3(hono@4.12.18) '@iconify-json/lucide': 1.2.102 '@iconify-json/simple-icons': 1.2.77 '@iconify-json/vscode-icons': 1.2.45 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 122c3a50..3aba6143 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -33,4 +33,3 @@ overrides: patchedDependencies: '@braintree/sanitize-url@7.1.2': patches/@braintree__sanitize-url@7.1.2.patch dayjs@1.11.20: patches/dayjs@1.11.20.patch - vocs@2.0.0-rc.0: patches/vocs@2.0.0-rc.0.patch From 8d461d794c4828113c07ecca354cfa277fc87a7a Mon Sep 17 00:00:00 2001 From: jxom <7336481+jxom@users.noreply.github.com> Date: Mon, 25 May 2026 16:52:53 +1000 Subject: [PATCH 5/5] Update index.mdx --- src/pages/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/index.mdx b/src/pages/index.mdx index 22f03a41..9d4b56cf 100644 --- a/src/pages/index.mdx +++ b/src/pages/index.mdx @@ -35,7 +35,7 @@ These docs cover everything from creating a wallet to building payment systems o />