bejamas 0.4.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -8,7 +8,7 @@ Use the `init` command to initialize dependencies for a new project.
8
8
 
9
9
  The `init` command installs dependencies, adds the `cn` util, and configures CSS variables for the project.
10
10
 
11
- Bejamas currently runs exact `shadcn` v4.6.0 for managed CLI commands. The Bejamas-specific `init`, `apply`, and `preset` flows preserve Astro preset switching, style support, and the legacy `--base-color` option.
11
+ Bejamas runs a pinned `shadcn` version for managed CLI commands. The Bejamas-specific `init`, `apply`, and `preset` flows preserve Astro preset switching, style support, and the legacy `--base-color` option.
12
12
 
13
13
  ```bash
14
14
  npx bejamas init
@@ -28,9 +28,16 @@ npx bejamas add [component]
28
28
 
29
29
  ```bash
30
30
  npx bejamas add button
31
+ npx bejamas add navigation-headers-01
32
+ npx bejamas add @bejamas/footer-01
31
33
  ```
32
34
 
33
- You can also run the command without any arguments to view a list of all available components:
35
+ Blocks are installed under `src/components/blocks/<block-id>` together with
36
+ their required UI components. In a monorepo, run the command from the app so
37
+ the block lands in the app while its UI dependencies go to the shared UI
38
+ package.
39
+
40
+ You can also run the command without any arguments to view a list of all available components and blocks:
34
41
 
35
42
  ```bash
36
43
  npx bejamas add
@@ -55,6 +62,15 @@ npx bejamas preset url <preset>
55
62
  npx bejamas preset resolve
56
63
  ```
57
64
 
65
+ ## bench
66
+
67
+ Use the `bench` command to compare an original site with its ported version: Lighthouse, route assets, accessibility, text and visual parity. It runs [`@bejamas/bench`](https://www.npmjs.com/package/@bejamas/bench) on demand and requires Google Chrome.
68
+
69
+ ```bash
70
+ npx bejamas bench --original http://localhost:3000 --ported http://localhost:4321
71
+ npx bejamas bench --help
72
+ ```
73
+
58
74
  ## Documentation
59
75
 
60
76
  Visit https://ui.bejamas.com/docs/cli to view the documentation.
@@ -1,4 +1,4 @@
1
- import { _ as getConfig, a as extractComponentTagsFromMDX, b as logger, c as extractPropsFromDeclaredProps, d as parseJsDocMetadata, f as resolveOutDir, g as spinner, h as toIdentifier, i as discoverExamples, l as normalizeBlockMDX, m as slugify, n as createSourceFileFromFrontmatter, o as extractFrontmatter, p as resolveUiRoot, r as detectHasImportTopLevel, s as extractPropsFromAstroProps, st as __require, t as RESERVED_COMPONENTS, u as normalizeUsageMDX } from "./utils-CyYWo_qS.js";
1
+ import { a as extractComponentTagsFromMDX, c as extractPropsFromDeclaredProps, ct as __require, d as parseJsDocMetadata, f as resolveOutDir, g as spinner, h as toIdentifier, i as discoverExamples, l as normalizeBlockMDX, m as slugify, n as createSourceFileFromFrontmatter, o as extractFrontmatter, p as resolveUiRoot, r as detectHasImportTopLevel, s as extractPropsFromAstroProps, t as RESERVED_COMPONENTS, u as normalizeUsageMDX, v as getConfig, x as logger } from "./utils-Dmd3Tydo.js";
2
2
  import { dirname, extname, join, relative } from "path";
3
3
  import { existsSync, mkdirSync } from "fs";
4
4
  import { readFile, readdir, writeFile } from "fs/promises";
@@ -105,7 +105,7 @@ function decodeEscapedScriptTags(source) {
105
105
  if (!source || !source.length) return source;
106
106
  return source.replace(/&lt;script&gt;/gi, "<script>").replace(/&lt;\/script&gt;/gi, "<\/script>");
107
107
  }
108
- const CONSOLE_SCRIPT_FENCE_LANGS = new Set([
108
+ const CONSOLE_SCRIPT_FENCE_LANGS = /* @__PURE__ */ new Set([
109
109
  "js",
110
110
  "ts",
111
111
  "javascript",
@@ -169,7 +169,7 @@ function extractFirstAstroFence(body) {
169
169
  const astroFenceIndex = fences.findIndex((fence) => fence.lang === "astro");
170
170
  if (astroFenceIndex === -1) return null;
171
171
  const astroFence = fences[astroFenceIndex];
172
- const consumedFenceIndexes = new Set([astroFenceIndex]);
172
+ const consumedFenceIndexes = /* @__PURE__ */ new Set([astroFenceIndex]);
173
173
  let companionSourceMD = "";
174
174
  let consoleScripts = [];
175
175
  let companionIntroMD = "";
@@ -364,8 +364,8 @@ function extractComponentTagsFromExamplesSections(sections) {
364
364
  /**
365
365
  * Check if an import path uses the new barrel export pattern (no .astro extension)
366
366
  */
367
- function isBarrelImport(path$1) {
368
- return !path$1.endsWith(".astro");
367
+ function isBarrelImport(path) {
368
+ return !path.endsWith(".astro");
369
369
  }
370
370
  /**
371
371
  * Convert a PascalCase component name to its folder path (kebab-case).
@@ -384,7 +384,12 @@ function componentToFolder(name) {
384
384
  "LinkGroup",
385
385
  "RadioGroup",
386
386
  "ButtonGroup",
387
- "StickySurface"
387
+ "StickySurface",
388
+ "DropdownMenu",
389
+ "NavigationMenu",
390
+ "ContextMenu",
391
+ "HoverCard",
392
+ "ToggleGroup"
388
393
  ].sort((a, b) => b.length - a.length);
389
394
  for (const family of sortedFamilies) if (name === family || name.startsWith(family)) return family.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase();
390
395
  const baseMatch = name.match(/^[A-Z][a-z]*/);
@@ -394,8 +399,6 @@ function resolveComponentFolder(name, componentFolderMap) {
394
399
  if (!componentFolderMap) return componentToFolder(name);
395
400
  const direct = componentFolderMap[name];
396
401
  if (direct && direct.length) return direct;
397
- const prefixMatch = Object.keys(componentFolderMap).filter((key) => name.startsWith(key)).sort((a, b) => b.length - a.length)[0];
398
- if (prefixMatch) return componentFolderMap[prefixMatch];
399
402
  return componentToFolder(name);
400
403
  }
401
404
  /**
@@ -419,6 +422,10 @@ function generateBarrelImports(components, componentsAlias, componentFolderMap)
419
422
  const sortedFolders = Array.from(groups.keys()).sort();
420
423
  for (const folder of sortedFolders) {
421
424
  const names = groups.get(folder).sort();
425
+ if (folder.endsWith(".astro")) {
426
+ for (const name of names) lines.push(`import ${name} from '${componentsAlias}/${folder}';`);
427
+ continue;
428
+ }
422
429
  lines.push(`import { ${names.join(", ")} } from '${componentsAlias}/${folder}';`);
423
430
  }
424
431
  return lines;
@@ -431,15 +438,23 @@ function generateDefaultImports(components, componentsAlias) {
431
438
  }
432
439
  function buildMdx(params) {
433
440
  const { importName, importPath, title, description, descriptionBodyMDX, usageMDX, hasImport, propsList, propsTable, examples, examplesSections, componentFolderMap, autoImports, lucideIcons, primaryExampleMDX, componentSource, commandName, figmaUrl, componentsAlias, namedExports, apiMDX } = params;
441
+ const available = params.availableComponents ? new Set(params.availableComponents) : null;
442
+ const missingFromNames = (names) => names.filter((name) => available && !available.has(name) && !RESERVED_COMPONENTS.has(name) && !/Icon$/.test(name));
443
+ const missingFromSnippet = (snippet) => missingFromNames([...new Set([...snippet.matchAll(/<([A-Z][A-Za-z0-9_]*)\b/g)].map((match) => match[1]))]);
444
+ const missingNotice = (names) => {
445
+ return `> Preview unavailable. Run \`bejamas add ${[...new Set(names.map((name) => resolveComponentFolder(name, componentFolderMap)))].sort().join(" ")}\` to install the required components, then regenerate the docs.`;
446
+ };
434
447
  const useBarrelPattern = isBarrelImport(importPath);
435
448
  const sortedLucide = (lucideIcons ?? []).slice().sort();
436
449
  const externalTopImports = [`import { Tabs as DocsTabs, TabItem as DocsTabItem } from '@astrojs/starlight/components';`, sortedLucide.length ? `import { ${sortedLucide.join(", ")} } from '@lucide/astro';` : null].filter((v) => v != null).slice().sort((a, b) => String(a).localeCompare(String(b)));
437
- const sortedUiAuto = (autoImports ?? []).slice().sort();
438
- const uiAutoLines = useBarrelPattern ? generateBarrelImports(sortedUiAuto, componentsAlias, componentFolderMap) : generateDefaultImports(sortedUiAuto, componentsAlias);
439
- const exampleLines = (examples ?? []).map((ex) => `import ${ex.importName} from '${ex.importPath}';`).sort((a, b) => a.localeCompare(b));
450
+ const sortedUiAuto = (autoImports ?? []).filter((name) => !available || available.has(name)).slice().sort();
451
+ const uiAutoLines = useBarrelPattern || componentFolderMap ? generateBarrelImports(sortedUiAuto, componentsAlias, componentFolderMap) : generateDefaultImports(sortedUiAuto, componentsAlias);
452
+ const exampleLines = (examples ?? []).filter((ex) => !missingFromSnippet(ex.source).length).map((ex) => `import ${ex.importName} from '${ex.importPath}';`).sort((a, b) => a.localeCompare(b));
440
453
  let mainImportLine = null;
