@blaaiz/docs-core 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/dist/{chunk-ZKOOKLZ3.js → chunk-6H6OB7YP.js} +17 -2
  2. package/dist/chunk-6H6OB7YP.js.map +1 -0
  3. package/dist/{chunk-ZWDLAW5M.js → chunk-L4PFRXIK.js} +231 -28
  4. package/dist/chunk-L4PFRXIK.js.map +1 -0
  5. package/dist/generator.cjs +161 -18
  6. package/dist/generator.cjs.map +1 -1
  7. package/dist/generator.d.cts +24 -0
  8. package/dist/generator.d.ts +24 -0
  9. package/dist/generator.js +140 -13
  10. package/dist/generator.js.map +1 -1
  11. package/dist/index.cjs +233 -25
  12. package/dist/index.cjs.map +1 -1
  13. package/dist/index.d.cts +258 -7
  14. package/dist/index.d.ts +258 -7
  15. package/dist/index.js +1 -1
  16. package/dist/{navigation-CGqFIPlP.d.cts → navigation-DvgyWSZ4.d.cts} +22 -1
  17. package/dist/{navigation-CGqFIPlP.d.ts → navigation-DvgyWSZ4.d.ts} +22 -1
  18. package/dist/ui/api-try-it.cjs +19 -1
  19. package/dist/ui/api-try-it.cjs.map +1 -1
  20. package/dist/ui/api-try-it.d.cts +4 -2
  21. package/dist/ui/api-try-it.d.ts +4 -2
  22. package/dist/ui/api-try-it.js +5 -2
  23. package/dist/ui/api-try-it.js.map +1 -1
  24. package/dist/ui/ask-ai.cjs +26 -6
  25. package/dist/ui/ask-ai.cjs.map +1 -1
  26. package/dist/ui/ask-ai.d.cts +6 -1
  27. package/dist/ui/ask-ai.d.ts +6 -1
  28. package/dist/ui/ask-ai.js +26 -6
  29. package/dist/ui/ask-ai.js.map +1 -1
  30. package/dist/ui/copy-page.cjs +15 -0
  31. package/dist/ui/copy-page.cjs.map +1 -1
  32. package/dist/ui/copy-page.js +1 -1
  33. package/dist/ui.cjs +77 -6
  34. package/dist/ui.cjs.map +1 -1
  35. package/dist/ui.d.cts +99 -8
  36. package/dist/ui.d.ts +99 -8
  37. package/dist/ui.js +62 -8
  38. package/dist/ui.js.map +1 -1
  39. package/package.json +1 -1
  40. package/skills/SKILL.md +68 -27
  41. package/styles/api-reference.css +45 -2
  42. package/styles/ask-ai.css +28 -0
  43. package/styles/docs.css +96 -1
  44. package/styles/home.css +34 -1
  45. package/dist/chunk-ZKOOKLZ3.js.map +0 -1
  46. package/dist/chunk-ZWDLAW5M.js.map +0 -1
