@codemonster-ru/vue-ssg-core 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -0
- package/dist/index.js +48 -10
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -198,6 +198,9 @@ function normalizeDocPath(sourcePath) {
|
|
|
198
198
|
}
|
|
199
199
|
return `/${relativePath}`;
|
|
200
200
|
}
|
|
201
|
+
function isIndexSourcePath(sourcePath) {
|
|
202
|
+
return sourcePath.replace(/\\/g, "/").replace(/\.md$/, "").endsWith("/index");
|
|
203
|
+
}
|
|
201
204
|
function normalizeMarkdownLinkHref(href) {
|
|
202
205
|
if (href.startsWith("#") || href.startsWith("//") || /^[a-z][a-z\d+.-]*:/i.test(href)) {
|
|
203
206
|
return href;
|
|
@@ -310,20 +313,28 @@ function renderMarkdown(markdown, tocLevels) {
|
|
|
310
313
|
}
|
|
311
314
|
return { blocks, tableOfContents };
|
|
312
315
|
}
|
|
316
|
+
function getFirstHeadingText(markdown) {
|
|
317
|
+
const tokens = marked.lexer(markdown);
|
|
318
|
+
const heading = tokens.find((token) => token.type === "heading" && token.depth === 1);
|
|
319
|
+
return heading?.text.trim() || void 0;
|
|
320
|
+
}
|
|
313
321
|
function parsePage(sourcePath, source, tocLevels) {
|
|
314
322
|
const { data: frontmatter, content } = parseFrontmatter(source);
|
|
315
323
|
const path = normalizeDocPath(sourcePath);
|
|
316
324
|
const pathSegments = path === "/" ? [] : path.replace(/^\//, "").split("/");
|
|
317
|
-
const
|
|
325
|
+
const isIndexPage = isIndexSourcePath(sourcePath);
|
|
326
|
+
const section = isIndexPage ? pathSegments : pathSegments.slice(0, -1);
|
|
318
327
|
const filename = pathSegments[pathSegments.length - 1] ?? "index";
|
|
319
|
-
const fallbackTitle =
|
|
328
|
+
const fallbackTitle = isIndexPage ? getFirstHeadingText(content) ?? "Overview" : toTitleCase(filename);
|
|
320
329
|
const title = frontmatter.title?.trim() || fallbackTitle;
|
|
321
|
-
const navTitle = frontmatter.navTitle?.trim() || title;
|
|
330
|
+
const navTitle = frontmatter.navTitle?.trim() || (isIndexPage ? "Overview" : title);
|
|
322
331
|
const { blocks, tableOfContents } = renderMarkdown(content, tocLevels);
|
|
332
|
+
const id = isIndexPage && path !== "/" ? `${toValueFromPath(path)}-index` : toValueFromPath(path);
|
|
323
333
|
return {
|
|
324
|
-
id
|
|
334
|
+
id,
|
|
325
335
|
path,
|
|
326
336
|
sourcePath,
|
|
337
|
+
isIndexPage,
|
|
327
338
|
title,
|
|
328
339
|
navTitle,
|
|
329
340
|
description: frontmatter.description?.trim(),
|
|
@@ -341,6 +352,12 @@ function sortNodes(nodes) {
|
|
|
341
352
|
return left.label.localeCompare(right.label);
|
|
342
353
|
});
|
|
343
354
|
}
|
|
355
|
+
function getPageNavKey(page) {
|
|
356
|
+
if (page.isIndexPage) {
|
|
357
|
+
return "index";
|
|
358
|
+
}
|
|
359
|
+
return page.path.split("/").filter(Boolean).at(-1) ?? page.id;
|
|
360
|
+
}
|
|
344
361
|
function buildSidebar(pages, docsConfig) {
|
|
345
362
|
const root = /* @__PURE__ */ new Map();
|
|
346
363
|
for (const page of pages) {
|
|
@@ -353,30 +370,51 @@ function buildSidebar(pages, docsConfig) {
|
|
|
353
370
|
current.set(segment, {
|
|
354
371
|
label: sectionConfig?.label ?? toTitleCase(segment),
|
|
355
372
|
order: sectionConfig?.order ?? 1e3,
|
|
373
|
+
value: toValueFromPath(currentPath),
|
|
356
374
|
path: currentPath,
|
|
375
|
+
isPage: false,
|
|
357
376
|
children: /* @__PURE__ */ new Map()
|
|
358
377
|
});
|
|
359
378
|
}
|
|
360
379
|
current = current.get(segment).children;
|
|
361
380
|
}
|
|
362
|
-
|
|
381
|
+
const pageKey = getPageNavKey(page);
|
|
382
|
+
const existingPageNode = current.get(pageKey);
|
|
383
|
+
current.set(pageKey, {
|
|
363
384
|
label: page.navTitle,
|
|
364
385
|
order: page.order,
|
|
386
|
+
value: page.id,
|
|
365
387
|
path: page.path,
|
|
366
|
-
|
|
388
|
+
isPage: true,
|
|
389
|
+
children: existingPageNode?.children ?? /* @__PURE__ */ new Map()
|
|
367
390
|
});
|
|
368
391
|
}
|
|
369
392
|
const toItems = (nodes) => sortNodes([...nodes.values()]).map((node) => {
|
|
370
393
|
const item = {
|
|
371
|
-
value: toValueFromPath(node.path ?? node.label),
|
|
394
|
+
value: node.value ?? toValueFromPath(node.path ?? node.label),
|
|
372
395
|
label: node.label
|
|
373
396
|
};
|
|
374
397
|
const children = toItems(node.children);
|
|
375
|
-
if (
|
|
376
|
-
item.children = children;
|
|
377
|
-
} else if (node.path) {
|
|
398
|
+
if (node.path && node.isPage) {
|
|
378
399
|
item.to = node.path;
|
|
379
400
|
}
|
|
401
|
+
if (children.length > 0) {
|
|
402
|
+
if (item.to) {
|
|
403
|
+
const branchValue = `${item.value}-section`;
|
|
404
|
+
item.children = [
|
|
405
|
+
{
|
|
406
|
+
value: item.value,
|
|
407
|
+
label: "Overview",
|
|
408
|
+
to: item.to
|
|
409
|
+
},
|
|
410
|
+
...children
|
|
411
|
+
];
|
|
412
|
+
item.value = branchValue;
|
|
413
|
+
delete item.to;
|
|
414
|
+
} else {
|
|
415
|
+
item.children = children;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
380
418
|
return item;
|
|
381
419
|
});
|
|
382
420
|
return toItems(root);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/createViteSsgApp.ts","../src/docsContent.ts","../src/routes.ts","../src/config.ts"],"sourcesContent":["import { createHead as createClientHead } from '@unhead/vue/client'\nimport { createHead as createServerHead } from '@unhead/vue/server'\nimport { createApp, createSSRApp, type Component } from 'vue'\nimport {\n createMemoryHistory,\n createRouter,\n createWebHistory,\n type RouteRecordRaw,\n type Router\n} from 'vue-router'\n\ntype CreateViteSsgContext = {\n app: ReturnType<typeof createApp>\n head: ReturnType<typeof createClientHead> | ReturnType<typeof createServerHead> | undefined\n initialState: Record<string, unknown>\n isClient: boolean\n onSSRAppRendered: (cb: () => void | Promise<void>) => void\n routePath?: string\n router: Router\n routes: RouteRecordRaw[]\n transformState?: (state: Record<string, unknown>) => Record<string, unknown>\n triggerOnSSRAppRendered: () => Promise<void[]>\n}\n\ntype CreateViteSsgOptions = {\n hydration?: boolean\n rootContainer?: string\n useHead?: boolean\n transformState?: (state: Record<string, unknown>) => Record<string, unknown>\n}\n\nasync function documentReady(): Promise<void> {\n if (typeof document === 'undefined' || document.readyState !== 'loading') {\n return\n }\n\n await new Promise<void>((resolve) => {\n document.addEventListener('DOMContentLoaded', () => resolve(), { once: true })\n })\n}\n\nasync function nextFrame(): Promise<void> {\n await new Promise<void>((resolve) => requestAnimationFrame(() => resolve()))\n}\n\nfunction isVisibleElement(element: HTMLElement | null): element is HTMLElement {\n return Boolean(element && element.offsetParent !== null)\n}\n\nfunction getStickyOffsetTop(): number {\n if (typeof document === 'undefined') {\n return 0\n }\n\n const header = document.querySelector<HTMLElement>('.vf-document-layout__header')\n const layoutSubheader = document.querySelector<HTMLElement>('.vf-document-layout__subheader')\n const contentSubheader = document.querySelector<HTMLElement>('.vf-document-layout__content-subheader')\n const topGap = 16\n let offset = topGap\n\n if (isVisibleElement(header)) {\n offset += header.getBoundingClientRect().height\n }\n\n if (isVisibleElement(layoutSubheader)) {\n offset += layoutSubheader.getBoundingClientRect().height\n }\n\n if (isVisibleElement(contentSubheader)) {\n offset += contentSubheader.getBoundingClientRect().height\n }\n\n return offset\n}\n\nfunction getInitialState(): Record<string, unknown> {\n if (typeof window === 'undefined') {\n return {}\n }\n\n return ((window as Window & { __INITIAL_STATE__?: Record<string, unknown> }).__INITIAL_STATE__ ?? {})\n}\n\nfunction ensureHistoryState(): void {\n if (typeof window === 'undefined') {\n return\n }\n\n if (window.history.state) {\n return\n }\n\n const current = `${window.location.pathname}${window.location.search}${window.location.hash}`\n\n window.history.replaceState(\n {\n back: null,\n current,\n forward: null,\n position: window.history.length - 1,\n replaced: true,\n scroll: null\n },\n '',\n current\n )\n}\n\nexport function createViteSsgApp(\n App: Component,\n routerOptions: { base?: string; routes: RouteRecordRaw[] },\n fn?: (context: CreateViteSsgContext) => Promise<void> | void,\n options?: CreateViteSsgOptions\n) {\n const { rootContainer = '#app', transformState, useHead = true } = options ?? {}\n\n async function createSsgApp(routePath?: string): Promise<CreateViteSsgContext> {\n const app = import.meta.env.SSR || options?.hydration ? createSSRApp(App) : createApp(App)\n let head: CreateViteSsgContext['head']\n\n if (useHead) {\n head = import.meta.env.SSR ? createServerHead() : createClientHead()\n app.use(head)\n }\n\n const router = createRouter({\n history: import.meta.env.SSR\n ? createMemoryHistory(routerOptions.base)\n : createWebHistory(routerOptions.base),\n scrollBehavior: async (to, _from, savedPosition) => {\n if (savedPosition) {\n return savedPosition\n }\n\n if (to.hash) {\n const targetHash = decodeURIComponent(to.hash)\n\n await nextFrame()\n await nextFrame()\n\n const targetElement = document.querySelector<HTMLElement>(targetHash)\n\n if (targetElement) {\n const top = targetElement.getBoundingClientRect().top + window.scrollY - getStickyOffsetTop()\n\n return {\n left: 0,\n top: Math.max(0, top),\n behavior: 'smooth'\n }\n }\n }\n\n return { left: 0, top: 0 }\n },\n ...routerOptions\n })\n\n const appRenderCallbacks: Array<() => void | Promise<void>> = []\n const onSSRAppRendered = import.meta.env.SSR\n ? (cb: () => void | Promise<void>) => appRenderCallbacks.push(cb)\n : () => undefined\n const triggerOnSSRAppRendered = () => Promise.all(appRenderCallbacks.map((cb) => cb()))\n\n const context: CreateViteSsgContext = {\n app,\n head,\n initialState: {},\n isClient: !import.meta.env.SSR,\n onSSRAppRendered,\n routePath,\n router,\n routes: routerOptions.routes,\n transformState,\n triggerOnSSRAppRendered\n }\n\n if (!import.meta.env.SSR) {\n await documentReady()\n ensureHistoryState()\n context.initialState = transformState?.(getInitialState()) ?? getInitialState()\n }\n\n await fn?.(context)\n app.use(router)\n\n let entryRoutePath: string | undefined\n let isFirstRoute = true\n\n router.beforeEach((to) => {\n if (isFirstRoute || (entryRoutePath && entryRoutePath === to.path)) {\n isFirstRoute = false\n entryRoutePath = to.path\n to.meta.state = context.initialState\n }\n\n return true\n })\n\n if (import.meta.env.SSR) {\n const route = context.routePath ?? '/'\n await router.push(route)\n await router.isReady()\n context.initialState = (router.currentRoute.value.meta.state as Record<string, unknown>) || {}\n }\n\n return context\n }\n\n if (!import.meta.env.SSR) {\n ;(async () => {\n const { app, router } = await createSsgApp()\n await router.isReady()\n app.mount(rootContainer, true)\n })()\n }\n\n return createSsgApp\n}\n","import { Parser, type Tokens, marked } from 'marked'\nimport GithubSlugger from 'github-slugger'\nimport type { VfNavMenuItem, VfTableOfContentsItem } from '@codemonster-ru/vueforge-core'\nimport type {\n DocsComponentsConfig,\n DocsConfig,\n DocsFooterConfig,\n DocsHeaderNavConfig,\n DocsHomeConfig,\n DocsLayoutConfig,\n DocsSiteConfig\n} from './config'\n\nexport type DocsContentBlock =\n | {\n type: 'heading'\n depth: 1 | 2 | 3 | 4 | 5 | 6\n id: string\n html: string\n }\n | {\n type: 'paragraph'\n html: string\n }\n | {\n type: 'code'\n code: string\n language: string\n }\n | {\n type: 'list'\n ordered: boolean\n items: string[]\n }\n | {\n type: 'blockquote'\n html: string\n }\n | {\n type: 'html'\n html: string\n }\n\nexport interface DocsPage {\n id: string\n path: string\n sourcePath: string\n title: string\n navTitle: string\n description?: string\n order: number\n section: string[]\n blocks: DocsContentBlock[]\n tableOfContents: VfTableOfContentsItem[]\n}\n\ninterface Frontmatter {\n title?: string\n navTitle?: string\n description?: string\n order?: number\n}\n\ninterface NavNode {\n label: string\n order: number\n path?: string\n children: Map<string, NavNode>\n}\n\ntype TokensList = Tokens.Generic[]\n\nexport interface ResolveDocsContentInput {\n docsConfig: DocsConfig\n markdownFiles: Record<string, string>\n}\n\nexport interface ResolvedDocsContent {\n docsPages: DocsPage[]\n docsSidebar: VfNavMenuItem[]\n docsSite: DocsSiteConfig\n docsLayout: Required<DocsLayoutConfig>\n docsFooter: DocsFooterConfig\n docsHome: Required<DocsHomeConfig>\n docsHeaderNav: Required<DocsHeaderNavConfig>\n docsComponents: DocsComponentsConfig\n docsSiteTitle: string\n docsScrollOffset: number\n getDocsPageByPath: (pathname: string) => DocsPage\n}\n\nfunction parseFrontmatter(source: string): { data: Frontmatter; content: string } {\n if (!source.startsWith('---\\n')) {\n return { data: {}, content: source }\n }\n\n const frontmatterEnd = source.indexOf('\\n---\\n', 4)\n\n if (frontmatterEnd === -1) {\n return { data: {}, content: source }\n }\n\n const rawFrontmatter = source.slice(4, frontmatterEnd)\n const content = source.slice(frontmatterEnd + 5)\n const data: Frontmatter = {}\n\n for (const line of rawFrontmatter.split('\\n')) {\n const separatorIndex = line.indexOf(':')\n\n if (separatorIndex === -1) {\n continue\n }\n\n const key = line.slice(0, separatorIndex).trim()\n const rawValue = line.slice(separatorIndex + 1).trim()\n const normalizedValue = rawValue.replace(/^['\"]|['\"]$/g, '')\n\n if (key === 'order') {\n const numericValue = Number(normalizedValue)\n data.order = Number.isFinite(numericValue) ? numericValue : 0\n continue\n }\n\n if (key === 'title' || key === 'navTitle' || key === 'description') {\n data[key] = normalizedValue\n }\n }\n\n return { data, content }\n}\n\nfunction toTitleCase(value: string): string {\n return value\n .replace(/[-_]/g, ' ')\n .replace(/\\b\\w/g, (letter) => letter.toUpperCase())\n}\n\nfunction normalizeDocPath(sourcePath: string): string {\n const relativePath = sourcePath.replace(/^.*\\/(?:content|docs)\\//, '').replace(/\\.md$/, '')\n\n if (relativePath === 'index') {\n return '/'\n }\n\n if (relativePath.endsWith('/index')) {\n return `/${relativePath.replace(/\\/index$/, '')}`\n }\n\n return `/${relativePath}`\n}\n\nfunction normalizeMarkdownLinkHref(href: string): string {\n if (\n href.startsWith('#') ||\n href.startsWith('//') ||\n /^[a-z][a-z\\d+.-]*:/i.test(href)\n ) {\n return href\n }\n\n const match = href.match(/^([^?#]*)([?#].*)?$/)\n\n if (!match) {\n return href\n }\n\n const [, pathname, suffix = ''] = match\n\n if (!/\\.(?:md|mdx)$/i.test(pathname)) {\n return href\n }\n\n const extensionlessPathname = pathname.replace(/\\.(?:md|mdx)$/i, '')\n let normalizedPathname = extensionlessPathname\n\n if (extensionlessPathname === 'index' || extensionlessPathname === './index') {\n normalizedPathname = '.'\n } else if (extensionlessPathname.endsWith('/index')) {\n normalizedPathname = extensionlessPathname.replace(/\\/index$/, '')\n }\n\n return `${normalizedPathname}${suffix}`\n}\n\nfunction normalizeMarkdownLinks(tokens: TokensList): void {\n for (const token of tokens) {\n if (token.type === 'link' && typeof token.href === 'string') {\n token.href = normalizeMarkdownLinkHref(token.href)\n }\n\n if ('tokens' in token && Array.isArray(token.tokens)) {\n normalizeMarkdownLinks(token.tokens as TokensList)\n }\n\n if (token.type === 'list' && Array.isArray(token.items)) {\n for (const item of token.items) {\n normalizeMarkdownLinks(item.tokens as TokensList)\n }\n }\n }\n}\n\nfunction toValueFromPath(path: string): string {\n return path === '/' ? 'index' : path.replace(/^\\//, '').replace(/\\//g, '-')\n}\n\nfunction renderInline(tokens: Tokens.Generic[] | undefined): string {\n return Parser.parseInline(tokens ?? [])\n}\n\nfunction renderBlockTokens(tokens: TokensList | undefined): string {\n return Parser.parse(tokens ?? [])\n}\n\nfunction renderListItemTokens(tokens: TokensList | undefined): string {\n return Parser.parse(tokens ?? [])\n}\n\nfunction renderMarkdown(markdown: string, tocLevels: Set<number>): {\n blocks: DocsContentBlock[]\n tableOfContents: VfTableOfContentsItem[]\n} {\n const tokens = marked.lexer(markdown) as TokensList\n normalizeMarkdownLinks(tokens)\n const headingSlugger = new GithubSlugger()\n const tableOfContents: VfTableOfContentsItem[] = []\n const blocks: DocsContentBlock[] = []\n\n for (const token of tokens) {\n switch (token.type) {\n case 'space':\n break\n case 'heading': {\n const id = headingSlugger.slug(token.text)\n const html = renderInline(token.tokens)\n\n blocks.push({\n type: 'heading',\n depth: token.depth as 1 | 2 | 3 | 4 | 5 | 6,\n id,\n html\n })\n\n if (tocLevels.has(token.depth)) {\n tableOfContents.push({\n id,\n label: token.text,\n level: token.depth - 1\n })\n }\n break\n }\n case 'paragraph':\n blocks.push({\n type: 'paragraph',\n html: renderInline(token.tokens)\n })\n break\n case 'code':\n blocks.push({\n type: 'code',\n code: token.text,\n language: token.lang?.trim() || 'text'\n })\n break\n case 'list':\n blocks.push({\n type: 'list',\n ordered: token.ordered,\n items: token.items.map((item: Tokens.ListItem) => renderListItemTokens(item.tokens))\n })\n break\n case 'blockquote':\n blocks.push({\n type: 'blockquote',\n html: renderBlockTokens(token.tokens)\n })\n break\n default:\n blocks.push({\n type: 'html',\n html: renderBlockTokens([token])\n })\n break\n }\n }\n\n return { blocks, tableOfContents }\n}\n\nfunction parsePage(sourcePath: string, source: string, tocLevels: Set<number>): DocsPage {\n const { data: frontmatter, content } = parseFrontmatter(source)\n const path = normalizeDocPath(sourcePath)\n const pathSegments = path === '/' ? [] : path.replace(/^\\//, '').split('/')\n const section = pathSegments.slice(0, -1)\n const filename = pathSegments[pathSegments.length - 1] ?? 'index'\n const fallbackTitle = filename === 'index' ? 'Overview' : toTitleCase(filename)\n const title = frontmatter.title?.trim() || fallbackTitle\n const navTitle = frontmatter.navTitle?.trim() || title\n const { blocks, tableOfContents } = renderMarkdown(content, tocLevels)\n\n return {\n id: toValueFromPath(path),\n path,\n sourcePath,\n title,\n navTitle,\n description: frontmatter.description?.trim(),\n order: frontmatter.order ?? 0,\n section,\n blocks,\n tableOfContents\n }\n}\n\nfunction sortNodes(nodes: NavNode[]): NavNode[] {\n return [...nodes].sort((left, right) => {\n if (left.order !== right.order) {\n return left.order - right.order\n }\n\n return left.label.localeCompare(right.label)\n })\n}\n\nfunction buildSidebar(pages: DocsPage[], docsConfig: DocsConfig): VfNavMenuItem[] {\n const root = new Map<string, NavNode>()\n\n for (const page of pages) {\n let current = root\n let currentPath = ''\n\n for (const segment of page.section) {\n currentPath = `${currentPath}/${segment}`\n const sectionConfig = docsConfig.sectionLabels?.[segment]\n\n if (!current.has(segment)) {\n current.set(segment, {\n label: sectionConfig?.label ?? toTitleCase(segment),\n order: sectionConfig?.order ?? 1_000,\n path: currentPath,\n children: new Map()\n })\n }\n\n current = current.get(segment)!.children\n }\n\n current.set(page.id, {\n label: page.navTitle,\n order: page.order,\n path: page.path,\n children: new Map()\n })\n }\n\n const toItems = (nodes: Map<string, NavNode>): VfNavMenuItem[] =>\n sortNodes([...nodes.values()]).map((node) => {\n const item: VfNavMenuItem = {\n value: toValueFromPath(node.path ?? node.label),\n label: node.label\n }\n\n const children = toItems(node.children)\n\n if (children.length > 0) {\n item.children = children\n } else if (node.path) {\n item.to = node.path\n }\n\n return item\n })\n\n return toItems(root)\n}\n\nexport function resolveDocsContent({ docsConfig, markdownFiles }: ResolveDocsContentInput): ResolvedDocsContent {\n const tocLevels = new Set(docsConfig.toc?.levels ?? [2, 3, 4])\n\n const docsPages = Object.entries(markdownFiles)\n .map(([sourcePath, source]) => parsePage(sourcePath, source, tocLevels))\n .filter((page) => page.path !== '/')\n .sort((left, right) => left.path.localeCompare(right.path))\n\n const docsSidebar = buildSidebar(docsPages, docsConfig)\n const docsSite: DocsSiteConfig = {\n title: docsConfig.site?.title ?? docsConfig.title ?? 'docs',\n description: docsConfig.site?.description,\n githubUrl: docsConfig.site?.githubUrl,\n homeTo: docsConfig.site?.homeTo ?? '/',\n favicon: docsConfig.site?.favicon,\n logo: docsConfig.site?.logo,\n logoLabel: docsConfig.site?.logoLabel\n }\n const docsLayout: Required<DocsLayoutConfig> = {\n variant: docsConfig.layout?.variant ?? 'sidebar-content-aside',\n fillViewport: docsConfig.layout?.fillViewport ?? true,\n stickyHeader: docsConfig.layout?.stickyHeader ?? true,\n stickySidebar: docsConfig.layout?.stickySidebar ?? true,\n stickyAside: docsConfig.layout?.stickyAside ?? true,\n edgeNotches: docsConfig.layout?.edgeNotches ?? false,\n hideSidebarOnMobile: docsConfig.layout?.hideSidebarOnMobile ?? true,\n hideAsideOnMobile: docsConfig.layout?.hideAsideOnMobile ?? true\n }\n const docsFooter: DocsFooterConfig = {\n left: docsConfig.footer?.left ?? 'Codemonster documentation',\n right: docsConfig.footer?.right\n }\n const docsHome: Required<DocsHomeConfig> = {\n enabled: docsConfig.home?.enabled ?? true,\n title: docsConfig.home?.title ?? 'Build docs fast',\n description: docsConfig.home?.description ?? 'Write markdown, keep the same UI stack, and ship clean developer docs.',\n showGrid: docsConfig.home?.showGrid ?? true,\n primaryAction: docsConfig.home?.primaryAction ?? {\n label: 'Get Started',\n to: '/guide/installation'\n },\n secondaryAction: docsConfig.home?.secondaryAction ?? {\n label: 'View on GitHub',\n href: docsConfig.site?.githubUrl\n }\n }\n const docsHeaderNav: Required<DocsHeaderNavConfig> = {\n items: docsConfig.headerNav?.items ?? [],\n ariaLabel: docsConfig.headerNav?.ariaLabel ?? 'Header navigation'\n }\n const docsComponents: DocsComponentsConfig = docsConfig.components ?? {}\n const docsSiteTitle = docsSite.title\n const docsScrollOffset = docsConfig.toc?.scrollOffset ?? 96\n\n function getDocsPageByPath(pathname: string): DocsPage {\n const normalizedPath = pathname === '/' ? '/' : pathname.replace(/\\/$/, '')\n\n return docsPages.find((page) => page.path === normalizedPath) ?? docsPages[0]\n }\n\n return {\n docsPages,\n docsSidebar,\n docsSite,\n docsLayout,\n docsFooter,\n docsHome,\n docsHeaderNav,\n docsComponents,\n docsSiteTitle,\n docsScrollOffset,\n getDocsPageByPath\n }\n}\n","import type { Component } from 'vue'\nimport type { RouteRecordRaw } from 'vue-router'\nimport type { DocsPage } from './docsContent'\n\nexport interface CreateDocsRoutesInput {\n docsPages: DocsPage[]\n homeEnabled: boolean\n homeComponent: Component\n pageComponent: Component\n notFoundComponent?: Component\n}\n\nexport function createDocsRoutes({\n docsPages,\n homeEnabled,\n homeComponent,\n pageComponent,\n notFoundComponent\n}: CreateDocsRoutesInput): RouteRecordRaw[] {\n const docsPageRoutes: RouteRecordRaw[] = docsPages.map((page) => ({\n path: page.path,\n name: page.id,\n component: pageComponent\n }))\n\n const docsLandingRoute = [...docsPages].sort((left, right) => {\n if (left.order !== right.order) {\n return left.order - right.order\n }\n\n return left.path.localeCompare(right.path)\n })[0]\n\n const rootRoute: RouteRecordRaw = homeEnabled\n ? {\n path: '/',\n name: 'home',\n component: homeComponent\n }\n : docsLandingRoute\n ? {\n path: '/',\n name: 'home',\n redirect: docsLandingRoute.path\n }\n : {\n path: '/',\n name: 'home',\n component: homeComponent\n }\n\n const routes: RouteRecordRaw[] = [rootRoute, ...docsPageRoutes]\n\n if (notFoundComponent) {\n routes.push({\n path: '/:pathMatch(.*)*',\n name: 'not-found',\n component: notFoundComponent\n })\n }\n\n return routes\n}\n","import type { Component } from 'vue'\nimport type { VfNavMenuItem, VfTableOfContentsItem } from '@codemonster-ru/vueforge-core'\n\nexport interface DocsSectionConfig {\n label?: string\n order?: number\n}\n\nexport interface DocsTocConfig {\n levels?: number[]\n scrollOffset?: number\n}\n\nexport interface DocsSiteLogoConfig {\n src?: string\n component?: Component\n alt?: string\n width?: number | string\n height?: number | string\n}\n\nexport interface DocsHomeActionConfig {\n label: string\n to?: string\n href?: string\n}\n\nexport interface DocsHomeConfig {\n enabled?: boolean\n title?: string\n description?: string\n showGrid?: boolean\n primaryAction?: DocsHomeActionConfig\n secondaryAction?: DocsHomeActionConfig\n}\n\nexport interface DocsHeaderNavConfig {\n items?: VfNavMenuItem[]\n ariaLabel?: string\n}\n\nexport type DocsLayoutVariant =\n | 'content'\n | 'sidebar-content'\n | 'sidebar-content-aside'\n\nexport interface DocsSiteConfig {\n title: string\n description?: string\n githubUrl?: string\n homeTo?: string\n favicon?: string\n logo?: DocsSiteLogoConfig\n logoLabel?: string\n}\n\nexport interface DocsLayoutConfig {\n variant?: DocsLayoutVariant\n fillViewport?: boolean\n stickyHeader?: boolean\n stickySidebar?: boolean\n stickyAside?: boolean\n edgeNotches?: boolean\n hideSidebarOnMobile?: boolean\n hideAsideOnMobile?: boolean\n}\n\nexport interface DocsFooterConfig {\n left?: string\n right?: string\n}\n\nexport interface DocsPageMeta {\n title: string\n path: string\n}\n\nexport interface DocsHeaderProps {\n site: DocsSiteConfig\n}\n\nexport interface DocsBrandProps {\n site: DocsSiteConfig\n}\n\nexport interface DocsFooterProps {\n site: DocsSiteConfig\n}\n\nexport interface DocsHeaderNavProps {\n site: DocsSiteConfig\n items: VfNavMenuItem[]\n activeValue?: string\n}\n\nexport interface DocsSidebarProps {\n site: DocsSiteConfig\n page: DocsPageMeta\n items: VfNavMenuItem[]\n}\n\nexport interface DocsAsideProps {\n site: DocsSiteConfig\n page: DocsPageMeta\n items: VfTableOfContentsItem[]\n}\n\nexport interface DocsLayoutProps {\n site: DocsSiteConfig\n page: DocsPageMeta\n layout: Required<DocsLayoutConfig>\n sidebarItems: VfNavMenuItem[]\n tocItems: VfTableOfContentsItem[]\n}\n\nexport interface DocsComponentsConfig {\n Brand?: Component\n Home?: Component\n Header?: Component\n HeaderNav?: Component\n Footer?: Component\n SidebarTop?: Component\n SidebarBottom?: Component\n AsideTop?: Component\n AsideBottom?: Component\n Layout?: Component\n}\n\nexport interface DocsConfig {\n title?: string\n site?: Partial<DocsSiteConfig>\n home?: DocsHomeConfig\n headerNav?: DocsHeaderNavConfig\n layout?: DocsLayoutConfig\n footer?: DocsFooterConfig\n components?: DocsComponentsConfig\n sectionLabels?: Record<string, DocsSectionConfig>\n toc?: DocsTocConfig\n}\n\nexport function defineDocsConfig(config: DocsConfig): DocsConfig {\n return config\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/createViteSsgApp.ts","../src/docsContent.ts","../src/routes.ts","../src/config.ts"],"sourcesContent":["import { createHead as createClientHead } from '@unhead/vue/client'\nimport { createHead as createServerHead } from '@unhead/vue/server'\nimport { createApp, createSSRApp, type Component } from 'vue'\nimport {\n createMemoryHistory,\n createRouter,\n createWebHistory,\n type RouteRecordRaw,\n type Router\n} from 'vue-router'\n\ntype CreateViteSsgContext = {\n app: ReturnType<typeof createApp>\n head: ReturnType<typeof createClientHead> | ReturnType<typeof createServerHead> | undefined\n initialState: Record<string, unknown>\n isClient: boolean\n onSSRAppRendered: (cb: () => void | Promise<void>) => void\n routePath?: string\n router: Router\n routes: RouteRecordRaw[]\n transformState?: (state: Record<string, unknown>) => Record<string, unknown>\n triggerOnSSRAppRendered: () => Promise<void[]>\n}\n\ntype CreateViteSsgOptions = {\n hydration?: boolean\n rootContainer?: string\n useHead?: boolean\n transformState?: (state: Record<string, unknown>) => Record<string, unknown>\n}\n\nasync function documentReady(): Promise<void> {\n if (typeof document === 'undefined' || document.readyState !== 'loading') {\n return\n }\n\n await new Promise<void>((resolve) => {\n document.addEventListener('DOMContentLoaded', () => resolve(), { once: true })\n })\n}\n\nasync function nextFrame(): Promise<void> {\n await new Promise<void>((resolve) => requestAnimationFrame(() => resolve()))\n}\n\nfunction isVisibleElement(element: HTMLElement | null): element is HTMLElement {\n return Boolean(element && element.offsetParent !== null)\n}\n\nfunction getStickyOffsetTop(): number {\n if (typeof document === 'undefined') {\n return 0\n }\n\n const header = document.querySelector<HTMLElement>('.vf-document-layout__header')\n const layoutSubheader = document.querySelector<HTMLElement>('.vf-document-layout__subheader')\n const contentSubheader = document.querySelector<HTMLElement>('.vf-document-layout__content-subheader')\n const topGap = 16\n let offset = topGap\n\n if (isVisibleElement(header)) {\n offset += header.getBoundingClientRect().height\n }\n\n if (isVisibleElement(layoutSubheader)) {\n offset += layoutSubheader.getBoundingClientRect().height\n }\n\n if (isVisibleElement(contentSubheader)) {\n offset += contentSubheader.getBoundingClientRect().height\n }\n\n return offset\n}\n\nfunction getInitialState(): Record<string, unknown> {\n if (typeof window === 'undefined') {\n return {}\n }\n\n return ((window as Window & { __INITIAL_STATE__?: Record<string, unknown> }).__INITIAL_STATE__ ?? {})\n}\n\nfunction ensureHistoryState(): void {\n if (typeof window === 'undefined') {\n return\n }\n\n if (window.history.state) {\n return\n }\n\n const current = `${window.location.pathname}${window.location.search}${window.location.hash}`\n\n window.history.replaceState(\n {\n back: null,\n current,\n forward: null,\n position: window.history.length - 1,\n replaced: true,\n scroll: null\n },\n '',\n current\n )\n}\n\nexport function createViteSsgApp(\n App: Component,\n routerOptions: { base?: string; routes: RouteRecordRaw[] },\n fn?: (context: CreateViteSsgContext) => Promise<void> | void,\n options?: CreateViteSsgOptions\n) {\n const { rootContainer = '#app', transformState, useHead = true } = options ?? {}\n\n async function createSsgApp(routePath?: string): Promise<CreateViteSsgContext> {\n const app = import.meta.env.SSR || options?.hydration ? createSSRApp(App) : createApp(App)\n let head: CreateViteSsgContext['head']\n\n if (useHead) {\n head = import.meta.env.SSR ? createServerHead() : createClientHead()\n app.use(head)\n }\n\n const router = createRouter({\n history: import.meta.env.SSR\n ? createMemoryHistory(routerOptions.base)\n : createWebHistory(routerOptions.base),\n scrollBehavior: async (to, _from, savedPosition) => {\n if (savedPosition) {\n return savedPosition\n }\n\n if (to.hash) {\n const targetHash = decodeURIComponent(to.hash)\n\n await nextFrame()\n await nextFrame()\n\n const targetElement = document.querySelector<HTMLElement>(targetHash)\n\n if (targetElement) {\n const top = targetElement.getBoundingClientRect().top + window.scrollY - getStickyOffsetTop()\n\n return {\n left: 0,\n top: Math.max(0, top),\n behavior: 'smooth'\n }\n }\n }\n\n return { left: 0, top: 0 }\n },\n ...routerOptions\n })\n\n const appRenderCallbacks: Array<() => void | Promise<void>> = []\n const onSSRAppRendered = import.meta.env.SSR\n ? (cb: () => void | Promise<void>) => appRenderCallbacks.push(cb)\n : () => undefined\n const triggerOnSSRAppRendered = () => Promise.all(appRenderCallbacks.map((cb) => cb()))\n\n const context: CreateViteSsgContext = {\n app,\n head,\n initialState: {},\n isClient: !import.meta.env.SSR,\n onSSRAppRendered,\n routePath,\n router,\n routes: routerOptions.routes,\n transformState,\n triggerOnSSRAppRendered\n }\n\n if (!import.meta.env.SSR) {\n await documentReady()\n ensureHistoryState()\n context.initialState = transformState?.(getInitialState()) ?? getInitialState()\n }\n\n await fn?.(context)\n app.use(router)\n\n let entryRoutePath: string | undefined\n let isFirstRoute = true\n\n router.beforeEach((to) => {\n if (isFirstRoute || (entryRoutePath && entryRoutePath === to.path)) {\n isFirstRoute = false\n entryRoutePath = to.path\n to.meta.state = context.initialState\n }\n\n return true\n })\n\n if (import.meta.env.SSR) {\n const route = context.routePath ?? '/'\n await router.push(route)\n await router.isReady()\n context.initialState = (router.currentRoute.value.meta.state as Record<string, unknown>) || {}\n }\n\n return context\n }\n\n if (!import.meta.env.SSR) {\n ;(async () => {\n const { app, router } = await createSsgApp()\n await router.isReady()\n app.mount(rootContainer, true)\n })()\n }\n\n return createSsgApp\n}\n","import { Parser, type Tokens, marked } from 'marked'\nimport GithubSlugger from 'github-slugger'\nimport type { VfNavMenuItem, VfTableOfContentsItem } from '@codemonster-ru/vueforge-core'\nimport type {\n DocsComponentsConfig,\n DocsConfig,\n DocsFooterConfig,\n DocsHeaderNavConfig,\n DocsHomeConfig,\n DocsLayoutConfig,\n DocsSiteConfig\n} from './config'\n\nexport type DocsContentBlock =\n | {\n type: 'heading'\n depth: 1 | 2 | 3 | 4 | 5 | 6\n id: string\n html: string\n }\n | {\n type: 'paragraph'\n html: string\n }\n | {\n type: 'code'\n code: string\n language: string\n }\n | {\n type: 'list'\n ordered: boolean\n items: string[]\n }\n | {\n type: 'blockquote'\n html: string\n }\n | {\n type: 'html'\n html: string\n }\n\nexport interface DocsPage {\n id: string\n path: string\n sourcePath: string\n isIndexPage: boolean\n title: string\n navTitle: string\n description?: string\n order: number\n section: string[]\n blocks: DocsContentBlock[]\n tableOfContents: VfTableOfContentsItem[]\n}\n\ninterface Frontmatter {\n title?: string\n navTitle?: string\n description?: string\n order?: number\n}\n\ninterface NavNode {\n label: string\n order: number\n value?: string\n path?: string\n isPage?: boolean\n children: Map<string, NavNode>\n}\n\ntype TokensList = Tokens.Generic[]\n\nexport interface ResolveDocsContentInput {\n docsConfig: DocsConfig\n markdownFiles: Record<string, string>\n}\n\nexport interface ResolvedDocsContent {\n docsPages: DocsPage[]\n docsSidebar: VfNavMenuItem[]\n docsSite: DocsSiteConfig\n docsLayout: Required<DocsLayoutConfig>\n docsFooter: DocsFooterConfig\n docsHome: Required<DocsHomeConfig>\n docsHeaderNav: Required<DocsHeaderNavConfig>\n docsComponents: DocsComponentsConfig\n docsSiteTitle: string\n docsScrollOffset: number\n getDocsPageByPath: (pathname: string) => DocsPage\n}\n\nfunction parseFrontmatter(source: string): { data: Frontmatter; content: string } {\n if (!source.startsWith('---\\n')) {\n return { data: {}, content: source }\n }\n\n const frontmatterEnd = source.indexOf('\\n---\\n', 4)\n\n if (frontmatterEnd === -1) {\n return { data: {}, content: source }\n }\n\n const rawFrontmatter = source.slice(4, frontmatterEnd)\n const content = source.slice(frontmatterEnd + 5)\n const data: Frontmatter = {}\n\n for (const line of rawFrontmatter.split('\\n')) {\n const separatorIndex = line.indexOf(':')\n\n if (separatorIndex === -1) {\n continue\n }\n\n const key = line.slice(0, separatorIndex).trim()\n const rawValue = line.slice(separatorIndex + 1).trim()\n const normalizedValue = rawValue.replace(/^['\"]|['\"]$/g, '')\n\n if (key === 'order') {\n const numericValue = Number(normalizedValue)\n data.order = Number.isFinite(numericValue) ? numericValue : 0\n continue\n }\n\n if (key === 'title' || key === 'navTitle' || key === 'description') {\n data[key] = normalizedValue\n }\n }\n\n return { data, content }\n}\n\nfunction toTitleCase(value: string): string {\n return value\n .replace(/[-_]/g, ' ')\n .replace(/\\b\\w/g, (letter) => letter.toUpperCase())\n}\n\nfunction normalizeDocPath(sourcePath: string): string {\n const relativePath = sourcePath.replace(/^.*\\/(?:content|docs)\\//, '').replace(/\\.md$/, '')\n\n if (relativePath === 'index') {\n return '/'\n }\n\n if (relativePath.endsWith('/index')) {\n return `/${relativePath.replace(/\\/index$/, '')}`\n }\n\n return `/${relativePath}`\n}\n\nfunction isIndexSourcePath(sourcePath: string): boolean {\n return sourcePath.replace(/\\\\/g, '/').replace(/\\.md$/, '').endsWith('/index')\n}\n\nfunction normalizeMarkdownLinkHref(href: string): string {\n if (\n href.startsWith('#') ||\n href.startsWith('//') ||\n /^[a-z][a-z\\d+.-]*:/i.test(href)\n ) {\n return href\n }\n\n const match = href.match(/^([^?#]*)([?#].*)?$/)\n\n if (!match) {\n return href\n }\n\n const [, pathname, suffix = ''] = match\n\n if (!/\\.(?:md|mdx)$/i.test(pathname)) {\n return href\n }\n\n const extensionlessPathname = pathname.replace(/\\.(?:md|mdx)$/i, '')\n let normalizedPathname = extensionlessPathname\n\n if (extensionlessPathname === 'index' || extensionlessPathname === './index') {\n normalizedPathname = '.'\n } else if (extensionlessPathname.endsWith('/index')) {\n normalizedPathname = extensionlessPathname.replace(/\\/index$/, '')\n }\n\n return `${normalizedPathname}${suffix}`\n}\n\nfunction normalizeMarkdownLinks(tokens: TokensList): void {\n for (const token of tokens) {\n if (token.type === 'link' && typeof token.href === 'string') {\n token.href = normalizeMarkdownLinkHref(token.href)\n }\n\n if ('tokens' in token && Array.isArray(token.tokens)) {\n normalizeMarkdownLinks(token.tokens as TokensList)\n }\n\n if (token.type === 'list' && Array.isArray(token.items)) {\n for (const item of token.items) {\n normalizeMarkdownLinks(item.tokens as TokensList)\n }\n }\n }\n}\n\nfunction toValueFromPath(path: string): string {\n return path === '/' ? 'index' : path.replace(/^\\//, '').replace(/\\//g, '-')\n}\n\nfunction renderInline(tokens: Tokens.Generic[] | undefined): string {\n return Parser.parseInline(tokens ?? [])\n}\n\nfunction renderBlockTokens(tokens: TokensList | undefined): string {\n return Parser.parse(tokens ?? [])\n}\n\nfunction renderListItemTokens(tokens: TokensList | undefined): string {\n return Parser.parse(tokens ?? [])\n}\n\nfunction renderMarkdown(markdown: string, tocLevels: Set<number>): {\n blocks: DocsContentBlock[]\n tableOfContents: VfTableOfContentsItem[]\n} {\n const tokens = marked.lexer(markdown) as TokensList\n normalizeMarkdownLinks(tokens)\n const headingSlugger = new GithubSlugger()\n const tableOfContents: VfTableOfContentsItem[] = []\n const blocks: DocsContentBlock[] = []\n\n for (const token of tokens) {\n switch (token.type) {\n case 'space':\n break\n case 'heading': {\n const id = headingSlugger.slug(token.text)\n const html = renderInline(token.tokens)\n\n blocks.push({\n type: 'heading',\n depth: token.depth as 1 | 2 | 3 | 4 | 5 | 6,\n id,\n html\n })\n\n if (tocLevels.has(token.depth)) {\n tableOfContents.push({\n id,\n label: token.text,\n level: token.depth - 1\n })\n }\n break\n }\n case 'paragraph':\n blocks.push({\n type: 'paragraph',\n html: renderInline(token.tokens)\n })\n break\n case 'code':\n blocks.push({\n type: 'code',\n code: token.text,\n language: token.lang?.trim() || 'text'\n })\n break\n case 'list':\n blocks.push({\n type: 'list',\n ordered: token.ordered,\n items: token.items.map((item: Tokens.ListItem) => renderListItemTokens(item.tokens))\n })\n break\n case 'blockquote':\n blocks.push({\n type: 'blockquote',\n html: renderBlockTokens(token.tokens)\n })\n break\n default:\n blocks.push({\n type: 'html',\n html: renderBlockTokens([token])\n })\n break\n }\n }\n\n return { blocks, tableOfContents }\n}\n\nfunction getFirstHeadingText(markdown: string): string | undefined {\n const tokens = marked.lexer(markdown) as TokensList\n const heading = tokens.find((token): token is Tokens.Heading => token.type === 'heading' && token.depth === 1)\n\n return heading?.text.trim() || undefined\n}\n\nfunction parsePage(sourcePath: string, source: string, tocLevels: Set<number>): DocsPage {\n const { data: frontmatter, content } = parseFrontmatter(source)\n const path = normalizeDocPath(sourcePath)\n const pathSegments = path === '/' ? [] : path.replace(/^\\//, '').split('/')\n const isIndexPage = isIndexSourcePath(sourcePath)\n const section = isIndexPage ? pathSegments : pathSegments.slice(0, -1)\n const filename = pathSegments[pathSegments.length - 1] ?? 'index'\n const fallbackTitle = isIndexPage ? (getFirstHeadingText(content) ?? 'Overview') : toTitleCase(filename)\n const title = frontmatter.title?.trim() || fallbackTitle\n const navTitle = frontmatter.navTitle?.trim() || (isIndexPage ? 'Overview' : title)\n const { blocks, tableOfContents } = renderMarkdown(content, tocLevels)\n const id = isIndexPage && path !== '/' ? `${toValueFromPath(path)}-index` : toValueFromPath(path)\n\n return {\n id,\n path,\n sourcePath,\n isIndexPage,\n title,\n navTitle,\n description: frontmatter.description?.trim(),\n order: frontmatter.order ?? 0,\n section,\n blocks,\n tableOfContents\n }\n}\n\nfunction sortNodes(nodes: NavNode[]): NavNode[] {\n return [...nodes].sort((left, right) => {\n if (left.order !== right.order) {\n return left.order - right.order\n }\n\n return left.label.localeCompare(right.label)\n })\n}\n\nfunction getPageNavKey(page: DocsPage): string {\n if (page.isIndexPage) {\n return 'index'\n }\n\n return page.path.split('/').filter(Boolean).at(-1) ?? page.id\n}\n\nfunction buildSidebar(pages: DocsPage[], docsConfig: DocsConfig): VfNavMenuItem[] {\n const root = new Map<string, NavNode>()\n\n for (const page of pages) {\n let current = root\n let currentPath = ''\n\n for (const segment of page.section) {\n currentPath = `${currentPath}/${segment}`\n const sectionConfig = docsConfig.sectionLabels?.[segment]\n\n if (!current.has(segment)) {\n current.set(segment, {\n label: sectionConfig?.label ?? toTitleCase(segment),\n order: sectionConfig?.order ?? 1_000,\n value: toValueFromPath(currentPath),\n path: currentPath,\n isPage: false,\n children: new Map()\n })\n }\n\n current = current.get(segment)!.children\n }\n\n const pageKey = getPageNavKey(page)\n const existingPageNode = current.get(pageKey)\n\n current.set(pageKey, {\n label: page.navTitle,\n order: page.order,\n value: page.id,\n path: page.path,\n isPage: true,\n children: existingPageNode?.children ?? new Map()\n })\n }\n\n const toItems = (nodes: Map<string, NavNode>): VfNavMenuItem[] =>\n sortNodes([...nodes.values()]).map((node) => {\n const item: VfNavMenuItem = {\n value: node.value ?? toValueFromPath(node.path ?? node.label),\n label: node.label\n }\n\n const children = toItems(node.children)\n\n if (node.path && node.isPage) {\n item.to = node.path\n }\n\n if (children.length > 0) {\n if (item.to) {\n const branchValue = `${item.value}-section`\n\n item.children = [\n {\n value: item.value,\n label: 'Overview',\n to: item.to\n },\n ...children\n ]\n item.value = branchValue\n delete item.to\n } else {\n item.children = children\n }\n }\n\n return item\n })\n\n return toItems(root)\n}\n\nexport function resolveDocsContent({ docsConfig, markdownFiles }: ResolveDocsContentInput): ResolvedDocsContent {\n const tocLevels = new Set(docsConfig.toc?.levels ?? [2, 3, 4])\n\n const docsPages = Object.entries(markdownFiles)\n .map(([sourcePath, source]) => parsePage(sourcePath, source, tocLevels))\n .filter((page) => page.path !== '/')\n .sort((left, right) => left.path.localeCompare(right.path))\n\n const docsSidebar = buildSidebar(docsPages, docsConfig)\n const docsSite: DocsSiteConfig = {\n title: docsConfig.site?.title ?? docsConfig.title ?? 'docs',\n description: docsConfig.site?.description,\n githubUrl: docsConfig.site?.githubUrl,\n homeTo: docsConfig.site?.homeTo ?? '/',\n favicon: docsConfig.site?.favicon,\n logo: docsConfig.site?.logo,\n logoLabel: docsConfig.site?.logoLabel\n }\n const docsLayout: Required<DocsLayoutConfig> = {\n variant: docsConfig.layout?.variant ?? 'sidebar-content-aside',\n fillViewport: docsConfig.layout?.fillViewport ?? true,\n stickyHeader: docsConfig.layout?.stickyHeader ?? true,\n stickySidebar: docsConfig.layout?.stickySidebar ?? true,\n stickyAside: docsConfig.layout?.stickyAside ?? true,\n edgeNotches: docsConfig.layout?.edgeNotches ?? false,\n hideSidebarOnMobile: docsConfig.layout?.hideSidebarOnMobile ?? true,\n hideAsideOnMobile: docsConfig.layout?.hideAsideOnMobile ?? true\n }\n const docsFooter: DocsFooterConfig = {\n left: docsConfig.footer?.left ?? 'Codemonster documentation',\n right: docsConfig.footer?.right\n }\n const docsHome: Required<DocsHomeConfig> = {\n enabled: docsConfig.home?.enabled ?? true,\n title: docsConfig.home?.title ?? 'Build docs fast',\n description: docsConfig.home?.description ?? 'Write markdown, keep the same UI stack, and ship clean developer docs.',\n showGrid: docsConfig.home?.showGrid ?? true,\n primaryAction: docsConfig.home?.primaryAction ?? {\n label: 'Get Started',\n to: '/guide/installation'\n },\n secondaryAction: docsConfig.home?.secondaryAction ?? {\n label: 'View on GitHub',\n href: docsConfig.site?.githubUrl\n }\n }\n const docsHeaderNav: Required<DocsHeaderNavConfig> = {\n items: docsConfig.headerNav?.items ?? [],\n ariaLabel: docsConfig.headerNav?.ariaLabel ?? 'Header navigation'\n }\n const docsComponents: DocsComponentsConfig = docsConfig.components ?? {}\n const docsSiteTitle = docsSite.title\n const docsScrollOffset = docsConfig.toc?.scrollOffset ?? 96\n\n function getDocsPageByPath(pathname: string): DocsPage {\n const normalizedPath = pathname === '/' ? '/' : pathname.replace(/\\/$/, '')\n\n return docsPages.find((page) => page.path === normalizedPath) ?? docsPages[0]\n }\n\n return {\n docsPages,\n docsSidebar,\n docsSite,\n docsLayout,\n docsFooter,\n docsHome,\n docsHeaderNav,\n docsComponents,\n docsSiteTitle,\n docsScrollOffset,\n getDocsPageByPath\n }\n}\n","import type { Component } from 'vue'\nimport type { RouteRecordRaw } from 'vue-router'\nimport type { DocsPage } from './docsContent'\n\nexport interface CreateDocsRoutesInput {\n docsPages: DocsPage[]\n homeEnabled: boolean\n homeComponent: Component\n pageComponent: Component\n notFoundComponent?: Component\n}\n\nexport function createDocsRoutes({\n docsPages,\n homeEnabled,\n homeComponent,\n pageComponent,\n notFoundComponent\n}: CreateDocsRoutesInput): RouteRecordRaw[] {\n const docsPageRoutes: RouteRecordRaw[] = docsPages.map((page) => ({\n path: page.path,\n name: page.id,\n component: pageComponent\n }))\n\n const docsLandingRoute = [...docsPages].sort((left, right) => {\n if (left.order !== right.order) {\n return left.order - right.order\n }\n\n return left.path.localeCompare(right.path)\n })[0]\n\n const rootRoute: RouteRecordRaw = homeEnabled\n ? {\n path: '/',\n name: 'home',\n component: homeComponent\n }\n : docsLandingRoute\n ? {\n path: '/',\n name: 'home',\n redirect: docsLandingRoute.path\n }\n : {\n path: '/',\n name: 'home',\n component: homeComponent\n }\n\n const routes: RouteRecordRaw[] = [rootRoute, ...docsPageRoutes]\n\n if (notFoundComponent) {\n routes.push({\n path: '/:pathMatch(.*)*',\n name: 'not-found',\n component: notFoundComponent\n })\n }\n\n return routes\n}\n","import type { Component } from 'vue'\nimport type { VfNavMenuItem, VfTableOfContentsItem } from '@codemonster-ru/vueforge-core'\n\nexport interface DocsSectionConfig {\n label?: string\n order?: number\n}\n\nexport interface DocsTocConfig {\n levels?: number[]\n scrollOffset?: number\n}\n\nexport interface DocsSiteLogoConfig {\n src?: string\n component?: Component\n alt?: string\n width?: number | string\n height?: number | string\n}\n\nexport interface DocsHomeActionConfig {\n label: string\n to?: string\n href?: string\n}\n\nexport interface DocsHomeConfig {\n enabled?: boolean\n title?: string\n description?: string\n showGrid?: boolean\n primaryAction?: DocsHomeActionConfig\n secondaryAction?: DocsHomeActionConfig\n}\n\nexport interface DocsHeaderNavConfig {\n items?: VfNavMenuItem[]\n ariaLabel?: string\n}\n\nexport type DocsLayoutVariant =\n | 'content'\n | 'sidebar-content'\n | 'sidebar-content-aside'\n\nexport interface DocsSiteConfig {\n title: string\n description?: string\n githubUrl?: string\n homeTo?: string\n favicon?: string\n logo?: DocsSiteLogoConfig\n logoLabel?: string\n}\n\nexport interface DocsLayoutConfig {\n variant?: DocsLayoutVariant\n fillViewport?: boolean\n stickyHeader?: boolean\n stickySidebar?: boolean\n stickyAside?: boolean\n edgeNotches?: boolean\n hideSidebarOnMobile?: boolean\n hideAsideOnMobile?: boolean\n}\n\nexport interface DocsFooterConfig {\n left?: string\n right?: string\n}\n\nexport interface DocsPageMeta {\n title: string\n path: string\n}\n\nexport interface DocsHeaderProps {\n site: DocsSiteConfig\n}\n\nexport interface DocsBrandProps {\n site: DocsSiteConfig\n}\n\nexport interface DocsFooterProps {\n site: DocsSiteConfig\n}\n\nexport interface DocsHeaderNavProps {\n site: DocsSiteConfig\n items: VfNavMenuItem[]\n activeValue?: string\n}\n\nexport interface DocsSidebarProps {\n site: DocsSiteConfig\n page: DocsPageMeta\n items: VfNavMenuItem[]\n}\n\nexport interface DocsAsideProps {\n site: DocsSiteConfig\n page: DocsPageMeta\n items: VfTableOfContentsItem[]\n}\n\nexport interface DocsLayoutProps {\n site: DocsSiteConfig\n page: DocsPageMeta\n layout: Required<DocsLayoutConfig>\n sidebarItems: VfNavMenuItem[]\n tocItems: VfTableOfContentsItem[]\n}\n\nexport interface DocsComponentsConfig {\n Brand?: Component\n Home?: Component\n Header?: Component\n HeaderNav?: Component\n Footer?: Component\n SidebarTop?: Component\n SidebarBottom?: Component\n AsideTop?: Component\n AsideBottom?: Component\n Layout?: Component\n}\n\nexport interface DocsConfig {\n title?: string\n site?: Partial<DocsSiteConfig>\n home?: DocsHomeConfig\n headerNav?: DocsHeaderNavConfig\n layout?: DocsLayoutConfig\n footer?: DocsFooterConfig\n components?: DocsComponentsConfig\n sectionLabels?: Record<string, DocsSectionConfig>\n toc?: DocsTocConfig\n}\n\nexport function defineDocsConfig(config: DocsConfig): DocsConfig {\n return config\n}\n"],"mappings":";AAAA,SAAS,cAAc,wBAAwB;AAC/C,SAAS,cAAc,wBAAwB;AAC/C,SAAS,WAAW,oBAAoC;AACxD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AAsBP,eAAe,gBAA+B;AAC5C,MAAI,OAAO,aAAa,eAAe,SAAS,eAAe,WAAW;AACxE;AAAA,EACF;AAEA,QAAM,IAAI,QAAc,CAAC,YAAY;AACnC,aAAS,iBAAiB,oBAAoB,MAAM,QAAQ,GAAG,EAAE,MAAM,KAAK,CAAC;AAAA,EAC/E,CAAC;AACH;AAEA,eAAe,YAA2B;AACxC,QAAM,IAAI,QAAc,CAAC,YAAY,sBAAsB,MAAM,QAAQ,CAAC,CAAC;AAC7E;AAEA,SAAS,iBAAiB,SAAqD;AAC7E,SAAO,QAAQ,WAAW,QAAQ,iBAAiB,IAAI;AACzD;AAEA,SAAS,qBAA6B;AACpC,MAAI,OAAO,aAAa,aAAa;AACnC,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,SAAS,cAA2B,6BAA6B;AAChF,QAAM,kBAAkB,SAAS,cAA2B,gCAAgC;AAC5F,QAAM,mBAAmB,SAAS,cAA2B,wCAAwC;AACrG,QAAM,SAAS;AACf,MAAI,SAAS;AAEb,MAAI,iBAAiB,MAAM,GAAG;AAC5B,cAAU,OAAO,sBAAsB,EAAE;AAAA,EAC3C;AAEA,MAAI,iBAAiB,eAAe,GAAG;AACrC,cAAU,gBAAgB,sBAAsB,EAAE;AAAA,EACpD;AAEA,MAAI,iBAAiB,gBAAgB,GAAG;AACtC,cAAU,iBAAiB,sBAAsB,EAAE;AAAA,EACrD;AAEA,SAAO;AACT;AAEA,SAAS,kBAA2C;AAClD,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO,CAAC;AAAA,EACV;AAEA,SAAS,OAAoE,qBAAqB,CAAC;AACrG;AAEA,SAAS,qBAA2B;AAClC,MAAI,OAAO,WAAW,aAAa;AACjC;AAAA,EACF;AAEA,MAAI,OAAO,QAAQ,OAAO;AACxB;AAAA,EACF;AAEA,QAAM,UAAU,GAAG,OAAO,SAAS,QAAQ,GAAG,OAAO,SAAS,MAAM,GAAG,OAAO,SAAS,IAAI;AAE3F,SAAO,QAAQ;AAAA,IACb;AAAA,MACE,MAAM;AAAA,MACN;AAAA,MACA,SAAS;AAAA,MACT,UAAU,OAAO,QAAQ,SAAS;AAAA,MAClC,UAAU;AAAA,MACV,QAAQ;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,iBACd,KACA,eACA,IACA,SACA;AACA,QAAM,EAAE,gBAAgB,QAAQ,gBAAgB,UAAU,KAAK,IAAI,WAAW,CAAC;AAE/E,iBAAe,aAAa,WAAmD;AAC7E,UAAM,MAAM,YAAY,IAAI,OAAO,SAAS,YAAY,aAAa,GAAG,IAAI,UAAU,GAAG;AACzF,QAAI;AAEJ,QAAI,SAAS;AACX,aAAO,YAAY,IAAI,MAAM,iBAAiB,IAAI,iBAAiB;AACnE,UAAI,IAAI,IAAI;AAAA,IACd;AAEA,UAAM,SAAS,aAAa;AAAA,MAC1B,SAAS,YAAY,IAAI,MACrB,oBAAoB,cAAc,IAAI,IACtC,iBAAiB,cAAc,IAAI;AAAA,MACvC,gBAAgB,OAAO,IAAI,OAAO,kBAAkB;AAClD,YAAI,eAAe;AACjB,iBAAO;AAAA,QACT;AAEA,YAAI,GAAG,MAAM;AACX,gBAAM,aAAa,mBAAmB,GAAG,IAAI;AAE7C,gBAAM,UAAU;AAChB,gBAAM,UAAU;AAEhB,gBAAM,gBAAgB,SAAS,cAA2B,UAAU;AAEpE,cAAI,eAAe;AACjB,kBAAM,MAAM,cAAc,sBAAsB,EAAE,MAAM,OAAO,UAAU,mBAAmB;AAE5F,mBAAO;AAAA,cACL,MAAM;AAAA,cACN,KAAK,KAAK,IAAI,GAAG,GAAG;AAAA,cACpB,UAAU;AAAA,YACZ;AAAA,UACF;AAAA,QACF;AAEA,eAAO,EAAE,MAAM,GAAG,KAAK,EAAE;AAAA,MAC3B;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AAED,UAAM,qBAAwD,CAAC;AAC/D,UAAM,mBAAmB,YAAY,IAAI,MACrC,CAAC,OAAmC,mBAAmB,KAAK,EAAE,IAC9D,MAAM;AACV,UAAM,0BAA0B,MAAM,QAAQ,IAAI,mBAAmB,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;AAEtF,UAAM,UAAgC;AAAA,MACpC;AAAA,MACA;AAAA,MACA,cAAc,CAAC;AAAA,MACf,UAAU,CAAC,YAAY,IAAI;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,cAAc;AAAA,MACtB;AAAA,MACA;AAAA,IACF;AAEA,QAAI,CAAC,YAAY,IAAI,KAAK;AACxB,YAAM,cAAc;AACpB,yBAAmB;AACnB,cAAQ,eAAe,iBAAiB,gBAAgB,CAAC,KAAK,gBAAgB;AAAA,IAChF;AAEA,UAAM,KAAK,OAAO;AAClB,QAAI,IAAI,MAAM;AAEd,QAAI;AACJ,QAAI,eAAe;AAEnB,WAAO,WAAW,CAAC,OAAO;AACxB,UAAI,gBAAiB,kBAAkB,mBAAmB,GAAG,MAAO;AAClE,uBAAe;AACf,yBAAiB,GAAG;AACpB,WAAG,KAAK,QAAQ,QAAQ;AAAA,MAC1B;AAEA,aAAO;AAAA,IACT,CAAC;AAED,QAAI,YAAY,IAAI,KAAK;AACvB,YAAM,QAAQ,QAAQ,aAAa;AACnC,YAAM,OAAO,KAAK,KAAK;AACvB,YAAM,OAAO,QAAQ;AACrB,cAAQ,eAAgB,OAAO,aAAa,MAAM,KAAK,SAAqC,CAAC;AAAA,IAC/F;AAEA,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,YAAY,IAAI,KAAK;AACxB;AAAC,KAAC,YAAY;AACZ,YAAM,EAAE,KAAK,OAAO,IAAI,MAAM,aAAa;AAC3C,YAAM,OAAO,QAAQ;AACrB,UAAI,MAAM,eAAe,IAAI;AAAA,IAC/B,GAAG;AAAA,EACL;AAEA,SAAO;AACT;;;AC1NA,SAAS,QAAqB,cAAc;AAC5C,OAAO,mBAAmB;AA6F1B,SAAS,iBAAiB,QAAwD;AAChF,MAAI,CAAC,OAAO,WAAW,OAAO,GAAG;AAC/B,WAAO,EAAE,MAAM,CAAC,GAAG,SAAS,OAAO;AAAA,EACrC;AAEA,QAAM,iBAAiB,OAAO,QAAQ,WAAW,CAAC;AAElD,MAAI,mBAAmB,IAAI;AACzB,WAAO,EAAE,MAAM,CAAC,GAAG,SAAS,OAAO;AAAA,EACrC;AAEA,QAAM,iBAAiB,OAAO,MAAM,GAAG,cAAc;AACrD,QAAM,UAAU,OAAO,MAAM,iBAAiB,CAAC;AAC/C,QAAM,OAAoB,CAAC;AAE3B,aAAW,QAAQ,eAAe,MAAM,IAAI,GAAG;AAC7C,UAAM,iBAAiB,KAAK,QAAQ,GAAG;AAEvC,QAAI,mBAAmB,IAAI;AACzB;AAAA,IACF;AAEA,UAAM,MAAM,KAAK,MAAM,GAAG,cAAc,EAAE,KAAK;AAC/C,UAAM,WAAW,KAAK,MAAM,iBAAiB,CAAC,EAAE,KAAK;AACrD,UAAM,kBAAkB,SAAS,QAAQ,gBAAgB,EAAE;AAE3D,QAAI,QAAQ,SAAS;AACnB,YAAM,eAAe,OAAO,eAAe;AAC3C,WAAK,QAAQ,OAAO,SAAS,YAAY,IAAI,eAAe;AAC5D;AAAA,IACF;AAEA,QAAI,QAAQ,WAAW,QAAQ,cAAc,QAAQ,eAAe;AAClE,WAAK,GAAG,IAAI;AAAA,IACd;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,QAAQ;AACzB;AAEA,SAAS,YAAY,OAAuB;AAC1C,SAAO,MACJ,QAAQ,SAAS,GAAG,EACpB,QAAQ,SAAS,CAAC,WAAW,OAAO,YAAY,CAAC;AACtD;AAEA,SAAS,iBAAiB,YAA4B;AACpD,QAAM,eAAe,WAAW,QAAQ,2BAA2B,EAAE,EAAE,QAAQ,SAAS,EAAE;AAE1F,MAAI,iBAAiB,SAAS;AAC5B,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,SAAS,QAAQ,GAAG;AACnC,WAAO,IAAI,aAAa,QAAQ,YAAY,EAAE,CAAC;AAAA,EACjD;AAEA,SAAO,IAAI,YAAY;AACzB;AAEA,SAAS,kBAAkB,YAA6B;AACtD,SAAO,WAAW,QAAQ,OAAO,GAAG,EAAE,QAAQ,SAAS,EAAE,EAAE,SAAS,QAAQ;AAC9E;AAEA,SAAS,0BAA0B,MAAsB;AACvD,MACE,KAAK,WAAW,GAAG,KACnB,KAAK,WAAW,IAAI,KACpB,sBAAsB,KAAK,IAAI,GAC/B;AACA,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,KAAK,MAAM,qBAAqB;AAE9C,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,CAAC,EAAE,UAAU,SAAS,EAAE,IAAI;AAElC,MAAI,CAAC,iBAAiB,KAAK,QAAQ,GAAG;AACpC,WAAO;AAAA,EACT;AAEA,QAAM,wBAAwB,SAAS,QAAQ,kBAAkB,EAAE;AACnE,MAAI,qBAAqB;AAEzB,MAAI,0BAA0B,WAAW,0BAA0B,WAAW;AAC5E,yBAAqB;AAAA,EACvB,WAAW,sBAAsB,SAAS,QAAQ,GAAG;AACnD,yBAAqB,sBAAsB,QAAQ,YAAY,EAAE;AAAA,EACnE;AAEA,SAAO,GAAG,kBAAkB,GAAG,MAAM;AACvC;AAEA,SAAS,uBAAuB,QAA0B;AACxD,aAAW,SAAS,QAAQ;AAC1B,QAAI,MAAM,SAAS,UAAU,OAAO,MAAM,SAAS,UAAU;AAC3D,YAAM,OAAO,0BAA0B,MAAM,IAAI;AAAA,IACnD;AAEA,QAAI,YAAY,SAAS,MAAM,QAAQ,MAAM,MAAM,GAAG;AACpD,6BAAuB,MAAM,MAAoB;AAAA,IACnD;AAEA,QAAI,MAAM,SAAS,UAAU,MAAM,QAAQ,MAAM,KAAK,GAAG;AACvD,iBAAW,QAAQ,MAAM,OAAO;AAC9B,+BAAuB,KAAK,MAAoB;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,MAAsB;AAC7C,SAAO,SAAS,MAAM,UAAU,KAAK,QAAQ,OAAO,EAAE,EAAE,QAAQ,OAAO,GAAG;AAC5E;AAEA,SAAS,aAAa,QAA8C;AAClE,SAAO,OAAO,YAAY,UAAU,CAAC,CAAC;AACxC;AAEA,SAAS,kBAAkB,QAAwC;AACjE,SAAO,OAAO,MAAM,UAAU,CAAC,CAAC;AAClC;AAEA,SAAS,qBAAqB,QAAwC;AACpE,SAAO,OAAO,MAAM,UAAU,CAAC,CAAC;AAClC;AAEA,SAAS,eAAe,UAAkB,WAGxC;AACA,QAAM,SAAS,OAAO,MAAM,QAAQ;AACpC,yBAAuB,MAAM;AAC7B,QAAM,iBAAiB,IAAI,cAAc;AACzC,QAAM,kBAA2C,CAAC;AAClD,QAAM,SAA6B,CAAC;AAEpC,aAAW,SAAS,QAAQ;AAC1B,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AACH;AAAA,MACF,KAAK,WAAW;AACd,cAAM,KAAK,eAAe,KAAK,MAAM,IAAI;AACzC,cAAM,OAAO,aAAa,MAAM,MAAM;AAEtC,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,OAAO,MAAM;AAAA,UACb;AAAA,UACA;AAAA,QACF,CAAC;AAED,YAAI,UAAU,IAAI,MAAM,KAAK,GAAG;AAC9B,0BAAgB,KAAK;AAAA,YACnB;AAAA,YACA,OAAO,MAAM;AAAA,YACb,OAAO,MAAM,QAAQ;AAAA,UACvB,CAAC;AAAA,QACH;AACA;AAAA,MACF;AAAA,MACA,KAAK;AACH,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,MAAM,aAAa,MAAM,MAAM;AAAA,QACjC,CAAC;AACD;AAAA,MACF,KAAK;AACH,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,MAAM,MAAM;AAAA,UACZ,UAAU,MAAM,MAAM,KAAK,KAAK;AAAA,QAClC,CAAC;AACD;AAAA,MACF,KAAK;AACH,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,MAAM;AAAA,UACf,OAAO,MAAM,MAAM,IAAI,CAAC,SAA0B,qBAAqB,KAAK,MAAM,CAAC;AAAA,QACrF,CAAC;AACD;AAAA,MACF,KAAK;AACH,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,MAAM,kBAAkB,MAAM,MAAM;AAAA,QACtC,CAAC;AACD;AAAA,MACF;AACE,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,MAAM,kBAAkB,CAAC,KAAK,CAAC;AAAA,QACjC,CAAC;AACD;AAAA,IACJ;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,gBAAgB;AACnC;AAEA,SAAS,oBAAoB,UAAsC;AACjE,QAAM,SAAS,OAAO,MAAM,QAAQ;AACpC,QAAM,UAAU,OAAO,KAAK,CAAC,UAAmC,MAAM,SAAS,aAAa,MAAM,UAAU,CAAC;AAE7G,SAAO,SAAS,KAAK,KAAK,KAAK;AACjC;AAEA,SAAS,UAAU,YAAoB,QAAgB,WAAkC;AACvF,QAAM,EAAE,MAAM,aAAa,QAAQ,IAAI,iBAAiB,MAAM;AAC9D,QAAM,OAAO,iBAAiB,UAAU;AACxC,QAAM,eAAe,SAAS,MAAM,CAAC,IAAI,KAAK,QAAQ,OAAO,EAAE,EAAE,MAAM,GAAG;AAC1E,QAAM,cAAc,kBAAkB,UAAU;AAChD,QAAM,UAAU,cAAc,eAAe,aAAa,MAAM,GAAG,EAAE;AACrE,QAAM,WAAW,aAAa,aAAa,SAAS,CAAC,KAAK;AAC1D,QAAM,gBAAgB,cAAe,oBAAoB,OAAO,KAAK,aAAc,YAAY,QAAQ;AACvG,QAAM,QAAQ,YAAY,OAAO,KAAK,KAAK;AAC3C,QAAM,WAAW,YAAY,UAAU,KAAK,MAAM,cAAc,aAAa;AAC7E,QAAM,EAAE,QAAQ,gBAAgB,IAAI,eAAe,SAAS,SAAS;AACrE,QAAM,KAAK,eAAe,SAAS,MAAM,GAAG,gBAAgB,IAAI,CAAC,WAAW,gBAAgB,IAAI;AAEhG,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,YAAY,aAAa,KAAK;AAAA,IAC3C,OAAO,YAAY,SAAS;AAAA,IAC5B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,UAAU,OAA6B;AAC9C,SAAO,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,MAAM,UAAU;AACtC,QAAI,KAAK,UAAU,MAAM,OAAO;AAC9B,aAAO,KAAK,QAAQ,MAAM;AAAA,IAC5B;AAEA,WAAO,KAAK,MAAM,cAAc,MAAM,KAAK;AAAA,EAC7C,CAAC;AACH;AAEA,SAAS,cAAc,MAAwB;AAC7C,MAAI,KAAK,aAAa;AACpB,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,GAAG,EAAE,KAAK,KAAK;AAC7D;AAEA,SAAS,aAAa,OAAmB,YAAyC;AAChF,QAAM,OAAO,oBAAI,IAAqB;AAEtC,aAAW,QAAQ,OAAO;AACxB,QAAI,UAAU;AACd,QAAI,cAAc;AAElB,eAAW,WAAW,KAAK,SAAS;AAClC,oBAAc,GAAG,WAAW,IAAI,OAAO;AACvC,YAAM,gBAAgB,WAAW,gBAAgB,OAAO;AAExD,UAAI,CAAC,QAAQ,IAAI,OAAO,GAAG;AACzB,gBAAQ,IAAI,SAAS;AAAA,UACnB,OAAO,eAAe,SAAS,YAAY,OAAO;AAAA,UAClD,OAAO,eAAe,SAAS;AAAA,UAC/B,OAAO,gBAAgB,WAAW;AAAA,UAClC,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,UAAU,oBAAI,IAAI;AAAA,QACpB,CAAC;AAAA,MACH;AAEA,gBAAU,QAAQ,IAAI,OAAO,EAAG;AAAA,IAClC;AAEA,UAAM,UAAU,cAAc,IAAI;AAClC,UAAM,mBAAmB,QAAQ,IAAI,OAAO;AAE5C,YAAQ,IAAI,SAAS;AAAA,MACnB,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,MAAM,KAAK;AAAA,MACX,QAAQ;AAAA,MACR,UAAU,kBAAkB,YAAY,oBAAI,IAAI;AAAA,IAClD,CAAC;AAAA,EACH;AAEA,QAAM,UAAU,CAAC,UACf,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS;AAC3C,UAAM,OAAsB;AAAA,MAC1B,OAAO,KAAK,SAAS,gBAAgB,KAAK,QAAQ,KAAK,KAAK;AAAA,MAC5D,OAAO,KAAK;AAAA,IACd;AAEA,UAAM,WAAW,QAAQ,KAAK,QAAQ;AAEtC,QAAI,KAAK,QAAQ,KAAK,QAAQ;AAC5B,WAAK,KAAK,KAAK;AAAA,IACjB;AAEA,QAAI,SAAS,SAAS,GAAG;AACvB,UAAI,KAAK,IAAI;AACX,cAAM,cAAc,GAAG,KAAK,KAAK;AAEjC,aAAK,WAAW;AAAA,UACd;AAAA,YACE,OAAO,KAAK;AAAA,YACZ,OAAO;AAAA,YACP,IAAI,KAAK;AAAA,UACX;AAAA,UACA,GAAG;AAAA,QACL;AACA,aAAK,QAAQ;AACb,eAAO,KAAK;AAAA,MACd,OAAO;AACL,aAAK,WAAW;AAAA,MAClB;AAAA,IACF;AAEA,WAAO;AAAA,EACT,CAAC;AAEH,SAAO,QAAQ,IAAI;AACrB;AAEO,SAAS,mBAAmB,EAAE,YAAY,cAAc,GAAiD;AAC9G,QAAM,YAAY,IAAI,IAAI,WAAW,KAAK,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC;AAE7D,QAAM,YAAY,OAAO,QAAQ,aAAa,EAC3C,IAAI,CAAC,CAAC,YAAY,MAAM,MAAM,UAAU,YAAY,QAAQ,SAAS,CAAC,EACtE,OAAO,CAAC,SAAS,KAAK,SAAS,GAAG,EAClC,KAAK,CAAC,MAAM,UAAU,KAAK,KAAK,cAAc,MAAM,IAAI,CAAC;AAE5D,QAAM,cAAc,aAAa,WAAW,UAAU;AACtD,QAAM,WAA2B;AAAA,IAC/B,OAAO,WAAW,MAAM,SAAS,WAAW,SAAS;AAAA,IACrD,aAAa,WAAW,MAAM;AAAA,IAC9B,WAAW,WAAW,MAAM;AAAA,IAC5B,QAAQ,WAAW,MAAM,UAAU;AAAA,IACnC,SAAS,WAAW,MAAM;AAAA,IAC1B,MAAM,WAAW,MAAM;AAAA,IACvB,WAAW,WAAW,MAAM;AAAA,EAC9B;AACA,QAAM,aAAyC;AAAA,IAC7C,SAAS,WAAW,QAAQ,WAAW;AAAA,IACvC,cAAc,WAAW,QAAQ,gBAAgB;AAAA,IACjD,cAAc,WAAW,QAAQ,gBAAgB;AAAA,IACjD,eAAe,WAAW,QAAQ,iBAAiB;AAAA,IACnD,aAAa,WAAW,QAAQ,eAAe;AAAA,IAC/C,aAAa,WAAW,QAAQ,eAAe;AAAA,IAC/C,qBAAqB,WAAW,QAAQ,uBAAuB;AAAA,IAC/D,mBAAmB,WAAW,QAAQ,qBAAqB;AAAA,EAC7D;AACA,QAAM,aAA+B;AAAA,IACnC,MAAM,WAAW,QAAQ,QAAQ;AAAA,IACjC,OAAO,WAAW,QAAQ;AAAA,EAC5B;AACA,QAAM,WAAqC;AAAA,IACzC,SAAS,WAAW,MAAM,WAAW;AAAA,IACrC,OAAO,WAAW,MAAM,SAAS;AAAA,IACjC,aAAa,WAAW,MAAM,eAAe;AAAA,IAC7C,UAAU,WAAW,MAAM,YAAY;AAAA,IACvC,eAAe,WAAW,MAAM,iBAAiB;AAAA,MAC/C,OAAO;AAAA,MACP,IAAI;AAAA,IACN;AAAA,IACA,iBAAiB,WAAW,MAAM,mBAAmB;AAAA,MACnD,OAAO;AAAA,MACP,MAAM,WAAW,MAAM;AAAA,IACzB;AAAA,EACF;AACA,QAAM,gBAA+C;AAAA,IACnD,OAAO,WAAW,WAAW,SAAS,CAAC;AAAA,IACvC,WAAW,WAAW,WAAW,aAAa;AAAA,EAChD;AACA,QAAM,iBAAuC,WAAW,cAAc,CAAC;AACvE,QAAM,gBAAgB,SAAS;AAC/B,QAAM,mBAAmB,WAAW,KAAK,gBAAgB;AAEzD,WAAS,kBAAkB,UAA4B;AACrD,UAAM,iBAAiB,aAAa,MAAM,MAAM,SAAS,QAAQ,OAAO,EAAE;AAE1E,WAAO,UAAU,KAAK,CAAC,SAAS,KAAK,SAAS,cAAc,KAAK,UAAU,CAAC;AAAA,EAC9E;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACveO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4C;AAC1C,QAAM,iBAAmC,UAAU,IAAI,CAAC,UAAU;AAAA,IAChE,MAAM,KAAK;AAAA,IACX,MAAM,KAAK;AAAA,IACX,WAAW;AAAA,EACb,EAAE;AAEF,QAAM,mBAAmB,CAAC,GAAG,SAAS,EAAE,KAAK,CAAC,MAAM,UAAU;AAC5D,QAAI,KAAK,UAAU,MAAM,OAAO;AAC9B,aAAO,KAAK,QAAQ,MAAM;AAAA,IAC5B;AAEA,WAAO,KAAK,KAAK,cAAc,MAAM,IAAI;AAAA,EAC3C,CAAC,EAAE,CAAC;AAEJ,QAAM,YAA4B,cAC9B;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,EACb,IACA,mBACE;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU,iBAAiB;AAAA,EAC7B,IACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,EACb;AAEN,QAAM,SAA2B,CAAC,WAAW,GAAG,cAAc;AAE9D,MAAI,mBAAmB;AACrB,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,MAAM;AAAA,MACN,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;AC8EO,SAAS,iBAAiB,QAAgC;AAC/D,SAAO;AACT;","names":[]}
|