diff --git a/apps/website/.prettierignore b/apps/website/.prettierignore index 82325298c..abc9d0f97 100644 --- a/apps/website/.prettierignore +++ b/apps/website/.prettierignore @@ -6,3 +6,4 @@ public/searchIndex src/assets/readme src/styles/unocss.css next-env.d.ts +src/util/shiki.bundle.ts diff --git a/apps/website/next-env.d.ts b/apps/website/next-env.d.ts index 4f11a03dc..1b3be0840 100644 --- a/apps/website/next-env.d.ts +++ b/apps/website/next-env.d.ts @@ -2,4 +2,4 @@ /// // NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. +// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/apps/website/next.config.mjs b/apps/website/next.config.ts similarity index 75% rename from apps/website/next.config.mjs rename to apps/website/next.config.ts index 1cc7ec157..c98b2d61c 100644 --- a/apps/website/next.config.mjs +++ b/apps/website/next.config.ts @@ -1,13 +1,19 @@ -/** - * @type {import('next').NextConfig} - */ +import type { NextConfig } from 'next'; + export default { reactStrictMode: true, images: { dangerouslyAllowSVG: true, contentDispositionType: 'attachment', contentSecurityPolicy: "default-src 'self'; frame-src 'none'; sandbox;", + remotePatterns: [ + { + protocol: 'http', + hostname: 'localhost', + }, + ], }, + poweredByHeader: false, logging: { fetches: { fullUrl: true, @@ -16,6 +22,8 @@ export default { experimental: { ppr: true, reactCompiler: true, + useCache: true, + dynamicOnHover: true, }, eslint: { ignoreDuringBuilds: true, @@ -37,4 +45,4 @@ export default { }, ]; }, -}; +} satisfies NextConfig; diff --git a/apps/website/package.json b/apps/website/package.json index 93f1c7cba..29ce38699 100644 --- a/apps/website/package.json +++ b/apps/website/package.json @@ -13,7 +13,7 @@ "build:search_indices": "pnpm node scripts/generateAllIndices.js", "build:analyze": "turbo run docs --filter='@discordjs/*' --concurrency=4 && cross-env ANALYZE=true NEXT_PUBLIC_LOCAL_DEV=true pnpm run build:prod", "preview": "next start", - "dev": "next dev", + "dev": "next dev --turbopack", "lint": "pnpm run build:check && prettier --check . && cross-env TIMING=1 eslint --format=pretty src ", "format": "pnpm run build:check && prettier --write . && cross-env TIMING=1 eslint --fix --format=pretty src ", "fmt": "pnpm run format" @@ -46,57 +46,78 @@ "homepage": "https://discord.js.org", "funding": "https://github.com/discordjs/discord.js?sponsor", "dependencies": { - "@radix-ui/react-collapsible": "^1.1.2", + "@radix-ui/react-collapsible": "^1.1.3", "@react-icons/all-files": "^4.1.0", - "@vercel/analytics": "^1.4.1", + "@vercel/analytics": "^1.5.0", "@vercel/edge-config": "^1.4.0", - "@vercel/og": "^0.6.4", - "@vercel/postgres": "^0.9.0", - "cmdk": "^1.0.4", + "@vercel/og": "^0.6.8", + "@vercel/postgres": "^0.10.0", + "cmdk": "^1.1.1", + "cva": "1.0.0-beta.3", "geist": "^1.3.1", - "jotai": "^2.11.0", - "lucide-react": "^0.379.0", - "meilisearch": "^0.40.0", - "next": "15.0.0-rc.0", - "next-mdx-remote-client": "^1.0.3", - "next-themes": "^0.3.0", - "overlayscrollbars": "^2.10.1", + "immer": "^10.1.1", + "jotai": "^2.12.2", + "jotai-immer": "^0.4.1", + "lucide-react": "^0.487.0", + "meilisearch": "^0.49.0", + "motion": "^12.6.3", + "next": "15.3.1-canary.2", + "next-mdx-remote-client": "^2.1.1", + "next-themes": "^0.4.6", + "nuqs": "^2.4.1", + "overlayscrollbars": "^2.11.1", "overlayscrollbars-react": "^0.5.6", - "react": "19.1.0", - "react-aria-components": "^1.5.0", - "react-dom": "19.1.0", + "react": "^19.1.0", + "react-aria": "^3.38.1", + "react-aria-components": "^1.7.1", + "react-dom": "^19.1.0", + "react-error-boundary": "^5.0.0", "sharp": "^0.33.5", - "usehooks-ts": "^3.1.0", + "tailwind-merge": "^3.1.0", + "tw-animate-css": "^1.2.5", + "usehooks-ts": "^3.1.1", "vaul": "^1.1.2" }, "devDependencies": { - "@shikijs/rehype": "^1.24.4", - "@tailwindcss/typography": "^0.5.15", + "@next/env": "^15.2.4", + "@playwright/test": "^1.51.1", + "@shikijs/rehype": "^3.2.1", + "@tailwindcss/postcss": "^4.1.3", + "@tailwindcss/typography": "^0.5.16", + "@tailwindcss/vite": "^4.1.3", "@testing-library/react": "^16.3.0", "@testing-library/user-event": "^14.6.1", "@types/node": "^22.14.0", "@types/react": "^19.1.0", "@types/react-dom": "^19.1.1", "@vitejs/plugin-react": "^4.3.4", + "@vitest/browser": "^3.1.1", + "@vitest/coverage-v8": "^2.1.8", "autoprefixer": "^10.4.21", - "babel-plugin-react-compiler": "0.0.0-experimental-592953e-20240517", + "babel-plugin-react-compiler": "19.0.0-beta-e993439-20250328", "cpy-cli": "^5.0.0", "cross-env": "^7.0.3", "eslint": "^9.24.0", "eslint-config-neon": "^0.2.7", - "eslint-formatter-compact": "^8.40.0", "eslint-formatter-pretty": "^6.0.1", + "git-describe": "^4.1.1", "happy-dom": "^17.4.4", + "msw": "^2.7.3", + "playwright": "^1.51.1", "postcss": "^8.5.3", "prettier": "^3.5.3", - "prettier-plugin-tailwindcss": "^0.5.14", - "remark-gfm": "^4.0.0", - "remark-rehype": "^11.1.1", - "shiki": "^1.24.4", - "tailwindcss": "^3.4.17", + "prettier-plugin-tailwindcss": "^0.6.11", + "remark-gfm": "^4.0.1", + "remark-rehype": "^11.1.2", + "shiki": "^3.2.1", + "tailwindcss": "^4.1.3", + "tailwindcss-react-aria-components": "^2.0.0", "turbo": "^2.5.0", - "typescript": "~5.8.3", - "vercel": "^41.4.1" + "typescript": "^5.8.2", + "vercel": "^41.4.1", + "vite-tsconfig-paths": "^5.1.4", + "vitest": "^2.1.8", + "vitest-browser-react": "^0.1.1" }, "engines": { "node": ">=22.12.0" diff --git a/apps/website/postcss.config.cjs b/apps/website/postcss.config.cjs deleted file mode 100644 index e873f1a4f..000000000 --- a/apps/website/postcss.config.cjs +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -}; diff --git a/apps/website/postcss.config.js b/apps/website/postcss.config.js new file mode 100644 index 000000000..1970487b5 --- /dev/null +++ b/apps/website/postcss.config.js @@ -0,0 +1,5 @@ +export default { + plugins: { + '@tailwindcss/postcss': {}, + }, +}; diff --git a/apps/website/src/app/docs/packages/[packageName]/[version]/CmdK.tsx b/apps/website/src/app/docs/packages/[packageName]/[version]/CmdK.tsx new file mode 100644 index 000000000..c4cc4cebd --- /dev/null +++ b/apps/website/src/app/docs/packages/[packageName]/[version]/CmdK.tsx @@ -0,0 +1,14 @@ +import { CmdKNoSRR } from '@/components/CmdK'; +import { fetchDependencies } from '@/util/fetchDependencies'; + +export async function CmdK({ + params, +}: { + readonly params: Promise<{ readonly packageName: string; readonly version: string }>; +}) { + const { packageName, version } = await params; + + const dependencies = await fetchDependencies({ packageName, version }); + + return ; +} diff --git a/apps/website/src/app/docs/packages/[packageName]/[version]/[item]/opengraph-image.tsx b/apps/website/src/app/docs/packages/[packageName]/[version]/[item]/opengraph-image.tsx index c72b261d4..ebc257e77 100644 --- a/apps/website/src/app/docs/packages/[packageName]/[version]/[item]/opengraph-image.tsx +++ b/apps/website/src/app/docs/packages/[packageName]/[version]/[item]/opengraph-image.tsx @@ -1,7 +1,7 @@ /* eslint-disable react/no-unknown-property */ import { ImageResponse } from 'next/og'; -import { resolveKind } from '~/util/resolveNodeKind'; +import { resolveKind } from '@/util/resolveNodeKind'; export const runtime = 'edge'; @@ -15,14 +15,24 @@ export const contentType = 'image/png'; export default async function Image({ params, }: { - readonly params: { readonly item: string; readonly packageName: string; readonly version: string }; + readonly params: Promise<{ readonly item: string; readonly packageName: string; readonly version: string }>; }) { - const normalizeItem = params.item.split(encodeURIComponent(':')).join('.').toLowerCase(); + const { item, packageName, version } = await params; - const isMainVersion = params.version === 'main'; + const [fontDataBold, fontDataBlack] = await Promise.all([ + fetch(new URL('../../../../../../assets/Geist-Bold.ttf', import.meta.url), { + next: { revalidate: 604_800 }, + }).then(async (res) => res.arrayBuffer()), + fetch(new URL('../../../../../../assets/Geist-Black.ttf', import.meta.url), { + next: { revalidate: 604_800 }, + }).then(async (res) => res.arrayBuffer()), + ]); + const normalizeItem = item.split(encodeURIComponent(':')).join('.').toLowerCase(); + + const isMain = version === 'main'; const fileContent = await fetch( - `${process.env.BLOB_STORAGE_URL}/rewrite/${params.packageName}/${params.version}.${normalizeItem}.api.json`, - { next: isMainVersion ? { revalidate: 0 } : { revalidate: 604_800 } }, + `${process.env.BLOB_STORAGE_URL}/rewrite/${packageName}/${version}.${normalizeItem}.api.json`, + { next: { revalidate: isMain ? 0 : 604_800 } }, ); const node = await fileContent.json(); @@ -30,7 +40,7 @@ export default async function Image({ (
-
{params.packageName}
+
{packageName}
{resolveKind(node.kind, 94)} @@ -40,7 +50,7 @@ export default async function Image({ whiteSpace: 'nowrap', overflow: 'hidden', }} - tw="text-[5.5rem] font-bold w-full" + tw="text-[5.5rem] font-bold w-full" > {node.displayName} @@ -94,6 +104,20 @@ export default async function Image({ ), { ...size, + fonts: [ + { + name: 'Geist', + data: fontDataBold, + weight: 700, + style: 'normal', + }, + { + name: 'Geist', + data: fontDataBlack, + weight: 900, + style: 'normal', + }, + ], }, ); } diff --git a/apps/website/src/app/docs/packages/[packageName]/[version]/[item]/page.tsx b/apps/website/src/app/docs/packages/[packageName]/[version]/[item]/page.tsx index dc188019e..41e5b17d2 100644 --- a/apps/website/src/app/docs/packages/[packageName]/[version]/[item]/page.tsx +++ b/apps/website/src/app/docs/packages/[packageName]/[version]/[item]/page.tsx @@ -1,38 +1,44 @@ +'use cache'; + import type { Metadata } from 'next'; import { notFound } from 'next/navigation'; -import { DocItem } from '~/components/DocItem'; -import { fetchNode } from '~/util/fetchNode'; +import { DocItem } from '@/components/DocItem'; +import { fetchNode } from '@/util/fetchNode'; export async function generateMetadata({ params, }: { - readonly params: { + readonly params: Promise<{ readonly item: string; readonly packageName: string; readonly version: string; - }; + }>; }): Promise { - const normalizeItem = params.item.split(encodeURIComponent(':'))[0]; + const { item, packageName, version } = await params; + + const normalizeItem = item.split(encodeURIComponent(':'))[0]; return { - title: `${normalizeItem} (${params.packageName} - ${params.version})`, + title: `${normalizeItem} (${packageName} - ${version})`, }; } export default async function Page({ params, }: { - readonly params: { readonly item: string; readonly packageName: string; readonly version: string }; + readonly params: Promise<{ readonly item: string; readonly packageName: string; readonly version: string }>; }) { - const node = await fetchNode({ item: params.item, packageName: params.packageName, version: params.version }); + const { item, packageName, version } = await params; + + const node = await fetchNode({ item, packageName, version }); if (!node) { notFound(); } return ( -
- +
+
); } diff --git a/apps/website/src/app/docs/packages/[packageName]/[version]/layout.tsx b/apps/website/src/app/docs/packages/[packageName]/[version]/layout.tsx index efacd0105..2312d60d4 100644 --- a/apps/website/src/app/docs/packages/[packageName]/[version]/layout.tsx +++ b/apps/website/src/app/docs/packages/[packageName]/[version]/layout.tsx @@ -1,24 +1,33 @@ -import type { Metadata } from 'next'; -import dynamic from 'next/dynamic'; -import type { PropsWithChildren } from 'react'; -import { Navigation } from '~/components/Navigation'; -import { OverlayScrollbarsComponent } from '~/components/OverlayScrollbars'; -import { Drawer } from '~/components/ui/Drawer'; -import { Footer } from '~/components/ui/Footer'; -import { fetchDependencies } from '~/util/fetchDependencies'; +'use cache'; -// eslint-disable-next-line promise/prefer-await-to-then -const CmdK = dynamic(async () => import('~/components/ui/CmdK').then((mod) => mod.CmdK), { ssr: false }); +import { VscGithubInverted } from '@react-icons/all-files/vsc/VscGithubInverted'; +import type { Metadata } from 'next'; +import Link from 'next/link'; +import { Suspense, type PropsWithChildren } from 'react'; +import { Footer } from '@/components/Footer'; +import { Navigation } from '@/components/Navigation'; +import { Scrollbars } from '@/components/OverlayScrollbars'; +import { PackageSelect } from '@/components/PackageSelect'; +import { SearchButton } from '@/components/SearchButton'; +import { ThemeSwitchNoSRR } from '@/components/ThemeSwitch'; +import { VersionSelect } from '@/components/VersionSelect'; +import { Sidebar, SidebarContent, SidebarHeader, SidebarInset, SidebarTrigger } from '@/components/ui/Sidebar'; +import { buttonStyles } from '@/styles/ui/button'; +import { ENV } from '@/util/env'; +import { fetchVersions } from '@/util/fetchVersions'; +import { CmdK } from './CmdK'; export async function generateMetadata({ params, }: { - readonly params: { readonly packageName: string; readonly version: string }; + readonly params: Promise<{ readonly packageName: string; readonly version: string }>; }): Promise { + const { packageName, version } = await params; + return { title: { template: '%s | discord.js', - default: `${params.packageName} (${params.version})`, + default: `${packageName} (${version})`, }, }; } @@ -26,44 +35,74 @@ export async function generateMetadata({ export default async function Layout({ params, children, -}: PropsWithChildren<{ readonly params: { readonly packageName: string; readonly version: string } }>) { - const dependencies = await fetchDependencies({ packageName: params.packageName, version: params.version }); +}: PropsWithChildren<{ readonly params: Promise<{ readonly packageName: string; readonly version: string }> }>) { + const { packageName, version } = await params; + + const versions = fetchVersions(packageName); return ( - // eslint-disable-next-line react/no-unknown-property -
-
- - - -
-
- {children} -
-
-
- - - -
- -
+ <> + + +
+
+ + {packageName} + +
+ + + + +
+
+ + {/*

{version}

*/} + + +
+
+ + + + + +
+ + {ENV.IS_LOCAL_DEV ? ( +
+ Local test environment +
+ ) : null} + {ENV.IS_PREVIEW ? ( +
+ Preview environment +
+ ) : null} +
+
+
+ +
+
+ + {packageName} + +
+
+ {children} +
+
+
+ + + + ); } diff --git a/apps/website/src/app/docs/packages/[packageName]/[version]/page.tsx b/apps/website/src/app/docs/packages/[packageName]/[version]/page.tsx index d83cf8bd1..765cceea0 100644 --- a/apps/website/src/app/docs/packages/[packageName]/[version]/page.tsx +++ b/apps/website/src/app/docs/packages/[packageName]/[version]/page.tsx @@ -1,29 +1,19 @@ +'use cache'; + import { readFile } from 'node:fs/promises'; import { join } from 'node:path'; import rehypeShikiFromHighlighter from '@shikijs/rehype/core'; import { MDXRemote } from 'next-mdx-remote-client/rsc'; import remarkGfm from 'remark-gfm'; -import { getHighlighterCore } from 'shiki/core'; -import getWasm from 'shiki/wasm'; +import { getSingletonHighlighter } from '@/util/shiki.bundle'; -const highlighter = await getHighlighterCore({ - themes: [import('shiki/themes/github-light.mjs'), import('shiki/themes/github-dark-dimmed.mjs')], - langs: [ - import('shiki/langs/typescript.mjs'), - import('shiki/langs/javascript.mjs'), - import('shiki/langs/shellscript.mjs'), - ], - loadWasm: getWasm, -}); +export default async function Page({ params }: { readonly params: Promise<{ readonly packageName: string }> }) { + const { packageName } = await params; -export default async function Page({ params }: { readonly params: { readonly packageName: string } }) { - const fileContent = await readFile( - join(process.cwd(), `src/assets/readme/${params.packageName}/home-README.md`), - 'utf8', - ); + const fileContent = await readFile(join(process.cwd(), `src/assets/readme/${packageName}/home-README.md`), 'utf8'); return ( -
+
- - - - {ENV.IS_LOCAL_DEV ? ( -
- Local test environment -
- ) : null} - {ENV.IS_PREVIEW ? ( -
- Preview environment -
- ) : null} - {children} -
+ + {children} diff --git a/apps/website/src/app/not-found.tsx b/apps/website/src/app/not-found.tsx index cb839e522..7410362ef 100644 --- a/apps/website/src/app/not-found.tsx +++ b/apps/website/src/app/not-found.tsx @@ -3,10 +3,10 @@ import Link from 'next/link'; export default function NotFound() { return (
-

404

+

404

Not found.

Take me back diff --git a/apps/website/src/app/opengraph-image.tsx b/apps/website/src/app/opengraph-image.tsx index 0429e4eec..8582201fc 100644 --- a/apps/website/src/app/opengraph-image.tsx +++ b/apps/website/src/app/opengraph-image.tsx @@ -1,4 +1,5 @@ /* eslint-disable react/no-unknown-property */ + import { ImageResponse } from 'next/og'; export const runtime = 'edge'; @@ -11,15 +12,19 @@ export const size = { export const contentType = 'image/png'; export default async function Image() { + const fontData = await fetch(new URL('../assets/Geist-Black.ttf', import.meta.url), { + next: { revalidate: 604_800 }, + }).then(async (res) => res.arrayBuffer()); + return new ImageResponse( ( -
+
-
+
- The most popular + The most popular
way to build Discord bots. @@ -31,6 +36,14 @@ export default async function Image() { ), { ...size, + fonts: [ + { + name: 'Geist', + data: fontData, + weight: 900, + style: 'normal', + }, + ], }, ); } diff --git a/apps/website/src/app/page.tsx b/apps/website/src/app/page.tsx index d367dbf2b..864b919f8 100644 --- a/apps/website/src/app/page.tsx +++ b/apps/website/src/app/page.tsx @@ -1,43 +1,42 @@ import { ExternalLink } from 'lucide-react'; import Image from 'next/image'; import Link from 'next/link'; -import vercelLogo from '~/assets/powered-by-vercel.svg'; -import workersLogo from '~/assets/powered-by-workers.png'; -import { InstallButton } from '~/components/ui/InstallButton'; -import { DESCRIPTION } from '~/util/constants'; +import vercelLogo from '@/assets/powered-by-vercel.svg'; +import workersLogo from '@/assets/powered-by-workers.png'; +import { InstallButton } from '@/components/InstallButton'; +import { buttonStyles } from '@/styles/ui/button'; +import { DESCRIPTION } from '@/util/constants'; export default async function Page() { return ( -
+
-

- The most popular way to build - Discord bots. +

+ The{' '} + most popular{' '} + way to build Discord bots.

-

{DESCRIPTION}

+

{DESCRIPTION}

diff --git a/apps/website/src/app/providers.tsx b/apps/website/src/app/providers.tsx index cac09ead3..404ea64f3 100644 --- a/apps/website/src/app/providers.tsx +++ b/apps/website/src/app/providers.tsx @@ -3,10 +3,12 @@ import { Provider as JotaiProvider } from 'jotai'; import { useRouter } from 'next/navigation'; import { ThemeProvider } from 'next-themes'; +import { NuqsAdapter } from 'nuqs/adapters/next/app'; import type { PropsWithChildren } from 'react'; import { RouterProvider } from 'react-aria-components'; -import { useSystemThemeFallback } from '~/hooks/useSystemThemeFallback'; -import { useUnregisterServiceWorker } from '~/hooks/useUnregisterServiceWorker'; +import { SidebarProvider } from '@/components/ui/Sidebar'; +import { useSystemThemeFallback } from '@/hooks/useSystemThemeFallback'; +import { useUnregisterServiceWorker } from '@/hooks/useUnregisterServiceWorker'; export function Providers({ children }: PropsWithChildren) { const router = useRouter(); @@ -14,10 +16,14 @@ export function Providers({ children }: PropsWithChildren) { useSystemThemeFallback(); return ( - - - {children} - - + + + + + {children} + + + + ); } diff --git a/apps/website/src/assets/Geist-Black.ttf b/apps/website/src/assets/Geist-Black.ttf new file mode 100644 index 000000000..c0258e39d Binary files /dev/null and b/apps/website/src/assets/Geist-Black.ttf differ diff --git a/apps/website/src/assets/Geist-Bold.ttf b/apps/website/src/assets/Geist-Bold.ttf new file mode 100644 index 000000000..5830512ac Binary files /dev/null and b/apps/website/src/assets/Geist-Bold.ttf differ diff --git a/apps/website/src/components/Badges.tsx b/apps/website/src/components/Badges.tsx index 911c5e234..ad3245a6c 100644 --- a/apps/website/src/components/Badges.tsx +++ b/apps/website/src/components/Badges.tsx @@ -4,7 +4,7 @@ import type { PropsWithChildren } from 'react'; export function Badge({ children, className = '' }: PropsWithChildren<{ readonly className?: string }>) { return ( {children} diff --git a/apps/website/src/components/ui/CmdK.tsx b/apps/website/src/components/CmdK.tsx similarity index 82% rename from apps/website/src/components/ui/CmdK.tsx rename to apps/website/src/components/CmdK.tsx index a74c27794..44768ad7b 100644 --- a/apps/website/src/components/ui/CmdK.tsx +++ b/apps/website/src/components/CmdK.tsx @@ -4,13 +4,15 @@ import { Command } from 'cmdk'; import { useAtom, useSetAtom } from 'jotai'; import { ArrowRight } from 'lucide-react'; import MeiliSearch from 'meilisearch'; +import dynamic from 'next/dynamic'; import { usePathname, useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; -import { useDebounceValue } from 'usehooks-ts'; -import { isCmdKOpenAtom } from '~/stores/cmdk'; -import { isDrawerOpenAtom } from '~/stores/drawer'; -import { resolveKind } from '~/util/resolveNodeKind'; -import { OverlayScrollbarsComponent } from '../OverlayScrollbars'; +import { useDebounceValue, useMediaQuery } from 'usehooks-ts'; +import { Scrollbars } from '@/components/OverlayScrollbars'; +import { isCmdKOpenAtom } from '@/stores/cmdk'; +import { isDrawerOpenAtom } from '@/stores/drawer'; +import { cx } from '@/styles/cva'; +import { resolveKind } from '@/util/resolveNodeKind'; const client = new MeiliSearch({ host: 'https://search.discordjs.dev', @@ -24,6 +26,7 @@ export function CmdK({ dependencies }: { readonly dependencies: string[] }) { const setDrawerOpen = useSetAtom(isDrawerOpenAtom); const [search, setSearch] = useDebounceValue('', 250); const [searchResults, setSearchResults] = useState([]); + const isMobile = useMediaQuery('(max-width: 600px)'); const packageName = pathname?.split('/').slice(3, 4)[0]; const branchName = pathname?.split('/').slice(4, 5)[0]; @@ -41,9 +44,9 @@ export function CmdK({ dependencies }: { readonly dependencies: string[] }) { > {resolveKind(item.kind)}
- {item.name} - {item.summary} - {item.path} + {item.name} + {item.summary} + {item.path}
@@ -114,11 +117,11 @@ export function CmdK({ dependencies }: { readonly dependencies: string[] }) { shouldFilter={false} > - )} - + ); } + +export const CmdKNoSRR = dynamic(async () => CmdK, { ssr: false }); diff --git a/apps/website/src/components/ConstructorNode.tsx b/apps/website/src/components/ConstructorNode.tsx index d6bf791a4..50d3c352d 100644 --- a/apps/website/src/components/ConstructorNode.tsx +++ b/apps/website/src/components/ConstructorNode.tsx @@ -1,25 +1,25 @@ import { VscSymbolMethod } from '@react-icons/all-files/vsc/VscSymbolMethod'; import { Code2, LinkIcon } from 'lucide-react'; import Link from 'next/link'; -import { ENV } from '~/util/env'; +import { ENV } from '@/util/env'; import { ParameterNode } from './ParameterNode'; import { SummaryNode } from './SummaryNode'; export async function ConstructorNode({ node, version }: { readonly node: any; readonly version: string }) { return ( -
+

Constructors

-
+

{/* constructor({parsedContent.constructor.parametersString}) */} - + constructor({node.parameters?.length ? : null}) @@ -44,7 +44,7 @@ export async function ConstructorNode({ node, version }: { readonly node: any; r ) : null} -
+
diff --git a/apps/website/src/components/DocItem.tsx b/apps/website/src/components/DocItem.tsx index 81cfe9895..16b47a40f 100644 --- a/apps/website/src/components/DocItem.tsx +++ b/apps/website/src/components/DocItem.tsx @@ -6,7 +6,7 @@ import { EventNode } from './EventNode'; import { InformationNode } from './InformationNode'; import { MethodNode } from './MethodNode'; import { Outline } from './Outline'; -import { OverlayScrollbarsComponent } from './OverlayScrollbars'; +import { Scrollbars } from './OverlayScrollbars'; import { ParameterNode } from './ParameterNode'; import { PropertyNode } from './PropertyNode'; import { ReturnNode } from './ReturnNode'; @@ -26,12 +26,14 @@ async function OverloadNode({ readonly packageName: string; readonly version: string; }) { + 'use cache'; + return ( {node.overloads.map((overload: any) => ( @@ -41,7 +43,7 @@ async function OverloadNode({ {node.overloads.map((overload: any) => ( @@ -52,7 +54,7 @@ async function OverloadNode({ ); } -export function DocItem({ +export async function DocItem({ node, packageName, version, @@ -61,6 +63,8 @@ export function DocItem({ readonly packageName: string; readonly version: string; }) { + 'use cache'; + if (node.overloads?.length) { return ; } @@ -69,16 +73,13 @@ export function DocItem({ <> - - - + + + {node.summary?.deprecatedBlock.length ? ( @@ -95,7 +96,7 @@ export function DocItem({ {node.constructor?.parametersString ? : null} {node.typeParameters?.length ? ( -
+

Type Parameters @@ -105,7 +106,7 @@ export function DocItem({ ) : null} {node.parameters?.length ? ( -
+

Parameters diff --git a/apps/website/src/components/DocNode.tsx b/apps/website/src/components/DocNode.tsx index 9fd033224..487a0a824 100644 --- a/apps/website/src/components/DocNode.tsx +++ b/apps/website/src/components/DocNode.tsx @@ -1,6 +1,6 @@ import Link from 'next/link'; -import { BuiltinDocumentationLinks } from '~/util/builtinDocumentationLinks'; -import { OverlayScrollbarsComponent } from './OverlayScrollbars'; +import { BuiltinDocumentationLinks } from '@/util/builtinDocumentationLinks'; +import { Scrollbars } from './OverlayScrollbars'; import { SyntaxHighlighter } from './SyntaxHighlighter'; export async function DocNode({ node, version }: { readonly node?: any; readonly version: string }) { @@ -12,9 +12,11 @@ export async function DocNode({ node, version }: { readonly node?: any; readonly if (node.resolvedPackage) { return ( {node.text} @@ -24,7 +26,7 @@ export async function DocNode({ node, version }: { readonly node?: any; readonly if (node.uri) { return ( - - + + ); } diff --git a/apps/website/src/components/EnumMemberNode.tsx b/apps/website/src/components/EnumMemberNode.tsx index 6743c19ea..daba76b3f 100644 --- a/apps/website/src/components/EnumMemberNode.tsx +++ b/apps/website/src/components/EnumMemberNode.tsx @@ -2,7 +2,7 @@ import { VscSymbolEnumMember } from '@react-icons/all-files/vsc/VscSymbolEnumMem import { Code2, LinkIcon } from 'lucide-react'; import Link from 'next/link'; import { Fragment } from 'react'; -import { ENV } from '~/util/env'; +import { ENV } from '@/util/env'; import { Badges } from './Badges'; import { DeprecatedNode } from './DeprecatedNode'; import { ExampleNode } from './ExampleNode'; @@ -23,25 +23,25 @@ export async function EnumMemberNode({ readonly version: string; }) { return ( -
+

Members

-
+
{node.map((enumMember: any, idx: number) => (
-
+

@@ -100,7 +100,7 @@ export async function EnumMemberNode({ ) : null}

-
+
diff --git a/apps/website/src/components/EventNode.tsx b/apps/website/src/components/EventNode.tsx index 3330d037d..020a6fc0e 100644 --- a/apps/website/src/components/EventNode.tsx +++ b/apps/website/src/components/EventNode.tsx @@ -1,7 +1,7 @@ import { VscSymbolEvent } from '@react-icons/all-files/vsc/VscSymbolEvent'; import { ChevronDown, ChevronUp, Code2, LinkIcon } from 'lucide-react'; import Link from 'next/link'; -import { ENV } from '~/util/env'; +import { ENV } from '@/util/env'; import { Badges } from './Badges'; import { DeprecatedNode } from './DeprecatedNode'; import { ExampleNode } from './ExampleNode'; @@ -28,14 +28,14 @@ async function EventBodyNode({ return ( <>
-
+

{event.displayName} - + {event.typeParameters?.length ? ( @@ -86,7 +86,7 @@ async function EventBodyNode({ {event.summary?.seeBlocks.length ? : null}

-
+
@@ -107,7 +107,7 @@ async function OverloadNode({ {event.overloads.map((overload: any) => ( @@ -117,7 +117,7 @@ async function OverloadNode({ {event.overloads.map((overload: any) => ( @@ -138,8 +138,8 @@ export async function EventNode({ readonly version: string; }) { return ( - - + +

Events

@@ -148,7 +148,7 @@ export async function EventNode({
-
+
{node.map((event: any) => event.overloads?.length ? ( +
Examples:
diff --git a/apps/website/src/components/ExcerptNode.tsx b/apps/website/src/components/ExcerptNode.tsx index 50427be3b..5c59612bd 100644 --- a/apps/website/src/components/ExcerptNode.tsx +++ b/apps/website/src/components/ExcerptNode.tsx @@ -1,9 +1,9 @@ import Link from 'next/link'; import { Fragment } from 'react'; -import { BuiltinDocumentationLinks } from '~/util/builtinDocumentationLinks'; +import { BuiltinDocumentationLinks } from '@/util/builtinDocumentationLinks'; export async function ExcerptNode({ node, version }: { readonly node?: any; readonly version: string }) { - const createExcerpt = (excerpts: any) => { + const createExcerpt = (excerpts: any, idx: number) => { const excerpt = Array.isArray(excerpts) ? excerpts : (excerpts.excerpts ?? [excerpts]); return ( @@ -13,14 +13,17 @@ export async function ExcerptNode({ node, version }: { readonly node?: any; read ? 'after:content-[",_"] last-of-type:after:content-none' : '' } + key={`${excerpt.text}-${idx}`} > {excerpt.map((excerpt: any, idx: number) => { if (excerpt.resolvedItem) { return ( {excerpt.text} @@ -30,7 +33,7 @@ export async function ExcerptNode({ node, version }: { readonly node?: any; read if (excerpt.href) { return ( +