@blaaiz/docs-core 0.7.6 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- export { AI_PROVIDER_MODELS, AI_PROVIDER_NAMES, AiConfigError, DocsConfigError, InvalidNavigationError, OpenApiMergeError, ProxyTargetError, SESSION_COOKIE, assertAllowedTarget, buildLlmsTxt, buildMetadata, buildRobots, buildSearchIndex, buildSessionCookie, buildSitemap, buildThemeCss, clearSessionCookie, createAskAiRoute, createAuthGate, createEmailSignIn, createGoogleAuth, createMarkdownRoute, createSecretSignIn, createSignOut, createSiteAuth, createTryItProxy, createTryItProxyRoute, curlCodeUsage, defineDocsConfig, isAllowedEmail, isMarkdownRouteRequest, markdownRewriteTarget, mdxToMarkdown, mergeOpenApiDocuments, openApiOperationToMarkdown, parseNavigation, planDocsTree, readCookie, redirectTarget, resolveAiConfig, searchIndex, signSession, unwrapProxyTarget, validateDocsConfig, verifySession } from './chunk-G6EOGADC.js';
1
+ export { AI_PROVIDER_MODELS, AI_PROVIDER_NAMES, AiConfigError, DocsConfigError, InvalidNavigationError, OpenApiMergeError, ProxyTargetError, SESSION_COOKIE, assertAllowedTarget, buildLlmsTxt, buildMetadata, buildRobots, buildSearchIndex, buildSessionCookie, buildSitemap, buildThemeCss, clearSessionCookie, createAskAiRoute, createAuthGate, createEmailSignIn, createGoogleAuth, createMarkdownRoute, createSecretSignIn, createSignOut, createSiteAuth, createTryItProxy, createTryItProxyRoute, curlCodeUsage, defineDocsConfig, isAllowedEmail, isMarkdownRouteRequest, markdownRewriteTarget, mdxToMarkdown, mergeOpenApiDocuments, openApiOperationToMarkdown, parseNavigation, planDocsTree, readCookie, redirectTarget, resolveAiConfig, searchIndex, signSession, unwrapProxyTarget, validateDocsConfig, verifySession } from './chunk-W74K64WH.js';
2
2
  //# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map
