mirror of
https://github.com/hanzoai/shadcn.git
synced 2026-10-30 18:22:59 +00:00
Squash merge of shadcn-ui/ui main branch into hanzo/ui, bringing in: - [email protected] through [email protected] releases - New apps/v4 directory structure - Registry system improvements and MCP server - Framework support (Vue, Svelte, React Native) - New templates (vite-app, monorepo-next, laravel) - Zod 4 compatibility (scoped override for zod@>4) - Test fixture corrections for alias resolution All 867 merge conflicts resolved preserving Hanzo customizations. 1020/1020 shadcn tests pass.
66 lines
1.8 KiB
TypeScript
66 lines
1.8 KiB
TypeScript
import Link from "next/link"
|
|
import { ChevronLeftIcon, ChevronRightIcon } from "@radix-ui/react-icons"
|
|
// import { Doc } from "contentlayer/generated" // Migrated to Fumadocs
|
|
import { NavItem, NavItemWithChildren } from "types/nav"
|
|
|
|
import { docsConfig } from "@/config/docs"
|
|
import { cn } from "@/lib/utils"
|
|
import { buttonVariants } from "@/registry/default/ui/button"
|
|
|
|
interface DocsPagerProps {
|
|
doc: any // TODO: Update to Fumadocs types
|
|
}
|
|
|
|
export function DocsPager({ doc }: DocsPagerProps) {
|
|
const pager = getPagerForDoc(doc)
|
|
|
|
if (!pager) {
|
|
return null
|
|
}
|
|
|
|
return (
|
|
<div className="flex flex-row items-center justify-between">
|
|
{pager?.prev?.href && (
|
|
<Button variant="ghost" asChild>
|
|
<Link href={pager.prev.href}>
|
|
<ChevronLeft />
|
|
{pager.prev.title}
|
|
</Link>
|
|
</Button>
|
|
)}
|
|
{pager?.next?.href && (
|
|
<Button variant="ghost" className="ml-auto" asChild>
|
|
<Link href={pager.next.href}>
|
|
{pager.next.title}
|
|
<ChevronRight />
|
|
</Link>
|
|
</Button>
|
|
)}
|
|
</div>
|
|
)
|
|
}
|
|
|
|
export function getPagerForDoc(doc: any) {
|
|
const flattenedLinks = [null, ...flatten(docsConfig.sidebarNav), null]
|
|
const activeIndex = flattenedLinks.findIndex(
|
|
(link) => doc.slug === link?.href
|
|
)
|
|
const prev = activeIndex !== 0 ? flattenedLinks[activeIndex - 1] : null
|
|
const next =
|
|
activeIndex !== flattenedLinks.length - 1
|
|
? flattenedLinks[activeIndex + 1]
|
|
: null
|
|
return {
|
|
prev,
|
|
next,
|
|
}
|
|
}
|
|
|
|
export function flatten(links: NavItemWithChildren[]): NavItem[] {
|
|
return links
|
|
.reduce<NavItem[]>((flat, link) => {
|
|
return flat.concat(link.items?.length ? flatten(link.items) : link)
|
|
}, [])
|
|
.filter((link) => !link?.disabled)
|
|
}
|