mirror of
https://github.com/shadcn-ui/ui.git
synced 2026-06-25 21:56:08 +00:00
* feat: add base and radix docs * feat: transform code for display * fix * fix * fix * fix * fix * chore: remove claude files * fix * fix * fix * chore: run format:write * fix * feat: add more examples * fix * feat: add aspect-ratio * feat: add avatar * feat: add badge * feat: add breadcrumb * fix * feat: add button * fix * fix * fix * feat: add calendar and card * feat: add carousel * fix: chart * feat: add checkbox * feat: add collapsible * feat: add combobox * feat: add command * feat: add context menu * feat: add data-table dialog and drawer * feat: dropdown-menu * feat: add date-picker * feat: add empty * feat: add field and hover-card * fix: input * feat: add input * feat: add input-group * feat: add input-otp * feat: add item * feat: add kbd and label * feat: add menubar * feat: add native-select * feat: add more components * feat: more components * feat: more components * feat: add skeleton, slider and sonner * feat: add spinner and switch * feat: add more components * fix: tabs * fix: tabs * feat: add docs for sidebar * fix * fix * fi * docs: update * fix: create page * fix * fix * chore: add changelog * fix
63 lines
2.0 KiB
TypeScript
63 lines
2.0 KiB
TypeScript
import type { source } from "@/lib/source"
|
|
|
|
export type PageTreeNode = (typeof source.pageTree)["children"][number]
|
|
export type PageTreeFolder = Extract<PageTreeNode, { type: "folder" }>
|
|
export type PageTreePage = Extract<PageTreeNode, { type: "page" }>
|
|
|
|
// Recursively find all pages in a folder tree.
|
|
export function getAllPagesFromFolder(folder: PageTreeFolder): PageTreePage[] {
|
|
const pages: PageTreePage[] = []
|
|
|
|
for (const child of folder.children) {
|
|
if (child.type === "page") {
|
|
pages.push(child)
|
|
} else if (child.type === "folder") {
|
|
pages.push(...getAllPagesFromFolder(child))
|
|
}
|
|
}
|
|
|
|
return pages
|
|
}
|
|
|
|
// Get the pages from a folder, handling nested base folders (radix/base).
|
|
export function getPagesFromFolder(
|
|
folder: PageTreeFolder,
|
|
currentBase: string
|
|
): PageTreePage[] {
|
|
// For the components folder, find the base subfolder.
|
|
if (folder.$id === "components" || folder.name === "Components") {
|
|
for (const child of folder.children) {
|
|
if (child.type === "folder") {
|
|
// Match by $id or by name.
|
|
const isRadix = child.$id === "radix" || child.name === "Radix UI"
|
|
const isBase = child.$id === "base" || child.name === "Base UI"
|
|
|
|
if (
|
|
(currentBase === "radix" && isRadix) ||
|
|
(currentBase === "base" && isBase)
|
|
) {
|
|
return child.children.filter(
|
|
(c): c is PageTreePage => c.type === "page"
|
|
)
|
|
}
|
|
}
|
|
}
|
|
|
|
// Fallback: return all pages from nested folders.
|
|
return getAllPagesFromFolder(folder).filter(
|
|
(page) => !page.url.endsWith("/components")
|
|
)
|
|
}
|
|
|
|
// For other folders, return direct page children.
|
|
return folder.children.filter(
|
|
(child): child is PageTreePage => child.type === "page"
|
|
)
|
|
}
|
|
|
|
// Get current base (radix or base) from pathname.
|
|
export function getCurrentBase(pathname: string): string {
|
|
const baseMatch = pathname.match(/\/docs\/components\/(radix|base)\//)
|
|
return baseMatch ? baseMatch[1] : "radix" // Default to radix.
|
|
}
|