package/dist/mdx.cjs ADDED
@@ -0,0 +1,104 @@
1
+ 'use strict';
2
+
3
+ // src/mdx/index.ts
4
+ function isCode(node) {
5
+ return node.type === "code";
6
+ }
7
+ function isJsxElement(node) {
8
+ return node.type === "mdxJsxFlowElement" || node.type === "mdxJsxTextElement";
9
+ }
10
+ function walk(node, visit) {
11
+ const children = node.children ?? [];
12
+ for (const [index, child] of children.entries()) {
13
+ visit(child, index, node);
14
+ walk(child, visit);
15
+ }
16
+ }
17
+ function parseMeta(meta) {
18
+ const tokens = meta.match(/[^\s"]*"[^"]*"|\S+/g) ?? [];
19
+ const bare = [];
20
+ const rest = [];
21
+ let explicit;
22
+ for (const token of tokens) {
23
+ const titled = /^title=(?:"([^"]*)"|(\S+))$/.exec(token);
24
+ if (titled) {
25
+ explicit ??= titled[1] ?? titled[2];
26
+ continue;
27
+ }
28
+ if (token.includes("=") || token.startsWith("{") || token.startsWith("[")) {
29
+ rest.push(token);
30
+ } else {
31
+ bare.push(token);
32
+ }
33
+ }
34
+ if (explicit !== void 0) {
35
+ return { title: explicit, rest: [...rest, ...bare] };
36
+ }
37
+ return { title: bare.length > 0 ? bare.join(" ") : void 0, rest };
38
+ }
39
+ function serializeMeta(parsed, withTitle) {
40
+ const tokens = withTitle && parsed.title !== void 0 ? [`title="${parsed.title.replaceAll('"', "")}"`, ...parsed.rest] : parsed.rest;
41
+ return tokens.length > 0 ? tokens.join(" ") : void 0;
42
+ }
43
+ function takeTitle(code) {
44
+ if (typeof code.meta !== "string" || code.meta === "") {
45
+ return void 0;
46
+ }
47
+ const parsed = parseMeta(code.meta);
48
+ code.meta = serializeMeta(parsed, false) ?? null;
49
+ return parsed.title;
50
+ }
51
+ function normalizeTitle(code) {
52
+ if (typeof code.meta !== "string" || code.meta === "") {
53
+ return;
54
+ }
55
+ code.meta = serializeMeta(parseMeta(code.meta), true) ?? null;
56
+ }
57
+ function remarkCodeTitles() {
58
+ return (tree) => {
59
+ const root = tree;
60
+ walk(root, (node) => {
61
+ if (!isJsxElement(node) || node.name !== "CodeGroup") {
62
+ return;
63
+ }
64
+ const fences = (node.children ?? []).filter(isCode);
65
+ if (fences.length === 0) {
66
+ return;
67
+ }
68
+ const labels = fences.map(
69
+ (fence, index) => takeTitle(fence) ?? fence.lang ?? `Code ${String(index + 1)}`
70
+ );
71
+ node.attributes ??= [];
72
+ node.attributes.push({
73
+ type: "mdxJsxAttribute",
74
+ name: "labels",
75
+ value: JSON.stringify(labels)
76
+ });
77
+ });
78
+ walk(root, (node) => {
79
+ if (isCode(node)) {
80
+ normalizeTitle(node);
81
+ }
82
+ });
83
+ };
84
+ }
85
+ function remarkMermaid() {
86
+ return (tree) => {
87
+ walk(tree, (node, index, parent) => {
88
+ if (isCode(node) && node.lang === "mermaid") {
89
+ const element = {
90
+ type: "mdxJsxFlowElement",
91
+ name: "Mermaid",
92
+ attributes: [{ type: "mdxJsxAttribute", name: "chart", value: node.value ?? "" }],
93
+ children: []
94
+ };
95
+ (parent.children ?? [])[index] = element;
96
+ }
97
+ });
98
+ };
99
+ }
100
+
101
+ exports.remarkCodeTitles = remarkCodeTitles;
102
+ exports.remarkMermaid = remarkMermaid;
103
+ //# sourceMappingURL=mdx.cjs.map
104
+ //# sourceMappingURL=mdx.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/mdx/index.ts"],"names":[],"mappings":"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","file":"mdx.cjs","sourcesContent":["/**\n * Remark plugins for the docs MDX pipeline. A site wires them into\n * `source.config.ts`:\n *\n * ```ts\n * import { remarkCodeTitles, remarkMermaid } from '@blaaiz/docs-core/mdx';\n *\n * export default defineConfig({\n * mdxOptions: { remarkPlugins: [remarkGfm, remarkCodeTitles, remarkMermaid] },\n * });\n * ```\n *\n * `remarkCodeTitles` accepts both fence-title spellings — fumadocs' explicit\n * `title=\"NGN\"` and Mintlify's bare words after the language (`json NGN`) — so\n * content migrated from Mintlify keeps its code-block titles and `<CodeGroup>`\n * tab labels without a rewrite. `remarkMermaid` turns mermaid fences into the\n * `<Mermaid>` client component.\n *\n * @packageDocumentation\n */\n\ninterface MdastNode {\n type: string;\n children?: MdastNode[];\n}\n\ninterface CodeNode extends MdastNode {\n type: 'code';\n lang?: string | null;\n meta?: string | null;\n value?: string;\n}\n\ninterface MdxJsxAttribute {\n type: 'mdxJsxAttribute';\n name: string;\n value: unknown;\n}\n\ninterface MdxJsxElement extends MdastNode {\n name?: string | null;\n attributes?: MdxJsxAttribute[];\n}\n\nfunction isCode(node: MdastNode): node is CodeNode {\n return node.type === 'code';\n}\n\nfunction isJsxElement(node: MdastNode): node is MdxJsxElement {\n return node.type === 'mdxJsxFlowElement' || node.type === 'mdxJsxTextElement';\n}\n\nfunction walk(\n node: MdastNode,\n visit: (node: MdastNode, index: number, parent: MdastNode) => void,\n): void {\n const children = node.children ?? [];\n for (const [index, child] of children.entries()) {\n visit(child, index, node);\n walk(child, visit);\n }\n}\n\n/**\n * A fence's parsed info-string meta: the resolved title (explicit\n * `title=\"...\"` wins over bare words) and every other token, order preserved.\n */\ninterface ParsedMeta {\n title: string | undefined;\n rest: string[];\n}\n\nfunction parseMeta(meta: string): ParsedMeta {\n const tokens = meta.match(/[^\\s\"]*\"[^\"]*\"|\\S+/g) ?? [];\n const bare: string[] = [];\n const rest: string[] = [];\n let explicit: string | undefined;\n for (const token of tokens) {\n const titled = /^title=(?:\"([^\"]*)\"|(\\S+))$/.exec(token);\n if (titled) {\n explicit ??= titled[1] ?? titled[2];\n continue;\n }\n // A key=value option or a {1,3} highlight range is meta in its own right;\n // only plain words are a Mintlify-style title.\n if (token.includes('=') || token.startsWith('{') || token.startsWith('[')) {\n rest.push(token);\n } else {\n bare.push(token);\n }\n }\n if (explicit !== undefined) {\n return { title: explicit, rest: [...rest, ...bare] };\n }\n return { title: bare.length > 0 ? bare.join(' ') : undefined, rest };\n}\n\nfunction serializeMeta(parsed: ParsedMeta, withTitle: boolean): string | undefined {\n const tokens =\n withTitle && parsed.title !== undefined\n ? [`title=\"${parsed.title.replaceAll('\"', '')}\"`, ...parsed.rest]\n : parsed.rest;\n return tokens.length > 0 ? tokens.join(' ') : undefined;\n}\n\n/**\n * Reads and removes the title from a fence inside a `<CodeGroup>`. The group\n * shows the title on its tab, so leaving it on the fence would render a\n * duplicate per-block header inside the panel.\n */\nfunction takeTitle(code: CodeNode): string | undefined {\n if (typeof code.meta !== 'string' || code.meta === '') {\n return undefined;\n }\n const parsed = parseMeta(code.meta);\n code.meta = serializeMeta(parsed, false) ?? null;\n return parsed.title;\n}\n\nfunction normalizeTitle(code: CodeNode): void {\n if (typeof code.meta !== 'string' || code.meta === '') {\n return;\n }\n code.meta = serializeMeta(parseMeta(code.meta), true) ?? null;\n}\n\n/**\n * Fence-title compatibility for content written for Mintlify. Inside a\n * `<CodeGroup>`, each fence's title (either spelling) moves onto the group as\n * its tab label — the `labels` attribute `<CodeGroup>` reads — and comes off\n * the fence so the panel renders without its own header. Everywhere else a\n * bare-word meta becomes `title=\"...\"`, which the code-block component renders\n * as the block's header, exactly as it would the explicit spelling.\n *\n * @public\n */\nexport function remarkCodeTitles() {\n return (tree: unknown): void => {\n const root = tree as MdastNode;\n walk(root, (node) => {\n if (!isJsxElement(node) || node.name !== 'CodeGroup') {\n return;\n }\n const fences = (node.children ?? []).filter(isCode);\n if (fences.length === 0) {\n return;\n }\n const labels = fences.map(\n (fence, index) => takeTitle(fence) ?? fence.lang ?? `Code ${String(index + 1)}`,\n );\n node.attributes ??= [];\n node.attributes.push({\n type: 'mdxJsxAttribute',\n name: 'labels',\n value: JSON.stringify(labels),\n });\n });\n walk(root, (node) => {\n if (isCode(node)) {\n normalizeTitle(node);\n }\n });\n };\n}\n\n/**\n * Turns mermaid fences into a `<Mermaid chart=\"...\" />` element so\n * diagrams render as diagrams, not source. The site maps `Mermaid` to the\n * client component exported from `@blaaiz/docs-core/ui/mermaid`.\n *\n * @public\n */\nexport function remarkMermaid() {\n return (tree: unknown): void => {\n walk(tree as MdastNode, (node, index, parent) => {\n if (isCode(node) && node.lang === 'mermaid') {\n const element: MdxJsxElement = {\n type: 'mdxJsxFlowElement',\n name: 'Mermaid',\n attributes: [{ type: 'mdxJsxAttribute', name: 'chart', value: node.value ?? '' }],\n children: [],\n };\n (parent.children ?? [])[index] = element;\n }\n });\n };\n}\n"]}
package/dist/mdx.d.cts ADDED
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Remark plugins for the docs MDX pipeline. A site wires them into
3
+ * `source.config.ts`:
4
+ *
5
+ * ```ts
6
+ * import { remarkCodeTitles, remarkMermaid } from '@blaaiz/docs-core/mdx';
7
+ *
8
+ * export default defineConfig({
9
+ * mdxOptions: { remarkPlugins: [remarkGfm, remarkCodeTitles, remarkMermaid] },
10
+ * });
11
+ * ```
12
+ *
13
+ * `remarkCodeTitles` accepts both fence-title spellings — fumadocs' explicit
14
+ * `title="NGN"` and Mintlify's bare words after the language (`json NGN`) — so
15
+ * content migrated from Mintlify keeps its code-block titles and `<CodeGroup>`
16
+ * tab labels without a rewrite. `remarkMermaid` turns mermaid fences into the
17
+ * `<Mermaid>` client component.
18
+ *
19
+ * @packageDocumentation
20
+ */
21
+ /**
22
+ * Fence-title compatibility for content written for Mintlify. Inside a
23
+ * `<CodeGroup>`, each fence's title (either spelling) moves onto the group as
24
+ * its tab label — the `labels` attribute `<CodeGroup>` reads — and comes off
25
+ * the fence so the panel renders without its own header. Everywhere else a
26
+ * bare-word meta becomes `title="..."`, which the code-block component renders
27
+ * as the block's header, exactly as it would the explicit spelling.
28
+ *
29
+ * @public
30
+ */
31
+ declare function remarkCodeTitles(): (tree: unknown) => void;
32
+ /**
33
+ * Turns mermaid fences into a `<Mermaid chart="..." />` element so
34
+ * diagrams render as diagrams, not source. The site maps `Mermaid` to the
35
+ * client component exported from `@blaaiz/docs-core/ui/mermaid`.
36
+ *
37
+ * @public
38
+ */
39
+ declare function remarkMermaid(): (tree: unknown) => void;
40
+
41
+ export { remarkCodeTitles, remarkMermaid };
package/dist/mdx.d.ts ADDED
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Remark plugins for the docs MDX pipeline. A site wires them into
3
+ * `source.config.ts`:
4
+ *
5
+ * ```ts
6
+ * import { remarkCodeTitles, remarkMermaid } from '@blaaiz/docs-core/mdx';
7
+ *
8
+ * export default defineConfig({
9
+ * mdxOptions: { remarkPlugins: [remarkGfm, remarkCodeTitles, remarkMermaid] },
10
+ * });
11
+ * ```
12
+ *
13
+ * `remarkCodeTitles` accepts both fence-title spellings — fumadocs' explicit
14
+ * `title="NGN"` and Mintlify's bare words after the language (`json NGN`) — so
15
+ * content migrated from Mintlify keeps its code-block titles and `<CodeGroup>`
16
+ * tab labels without a rewrite. `remarkMermaid` turns mermaid fences into the
17
+ * `<Mermaid>` client component.
18
+ *
19
+ * @packageDocumentation
20
+ */
21
+ /**
22
+ * Fence-title compatibility for content written for Mintlify. Inside a
23
+ * `<CodeGroup>`, each fence's title (either spelling) moves onto the group as
24
+ * its tab label — the `labels` attribute `<CodeGroup>` reads — and comes off
25
+ * the fence so the panel renders without its own header. Everywhere else a
26
+ * bare-word meta becomes `title="..."`, which the code-block component renders
27
+ * as the block's header, exactly as it would the explicit spelling.
28
+ *
29
+ * @public
30
+ */
31
+ declare function remarkCodeTitles(): (tree: unknown) => void;
32
+ /**
33
+ * Turns mermaid fences into a `<Mermaid chart="..." />` element so
34
+ * diagrams render as diagrams, not source. The site maps `Mermaid` to the
35
+ * client component exported from `@blaaiz/docs-core/ui/mermaid`.
36
+ *
37
+ * @public
38
+ */
39
+ declare function remarkMermaid(): (tree: unknown) => void;
40
+
41
+ export { remarkCodeTitles, remarkMermaid };
package/dist/mdx.js ADDED
@@ -0,0 +1,101 @@
1
+ // src/mdx/index.ts
2
+ function isCode(node) {
3
+ return node.type === "code";
4
+ }
5
+ function isJsxElement(node) {
6
+ return node.type === "mdxJsxFlowElement" || node.type === "mdxJsxTextElement";
7
+ }
8
+ function walk(node, visit) {
9
+ const children = node.children ?? [];
10
+ for (const [index, child] of children.entries()) {
11
+ visit(child, index, node);
12
+ walk(child, visit);
13
+ }
14
+ }
15
+ function parseMeta(meta) {
16
+ const tokens = meta.match(/[^\s"]*"[^"]*"|\S+/g) ?? [];
17
+ const bare = [];
18
+ const rest = [];
19
+ let explicit;
20
+ for (const token of tokens) {
21
+ const titled = /^title=(?:"([^"]*)"|(\S+))$/.exec(token);
22
+ if (titled) {
23
+ explicit ??= titled[1] ?? titled[2];
24
+ continue;
25
+ }
26
+ if (token.includes("=") || token.startsWith("{") || token.startsWith("[")) {
27
+ rest.push(token);
28
+ } else {
29
+ bare.push(token);
30
+ }
31
+ }
32
+ if (explicit !== void 0) {
33
+ return { title: explicit, rest: [...rest, ...bare] };
34
+ }
35
+ return { title: bare.length > 0 ? bare.join(" ") : void 0, rest };
36
+ }
37
+ function serializeMeta(parsed, withTitle) {
38
+ const tokens = withTitle && parsed.title !== void 0 ? [`title="${parsed.title.replaceAll('"', "")}"`, ...parsed.rest] : parsed.rest;
39
+ return tokens.length > 0 ? tokens.join(" ") : void 0;
40
+ }
41
+ function takeTitle(code) {
42
+ if (typeof code.meta !== "string" || code.meta === "") {
43
+ return void 0;
44
+ }
45
+ const parsed = parseMeta(code.meta);
46
+ code.meta = serializeMeta(parsed, false) ?? null;
47
+ return parsed.title;
48
+ }
49
+ function normalizeTitle(code) {
50
+ if (typeof code.meta !== "string" || code.meta === "") {
51
+ return;
52
+ }
53
+ code.meta = serializeMeta(parseMeta(code.meta), true) ?? null;
54
+ }
55
+ function remarkCodeTitles() {
56
+ return (tree) => {
57
+ const root = tree;
58
+ walk(root, (node) => {
59
+ if (!isJsxElement(node) || node.name !== "CodeGroup") {
60
+ return;
61
+ }
62
+ const fences = (node.children ?? []).filter(isCode);
63
+ if (fences.length === 0) {
64
+ return;
65
+ }
66
+ const labels = fences.map(
67
+ (fence, index) => takeTitle(fence) ?? fence.lang ?? `Code ${String(index + 1)}`
68
+ );
69
+ node.attributes ??= [];
70
+ node.attributes.push({
71
+ type: "mdxJsxAttribute",
72
+ name: "labels",
73
+ value: JSON.stringify(labels)
74
+ });
75
+ });
76
+ walk(root, (node) => {
77
+ if (isCode(node)) {
78
+ normalizeTitle(node);
79
+ }
80
+ });
81
+ };
82
+ }
83
+ function remarkMermaid() {
84
+ return (tree) => {
85
+ walk(tree, (node, index, parent) => {
86
+ if (isCode(node) && node.lang === "mermaid") {
87
+ const element = {
88
+ type: "mdxJsxFlowElement",
89
+ name: "Mermaid",
90
+ attributes: [{ type: "mdxJsxAttribute", name: "chart", value: node.value ?? "" }],
91
+ children: []
92
+ };
93
+ (parent.children ?? [])[index] = element;
94
+ }
95
+ });
96
+ };
97
+ }
98
+
99
+ export { remarkCodeTitles, remarkMermaid };
100
+ //# sourceMappingURL=mdx.js.map
101
+ //# sourceMappingURL=mdx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/mdx/index.ts"],"names":[],"mappings":"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","file":"mdx.js","sourcesContent":["/**\n * Remark plugins for the docs MDX pipeline. A site wires them into\n * `source.config.ts`:\n *\n * ```ts\n * import { remarkCodeTitles, remarkMermaid } from '@blaaiz/docs-core/mdx';\n *\n * export default defineConfig({\n * mdxOptions: { remarkPlugins: [remarkGfm, remarkCodeTitles, remarkMermaid] },\n * });\n * ```\n *\n * `remarkCodeTitles` accepts both fence-title spellings — fumadocs' explicit\n * `title=\"NGN\"` and Mintlify's bare words after the language (`json NGN`) — so\n * content migrated from Mintlify keeps its code-block titles and `<CodeGroup>`\n * tab labels without a rewrite. `remarkMermaid` turns mermaid fences into the\n * `<Mermaid>` client component.\n *\n * @packageDocumentation\n */\n\ninterface MdastNode {\n type: string;\n children?: MdastNode[];\n}\n\ninterface CodeNode extends MdastNode {\n type: 'code';\n lang?: string | null;\n meta?: string | null;\n value?: string;\n}\n\ninterface MdxJsxAttribute {\n type: 'mdxJsxAttribute';\n name: string;\n value: unknown;\n}\n\ninterface MdxJsxElement extends MdastNode {\n name?: string | null;\n attributes?: MdxJsxAttribute[];\n}\n\nfunction isCode(node: MdastNode): node is CodeNode {\n return node.type === 'code';\n}\n\nfunction isJsxElement(node: MdastNode): node is MdxJsxElement {\n return node.type === 'mdxJsxFlowElement' || node.type === 'mdxJsxTextElement';\n}\n\nfunction walk(\n node: MdastNode,\n visit: (node: MdastNode, index: number, parent: MdastNode) => void,\n): void {\n const children = node.children ?? [];\n for (const [index, child] of children.entries()) {\n visit(child, index, node);\n walk(child, visit);\n }\n}\n\n/**\n * A fence's parsed info-string meta: the resolved title (explicit\n * `title=\"...\"` wins over bare words) and every other token, order preserved.\n */\ninterface ParsedMeta {\n title: string | undefined;\n rest: string[];\n}\n\nfunction parseMeta(meta: string): ParsedMeta {\n const tokens = meta.match(/[^\\s\"]*\"[^\"]*\"|\\S+/g) ?? [];\n const bare: string[] = [];\n const rest: string[] = [];\n let explicit: string | undefined;\n for (const token of tokens) {\n const titled = /^title=(?:\"([^\"]*)\"|(\\S+))$/.exec(token);\n if (titled) {\n explicit ??= titled[1] ?? titled[2];\n continue;\n }\n // A key=value option or a {1,3} highlight range is meta in its own right;\n // only plain words are a Mintlify-style title.\n if (token.includes('=') || token.startsWith('{') || token.startsWith('[')) {\n rest.push(token);\n } else {\n bare.push(token);\n }\n }\n if (explicit !== undefined) {\n return { title: explicit, rest: [...rest, ...bare] };\n }\n return { title: bare.length > 0 ? bare.join(' ') : undefined, rest };\n}\n\nfunction serializeMeta(parsed: ParsedMeta, withTitle: boolean): string | undefined {\n const tokens =\n withTitle && parsed.title !== undefined\n ? [`title=\"${parsed.title.replaceAll('\"', '')}\"`, ...parsed.rest]\n : parsed.rest;\n return tokens.length > 0 ? tokens.join(' ') : undefined;\n}\n\n/**\n * Reads and removes the title from a fence inside a `<CodeGroup>`. The group\n * shows the title on its tab, so leaving it on the fence would render a\n * duplicate per-block header inside the panel.\n */\nfunction takeTitle(code: CodeNode): string | undefined {\n if (typeof code.meta !== 'string' || code.meta === '') {\n return undefined;\n }\n const parsed = parseMeta(code.meta);\n code.meta = serializeMeta(parsed, false) ?? null;\n return parsed.title;\n}\n\nfunction normalizeTitle(code: CodeNode): void {\n if (typeof code.meta !== 'string' || code.meta === '') {\n return;\n }\n code.meta = serializeMeta(parseMeta(code.meta), true) ?? null;\n}\n\n/**\n * Fence-title compatibility for content written for Mintlify. Inside a\n * `<CodeGroup>`, each fence's title (either spelling) moves onto the group as\n * its tab label — the `labels` attribute `<CodeGroup>` reads — and comes off\n * the fence so the panel renders without its own header. Everywhere else a\n * bare-word meta becomes `title=\"...\"`, which the code-block component renders\n * as the block's header, exactly as it would the explicit spelling.\n *\n * @public\n */\nexport function remarkCodeTitles() {\n return (tree: unknown): void => {\n const root = tree as MdastNode;\n walk(root, (node) => {\n if (!isJsxElement(node) || node.name !== 'CodeGroup') {\n return;\n }\n const fences = (node.children ?? []).filter(isCode);\n if (fences.length === 0) {\n return;\n }\n const labels = fences.map(\n (fence, index) => takeTitle(fence) ?? fence.lang ?? `Code ${String(index + 1)}`,\n );\n node.attributes ??= [];\n node.attributes.push({\n type: 'mdxJsxAttribute',\n name: 'labels',\n value: JSON.stringify(labels),\n });\n });\n walk(root, (node) => {\n if (isCode(node)) {\n normalizeTitle(node);\n }\n });\n };\n}\n\n/**\n * Turns mermaid fences into a `<Mermaid chart=\"...\" />` element so\n * diagrams render as diagrams, not source. The site maps `Mermaid` to the\n * client component exported from `@blaaiz/docs-core/ui/mermaid`.\n *\n * @public\n */\nexport function remarkMermaid() {\n return (tree: unknown): void => {\n walk(tree as MdastNode, (node, index, parent) => {\n if (isCode(node) && node.lang === 'mermaid') {\n const element: MdxJsxElement = {\n type: 'mdxJsxFlowElement',\n name: 'Mermaid',\n attributes: [{ type: 'mdxJsxAttribute', name: 'chart', value: node.value ?? '' }],\n children: [],\n };\n (parent.children ?? [])[index] = element;\n }\n });\n };\n}\n"]}
@@ -98,6 +98,53 @@ var GLYPHS = {
98
98
  /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "9" }),
99
99
  /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 7v5l3 2" })
100
100
  ] }),
