@tenphi/docs 0.13.0 → 0.15.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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/types.ts"],"sourcesContent":["import type { GlazeColorValue } from \"@tenphi/glaze\";\nimport type { Root } from \"mdast\";\n\nexport type DiagnosticSeverity = \"warning\" | \"error\";\n\nexport interface DocsDiagnostic {\n code: string;\n severity: DiagnosticSeverity;\n message: string;\n file?: string;\n line?: number;\n column?: number;\n hint?: string;\n related?: Array<{ file: string; line?: number; message: string }>;\n}\n\nexport interface SiteConfig {\n title?: string;\n /** Version of the documented package, rendered beside the site title. */\n version?: string;\n description?: string;\n url?: string;\n repository?: string;\n /** Source artwork used to generate browser, touch, and installable-app icons. */\n favicon?: string | SiteIconConfig;\n}\n\nexport interface SiteIconConfig {\n /** Local SVG, PNG, JPEG, WebP, AVIF, or GIF path, relative to the project root. */\n source: string;\n /** Opaque background for touch and maskable icons. */\n background?: string;\n}\n\n/** A language exposed by Starlight's locale picker and routing. */\nexport interface LocaleConfig {\n label: string;\n /** BCP-47 language tag. Defaults to the locale key. */\n lang?: string;\n dir?: \"ltr\" | \"rtl\";\n}\n\nexport interface EditLinkConfig {\n /** Base URL joined with each page's repository-relative source path. */\n baseUrl: string;\n}\n\n/** A custom HTML element rendered in the document head. */\nexport interface HeadConfig {\n tag: string;\n attrs?: Record<string, string | boolean | undefined>;\n content?: string;\n}\n\nexport interface NavigationPlacement {\n label?: string;\n order?: number;\n group?: string;\n}\n\nexport type DocsSource =\n | {\n file: string;\n route?: string;\n title?: string;\n description?: string;\n navigation?: false | NavigationPlacement;\n }\n | {\n glob: string | string[];\n base?: string;\n routeBase?: string;\n exclude?: string[];\n navigation?: \"auto\" | false;\n }\n | {\n package: string;\n include?: string[];\n exclude?: string[];\n index?: string;\n routeBase?: string;\n trust?: \"markdown\" | \"mdx\";\n };\n\nexport interface ContentConfig {\n sources?: DocsSource[];\n allowOutsideRoot?: boolean;\n localizeRepositoryLinks?: boolean;\n}\n\nexport type NavigationItem =\n | string\n | { label: string; items: NavigationItem[] }\n | { label: string; autogenerate: { directory: string } }\n | { label: string; link: string };\n\nexport interface NavigationTab {\n label: string;\n link: string;\n /** Sidebar tree shown while this tab is active. */\n items?: NavigationItem[];\n}\n\nexport interface NavigationConfig {\n items?: NavigationItem[];\n /** Optional primary navigation rendered as a compact row below the header. */\n tabs?: NavigationTab[];\n}\n\nexport type BrandConfig =\n | GlazeColorValue\n | {\n from: GlazeColorValue;\n contrast?: { apca: number | [number, number] };\n unsafeContrast?: boolean;\n };\n\nexport type ThemeTokenValue = string | number;\n\n/**\n * Tasty design tokens. `$name` is emitted as `--name`; existing `--name`\n * custom-property keys remain supported for compatibility.\n */\nexport interface ThemeTokens {\n $gap?: ThemeTokenValue;\n $radius?: ThemeTokenValue;\n \"$card-radius\"?: ThemeTokenValue;\n \"$border-width\"?: ThemeTokenValue;\n \"$outline-width\"?: ThemeTokenValue;\n \"$outline-offset\"?: ThemeTokenValue;\n \"$layout-width\"?: ThemeTokenValue;\n \"$content-width\"?: ThemeTokenValue;\n \"$sidebar-width\"?: ThemeTokenValue;\n \"$control-height\"?: ThemeTokenValue;\n [name: `$${string}`]: ThemeTokenValue | undefined;\n [customProperty: `--${string}`]: ThemeTokenValue | undefined;\n}\n\nexport interface TypographyPreset {\n fontFamily?: string;\n fontSize?: ThemeTokenValue;\n lineHeight?: ThemeTokenValue;\n letterSpacing?: ThemeTokenValue;\n fontWeight?: ThemeTokenValue;\n boldFontWeight?: ThemeTokenValue;\n iconSize?: ThemeTokenValue;\n textTransform?: ThemeTokenValue;\n fontStyle?: ThemeTokenValue;\n}\n\n/** Built-in presets can be overridden and additional Tasty presets may be added. */\nexport interface TypographyPresets {\n body?: TypographyPreset;\n heading?: TypographyPreset;\n h1?: TypographyPreset;\n h2?: TypographyPreset;\n h3?: TypographyPreset;\n h4?: TypographyPreset;\n h5?: TypographyPreset;\n h6?: TypographyPreset;\n navigation?: TypographyPreset;\n small?: TypographyPreset;\n code?: TypographyPreset;\n [name: string]: TypographyPreset | undefined;\n}\n\n/** Semantic palette inputs. Glaze resolves every value for all appearance modes. */\nexport interface ThemePaletteConfig {\n /** Light-scheme page surface; dark and high-contrast values adapt. */\n surface?: GlazeColorValue;\n /** Primary reading text seed, resolved against `surface`. */\n text?: GlazeColorValue;\n /** Secondary text seed, resolved against `surface`. */\n textSoft?: GlazeColorValue;\n}\n\n/** Cookbook UI surfaces whose default Tasty styles can be customized. */\nexport const COOKBOOK_COMPONENT_NAMES = [\n \"Card\",\n \"ContrastSelect\",\n \"Footer\",\n \"Hero\",\n \"LanguageSelect\",\n \"Logo\",\n \"MarkdownCodeBlock\",\n \"MarkdownHeading\",\n \"MarkdownTable\",\n \"Mermaid\",\n \"MobileMenuFooter\",\n \"MobileNavigationTabs\",\n \"MobileTableOfContents\",\n \"PackageVersion\",\n \"Preview\",\n \"Sidebar\",\n \"Steps\",\n \"Tabs\",\n \"TableOfContents\",\n \"ThemeSelect\",\n \"TopNavigation\",\n \"StarlightHeader\",\n] as const;\n\nexport type CookbookComponentName = (typeof COOKBOOK_COMPONENT_NAMES)[number];\n\n/** Named Tasty sub-elements available on each configurable Cookbook surface. */\nexport const COOKBOOK_COMPONENT_SUB_ELEMENTS = {\n Card: [\"Heading2\", \"Heading3\", \"Paragraph\"],\n ContrastSelect: [\n \"Label\",\n \"Icon\",\n \"IconSvg\",\n \"Select\",\n \"PickerIcon\",\n \"Picker\",\n \"OpenPicker\",\n \"Option\",\n \"HoverOption\",\n \"CheckedOption\",\n \"Checkmark\",\n ],\n Footer: [\n \"Meta\",\n \"LoneMetaItem\",\n \"MetaLink\",\n \"HoverMetaLink\",\n \"Credit\",\n \"CreditLink\",\n \"HoverCreditLink\",\n ],\n Hero: [\n \"Visual\",\n \"Stack\",\n \"Copy\",\n \"Title\",\n \"Tagline\",\n \"Actions\",\n \"Action\",\n \"HoverAction\",\n \"PrimaryAction\",\n \"SecondaryAction\",\n \"MinimalAction\",\n \"ActionIcon\",\n ],\n LanguageSelect: [\n \"Label\",\n \"HoverLabel\",\n \"LabelIcon\",\n \"Select\",\n \"Caret\",\n \"Option\",\n ],\n Logo: [\"Svg\", \"Mark\"],\n MarkdownCodeBlock: [\n \"Pre\",\n \"CopyButton\",\n \"HoverCopyButton\",\n \"CopiedButton\",\n \"CopyIcon\",\n \"CopiedIcon\",\n ],\n MarkdownHeading: [\n \"Heading\",\n \"Heading1\",\n \"Heading2\",\n \"Heading3\",\n \"Heading4\",\n \"Heading5\",\n \"Heading6\",\n \"Link\",\n \"HoverLink\",\n ],\n MarkdownTable: [\"Table\", \"Cell\", \"LastBodyRowCell\", \"HeaderCell\"],\n Mermaid: [\"Diagram\", \"Text\", \"MonoText\"],\n MobileMenuFooter: [\"Social\"],\n MobileNavigationTabs: [\n \"Label\",\n \"List\",\n \"Item\",\n \"Link\",\n \"HoverLink\",\n \"CurrentLink\",\n ],\n MobileTableOfContents: [\n \"Item\",\n \"Link\",\n \"LinkLabel\",\n \"HoverLink\",\n \"CurrentLink\",\n \"CurrentIndicator\",\n ],\n PackageVersion: [],\n Preview: [\"Caption\", \"Stage\", \"Frame\", \"Code\", \"Summary\", \"Pre\"],\n Sidebar: [\n \"CurrentLink\",\n \"Content\",\n \"List\",\n \"Item\",\n \"TopLevelSpacing\",\n \"NestedItem\",\n \"Control\",\n \"Summary\",\n \"GroupLabel\",\n \"GroupLabelText\",\n \"Link\",\n \"LinkLabel\",\n \"InteractiveControl\",\n \"SummaryMarker\",\n \"TopLevelLink\",\n ],\n Steps: [\"Item\", \"Marker\"],\n Tabs: [],\n TableOfContents: [\n \"Heading\",\n \"List\",\n \"Item\",\n \"Link\",\n \"LinkLabel\",\n \"HoverLink\",\n \"CurrentLink\",\n ],\n ThemeSelect: [\n \"Label\",\n \"Icon\",\n \"IconSvg\",\n \"Select\",\n \"PickerIcon\",\n \"Picker\",\n \"OpenPicker\",\n \"Option\",\n \"HoverOption\",\n \"CheckedOption\",\n \"Checkmark\",\n ],\n TopNavigation: [\n \"Scrollbar\",\n \"Link\",\n \"HoverLink\",\n \"CurrentLink\",\n \"ActiveIndicator\",\n ],\n StarlightHeader: [\n \"Primary\",\n \"TitleAndSearch\",\n \"Title\",\n \"Logo\",\n \"SiteTitle\",\n \"Search\",\n \"SearchElement\",\n \"Tools\",\n \"ToolItem\",\n \"Social\",\n \"MobileTheme\",\n ],\n} as const satisfies Record<CookbookComponentName, readonly string[]>;\n\nexport type CookbookComponentSubElementName<\n Name extends CookbookComponentName,\n> = (typeof COOKBOOK_COMPONENT_SUB_ELEMENTS)[Name][number];\n\n/** A serializable partial Tasty style object, merged into the base internally. */\nexport type ComponentStyles = Record<string, unknown> & { mode?: never };\n\n/** Style properties supplied by the user to override Cookbook defaults. */\nexport type ComponentStyleConfig = ComponentStyles;\n\n/** A component override with typed suggestions for its named sub-elements. */\nexport type CookbookComponentStyles<Name extends CookbookComponentName> =\n ComponentStyles &\n Partial<Record<CookbookComponentSubElementName<Name>, ComponentStyles>>;\n\nexport type ComponentStylesConfig = {\n [Name in CookbookComponentName]?: CookbookComponentStyles<Name>;\n} & Record<string, ComponentStyleConfig | undefined>;\n\nexport interface ThemeConfig {\n variant?: string;\n brand?: BrandConfig;\n palette?: ThemePaletteConfig;\n states?: Record<string, string>;\n tokens?: ThemeTokens;\n presets?: TypographyPresets;\n /** Tasty UI styles, keyed by Cookbook component or bridge name. */\n styles?: ComponentStylesConfig;\n contrastLevel?: number | \"auto\";\n}\n\nexport interface MarkdownConfig {\n stripLeadingBadges?: boolean;\n rawHtml?: \"sanitize\" | \"allow\" | \"reject\";\n strictLanguages?: boolean;\n executablePreviews?: boolean;\n remarkPlugins?: unknown[];\n rehypePlugins?: unknown[];\n}\n\nexport interface SearchConfig {\n enabled?: boolean;\n}\n\nexport interface ComponentsConfig {\n /** Astro component paths keyed by Starlight component name. `Footer` also accepts `false`. */\n overrides?: Record<string, string | false>;\n}\n\nexport interface BuildConfig {\n strict?: boolean;\n ci?: boolean;\n base?: string;\n cacheDir?: string;\n maxArtifactBytes?: number;\n maxUnpackedBytes?: number;\n maxFiles?: number;\n maxPathDepth?: number;\n maxAssetBytes?: number;\n}\n\nexport interface DocsConfig {\n site?: SiteConfig;\n head?: HeadConfig[];\n /** Enable source-aware “Edit page” links. */\n editLink?: EditLinkConfig;\n /** Show the most recent Git commit date for each local page. */\n lastUpdated?: boolean;\n /** Languages keyed by their URL segment, or `root` for `/`. */\n locales?: Record<string, LocaleConfig>;\n /** Locale key used for fallback content. */\n defaultLocale?: string;\n content?: ContentConfig;\n navigation?: NavigationConfig | NavigationItem[];\n theme?: ThemeConfig;\n markdown?: MarkdownConfig;\n search?: SearchConfig;\n components?: ComponentsConfig;\n build?: BuildConfig;\n}\n\nexport interface NormalizedDocsConfig {\n site: SiteConfig;\n head: HeadConfig[];\n editLink?: EditLinkConfig;\n lastUpdated: boolean;\n locales?: Record<string, LocaleConfig>;\n defaultLocale?: string;\n content: Required<\n Pick<ContentConfig, \"allowOutsideRoot\" | \"localizeRepositoryLinks\">\n > &\n ContentConfig;\n navigation: NavigationConfig;\n theme: ThemeConfig & { brand: BrandConfig };\n markdown: Required<\n Pick<\n MarkdownConfig,\n | \"stripLeadingBadges\"\n | \"rawHtml\"\n | \"strictLanguages\"\n | \"executablePreviews\"\n >\n > &\n MarkdownConfig;\n search: Required<SearchConfig>;\n components: ComponentsConfig;\n build: Required<BuildConfig>;\n}\n\nexport interface DocsFrontmatter {\n title?: string;\n description?: string;\n slug?: string;\n draft?: boolean;\n sidebar?: false | { label?: string; order?: number; group?: string };\n toc?: false | { minHeadingLevel?: number; maxHeadingLevel?: number };\n editUrl?: false | string;\n /** Starlight page layout. */\n template?: \"doc\" | \"splash\";\n hero?: {\n title?: string;\n tagline?: string;\n image?:\n | { html: string }\n | { file: string; alt?: string }\n | { dark: string; light: string; alt?: string };\n actions?: Array<{\n text: string;\n link: string;\n variant?: \"primary\" | \"secondary\" | \"minimal\";\n }>;\n };\n lastUpdated?: boolean | Date;\n prev?: false | string;\n next?: false | string;\n search?: boolean;\n head?: Array<Record<string, unknown>>;\n}\n\nexport interface DocsHeading {\n depth: number;\n text: string;\n slug: string;\n line?: number;\n}\n\nexport interface DocsReference {\n original: string;\n resolved?: string;\n targetSource?: string;\n fragment?: string;\n line?: number;\n}\n\nexport interface DocsAsset extends DocsReference {\n sourcePath?: string;\n publicPath?: string;\n hash?: string;\n bytes?: number;\n}\n\nexport interface DocsEntry {\n id: string;\n sourcePath: string;\n absolutePath: string;\n sourceRoot: string;\n route: string;\n title: string;\n description?: string;\n frontmatter: DocsFrontmatter;\n headings: DocsHeading[];\n body: string;\n transformedBody: string;\n ast: Root;\n links: DocsReference[];\n assets: DocsAsset[];\n trust: \"markdown\" | \"mdx\";\n package?: { requested: string; resolved: string };\n}\n\nexport interface DocsRoute {\n route: string;\n entryId: string;\n sourcePath: string;\n title: string;\n}\n\nexport interface DocsGraph {\n root: string;\n config: NormalizedDocsConfig;\n entries: DocsEntry[];\n routes: DocsRoute[];\n assets: DocsAsset[];\n diagnostics: DocsDiagnostic[];\n entryByRoute(route: string): DocsEntry | undefined;\n entryBySource(sourcePath: string): DocsEntry | undefined;\n}\n\nexport interface PackageLockSource {\n requested: string;\n resolved: string;\n registry: string;\n integrity: string;\n vendored?: string;\n}\n\nexport interface CookbookLock {\n schemaVersion: 1;\n sources: PackageLockSource[];\n}\n\nexport interface PackageManifest {\n name: string;\n version: string;\n description?: string;\n homepage?: string;\n repository?: string | { type?: string; url?: string; directory?: string };\n cookbook?: {\n index?: string;\n include?: string[];\n exclude?: string[];\n theme?: { brand?: BrandConfig };\n };\n _integrity?: string;\n _resolved?: string;\n}\n\nexport interface PackageDiscovery {\n root: string;\n manifest: PackageManifest;\n home?: string;\n pages: string[];\n assets: string[];\n}\n\nexport interface CreateDocsGraphOptions {\n root?: string;\n config?: DocsConfig;\n lock?: CookbookLock;\n}\n"],"mappings":";;;;AAiLA,MAAa,2BAA2B;CACtC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;AAKA,MAAa,kCAAkC;CAC7C,MAAM;EAAC;EAAY;EAAY;CAAW;CAC1C,gBAAgB;EACd;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,QAAQ;EACN;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,MAAM;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,gBAAgB;EACd;EACA;EACA;EACA;EACA;EACA;CACF;CACA,MAAM,CAAC,OAAO,MAAM;CACpB,mBAAmB;EACjB;EACA;EACA;EACA;EACA;EACA;CACF;CACA,iBAAiB;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,eAAe;EAAC;EAAS;EAAQ;EAAmB;CAAY;CAChE,SAAS;EAAC;EAAW;EAAQ;CAAU;CACvC,kBAAkB,CAAC,QAAQ;CAC3B,sBAAsB;EACpB;EACA;EACA;EACA;EACA;EACA;CACF;CACA,uBAAuB;EACrB;EACA;EACA;EACA;EACA;EACA;CACF;CACA,gBAAgB,CAAC;CACjB,SAAS;EAAC;EAAW;EAAS;EAAS;EAAQ;EAAW;CAAK;CAC/D,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,OAAO,CAAC,QAAQ,QAAQ;CACxB,MAAM,CAAC;CACP,iBAAiB;EACf;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,aAAa;EACX;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,eAAe;EACb;EACA;EACA;EACA;EACA;CACF;CACA,iBAAiB;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/project/index.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\nimport { createJiti } from \"jiti\";\nimport { normalizeDocsConfig } from \"../config/index.js\";\nimport type { DocsConfig } from \"../types.js\";\n\nexport interface DocsProjectOptions {\n /** Directory to search for configuration; defaults to the current directory. */\n root?: string;\n /** Explicit configuration path, relative to root. False disables discovery. */\n configFile?: string | false;\n /** Inline configuration takes precedence over discovery. */\n config?: DocsConfig;\n}\n\nexport interface DocsProject {\n root: string;\n config: DocsConfig;\n configFile?: string;\n}\n\n/** Resolve the same configuration and content root for the CLI and renderer. */\nexport async function resolveDocsProject(\n options: DocsProjectOptions = {},\n): Promise<DocsProject> {\n const directory = resolve(options.root ?? process.cwd());\n let config = options.config;\n let configFile: string | undefined;\n if (config === undefined && options.configFile !== false) {\n configFile = options.configFile\n ? resolve(directory, options.configFile)\n : [\n \"docs.config.ts\",\n \"docs.config.mts\",\n \"docs.config.js\",\n \"docs.config.mjs\",\n ]\n .map((name) => resolve(directory, name))\n .find(existsSync);\n if (configFile) {\n if (!existsSync(configFile)) {\n throw new Error(\n `Documentation configuration does not exist: ${configFile}.`,\n );\n }\n const jiti = createJiti(import.meta.url, {\n interopDefault: true,\n moduleCache: false,\n });\n // Native ESM imports remain cached even with moduleCache disabled.\n // Transpile the entry so configuration restarts see edits in every format.\n const loaded = (await jiti.evalModule(\n await readFile(configFile, \"utf8\"),\n {\n filename: configFile,\n async: true,\n forceTranspile: true,\n },\n )) as { default?: DocsConfig };\n config = loaded.default ?? (loaded as DocsConfig);\n }\n }\n config ??= {};\n normalizeDocsConfig(config);\n return {\n root: resolve(\n configFile ? dirname(configFile) : directory,\n config.root ?? \".\",\n ),\n config,\n ...(configFile ? { configFile } : {}),\n };\n}\n"],"mappings":";;;;;;;;AAuBA,eAAsB,mBACpB,UAA8B,CAAC,GACT;CACtB,MAAM,YAAY,QAAQ,QAAQ,QAAQ,QAAQ,IAAI,CAAC;CACvD,IAAI,SAAS,QAAQ;CACrB,IAAI;CACJ,IAAI,WAAW,KAAA,KAAa,QAAQ,eAAe,OAAO;EACxD,aAAa,QAAQ,aACjB,QAAQ,WAAW,QAAQ,UAAU,IACrC;GACE;GACA;GACA;GACA;EACF,CAAC,CACE,KAAK,SAAS,QAAQ,WAAW,IAAI,CAAC,CAAC,CACvC,KAAK,UAAU;EACtB,IAAI,YAAY;GACd,IAAI,CAAC,WAAW,UAAU,GACxB,MAAM,IAAI,MACR,+CAA+C,WAAW,EAC5D;GAQF,MAAM,SAAU,MANH,WAAW,YAAY,KAAK;IACvC,gBAAgB;IAChB,aAAa;GACf,CAGyB,CAAC,CAAC,WACzB,MAAM,SAAS,YAAY,MAAM,GACjC;IACE,UAAU;IACV,OAAO;IACP,gBAAgB;GAClB,CACF;GACA,SAAS,OAAO,WAAY;EAC9B;CACF;CACA,WAAW,CAAC;CACZ,oBAAoB,MAAM;CAC1B,OAAO;EACL,MAAM,QACJ,aAAa,QAAQ,UAAU,IAAI,WACnC,OAAO,QAAQ,GACjB;EACA;EACA,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;CACrC;AACF"}
@@ -1,4 +1,4 @@
1
- import { J as Heading, Q as Root, S as DocsHeading, X as Paragraph, Y as Link, Z as PhrasingContent, q as Content } from "../types-m7SvwRsi.js";
1
+ import { J as Heading, Q as Root, S as DocsHeading, X as Paragraph, Y as Link, Z as PhrasingContent, q as Content } from "../types-B-msp1dH.js";
2
2
  //#region src/markdown/index.d.ts
