diff --git a/website/src/app/docs/[...slug]/page.tsx b/website/src/app/docs/[...slug]/page.tsx index 55693042..00d3daff 100644 --- a/website/src/app/docs/[...slug]/page.tsx +++ b/website/src/app/docs/[...slug]/page.tsx @@ -6,7 +6,7 @@ import { compileMDX } from 'next-mdx-remote/rsc'; import remarkGfm from 'remark-gfm'; import rehypeSlug from 'rehype-slug'; import { getDocBySlug, getDocSlugs, getAdjacentDocs, extractHeadings, stripCodeFences } from '@/lib/docs'; -import { DOCS_SIDEBAR } from '@/lib/constants'; +import { DOCS_SIDEBAR, docsCategoryAnchor } from '@/lib/constants'; import { Sidebar } from '@/components/docs/Sidebar'; import { Toc } from '@/components/docs/Toc'; import { DocNavigation } from '@/components/docs/DocNavigation'; @@ -126,7 +126,14 @@ export default async function DocPage({ params }: PageProps) { {categoryItem && ( <> -
  • {categoryItem.category}
  • +
  • + + {categoryItem.category} + +
  • )} diff --git a/website/src/app/docs/page.tsx b/website/src/app/docs/page.tsx index c8f8864b..3f255ed4 100644 --- a/website/src/app/docs/page.tsx +++ b/website/src/app/docs/page.tsx @@ -1,7 +1,7 @@ import type { Metadata } from 'next'; import { pageMeta } from '@/lib/seo'; import Link from 'next/link'; -import { DOCS_SIDEBAR } from '@/lib/constants'; +import { DOCS_SIDEBAR, docsCategoryAnchor } from '@/lib/constants'; import { DocsSearchTrigger } from '@/components/docs/DocsSearchTrigger'; import { FadeIn } from '@/components/ui/FadeIn'; @@ -22,6 +22,9 @@ const CATEGORY_ICONS: Record = { 'Editors': 'M11 4a2 2 0 114 0v1a1 1 0 001 1h3a1 1 0 011 1v3a1 1 0 01-1 1h-1a2 2 0 100 4h1a1 1 0 011 1v3a1 1 0 01-1 1h-3a1 1 0 01-1-1v-1a2 2 0 10-4 0v1a1 1 0 01-1 1H7a1 1 0 01-1-1v-3a1 1 0 00-1-1H4a2 2 0 110-4h1a1 1 0 001-1V7a1 1 0 011-1h3a1 1 0 001-1V4z', }; +const START_HERE = ['getting-started', 'usage-guide', 'cli-guide']; +const ALL_ITEMS = DOCS_SIDEBAR.flatMap((g) => g.items); + export default function DocsPage() { return (
    @@ -45,31 +48,60 @@ export default function DocsPage() { +
    +

    + Start here +

    +
    + {START_HERE.map((slug) => { + const item = ALL_ITEMS.find((i) => i.slug === slug); + if (!item) return null; + return ( + + {item.label} + {item.description} + + ); + })} +
    +
    +
    {DOCS_SIDEBAR.map((group, i) => ( -
    - +
    -

    {group.category}

    +

    + {group.category} +

    {group.items.length} {group.items.length === 1 ? 'article' : 'articles'}

    -
      - {group.items.slice(0, 3).map((item) => ( -
    • {item.label}
    • +
        + {group.items.map((item) => ( +
      • + + + {item.label} + + {item.description} + +
      • ))} - {group.items.length > 3 && ( -
      • +{group.items.length - 3} more
      • - )}
      - + ))}
    diff --git a/website/src/lib/constants.ts b/website/src/lib/constants.ts index 788e7275..a4eb63ca 100644 --- a/website/src/lib/constants.ts +++ b/website/src/lib/constants.ts @@ -57,3 +57,8 @@ export const DOCS_SIDEBAR = [ { slug: 'editors/jetbrains', file: 'editors/jetbrains.md', label: 'JetBrains', description: 'Connect JetBrains IDEs such as GoLand, IntelliJ and DataGrip to the GoSQLX language server for SQL diagnostics, formatting and completion, step by step.' }, ]}, ]; + +/** Stable DOM id for a docs category card on /docs/ (breadcrumb anchor target). */ +export function docsCategoryAnchor(category: string): string { + return category.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, ''); +}