101
+ /** A clock with a counter-clockwise arrow — a changelog, a history. */
102
+ history: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
103
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8" }),
104
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3 3v5h5" }),
105
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 7v5l4 2" })
106
+ ] }),
107
+ bell: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
108
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9" }),
109
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M10.3 21a1.94 1.94 0 0 0 3.4 0" })
110
+ ] }),
111
+ /** A paper plane — send, deliver. */
112
+ send: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
113
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m22 2-7 20-4-9-9-4Z" }),
114
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M22 2 11 13" })
115
+ ] }),
116
+ idCard: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
117
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "2", y: "5", width: "20", height: "14", rx: "2" }),
118
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "9", cy: "11", r: "2" }),
119
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M6.17 15a3 3 0 0 1 5.66 0" }),
120
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M16 10h2M16 14h2" })
121
+ ] }),
122
+ coins: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
123
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "8", cy: "8", r: "6" }),
124
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M18.09 10.37A6 6 0 1 1 10.34 18" }),
125
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M7 6h1v4" }),
126
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m16.71 13.88.7.71-2.82 2.82" })
127
+ ] }),
128
+ handshake: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
129
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m11 17 2 2a1 1 0 1 0 3-3" }),
130
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m14 14 2.5 2.5a1 1 0 1 0 3-3l-3.88-3.88a3 3 0 0 0-4.24 0l-.88.88a1 1 0 1 1-3-3l2.81-2.81a5.79 5.79 0 0 1 7.06-.87l.47.28a2 2 0 0 0 1.42.25L21 4" }),
131
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m21 3 1 11h-2" }),
132
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3 3 2 14l6.5 6.5a1 1 0 1 0 3-3" }),
133
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3 4h8" })
134
+ ] }),
135
+ shieldCheck: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
136
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1 1 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z" }),
137
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m9 12 2 2 4-4" })
138
+ ] }),
139
+ banknote: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
140
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "2", y: "6", width: "20", height: "12", rx: "2" }),
141
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "2" }),
142
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M6 12h.01M18 12h.01" })
143
+ ] }),
144
+ circlePlay: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
145
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "10" }),
146
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m10 8 6 4-6 4z" })
147
+ ] }),
101
148
  /** A circled `i` — an informational note, and the generic error state. */
102
149
  info: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
103
150
  /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "10" }),