3
3
  interface ParsedMarkdown {
4
4
  ast: Root;
@@ -6,9 +6,13 @@ interface ParsedMarkdown {
6
6
  firstHeading?: string;
7
7
  description?: string;
8
8
  }
9
- declare function parseMarkdown(body: string): ParsedMarkdown;
9
+ declare function parseMarkdown(body: string, options?: {
10
+ mdx?: boolean;
11
+ }): ParsedMarkdown;
10
12
  declare function textContent(node: Heading | Paragraph | PhrasingContent): string;
11
- declare function serializeMarkdown(ast: Root): string;
13
+ declare function serializeMarkdown(ast: Root, options?: {
14
+ mdx?: boolean;
15
+ }): string;
12
16
  declare function removeRenderedTitle(ast: Root, title: string): void;
13
17
  declare function stripLeadingBadgeBlock(ast: Root): void;
14
18
  declare function linksIn(ast: Root): Link[];
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/markdown/index.ts"],"mappings":";;UAgBiB;EACf,KAAK;EACL,UAAU;EACV;EACA;;iBAGc,cAAc,eAAe;iBA8C7B,YACd,MAAM,UAAU,YAAY;iBASd,kBAAkB,KAAK;iBAIvB,oBAAoB,KAAK,MAAM;iBAW/B,uBAAuB,KAAK;iBAgB5B,QAAQ,KAAK,OAAO;iBAMpB,SAAS,KAAK,OAAO;iBAIrB,WAAW,KAAK,OAAO"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/markdown/index.ts"],"mappings":";;UAkBiB;EACf,KAAK;EACL,UAAU;EACV;EACA;;iBAGc,cACd,cACA;EAAW;IACV;iBAiDa,YACd,MAAM,UAAU,YAAY;iBASd,kBACd,KAAK,MACL;EAAW;;iBAOG,oBAAoB,KAAK,MAAM;iBAY/B,uBAAuB,KAAK;iBAgB5B,QAAQ,KAAK,OAAO;iBAMpB,SAAS,KAAK,OAAO;iBAIrB,WAAW,KAAK,OAAO"}
@@ -1,14 +1,16 @@
1
1
  import { visit } from "unist-util-visit";
