@blaaiz/docs-core 0.2.0 → 0.4.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.
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 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/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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blaaiz/docs-core",
3
- "version": "0.2.0",
3
+ "version": "0.4.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
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: docs-core
3
- description: Work on a documentation site built with @blaaiz/docs-core. Use whenever a task touches docs.config.ts, content/docs.json, content/docs/**, or an import from @blaaiz/docs-core — adding or reordering doc pages, tabs, and groups; publishing an OpenAPI endpoint with the try-it playground; changing theme colours, the logo, or the favicon; setting up public or workspace authentication; turning on Ask AI, copy-page, search, or SEO; or fixing an error the framework raises.
3
+ description: Work on a documentation site built with @blaaiz/docs-core. Use whenever a task touches docs.config.ts, content/docs.json, content/docs/**, or an import from @blaaiz/docs-core: adding or reordering doc pages, tabs, and groups; publishing an OpenAPI endpoint with the try-it playground; changing theme colours, the logo, or the favicon; setting up public or workspace authentication; turning on Ask AI, copy-page, search, or SEO; or fixing an error the framework raises.
4
4
  ---
5
5
 
6
6
  # docs-core
@@ -18,7 +18,7 @@ So: **never edit anything under `node_modules/@blaaiz/docs-core`.** Every change
18
18
  you make lands in `docs.config.ts`, `content/docs.json`, a content file, or one
19
19
  of the site's own wiring files. A change that seems to need a package edit is
20
20
  either a config field you have not found yet, or a framework change that belongs
21
- in the `docs-core` repository — say so instead of patching the install.
21
+ in the `docs-core` repository. Say so instead of patching the install.
22
22
 
23
23
  ## The files that matter
24
24
 
@@ -30,13 +30,13 @@ in the `docs-core` repository — say so instead of patching the install.
30
30
  | `content/**/*-openapi.json` | the site | Add or change an API endpoint's spec |
31
31
  | `content/docs/**/meta.json` | see below | Sidebar order |
32
32
  | `content/nav.json` | see below | Top-navigation links, one per tab |
33
- | `content/api-methods.json` | the generator | Sidebar method badges — never by hand |
34
- | `content/docs/api/**` | the generator | Generated endpoint pages — never by hand |
33
+ | `content/api-methods.json` | the generator | Sidebar method badges. Never by hand |
34
+ | `content/docs/api/**` | the generator | Generated endpoint pages. Never by hand |
35
35
  | `app/**`, `lib/**`, `middleware.ts` | the site | Wiring: routes, layouts, the page tree |
36
36
 
37
37
  `meta.json` and `nav.json` are hand-written on a prose-only site. On a site with
38
38
  an API reference the generator writes them from `docs.json` on every run, so
39
- hand edits are lost — change `docs.json` instead. A site runs the generator when
39
+ hand edits are lost; change `docs.json` instead. A site runs the generator when
40
40
  its `package.json` has a `predev` / `prebuild` script calling
41
41
  `@blaaiz/docs-core/generator`; check that first.
42
42
 
@@ -159,9 +159,9 @@ Naming a provider is a complete setup. Every other field has a default.
159
159
 
160
160
  Allowed models:
161
161
 
162
- - **anthropic** — `claude-sonnet-5`, `claude-haiku-4-5`, `claude-opus-5`,
162
+ - **anthropic**: `claude-sonnet-5`, `claude-haiku-4-5`, `claude-opus-5`,
163
163
  `claude-opus-4-8`, `claude-sonnet-4-6`
164
- - **openai** — `gpt-5-mini`, `gpt-5`, `gpt-5.2`, `gpt-5-nano`, `gpt-4.1`,
164
+ - **openai**: `gpt-5-mini`, `gpt-5`, `gpt-5.2`, `gpt-5-nano`, `gpt-4.1`,
165
165
  `gpt-4.1-mini`, `gpt-4o`, `gpt-4o-mini`
166
166
 
167
167
  The whole `ai` block is validated when the route is built, so a typo fails the
@@ -206,7 +206,7 @@ The navigation, and the only thing that decides what is published.
206
206
  Rules the parser enforces:
207
207
 
208
208
  - A tab needs a string `tab` title. It carries either `pages` or `groups`, never
209
- both — `groups` wins if both appear.
209
+ both; `groups` wins if both appear.
210
210
  - A group needs a string `group` title and a `pages` array. Groups nest: a
211
211
  `pages` array may hold group objects.
212
212
  - A page string is either a content path relative to `content/docs`, without the
@@ -233,7 +233,7 @@ Rules the parser enforces:
233
233
  3. Add the tab's folder to the root `content/docs/meta.json` `pages` array, and
234
234
  give the folder its own `meta.json` with `"root": true`, a `title`, and an
235
235
  `icon`. On an API site, re-run the generator instead.
236
- 4. Add the tab to `content/nav.json` — `{ text, url, icon }`, pointing at its
236
+ 4. Add the tab to `content/nav.json`: `{ text, url, icon }`, pointing at its
237
237
  first page. The generator writes this file on an API site.
238
238
 
239
239
  ### Add an API endpoint
@@ -258,16 +258,16 @@ rebuilt on every run, so a removed endpoint leaves no stale page.
258
258
  The site root (`app/page.tsx`) has two valid shapes, and switching between
259
259
  them is a one-file change:
260
260
 
261
- - **A landing page** — render the hero inside `HomeLayout` from
261
+ - **A landing page**: render the hero inside `HomeLayout` from
262
262
  `fumadocs-ui/layouts/home`: the same top bar as the docs (logo, links,
263
263
  search, theme toggle) with no sidebar. Hero content is plain elements
264
264
  carrying the `home-*` classes from `@blaaiz/docs-core/styles/home.css`.
265
265
  Clicking a link enters the sidebar shell under `/docs`. Sites scaffolded by
266
266
  `create-docs-core` ship this shape.
267
- - **No landing** — the file is a three-line `redirect('/docs')` and readers
267
+ - **No landing**: the file is a three-line `redirect('/docs')` and readers
268
268
  land directly in the docs.
269
269
 
270
- Do not put the landing inside `content/docs/` — a page there always renders
270
+ Do not put the landing inside `content/docs/`: a page there always renders
271
271
  in the sidebar shell. For a wide page _inside_ the docs (sidebar kept, no
272
272
  title row, no table of contents), set `full: true` in that page's
273
273
  frontmatter instead. Mintlify's `mode: custom` frontmatter is not read by
@@ -275,7 +275,7 @@ this stack; `HomeLayout` at the root is its equivalent.
275
275
 
276
276
  ### The top-navigation links
277
277
 
278
- Both layouts build their links the same way — never map `nav.json` by hand
278
+ Both layouts build their links the same way. Never map `nav.json` by hand
279
279
  in a layout:
280
280
 
281
281
  ```tsx
@@ -288,7 +288,7 @@ links={docsNavLinks(navLinks).map((link) => ({
288
288
  `docsNavLinks` (from `@blaaiz/docs-core/ui`) owns the policy: it prepends
289
289
  Home pointing at the landing (`home: false` on a site without one, or a
290
290
  custom entry to change its text or drop its icon), resolves icons (an entry
291
- without `icon` renders text-only), and computes each link's `match` path —
291
+ without `icon` renders text-only), and computes each link's `match` path:
292
292
  exact for Home and the docs root, the section prefix for section links, so a
293
293
  section stays lit on every page of its section. `TopNavLink` is a small
294
294
  client component the site owns (like `components/logo.tsx`): it calls
@@ -303,7 +303,7 @@ than a second Home, so no page is reachable only by typing its URL.
303
303
 
304
304
  Edit `theme.colors` and `theme.darkColors` in `docs.config.ts`. Nothing else:
305
305
  the site's layout already turns the palette into CSS variables. Set `primary` in
306
- both palettes — a light-theme accent rarely has enough contrast on a dark
306
+ both palettes; a light-theme accent rarely has enough contrast on a dark
307
307
  background.
308
308
 
309
309
  ### Enable Ask AI
@@ -343,7 +343,7 @@ background.
343
343
  ```
344
344
 
345
345
  `AskAi` accepts `endpoint`, `suggestions`, `label`, and `placeholder`, and all
346
- four have defaults. Write suggestions the corpus can actually answer — they
346
+ four have defaults. Write suggestions the corpus can actually answer. They
347
347
  are the first thing a reader clicks.
348
348
 
349
349
  On a site with an API reference, build the corpus with the merged OpenAPI
@@ -360,7 +360,7 @@ render Markdown tables.
360
360
  component, guarded by `config.features?.copyPage`.
361
361
  3. Serve the Markdown: `createMarkdownRoute({ read })` in
362
362
  `app/md/[[...slug]]/route.ts`, where `read` returns a page's raw MDX.
363
- 4. On a site with an API reference, also pass `loadOpenApiDocuments` — an async
363
+ 4. On a site with an API reference, also pass `loadOpenApiDocuments`: an async
364
364
  loader returning the merged OpenAPI documents by name (usually
365
365
  `{ blaaiz: await getMergedSpec() }`, matching the `document="…"` the
366
366
  generated pages reference). Without it, an API page's Markdown is only its
@@ -371,7 +371,7 @@ render Markdown tables.
371
371
 
372
372
  ### Wire search
373
373
 
374
- Fumadocs search is one route file — `app/api/search/route.ts` re-exporting
374
+ Fumadocs search is one route file, `app/api/search/route.ts`, re-exporting
375
375
  `createFromSource(source)` from `fumadocs-core/search/server`; the dialog comes
376
376
  from `RootProvider` and needs nothing else. For a custom surface (a command
377
377
  palette, a static index), the framework exports `buildSearchIndex` and
@@ -384,16 +384,18 @@ Three framework builders read `docs.config.ts`; each mounts as one thin file:
384
384
 
385
385
  1. `buildMetadata(config)` exported as `metadata` from `app/layout.tsx`, and
386
386
  `buildMetadata(config, { title, description, path })` from the page's
387
- `generateMetadata` — without the per-page call every page shares one title.
388
- 2. `buildRobots(config)` in `app/robots.ts` — `seo.noindex: true` disallows
387
+ `generateMetadata`. Without the per-page call, every page shares one title.
388
+ 2. `buildRobots(config)` in `app/robots.ts`: `seo.noindex: true` disallows
389
389
  crawling entirely; otherwise `/signin` and `/api/` are excluded.
390
390
  3. `buildSitemap(entries, config)` in `app/sitemap.ts`, with entries from
391
391
  `source.getPages()`.
392
392
 
393
- `theme.favicon` flows through `buildMetadata` — never add a
393
+ `theme.favicon` flows through `buildMetadata`. Never add a
394
394
  `<link rel="icon">` by hand.
395
395
 
396
- ### Set up workspace auth with the shared secret
396
+ ### Set up workspace auth
397
+
398
+ Auth is config-only. The site's auth files ship installed and never change:
397
399
 
398
400
  1. In `docs.config.ts`:
399
401
 
@@ -401,17 +403,29 @@ Three framework builders read `docs.config.ts`; each mounts as one thin file:
401
403
  auth: {
402
404
  mode: 'workspace',
403
405
  allowedDomains: ['example.com'],
404
- providers: { secret: { secretEnv: 'DOCS_ACCESS_SECRET' } },
406
+ providers: { secret: {} },
405
407
  }
406
408
  ```
407
409
 
408
- 2. Set `DOCS_SESSION_SECRET` (a long random value — `openssl rand -hex 32`) and
409
- `DOCS_ACCESS_SECRET` in the server environment.
410
- 3. Mount `createSecretSignIn` on a route, and `createAuthGate` in
411
- `middleware.ts`. Import `@blaaiz/docs-core/styles/auth.css` for `AuthScreen`.
412
- 4. Check the middleware matcher covers every route that must be gated. A matcher
413
- that misses a route leaves that route open.
414
- 5. Consider `seo: { noindex: true }` on a gated site.
410
+ 2. Set `DOCS_SESSION_SECRET` (a long random value, for example
411
+ `openssl rand -hex 32`) and
412
+ `DOCS_ACCESS_SECRET` in the server environment. Restart. Never write new
413
+ auth files.
414
+
415
+ Providers combine freely: `email: true` (dev only), `secret`, and `google`
416
+ (needs `GOOGLE_CLIENT_ID`/`GOOGLE_CLIENT_SECRET`). A declared provider whose
417
+ env var is missing is offered as disabled, not broken; a missing session
418
+ secret fails at startup naming the variable.
419
+
420
+ On a site that adds docs-core to an existing Next.js app, mount
421
+ `createSiteAuth(config.auth)` once in `lib/auth.ts`
422
+ and re-export its handlers: `auth.gate` in `middleware.ts` (matcher must exempt
423
+ static images or the sign-in page's own logo request gets redirected),
424
+ `auth.secretSignIn` / `auth.emailSignIn` / `auth.google.start` /
425
+ `auth.google.callback` / `auth.signOut` as routes under `app/api/auth/`, and
426
+ `AuthScreen` (with `auth.secretEnabled` / `auth.googleEnabled`) on the sign-in
427
+ page. Import `@blaaiz/docs-core/styles/auth.css`. Consider
428
+ `seo: { noindex: true }` on a gated site.
415
429
 
416
430
  ## Verification habits
417
431
 
@@ -419,8 +433,8 @@ Three framework builders read `docs.config.ts`; each mounts as one thin file:
419
433
  usually fails at build time by design.
420
434
  - After an API change, re-run the generator and confirm the page count it
421
435
  reports matches the endpoints you declared.
422
- - Never hand-edit `content/docs/api/**`, `content/api-methods.json`, or — on a
423
- site that runs the generator — `meta.json` and `nav.json`. They are outputs.
436
+ - Never hand-edit `content/docs/api/**`, `content/api-methods.json`, or, on a
437
+ site that runs the generator, `meta.json` and `nav.json`. They are outputs.
424
438
  - Check a content change in the browser at `/docs`: sidebar order, the top nav,
425
439
  and search.
426
440
  - A palette change needs a look in both light and dark mode.
@@ -429,19 +443,19 @@ Three framework builders read `docs.config.ts`; each mounts as one thin file:
429
443
 
430
444
  Each message below is raised verbatim by the framework.
431
445
 
432
- | Message | Cause and fix |
433
- | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------ |
434
- | `ai.provider must be one of 'anthropic', 'openai', got '…'.` | Typo in `docs.config.ts`. Use one of the two names |
435
- | `ai.model must be one of '…' for provider '…', got '…'.` | The model is not on that provider's allow-list. Use a listed id, or leave `model` out for the default |
436
- | `Ask AI is not configured: set the ANTHROPIC_API_KEY environment variable on the server.` | The route is mounted but the key is missing. Set the env var named by `ai.apiKeyEnv` where the server runs — not in `docs.config.ts` |
437
- | `Target origin is not allow-listed: https://api.example.com` | The try-it request targets an origin missing from `proxy.allowedOrigins`. Add it, exactly, scheme included |
438
- | `Blocked host: localhost` | The proxy refuses loopback, private, and link-local hosts on purpose. Point the playground at a reachable public origin |
439
- | `docs.json navigation must have a "tabs" array.` | `content/docs.json` is missing `navigation.tabs`. The older Mintlify `navigation` array form is not supported |
440
- | `Navigation entry at navigation.tabs[N].pages[M] must be a page string or a group object.` | That entry is neither a string nor an object with a `group` key. A common cause is `{ "page": "…" }` |
441
- | `Group at <path> is missing a string "group" title.` | Add the `group` title, or move a bare string into `pages` |
442
- | `Duplicate operation POST /api/x across inputs.` | Two OpenAPI files define the same method on the same route. The merge refuses to overwrite silently — delete one |
443
- | `Each OpenAPI input must have a "paths" object.` | One spec file is not a real OpenAPI document. Even a one-operation file needs `paths` |
444
- | `[docs-core] docs.json references POST /api/x, but <file> defines no such operation.` | The `docs.json` entry and the spec disagree on method or route. Fix whichever is wrong |
446
+ | Message | Cause and fix |
447
+ | ------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------- |
448
+ | `ai.provider must be one of 'anthropic', 'openai', got '…'.` | Typo in `docs.config.ts`. Use one of the two names |
449
+ | `ai.model must be one of '…' for provider '…', got '…'.` | The model is not on that provider's allow-list. Use a listed id, or leave `model` out for the default |
450
+ | `Ask AI is not configured: set the ANTHROPIC_API_KEY environment variable on the server.` | The route is mounted but the key is missing. Set the env var named by `ai.apiKeyEnv` where the server runs, not in `docs.config.ts` |
451
+ | `Target origin is not allow-listed: https://api.example.com` | The try-it request targets an origin missing from `proxy.allowedOrigins`. Add it, exactly, scheme included |
452
+ | `Blocked host: localhost` | The proxy refuses loopback, private, and link-local hosts on purpose. Point the playground at a reachable public origin |
453
+ | `docs.json navigation must have a "tabs" array.` | `content/docs.json` is missing `navigation.tabs`. The older Mintlify `navigation` array form is not supported |
454
+ | `Navigation entry at navigation.tabs[N].pages[M] must be a page string or a group object.` | That entry is neither a string nor an object with a `group` key. A common cause is `{ "page": "…" }` |
455
+ | `Group at <path> is missing a string "group" title.` | Add the `group` title, or move a bare string into `pages` |
456
+ | `Duplicate operation POST /api/x across inputs.` | Two OpenAPI files define the same method on the same route. The merge refuses to overwrite silently. Delete one |
457
+ | `Each OpenAPI input must have a "paths" object.` | One spec file is not a real OpenAPI document. Even a one-operation file needs `paths` |
458
+ | `[docs-core] docs.json references POST /api/x, but <file> defines no such operation.` | The `docs.json` entry and the spec disagree on method or route. Fix whichever is wrong |
445
459
 
446
460
  Error classes are exported, so a site can branch on them:
447
461
  `InvalidNavigationError`, `OpenApiMergeError`, `ProxyTargetError`, and