441
- if (!hasImport) if (useBarrelPattern) mainImportLine = `import { ${[importName, ...namedExports ?? []].sort().join(", ")} } from '${importPath}';`;
442
- else mainImportLine = `import ${importName} from '${importPath}';`;
454
+ if (!hasImport) {
455
+ if (useBarrelPattern) mainImportLine = `import { ${[importName, ...namedExports ?? []].sort().join(", ")} } from '${importPath}';`;
456
+ else mainImportLine = `import ${importName} from '${importPath}';`;
457
+ }
443
458
  const internalTopImports = [
444
459
  mainImportLine,
445
460
  ...uiAutoLines,
@@ -450,7 +465,7 @@ function buildMdx(params) {
450
465
  externalTopImports.length && internalTopImports.length ? "" : null,
451
466
  ...internalTopImports
452
467
  ].filter((v) => v !== null && v !== void 0);
453
- const extractTags$1 = (snippet) => {
468
+ const extractTags = (snippet) => {
454
469
  const found = /* @__PURE__ */ new Set();
455
470
  const tagRegex = /<([A-Z][A-Za-z0-9_]*)\b/g;
456
471
  let m;
@@ -459,7 +474,7 @@ function buildMdx(params) {
459
474
  };
460
475
  const buildSnippetImportLines = (snippet) => {
461
476
  if (!snippet || !snippet.length) return [];
462
- const used = extractTags$1(snippet);
477
+ const used = extractTags(snippet);
463
478
  const usedIcons = sortedLucide.filter((n) => used.has(n));
464
479
  const usedUi = (autoImports ?? []).filter((n) => used.has(n));
465
480
  const includeMain = !hasImport && used.has(importName);
@@ -475,7 +490,7 @@ function buildMdx(params) {
475
490
  if (usedUi.length > 0) internal.push(...generateBarrelImports(usedUi, componentsAlias, componentFolderMap));
476
491
  } else {
477
492
  if (includeMain) internal.push(`import ${importName} from '${importPath}';`);
478
- internal.push(...usedUi.slice().sort().map((name) => `import ${name} from '${componentsAlias}/${name}.astro';`));
493
+ internal.push(...componentFolderMap ? generateBarrelImports(usedUi, componentsAlias, componentFolderMap) : generateDefaultImports(usedUi, componentsAlias));
479
494
  }
480
495
  const externalSorted = external.slice().sort((a, b) => a.localeCompare(b));
481
496
  const internalSorted = internal.slice().sort((a, b) => a.localeCompare(b));
@@ -541,13 +556,15 @@ function buildMdx(params) {
541
556
  const { enableConsolePanel = false, consoleScripts = [] } = options;
542
557
  const extracted = extractInlineScripts(snippet);
543
558
  const resolvedConsoleScripts = enableConsolePanel && consoleScripts.length ? consoleScripts : enableConsolePanel ? extracted.scripts : [];
544
- const withConvertedParagraphs = convertParagraphsWithComponents(extracted.markup.replace(/<!--([\s\S]*?)-->/g, "{/*$1*/}"));
559
+ const withoutComments = extracted.markup.replace(/<!--([\s\S]*?)-->/g, "{/*$1*/}");
560
+ const withConvertedParagraphs = convertParagraphsWithComponents(withoutComments);
545
561
  if (/<p[\s>]/i.test(withConvertedParagraphs)) return {
546
562
  markup: normalizeInlineWhitespace(withConvertedParagraphs),
547
563
  scripts: resolvedConsoleScripts
548
564
  };
565
+ const normalized = normalizeInlineWhitespace(withConvertedParagraphs);
549
566
  return {
550
- markup: wrapTextNodes(normalizeInlineWhitespace(withConvertedParagraphs)),
567
+ markup: wrapTextNodes(normalized),
551
568
  scripts: resolvedConsoleScripts
552
569
  };
553
570
  };
@@ -669,6 +686,8 @@ function buildMdx(params) {
669
686
  return parts.join("\n");
670
687
  };
671
688
  const renderPreviewBlock = (snippet, options = {}) => {
689
+ const missing = missingFromSnippet(snippet);
690
+ if (missing.length) return missingNotice(missing);
672
691
  const { enableConsolePanel = false } = options;
673
692
  const preparedPreview = toMdxPreview(snippet, options);
674
693
  if (!preparedPreview.markup || !preparedPreview.markup.length) return "";
@@ -691,6 +710,11 @@ ${preparedPreview.markup}
691
710
  };
692
711
  const renderAstroPreviewsInMarkdown = (block, config = {}) => {
693
712
  if (!block || !block.length) return block;
713
+ const missingRaw = missingFromNames(extractComponentTagsFromPreviewMarkdown(block, {
714
+ defaultPreview: false,
715
+ allowForcedPreview: false
716
+ }));
717
+ if (missingRaw.length) return `${missingNotice(missingRaw)}\n\n\`\`\`\`mdx\n${block}\n\`\`\`\``;
694
718
  const { defaultPreview = true, allowForcedPreview = true } = config;
695
719
  const lines = block.split("\n");
696
720
  const out = [];
@@ -818,7 +842,7 @@ ${(() => {
818
842
  const renderExampleItem = (headingLevel, headingTitle, body) => {
819
843
  const prepared = prepareExampleContent(body);
820
844
  const blocks = [`${headingLevel} ${headingTitle}`];
821
- if (prepared.descriptionMD && prepared.descriptionMD.length) blocks.push(prepared.descriptionMD);
845
+ if (prepared.descriptionMD && prepared.descriptionMD.length) blocks.push(renderAstroPreviewsInMarkdown(prepared.descriptionMD));
822
846
  if (prepared.snippet && prepared.snippet.length && prepared.sourceCode && prepared.sourceCode.length && !prepared.skipPreview) blocks.push(renderPreviewBlock(prepared.snippet, {
823
847
  enableConsolePanel: prepared.enableConsolePanel,
824
848
  consoleScripts: prepared.consoleScripts
@@ -834,7 +858,7 @@ ${sourceBlock}
834
858
  \`\`\``);
835
859
  if (prepared.companionIntroMD && prepared.companionIntroMD.length && !prepared.mergeCompanionWithSource) blocks.push(prepared.companionIntroMD);
836
860
  if (prepared.companionSourceMD && prepared.companionSourceMD.length && !prepared.mergeCompanionWithSource) blocks.push(renderCompanionSourceMD(prepared.companionSourceMD));
837
- if (prepared.trailingDescriptionMD && prepared.trailingDescriptionMD.length) blocks.push(prepared.trailingDescriptionMD);
861
+ if (prepared.trailingDescriptionMD && prepared.trailingDescriptionMD.length) blocks.push(renderAstroPreviewsInMarkdown(prepared.trailingDescriptionMD));
838
862
  }
839
863
  return blocks.join("\n\n");
840
864
  };
@@ -845,7 +869,7 @@ ${sourceBlock}
845
869
  const sectionParts = [];
846
870
  const hasSectionTitle = !!(section.title && section.title.length);
847
871
  if (hasSectionTitle) sectionParts.push(`### ${section.title}`);
848
- if (section.introMD && section.introMD.length) sectionParts.push(section.introMD);
872
+ if (section.introMD && section.introMD.length) sectionParts.push(renderAstroPreviewsInMarkdown(section.introMD));
849
873
  if (section.items && section.items.length) {
850
874
  const itemHeadingLevel = hasSectionTitle ? "####" : "###";
851
875
  for (const item of section.items) sectionParts.push(renderExampleItem(itemHeadingLevel, item.title, item.body));
@@ -862,9 +886,9 @@ ${sourceBlock}
862
886
  }
863
887
  if (examples && examples.length) for (const ex of examples) renderedExampleSections.push(`### ${ex.title}
864
888
 
865
- <div class="not-content">
889
+ ${missingFromSnippet(ex.source).length ? missingNotice(missingFromSnippet(ex.source)) : `<div class="not-content">
866
890
  <${ex.importName} />
867
- </div>
891
+ </div>`}
868
892
 
869
893
  \`\`\`astro
870
894
  ${ex.source}
@@ -948,15 +972,16 @@ ${ex.source}
948
972
  */
949
973
  async function discoverComponents(componentsDir) {
950
974
  const entries = [];
951
- const dirEntries = await readdir(componentsDir, { withFileTypes: true });
975
+ const dirEntries = (await readdir(componentsDir, { withFileTypes: true })).sort((a, b) => a.name.localeCompare(b.name));
952
976
  for (const entry of dirEntries) if (entry.isDirectory()) {
953
977
  const folderPath = join(componentsDir, entry.name);
954
978
  const indexPath = join(folderPath, "index.ts");
955
979
  if (existsSync(indexPath)) {
956
- const namedExports = parseBarrelExports(await readFile(indexPath, "utf-8"));
980
+ const localExports = parseBarrelExports(await readFile(indexPath, "utf-8")).filter(({ file }) => dirname(join(folderPath, file)) === folderPath && existsSync(join(folderPath, file)));
981
+ const namedExports = localExports.map(({ name }) => name);
957
982
  const mainComponentName = findMainComponent(namedExports, entry.name);
958
983
  if (mainComponentName) {
959
- const mainFilePath = join(folderPath, `${mainComponentName}.astro`);
984
+ const mainFilePath = join(folderPath, localExports.find(({ name }) => name === mainComponentName).file);
960
985
  if (existsSync(mainFilePath)) {
961
986
  const subComponents = namedExports.filter((n) => n !== mainComponentName);
962
987
  entries.push({
@@ -979,12 +1004,17 @@ async function discoverComponents(componentsDir) {
979
1004
  namedExports: []
980
1005
  });
981
1006
  }
982
- return entries;
1007
+ const nestedNames = new Set(entries.filter((entry) => entry.isFolder).map((entry) => entry.name));
1008
+ return entries.filter((entry) => entry.isFolder || !nestedNames.has(entry.name));
983
1009
  }
984
1010
  function buildComponentFolderMap(components) {
985
1011
  const map = {};
986
1012
  for (const component of components) {
987
- if (!component.isFolder || !component.folderName) continue;
1013
+ if (!component.isFolder) {
1014
+ map[component.name] = `${component.name}.astro`;
1015
+ continue;
1016
+ }
1017
+ if (!component.folderName) continue;
988
1018
  map[component.name] = component.folderName;
989
1019
  for (const sub of component.namedExports) map[sub] = component.folderName;
990
1020
  }
@@ -998,9 +1028,12 @@ function buildComponentFolderMap(components) {
998
1028
  */
999
1029
  function parseBarrelExports(content) {
1000
1030
  const exports = [];
1001
- const exportRegex = /export\s*\{\s*default\s+as\s+(\w+)\s*\}/g;
1031
+ const exportRegex = /export\s*\{\s*default\s+as\s+(\w+)\s*\}\s*from\s*["'](\.\/[^"']+\.astro)["']/g;
1002
1032
  let match;
1003
- while ((match = exportRegex.exec(content)) !== null) exports.push(match[1]);
1033
+ while ((match = exportRegex.exec(content)) !== null) exports.push({
1034
+ name: match[1],
1035
+ file: match[2]
1036
+ });
1004
1037
  return exports;
1005
1038
  }
1006
1039
  /**
@@ -1020,7 +1053,7 @@ async function main() {
1020
1053
  const config = await getConfig(cwd);
1021
1054
  const componentsAlias = (config?.aliases?.ui || config?.aliases?.components || "@bejamas/ui/components").replace(/\/$/, "");
1022
1055
  const componentsDirFromConfig = config?.resolvedPaths?.ui || config?.resolvedPaths?.components;
1023
- let uiRoot = resolveUiRoot(cwd);
1056
+ let uiRoot = componentsDirFromConfig ? dirname(dirname(componentsDirFromConfig)) : resolveUiRoot(cwd);
1024
1057
  let componentsDir = join(uiRoot, "src", "components");
1025
1058
  if (componentsDirFromConfig) {
1026
1059
  componentsDir = componentsDirFromConfig;
@@ -1037,6 +1070,8 @@ async function main() {
1037
1070
  }
1038
1071
  const components = await discoverComponents(componentsDir);
1039
1072
  const componentFolderMap = buildComponentFolderMap(components);
1073
+ const availableComponents = Object.keys(componentFolderMap);
1074
+ const rewriteAliases = (source) => source.replace(/@bejamas\/ui\/components(?=[/"'])/g, componentsAlias).replace(/@bejamas\/(?:ui|registry)\/lib\/utils(?=["'])/g, config?.aliases?.utils ?? "@/lib/utils").replace(/@bejamas\/(?:ui|registry)\/lib(?=[/"'])/g, config?.aliases?.lib ?? "@/lib");
1040
1075
  if (DEBUG) {
1041
1076
  logger.info(`[docs-generator] components found: ${components.length}`);
1042
1077
  if (components.length) logger.info(`[docs-generator] first few: ${components.slice(0, 5).map((c) => c.name).join(", ")}`);
@@ -1049,7 +1084,7 @@ async function main() {
1049
1084
  const astroFile = await readFile(filePath, "utf-8");
1050
1085
  const frontmatterCode = extractFrontmatter(astroFile);
1051
1086
  const sourceFile = createSourceFileFromFrontmatter(frontmatterCode);
1052
- const meta = parseJsDocMetadata(frontmatterCode);
1087
+ const meta = parseJsDocMetadata(rewriteAliases(frontmatterCode));
1053
1088
  const declaredProps = extractPropsFromDeclaredProps(sourceFile);
1054
1089
  const destructuredProps = extractPropsFromAstroProps(sourceFile);
1055
1090
  const defaultsMap = /* @__PURE__ */ new Map();
@@ -1081,9 +1116,10 @@ async function main() {
1081
1116
  if (parsedExamplesSections.length === 0) {
1082
1117
  exampleRelPaths = await discoverExamples(filePath, componentsDir);
1083
1118
  examples = (exampleRelPaths || []).map((rel) => {
1084
- const importPathEx = `${componentsAlias}/${rel.split(__require("path").sep).join(__require("path").posix.sep)}`;
1119
+ const posixRel = rel.split(__require("path").sep).join(__require("path").posix.sep);
1120
+ const importPathEx = `${componentsAlias}/${posixRel}`;
1085
1121
  const abs = join(componentsDir, rel);
1086
- const source = __require("fs").readFileSync(abs, "utf-8");
1122
+ const source = rewriteAliases(__require("fs").readFileSync(abs, "utf-8"));
1087
1123
  const base = toIdentifier(__require("path").basename(rel, __require("path").extname(rel)));
1088
1124
  return {
1089
1125
  importName: `${pascal}${base}`,
@@ -1101,7 +1137,7 @@ async function main() {
1101
1137
  defaultPreview: false,
1102
1138
  allowForcedPreview: false
1103
1139
  }).filter((n) => n !== pascal);
1104
- const autoSet = new Set([
1140
+ const autoSet = /* @__PURE__ */ new Set([
1105
1141
  ...usedInUsage,
1106
1142
  ...usedInDescription,
1107
1143
  ...usedInExamples,
@@ -1110,9 +1146,12 @@ async function main() {
1110
1146
  ]);
1111
1147
  const usedNamedExports = isFolder ? namedExports.filter((n) => autoSet.has(n)) : [];
1112
1148
  if (isFolder) for (const n of namedExports) autoSet.delete(n);
1113
- const autoImports = Array.from(autoSet).filter((name) => !RESERVED_COMPONENTS.has(name)).filter((name) => true);
1114
- const lucideIcons = autoImports.filter((n) => /Icon$/.test(n));
1115
- const uiAutoImports = autoImports.filter((n) => !/Icon$/.test(n));
1149
+ const autoImports = Array.from(autoSet).filter((name) => !RESERVED_COMPONENTS.has(name));
1150
+ const isLucideIcon = (name) => /Icon$/.test(name) && !componentFolderMap[name];
1151
+ const lucideIcons = autoImports.filter(isLucideIcon);
1152
+ const uiAutoImports = autoImports.filter((name) => !isLucideIcon(name));
1153
+ const missingComponents = uiAutoImports.filter((name) => !availableComponents.includes(name));
1154
+ if (missingComponents.length) logger.warn(`${slug}.mdx: previews require ${missingComponents.sort().join(", ")}; keeping their source examples without executing them.`);
1116
1155
  const mdx = buildMdx({
1117
1156
  importName,
1118
1157
  importPath,
@@ -1125,6 +1164,7 @@ async function main() {
1125
1164
  examples,
1126
1165
  examplesSections: parsedExamplesSections,
1127
1166
  componentFolderMap,
1167
+ availableComponents,
1128
1168
  autoImports: uiAutoImports,
1129
1169
  lucideIcons,
1130
1170
  primaryExampleMDX,
@@ -1145,7 +1185,9 @@ async function main() {
1145
1185
  }
1146
1186
  spin.succeed(`Created ${generatedCount} file${generatedCount === 1 ? "" : "s"}:`);
1147
1187
  components.map((c) => {
1148
- return relative(cwd, join(outDir, `${slugify(c.name)}.mdx`));
1188
+ const slug = slugify(c.name);
1189
+ const outFile = join(outDir, `${slug}.mdx`);
1190
+ return relative(cwd, outFile);
1149
1191
  }).sort((a, b) => a.localeCompare(b)).forEach((p) => {
1150
1192
  logger.log(` - ${p}`);
1151
1193
  });
@@ -1161,4 +1203,4 @@ if (process.env.BEJAMAS_SKIP_AUTO_RUN !== "1" && process.env.BEJAMAS_SKIP_AUTO_R
1161
1203
 
1162
1204
  //#endregion
1163
1205
  export { runDocsGenerator };
1164
- //# sourceMappingURL=generate-mdx-Ce7A9Uxe.js.map
1206
+ //# sourceMappingURL=generate-mdx-Cb8rPipn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-mdx-Cb8rPipn.js","names":["titleEx"],"sources":["../src/docs/generate-mdx/examples.ts","../src/docs/generate-mdx/mdx-builder.ts","../src/docs/generate-mdx/index.ts"],"sourcesContent":["export interface ParsedExampleItem {\n title: string;\n body: string;\n}\n\nexport interface ParsedExampleSection {\n /**\n * Null means \"implicit section\" (no explicit ## heading in @examples).\n */\n title: string | null;\n /**\n * Markdown text that appears between a ## section heading and the first ### item.\n * For implicit sections, this is content before the first ### heading.\n */\n introMD: string;\n items: ParsedExampleItem[];\n}\n\nexport interface PreparedExampleContent {\n descriptionMD: string;\n /**\n * Renderable snippet used in preview (markup only).\n */\n snippet: string;\n /**\n * Source code shown in the code block.\n */\n sourceCode: string;\n /**\n * True when source came from an explicit ```astro fenced block.\n */\n sourceFromFence: boolean;\n /**\n * True when the fenced astro block includes the `nopreview` flag.\n */\n skipPreview: boolean;\n /**\n * True when the fenced astro block includes the `console` flag.\n */\n enableConsolePanel: boolean;\n /**\n * Explicit console scripts sourced from an adjacent JS/TS fence.\n */\n consoleScripts: string[];\n /**\n * Raw markdown for a paired source fence that should render after the astro block.\n */\n companionSourceMD: string;\n /**\n * Markdown that appears between the astro fence and its paired JS/TS fence.\n */\n companionIntroMD: string;\n /**\n * Markdown that appears after a paired JS/TS fence.\n */\n trailingDescriptionMD: string;\n /**\n * True when the paired JS/TS fence had no prose between it and the astro fence.\n */\n mergeCompanionWithSource: boolean;\n}\n\nexport interface FenceInfo {\n lang: string;\n flags: Set<string>;\n}\n\ninterface PreviewRenderConfig {\n defaultPreview?: boolean;\n allowForcedPreview?: boolean;\n}\n\ntype MutableSection = {\n title: string | null;\n intro: string[];\n items: Array<{ title: string; body: string[] }>;\n};\n\ntype MutableItem = { title: string; body: string[] };\n\nfunction createImplicitSection(): MutableSection {\n return { title: null, intro: [], items: [] };\n}\n\nfunction normalizeSection(section: MutableSection): ParsedExampleSection {\n return {\n title: section.title,\n introMD: section.intro.join(\"\\n\").trim(),\n items: section.items.map((item) => ({\n title: item.title,\n body: item.body.join(\"\\n\").trim(),\n })),\n };\n}\n\nfunction pushItem(section: MutableSection | null, item: MutableItem | null): void {\n if (!section || !item) return;\n if (!item.title.trim().length && !item.body.join(\"\\n\").trim().length) return;\n section.items.push(item);\n}\n\nfunction pushSection(\n sections: ParsedExampleSection[],\n section: MutableSection | null,\n): void {\n if (!section) return;\n const normalized = normalizeSection(section);\n if (\n !normalized.title &&\n !normalized.introMD.length &&\n normalized.items.length === 0\n ) {\n return;\n }\n sections.push(normalized);\n}\n\nfunction extractHeading(line: string, level: 2 | 3): string | null {\n const pattern = level === 2 ? /^##(?!#)\\s+(.+)$/ : /^###(?!#)\\s+(.+)$/;\n const match = line.trim().match(pattern);\n return match ? match[1].trim() : null;\n}\n\nfunction splitDescriptionAndSnippetRaw(body: string): {\n descriptionMD: string;\n snippet: string;\n} {\n if (!body || !body.trim().length) return { descriptionMD: \"\", snippet: \"\" };\n const lines = body.split(\"\\n\");\n let snippetStartIdx = -1;\n for (let i = 0; i < lines.length; i += 1) {\n const ln = lines[i];\n if (!ln.trim().length) continue;\n if (/^\\s*[<{]/.test(ln)) {\n snippetStartIdx = i;\n break;\n }\n }\n if (snippetStartIdx <= 0) {\n return { descriptionMD: \"\", snippet: body.trim() };\n }\n return {\n descriptionMD: lines.slice(0, snippetStartIdx).join(\"\\n\").trim(),\n snippet: lines.slice(snippetStartIdx).join(\"\\n\").trim(),\n };\n}\n\nfunction splitAstroFrontmatter(sourceCode: string): {\n frontmatter: string;\n markup: string;\n} {\n const match = sourceCode.match(/^---\\n([\\s\\S]*?)\\n---\\n?([\\s\\S]*)$/);\n if (!match) {\n return { frontmatter: \"\", markup: sourceCode.trim() };\n }\n return {\n frontmatter: match[1].trim(),\n markup: match[2].trim(),\n };\n}\n\nfunction stripFrontmatterComments(frontmatter: string): string {\n if (!frontmatter || !frontmatter.length) return \"\";\n return frontmatter\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\\n\")\n .replace(/^[ \\t]*\\/\\/.*$/gm, \"\")\n .trim();\n}\n\nfunction isImportOnlyFrontmatter(frontmatter: string): boolean {\n const cleaned = stripFrontmatterComments(frontmatter);\n if (!cleaned.length) return true;\n\n let remaining = cleaned;\n const importFromPattern =\n /(?:^|\\n)\\s*import\\s+(?:type\\s+)?[\\s\\S]*?\\s+from\\s+['\"][^'\"]+['\"]\\s*;?(?=\\n|$)/g;\n const importSideEffectPattern =\n /(?:^|\\n)\\s*import\\s+['\"][^'\"]+['\"]\\s*;?(?=\\n|$)/g;\n const exportFromPattern =\n /(?:^|\\n)\\s*export\\s+(?:\\*\\s+from|\\{[\\s\\S]*?\\}\\s+from)\\s+['\"][^'\"]+['\"]\\s*;?(?=\\n|$)/g;\n\n remaining = remaining\n .replace(importFromPattern, \"\\n\")\n .replace(importSideEffectPattern, \"\\n\")\n .replace(exportFromPattern, \"\\n\")\n .trim();\n\n return remaining.replace(/[;\\s]/g, \"\").length === 0;\n}\n\nfunction isAstroFrontmatterPreviewUnsafe(frontmatter: string): boolean {\n const cleaned = stripFrontmatterComments(frontmatter);\n if (!cleaned.length) return false;\n\n const runtimeTokenPattern =\n /\\b(?:const|let|var|function|class|if|for|while|switch|try|catch|return|throw|await|new)\\b|=>|Astro\\./;\n if (runtimeTokenPattern.test(cleaned)) return true;\n\n return !isImportOnlyFrontmatter(cleaned);\n}\n\nexport function parseFenceInfo(infoRaw: string): FenceInfo {\n const parts = (infoRaw || \"\")\n .trim()\n .split(/\\s+/)\n .filter((v) => v.length)\n .map((v) => v.toLowerCase());\n if (!parts.length) return { lang: \"\", flags: new Set<string>() };\n const [lang, ...flags] = parts;\n return { lang, flags: new Set(flags) };\n}\n\nexport function decodeEscapedScriptTags(source: string): string {\n if (!source || !source.length) return source;\n return source\n .replace(/&lt;script&gt;/gi, \"<script>\")\n .replace(/&lt;\\/script&gt;/gi, \"</script>\");\n}\n\ntype ParsedFenceBlock = {\n openLine: string;\n closeLine: string;\n lang: string;\n flags: Set<string>;\n body: string;\n startLine: number;\n endLine: number;\n};\n\nconst CONSOLE_SCRIPT_FENCE_LANGS = new Set([\n \"js\",\n \"ts\",\n \"javascript\",\n \"typescript\",\n]);\n\nfunction parseFenceBlocks(body: string): {\n lines: string[];\n fences: ParsedFenceBlock[];\n} {\n const lines = body.split(\"\\n\");\n const fences: ParsedFenceBlock[] = [];\n let active:\n | {\n startLine: number;\n openLine: string;\n lang: string;\n flags: Set<string>;\n bodyLines: string[];\n }\n | null = null;\n\n for (let i = 0; i < lines.length; i += 1) {\n const line = lines[i];\n const trimmed = line.trim();\n if (!trimmed.startsWith(\"```\")) {\n if (active) active.bodyLines.push(line);\n continue;\n }\n\n if (!active) {\n const parsed = parseFenceInfo(trimmed.slice(3).trim());\n active = {\n startLine: i,\n openLine: line,\n lang: parsed.lang,\n flags: parsed.flags,\n bodyLines: [],\n };\n continue;\n }\n\n fences.push({\n openLine: active.openLine,\n closeLine: line,\n lang: active.lang,\n flags: active.flags,\n body: active.bodyLines.join(\"\\n\"),\n startLine: active.startLine,\n endLine: i,\n });\n active = null;\n }\n\n return { lines, fences };\n}\n\nfunction serializeFenceBlock(fence: ParsedFenceBlock): string {\n const parts = [fence.openLine];\n if (fence.body.length) parts.push(fence.body);\n parts.push(fence.closeLine);\n return parts.join(\"\\n\");\n}\n\nfunction buildRemainingMarkdown(\n lines: string[],\n fences: ParsedFenceBlock[],\n consumedFenceIndexes: Set<number>,\n): string {\n const skippedLines = new Set<number>();\n for (const [index, fence] of fences.entries()) {\n if (!consumedFenceIndexes.has(index)) continue;\n for (let line = fence.startLine; line <= fence.endLine; line += 1) {\n skippedLines.add(line);\n }\n }\n\n return lines\n .filter((_, index) => !skippedLines.has(index))\n .join(\"\\n\")\n .trim();\n}\n\nfunction extractFirstAstroFence(body: string): {\n sourceCode: string;\n descriptionMD: string;\n skipPreview: boolean;\n enableConsolePanel: boolean;\n consoleScripts: string[];\n companionSourceMD: string;\n companionIntroMD: string;\n trailingDescriptionMD: string;\n mergeCompanionWithSource: boolean;\n} | null {\n if (!body || !body.trim().length) return null;\n const { lines, fences } = parseFenceBlocks(body);\n const astroFenceIndex = fences.findIndex((fence) => fence.lang === \"astro\");\n if (astroFenceIndex === -1) return null;\n\n const astroFence = fences[astroFenceIndex];\n const consumedFenceIndexes = new Set<number>([astroFenceIndex]);\n let companionSourceMD = \"\";\n let consoleScripts: string[] = [];\n let companionIntroMD = \"\";\n let trailingDescriptionMD = \"\";\n let mergeCompanionWithSource = false;\n\n if (astroFence.flags.has(\"console\")) {\n const nextFence = fences[astroFenceIndex + 1];\n if (nextFence && CONSOLE_SCRIPT_FENCE_LANGS.has(nextFence.lang)) {\n consumedFenceIndexes.add(astroFenceIndex + 1);\n companionSourceMD = serializeFenceBlock(nextFence);\n companionIntroMD = lines\n .slice(astroFence.endLine + 1, nextFence.startLine)\n .join(\"\\n\")\n .trim();\n trailingDescriptionMD = lines.slice(nextFence.endLine + 1).join(\"\\n\").trim();\n mergeCompanionWithSource = companionIntroMD.length === 0;\n const normalizedScript = nextFence.body.trim();\n if (normalizedScript.length) {\n consoleScripts = [normalizedScript];\n }\n }\n }\n\n const descriptionMD = companionSourceMD.length\n ? lines.slice(0, astroFence.startLine).join(\"\\n\").trim()\n : buildRemainingMarkdown(lines, fences, consumedFenceIndexes);\n\n return {\n sourceCode: decodeEscapedScriptTags(astroFence.body.trim()),\n descriptionMD,\n skipPreview: astroFence.flags.has(\"nopreview\"),\n enableConsolePanel: astroFence.flags.has(\"console\"),\n consoleScripts,\n companionSourceMD,\n companionIntroMD,\n trailingDescriptionMD,\n mergeCompanionWithSource,\n };\n}\n\nexport function parseExamplesSections(examplesMDX: string): ParsedExampleSection[] {\n if (!examplesMDX || !examplesMDX.trim().length) return [];\n\n const sections: ParsedExampleSection[] = [];\n const lines = examplesMDX.split(\"\\n\");\n let currentSection: MutableSection | null = null;\n let currentItem: MutableItem | null = null;\n let inFence = false;\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n if (trimmed.startsWith(\"```\")) {\n inFence = !inFence;\n if (!currentSection) currentSection = createImplicitSection();\n if (currentItem) currentItem.body.push(line);\n else currentSection.intro.push(line);\n continue;\n }\n\n if (!inFence) {\n const h2 = extractHeading(line, 2);\n if (h2) {\n pushItem(currentSection, currentItem);\n currentItem = null;\n pushSection(sections, currentSection);\n currentSection = { title: h2, intro: [], items: [] };\n continue;\n }\n\n const h3 = extractHeading(line, 3);\n if (h3) {\n if (!currentSection) currentSection = createImplicitSection();\n pushItem(currentSection, currentItem);\n currentItem = { title: h3, body: [] };\n continue;\n }\n }\n\n if (!currentSection) currentSection = createImplicitSection();\n if (currentItem) currentItem.body.push(line);\n else currentSection.intro.push(line);\n }\n\n pushItem(currentSection, currentItem);\n pushSection(sections, currentSection);\n return sections;\n}\n\nexport function prepareExampleContent(body: string): PreparedExampleContent {\n if (!body || !body.trim().length) {\n return {\n descriptionMD: \"\",\n snippet: \"\",\n sourceCode: \"\",\n sourceFromFence: false,\n skipPreview: false,\n enableConsolePanel: false,\n consoleScripts: [],\n companionSourceMD: \"\",\n companionIntroMD: \"\",\n trailingDescriptionMD: \"\",\n mergeCompanionWithSource: false,\n };\n }\n\n const fenced = extractFirstAstroFence(body);\n if (fenced) {\n const { frontmatter, markup } = splitAstroFrontmatter(fenced.sourceCode);\n const unsafeFrontmatter = isAstroFrontmatterPreviewUnsafe(frontmatter);\n return {\n descriptionMD: fenced.descriptionMD,\n snippet: markup,\n sourceCode: fenced.sourceCode,\n sourceFromFence: true,\n skipPreview: fenced.skipPreview || unsafeFrontmatter,\n enableConsolePanel: fenced.enableConsolePanel,\n consoleScripts: fenced.consoleScripts,\n companionSourceMD: fenced.companionSourceMD,\n companionIntroMD: fenced.companionIntroMD,\n trailingDescriptionMD: fenced.trailingDescriptionMD,\n mergeCompanionWithSource: fenced.mergeCompanionWithSource,\n };\n }\n\n const split = splitDescriptionAndSnippetRaw(body);\n return {\n descriptionMD: split.descriptionMD,\n snippet: split.snippet,\n sourceCode: split.snippet,\n sourceFromFence: false,\n skipPreview: false,\n enableConsolePanel: false,\n consoleScripts: [],\n companionSourceMD: \"\",\n companionIntroMD: \"\",\n trailingDescriptionMD: \"\",\n mergeCompanionWithSource: false,\n };\n}\n\nfunction extractTags(block: string): string[] {\n if (!block || !block.length) return [];\n const found = new Set<string>();\n const tagRegex = /<([A-Z][A-Za-z0-9_]*)\\b/g;\n let match: RegExpExecArray | null;\n while ((match = tagRegex.exec(block)) !== null) {\n found.add(match[1]);\n }\n return Array.from(found);\n}\n\nexport function extractComponentTagsFromPreviewMarkdown(\n block: string,\n config: PreviewRenderConfig = {},\n): string[] {\n if (!block || !block.length) return [];\n const { defaultPreview = true, allowForcedPreview = true } = config;\n const found = new Set<string>();\n const lines = block.split(\"\\n\");\n let inFence = false;\n let fenceOpen = \"\";\n let currentFenceLang = \"\";\n let currentFenceFlags = new Set<string>();\n const fenceBody: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.startsWith(\"```\")) {\n if (!inFence) {\n inFence = true;\n fenceOpen = line;\n const parsed = parseFenceInfo(trimmed.slice(3).trim());\n currentFenceLang = parsed.lang;\n currentFenceFlags = parsed.flags;\n fenceBody.length = 0;\n continue;\n }\n\n if (currentFenceLang === \"astro\") {\n const sourceCode = fenceBody.join(\"\\n\").trim();\n const prepared = prepareExampleContent(\n `${fenceOpen}\\n${sourceCode}\\n${line}`,\n );\n const hasForcedPreviewFlag =\n currentFenceFlags.has(\"preview\") || currentFenceFlags.has(\"console\");\n const shouldPreview =\n !prepared.skipPreview &&\n (defaultPreview || (allowForcedPreview && hasForcedPreviewFlag));\n if (shouldPreview) {\n for (const tag of extractTags(prepared.snippet)) found.add(tag);\n }\n }\n\n inFence = false;\n fenceOpen = \"\";\n currentFenceLang = \"\";\n currentFenceFlags = new Set<string>();\n fenceBody.length = 0;\n continue;\n }\n\n if (inFence) {\n fenceBody.push(line);\n continue;\n }\n\n for (const tag of extractTags(line)) found.add(tag);\n }\n\n return Array.from(found);\n}\n\nexport function extractComponentTagsFromExamplesSections(\n sections: ParsedExampleSection[],\n): string[] {\n if (!sections?.length) return [];\n const found = new Set<string>();\n for (const section of sections) {\n for (const tag of extractComponentTagsFromPreviewMarkdown(section.introMD)) {\n found.add(tag);\n }\n for (const item of section.items) {\n const prepared = prepareExampleContent(item.body);\n if (prepared.skipPreview) continue;\n for (const tag of extractTags(prepared.snippet)) found.add(tag);\n }\n }\n return Array.from(found);\n}\n","import {\n decodeEscapedScriptTags,\n extractComponentTagsFromPreviewMarkdown,\n parseFenceInfo,\n prepareExampleContent,\n type ParsedExampleSection,\n} from \"./examples\";\n\nimport { RESERVED_COMPONENTS } from \"./utils\";\n\n/**\n * Check if an import path uses the new barrel export pattern (no .astro extension)\n */\nfunction isBarrelImport(path: string): boolean {\n return !path.endsWith(\".astro\");\n}\n\n/**\n * Convert a PascalCase component name to its folder path (kebab-case).\n * Examples:\n * - \"Card\" → \"card\"\n * - \"CardHeader\" → \"card\"\n * - \"InputGroup\" → \"input-group\"\n * - \"InputGroupAddon\" → \"input-group\"\n * - \"StickySurface\" → \"sticky-surface\"\n * - \"RadioGroup\" → \"radio-group\"\n * - \"RadioGroupItem\" → \"radio-group\"\n */\nfunction componentToFolder(name: string): string {\n // Known multi-word component families (in PascalCase order)\n // These map to kebab-case folder names\n const multiWordFamilies = [\n \"InputGroup\",\n \"LinkGroup\",\n \"RadioGroup\",\n \"ButtonGroup\",\n \"StickySurface\",\n \"DropdownMenu\",\n \"NavigationMenu\",\n \"ContextMenu\",\n \"HoverCard\",\n \"ToggleGroup\",\n ];\n\n // Check for multi-word families first (order matters - longer matches first)\n const sortedFamilies = multiWordFamilies.sort((a, b) => b.length - a.length);\n for (const family of sortedFamilies) {\n if (name === family || name.startsWith(family)) {\n // InputGroup → input-group\n return family.replace(/([a-z])([A-Z])/g, \"$1-$2\").toLowerCase();\n }\n }\n\n // For regular names, extract the base component (first PascalCase word)\n // CardHeader → Card → card\n // AvatarFallback → Avatar → avatar\n const baseMatch = name.match(/^[A-Z][a-z]*/);\n return baseMatch ? baseMatch[0].toLowerCase() : name.toLowerCase();\n}\n\nfunction resolveComponentFolder(\n name: string,\n componentFolderMap?: Record<string, string>,\n): string {\n if (!componentFolderMap) return componentToFolder(name);\n const direct = componentFolderMap[name];\n if (direct && direct.length) return direct;\n\n return componentToFolder(name);\n}\n\n/**\n * Group component names by their folder path\n */\nfunction groupComponentsByFolder(\n components: string[],\n componentFolderMap?: Record<string, string>,\n): Map<string, string[]> {\n const groups = new Map<string, string[]>();\n for (const comp of components) {\n const folder = resolveComponentFolder(comp, componentFolderMap);\n if (!groups.has(folder)) {\n groups.set(folder, []);\n }\n groups.get(folder)!.push(comp);\n }\n return groups;\n}\n\n/**\n * Generate import lines for UI components using the barrel import pattern\n */\nfunction generateBarrelImports(\n components: string[],\n componentsAlias: string,\n componentFolderMap?: Record<string, string>,\n): string[] {\n const groups = groupComponentsByFolder(components, componentFolderMap);\n const lines: string[] = [];\n\n // Sort folders alphabetically for consistent output\n const sortedFolders = Array.from(groups.keys()).sort();\n\n for (const folder of sortedFolders) {\n const names = groups.get(folder)!.sort();\n if (folder.endsWith(\".astro\")) {\n for (const name of names)\n lines.push(`import ${name} from '${componentsAlias}/${folder}';`);\n continue;\n }\n lines.push(\n `import { ${names.join(\", \")} } from '${componentsAlias}/${folder}';`,\n );\n }\n\n return lines;\n}\n\n/**\n * Generate import lines for UI components using the old default import pattern\n */\nfunction generateDefaultImports(\n components: string[],\n componentsAlias: string,\n): string[] {\n return components\n .slice()\n .sort()\n .map((name) => `import ${name} from '${componentsAlias}/${name}.astro';`);\n}\n\nexport function buildMdx(params: {\n importName: string;\n importPath: string;\n title: string;\n description: string;\n descriptionBodyMDX?: string;\n figmaUrl?: string;\n usageMDX: string;\n hasImport: boolean;\n propsList: string;\n propsTable?: Array<{\n name: string;\n type?: string;\n required?: boolean;\n defaultValue?: string | null;\n description?: string | null;\n }>;\n examples: Array<{\n importName: string;\n importPath: string;\n title: string;\n source: string;\n }>;\n examplesSections: ParsedExampleSection[];\n componentFolderMap?: Record<string, string>;\n availableComponents?: string[];\n autoImports: string[];\n lucideIcons: string[];\n primaryExampleMDX: string;\n componentSource: string;\n commandName: string;\n componentsAlias: string;\n /**\n * Optional: additional named exports from the main component's barrel.\n * Used when the main component has subcomponents (e.g., Card, CardHeader, CardTitle).\n * If provided, these will be included in the main import statement.\n */\n namedExports?: string[];\n /**\n * Optional: API reference documentation (events, programmatic control, data attributes).\n */\n apiMDX?: string;\n}): string {\n const {\n importName,\n importPath,\n title,\n description,\n descriptionBodyMDX,\n usageMDX,\n hasImport,\n propsList,\n propsTable,\n examples,\n examplesSections,\n componentFolderMap,\n autoImports,\n lucideIcons,\n primaryExampleMDX,\n componentSource,\n commandName,\n figmaUrl,\n componentsAlias,\n namedExports,\n apiMDX,\n } = params;\n\n const available = params.availableComponents\n ? new Set(params.availableComponents)\n : null;\n const missingFromNames = (names: string[]) =>\n names.filter(\n (name) =>\n available &&\n !available.has(name) &&\n !RESERVED_COMPONENTS.has(name) &&\n !/Icon$/.test(name),\n );\n const missingFromSnippet = (snippet: string) =>\n missingFromNames([\n ...new Set(\n [...snippet.matchAll(/<([A-Z][A-Za-z0-9_]*)\\b/g)].map(\n (match) => match[1],\n ),\n ),\n ]);\n const missingNotice = (names: string[]) => {\n const components = [\n ...new Set(\n names.map((name) => resolveComponentFolder(name, componentFolderMap)),\n ),\n ].sort();\n return `> Preview unavailable. Run \\`bejamas add ${components.join(\" \")}\\` to install the required components, then regenerate the docs.`;\n };\n\n // Detect if we should use the new barrel import pattern\n const useBarrelPattern = isBarrelImport(importPath);\n\n const sortedLucide = (lucideIcons ?? []).slice().sort();\n const lucideTopLine = sortedLucide.length\n ? `import { ${sortedLucide.join(\", \")} } from '@lucide/astro';`\n : null;\n const externalTopImports = [\n `import { Tabs as DocsTabs, TabItem as DocsTabItem } from '@astrojs/starlight/components';`,\n lucideTopLine,\n ]\n .filter((v) => v != null)\n .slice()\n .sort((a, b) => String(a).localeCompare(String(b)));\n\n const sortedUiAuto = (autoImports ?? [])\n .filter((name) => !available || available.has(name))\n .slice()\n .sort();\n\n // Generate UI component imports based on pattern\n const uiAutoLines =\n useBarrelPattern || componentFolderMap\n ? generateBarrelImports(sortedUiAuto, componentsAlias, componentFolderMap)\n : generateDefaultImports(sortedUiAuto, componentsAlias);\n\n const exampleLines = (examples ?? [])\n .filter((ex) => !missingFromSnippet(ex.source).length)\n .map((ex) => `import ${ex.importName} from '${ex.importPath}';`)\n .sort((a, b) => a.localeCompare(b));\n\n // Build main component import\n let mainImportLine: string | null = null;\n if (!hasImport) {\n if (useBarrelPattern) {\n // New pattern: named exports\n const exports = [importName, ...(namedExports ?? [])].sort();\n mainImportLine = `import { ${exports.join(\", \")} } from '${importPath}';`;\n } else {\n // Old pattern: default export\n mainImportLine = `import ${importName} from '${importPath}';`;\n }\n }\n\n const internalTopImports = [mainImportLine, ...uiAutoLines, ...exampleLines]\n .filter((v) => v != null)\n .slice()\n .sort((a, b) => String(a).localeCompare(String(b)));\n\n const importLines = [\n ...externalTopImports,\n externalTopImports.length && internalTopImports.length ? \"\" : null,\n ...internalTopImports,\n ].filter((v) => v !== null && v !== undefined);\n\n // Helper: build per-snippet imports so code fences are minimal and copy-pasteable\n const extractTags = (snippet: string): Set<string> => {\n const found = new Set<string>();\n const tagRegex = /<([A-Z][A-Za-z0-9_]*)\\b/g;\n let m: RegExpExecArray | null;\n while ((m = tagRegex.exec(snippet)) !== null) {\n found.add(m[1]);\n }\n return found;\n };\n\n const buildSnippetImportLines = (snippet: string): string[] => {\n if (!snippet || !snippet.length) return [];\n const used = extractTags(snippet);\n const usedIcons = sortedLucide.filter((n) => used.has(n));\n\n // Find UI components used in snippet\n const usedUi = (autoImports ?? []).filter((n) => used.has(n));\n\n // Check if main component (and its subcomponents) are used\n const includeMain = !hasImport && used.has(importName);\n\n // For new pattern, also check for subcomponents from the main barrel\n const usedNamedExports =\n useBarrelPattern && namedExports\n ? namedExports.filter((n) => used.has(n))\n : [];\n\n const external: string[] = [];\n if (usedIcons.length) {\n external.push(`import { ${usedIcons.join(\", \")} } from '@lucide/astro';`);\n }\n\n const internal: string[] = [];\n\n if (useBarrelPattern) {\n // New pattern: group by folder and use named imports\n\n // Main component and its subcomponents\n if (includeMain || usedNamedExports.length > 0) {\n const mainExports = [\n ...(includeMain ? [importName] : []),\n ...usedNamedExports,\n ].sort();\n internal.push(\n `import { ${mainExports.join(\", \")} } from '${importPath}';`,\n );\n }\n\n // Other UI components grouped by folder\n if (usedUi.length > 0) {\n internal.push(\n ...generateBarrelImports(usedUi, componentsAlias, componentFolderMap),\n );\n }\n } else {\n // Old pattern: default imports\n if (includeMain) {\n internal.push(`import ${importName} from '${importPath}';`);\n }\n internal.push(\n ...(componentFolderMap\n ? generateBarrelImports(usedUi, componentsAlias, componentFolderMap)\n : generateDefaultImports(usedUi, componentsAlias)),\n );\n }\n\n const externalSorted = external.slice().sort((a, b) => a.localeCompare(b));\n const internalSorted = internal.slice().sort((a, b) => a.localeCompare(b));\n return [\n ...externalSorted,\n externalSorted.length && internalSorted.length ? \"\" : null,\n ...internalSorted,\n ].filter((v) => v !== null && v !== undefined) as string[];\n };\n\n let consolePreviewCounter = 0;\n\n const wrapTextNodes = (snippet: string): string => {\n if (!snippet) return snippet;\n return snippet.replace(/>([^<]+)</g, (match, inner) => {\n const trimmed = inner.trim();\n if (!trimmed.length) return match;\n // Skip if the entire trimmed content is a JSX expression\n if (/^\\{[\\s\\S]*\\}$/.test(trimmed)) return match;\n // Skip if the content already contains JSX expressions (e.g., \"Use{\\\" \\\"}\" or mixed content)\n // This prevents double-wrapping and breaking inline JSX whitespace expressions\n if (/\\{[^}]*\\}/.test(inner)) return match;\n return `>{${JSON.stringify(inner)}}<`;\n });\n };\n\n /**\n * Normalize whitespace in preview content.\n * This collapses ALL newlines and multiple spaces into single spaces to prevent\n * MDX parsing issues. In particular, a '>' at the start of a line is interpreted\n * as a block quote marker by MDX, which causes \"Unexpected lazy line\" errors.\n */\n const normalizeInlineWhitespace = (snippet: string): string => {\n if (!snippet) return snippet;\n // Collapse ALL newlines and multiple whitespace into single spaces\n // This prevents MDX from interpreting '>' at start of line as block quote\n return snippet.replace(/\\s+/g, \" \").trim();\n };\n\n /**\n * Convert <p> tags that contain component tags to <span> tags.\n * This is necessary because components may render as block elements (like <div>),\n * and HTML doesn't allow block elements inside <p>. The browser would automatically\n * close the <p> before any block element, breaking the layout.\n */\n const convertParagraphsWithComponents = (snippet: string): string => {\n if (!snippet) return snippet;\n // Detect if a <p> tag contains component tags (PascalCase like <KbdGroup>)\n // If so, convert <p> to <span> to allow block-level children\n return snippet.replace(\n /<p(\\s[^>]*)?>([^]*?)<\\/p>/gi,\n (match, attrs, content) => {\n // Check if content contains component tags (PascalCase)\n if (/<[A-Z][A-Za-z0-9]*/.test(content)) {\n // Convert to span with inline-block display to preserve paragraph-like behavior\n const spanAttrs = attrs || \"\";\n return `<span${spanAttrs} style=\"display:block\">${content}</span>`;\n }\n return match;\n },\n );\n };\n\n type PreviewRenderOptions = {\n enableConsolePanel?: boolean;\n consoleScripts?: string[];\n };\n\n type MarkdownPreviewConfig = {\n defaultPreview?: boolean;\n allowForcedPreview?: boolean;\n };\n\n const extractInlineScripts = (\n snippet: string,\n ): {\n markup: string;\n scripts: string[];\n } => {\n if (!snippet) return { markup: snippet, scripts: [] };\n const scripts: string[] = [];\n const markup = snippet.replace(\n /<script\\b[^>]*>([\\s\\S]*?)<\\/script>/gi,\n (_, scriptBody: string) => {\n scripts.push((scriptBody || \"\").trim());\n return \"\";\n },\n );\n return { markup, scripts };\n };\n\n const toMdxPreview = (\n snippet: string,\n options: PreviewRenderOptions = {},\n ): { markup: string; scripts: string[] } => {\n if (!snippet) return { markup: \"\", scripts: [] };\n const { enableConsolePanel = false, consoleScripts = [] } = options;\n const extracted = extractInlineScripts(snippet);\n const resolvedConsoleScripts =\n enableConsolePanel && consoleScripts.length\n ? consoleScripts\n : enableConsolePanel\n ? extracted.scripts\n : [];\n const withoutScripts = extracted.markup;\n // Convert HTML comments to MDX comment blocks for preview sections\n const withoutComments = withoutScripts.replace(\n /<!--([\\s\\S]*?)-->/g,\n \"{/*$1*/}\",\n );\n // Convert <p> tags containing components to <span> to avoid HTML validity issues\n const withConvertedParagraphs =\n convertParagraphsWithComponents(withoutComments);\n // If the snippet contains user-defined <p> elements, preserve structure as-is\n if (/<p[\\s>]/i.test(withConvertedParagraphs)) {\n return {\n markup: normalizeInlineWhitespace(withConvertedParagraphs),\n scripts: resolvedConsoleScripts,\n };\n }\n // Normalize whitespace to prevent MDX from splitting inline text into paragraphs\n const normalized = normalizeInlineWhitespace(withConvertedParagraphs);\n return {\n markup: wrapTextNodes(normalized),\n scripts: resolvedConsoleScripts,\n };\n };\n\n const buildConsoleRuntimeSource = (\n rootId: string,\n panelId: string,\n userScript: string,\n ): string => {\n const serializedRootId = JSON.stringify(rootId);\n const serializedPanelId = JSON.stringify(panelId);\n const serializedUserScript = JSON.stringify(userScript);\n\n return `(function () {\n var root = document.getElementById(${serializedRootId});\n var panel = document.getElementById(${serializedPanelId});\n if (!root || !panel) return;\n\n var placeholder = panel.textContent || \"Waiting for logs...\";\n var hasLogs = false;\n\n var toText = function (value) {\n if (typeof value === \"string\") return value;\n if (value === undefined) return \"undefined\";\n if (value === null) return \"null\";\n try {\n return JSON.stringify(value);\n } catch (_error) {\n return String(value);\n }\n };\n\n var append = function (level, args) {\n var stamp = new Date().toLocaleTimeString();\n var body = Array.prototype.map.call(args, toText).join(\" \");\n var line = \"[\" + stamp + \"] \" + String(level).toUpperCase() + \": \" + body;\n var current = panel.textContent || \"\";\n if (!hasLogs && current.trim() === placeholder.trim()) {\n panel.textContent = line;\n } else {\n panel.textContent = current ? current + \"\\\\n\" + line : line;\n }\n hasLogs = true;\n panel.scrollTop = panel.scrollHeight;\n };\n\n var methods = [\"log\", \"info\", \"warn\", \"error\"];\n var proxyConsole = Object.create(console);\n for (var i = 0; i < methods.length; i += 1) {\n (function (methodName) {\n var fallback = typeof console.log === \"function\" ? console.log.bind(console) : function () {};\n var original =\n typeof console[methodName] === \"function\"\n ? console[methodName].bind(console)\n : fallback;\n proxyConsole[methodName] = function () {\n var args = Array.prototype.slice.call(arguments);\n original.apply(console, args);\n append(methodName, args);\n };\n })(methods[i]);\n }\n\n try {\n var run = new Function(\"console\", \"root\", \"panel\", ${serializedUserScript});\n run(proxyConsole, root, panel);\n } catch (error) {\n var fallbackError = typeof console.error === \"function\" ? console.error.bind(console) : function () {};\n fallbackError(error);\n append(\"error\", [error]);\n }\n})();`;\n };\n\n const renderConsoleScripts = (\n rootId: string,\n panelId: string,\n scripts: string[],\n ): string => {\n if (!scripts.length) return \"\";\n return scripts\n .filter((script) => script && script.trim().length)\n .map((script) => {\n const runtimeSource = buildConsoleRuntimeSource(\n rootId,\n panelId,\n script,\n );\n const encoded = encodeURIComponent(runtimeSource);\n return `<script type=\"module\" src=\"data:text/javascript;charset=utf-8,${encoded}\"></script>`;\n })\n .join(\"\\n\");\n };\n\n const renderCompanionSourceMD = (sourceMD: string): string => {\n if (!sourceMD || !sourceMD.trim().length) return \"\";\n const normalizedSourceMD = sourceMD.trim();\n const match = normalizedSourceMD.match(\n /^```(\\S*)([^\\n]*)\\n([\\s\\S]*?)\\n```$/,\n );\n if (!match) return sourceMD;\n\n const [, langRaw = \"\", flagsRaw = \"\", body = \"\"] = match;\n const lang = langRaw.trim().toLowerCase();\n if (![\"js\", \"ts\", \"javascript\", \"typescript\"].includes(lang)) {\n return sourceMD;\n }\n\n const astroInfo = [\"astro\", flagsRaw.trim()].filter(Boolean).join(\" \");\n const scriptBody = body.replace(/\\s+$/, \"\");\n return [\n `\\`\\`\\`${astroInfo}`,\n \"<script>\",\n scriptBody,\n \"</script>\",\n \"```\",\n ].join(\"\\n\");\n };\n\n const extractCompanionScriptBody = (sourceMD: string): string => {\n if (!sourceMD || !sourceMD.trim().length) return \"\";\n const normalizedSourceMD = sourceMD.trim();\n const match = normalizedSourceMD.match(\n /^```(\\S*)([^\\n]*)\\n([\\s\\S]*?)\\n```$/,\n );\n if (!match) return \"\";\n\n const [, langRaw = \"\", , body = \"\"] = match;\n const lang = langRaw.trim().toLowerCase();\n if (![\"js\", \"ts\", \"javascript\", \"typescript\"].includes(lang)) {\n return \"\";\n }\n\n return body.replace(/\\s+$/, \"\");\n };\n\n const renderMergedAstroSourceMD = (\n fenceOpen: string,\n sourceBody: string,\n companionSourceMD: string,\n ): string => {\n const scriptBody = extractCompanionScriptBody(companionSourceMD);\n if (!scriptBody.length) {\n return [fenceOpen, sourceBody, \"```\"].filter(Boolean).join(\"\\n\");\n }\n\n const normalizedSourceBody = sourceBody.replace(/\\s+$/, \"\");\n const parts = [fenceOpen];\n if (normalizedSourceBody.length) {\n parts.push(normalizedSourceBody, \"\");\n }\n parts.push(\"<script>\", scriptBody, \"</script>\", \"```\");\n return parts.join(\"\\n\");\n };\n\n const renderPreviewBlock = (\n snippet: string,\n options: PreviewRenderOptions = {},\n ): string => {\n const missing = missingFromSnippet(snippet);\n if (missing.length) return missingNotice(missing);\n const { enableConsolePanel = false } = options;\n const preparedPreview = toMdxPreview(snippet, options);\n if (!preparedPreview.markup || !preparedPreview.markup.length) return \"\";\n\n if (!enableConsolePanel) {\n return `<div class=\"not-content sl-bejamas-component-preview flex justify-center px-4 md:px-10 py-12 border border-border rounded-t-lg min-h-72 items-center\">\n${preparedPreview.markup}\n</div>`;\n }\n\n consolePreviewCounter += 1;\n const rootId = `sl-bejamas-console-preview-${consolePreviewCounter}`;\n const panelId = `${rootId}-output`;\n const scriptTags = renderConsoleScripts(\n rootId,\n panelId,\n preparedPreview.scripts,\n );\n const parts = [\n `<div id=\"${rootId}\" class=\"not-content sl-bejamas-component-preview flex justify-center px-4 md:px-10 py-12 border border-border rounded-t-lg min-h-72 items-center\">`,\n preparedPreview.markup,\n \"</div>\",\n `<div class=\"not-content sl-bejamas-console-log-shell px-4 md:px-10 py-4 border border-border border-t-0\">`,\n `<pre id=\"${panelId}\" data-slot=\"event-log\" class=\"sl-bejamas-console-log w-full p-3 rounded-md bg-muted text-xs font-mono text-muted-foreground min-h-[80px] max-h-[200px] overflow-y-auto\">Waiting for logs...</pre>`,\n scriptTags && scriptTags.length ? scriptTags : null,\n \"</div>\",\n ].filter((part) => part !== null) as string[];\n\n return parts.join(\"\\n\");\n };\n\n const renderAstroPreviewsInMarkdown = (\n block: string,\n config: MarkdownPreviewConfig = {},\n ): string => {\n if (!block || !block.length) return block;\n const missingRaw = missingFromNames(\n extractComponentTagsFromPreviewMarkdown(block, {\n defaultPreview: false,\n allowForcedPreview: false,\n }),\n );\n if (missingRaw.length)\n return `${missingNotice(missingRaw)}\\n\\n\\`\\`\\`\\`mdx\\n${block}\\n\\`\\`\\`\\``;\n const { defaultPreview = true, allowForcedPreview = true } = config;\n\n const lines = block.split(\"\\n\");\n const out: string[] = [];\n let inFence = false;\n let fenceOpen = \"\";\n let currentFenceLang = \"\";\n let currentFenceFlags = new Set<string>();\n const fenceBody: string[] = [];\n\n const findCompanionConsoleFence = (\n startIndex: number,\n ): { start: number; end: number } | null => {\n let index = startIndex;\n while (index < lines.length) {\n const currentLine = lines[index];\n const trimmedLine = currentLine.trim();\n if (!trimmedLine.length || !trimmedLine.startsWith(\"```\")) {\n index += 1;\n continue;\n }\n\n const parsed = parseFenceInfo(trimmedLine.slice(3).trim());\n if (![\"js\", \"ts\", \"javascript\", \"typescript\"].includes(parsed.lang)) {\n return null;\n }\n\n let end = index + 1;\n while (end < lines.length) {\n if (lines[end].trim().startsWith(\"```\")) {\n return { start: index, end };\n }\n end += 1;\n }\n\n return null;\n }\n return null;\n };\n\n for (let lineIndex = 0; lineIndex < lines.length; lineIndex += 1) {\n const line = lines[lineIndex];\n const trimmed = line.trim();\n if (trimmed.startsWith(\"```\")) {\n if (!inFence) {\n inFence = true;\n fenceOpen = line;\n const parsed = parseFenceInfo(trimmed.slice(3).trim());\n currentFenceLang = parsed.lang;\n currentFenceFlags = parsed.flags;\n fenceBody.length = 0;\n continue;\n }\n\n if (currentFenceLang === \"astro\") {\n const sourceCode = decodeEscapedScriptTags(\n fenceBody.join(\"\\n\").trim(),\n );\n const companionConsoleFence = currentFenceFlags.has(\"console\")\n ? findCompanionConsoleFence(lineIndex + 1)\n : null;\n const companionMarkdown = companionConsoleFence\n ? lines\n .slice(lineIndex + 1, companionConsoleFence.end + 1)\n .join(\"\\n\")\n : \"\";\n const prepared = prepareExampleContent(\n companionMarkdown.length\n ? `${fenceOpen}\\n${sourceCode}\\n${line}\\n${companionMarkdown}`\n : `${fenceOpen}\\n${sourceCode}\\n${line}`,\n );\n const hasForcedPreviewFlag =\n currentFenceFlags.has(\"preview\") ||\n currentFenceFlags.has(\"console\");\n const shouldPreview =\n !prepared.skipPreview &&\n (defaultPreview || (allowForcedPreview && hasForcedPreviewFlag));\n if (prepared.snippet && prepared.snippet.length && shouldPreview) {\n const previewBlock = renderPreviewBlock(prepared.snippet, {\n enableConsolePanel: prepared.enableConsolePanel,\n consoleScripts: prepared.consoleScripts,\n });\n if (previewBlock.length) {\n out.push(previewBlock);\n }\n out.push(\"\");\n }\n }\n\n if (currentFenceLang === \"astro\") {\n const normalizedFenceBody = decodeEscapedScriptTags(\n fenceBody.join(\"\\n\"),\n );\n const companionConsoleFence = currentFenceFlags.has(\"console\")\n ? findCompanionConsoleFence(lineIndex + 1)\n : null;\n const companionMarkdown = companionConsoleFence\n ? lines\n .slice(lineIndex + 1, companionConsoleFence.end + 1)\n .join(\"\\n\")\n : \"\";\n const prepared = companionMarkdown.length\n ? prepareExampleContent(\n `${fenceOpen}\\n${normalizedFenceBody}\\n${line}\\n${companionMarkdown}`,\n )\n : null;\n\n if (\n prepared?.companionSourceMD &&\n prepared.companionSourceMD.length &&\n prepared.mergeCompanionWithSource\n ) {\n out.push(\n renderMergedAstroSourceMD(\n fenceOpen,\n normalizedFenceBody,\n prepared.companionSourceMD,\n ),\n );\n if (companionConsoleFence) {\n lineIndex = companionConsoleFence.end;\n }\n } else {\n out.push(fenceOpen);\n if (normalizedFenceBody.length) {\n out.push(...normalizedFenceBody.split(\"\\n\"));\n }\n out.push(line);\n\n if (\n prepared?.companionSourceMD &&\n prepared.companionSourceMD.length &&\n companionConsoleFence\n ) {\n const companionIntro = lines\n .slice(lineIndex + 1, companionConsoleFence.start)\n .join(\"\\n\");\n if (companionIntro.length) {\n out.push(companionIntro);\n }\n out.push(renderCompanionSourceMD(prepared.companionSourceMD));\n lineIndex = companionConsoleFence.end;\n }\n }\n } else {\n out.push(fenceOpen);\n if (fenceBody.length) {\n out.push(...fenceBody);\n }\n out.push(line);\n }\n\n inFence = false;\n fenceOpen = \"\";\n currentFenceLang = \"\";\n currentFenceFlags = new Set<string>();\n fenceBody.length = 0;\n continue;\n }\n\n if (inFence) {\n fenceBody.push(line);\n continue;\n }\n\n out.push(line);\n }\n\n if (inFence) {\n out.push(fenceOpen);\n if (currentFenceLang === \"astro\") {\n const normalizedFenceBody = decodeEscapedScriptTags(\n fenceBody.join(\"\\n\"),\n );\n if (normalizedFenceBody.length) {\n out.push(...normalizedFenceBody.split(\"\\n\"));\n }\n } else if (fenceBody.length) {\n out.push(...fenceBody);\n }\n }\n\n return out.join(\"\\n\").trim();\n };\n\n const renderedDescriptionBodyMDX = renderAstroPreviewsInMarkdown(\n descriptionBodyMDX || \"\",\n );\n const renderedUsageMDX = renderAstroPreviewsInMarkdown(usageMDX || \"\", {\n defaultPreview: false,\n });\n const renderedApiMDX = renderAstroPreviewsInMarkdown(apiMDX || \"\", {\n defaultPreview: false,\n allowForcedPreview: false,\n });\n\n const primaryExampleSection =\n primaryExampleMDX && primaryExampleMDX.length\n ? `${renderPreviewBlock(primaryExampleMDX)}\n\n\\`\\`\\`astro\n${(() => {\n const lines = buildSnippetImportLines(primaryExampleMDX);\n return lines.length ? `---\\n${lines.join(\"\\n\")}\\n---\\n\\n` : \"\";\n})()}${primaryExampleMDX}\n\\`\\`\\``\n : null;\n\n const renderExampleItem = (\n headingLevel: \"###\" | \"####\",\n headingTitle: string,\n body: string,\n ): string => {\n const prepared = prepareExampleContent(body);\n const titleLine = `${headingLevel} ${headingTitle}`;\n const blocks: string[] = [titleLine];\n if (prepared.descriptionMD && prepared.descriptionMD.length) {\n blocks.push(renderAstroPreviewsInMarkdown(prepared.descriptionMD));\n }\n\n if (\n prepared.snippet &&\n prepared.snippet.length &&\n prepared.sourceCode &&\n prepared.sourceCode.length &&\n !prepared.skipPreview\n ) {\n blocks.push(\n renderPreviewBlock(prepared.snippet, {\n enableConsolePanel: prepared.enableConsolePanel,\n consoleScripts: prepared.consoleScripts,\n }),\n );\n }\n\n if (prepared.sourceCode && prepared.sourceCode.length) {\n const sourceBlock = prepared.sourceFromFence\n ? prepared.sourceCode\n : `${(() => {\n const lines = buildSnippetImportLines(prepared.sourceCode);\n return lines.length ? `---\\n${lines.join(\"\\n\")}\\n---\\n\\n` : \"\";\n })()}${prepared.sourceCode}`;\n if (\n prepared.companionSourceMD &&\n prepared.companionSourceMD.length &&\n prepared.mergeCompanionWithSource\n ) {\n blocks.push(\n renderMergedAstroSourceMD(\n \"```astro\",\n sourceBlock,\n prepared.companionSourceMD,\n ),\n );\n } else {\n blocks.push(`\\`\\`\\`astro\n${sourceBlock}\n\\`\\`\\``);\n }\n if (\n prepared.companionIntroMD &&\n prepared.companionIntroMD.length &&\n !prepared.mergeCompanionWithSource\n ) {\n blocks.push(prepared.companionIntroMD);\n }\n if (\n prepared.companionSourceMD &&\n prepared.companionSourceMD.length &&\n !prepared.mergeCompanionWithSource\n ) {\n blocks.push(renderCompanionSourceMD(prepared.companionSourceMD));\n }\n if (\n prepared.trailingDescriptionMD &&\n prepared.trailingDescriptionMD.length\n ) {\n blocks.push(\n renderAstroPreviewsInMarkdown(prepared.trailingDescriptionMD),\n );\n }\n }\n\n return blocks.join(\"\\n\\n\");\n };\n\n const renderedExampleSections: string[] = [];\n if (examplesSections && examplesSections.length) {\n let implicitExampleCounter = 1;\n\n for (const section of examplesSections) {\n const sectionParts: string[] = [];\n const hasSectionTitle = !!(section.title && section.title.length);\n if (hasSectionTitle) {\n sectionParts.push(`### ${section.title}`);\n }\n\n if (section.introMD && section.introMD.length) {\n sectionParts.push(renderAstroPreviewsInMarkdown(section.introMD));\n }\n\n if (section.items && section.items.length) {\n const itemHeadingLevel: \"###\" | \"####\" = hasSectionTitle\n ? \"####\"\n : \"###\";\n for (const item of section.items) {\n sectionParts.push(\n renderExampleItem(itemHeadingLevel, item.title, item.body),\n );\n }\n } else if (\n !hasSectionTitle &&\n section.introMD &&\n section.introMD.length\n ) {\n const prepared = prepareExampleContent(section.introMD);\n if (prepared.snippet && prepared.snippet.length) {\n sectionParts.length = 0;\n sectionParts.push(\n renderExampleItem(\n \"###\",\n `Example ${implicitExampleCounter}`,\n section.introMD,\n ),\n );\n implicitExampleCounter += 1;\n }\n }\n\n if (sectionParts.length) {\n renderedExampleSections.push(sectionParts.join(\"\\n\\n\").trim());\n }\n }\n }\n if (examples && examples.length) {\n for (const ex of examples) {\n renderedExampleSections.push(\n `### ${ex.title}\n\n${\n missingFromSnippet(ex.source).length\n ? missingNotice(missingFromSnippet(ex.source))\n : `<div class=\"not-content\">\n <${ex.importName} />\n</div>`\n}\n\n\\`\\`\\`astro\n${ex.source}\n\\`\\`\\``,\n );\n }\n }\n\n const formatDefault = (val: unknown): string => {\n if (val == null) return \"\";\n let raw = String(val).trim();\n if (!raw.length) return \"\";\n // Normalize curly quotes to ASCII\n raw = raw\n .replace(/[\\u201C\\u201D\\u201E\\u201F]/g, '\"')\n .replace(/[\\u2018\\u2019]/g, \"'\");\n const isSingleQuoted = /^'[^']*'$/.test(raw);\n const isDoubleQuoted = /^\"[^\"]*\"$/.test(raw);\n const isBacktickSimple = /^`[^`]*`$/.test(raw) && raw.indexOf(\"${\") === -1;\n\n let content = raw;\n if (isSingleQuoted || isDoubleQuoted || isBacktickSimple) {\n const inner = raw.slice(1, -1);\n // Re-quote with standard double quotes\n content = `\"${inner}\"`;\n }\n // Escape table pipes\n content = content.replace(/\\|/g, \"\\\\|\");\n // Choose a backtick fence that doesn't appear in content\n const hasTick = content.includes(\"`\");\n const hasDoubleTick = content.includes(\"``\");\n const fence = !hasTick ? \"`\" : !hasDoubleTick ? \"``\" : \"```\";\n return `${fence}${content}${fence}`;\n };\n\n const installationSection = `## Installation\n\n<DocsTabs syncKey=\"pkg\">\n <DocsTabItem label=\"bun\">\n \\`\\`\\`bash\n bunx bejamas add ${commandName}\n \\`\\`\\`\n </DocsTabItem>\n <DocsTabItem label=\"npm\">\n \\`\\`\\`bash\n npx bejamas add ${commandName}\n \\`\\`\\`\n </DocsTabItem>\n <DocsTabItem label=\"pnpm\">\n \\`\\`\\`bash\n pnpm dlx bejamas add ${commandName}\n \\`\\`\\`\n </DocsTabItem>\n <DocsTabItem label=\"yarn\">\n \\`\\`\\`bash\n yarn dlx bejamas add ${commandName}\n \\`\\`\\`\n </DocsTabItem>\n</DocsTabs>`;\n\n const serializeFrontmatter = (\n label: string,\n value?: string,\n ): string | null => {\n if (!value || !value.length) return null;\n return `${label}: ${JSON.stringify(value)}`;\n };\n\n const lines = [\n \"---\",\n serializeFrontmatter(\"title\", title),\n serializeFrontmatter(\"description\", description),\n serializeFrontmatter(\"figmaUrl\", figmaUrl),\n \"---\",\n \"\",\n ...importLines,\n importLines.length ? \"\" : null,\n renderedDescriptionBodyMDX && renderedDescriptionBodyMDX.length\n ? renderedDescriptionBodyMDX\n : null,\n renderedDescriptionBodyMDX && renderedDescriptionBodyMDX.length ? \"\" : null,\n primaryExampleSection,\n primaryExampleSection ? \"\" : null,\n installationSection,\n \"\",\n renderedUsageMDX && renderedUsageMDX.length\n ? `## Usage\\n\\n${renderedUsageMDX}`\n : null,\n \"\",\n propsTable && propsTable.length\n ? `## Props\\n\\n| Prop | Type | Default |\\n|---|---|---|\\n${propsTable\n .map(\n (p) =>\n `| <code>${p.name}</code> | \\`${(p.type || \"\").replace(/\\|/g, \"\\\\|\")}\\` | ${formatDefault(p.defaultValue)} |`,\n )\n .join(\"\\n\")}`\n : propsList\n ? `## Props\\n\\n${propsList}`\n : null,\n (propsTable && propsTable.length) || propsList ? \"\" : null,\n renderedExampleSections.length\n ? `## Examples\\n\\n` + renderedExampleSections.join(\"\\n\\n\")\n : null,\n renderedExampleSections.length ? \"\" : null,\n renderedApiMDX && renderedApiMDX.length\n ? `## API Reference\\n\\n${renderedApiMDX}`\n : null,\n ].filter((v) => v !== null && v !== undefined);\n\n return lines.join(\"\\n\").trim() + \"\\n\";\n}\n","import { mkdirSync, existsSync } from \"fs\";\nimport { readdir, readFile, writeFile } from \"fs/promises\";\nimport { join, extname, dirname, relative, basename } from \"path\";\nimport {\n RESERVED_COMPONENTS,\n slugify,\n extractFrontmatter,\n toIdentifier,\n parseJsDocMetadata,\n extractPropsFromAstroProps,\n extractPropsFromDeclaredProps,\n resolveUiRoot,\n resolveOutDir,\n normalizeUsageMDX,\n normalizeBlockMDX,\n detectHasImportTopLevel,\n discoverExamples,\n extractComponentTagsFromMDX,\n createSourceFileFromFrontmatter,\n} from \"./utils\";\nimport {\n parseExamplesSections,\n extractComponentTagsFromPreviewMarkdown,\n extractComponentTagsFromExamplesSections,\n} from \"./examples\";\nimport { buildMdx } from \"./mdx-builder\";\nimport { logger } from \"@/src/utils/logger\";\nimport { spinner } from \"@/src/utils/spinner\";\nimport { getConfig } from \"@/src/utils/get-config\";\n\ninterface ComponentEntry {\n /** The main component name (PascalCase), e.g., \"Card\" */\n name: string;\n /** Path to the main .astro file */\n filePath: string;\n /** The folder name (lowercase/kebab-case), e.g., \"card\" */\n folderName: string;\n /** Whether this is a folder-based component with barrel exports */\n isFolder: boolean;\n /** List of subcomponent names exported from the barrel, e.g., [\"CardHeader\", \"CardTitle\"] */\n namedExports: string[];\n}\n\n/**\n * Discover components in the components directory.\n * Supports both:\n * - Old pattern: flat .astro files in components/\n * - New pattern: folders with index.ts barrel exports\n */\nasync function discoverComponents(\n componentsDir: string,\n): Promise<ComponentEntry[]> {\n const entries: ComponentEntry[] = [];\n const dirEntries = (\n await readdir(componentsDir, { withFileTypes: true })\n ).sort((a, b) => a.name.localeCompare(b.name));\n\n for (const entry of dirEntries) {\n if (entry.isDirectory()) {\n // New pattern: folder with barrel exports\n const folderPath = join(componentsDir, entry.name);\n const indexPath = join(folderPath, \"index.ts\");\n\n if (existsSync(indexPath)) {\n // Parse the barrel file to find exports\n const indexContent = await readFile(indexPath, \"utf-8\");\n const localExports = parseBarrelExports(indexContent).filter(\n ({ file }) =>\n dirname(join(folderPath, file)) === folderPath &&\n existsSync(join(folderPath, file)),\n );\n const namedExports = localExports.map(({ name }) => name);\n\n // Find the main component (first export or the one matching folder name)\n const mainComponentName = findMainComponent(namedExports, entry.name);\n\n if (mainComponentName) {\n const mainFilePath = join(\n folderPath,\n localExports.find(({ name }) => name === mainComponentName)!.file,\n );\n\n if (existsSync(mainFilePath)) {\n // Filter out the main component from namedExports (it will be imported separately)\n const subComponents = namedExports.filter(\n (n) => n !== mainComponentName,\n );\n\n entries.push({\n name: mainComponentName,\n filePath: mainFilePath,\n folderName: entry.name,\n isFolder: true,\n namedExports: subComponents,\n });\n }\n }\n }\n } else if (\n entry.isFile() &&\n extname(entry.name).toLowerCase() === \".astro\"\n ) {\n // Old pattern: flat .astro file\n const componentName = entry.name.replace(/\\.astro$/i, \"\");\n entries.push({\n name: componentName,\n filePath: join(componentsDir, entry.name),\n folderName: \"\",\n isFolder: false,\n namedExports: [],\n });\n }\n }\n\n // Prefer the nested component if an older installer left a flat duplicate.\n const nestedNames = new Set(\n entries.filter((entry) => entry.isFolder).map((entry) => entry.name),\n );\n return entries.filter(\n (entry) => entry.isFolder || !nestedNames.has(entry.name),\n );\n}\n\nfunction buildComponentFolderMap(\n components: ComponentEntry[],\n): Record<string, string> {\n const map: Record<string, string> = {};\n for (const component of components) {\n if (!component.isFolder) {\n map[component.name] = `${component.name}.astro`;\n continue;\n }\n if (!component.folderName) continue;\n map[component.name] = component.folderName;\n for (const sub of component.namedExports) {\n map[sub] = component.folderName;\n }\n }\n return map;\n}\n\n/**\n * Parse a barrel (index.ts) file to extract named exports.\n * Handles patterns like:\n * - export { default as Card } from \"./Card.astro\";\n * - export { default as CardHeader } from \"./CardHeader.astro\";\n */\nfunction parseBarrelExports(content: string): { name: string; file: string }[] {\n const exports: { name: string; file: string }[] = [];\n\n // Match: export { default as ComponentName } from \"...\"\n const exportRegex =\n /export\\s*\\{\\s*default\\s+as\\s+(\\w+)\\s*\\}\\s*from\\s*[\"'](\\.\\/[^\"']+\\.astro)[\"']/g;\n let match: RegExpExecArray | null;\n\n while ((match = exportRegex.exec(content)) !== null) {\n exports.push({ name: match[1], file: match[2] });\n }\n\n return exports;\n}\n\n/**\n * Find the main component from a list of exports.\n * The main component is typically the one that matches the folder name (PascalCase).\n */\nfunction findMainComponent(\n exports: string[],\n folderName: string,\n): string | null {\n if (exports.length === 0) return null;\n\n // Convert folder name to PascalCase for comparison\n // e.g., \"card\" -> \"Card\", \"input-group\" -> \"InputGroup\"\n const expectedName = folderName\n .split(\"-\")\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\"\");\n\n // First, try to find exact match\n const exactMatch = exports.find((e) => e === expectedName);\n if (exactMatch) return exactMatch;\n\n // Otherwise, return the first export (usually the main component)\n return exports[0];\n}\n\nasync function main() {\n const DEBUG =\n process.env.BEJAMAS_DEBUG === \"1\" || process.env.BEJAMAS_DEBUG === \"true\";\n const cwd =\n process.env.BEJAMAS_DOCS_CWD && process.env.BEJAMAS_DOCS_CWD.length\n ? (process.env.BEJAMAS_DOCS_CWD as string)\n : process.cwd();\n const config = await getConfig(cwd);\n const componentsAlias = (\n config?.aliases?.ui ||\n config?.aliases?.components ||\n \"@bejamas/ui/components\"\n ).replace(/\\/$/, \"\");\n const componentsDirFromConfig =\n config?.resolvedPaths?.ui || config?.resolvedPaths?.components;\n let uiRoot = componentsDirFromConfig\n ? dirname(dirname(componentsDirFromConfig))\n : resolveUiRoot(cwd);\n let componentsDir = join(uiRoot, \"src\", \"components\");\n if (componentsDirFromConfig) {\n componentsDir = componentsDirFromConfig;\n uiRoot = dirname(dirname(componentsDirFromConfig));\n }\n if (!existsSync(componentsDir)) {\n // Fallback to ui package components if the configured path is missing.\n componentsDir = join(uiRoot, \"src\", \"components\");\n }\n const outDir = resolveOutDir(cwd);\n mkdirSync(outDir, { recursive: true });\n\n if (DEBUG) {\n logger.info(`[docs-generator] cwd: ${cwd}`);\n logger.info(`[docs-generator] uiRoot: ${uiRoot}`);\n logger.info(`[docs-generator] componentsDir: ${componentsDir}`);\n logger.info(`[docs-generator] outDir: ${outDir}`);\n }\n\n // Discover all components (both flat files and folders)\n const components = await discoverComponents(componentsDir);\n const componentFolderMap = buildComponentFolderMap(components);\n const availableComponents = Object.keys(componentFolderMap);\n const rewriteAliases = (source: string) =>\n source\n .replace(/@bejamas\\/ui\\/components(?=[/\"'])/g, componentsAlias)\n .replace(\n /@bejamas\\/(?:ui|registry)\\/lib\\/utils(?=[\"'])/g,\n config?.aliases?.utils ?? \"@/lib/utils\",\n )\n .replace(\n /@bejamas\\/(?:ui|registry)\\/lib(?=[/\"'])/g,\n config?.aliases?.lib ?? \"@/lib\",\n );\n\n if (DEBUG) {\n logger.info(`[docs-generator] components found: ${components.length}`);\n if (components.length) {\n logger.info(\n `[docs-generator] first few: ${components\n .slice(0, 5)\n .map((c) => c.name)\n .join(\", \")}`,\n );\n }\n }\n\n let generatedCount = 0;\n const total = components.length;\n const spin = spinner(`Generating docs (0/${total})`).start();\n\n for (const component of components) {\n const {\n name: pascal,\n filePath,\n folderName,\n isFolder,\n namedExports,\n } = component;\n\n const astroFile = await readFile(filePath, \"utf-8\");\n const frontmatterCode = extractFrontmatter(astroFile);\n const sourceFile = createSourceFileFromFrontmatter(frontmatterCode);\n const meta = parseJsDocMetadata(rewriteAliases(frontmatterCode));\n const declaredProps = extractPropsFromDeclaredProps(sourceFile);\n const destructuredProps = extractPropsFromAstroProps(sourceFile);\n\n // Build props table preferring declared types; merge defaults from destructuring\n const defaultsMap = new Map<string, string | null>();\n for (const p of destructuredProps) {\n if (p.name && p.hasDefault) {\n defaultsMap.set(p.name, p.defaultValue || null);\n }\n }\n\n const propsTable = (declaredProps.length ? declaredProps : []).map((p) => ({\n name: p.name,\n type: p.type,\n required: !p.optional,\n defaultValue: defaultsMap.has(p.name) ? defaultsMap.get(p.name)! : null,\n }));\n\n const slug = slugify(pascal);\n const title = meta.title || meta.name || pascal;\n const description = meta.description || \"\";\n const descriptionBodyMDX = (meta as any).descriptionBodyMDX || \"\";\n const figmaUrl = (meta as any).figmaUrl || \"\";\n // Do not display props if there is no declared Props\n const propsList = \"\";\n\n const importName = pascal;\n // Use folder-based barrel import for new pattern, file-based for old pattern\n const importPath = isFolder\n ? `${componentsAlias}/${folderName}`\n : `${componentsAlias}/${pascal}.astro`;\n\n const { text: usageMDX, hasImport: hasImportUsage } = normalizeUsageMDX(\n meta.usageMDX || \"\",\n pascal,\n );\n const primaryExampleMDX = normalizeBlockMDX(\n meta.primaryExampleMDX || \"\",\n ).trim();\n const examplesMDX = normalizeBlockMDX(meta.examplesMDX || \"\").trim();\n const apiMDX = normalizeBlockMDX(meta.apiMDX || \"\").trim();\n const hasImportExamples = detectHasImportTopLevel(examplesMDX, pascal);\n const hasImportPrimary = detectHasImportTopLevel(primaryExampleMDX, pascal);\n const hasImport = hasImportUsage || hasImportExamples || hasImportPrimary;\n\n let exampleRelPaths: string[] = [];\n let examples: Array<{\n importName: string;\n importPath: string;\n title: string;\n source: string;\n }> = [];\n const parsedExamplesSections = parseExamplesSections(examplesMDX);\n if (parsedExamplesSections.length === 0) {\n exampleRelPaths = await discoverExamples(filePath, componentsDir);\n examples = (exampleRelPaths || []).map((rel) => {\n const posixRel = rel\n .split(require(\"path\").sep)\n .join(require(\"path\").posix.sep);\n const importPathEx = `${componentsAlias}/${posixRel}`;\n const abs = join(componentsDir, rel);\n const source = rewriteAliases(require(\"fs\").readFileSync(abs, \"utf-8\"));\n const base = toIdentifier(\n require(\"path\").basename(rel, require(\"path\").extname(rel)),\n );\n const importNameEx = `${pascal}${base}`;\n const titleEx = base;\n return {\n importName: importNameEx,\n importPath: importPathEx,\n title: titleEx,\n source,\n };\n });\n }\n\n const usedInUsage = extractComponentTagsFromPreviewMarkdown(usageMDX, {\n defaultPreview: false,\n }).filter((n) => n !== pascal);\n const usedInDescription = extractComponentTagsFromPreviewMarkdown(\n descriptionBodyMDX,\n ).filter((n) => n !== pascal);\n const usedInExamples = extractComponentTagsFromExamplesSections(\n parsedExamplesSections,\n ).filter((n) => n !== pascal);\n const usedInPrimary = extractComponentTagsFromMDX(primaryExampleMDX).filter(\n (n) => n !== pascal,\n );\n const usedInApi = extractComponentTagsFromPreviewMarkdown(apiMDX, {\n defaultPreview: false,\n allowForcedPreview: false,\n }).filter((n) => n !== pascal);\n const autoSet = new Set<string>([\n ...usedInUsage,\n ...usedInDescription,\n ...usedInExamples,\n ...usedInPrimary,\n ...usedInApi,\n ]);\n\n // For folder-based components, add subcomponents used in examples to namedExports\n const usedNamedExports = isFolder\n ? namedExports.filter((n) => autoSet.has(n))\n : [];\n\n // Remove subcomponents from autoSet (they'll be included via namedExports)\n if (isFolder) {\n for (const n of namedExports) {\n autoSet.delete(n);\n }\n }\n\n const autoImports = Array.from(autoSet).filter(\n (name) => !RESERVED_COMPONENTS.has(name),\n );\n\n // Installed UI exports take precedence over the Lucide naming convention.\n const isLucideIcon = (name: string) =>\n /Icon$/.test(name) && !componentFolderMap[name];\n const lucideIcons = autoImports.filter(isLucideIcon);\n const uiAutoImports = autoImports.filter((name) => !isLucideIcon(name));\n\n const missingComponents = uiAutoImports.filter(\n (name) => !availableComponents.includes(name),\n );\n if (missingComponents.length) {\n logger.warn(\n `${slug}.mdx: previews require ${missingComponents.sort().join(\", \")}; keeping their source examples without executing them.`,\n );\n }\n\n const mdx = buildMdx({\n importName,\n importPath,\n title,\n description,\n usageMDX,\n hasImport,\n propsList,\n propsTable,\n examples,\n examplesSections: parsedExamplesSections,\n componentFolderMap,\n availableComponents,\n autoImports: uiAutoImports,\n lucideIcons,\n primaryExampleMDX,\n componentSource: astroFile.trim(),\n commandName: slug,\n figmaUrl,\n descriptionBodyMDX,\n componentsAlias,\n // Pass subcomponents as named exports for folder-based components\n namedExports: isFolder ? usedNamedExports : undefined,\n apiMDX,\n });\n const outFile = join(outDir, `${slug}.mdx`);\n mkdirSync(dirname(outFile), { recursive: true });\n await writeFile(outFile, mdx, \"utf-8\");\n generatedCount += 1;\n spin.text = `Generating docs (${generatedCount}/${total}) - ${title}`;\n if (DEBUG) logger.info(`Generated ${outFile}`);\n }\n spin.succeed(\n `Created ${generatedCount} file${generatedCount === 1 ? \"\" : \"s\"}:`,\n );\n // log all files with relative paths, sorted alphabetically\n const relPaths = components\n .map((c) => {\n const slug = slugify(c.name);\n const outFile = join(outDir, `${slug}.mdx`);\n return relative(cwd, outFile);\n })\n .sort((a, b) => a.localeCompare(b));\n relPaths.forEach((p) => {\n logger.log(` - ${p}`);\n });\n logger.break();\n}\n\nexport async function runDocsGenerator(): Promise<void> {\n await main();\n}\n\nif (\n process.env.BEJAMAS_SKIP_AUTO_RUN !== \"1\" &&\n process.env.BEJAMAS_SKIP_AUTO_RUN !== \"true\"\n) {\n runDocsGenerator().catch((err) => {\n logger.error(String(err));\n process.exit(1);\n });\n}\n"],"mappings":";;;;;;AAgFA,SAAS,wBAAwC;CAC/C,OAAO;EAAE,OAAO;EAAM,OAAO,CAAC;EAAG,OAAO,CAAC;CAAE;AAC7C;AAEA,SAAS,iBAAiB,SAA+C;CACvE,OAAO;EACL,OAAO,QAAQ;EACf,SAAS,QAAQ,MAAM,KAAK,IAAI,CAAC,CAAC,KAAK;EACvC,OAAO,QAAQ,MAAM,KAAK,UAAU;GAClC,OAAO,KAAK;GACZ,MAAM,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC,KAAK;EAClC,EAAE;CACJ;AACF;AAEA,SAAS,SAAS,SAAgC,MAAgC;CAChF,IAAI,CAAC,WAAW,CAAC,MAAM;CACvB,IAAI,CAAC,KAAK,MAAM,KAAK,CAAC,CAAC,UAAU,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ;CACtE,QAAQ,MAAM,KAAK,IAAI;AACzB;AAEA,SAAS,YACP,UACA,SACM;CACN,IAAI,CAAC,SAAS;CACd,MAAM,aAAa,iBAAiB,OAAO;CAC3C,IACE,CAAC,WAAW,SACZ,CAAC,WAAW,QAAQ,UACpB,WAAW,MAAM,WAAW,GAE5B;CAEF,SAAS,KAAK,UAAU;AAC1B;AAEA,SAAS,eAAe,MAAc,OAA6B;CACjE,MAAM,UAAU,UAAU,IAAI,qBAAqB;CACnD,MAAM,QAAQ,KAAK,KAAK,CAAC,CAAC,MAAM,OAAO;CACvC,OAAO,QAAQ,MAAM,EAAE,CAAC,KAAK,IAAI;AACnC;AAEA,SAAS,8BAA8B,MAGrC;CACA,IAAI,CAAC,QAAQ,CAAC,KAAK,KAAK,CAAC,CAAC,QAAQ,OAAO;EAAE,eAAe;EAAI,SAAS;CAAG;CAC1E,MAAM,QAAQ,KAAK,MAAM,IAAI;CAC7B,IAAI,kBAAkB;CACtB,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;EACxC,MAAM,KAAK,MAAM;EACjB,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,QAAQ;EACvB,IAAI,WAAW,KAAK,EAAE,GAAG;GACvB,kBAAkB;GAClB;EACF;CACF;CACA,IAAI,mBAAmB,GACrB,OAAO;EAAE,eAAe;EAAI,SAAS,KAAK,KAAK;CAAE;CAEnD,OAAO;EACL,eAAe,MAAM,MAAM,GAAG,eAAe,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK;EAC/D,SAAS,MAAM,MAAM,eAAe,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK;CACxD;AACF;AAEA,SAAS,sBAAsB,YAG7B;CACA,MAAM,QAAQ,WAAW,MAAM,oCAAoC;CACnE,IAAI,CAAC,OACH,OAAO;EAAE,aAAa;EAAI,QAAQ,WAAW,KAAK;CAAE;CAEtD,OAAO;EACL,aAAa,MAAM,EAAE,CAAC,KAAK;EAC3B,QAAQ,MAAM,EAAE,CAAC,KAAK;CACxB;AACF;AAEA,SAAS,yBAAyB,aAA6B;CAC7D,IAAI,CAAC,eAAe,CAAC,YAAY,QAAQ,OAAO;CAChD,OAAO,YACJ,QAAQ,qBAAqB,IAAI,CAAC,CAClC,QAAQ,oBAAoB,EAAE,CAAC,CAC/B,KAAK;AACV;AAEA,SAAS,wBAAwB,aAA8B;CAC7D,MAAM,UAAU,yBAAyB,WAAW;CACpD,IAAI,CAAC,QAAQ,QAAQ,OAAO;CAE5B,IAAI,YAAY;CAQhB,YAAY,UACT,QAAQ,kFAAmB,IAAI,CAAC,CAChC,QAAQ,oDAAyB,IAAI,CAAC,CACtC,QAAQ,wFAAmB,IAAI,CAAC,CAChC,KAAK;CAER,OAAO,UAAU,QAAQ,UAAU,EAAE,CAAC,CAAC,WAAW;AACpD;AAEA,SAAS,gCAAgC,aAA8B;CACrE,MAAM,UAAU,yBAAyB,WAAW;CACpD,IAAI,CAAC,QAAQ,QAAQ,OAAO;CAI5B,IAAI,uGAAoB,KAAK,OAAO,GAAG,OAAO;CAE9C,OAAO,CAAC,wBAAwB,OAAO;AACzC;AAEA,SAAgB,eAAe,SAA4B;CACzD,MAAM,SAAS,WAAW,GAAE,CACzB,KAAK,CAAC,CACN,MAAM,KAAK,CAAC,CACZ,QAAQ,MAAM,EAAE,MAAM,CAAC,CACvB,KAAK,MAAM,EAAE,YAAY,CAAC;CAC7B,IAAI,CAAC,MAAM,QAAQ,OAAO;EAAE,MAAM;EAAI,uBAAO,IAAI,IAAY;CAAE;CAC/D,MAAM,CAAC,MAAM,GAAG,SAAS;CACzB,OAAO;EAAE;EAAM,OAAO,IAAI,IAAI,KAAK;CAAE;AACvC;AAEA,SAAgB,wBAAwB,QAAwB;CAC9D,IAAI,CAAC,UAAU,CAAC,OAAO,QAAQ,OAAO;CACtC,OAAO,OACJ,QAAQ,oBAAoB,UAAU,CAAC,CACvC,QAAQ,sBAAsB,YAAW;AAC9C;AAYA,MAAM,6CAA6B,IAAI,IAAI;CACzC;CACA;CACA;CACA;AACF,CAAC;AAED,SAAS,iBAAiB,MAGxB;CACA,MAAM,QAAQ,KAAK,MAAM,IAAI;CAC7B,MAAM,SAA6B,CAAC;CACpC,IAAI,SAQO;CAEX,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;EACxC,MAAM,OAAO,MAAM;EACnB,MAAM,UAAU,KAAK,KAAK;EAC1B,IAAI,CAAC,QAAQ,WAAW,KAAK,GAAG;GAC9B,IAAI,QAAQ,OAAO,UAAU,KAAK,IAAI;GACtC;EACF;EAEA,IAAI,CAAC,QAAQ;GACX,MAAM,SAAS,eAAe,QAAQ,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;GACrD,SAAS;IACP,WAAW;IACX,UAAU;IACV,MAAM,OAAO;IACb,OAAO,OAAO;IACd,WAAW,CAAC;GACd;GACA;EACF;EAEA,OAAO,KAAK;GACV,UAAU,OAAO;GACjB,WAAW;GACX,MAAM,OAAO;GACb,OAAO,OAAO;GACd,MAAM,OAAO,UAAU,KAAK,IAAI;GAChC,WAAW,OAAO;GAClB,SAAS;EACX,CAAC;EACD,SAAS;CACX;CAEA,OAAO;EAAE;EAAO;CAAO;AACzB;AAEA,SAAS,oBAAoB,OAAiC;CAC5D,MAAM,QAAQ,CAAC,MAAM,QAAQ;CAC7B,IAAI,MAAM,KAAK,QAAQ,MAAM,KAAK,MAAM,IAAI;CAC5C,MAAM,KAAK,MAAM,SAAS;CAC1B,OAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,uBACP,OACA,QACA,sBACQ;CACR,MAAM,+BAAe,IAAI,IAAY;CACrC,KAAK,MAAM,CAAC,OAAO,UAAU,OAAO,QAAQ,GAAG;EAC7C,IAAI,CAAC,qBAAqB,IAAI,KAAK,GAAG;EACtC,KAAK,IAAI,OAAO,MAAM,WAAW,QAAQ,MAAM,SAAS,QAAQ,GAC9D,aAAa,IAAI,IAAI;CAEzB;CAEA,OAAO,MACJ,QAAQ,GAAG,UAAU,CAAC,aAAa,IAAI,KAAK,CAAC,CAAC,CAC9C,KAAK,IAAI,CAAC,CACV,KAAK;AACV;AAEA,SAAS,uBAAuB,MAUvB;CACP,IAAI,CAAC,QAAQ,CAAC,KAAK,KAAK,CAAC,CAAC,QAAQ,OAAO;CACzC,MAAM,EAAE,OAAO,WAAW,iBAAiB,IAAI;CAC/C,MAAM,kBAAkB,OAAO,WAAW,UAAU,MAAM,SAAS,OAAO;CAC1E,IAAI,oBAAoB,IAAI,OAAO;CAEnC,MAAM,aAAa,OAAO;CAC1B,MAAM,uCAAuB,IAAI,IAAY,CAAC,eAAe,CAAC;CAC9D,IAAI,oBAAoB;CACxB,IAAI,iBAA2B,CAAC;CAChC,IAAI,mBAAmB;CACvB,IAAI,wBAAwB;CAC5B,IAAI,2BAA2B;CAE/B,IAAI,WAAW,MAAM,IAAI,SAAS,GAAG;EACnC,MAAM,YAAY,OAAO,kBAAkB;EAC3C,IAAI,aAAa,2BAA2B,IAAI,UAAU,IAAI,GAAG;GAC/D,qBAAqB,IAAI,kBAAkB,CAAC;GAC5C,oBAAoB,oBAAoB,SAAS;GACjD,mBAAmB,MAChB,MAAM,WAAW,UAAU,GAAG,UAAU,SAAS,CAAC,CAClD,KAAK,IAAI,CAAC,CACV,KAAK;GACR,wBAAwB,MAAM,MAAM,UAAU,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK;GAC3E,2BAA2B,iBAAiB,WAAW;GACvD,MAAM,mBAAmB,UAAU,KAAK,KAAK;GAC7C,IAAI,iBAAiB,QACnB,iBAAiB,CAAC,gBAAgB;EAEtC;CACF;CAEA,MAAM,gBAAgB,kBAAkB,SACpC,MAAM,MAAM,GAAG,WAAW,SAAS,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,IACrD,uBAAuB,OAAO,QAAQ,oBAAoB;CAE9D,OAAO;EACL,YAAY,wBAAwB,WAAW,KAAK,KAAK,CAAC;EAC1D;EACA,aAAa,WAAW,MAAM,IAAI,WAAW;EAC7C,oBAAoB,WAAW,MAAM,IAAI,SAAS;EAClD;EACA;EACA;EACA;EACA;CACF;AACF;AAEA,SAAgB,sBAAsB,aAA6C;CACjF,IAAI,CAAC,eAAe,CAAC,YAAY,KAAK,CAAC,CAAC,QAAQ,OAAO,CAAC;CAExD,MAAM,WAAmC,CAAC;CAC1C,MAAM,QAAQ,YAAY,MAAM,IAAI;CACpC,IAAI,iBAAwC;CAC5C,IAAI,cAAkC;CACtC,IAAI,UAAU;CAEd,KAAK,MAAM,QAAQ,OAAO;EAGxB,IAFgB,KAAK,KAEX,CAAC,CAAC,WAAW,KAAK,GAAG;GAC7B,UAAU,CAAC;GACX,IAAI,CAAC,gBAAgB,iBAAiB,sBAAsB;GAC5D,IAAI,aAAa,YAAY,KAAK,KAAK,IAAI;QACtC,eAAe,MAAM,KAAK,IAAI;GACnC;EACF;EAEA,IAAI,CAAC,SAAS;GACZ,MAAM,KAAK,eAAe,MAAM,CAAC;GACjC,IAAI,IAAI;IACN,SAAS,gBAAgB,WAAW;IACpC,cAAc;IACd,YAAY,UAAU,cAAc;IACpC,iBAAiB;KAAE,OAAO;KAAI,OAAO,CAAC;KAAG,OAAO,CAAC;IAAE;IACnD;GACF;GAEA,MAAM,KAAK,eAAe,MAAM,CAAC;GACjC,IAAI,IAAI;IACN,IAAI,CAAC,gBAAgB,iBAAiB,sBAAsB;IAC5D,SAAS,gBAAgB,WAAW;IACpC,cAAc;KAAE,OAAO;KAAI,MAAM,CAAC;IAAE;IACpC;GACF;EACF;EAEA,IAAI,CAAC,gBAAgB,iBAAiB,sBAAsB;EAC5D,IAAI,aAAa,YAAY,KAAK,KAAK,IAAI;OACtC,eAAe,MAAM,KAAK,IAAI;CACrC;CAEA,SAAS,gBAAgB,WAAW;CACpC,YAAY,UAAU,cAAc;CACpC,OAAO;AACT;AAEA,SAAgB,sBAAsB,MAAsC;CAC1E,IAAI,CAAC,QAAQ,CAAC,KAAK,KAAK,CAAC,CAAC,QACxB,OAAO;EACL,eAAe;EACf,SAAS;EACT,YAAY;EACZ,iBAAiB;EACjB,aAAa;EACb,oBAAoB;EACpB,gBAAgB,CAAC;EACjB,mBAAmB;EACnB,kBAAkB;EAClB,uBAAuB;EACvB,0BAA0B;CAC5B;CAGF,MAAM,SAAS,uBAAuB,IAAI;CAC1C,IAAI,QAAQ;EACV,MAAM,EAAE,aAAa,WAAW,sBAAsB,OAAO,UAAU;EACvE,MAAM,oBAAoB,gCAAgC,WAAW;EACrE,OAAO;GACL,eAAe,OAAO;GACtB,SAAS;GACT,YAAY,OAAO;GACnB,iBAAiB;GACjB,aAAa,OAAO,eAAe;GACnC,oBAAoB,OAAO;GAC3B,gBAAgB,OAAO;GACvB,mBAAmB,OAAO;GAC1B,kBAAkB,OAAO;GACzB,uBAAuB,OAAO;GAC9B,0BAA0B,OAAO;EACnC;CACF;CAEA,MAAM,QAAQ,8BAA8B,IAAI;CAChD,OAAO;EACL,eAAe,MAAM;EACrB,SAAS,MAAM;EACf,YAAY,MAAM;EAClB,iBAAiB;EACjB,aAAa;EACb,oBAAoB;EACpB,gBAAgB,CAAC;EACjB,mBAAmB;EACnB,kBAAkB;EAClB,uBAAuB;EACvB,0BAA0B;CAC5B;AACF;AAEA,SAAS,YAAY,OAAyB;CAC5C,IAAI,CAAC,SAAS,CAAC,MAAM,QAAQ,OAAO,CAAC;CACrC,MAAM,wBAAQ,IAAI,IAAY;CAC9B,MAAM,WAAW;CACjB,IAAI;CACJ,QAAQ,QAAQ,SAAS,KAAK,KAAK,OAAO,MACxC,MAAM,IAAI,MAAM,EAAE;CAEpB,OAAO,MAAM,KAAK,KAAK;AACzB;AAEA,SAAgB,wCACd,OACA,SAA8B,CAAC,GACrB;CACV,IAAI,CAAC,SAAS,CAAC,MAAM,QAAQ,OAAO,CAAC;CACrC,MAAM,EAAE,iBAAiB,MAAM,qBAAqB,SAAS;CAC7D,MAAM,wBAAQ,IAAI,IAAY;CAC9B,MAAM,QAAQ,MAAM,MAAM,IAAI;CAC9B,IAAI,UAAU;CACd,IAAI,YAAY;CAChB,IAAI,mBAAmB;CACvB,IAAI,oCAAoB,IAAI,IAAY;CACxC,MAAM,YAAsB,CAAC;CAE7B,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,UAAU,KAAK,KAAK;EAC1B,IAAI,QAAQ,WAAW,KAAK,GAAG;GAC7B,IAAI,CAAC,SAAS;IACZ,UAAU;IACV,YAAY;IACZ,MAAM,SAAS,eAAe,QAAQ,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;IACrD,mBAAmB,OAAO;IAC1B,oBAAoB,OAAO;IAC3B,UAAU,SAAS;IACnB;GACF;GAEA,IAAI,qBAAqB,SAAS;IAChC,MAAM,aAAa,UAAU,KAAK,IAAI,CAAC,CAAC,KAAK;IAC7C,MAAM,WAAW,sBACf,GAAG,UAAU,IAAI,WAAW,IAAI,MAClC;IACA,MAAM,uBACJ,kBAAkB,IAAI,SAAS,KAAK,kBAAkB,IAAI,SAAS;IAIrE,IAFE,CAAC,SAAS,gBACT,kBAAmB,sBAAsB,uBAE1C,KAAK,MAAM,OAAO,YAAY,SAAS,OAAO,GAAG,MAAM,IAAI,GAAG;GAElE;GAEA,UAAU;GACV,YAAY;GACZ,mBAAmB;GACnB,oCAAoB,IAAI,IAAY;GACpC,UAAU,SAAS;GACnB;EACF;EAEA,IAAI,SAAS;GACX,UAAU,KAAK,IAAI;GACnB;EACF;EAEA,KAAK,MAAM,OAAO,YAAY,IAAI,GAAG,MAAM,IAAI,GAAG;CACpD;CAEA,OAAO,MAAM,KAAK,KAAK;AACzB;AAEA,SAAgB,yCACd,UACU;CACV,IAAI,CAAC,UAAU,QAAQ,OAAO,CAAC;CAC/B,MAAM,wBAAQ,IAAI,IAAY;CAC9B,KAAK,MAAM,WAAW,UAAU;EAC9B,KAAK,MAAM,OAAO,wCAAwC,QAAQ,OAAO,GACvE,MAAM,IAAI,GAAG;EAEf,KAAK,MAAM,QAAQ,QAAQ,OAAO;GAChC,MAAM,WAAW,sBAAsB,KAAK,IAAI;GAChD,IAAI,SAAS,aAAa;GAC1B,KAAK,MAAM,OAAO,YAAY,SAAS,OAAO,GAAG,MAAM,IAAI,GAAG;EAChE;CACF;CACA,OAAO,MAAM,KAAK,KAAK;AACzB;;;;;;;ACpiBA,SAAS,eAAe,MAAuB;CAC7C,OAAO,CAAC,KAAK,SAAS,QAAQ;AAChC;;;;;;;;;;;;AAaA,SAAS,kBAAkB,MAAsB;CAiB/C,MAAM,iBAAiB;EAbrB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CAIqC,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM;CAC3E,KAAK,MAAM,UAAU,gBACnB,IAAI,SAAS,UAAU,KAAK,WAAW,MAAM,GAE3C,OAAO,OAAO,QAAQ,mBAAmB,OAAO,CAAC,CAAC,YAAY;CAOlE,MAAM,YAAY,KAAK,MAAM,cAAc;CAC3C,OAAO,YAAY,UAAU,EAAE,CAAC,YAAY,IAAI,KAAK,YAAY;AACnE;AAEA,SAAS,uBACP,MACA,oBACQ;CACR,IAAI,CAAC,oBAAoB,OAAO,kBAAkB,IAAI;CACtD,MAAM,SAAS,mBAAmB;CAClC,IAAI,UAAU,OAAO,QAAQ,OAAO;CAEpC,OAAO,kBAAkB,IAAI;AAC/B;;;;AAKA,SAAS,wBACP,YACA,oBACuB;CACvB,MAAM,yBAAS,IAAI,IAAsB;CACzC,KAAK,MAAM,QAAQ,YAAY;EAC7B,MAAM,SAAS,uBAAuB,MAAM,kBAAkB;EAC9D,IAAI,CAAC,OAAO,IAAI,MAAM,GACpB,OAAO,IAAI,QAAQ,CAAC,CAAC;EAEvB,OAAO,IAAI,MAAM,CAAC,CAAE,KAAK,IAAI;CAC/B;CACA,OAAO;AACT;;;;AAKA,SAAS,sBACP,YACA,iBACA,oBACU;CACV,MAAM,SAAS,wBAAwB,YAAY,kBAAkB;CACrE,MAAM,QAAkB,CAAC;CAGzB,MAAM,gBAAgB,MAAM,KAAK,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK;CAErD,KAAK,MAAM,UAAU,eAAe;EAClC,MAAM,QAAQ,OAAO,IAAI,MAAM,CAAC,CAAE,KAAK;EACvC,IAAI,OAAO,SAAS,QAAQ,GAAG;GAC7B,KAAK,MAAM,QAAQ,OACjB,MAAM,KAAK,UAAU,KAAK,SAAS,gBAAgB,GAAG,OAAO,GAAG;GAClE;EACF;EACA,MAAM,KACJ,YAAY,MAAM,KAAK,IAAI,EAAE,WAAW,gBAAgB,GAAG,OAAO,GACpE;CACF;CAEA,OAAO;AACT;;;;AAKA,SAAS,uBACP,YACA,iBACU;CACV,OAAO,WACJ,MAAM,CAAC,CACP,KAAK,CAAC,CACN,KAAK,SAAS,UAAU,KAAK,SAAS,gBAAgB,GAAG,KAAK,SAAS;AAC5E;AAEA,SAAgB,SAAS,QA0Cd;CACT,MAAM,EACJ,YACA,YACA,OACA,aACA,oBACA,UACA,WACA,WACA,YACA,UACA,kBACA,oBACA,aACA,aACA,mBACA,iBACA,aACA,UACA,iBACA,cACA,WACE;CAEJ,MAAM,YAAY,OAAO,sBACrB,IAAI,IAAI,OAAO,mBAAmB,IAClC;CACJ,MAAM,oBAAoB,UACxB,MAAM,QACH,SACC,aACA,CAAC,UAAU,IAAI,IAAI,KACnB,CAAC,oBAAoB,IAAI,IAAI,KAC7B,CAAC,QAAQ,KAAK,IAAI,CACtB;CACF,MAAM,sBAAsB,YAC1B,iBAAiB,CACf,GAAG,IAAI,IACL,CAAC,GAAG,QAAQ,SAAS,0BAA0B,CAAC,CAAC,CAAC,KAC/C,UAAU,MAAM,EACnB,CACF,CACF,CAAC;CACH,MAAM,iBAAiB,UAAoB;EAMzC,OAAO,4CALY,CACjB,GAAG,IAAI,IACL,MAAM,KAAK,SAAS,uBAAuB,MAAM,kBAAkB,CAAC,CACtE,CACF,CAAC,CAAC,KAC0D,CAAC,CAAC,KAAK,GAAG,EAAE;CAC1E;CAGA,MAAM,mBAAmB,eAAe,UAAU;CAElD,MAAM,gBAAgB,eAAe,CAAC,EAAC,CAAE,MAAM,CAAC,CAAC,KAAK;CAItD,MAAM,qBAAqB,CACzB,6FAJoB,aAAa,SAC/B,YAAY,aAAa,KAAK,IAAI,EAAE,4BACpC,IAIJ,CAAC,CACE,QAAQ,MAAM,KAAK,IAAI,CAAC,CACxB,MAAM,CAAC,CACP,MAAM,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,cAAc,OAAO,CAAC,CAAC,CAAC;CAEpD,MAAM,gBAAgB,eAAe,CAAC,EAAC,CACpC,QAAQ,SAAS,CAAC,aAAa,UAAU,IAAI,IAAI,CAAC,CAAC,CACnD,MAAM,CAAC,CACP,KAAK;CAGR,MAAM,cACJ,oBAAoB,qBAChB,sBAAsB,cAAc,iBAAiB,kBAAkB,IACvE,uBAAuB,cAAc,eAAe;CAE1D,MAAM,gBAAgB,YAAY,CAAC,EAAC,CACjC,QAAQ,OAAO,CAAC,mBAAmB,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,CACrD,KAAK,OAAO,UAAU,GAAG,WAAW,SAAS,GAAG,WAAW,GAAG,CAAC,CAC/D,MAAM,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;CAGpC,IAAI,iBAAgC;CACpC,IAAI,CAAC,WAAW;EACd,IAAI,kBAGF,iBAAiB,YADD,CAAC,YAAY,GAAI,gBAAgB,CAAC,CAAE,CAAC,CAAC,KACnB,CAAC,CAAC,KAAK,IAAI,EAAE,WAAW,WAAW;OAGtE,iBAAiB,UAAU,WAAW,SAAS,WAAW;CAE9D;CAEA,MAAM,qBAAqB;EAAC;EAAgB,GAAG;EAAa,GAAG;CAAY,CAAC,CACzE,QAAQ,MAAM,KAAK,IAAI,CAAC,CACxB,MAAM,CAAC,CACP,MAAM,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,cAAc,OAAO,CAAC,CAAC,CAAC;CAEpD,MAAM,cAAc;EAClB,GAAG;EACH,mBAAmB,UAAU,mBAAmB,SAAS,KAAK;EAC9D,GAAG;CACL,CAAC,CAAC,QAAQ,MAAM,MAAM,QAAQ,MAAM,MAAS;CAG7C,MAAM,eAAe,YAAiC;EACpD,MAAM,wBAAQ,IAAI,IAAY;EAC9B,MAAM,WAAW;EACjB,IAAI;EACJ,QAAQ,IAAI,SAAS,KAAK,OAAO,OAAO,MACtC,MAAM,IAAI,EAAE,EAAE;EAEhB,OAAO;CACT;CAEA,MAAM,2BAA2B,YAA8B;EAC7D,IAAI,CAAC,WAAW,CAAC,QAAQ,QAAQ,OAAO,CAAC;EACzC,MAAM,OAAO,YAAY,OAAO;EAChC,MAAM,YAAY,aAAa,QAAQ,MAAM,KAAK,IAAI,CAAC,CAAC;EAGxD,MAAM,UAAU,eAAe,CAAC,EAAC,CAAE,QAAQ,MAAM,KAAK,IAAI,CAAC,CAAC;EAG5D,MAAM,cAAc,CAAC,aAAa,KAAK,IAAI,UAAU;EAGrD,MAAM,mBACJ,oBAAoB,eAChB,aAAa,QAAQ,MAAM,KAAK,IAAI,CAAC,CAAC,IACtC,CAAC;EAEP,MAAM,WAAqB,CAAC;EAC5B,IAAI,UAAU,QACZ,SAAS,KAAK,YAAY,UAAU,KAAK,IAAI,EAAE,yBAAyB;EAG1E,MAAM,WAAqB,CAAC;EAE5B,IAAI,kBAAkB;GAIpB,IAAI,eAAe,iBAAiB,SAAS,GAAG;IAC9C,MAAM,cAAc,CAClB,GAAI,cAAc,CAAC,UAAU,IAAI,CAAC,GAClC,GAAG,gBACL,CAAC,CAAC,KAAK;IACP,SAAS,KACP,YAAY,YAAY,KAAK,IAAI,EAAE,WAAW,WAAW,GAC3D;GACF;GAGA,IAAI,OAAO,SAAS,GAClB,SAAS,KACP,GAAG,sBAAsB,QAAQ,iBAAiB,kBAAkB,CACtE;EAEJ,OAAO;GAEL,IAAI,aACF,SAAS,KAAK,UAAU,WAAW,SAAS,WAAW,GAAG;GAE5D,SAAS,KACP,GAAI,qBACA,sBAAsB,QAAQ,iBAAiB,kBAAkB,IACjE,uBAAuB,QAAQ,eAAe,CACpD;EACF;EAEA,MAAM,iBAAiB,SAAS,MAAM,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;EACzE,MAAM,iBAAiB,SAAS,MAAM,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;EACzE,OAAO;GACL,GAAG;GACH,eAAe,UAAU,eAAe,SAAS,KAAK;GACtD,GAAG;EACL,CAAC,CAAC,QAAQ,MAAM,MAAM,QAAQ,MAAM,MAAS;CAC/C;CAEA,IAAI,wBAAwB;CAE5B,MAAM,iBAAiB,YAA4B;EACjD,IAAI,CAAC,SAAS,OAAO;EACrB,OAAO,QAAQ,QAAQ,eAAe,OAAO,UAAU;GACrD,MAAM,UAAU,MAAM,KAAK;GAC3B,IAAI,CAAC,QAAQ,QAAQ,OAAO;GAE5B,IAAI,gBAAgB,KAAK,OAAO,GAAG,OAAO;GAG1C,IAAI,YAAY,KAAK,KAAK,GAAG,OAAO;GACpC,OAAO,KAAK,KAAK,UAAU,KAAK,EAAE;EACpC,CAAC;CACH;;;;;;;CAQA,MAAM,6BAA6B,YAA4B;EAC7D,IAAI,CAAC,SAAS,OAAO;EAGrB,OAAO,QAAQ,QAAQ,QAAQ,GAAG,CAAC,CAAC,KAAK;CAC3C;;;;;;;CAQA,MAAM,mCAAmC,YAA4B;EACnE,IAAI,CAAC,SAAS,OAAO;EAGrB,OAAO,QAAQ,QACb,gCACC,OAAO,OAAO,YAAY;GAEzB,IAAI,qBAAqB,KAAK,OAAO,GAGnC,OAAO,QADW,SAAS,GACF,yBAAyB,QAAQ;GAE5D,OAAO;EACT,CACF;CACF;CAYA,MAAM,wBACJ,YAIG;EACH,IAAI,CAAC,SAAS,OAAO;GAAE,QAAQ;GAAS,SAAS,CAAC;EAAE;EACpD,MAAM,UAAoB,CAAC;EAQ3B,OAAO;GAAE,QAPM,QAAQ,QACrB,0CACC,GAAG,eAAuB;IACzB,QAAQ,MAAM,cAAc,GAAE,CAAE,KAAK,CAAC;IACtC,OAAO;GACT,CAEY;GAAG;EAAQ;CAC3B;CAEA,MAAM,gBACJ,SACA,UAAgC,CAAC,MACS;EAC1C,IAAI,CAAC,SAAS,OAAO;GAAE,QAAQ;GAAI,SAAS,CAAC;EAAE;EAC/C,MAAM,EAAE,qBAAqB,OAAO,iBAAiB,CAAC,MAAM;EAC5D,MAAM,YAAY,qBAAqB,OAAO;EAC9C,MAAM,yBACJ,sBAAsB,eAAe,SACjC,iBACA,qBACE,UAAU,UACV,CAAC;EAGT,MAAM,kBAFiB,UAAU,OAEM,QACrC,sBACA,UACF;EAEA,MAAM,0BACJ,gCAAgC,eAAe;EAEjD,IAAI,WAAW,KAAK,uBAAuB,GACzC,OAAO;GACL,QAAQ,0BAA0B,uBAAuB;GACzD,SAAS;EACX;EAGF,MAAM,aAAa,0BAA0B,uBAAuB;EACpE,OAAO;GACL,QAAQ,cAAc,UAAU;GAChC,SAAS;EACX;CACF;CAEA,MAAM,6BACJ,QACA,SACA,eACW;EAKX,OAAO;uCAJkB,KAAK,UAAU,MAKU,EAAE;wCAJ1B,KAAK,UAAU,OAKW,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yDAJzB,KAAK,UAAU,UAqD4B,EAAE;;;;;;;;CAQ5E;CAEA,MAAM,wBACJ,QACA,SACA,YACW;EACX,IAAI,CAAC,QAAQ,QAAQ,OAAO;EAC5B,OAAO,QACJ,QAAQ,WAAW,UAAU,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,CAClD,KAAK,WAAW;GACf,MAAM,gBAAgB,0BACpB,QACA,SACA,MACF;GAEA,OAAO,iEADS,mBAAmB,aAC2C,EAAE;EAClF,CAAC,CAAC,CACD,KAAK,IAAI;CACd;CAEA,MAAM,2BAA2B,aAA6B;EAC5D,IAAI,CAAC,YAAY,CAAC,SAAS,KAAK,CAAC,CAAC,QAAQ,OAAO;EAEjD,MAAM,QADqB,SAAS,KACL,CAAC,CAAC,MAC/B,qCACF;EACA,IAAI,CAAC,OAAO,OAAO;EAEnB,MAAM,GAAG,UAAU,IAAI,WAAW,IAAI,OAAO,MAAM;EACnD,MAAM,OAAO,QAAQ,KAAK,CAAC,CAAC,YAAY;EACxC,IAAI,CAAC;GAAC;GAAM;GAAM;GAAc;EAAY,CAAC,CAAC,SAAS,IAAI,GACzD,OAAO;EAGT,MAAM,YAAY,CAAC,SAAS,SAAS,KAAK,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;EACrE,MAAM,aAAa,KAAK,QAAQ,QAAQ,EAAE;EAC1C,OAAO;GACL,SAAS;GACT;GACA;GACA;GACA;EACF,CAAC,CAAC,KAAK,IAAI;CACb;CAEA,MAAM,8BAA8B,aAA6B;EAC/D,IAAI,CAAC,YAAY,CAAC,SAAS,KAAK,CAAC,CAAC,QAAQ,OAAO;EAEjD,MAAM,QADqB,SAAS,KACL,CAAC,CAAC,MAC/B,qCACF;EACA,IAAI,CAAC,OAAO,OAAO;EAEnB,MAAM,GAAG,UAAU,MAAM,OAAO,MAAM;EACtC,MAAM,OAAO,QAAQ,KAAK,CAAC,CAAC,YAAY;EACxC,IAAI,CAAC;GAAC;GAAM;GAAM;GAAc;EAAY,CAAC,CAAC,SAAS,IAAI,GACzD,OAAO;EAGT,OAAO,KAAK,QAAQ,QAAQ,EAAE;CAChC;CAEA,MAAM,6BACJ,WACA,YACA,sBACW;EACX,MAAM,aAAa,2BAA2B,iBAAiB;EAC/D,IAAI,CAAC,WAAW,QACd,OAAO;GAAC;GAAW;GAAY;EAAK,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,IAAI;EAGjE,MAAM,uBAAuB,WAAW,QAAQ,QAAQ,EAAE;EAC1D,MAAM,QAAQ,CAAC,SAAS;EACxB,IAAI,qBAAqB,QACvB,MAAM,KAAK,sBAAsB,EAAE;EAErC,MAAM,KAAK,YAAY,YAAY,cAAa,KAAK;EACrD,OAAO,MAAM,KAAK,IAAI;CACxB;CAEA,MAAM,sBACJ,SACA,UAAgC,CAAC,MACtB;EACX,MAAM,UAAU,mBAAmB,OAAO;EAC1C,IAAI,QAAQ,QAAQ,OAAO,cAAc,OAAO;EAChD,MAAM,EAAE,qBAAqB,UAAU;EACvC,MAAM,kBAAkB,aAAa,SAAS,OAAO;EACrD,IAAI,CAAC,gBAAgB,UAAU,CAAC,gBAAgB,OAAO,QAAQ,OAAO;EAEtE,IAAI,CAAC,oBACH,OAAO;EACX,gBAAgB,OAAO;;EAIrB,yBAAyB;EACzB,MAAM,SAAS,8BAA8B;EAC7C,MAAM,UAAU,GAAG,OAAO;EAC1B,MAAM,aAAa,qBACjB,QACA,SACA,gBAAgB,OAClB;EAWA,OAVc;GACZ,YAAY,OAAO;GACnB,gBAAgB;GAChB;GACA;GACA,YAAY,QAAQ;GACpB,cAAc,WAAW,SAAS,aAAa;GAC/C;EACF,CAAC,CAAC,QAAQ,SAAS,SAAS,IAEjB,CAAC,CAAC,KAAK,IAAI;CACxB;CAEA,MAAM,iCACJ,OACA,SAAgC,CAAC,MACtB;EACX,IAAI,CAAC,SAAS,CAAC,MAAM,QAAQ,OAAO;EACpC,MAAM,aAAa,iBACjB,wCAAwC,OAAO;GAC7C,gBAAgB;GAChB,oBAAoB;EACtB,CAAC,CACH;EACA,IAAI,WAAW,QACb,OAAO,GAAG,cAAc,UAAU,EAAE,mBAAmB,MAAM;EAC/D,MAAM,EAAE,iBAAiB,MAAM,qBAAqB,SAAS;EAE7D,MAAM,QAAQ,MAAM,MAAM,IAAI;EAC9B,MAAM,MAAgB,CAAC;EACvB,IAAI,UAAU;EACd,IAAI,YAAY;EAChB,IAAI,mBAAmB;EACvB,IAAI,oCAAoB,IAAI,IAAY;EACxC,MAAM,YAAsB,CAAC;EAE7B,MAAM,6BACJ,eAC0C;GAC1C,IAAI,QAAQ;GACZ,OAAO,QAAQ,MAAM,QAAQ;IAE3B,MAAM,cADc,MAAM,MACK,CAAC,KAAK;IACrC,IAAI,CAAC,YAAY,UAAU,CAAC,YAAY,WAAW,KAAK,GAAG;KACzD,SAAS;KACT;IACF;IAEA,MAAM,SAAS,eAAe,YAAY,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;IACzD,IAAI,CAAC;KAAC;KAAM;KAAM;KAAc;IAAY,CAAC,CAAC,SAAS,OAAO,IAAI,GAChE,OAAO;IAGT,IAAI,MAAM,QAAQ;IAClB,OAAO,MAAM,MAAM,QAAQ;KACzB,IAAI,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,KAAK,GACpC,OAAO;MAAE,OAAO;MAAO;KAAI;KAE7B,OAAO;IACT;IAEA,OAAO;GACT;GACA,OAAO;EACT;EAEA,KAAK,IAAI,YAAY,GAAG,YAAY,MAAM,QAAQ,aAAa,GAAG;GAChE,MAAM,OAAO,MAAM;GACnB,MAAM,UAAU,KAAK,KAAK;GAC1B,IAAI,QAAQ,WAAW,KAAK,GAAG;IAC7B,IAAI,CAAC,SAAS;KACZ,UAAU;KACV,YAAY;KACZ,MAAM,SAAS,eAAe,QAAQ,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;KACrD,mBAAmB,OAAO;KAC1B,oBAAoB,OAAO;KAC3B,UAAU,SAAS;KACnB;IACF;IAEA,IAAI,qBAAqB,SAAS;KAChC,MAAM,aAAa,wBACjB,UAAU,KAAK,IAAI,CAAC,CAAC,KAAK,CAC5B;KACA,MAAM,wBAAwB,kBAAkB,IAAI,SAAS,IACzD,0BAA0B,YAAY,CAAC,IACvC;KACJ,MAAM,oBAAoB,wBACtB,MACG,MAAM,YAAY,GAAG,sBAAsB,MAAM,CAAC,CAAC,CACnD,KAAK,IAAI,IACZ;KACJ,MAAM,WAAW,sBACf,kBAAkB,SACd,GAAG,UAAU,IAAI,WAAW,IAAI,KAAK,IAAI,sBACzC,GAAG,UAAU,IAAI,WAAW,IAAI,MACtC;KACA,MAAM,uBACJ,kBAAkB,IAAI,SAAS,KAC/B,kBAAkB,IAAI,SAAS;KACjC,MAAM,gBACJ,CAAC,SAAS,gBACT,kBAAmB,sBAAsB;KAC5C,IAAI,SAAS,WAAW,SAAS,QAAQ,UAAU,eAAe;MAChE,MAAM,eAAe,mBAAmB,SAAS,SAAS;OACxD,oBAAoB,SAAS;OAC7B,gBAAgB,SAAS;MAC3B,CAAC;MACD,IAAI,aAAa,QACf,IAAI,KAAK,YAAY;MAEvB,IAAI,KAAK,EAAE;KACb;IACF;IAEA,IAAI,qBAAqB,SAAS;KAChC,MAAM,sBAAsB,wBAC1B,UAAU,KAAK,IAAI,CACrB;KACA,MAAM,wBAAwB,kBAAkB,IAAI,SAAS,IACzD,0BAA0B,YAAY,CAAC,IACvC;KACJ,MAAM,oBAAoB,wBACtB,MACG,MAAM,YAAY,GAAG,sBAAsB,MAAM,CAAC,CAAC,CACnD,KAAK,IAAI,IACZ;KACJ,MAAM,WAAW,kBAAkB,SAC/B,sBACE,GAAG,UAAU,IAAI,oBAAoB,IAAI,KAAK,IAAI,mBACpD,IACA;KAEJ,IACE,UAAU,qBACV,SAAS,kBAAkB,UAC3B,SAAS,0BACT;MACA,IAAI,KACF,0BACE,WACA,qBACA,SAAS,iBACX,CACF;MACA,IAAI,uBACF,YAAY,sBAAsB;KAEtC,OAAO;MACL,IAAI,KAAK,SAAS;MAClB,IAAI,oBAAoB,QACtB,IAAI,KAAK,GAAG,oBAAoB,MAAM,IAAI,CAAC;MAE7C,IAAI,KAAK,IAAI;MAEb,IACE,UAAU,qBACV,SAAS,kBAAkB,UAC3B,uBACA;OACA,MAAM,iBAAiB,MACpB,MAAM,YAAY,GAAG,sBAAsB,KAAK,CAAC,CACjD,KAAK,IAAI;OACZ,IAAI,eAAe,QACjB,IAAI,KAAK,cAAc;OAEzB,IAAI,KAAK,wBAAwB,SAAS,iBAAiB,CAAC;OAC5D,YAAY,sBAAsB;MACpC;KACF;IACF,OAAO;KACL,IAAI,KAAK,SAAS;KAClB,IAAI,UAAU,QACZ,IAAI,KAAK,GAAG,SAAS;KAEvB,IAAI,KAAK,IAAI;IACf;IAEA,UAAU;IACV,YAAY;IACZ,mBAAmB;IACnB,oCAAoB,IAAI,IAAY;IACpC,UAAU,SAAS;IACnB;GACF;GAEA,IAAI,SAAS;IACX,UAAU,KAAK,IAAI;IACnB;GACF;GAEA,IAAI,KAAK,IAAI;EACf;EAEA,IAAI,SAAS;GACX,IAAI,KAAK,SAAS;GAClB,IAAI,qBAAqB,SAAS;IAChC,MAAM,sBAAsB,wBAC1B,UAAU,KAAK,IAAI,CACrB;IACA,IAAI,oBAAoB,QACtB,IAAI,KAAK,GAAG,oBAAoB,MAAM,IAAI,CAAC;GAE/C,OAAO,IAAI,UAAU,QACnB,IAAI,KAAK,GAAG,SAAS;EAEzB;EAEA,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,KAAK;CAC7B;CAEA,MAAM,6BAA6B,8BACjC,sBAAsB,EACxB;CACA,MAAM,mBAAmB,8BAA8B,YAAY,IAAI,EACrE,gBAAgB,MAClB,CAAC;CACD,MAAM,iBAAiB,8BAA8B,UAAU,IAAI;EACjE,gBAAgB;EAChB,oBAAoB;CACtB,CAAC;CAED,MAAM,wBACJ,qBAAqB,kBAAkB,SACnC,GAAG,mBAAmB,iBAAiB,EAAE;;;SAGxC;EACP,MAAM,QAAQ,wBAAwB,iBAAiB;EACvD,OAAO,MAAM,SAAS,QAAQ,MAAM,KAAK,IAAI,EAAE,aAAa;CAC9D,EAAC,CAAE,IAAI,kBAAkB;UAEjB;CAEN,MAAM,qBACJ,cACA,cACA,SACW;EACX,MAAM,WAAW,sBAAsB,IAAI;EAE3C,MAAM,SAAmB,CAAC,GADL,aAAa,GAAG,cACF;EACnC,IAAI,SAAS,iBAAiB,SAAS,cAAc,QACnD,OAAO,KAAK,8BAA8B,SAAS,aAAa,CAAC;EAGnE,IACE,SAAS,WACT,SAAS,QAAQ,UACjB,SAAS,cACT,SAAS,WAAW,UACpB,CAAC,SAAS,aAEV,OAAO,KACL,mBAAmB,SAAS,SAAS;GACnC,oBAAoB,SAAS;GAC7B,gBAAgB,SAAS;EAC3B,CAAC,CACH;EAGF,IAAI,SAAS,cAAc,SAAS,WAAW,QAAQ;GACrD,MAAM,cAAc,SAAS,kBACzB,SAAS,aACT,UAAU;IACR,MAAM,QAAQ,wBAAwB,SAAS,UAAU;IACzD,OAAO,MAAM,SAAS,QAAQ,MAAM,KAAK,IAAI,EAAE,aAAa;GAC9D,EAAC,CAAE,IAAI,SAAS;GACpB,IACE,SAAS,qBACT,SAAS,kBAAkB,UAC3B,SAAS,0BAET,OAAO,KACL,0BACE,YACA,aACA,SAAS,iBACX,CACF;QAEA,OAAO,KAAK;EAClB,YAAY;OACP;GAED,IACE,SAAS,oBACT,SAAS,iBAAiB,UAC1B,CAAC,SAAS,0BAEV,OAAO,KAAK,SAAS,gBAAgB;GAEvC,IACE,SAAS,qBACT,SAAS,kBAAkB,UAC3B,CAAC,SAAS,0BAEV,OAAO,KAAK,wBAAwB,SAAS,iBAAiB,CAAC;GAEjE,IACE,SAAS,yBACT,SAAS,sBAAsB,QAE/B,OAAO,KACL,8BAA8B,SAAS,qBAAqB,CAC9D;EAEJ;EAEA,OAAO,OAAO,KAAK,MAAM;CAC3B;CAEA,MAAM,0BAAoC,CAAC;CAC3C,IAAI,oBAAoB,iBAAiB,QAAQ;EAC/C,IAAI,yBAAyB;EAE7B,KAAK,MAAM,WAAW,kBAAkB;GACtC,MAAM,eAAyB,CAAC;GAChC,MAAM,kBAAkB,CAAC,EAAE,QAAQ,SAAS,QAAQ,MAAM;GAC1D,IAAI,iBACF,aAAa,KAAK,OAAO,QAAQ,OAAO;GAG1C,IAAI,QAAQ,WAAW,QAAQ,QAAQ,QACrC,aAAa,KAAK,8BAA8B,QAAQ,OAAO,CAAC;GAGlE,IAAI,QAAQ,SAAS,QAAQ,MAAM,QAAQ;IACzC,MAAM,mBAAmC,kBACrC,SACA;IACJ,KAAK,MAAM,QAAQ,QAAQ,OACzB,aAAa,KACX,kBAAkB,kBAAkB,KAAK,OAAO,KAAK,IAAI,CAC3D;GAEJ,OAAO,IACL,CAAC,mBACD,QAAQ,WACR,QAAQ,QAAQ,QAChB;IACA,MAAM,WAAW,sBAAsB,QAAQ,OAAO;IACtD,IAAI,SAAS,WAAW,SAAS,QAAQ,QAAQ;KAC/C,aAAa,SAAS;KACtB,aAAa,KACX,kBACE,OACA,WAAW,0BACX,QAAQ,OACV,CACF;KACA,0BAA0B;IAC5B;GACF;GAEA,IAAI,aAAa,QACf,wBAAwB,KAAK,aAAa,KAAK,MAAM,CAAC,CAAC,KAAK,CAAC;EAEjE;CACF;CACA,IAAI,YAAY,SAAS,QACvB,KAAK,MAAM,MAAM,UACf,wBAAwB,KACtB,OAAO,GAAG,MAAM;;EAGtB,mBAAmB,GAAG,MAAM,CAAC,CAAC,SAC1B,cAAc,mBAAmB,GAAG,MAAM,CAAC,IAC3C;KACD,GAAG,WAAW;QAElB;;;EAGC,GAAG,OAAO;OAEN;CAIJ,MAAM,iBAAiB,QAAyB;EAC9C,IAAI,OAAO,MAAM,OAAO;EACxB,IAAI,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK;EAC3B,IAAI,CAAC,IAAI,QAAQ,OAAO;EAExB,MAAM,IACH,QAAQ,+BAA+B,IAAG,CAAC,CAC3C,QAAQ,mBAAmB,GAAG;EACjC,MAAM,iBAAiB,YAAY,KAAK,GAAG;EAC3C,MAAM,iBAAiB,YAAY,KAAK,GAAG;EAC3C,MAAM,mBAAmB,YAAY,KAAK,GAAG,KAAK,IAAI,QAAQ,IAAI,MAAM;EAExE,IAAI,UAAU;EACd,IAAI,kBAAkB,kBAAkB,kBAGtC,UAAU,IAFI,IAAI,MAAM,GAAG,EAET,EAAE;EAGtB,UAAU,QAAQ,QAAQ,OAAO,KAAK;EAEtC,MAAM,UAAU,QAAQ,SAAS,GAAG;EACpC,MAAM,gBAAgB,QAAQ,SAAS,IAAI;EAC3C,MAAM,QAAQ,CAAC,UAAU,MAAM,CAAC,gBAAgB,OAAO;EACvD,OAAO,GAAG,QAAQ,UAAU;CAC9B;CAEA,MAAM,sBAAsB;;;;;qBAKT,YAAY;;;;;oBAKb,YAAY;;;;;yBAKP,YAAY;;;;;yBAKZ,YAAY;;;;CAKnC,MAAM,wBACJ,OACA,UACkB;EAClB,IAAI,CAAC,SAAS,CAAC,MAAM,QAAQ,OAAO;EACpC,OAAO,GAAG,MAAM,IAAI,KAAK,UAAU,KAAK;CAC1C;CA2CA,OAzCc;EACZ;EACA,qBAAqB,SAAS,KAAK;EACnC,qBAAqB,eAAe,WAAW;EAC/C,qBAAqB,YAAY,QAAQ;EACzC;EACA;EACA,GAAG;EACH,YAAY,SAAS,KAAK;EAC1B,8BAA8B,2BAA2B,SACrD,6BACA;EACJ,8BAA8B,2BAA2B,SAAS,KAAK;EACvE;EACA,wBAAwB,KAAK;EAC7B;EACA;EACA,oBAAoB,iBAAiB,SACjC,eAAe,qBACf;EACJ;EACA,cAAc,WAAW,SACrB,yDAAyD,WACtD,KACE,MACC,WAAW,EAAE,KAAK,eAAe,EAAE,QAAQ,GAAE,CAAE,QAAQ,OAAO,KAAK,EAAE,OAAO,cAAc,EAAE,YAAY,EAAE,GAC9G,CAAC,CACA,KAAK,IAAI,MACZ,YACE,eAAe,cACf;EACL,cAAc,WAAW,UAAW,YAAY,KAAK;EACtD,wBAAwB,SACpB,oBAAoB,wBAAwB,KAAK,MAAM,IACvD;EACJ,wBAAwB,SAAS,KAAK;EACtC,kBAAkB,eAAe,SAC7B,uBAAuB,mBACvB;CACN,CAAC,CAAC,QAAQ,MAAM,MAAM,QAAQ,MAAM,MAEzB,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,IAAI;AACnC;;;;;;;;;;AC3jCA,eAAe,mBACb,eAC2B;CAC3B,MAAM,UAA4B,CAAC;CACnC,MAAM,cACJ,MAAM,QAAQ,eAAe,EAAE,eAAe,KAAK,CAAC,EAAC,CACrD,MAAM,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;CAE7C,KAAK,MAAM,SAAS,YAClB,IAAI,MAAM,YAAY,GAAG;EAEvB,MAAM,aAAa,KAAK,eAAe,MAAM,IAAI;EACjD,MAAM,YAAY,KAAK,YAAY,UAAU;EAE7C,IAAI,WAAW,SAAS,GAAG;GAGzB,MAAM,eAAe,mBAAmB,MADb,SAAS,WAAW,OAAO,CACF,CAAC,CAAC,QACnD,EAAE,WACD,QAAQ,KAAK,YAAY,IAAI,CAAC,MAAM,cACpC,WAAW,KAAK,YAAY,IAAI,CAAC,CACrC;GACA,MAAM,eAAe,aAAa,KAAK,EAAE,WAAW,IAAI;GAGxD,MAAM,oBAAoB,kBAAkB,cAAc,MAAM,IAAI;GAEpE,IAAI,mBAAmB;IACrB,MAAM,eAAe,KACnB,YACA,aAAa,MAAM,EAAE,WAAW,SAAS,iBAAiB,CAAC,CAAE,IAC/D;IAEA,IAAI,WAAW,YAAY,GAAG;KAE5B,MAAM,gBAAgB,aAAa,QAChC,MAAM,MAAM,iBACf;KAEA,QAAQ,KAAK;MACX,MAAM;MACN,UAAU;MACV,YAAY,MAAM;MAClB,UAAU;MACV,cAAc;KAChB,CAAC;IACH;GACF;EACF;CACF,OAAO,IACL,MAAM,OAAO,KACb,QAAQ,MAAM,IAAI,CAAC,CAAC,YAAY,MAAM,UACtC;EAEA,MAAM,gBAAgB,MAAM,KAAK,QAAQ,aAAa,EAAE;EACxD,QAAQ,KAAK;GACX,MAAM;GACN,UAAU,KAAK,eAAe,MAAM,IAAI;GACxC,YAAY;GACZ,UAAU;GACV,cAAc,CAAC;EACjB,CAAC;CACH;CAIF,MAAM,cAAc,IAAI,IACtB,QAAQ,QAAQ,UAAU,MAAM,QAAQ,CAAC,CAAC,KAAK,UAAU,MAAM,IAAI,CACrE;CACA,OAAO,QAAQ,QACZ,UAAU,MAAM,YAAY,CAAC,YAAY,IAAI,MAAM,IAAI,CAC1D;AACF;AAEA,SAAS,wBACP,YACwB;CACxB,MAAM,MAA8B,CAAC;CACrC,KAAK,MAAM,aAAa,YAAY;EAClC,IAAI,CAAC,UAAU,UAAU;GACvB,IAAI,UAAU,QAAQ,GAAG,UAAU,KAAK;GACxC;EACF;EACA,IAAI,CAAC,UAAU,YAAY;EAC3B,IAAI,UAAU,QAAQ,UAAU;EAChC,KAAK,MAAM,OAAO,UAAU,cAC1B,IAAI,OAAO,UAAU;CAEzB;CACA,OAAO;AACT;;;;;;;AAQA,SAAS,mBAAmB,SAAmD;CAC7E,MAAM,UAA4C,CAAC;CAGnD,MAAM,cACJ;CACF,IAAI;CAEJ,QAAQ,QAAQ,YAAY,KAAK,OAAO,OAAO,MAC7C,QAAQ,KAAK;EAAE,MAAM,MAAM;EAAI,MAAM,MAAM;CAAG,CAAC;CAGjD,OAAO;AACT;;;;;AAMA,SAAS,kBACP,SACA,YACe;CACf,IAAI,QAAQ,WAAW,GAAG,OAAO;CAIjC,MAAM,eAAe,WAClB,MAAM,GAAG,CAAC,CACV,KAAK,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAC3D,KAAK,EAAE;CAGV,MAAM,aAAa,QAAQ,MAAM,MAAM,MAAM,YAAY;CACzD,IAAI,YAAY,OAAO;CAGvB,OAAO,QAAQ;AACjB;AAEA,eAAe,OAAO;CACpB,MAAM,QACJ,QAAQ,IAAI,kBAAkB,OAAO,QAAQ,IAAI,kBAAkB;CACrE,MAAM,MACJ,QAAQ,IAAI,oBAAoB,QAAQ,IAAI,iBAAiB,SACxD,QAAQ,IAAI,mBACb,QAAQ,IAAI;CAClB,MAAM,SAAS,MAAM,UAAU,GAAG;CAClC,MAAM,mBACJ,QAAQ,SAAS,MACjB,QAAQ,SAAS,cACjB,yBAAwB,CACxB,QAAQ,OAAO,EAAE;CACnB,MAAM,0BACJ,QAAQ,eAAe,MAAM,QAAQ,eAAe;CACtD,IAAI,SAAS,0BACT,QAAQ,QAAQ,uBAAuB,CAAC,IACxC,cAAc,GAAG;CACrB,IAAI,gBAAgB,KAAK,QAAQ,OAAO,YAAY;CACpD,IAAI,yBAAyB;EAC3B,gBAAgB;EAChB,SAAS,QAAQ,QAAQ,uBAAuB,CAAC;CACnD;CACA,IAAI,CAAC,WAAW,aAAa,GAE3B,gBAAgB,KAAK,QAAQ,OAAO,YAAY;CAElD,MAAM,SAAS,cAAc,GAAG;CAChC,UAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;CAErC,IAAI,OAAO;EACT,OAAO,KAAK,yBAAyB,KAAK;EAC1C,OAAO,KAAK,4BAA4B,QAAQ;EAChD,OAAO,KAAK,mCAAmC,eAAe;EAC9D,OAAO,KAAK,4BAA4B,QAAQ;CAClD;CAGA,MAAM,aAAa,MAAM,mBAAmB,aAAa;CACzD,MAAM,qBAAqB,wBAAwB,UAAU;CAC7D,MAAM,sBAAsB,OAAO,KAAK,kBAAkB;CAC1D,MAAM,kBAAkB,WACtB,OACG,QAAQ,sCAAsC,eAAe,CAAC,CAC9D,QACC,kDACA,QAAQ,SAAS,SAAS,aAC5B,CAAC,CACA,QACC,4CACA,QAAQ,SAAS,OAAO,OAC1B;CAEJ,IAAI,OAAO;EACT,OAAO,KAAK,sCAAsC,WAAW,QAAQ;EACrE,IAAI,WAAW,QACb,OAAO,KACL,+BAA+B,WAC5B,MAAM,GAAG,CAAC,CAAC,CACX,KAAK,MAAM,EAAE,IAAI,CAAC,CAClB,KAAK,IAAI,GACd;CAEJ;CAEA,IAAI,iBAAiB;CACrB,MAAM,QAAQ,WAAW;CACzB,MAAM,OAAO,QAAQ,sBAAsB,MAAM,EAAE,CAAC,CAAC,MAAM;CAE3D,KAAK,MAAM,aAAa,YAAY;EAClC,MAAM,EACJ,MAAM,QACN,UACA,YACA,UACA,iBACE;EAEJ,MAAM,YAAY,MAAM,SAAS,UAAU,OAAO;EAClD,MAAM,kBAAkB,mBAAmB,SAAS;EACpD,MAAM,aAAa,gCAAgC,eAAe;EAClE,MAAM,OAAO,mBAAmB,eAAe,eAAe,CAAC;EAC/D,MAAM,gBAAgB,8BAA8B,UAAU;EAC9D,MAAM,oBAAoB,2BAA2B,UAAU;EAG/D,MAAM,8BAAc,IAAI,IAA2B;EACnD,KAAK,MAAM,KAAK,mBACd,IAAI,EAAE,QAAQ,EAAE,YACd,YAAY,IAAI,EAAE,MAAM,EAAE,gBAAgB,IAAI;EAIlD,MAAM,cAAc,cAAc,SAAS,gBAAgB,CAAC,EAAC,CAAE,KAAK,OAAO;GACzE,MAAM,EAAE;GACR,MAAM,EAAE;GACR,UAAU,CAAC,EAAE;GACb,cAAc,YAAY,IAAI,EAAE,IAAI,IAAI,YAAY,IAAI,EAAE,IAAI,IAAK;EACrE,EAAE;EAEF,MAAM,OAAO,QAAQ,MAAM;EAC3B,MAAM,QAAQ,KAAK,SAAS,KAAK,QAAQ;EACzC,MAAM,cAAc,KAAK,eAAe;EACxC,MAAM,qBAAsB,KAAa,sBAAsB;EAC/D,MAAM,WAAY,KAAa,YAAY;EAE3C,MAAM,YAAY;EAElB,MAAM,aAAa;EAEnB,MAAM,aAAa,WACf,GAAG,gBAAgB,GAAG,eACtB,GAAG,gBAAgB,GAAG,OAAO;EAEjC,MAAM,EAAE,MAAM,UAAU,WAAW,mBAAmB,kBACpD,KAAK,YAAY,IACjB,MACF;EACA,MAAM,oBAAoB,kBACxB,KAAK,qBAAqB,EAC5B,CAAC,CAAC,KAAK;EACP,MAAM,cAAc,kBAAkB,KAAK,eAAe,EAAE,CAAC,CAAC,KAAK;EACnE,MAAM,SAAS,kBAAkB,KAAK,UAAU,EAAE,CAAC,CAAC,KAAK;EACzD,MAAM,oBAAoB,wBAAwB,aAAa,MAAM;EACrE,MAAM,mBAAmB,wBAAwB,mBAAmB,MAAM;EAC1E,MAAM,YAAY,kBAAkB,qBAAqB;EAEzD,IAAI,kBAA4B,CAAC;EACjC,IAAI,WAKC,CAAC;EACN,MAAM,yBAAyB,sBAAsB,WAAW;EAChE,IAAI,uBAAuB,WAAW,GAAG;GACvC,kBAAkB,MAAM,iBAAiB,UAAU,aAAa;GAChE,YAAY,mBAAmB,CAAC,EAAC,CAAE,KAAK,QAAQ;IAC9C,MAAM,WAAW,IACd,gBAAc,MAAM,CAAC,CAAC,GAAG,CAAC,CAC1B,eAAa,MAAM,CAAC,CAAC,MAAM,GAAG;IACjC,MAAM,eAAe,GAAG,gBAAgB,GAAG;IAC3C,MAAM,MAAM,KAAK,eAAe,GAAG;IACnC,MAAM,SAAS,yBAAuB,IAAI,CAAC,CAAC,aAAa,KAAK,OAAO,CAAC;IACtE,MAAM,OAAO,uBACH,MAAM,CAAC,CAAC,SAAS,eAAa,MAAM,CAAC,CAAC,QAAQ,GAAG,CAAC,CAC5D;IAGA,OAAO;KACL,YAAY,GAHU,SAAS;KAI/B,YAAY;KACZ,OAAOA;KACP;IACF;GACF,CAAC;EACH;EAEA,MAAM,cAAc,wCAAwC,UAAU,EACpE,gBAAgB,MAClB,CAAC,CAAC,CAAC,QAAQ,MAAM,MAAM,MAAM;EAC7B,MAAM,oBAAoB,wCACxB,kBACF,CAAC,CAAC,QAAQ,MAAM,MAAM,MAAM;EAC5B,MAAM,iBAAiB,yCACrB,sBACF,CAAC,CAAC,QAAQ,MAAM,MAAM,MAAM;EAC5B,MAAM,gBAAgB,4BAA4B,iBAAiB,CAAC,CAAC,QAClE,MAAM,MAAM,MACf;EACA,MAAM,YAAY,wCAAwC,QAAQ;GAChE,gBAAgB;GAChB,oBAAoB;EACtB,CAAC,CAAC,CAAC,QAAQ,MAAM,MAAM,MAAM;EAC7B,MAAM,0BAAU,IAAI,IAAY;GAC9B,GAAG;GACH,GAAG;GACH,GAAG;GACH,GAAG;GACH,GAAG;EACL,CAAC;EAGD,MAAM,mBAAmB,WACrB,aAAa,QAAQ,MAAM,QAAQ,IAAI,CAAC,CAAC,IACzC,CAAC;EAGL,IAAI,UACF,KAAK,MAAM,KAAK,cACd,QAAQ,OAAO,CAAC;EAIpB,MAAM,cAAc,MAAM,KAAK,OAAO,CAAC,CAAC,QACrC,SAAS,CAAC,oBAAoB,IAAI,IAAI,CACzC;EAGA,MAAM,gBAAgB,SACpB,QAAQ,KAAK,IAAI,KAAK,CAAC,mBAAmB;EAC5C,MAAM,cAAc,YAAY,OAAO,YAAY;EACnD,MAAM,gBAAgB,YAAY,QAAQ,SAAS,CAAC,aAAa,IAAI,CAAC;EAEtE,MAAM,oBAAoB,cAAc,QACrC,SAAS,CAAC,oBAAoB,SAAS,IAAI,CAC9C;EACA,IAAI,kBAAkB,QACpB,OAAO,KACL,GAAG,KAAK,yBAAyB,kBAAkB,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,wDACvE;EAGF,MAAM,MAAM,SAAS;GACnB;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA,kBAAkB;GAClB;GACA;GACA,aAAa;GACb;GACA;GACA,iBAAiB,UAAU,KAAK;GAChC,aAAa;GACb;GACA;GACA;GAEA,cAAc,WAAW,mBAAmB;GAC5C;EACF,CAAC;EACD,MAAM,UAAU,KAAK,QAAQ,GAAG,KAAK,KAAK;EAC1C,UAAU,QAAQ,OAAO,GAAG,EAAE,WAAW,KAAK,CAAC;EAC/C,MAAM,UAAU,SAAS,KAAK,OAAO;EACrC,kBAAkB;EAClB,KAAK,OAAO,oBAAoB,eAAe,GAAG,MAAM,MAAM;EAC9D,IAAI,OAAO,OAAO,KAAK,aAAa,SAAS;CAC/C;CACA,KAAK,QACH,WAAW,eAAe,OAAO,mBAAmB,IAAI,KAAK,IAAI,EACnE;CASA,AAPiB,WACd,KAAK,MAAM;EACV,MAAM,OAAO,QAAQ,EAAE,IAAI;EAC3B,MAAM,UAAU,KAAK,QAAQ,GAAG,KAAK,KAAK;EAC1C,OAAO,SAAS,KAAK,OAAO;CAC9B,CAAC,CAAC,CACD,MAAM,GAAG,MAAM,EAAE,cAAc,CAAC,CAC5B,CAAC,CAAC,SAAS,MAAM;EACtB,OAAO,IAAI,OAAO,GAAG;CACvB,CAAC;CACD,OAAO,MAAM;AACf;AAEA,eAAsB,mBAAkC;CACtD,MAAM,KAAK;AACb;AAEA,IACE,QAAQ,IAAI,0BAA0B,OACtC,QAAQ,IAAI,0BAA0B,QAEtC,iBAAiB,CAAC,CAAC,OAAO,QAAQ;CAChC,OAAO,MAAM,OAAO,GAAG,CAAC;CACxB,QAAQ,KAAK,CAAC;AAChB,CAAC"}