2
2
  import GithubSlugger from "github-slugger";
3
3
  import { gfmFromMarkdown, gfmToMarkdown } from "mdast-util-gfm";
4
+ import { mdxFromMarkdown, mdxToMarkdown } from "mdast-util-mdx";
4
5
  import { fromMarkdown } from "mdast-util-from-markdown";
5
6
  import { gfm } from "micromark-extension-gfm";
7
+ import { mdxjs } from "micromark-extension-mdxjs";
6
8
  import { toMarkdown } from "mdast-util-to-markdown";
7
9
  //#region src/markdown/index.ts
8
- function parseMarkdown(body) {
10
+ function parseMarkdown(body, options = {}) {
9
11
  const ast = fromMarkdown(body, {
10
- extensions: [gfm()],
11
- mdastExtensions: [gfmFromMarkdown()]
12
+ extensions: [gfm(), ...options.mdx ? [mdxjs()] : []],
13
+ mdastExtensions: [gfmFromMarkdown(), ...options.mdx ? [mdxFromMarkdown()] : []]
12
14
  });
13
15
  const slugger = new GithubSlugger();
14
16
  const headings = [];
@@ -53,12 +55,13 @@ function textContent(node) {
53
55
  if (node.type === "image") return node.alt ?? "";
54
56
  return "";
55
57
  }
56
- function serializeMarkdown(ast) {
57
- return toMarkdown(ast, { extensions: [gfmToMarkdown()] });
58
+ function serializeMarkdown(ast, options = {}) {
59
+ return toMarkdown(ast, { extensions: [gfmToMarkdown(), ...options.mdx ? [mdxToMarkdown()] : []] });
58
60
  }
59
61
  function removeRenderedTitle(ast, title) {
60
- const first = ast.children[0];
61
- if (first?.type === "heading" && first.depth === 1 && textContent(first) === title) ast.children.shift();
62
+ const index = ast.children.findIndex((node) => node.type !== "mdxjsEsm");
63
+ const first = ast.children[index];
64
+ if (first?.type === "heading" && first.depth === 1 && textContent(first) === title) ast.children.splice(index, 1);
62
65
  }
63
66
  function stripLeadingBadgeBlock(ast) {
64
67
  while (ast.children[0]?.type === "paragraph") {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/markdown/index.ts"],"sourcesContent":["import GithubSlugger from \"github-slugger\";\nimport { gfmFromMarkdown, gfmToMarkdown } from \"mdast-util-gfm\";\nimport { fromMarkdown } from \"mdast-util-from-markdown\";\nimport { gfm } from \"micromark-extension-gfm\";\nimport { toMarkdown } from \"mdast-util-to-markdown\";\nimport type {\n Content,\n Heading,\n Link,\n Paragraph,\n PhrasingContent,\n Root,\n} from \"mdast\";\nimport { visit } from \"unist-util-visit\";\nimport type { DocsHeading } from \"../types.js\";\n\nexport interface ParsedMarkdown {\n ast: Root;\n headings: DocsHeading[];\n firstHeading?: string;\n description?: string;\n}\n\nexport function parseMarkdown(body: string): ParsedMarkdown {\n const ast = fromMarkdown(body, {\n extensions: [gfm()],\n mdastExtensions: [gfmFromMarkdown()],\n });\n const slugger = new GithubSlugger();\n const headings: DocsHeading[] = [];\n let firstHeading: string | undefined;\n let description: string | undefined;\n\n visit(ast, (node) => {\n if (node.type === \"heading\") {\n const text = textContent(node);\n const slug = slugger.slug(text);\n firstHeading ??= node.depth === 1 ? text : undefined;\n headings.push({\n depth: node.depth,\n text,\n slug,\n ...(node.position?.start.line\n ? { line: node.position.start.line }\n : {}),\n });\n } else if (description === undefined && node.type === \"paragraph\") {\n const text = textContent(node).replace(/\\s+/g, \" \").trim();\n if (isSuitableDescription(node, text)) description = text.slice(0, 240);\n }\n });\n\n return {\n ast,\n headings,\n ...(firstHeading ? { firstHeading } : {}),\n ...(description ? { description } : {}),\n };\n}\n\nfunction isSuitableDescription(node: Paragraph, text: string): boolean {\n if (text.length < 20) return false;\n return !node.children.every((child) =>\n [\"image\", \"imageReference\", \"link\", \"linkReference\", \"html\"].includes(\n child.type,\n ),\n );\n}\n\nexport function textContent(\n node: Heading | Paragraph | PhrasingContent,\n): string {\n if (\"value\" in node && typeof node.value === \"string\") return node.value;\n if (\"children\" in node)\n return node.children.map((child) => textContent(child)).join(\"\");\n if (node.type === \"image\") return node.alt ?? \"\";\n return \"\";\n}\n\nexport function serializeMarkdown(ast: Root): string {\n return toMarkdown(ast, { extensions: [gfmToMarkdown()] });\n}\n\nexport function removeRenderedTitle(ast: Root, title: string): void {\n const first = ast.children[0];\n if (\n first?.type === \"heading\" &&\n first.depth === 1 &&\n textContent(first) === title\n ) {\n ast.children.shift();\n }\n}\n\nexport function stripLeadingBadgeBlock(ast: Root): void {\n while (ast.children[0]?.type === \"paragraph\") {\n const paragraph = ast.children[0];\n const onlyBadgeLike = paragraph.children.every((node) => {\n if (node.type === \"text\") return node.value.trim() === \"\";\n if (node.type === \"image\" || node.type === \"imageReference\") return true;\n if (node.type === \"link\") {\n return node.children.every((child) => child.type === \"image\");\n }\n return false;\n });\n if (!onlyBadgeLike) break;\n ast.children.shift();\n }\n}\n\nexport function linksIn(ast: Root): Link[] {\n const links: Link[] = [];\n visit(ast, \"link\", (node) => links.push(node));\n return links;\n}\n\nexport function cloneAst(ast: Root): Root {\n return structuredClone(ast);\n}\n\nexport function childrenOf(ast: Root): Content[] {\n return ast.children;\n}\n"],"mappings":";;;;;;;AAuBA,SAAgB,cAAc,MAA8B;CAC1D,MAAM,MAAM,aAAa,MAAM;EAC7B,YAAY,CAAC,IAAI,CAAC;EAClB,iBAAiB,CAAC,gBAAgB,CAAC;CACrC,CAAC;CACD,MAAM,UAAU,IAAI,cAAc;CAClC,MAAM,WAA0B,CAAC;CACjC,IAAI;CACJ,IAAI;CAEJ,MAAM,MAAM,SAAS;EACnB,IAAI,KAAK,SAAS,WAAW;GAC3B,MAAM,OAAO,YAAY,IAAI;GAC7B,MAAM,OAAO,QAAQ,KAAK,IAAI;GAC9B,iBAAiB,KAAK,UAAU,IAAI,OAAO,KAAA;GAC3C,SAAS,KAAK;IACZ,OAAO,KAAK;IACZ;IACA;IACA,GAAI,KAAK,UAAU,MAAM,OACrB,EAAE,MAAM,KAAK,SAAS,MAAM,KAAK,IACjC,CAAC;GACP,CAAC;EACH,OAAO,IAAI,gBAAgB,KAAA,KAAa,KAAK,SAAS,aAAa;GACjE,MAAM,OAAO,YAAY,IAAI,CAAC,CAAC,QAAQ,QAAQ,GAAG,CAAC,CAAC,KAAK;GACzD,IAAI,sBAAsB,MAAM,IAAI,GAAG,cAAc,KAAK,MAAM,GAAG,GAAG;EACxE;CACF,CAAC;CAED,OAAO;EACL;EACA;EACA,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;EACvC,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;CACvC;AACF;AAEA,SAAS,sBAAsB,MAAiB,MAAuB;CACrE,IAAI,KAAK,SAAS,IAAI,OAAO;CAC7B,OAAO,CAAC,KAAK,SAAS,OAAO,UAC3B;EAAC;EAAS;EAAkB;EAAQ;EAAiB;CAAM,CAAC,CAAC,SAC3D,MAAM,IACR,CACF;AACF;AAEA,SAAgB,YACd,MACQ;CACR,IAAI,WAAW,QAAQ,OAAO,KAAK,UAAU,UAAU,OAAO,KAAK;CACnE,IAAI,cAAc,MAChB,OAAO,KAAK,SAAS,KAAK,UAAU,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE;CACjE,IAAI,KAAK,SAAS,SAAS,OAAO,KAAK,OAAO;CAC9C,OAAO;AACT;AAEA,SAAgB,kBAAkB,KAAmB;CACnD,OAAO,WAAW,KAAK,EAAE,YAAY,CAAC,cAAc,CAAC,EAAE,CAAC;AAC1D;AAEA,SAAgB,oBAAoB,KAAW,OAAqB;CAClE,MAAM,QAAQ,IAAI,SAAS;CAC3B,IACE,OAAO,SAAS,aAChB,MAAM,UAAU,KAChB,YAAY,KAAK,MAAM,OAEvB,IAAI,SAAS,MAAM;AAEvB;AAEA,SAAgB,uBAAuB,KAAiB;CACtD,OAAO,IAAI,SAAS,EAAE,EAAE,SAAS,aAAa;EAU5C,IAAI,CATc,IAAI,SAAS,EACA,CAAC,SAAS,OAAO,SAAS;GACvD,IAAI,KAAK,SAAS,QAAQ,OAAO,KAAK,MAAM,KAAK,MAAM;GACvD,IAAI,KAAK,SAAS,WAAW,KAAK,SAAS,kBAAkB,OAAO;GACpE,IAAI,KAAK,SAAS,QAChB,OAAO,KAAK,SAAS,OAAO,UAAU,MAAM,SAAS,OAAO;GAE9D,OAAO;EACT,CACiB,GAAG;EACpB,IAAI,SAAS,MAAM;CACrB;AACF;AAEA,SAAgB,QAAQ,KAAmB;CACzC,MAAM,QAAgB,CAAC;CACvB,MAAM,KAAK,SAAS,SAAS,MAAM,KAAK,IAAI,CAAC;CAC7C,OAAO;AACT;AAEA,SAAgB,SAAS,KAAiB;CACxC,OAAO,gBAAgB,GAAG;AAC5B;AAEA,SAAgB,WAAW,KAAsB;CAC/C,OAAO,IAAI;AACb"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/markdown/index.ts"],"sourcesContent":["import GithubSlugger from \"github-slugger\";\nimport { gfmFromMarkdown, gfmToMarkdown } from \"mdast-util-gfm\";\nimport { mdxFromMarkdown, mdxToMarkdown } from \"mdast-util-mdx\";\nimport { fromMarkdown } from \"mdast-util-from-markdown\";\nimport { gfm } from \"micromark-extension-gfm\";\nimport { mdxjs } from \"micromark-extension-mdxjs\";\nimport { toMarkdown } from \"mdast-util-to-markdown\";\nimport type {\n Content,\n Heading,\n Link,\n Paragraph,\n PhrasingContent,\n Root,\n} from \"mdast\";\nimport { visit } from \"unist-util-visit\";\nimport type { DocsHeading } from \"../types.js\";\n\nexport interface ParsedMarkdown {\n ast: Root;\n headings: DocsHeading[];\n firstHeading?: string;\n description?: string;\n}\n\nexport function parseMarkdown(\n body: string,\n options: { mdx?: boolean } = {},\n): ParsedMarkdown {\n const ast = fromMarkdown(body, {\n extensions: [gfm(), ...(options.mdx ? [mdxjs()] : [])],\n mdastExtensions: [\n gfmFromMarkdown(),\n ...(options.mdx ? [mdxFromMarkdown()] : []),\n ],\n });\n const slugger = new GithubSlugger();\n const headings: DocsHeading[] = [];\n let firstHeading: string | undefined;\n let description: string | undefined;\n\n visit(ast, (node) => {\n if (node.type === \"heading\") {\n const text = textContent(node);\n const slug = slugger.slug(text);\n firstHeading ??= node.depth === 1 ? text : undefined;\n headings.push({\n depth: node.depth,\n text,\n slug,\n ...(node.position?.start.line\n ? { line: node.position.start.line }\n : {}),\n });\n } else if (description === undefined && node.type === \"paragraph\") {\n const text = textContent(node).replace(/\\s+/g, \" \").trim();\n if (isSuitableDescription(node, text)) description = text.slice(0, 240);\n }\n });\n\n return {\n ast,\n headings,\n ...(firstHeading ? { firstHeading } : {}),\n ...(description ? { description } : {}),\n };\n}\n\nfunction isSuitableDescription(node: Paragraph, text: string): boolean {\n if (text.length < 20) return false;\n return !node.children.every((child) =>\n [\"image\", \"imageReference\", \"link\", \"linkReference\", \"html\"].includes(\n child.type,\n ),\n );\n}\n\nexport function textContent(\n node: Heading | Paragraph | PhrasingContent,\n): string {\n if (\"value\" in node && typeof node.value === \"string\") return node.value;\n if (\"children\" in node)\n return node.children.map((child) => textContent(child)).join(\"\");\n if (node.type === \"image\") return node.alt ?? \"\";\n return \"\";\n}\n\nexport function serializeMarkdown(\n ast: Root,\n options: { mdx?: boolean } = {},\n): string {\n return toMarkdown(ast, {\n extensions: [gfmToMarkdown(), ...(options.mdx ? [mdxToMarkdown()] : [])],\n });\n}\n\nexport function removeRenderedTitle(ast: Root, title: string): void {\n const index = ast.children.findIndex((node) => node.type !== \"mdxjsEsm\");\n const first = ast.children[index];\n if (\n first?.type === \"heading\" &&\n first.depth === 1 &&\n textContent(first) === title\n ) {\n ast.children.splice(index, 1);\n }\n}\n\nexport function stripLeadingBadgeBlock(ast: Root): void {\n while (ast.children[0]?.type === \"paragraph\") {\n const paragraph = ast.children[0];\n const onlyBadgeLike = paragraph.children.every((node) => {\n if (node.type === \"text\") return node.value.trim() === \"\";\n if (node.type === \"image\" || node.type === \"imageReference\") return true;\n if (node.type === \"link\") {\n return node.children.every((child) => child.type === \"image\");\n }\n return false;\n });\n if (!onlyBadgeLike) break;\n ast.children.shift();\n }\n}\n\nexport function linksIn(ast: Root): Link[] {\n const links: Link[] = [];\n visit(ast, \"link\", (node) => links.push(node));\n return links;\n}\n\nexport function cloneAst(ast: Root): Root {\n return structuredClone(ast);\n}\n\nexport function childrenOf(ast: Root): Content[] {\n return ast.children;\n}\n"],"mappings":";;;;;;;;;AAyBA,SAAgB,cACd,MACA,UAA6B,CAAC,GACd;CAChB,MAAM,MAAM,aAAa,MAAM;EAC7B,YAAY,CAAC,IAAI,GAAG,GAAI,QAAQ,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAE;EACrD,iBAAiB,CACf,gBAAgB,GAChB,GAAI,QAAQ,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAC3C;CACF,CAAC;CACD,MAAM,UAAU,IAAI,cAAc;CAClC,MAAM,WAA0B,CAAC;CACjC,IAAI;CACJ,IAAI;CAEJ,MAAM,MAAM,SAAS;EACnB,IAAI,KAAK,SAAS,WAAW;GAC3B,MAAM,OAAO,YAAY,IAAI;GAC7B,MAAM,OAAO,QAAQ,KAAK,IAAI;GAC9B,iBAAiB,KAAK,UAAU,IAAI,OAAO,KAAA;GAC3C,SAAS,KAAK;IACZ,OAAO,KAAK;IACZ;IACA;IACA,GAAI,KAAK,UAAU,MAAM,OACrB,EAAE,MAAM,KAAK,SAAS,MAAM,KAAK,IACjC,CAAC;GACP,CAAC;EACH,OAAO,IAAI,gBAAgB,KAAA,KAAa,KAAK,SAAS,aAAa;GACjE,MAAM,OAAO,YAAY,IAAI,CAAC,CAAC,QAAQ,QAAQ,GAAG,CAAC,CAAC,KAAK;GACzD,IAAI,sBAAsB,MAAM,IAAI,GAAG,cAAc,KAAK,MAAM,GAAG,GAAG;EACxE;CACF,CAAC;CAED,OAAO;EACL;EACA;EACA,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;EACvC,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;CACvC;AACF;AAEA,SAAS,sBAAsB,MAAiB,MAAuB;CACrE,IAAI,KAAK,SAAS,IAAI,OAAO;CAC7B,OAAO,CAAC,KAAK,SAAS,OAAO,UAC3B;EAAC;EAAS;EAAkB;EAAQ;EAAiB;CAAM,CAAC,CAAC,SAC3D,MAAM,IACR,CACF;AACF;AAEA,SAAgB,YACd,MACQ;CACR,IAAI,WAAW,QAAQ,OAAO,KAAK,UAAU,UAAU,OAAO,KAAK;CACnE,IAAI,cAAc,MAChB,OAAO,KAAK,SAAS,KAAK,UAAU,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE;CACjE,IAAI,KAAK,SAAS,SAAS,OAAO,KAAK,OAAO;CAC9C,OAAO;AACT;AAEA,SAAgB,kBACd,KACA,UAA6B,CAAC,GACtB;CACR,OAAO,WAAW,KAAK,EACrB,YAAY,CAAC,cAAc,GAAG,GAAI,QAAQ,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAE,EACzE,CAAC;AACH;AAEA,SAAgB,oBAAoB,KAAW,OAAqB;CAClE,MAAM,QAAQ,IAAI,SAAS,WAAW,SAAS,KAAK,SAAS,UAAU;CACvE,MAAM,QAAQ,IAAI,SAAS;CAC3B,IACE,OAAO,SAAS,aAChB,MAAM,UAAU,KAChB,YAAY,KAAK,MAAM,OAEvB,IAAI,SAAS,OAAO,OAAO,CAAC;AAEhC;AAEA,SAAgB,uBAAuB,KAAiB;CACtD,OAAO,IAAI,SAAS,EAAE,EAAE,SAAS,aAAa;EAU5C,IAAI,CATc,IAAI,SAAS,EACA,CAAC,SAAS,OAAO,SAAS;GACvD,IAAI,KAAK,SAAS,QAAQ,OAAO,KAAK,MAAM,KAAK,MAAM;GACvD,IAAI,KAAK,SAAS,WAAW,KAAK,SAAS,kBAAkB,OAAO;GACpE,IAAI,KAAK,SAAS,QAChB,OAAO,KAAK,SAAS,OAAO,UAAU,MAAM,SAAS,OAAO;GAE9D,OAAO;EACT,CACiB,GAAG;EACpB,IAAI,SAAS,MAAM;CACrB;AACF;AAEA,SAAgB,QAAQ,KAAmB;CACzC,MAAM,QAAgB,CAAC;CACvB,MAAM,KAAK,SAAS,SAAS,MAAM,KAAK,IAAI,CAAC;CAC7C,OAAO;AACT;AAEA,SAAgB,SAAS,KAAiB;CACxC,OAAO,gBAAgB,GAAG;AAC5B;AAEA,SAAgB,WAAW,KAAsB;CAC/C,OAAO,IAAI;AACb"}
@@ -1,5 +1,5 @@
1
- import { dirname, join } from "node:path";
2
1
  import { mkdir, mkdtemp, writeFile } from "node:fs/promises";
2
+ import { dirname, join } from "node:path";
3
3
  import { tmpdir } from "node:os";
4
4
  //#region src/testing/index.ts
5
5
  async function createDocsFixture(files) {
@@ -1,4 +1,5 @@
1
1
  import { GlazeColorValue } from "@tenphi/glaze";
2
+ import { Styles, StylesWithoutSelectors } from "@tenphi/tasty/core";
2
3
  //#region ../../node_modules/.pnpm/@types+unist@3.0.3/node_modules/@types/unist/index.d.ts
3
4
  // ## Interfaces
4
5
  /**
@@ -1093,29 +1094,39 @@ interface NavigationPlacement {
1093
1094
  group?: string;
1094
1095
  }
1095
1096
  type DocsSource = {
1097
+ /** Stable name for cross-source links and repeated mounts. */
1098
+ id?: string;
1099
+ routeBase?: string;
1100
+ } & ({
1096
1101
  file: string;
1102
+ root?: string;
1097
1103
  route?: string;
1098
1104
  title?: string;
1099
1105
  description?: string;
1100
1106
  navigation?: false | NavigationPlacement;
1101
1107
  } | {
1102
1108
  glob: string | string[];
1109
+ root?: string;
1103
1110
  base?: string;
1104
1111
  routeBase?: string;
1105
1112
  exclude?: string[];
1106
1113
  navigation?: "auto" | false;
1107
1114
  } | {
1108
1115
  package: string;
1116
+ registry?: string;
1109
1117
  include?: string[];
1110
1118
  exclude?: string[];
1111
1119
  index?: string;
1112
1120
  routeBase?: string;
1113
1121
  trust?: "markdown" | "mdx";
1114
- };
1122
+ });
1115
1123
  interface ContentConfig {
1116
1124
  sources?: DocsSource[];
1117
1125
  allowOutsideRoot?: boolean;
1126
+ /** Rewrite absolute links into the current repository to matching Cookbook routes. */
1118
1127
  localizeRepositoryLinks?: boolean;
1128
+ /** Keep unrelated metadata without exposing it as renderer frontmatter. */
1129
+ frontmatter?: "preserve" | "reject";
1119
1130
  }
1120
1131
  type NavigationItem = string | {
1121
1132
  label: string;
@@ -1194,6 +1205,10 @@ interface TypographyPresets {
1194
1205
  }
1195
1206
  /** Semantic palette inputs. Glaze resolves every value for all appearance modes. */
1196
1207
  interface ThemePaletteConfig {
1208
+ info?: GlazeColorValue;
1209
+ success?: GlazeColorValue;
1210
+ warning?: GlazeColorValue;
1211
+ danger?: GlazeColorValue;
1197
1212
  /** Light-scheme page surface; dark and high-contrast values adapt. */
1198
1213
  surface?: GlazeColorValue;
1199
1214
  /** Primary reading text seed, resolved against `surface`. */
@@ -1202,45 +1217,54 @@ interface ThemePaletteConfig {
1202
1217
  textSoft?: GlazeColorValue;
1203
1218
  }
1204
1219
  /** Cookbook UI surfaces whose default Tasty styles can be customized. */
1205
- declare const COOKBOOK_COMPONENT_NAMES: readonly ["Card", "ContrastSelect", "Footer", "Hero", "LanguageSelect", "Logo", "MarkdownCodeBlock", "MarkdownHeading", "MarkdownTable", "Mermaid", "MobileMenuFooter", "MobileNavigationTabs", "MobileTableOfContents", "PackageVersion", "Preview", "Sidebar", "Steps", "Tabs", "TableOfContents", "ThemeSelect", "TopNavigation", "StarlightHeader"];
1220
+ declare const COOKBOOK_COMPONENT_NAMES: readonly ["Card", "Callout", "CodeGroup", "Tab", "Footer", "Hero", "LanguageSelect", "Logo", "MarkdownCodeBlock", "MarkdownHeading", "MarkdownInlineCode", "MarkdownTable", "Mermaid", "MobileMenuFooter", "MobileMenuToggle", "MobileNavigationTabs", "MobileTableOfContents", "PackageVersion", "Preview", "Sidebar", "SocialIcons", "Steps", "Tabs", "TableOfContents", "ThemeSelect", "TopNavigation", "StarlightHeader"];
1206
1221
  type CookbookComponentName = (typeof COOKBOOK_COMPONENT_NAMES)[number];
1207
1222
  /** Named Tasty sub-elements available on each configurable Cookbook surface. */
1208
1223
  declare const COOKBOOK_COMPONENT_SUB_ELEMENTS: {
1209
1224
  readonly Card: readonly ["Heading2", "Heading3", "Paragraph"];
1210
- readonly ContrastSelect: readonly ["Label", "Icon", "IconSvg", "Select", "PickerIcon", "Picker", "OpenPicker", "Option", "HoverOption", "CheckedOption", "Checkmark"];
1225
+ readonly Callout: readonly ["Title", "Body", "Tip", "Caution", "Danger"];
1226
+ readonly CodeGroup: readonly ["Caption", "Pre", "Code"];
1227
+ readonly Tab: readonly ["Heading", "Hidden", "HiddenHeading"];
1211
1228
  readonly Footer: readonly ["Meta", "LoneMetaItem", "MetaLink", "HoverMetaLink", "Credit", "CreditLink", "HoverCreditLink"];
1212
1229
  readonly Hero: readonly ["Visual", "Stack", "Copy", "Title", "Tagline", "Actions", "Action", "HoverAction", "PrimaryAction", "SecondaryAction", "MinimalAction", "ActionIcon"];
1213
1230
  readonly LanguageSelect: readonly ["Label", "HoverLabel", "LabelIcon", "Select", "Caret", "Option"];
1214
1231
  readonly Logo: readonly ["Svg", "Mark"];
1215
1232
  readonly MarkdownCodeBlock: readonly ["Pre", "CopyButton", "HoverCopyButton", "CopiedButton", "CopyIcon", "CopiedIcon"];
1216
- readonly MarkdownHeading: readonly ["Heading", "Heading1", "Heading2", "Heading3", "Heading4", "Heading5", "Heading6", "Link", "HoverLink"];
1233
+ readonly MarkdownHeading: readonly ["Heading", "Heading1", "Heading2", "Heading3", "Heading4", "Heading5", "Heading6", "Link", "HoverLink", "LinkIcon"];
1217
1234
  readonly MarkdownTable: readonly ["Table", "Cell", "LastBodyRowCell", "HeaderCell"];
1235
+ readonly MarkdownInlineCode: readonly [];
1218
1236
  readonly Mermaid: readonly ["Diagram", "Text", "MonoText"];
1219
1237
  readonly MobileMenuFooter: readonly ["Social"];
1238
+ readonly MobileMenuToggle: readonly ["Control", "Icon", "HoverControl", "ActiveControl"];
1220
1239
  readonly MobileNavigationTabs: readonly ["Label", "List", "Item", "Link", "HoverLink", "CurrentLink"];
1221
1240
  readonly MobileTableOfContents: readonly ["Item", "Link", "LinkLabel", "HoverLink", "CurrentLink", "CurrentIndicator"];
1222
1241
  readonly PackageVersion: readonly [];
1223
1242
  readonly Preview: readonly ["Caption", "Stage", "Frame", "Code", "Summary", "Pre"];
1224
- readonly Sidebar: readonly ["CurrentLink", "Content", "List", "Item", "TopLevelSpacing", "NestedItem", "Control", "Summary", "GroupLabel", "GroupLabelText", "Link", "LinkLabel", "InteractiveControl", "SummaryMarker", "TopLevelLink"];
1243
+ readonly Sidebar: readonly ["CurrentLink", "OpenPane", "Content", "List", "Item", "TopLevelSpacing", "GroupSpacing", "NestedItem", "Control", "Summary", "GroupLabel", "GroupLabelText", "Link", "LinkLabel", "InteractiveControl", "SummaryMarker", "TopLevelLink"];
1225
1244
  readonly Steps: readonly ["Item", "Marker"];
1226
- readonly Tabs: readonly [];
1245
+ readonly SocialIcons: readonly ["Link", "HoverLink", "Icon"];
1246
+ readonly Tabs: readonly ["List", "Button", "SelectedButton", "FocusedButton"];
1227
1247
  readonly TableOfContents: readonly ["Heading", "List", "Item", "Link", "LinkLabel", "HoverLink", "CurrentLink"];
1228
- readonly ThemeSelect: readonly ["Label", "Icon", "IconSvg", "Select", "PickerIcon", "Picker", "OpenPicker", "Option", "HoverOption", "CheckedOption", "Checkmark"];
1248
+ readonly ThemeSelect: readonly ["Trigger", "HoverTrigger", "Icon", "Panel", "Section", "SectionSpacing", "SectionLabel", "Option", "HoverOption", "CheckedOption", "FocusedOption", "Input", "OptionIcon", "Checkmark", "SelectedCheckmark"];
1229
1249
  readonly TopNavigation: readonly ["Scrollbar", "Link", "HoverLink", "CurrentLink", "ActiveIndicator"];
1230
1250
  readonly StarlightHeader: readonly ["Primary", "TitleAndSearch", "Title", "Logo", "SiteTitle", "Search", "SearchElement", "Tools", "ToolItem", "Social", "MobileTheme"];
1231
1251
  };
1232
1252
  type CookbookComponentSubElementName<Name extends CookbookComponentName> = (typeof COOKBOOK_COMPONENT_SUB_ELEMENTS)[Name][number];
1233
1253
  /** A serializable partial Tasty style object, merged into the base internally. */
1234
- type ComponentStyles = Record<string, unknown> & {
1254
+ type ComponentStyles = StylesWithoutSelectors & {
1255
+ $?: string;
1235
1256
  mode?: never;
1257
+ recipe?: string;
1258
+ [token: `$${string}`]: Styles[string];
1259
+ [color: `#${string}`]: Styles[string];
1260
+ [state: `@${string}`]: Styles[string];
1236
1261
  };
1237
1262
  /** Style properties supplied by the user to override Cookbook defaults. */
1238
1263
  type ComponentStyleConfig = ComponentStyles;
1239
1264
  /** A component override with typed suggestions for its named sub-elements. */
1240
1265
  type CookbookComponentStyles<Name extends CookbookComponentName> = ComponentStyles & Partial<Record<CookbookComponentSubElementName<Name>, ComponentStyles>>;
1241
- type ComponentStylesConfig = { [Name in CookbookComponentName]?: CookbookComponentStyles<Name>; } & Record<string, ComponentStyleConfig | undefined>;
1266
+ type ComponentStylesConfig = { [Name in CookbookComponentName]?: CookbookComponentStyles<Name>; };
1242
1267
  interface ThemeConfig {
1243
- variant?: string;
1244
1268
  brand?: BrandConfig;
1245
1269
  palette?: ThemePaletteConfig;
1246
1270
  states?: Record<string, string>;
@@ -1248,15 +1272,14 @@ interface ThemeConfig {
1248
1272
  presets?: TypographyPresets;
1249
1273
  /** Tasty UI styles, keyed by Cookbook component or bridge name. */
1250
1274
  styles?: ComponentStylesConfig;
1275
+ /** Explicit registration and overrides for user-authored components. */
1276
+ customStyles?: Record<string, Styles>;
1251
1277
  contrastLevel?: number | "auto";
1252
1278
  }
1253
1279
  interface MarkdownConfig {
1254
1280
  stripLeadingBadges?: boolean;
1255
- rawHtml?: "sanitize" | "allow" | "reject";
1256
- strictLanguages?: boolean;
1257
- executablePreviews?: boolean;
1258
- remarkPlugins?: unknown[];
1259
- rehypePlugins?: unknown[];
1281
+ /** Raw HTML policy for trusted Markdown. Untrusted package Markdown is always sanitized. */
1282
+ rawHtml?: "allow" | "sanitize" | "strip" | "reject";
1260
1283
  }
1261
1284
  interface SearchConfig {
1262
1285
  enabled?: boolean;
@@ -1268,7 +1291,6 @@ interface ComponentsConfig {
1268
1291
  interface BuildConfig {
1269
1292
  strict?: boolean;
1270
1293
  ci?: boolean;
1271
- base?: string;
1272
1294
  cacheDir?: string;
1273
1295
  maxArtifactBytes?: number;
1274
1296
  maxUnpackedBytes?: number;
@@ -1277,6 +1299,10 @@ interface BuildConfig {
1277
1299
  maxAssetBytes?: number;
1278
1300
  }
1279
1301
  interface DocsConfig {
1302
+ /** Content and lock directory, relative to docs.config.ts (or the inline root). */
1303
+ root?: string;
1304
+ /** Old public routes mapped to current document routes. */
1305
+ redirects?: Record<string, string>;
1280
1306
  site?: SiteConfig;
1281
1307
  head?: HeadConfig[];
1282
1308
  /** Enable source-aware “Edit page” links. */
@@ -1296,6 +1322,7 @@ interface DocsConfig {
1296
1322
  build?: BuildConfig;
1297
1323
  }
1298
1324
  interface NormalizedDocsConfig {
1325
+ redirects: Record<string, string>;
1299
1326
  site: SiteConfig;
1300
1327
  head: HeadConfig[];
1301
1328
  editLink?: EditLinkConfig;
@@ -1307,12 +1334,15 @@ interface NormalizedDocsConfig {
1307
1334
  theme: ThemeConfig & {
1308
1335
  brand: BrandConfig;
1309
1336
  };
1310
- markdown: Required<Pick<MarkdownConfig, "stripLeadingBadges" | "rawHtml" | "strictLanguages" | "executablePreviews">> & MarkdownConfig;
1337
+ markdown: Required<Pick<MarkdownConfig, "stripLeadingBadges" | "rawHtml">> & MarkdownConfig;
1311
1338
  search: Required<SearchConfig>;
1312
1339
  components: ComponentsConfig;
1313
- build: Required<BuildConfig>;
1340
+ build: Required<BuildConfig> & {
1341
+ base: string;
1342
+ };
1314
1343
  }
1315
1344
  interface DocsFrontmatter {
1345
+ aliases?: string[];
1316
1346
  title?: string;
1317
1347
  description?: string;
1318
1348
  slug?: string;
@@ -1322,7 +1352,7 @@ interface DocsFrontmatter {
1322
1352
  order?: number;
1323
1353
  group?: string;
1324
1354
  };
1325
- toc?: false | {
1355
+ tableOfContents?: false | {
1326
1356
  minHeadingLevel?: number;
1327
1357
  maxHeadingLevel?: number;
1328
1358
  };
@@ -1349,9 +1379,18 @@ interface DocsFrontmatter {
1349
1379
  }>;
1350
1380
  };
1351
1381
  lastUpdated?: boolean | Date;
1352
- prev?: false | string;
1353
- next?: false | string;
1354
- search?: boolean;
1382
+ prev?: false | string | {
1383
+ link?: string;
1384
+ label?: string;
1385
+ };
1386
+ next?: false | string | {
1387
+ link?: string;
1388
+ label?: string;
1389
+ };
1390
+ banner?: {
1391
+ content: string;
1392
+ };
1393
+ pagefind?: boolean;
1355
1394
  head?: Array<Record<string, unknown>>;
1356
1395
  }
1357
1396
  interface DocsHeading {
@@ -1375,6 +1414,9 @@ interface DocsAsset extends DocsReference {
1375
1414
  }
1376
1415
  interface DocsEntry {
1377
1416
  id: string;
1417
+ sourceId: string;
1418
+ routeBase: string;
1419
+ metadata: Record<string, unknown>;
1378
1420
  sourcePath: string;
1379
1421
  absolutePath: string;
1380
1422
  sourceRoot: string;
@@ -1399,8 +1441,10 @@ interface DocsRoute {
1399
1441
  entryId: string;
1400
1442
  sourcePath: string;
1401
1443
  title: string;
1444
+ sidebar?: false | NavigationPlacement;
1402
1445
  }
1403
1446
  interface DocsGraph {
1447
+ redirects: Record<string, string>;
1404
1448
  root: string;
1405
1449
  config: NormalizedDocsConfig;
1406
1450
  entries: DocsEntry[];
@@ -1408,7 +1452,7 @@ interface DocsGraph {
1408
1452
  assets: DocsAsset[];
1409
1453
  diagnostics: DocsDiagnostic[];
1410
1454
  entryByRoute(route: string): DocsEntry | undefined;
1411
- entryBySource(sourcePath: string): DocsEntry | undefined;
1455
+ entryBySource(sourcePath: string, sourceId?: string): DocsEntry | undefined;
1412
1456
  }
1413
1457
  interface PackageLockSource {
1414
1458
  requested: string;
@@ -1453,7 +1497,9 @@ interface CreateDocsGraphOptions {
1453
1497
  root?: string;
1454
1498
  config?: DocsConfig;
1455
1499
  lock?: CookbookLock;
1500
+ /** Public URL base used when rewriting routes and assets. */
1501
+ base?: string;
1456
1502
  }
1457
1503
  //#endregion
1458
1504
  export { NavigationConfig as A, SiteIconConfig as B, DocsReference as C, HeadConfig as D, EditLinkConfig as E, PackageDiscovery as F, TypographyPreset as G, ThemePaletteConfig as H, PackageLockSource as I, Heading as J, TypographyPresets as K, PackageManifest as L, NavigationPlacement as M, NavigationTab as N, LocaleConfig as O, NormalizedDocsConfig as P, Root as Q, SearchConfig as R, DocsHeading as S, DocsSource as T, ThemeTokenValue as U, ThemeConfig as V, ThemeTokens as W, Paragraph as X, Link as Y, PhrasingContent as Z, DocsConfig as _, ComponentStyleConfig as a, DocsFrontmatter as b, ComponentsConfig as c, CookbookComponentStyles as d, CookbookComponentSubElementName as f, DocsAsset as g, DiagnosticSeverity as h, COOKBOOK_COMPONENT_SUB_ELEMENTS as i, NavigationItem as j, MarkdownConfig as k, ContentConfig as l, CreateDocsGraphOptions as m, BuildConfig as n, ComponentStyles as o, CookbookLock as p, Content as q, COOKBOOK_COMPONENT_NAMES as r, ComponentStylesConfig as s, BrandConfig as t, CookbookComponentName as u, DocsDiagnostic as v, DocsRoute as w, DocsGraph as x, DocsEntry as y, SiteConfig as z };
1459
- //# sourceMappingURL=types-m7SvwRsi.d.ts.map
1505
+ //# sourceMappingURL=types-B-msp1dH.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-B-msp1dH.d.ts","names":[],"sources":["../../../node_modules/.pnpm/@types+unist@3.0.3/node_modules/@types/unist/index.d.ts","../../../node_modules/.pnpm/@types+mdast@4.0.4/node_modules/@types/mdast/index.d.ts","../src/types.ts"],"x_google_ignoreList":[0,1],"mappings":"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KAAK,qDACtB;EACF,QAAQ,SAAS;EACjB,YAAY;EACZ,OAAO,SAAS;IAAiB;;;UAGlB;EACf;EACA;EACA;EACA;EACA;EACA;IAAoB;IAAgB;IAAgB;;EACpD;IACY;IAA0B;;EACtC;;EAEA;EACA;IACE;IACA;IACA;MACM;;MACA;MAAc;;MACd;MAAc;MAAe;;IACnC,UAAU;MACR;MACA;MACA;;;EAGJ,wBAAwB;EACxB;IAA0B;IAAe;;EACzC;IAA0B;IAAe;;EACzC;IAAW;;EACX;EACA,OAAO,MAAM;;UAGE;EACf;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;EACA;;UAGe,kBAAkB;EACjC;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA,UAAU;EACV;EACA;EACA;EACA;EACA;EACA;EACA,aAAa;EACb,UAAU;EACV;EACA;EACA,KAAK;EACL,OAAO;EACP,QAAQ;EACR;EACA;IAAY;IAAmB;;;UAGhB;EACf;EACA;EACA;EACA;EACA,kBAAkB;;UAGH;EACf,WAAW;EACX;EACA,QAAQ;EACR,SAAS;EACT,QAAQ;EACR,QAAQ;EACR,aAAa;EACb,aAAa,gBAAgB;EAC7B,cAAc,oBAAoB,oBAAoB;;UAGvC;EACf;EACA;EACA;EACA;EACA;;UAGe;EACf;EACA,SAAS;;UAGM;EACf;EACA;EACA;EACA;EACA;IAAwB;IAAe;IAAc;;EACrD;IACE;IACA;IACA;IACA;MAAU,QAAQ;;;EAEpB;EACA;;UAGe;EACf;EACA,UAAU;EACV;EACA;EACA;;UAGe;EACf;EACA,SAAS;EACT,OAAO;;EAEP"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tenphi/docs",
3
- "version": "0.13.0",
3
+ "version": "0.15.0",
4
4
  "description": "Repository-native content and configuration engine for Cookbook",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -51,18 +51,26 @@
51
51
  "license": "MIT",
52
52
  "dependencies": {
53
53
  "@tenphi/glaze": "2.0.0",
54
+ "@tenphi/tasty": "3.8.0",
54
55
  "github-slugger": "^2.0.0",
55
- "gray-matter": "^4.0.3",
56
+ "hast-util-from-html": "^2.0.3",
57
+ "hast-util-sanitize": "^5.0.2",
58
+ "hast-util-to-html": "^9.0.5",
59
+ "jiti": "^2.7.0",
56
60
  "mdast-util-from-markdown": "^2.0.2",
57
61
  "mdast-util-gfm": "^3.1.0",
62
+ "mdast-util-mdx": "^3.0.0",
58
63
  "mdast-util-to-markdown": "^2.1.2",
59
64
  "micromark-extension-gfm": "^3.0.0",
65
+ "micromark-extension-mdxjs": "^3.0.0",
60
66
  "npm-package-arg": "^13.0.2",
61
67
  "pacote": "^21.5.1",
62
68
  "tinyglobby": "^0.2.15",
63
- "unist-util-visit": "^5.0.0"
69
+ "unist-util-visit": "^5.0.0",
70
+ "yaml": "^2.9.1"
64
71
  },
65
72
  "devDependencies": {
73
+ "@types/hast": "^3.0.5",
66
74
  "@types/mdast": "^4.0.4",
67
75
  "@types/node": "^22.15.2",
68
76
  "@types/npm-package-arg": "^6.1.4",
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/config/index.ts"],"sourcesContent":["import type {\n DocsConfig,\n DocsDiagnostic,\n NormalizedDocsConfig,\n} from \"../types.js\";\n\nconst DEFAULT_BRAND = \"#315efb\";\nconst HEAD_KEYS = new Set([\"tag\", \"attrs\", \"content\"]);\nconst SITE_ICON_KEYS = new Set([\"source\", \"background\"]);\nconst ROOT_KEYS = new Set([\n \"site\",\n \"head\",\n \"editLink\",\n \"lastUpdated\",\n \"locales\",\n \"defaultLocale\",\n \"content\",\n \"navigation\",\n \"theme\",\n \"markdown\",\n \"search\",\n \"components\",\n \"build\",\n]);\n\nconst OBJECT_KEYS: Record<string, Set<string>> = {\n site: new Set([\n \"title\",\n \"version\",\n \"description\",\n \"url\",\n \"repository\",\n \"favicon\",\n ]),\n content: new Set([\"sources\", \"allowOutsideRoot\", \"localizeRepositoryLinks\"]),\n markdown: new Set([\n \"stripLeadingBadges\",\n \"rawHtml\",\n \"strictLanguages\",\n \"executablePreviews\",\n \"remarkPlugins\",\n \"rehypePlugins\",\n ]),\n search: new Set([\"enabled\"]),\n components: new Set([\"overrides\"]),\n theme: new Set([\n \"variant\",\n \"brand\",\n \"palette\",\n \"states\",\n \"tokens\",\n \"presets\",\n \"styles\",\n \"contrastLevel\",\n ]),\n build: new Set([\n \"strict\",\n \"ci\",\n \"base\",\n \"cacheDir\",\n \"maxArtifactBytes\",\n \"maxUnpackedBytes\",\n \"maxFiles\",\n \"maxPathDepth\",\n \"maxAssetBytes\",\n ]),\n};\n\nexport class DocsConfigError extends Error {\n readonly diagnostics: DocsDiagnostic[];\n\n constructor(diagnostics: DocsDiagnostic[]) {\n super(diagnostics.map((diagnostic) => diagnostic.message).join(\"\\n\"));\n this.name = \"DocsConfigError\";\n this.diagnostics = diagnostics;\n }\n}\n\nexport function validateConfig(config: DocsConfig): DocsDiagnostic[] {\n const diagnostics: DocsDiagnostic[] = [];\n for (const key of Object.keys(config)) {\n if (!ROOT_KEYS.has(key)) unknown(diagnostics, key);\n }\n for (const [section, keys] of Object.entries(OBJECT_KEYS)) {\n const value = config[section as keyof DocsConfig];\n if (\n value === undefined ||\n Array.isArray(value) ||\n typeof value !== \"object\"\n ) {\n continue;\n }\n for (const key of Object.keys(value)) {\n if (!keys.has(key)) unknown(diagnostics, `${section}.${key}`);\n }\n }\n\n const head = config.head;\n if (head !== undefined && !Array.isArray(head)) {\n invalid(diagnostics, \"head must be an array.\");\n } else {\n for (const [index, entry] of (head ?? []).entries()) {\n if (!isRecord(entry)) {\n invalid(diagnostics, `head[${index}] must be an object.`);\n continue;\n }\n for (const key of Object.keys(entry)) {\n if (!HEAD_KEYS.has(key)) {\n unknown(diagnostics, `head[${index}].${key}`);\n }\n }\n if (typeof entry.tag !== \"string\") {\n invalid(diagnostics, `head[${index}].tag must be a string.`);\n }\n if (entry.attrs !== undefined && !isRecord(entry.attrs)) {\n invalid(diagnostics, `head[${index}].attrs must be an object.`);\n } else {\n for (const [name, value] of Object.entries(entry.attrs ?? {})) {\n if (\n value !== undefined &&\n typeof value !== \"string\" &&\n typeof value !== \"boolean\"\n ) {\n invalid(\n diagnostics,\n `head[${index}].attrs.${name} must be a string or boolean.`,\n );\n }\n }\n }\n if (entry.content !== undefined && typeof entry.content !== \"string\") {\n invalid(diagnostics, `head[${index}].content must be a string.`);\n }\n }\n }\n\n const favicon = config.site?.favicon;\n if (favicon !== undefined) {\n if (typeof favicon === \"string\") {\n if (favicon.trim() === \"\") {\n invalid(diagnostics, \"site.favicon must be a non-empty local path.\");\n }\n } else if (!isRecord(favicon)) {\n invalid(\n diagnostics,\n \"site.favicon must be a local path or an object with a source path.\",\n );\n } else {\n for (const key of Object.keys(favicon)) {\n if (!SITE_ICON_KEYS.has(key)) {\n unknown(diagnostics, `site.favicon.${key}`);\n }\n }\n if (typeof favicon.source !== \"string\" || favicon.source.trim() === \"\") {\n invalid(diagnostics, \"site.favicon.source must be a non-empty string.\");\n }\n if (\n favicon.background !== undefined &&\n (typeof favicon.background !== \"string\" ||\n favicon.background.trim() === \"\")\n ) {\n invalid(\n diagnostics,\n \"site.favicon.background must be a non-empty color string.\",\n );\n }\n }\n }\n\n if (\n config.editLink !== undefined &&\n (!isRecord(config.editLink) || typeof config.editLink.baseUrl !== \"string\")\n ) {\n invalid(diagnostics, \"editLink must contain a string baseUrl.\");\n } else if (config.editLink !== undefined) {\n for (const key of Object.keys(config.editLink)) {\n if (key !== \"baseUrl\") unknown(diagnostics, `editLink.${key}`);\n }\n try {\n new URL(config.editLink.baseUrl);\n } catch {\n invalid(diagnostics, \"editLink.baseUrl must be an absolute URL.\");\n }\n }\n if (\n config.lastUpdated !== undefined &&\n typeof config.lastUpdated !== \"boolean\"\n ) {\n invalid(diagnostics, \"lastUpdated must be a boolean.\");\n }\n if (config.locales !== undefined && !isRecord(config.locales)) {\n invalid(diagnostics, \"locales must be an object.\");\n } else {\n for (const [key, locale] of Object.entries(config.locales ?? {})) {\n if (!isRecord(locale) || typeof locale.label !== \"string\") {\n invalid(diagnostics, `locales.${key} must contain a string label.`);\n continue;\n }\n for (const property of Object.keys(locale)) {\n if (![\"label\", \"lang\", \"dir\"].includes(property)) {\n unknown(diagnostics, `locales.${key}.${property}`);\n }\n }\n if (locale.lang !== undefined && typeof locale.lang !== \"string\") {\n invalid(diagnostics, `locales.${key}.lang must be a string.`);\n }\n if (\n locale.dir !== undefined &&\n locale.dir !== \"ltr\" &&\n locale.dir !== \"rtl\"\n ) {\n invalid(diagnostics, `locales.${key}.dir must be \"ltr\" or \"rtl\".`);\n }\n }\n }\n if (\n config.defaultLocale !== undefined &&\n typeof config.defaultLocale !== \"string\"\n ) {\n invalid(diagnostics, \"defaultLocale must be a string.\");\n } else if (\n config.defaultLocale !== undefined &&\n (config.locales === undefined || !(config.defaultLocale in config.locales))\n ) {\n invalid(\n diagnostics,\n `defaultLocale must match a key in locales; received \"${config.defaultLocale}\".`,\n );\n }\n\n const sources = config.content?.sources ?? [];\n for (const [index, source] of sources.entries()) {\n const variants = [\"file\", \"glob\", \"package\"].filter((key) => key in source);\n if (variants.length !== 1) {\n diagnostics.push({\n code: \"DOCS_CONFIG_INVALID\",\n severity: \"error\",\n message: `content.sources[${index}] must select exactly one of file, glob, or package.`,\n });\n }\n }\n\n const brand = config.theme?.brand;\n if (\n typeof brand === \"object\" &&\n brand !== null &&\n \"contrast\" in brand &&\n !brand.unsafeContrast\n ) {\n const target = brand.contrast?.apca;\n const normal = Array.isArray(target) ? target[0] : target;\n if (typeof normal === \"number\" && normal < 45) {\n diagnostics.push({\n code: \"DOCS_CONFIG_INVALID\",\n severity: \"error\",\n message:\n \"theme.brand.contrast.apca cannot be below 45 without unsafeContrast.\",\n hint: \"Remove the override, use 45 or higher, or explicitly set unsafeContrast: true.\",\n });\n }\n }\n\n for (const [name, entry] of Object.entries(config.theme?.styles ?? {})) {\n if (!isRecord(entry)) {\n invalid(\n diagnostics,\n `theme.styles.${name} must be a Tasty style object.`,\n );\n } else if (\"mode\" in entry) {\n invalid(\n diagnostics,\n `theme.styles.${name} must contain only the Tasty style properties to override, without a mode wrapper.`,\n );\n }\n }\n\n const componentOverrides = config.components?.overrides;\n if (componentOverrides !== undefined && !isRecord(componentOverrides)) {\n invalid(diagnostics, \"components.overrides must be an object.\");\n } else {\n for (const [name, override] of Object.entries(componentOverrides ?? {})) {\n if (typeof override === \"string\") continue;\n if (name === \"Footer\" && override === false) continue;\n invalid(\n diagnostics,\n `components.overrides.${name} must be an Astro component path${name === \"Footer\" ? \" or false\" : \"\"}.`,\n );\n }\n }\n return diagnostics;\n}\n\nfunction unknown(diagnostics: DocsDiagnostic[], path: string): void {\n diagnostics.push({\n code: \"DOCS_CONFIG_UNKNOWN_KEY\",\n severity: \"error\",\n message: `Unknown configuration key \"${path}\".`,\n });\n}\n\nfunction invalid(diagnostics: DocsDiagnostic[], message: string): void {\n diagnostics.push({\n code: \"DOCS_CONFIG_INVALID\",\n severity: \"error\",\n message,\n });\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function normalizeDocsConfig(\n config: DocsConfig = {},\n): NormalizedDocsConfig {\n const diagnostics = validateConfig(config);\n if (diagnostics.length > 0) throw new DocsConfigError(diagnostics);\n const navigation = Array.isArray(config.navigation)\n ? { items: config.navigation }\n : (config.navigation ?? {});\n\n return {\n site: { ...config.site },\n head: [...(config.head ?? [])],\n ...(config.editLink ? { editLink: { ...config.editLink } } : {}),\n lastUpdated: config.lastUpdated ?? false,\n ...(config.locales ? { locales: { ...config.locales } } : {}),\n ...(config.defaultLocale ? { defaultLocale: config.defaultLocale } : {}),\n content: {\n allowOutsideRoot: false,\n localizeRepositoryLinks: false,\n ...config.content,\n },\n navigation,\n theme: { ...config.theme, brand: config.theme?.brand ?? DEFAULT_BRAND },\n markdown: {\n stripLeadingBadges: true,\n rawHtml: \"sanitize\",\n strictLanguages: false,\n executablePreviews: true,\n ...config.markdown,\n },\n search: { enabled: true, ...config.search },\n components: { ...config.components },\n build: {\n strict: true,\n ci: process.env.CI === \"true\",\n base: \"/\",\n cacheDir: \"\",\n maxArtifactBytes: 25 * 1024 * 1024,\n maxUnpackedBytes: 100 * 1024 * 1024,\n maxFiles: 10_000,\n maxPathDepth: 24,\n maxAssetBytes: 20 * 1024 * 1024,\n ...config.build,\n },\n };\n}\n\nexport function defineDocsConfig<const T extends DocsConfig>(config: T): T {\n const diagnostics = validateConfig(config);\n if (diagnostics.length > 0) throw new DocsConfigError(diagnostics);\n return config;\n}\n\nexport type {\n BrandConfig,\n BuildConfig,\n ComponentStyleConfig,\n ComponentStyles,\n ComponentStylesConfig,\n CookbookComponentName,\n ComponentsConfig,\n ContentConfig,\n DocsConfig,\n DocsSource,\n EditLinkConfig,\n HeadConfig,\n LocaleConfig,\n MarkdownConfig,\n NavigationConfig,\n NavigationItem,\n NavigationTab,\n NormalizedDocsConfig,\n SearchConfig,\n SiteConfig,\n SiteIconConfig,\n ThemeConfig,\n ThemePaletteConfig,\n ThemeTokens,\n ThemeTokenValue,\n TypographyPreset,\n TypographyPresets,\n} from \"../types.js\";\n"],"mappings":"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"}