Files
upstream-tldraw/apps/docs/components/docs/docs-sidebar-menu.tsx
upstream-mirror a774ac673a
Some checks failed
Deploy analytics worker / Deploy analytics worker to ${{ (github.ref == 'refs/heads/production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Failing after 1s
i18n upload strings / Upload latest strings (push) Failing after 1s
Deploy bemo / Deploy bemo to ${{ (github.ref == 'refs/heads/bemo-production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Failing after 1s
Deploy grafana resources / ${{ github.event_name == 'push' && 'Deploy grafana resources' || 'Validate grafana resources (dry run)' }} (push) Failing after 0s
End to end tests (dotcom) / Check for relevant changes (push) Failing after 0s
End to end tests (examples) / Check for relevant changes (push) Failing after 0s
End to end tests (mermaid readability) / Check for relevant changes (push) Failing after 1s
End to end tests (perf) / Check for relevant changes (push) Failing after 0s
Publish editor extensions / Publish editor extensions (push) Failing after 1s
Publish SDK packages / Remove the publish-packages label (push) Has been skipped
Checks / Tests & checks (push) Has been cancelled
Checks / Build all projects (push) Has been cancelled
Deploy templates / Deploy templates (push) Has been cancelled
End to end tests (dotcom) / End to end tests (dotcom) (push) Has been cancelled
End to end tests (mermaid readability) / End to end tests (mermaid readability) (push) Has been cancelled
End to end tests (perf) / End to end tests (perf) (push) Has been cancelled
Deploy .com / Deploy dotcom to ${{ (github.ref == 'refs/heads/production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Has been cancelled
End to end tests (examples) / End to end tests (examples) (push) Has been cancelled
Publish SDK packages / Publish SDK packages (push) Has been cancelled
Publish SDK packages / Tell user released version (push) Has been cancelled
Publish SDK packages / Publishes code templates to separate repositories (push) Has been cancelled
Publish SDK packages / Deploys the template demos with the new SDK version (push) Has been cancelled
snapshot of https://github.com/tldraw/tldraw.git (main, 2026-09-23; blobs > 131072B omitted)
2026-09-23 16:12:52 +05:00

94 lines
2.9 KiB
TypeScript

'use client'
import { Disclosure, DisclosureButton, DisclosurePanel } from '@headlessui/react'
import { ChevronRightIcon } from '@heroicons/react/16/solid'
import Link from 'next/link'
import { usePathname } from 'next/navigation'
import { APIGroup } from '@/types/content-types'
import { cn } from '@/utils/cn'
export function DocsSidebarMenu({
title,
elements,
isFirst = false,
hideTitle = false,
}: {
isFirst: boolean
title: string
elements: {
type: string
articleId: string
title: string
url: string
groupId: string | null
}[]
hideTitle?: boolean
}) {
const pathname = usePathname()
const groups = elements.some((e) => e.groupId) ? Object.values(APIGroup) : null
return (
<div className={cn(isFirst ? 'mt-0 md:mt-8' : 'mt-0 md:mt-12')}>
{!hideTitle && (
<h4 className="text-black dark:text-white uppercase text-xs w-full font-semibold md:sticky top-0 bg-white dark:bg-zinc-950 z-10 py-2">
{title}
</h4>
)}
<ul className={cn('flex flex-col gap-2 text-sm break-words', !hideTitle && 'mt-2')}>
{groups?.map((group, index) => {
const groupElements = elements.filter((e) => e.groupId === group)
if (groupElements.length === 0) return null
return (
<li key={index}>
<Disclosure defaultOpen={groupElements.some((e) => e.url === pathname)}>
<DisclosureButton className="group w-full flex justify-between gap-4">
<span className="group-data-[open]:text-black dark:group-data-[open]:text-white group-data-[open]:font-semibold">
{group}
</span>
<ChevronRightIcon className="h-3.5 shrink-0 group-data-[open]:rotate-90 text-zinc-400 dark:text-zinc-600 group-data-[open]:text-black dark:group-data-[open]:text-white" />
</DisclosureButton>
<DisclosurePanel>
<ul className="flex flex-col gap-2 ml-1 pl-2 pt-2 border-l border-zinc-100 dark:border-zinc-800">
{groupElements.map(({ title, url }, index) => (
<li key={index}>
<Link
href={url}
data-active={pathname === url}
className={cn(
'sidebar-link w-full truncate',
pathname === url
? 'text-black dark:text-white font-semibold'
: 'hover:text-zinc-800 dark:hover:text-zinc-200'
)}
>
{title}
</Link>
</li>
))}
</ul>
</DisclosurePanel>
</Disclosure>
</li>
)
}) ??
elements.map(({ title, url }, index) => (
<li key={index}>
<Link
href={url}
data-active={pathname === url}
className={cn(
'sidebar-link block',
pathname === url || `/getting-started${pathname}` === url
? 'text-black dark:text-white font-semibold'
: 'hover:text-zinc-800 dark:hover:text-zinc-200'
)}
>
{title}
</Link>
</li>
))}
</ul>
</div>
)
}