{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "beta-repo-setup",
  "registryDependencies": [
    "@fulldev/blocks",
    "@fulldev/components"
  ],
  "files": [
    {
      "path": "src/content.config.ts",
      "content": "import { defineCollection } from \"astro:content\"\nimport { glob } from \"astro/loaders\"\n\nimport { globalSchema } from \"@/schemas/global\"\nimport { pageSchema } from \"@/schemas/page\"\n\nexport const collections = {\n  pages: defineCollection({\n    loader: glob({\n      pattern: \"**/[^_]*.{md,mdx}\",\n      base: \"src/content/pages\",\n    }),\n    schema: pageSchema,\n  }),\n  globals: defineCollection({\n    loader: glob({\n      pattern: \"**/[^_]*.{yaml,yml,json}\",\n      base: \"src/content/globals\",\n    }),\n    schema: globalSchema,\n  }),\n}\n",
      "type": "registry:file",
      "target": "src/content.config.ts"
    },
    {
      "path": "src/lib/pages.ts",
      "content": "import { getCollection, type CollectionEntry } from \"astro:content\"\n\ntype Page = CollectionEntry<\"pages\">\n\nexport type PageSearchItem = {\n  label: string\n  href: string\n  title: string\n  path: string\n  description: string\n  group: string\n}\n\nexport type PageBreadcrumbItem = {\n  label: string\n  href: string\n}\n\nexport const normalizePath = (path: string) => {\n  if (path === \"/\") return path\n\n  return path.replace(/\\/$/, \"\")\n}\n\nexport const getPageHref = (page: Page) =>\n  page.id === \"index\" ? \"/\" : `/${page.id}/`\n\nexport const formatSlug = (slug: string) =>\n  slug\n    .split(\"-\")\n    .filter(Boolean)\n    .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n    .join(\" \")\n\nconst getPageSearchGroup = (href: string) => {\n  const [slug] = href.split(\"/\").filter(Boolean)\n\n  return slug ? formatSlug(slug) : \"Overview\"\n}\n\nexport const getPageSearchItems = async (): Promise<PageSearchItem[]> => {\n  const pages = await getCollection(\"pages\")\n\n  return pages\n    .map((page) => ({\n      label: page.data.title,\n      href: getPageHref(page),\n      title: page.data.title,\n      path: getPageHref(page),\n      description: page.data.description,\n      group: getPageSearchGroup(getPageHref(page)),\n    }))\n    .sort((a, b) => a.label.localeCompare(b.label))\n}\n\nexport const getPageBreadcrumbItems = async (\n  pathname: string\n): Promise<PageBreadcrumbItem[]> => {\n  const currentPath = normalizePath(pathname)\n  const pages = await getCollection(\"pages\")\n  const pageTitlesByHref = new Map(\n    pages.map((page) => [getPageHref(page), page.data.title])\n  )\n  const homeLink = {\n    label: pageTitlesByHref.get(\"/\") ?? \"Home\",\n    href: \"/\",\n  }\n\n  if (currentPath === \"/\") return [homeLink]\n\n  return [\n    homeLink,\n    ...currentPath\n      .split(\"/\")\n      .filter(Boolean)\n      .map((slug, index, slugs) => {\n        const href = `/${slugs.slice(0, index + 1).join(\"/\")}/`\n\n        return {\n          label: pageTitlesByHref.get(href) ?? formatSlug(slug),\n          href,\n        }\n      }),\n  ]\n}\n",
      "type": "registry:file",
      "target": "src/lib/pages.ts"
    },
    {
      "path": "src/pages/[...page].astro",
      "content": "---\nimport { getCollection, getEntry, render } from \"astro:content\"\n\nexport const prerender = true\n\nexport async function getStaticPaths() {\n  const pages = await getCollection(\"pages\")\n  return pages.map((page) => {\n    return {\n      params: {\n        page: page.id === \"index\" ? undefined : page.id,\n      },\n      props: page,\n    }\n  })\n}\n\nconst page = Astro.props\nconst pageData = page.data\nconst { Content, headings } = await render(page)\nconst global = await getEntry(\"globals\", Astro.currentLocale || \"en\")\nif (!global) throw new Error(\"Add a global to content/globals\")\nconst globalData = global.data\n\nconst layoutImports = import.meta.glob(\"../layouts/*.astro\", { eager: true })\nconst layoutPath = `../layouts/${pageData.type}.astro`\nconst layoutImport = layoutImports[layoutPath] as { default?: any } | undefined\nconst Layout = layoutImport?.default\n\nif (!Layout) throw new Error(`Add a layout for page type \"${pageData.type}\"`)\n---\n\n<Layout global={globalData} page={pageData} headings={headings}>\n  <Content />\n</Layout>\n",
      "type": "registry:file",
      "target": "src/pages/[...page].astro"
    },
    {
      "path": "src/pages/[...page].md.ts",
      "content": "import { readFile } from \"node:fs/promises\"\nimport type { APIRoute } from \"astro\"\nimport { getCollection } from \"astro:content\"\n\nexport const prerender = true\n\nconst navigationPreamble = \"Navigation: [/sitemap.md](/sitemap.md)\\n\\n\"\n\nexport async function getStaticPaths() {\n  const pages = await getCollection(\"pages\")\n  return Promise.all(\n    pages\n      .filter((page) => page.id !== \"index\")\n      .map(async (page) => ({\n        params: {\n          page: page.id,\n        },\n        props: {\n          source: await readPageSource(page.filePath),\n        },\n      }))\n  )\n}\n\nasync function readPageSource(filePath: string | undefined) {\n  if (!filePath) {\n    throw new Error(\"Expected content page entry to include a file path.\")\n  }\n\n  return readFile(filePath, \"utf-8\")\n}\n\nexport const GET: APIRoute = ({ props }) => {\n  return new Response(`${navigationPreamble}${props.source}`, {\n    headers: {\n      \"Content-Type\": \"text/plain; charset=utf-8\",\n    },\n  })\n}\n",
      "type": "registry:file",
      "target": "src/pages/[...page].md.ts"
    },
    {
      "path": "src/pages/index.md.ts",
      "content": "import { readFile } from \"node:fs/promises\"\nimport type { APIRoute } from \"astro\"\nimport { getEntry } from \"astro:content\"\n\nexport const prerender = true\n\nconst agentPreamble = `# Fulldev UI Agent Entry Point\n\nNavigation: [/sitemap.md](/sitemap.md)\n\nIf you are an AI agent, treat this page as the entry point for Fulldev UI. Install the Fulldev skill first if your environment supports skills, then read the relevant Markdown pages before editing a project.\n\n\\`\\`\\`bash\nnpx -y skills add fulldotdev/ui --skill fulldev -y\n\\`\\`\\`\n\nStart here:\n\n- Install Fulldev UI: [/docs/installation.md](/docs/installation.md)\n- Understand the project model: [/docs/introduction.md](/docs/introduction.md)\n- Customize theme tokens: [/docs/theming.md](/docs/theming.md)\n- Browse documentation sections: [/docs.md](/docs.md)\n- Browse installable components: [/components.md](/components.md)\n- Browse installable blocks: [/blocks.md](/blocks.md)\n- Discover all pages: [/sitemap.md](/sitemap.md)\n- Read registry metadata: [/r/registry.json](/r/registry.json)\n\nEvery documentation page has a Markdown version. Add \\`.md\\` to a page URL, for example \\`/components/button.md\\` or \\`/blocks/hero.md\\`.\n\nRecommended agent flow:\n\n1. Read \\`/docs/installation.md\\`.\n2. Install the Fulldev skill if your agent supports skills.\n3. Read the component or block page that matches the user's request.\n4. Install registry items with \\`npx shadcn@latest add @fulldev/<name>\\`.\n5. Use block and component examples as source references, not as hidden sidebar context.\n\n---\n\n## Homepage source\n\n`\n\nexport const GET: APIRoute = async () => {\n  const page = await getEntry(\"pages\", \"index\")\n\n  if (!page?.filePath) {\n    return new Response(\n      `${agentPreamble}No homepage content entry exists yet. Add \\`src/content/pages/index.mdx\\` to use this Markdown entry point.`,\n      {\n        headers: {\n          \"Content-Type\": \"text/plain; charset=utf-8\",\n        },\n      }\n    )\n  }\n\n  return new Response(\n    `${agentPreamble}${await readFile(page.filePath, \"utf-8\")}`,\n    {\n      headers: {\n        \"Content-Type\": \"text/plain; charset=utf-8\",\n      },\n    }\n  )\n}\n",
      "type": "registry:file",
      "target": "src/pages/index.md.ts"
    },
    {
      "path": "src/pages/sitemap.md.ts",
      "content": "import type { APIRoute } from \"astro\"\nimport { getCollection } from \"astro:content\"\n\nimport { getPageHref } from \"@/lib/pages\"\n\nexport const prerender = true\n\nconst getMarkdownHref = (href: string) =>\n  href === \"/\" ? \"/index.md\" : `${href.replace(/\\/$/, \"\")}.md`\n\nexport const GET: APIRoute = async () => {\n  const pages = await getCollection(\"pages\")\n  const pageLinks = pages\n    .map((page) => ({\n      title: page.data.title,\n      href: getPageHref(page),\n      markdownHref: getMarkdownHref(getPageHref(page)),\n      description: page.data.description,\n    }))\n    .sort((a, b) => a.href.localeCompare(b.href))\n\n  const body = `# Fulldev UI Sitemap\n\nUse the Markdown URLs when reading pages as an AI agent.\n\n## Core\n\n- [Agent entry point](/index.md)\n- [Registry metadata](/r/registry.json)\n\n## Pages\n\n${pageLinks\n  .map(\n    (page) =>\n      `- [${page.title}](${page.href}) | [Markdown](${page.markdownHref})${\n        page.description ? ` - ${page.description}` : \"\"\n      }`\n  )\n  .join(\"\\n\")}\n`\n\n  return new Response(body, {\n    headers: {\n      \"Content-Type\": \"text/plain; charset=utf-8\",\n    },\n  })\n}\n",
      "type": "registry:file",
      "target": "src/pages/sitemap.md.ts"
    },
    {
      "path": "src/schemas/shared.ts",
      "content": "import { type SchemaContext } from \"astro:content\"\nimport { z } from \"astro/zod\"\n\nexport const linkSchema = z.object({\n  label: z.string(),\n  href: z.string(),\n})\n\nexport const buttonSchema = z.object({\n  label: z.string(),\n  href: z.string(),\n  icon: z.string().optional(),\n  variant: z.enum([\"default\", \"outline\", \"secondary\", \"ghost\"]).optional(),\n})\n\nexport const imageSchema = ({ image }: SchemaContext) =>\n  z.object({\n    src: image(),\n    alt: z.string(),\n  })\n\nexport const seoSchema = (ctx: SchemaContext) =>\n  z.object({\n    title: z.string(),\n    description: z.string(),\n    image: imageSchema(ctx).optional(),\n    canonical: z.string().optional(),\n    noindex: z.boolean().optional(),\n    nofollow: z.boolean().optional(),\n  })\n",
      "type": "registry:file",
      "target": "src/schemas/shared.ts"
    },
    {
      "path": "src/schemas/global.ts",
      "content": "import { type SchemaContext } from \"astro:content\"\nimport { z } from \"astro/zod\"\n\nimport { buttonSchema, linkSchema } from \"@/schemas/shared\"\n\nconst nestedLinkSchema = linkSchema.extend({\n  links: linkSchema.array().optional(),\n})\n\nexport const globalSchema = ({ image }: SchemaContext) =>\n  z.object({\n    name: z.string(),\n    logo: z\n      .object({\n        label: z.string(),\n        href: z.string(),\n        src: image().optional(),\n        srcLight: image().optional(),\n        srcDark: image().optional(),\n        alt: z.string().optional(),\n      })\n      .refine((logo) => logo.src || (logo.srcLight && logo.srcDark), {\n        message: \"Logo must define src or both srcLight and srcDark.\",\n      }),\n    header: z.object({\n      navigation: nestedLinkSchema.array(),\n      githubRepo: z.string(),\n    }),\n    sidebar: z.object({\n      search: z.object({\n        label: z.string(),\n        empty: z.string(),\n      }),\n      navigation: nestedLinkSchema.array(),\n    }),\n    docs: z\n      .object({\n        callout: z.object({\n          description: z.string(),\n          button: buttonSchema,\n        }),\n      })\n      .optional(),\n  })\n\nexport type GlobalSchema = z.infer<ReturnType<typeof globalSchema>>\n",
      "type": "registry:file",
      "target": "src/schemas/global.ts"
    },
    {
      "path": "src/schemas/page.ts",
      "content": "import { type SchemaContext } from \"astro:content\"\nimport { z } from \"astro/zod\"\n\nimport { blockSchema } from \"@/schemas/layouts/block\"\nimport { docSchema } from \"@/schemas/layouts/doc\"\nimport { homeSchema } from \"@/schemas/layouts/home\"\nimport { overviewSchema } from \"@/schemas/layouts/overview\"\n\nexport const pageSchema = (ctx: SchemaContext) =>\n  z.discriminatedUnion(\"type\", [\n    blockSchema(ctx).extend({ type: z.literal(\"block\") }),\n    docSchema(ctx).extend({ type: z.literal(\"doc\") }),\n    homeSchema(ctx).extend({ type: z.literal(\"home\") }),\n    overviewSchema(ctx).extend({ type: z.literal(\"overview\") }),\n  ])\n",
      "type": "registry:file",
      "target": "src/schemas/page.ts"
    },
    {
      "path": "src/schemas/layouts/base.ts",
      "content": "import { type SchemaContext } from \"astro:content\"\nimport { z } from \"astro/zod\"\n\nimport { imageSchema, seoSchema } from \"@/schemas/shared\"\n\nexport const baseSchema = (ctx: SchemaContext) =>\n  z.object({\n    title: z.string(),\n    description: z.string(),\n    image: imageSchema(ctx).optional(),\n    seo: seoSchema(ctx).optional(),\n  })\n\nexport type BaseSchema = z.infer<ReturnType<typeof baseSchema>>\n",
      "type": "registry:file",
      "target": "src/schemas/layouts/base.ts"
    },
    {
      "path": "src/schemas/layouts/block.ts",
      "content": "import { type SchemaContext } from \"astro:content\"\nimport { z } from \"astro/zod\"\n\nimport { baseSchema } from \"@/schemas/layouts/base\"\n\nexport const blockSchema = (ctx: SchemaContext) =>\n  baseSchema(ctx)\n    .extend({\n      category: z.string().optional(),\n    })\n    .strict()\n\nexport type BlockSchema = z.infer<ReturnType<typeof blockSchema>>\n",
      "type": "registry:file",
      "target": "src/schemas/layouts/block.ts"
    },
    {
      "path": "src/schemas/layouts/doc.ts",
      "content": "import { type SchemaContext } from \"astro:content\"\nimport { z } from \"astro/zod\"\n\nimport { baseSchema } from \"@/schemas/layouts/base\"\n\nexport const docSchema = (ctx: SchemaContext) => baseSchema(ctx).loose()\n\nexport type DocSchema = z.infer<ReturnType<typeof docSchema>>\n",
      "type": "registry:file",
      "target": "src/schemas/layouts/doc.ts"
    },
    {
      "path": "src/schemas/layouts/home.ts",
      "content": "import { type SchemaContext } from \"astro:content\"\nimport { z } from \"astro/zod\"\n\nimport { baseSchema } from \"@/schemas/layouts/base\"\n\nexport const homeSchema = (ctx: SchemaContext) =>\n  baseSchema(ctx).extend({}).strict()\n\nexport type HomeSchema = z.infer<ReturnType<typeof homeSchema>>\n",
      "type": "registry:file",
      "target": "src/schemas/layouts/home.ts"
    },
    {
      "path": "src/schemas/layouts/overview.ts",
      "content": "import { type SchemaContext } from \"astro:content\"\nimport { z } from \"astro/zod\"\n\nimport { baseSchema } from \"@/schemas/layouts/base\"\n\nexport const overviewSchema = (ctx: SchemaContext) => baseSchema(ctx).strict()\n\nexport type OverviewSchema = z.infer<ReturnType<typeof overviewSchema>>\n",
      "type": "registry:file",
      "target": "src/schemas/layouts/overview.ts"
    },
    {
      "path": "src/layouts/base.astro",
      "content": "---\nimport { Font } from \"astro:assets\"\n\nimport type { GlobalSchema } from \"@/schemas/global\"\nimport type { BaseSchema } from \"@/schemas/layouts/base\"\nimport { getPageBreadcrumbItems, getPageSearchItems } from \"@/lib/pages\"\nimport Sidebar1 from \"@/components/blocks/sidebar-1.astro\"\nimport {\n  Layout,\n  LayoutBody,\n  LayoutHead,\n  LayoutMain,\n} from \"@/components/ui/layout\"\nimport { ThemeProvider } from \"@/components/ui/theme-toggle\"\n\ntype Props = {\n  global: GlobalSchema\n  page: BaseSchema\n}\n\nconst { global, page }: Props = Astro.props\n\nconst [searchItems, breadcrumbItems] = await Promise.all([\n  getPageSearchItems(),\n  getPageBreadcrumbItems(Astro.url.pathname),\n])\n---\n\n<Layout>\n  <LayoutHead {...global} {...page} {...page.seo}>\n    <Fragment slot=\"head\">\n      <Font\n        cssVariable=\"--font-geist-sans\"\n        preload={[{ subset: \"latin\", weight: \"100 900\", style: \"normal\" }]}\n      />\n      <Font cssVariable=\"--font-geist-mono\" />\n    </Fragment>\n    <ThemeProvider />\n  </LayoutHead>\n  <LayoutBody>\n    <Sidebar1\n      logo={global.logo}\n      search={{\n        items: searchItems,\n        ...global.sidebar.search,\n      }}\n      breadcrumb={{\n        items: breadcrumbItems,\n        menu: global.header.navigation,\n      }}\n      navigation={global.sidebar.navigation}\n      githubRepo={global.header.githubRepo}\n    >\n      <LayoutMain>\n        <slot />\n      </LayoutMain>\n    </Sidebar1>\n  </LayoutBody>\n</Layout>\n",
      "type": "registry:file",
      "target": "src/layouts/base.astro"
    },
    {
      "path": "src/layouts/block.astro",
      "content": "---\nimport type { MarkdownHeading } from \"astro\"\nimport { getCollection } from \"astro:content\"\n\nimport type { GlobalSchema } from \"@/schemas/global\"\nimport type { BlockSchema } from \"@/schemas/layouts/block\"\nimport Base from \"@/layouts/base.astro\"\nimport BlocksBlock from \"@/components/blocks/blocks-1.astro\"\n\ntype Props = {\n  global: GlobalSchema\n  page: BlockSchema\n  headings: MarkdownHeading[]\n}\n\nconst props: Props = Astro.props\nconst currentPath = Astro.url.pathname\nconst markdownPath =\n  currentPath === \"/\" ? \"/index.md\" : `${currentPath.replace(/\\/$/, \"\")}.md`\n\nconst blocks = await getCollection(\"pages\", ({ data }) => {\n  return data.type === \"block\"\n})\nconst currentBlock = blocks.find((entry) => `/${entry.id}/` === currentPath)\nconst isBlockCategory = !props.page.category\nconst orderedBlockCategoryLinks = blocks\n  .filter((entry) => !(\"category\" in entry.data) || !entry.data.category)\n  .map((entry) => ({\n    href: `/${entry.id}/`,\n    title: entry.data.title,\n  }))\n  .sort((a, b) => a.href.localeCompare(b.href))\nconst currentPageIndex = orderedBlockCategoryLinks.findIndex(\n  (item) => item.href === currentPath\n)\nconst previousPage =\n  isBlockCategory && currentPageIndex > 0\n    ? orderedBlockCategoryLinks[currentPageIndex - 1]\n    : undefined\nconst nextPage =\n  isBlockCategory && currentPageIndex >= 0\n    ? orderedBlockCategoryLinks[currentPageIndex + 1]\n    : undefined\nconst copySource = blocks.find((entry) => `/${entry.id}/` === currentPath)?.body\nconst copyButton = copySource\n  ? {\n      id: `blocks-copy-page-${crypto.randomUUID()}`,\n      source: currentBlock?.body ?? copySource,\n    }\n  : undefined\n---\n\n<Base global={props.global} page={props.page}>\n  <BlocksBlock\n    title={props.page.title}\n    description={props.page.description}\n    copyButton={copyButton}\n    markdownUrl={markdownPath}\n    previousPage={previousPage}\n    nextPage={nextPage}\n    labels={{\n      copyMarkdown: \"Copy Markdown\",\n      openIn: \"Open in\",\n      openInMarkdown: \"Open in Markdown\",\n      openInChatGPT: \"Open in ChatGPT\",\n      openInClaude: \"Open in Claude\",\n      openInCursor: \"Open in Cursor\",\n      pagination: {\n        previous: \"Previous\",\n        next: \"Next\",\n        ariaLabel: \"Blocks pagination\",\n      },\n    }}\n  >\n    <slot />\n  </BlocksBlock>\n</Base>\n",
      "type": "registry:file",
      "target": "src/layouts/block.astro"
    },
    {
      "path": "src/layouts/doc.astro",
      "content": "---\nimport type { MarkdownHeading } from \"astro\"\nimport { getCollection } from \"astro:content\"\n\nimport type { GlobalSchema } from \"@/schemas/global\"\nimport type { DocSchema } from \"@/schemas/layouts/doc\"\nimport Base from \"@/layouts/base.astro\"\nimport DocBlock from \"@/components/blocks/doc-1.astro\"\n\ntype Props = {\n  global: GlobalSchema\n  page: DocSchema\n  headings: MarkdownHeading[]\n}\n\nconst props: Props = Astro.props\nconst currentPath = Astro.url.pathname\nconst globalCallout = props.global.docs?.callout\nconst markdownPath =\n  currentPath === \"/\" ? \"/index.md\" : `${currentPath.replace(/\\/$/, \"\")}.md`\n\nconst docsPages = await getCollection(\"pages\")\nconst orderedDocLinks = [\n  \"docs/introduction\",\n  \"docs/installation\",\n  \"docs/theming\",\n  \"docs/dark-mode\",\n  \"docs/cli\",\n  \"docs/mcp\",\n  \"docs/skills\",\n  \"components\",\n  \"blocks\",\n  \"docs/layouts\",\n]\n  .map((id) => docsPages.find((entry) => entry.id === id))\n  .filter((entry): entry is (typeof docsPages)[number] => Boolean(entry))\n  .map((entry) => ({\n    href: `/${entry.id}/`,\n    title: entry.data.title,\n  }))\nconst componentLinks = docsPages\n  .filter(\n    (entry) => entry.data.type === \"doc\" && entry.id.startsWith(\"components/\")\n  )\n  .map((entry) => ({\n    href: `/${entry.id}/`,\n    title: entry.data.title,\n    description: entry.data.description,\n  }))\n  .sort((a, b) => a.title.localeCompare(b.title))\nconst paginationLinks = [...orderedDocLinks, ...componentLinks]\nconst currentPageIndex = paginationLinks.findIndex(\n  (item) => item.href === currentPath\n)\nconst previousPage =\n  currentPageIndex > 0 ? paginationLinks[currentPageIndex - 1] : undefined\nconst nextPage =\n  currentPageIndex >= 0 ? paginationLinks[currentPageIndex + 1] : undefined\nconst currentDoc = await getCollection(\"pages\", ({ data, id }) => {\n  return data.type === \"doc\" && `/${id}/` === currentPath\n})\nconst copySource = currentDoc[0]?.body\nconst copyButton = copySource\n  ? {\n      id: `docs-copy-page-${crypto.randomUUID()}`,\n      source: copySource,\n    }\n  : undefined\n\nconst tocItems = props.headings\n  .filter((heading) => heading.depth === 2 || heading.depth === 3)\n  .map((heading) => ({\n    depth: heading.depth,\n    href: `#${heading.slug}`,\n    label: heading.text,\n  }))\n---\n\n<Base global={props.global} page={props.page}>\n  <DocBlock\n    title={props.page.title}\n    description={props.page.description}\n    copyButton={copyButton}\n    markdownUrl={markdownPath}\n    tocItems={tocItems}\n    callout={globalCallout}\n    previousPage={previousPage}\n    nextPage={nextPage}\n    labels={{\n      copyMarkdown: \"Copy Markdown\",\n      openIn: \"Open in\",\n      openInMarkdown: \"Open in Markdown\",\n      openInChatGPT: \"Open in ChatGPT\",\n      openInClaude: \"Open in Claude\",\n      openInCursor: \"Open in Cursor\",\n      pagination: {\n        previous: \"Previous\",\n        next: \"Next\",\n        ariaLabel: \"Document pagination\",\n      },\n      toc: \"On This Page\",\n    }}\n  >\n    <slot />\n  </DocBlock>\n</Base>\n",
      "type": "registry:file",
      "target": "src/layouts/doc.astro"
    },
    {
      "path": "src/layouts/home.astro",
      "content": "---\nimport type { GlobalSchema } from \"@/schemas/global\"\nimport type { HomeSchema } from \"@/schemas/layouts/home\"\nimport Base from \"@/layouts/base.astro\"\nimport { Typography } from \"@/components/ui/typography\"\n\ntype Props = {\n  global: GlobalSchema\n  page: HomeSchema\n}\n\nconst { global, page } = Astro.props\n---\n\n<Base global={global} page={page}>\n  <Typography\n    as=\"article\"\n    size=\"lg\"\n    class=\"mx-auto w-full max-w-7xl px-4 py-16 lg:px-6 [&>:is(p,ul,ol,blockquote,h1,h2)]:max-w-4xl [&>:is(p,ul,ol,blockquote,h3,h4)]:max-w-3xl [&>[data-slot='tabs']:not(:first-child)]:mt-10\"\n  >\n    <slot />\n  </Typography>\n</Base>\n",
      "type": "registry:file",
      "target": "src/layouts/home.astro"
    },
    {
      "path": "src/layouts/overview.astro",
      "content": "---\nimport { getCollection } from \"astro:content\"\n\nimport type { GlobalSchema } from \"@/schemas/global\"\nimport type { OverviewSchema } from \"@/schemas/layouts/overview\"\nimport Base from \"@/layouts/base.astro\"\nimport { SectionContainer } from \"@/components/ui/section\"\nimport { TypographyH1, TypographyLead } from \"@/components/ui/typography\"\n\ntype Props = {\n  global: GlobalSchema\n  page: OverviewSchema\n}\n\nconst { global, page }: Props = Astro.props\nconst currentPath = Astro.url.pathname\nconst pages = await getCollection(\"pages\")\n\nconst docsIndexOrder = [\n  \"docs/introduction\",\n  \"docs/installation\",\n  \"docs/theming\",\n  \"docs/dark-mode\",\n  \"docs/cli\",\n  \"docs/mcp\",\n  \"docs/skills\",\n  \"components\",\n  \"blocks\",\n  \"docs/layouts\",\n]\n\nconst entries =\n  currentPath === \"/docs/\"\n    ? docsIndexOrder\n        .map((id) => pages.find((entry) => entry.id === id))\n        .filter((entry): entry is (typeof pages)[number] => Boolean(entry))\n    : pages\n        .filter(({ data, id }) => {\n          if (currentPath === \"/blocks/\") {\n            return (\n              data.type === \"block\" &&\n              (!(\"category\" in data) || !data.category) &&\n              id.startsWith(\"blocks/\")\n            )\n          }\n\n          if (currentPath === \"/components/\") {\n            return data.type === \"doc\" && id.startsWith(\"components/\")\n          }\n\n          return false\n        })\n        .sort((a, b) => a.data.title.localeCompare(b.data.title))\n\nconst overviewLinks = entries.map((entry) => ({\n  href: `/${entry.id}/`,\n  title: entry.data.title,\n  description: entry.data.description,\n}))\n---\n\n<Base global={global} page={page}>\n  <SectionContainer class=\"gap-10 pt-10 pb-10 sm:pt-12 sm:pb-12\">\n    <div class=\"mx-auto flex w-full max-w-336 flex-col gap-10\">\n      <header class=\"flex min-w-0 flex-col gap-4 border-b pb-8\">\n        <TypographyH1\n          class=\"text-foreground text-left text-3xl tracking-tight sm:text-4xl\"\n        >\n          {page.title}\n        </TypographyH1>\n        {\n          page.description && (\n            <TypographyLead class=\"max-w-2xl text-base leading-7\">\n              {page.description}\n            </TypographyLead>\n          )\n        }\n      </header>\n\n      <section class=\"grid gap-2 md:grid-cols-2 xl:grid-cols-3\">\n        {\n          overviewLinks.map((item) => (\n            <a\n              href={item.href}\n              class=\"bg-muted/40 hover:bg-muted/60 focus-visible:ring-ring/50 rounded-lg px-4 py-4 transition-colors focus-visible:ring-2 focus-visible:outline-none\"\n            >\n              <span class=\"text-sm font-medium\">{item.title}</span>\n              {item.description && (\n                <span class=\"text-muted-foreground mt-1 block text-sm leading-5\">\n                  {item.description}\n                </span>\n              )}\n            </a>\n          ))\n        }\n      </section>\n    </div>\n  </SectionContainer>\n</Base>\n",
      "type": "registry:file",
      "target": "src/layouts/overview.astro"
    }
  ],
  "type": "registry:file"
}