@unterberg/nivel 0.2.14 → 0.2.16

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.
@@ -4,7 +4,7 @@ import {
4
4
  isGeneratedDocsPath,
5
5
  loadDocsConfig,
6
6
  syncGeneratedDocsPages
7
- } from "./chunk-JYEKQPFL.js";
7
+ } from "./chunk-T5N24SLT.js";
8
8
  import {
9
9
  nivelPublicRoute
10
10
  } from "./chunk-PYYPYIBD.js";
@@ -241,4 +241,4 @@ var nivelPagesPlugin = () => {
241
241
  export {
242
242
  nivelPagesPlugin
243
243
  };
244
- //# sourceMappingURL=chunk-W72NXVDG.js.map
244
+ //# sourceMappingURL=chunk-5BZUJIA2.js.map
@@ -9,7 +9,7 @@ var kebabCase = (value) => {
9
9
  return value.replace(/([a-z])([A-Z])/g, "$1-$2").replaceAll("_", "-").toLowerCase();
10
10
  };
11
11
  var CODE_BLOCK_HEADER_ENVIRONMENTS = ["client", "server"];
12
- var CODE_BLOCK_PRE_PROP_NAMES = ["data-language-label", "file-added", "file-removed", "hide-menu"];
12
+ var CODE_BLOCK_PRE_PROP_NAMES = ["data-language-label", "file-added", "file-removed", "hide-menu", "render"];
13
13
  var KEY_VALUE_PAIR_RE = /(?<name>[a-zA-Z_-]+)(?:=(?:"(?<doubleQuotedValue>[^"]*)"|'(?<singleQuotedValue>[^']*)'|(?<bareValue>[^\s"'=]+)))?/g;
14
14
  var CODE_BLOCK_PRE_PROP_NAME_SET = new Set(CODE_BLOCK_PRE_PROP_NAMES);
15
15
  var normalizeCodeBlockEnv = (value) => {
@@ -740,6 +740,7 @@ var REHYPE_PRETTY_CODE_INTERNAL_META_PROPS = [
740
740
  "file-added",
741
741
  "file-removed",
742
742
  "hide-menu",
743
+ "render",
743
744
  "title"
744
745
  ];
745
746
  var getCodeBlockMdxPlugins = () => {
@@ -784,4 +785,4 @@ export {
784
785
  shikiTransformerAutoLinks,
785
786
  getCodeBlockMdxPlugins
786
787
  };
787
- //# sourceMappingURL=chunk-YKTHLAAL.js.map
788
+ //# sourceMappingURL=chunk-7C7KGP3M.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/mdx/code-blocks/index.ts","../src/mdx/code-blocks/meta.ts","../src/mdx/code-blocks/rehypeMetaToProps.ts","../src/mdx/code-blocks/remarkChoiceGroup.ts","../src/mdx/ast.ts","../src/mdx/code-blocks/generateChoiceGroupCode.ts","../src/mdx/code-blocks/remarkDetype.ts","../src/mdx/code-blocks/remarkPkgManager.ts","../src/mdx/code-blocks/remarkRestoreUnsupportedDirectives.ts","../src/mdx/code-blocks/shikiTransformerAutoLinks.ts"],"sourcesContent":["import { transformerNotationHighlight } from '@brillout/shiki-transformers'\nimport { transformerNotationDiff, transformerNotationWordHighlight } from '@shikijs/transformers'\nimport rehypePrettyCode from 'rehype-pretty-code'\nimport remarkDirective from 'remark-directive'\nimport { stripMetaProps } from './meta.js'\nimport { rehypeMetaToProps } from './rehypeMetaToProps.js'\nimport { remarkChoiceGroup } from './remarkChoiceGroup.js'\nimport { remarkDetype } from './remarkDetype.js'\nimport { remarkPkgManager } from './remarkPkgManager.js'\nimport { remarkRestoreUnsupportedDirectives } from './remarkRestoreUnsupportedDirectives.js'\nimport { shikiTransformerAutoLinks } from './shikiTransformerAutoLinks.js'\n\nexport { getCodeBlockPropsFromMeta, parseMetaString, stripMetaProps } from './meta.js'\nexport { rehypeMetaToProps } from './rehypeMetaToProps.js'\nexport { remarkChoiceGroup } from './remarkChoiceGroup.js'\nexport { remarkDetype } from './remarkDetype.js'\nexport { remarkPkgManager } from './remarkPkgManager.js'\nexport { remarkRestoreUnsupportedDirectives } from './remarkRestoreUnsupportedDirectives.js'\nexport { shikiTransformerAutoLinks } from './shikiTransformerAutoLinks.js'\n\nconst REHYPE_PRETTY_CODE_INTERNAL_META_PROPS = [\n 'data-language-label',\n 'env',\n 'file-added',\n 'file-removed',\n 'hide-menu',\n 'render',\n 'title',\n] as const\n\nexport const getCodeBlockMdxPlugins = () => {\n const rehypePrettyCodePlugin = [\n rehypePrettyCode,\n {\n keepBackground: false,\n filterMetaString: (meta: string) => stripMetaProps(meta, [...REHYPE_PRETTY_CODE_INTERNAL_META_PROPS]),\n theme: {\n light: 'github-light',\n dark: 'one-dark-pro',\n },\n transformers: [\n transformerNotationDiff(),\n transformerNotationHighlight(),\n transformerNotationWordHighlight(),\n shikiTransformerAutoLinks(),\n ],\n },\n ] as [typeof rehypePrettyCode, Parameters<typeof rehypePrettyCode>[0]]\n\n return {\n remarkPlugins: [\n remarkDirective,\n remarkRestoreUnsupportedDirectives,\n remarkDetype,\n remarkPkgManager,\n remarkChoiceGroup,\n ],\n rehypePlugins: [rehypePrettyCodePlugin, rehypeMetaToProps],\n }\n}\n","const kebabCase = (value: string) => {\n return value\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replaceAll('_', '-')\n .toLowerCase()\n}\n\nconst CODE_BLOCK_HEADER_ENVIRONMENTS = ['client', 'server'] as const\nconst CODE_BLOCK_PRE_PROP_NAMES = ['data-language-label', 'file-added', 'file-removed', 'hide-menu', 'render'] as const\n\ntype ParsedMeta<Name extends string = string> = {\n props: Partial<Record<Name, string>>\n rest: string\n tokens: ParsedMetaToken[]\n}\n\ntype ParsedMetaToken = {\n hasExplicitValue: boolean\n name: string\n raw: string\n value?: string\n}\n\ntype CodeBlockHeaderEnvironment = (typeof CODE_BLOCK_HEADER_ENVIRONMENTS)[number]\n\nconst KEY_VALUE_PAIR_RE =\n /(?<name>[a-zA-Z_-]+)(?:=(?:\"(?<doubleQuotedValue>[^\"]*)\"|'(?<singleQuotedValue>[^']*)'|(?<bareValue>[^\\s\"'=]+)))?/g\nconst CODE_BLOCK_PRE_PROP_NAME_SET = new Set<string>(CODE_BLOCK_PRE_PROP_NAMES)\n\nconst normalizeCodeBlockEnv = (value: unknown): CodeBlockHeaderEnvironment | null => {\n if (typeof value !== 'string') {\n return null\n }\n\n const normalizedValue = value.trim().toLowerCase()\n return CODE_BLOCK_HEADER_ENVIRONMENTS.includes(normalizedValue as CodeBlockHeaderEnvironment)\n ? (normalizedValue as CodeBlockHeaderEnvironment)\n : null\n}\n\nexport const parseMetaString = <Name extends string = string>(meta: unknown, propNames?: Name[]): ParsedMeta<Name> => {\n if (typeof meta !== 'string' || meta.trim() === '') {\n return { props: {}, rest: '', tokens: [] }\n }\n\n const props: ParsedMeta['props'] = {}\n const tokens: ParsedMetaToken[] = []\n const rest = meta.replaceAll(KEY_VALUE_PAIR_RE, (match, ...args) => {\n const groups = args.at(-1) as\n | {\n bareValue?: string\n doubleQuotedValue?: string\n name?: string\n singleQuotedValue?: string\n }\n | undefined\n const name = groups?.name\n if (!name) {\n return match\n }\n\n const value = groups?.doubleQuotedValue ?? groups?.singleQuotedValue ?? groups?.bareValue\n const normalizedName = kebabCase(name)\n tokens.push({\n hasExplicitValue: value !== undefined,\n name: normalizedName,\n raw: match,\n value,\n })\n\n if (propNames && !propNames.includes(normalizedName as Name)) {\n return match\n }\n\n props[normalizedName] = value || 'true'\n return ''\n })\n\n return {\n props,\n rest: rest.trim(),\n tokens,\n }\n}\n\nexport const stripMetaProps = <Name extends string = string>(meta: unknown, propNames: Name[]) => {\n return parseMetaString(meta, propNames).rest\n}\n\nexport const getCodeBlockPropsFromMeta = (meta: unknown) => {\n const parsed = parseMetaString(meta)\n const props = Object.fromEntries(\n Object.entries(parsed.props).filter(([name]) => CODE_BLOCK_PRE_PROP_NAME_SET.has(name)),\n ) as Record<string, string>\n const explicitTitle =\n typeof parsed.props.title === 'string' && parsed.props.title.trim() ? parsed.props.title.trim() : null\n const env = normalizeCodeBlockEnv(parsed.props.env)\n\n return {\n props,\n env,\n title: explicitTitle,\n }\n}\n","import { visit } from 'unist-util-visit'\nimport type { ElementNode, HtmlRootNode } from '../ast.js'\nimport { getCodeBlockPropsFromMeta } from './meta.js'\n\nexport const rehypeMetaToProps = () => {\n return (tree: HtmlRootNode) => {\n visit(\n tree,\n 'element',\n (node: ElementNode, _index: number | undefined, parent: ElementNode | HtmlRootNode | undefined) => {\n if (!parent || parent.type !== 'element' || node.tagName !== 'code' || parent.tagName !== 'pre') {\n return\n }\n\n const meta = getCodeBlockPropsFromMeta((node.data as { meta?: unknown } | undefined)?.meta)\n parent.properties ??= {}\n parent.properties = {\n ...parent.properties,\n ...meta.props,\n ...(meta.env ? { 'data-code-env': meta.env } : {}),\n ...(meta.title ? { 'data-code-title': meta.title } : {}),\n }\n },\n )\n }\n}\n","import { visit } from 'unist-util-visit'\nimport type { AstNode, ChoiceCarrierNode, ChoiceGroupElement, CodeNode, ContainerDirective, RootNode } from '../ast.js'\nimport { hasChildren } from '../ast.js'\nimport { generateChoiceGroupCode } from './generateChoiceGroupCode.js'\nimport { parseMetaString } from './meta.js'\n\ntype ChoiceNodeGroup = Array<{ choiceValue: string; children: ChoiceCarrierNode[] }>\nconst isChoiceCarrierNode = (node: AstNode): node is ChoiceCarrierNode => {\n return ['code', 'containerDirective', 'mdxJsxFlowElement'].includes(node.type)\n}\n\nexport const remarkChoiceGroup = () => {\n return (tree: RootNode) => {\n visit(tree, (node) => {\n if (node.type === 'code') {\n const codeNode = node as CodeNode\n if (!codeNode.meta) {\n return\n }\n\n const meta = parseMetaString(codeNode.meta, ['choice'])\n const choice = meta.props.choice\n codeNode.meta = meta.rest\n\n if (choice) {\n codeNode.data ??= {}\n codeNode.data.customDataChoice = choice\n codeNode.data.customDataFilter = 'explicitChoice'\n }\n }\n\n if (node.type === 'containerDirective') {\n const directiveNode = node as ContainerDirective\n if (directiveNode.name !== 'Choice') {\n return\n }\n\n const choice = typeof directiveNode.attributes?.id === 'string' ? directiveNode.attributes.id : null\n if (!choice) {\n return\n }\n\n directiveNode.data ??= {}\n directiveNode.data.customDataChoice = choice\n directiveNode.data.customDataFilter = directiveNode.type\n directiveNode.attributes = {}\n }\n })\n\n visit(tree, (node) => {\n if (!hasChildren(node)) {\n return\n }\n\n let start = -1\n let end = 0\n\n const processRange = () => {\n if (start === -1 || start === end) {\n return\n }\n\n const nodes = node.children.slice(start, end).filter(isChoiceCarrierNode)\n const replacements = filterChoices(nodes).map(\n (choiceNodes) => generateChoiceGroupCode(choiceNodes, node) as ChoiceGroupElement,\n )\n node.children.splice(start, end - start, ...replacements)\n end = start + replacements.length\n start = -1\n }\n\n for (; end < node.children.length; end += 1) {\n const child = node.children[end]\n\n if (!child || !isChoiceCarrierNode(child as AstNode)) {\n processRange()\n continue\n }\n\n if (!child.data?.customDataChoice) {\n processRange()\n continue\n }\n\n if (start === -1) {\n start = end\n }\n }\n\n processRange()\n })\n }\n}\n\nconst filterChoices = (nodes: ChoiceCarrierNode[]): ChoiceNodeGroup[] => {\n const filteredChoices: ChoiceNodeGroup[] = []\n const filters = [\n ...new Set(\n nodes\n .map((node) => node.data?.customDataFilter)\n .filter((filter): filter is string => typeof filter === 'string' && filter !== ''),\n ),\n ]\n\n for (const filter of filters) {\n const nodesByChoice = new Map<string, ChoiceCarrierNode[]>()\n\n for (const node of nodes.filter((candidate) => candidate.data?.customDataFilter === filter)) {\n const data = node.data\n const choice = data?.customDataChoice\n if (!choice || !data) {\n continue\n }\n\n data.customDataChoice = undefined\n const choiceNodes = nodesByChoice.get(choice) ?? []\n choiceNodes.push(node)\n nodesByChoice.set(choice, choiceNodes)\n }\n\n filteredChoices.push(\n [...nodesByChoice].map(([choiceValue, children]) => ({\n choiceValue,\n children,\n })),\n )\n }\n\n return filteredChoices\n}\n","import type { MdxJsxFlowElement } from 'mdast-util-mdx-jsx'\n\nexport type ChoiceData = {\n customDataChoice?: string | undefined\n customDataFilter?: string | undefined\n}\n\nexport interface AstNode {\n type: string\n data?: ChoiceData | undefined\n}\n\nexport interface ParentNode<Child extends AstNode = AstNode> extends AstNode {\n children: Child[]\n}\n\nexport interface RootNode extends ParentNode {\n type: 'root'\n}\n\nexport interface CodeNode extends AstNode {\n type: 'code'\n value: string\n lang?: string | null | undefined\n meta?: string | null | undefined\n}\n\ntype DirectiveAttributes = Record<string, string | null | undefined>\n\nexport type ChoiceGroupElement = Omit<MdxJsxFlowElement, 'data'> &\n AstNode & {\n data?: ChoiceData | undefined\n }\n\nexport type ChoiceCarrierNode = CodeNode | ContainerDirective | ChoiceGroupElement\n\nexport interface ContainerDirective extends ParentNode<ChoiceCarrierNode> {\n type: 'containerDirective'\n name: string\n attributes?: DirectiveAttributes | null | undefined\n}\n\nexport interface FileLike {\n path?: string | undefined\n value?: unknown\n}\n\nexport interface TextNode extends AstNode {\n type: 'text'\n value: string\n}\n\nexport interface ParagraphNode extends ParentNode<TextNode> {\n type: 'paragraph'\n}\n\nexport interface PositionLike {\n start?: {\n offset?: number | undefined\n }\n end?: {\n offset?: number | undefined\n }\n}\n\nexport interface UnsupportedDirectiveNode extends AstNode {\n type: 'leafDirective' | 'textDirective'\n position?: PositionLike | undefined\n}\n\nexport type ElementContentNode = ElementNode | TextNode\n\nexport interface ElementNode extends ParentNode<ElementContentNode> {\n type: 'element'\n tagName: string\n properties: Record<string, unknown>\n}\n\nexport interface HtmlRootNode extends ParentNode<ElementContentNode> {\n type: 'root'\n}\n\nexport const isContainerDirective = (node: ChoiceCarrierNode): node is ContainerDirective => {\n return node.type === 'containerDirective'\n}\n\nexport const hasChildren = (node: unknown): node is ParentNode => {\n return typeof node === 'object' && node !== null && Array.isArray((node as Partial<ParentNode>).children)\n}\n","import { valueToEstree } from 'estree-util-value-to-estree'\nimport type { MdxJsxAttribute, MdxJsxAttributeValueExpression, MdxJsxFlowElement } from 'mdast-util-mdx-jsx'\nimport type { ChoiceCarrierNode, ChoiceGroupElement, ParentNode } from '../ast.js'\nimport { isContainerDirective } from '../ast.js'\n\ntype ChoiceNode = {\n choiceValue: string\n children: ChoiceCarrierNode[]\n}\n\nconst BUILT_IN_CHOICE_GROUPS = {\n codeLang: {\n choices: ['JavaScript', 'TypeScript'],\n default: 'JavaScript',\n },\n pkgManager: {\n choices: ['npm', 'pnpm', 'Bun', 'Yarn'],\n default: 'npm',\n },\n} as const\n\nconst getChoiceGroup = (choicesRaw: string[]) => {\n const choices = [...new Set(choicesRaw.filter(Boolean))]\n\n for (const [name, group] of Object.entries(BUILT_IN_CHOICE_GROUPS)) {\n if (!choices.every((choice) => group.choices.includes(choice as never))) {\n continue\n }\n\n return {\n name,\n choices: group.choices,\n default: group.default,\n disabled: group.choices.filter((choice) => !choices.includes(choice)),\n }\n }\n\n return {\n name: `custom:${choices.join('|')}`,\n choices,\n default: choices[0] ?? '',\n disabled: [] as string[],\n }\n}\n\ntype AttributeEstree = NonNullable<NonNullable<MdxJsxAttributeValueExpression['data']>['estree']>\n\nexport const generateChoiceGroupCode = (choiceNodes: ChoiceNode[], parent?: ParentNode): ChoiceGroupElement => {\n const choiceGroup = getChoiceGroup(choiceNodes.map((choiceNode) => choiceNode.choiceValue))\n const mergedChoiceNodes = choiceGroup.choices.map((choice) => {\n const choiceNode = choiceNodes.find((node) => node.choiceValue === choice)\n\n return {\n choiceValue: choice,\n children: choiceNode?.children ?? [],\n }\n })\n\n const attributes: MdxJsxAttribute[] = [\n {\n type: 'mdxJsxAttribute',\n name: 'choiceGroup',\n value: {\n type: 'mdxJsxAttributeValueExpression',\n value: '',\n data: {\n estree: {\n type: 'Program',\n sourceType: 'module',\n comments: [],\n body: [\n {\n type: 'ExpressionStatement',\n expression: valueToEstree(choiceGroup),\n },\n ],\n } as unknown as AttributeEstree,\n },\n },\n },\n ]\n\n if (choiceNodes.length === 1) {\n attributes.push({ type: 'mdxJsxAttribute', name: 'hide' })\n }\n\n attributes.push({\n type: 'mdxJsxAttribute',\n name: 'lvl',\n value: `${parent?.type === 'mdxJsxFlowElement' ? 1 : 0}`,\n })\n\n const children: MdxJsxFlowElement[] = mergedChoiceNodes.map((choiceNode) => {\n const choiceChildren: ChoiceCarrierNode[] =\n choiceNode.children.length > 0 && choiceNode.children.every(isContainerDirective)\n ? choiceNode.children.flatMap((node) => node.children ?? [])\n : choiceNode.children\n\n for (const child of choiceChildren) {\n increaseLvl(child)\n }\n\n return {\n type: 'mdxJsxFlowElement',\n name: 'div',\n attributes: [\n {\n type: 'mdxJsxAttribute',\n name: 'data-choice-value',\n value: choiceNode.choiceValue,\n },\n { type: 'mdxJsxAttribute', name: 'className', value: 'choice' },\n ],\n children: choiceChildren as MdxJsxFlowElement['children'],\n }\n })\n\n return {\n type: 'mdxJsxFlowElement',\n name: 'ChoiceGroup',\n attributes,\n children,\n } as ChoiceGroupElement\n}\n\nconst increaseLvl = (node: ChoiceCarrierNode) => {\n if (node.type !== 'mdxJsxFlowElement' || node.name !== 'ChoiceGroup') {\n return\n }\n\n const attribute = node.attributes.find(\n (candidate: ChoiceGroupElement['attributes'][number]): candidate is MdxJsxAttribute =>\n candidate.type === 'mdxJsxAttribute' && candidate.name === 'lvl',\n )\n\n if (typeof attribute?.value === 'string') {\n attribute.value = `${Number(attribute.value) + 1}`\n }\n}\n","import { transform as detype } from 'detype'\nimport { visit } from 'unist-util-visit'\nimport type { ChoiceGroupElement, CodeNode, FileLike, ParentNode, RootNode } from '../ast.js'\nimport { generateChoiceGroupCode } from './generateChoiceGroupCode.js'\nimport { parseMetaString } from './meta.js'\n\nconst prettierOptions = {\n semi: false,\n singleQuote: true,\n trailingComma: 'none',\n} as const\n\ntype TransformNode = {\n codeBlock: CodeNode\n index: number\n parent: ParentNode\n}\n\nexport const remarkDetype = () => {\n return async (tree: RootNode, file: FileLike) => {\n const codeNodes: TransformNode[] = []\n\n visit(tree, 'code', (node: CodeNode, index: number | undefined, parent: ParentNode | undefined) => {\n if (!parent || typeof index !== 'number') {\n return\n }\n\n if (!['ts', 'tsx', 'vue', 'yaml'].includes(node.lang ?? '')) {\n return\n }\n\n if (typeof node.meta === 'string' && node.meta.includes('ts-only')) {\n return\n }\n\n codeNodes.push({ codeBlock: node, index, parent })\n })\n\n for (const node of [...codeNodes].reverse()) {\n if (node.codeBlock.lang === 'yaml') {\n transformYaml(node)\n } else {\n await transformTsToJs(node, file)\n }\n }\n }\n}\n\nconst transformYaml = (node: TransformNode) => {\n const { codeBlock, index, parent } = node\n const codeBlockContentJs = replaceFileNameSuffixes(codeBlock.value)\n\n if (codeBlockContentJs === codeBlock.value) {\n return\n }\n\n const meta = parseMetaString(codeBlock.meta, ['choice'])\n const choice = meta.props.choice\n codeBlock.meta = meta.rest\n\n const yamlJsCode = {\n ...codeBlock,\n value: codeBlockContentJs,\n }\n\n const replacement = generateChoiceGroupCode([\n { choiceValue: 'JavaScript', children: [yamlJsCode] },\n { choiceValue: 'TypeScript', children: [codeBlock] },\n ]) as ChoiceGroupElement\n\n replacement.attributes.push({ type: 'mdxJsxAttribute', name: 'hide' })\n replacement.data ??= {}\n replacement.data.customDataChoice = choice\n replacement.data.customDataFilter = 'codeLang'\n parent.children.splice(index, 1, replacement)\n}\n\nconst transformTsToJs = async (node: TransformNode, file: FileLike) => {\n const { codeBlock, index, parent } = node\n const meta = parseMetaString(codeBlock.meta, ['max-width', 'choice'])\n const maxWidth = Number(meta.props['max-width'])\n const choice = meta.props.choice\n codeBlock.meta = meta.rest\n\n codeBlock.data ??= {}\n codeBlock.data.customDataChoice = choice\n codeBlock.data.customDataFilter = 'codeLang'\n\n if (choice === 'TypeScript') {\n return\n }\n\n const codeBlockReplacedJs = replaceFileNameSuffixes(codeBlock.value)\n let codeBlockContentJs = ''\n\n try {\n codeBlockContentJs = await detype(codeBlockReplacedJs, `snippet.${codeBlock.lang}`, {\n customizeBabelConfig(config) {\n if (!config.presets || config.presets.length !== 1) {\n return\n }\n\n config.presets = [[config.presets[0], { onlyRemoveTypeImports: true }]]\n },\n removeTsComments: true,\n prettierOptions: {\n ...prettierOptions,\n printWidth: Number.isFinite(maxWidth) && maxWidth > 0 ? maxWidth : 99,\n },\n })\n } catch (error) {\n console.error(\n [\n `Failed to detype code block in ${file?.path ?? 'an MDX file'}.`,\n error instanceof Error ? error.message : String(error),\n ].join('\\n'),\n )\n return\n }\n\n codeBlockContentJs = cleanUpCode(codeBlockContentJs.trimEnd(), true)\n codeBlock.value = cleanUpCode(codeBlock.value)\n codeBlockContentJs = preserveSourceLineBreaks(codeBlock.value, codeBlockContentJs)\n codeBlockContentJs = preserveSourceBlankLines(codeBlock.value, codeBlockContentJs)\n\n if (codeBlockContentJs === codeBlock.value) {\n return\n }\n\n const tsCode: CodeNode = { ...codeBlock, lang: codeBlock.lang }\n const jsCode: CodeNode = {\n ...codeBlock,\n lang: String(codeBlock.lang).replace('t', 'j'),\n meta: replaceCodeBlockTitleFileExtension(codeBlock.meta, String(codeBlock.lang).replace('t', 'j')),\n value: codeBlockContentJs,\n }\n\n const replacement = generateChoiceGroupCode([\n { choiceValue: 'JavaScript', children: [jsCode] },\n { choiceValue: 'TypeScript', children: [tsCode] },\n ]) as ChoiceGroupElement\n\n if (codeBlockReplacedJs === codeBlockContentJs) {\n replacement.attributes.push({ type: 'mdxJsxAttribute', name: 'hide' })\n }\n\n replacement.data ??= {}\n replacement.data.customDataChoice = codeBlock.data.customDataChoice\n replacement.data.customDataFilter = codeBlock.data.customDataFilter\n parent.children.splice(index, 1, replacement)\n}\n\nconst replaceFileNameSuffixes = (value: string) => value.replaceAll('.ts', '.js')\n\nconst replaceCodeBlockTitleFileExtension = (meta: unknown, outputLang: string): string | null | undefined => {\n if (typeof meta !== 'string' || meta.trim() === '') {\n return typeof meta === 'string' ? meta : undefined\n }\n\n const parsedMeta = parseMetaString(meta)\n const titleToken = parsedMeta.tokens.find((token) => token.name === 'title' && token.hasExplicitValue)\n const titleValue = typeof parsedMeta.props.title === 'string' ? parsedMeta.props.title : null\n\n if (!titleToken || !titleValue) {\n return meta\n }\n\n const nextTitleValue = replaceTitleFileExtension(titleValue, outputLang)\n if (nextTitleValue === titleValue) {\n return meta\n }\n\n const quote = titleToken.raw.includes(\"title='\") ? \"'\" : '\"'\n return meta.replace(titleToken.raw, `title=${quote}${nextTitleValue}${quote}`)\n}\n\nconst replaceTitleFileExtension = (title: string, outputLang: string) => {\n if (outputLang === 'jsx') {\n return title.replace(/\\.tsx$/i, '.jsx').replace(/\\.ts$/i, '.js')\n }\n\n if (outputLang === 'js') {\n return title.replace(/\\.tsx$/i, '.jsx').replace(/\\.ts$/i, '.js')\n }\n\n return title\n}\n\nconst cleanUpCode = (code: string, isJsCode = false) => {\n if (isJsCode) {\n code = correctCodeDiffComments(code)\n }\n\n return processMagicComments(code)\n}\n\nconst processMagicComments = (code: string) => {\n const renameCommentRe = /^\\s*\\/\\/\\s@docpress-replace\\s([^ ]+) ([^ ]+)\\n/gm\n const matches = Array.from(code.matchAll(renameCommentRe))\n\n for (let index = matches.length - 1; index >= 0; index -= 1) {\n const match = matches[index]\n if (!match) {\n continue\n }\n\n const [fullMatch, renameFrom, renameTo] = match\n code = code.split(fullMatch).join('').replaceAll(renameFrom, renameTo)\n }\n\n return code.replaceAll('// @docpress-uncomment ', '')\n}\n\nconst correctCodeDiffComments = (code: string) => {\n return code.replaceAll(/\\n\\s*\\/\\/\\s\\[!code.+\\]/g, (codeDiff) => codeDiff.trimStart())\n}\n\nconst preserveSourceLineBreaks = (sourceCode: string, outputCode: string) => {\n const multilineSegments = collectMultilineSourceSegments(sourceCode)\n\n if (multilineSegments.length === 0) {\n return outputCode\n }\n\n const outputLines = outputCode.split('\\n')\n\n for (const segmentLines of multilineSegments) {\n const segmentNormalized = normalizeCodeSegment(segmentLines.join('\\n'))\n\n if (!segmentNormalized) {\n continue\n }\n\n for (let start = 0; start < outputLines.length; start += 1) {\n let replaced = false\n\n for (let size = 1; size <= segmentLines.length; size += 1) {\n if (start + size > outputLines.length) {\n break\n }\n\n const outputSegment = outputLines.slice(start, start + size)\n\n if (normalizeCodeSegment(outputSegment.join('\\n')) !== segmentNormalized) {\n continue\n }\n\n if (outputSegment.join('\\n') !== segmentLines.join('\\n')) {\n outputLines.splice(start, size, ...segmentLines)\n }\n\n start += segmentLines.length - 1\n replaced = true\n break\n }\n\n if (replaced) {\n break\n }\n }\n }\n\n return outputLines.join('\\n')\n}\n\nconst collectMultilineSourceSegments = (code: string) => {\n const lines = code.split('\\n')\n const segments: string[][] = []\n let paragraphStart = -1\n\n for (let index = 0; index <= lines.length; index += 1) {\n if (index < lines.length && lines[index]?.trim() !== '') {\n if (paragraphStart === -1) {\n paragraphStart = index\n }\n continue\n }\n\n if (paragraphStart !== -1) {\n const paragraphEnd = index - 1\n\n for (let size = paragraphEnd - paragraphStart + 1; size >= 2; size -= 1) {\n for (let start = paragraphStart; start + size - 1 <= paragraphEnd; start += 1) {\n segments.push(lines.slice(start, start + size).map(replaceFileNameSuffixes))\n }\n }\n }\n\n paragraphStart = -1\n }\n\n return segments\n}\n\nconst preserveSourceBlankLines = (sourceCode: string, outputCode: string) => {\n const blankLineAnchors = collectBlankLineAnchors(sourceCode)\n\n if (blankLineAnchors.length === 0) {\n return outputCode\n }\n\n const outputLines = outputCode.split('\\n')\n let searchFrom = 0\n\n for (const anchor of blankLineAnchors) {\n const lineIndex = outputLines.findIndex((line, index) => index >= searchFrom && normalizeCodeLine(line) === anchor)\n\n if (lineIndex <= 0) {\n continue\n }\n\n if (outputLines[lineIndex - 1]?.trim() !== '') {\n outputLines.splice(lineIndex, 0, '')\n searchFrom = lineIndex + 2\n } else {\n searchFrom = lineIndex + 1\n }\n }\n\n return outputLines.join('\\n')\n}\n\nconst collectBlankLineAnchors = (code: string) => {\n const lines = code.split('\\n')\n const anchors: string[] = []\n\n for (let index = 1; index < lines.length; index += 1) {\n if (lines[index]?.trim() !== '' || lines[index - 1]?.trim() === '') {\n continue\n }\n\n let nextLineIndex = index + 1\n\n while (nextLineIndex < lines.length && lines[nextLineIndex]?.trim() === '') {\n nextLineIndex += 1\n }\n\n const anchor = lines[nextLineIndex]\n\n if (anchor) {\n anchors.push(normalizeCodeLine(anchor))\n }\n }\n\n return anchors\n}\n\nconst normalizeCodeLine = (line: string) => {\n return stripTypeSyntax(replaceFileNameSuffixes(line)).trim().replace(/\\s+/g, ' ')\n}\n\nconst normalizeCodeSegment = (code: string) => {\n return replaceFileNameSuffixes(code).replace(/\\s+/g, '')\n}\n\nconst stripTypeSyntax = (line: string) => {\n return line\n .replace(/\\??:\\s*[A-Za-z_$][\\w$.<>, |&[\\]]*/g, '')\n .replace(/\\s+as\\s+const\\b/g, '')\n .replace(/\\s+as\\s+[A-Za-z_$][\\w$.<>, |&[\\]]*/g, '')\n}\n","import convert_ from 'npm-to-yarn'\nimport { visit } from 'unist-util-visit'\nimport type { ChoiceGroupElement, CodeNode, ParentNode, RootNode } from '../ast.js'\nimport { generateChoiceGroupCode } from './generateChoiceGroupCode.js'\nimport { parseMetaString } from './meta.js'\n\nconst convert: (input: string, target: 'npm' | 'pnpm' | 'bun' | 'yarn') => string = convert_\n\nconst PACKAGE_MANAGERS = ['pnpm', 'Bun', 'Yarn'] as const\n\nexport const remarkPkgManager = () => {\n return (tree: RootNode) => {\n visit(tree, 'code', (node: CodeNode, index: number | undefined, parent: ParentNode | undefined) => {\n if (!parent || typeof index !== 'number') {\n return\n }\n\n if (!['bash', 'sh', 'shell'].includes(node.lang ?? '')) {\n return\n }\n\n if (node.value.includes('pnpm')) {\n return\n }\n\n if (!node.value.includes('npm ') && !node.value.includes('npx ')) {\n return\n }\n\n let choice: string | undefined\n if (node.meta) {\n const meta = parseMetaString(node.meta, ['choice'])\n choice = meta.props.choice\n node.meta = meta.rest\n }\n\n node.value = node.value.replaceAll('npm i ', 'npm install ')\n\n const nodes = new Map<string, CodeNode>()\n nodes.set('npm', node)\n\n for (const packageManager of PACKAGE_MANAGERS) {\n const packageManagerNode: CodeNode = {\n ...node,\n value: convert(node.value, packageManager.toLowerCase() as 'pnpm' | 'bun' | 'yarn'),\n }\n nodes.set(packageManager, packageManagerNode)\n }\n\n const replacement = generateChoiceGroupCode(\n [...nodes].map(([choiceValue, childNode]) => ({\n choiceValue,\n children: [childNode],\n })),\n ) as ChoiceGroupElement\n\n replacement.data ??= {}\n replacement.data.customDataChoice = choice\n replacement.data.customDataFilter = replacement.type\n parent.children.splice(index, 1, replacement)\n })\n }\n}\n","import { visit } from 'unist-util-visit'\nimport type { FileLike, ParagraphNode, ParentNode, RootNode, TextNode, UnsupportedDirectiveNode } from '../ast.js'\n\ntype Replacement = {\n index: number\n node: UnsupportedDirectiveNode\n parent: ParentNode\n}\n\nexport const remarkRestoreUnsupportedDirectives = () => {\n return (tree: RootNode, file: FileLike) => {\n const replacements: Replacement[] = []\n\n visit(tree, (node, index, parent) => {\n if ((node.type !== 'textDirective' && node.type !== 'leafDirective') || !parent || typeof index !== 'number') {\n return\n }\n\n replacements.push({\n index,\n node: node as UnsupportedDirectiveNode,\n parent,\n })\n })\n\n for (const replacement of [...replacements].reverse()) {\n const source = getDirectiveSource(replacement.node, file)\n if (!source) {\n continue\n }\n\n if (replacement.node.type === 'textDirective') {\n replacement.parent.children.splice(replacement.index, 1, createTextNode(source))\n continue\n }\n\n const paragraphNode: ParagraphNode = {\n type: 'paragraph',\n children: [createTextNode(source)],\n }\n\n replacement.parent.children.splice(replacement.index, 1, paragraphNode)\n }\n }\n}\n\nconst createTextNode = (value: string): TextNode => {\n return {\n type: 'text',\n value,\n }\n}\n\nconst getDirectiveSource = (node: UnsupportedDirectiveNode, file: FileLike) => {\n if (typeof file.value !== 'string') {\n return null\n }\n\n const start = node.position?.start?.offset\n const end = node.position?.end?.offset\n\n if (typeof start !== 'number' || typeof end !== 'number' || start >= end) {\n return null\n }\n\n return file.value.slice(start, end)\n}\n","import type { ShikiTransformer } from 'shiki'\n\nconst LINK_RE = /https:\\/\\/[^\\s]*[^.,\\s\"'`]/g\n\nexport const shikiTransformerAutoLinks = (): ShikiTransformer => {\n return {\n name: 'solid-docpress-shiki-autolinks',\n span(span) {\n if (span.children.length !== 1) {\n return\n }\n\n let child = span.children[0]\n if (child.type !== 'text') {\n return\n }\n\n const matches = Array.from(child.value.matchAll(LINK_RE)).filter(([href]) => !href.includes('${'))\n if (matches.length === 0) {\n return\n }\n\n const links = matches\n .map((match) => ({ href: match[0], index: match.index ?? 0 }))\n .sort((left, right) => right.index - left.index)\n\n const nextChildren: typeof span.children = []\n\n for (const { href, index } of links) {\n const endIndex = index + href.length\n const trailingText = child.value.slice(endIndex)\n\n if (trailingText) {\n nextChildren.unshift({ type: 'text', value: trailingText })\n }\n\n nextChildren.unshift({\n type: 'element',\n tagName: 'a',\n properties: { href },\n children: [{ type: 'text', value: href }],\n })\n\n child = {\n type: 'text',\n value: child.value.slice(0, index),\n }\n }\n\n if (child.value) {\n nextChildren.unshift(child)\n }\n\n span.children = nextChildren\n },\n }\n}\n"],"mappings":"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","names":["visit","visit","visit","visit","visit","visit","visit"]}
@@ -240,14 +240,160 @@ var FileRemoved = ({ children }) => {
240
240
  return /* @__PURE__ */ jsx5("div", { className: "doc-code-file-state doc-code-file-removed", children });
241
241
  };
242
242
 
243
- // src/mdx/code-blocks/Pre.tsx
243
+ // src/mdx/code-blocks/MermaidDiagram.tsx
244
244
  import { cmMerge as cmMerge2 } from "@classmatejs/react";
245
+ import mermaid from "mermaid";
246
+ import { useEffect as useEffect2, useId as useId2, useState as useState3 } from "react";
247
+ import { jsx as jsx6, jsxs as jsxs3 } from "react/jsx-runtime";
248
+ var isMermaidInitialized = false;
249
+ var MERMAID_SVG_CLASS_NAME = "nivel-mermaid-svg";
250
+ var MERMAID_ROOT_CLASS_NAME = "nivel-mermaid";
251
+ var MERMAID_THEME_CSS = `
252
+ .${MERMAID_SVG_CLASS_NAME} {
253
+ font-family: var(--font-sans);
254
+ }
255
+
256
+ .${MERMAID_SVG_CLASS_NAME} .node rect,
257
+ .${MERMAID_SVG_CLASS_NAME} .node circle,
258
+ .${MERMAID_SVG_CLASS_NAME} .node ellipse,
259
+ .${MERMAID_SVG_CLASS_NAME} .node polygon,
260
+ .${MERMAID_SVG_CLASS_NAME} .node path {
261
+ fill: var(--nivel-mermaid-node-fill, var(--color-primary-muted-superlight));
262
+ stroke: var(--nivel-mermaid-node-stroke, var(--color-primary-muted-medium));
263
+ stroke-width: var(--nivel-mermaid-node-stroke-width, 1px);
264
+ }
265
+
266
+ .${MERMAID_SVG_CLASS_NAME} .node .label,
267
+ .${MERMAID_SVG_CLASS_NAME} .node .label text,
268
+ .${MERMAID_SVG_CLASS_NAME} .cluster-label text,
269
+ .${MERMAID_SVG_CLASS_NAME} .label text {
270
+ fill: var(--nivel-mermaid-node-text, var(--color-base-content));
271
+ color: var(--nivel-mermaid-node-text, var(--color-base-content));
272
+ }
273
+
274
+ .${MERMAID_SVG_CLASS_NAME} .edgePath .path,
275
+ .${MERMAID_SVG_CLASS_NAME} .flowchart-link,
276
+ .${MERMAID_SVG_CLASS_NAME} .relationshipLine,
277
+ .${MERMAID_SVG_CLASS_NAME} .messageLine0,
278
+ .${MERMAID_SVG_CLASS_NAME} .messageLine1 {
279
+ stroke: var(--nivel-mermaid-line-color, var(--color-primary-muted));
280
+ stroke-width: var(--nivel-mermaid-line-width, 1.5px);
281
+ }
282
+
283
+ .${MERMAID_SVG_CLASS_NAME} marker path,
284
+ .${MERMAID_SVG_CLASS_NAME} .marker {
285
+ fill: var(--nivel-mermaid-line-color, var(--color-primary-muted));
286
+ stroke: var(--nivel-mermaid-line-color, var(--color-primary-muted));
287
+ }
288
+
289
+ .${MERMAID_SVG_CLASS_NAME} .cluster rect {
290
+ fill: var(--nivel-mermaid-cluster-fill, var(--color-base-100));
291
+ stroke: var(--nivel-mermaid-cluster-stroke, var(--color-primary-muted-light));
292
+ stroke-width: var(--nivel-mermaid-cluster-stroke-width, 1px);
293
+ }
294
+ `;
295
+ var ensureMermaidInitialized = () => {
296
+ if (isMermaidInitialized) {
297
+ return;
298
+ }
299
+ mermaid.initialize({
300
+ startOnLoad: false,
301
+ suppressErrorRendering: true,
302
+ theme: "base",
303
+ themeCSS: MERMAID_THEME_CSS
304
+ });
305
+ isMermaidInitialized = true;
306
+ };
307
+ var addClassNameToSvg = (svg) => {
308
+ return svg.replace(/<svg\b([^>]*?)>/, (match, attributes) => {
309
+ const classMatch = attributes.match(/\sclass="([^"]*)"/);
310
+ if (classMatch) {
311
+ const mergedClassNames = `${classMatch[1]} ${MERMAID_SVG_CLASS_NAME}`.trim();
312
+ return `<svg${attributes.replace(/\sclass="([^"]*)"/, ` class="${mergedClassNames}"`)} data-mermaid-graphic="">`;
313
+ }
314
+ return `<svg${attributes} class="${MERMAID_SVG_CLASS_NAME}" data-mermaid-graphic="">`;
315
+ });
316
+ };
317
+ var MermaidDiagram = ({ className, source }) => {
318
+ const [svg, setSvg] = useState3(null);
319
+ const [error, setError] = useState3(null);
320
+ const diagramId = useId2();
321
+ useEffect2(() => {
322
+ let isActive = true;
323
+ const renderDiagram = async () => {
324
+ try {
325
+ ensureMermaidInitialized();
326
+ const { svg: renderedSvg } = await mermaid.render(`nivel-mermaid-${diagramId}`, source);
327
+ if (!isActive) {
328
+ return;
329
+ }
330
+ setSvg(addClassNameToSvg(renderedSvg));
331
+ setError(null);
332
+ } catch (renderError) {
333
+ if (!isActive) {
334
+ return;
335
+ }
336
+ const message = renderError instanceof Error ? renderError.message : "Failed to render Mermaid diagram.";
337
+ setError(message);
338
+ setSvg(null);
339
+ }
340
+ };
341
+ void renderDiagram();
342
+ return () => {
343
+ isActive = false;
344
+ };
345
+ }, [diagramId, source]);
346
+ if (error) {
347
+ return /* @__PURE__ */ jsxs3(
348
+ "div",
349
+ {
350
+ className: cmMerge2(MERMAID_ROOT_CLASS_NAME, "space-y-3", className),
351
+ "data-mermaid-diagram": "",
352
+ "data-mermaid-status": "error",
353
+ children: [
354
+ /* @__PURE__ */ jsx6("div", { className: "rounded-box border border-error/30 bg-error/8 px-4 py-3 text-sm text-error", children: error }),
355
+ /* @__PURE__ */ jsx6("pre", { className: "doc-code-pre m-0 overflow-x-auto bg-base-200! p-4 text-sm", children: /* @__PURE__ */ jsx6("code", { children: source }) })
356
+ ]
357
+ }
358
+ );
359
+ }
360
+ if (!svg) {
361
+ return /* @__PURE__ */ jsxs3(
362
+ "div",
363
+ {
364
+ className: cmMerge2(MERMAID_ROOT_CLASS_NAME, "space-y-3", className),
365
+ "data-mermaid-diagram": "",
366
+ "data-mermaid-status": "loading",
367
+ children: [
368
+ /* @__PURE__ */ jsx6("div", { className: "rounded-box border border-base-muted-light bg-base-muted-superlight/70 px-4 py-10 text-center text-sm text-base-content/70", children: "Rendering diagram..." }),
369
+ /* @__PURE__ */ jsx6("pre", { className: "doc-code-pre m-0 overflow-x-auto bg-base-200! p-4 text-sm", children: /* @__PURE__ */ jsx6("code", { children: source }) })
370
+ ]
371
+ }
372
+ );
373
+ }
374
+ return /* @__PURE__ */ jsx6(
375
+ "div",
376
+ {
377
+ className: cmMerge2(
378
+ MERMAID_ROOT_CLASS_NAME,
379
+ "overflow-x-auto bg-base-200 px-3 py-4 [&_svg]:mx-auto [&_svg]:h-auto [&_svg]:max-w-full",
380
+ className
381
+ ),
382
+ "data-mermaid-diagram": "",
383
+ "data-mermaid-status": "ready",
384
+ dangerouslySetInnerHTML: { __html: svg }
385
+ }
386
+ );
387
+ };
388
+
389
+ // src/mdx/code-blocks/Pre.tsx
390
+ import { cmMerge as cmMerge3 } from "@classmatejs/react";
245
391
  import {
246
392
  Children as Children2,
247
393
  isValidElement as isValidElement2,
248
394
  useRef as useRef2
249
395
  } from "react";
250
- import { jsx as jsx6, jsxs as jsxs3 } from "react/jsx-runtime";
396
+ import { jsx as jsx7, jsxs as jsxs4 } from "react/jsx-runtime";
251
397
  var asTrimmedString2 = (value) => {
252
398
  return typeof value === "string" && value.trim() ? value.trim() : null;
253
399
  };
@@ -273,18 +419,33 @@ var getLanguageLabel = (props) => {
273
419
  const explicitLanguage = asTrimmedString2(props["data-language"]) ?? getLanguageFromChildren(props.children);
274
420
  return explicitLanguage ? explicitLanguage.toUpperCase() : "CODE";
275
421
  };
422
+ var getNodeText = (node) => {
423
+ if (typeof node === "string" || typeof node === "number") {
424
+ return String(node);
425
+ }
426
+ if (Array.isArray(node)) {
427
+ return node.map((child) => getNodeText(child)).join("");
428
+ }
429
+ if (!isValidElement2(node)) {
430
+ return "";
431
+ }
432
+ return getNodeText(node.props.children);
433
+ };
276
434
  var Pre = ({ children, className, ...props }) => {
277
435
  const preRef = useRef2(null);
278
436
  const isInChoiceGroup = useIsInCodeBlockGroup();
279
- const label = asTrimmedString2(props["data-code-title"]) ?? getLanguageLabel(props);
437
+ const language = asTrimmedString2(props["data-language"]) ?? getLanguageFromChildren(children);
438
+ const label = asTrimmedString2(props["data-code-title"]) ?? getLanguageLabel({ ...props, children, "data-language": language ?? void 0 });
280
439
  const env = asTrimmedString2(props["data-code-env"]);
281
440
  const fileState = props["file-added"] ? "added" : props["file-removed"] ? "removed" : null;
282
441
  const hideMenu = props["hide-menu"] === "true";
283
- const copyButton = hideMenu || isInChoiceGroup ? null : /* @__PURE__ */ jsx6(
442
+ const shouldRenderMermaid = language === "mermaid" && props.render === "true";
443
+ const sourceText = trimTrailingWhitespace(getNodeText(children));
444
+ const copyButton = hideMenu || isInChoiceGroup ? null : /* @__PURE__ */ jsx7(
284
445
  CodeBlockCopyButton,
285
446
  {
286
447
  onCopy: async () => {
287
- const text = trimTrailingWhitespace(preRef.current?.textContent ?? "");
448
+ const text = shouldRenderMermaid ? sourceText : trimTrailingWhitespace(preRef.current?.textContent ?? "");
288
449
  try {
289
450
  await navigator.clipboard.writeText(text);
290
451
  return true;
@@ -294,10 +455,10 @@ var Pre = ({ children, className, ...props }) => {
294
455
  }
295
456
  }
296
457
  );
297
- return /* @__PURE__ */ jsxs3(
458
+ return /* @__PURE__ */ jsxs4(
298
459
  "div",
299
460
  {
300
- className: cmMerge2(
461
+ className: cmMerge3(
301
462
  "group relative h-full min-w-0 max-w-full not-prose overflow-hidden",
302
463
  isInChoiceGroup ? "" : "rounded-box border border-base-muted-light",
303
464
  className
@@ -305,23 +466,23 @@ var Pre = ({ children, className, ...props }) => {
305
466
  "data-code-block-frame": "",
306
467
  "data-file-state": fileState ?? void 0,
307
468
  children: [
308
- !isInChoiceGroup && /* @__PURE__ */ jsxs3(
469
+ !isInChoiceGroup && /* @__PURE__ */ jsxs4(
309
470
  "div",
310
471
  {
311
472
  className: "flex min-h-10 relative items-center justify-between gap-3 border-b border-base-muted-light bg-base-muted-superlight! px-4",
312
473
  "data-code-block-header": "",
313
474
  children: [
314
- /* @__PURE__ */ jsx6(CodeBlockHeaderMeta, { label, env }),
475
+ /* @__PURE__ */ jsx7(CodeBlockHeaderMeta, { label, env }),
315
476
  copyButton
316
477
  ]
317
478
  }
318
479
  ),
319
- /* @__PURE__ */ jsx6(
480
+ shouldRenderMermaid ? /* @__PURE__ */ jsx7(MermaidDiagram, { className: "min-w-0", source: sourceText }) : /* @__PURE__ */ jsx7(
320
481
  "pre",
321
482
  {
322
483
  ...props,
323
484
  ref: preRef,
324
- className: cmMerge2(
485
+ className: cmMerge3(
325
486
  "doc-code-pre m-0 h-full min-w-0 max-w-full overflow-x-auto bg-base-200! p-4 text-sm",
326
487
  className
327
488
  ),
@@ -335,9 +496,9 @@ var Pre = ({ children, className, ...props }) => {
335
496
  };
336
497
 
337
498
  // src/mdx/components/Alert.tsx
338
- import cm2, { cmMerge as cmMerge3 } from "@classmatejs/react";
499
+ import cm2, { cmMerge as cmMerge4 } from "@classmatejs/react";
339
500
  import { Check as Check2, CircleX, Info, TriangleAlert } from "lucide-react";
340
- import { Fragment as Fragment2, jsx as jsx7, jsxs as jsxs4 } from "react/jsx-runtime";
501
+ import { Fragment as Fragment2, jsx as jsx8, jsxs as jsxs5 } from "react/jsx-runtime";
341
502
  var alertIconMap = {
342
503
  info: Info,
343
504
  warning: TriangleAlert,
@@ -350,20 +511,20 @@ var Alert = ({
350
511
  children,
351
512
  icon = true
352
513
  }) => {
353
- const AlertIcon = icon === true ? alertIconMap[type] : typeof icon === "object" ? () => /* @__PURE__ */ jsx7(Fragment2, { children: icon }) : null;
514
+ const AlertIcon = icon === true ? alertIconMap[type] : typeof icon === "object" ? () => /* @__PURE__ */ jsx8(Fragment2, { children: icon }) : null;
354
515
  const alertIconTextColorClass = {
355
516
  info: "text-info",
356
517
  warning: "text-warning",
357
518
  error: "text-error",
358
519
  success: "text-success"
359
520
  }[type];
360
- return /* @__PURE__ */ jsxs4(AlertOuter, { $variant: type, children: [
361
- !!heading && AlertIcon && /* @__PURE__ */ jsxs4("div", { className: "mb-3 flex items-center gap-2", children: [
362
- /* @__PURE__ */ jsx7(AlertIcon, { className: cmMerge3(alertIconTextColorClass, "float-left h-5 w-5") }),
363
- /* @__PURE__ */ jsx7(AlertHeading, { children: heading })
521
+ return /* @__PURE__ */ jsxs5(AlertOuter, { $variant: type, children: [
522
+ !!heading && AlertIcon && /* @__PURE__ */ jsxs5("div", { className: "mb-3 flex items-center gap-2", children: [
523
+ /* @__PURE__ */ jsx8(AlertIcon, { className: cmMerge4(alertIconTextColorClass, "float-left h-5 w-5") }),
524
+ /* @__PURE__ */ jsx8(AlertHeading, { children: heading })
364
525
  ] }),
365
- !(!!heading && AlertIcon) && !!heading && /* @__PURE__ */ jsx7(AlertHeading, { children: heading }),
366
- !(!!heading && AlertIcon) && AlertIcon && /* @__PURE__ */ jsx7("div", { className: cmMerge3(alertIconTextColorClass, "float-left mr-2"), children: /* @__PURE__ */ jsx7(AlertIcon, { className: "mt-1 h-5 w-5" }) }),
526
+ !(!!heading && AlertIcon) && !!heading && /* @__PURE__ */ jsx8(AlertHeading, { children: heading }),
527
+ !(!!heading && AlertIcon) && AlertIcon && /* @__PURE__ */ jsx8("div", { className: cmMerge4(alertIconTextColorClass, "float-left mr-2"), children: /* @__PURE__ */ jsx8(AlertIcon, { className: "mt-1 h-5 w-5" }) }),
367
528
  children
368
529
  ] });
369
530
  };
@@ -399,8 +560,8 @@ var AlertHeading = cm2.header`
399
560
  `;
400
561
 
401
562
  // src/mdx/components/Link.tsx
402
- import { cmMerge as cmMerge4 } from "@classmatejs/react";
403
- import { Fragment as Fragment3, jsx as jsx8, jsxs as jsxs5 } from "react/jsx-runtime";
563
+ import { cmMerge as cmMerge5 } from "@classmatejs/react";
564
+ import { Fragment as Fragment3, jsx as jsx9, jsxs as jsxs6 } from "react/jsx-runtime";
404
565
  function assertUsage(condition, message) {
405
566
  if (!condition) {
406
567
  throw new Error(`[UniversalMdxMods][Wrong Usage] ${message}`);
@@ -435,8 +596,8 @@ var parseMarkdownMini = (markdown) => {
435
596
  if (current) {
436
597
  parts.push(current);
437
598
  }
438
- return /* @__PURE__ */ jsx8(Fragment3, { children: parts.map(
439
- (part, index) => part.nodeType === "code" ? /* @__PURE__ */ jsx8("code", { children: part.content }, index) : /* @__PURE__ */ jsx8("span", { children: part.content }, index)
599
+ return /* @__PURE__ */ jsx9(Fragment3, { children: parts.map(
600
+ (part, index) => part.nodeType === "code" ? /* @__PURE__ */ jsx9("code", { children: part.content }, index) : /* @__PURE__ */ jsx9("span", { children: part.content }, index)
440
601
  ) });
441
602
  };
442
603
  var determineSectionTitle = (href) => {
@@ -472,7 +633,7 @@ var getLinkText = ({
472
633
  if (noBreadcrumb || isCurrentPage) {
473
634
  return breadcrumbParts[breadcrumbParts.length - 1] ?? null;
474
635
  }
475
- return /* @__PURE__ */ jsx8(Fragment3, { children: breadcrumbParts.map((part, index) => /* @__PURE__ */ jsxs5("span", { children: [
636
+ return /* @__PURE__ */ jsx9(Fragment3, { children: breadcrumbParts.map((part, index) => /* @__PURE__ */ jsxs6("span", { children: [
476
637
  index > 0 ? " > " : null,
477
638
  part
478
639
  ] }, index)) });
@@ -490,7 +651,7 @@ var Link = ({
490
651
  const runtime = useUniversalMdxRuntime();
491
652
  if (typeof href !== "string" || href === "") {
492
653
  assertWarning(false, "<Link /> is missing `href`.");
493
- return /* @__PURE__ */ jsx8("a", { className: cmMerge4(className, "inline-flex gap-1 items-center"), ...props, children: text ?? children ?? "LINK-TARGET-NOT-FOUND" });
654
+ return /* @__PURE__ */ jsx9("a", { className: cmMerge5(className, "inline-flex gap-1 items-center"), ...props, children: text ?? children ?? "LINK-TARGET-NOT-FOUND" });
494
655
  }
495
656
  assertUsage(
496
657
  href.startsWith("/") || href.startsWith("#") || isExternalHref(href) || isDocsRelativeHref(href),
@@ -512,12 +673,12 @@ var Link = ({
512
673
  sectionTitle: inferredSectionTitle ?? void 0,
513
674
  title: resolvedDocLink.title
514
675
  }) : isExternalHref(href) ? href : inferredSectionTitle ?? "LINK-TARGET-NOT-FOUND");
515
- return /* @__PURE__ */ jsx8("a", { href: localizedHref, className: cmMerge4(className, ""), ...props, children: inferredText });
676
+ return /* @__PURE__ */ jsx9("a", { href: localizedHref, className: cmMerge5(className, ""), ...props, children: inferredText });
516
677
  };
517
678
 
518
679
  // src/mdx/components/Overview.tsx
519
680
  import cm3 from "@classmatejs/react";
520
- import { jsx as jsx9, jsxs as jsxs6 } from "react/jsx-runtime";
681
+ import { jsx as jsx10, jsxs as jsxs7 } from "react/jsx-runtime";
521
682
  import { createElement } from "react";
522
683
  var isOverviewDividerItem = (item) => typeof item === "object" && item !== null && "dividerText" in item;
523
684
  function assertUsage2(condition, message) {
@@ -550,9 +711,9 @@ var groupOverviewItems = (items) => {
550
711
  return groups;
551
712
  };
552
713
  var OverviewCard = ({ excerpt, href, title, compact }) => {
553
- return /* @__PURE__ */ jsxs6(StyleOverviewCard, { href: withSiteBaseUrl(href), $compact: compact, children: [
554
- /* @__PURE__ */ jsx9("span", { className: "text-lg font-semibold text-base-content", children: renderInlineMarkdown(title) }),
555
- excerpt && !compact ? /* @__PURE__ */ jsx9("p", { className: "text-sm leading-relaxed text-base-muted", children: renderInlineMarkdown(excerpt) }) : null
714
+ return /* @__PURE__ */ jsxs7(StyleOverviewCard, { href: withSiteBaseUrl(href), $compact: compact, children: [
715
+ /* @__PURE__ */ jsx10("span", { className: "text-lg font-semibold text-base-content", children: renderInlineMarkdown(title) }),
716
+ excerpt && !compact ? /* @__PURE__ */ jsx10("p", { className: "text-sm leading-relaxed text-base-muted", children: renderInlineMarkdown(excerpt) }) : null
556
717
  ] });
557
718
  };
558
719
  var StyleOverviewCard = cm3.a.variants({
@@ -593,34 +754,34 @@ var Overview = ({ items, compact }) => {
593
754
  if (groups.length === 0) {
594
755
  return null;
595
756
  }
596
- return /* @__PURE__ */ jsx9("div", { className: "prose-headings:my-0 prose-p:my-0 my-5 flex flex-col gap-8", children: groups.map((group, groupIndex) => /* @__PURE__ */ jsxs6("section", { className: "flex flex-col gap-4", children: [
597
- group.dividerText ? /* @__PURE__ */ jsx9("p", { className: "text-sm font-semibold uppercase tracking-wide", children: renderInlineMarkdown(group.dividerText) }) : null,
598
- /* @__PURE__ */ jsx9("div", { className: "grid gap-3 sm:grid-cols-2", children: group.items.map((item, itemIndex) => /* @__PURE__ */ createElement(OverviewCard, { ...item, key: item.href || itemIndex, excerpt: !!item.excerpt, compact })) })
757
+ return /* @__PURE__ */ jsx10("div", { className: "prose-headings:my-0 prose-p:my-0 my-5 flex flex-col gap-8", children: groups.map((group, groupIndex) => /* @__PURE__ */ jsxs7("section", { className: "flex flex-col gap-4", children: [
758
+ group.dividerText ? /* @__PURE__ */ jsx10("p", { className: "text-sm font-semibold uppercase tracking-wide", children: renderInlineMarkdown(group.dividerText) }) : null,
759
+ /* @__PURE__ */ jsx10("div", { className: "grid gap-3 sm:grid-cols-2", children: group.items.map((item, itemIndex) => /* @__PURE__ */ createElement(OverviewCard, { ...item, key: item.href || itemIndex, excerpt: !!item.excerpt, compact })) })
599
760
  ] }, groupIndex)) });
600
761
  };
601
762
 
602
763
  // src/mdx/components/RepoLink.tsx
603
- import { jsx as jsx10, jsxs as jsxs7 } from "react/jsx-runtime";
764
+ import { jsx as jsx11, jsxs as jsxs8 } from "react/jsx-runtime";
604
765
  var RepoLink = ({ repo, timestamp }) => {
605
766
  if (!repo || repo.split("/").length !== 2) {
606
767
  throw new Error("Invalid repo");
607
768
  }
608
- return /* @__PURE__ */ jsxs7("span", { className: "inline-flex items-center gap-1", children: [
609
- /* @__PURE__ */ jsx10("span", { className: "bg-white font-mono font-bold h-fit px-1 text-sm!", children: timestamp }),
610
- /* @__PURE__ */ jsxs7("a", { href: `https://github.com/${repo}`, target: "_blank", rel: "noopener", children: [
769
+ return /* @__PURE__ */ jsxs8("span", { className: "inline-flex items-center gap-1", children: [
770
+ /* @__PURE__ */ jsx11("span", { className: "bg-white font-mono font-bold h-fit px-1 text-sm!", children: timestamp }),
771
+ /* @__PURE__ */ jsxs8("a", { href: `https://github.com/${repo}`, target: "_blank", rel: "noopener", children: [
611
772
  "GitHub > ",
612
- /* @__PURE__ */ jsx10("code", { children: repo })
773
+ /* @__PURE__ */ jsx11("code", { children: repo })
613
774
  ] })
614
775
  ] });
615
776
  };
616
777
 
617
778
  // src/mdx/components/Table.tsx
618
779
  import cm4 from "@classmatejs/react";
619
- import { jsx as jsx11, jsxs as jsxs8 } from "react/jsx-runtime";
780
+ import { jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
620
781
  var Table = ({ size = "md", data }) => {
621
- return /* @__PURE__ */ jsxs8(StyledTable, { $size: size, children: [
622
- /* @__PURE__ */ jsx11("thead", { className: "overflow-hidden rounded-t-box bg-base-200", children: /* @__PURE__ */ jsx11("tr", { children: data.headers.map((header, index) => /* @__PURE__ */ jsx11("th", { children: header }, index)) }) }),
623
- /* @__PURE__ */ jsx11("tbody", { children: data.rows.map((row, rowIndex) => /* @__PURE__ */ jsx11("tr", { children: row.map((cell, cellIndex) => /* @__PURE__ */ jsx11("td", { children: cell }, cellIndex)) }, rowIndex)) })
782
+ return /* @__PURE__ */ jsxs9(StyledTable, { $size: size, children: [
783
+ /* @__PURE__ */ jsx12("thead", { className: "overflow-hidden rounded-t-box bg-base-200", children: /* @__PURE__ */ jsx12("tr", { children: data.headers.map((header, index) => /* @__PURE__ */ jsx12("th", { children: header }, index)) }) }),
784
+ /* @__PURE__ */ jsx12("tbody", { children: data.rows.map((row, rowIndex) => /* @__PURE__ */ jsx12("tr", { children: row.map((cell, cellIndex) => /* @__PURE__ */ jsx12("td", { children: cell }, cellIndex)) }, rowIndex)) })
624
785
  ] });
625
786
  };
626
787
  var StyledTable = cm4.table.variants({
@@ -648,6 +809,7 @@ export {
648
809
  CodeBlockTransformer,
649
810
  FileAdded,
650
811
  FileRemoved,
812
+ MermaidDiagram,
651
813
  Pre,
652
814
  Alert,
653
815
  Link,
@@ -655,4 +817,4 @@ export {
655
817
  RepoLink,
656
818
  Table
657
819
  };
658
- //# sourceMappingURL=chunk-EP67BY43.js.map
820
+ //# sourceMappingURL=chunk-CLMYET6V.js.map