@tenphi/docs 0.25.0 → 0.25.1

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.
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-CC6qkQId.js","names":["isBrandDeclaration"],"sources":["../src/table-of-contents.ts","../src/publishing.ts","../src/theme/contrast.ts","../src/theme/palette.ts","../src/types.ts","../src/config/index.ts"],"sourcesContent":["export function validateTableOfContents(value: unknown): string[] {\n if (value === false) return [];\n if (!value || typeof value !== \"object\" || Array.isArray(value))\n return [\"tableOfContents must be false or an object.\"];\n const config = value as Record<string, unknown>;\n const errors: string[] = [];\n for (const key of Object.keys(config))\n if (![\"minHeadingLevel\", \"maxHeadingLevel\", \"mobile\"].includes(key))\n errors.push(`tableOfContents.${key} is not supported.`);\n for (const key of [\"minHeadingLevel\", \"maxHeadingLevel\"])\n if (\n config[key] !== undefined &&\n (!Number.isInteger(config[key]) ||\n Number(config[key]) < 1 ||\n Number(config[key]) > 6)\n )\n errors.push(`tableOfContents.${key} must be an integer from 1 to 6.`);\n if (config.mobile !== undefined && typeof config.mobile !== \"boolean\")\n errors.push(\"tableOfContents.mobile must be a boolean.\");\n if (\n typeof config.minHeadingLevel === \"number\" &&\n typeof config.maxHeadingLevel === \"number\" &&\n config.minHeadingLevel > config.maxHeadingLevel\n )\n errors.push(\n \"tableOfContents.minHeadingLevel cannot exceed maxHeadingLevel.\",\n );\n return errors;\n}\n","import type { DocsConfig, DocsEntry, SiteVersion } from \"./types.js\";\n\nexport type PublishingConfig = Pick<\n DocsConfig,\n \"site\" | \"locales\" | \"defaultLocale\"\n> & {\n build?: DocsConfig[\"build\"] & { base?: string };\n};\n\nexport function routeUrl(route: string, base = \"/\", site?: string): string {\n const path = `${base.replace(/\\/$/, \"\")}${route === \"/\" ? \"/\" : `${route}/`}`;\n return site ? new URL(path, site).href : path;\n}\n\n/** Version roots follow any locale prefix, e.g. /fr/v1/guide. */\nexport function routeVersion(\n route: string,\n config: Pick<DocsConfig, \"site\" | \"locales\">,\n): SiteVersion | undefined {\n const first = route.split(\"/\")[1];\n const path =\n first && first !== \"root\" && config.locales?.[first]\n ? route.slice(first.length + 1) || \"/\"\n : route;\n return [...(config.site?.versions ?? [])]\n .sort((a, b) => b.routeBase.length - a.routeBase.length)\n .find(\n (v) =>\n v.routeBase === \"/\" ||\n path === v.routeBase ||\n path.startsWith(`${v.routeBase}/`),\n );\n}\n\nexport function pagePublishing(\n entry: Pick<DocsEntry, \"route\" | \"frontmatter\" | \"title\">,\n config: PublishingConfig,\n) {\n const seo = config.site?.seo;\n const page = entry.frontmatter.seo;\n const version = routeVersion(entry.route, config);\n const index =\n !entry.frontmatter.draft &&\n seo?.index !== false &&\n version?.index !== false &&\n page?.index !== false;\n const url = routeUrl(entry.route, config.build?.base, config.site?.url);\n const canonical = page?.canonical ?? url;\n const siteTitle = config.site?.title ?? \"Documentation\";\n const title =\n page?.title ??\n (seo?.titleTemplate\n ? seo.titleTemplate\n .replaceAll(\"{title}\", entry.title)\n .replaceAll(\"{site}\", siteTitle)\n : entry.title === siteTitle\n ? entry.title\n : `${entry.title} | ${siteTitle}`);\n return {\n index,\n sitemap: index && canonical === url,\n canonical,\n title,\n version,\n image: page?.image ?? seo?.image,\n };\n}\n\nexport function validateSeo(value: unknown, kind: \"site\" | \"page\"): string[] {\n if (!value || typeof value !== \"object\" || Array.isArray(value))\n return [\"seo must be an object.\"];\n const seo = value as Record<string, unknown>;\n const errors: string[] = [];\n const allowed =\n kind === \"site\"\n ? [\"titleTemplate\", \"image\", \"index\", \"breadcrumbs\", \"copyPage\"]\n : [\"title\", \"canonical\", \"image\", \"index\", \"breadcrumbs\"];\n for (const key of Object.keys(seo))\n if (!allowed.includes(key)) errors.push(`seo.${key} is not supported.`);\n for (const key of [\"index\", \"copyPage\"])\n if (seo[key] !== undefined && typeof seo[key] !== \"boolean\")\n errors.push(`seo.${key} must be a boolean.`);\n if (\n seo.title !== undefined &&\n (typeof seo.title !== \"string\" || !seo.title.trim())\n )\n errors.push(\"seo.title must be non-empty text.\");\n if (\n seo.titleTemplate !== undefined &&\n (typeof seo.titleTemplate !== \"string\" ||\n !seo.titleTemplate.includes(\"{title}\") ||\n /\\{(?!title\\}|site\\})[^}]*\\}/.test(seo.titleTemplate))\n )\n errors.push(\n \"seo.titleTemplate must include {title} and may include {site}; other placeholders are not supported.\",\n );\n if (seo.canonical !== undefined && !absoluteUrl(seo.canonical))\n errors.push(\n \"seo.canonical must be an absolute HTTP(S) URL without credentials or a fragment.\",\n );\n if (seo.image !== undefined && seo.image !== false) {\n const image = seo.image;\n if (!image || typeof image !== \"object\" || Array.isArray(image))\n errors.push(\"seo.image must be false or {src, alt, width?, height?}.\");\n else {\n const img = image as Record<string, unknown>;\n for (const key of Object.keys(img))\n if (![\"src\", \"alt\", \"width\", \"height\"].includes(key))\n errors.push(`seo.image.${key} is not supported.`);\n if (\n !absoluteUrl(img.src) &&\n !(\n typeof img.src === \"string\" &&\n /^\\/(?!\\/)[^\\\\\\s?#]+$/.test(img.src) &&\n !img.src.split(\"/\").some((x) => x === \"..\" || x === \".\")\n )\n )\n errors.push(\n \"seo.image.src must be an HTTP(S) URL or root-relative public asset path.\",\n );\n if (typeof img.alt !== \"string\" || !img.alt.trim())\n errors.push(\"seo.image.alt must be non-empty text.\");\n for (const key of [\"width\", \"height\"])\n if (\n img[key] !== undefined &&\n (!Number.isInteger(img[key]) || Number(img[key]) <= 0)\n )\n errors.push(`seo.image.${key} must be a positive integer.`);\n if ((img.width === undefined) !== (img.height === undefined))\n errors.push(\n \"seo.image requires both width and height when dimensions are provided.\",\n );\n }\n }\n if (seo.breadcrumbs !== undefined) {\n if (kind === \"site\") {\n if (typeof seo.breadcrumbs !== \"boolean\")\n errors.push(\"seo.breadcrumbs must be a boolean.\");\n } else if (seo.breadcrumbs !== false) {\n if (!Array.isArray(seo.breadcrumbs) || seo.breadcrumbs.length < 2)\n errors.push(\n \"seo.breadcrumbs must be false or at least two {name, url} items.\",\n );\n else\n for (const item of seo.breadcrumbs) {\n if (\n !item ||\n typeof item !== \"object\" ||\n Object.keys(item).some((k) => k !== \"name\" && k !== \"url\") ||\n typeof item.name !== \"string\" ||\n !item.name.trim() ||\n !absoluteUrl(item.url)\n )\n errors.push(\n \"Each seo.breadcrumbs item needs a name and absolute HTTP(S) url.\",\n );\n }\n }\n }\n return errors;\n}\nfunction absoluteUrl(value: unknown): boolean {\n if (typeof value !== \"string\" || /[\\s\\\\]/.test(value)) return false;\n try {\n const u = new URL(value);\n return (\n /^https?:$/.test(u.protocol) && !u.hash && !u.username && !u.password\n );\n } catch {\n return false;\n }\n}\n","import {\n apcaContrast,\n inferRoleFromName,\n normalizeRole,\n oppositeRole,\n type Role,\n contrastRatioFromLuminance,\n okhslToSrgb,\n resolveContrastForLevel,\n variantToOkhsl,\n type ColorMap,\n type HCPair,\n type ContrastSpec,\n type ResolvedColor,\n type ResolvedColorVariant,\n} from \"@tenphi/glaze\";\nimport type { DocsDiagnostic } from \"../types.js\";\n\nconst COLOR_MODES = [\"light\", \"dark\", \"lightContrast\", \"darkContrast\"] as const;\nexport interface ColorContrastCheck {\n foreground: string;\n background: string;\n mode: (typeof COLOR_MODES)[number];\n metric: \"apca\" | \"wcag\";\n target: number;\n measured: number;\n passed: boolean;\n}\n\nfunction rgb(color: ResolvedColorVariant): number[] {\n const { h, s, l } = variantToOkhsl(color);\n return okhslToSrgb(h, s, l, color.pastel);\n}\nfunction composite(\n foreground: ResolvedColorVariant,\n background: number[],\n): number[] {\n const alpha = foreground.alpha ?? 1;\n return rgb(foreground).map(\n (channel, i) => channel * alpha + background[i]! * (1 - alpha),\n );\n}\nfunction luminance(channels: number[], metric: \"apca\" | \"wcag\"): number {\n // APCA uses display-channel power 2.4, not WCAG's piecewise sRGB EOTF.\n // Match Glaze's luminance basis and gamut clipping in both metrics.\n return channels.reduce(\n (sum, channel, i) =>\n sum +\n [0.2126, 0.7152, 0.0722][i]! *\n (metric === \"apca\"\n ? channel ** 2.4\n : channel <= 0.04045\n ? channel / 12.92\n : ((channel + 0.055) / 1.055) ** 2.4),\n 0,\n );\n}\nexport function measureColorContrast(\n foreground: ResolvedColorVariant,\n background: ResolvedColorVariant,\n metric: \"apca\" | \"wcag\" = \"apca\",\n underlay: ResolvedColorVariant = background,\n): number {\n const bg = composite(background, rgb(underlay));\n const fg = composite(foreground, bg);\n const yForeground = luminance(fg, metric);\n const yBackground = luminance(bg, metric);\n return metric === \"apca\"\n ? Math.abs(apcaContrast(yForeground, yBackground))\n : contrastRatioFromLuminance(yForeground, yBackground);\n}\n\nexport function checkColorContrast(\n colors: Map<string, ResolvedColor>,\n definitions: ColorMap,\n level: number | \"auto\" | undefined,\n brandTargets: [number, number],\n inferRole = true,\n): { checks: ColorContrastCheck[]; diagnostics: DocsDiagnostic[] } {\n const pairs = new Map<\n string,\n { foreground: string; background: string; spec: HCPair<ContrastSpec> }\n >();\n const add = (\n foreground: string,\n background: string,\n spec: HCPair<ContrastSpec>,\n ) => {\n const metric = resolveContrastForLevel(spec, 0).metric;\n const key = `${foreground}/${background}/${metric}`;\n const existing = pairs.get(key);\n if (!existing) pairs.set(key, { foreground, background, spec });\n else {\n const targets = [0, 100].map((value) =>\n Math.max(\n resolveContrastForLevel(spec, value).target,\n resolveContrastForLevel(existing.spec, value).target,\n ),\n ) as [number, number];\n existing.spec = metric === \"apca\" ? { apca: targets } : { wcag: targets };\n }\n };\n const roles = new Map<string, Role>();\n function role(name: string): Role {\n const cached = roles.get(name);\n if (cached) return cached;\n const definition = definitions[name]!;\n const explicit =\n \"role\" in definition ? normalizeRole(definition.role) : undefined;\n const inferred = inferRole ? inferRoleFromName(name) : undefined;\n const value =\n explicit ??\n inferred ??\n (\"base\" in definition && definition.base\n ? oppositeRole(role(definition.base))\n : \"text\");\n roles.set(name, value);\n return value;\n }\n // Validate every authored/default contrast declaration, including custom roles.\n for (const [name, definition] of Object.entries(definitions)) {\n if (\"type\" in definition || !definition.base || !definition.contrast)\n continue;\n const isSurface = role(name) === \"surface\";\n add(\n isSurface ? definition.base : name,\n isSurface ? name : definition.base,\n definition.contrast,\n );\n }\n // These minimums remain enforced when a consumer replaces a default definition.\n for (const role of [\"text\", \"heading\", \"text-soft\"])\n add(role, \"surface\", { wcag: [4.5, 7] });\n add(\"accent-text\", \"surface\", { apca: brandTargets });\n for (const background of [\n \"surface\",\n \"surface-2\",\n \"surface-3\",\n \"accent-surface-subtle\",\n \"accent-surface-2-subtle\",\n ])\n add(\"accent-text\", background, { wcag: [4.5, 7] });\n add(\"accent-surface-text\", \"accent-surface\", { wcag: [4.5, 7] });\n add(\"accent-surface-text\", \"accent-surface\", { apca: [60, 75] });\n add(\"logo-mark\", \"logo-surface\", { wcag: [3, 4.5] });\n for (const background of [\"surface\", \"surface-2\", \"surface-3\"])\n add(\"focus\", background, { wcag: [3, 4.5] });\n for (const role of [\n \"info\",\n \"success\",\n \"warning\",\n \"danger\",\n \"orange\",\n \"green\",\n \"blue\",\n \"purple\",\n \"red\",\n ]) {\n add(`${role}-text`, `${role}-surface`, { apca: [60, 75] });\n add(`${role}-text`, `${role}-surface`, { wcag: [4.5, 7] });\n }\n\n const checks: ColorContrastCheck[] = [];\n const diagnostics: DocsDiagnostic[] = [];\n for (const { foreground, background, spec } of pairs.values()) {\n for (const mode of COLOR_MODES) {\n const { metric, target } = resolveContrastForLevel(\n spec,\n mode.includes(\"Contrast\") ? 100 : typeof level === \"number\" ? level : 0,\n );\n const measured = measureColorContrast(\n colors.get(foreground)![mode],\n colors.get(background)![mode],\n metric,\n colors.get(\"surface\")![mode],\n );\n const passed = measured + (metric === \"apca\" ? 0.05 : 0.01) >= target;\n checks.push({\n foreground,\n background,\n mode,\n metric,\n target,\n measured,\n passed,\n });\n if (!passed)\n diagnostics.push({\n code:\n foreground === \"accent-text\" && background === \"surface\"\n ? \"DOCS_BRAND_CONTRAST_UNMET\"\n : \"DOCS_SEMANTIC_CONTRAST_UNMET\",\n severity: \"error\",\n message: `${foreground} on ${background} in ${mode}: ${metric === \"apca\" ? \"APCA Lc\" : \"WCAG ratio\"} ${measured.toFixed(2)}; required ${target}.`,\n hint: `Adjust theme.palette[\"${foreground}\"] or theme.palette[\"${background}\"] using tone, saturation, base, contrast, and autoFlip. Keep their contrast floor; a fixed mid-tone background may need to adapt. Also check theme.glaze tone boundaries and opacity.`,\n });\n }\n }\n return { checks, diagnostics };\n}\n","import {\n checkColorContrast,\n measureColorContrast,\n type ColorContrastCheck,\n} from \"./contrast.js\";\nimport {\n glaze,\n variantToOkhsl,\n type ColorMap,\n type ColorDef,\n type MixColorDef,\n type ShadowColorDef,\n type GlazeColorValue,\n type RegularColorDef,\n} from \"@tenphi/glaze\";\nimport type {\n BrandConfig,\n BrandDeclaration,\n DocsDiagnostic,\n ThemeConfig,\n ThemePaletteColor,\n} from \"../types.js\";\n\nexport interface ResolvedColorTheme {\n colors: {\n surface: Record<string, string>;\n \"surface-2\": Record<string, string>;\n \"surface-3\": Record<string, string>;\n text: Record<string, string>;\n heading: Record<string, string>;\n \"text-soft\": Record<string, string>;\n \"accent-text\": Record<string, string>;\n \"accent-surface\": Record<string, string>;\n \"accent-surface-text\": Record<string, string>;\n focus: Record<string, string>;\n shadow: Record<string, string>;\n };\n /** Glaze-generated Tasty color tokens, including interaction and status roles. */\n colorTokens: Record<string, Record<string, string>>;\n contrast: {\n light: number;\n dark: number;\n lightContrast: number;\n darkContrast: number;\n };\n contrastChecks: ColorContrastCheck[];\n diagnostics: DocsDiagnostic[];\n}\n\nexport function resolveColorTheme(theme: ThemeConfig = {}): ResolvedColorTheme {\n const brand = normalizeBrand(theme.brand);\n const authoredTarget = brand.contrast?.apca ?? 45;\n const normalTarget = Array.isArray(authoredTarget)\n ? authoredTarget[0]\n : authoredTarget;\n const highTarget = Array.isArray(authoredTarget)\n ? authoredTarget[1]\n : normalTarget + 15;\n const glazeOptions = {\n autoFlip: true,\n ...theme.glaze,\n ...(theme.contrastLevel !== undefined\n ? { contrastLevel: theme.contrastLevel }\n : {}),\n } as const;\n const surfaceInput = theme.palette?.surface;\n const declaredSurface =\n isColorDeclaration(surfaceInput) && usesRelativeColor(surfaceInput);\n const surfaceFrom = isColorDeclaration(surfaceInput)\n ? (surfaceInput.from ?? brand.from)\n : isSpecialDefinition(surfaceInput)\n ? \"#ffffff\"\n : (surfaceInput ?? \"#ffffff\");\n const surfaceSeed = glaze.color({\n from: surfaceFrom,\n mode: \"auto\",\n // Near-white brand surfaces can carry a numerically large OKHSL\n // saturation that becomes vivid as the ramp moves away from white. Reduce\n // saturation along the light ramp and keep dark chrome nearly neutral.\n darkSaturation: 0.35,\n });\n const resolvedSurfaceSeed = surfaceSeed.resolve();\n const resolvedThemeSeed = glaze\n .color({ from: brand.from, mode: \"auto\" }, glazeOptions)\n .resolve();\n const lightThemeSeed = variantToOkhsl(resolvedThemeSeed.light);\n const darkThemeSeed = variantToOkhsl(resolvedThemeSeed.dark);\n const darkThemeSaturation = darkThemeSeed.s * 100;\n const colorTheme = glaze(\n {\n hue: lightThemeSeed.h,\n saturation: lightThemeSeed.s * 100,\n darkHue: darkThemeSeed.h,\n darkSaturation: darkThemeSaturation,\n },\n undefined,\n glazeOptions,\n );\n const surfaceSaturation = declaredSurface\n ? (surfaceInput.saturation ?? 0.05)\n : 1;\n const darkSurfaceSaturation = declaredSurface\n ? (surfaceInput.darkSaturation ?? surfaceSaturation * 0.7)\n : 0.35;\n const darkSurfaceRampSaturation = (factor: number): number =>\n declaredSurface\n ? darkSurfaceSaturation * factor\n : saturationFactor(\n (resolvedSurfaceSeed.dark.s * factor) / 0.35,\n darkThemeSaturation / 100,\n );\n const surfaceRampHue = declaredSurface\n ? {\n hue: surfaceInput.hue ?? lightThemeSeed.h,\n darkHue: surfaceInput.darkHue ?? surfaceInput.hue ?? darkThemeSeed.h,\n }\n : {\n hue: variantToOkhsl(resolvedSurfaceSeed.light).h,\n darkHue: variantToOkhsl(resolvedSurfaceSeed.dark).h,\n };\n const surfaceDefinition = paletteDefinition(\n surfaceInput,\n declaredSurface\n ? {\n tone: 98,\n saturation: surfaceSaturation,\n darkSaturation: darkSurfaceSaturation,\n mode: \"auto\",\n }\n : {\n from: surfaceFrom,\n mode: \"auto\",\n darkSaturation: saturationFactor(\n resolvedSurfaceSeed.dark.s,\n darkThemeSaturation / 100,\n ),\n },\n );\n const definitions: ColorMap = {\n surface: surfaceDefinition,\n header: paletteDefinition(\n theme.palette?.header,\n declaredSurface\n ? { ...surfaceDefinition, opacity: 0.7 }\n : {\n from: surfaceFrom,\n mode: \"auto\",\n darkSaturation: saturationFactor(\n resolvedSurfaceSeed.dark.s,\n darkThemeSaturation / 100,\n ),\n opacity: 0.7,\n },\n ),\n \"surface-2\": {\n base: \"surface\",\n ...surfaceRampHue,\n tone: \"-2\",\n mode: \"auto\",\n ...(declaredSurface\n ? { saturation: surfaceSaturation * 0.75 }\n : {\n from: {\n h: variantToOkhsl(resolvedSurfaceSeed.light).h,\n s: resolvedSurfaceSeed.light.s * 0.75,\n t: 1,\n },\n }),\n darkSaturation: darkSurfaceRampSaturation(declaredSurface ? 0.75 : 0.275),\n },\n \"surface-3\": {\n base: \"surface-2\",\n ...surfaceRampHue,\n tone: \"-2\",\n mode: \"auto\",\n ...(declaredSurface\n ? { saturation: surfaceSaturation * 0.65 }\n : {\n from: {\n h: variantToOkhsl(resolvedSurfaceSeed.light).h,\n s: resolvedSurfaceSeed.light.s * 0.65,\n t: 1,\n },\n }),\n darkSaturation: darkSurfaceRampSaturation(declaredSurface ? 0.65 : 0.25),\n },\n text: paletteDefinition(theme.palette?.text, {\n tone: 0,\n saturation: 0,\n base: \"surface\",\n role: \"text\",\n contrast: { apca: [75, 90] },\n mode: \"auto\",\n }),\n heading: paletteDefinition(theme.palette?.heading ?? theme.palette?.text, {\n tone: [4, 0],\n saturation: 0,\n base: \"surface\",\n role: \"text\",\n contrast: { apca: [75, 90] },\n mode: \"auto\",\n }),\n \"text-soft\": paletteDefinition(theme.palette?.[\"text-soft\"], {\n from: \"#626875\",\n base: \"surface\",\n role: \"text\",\n contrast: { apca: [60, 85] },\n mode: \"auto\",\n }),\n \"text-muted\": mix(\"surface\", \"text\", 66),\n \"sidebar-text\": paletteDefinition(\n theme.palette?.[\"sidebar-text\"],\n mix(\"surface\", \"text-soft\", [90, 100]),\n ),\n \"surface-2-hover\": mix(\"surface-2\", \"text\", [3, 6]),\n \"surface-2-pressed\": mix(\"surface-2\", \"text\", [9, 14]),\n \"surface-3-hover\": mix(\"surface-3\", \"text\", [3, 6]),\n \"surface-3-pressed\": mix(\"surface-3\", \"text\", [9, 14]),\n \"accent-text\": {\n from: brand.from,\n base: \"surface-3\",\n role: \"text\",\n contrast: {\n apca: [Math.max(75, normalTarget), Math.max(90, highTarget)],\n },\n mode: \"auto\",\n },\n focus: {\n from: brand.from,\n base: \"surface-3\",\n role: \"border\",\n contrast: { wcag: [3, 4.5] },\n mode: \"auto\",\n },\n \"accent-surface\": {\n from: brand.from,\n base: \"accent-surface-text\",\n role: \"surface\",\n contrast: { apca: [80, 95] },\n mode: \"fixed\",\n },\n \"accent-surface-text\": {\n from: \"#ffffff\",\n mode: \"fixed\",\n },\n \"logo-surface\": {\n from: brand.from,\n base: \"logo-mark\",\n role: \"surface\",\n contrast: { wcag: [3, 4.5] },\n mode: \"fixed\",\n },\n \"logo-mark\": { tone: 100, saturation: 0, mode: \"fixed\" },\n \"accent-surface-subtle\": mix(\"surface\", \"accent-surface\", [12, 18]),\n \"accent-surface-2-subtle\": mix(\"surface-2\", \"accent-surface\", [12, 18]),\n shadow: {\n type: \"shadow\",\n bg: \"surface\",\n fg: \"text\",\n intensity: [12, 20],\n tuning: { alphaMax: theme.glaze?.shadowTuning?.alphaMax ?? 0.28 },\n },\n clear: { from: \"#ffffff\", mode: \"fixed\", opacity: 0 },\n ...statusColors(\"info\", theme.palette?.info, \"#2563eb\"),\n ...statusColors(\"success\", theme.palette?.success, \"#16a34a\"),\n ...statusColors(\"warning\", theme.palette?.warning, \"#d97706\"),\n ...statusColors(\"danger\", theme.palette?.danger, \"#dc2626\"),\n ...statusColors(\"orange\", undefined, \"#d97706\"),\n ...statusColors(\"green\", undefined, \"#16a34a\"),\n ...statusColors(\"blue\", undefined, \"#2563eb\"),\n ...statusColors(\"purple\", undefined, \"#9333ea\"),\n ...statusColors(\"red\", undefined, \"#dc2626\"),\n };\n\n definitions.overlay = paletteDefinition(theme.palette?.overlay, {\n from: \"#000000\",\n mode: \"static\",\n opacity: 0.5,\n });\n definitions.border = {\n base: \"surface\",\n tone: [\"-9\", \"-22\"],\n saturation: 0.205,\n mode: \"auto\",\n };\n definitions[\"border-strong\"] = {\n base: \"surface\",\n tone: [\"-20\", \"-38\"],\n saturation: 0.205,\n mode: \"auto\",\n };\n // Keep light code on white while carrying the brand hue into dark code surfaces.\n definitions[\"syntax-bg\"] = {\n tone: 100,\n saturation: 0.08,\n darkSaturation: 0.035,\n mode: \"auto\",\n };\n definitions[\"syntax-text\"] = {\n base: \"syntax-bg\",\n tone: 0,\n saturation: 0,\n contrast: { wcag: [\"AA\", \"AAA\"] },\n };\n for (const [name, hue, saturation, contrast] of [\n [\"comment\", 210, 0.009, 4.5],\n [\"punctuation\", 210, 0.009, 6],\n [\"keyword\", 210, 0.9, 4.5],\n [\"string\", 40, 0.9, 4.5],\n [\"token\", 125, 0.9, 4.5],\n [\"property\", 155, 0.9, 4.5],\n [\"number\", 70, 0.9, 4.5],\n [\"function\", 210, 0.9, 4.5],\n [\"value\", 210, 0.9, 4.5],\n [\"operator\", 340, 0.9, 4.5],\n ] as const)\n definitions[`syntax-${name}`] = {\n from: { h: hue, s: saturation, t: 1 },\n base: \"syntax-bg\",\n contrast: { wcag: [contrast, 7] },\n };\n const handled = new Set([\n \"surface\",\n \"header\",\n \"overlay\",\n \"text\",\n \"heading\",\n \"text-soft\",\n \"info\",\n \"success\",\n \"warning\",\n \"danger\",\n ]);\n for (const [name, input] of Object.entries(theme.palette ?? {})) {\n if (input === undefined) continue;\n if (\n !/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/.test(name) ||\n [\"current\", \"constructor\", \"prototype\"].includes(name)\n )\n throw new Error(\n `theme.palette.${name}: use a lowercase color name with hyphens; current, constructor, and prototype are reserved.`,\n );\n if (handled.has(name)) continue;\n const defaults = definitions[name];\n definitions[name] = paletteDefinition(input, defaults ?? { mode: \"auto\" });\n }\n colorTheme.colors(definitions);\n\n const resolvedColors = colorTheme.resolve();\n const resolvedSurface = requiredResolvedColor(resolvedColors, \"surface\");\n const resolvedAccent = requiredResolvedColor(resolvedColors, \"accent-text\");\n\n const scores = {\n light: measureColorContrast(resolvedAccent.light, resolvedSurface.light),\n dark: measureColorContrast(resolvedAccent.dark, resolvedSurface.dark),\n lightContrast: measureColorContrast(\n resolvedAccent.lightContrast,\n resolvedSurface.lightContrast,\n ),\n darkContrast: measureColorContrast(\n resolvedAccent.darkContrast,\n resolvedSurface.darkContrast,\n ),\n };\n const { checks: contrastChecks, diagnostics } = checkColorContrast(\n resolvedColors,\n definitions,\n theme.contrastLevel,\n [normalTarget, highTarget],\n theme.glaze?.inferRole,\n );\n const outputOptions = { modes: { highContrast: true } } as const;\n const tastyOptions = {\n ...outputOptions,\n states: {\n dark: \"theme=dark | (@media(prefers-color-scheme: dark) & :not([data-theme]))\",\n highContrast:\n \"contrast=more | (@media(prefers-contrast: more) & :not([data-contrast]))\",\n },\n } as const;\n const resolvedPalette = colorTheme.json(outputOptions);\n const colorTokens = colorTheme.tasty(tastyOptions);\n const colors = {\n surface: requiredJsonColor(resolvedPalette, \"surface\"),\n \"surface-2\": requiredJsonColor(resolvedPalette, \"surface-2\"),\n \"surface-3\": requiredJsonColor(resolvedPalette, \"surface-3\"),\n text: requiredJsonColor(resolvedPalette, \"text\"),\n heading: requiredJsonColor(resolvedPalette, \"heading\"),\n \"text-soft\": requiredJsonColor(resolvedPalette, \"text-soft\"),\n \"accent-text\": requiredJsonColor(resolvedPalette, \"accent-text\"),\n \"accent-surface\": requiredJsonColor(resolvedPalette, \"accent-surface\"),\n \"accent-surface-text\": requiredJsonColor(\n resolvedPalette,\n \"accent-surface-text\",\n ),\n focus: requiredJsonColor(resolvedPalette, \"focus\"),\n shadow: requiredJsonColor(resolvedPalette, \"shadow\"),\n };\n return {\n colors,\n colorTokens,\n contrast: scores,\n contrastChecks,\n diagnostics,\n };\n}\n\nfunction mix(\n base: string,\n target: string,\n value: number | [number, number],\n space: \"okhsl\" | \"srgb\" = \"okhsl\",\n): ColorMap[string] {\n return { type: \"mix\", base, target, value, space };\n}\n\nfunction statusColors(\n name: string,\n input: ThemePaletteColor | undefined,\n fallback: GlazeColorValue,\n): ColorMap {\n const declaration = paletteDefinition(input, { from: fallback });\n return {\n [name]: isSpecialDefinition(declaration)\n ? declaration\n : {\n base: \"surface\",\n role: \"border\",\n contrast: { apca: [30, 45] },\n mode: \"auto\",\n ...declaration,\n },\n [`${name}-text`]: {\n // A mix/shadow owns its dependency fields. Reusing it as text would\n // replace its base or silently ignore the text contrast floor. Give\n // derived text a neutral absolute tone; consumers can override it.\n ...(isSpecialDefinition(declaration)\n ? { tone: 0, saturation: 0 }\n : declaration),\n base: `${name}-surface`,\n role: \"text\",\n contrast: { apca: [75, 90] },\n mode: \"auto\",\n },\n [`${name}-surface`]:\n \"type\" in declaration && declaration.type === \"shadow\"\n ? { base: \"surface\", tone: \"-2\", saturation: 0, mode: \"auto\" }\n : mix(\"surface\", name, [12, 18], \"srgb\"),\n };\n}\n\nfunction isSpecialDefinition(\n value: ThemePaletteColor | undefined,\n): value is MixColorDef | ShadowColorDef {\n return typeof value === \"object\" && value !== null && \"type\" in value;\n}\n\nfunction isColorDeclaration(\n value: ThemePaletteColor | undefined,\n): value is RegularColorDef {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !(\"h\" in value || \"r\" in value || \"c\" in value || \"type\" in value)\n );\n}\n\nfunction paletteDefinition(\n value: ThemePaletteColor | undefined,\n baseDefaults: ColorDef,\n): ColorDef {\n if (value === undefined) return baseDefaults;\n if (isSpecialDefinition(value)) return { ...value };\n const defaults =\n \"type\" in baseDefaults ? { mode: \"auto\" as const } : baseDefaults;\n if (!isColorDeclaration(value) || value.from !== undefined) {\n // An explicit seed owns its tone and chroma; absolute defaults must not\n // override the user's literal color. Keep adaptation and contrast floors.\n const { tone: _tone, saturation: _saturation, ...seedDefaults } = defaults;\n return {\n ...seedDefaults,\n ...(isColorDeclaration(value) ? value : { from: value }),\n };\n }\n if (!usesRelativeColor(value)) return { ...defaults, ...value };\n const { from: _ignored, ...relativeDefaults } = defaults;\n return { ...relativeDefaults, ...value };\n}\n\nfunction usesRelativeColor(value: RegularColorDef): boolean {\n return (\n value.from === undefined &&\n (value.tone !== undefined ||\n value.hue !== undefined ||\n value.darkHue !== undefined ||\n value.saturation !== undefined ||\n value.darkSaturation !== undefined ||\n value.base !== undefined)\n );\n}\n\nfunction saturationFactor(colorSaturation: number, themeSaturation: number) {\n return themeSaturation > 0\n ? Math.min(1, colorSaturation / themeSaturation)\n : 0;\n}\n\nfunction requiredResolvedColor(\n colors: ReturnType<ReturnType<typeof glaze>[\"resolve\"]>,\n name: string,\n) {\n const color = colors.get(name);\n if (!color) throw new Error(`The Glaze ${name} color failed to resolve.`);\n return color;\n}\n\nfunction requiredJsonColor(\n colors: Record<string, Record<string, string>>,\n name: string,\n): Record<string, string> {\n const color = colors[name];\n if (!color) throw new Error(`The Glaze ${name} token failed to export.`);\n return color;\n}\n\nfunction normalizeBrand(\n brand: BrandConfig | undefined,\n): Exclude<BrandConfig, GlazeColorValue> & { from: GlazeColorValue } {\n if (typeof brand === \"object\" && brand !== null && \"from\" in brand)\n return brand;\n if (isBrandDeclaration(brand)) {\n const seed = glaze\n .color({\n hue: brand.hue,\n saturation: brand.saturation,\n tone: brand.tone,\n mode: \"fixed\",\n })\n .resolve().light;\n return {\n from: { h: seed.h, s: seed.s, t: seed.t },\n ...(brand.contrast && { contrast: brand.contrast }),\n ...(brand.unsafeContrast && { unsafeContrast: true }),\n };\n }\n return { from: brand ?? \"okhsl(266 68% 48%)\" };\n}\n\nfunction isBrandDeclaration(\n brand: BrandConfig | undefined,\n): brand is BrandDeclaration {\n return (\n typeof brand === \"object\" &&\n brand !== null &&\n \"hue\" in brand &&\n \"saturation\" in brand &&\n \"tone\" in brand\n );\n}\n","import type {\n RecipeStyles,\n Styles,\n StylesWithoutSelectors,\n} from \"@tenphi/tasty/core\";\nimport type {\n GlazeColorInput,\n GlazeConfigOverride,\n GlazeColorValue,\n ColorDef,\n} 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 SocialImage {\n src: string;\n alt: string;\n width?: number;\n height?: number;\n}\nexport interface BreadcrumbItem {\n name: string;\n url: string;\n}\nexport interface SiteSeoConfig {\n titleTemplate?: string;\n image?: SocialImage | false;\n /** False on preview deployments; pages cannot override this restriction. */\n index?: boolean;\n breadcrumbs?: boolean;\n /** Offer a clean Markdown download and copy control. Defaults to true. */\n copyPage?: boolean;\n}\nexport interface PageSeoConfig {\n /** Complete document title, overriding the site template. */\n title?: string;\n canonical?: string;\n image?: SocialImage | false;\n index?: boolean;\n breadcrumbs?: BreadcrumbItem[] | false;\n}\nexport interface SiteConfig {\n seo?: SiteSeoConfig;\n title?: string;\n /** Version of the documented package, rendered beside the site title. */\n version?: string;\n /** Selectable documentation versions and their route roots. */\n versions?: SiteVersion[];\n description?: string;\n url?: string;\n repository?: string;\n /** Header buttons, collapsed into a More menu on mobile. */\n headerLinks?: HeaderLink[];\n /** Source artwork used to generate browser, touch, and installable-app icons. */\n favicon?: string | SiteIconConfig;\n /** Shared header and mobile drawer artwork. Paths are relative to the project root. */\n logo?: false | string | SiteLogoConfig;\n}\n\nexport interface SiteVersion {\n /** Exclude this version from search engines, sitemaps, and agent indexes. */\n index?: boolean;\n label: string;\n routeBase: string;\n}\n\nexport interface HeaderLink {\n label: string;\n /** HTTP(S) URL, root-relative route (prefixed with the site base), or fragment. */\n link: string;\n /** Desktop button variant; mobile More menus use uniform navigation links. */\n variant?: \"default\" | \"primary\";\n newTab?: boolean;\n}\n\nexport interface SiteLogoConfig {\n /** Use one image, or supply both light and dark images instead. */\n src?: string;\n light?: string;\n dark?: string;\n alt?: string;\n /** Defaults to the localized documentation home. */\n href?: string;\n /** Intrinsic dimensions; normally inferred from the image. */\n width?: number;\n height?: number;\n /** True by default because the site title labels the same destination. */\n decorative?: boolean;\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 Cookbook'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 /** Plain-text badge displayed beside the sidebar label. */\n badge?: string;\n}\n\nexport type DocsSource = {\n /** Stable name for cross-source links and repeated mounts. */\n id?: string;\n routeBase?: string;\n} & (\n | {\n file: string;\n root?: string;\n route?: string;\n title?: string;\n description?: string;\n navigation?: false | NavigationPlacement;\n }\n | {\n glob: string | string[];\n root?: string;\n base?: string;\n routeBase?: string;\n exclude?: string[];\n navigation?: \"auto\" | false;\n }\n | {\n package: string;\n registry?: string;\n include?: string[];\n exclude?: string[];\n index?: string;\n routeBase?: string;\n trust?: \"markdown\" | \"mdx\";\n }\n | {\n /** Local OpenAPI 3.x JSON or YAML document. */\n openapi: string;\n root?: string;\n routeBase?: string;\n }\n);\n\nexport interface ContentConfig {\n sources?: DocsSource[];\n allowOutsideRoot?: boolean;\n /** Rewrite absolute links into the current repository to matching Cookbook routes. */\n localizeRepositoryLinks?: boolean;\n /** Preserve custom metadata for content queries and renderer middleware, or reject unknown fields. */\n frontmatter?: \"preserve\" | \"reject\";\n}\n\nexport type NavigationItem =\n | string\n | ({ badge?: string } & (\n | { label: string; link?: string; items: NavigationItem[] }\n | { label: string; link?: string; autogenerate: { directory: string } }\n | { label: string; link: string }\n ));\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 BrandDeclaration = Pick<GlazeColorInput, \"hue\" | \"saturation\"> & {\n /** Single tone for the brand seed; contrast targets adapt it per mode. */\n tone: number;\n contrast?: { apca: number | [number, number] };\n unsafeContrast?: boolean;\n};\n\nexport type BrandConfig =\n | GlazeColorValue\n | {\n from: GlazeColorValue;\n contrast?: { apca: number | [number, number] };\n unsafeContrast?: boolean;\n }\n | BrandDeclaration;\n\nexport type ThemeTokenValue = string | number;\n\n/**\n * Tasty design tokens. Configure `$name` to emit the CSS custom property `--name`.\n */\nexport interface ThemeTokens {\n $gap?: ThemeTokenValue;\n $radius?: ThemeTokenValue;\n /** Independent pill/circle radius for header controls and drawer close buttons. */\n \"$header-control-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}\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 \"hero-title\"?: TypographyPreset;\n \"hero-tagline\"?: TypographyPreset;\n prose?: TypographyPreset;\n \"inline-code\"?: TypographyPreset;\n [name: string]: TypographyPreset | undefined;\n}\n\n/** A font file served from the site's `public/` directory. */\nexport interface ThemeFontFile {\n /** Root-relative public URL, for example `/fonts/brand.woff2`. */\n src: string;\n /** A single weight or a variable-font range such as `\"100 900\"`. */\n weight?: number | `${number} ${number}`;\n style?: \"normal\" | \"italic\";\n}\n\n/** A Google Fonts family or a set of files hosted by the site. */\nexport type ThemeFont =\n | string\n | {\n google: string;\n /** Individual weights or variable ranges, using the same syntax as local files. */\n weights?: Array<number | `${number} ${number}`>;\n /** Defaults to normal and italic; omit unavailable styles explicitly. */\n styles?: Array<\"normal\" | \"italic\">;\n }\n | { family: string; files: ThemeFontFile[] };\n\nexport interface FontLoadingConfig {\n /** Download Google font files into the site by default. */\n google?: \"self-hosted\" | \"remote\";\n /** Reuse verified cache entries by default. Offline never performs network requests. */\n cache?: \"reuse\" | \"refresh\" | \"offline\";\n display?: \"auto\" | \"block\" | \"swap\" | \"fallback\" | \"optional\";\n}\n\nexport interface ThemeFonts {\n body?: ThemeFont;\n heading?: ThemeFont;\n code?: ThemeFont;\n}\n\n/** A Glaze declaration, or a literal color retained as a convenient seed shorthand. */\nexport type ThemePaletteColor = GlazeColorValue | ColorDef;\n\nexport const COOKBOOK_PALETTE_NAMES = [\n \"surface\",\n \"header\",\n \"surface-2\",\n \"surface-3\",\n \"text\",\n \"heading\",\n \"text-soft\",\n \"text-muted\",\n \"sidebar-text\",\n \"surface-2-hover\",\n \"surface-2-pressed\",\n \"surface-3-hover\",\n \"surface-3-pressed\",\n \"accent-text\",\n \"focus\",\n \"accent-surface\",\n \"accent-surface-text\",\n \"logo-surface\",\n \"logo-mark\",\n \"accent-surface-subtle\",\n \"accent-surface-2-subtle\",\n \"shadow\",\n \"clear\",\n \"info\",\n \"info-text\",\n \"info-surface\",\n \"success\",\n \"success-text\",\n \"success-surface\",\n \"warning\",\n \"warning-text\",\n \"warning-surface\",\n \"danger\",\n \"danger-text\",\n \"danger-surface\",\n \"orange\",\n \"orange-text\",\n \"orange-surface\",\n \"green\",\n \"green-text\",\n \"green-surface\",\n \"blue\",\n \"blue-text\",\n \"blue-surface\",\n \"purple\",\n \"purple-text\",\n \"purple-surface\",\n \"red\",\n \"red-text\",\n \"red-surface\",\n \"overlay\",\n \"border\",\n \"border-strong\",\n \"syntax-bg\",\n \"syntax-text\",\n \"syntax-comment\",\n \"syntax-punctuation\",\n \"syntax-keyword\",\n \"syntax-string\",\n \"syntax-token\",\n \"syntax-property\",\n \"syntax-number\",\n \"syntax-function\",\n \"syntax-value\",\n \"syntax-operator\",\n] as const;\nexport type CookbookPaletteName = (typeof COOKBOOK_PALETTE_NAMES)[number];\n\n/** Semantic palette declarations resolved for every appearance mode. */\nexport interface ThemePaletteConfig extends Partial<\n Record<CookbookPaletteName, ThemePaletteColor>\n> {\n /** Additional Glaze roles, exposed as Tasty #name tokens. Use lowercase hyphenated names. */\n [name: Lowercase<string>]: ThemePaletteColor | undefined;\n info?: ThemePaletteColor;\n success?: ThemePaletteColor;\n warning?: ThemePaletteColor;\n danger?: ThemePaletteColor;\n /** Light-scheme page surface; dark and high-contrast values adapt. */\n surface?: ThemePaletteColor;\n /** Translucent header surface; defaults to the page surface declaration. */\n header?: ThemePaletteColor;\n /** Fixed underlay; defaults to black at 50% opacity in every scheme. */\n overlay?: ThemePaletteColor;\n /** Primary reading text, resolved against `surface`. */\n text?: ThemePaletteColor;\n /** Heading text; follows an explicit `text` declaration unless configured. */\n heading?: ThemePaletteColor;\n /** Secondary reading text, resolved against `surface`. */\n \"text-soft\"?: ThemePaletteColor;\n}\n\n/** Cookbook UI surfaces whose default Tasty styles can be customized. */\nexport const COOKBOOK_COMPONENT_NAMES = [\n \"Button\",\n \"Card\",\n \"Callout\",\n \"CodeGroup\",\n \"Tab\",\n \"Footer\",\n \"PageActions\",\n \"MobileTableOfContents\",\n \"Hero\",\n \"PageFrame\",\n \"HeaderFrame\",\n \"HeaderLinks\",\n \"Heading\",\n \"Layout\",\n \"SearchButton\",\n \"TableOfContentsLayout\",\n \"LanguageSelect\",\n \"Logo\",\n \"SiteLogo\",\n \"MarkdownCodeBlock\",\n \"MarkdownHeading\",\n \"MarkdownInlineCode\",\n \"MarkdownTable\",\n \"Mermaid\",\n \"MobileMenuFooter\",\n \"MobileMenuToggle\",\n \"MobileNavigationTabs\",\n \"PackageVersion\",\n \"VersionSwitcher\",\n \"Preview\",\n \"Sidebar\",\n \"SocialIcons\",\n \"Steps\",\n \"Tabs\",\n \"TableOfContents\",\n \"ThemeSelect\",\n \"TopNavigation\",\n \"Header\",\n \"Document\",\n \"MainPane\",\n \"MainContent\",\n \"Banner\",\n \"SkipLink\",\n \"Search\",\n \"Pagination\",\n \"Markdown\",\n \"MermaidSource\",\n \"MarkdownAlert\",\n \"SearchResults\",\n \"SyntaxHighlight\",\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 Button: [],\n SyntaxHighlight: [\n \"Marker\",\n \"Comment\",\n \"Punctuation\",\n \"Keyword\",\n \"String\",\n \"Token\",\n \"Property\",\n \"Number\",\n \"Function\",\n \"Value\",\n \"Operator\",\n \"Text\",\n \"Bg\",\n \"Inserted\",\n \"Deleted\",\n \"Italic\",\n \"Strong\",\n \"Underline\",\n ],\n SearchResults: [\n \"UI\",\n \"Form\",\n \"Field\",\n \"EngineControls\",\n \"Drawer\",\n \"Input\",\n \"Clear\",\n \"Results\",\n \"Result\",\n \"ResultLink\",\n \"SearchIcon\",\n \"ClearIcon\",\n \"SuppressedClear\",\n \"Message\",\n \"List\",\n \"Title\",\n \"Excerpt\",\n \"NestedResult\",\n \"Match\",\n \"More\",\n \"HoverMore\",\n ],\n MarkdownAlert: [\"Title\", \"FirstContent\"],\n MermaidSource: [],\n Markdown: [\n \"Block\",\n \"BlockSpacing\",\n \"HeadingSpacing\",\n \"List\",\n \"CompactItem\",\n \"ListItem\",\n \"DefinitionTerm\",\n \"DefinitionDescription\",\n \"Link\",\n \"HoverLink\",\n \"Quote\",\n \"Rule\",\n \"Details\",\n \"HoverDetails\",\n \"Summary\",\n \"OpenSummary\",\n \"SummaryMarker\",\n \"SummaryIcon\",\n \"OpenSummaryIcon\",\n \"Code\",\n ],\n Pagination: [\n \"Link\",\n \"PreviousLink\",\n \"NextLink\",\n \"NextIcon\",\n \"NextLabel\",\n \"HoverLink\",\n \"ActiveLink\",\n \"Title\",\n \"LoneNextLink\",\n \"Icon\",\n \"PreviousIconRtl\",\n \"NextIconRtl\",\n ],\n Search: [\n \"Status\",\n \"Dialog\",\n \"CloseIcon\",\n \"OpenDialog\",\n \"EnteredDialog\",\n \"Backdrop\",\n \"EnteredBackdrop\",\n \"Frame\",\n \"Container\",\n \"Close\",\n \"HoverClose\",\n \"ActiveClose\",\n ],\n SkipLink: [],\n Banner: [\"Link\"],\n MainContent: [\"ContentSpacing\", \"Container\", \"Panel\"],\n MainPane: [],\n Document: [\n \"All\",\n \"BlockSpacing\",\n \"Body\",\n \"Control\",\n \"Pointer\",\n \"ResponsiveWidth\",\n \"ResponsiveHeight\",\n \"Hidden\",\n \"PrintHidden\",\n \"DesktopBlock\",\n \"DesktopFlex\",\n \"ScreenReaderOnly\",\n \"RouteAnnouncer\",\n \"Strong\",\n \"Link\",\n \"NarrowBlock\",\n \"MobileBlock\",\n \"Code\",\n \"FocusRing\",\n \"CurrentLink\",\n \"SearchOpen\",\n ],\n PageFrame: [\"MainFrame\", \"SidebarFrame\", \"Columns\"],\n HeaderFrame: [],\n Heading: [],\n HeaderLinks: [\n \"Desktop\",\n \"DesktopLink\",\n \"Link\",\n \"HoverLink\",\n \"PrimaryLink\",\n \"HoverPrimaryLink\",\n \"Trigger\",\n \"HoverTrigger\",\n \"Panel\",\n \"OpenPanel\",\n \"PanelNavigation\",\n \"PanelLink\",\n \"FirstPanelLink\",\n \"Close\",\n \"HoverClose\",\n ],\n Layout: [\"Islands\"],\n SearchButton: [\"PendingShortcut\", \"Label\", \"Shortcut\", \"NativeIcon\", \"Icon\"],\n TableOfContentsLayout: [\"Content\"],\n Card: [\"Heading2\", \"Heading3\", \"Paragraph\"],\n Callout: [\"Title\", \"Body\"],\n CodeGroup: [\"Caption\", \"Pre\", \"Code\"],\n Tab: [\"Heading\", \"HiddenHeading\"],\n MobileTableOfContents: [\n \"Summary\",\n \"List\",\n \"NestedList\",\n \"Item\",\n \"Link\",\n \"HoverLink\",\n \"Focus\",\n ],\n PageActions: [\"Control\", \"Hover\", \"Focus\", \"Pending\", \"Status\"],\n Footer: [\"Meta\", \"MetaLink\", \"MetaUpdated\", \"Credit\", \"CreditLink\"],\n Hero: [\n \"Visual\",\n \"DarkVisual\",\n \"LightVisual\",\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 \"Trigger\",\n \"HoverTrigger\",\n \"ActiveTrigger\",\n \"LabelIcon\",\n \"TriggerLabel\",\n \"Caret\",\n \"CompactTrigger\",\n \"CompactLabel\",\n \"CompactCaret\",\n \"Label\",\n \"HoverLabel\",\n \"Select\",\n \"CompactSelect\",\n \"CompactLabelIcon\",\n \"SidebarTrigger\",\n \"Panel\",\n \"SidebarPanel\",\n \"OpenPanel\",\n \"PanelTitle\",\n \"Options\",\n \"Option\",\n \"HoverOption\",\n \"CurrentOption\",\n \"Fallback\",\n \"Checkmark\",\n \"SelectedCheckmark\",\n ],\n Logo: [\"Svg\", \"Mark\"],\n SiteLogo: [\"Image\", \"Light\", \"Dark\"],\n MarkdownCodeBlock: [\n \"Pre\",\n \"CopyButton\",\n \"HoverCopyButton\",\n \"CopiedButton\",\n \"CopyIcon\",\n \"CopiedIcon\",\n \"Code\",\n \"Diff\",\n \"DiffCode\",\n \"DiffLine\",\n \"EmptyDiffLine\",\n \"InsertedLine\",\n \"DeletedLine\",\n ],\n MarkdownHeading: [\n \"Heading\",\n \"Link\",\n \"RevealedLink\",\n \"HoverLink\",\n \"LinkIcon\",\n \"CopiedLink\",\n \"CopiedLinkIcon\",\n \"CopiedIcon\",\n ],\n MarkdownTable: [\"Table\", \"Cell\", \"LastBodyRowCell\", \"HeaderCell\", \"Scroll\"],\n MarkdownInlineCode: [],\n Mermaid: [\"Diagram\", \"Text\", \"MonoText\"],\n MobileMenuFooter: [\"Social\"],\n MobileMenuToggle: [\"Icon\", \"Section\", \"Page\"],\n MobileNavigationTabs: [\n \"Trigger\",\n \"Marker\",\n \"Caret\",\n \"ExpandedCaret\",\n \"Label\",\n \"List\",\n \"Item\",\n \"Link\",\n \"HoverLink\",\n \"CurrentLink\",\n ],\n PackageVersion: [],\n VersionSwitcher: [\n \"Trigger\",\n \"HoverTrigger\",\n \"TriggerLabel\",\n \"Caret\",\n \"Panel\",\n \"OpenPanel\",\n \"PanelTitle\",\n \"Options\",\n \"Link\",\n \"HoverLink\",\n \"CurrentLink\",\n \"Checkmark\",\n \"SelectedCheckmark\",\n ],\n Preview: [\n \"Caption\",\n \"Stage\",\n \"Frame\",\n \"Code\",\n \"Summary\",\n \"HoverSummary\",\n \"ActiveSummary\",\n \"Pre\",\n ],\n Sidebar: [\n \"Backdrop\",\n \"OpenBackdrop\",\n \"MobileHeading\",\n \"HomeLink\",\n \"HomeLogo\",\n \"HomeLabel\",\n \"Close\",\n \"HoverClose\",\n \"CloseIcon\",\n \"CurrentLink\",\n \"Content\",\n \"Tree\",\n \"List\",\n \"Item\",\n \"TopLevelSpacing\",\n \"GroupSpacing\",\n \"NestedItem\",\n \"SectionHeading\",\n \"Control\",\n \"Summary\",\n \"GroupLabel\",\n \"GroupLabelText\",\n \"Link\",\n \"LinkLabel\",\n \"InteractiveControl\",\n \"SummaryMarker\",\n \"Caret\",\n \"ExpandedCaret\",\n \"LinkedSummary\",\n \"GroupLink\",\n \"LinkedSectionHeading\",\n \"SectionLink\",\n \"Badge\",\n \"TopLevelLink\",\n ],\n Steps: [\"Item\", \"Marker\"],\n SocialIcons: [\"Link\", \"HoverLink\", \"Icon\"],\n Tabs: [\"List\", \"Button\", \"SelectedButton\", \"FocusedButton\"],\n TableOfContents: [\n \"Heading\",\n \"List\",\n \"Item\",\n \"Link\",\n \"LinkLabel\",\n \"HoverLink\",\n \"CurrentLink\",\n ],\n ThemeSelect: [\n \"Trigger\",\n \"HoverTrigger\",\n \"ActiveTrigger\",\n \"Icon\",\n \"Panel\",\n \"OpenPanel\",\n \"Section\",\n \"SectionSpacing\",\n \"SectionLabel\",\n \"Option\",\n \"HoverOption\",\n \"CheckedOption\",\n \"FocusedOption\",\n \"Input\",\n \"OptionIcon\",\n \"Checkmark\",\n \"SelectedCheckmark\",\n ],\n TopNavigation: [\n \"Scrollbar\",\n \"Link\",\n \"HoverLink\",\n \"CurrentLink\",\n \"ActiveIndicator\",\n ],\n Header: [\n \"Primary\",\n \"Title\",\n \"LogoLink\",\n \"Logo\",\n \"SiteTitle\",\n \"Search\",\n \"SearchElement\",\n \"Tools\",\n \"Social\",\n \"MobileTheme\",\n \"MobileLanguage\",\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 = StylesWithoutSelectors & {\n $?: string;\n mode?: never;\n recipe?: string;\n [token: `$${string}`]: Styles[string];\n [color: `#${string}`]: Styles[string];\n [state: `@${string}`]: Styles[string];\n};\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};\n\nexport interface ThemeConfig {\n brand?: BrandConfig;\n palette?: ThemePaletteConfig;\n /** Glaze tone windows and adaptation settings; contrastLevel remains a top-level theme option. */\n glaze?: Omit<GlazeConfigOverride, \"contrastLevel\">;\n /** Named CSS length expressions used as custom Tasty units. */\n units?: Record<string, string>;\n /** Flat reusable Tasty style bundles. Recipes cannot reference other recipes. */\n recipes?: Record<string, RecipeStyles>;\n fonts?: ThemeFonts;\n fontLoading?: FontLoadingConfig;\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 /** Explicit registration and overrides for user-authored components. */\n customStyles?: Record<string, Styles>;\n contrastLevel?: number | \"auto\";\n}\n\nexport interface MarkdownConfig {\n stripLeadingBadges?: boolean;\n /** Raw HTML policy for trusted Markdown. Untrusted package Markdown is always sanitized. */\n rawHtml?: \"allow\" | \"sanitize\" | \"strip\" | \"reject\";\n}\n\nexport interface SearchConfig {\n enabled?: boolean;\n}\n\nexport interface ComponentsConfig {\n /** Astro component paths keyed by Cookbook component name. `Footer` also accepts `false`. */\n overrides?: Record<string, string | false>;\n}\n\nexport interface BuildConfig {\n strict?: boolean;\n ci?: boolean;\n cacheDir?: string;\n maxArtifactBytes?: number;\n maxUnpackedBytes?: number;\n maxFiles?: number;\n maxPathDepth?: number;\n maxAssetBytes?: number;\n}\n\nexport interface TableOfContentsConfig {\n minHeadingLevel?: number;\n maxHeadingLevel?: number;\n mobile?: boolean;\n}\n\nexport interface DocsConfig {\n tableOfContents?: false | TableOfContentsConfig;\n /** Content and lock directory, relative to docs.config.ts (or the inline root). */\n root?: string;\n /** Old public routes mapped to current document routes. */\n redirects?: Record<string, string>;\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 /** Cookbook interface messages, keyed by language code. Missing keys use English. */\n translations?: Record<string, Record<string, string>>;\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 tableOfContents?: false | TableOfContentsConfig;\n redirects: Record<string, string>;\n site: SiteConfig;\n head: HeadConfig[];\n editLink?: EditLinkConfig;\n lastUpdated: boolean;\n locales?: Record<string, LocaleConfig>;\n /** Cookbook interface messages, keyed by language code. Missing keys use English. */\n translations?: Record<string, Record<string, string>>;\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<Pick<MarkdownConfig, \"stripLeadingBadges\" | \"rawHtml\">> &\n MarkdownConfig;\n search: Required<SearchConfig>;\n components: ComponentsConfig;\n build: Required<BuildConfig> & { base: string };\n}\n\nexport interface DocsFrontmatter {\n seo?: PageSeoConfig;\n aliases?: string[];\n title?: string;\n description?: string;\n slug?: string;\n draft?: boolean;\n sidebar?: false | NavigationPlacement;\n tableOfContents?: false | TableOfContentsConfig;\n editUrl?: false | string;\n /** Cookbook page layout. */\n template?: \"doc\" | \"splash\";\n hero?: {\n title?: string;\n tagline?: string;\n image?:\n | { html: string }\n | { file: string; alt?: string; width?: number; height?: number }\n | {\n dark: string;\n light: string;\n alt?: string;\n width?: number;\n height?: number;\n };\n actions?: Array<{\n text: string;\n link: string;\n variant?: \"primary\" | \"secondary\" | \"minimal\";\n }>;\n };\n lastUpdated?: boolean | Date;\n prev?: false | string | { link?: string; label?: string };\n next?: false | string | { link?: string; label?: string };\n banner?: { content: string };\n pagefind?: 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 sourceId: string;\n routeBase: string;\n metadata: Record<string, unknown>;\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 /** False for public routes excluded from automatic navigation and indexes. */\n discoverable?: boolean;\n /** Search-engine eligibility, independent from navigation visibility. */\n indexable?: boolean;\n /** False for a canonical alias or a noindex page. */\n sitemap?: boolean;\n canonical?: string;\n sidebar?: false | NavigationPlacement;\n}\n\nexport interface DocsGraph {\n redirects: Record<string, string>;\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, sourceId?: 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 /** Public URL base used when rewriting routes and assets. */\n base?: string;\n}\n","import { validateTableOfContents } from \"../table-of-contents.js\";\nimport { validateSeo } from \"../publishing.js\";\nimport { resolveColorTheme } from \"../theme/palette.js\";\nimport { glaze, type ColorDef } from \"@tenphi/glaze\";\nimport {\n mergeStyles,\n type RecipeStyles,\n type Styles,\n} from \"@tenphi/tasty/core\";\nimport {\n COOKBOOK_COMPONENT_NAMES,\n COOKBOOK_COMPONENT_SUB_ELEMENTS,\n} from \"../types.js\";\nimport type {\n BrandDeclaration,\n DocsConfig,\n DocsDiagnostic,\n NormalizedDocsConfig,\n ThemePaletteColor,\n} from \"../types.js\";\n\nconst DEFAULT_BRAND = \"okhsl(266 68% 48%)\";\nconst HEAD_KEYS = new Set([\"tag\", \"attrs\", \"content\"]);\nconst SITE_ICON_KEYS = new Set([\"source\", \"background\"]);\nconst COLOR_DECLARATION_KEYS = new Set([\n \"from\",\n \"tone\",\n \"saturation\",\n \"hue\",\n \"darkHue\",\n \"darkSaturation\",\n \"base\",\n \"contrast\",\n \"mode\",\n \"autoFlip\",\n \"opacity\",\n \"pastel\",\n \"role\",\n \"inherit\",\n]);\nconst ROOT_KEYS = new Set([\n \"tableOfContents\",\n \"root\",\n \"redirects\",\n \"site\",\n \"head\",\n \"editLink\",\n \"lastUpdated\",\n \"locales\",\n \"translations\",\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 \"seo\",\n \"title\",\n \"version\",\n \"versions\",\n \"description\",\n \"url\",\n \"repository\",\n \"favicon\",\n \"logo\",\n \"headerLinks\",\n ]),\n content: new Set([\n \"sources\",\n \"allowOutsideRoot\",\n \"localizeRepositoryLinks\",\n \"frontmatter\",\n ]),\n markdown: new Set([\"stripLeadingBadges\", \"rawHtml\"]),\n search: new Set([\"enabled\"]),\n components: new Set([\"overrides\"]),\n theme: new Set([\n \"brand\",\n \"palette\",\n \"glaze\",\n \"units\",\n \"recipes\",\n \"fonts\",\n \"fontLoading\",\n \"states\",\n \"tokens\",\n \"presets\",\n \"styles\",\n \"customStyles\",\n \"contrastLevel\",\n ]),\n build: new Set([\n \"strict\",\n \"ci\",\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 if (config === null || typeof config !== \"object\" || Array.isArray(config)) {\n invalid(diagnostics, \"Documentation configuration must be an object.\");\n return diagnostics;\n }\n if (config.root !== undefined && typeof config.root !== \"string\") {\n invalid(diagnostics, \"root must be a directory path.\");\n }\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 (value === undefined) continue;\n if (!isRecord(value)) {\n invalid(diagnostics, `${section} must be an object.`);\n continue;\n }\n for (const key of Object.keys(value)) {\n if (!keys.has(key)) unknown(diagnostics, `${section}.${key}`);\n }\n }\n\n if (isRecord(config.site) && config.site.versions !== undefined) {\n if (\n !Array.isArray(config.site.versions) ||\n config.site.versions.length < 2\n ) {\n invalid(diagnostics, \"site.versions must contain at least two versions.\");\n } else {\n const bases = new Set<string>();\n for (const [index, version] of config.site.versions.entries()) {\n const path = `site.versions[${index}]`;\n if (!isRecord(version)) {\n invalid(diagnostics, `${path} must be an object.`);\n continue;\n }\n for (const key of Object.keys(version)) {\n if (key !== \"label\" && key !== \"routeBase\" && key !== \"index\")\n unknown(diagnostics, `${path}.${key}`);\n }\n if (typeof version.label !== \"string\" || !version.label.trim())\n invalid(diagnostics, `${path}.label must be a non-empty string.`);\n if (version.index !== undefined && typeof version.index !== \"boolean\")\n invalid(diagnostics, `${path}.index must be a boolean.`);\n const base = version.routeBase;\n if (\n typeof base !== \"string\" ||\n !base.startsWith(\"/\") ||\n (base !== \"/\" && base.endsWith(\"/\")) ||\n base.includes(\"//\") ||\n /[?#\\\\\\s]/.test(base) ||\n base.split(\"/\").some((segment) => segment === \".\" || segment === \"..\")\n ) {\n invalid(\n diagnostics,\n `${path}.routeBase must be a root-relative route without a trailing slash.`,\n );\n } else if (bases.has(base)) {\n invalid(diagnostics, `${path}.routeBase duplicates ${base}.`);\n } else {\n bases.add(base);\n }\n }\n }\n }\n\n if (isRecord(config.site) && config.site.headerLinks !== undefined) {\n if (!Array.isArray(config.site.headerLinks)) {\n invalid(diagnostics, \"site.headerLinks must be an array.\");\n } else {\n config.site.headerLinks.forEach((item, index) => {\n const path = `site.headerLinks[${index}]`;\n if (!isRecord(item)) {\n invalid(diagnostics, `${path} must be an object.`);\n return;\n }\n for (const key of Object.keys(item)) {\n if (![\"label\", \"link\", \"variant\", \"newTab\"].includes(key))\n unknown(diagnostics, `${path}.${key}`);\n }\n if (typeof item.label !== \"string\" || !item.label.trim())\n invalid(diagnostics, `${path}.label must be a non-empty string.`);\n if (\n typeof item.link !== \"string\" ||\n /[\\\\\\s]/.test(item.link) ||\n !(/^(?:\\/(?!\\/)|#)/.test(item.link) || isHttpUrl(item.link))\n )\n invalid(\n diagnostics,\n `${path}.link must be an HTTP(S) URL, root-relative route, or fragment.`,\n );\n if (\n item.variant !== undefined &&\n ![\"default\", \"primary\"].includes(item.variant as string)\n )\n invalid(\n diagnostics,\n `${path}.variant must be \"default\" or \"primary\".`,\n );\n if (item.newTab !== undefined && typeof item.newTab !== \"boolean\")\n invalid(diagnostics, `${path}.newTab must be a boolean.`);\n });\n }\n }\n\n if (config.navigation !== undefined && !Array.isArray(config.navigation)) {\n if (!isRecord(config.navigation)) {\n invalid(diagnostics, \"navigation must be an array or object.\");\n } else {\n for (const key of Object.keys(config.navigation)) {\n if (!new Set([\"items\", \"tabs\"]).has(key)) {\n unknown(diagnostics, `navigation.${key}`);\n }\n }\n if (\n config.navigation.items !== undefined &&\n !Array.isArray(config.navigation.items)\n ) {\n invalid(diagnostics, \"navigation.items must be an array.\");\n }\n if (\n config.navigation.tabs !== undefined &&\n !Array.isArray(config.navigation.tabs)\n ) {\n invalid(diagnostics, \"navigation.tabs must be an array.\");\n }\n }\n }\n if (Array.isArray(config.navigation)) {\n validateNavigationItems(config.navigation, \"navigation\", diagnostics);\n } else if (isRecord(config.navigation)) {\n if (Array.isArray(config.navigation.items)) {\n validateNavigationItems(\n config.navigation.items,\n \"navigation.items\",\n diagnostics,\n );\n }\n if (Array.isArray(config.navigation.tabs)) {\n for (const [index, tab] of config.navigation.tabs.entries()) {\n const path = `navigation.tabs[${index}]`;\n if (\n !isRecord(tab) ||\n typeof tab.label !== \"string\" ||\n typeof tab.link !== \"string\"\n ) {\n invalid(diagnostics, `${path} must have a label and link.`);\n } else if (tab.items !== undefined) {\n validateNavigationItems(tab.items, `${path}.items`, diagnostics);\n }\n }\n }\n }\n\n if (\n config.redirects !== undefined &&\n (!isRecord(config.redirects) ||\n Object.values(config.redirects).some(\n (value) => typeof value !== \"string\",\n ))\n )\n invalid(diagnostics, \"redirects must map old routes to document routes.\");\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 if (config.site?.seo !== undefined)\n for (const message of validateSeo(config.site.seo, \"site\"))\n invalid(diagnostics, `site.${message}`);\n if (config.tableOfContents !== undefined)\n for (const message of validateTableOfContents(config.tableOfContents))\n invalid(diagnostics, message);\n const logo = config.site?.logo;\n if (logo !== undefined && logo !== false) {\n const value = typeof logo === \"string\" ? { src: logo } : logo;\n if (!isRecord(value))\n invalid(\n diagnostics,\n \"site.logo must be false, a local image path, or a logo definition.\",\n );\n else {\n for (const key of Object.keys(value))\n if (\n ![\n \"src\",\n \"light\",\n \"dark\",\n \"alt\",\n \"href\",\n \"width\",\n \"height\",\n \"decorative\",\n ].includes(key)\n )\n unknown(diagnostics, `site.logo.${key}`);\n if (\n (value.src !== undefined &&\n (value.light !== undefined || value.dark !== undefined)) ||\n (value.src === undefined &&\n (value.light === undefined || value.dark === undefined))\n )\n invalid(\n diagnostics,\n \"site.logo must provide src or both light and dark paths.\",\n );\n for (const key of [\"src\", \"light\", \"dark\"])\n if (\n value[key] !== undefined &&\n (typeof value[key] !== \"string\" ||\n !value[key].trim() ||\n /^[a-z][a-z\\d+.-]*:|^\\/\\//i.test(value[key]))\n )\n invalid(\n diagnostics,\n `site.logo.${key} must be a non-empty local image path.`,\n );\n if (\n value.href !== undefined &&\n (typeof value.href !== \"string\" ||\n /[\\\\\\s]/.test(value.href) ||\n !(/^(?:\\/(?!\\/)|#)/.test(value.href) || isHttpUrl(value.href)))\n )\n invalid(\n diagnostics,\n \"site.logo.href must be an HTTP(S) URL, root-relative route, or fragment.\",\n );\n if (value.alt !== undefined && typeof value.alt !== \"string\")\n invalid(diagnostics, \"site.logo.alt must be a string.\");\n if (\n value.decorative !== undefined &&\n typeof value.decorative !== \"boolean\"\n )\n invalid(diagnostics, \"site.logo.decorative must be a boolean.\");\n for (const key of [\"width\", \"height\"])\n if (\n value[key] !== undefined &&\n (typeof value[key] !== \"number\" ||\n !Number.isFinite(value[key]) ||\n value[key] <= 0)\n )\n invalid(\n diagnostics,\n `site.logo.${key} must be a positive dimension.`,\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 for (const field of [\"url\", \"repository\"] as const) {\n const value = config.site?.[field];\n if (value === undefined) continue;\n if (typeof value !== \"string\" || !isHttpUrl(value)) {\n invalid(diagnostics, `site.${field} must be an absolute HTTP(S) URL.`);\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 (\n config.translations !== undefined &&\n (!isRecord(config.translations) ||\n Object.values(config.translations).some(\n (messages) =>\n !isRecord(messages) ||\n Object.values(messages).some((value) => typeof value !== \"string\"),\n ))\n ) {\n invalid(\n diagnostics,\n \"translations must map language codes to string messages.\",\n );\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 if (\n config.content?.allowOutsideRoot !== undefined &&\n typeof config.content.allowOutsideRoot !== \"boolean\"\n ) {\n invalid(diagnostics, \"content.allowOutsideRoot must be a boolean.\");\n }\n if (\n config.content?.localizeRepositoryLinks !== undefined &&\n typeof config.content.localizeRepositoryLinks !== \"boolean\"\n ) {\n invalid(diagnostics, \"content.localizeRepositoryLinks must be a boolean.\");\n }\n const configuredSources = config.content?.sources;\n if (configuredSources !== undefined && !Array.isArray(configuredSources)) {\n invalid(diagnostics, \"content.sources must be an array.\");\n }\n const sources = Array.isArray(configuredSources) ? configuredSources : [];\n for (const [index, source] of sources.entries()) {\n if (!isRecord(source)) {\n invalid(diagnostics, `content.sources[${index}] must be an object.`);\n continue;\n }\n const sourceRecord = source as unknown as Record<string, unknown>;\n const variants = [\"file\", \"glob\", \"package\", \"openapi\"].filter(\n (key) => key in source,\n );\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, package, or openapi.`,\n });\n continue;\n }\n const variant = variants[0] as \"file\" | \"glob\" | \"package\" | \"openapi\";\n const allowed = {\n file: new Set([\n \"id\",\n \"root\",\n \"routeBase\",\n \"file\",\n \"route\",\n \"title\",\n \"description\",\n \"navigation\",\n ]),\n glob: new Set([\n \"id\",\n \"root\",\n \"glob\",\n \"base\",\n \"routeBase\",\n \"exclude\",\n \"navigation\",\n ]),\n package: new Set([\n \"id\",\n \"package\",\n \"registry\",\n \"include\",\n \"exclude\",\n \"index\",\n \"routeBase\",\n \"trust\",\n ]),\n openapi: new Set([\"id\", \"root\", \"routeBase\", \"openapi\"]),\n }[variant];\n for (const key of Object.keys(source)) {\n if (!allowed.has(key))\n unknown(diagnostics, `content.sources[${index}].${key}`);\n }\n for (const field of [\n \"id\",\n \"root\",\n \"route\",\n \"routeBase\",\n \"base\",\n \"index\",\n \"title\",\n \"description\",\n \"registry\",\n ]) {\n if (\n sourceRecord[field] !== undefined &&\n typeof sourceRecord[field] !== \"string\"\n )\n invalid(\n diagnostics,\n `content.sources[${index}].${field} must be a string.`,\n );\n }\n if (\n typeof sourceRecord.id === \"string\" &&\n !/^[a-zA-Z0-9_-]+$/.test(sourceRecord.id)\n )\n invalid(\n diagnostics,\n `content.sources[${index}].id must contain only letters, numbers, underscores, and hyphens.`,\n );\n if (\n sourceRecord.trust !== undefined &&\n ![\"markdown\", \"mdx\"].includes(String(sourceRecord.trust))\n )\n invalid(\n diagnostics,\n `content.sources[${index}].trust must be \"markdown\" or \"mdx\".`,\n );\n if (\n typeof sourceRecord.registry === \"string\" &&\n !isHttpUrl(sourceRecord.registry)\n )\n invalid(\n diagnostics,\n `content.sources[${index}].registry must be an absolute HTTP(S) URL.`,\n );\n const selector = sourceRecord[variant];\n if (\n variant === \"glob\"\n ? typeof selector !== \"string\" &&\n (!Array.isArray(selector) ||\n selector.some((value) => typeof value !== \"string\"))\n : typeof selector !== \"string\" || selector.trim() === \"\"\n ) {\n invalid(\n diagnostics,\n `content.sources[${index}].${variant} must be ${variant === \"glob\" ? \"a string or string array\" : \"a non-empty string\"}.`,\n );\n }\n for (const list of [\"include\", \"exclude\"] as const) {\n const value = sourceRecord[list];\n if (\n value !== undefined &&\n (!Array.isArray(value) ||\n value.some((entry) => typeof entry !== \"string\"))\n ) {\n invalid(\n diagnostics,\n `content.sources[${index}].${list} must be a string array.`,\n );\n }\n }\n }\n\n if (\n config.markdown?.stripLeadingBadges !== undefined &&\n typeof config.markdown.stripLeadingBadges !== \"boolean\"\n ) {\n invalid(diagnostics, \"markdown.stripLeadingBadges must be a boolean.\");\n }\n if (\n config.markdown?.rawHtml !== undefined &&\n ![\"allow\", \"sanitize\", \"strip\", \"reject\"].includes(config.markdown.rawHtml)\n ) {\n invalid(\n diagnostics,\n 'markdown.rawHtml must be \"allow\", \"sanitize\", \"strip\", or \"reject\".',\n );\n }\n if (\n config.search?.enabled !== undefined &&\n typeof config.search.enabled !== \"boolean\"\n ) {\n invalid(diagnostics, \"search.enabled must be a boolean.\");\n }\n for (const key of [\"strict\", \"ci\"] as const) {\n const value = config.build?.[key];\n if (value !== undefined && typeof value !== \"boolean\") {\n invalid(diagnostics, `build.${key} must be a boolean.`);\n }\n }\n for (const key of [\n \"maxArtifactBytes\",\n \"maxUnpackedBytes\",\n \"maxFiles\",\n \"maxPathDepth\",\n \"maxAssetBytes\",\n ] as const) {\n const value = config.build?.[key];\n if (value !== undefined && (!Number.isSafeInteger(value) || value <= 0)) {\n invalid(diagnostics, `build.${key} must be a positive integer.`);\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 if (\n config.content?.frontmatter !== undefined &&\n ![\"preserve\", \"reject\"].includes(config.content.frontmatter)\n )\n invalid(diagnostics, 'content.frontmatter must be \"preserve\" or \"reject\".');\n for (const field of [\n \"styles\",\n \"customStyles\",\n \"palette\",\n \"glaze\",\n \"units\",\n \"recipes\",\n \"fonts\",\n \"fontLoading\",\n \"tokens\",\n \"states\",\n \"presets\",\n ] as const) {\n if (config.theme?.[field] !== undefined && !isRecord(config.theme[field]))\n invalid(diagnostics, `theme.${field} must be an object.`);\n }\n for (const [name, value] of Object.entries(config.theme?.tokens ?? {})) {\n if (!/^\\$[a-zA-Z0-9_-]+$/.test(name))\n invalid(\n diagnostics,\n `theme.tokens.${name}: use a Tasty $name token key.`,\n );\n if (\n value !== undefined &&\n typeof value !== \"string\" &&\n !(typeof value === \"number\" && Number.isFinite(value))\n )\n invalid(diagnostics, `theme.tokens.${name} must be a string or number.`);\n }\n for (const [name, value] of Object.entries(config.theme?.units ?? {})) {\n if (\n !/^[a-z][a-z0-9]*$/.test(name) ||\n typeof value !== \"string\" ||\n !value.trim()\n )\n invalid(\n diagnostics,\n `theme.units.${name} must be a named non-empty CSS length expression.`,\n );\n }\n for (const [name, recipe] of Object.entries(config.theme?.recipes ?? {})) {\n if (!/^[a-z][a-z0-9-]*$/.test(name) || name === \"none\" || !isRecord(recipe))\n invalid(\n diagnostics,\n `theme.recipes.${name} must be a named flat Tasty style object; none is reserved.`,\n );\n else\n for (const key of Object.keys(recipe))\n if (key === \"recipe\" || /^[A-Z]/.test(key) || /^[&.]/.test(key))\n invalid(\n diagnostics,\n `theme.recipes.${name}.${key}: recipes are flat and cannot reference other recipes.`,\n );\n }\n if (isRecord(config.theme?.glaze)) {\n const settings = config.theme.glaze;\n for (const key of Object.keys(settings))\n if (\n ![\n \"lightTone\",\n \"darkTone\",\n \"darkDesaturation\",\n \"autoFlip\",\n \"pastel\",\n \"inferRole\",\n \"shadowTuning\",\n ].includes(key)\n )\n unknown(diagnostics, `theme.glaze.${key}`);\n for (const key of [\"autoFlip\", \"pastel\", \"inferRole\"] as const)\n if (settings[key] !== undefined && typeof settings[key] !== \"boolean\")\n invalid(diagnostics, `theme.glaze.${key} must be boolean.`);\n if (\n settings.darkDesaturation !== undefined &&\n (typeof settings.darkDesaturation !== \"number\" ||\n !Number.isFinite(settings.darkDesaturation) ||\n settings.darkDesaturation < 0 ||\n settings.darkDesaturation > 1)\n )\n invalid(\n diagnostics,\n \"theme.glaze.darkDesaturation must be between 0 and 1.\",\n );\n for (const key of [\"lightTone\", \"darkTone\"] as const) {\n const window = settings[key];\n if (window === undefined || window === false) continue;\n const lo = Array.isArray(window) ? window[0] : window?.lo;\n const hi = Array.isArray(window) ? window[1] : window?.hi;\n if (\n typeof lo !== \"number\" ||\n typeof hi !== \"number\" ||\n !Number.isFinite(lo) ||\n !Number.isFinite(hi) ||\n lo < 0 ||\n hi > 100 ||\n lo >= hi ||\n (Array.isArray(window)\n ? window.length !== 2\n : !isRecord(window) ||\n Object.keys(window).some(\n (key) => ![\"lo\", \"hi\", \"eps\"].includes(key),\n ) ||\n typeof window.eps !== \"number\" ||\n !Number.isFinite(window.eps) ||\n window.eps <= 0)\n )\n invalid(\n diagnostics,\n `theme.glaze.${key} must be false, [lo, hi], or {lo, hi, eps} with an ascending 0–100 range.`,\n );\n }\n const tuning = settings.shadowTuning;\n if (tuning !== undefined) {\n if (!isRecord(tuning))\n invalid(diagnostics, \"theme.glaze.shadowTuning must be an object.\");\n else\n for (const [key, value] of Object.entries(tuning)) {\n if (\n ![\n \"saturationFactor\",\n \"maxSaturation\",\n \"lightnessFactor\",\n \"lightnessBounds\",\n \"minGapTarget\",\n \"alphaMax\",\n \"bgHueBlend\",\n ].includes(key)\n )\n unknown(diagnostics, `theme.glaze.shadowTuning.${key}`);\n const values = Array.isArray(value) ? value : [value];\n if (\n values.some(\n (item) =>\n typeof item !== \"number\" ||\n !Number.isFinite(item) ||\n item < 0 ||\n item > 1,\n ) ||\n (key === \"lightnessBounds\" &&\n (!Array.isArray(value) ||\n value.length !== 2 ||\n value[0] > value[1]))\n )\n invalid(\n diagnostics,\n `theme.glaze.shadowTuning.${key} must use values from 0 to 1.`,\n );\n }\n }\n }\n if (isRecord(config.theme?.fontLoading)) {\n const choices = {\n google: [\"self-hosted\", \"remote\"],\n cache: [\"reuse\", \"refresh\", \"offline\"],\n display: [\"auto\", \"block\", \"swap\", \"fallback\", \"optional\"],\n };\n for (const [key, value] of Object.entries(config.theme.fontLoading)) {\n const allowed = choices[key as keyof typeof choices];\n if (!allowed) unknown(diagnostics, `theme.fontLoading.${key}`);\n else if (\n value !== undefined &&\n (typeof value !== \"string\" || !allowed.includes(value))\n )\n invalid(\n diagnostics,\n `theme.fontLoading.${key} must be ${allowed.join(\" or \")}.`,\n );\n }\n }\n if (isRecord(config.theme?.fonts)) {\n for (const [role, font] of Object.entries(config.theme.fonts)) {\n const path = `theme.fonts.${role}`;\n if (![\"body\", \"heading\", \"code\"].includes(role)) {\n unknown(diagnostics, path);\n continue;\n }\n if (font === undefined) continue;\n if (typeof font === \"string\") {\n if (!validFontFamily(font))\n invalid(diagnostics, `${path} must name a Google Fonts family.`);\n continue;\n }\n if (!isRecord(font)) {\n invalid(\n diagnostics,\n `${path} must be a Google Fonts name or font definition.`,\n );\n continue;\n }\n if (\"google\" in font) {\n for (const key of Object.keys(font))\n if (![\"google\", \"weights\", \"styles\"].includes(key))\n unknown(diagnostics, `${path}.${key}`);\n if (!validFontFamily(font.google))\n invalid(\n diagnostics,\n `${path}.google must name a Google Fonts family.`,\n );\n if (\n font.weights !== undefined &&\n (!Array.isArray(font.weights) ||\n font.weights.length === 0 ||\n font.weights.some((weight) => !validFontWeight(weight)))\n )\n invalid(\n diagnostics,\n `${path}.weights must be a non-empty array of weights from 1 to 1000 or ascending ranges such as \"100 900\".`,\n );\n if (\n font.styles !== undefined &&\n (!Array.isArray(font.styles) ||\n font.styles.length === 0 ||\n font.styles.some((style) => ![\"normal\", \"italic\"].includes(style)))\n )\n invalid(\n diagnostics,\n `${path}.styles must contain normal and/or italic.`,\n );\n } else {\n for (const key of Object.keys(font))\n if (![\"family\", \"files\"].includes(key))\n unknown(diagnostics, `${path}.${key}`);\n if (!validFontFamily(font.family))\n invalid(diagnostics, `${path}.family must be a font family name.`);\n if (!Array.isArray(font.files) || font.files.length === 0) {\n invalid(\n diagnostics,\n `${path}.files must contain at least one font file.`,\n );\n continue;\n }\n font.files.forEach((file, index) => {\n const filePath = `${path}.files[${index}]`;\n if (!isRecord(file)) {\n invalid(diagnostics, `${filePath} must be an object.`);\n return;\n }\n for (const key of Object.keys(file))\n if (![\"src\", \"weight\", \"style\"].includes(key))\n unknown(diagnostics, `${filePath}.${key}`);\n if (\n typeof file.src !== \"string\" ||\n !/^\\/(?!\\/)[^\\s\"'()\\\\?#]+\\.(?:woff2?|ttf|otf)$/.test(file.src) ||\n file.src\n .split(\"/\")\n .some((segment) => segment === \".\" || segment === \"..\")\n )\n invalid(\n diagnostics,\n `${filePath}.src must be a root-relative .woff2, .woff, .ttf, or .otf public path.`,\n );\n if (\n file.weight !== undefined &&\n !(\n typeof file.weight === \"number\" &&\n Number.isInteger(file.weight) &&\n file.weight >= 1 &&\n file.weight <= 1000\n ) &&\n !(\n typeof file.weight === \"string\" &&\n /^(?:[1-9]\\d{0,2}|1000) (?:[1-9]\\d{0,2}|1000)$/.test(\n file.weight,\n ) &&\n Number(file.weight.split(\" \")[0]) <\n Number(file.weight.split(\" \")[1])\n )\n )\n invalid(\n diagnostics,\n `${filePath}.weight must be a weight from 1 to 1000 or an ascending range.`,\n );\n if (\n file.style !== undefined &&\n ![\"normal\", \"italic\"].includes(file.style as string)\n )\n invalid(diagnostics, `${filePath}.style must be normal or italic.`);\n });\n }\n }\n }\n for (const [name, entry] of Object.entries(config.theme?.styles ?? {})) {\n if (!(COOKBOOK_COMPONENT_NAMES as readonly string[]).includes(name)) {\n unknown(\n diagnostics,\n `theme.styles.${name}; register custom components under theme.customStyles`,\n );\n continue;\n }\n if (!isRecord(entry))\n invalid(\n diagnostics,\n `theme.styles.${name} must be a Tasty style object.`,\n );\n else {\n if (\"mode\" in entry)\n invalid(\n diagnostics,\n `theme.styles.${name} must contain only Tasty properties, without a mode wrapper.`,\n );\n const elements: readonly string[] =\n COOKBOOK_COMPONENT_SUB_ELEMENTS[\n name as keyof typeof COOKBOOK_COMPONENT_SUB_ELEMENTS\n ];\n for (const key of Object.keys(entry)) {\n if (/^[A-Z]/.test(key) && !elements.includes(key))\n unknown(diagnostics, `theme.styles.${name}.${key}`);\n }\n }\n }\n for (const [name, entry] of Object.entries(\n config.theme?.customStyles ?? {},\n )) {\n if ((COOKBOOK_COMPONENT_NAMES as readonly string[]).includes(name))\n invalid(\n diagnostics,\n `Use theme.styles.${name} for a built-in component.`,\n );\n if (\n !/^[A-Za-z][A-Za-z0-9_-]*$/.test(name) ||\n !isRecord(entry) ||\n \"mode\" in entry\n )\n invalid(\n diagnostics,\n `theme.customStyles.${name} must be a named partial Tasty style object.`,\n );\n }\n for (const [name, value] of Object.entries(config.theme?.palette ?? {})) {\n if (value !== undefined) validatePaletteColor(name, value, diagnostics);\n }\n if (\n (config.theme?.palette || config.theme?.glaze) &&\n !diagnostics.some((item) => item.severity === \"error\")\n ) {\n try {\n resolveColorTheme(config.theme);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const name = /color \"([^\"]+)\"/.exec(message)?.[1];\n invalid(\n diagnostics,\n `theme.palette${name ? `.${name}` : \"\"}: ${message}`,\n );\n }\n }\n if (brand !== undefined) {\n try {\n if (isBrandDeclaration(brand)) {\n glaze\n .color({\n hue: brand.hue,\n saturation: brand.saturation,\n tone: brand.tone,\n })\n .resolve();\n } else {\n glaze\n .color({\n from:\n typeof brand === \"object\" && brand !== null && \"from\" in brand\n ? brand.from\n : brand,\n })\n .resolve();\n }\n } catch (error) {\n invalid(\n diagnostics,\n `theme.brand: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n const contrast = config.theme?.contrastLevel;\n if (\n contrast !== undefined &&\n contrast !== \"auto\" &&\n (typeof contrast !== \"number\" ||\n !Number.isFinite(contrast) ||\n contrast < 0 ||\n contrast > 100)\n )\n invalid(\n diagnostics,\n 'theme.contrastLevel must be \"auto\" or a number from 0 to 100.',\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 validatePaletteColor(\n name: string,\n value: ThemePaletteColor,\n diagnostics: DocsDiagnostic[],\n): void {\n try {\n if (!isPaletteDeclaration(value)) {\n glaze.color({ from: value }).resolve();\n return;\n }\n const keys =\n \"type\" in value\n ? new Set(\n value.type === \"mix\"\n ? [\n \"type\",\n \"base\",\n \"target\",\n \"value\",\n \"blend\",\n \"space\",\n \"contrast\",\n \"pastel\",\n \"role\",\n \"inherit\",\n ]\n : value.type === \"shadow\"\n ? [\n \"type\",\n \"bg\",\n \"fg\",\n \"intensity\",\n \"tuning\",\n \"pastel\",\n \"inherit\",\n ]\n : [],\n )\n : COLOR_DECLARATION_KEYS;\n for (const key of Object.keys(value)) {\n if (!keys.has(key)) unknown(diagnostics, `theme.palette.${name}.${key}`);\n }\n } catch (error) {\n invalid(\n diagnostics,\n `theme.palette.${name}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nfunction isPaletteDeclaration(value: ThemePaletteColor): value is ColorDef {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !(\"h\" in value || \"r\" in value || \"c\" in value)\n );\n}\n\nfunction isBrandDeclaration(value: unknown): value is BrandDeclaration {\n return (\n isRecord(value) &&\n \"hue\" in value &&\n \"saturation\" in value &&\n \"tone\" in value\n );\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\nfunction validFontFamily(value: unknown): value is string {\n return (\n typeof value === \"string\" &&\n value.length <= 100 &&\n /^[\\p{L}\\p{N} ._-]+$/u.test(value) &&\n value.trim() === value &&\n value.length > 0\n );\n}\n\nfunction isHttpUrl(value: string): boolean {\n try {\n return [\"http:\", \"https:\"].includes(new URL(value).protocol);\n } catch {\n return false;\n }\n}\n\nfunction validateNavigationItems(\n items: unknown,\n path: string,\n diagnostics: DocsDiagnostic[],\n): void {\n if (!Array.isArray(items)) {\n invalid(diagnostics, `${path} must be an array.`);\n return;\n }\n for (const [index, item] of items.entries()) {\n const itemPath = `${path}[${index}]`;\n if (typeof item === \"string\") continue;\n if (!isRecord(item) || typeof item.label !== \"string\") {\n invalid(\n diagnostics,\n `${itemPath} must be a route or a labeled navigation item.`,\n );\n continue;\n }\n const group = \"items\" in item || \"autogenerate\" in item;\n if (item.badge !== undefined && typeof item.badge !== \"string\") {\n invalid(diagnostics, `${itemPath}.badge must be a string.`);\n }\n if (\n group &&\n item.link !== undefined &&\n (typeof item.link !== \"string\" ||\n !/^\\/(?!\\/)[^?#\\\\\\s]*$/.test(item.link) ||\n item.link.includes(\"//\") ||\n item.link\n .split(\"/\")\n .some((segment) => segment === \".\" || segment === \"..\"))\n ) {\n invalid(\n diagnostics,\n `${itemPath}.link must be a root-relative page route without a query or fragment.`,\n );\n }\n if (\"items\" in item) {\n validateNavigationItems(item.items, `${itemPath}.items`, diagnostics);\n } else if (\"autogenerate\" in item) {\n if (\n !isRecord(item.autogenerate) ||\n typeof item.autogenerate.directory !== \"string\"\n ) {\n invalid(\n diagnostics,\n `${itemPath}.autogenerate.directory must be a directory path.`,\n );\n }\n } else if (typeof item.link !== \"string\") {\n invalid(diagnostics, `${itemPath}.link must be a URL or route.`);\n }\n }\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 ...(config.tableOfContents !== undefined\n ? { tableOfContents: config.tableOfContents }\n : {}),\n redirects: { ...config.redirects },\n site: { ...config.site },\n head: [...(config.head ?? [])],\n ...(config.editLink ? { editLink: { ...config.editLink } } : {}),\n lastUpdated: config.lastUpdated ?? false,\n ...(config.translations ? { translations: config.translations } : {}),\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 ...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(config: DocsConfig): DocsConfig {\n const diagnostics = validateConfig(config);\n if (diagnostics.length > 0) throw new DocsConfigError(diagnostics);\n return config;\n}\n\n/** Compose presets. Color roles and fonts replace, other objects merge, and styles use Tasty semantics. */\nexport function mergeDocsConfig(...configs: DocsConfig[]): DocsConfig {\n const merge = (\n base: Record<string, unknown>,\n next: Record<string, unknown>,\n ) => {\n const result = { ...base };\n for (const [key, value] of Object.entries(next)) {\n if (value === undefined) continue;\n result[key] = isRecord(value)\n ? merge(isRecord(result[key]) ? result[key] : {}, value)\n : Array.isArray(value)\n ? [...value]\n : value;\n }\n return result;\n };\n return defineDocsConfig(\n configs.reduce<DocsConfig>((base, next) => {\n const { palette: _palette, ...themeWithoutPalette } = next.theme ?? {};\n const diagnostics = validateConfig({\n ...next,\n ...(next.theme ? { theme: themeWithoutPalette } : {}),\n });\n if (diagnostics.length) throw new DocsConfigError(diagnostics);\n const result = merge(\n base as Record<string, unknown>,\n next as Record<string, unknown>,\n ) as DocsConfig;\n // Logo definitions are alternatives, not fields to combine across variants.\n if (next.site?.logo !== undefined) result.site!.logo = next.site.logo;\n if (next.site?.seo?.image !== undefined)\n result.site!.seo!.image = next.site.seo.image;\n // A color declaration is one value. Merging its fields could retain an\n // obsolete `from` seed when a consumer switches to tone relationships.\n if (next.theme?.brand !== undefined)\n result.theme!.brand = next.theme.brand;\n if (next.theme?.palette)\n result.theme!.palette = {\n ...base.theme?.palette,\n ...Object.fromEntries(\n Object.entries(next.theme.palette).filter(\n ([, color]) => color !== undefined,\n ),\n ),\n };\n // Font definitions are alternatives, so a consumer can switch from a\n // Google family to local files (or back) in a layered configuration.\n if (next.theme?.fonts)\n result.theme!.fonts = {\n ...base.theme?.fonts,\n ...Object.fromEntries(\n Object.entries(next.theme.fonts).filter(\n ([, font]) => font !== undefined,\n ),\n ),\n };\n for (const field of [\"styles\", \"customStyles\", \"recipes\"] as const) {\n if (!next.theme?.[field]) continue;\n const styles = { ...base.theme?.[field] } as Record<string, Styles>;\n for (const [name, configured] of Object.entries(next.theme[field])) {\n styles[name] = mergeStyles(styles[name] ?? {}, configured);\n }\n if (field === \"recipes\")\n result.theme!.recipes = styles as Record<string, RecipeStyles>;\n else result.theme![field] = styles;\n }\n return result;\n }, {}),\n );\n}\n\nexport { COOKBOOK_COMPONENT_NAMES, COOKBOOK_COMPONENT_SUB_ELEMENTS };\n\nexport type {\n BrandConfig,\n BrandDeclaration,\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 NavigationPlacement,\n NavigationTab,\n NormalizedDocsConfig,\n SearchConfig,\n SiteConfig,\n SiteSeoConfig,\n PageSeoConfig,\n TableOfContentsConfig,\n SocialImage,\n BreadcrumbItem,\n HeaderLink,\n SiteIconConfig,\n SiteLogoConfig,\n ThemeConfig,\n FontLoadingConfig,\n ThemeFont,\n ThemeFontFile,\n ThemeFonts,\n ThemePaletteColor,\n ThemePaletteConfig,\n ThemeTokens,\n ThemeTokenValue,\n TypographyPreset,\n TypographyPresets,\n} from \"../types.js\";\n\nfunction validFontWeight(weight: unknown): boolean {\n return (\n (typeof weight === \"number\" &&\n Number.isInteger(weight) &&\n weight >= 1 &&\n weight <= 1000) ||\n (typeof weight === \"string\" &&\n /^(?:[1-9]\\d{0,2}|1000) (?:[1-9]\\d{0,2}|1000)$/.test(weight) &&\n Number(weight.split(\" \")[0]) < Number(weight.split(\" \")[1]))\n );\n}\n"],"mappings":";;;AAAA,SAAgB,wBAAwB,OAA0B;CAChE,IAAI,UAAU,OAAO,OAAO,CAAC;CAC7B,IAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAC5D,OAAO,CAAC,6CAA6C;CACvD,MAAM,SAAS;CACf,MAAM,SAAmB,CAAC;CAC1B,KAAK,MAAM,OAAO,OAAO,KAAK,MAAM,GAClC,IAAI,CAAC;EAAC;EAAmB;EAAmB;CAAQ,CAAC,CAAC,SAAS,GAAG,GAChE,OAAO,KAAK,mBAAmB,IAAI,mBAAmB;CAC1D,KAAK,MAAM,OAAO,CAAC,mBAAmB,iBAAiB,GACrD,IACE,OAAO,SAAS,KAAA,MACf,CAAC,OAAO,UAAU,OAAO,IAAI,KAC5B,OAAO,OAAO,IAAI,IAAI,KACtB,OAAO,OAAO,IAAI,IAAI,IAExB,OAAO,KAAK,mBAAmB,IAAI,iCAAiC;CACxE,IAAI,OAAO,WAAW,KAAA,KAAa,OAAO,OAAO,WAAW,WAC1D,OAAO,KAAK,2CAA2C;CACzD,IACE,OAAO,OAAO,oBAAoB,YAClC,OAAO,OAAO,oBAAoB,YAClC,OAAO,kBAAkB,OAAO,iBAEhC,OAAO,KACL,gEACF;CACF,OAAO;AACT;;;ACnBA,SAAgB,SAAS,OAAe,OAAO,KAAK,MAAuB;CACzE,MAAM,OAAO,GAAG,KAAK,QAAQ,OAAO,EAAE,IAAI,UAAU,MAAM,MAAM,GAAG,MAAM;CACzE,OAAO,OAAO,IAAI,IAAI,MAAM,IAAI,CAAC,CAAC,OAAO;AAC3C;;AAGA,SAAgB,aACd,OACA,QACyB;CACzB,MAAM,QAAQ,MAAM,MAAM,GAAG,CAAC,CAAC;CAC/B,MAAM,OACJ,SAAS,UAAU,UAAU,OAAO,UAAU,SAC1C,MAAM,MAAM,MAAM,SAAS,CAAC,KAAK,MACjC;CACN,OAAO,CAAC,GAAI,OAAO,MAAM,YAAY,CAAC,CAAE,CAAC,CACtC,MAAM,GAAG,MAAM,EAAE,UAAU,SAAS,EAAE,UAAU,MAAM,CAAC,CACvD,MACE,MACC,EAAE,cAAc,OAChB,SAAS,EAAE,aACX,KAAK,WAAW,GAAG,EAAE,UAAU,EAAE,CACrC;AACJ;AAEA,SAAgB,eACd,OACA,QACA;CACA,MAAM,MAAM,OAAO,MAAM;CACzB,MAAM,OAAO,MAAM,YAAY;CAC/B,MAAM,UAAU,aAAa,MAAM,OAAO,MAAM;CAChD,MAAM,QACJ,CAAC,MAAM,YAAY,SACnB,KAAK,UAAU,SACf,SAAS,UAAU,SACnB,MAAM,UAAU;CAClB,MAAM,MAAM,SAAS,MAAM,OAAO,OAAO,OAAO,MAAM,OAAO,MAAM,GAAG;CACtE,MAAM,YAAY,MAAM,aAAa;CACrC,MAAM,YAAY,OAAO,MAAM,SAAS;CACxC,MAAM,QACJ,MAAM,UACL,KAAK,gBACF,IAAI,cACD,WAAW,WAAW,MAAM,KAAK,CAAC,CAClC,WAAW,UAAU,SAAS,IACjC,MAAM,UAAU,YACd,MAAM,QACN,GAAG,MAAM,MAAM,KAAK;CAC5B,OAAO;EACL;EACA,SAAS,SAAS,cAAc;EAChC;EACA;EACA;EACA,OAAO,MAAM,SAAS,KAAK;CAC7B;AACF;AAEA,SAAgB,YAAY,OAAgB,MAAiC;CAC3E,IAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAC5D,OAAO,CAAC,wBAAwB;CAClC,MAAM,MAAM;CACZ,MAAM,SAAmB,CAAC;CAC1B,MAAM,UACJ,SAAS,SACL;EAAC;EAAiB;EAAS;EAAS;EAAe;CAAU,IAC7D;EAAC;EAAS;EAAa;EAAS;EAAS;CAAa;CAC5D,KAAK,MAAM,OAAO,OAAO,KAAK,GAAG,GAC/B,IAAI,CAAC,QAAQ,SAAS,GAAG,GAAG,OAAO,KAAK,OAAO,IAAI,mBAAmB;CACxE,KAAK,MAAM,OAAO,CAAC,SAAS,UAAU,GACpC,IAAI,IAAI,SAAS,KAAA,KAAa,OAAO,IAAI,SAAS,WAChD,OAAO,KAAK,OAAO,IAAI,oBAAoB;CAC/C,IACE,IAAI,UAAU,KAAA,MACb,OAAO,IAAI,UAAU,YAAY,CAAC,IAAI,MAAM,KAAK,IAElD,OAAO,KAAK,mCAAmC;CACjD,IACE,IAAI,kBAAkB,KAAA,MACrB,OAAO,IAAI,kBAAkB,YAC5B,CAAC,IAAI,cAAc,SAAS,SAAS,KACrC,8BAA8B,KAAK,IAAI,aAAa,IAEtD,OAAO,KACL,sGACF;CACF,IAAI,IAAI,cAAc,KAAA,KAAa,CAAC,YAAY,IAAI,SAAS,GAC3D,OAAO,KACL,kFACF;CACF,IAAI,IAAI,UAAU,KAAA,KAAa,IAAI,UAAU,OAAO;EAClD,MAAM,QAAQ,IAAI;EAClB,IAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAC5D,OAAO,KAAK,yDAAyD;OAClE;GACH,MAAM,MAAM;GACZ,KAAK,MAAM,OAAO,OAAO,KAAK,GAAG,GAC/B,IAAI,CAAC;IAAC;IAAO;IAAO;IAAS;GAAQ,CAAC,CAAC,SAAS,GAAG,GACjD,OAAO,KAAK,aAAa,IAAI,mBAAmB;GACpD,IACE,CAAC,YAAY,IAAI,GAAG,KACpB,EACE,OAAO,IAAI,QAAQ,YACnB,uBAAuB,KAAK,IAAI,GAAG,KACnC,CAAC,IAAI,IAAI,MAAM,GAAG,CAAC,CAAC,MAAM,MAAM,MAAM,QAAQ,MAAM,GAAG,IAGzD,OAAO,KACL,0EACF;GACF,IAAI,OAAO,IAAI,QAAQ,YAAY,CAAC,IAAI,IAAI,KAAK,GAC/C,OAAO,KAAK,uCAAuC;GACrD,KAAK,MAAM,OAAO,CAAC,SAAS,QAAQ,GAClC,IACE,IAAI,SAAS,KAAA,MACZ,CAAC,OAAO,UAAU,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,IAEpD,OAAO,KAAK,aAAa,IAAI,6BAA6B;GAC9D,IAAK,IAAI,UAAU,KAAA,OAAgB,IAAI,WAAW,KAAA,IAChD,OAAO,KACL,wEACF;EACJ;CACF;CACA,IAAI,IAAI,gBAAgB,KAAA,GAAW;EACjC,IAAI,SAAS,QACP;OAAA,OAAO,IAAI,gBAAgB,WAC7B,OAAO,KAAK,oCAAoC;EAAA,OAC7C,IAAI,IAAI,gBAAgB,OAAO;GACpC,IAAI,CAAC,MAAM,QAAQ,IAAI,WAAW,KAAK,IAAI,YAAY,SAAS,GAC9D,OAAO,KACL,kEACF;QAEA,KAAK,MAAM,QAAQ,IAAI,aACrB,IACE,CAAC,QACD,OAAO,SAAS,YAChB,OAAO,KAAK,IAAI,CAAC,CAAC,MAAM,MAAM,MAAM,UAAU,MAAM,KAAK,KACzD,OAAO,KAAK,SAAS,YACrB,CAAC,KAAK,KAAK,KAAK,KAChB,CAAC,YAAY,KAAK,GAAG,GAErB,OAAO,KACL,kEACF;EAER;CACF;CACA,OAAO;AACT;AACA,SAAS,YAAY,OAAyB;CAC5C,IAAI,OAAO,UAAU,YAAY,SAAS,KAAK,KAAK,GAAG,OAAO;CAC9D,IAAI;EACF,MAAM,IAAI,IAAI,IAAI,KAAK;EACvB,OACE,YAAY,KAAK,EAAE,QAAQ,KAAK,CAAC,EAAE,QAAQ,CAAC,EAAE,YAAY,CAAC,EAAE;CAEjE,QAAQ;EACN,OAAO;CACT;AACF;;;ACzJA,MAAM,cAAc;CAAC;CAAS;CAAQ;CAAiB;AAAc;AAWrE,SAAS,IAAI,OAAuC;CAClD,MAAM,EAAE,GAAG,GAAG,MAAM,eAAe,KAAK;CACxC,OAAO,YAAY,GAAG,GAAG,GAAG,MAAM,MAAM;AAC1C;AACA,SAAS,UACP,YACA,YACU;CACV,MAAM,QAAQ,WAAW,SAAS;CAClC,OAAO,IAAI,UAAU,CAAC,CAAC,KACpB,SAAS,MAAM,UAAU,QAAQ,WAAW,MAAO,IAAI,MAC1D;AACF;AACA,SAAS,UAAU,UAAoB,QAAiC;CAGtE,OAAO,SAAS,QACb,KAAK,SAAS,MACb,MACA;EAAC;EAAQ;EAAQ;CAAM,CAAC,CAAC,MACtB,WAAW,SACR,WAAW,MACX,WAAW,SACT,UAAU,UACR,UAAU,QAAS,UAAU,MACzC,CACF;AACF;AACA,SAAgB,qBACd,YACA,YACA,SAA0B,QAC1B,WAAiC,YACzB;CACR,MAAM,KAAK,UAAU,YAAY,IAAI,QAAQ,CAAC;CAE9C,MAAM,cAAc,UADT,UAAU,YAAY,EACF,GAAG,MAAM;CACxC,MAAM,cAAc,UAAU,IAAI,MAAM;CACxC,OAAO,WAAW,SACd,KAAK,IAAI,aAAa,aAAa,WAAW,CAAC,IAC/C,2BAA2B,aAAa,WAAW;AACzD;AAEA,SAAgB,mBACd,QACA,aACA,OACA,cACA,YAAY,MACqD;CACjE,MAAM,wBAAQ,IAAI,IAGhB;CACF,MAAM,OACJ,YACA,YACA,SACG;EACH,MAAM,SAAS,wBAAwB,MAAM,CAAC,CAAC,CAAC;EAChD,MAAM,MAAM,GAAG,WAAW,GAAG,WAAW,GAAG;EAC3C,MAAM,WAAW,MAAM,IAAI,GAAG;EAC9B,IAAI,CAAC,UAAU,MAAM,IAAI,KAAK;GAAE;GAAY;GAAY;EAAK,CAAC;OACzD;GACH,MAAM,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,UAC5B,KAAK,IACH,wBAAwB,MAAM,KAAK,CAAC,CAAC,QACrC,wBAAwB,SAAS,MAAM,KAAK,CAAC,CAAC,MAChD,CACF;GACA,SAAS,OAAO,WAAW,SAAS,EAAE,MAAM,QAAQ,IAAI,EAAE,MAAM,QAAQ;EAC1E;CACF;CACA,MAAM,wBAAQ,IAAI,IAAkB;CACpC,SAAS,KAAK,MAAoB;EAChC,MAAM,SAAS,MAAM,IAAI,IAAI;EAC7B,IAAI,QAAQ,OAAO;EACnB,MAAM,aAAa,YAAY;EAC/B,MAAM,WACJ,UAAU,aAAa,cAAc,WAAW,IAAI,IAAI,KAAA;EAC1D,MAAM,WAAW,YAAY,kBAAkB,IAAI,IAAI,KAAA;EACvD,MAAM,QACJ,YACA,aACC,UAAU,cAAc,WAAW,OAChC,aAAa,KAAK,WAAW,IAAI,CAAC,IAClC;EACN,MAAM,IAAI,MAAM,KAAK;EACrB,OAAO;CACT;CAEA,KAAK,MAAM,CAAC,MAAM,eAAe,OAAO,QAAQ,WAAW,GAAG;EAC5D,IAAI,UAAU,cAAc,CAAC,WAAW,QAAQ,CAAC,WAAW,UAC1D;EACF,MAAM,YAAY,KAAK,IAAI,MAAM;EACjC,IACE,YAAY,WAAW,OAAO,MAC9B,YAAY,OAAO,WAAW,MAC9B,WAAW,QACb;CACF;CAEA,KAAK,MAAM,QAAQ;EAAC;EAAQ;EAAW;CAAW,GAChD,IAAI,MAAM,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;CACzC,IAAI,eAAe,WAAW,EAAE,MAAM,aAAa,CAAC;CACpD,KAAK,MAAM,cAAc;EACvB;EACA;EACA;EACA;EACA;CACF,GACE,IAAI,eAAe,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;CACnD,IAAI,uBAAuB,kBAAkB,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;CAC/D,IAAI,uBAAuB,kBAAkB,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;CAC/D,IAAI,aAAa,gBAAgB,EAAE,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC;CACnD,KAAK,MAAM,cAAc;EAAC;EAAW;EAAa;CAAW,GAC3D,IAAI,SAAS,YAAY,EAAE,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC;CAC7C,KAAK,MAAM,QAAQ;EACjB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,GAAG;EACD,IAAI,GAAG,KAAK,QAAQ,GAAG,KAAK,WAAW,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;EACzD,IAAI,GAAG,KAAK,QAAQ,GAAG,KAAK,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;CAC3D;CAEA,MAAM,SAA+B,CAAC;CACtC,MAAM,cAAgC,CAAC;CACvC,KAAK,MAAM,EAAE,YAAY,YAAY,UAAU,MAAM,OAAO,GAC1D,KAAK,MAAM,QAAQ,aAAa;EAC9B,MAAM,EAAE,QAAQ,WAAW,wBACzB,MACA,KAAK,SAAS,UAAU,IAAI,MAAM,OAAO,UAAU,WAAW,QAAQ,CACxE;EACA,MAAM,WAAW,qBACf,OAAO,IAAI,UAAU,CAAC,CAAE,OACxB,OAAO,IAAI,UAAU,CAAC,CAAE,OACxB,QACA,OAAO,IAAI,SAAS,CAAC,CAAE,KACzB;EACA,MAAM,SAAS,YAAY,WAAW,SAAS,MAAO,QAAS;EAC/D,OAAO,KAAK;GACV;GACA;GACA;GACA;GACA;GACA;GACA;EACF,CAAC;EACD,IAAI,CAAC,QACH,YAAY,KAAK;GACf,MACE,eAAe,iBAAiB,eAAe,YAC3C,8BACA;GACN,UAAU;GACV,SAAS,GAAG,WAAW,MAAM,WAAW,MAAM,KAAK,IAAI,WAAW,SAAS,YAAY,aAAa,GAAG,SAAS,QAAQ,CAAC,EAAE,aAAa,OAAO;GAC/I,MAAM,yBAAyB,WAAW,uBAAuB,WAAW;EAC9E,CAAC;CACL;CAEF,OAAO;EAAE;EAAQ;CAAY;AAC/B;;;ACtJA,SAAgB,kBAAkB,QAAqB,CAAC,GAAuB;CAC7E,MAAM,QAAQ,eAAe,MAAM,KAAK;CACxC,MAAM,iBAAiB,MAAM,UAAU,QAAQ;CAC/C,MAAM,eAAe,MAAM,QAAQ,cAAc,IAC7C,eAAe,KACf;CACJ,MAAM,aAAa,MAAM,QAAQ,cAAc,IAC3C,eAAe,KACf,eAAe;CACnB,MAAM,eAAe;EACnB,UAAU;EACV,GAAG,MAAM;EACT,GAAI,MAAM,kBAAkB,KAAA,IACxB,EAAE,eAAe,MAAM,cAAc,IACrC,CAAC;CACP;CACA,MAAM,eAAe,MAAM,SAAS;CACpC,MAAM,kBACJ,mBAAmB,YAAY,KAAK,kBAAkB,YAAY;CACpE,MAAM,cAAc,mBAAmB,YAAY,IAC9C,aAAa,QAAQ,MAAM,OAC5B,oBAAoB,YAAY,IAC9B,YACC,gBAAgB;CASvB,MAAM,sBARc,MAAM,MAAM;EAC9B,MAAM;EACN,MAAM;EAIN,gBAAgB;CAClB,CACsC,CAAC,CAAC,QAAQ;CAChD,MAAM,oBAAoB,MACvB,MAAM;EAAE,MAAM,MAAM;EAAM,MAAM;CAAO,GAAG,YAAY,CAAC,CACvD,QAAQ;CACX,MAAM,iBAAiB,eAAe,kBAAkB,KAAK;CAC7D,MAAM,gBAAgB,eAAe,kBAAkB,IAAI;CAC3D,MAAM,sBAAsB,cAAc,IAAI;CAC9C,MAAM,aAAa,MACjB;EACE,KAAK,eAAe;EACpB,YAAY,eAAe,IAAI;EAC/B,SAAS,cAAc;EACvB,gBAAgB;CAClB,GACA,KAAA,GACA,YACF;CACA,MAAM,oBAAoB,kBACrB,aAAa,cAAc,MAC5B;CACJ,MAAM,wBAAwB,kBACzB,aAAa,kBAAkB,oBAAoB,KACpD;CACJ,MAAM,6BAA6B,WACjC,kBACI,wBAAwB,SACxB,iBACG,oBAAoB,KAAK,IAAI,SAAU,KACxC,sBAAsB,GACxB;CACN,MAAM,iBAAiB,kBACnB;EACE,KAAK,aAAa,OAAO,eAAe;EACxC,SAAS,aAAa,WAAW,aAAa,OAAO,cAAc;CACrE,IACA;EACE,KAAK,eAAe,oBAAoB,KAAK,CAAC,CAAC;EAC/C,SAAS,eAAe,oBAAoB,IAAI,CAAC,CAAC;CACpD;CACJ,MAAM,oBAAoB,kBACxB,cACA,kBACI;EACE,MAAM;EACN,YAAY;EACZ,gBAAgB;EAChB,MAAM;CACR,IACA;EACE,MAAM;EACN,MAAM;EACN,gBAAgB,iBACd,oBAAoB,KAAK,GACzB,sBAAsB,GACxB;CACF,CACN;CACA,MAAM,cAAwB;EAC5B,SAAS;EACT,QAAQ,kBACN,MAAM,SAAS,QACf,kBACI;GAAE,GAAG;GAAmB,SAAS;EAAI,IACrC;GACE,MAAM;GACN,MAAM;GACN,gBAAgB,iBACd,oBAAoB,KAAK,GACzB,sBAAsB,GACxB;GACA,SAAS;EACX,CACN;EACA,aAAa;GACX,MAAM;GACN,GAAG;GACH,MAAM;GACN,MAAM;GACN,GAAI,kBACA,EAAE,YAAY,oBAAoB,IAAK,IACvC,EACE,MAAM;IACJ,GAAG,eAAe,oBAAoB,KAAK,CAAC,CAAC;IAC7C,GAAG,oBAAoB,MAAM,IAAI;IACjC,GAAG;GACL,EACF;GACJ,gBAAgB,0BAA0B,kBAAkB,MAAO,IAAK;EAC1E;EACA,aAAa;GACX,MAAM;GACN,GAAG;GACH,MAAM;GACN,MAAM;GACN,GAAI,kBACA,EAAE,YAAY,oBAAoB,IAAK,IACvC,EACE,MAAM;IACJ,GAAG,eAAe,oBAAoB,KAAK,CAAC,CAAC;IAC7C,GAAG,oBAAoB,MAAM,IAAI;IACjC,GAAG;GACL,EACF;GACJ,gBAAgB,0BAA0B,kBAAkB,MAAO,GAAI;EACzE;EACA,MAAM,kBAAkB,MAAM,SAAS,MAAM;GAC3C,MAAM;GACN,YAAY;GACZ,MAAM;GACN,MAAM;GACN,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE;GAC3B,MAAM;EACR,CAAC;EACD,SAAS,kBAAkB,MAAM,SAAS,WAAW,MAAM,SAAS,MAAM;GACxE,MAAM,CAAC,GAAG,CAAC;GACX,YAAY;GACZ,MAAM;GACN,MAAM;GACN,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE;GAC3B,MAAM;EACR,CAAC;EACD,aAAa,kBAAkB,MAAM,UAAU,cAAc;GAC3D,MAAM;GACN,MAAM;GACN,MAAM;GACN,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE;GAC3B,MAAM;EACR,CAAC;EACD,cAAc,IAAI,WAAW,QAAQ,EAAE;EACvC,gBAAgB,kBACd,MAAM,UAAU,iBAChB,IAAI,WAAW,aAAa,CAAC,IAAI,GAAG,CAAC,CACvC;EACA,mBAAmB,IAAI,aAAa,QAAQ,CAAC,GAAG,CAAC,CAAC;EAClD,qBAAqB,IAAI,aAAa,QAAQ,CAAC,GAAG,EAAE,CAAC;EACrD,mBAAmB,IAAI,aAAa,QAAQ,CAAC,GAAG,CAAC,CAAC;EAClD,qBAAqB,IAAI,aAAa,QAAQ,CAAC,GAAG,EAAE,CAAC;EACrD,eAAe;GACb,MAAM,MAAM;GACZ,MAAM;GACN,MAAM;GACN,UAAU,EACR,MAAM,CAAC,KAAK,IAAI,IAAI,YAAY,GAAG,KAAK,IAAI,IAAI,UAAU,CAAC,EAC7D;GACA,MAAM;EACR;EACA,OAAO;GACL,MAAM,MAAM;GACZ,MAAM;GACN,MAAM;GACN,UAAU,EAAE,MAAM,CAAC,GAAG,GAAG,EAAE;GAC3B,MAAM;EACR;EACA,kBAAkB;GAChB,MAAM,MAAM;GACZ,MAAM;GACN,MAAM;GACN,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE;GAC3B,MAAM;EACR;EACA,uBAAuB;GACrB,MAAM;GACN,MAAM;EACR;EACA,gBAAgB;GACd,MAAM,MAAM;GACZ,MAAM;GACN,MAAM;GACN,UAAU,EAAE,MAAM,CAAC,GAAG,GAAG,EAAE;GAC3B,MAAM;EACR;EACA,aAAa;GAAE,MAAM;GAAK,YAAY;GAAG,MAAM;EAAQ;EACvD,yBAAyB,IAAI,WAAW,kBAAkB,CAAC,IAAI,EAAE,CAAC;EAClE,2BAA2B,IAAI,aAAa,kBAAkB,CAAC,IAAI,EAAE,CAAC;EACtE,QAAQ;GACN,MAAM;GACN,IAAI;GACJ,IAAI;GACJ,WAAW,CAAC,IAAI,EAAE;GAClB,QAAQ,EAAE,UAAU,MAAM,OAAO,cAAc,YAAY,IAAK;EAClE;EACA,OAAO;GAAE,MAAM;GAAW,MAAM;GAAS,SAAS;EAAE;EACpD,GAAG,aAAa,QAAQ,MAAM,SAAS,MAAM,SAAS;EACtD,GAAG,aAAa,WAAW,MAAM,SAAS,SAAS,SAAS;EAC5D,GAAG,aAAa,WAAW,MAAM,SAAS,SAAS,SAAS;EAC5D,GAAG,aAAa,UAAU,MAAM,SAAS,QAAQ,SAAS;EAC1D,GAAG,aAAa,UAAU,KAAA,GAAW,SAAS;EAC9C,GAAG,aAAa,SAAS,KAAA,GAAW,SAAS;EAC7C,GAAG,aAAa,QAAQ,KAAA,GAAW,SAAS;EAC5C,GAAG,aAAa,UAAU,KAAA,GAAW,SAAS;EAC9C,GAAG,aAAa,OAAO,KAAA,GAAW,SAAS;CAC7C;CAEA,YAAY,UAAU,kBAAkB,MAAM,SAAS,SAAS;EAC9D,MAAM;EACN,MAAM;EACN,SAAS;CACX,CAAC;CACD,YAAY,SAAS;EACnB,MAAM;EACN,MAAM,CAAC,MAAM,KAAK;EAClB,YAAY;EACZ,MAAM;CACR;CACA,YAAY,mBAAmB;EAC7B,MAAM;EACN,MAAM,CAAC,OAAO,KAAK;EACnB,YAAY;EACZ,MAAM;CACR;CAEA,YAAY,eAAe;EACzB,MAAM;EACN,YAAY;EACZ,gBAAgB;EAChB,MAAM;CACR;CACA,YAAY,iBAAiB;EAC3B,MAAM;EACN,MAAM;EACN,YAAY;EACZ,UAAU,EAAE,MAAM,CAAC,MAAM,KAAK,EAAE;CAClC;CACA,KAAK,MAAM,CAAC,MAAM,KAAK,YAAY,aAAa;EAC9C;GAAC;GAAW;GAAK;GAAO;EAAG;EAC3B;GAAC;GAAe;GAAK;GAAO;EAAC;EAC7B;GAAC;GAAW;GAAK;GAAK;EAAG;EACzB;GAAC;GAAU;GAAI;GAAK;EAAG;EACvB;GAAC;GAAS;GAAK;GAAK;EAAG;EACvB;GAAC;GAAY;GAAK;GAAK;EAAG;EAC1B;GAAC;GAAU;GAAI;GAAK;EAAG;EACvB;GAAC;GAAY;GAAK;GAAK;EAAG;EAC1B;GAAC;GAAS;GAAK;GAAK;EAAG;EACvB;GAAC;GAAY;GAAK;GAAK;EAAG;CAC5B,GACE,YAAY,UAAU,UAAU;EAC9B,MAAM;GAAE,GAAG;GAAK,GAAG;GAAY,GAAG;EAAE;EACpC,MAAM;EACN,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE;CAClC;CACF,MAAM,0BAAU,IAAI,IAAI;EACtB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CACD,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,MAAM,WAAW,CAAC,CAAC,GAAG;EAC/D,IAAI,UAAU,KAAA,GAAW;EACzB,IACE,CAAC,kCAAkC,KAAK,IAAI,KAC5C;GAAC;GAAW;GAAe;EAAW,CAAC,CAAC,SAAS,IAAI,GAErD,MAAM,IAAI,MACR,iBAAiB,KAAK,6FACxB;EACF,IAAI,QAAQ,IAAI,IAAI,GAAG;EACvB,MAAM,WAAW,YAAY;EAC7B,YAAY,QAAQ,kBAAkB,OAAO,YAAY,EAAE,MAAM,OAAO,CAAC;CAC3E;CACA,WAAW,OAAO,WAAW;CAE7B,MAAM,iBAAiB,WAAW,QAAQ;CAC1C,MAAM,kBAAkB,sBAAsB,gBAAgB,SAAS;CACvE,MAAM,iBAAiB,sBAAsB,gBAAgB,aAAa;CAE1E,MAAM,SAAS;EACb,OAAO,qBAAqB,eAAe,OAAO,gBAAgB,KAAK;EACvE,MAAM,qBAAqB,eAAe,MAAM,gBAAgB,IAAI;EACpE,eAAe,qBACb,eAAe,eACf,gBAAgB,aAClB;EACA,cAAc,qBACZ,eAAe,cACf,gBAAgB,YAClB;CACF;CACA,MAAM,EAAE,QAAQ,gBAAgB,gBAAgB,mBAC9C,gBACA,aACA,MAAM,eACN,CAAC,cAAc,UAAU,GACzB,MAAM,OAAO,SACf;CACA,MAAM,gBAAgB,EAAE,OAAO,EAAE,cAAc,KAAK,EAAE;CACtD,MAAM,eAAe;EACnB,GAAG;EACH,QAAQ;GACN,MAAM;GACN,cACE;EACJ;CACF;CACA,MAAM,kBAAkB,WAAW,KAAK,aAAa;CACrD,MAAM,cAAc,WAAW,MAAM,YAAY;CAiBjD,OAAO;EACL,QAAA;GAhBA,SAAS,kBAAkB,iBAAiB,SAAS;GACrD,aAAa,kBAAkB,iBAAiB,WAAW;GAC3D,aAAa,kBAAkB,iBAAiB,WAAW;GAC3D,MAAM,kBAAkB,iBAAiB,MAAM;GAC/C,SAAS,kBAAkB,iBAAiB,SAAS;GACrD,aAAa,kBAAkB,iBAAiB,WAAW;GAC3D,eAAe,kBAAkB,iBAAiB,aAAa;GAC/D,kBAAkB,kBAAkB,iBAAiB,gBAAgB;GACrE,uBAAuB,kBACrB,iBACA,qBACF;GACA,OAAO,kBAAkB,iBAAiB,OAAO;GACjD,QAAQ,kBAAkB,iBAAiB,QAAQ;EAG9C;EACL;EACA,UAAU;EACV;EACA;CACF;AACF;AAEA,SAAS,IACP,MACA,QACA,OACA,QAA0B,SACR;CAClB,OAAO;EAAE,MAAM;EAAO;EAAM;EAAQ;EAAO;CAAM;AACnD;AAEA,SAAS,aACP,MACA,OACA,UACU;CACV,MAAM,cAAc,kBAAkB,OAAO,EAAE,MAAM,SAAS,CAAC;CAC/D,OAAO;GACJ,OAAO,oBAAoB,WAAW,IACnC,cACA;GACE,MAAM;GACN,MAAM;GACN,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE;GAC3B,MAAM;GACN,GAAG;EACL;GACH,GAAG,KAAK,SAAS;GAIhB,GAAI,oBAAoB,WAAW,IAC/B;IAAE,MAAM;IAAG,YAAY;GAAE,IACzB;GACJ,MAAM,GAAG,KAAK;GACd,MAAM;GACN,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE;GAC3B,MAAM;EACR;GACC,GAAG,KAAK,YACP,UAAU,eAAe,YAAY,SAAS,WAC1C;GAAE,MAAM;GAAW,MAAM;GAAM,YAAY;GAAG,MAAM;EAAO,IAC3D,IAAI,WAAW,MAAM,CAAC,IAAI,EAAE,GAAG,MAAM;CAC7C;AACF;AAEA,SAAS,oBACP,OACuC;CACvC,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU;AAClE;AAEA,SAAS,mBACP,OAC0B;CAC1B,OACE,OAAO,UAAU,YACjB,UAAU,QACV,EAAE,OAAO,SAAS,OAAO,SAAS,OAAO,SAAS,UAAU;AAEhE;AAEA,SAAS,kBACP,OACA,cACU;CACV,IAAI,UAAU,KAAA,GAAW,OAAO;CAChC,IAAI,oBAAoB,KAAK,GAAG,OAAO,EAAE,GAAG,MAAM;CAClD,MAAM,WACJ,UAAU,eAAe,EAAE,MAAM,OAAgB,IAAI;CACvD,IAAI,CAAC,mBAAmB,KAAK,KAAK,MAAM,SAAS,KAAA,GAAW;EAG1D,MAAM,EAAE,MAAM,OAAO,YAAY,aAAa,GAAG,iBAAiB;EAClE,OAAO;GACL,GAAG;GACH,GAAI,mBAAmB,KAAK,IAAI,QAAQ,EAAE,MAAM,MAAM;EACxD;CACF;CACA,IAAI,CAAC,kBAAkB,KAAK,GAAG,OAAO;EAAE,GAAG;EAAU,GAAG;CAAM;CAC9D,MAAM,EAAE,MAAM,UAAU,GAAG,qBAAqB;CAChD,OAAO;EAAE,GAAG;EAAkB,GAAG;CAAM;AACzC;AAEA,SAAS,kBAAkB,OAAiC;CAC1D,OACE,MAAM,SAAS,KAAA,MACd,MAAM,SAAS,KAAA,KACd,MAAM,QAAQ,KAAA,KACd,MAAM,YAAY,KAAA,KAClB,MAAM,eAAe,KAAA,KACrB,MAAM,mBAAmB,KAAA,KACzB,MAAM,SAAS,KAAA;AAErB;AAEA,SAAS,iBAAiB,iBAAyB,iBAAyB;CAC1E,OAAO,kBAAkB,IACrB,KAAK,IAAI,GAAG,kBAAkB,eAAe,IAC7C;AACN;AAEA,SAAS,sBACP,QACA,MACA;CACA,MAAM,QAAQ,OAAO,IAAI,IAAI;CAC7B,IAAI,CAAC,OAAO,MAAM,IAAI,MAAM,aAAa,KAAK,0BAA0B;CACxE,OAAO;AACT;AAEA,SAAS,kBACP,QACA,MACwB;CACxB,MAAM,QAAQ,OAAO;CACrB,IAAI,CAAC,OAAO,MAAM,IAAI,MAAM,aAAa,KAAK,yBAAyB;CACvE,OAAO;AACT;AAEA,SAAS,eACP,OACmE;CACnE,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU,OAC3D,OAAO;CACT,IAAIA,qBAAmB,KAAK,GAAG;EAC7B,MAAM,OAAO,MACV,MAAM;GACL,KAAK,MAAM;GACX,YAAY,MAAM;GAClB,MAAM,MAAM;GACZ,MAAM;EACR,CAAC,CAAC,CACD,QAAQ,CAAC,CAAC;EACb,OAAO;GACL,MAAM;IAAE,GAAG,KAAK;IAAG,GAAG,KAAK;IAAG,GAAG,KAAK;GAAE;GACxC,GAAI,MAAM,YAAY,EAAE,UAAU,MAAM,SAAS;GACjD,GAAI,MAAM,kBAAkB,EAAE,gBAAgB,KAAK;EACrD;CACF;CACA,OAAO,EAAE,MAAM,SAAS,qBAAqB;AAC/C;AAEA,SAASA,qBACP,OAC2B;CAC3B,OACE,OAAO,UAAU,YACjB,UAAU,QACV,SAAS,SACT,gBAAgB,SAChB,UAAU;AAEd;;;ACtPA,MAAa,yBAAyB;CACpC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;AA4BA,MAAa,2BAA2B;CACtC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;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,QAAQ,CAAC;CACT,iBAAiB;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,eAAe;EACb;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,eAAe,CAAC,SAAS,cAAc;CACvC,eAAe,CAAC;CAChB,UAAU;EACR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,YAAY;EACV;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,QAAQ;EACN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,UAAU,CAAC;CACX,QAAQ,CAAC,MAAM;CACf,aAAa;EAAC;EAAkB;EAAa;CAAO;CACpD,UAAU,CAAC;CACX,UAAU;EACR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,WAAW;EAAC;EAAa;EAAgB;CAAS;CAClD,aAAa,CAAC;CACd,SAAS,CAAC;CACV,aAAa;EACX;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,QAAQ,CAAC,SAAS;CAClB,cAAc;EAAC;EAAmB;EAAS;EAAY;EAAc;CAAM;CAC3E,uBAAuB,CAAC,SAAS;CACjC,MAAM;EAAC;EAAY;EAAY;CAAW;CAC1C,SAAS,CAAC,SAAS,MAAM;CACzB,WAAW;EAAC;EAAW;EAAO;CAAM;CACpC,KAAK,CAAC,WAAW,eAAe;CAChC,uBAAuB;EACrB;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,aAAa;EAAC;EAAW;EAAS;EAAS;EAAW;CAAQ;CAC9D,QAAQ;EAAC;EAAQ;EAAY;EAAe;EAAU;CAAY;CAClE,MAAM;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,gBAAgB;EACd;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,MAAM,CAAC,OAAO,MAAM;CACpB,UAAU;EAAC;EAAS;EAAS;CAAM;CACnC,mBAAmB;EACjB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,iBAAiB;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,eAAe;EAAC;EAAS;EAAQ;EAAmB;EAAc;CAAQ;CAC1E,oBAAoB,CAAC;CACrB,SAAS;EAAC;EAAW;EAAQ;CAAU;CACvC,kBAAkB,CAAC,QAAQ;CAC3B,kBAAkB;EAAC;EAAQ;EAAW;CAAM;CAC5C,sBAAsB;EACpB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,gBAAgB,CAAC;CACjB,iBAAiB;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,OAAO,CAAC,QAAQ,QAAQ;CACxB,aAAa;EAAC;EAAQ;EAAa;CAAM;CACzC,MAAM;EAAC;EAAQ;EAAU;EAAkB;CAAe;CAC1D,iBAAiB;EACf;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,aAAa;EACX;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,eAAe;EACb;EACA;EACA;EACA;EACA;CACF;CACA,QAAQ;EACN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF;;;ACpyBA,MAAM,gBAAgB;AACtB,MAAM,4BAAY,IAAI,IAAI;CAAC;CAAO;CAAS;AAAS,CAAC;AACrD,MAAM,iCAAiB,IAAI,IAAI,CAAC,UAAU,YAAY,CAAC;AACvD,MAAM,yCAAyB,IAAI,IAAI;CACrC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AACD,MAAM,4BAAY,IAAI,IAAI;CACxB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,MAAM,cAA2C;CAC/C,sBAAM,IAAI,IAAI;EACZ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CACD,yBAAS,IAAI,IAAI;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"}