package/dist/ui.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ui/accordion.tsx","../src/ui/api-layout.tsx","../src/ui/api-sidebar.tsx","../src/ui/auth-screen.tsx","../src/ui/callout.tsx","../src/ui/card.tsx","../src/ui/docs-icons.tsx","../src/ui/nav-links.ts","../src/ui/error-screen.tsx","../src/ui/steps.tsx","../src/ui/mdx.tsx","../src/ui/sidebar.tsx"],"names":["jsxs","jsx","Fragment"],"mappings":"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","file":"ui.js","sourcesContent":["import type { ReactNode } from 'react';\n\n/**\n * Accordion components — the Mintlify `<Accordion>` and `<AccordionGroup>`.\n * Built on the native `<details>` element, so they are interactive with zero\n * client JavaScript and render in a Server Component. The hairline uses the\n * framework's border token, so it follows the site's palette and the dark theme.\n *\n * @packageDocumentation\n */\n\n/**\n * A single collapsible section.\n *\n * @public\n */\nexport function Accordion({ title, children }: { title: string; children?: ReactNode }) {\n return (\n <details\n style={{\n border: '1px solid var(--color-fd-border)',\n borderRadius: 8,\n padding: '10px 14px',\n margin: '8px 0',\n }}\n >\n <summary style={{ cursor: 'pointer', fontWeight: 600 }}>{title}</summary>\n <div style={{ marginTop: 8 }}>{children}</div>\n </details>\n );\n}\n\n/**\n * A group of accordions.\n *\n * @public\n */\nexport function AccordionGroup({ children }: { children?: ReactNode }) {\n return <div style={{ margin: '16px 0' }}>{children}</div>;\n}\n","import { cloneElement, isValidElement, type ReactElement, type ReactNode } from 'react';\n\n/**\n * The Mintlify-style API operation layout: one two-column row for the whole\n * operation, so the code rail starts level with the endpoint title. Pass it to\n * fumadocs-openapi — the slots type is structural, so this module needs no\n * fumadocs dependency and the site keeps ownership of that package.\n *\n * @example\n * ```tsx\n * export const APIPage = createOpenAPIPage({\n * content: { renderOperationLayout: apiOperationLayout },\n * });\n * ```\n *\n * @packageDocumentation\n */\n\n/**\n * The slots fumadocs-openapi hands to `renderOperationLayout`.\n *\n * @public\n */\nexport interface ApiOperationSlots {\n readonly header: ReactNode;\n readonly description: ReactNode;\n readonly apiPlayground: ReactNode;\n readonly authSchemes: ReactNode;\n readonly parameters: ReactNode;\n readonly body: ReactNode;\n readonly responses: ReactNode;\n readonly callbacks: ReactNode;\n readonly apiExample: ReactNode;\n}\n\n/**\n * Render an API operation as title → description → playground → request details\n * on the left, with the code/response rail as the right column. Pair with\n * `@blaaiz/docs-core/styles/api-reference.css`, which anchors the rail to the\n * viewport.\n *\n * @param slots - the operation slots from fumadocs-openapi\n * @returns the two-column operation layout\n * @public\n */\nexport function apiOperationLayout(slots: ApiOperationSlots): ReactNode {\n // When the playground is our ApiTryIt (it declares `acceptsExample`), hand it\n // the code/response column so its modal can show form and sample side by side.\n let playground = slots.apiPlayground;\n if (\n isValidElement(playground) &&\n (playground.type as { acceptsExample?: boolean }).acceptsExample === true\n ) {\n playground = cloneElement(playground as ReactElement<{ example?: ReactNode }>, {\n example: slots.apiExample,\n });\n }\n\n return (\n <div className=\"flex flex-col gap-x-6 gap-y-4 @4xl:flex-row @4xl:items-start\">\n <div className=\"min-w-0 flex-1\">\n {slots.header}\n {slots.description}\n {playground}\n {slots.authSchemes}\n {slots.parameters}\n {slots.body}\n {slots.responses}\n {slots.callbacks}\n </div>\n <div className=\"@4xl:sticky @4xl:top-[calc(var(--fd-docs-row-1,2rem)+1rem)] @4xl:w-[400px]\">\n {slots.apiExample}\n </div>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\n/**\n * Sidebar helpers for the API reference: a coloured HTTP-method badge and a\n * page-tree transformer that prefixes each API page's sidebar entry with it —\n * the Mintlify look (POST · GET · … next to the endpoint name). Server-\n * compatible; styled by `styles/api-reference.css`.\n *\n * @packageDocumentation\n */\n\n/**\n * A coloured HTTP-method pill (GET, POST, …).\n *\n * @param props - the HTTP method\n * @public\n */\nexport function MethodBadge({ method }: { method: string }) {\n const upper = method.toUpperCase();\n return (\n <span className=\"api-method-badge\" data-method={method.toLowerCase()}>\n {upper}\n </span>\n );\n}\n\n/**\n * The minimal page-tree item this transformer touches. Structural, so the\n * framework needs no fumadocs types; a site passes the result straight into\n * `loader({ pageTree: { transformers } })`.\n *\n * @public\n */\nexport interface SidebarItem {\n readonly type?: string;\n readonly url?: string;\n name?: ReactNode;\n}\n\n/**\n * A page-tree transformer with a `file` hook, generic over the tree's own item\n * type so it slots into fumadocs' `loader({ pageTree: { transformers } })`\n * without a cast: `file` returns exactly the item type it was given.\n *\n * @public\n */\nexport interface SidebarBadgeTransformer {\n file<T extends SidebarItem>(node: T): T;\n}\n\n/**\n * A page-tree transformer that prefixes every API page's sidebar entry with its\n * HTTP-method badge, matching endpoint URLs against the `methods` map the\n * generator emits (`content/api-methods.json`).\n *\n * @example\n * ```ts\n * import methods from '@/content/api-methods.json';\n * loader({ pageTree: { transformers: [apiMethodBadges(methods)] } });\n * ```\n *\n * @param methods - map of page URL to HTTP method\n * @returns a transformer with a `file` hook\n * @public\n */\nexport function apiMethodBadges(\n methods: Readonly<Record<string, string>>,\n): SidebarBadgeTransformer {\n return {\n file<T extends SidebarItem>(node: T): T {\n const method = node.url ? methods[node.url] : undefined;\n if (!method) {\n return node;\n }\n // Only `name` is rewritten; every other field is carried through, so the\n // item keeps its original type.\n return {\n ...node,\n name: (\n <span key={node.url} className=\"api-nav-item\">\n <MethodBadge method={method} />\n <span className=\"api-nav-text\">{node.name}</span>\n </span>\n ),\n };\n },\n };\n}\n","/**\n * The sign-in screen for a workspace-gated docs site.\n *\n * A site renders one element — `<AuthScreen config={config} .../>` — and gets\n * the whole gate: brand, the allowed-domain note, the providers its config\n * declares (email, shared secret, Google), and an inline error banner. The\n * shared-secret provider is a two-step flow — email, then secret — rendered by\n * the `step` prop. The framework owns the layout and copy; the site owns only\n * its config. Server-rendered: every form is a native POST, no client JS.\n *\n * @packageDocumentation\n */\n\nimport type { ReactNode } from 'react';\n\nimport type { DocsConfig } from '../core/config.js';\n\nimport { strokeIcon } from './icons.js';\n\n/**\n * Map a sign-in error code (carried on `?error=` after a failed attempt) to a\n * human sentence. Unknown codes get a safe generic message.\n *\n * @param code - the error code, or undefined\n * @param domains - the allowed email domains, for the domain-mismatch message\n * @returns the message to show, or null when there is no error\n * @public\n */\nexport function authErrorMessage(\n code: string | undefined,\n domains: readonly string[],\n): string | null {\n if (!code) {\n return null;\n }\n const list = domains.join(', ');\n switch (code) {\n case 'forbidden':\n case 'domain':\n return list\n ? `That email isn't on an allowed domain. Sign in with your ${list} account.`\n : `That account isn't allowed to access these docs.`;\n case 'oauth':\n case 'state':\n return `Google sign-in didn't complete. Please try again.`;\n case 'badsecret':\n return `That secret is incorrect. Please try again.`;\n case 'expired':\n return `Your session expired. Sign in again to continue.`;\n case 'config':\n return `Sign-in isn't configured for this site. Contact the site owner.`;\n default:\n return `Something went wrong signing in. Please try again.`;\n }\n}\n\n/**\n * Props for {@link AuthScreen}.\n *\n * @public\n */\nexport interface AuthScreenProps {\n /** The site configuration; drives brand, providers, and allowed domains. */\n readonly config: DocsConfig;\n /** The path to return to after sign-in (from the gate's `?from=`). */\n readonly from?: string;\n /** A sign-in error code to surface inline (from `?error=`). */\n readonly error?: string;\n /**\n * Which step of the shared-secret flow to render. `'email'` (default) shows\n * the email field; `'secret'` shows the secret field for the already-validated\n * {@link AuthScreenProps.email}. Ignored unless the secret provider is enabled.\n */\n readonly step?: 'email' | 'secret';\n /** The domain-checked email to show on the secret step (from the site's cookie). */\n readonly email?: string;\n /**\n * Whether to offer the shared-secret flow. Defaults to whether config declares\n * the secret provider; pass `false` when its env secret is absent. When on, it\n * supersedes plain email sign-in.\n */\n readonly secretEnabled?: boolean;\n /**\n * Whether to offer the Google button. Defaults to whether config declares the\n * Google provider; pass `false` to hide it when its env vars are absent.\n */\n readonly googleEnabled?: boolean;\n /** The email sign-in endpoint. Default `/api/auth/email`. */\n readonly emailAction?: string;\n /** The shared-secret sign-in endpoint (both steps post here). Default `/api/auth/secret`. */\n readonly secretAction?: string;\n /** The Google sign-in start path. Default `/api/auth/google/start`. */\n readonly googleStartPath?: string;\n /** The sign-in page path, for the \"use a different email\" link. Default `/signin`. */\n readonly signInPath?: string;\n}\n\nfunction mailIcon(): ReactNode {\n return strokeIcon('mail');\n}\n\nfunction lockIcon(): ReactNode {\n return strokeIcon('lock');\n}\n\nfunction alertIcon(): ReactNode {\n return strokeIcon('info');\n}\n\nfunction keyIcon(): ReactNode {\n return strokeIcon('key');\n}\n\nfunction userIcon(): ReactNode {\n return strokeIcon('user');\n}\n\n/** Google's multicolour \"G\" mark. */\nfunction googleIcon(): ReactNode {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path\n fill=\"#4285F4\"\n d=\"M23.52 12.27c0-.82-.07-1.6-.2-2.36H12v4.46h6.47a5.53 5.53 0 0 1-2.4 3.63v3.02h3.88c2.27-2.09 3.57-5.17 3.57-8.75z\"\n />\n <path\n fill=\"#34A853\"\n d=\"M12 24c3.24 0 5.96-1.08 7.95-2.91l-3.88-3.02c-1.08.72-2.45 1.16-4.07 1.16-3.13 0-5.78-2.11-6.73-4.96H1.29v3.12A12 12 0 0 0 12 24z\"\n />\n <path\n fill=\"#FBBC05\"\n d=\"M5.27 14.27a7.2 7.2 0 0 1 0-4.54V6.61H1.29a12 12 0 0 0 0 10.78l3.98-3.12z\"\n />\n <path\n fill=\"#EA4335\"\n d=\"M12 4.75c1.77 0 3.35.61 4.6 1.8l3.44-3.44A11.5 11.5 0 0 0 12 0 12 12 0 0 0 1.29 6.61l3.98 3.12C6.22 6.86 8.87 4.75 12 4.75z\"\n />\n </svg>\n );\n}\n\n/**\n * Render the sign-in screen.\n *\n * @param props - see {@link AuthScreenProps}\n * @public\n */\nexport function AuthScreen(props: AuthScreenProps): ReactNode {\n const { config, from, error } = props;\n const auth = config.auth;\n const workspace = auth === 'public' ? null : auth;\n const domains = workspace?.allowedDomains ?? [];\n const target = from ?? '/';\n const emailAction = props.emailAction ?? '/api/auth/email';\n const secretAction = props.secretAction ?? '/api/auth/secret';\n const googleStartPath = props.googleStartPath ?? '/api/auth/google/start';\n const signInPath = props.signInPath ?? '/signin';\n\n const secretEnabled = props.secretEnabled ?? Boolean(workspace?.providers.secret);\n const emailProvider = workspace?.providers.email ?? false;\n // The secret flow supersedes plain email sign-in: offering email-only too\n // would let a reader skip the secret.\n const hasEmailFlow = secretEnabled || emailProvider;\n const showGoogle = props.googleEnabled ?? Boolean(workspace?.providers.google);\n const message = authErrorMessage(error, domains);\n const logo = config.theme.logo;\n\n // The secret step: only when the flow is enabled and we hold a validated email.\n const onSecretStep = props.step === 'secret' && secretEnabled && Boolean(props.email);\n\n const brand = (\n <div className=\"auth-brand\">\n {logo ? (\n <>\n <img className=\"auth-logo-light\" src={logo.light} alt={config.theme.name} />\n <img className=\"auth-logo-dark\" src={logo.dark} alt={config.theme.name} />\n </>\n ) : (\n <>\n <span className=\"auth-dot\" aria-hidden=\"true\" />\n {config.theme.name}\n </>\n )}\n </div>\n );\n\n const errorBanner = message ? (\n <div className=\"auth-error\" role=\"alert\">\n {alertIcon()}\n <span>{message}</span>\n </div>\n ) : null;\n\n if (onSecretStep) {\n return (\n <div className=\"auth-screen\">\n <div className=\"auth-ambient\" aria-hidden=\"true\" />\n <main className=\"auth-card\">\n {brand}\n <h1 className=\"auth-title\">Enter access secret</h1>\n <p className=\"auth-sub\">One more step — enter the shared secret to continue.</p>\n\n <div className=\"auth-identity\">\n {userIcon()}\n <span className=\"auth-identity-email\">{props.email}</span>\n <a className=\"auth-change\" href={signInPath}>\n Change\n </a>\n </div>\n\n {errorBanner}\n\n <form className=\"auth-form\" action={secretAction} method=\"post\">\n <input type=\"hidden\" name=\"from\" value={target} />\n <label className=\"auth-label\" htmlFor=\"auth-secret\">\n Access secret\n </label>\n <div className=\"auth-field\">\n {keyIcon()}\n <input\n id=\"auth-secret\"\n name=\"secret\"\n type=\"password\"\n required\n autoFocus\n autoComplete=\"off\"\n placeholder=\"Enter the access secret\"\n className=\"auth-input\"\n />\n </div>\n <button type=\"submit\" className=\"auth-submit\">\n Sign in\n </button>\n </form>\n\n <p className=\"auth-foot\">\n {lockIcon()}\n Access is limited to your workspace.\n </p>\n </main>\n </div>\n );\n }\n\n return (\n <div className=\"auth-screen\">\n <div className=\"auth-ambient\" aria-hidden=\"true\" />\n <main className=\"auth-card\">\n {brand}\n <h1 className=\"auth-title\">Sign in</h1>\n <p className=\"auth-sub\">\n {domains.length ? (\n <>\n These docs are restricted to <b>{domains.join(', ')}</b> accounts.\n </>\n ) : (\n 'These docs are restricted to your workspace.'\n )}\n </p>\n\n {errorBanner}\n\n {hasEmailFlow ? (\n <form\n className=\"auth-form\"\n action={secretEnabled ? secretAction : emailAction}\n method=\"post\"\n >\n <input type=\"hidden\" name=\"from\" value={target} />\n <label className=\"auth-label\" htmlFor=\"auth-email\">\n Work email\n </label>\n <div className=\"auth-field\">\n {mailIcon()}\n <input\n id=\"auth-email\"\n name=\"email\"\n type=\"email\"\n required\n autoComplete=\"email\"\n autoFocus\n placeholder={`you@${domains[0] ?? 'company.com'}`}\n className=\"auth-input\"\n />\n </div>\n <button type=\"submit\" className=\"auth-submit\">\n {secretEnabled ? 'Continue' : 'Continue with email'}\n </button>\n </form>\n ) : null}\n\n {hasEmailFlow && showGoogle ? <div className=\"auth-divider\">or</div> : null}\n\n {showGoogle ? (\n <a className=\"auth-google\" href={`${googleStartPath}?from=${encodeURIComponent(target)}`}>\n {googleIcon()}\n Continue with Google\n </a>\n ) : null}\n\n <p className=\"auth-foot\">\n {lockIcon()}\n Access is limited to your workspace.\n </p>\n </main>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\nimport { type GlyphName, strokeIcon } from './icons.js';\n\n/**\n * Callout components — the Mintlify `<Note>`, `<Warning>`, `<Info>`, and `<Tip>`\n * blocks. Server-compatible: no client state, so they render in a React Server\n * Component without a `'use client'` boundary.\n *\n * The box is styled by the `.cl` classes in `@blaaiz/docs-core/styles/docs.css`,\n * which a site already imports. That is what makes a callout follow the dark\n * theme: the class set carries a light and a dark palette per tone, where the\n * inline colours these components used before could only ever be light.\n *\n * @packageDocumentation\n */\n\ntype Tone = 'note' | 'warning' | 'info' | 'tip';\n\n/** The glyph each tone shows: a circled `i`, a bulb for a tip, a triangle to warn. */\nconst TONE_GLYPHS: Record<Tone, GlyphName> = {\n note: 'info',\n info: 'info',\n tip: 'bulb',\n warning: 'alert',\n};\n\n/**\n * A tinted callout box with the tone's icon.\n *\n * @public\n */\nexport function Callout({ tone = 'note', children }: { tone?: Tone; children?: ReactNode }) {\n return (\n <div className={`cl cl-${tone}`}>\n <span className=\"cl-icon\">{strokeIcon(TONE_GLYPHS[tone], { size: 18, rounded: true })}</span>\n <div className=\"cl-body\">{children}</div>\n </div>\n );\n}\n\n/** Mintlify `<Note>`. @public */\nexport function Note({ children }: { children?: ReactNode }) {\n return <Callout tone=\"note\">{children}</Callout>;\n}\n\n/** Mintlify `<Warning>`. @public */\nexport function Warning({ children }: { children?: ReactNode }) {\n return <Callout tone=\"warning\">{children}</Callout>;\n}\n\n/** Mintlify `<Info>`. @public */\nexport function Info({ children }: { children?: ReactNode }) {\n return <Callout tone=\"info\">{children}</Callout>;\n}\n\n/** Mintlify `<Tip>`. @public */\nexport function Tip({ children }: { children?: ReactNode }) {\n return <Callout tone=\"tip\">{children}</Callout>;\n}\n","import type { CSSProperties, ReactNode } from 'react';\n\n/**\n * Card components — the Mintlify `<Card>` and `<CardGroup>`. Server-compatible.\n *\n * Colours come from the framework's `--color-fd-*` theme variables, so a card\n * follows the site's palette and the dark theme. Nothing here is a fixed hue.\n *\n * @packageDocumentation\n */\n\n/**\n * A card. When `href` is set it renders as a link.\n *\n * @public\n */\nexport function Card({\n title,\n href,\n children,\n}: {\n title?: string;\n href?: string;\n children?: ReactNode;\n}) {\n const style: CSSProperties = {\n display: 'block',\n border: '1px solid var(--color-fd-border)',\n borderRadius: 12,\n padding: '16px 18px',\n textDecoration: 'none',\n color: 'inherit',\n background: 'var(--color-fd-card)',\n };\n const body = (\n <>\n {title !== undefined && (\n <div style={{ fontWeight: 700, fontSize: 15, marginBottom: 4 }}>{title}</div>\n )}\n <div style={{ color: 'var(--color-fd-muted-foreground)', fontSize: 14 }}>{children}</div>\n </>\n );\n if (href !== undefined) {\n return (\n <a href={href} style={style}>\n {body}\n </a>\n );\n }\n return <div style={style}>{body}</div>;\n}\n\n/**\n * A responsive grid of cards. `cols` sets the column count (default 2).\n *\n * @public\n */\nexport function CardGroup({ cols = 2, children }: { cols?: number; children?: ReactNode }) {\n const style: CSSProperties = {\n display: 'grid',\n gridTemplateColumns: `repeat(${String(cols)}, minmax(0, 1fr))`,\n gap: 12,\n margin: '16px 0',\n };\n return <div style={style}>{children}</div>;\n}\n","import type { ReactNode } from 'react';\n\n/**\n * Inline-SVG icon resolver for navigation icons named in `docs.json` (Mintlify\n * uses icon names like `house`, `book`, `code`). Zero dependency: a curated set\n * of common docs-nav icons plus a graceful no-icon fallback. Pass it to\n * `loader({ icon: docsIcon })`.\n *\n * @packageDocumentation\n */\n\nimport { type GlyphName, strokeIcon } from './icons.js';\n\n/** The glyphs a docs navigation reaches for, keyed by the names authors write. */\nconst ICONS: Record<string, GlyphName> = {\n house: 'house',\n book: 'book',\n code: 'code',\n rocket: 'rocket',\n terminal: 'terminal',\n wallet: 'wallet',\n key: 'key',\n webhook: 'webhook',\n globe: 'globe',\n};\n\n// Aliases point several common spellings at one glyph.\nconst ALIASES: Record<string, string> = {\n home: 'house',\n 'book-open': 'book',\n api: 'code',\n reference: 'code',\n terminal: 'terminal',\n bank: 'wallet',\n 'credit-card': 'wallet',\n auth: 'key',\n lock: 'key',\n world: 'globe',\n};\n\n/**\n * Resolve a `docs.json` icon name to an inline SVG. Unknown names resolve to\n * nothing, so the sidebar simply shows no icon rather than a broken one.\n *\n * @param name - the icon name from `docs.json`, or undefined\n * @returns the icon element, or undefined\n * @public\n */\nexport function docsIcon(name: string | undefined): ReactNode {\n if (!name) {\n return undefined;\n }\n const key = name.toLowerCase();\n const glyph = ICONS[key] ?? ICONS[ALIASES[key] ?? ''];\n // The key matters: fumadocs renders a nav link as the array [icon, text], and\n // an unkeyed element in that array raises React's \"unique key\" warning in the\n // consuming site's console.\n return glyph === undefined\n ? undefined\n : strokeIcon(glyph, { size: 16, rounded: true, key: `docs-icon-${glyph}` });\n}\n","/**\n * Top-navigation links from `nav.json`.\n *\n * Every site renders the same top bar in two layouts — the landing's\n * `HomeLayout` and the docs' `DocsLayout` — and the mapping carries policy\n * that must not drift per site: Home points at the landing and matches it\n * exactly, a link to the docs root matches only the docs root (never\n * everything nested under it), and section links match their subtree. This\n * module owns that policy; a site's layout is one call.\n *\n * @packageDocumentation\n */\n\nimport type { ReactNode } from 'react';\n\nimport { docsIcon } from './docs-icons.js';\n\n/**\n * One entry of `content/nav.json`.\n *\n * @public\n */\nexport interface NavJsonLink {\n readonly text: string;\n readonly url: string;\n readonly icon?: string;\n}\n\n/**\n * A rendered top-navigation link, structurally assignable to a fumadocs\n * `LinkItemType`.\n *\n * @public\n */\nexport interface DocsNavLink {\n readonly text: string;\n readonly url: string;\n readonly icon: ReactNode;\n readonly active: 'url' | 'nested-url';\n /**\n * The path this link is active for. Equal to `url` for Home and the docs\n * root; the section prefix for a section link, so the link stays active on\n * every page of its section — not only under its click target. Plain\n * fumadocs link items cannot express this split; a site component that\n * compares the pathname against `match` can.\n */\n readonly match: string;\n}\n\n/**\n * Options for {@link docsNavLinks}.\n *\n * @public\n */\nexport interface DocsNavLinksOptions {\n /**\n * The Home entry prepended before the `nav.json` links, pointing at the\n * landing. Pass `false` on a site with no landing page.\n */\n readonly home?: NavJsonLink | false;\n /** The docs base URL, whose link matches exactly rather than nested. */\n readonly baseUrl?: string;\n}\n\n/**\n * Map `nav.json` entries to top-navigation links for `HomeLayout` and\n * `DocsLayout`.\n *\n * @param links - the parsed `content/nav.json`\n * @param options - the Home entry and the docs base URL\n * @returns links with icons resolved and active-matching applied\n * @public\n */\nexport function docsNavLinks(\n links: readonly NavJsonLink[],\n options: DocsNavLinksOptions = {},\n): readonly DocsNavLink[] {\n const baseUrl = options.baseUrl ?? '/docs';\n const home = options.home ?? { text: 'Home', url: '/', icon: 'house' };\n return [\n ...(home === false ? [] : [home]),\n ...links.filter((link) => home === false || link.url !== home.url),\n ].map((link) => {\n const exact = link.url === baseUrl || link.url === (home === false ? '' : home.url);\n return {\n text: link.text,\n url: link.url,\n icon: docsIcon(link.icon),\n active: exact ? ('url' as const) : ('nested-url' as const),\n match: exact ? link.url : sectionPrefix(link.url, baseUrl),\n };\n });\n}\n\n/**\n * The section a docs URL belongs to: its first path segment under `baseUrl`.\n * A URL outside `baseUrl` is its own section.\n */\nfunction sectionPrefix(url: string, baseUrl: string): string {\n if (!url.startsWith(`${baseUrl}/`)) {\n return url;\n }\n const segment = url.slice(baseUrl.length + 1).split('/')[0] ?? '';\n return segment === '' ? url : `${baseUrl}/${segment}`;\n}\n\n/**\n * Whether a link is active for the current pathname: exact links match only\n * themselves; section links match their whole section.\n *\n * @public\n */\nexport function isDocsNavLinkActive(link: DocsNavLink, pathname: string): boolean {\n if (link.active === 'url') {\n return pathname === link.match;\n }\n return pathname === link.match || pathname.startsWith(`${link.match}/`);\n}\n","/**\n * A general error screen with per-kind states.\n *\n * One component covers every full-page error a docs site shows — a missing page\n * (404), a forbidden account (403), a runtime failure (500), an offline state —\n * each with its own icon, eyebrow, and default copy. A site picks the `kind`\n * and, for runtime errors, passes a retry action; the framework owns the rest.\n * Server-compatible: the site's `error.tsx` wrapper carries the `'use client'`\n * boundary and hands in the retry button.\n *\n * @packageDocumentation\n */\n\nimport type { ReactNode } from 'react';\n\nimport { type GlyphName, strokeIcon } from './icons.js';\n\n/**\n * The error states the screen renders.\n *\n * @public\n */\nexport type ErrorKind = 'not-found' | 'forbidden' | 'server' | 'offline' | 'unknown';\n\n/**\n * The default eyebrow, title, description, and icon for a {@link ErrorKind}.\n *\n * @public\n */\nexport interface ErrorPreset {\n readonly code: string;\n readonly title: string;\n readonly description: string;\n readonly icon: ReactNode;\n}\n\n/** The screens' icons are drawn a hair lighter than the rest of the UI. */\nfunction icon(name: GlyphName): ReactNode {\n return strokeIcon(name, { strokeWidth: 1.75 });\n}\n\nconst PRESETS: Record<ErrorKind, ErrorPreset> = {\n 'not-found': {\n code: '404',\n title: 'Page not found',\n description: \"The page you're looking for doesn't exist or may have moved.\",\n icon: icon('crossCircle'),\n },\n forbidden: {\n code: '403',\n title: 'Access restricted',\n description: 'Your account is not allowed to view this page. Sign in with an allowed account.',\n icon: icon('lock'),\n },\n server: {\n code: '500',\n title: 'Something went wrong',\n description: 'An unexpected error occurred on our side. Please try again in a moment.',\n icon: icon('alert'),\n },\n offline: {\n code: 'Offline',\n title: \"You're offline\",\n description: 'Check your connection and try again.',\n icon: icon('offline'),\n },\n unknown: {\n code: 'Error',\n title: 'Something went wrong',\n description: 'An unexpected error occurred. Please try again.',\n icon: icon('info'),\n },\n};\n\n/**\n * The default preset for an error kind — its icon, eyebrow, and copy.\n *\n * @param kind - the error state\n * @returns the preset a site can render or override\n * @public\n */\nexport function errorPreset(kind: ErrorKind): ErrorPreset {\n return PRESETS[kind];\n}\n\n/**\n * Props for {@link ErrorScreen}. Everything but `kind` is optional: the kind's\n * preset fills the eyebrow, title, description, and icon unless overridden.\n *\n * @public\n */\nexport interface ErrorScreenProps {\n /** Which error state to render. Default `unknown`. */\n readonly kind?: ErrorKind;\n /** Override the eyebrow code (e.g. a specific status). */\n readonly code?: string;\n /** Override the title. */\n readonly title?: string;\n /** Override the description. */\n readonly description?: string;\n /** When set, render a primary button linking here (e.g. `/docs`). */\n readonly homeHref?: string;\n /** Label for the home button. Default \"Back to docs\". */\n readonly homeLabel?: string;\n /** An extra action rendered beside the home button (e.g. a retry button). */\n readonly action?: ReactNode;\n}\n\nfunction homeIcon(): ReactNode {\n return strokeIcon('house');\n}\n\n/**\n * Render the error screen.\n *\n * @param props - see {@link ErrorScreenProps}\n * @public\n */\nexport function ErrorScreen(props: ErrorScreenProps): ReactNode {\n const kind = props.kind ?? 'unknown';\n const preset = PRESETS[kind];\n const code = props.code ?? preset.code;\n const title = props.title ?? preset.title;\n const description = props.description ?? preset.description;\n\n return (\n <div className=\"error-screen\">\n <div className=\"auth-ambient\" aria-hidden=\"true\" />\n <main className=\"error-card\">\n <div className=\"error-glyph\" data-kind={kind}>\n {preset.icon}\n </div>\n <p className=\"error-code\">{code}</p>\n <h1 className=\"error-title\">{title}</h1>\n <p className=\"error-desc\">{description}</p>\n {props.homeHref || props.action ? (\n <div className=\"error-actions\">\n {props.homeHref ? (\n <a className=\"error-btn error-btn-primary\" href={props.homeHref}>\n {homeIcon()}\n {props.homeLabel ?? 'Back to docs'}\n </a>\n ) : null}\n {props.action}\n </div>\n ) : null}\n </main>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\n/**\n * Steps components — the Mintlify `<Steps>` and `<Step>`. Server-compatible.\n *\n * The spine uses the framework's border token, so it follows the site's palette\n * and the dark theme.\n *\n * @packageDocumentation\n */\n\n/**\n * An ordered list of steps.\n *\n * @public\n */\nexport function Steps({ children }: { children?: ReactNode }) {\n return (\n <div\n style={{\n borderLeft: '2px solid var(--color-fd-border)',\n paddingLeft: 20,\n margin: '16px 0',\n display: 'flex',\n flexDirection: 'column',\n gap: 16,\n }}\n >\n {children}\n </div>\n );\n}\n\n/**\n * A single step with an optional title.\n *\n * @public\n */\nexport function Step({ title, children }: { title?: string; children?: ReactNode }) {\n return (\n <div>\n {title !== undefined && (\n <div style={{ fontWeight: 700, fontSize: 15, marginBottom: 4 }}>{title}</div>\n )}\n <div>{children}</div>\n </div>\n );\n}\n","import { Accordion, AccordionGroup } from './accordion.js';\nimport { Info, Note, Tip, Warning } from './callout.js';\nimport { Card, CardGroup } from './card.js';\nimport { Step, Steps } from './steps.js';\n\n/**\n * The Mintlify-compatible MDX component map.\n *\n * Pass this to an MDX renderer (for example `next-mdx-remote`'s `compileMDX`)\n * so real Mintlify guides render unchanged. A site no longer needs to shim\n * these itself.\n *\n * @public\n */\nexport const mdxComponents = {\n Note,\n Warning,\n Info,\n Tip,\n Card,\n CardGroup,\n Accordion,\n AccordionGroup,\n Steps,\n Step,\n};\n","import type { CSSProperties } from 'react';\n\nimport type { NavItem, NavPage, Navigation } from '../core/index.js';\n\n/**\n * The navigation sidebar. Renders a {@link Navigation} tree (produced by\n * `parseNavigation`) as tabs, groups, and page links. Framework-agnostic: it\n * emits plain anchors and takes an optional `resolveHref` so a site controls\n * its own routing. Server-compatible.\n *\n * @packageDocumentation\n */\n\n/**\n * Map a navigation page to a URL. Override to control routing — the default\n * assumes one specific site shape, which is why {@link DocsSidebar} is\n * deprecated.\n *\n * @public\n */\nexport type ResolveHref = (page: NavPage) => string;\n\nconst defaultResolveHref: ResolveHref = (page) => {\n if (page.kind === 'openapi') {\n return '/reference';\n }\n if (page.file === 'introduction') {\n return '/';\n }\n return `/${page.file}`;\n};\n\n/**\n * The method palette. The three status hues are the ones\n * `styles/api-reference.css` uses for its badges, so a method reads the same\n * colour everywhere; `POST` follows the site's own accent.\n */\nconst METHOD_COLORS: Record<string, string> = {\n GET: '#16a34a',\n POST: 'var(--color-fd-primary)',\n PUT: '#d97706',\n PATCH: '#d97706',\n DELETE: '#dc2626',\n};\n\nfunction labelForDoc(file: string): string {\n const last = file.split('/').pop() ?? file;\n return last.replace(/-/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\nfunction Items({\n items,\n depth,\n resolveHref,\n}: {\n items: readonly NavItem[];\n depth: number;\n resolveHref: ResolveHref;\n}) {\n const list: CSSProperties = { listStyle: 'none', margin: 0, paddingLeft: depth === 0 ? 0 : 12 };\n const groupLabel: CSSProperties = {\n fontSize: 11,\n fontWeight: 700,\n textTransform: 'uppercase',\n letterSpacing: '0.04em',\n color: 'var(--color-fd-muted-foreground)',\n margin: '6px 0',\n };\n const link: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '5px 8px',\n borderRadius: 6,\n color: 'var(--color-fd-foreground)',\n textDecoration: 'none',\n fontSize: 14,\n };\n return (\n <ul style={list}>\n {items.map((item, index) => {\n if (item.kind === 'group') {\n return (\n <li key={`g-${String(index)}`} style={{ marginTop: 10 }}>\n <div style={groupLabel}>{item.title}</div>\n <Items items={item.items} depth={depth + 1} resolveHref={resolveHref} />\n </li>\n );\n }\n return (\n <li key={`p-${String(index)}`}>\n <a href={resolveHref(item)} style={link}>\n {item.kind === 'openapi' && (\n <span\n style={{\n fontSize: 9,\n fontWeight: 700,\n color: METHOD_COLORS[item.method] ?? 'var(--color-fd-muted-foreground)',\n minWidth: 34,\n }}\n >\n {item.method}\n </span>\n )}\n <span>\n {item.kind === 'openapi'\n ? item.apiPath.replace(/^\\/api\\//, '')\n : labelForDoc(item.file)}\n </span>\n </a>\n </li>\n );\n })}\n </ul>\n );\n}\n\n/**\n * Render the documentation sidebar.\n *\n * @deprecated Use fumadocs' `DocsLayout` with `loader({ icon: docsIcon })`,\n * which both shipped sites use. This component predates that wiring: it renders\n * plain anchors with no active state, no collapsible groups, and no search, and\n * its default `resolveHref` assumes a routing shape (`/reference`, and\n * `introduction` at the root) that no site now uses. Pass your own\n * {@link ResolveHref} if you keep it. It stays exported, and behaves exactly as\n * before, until the next major version.\n *\n * @public\n */\nexport function DocsSidebar({\n nav,\n resolveHref = defaultResolveHref,\n}: {\n nav: Navigation;\n resolveHref?: ResolveHref;\n}) {\n return (\n <nav style={{ padding: '20px 16px' }}>\n {nav.map((tab, index) => (\n <div key={`t-${String(index)}`} style={{ marginBottom: 18 }}>\n <div\n style={{\n fontSize: 13,\n fontWeight: 800,\n color: 'var(--color-fd-foreground)',\n marginBottom: 4,\n }}\n >\n {tab.title}\n </div>\n <Items items={tab.items} depth={0} resolveHref={resolveHref} />\n </div>\n ))}\n </nav>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/ui/accordion.tsx","../src/ui/api-layout.tsx","../src/ui/api-sidebar.tsx","../src/ui/auth-screen.tsx","../src/ui/callout.tsx","../src/ui/card.tsx","../src/ui/docs-icons.tsx","../src/ui/nav-links.ts","../src/ui/layout-tabs.tsx","../src/ui/nav-actions.tsx","../src/ui/error-screen.tsx","../src/ui/steps.tsx","../src/ui/mdx.tsx","../src/ui/sidebar.tsx"],"names":["jsxs","jsx","Fragment","icon"],"mappings":"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","file":"ui.js","sourcesContent":["import type { ReactNode } from 'react';\n\n/**\n * Accordion components — the Mintlify `<Accordion>` and `<AccordionGroup>`.\n * Built on the native `<details>` element, so they are interactive with zero\n * client JavaScript and render in a Server Component. The hairline uses the\n * framework's border token, so it follows the site's palette and the dark theme.\n *\n * @packageDocumentation\n */\n\n/**\n * A single collapsible section.\n *\n * @public\n */\nexport function Accordion({ title, children }: { title: string; children?: ReactNode }) {\n return (\n <details\n style={{\n border: '1px solid var(--color-fd-border)',\n borderRadius: 8,\n padding: '10px 14px',\n margin: '8px 0',\n }}\n >\n <summary style={{ cursor: 'pointer', fontWeight: 600 }}>{title}</summary>\n <div style={{ marginTop: 8 }}>{children}</div>\n </details>\n );\n}\n\n/**\n * A group of accordions.\n *\n * @public\n */\nexport function AccordionGroup({ children }: { children?: ReactNode }) {\n return <div style={{ margin: '16px 0' }}>{children}</div>;\n}\n","import { cloneElement, isValidElement, type ReactElement, type ReactNode } from 'react';\n\n/**\n * The Mintlify-style API operation layout: one two-column row for the whole\n * operation, so the code rail starts level with the endpoint title. Pass it to\n * fumadocs-openapi — the slots type is structural, so this module needs no\n * fumadocs dependency and the site keeps ownership of that package.\n *\n * @example\n * ```tsx\n * export const APIPage = createOpenAPIPage({\n * content: { renderOperationLayout: apiOperationLayout },\n * });\n * ```\n *\n * @packageDocumentation\n */\n\n/**\n * The slots fumadocs-openapi hands to `renderOperationLayout`.\n *\n * @public\n */\nexport interface ApiOperationSlots {\n readonly header: ReactNode;\n readonly description: ReactNode;\n readonly apiPlayground: ReactNode;\n readonly authSchemes: ReactNode;\n readonly parameters: ReactNode;\n readonly body: ReactNode;\n readonly responses: ReactNode;\n readonly callbacks: ReactNode;\n readonly apiExample: ReactNode;\n}\n\n/**\n * Render an API operation as title → description → playground → request details\n * on the left, with the code/response rail as the right column. Pair with\n * `@blaaiz/docs-core/styles/api-reference.css`, which anchors the rail to the\n * viewport.\n *\n * @param slots - the operation slots from fumadocs-openapi\n * @returns the two-column operation layout\n * @public\n */\nexport function apiOperationLayout(slots: ApiOperationSlots): ReactNode {\n // When the playground is our ApiTryIt (it declares `acceptsExample`), hand it\n // the code/response column so its modal can show form and sample side by side.\n let playground = slots.apiPlayground;\n if (\n isValidElement(playground) &&\n (playground.type as { acceptsExample?: boolean }).acceptsExample === true\n ) {\n playground = cloneElement(playground as ReactElement<{ example?: ReactNode }>, {\n example: slots.apiExample,\n });\n }\n\n return (\n <div className=\"flex flex-col gap-x-6 gap-y-4 @4xl:flex-row @4xl:items-start\">\n <div className=\"min-w-0 flex-1\">\n {slots.header}\n {slots.description}\n {playground}\n {slots.authSchemes}\n {slots.parameters}\n {slots.body}\n {slots.responses}\n {slots.callbacks}\n </div>\n <div className=\"@4xl:sticky @4xl:top-[calc(var(--fd-docs-row-1,2rem)+1rem)] @4xl:w-[400px]\">\n {slots.apiExample}\n </div>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\n/**\n * Sidebar helpers for the API reference: a coloured HTTP-method badge and a\n * page-tree transformer that prefixes each API page's sidebar entry with it —\n * the Mintlify look (POST · GET · … next to the endpoint name). Server-\n * compatible; styled by `styles/api-reference.css`.\n *\n * @packageDocumentation\n */\n\n/**\n * A coloured HTTP-method pill (GET, POST, …).\n *\n * @param props - the HTTP method\n * @public\n */\nexport function MethodBadge({ method }: { method: string }) {\n const upper = method.toUpperCase();\n return (\n <span className=\"api-method-badge\" data-method={method.toLowerCase()}>\n {upper}\n </span>\n );\n}\n\n/**\n * The minimal page-tree item this transformer touches. Structural, so the\n * framework needs no fumadocs types; a site passes the result straight into\n * `loader({ pageTree: { transformers } })`.\n *\n * @public\n */\nexport interface SidebarItem {\n readonly type?: string;\n readonly url?: string;\n name?: ReactNode;\n}\n\n/**\n * A page-tree transformer with a `file` hook, generic over the tree's own item\n * type so it slots into fumadocs' `loader({ pageTree: { transformers } })`\n * without a cast: `file` returns exactly the item type it was given.\n *\n * @public\n */\nexport interface SidebarBadgeTransformer {\n file<T extends SidebarItem>(node: T): T;\n}\n\n/**\n * A page-tree transformer that prefixes every API page's sidebar entry with its\n * HTTP-method badge, matching endpoint URLs against the `methods` map the\n * generator emits (`content/api-methods.json`).\n *\n * @example\n * ```ts\n * import methods from '@/content/api-methods.json';\n * loader({ pageTree: { transformers: [apiMethodBadges(methods)] } });\n * ```\n *\n * @param methods - map of page URL to HTTP method\n * @returns a transformer with a `file` hook\n * @public\n */\nexport function apiMethodBadges(\n methods: Readonly<Record<string, string>>,\n): SidebarBadgeTransformer {\n return {\n file<T extends SidebarItem>(node: T): T {\n const method = node.url ? methods[node.url] : undefined;\n if (!method) {\n return node;\n }\n // Only `name` is rewritten; every other field is carried through, so the\n // item keeps its original type.\n return {\n ...node,\n name: (\n <span key={node.url} className=\"api-nav-item\">\n <MethodBadge method={method} />\n <span className=\"api-nav-text\">{node.name}</span>\n </span>\n ),\n };\n },\n };\n}\n","/**\n * The sign-in screen for a workspace-gated docs site.\n *\n * A site renders one element — `<AuthScreen config={config} .../>` — and gets\n * the whole gate: brand, the allowed-domain note, the providers its config\n * declares (email, shared secret, Google), and an inline error banner. The\n * shared-secret provider is a two-step flow — email, then secret — rendered by\n * the `step` prop. The framework owns the layout and copy; the site owns only\n * its config. Server-rendered: every form is a native POST, no client JS.\n *\n * @packageDocumentation\n */\n\nimport type { ReactNode } from 'react';\n\nimport type { DocsConfig } from '../core/config.js';\n\nimport { strokeIcon } from './icons.js';\n\n/**\n * Map a sign-in error code (carried on `?error=` after a failed attempt) to a\n * human sentence. Unknown codes get a safe generic message.\n *\n * @param code - the error code, or undefined\n * @param domains - the allowed email domains, for the domain-mismatch message\n * @returns the message to show, or null when there is no error\n * @public\n */\nexport function authErrorMessage(\n code: string | undefined,\n domains: readonly string[],\n): string | null {\n if (!code) {\n return null;\n }\n const list = domains.join(', ');\n switch (code) {\n case 'forbidden':\n case 'domain':\n return list\n ? `That email isn't on an allowed domain. Sign in with your ${list} account.`\n : `That account isn't allowed to access these docs.`;\n case 'oauth':\n case 'state':\n return `Google sign-in didn't complete. Please try again.`;\n case 'badsecret':\n return `That secret is incorrect. Please try again.`;\n case 'expired':\n return `Your session expired. Sign in again to continue.`;\n case 'config':\n return `Sign-in isn't configured for this site. Contact the site owner.`;\n default:\n return `Something went wrong signing in. Please try again.`;\n }\n}\n\n/**\n * Props for {@link AuthScreen}.\n *\n * @public\n */\nexport interface AuthScreenProps {\n /** The site configuration; drives brand, providers, and allowed domains. */\n readonly config: DocsConfig;\n /** The path to return to after sign-in (from the gate's `?from=`). */\n readonly from?: string;\n /** A sign-in error code to surface inline (from `?error=`). */\n readonly error?: string;\n /**\n * Which step of the shared-secret flow to render. `'email'` (default) shows\n * the email field; `'secret'` shows the secret field for the already-validated\n * {@link AuthScreenProps.email}. Ignored unless the secret provider is enabled.\n */\n readonly step?: 'email' | 'secret';\n /** The domain-checked email to show on the secret step (from the site's cookie). */\n readonly email?: string;\n /**\n * Whether to offer the shared-secret flow. Defaults to whether config declares\n * the secret provider; pass `false` when its env secret is absent. When on, it\n * supersedes plain email sign-in.\n */\n readonly secretEnabled?: boolean;\n /**\n * Whether to offer the Google button. Defaults to whether config declares the\n * Google provider; pass `false` to hide it when its env vars are absent.\n */\n readonly googleEnabled?: boolean;\n /** The email sign-in endpoint. Default `/api/auth/email`. */\n readonly emailAction?: string;\n /** The shared-secret sign-in endpoint (both steps post here). Default `/api/auth/secret`. */\n readonly secretAction?: string;\n /** The Google sign-in start path. Default `/api/auth/google/start`. */\n readonly googleStartPath?: string;\n /** The sign-in page path, for the \"use a different email\" link. Default `/signin`. */\n readonly signInPath?: string;\n}\n\nfunction mailIcon(): ReactNode {\n return strokeIcon('mail');\n}\n\nfunction lockIcon(): ReactNode {\n return strokeIcon('lock');\n}\n\nfunction alertIcon(): ReactNode {\n return strokeIcon('info');\n}\n\nfunction keyIcon(): ReactNode {\n return strokeIcon('key');\n}\n\nfunction userIcon(): ReactNode {\n return strokeIcon('user');\n}\n\n/** Google's multicolour \"G\" mark. */\nfunction googleIcon(): ReactNode {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path\n fill=\"#4285F4\"\n d=\"M23.52 12.27c0-.82-.07-1.6-.2-2.36H12v4.46h6.47a5.53 5.53 0 0 1-2.4 3.63v3.02h3.88c2.27-2.09 3.57-5.17 3.57-8.75z\"\n />\n <path\n fill=\"#34A853\"\n d=\"M12 24c3.24 0 5.96-1.08 7.95-2.91l-3.88-3.02c-1.08.72-2.45 1.16-4.07 1.16-3.13 0-5.78-2.11-6.73-4.96H1.29v3.12A12 12 0 0 0 12 24z\"\n />\n <path\n fill=\"#FBBC05\"\n d=\"M5.27 14.27a7.2 7.2 0 0 1 0-4.54V6.61H1.29a12 12 0 0 0 0 10.78l3.98-3.12z\"\n />\n <path\n fill=\"#EA4335\"\n d=\"M12 4.75c1.77 0 3.35.61 4.6 1.8l3.44-3.44A11.5 11.5 0 0 0 12 0 12 12 0 0 0 1.29 6.61l3.98 3.12C6.22 6.86 8.87 4.75 12 4.75z\"\n />\n </svg>\n );\n}\n\n/**\n * Render the sign-in screen.\n *\n * @param props - see {@link AuthScreenProps}\n * @public\n */\nexport function AuthScreen(props: AuthScreenProps): ReactNode {\n const { config, from, error } = props;\n const auth = config.auth;\n const workspace = auth === 'public' ? null : auth;\n const domains = workspace?.allowedDomains ?? [];\n const target = from ?? '/';\n const emailAction = props.emailAction ?? '/api/auth/email';\n const secretAction = props.secretAction ?? '/api/auth/secret';\n const googleStartPath = props.googleStartPath ?? '/api/auth/google/start';\n const signInPath = props.signInPath ?? '/signin';\n\n const secretEnabled = props.secretEnabled ?? Boolean(workspace?.providers.secret);\n const emailProvider = workspace?.providers.email ?? false;\n // The secret flow supersedes plain email sign-in: offering email-only too\n // would let a reader skip the secret.\n const hasEmailFlow = secretEnabled || emailProvider;\n const showGoogle = props.googleEnabled ?? Boolean(workspace?.providers.google);\n const message = authErrorMessage(error, domains);\n const logo = config.theme.logo;\n\n // The secret step: only when the flow is enabled and we hold a validated email.\n const onSecretStep = props.step === 'secret' && secretEnabled && Boolean(props.email);\n\n const brand = (\n <div className=\"auth-brand\">\n {logo ? (\n <>\n <img className=\"auth-logo-light\" src={logo.light} alt={config.theme.name} />\n <img className=\"auth-logo-dark\" src={logo.dark} alt={config.theme.name} />\n </>\n ) : (\n <>\n <span className=\"auth-dot\" aria-hidden=\"true\" />\n {config.theme.name}\n </>\n )}\n </div>\n );\n\n const errorBanner = message ? (\n <div className=\"auth-error\" role=\"alert\">\n {alertIcon()}\n <span>{message}</span>\n </div>\n ) : null;\n\n if (onSecretStep) {\n return (\n <div className=\"auth-screen\">\n <div className=\"auth-ambient\" aria-hidden=\"true\" />\n <main className=\"auth-card\">\n {brand}\n <h1 className=\"auth-title\">Enter access secret</h1>\n <p className=\"auth-sub\">One more step — enter the shared secret to continue.</p>\n\n <div className=\"auth-identity\">\n {userIcon()}\n <span className=\"auth-identity-email\">{props.email}</span>\n <a className=\"auth-change\" href={signInPath}>\n Change\n </a>\n </div>\n\n {errorBanner}\n\n <form className=\"auth-form\" action={secretAction} method=\"post\">\n <input type=\"hidden\" name=\"from\" value={target} />\n <label className=\"auth-label\" htmlFor=\"auth-secret\">\n Access secret\n </label>\n <div className=\"auth-field\">\n {keyIcon()}\n <input\n id=\"auth-secret\"\n name=\"secret\"\n type=\"password\"\n required\n autoFocus\n autoComplete=\"off\"\n placeholder=\"Enter the access secret\"\n className=\"auth-input\"\n />\n </div>\n <button type=\"submit\" className=\"auth-submit\">\n Sign in\n </button>\n </form>\n\n <p className=\"auth-foot\">\n {lockIcon()}\n Access is limited to your workspace.\n </p>\n </main>\n </div>\n );\n }\n\n return (\n <div className=\"auth-screen\">\n <div className=\"auth-ambient\" aria-hidden=\"true\" />\n <main className=\"auth-card\">\n {brand}\n <h1 className=\"auth-title\">Sign in</h1>\n <p className=\"auth-sub\">\n {domains.length ? (\n <>\n These docs are restricted to <b>{domains.join(', ')}</b> accounts.\n </>\n ) : (\n 'These docs are restricted to your workspace.'\n )}\n </p>\n\n {errorBanner}\n\n {hasEmailFlow ? (\n <form\n className=\"auth-form\"\n action={secretEnabled ? secretAction : emailAction}\n method=\"post\"\n >\n <input type=\"hidden\" name=\"from\" value={target} />\n <label className=\"auth-label\" htmlFor=\"auth-email\">\n Work email\n </label>\n <div className=\"auth-field\">\n {mailIcon()}\n <input\n id=\"auth-email\"\n name=\"email\"\n type=\"email\"\n required\n autoComplete=\"email\"\n autoFocus\n placeholder={`you@${domains[0] ?? 'company.com'}`}\n className=\"auth-input\"\n />\n </div>\n <button type=\"submit\" className=\"auth-submit\">\n {secretEnabled ? 'Continue' : 'Continue with email'}\n </button>\n </form>\n ) : null}\n\n {hasEmailFlow && showGoogle ? <div className=\"auth-divider\">or</div> : null}\n\n {showGoogle ? (\n <a className=\"auth-google\" href={`${googleStartPath}?from=${encodeURIComponent(target)}`}>\n {googleIcon()}\n Continue with Google\n </a>\n ) : null}\n\n <p className=\"auth-foot\">\n {lockIcon()}\n Access is limited to your workspace.\n </p>\n </main>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\nimport { type GlyphName, strokeIcon } from './icons.js';\n\n/**\n * Callout components — the Mintlify `<Note>`, `<Warning>`, `<Info>`, and `<Tip>`\n * blocks. Server-compatible: no client state, so they render in a React Server\n * Component without a `'use client'` boundary.\n *\n * The box is styled by the `.cl` classes in `@blaaiz/docs-core/styles/docs.css`,\n * which a site already imports. That is what makes a callout follow the dark\n * theme: the class set carries a light and a dark palette per tone, where the\n * inline colours these components used before could only ever be light.\n *\n * @packageDocumentation\n */\n\ntype Tone = 'note' | 'warning' | 'info' | 'tip';\n\n/** The glyph each tone shows: a circled `i`, a bulb for a tip, a triangle to warn. */\nconst TONE_GLYPHS: Record<Tone, GlyphName> = {\n note: 'info',\n info: 'info',\n tip: 'bulb',\n warning: 'alert',\n};\n\n/**\n * A tinted callout box with the tone's icon.\n *\n * @public\n */\nexport function Callout({ tone = 'note', children }: { tone?: Tone; children?: ReactNode }) {\n return (\n <div className={`cl cl-${tone}`}>\n <span className=\"cl-icon\">{strokeIcon(TONE_GLYPHS[tone], { size: 18, rounded: true })}</span>\n <div className=\"cl-body\">{children}</div>\n </div>\n );\n}\n\n/** Mintlify `<Note>`. @public */\nexport function Note({ children }: { children?: ReactNode }) {\n return <Callout tone=\"note\">{children}</Callout>;\n}\n\n/** Mintlify `<Warning>`. @public */\nexport function Warning({ children }: { children?: ReactNode }) {\n return <Callout tone=\"warning\">{children}</Callout>;\n}\n\n/** Mintlify `<Info>`. @public */\nexport function Info({ children }: { children?: ReactNode }) {\n return <Callout tone=\"info\">{children}</Callout>;\n}\n\n/** Mintlify `<Tip>`. @public */\nexport function Tip({ children }: { children?: ReactNode }) {\n return <Callout tone=\"tip\">{children}</Callout>;\n}\n","import type { CSSProperties, ReactNode } from 'react';\n\n/**\n * Card components — the Mintlify `<Card>` and `<CardGroup>`. Server-compatible.\n *\n * Colours come from the framework's `--color-fd-*` theme variables, so a card\n * follows the site's palette and the dark theme. Nothing here is a fixed hue.\n *\n * @packageDocumentation\n */\n\n/**\n * A card. When `href` is set it renders as a link.\n *\n * @public\n */\nexport function Card({\n title,\n href,\n children,\n}: {\n title?: string;\n href?: string;\n children?: ReactNode;\n}) {\n const style: CSSProperties = {\n display: 'block',\n border: '1px solid var(--color-fd-border)',\n borderRadius: 12,\n padding: '16px 18px',\n textDecoration: 'none',\n color: 'inherit',\n background: 'var(--color-fd-card)',\n };\n const body = (\n <>\n {title !== undefined && (\n <div style={{ fontWeight: 700, fontSize: 15, marginBottom: 4 }}>{title}</div>\n )}\n <div style={{ color: 'var(--color-fd-muted-foreground)', fontSize: 14 }}>{children}</div>\n </>\n );\n if (href !== undefined) {\n return (\n <a href={href} style={style}>\n {body}\n </a>\n );\n }\n return <div style={style}>{body}</div>;\n}\n\n/**\n * A responsive grid of cards. `cols` sets the column count (default 2).\n *\n * @public\n */\nexport function CardGroup({ cols = 2, children }: { cols?: number; children?: ReactNode }) {\n const style: CSSProperties = {\n display: 'grid',\n gridTemplateColumns: `repeat(${String(cols)}, minmax(0, 1fr))`,\n gap: 12,\n margin: '16px 0',\n };\n return <div style={style}>{children}</div>;\n}\n","import type { ReactNode } from 'react';\n\n/**\n * Inline-SVG icon resolver for navigation icons named in `docs.json` (Mintlify\n * uses icon names like `house`, `book`, `code`). Zero dependency: a curated set\n * of common docs-nav icons plus a graceful no-icon fallback. Pass it to\n * `loader({ icon: docsIcon })`.\n *\n * @packageDocumentation\n */\n\nimport { type GlyphName, strokeIcon } from './icons.js';\n\n/** The glyphs a docs navigation reaches for, keyed by the names authors write. */\nconst ICONS: Record<string, GlyphName> = {\n house: 'house',\n book: 'book',\n code: 'code',\n rocket: 'rocket',\n terminal: 'terminal',\n wallet: 'wallet',\n key: 'key',\n webhook: 'webhook',\n globe: 'globe',\n user: 'user',\n users: 'users',\n building: 'building',\n clock: 'clock',\n};\n\n// Aliases point several common spellings at one glyph.\nconst ALIASES: Record<string, string> = {\n home: 'house',\n 'book-open': 'book',\n api: 'code',\n reference: 'code',\n terminal: 'terminal',\n bank: 'wallet',\n 'credit-card': 'wallet',\n auth: 'key',\n lock: 'key',\n world: 'globe',\n people: 'users',\n team: 'users',\n 'building-2': 'building',\n office: 'building',\n company: 'building',\n history: 'clock',\n time: 'clock',\n};\n\n/**\n * Resolve a `docs.json` icon name to an inline SVG. Unknown names resolve to\n * nothing, so the sidebar simply shows no icon rather than a broken one.\n *\n * @param name - the icon name from `docs.json`, or undefined\n * @returns the icon element, or undefined\n * @public\n */\nexport function docsIcon(name: string | undefined): ReactNode {\n if (!name) {\n return undefined;\n }\n const key = name.toLowerCase();\n const glyph = ICONS[key] ?? ICONS[ALIASES[key] ?? ''];\n // The key matters: fumadocs renders a nav link as the array [icon, text], and\n // an unkeyed element in that array raises React's \"unique key\" warning in the\n // consuming site's console.\n return glyph === undefined\n ? undefined\n : strokeIcon(glyph, { size: 16, rounded: true, key: `docs-icon-${glyph}` });\n}\n","/**\n * Top-navigation links from `nav.json`.\n *\n * Every site renders the same top bar in two layouts — the landing's\n * `HomeLayout` and the docs' `DocsLayout` — and the mapping carries policy\n * that must not drift per site: Home points at the landing and matches it\n * exactly, a link to the docs root matches only the docs root (never\n * everything nested under it), and section links match their subtree. This\n * module owns that policy; a site's layout is one call.\n *\n * @packageDocumentation\n */\n\nimport type { ReactNode } from 'react';\n\nimport { docsIcon } from './docs-icons.js';\n\n/**\n * One entry of `content/nav.json`.\n *\n * @public\n */\nexport interface NavJsonLink {\n readonly text: string;\n readonly url: string;\n readonly icon?: string;\n /**\n * Path prefixes this link is active for, when the generator knows the\n * link's territory better than the URL shows — an API tab whose entry page\n * lives outside its generated folder. Omitted, the section is derived from\n * the URL. Ignored on the exact-match links (Home and the docs root).\n */\n readonly match?: string | readonly string[];\n}\n\n/**\n * A rendered top-navigation link, structurally assignable to a fumadocs\n * `LinkItemType`.\n *\n * @public\n */\nexport interface DocsNavLink {\n readonly text: string;\n readonly url: string;\n readonly icon: ReactNode;\n readonly active: 'url' | 'nested-url';\n /**\n * The path(s) this link is active for. Equal to `url` for Home and the docs\n * root; for a section link, the section prefixes — `nav.json`'s own `match`\n * when the generator emitted one, the URL-derived section otherwise — so the\n * link stays active on every page of its section, not only under its click\n * target. Plain fumadocs link items cannot express this split; a site\n * component that compares the pathname against `match` can.\n */\n readonly match: string | readonly string[];\n}\n\n/**\n * Options for {@link docsNavLinks}.\n *\n * @public\n */\nexport interface DocsNavLinksOptions {\n /**\n * The Home entry prepended before the `nav.json` links, pointing at the\n * landing. Pass `false` on a site with no landing page.\n */\n readonly home?: NavJsonLink | false;\n /** The docs base URL, whose link matches exactly rather than nested. */\n readonly baseUrl?: string;\n /**\n * Resolves an icon name from `docs.json` to an element. Defaults to the\n * framework's `docsIcon` set; pass your own to use any icon library the\n * site installs (return `undefined` for a text-only link). The default\n * Home entry resolves the name `house` through it.\n */\n readonly icon?: (name: string | undefined) => ReactNode;\n}\n\n/**\n * Map `nav.json` entries to top-navigation links for `HomeLayout` and\n * `DocsLayout`.\n *\n * @param links - the parsed `content/nav.json`\n * @param options - the Home entry and the docs base URL\n * @returns links with icons resolved and active-matching applied\n * @public\n */\nexport function docsNavLinks(\n links: readonly NavJsonLink[],\n options: DocsNavLinksOptions = {},\n): readonly DocsNavLink[] {\n const baseUrl = options.baseUrl ?? '/docs';\n const home = options.home ?? { text: 'Home', url: '/', icon: 'house' };\n const icon = options.icon ?? docsIcon;\n return [\n ...(home === false ? [] : [home]),\n ...links.filter((link) => home === false || link.url !== home.url),\n ].map((link) => {\n const exact = link.url === baseUrl || link.url === (home === false ? '' : home.url);\n return {\n text: link.text,\n url: link.url,\n icon: icon(link.icon),\n active: exact ? ('url' as const) : ('nested-url' as const),\n match: exact ? link.url : (providedMatch(link.match) ?? sectionPrefix(link.url, baseUrl)),\n };\n });\n}\n\n/**\n * A usable provided `match`: non-empty entries only, and `undefined` when\n * nothing usable remains — an empty prefix would match every pathname.\n */\nfunction providedMatch(\n match: string | readonly string[] | undefined,\n): string | readonly string[] | undefined {\n if (match === undefined) {\n return undefined;\n }\n const entries = (typeof match === 'string' ? [match] : match).filter((entry) => entry !== '');\n return entries.length === 0 ? undefined : entries;\n}\n\n/**\n * The section a docs URL belongs to: its first path segment under `baseUrl`.\n * A URL outside `baseUrl` is its own section.\n */\nfunction sectionPrefix(url: string, baseUrl: string): string {\n if (!url.startsWith(`${baseUrl}/`)) {\n return url;\n }\n const segment = url.slice(baseUrl.length + 1).split('/')[0] ?? '';\n return segment === '' ? url : `${baseUrl}/${segment}`;\n}\n\n/**\n * Whether a link is active for the current pathname: exact links match only\n * themselves; section links match their whole section.\n *\n * @public\n */\nexport function isDocsNavLinkActive(link: DocsNavLink, pathname: string): boolean {\n const matches = typeof link.match === 'string' ? [link.match] : link.match;\n if (link.active === 'url') {\n return matches.includes(pathname);\n }\n return matches.some((match) => pathname === match || pathname.startsWith(`${match}/`));\n}\n","import type { ReactNode } from 'react';\n\nimport type { DocsNavLinksOptions, NavJsonLink } from './nav-links.js';\nimport { docsNavLinks } from './nav-links.js';\n\n/**\n * The section links as fumadocs navbar tabs: the docs pages' second header\n * row. The notebook layout's navbar tabs render only `title` — a `LayoutTab`'s\n * `icon` field is silently dropped in that mode — so the icon is folded into\n * the title node here, once, instead of every site rediscovering it.\n *\n * A link whose territory is a page-tree folder binds that folder (`$folder`\n * activates the tab on the whole subtree); the rest match their exact URLs.\n *\n * @packageDocumentation\n */\n\n/**\n * One navbar tab, structurally assignable to a fumadocs `LayoutTab`.\n *\n * @public\n */\nexport interface DocsLayoutTab<Folder> {\n /** The tab's label: the link's icon and text. */\n readonly title: ReactNode;\n /** The tab's click target. */\n readonly url: string;\n /** The page-tree folder the tab activates on, when its territory is one. */\n readonly $folder?: Folder;\n /** The exact URLs the tab activates on, when it binds no folder. */\n readonly urls?: Set<string>;\n}\n\n/** The shape of a page-tree node this module reads: a folder's entry URL. */\ninterface TreeNodeShape {\n readonly type: string;\n readonly url?: string;\n readonly index?: { readonly url?: string };\n readonly children?: readonly { readonly type: string; readonly url?: string }[];\n}\n\n/**\n * Map `nav.json` entries to navbar tabs for `DocsLayout` with\n * `tabMode=\"navbar\"`.\n *\n * @param links - the parsed `content/nav.json`\n * @param tree - the site's page tree (`source.pageTree`)\n * @param options - the Home entry, docs base URL, and icon resolver\n * @returns tabs with icons in their titles and territories bound\n * @public\n */\nexport function docsLayoutTabs<Node extends { readonly type: string }>(\n links: readonly NavJsonLink[],\n tree: { readonly children: readonly Node[] },\n options: DocsNavLinksOptions = {},\n): DocsLayoutTab<Extract<Node, { readonly type: 'folder' }>>[] {\n type Folder = Extract<Node, { readonly type: 'folder' }>;\n const folders = tree.children.filter((node): node is Folder => node.type === 'folder');\n const entryUrl = (folder: Folder): string | undefined => {\n const shape = folder as TreeNodeShape;\n const first = shape.index ?? shape.children?.find((child) => child.type === 'page');\n return first?.url;\n };\n return docsNavLinks(links, options).map((link) => {\n const matches = typeof link.match === 'string' ? [link.match] : [...link.match];\n const prefix = matches[0] ?? link.url;\n const folder =\n link.active === 'nested-url'\n ? folders.find((candidate) => entryUrl(candidate)?.startsWith(`${prefix}/`))\n : undefined;\n return {\n title:\n link.icon === undefined ? (\n link.text\n ) : (\n <>\n {link.icon}\n {link.text}\n </>\n ),\n url: link.url,\n ...(folder ? { $folder: folder } : { urls: new Set([...matches, link.url]) }),\n };\n });\n}\n","import type { ReactNode } from 'react';\n\nimport type { NavbarConfig } from '../core/config.js';\n\n/**\n * The top bar's action cluster: the config's calls to action, and sign-out on\n * a workspace site. Server-compatible; sign-out is a native form post to the\n * site's sign-out route, so no client JavaScript is involved. Styled by\n * `styles/docs.css`.\n *\n * @packageDocumentation\n */\n\n/**\n * Props for {@link NavActions}.\n *\n * @public\n */\nexport interface NavActionsProps {\n /** The config's `navbar` block: the primary button and the secondary link. */\n readonly navbar?: NavbarConfig;\n /** Whether to offer sign-out (a workspace site). */\n readonly signOut?: boolean;\n /** The sign-out route. Default `/api/auth/signout`. */\n readonly signOutAction?: string;\n /** Leading extras, such as the Ask AI trigger. */\n readonly children?: ReactNode;\n}\n\n/**\n * The action cluster a site mounts at the end of its top bar: optional extras,\n * the secondary link, sign-out, and the primary button, in that order.\n *\n * @param props - the config's navbar block, the sign-out switch, and extras\n * @public\n */\nexport function NavActions({\n navbar,\n signOut = false,\n signOutAction = '/api/auth/signout',\n children,\n}: NavActionsProps) {\n return (\n <div className=\"nav-actions\">\n {children}\n {navbar?.secondary ? (\n <a className=\"nav-actions__secondary\" href={navbar.secondary.href}>\n {navbar.secondary.text}\n </a>\n ) : null}\n {signOut ? (\n <form method=\"post\" action={signOutAction}>\n <button type=\"submit\" className=\"nav-actions__signout\">\n Log out\n </button>\n </form>\n ) : null}\n {navbar?.primary ? (\n <a className=\"nav-actions__primary\" href={navbar.primary.href}>\n {navbar.primary.text}\n </a>\n ) : null}\n </div>\n );\n}\n","/**\n * A general error screen with per-kind states.\n *\n * One component covers every full-page error a docs site shows — a missing page\n * (404), a forbidden account (403), a runtime failure (500), an offline state —\n * each with its own icon, eyebrow, and default copy. A site picks the `kind`\n * and, for runtime errors, passes a retry action; the framework owns the rest.\n * Server-compatible: the site's `error.tsx` wrapper carries the `'use client'`\n * boundary and hands in the retry button.\n *\n * @packageDocumentation\n */\n\nimport type { ReactNode } from 'react';\n\nimport { type GlyphName, strokeIcon } from './icons.js';\n\n/**\n * The error states the screen renders.\n *\n * @public\n */\nexport type ErrorKind = 'not-found' | 'forbidden' | 'server' | 'offline' | 'unknown';\n\n/**\n * The default eyebrow, title, description, and icon for a {@link ErrorKind}.\n *\n * @public\n */\nexport interface ErrorPreset {\n readonly code: string;\n readonly title: string;\n readonly description: string;\n readonly icon: ReactNode;\n}\n\n/** The screens' icons are drawn a hair lighter than the rest of the UI. */\nfunction icon(name: GlyphName): ReactNode {\n return strokeIcon(name, { strokeWidth: 1.75 });\n}\n\nconst PRESETS: Record<ErrorKind, ErrorPreset> = {\n 'not-found': {\n code: '404',\n title: 'Page not found',\n description: \"The page you're looking for doesn't exist or may have moved.\",\n icon: icon('crossCircle'),\n },\n forbidden: {\n code: '403',\n title: 'Access restricted',\n description: 'Your account is not allowed to view this page. Sign in with an allowed account.',\n icon: icon('lock'),\n },\n server: {\n code: '500',\n title: 'Something went wrong',\n description: 'An unexpected error occurred on our side. Please try again in a moment.',\n icon: icon('alert'),\n },\n offline: {\n code: 'Offline',\n title: \"You're offline\",\n description: 'Check your connection and try again.',\n icon: icon('offline'),\n },\n unknown: {\n code: 'Error',\n title: 'Something went wrong',\n description: 'An unexpected error occurred. Please try again.',\n icon: icon('info'),\n },\n};\n\n/**\n * The default preset for an error kind — its icon, eyebrow, and copy.\n *\n * @param kind - the error state\n * @returns the preset a site can render or override\n * @public\n */\nexport function errorPreset(kind: ErrorKind): ErrorPreset {\n return PRESETS[kind];\n}\n\n/**\n * Props for {@link ErrorScreen}. Everything but `kind` is optional: the kind's\n * preset fills the eyebrow, title, description, and icon unless overridden.\n *\n * @public\n */\nexport interface ErrorScreenProps {\n /** Which error state to render. Default `unknown`. */\n readonly kind?: ErrorKind;\n /** Override the eyebrow code (e.g. a specific status). */\n readonly code?: string;\n /** Override the title. */\n readonly title?: string;\n /** Override the description. */\n readonly description?: string;\n /** When set, render a primary button linking here (e.g. `/docs`). */\n readonly homeHref?: string;\n /** Label for the home button. Default \"Back to docs\". */\n readonly homeLabel?: string;\n /** An extra action rendered beside the home button (e.g. a retry button). */\n readonly action?: ReactNode;\n}\n\nfunction homeIcon(): ReactNode {\n return strokeIcon('house');\n}\n\n/**\n * Render the error screen.\n *\n * @param props - see {@link ErrorScreenProps}\n * @public\n */\nexport function ErrorScreen(props: ErrorScreenProps): ReactNode {\n const kind = props.kind ?? 'unknown';\n const preset = PRESETS[kind];\n const code = props.code ?? preset.code;\n const title = props.title ?? preset.title;\n const description = props.description ?? preset.description;\n\n return (\n <div className=\"error-screen\">\n <div className=\"auth-ambient\" aria-hidden=\"true\" />\n <main className=\"error-card\">\n <div className=\"error-glyph\" data-kind={kind}>\n {preset.icon}\n </div>\n <p className=\"error-code\">{code}</p>\n <h1 className=\"error-title\">{title}</h1>\n <p className=\"error-desc\">{description}</p>\n {props.homeHref || props.action ? (\n <div className=\"error-actions\">\n {props.homeHref ? (\n <a className=\"error-btn error-btn-primary\" href={props.homeHref}>\n {homeIcon()}\n {props.homeLabel ?? 'Back to docs'}\n </a>\n ) : null}\n {props.action}\n </div>\n ) : null}\n </main>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\n/**\n * Steps components — the Mintlify `<Steps>` and `<Step>`. Server-compatible.\n *\n * The spine uses the framework's border token, so it follows the site's palette\n * and the dark theme.\n *\n * @packageDocumentation\n */\n\n/**\n * An ordered list of steps.\n *\n * @public\n */\nexport function Steps({ children }: { children?: ReactNode }) {\n return (\n <div\n style={{\n borderLeft: '2px solid var(--color-fd-border)',\n paddingLeft: 20,\n margin: '16px 0',\n display: 'flex',\n flexDirection: 'column',\n gap: 16,\n }}\n >\n {children}\n </div>\n );\n}\n\n/**\n * A single step with an optional title.\n *\n * @public\n */\nexport function Step({ title, children }: { title?: string; children?: ReactNode }) {\n return (\n <div>\n {title !== undefined && (\n <div style={{ fontWeight: 700, fontSize: 15, marginBottom: 4 }}>{title}</div>\n )}\n <div>{children}</div>\n </div>\n );\n}\n","import { Accordion, AccordionGroup } from './accordion.js';\nimport { Info, Note, Tip, Warning } from './callout.js';\nimport { Card, CardGroup } from './card.js';\nimport { Step, Steps } from './steps.js';\n\n/**\n * The Mintlify-compatible MDX component map.\n *\n * Pass this to an MDX renderer (for example `next-mdx-remote`'s `compileMDX`)\n * so real Mintlify guides render unchanged. A site no longer needs to shim\n * these itself.\n *\n * @public\n */\nexport const mdxComponents = {\n Note,\n Warning,\n Info,\n Tip,\n Card,\n CardGroup,\n Accordion,\n AccordionGroup,\n Steps,\n Step,\n};\n","import type { CSSProperties } from 'react';\n\nimport type { NavItem, NavPage, Navigation } from '../core/index.js';\n\n/**\n * The navigation sidebar. Renders a {@link Navigation} tree (produced by\n * `parseNavigation`) as tabs, groups, and page links. Framework-agnostic: it\n * emits plain anchors and takes an optional `resolveHref` so a site controls\n * its own routing. Server-compatible.\n *\n * @packageDocumentation\n */\n\n/**\n * Map a navigation page to a URL. Override to control routing — the default\n * assumes one specific site shape, which is why {@link DocsSidebar} is\n * deprecated.\n *\n * @public\n */\nexport type ResolveHref = (page: NavPage) => string;\n\nconst defaultResolveHref: ResolveHref = (page) => {\n if (page.kind === 'openapi') {\n return '/reference';\n }\n if (page.file === 'introduction') {\n return '/';\n }\n return `/${page.file}`;\n};\n\n/**\n * The method palette. The three status hues are the ones\n * `styles/api-reference.css` uses for its badges, so a method reads the same\n * colour everywhere; `POST` follows the site's own accent.\n */\nconst METHOD_COLORS: Record<string, string> = {\n GET: '#16a34a',\n POST: 'var(--color-fd-primary)',\n PUT: '#d97706',\n PATCH: '#d97706',\n DELETE: '#dc2626',\n};\n\nfunction labelForDoc(file: string): string {\n const last = file.split('/').pop() ?? file;\n return last.replace(/-/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\nfunction Items({\n items,\n depth,\n resolveHref,\n}: {\n items: readonly NavItem[];\n depth: number;\n resolveHref: ResolveHref;\n}) {\n const list: CSSProperties = { listStyle: 'none', margin: 0, paddingLeft: depth === 0 ? 0 : 12 };\n const groupLabel: CSSProperties = {\n fontSize: 11,\n fontWeight: 700,\n textTransform: 'uppercase',\n letterSpacing: '0.04em',\n color: 'var(--color-fd-muted-foreground)',\n margin: '6px 0',\n };\n const link: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '5px 8px',\n borderRadius: 6,\n color: 'var(--color-fd-foreground)',\n textDecoration: 'none',\n fontSize: 14,\n };\n return (\n <ul style={list}>\n {items.map((item, index) => {\n if (item.kind === 'group') {\n return (\n <li key={`g-${String(index)}`} style={{ marginTop: 10 }}>\n <div style={groupLabel}>{item.title}</div>\n <Items items={item.items} depth={depth + 1} resolveHref={resolveHref} />\n </li>\n );\n }\n return (\n <li key={`p-${String(index)}`}>\n <a href={resolveHref(item)} style={link}>\n {item.kind === 'openapi' && (\n <span\n style={{\n fontSize: 9,\n fontWeight: 700,\n color: METHOD_COLORS[item.method] ?? 'var(--color-fd-muted-foreground)',\n minWidth: 34,\n }}\n >\n {item.method}\n </span>\n )}\n <span>\n {item.kind === 'openapi'\n ? item.apiPath.replace(/^\\/api\\//, '')\n : labelForDoc(item.file)}\n </span>\n </a>\n </li>\n );\n })}\n </ul>\n );\n}\n\n/**\n * Render the documentation sidebar.\n *\n * @deprecated Use fumadocs' `DocsLayout` with `loader({ icon: docsIcon })`,\n * which both shipped sites use. This component predates that wiring: it renders\n * plain anchors with no active state, no collapsible groups, and no search, and\n * its default `resolveHref` assumes a routing shape (`/reference`, and\n * `introduction` at the root) that no site now uses. Pass your own\n * {@link ResolveHref} if you keep it. It stays exported, and behaves exactly as\n * before, until the next major version.\n *\n * @public\n */\nexport function DocsSidebar({\n nav,\n resolveHref = defaultResolveHref,\n}: {\n nav: Navigation;\n resolveHref?: ResolveHref;\n}) {\n return (\n <nav style={{ padding: '20px 16px' }}>\n {nav.map((tab, index) => (\n <div key={`t-${String(index)}`} style={{ marginBottom: 18 }}>\n <div\n style={{\n fontSize: 13,\n fontWeight: 800,\n color: 'var(--color-fd-foreground)',\n marginBottom: 4,\n }}\n >\n {tab.title}\n </div>\n <Items items={tab.items} depth={0} resolveHref={resolveHref} />\n </div>\n ))}\n </nav>\n );\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blaaiz/docs-core",
3
- "version": "0.5.0",
3
+ "version": "0.7.0",
4
4
  "description": "Neutral, self-hostable documentation framework core — navigation parsing, OpenAPI merging, MDX doc components, and a hardened try-it proxy. Config and content live in each consuming site.",
5
5
  "keywords": [
6
6
  "documentation",
package/skills/SKILL.md CHANGED
@@ -31,6 +31,8 @@ in the `docs-core` repository. Say so instead of patching the install.
31
31
  | `content/docs/**/meta.json` | see below | Sidebar order |
32
32
  | `content/nav.json` | see below | Top-navigation links, one per tab |
33
33
  | `content/api-methods.json` | the generator | Sidebar method badges. Never by hand |
34
+ | `content/api-sources.json` | the generator | Page URL to its operation's spec source. Never by hand |
35
+ | `content/redirects.json` | the generator | Old page URL to current, served as 308s. Never by hand |
34
36
  | `content/docs/api/**` | the generator | Generated endpoint pages. Never by hand |
35
37
  | `app/**`, `lib/**`, `middleware.ts` | the site | Wiring: routes, layouts, the page tree |
36
38
 
@@ -56,8 +58,8 @@ export default defineDocsConfig({
56
58
  });
57
59
  ```
58
60
 
59
- `theme`, `auth`, and `proxy` are required. `features`, `seo`, and `ai` are
60
- optional, and omitting one leaves everything it controls off.
61
+ `theme`, `auth`, and `proxy` are required. `navbar`, `features`, `seo`, and
62
+ `ai` are optional, and omitting one leaves everything it controls off.
61
63
 
62
64
  ### theme
63
65
 
@@ -100,6 +102,15 @@ Providers:
100
102
  would let a reader skip the secret. `google`'s `redirectPath` defaults to
101
103
  `/api/auth/google/callback`.
102
104
 
105
+ ### navbar
106
+
107
+ Top-bar calls to action, rendered by `NavActions`.
108
+
109
+ | Field | Shape | Renders as |
110
+ | ----------- | ---------------- | --------------------------------- |
111
+ | `primary` | `{ text, href }` | A button in the theme's `primary` |
112
+ | `secondary` | `{ text, href }` | A quiet link beside it |
113
+
103
114
  ### proxy
104
115
 
105
116
  | Field | Type | Notes |
@@ -239,14 +250,20 @@ Rules the parser enforces:
239
250
  ### Add an API endpoint
240
251
 
241
252
  1. Create one OpenAPI file holding one operation. The name must end in
242
- `-openapi.json`. Give the operation an `operationId`: it becomes the page
243
- slug. Without one, the slug is derived from `METHOD path`.
253
+ `-openapi.json`. Give the operation a `summary`: kebab-cased, it becomes
254
+ the page slug (`Revoke Admin Passkey` -> `revoke-admin-passkey`). Without
255
+ one the slug falls back to the `operationId`, then to `METHOD path`. Two
256
+ operations in one group whose summaries slugify identically fail the
257
+ generator with both names.
244
258
  2. Add the entry to `content/docs.json` in the group where it belongs:
245
259
  `"<file> <METHOD> <route>"`, with the file path relative to `content`.
246
260
  3. Re-run the generator: `pnpm generate:api`, or whatever script calls
247
261
  `generateDocsTree`. It merges the specs, writes one page per declared
248
- endpoint into its group folder, and rewrites `meta.json`, `nav.json`, and
249
- `api-methods.json`.
262
+ endpoint into its group folder, and rewrites `meta.json`, `nav.json`,
263
+ `api-methods.json`, `api-sources.json`, and `redirects.json`. Editing an
264
+ operation's `summary` renames its page URL; the generator records the old
265
+ URL in `redirects.json` and the middleware forwards it permanently, so a
266
+ rename never breaks a link.
250
267
  4. Check the page renders and the try-it panel targets an allow-listed origin.
251
268
 
252
269
  An operation that exists in a spec but is not declared in `docs.json` gets no
@@ -280,22 +297,39 @@ this stack; `HomeLayout` at the root is its equivalent.
280
297
 
281
298
  ### The top-navigation links
282
299
 
283
- Both layouts build their links the same way. Never map `nav.json` by hand
284
- in a layout:
285
-
286
- ```tsx
287
- links={docsNavLinks(navLinks).map((link) => ({
288
- type: 'custom' as const,
289
- children: <TopNavLink key={link.url} link={link} />,
290
- }))}
291
- ```
300
+ The header has two rows: utilities (logo, search, Ask AI, actions) above,
301
+ section links below. Never hand fumadocs a `slots.header` component: the slot
302
+ replaces the whole navbar in both layouts (it is invoked with no props), and
303
+ row one's search, actions, and sidebar controls disappear with it. Never map
304
+ `nav.json` by hand in a layout either.
305
+
306
+ - **Docs pages**: the section links are fumadocs' native navbar tabs —
307
+ `tabMode="navbar"` plus a `tabs` array mapped from `docsNavLinks(navLinks)`.
308
+ A link whose territory is a page-tree folder binds it (`$folder` activates
309
+ on the whole subtree); the rest match their exact URLs via `urls`. The
310
+ scaffold's `app/docs/layout.tsx` carries the `sectionTabs()` mapping.
311
+ - **The landing**: a client `SiteSubnav` component (class `site-subnav`,
312
+ modifier `site-subnav--home` for stickiness) rendered as the first child
313
+ under `HomeLayout`, below the default header.
314
+ - **Actions**: one custom `links` entry in both layouts —
315
+ `<NavActions navbar={config.navbar} signOut={auth.enabled}>` with
316
+ `<AskAi trigger="nav" />` as its child on docs pages. On the landing add
317
+ `secondary: true` so the actions sit right-aligned; on the notebook layout
318
+ never set `secondary` — it exiles the entry into the mobile drawer.
319
+
320
+ `NavActions` (from `@blaaiz/docs-core/ui`) renders the config's calls to
321
+ action and, on a workspace site, a Log out control posting to the sign-out
322
+ route. `<AskAi trigger="nav" />` puts the Ask AI button beside search instead
323
+ of the floating pill.
292
324
 
293
325
  `docsNavLinks` (from `@blaaiz/docs-core/ui`) owns the policy: it prepends
294
326
  Home pointing at the landing (`home: false` on a site without one, or a
295
327
  custom entry to change its text or drop its icon), resolves icons (an entry
296
- without `icon` renders text-only), and computes each link's `match` path:
297
- exact for Home and the docs root, the section prefix for section links, so a
298
- section stays lit on every page of its section. `TopNavLink` is a small
328
+ without `icon` renders text-only; pass `icon` in the options to resolve names
329
+ through the site's own icon library), and computes each link's `match`:
330
+ exact for Home and the docs root, a `match` carried in `nav.json` when the
331
+ generator emitted one (API tabs), the URL-derived section prefix otherwise —
332
+ so a section stays lit on every page of its section. `TopNavLink` is a small
299
333
  client component the site owns (like `components/logo.tsx`): it calls
300
334
  `isDocsNavLinkActive(link, usePathname())` and renders an anchor with the
301
335
  `topnav-link` class from `styles/docs.css`.
@@ -364,15 +398,22 @@ render Markdown tables.
364
398
  2. Render `CopyPageButton` from `@blaaiz/docs-core/ui/copy-page` in the page
365
399
  component, guarded by `config.features?.copyPage`.
366
400
  3. Serve the Markdown: `createMarkdownRoute({ read })` in
367
- `app/md/[[...slug]]/route.ts`, where `read` returns a page's raw MDX.
368
- 4. On a site with an API reference, also pass `loadOpenApiDocuments`: an async
369
- loader returning the merged OpenAPI documents by name (usually
370
- `{ blaaiz: await getMergedSpec() }`, matching the `document="…"` the
371
- generated pages reference). Without it, an API page's Markdown is only its
372
- title and `METHOD /path`; with it, parameters, body fields, enums, and
373
- responses are rendered in. The same `openApiDocuments` option exists on
374
- `mdxToMarkdown` and belongs in the Ask AI corpus builder for the same
375
- reason (see the Enable Ask AI recipe).
401
+ `app/md/[[...slug]]/route.ts`, where `read` returns a page's raw MDX. The
402
+ mount is internal: in `middleware.ts`, `markdownRewriteTarget(request.nextUrl)`
403
+ rewrites the public address (the page URL plus `.md`,
404
+ `/docs/guides/webhooks.md`) onto it, and `isMarkdownRouteRequest` answers
405
+ `404` to direct `/md` requests, so each page's Markdown has one address.
406
+ 4. On a site with an API reference, also pass `loadOperationSource` (reads
407
+ `content/api-sources.json` plus the spec file it names): an API page's
408
+ Markdown is then its complete operation spec under an `## OpenAPI` heading.
409
+ Pass `loadOpenApiDocuments` too, the fallback for pages the source loader
410
+ returns `null` for; the same `openApiDocuments` option exists on
411
+ `mdxToMarkdown` and belongs in the Ask AI corpus builder (see the Enable
412
+ Ask AI recipe).
413
+ 5. Mount `/llms.txt`, the index agents fetch first: `buildLlmsTxt(pages, ...)`
414
+ from the fumadocs source in `app/llms.txt/route.ts`, and pass
415
+ `llmsTxtPath: '/llms.txt'` to `createMarkdownRoute` so every Markdown
416
+ response opens with a pointer to it.
376
417
 
377
418
  ### Wire search
378
419
 
@@ -74,6 +74,42 @@
74
74
  transform: none;
75
75
  }
76
76
 
77
+ /* The panel header is a compact strip, level in height with the response
78
+ panel's status tabs — in the page rail and in the try-it view alike. */
79
+ #nd-page div[class*='w-[400px'] .openapi-usage-header,
80
+ .api-tryit-overlay .openapi-usage-header {
81
+ padding-block: 0.625rem;
82
+ }
83
+
84
+ /* The selector opens both ways, so its caret points both ways, snug against
85
+ the label. */
86
+ #nd-page div[class*='w-[400px'] .openapi-usage-header .openapi-usage-lang,
87
+ .api-tryit-overlay .openapi-usage-header .openapi-usage-lang {
88
+ width: auto;
89
+ padding-block: 0.125rem;
90
+ padding-inline: 0.5rem;
91
+ gap: 0.25rem;
92
+ border: none;
93
+ background: transparent;
94
+ font-size: 0.8125rem;
95
+ }
96
+
97
+ #nd-page div[class*='w-[400px'] .openapi-usage-header .openapi-usage-lang > span[class*='ms-auto'],
98
+ .api-tryit-overlay .openapi-usage-header .openapi-usage-lang > span[class*='ms-auto'] {
99
+ display: none;
100
+ }
101
+
102
+ #nd-page div[class*='w-[400px'] .openapi-usage-header .openapi-usage-lang::after,
103
+ .api-tryit-overlay .openapi-usage-header .openapi-usage-lang::after {
104
+ content: '';
105
+ width: 0.875em;
106
+ height: 0.875em;
107
+ flex-shrink: 0;
108
+ background-color: currentColor;
109
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m7 15 5 5 5-5'/%3E%3Cpath d='m7 9 5-5 5 5'/%3E%3C/svg%3E")
110
+ no-repeat center / contain;
111
+ }
112
+
77
113
  /* Denser code in the rail: smaller type, tighter lines than the guide blocks. */
78
114
  :is(#nd-page div[class*='w-[400px'], .api-tryit-example) figure.shiki pre {
79
115
  font-size: 12.5px;
@@ -234,11 +270,13 @@
234
270
 
235
271
  #nd-page div[class*='w-[400px'] > div[class*='prose-no-margin'] {
236
272
  position: fixed;
237
- top: 6.5rem;
273
+ /* Level with the left column's first line (the breadcrumb), so the two
274
+ columns start together. */
275
+ top: 8rem;
238
276
  width: 460px;
239
277
  /* Max height, not fixed: the boxes are content-sized and only shrink and
240
278
  scroll when the viewport runs out — no grey filler on tall screens. */
241
- max-height: calc(100dvh - 8rem);
279
+ max-height: calc(100dvh - 9.5rem);
242
280
  display: flex;
243
281
  flex-direction: column;
244
282
  gap: 1rem;
@@ -325,6 +363,11 @@
325
363
  background: var(--color-fd-primary);
326
364
  }
327
365
 
366
+ /* Dark-mode method colours run light, so the pill's text runs dark. */
367
+ .dark #nd-page .api-tryit-method {
368
+ color: #000;
369
+ }
370
+
328
371
  #nd-page .api-tryit-method[data-method='get'] {
329
372
  background: #16a34a;
330
373
  }
package/styles/ask-ai.css CHANGED
@@ -593,3 +593,31 @@
593
593
  font-weight: 600;
594
594
  white-space: nowrap;
595
595
  }
596
+
597
+ /* The top-bar trigger: a quiet button beside search. */
598
+ .askai-nav-trigger {
599
+ display: inline-flex;
600
+ align-items: center;
601
+ gap: 0.5rem;
602
+ padding: 0.375rem 0.75rem;
603
+ border: 1px solid var(--color-fd-border);
604
+ border-radius: 0.625rem;
605
+ background: transparent;
606
+ color: var(--color-fd-muted-foreground);
607
+ font-size: 0.875rem;
608
+ font-weight: 500;
609
+ cursor: pointer;
610
+ white-space: nowrap;
611
+ transition:
612
+ color 0.15s,
613
+ border-color 0.15s;
614
+ }
615
+
616
+ .askai-nav-trigger:hover {
617
+ color: var(--color-fd-foreground);
618
+ border-color: var(--color-fd-primary);
619
+ }
620
+
621
+ .askai-nav-trigger .askai-kbd {
622
+ margin-left: 0.125rem;
623
+ }