@hackersheet/next-document-content-components 0.1.0-alpha.33 → 0.1.0-alpha.35
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/cjs/components/code-block/code-block-code.d.ts +25 -0
- package/dist/cjs/components/code-block/code-block-code.js +41 -0
- package/dist/cjs/components/code-block/code-block-code.js.map +1 -0
- package/dist/cjs/components/code-block/code-block.js +2 -1
- package/dist/cjs/components/code-block/code-block.js.map +1 -1
- package/dist/cjs/components/code-block/shiki.js +2 -1
- package/dist/cjs/components/code-block/shiki.js.map +1 -1
- package/dist/cjs/components/mermaid/index.d.ts +8 -0
- package/dist/cjs/components/mermaid/index.js +26 -2
- package/dist/cjs/components/mermaid/index.js.map +1 -1
- package/dist/cjs/components/mermaid/mermaid-client.d.ts +36 -0
- package/dist/cjs/components/mermaid/mermaid-client.js +124 -0
- package/dist/cjs/components/mermaid/mermaid-client.js.map +1 -0
- package/dist/cjs/components/mermaid/mermaid-diagram-content.d.ts +25 -0
- package/dist/cjs/components/mermaid/mermaid-diagram-content.js +46 -0
- package/dist/cjs/components/mermaid/mermaid-diagram-content.js.map +1 -0
- package/dist/cjs/components/mermaid/mermaid-diagram-view.d.ts +32 -0
- package/dist/cjs/components/mermaid/mermaid-diagram-view.js +88 -0
- package/dist/cjs/components/mermaid/mermaid-diagram-view.js.map +1 -0
- package/dist/cjs/components/mermaid/mermaid-fullscreen-modal.d.ts +34 -0
- package/dist/cjs/components/mermaid/mermaid-fullscreen-modal.js +82 -0
- package/dist/cjs/components/mermaid/mermaid-fullscreen-modal.js.map +1 -0
- package/dist/cjs/components/mermaid/mermaid-zoom-controls.d.ts +31 -0
- package/dist/cjs/components/mermaid/mermaid-zoom-controls.js +73 -0
- package/dist/cjs/components/mermaid/mermaid-zoom-controls.js.map +1 -0
- package/dist/cjs/components/mermaid/mermaid.d.ts +12 -8
- package/dist/cjs/components/mermaid/mermaid.js +5 -72
- package/dist/cjs/components/mermaid/mermaid.js.map +1 -1
- package/dist/cjs/components/mermaid/use-body-scroll-lock.d.ts +20 -0
- package/dist/cjs/components/mermaid/use-body-scroll-lock.js +41 -0
- package/dist/cjs/components/mermaid/use-body-scroll-lock.js.map +1 -0
- package/dist/cjs/components/mermaid/use-escape-key.d.ts +21 -0
- package/dist/cjs/components/mermaid/use-escape-key.js +47 -0
- package/dist/cjs/components/mermaid/use-escape-key.js.map +1 -0
- package/dist/cjs/components/mermaid/use-pan-zoom.d.ts +74 -0
- package/dist/cjs/components/mermaid/use-pan-zoom.js +227 -0
- package/dist/cjs/components/mermaid/use-pan-zoom.js.map +1 -0
- package/dist/esm/components/code-block/code-block-code.d.mts +25 -0
- package/dist/esm/components/code-block/code-block-code.mjs +11 -0
- package/dist/esm/components/code-block/code-block-code.mjs.map +1 -0
- package/dist/esm/components/code-block/code-block.mjs +2 -1
- package/dist/esm/components/code-block/code-block.mjs.map +1 -1
- package/dist/esm/components/code-block/shiki.mjs +2 -1
- package/dist/esm/components/code-block/shiki.mjs.map +1 -1
- package/dist/esm/components/mermaid/index.d.mts +8 -0
- package/dist/esm/components/mermaid/index.mjs +17 -1
- package/dist/esm/components/mermaid/index.mjs.map +1 -1
- package/dist/esm/components/mermaid/mermaid-client.d.mts +36 -0
- package/dist/esm/components/mermaid/mermaid-client.mjs +94 -0
- package/dist/esm/components/mermaid/mermaid-client.mjs.map +1 -0
- package/dist/esm/components/mermaid/mermaid-diagram-content.d.mts +25 -0
- package/dist/esm/components/mermaid/mermaid-diagram-content.mjs +12 -0
- package/dist/esm/components/mermaid/mermaid-diagram-content.mjs.map +1 -0
- package/dist/esm/components/mermaid/mermaid-diagram-view.d.mts +32 -0
- package/dist/esm/components/mermaid/mermaid-diagram-view.mjs +54 -0
- package/dist/esm/components/mermaid/mermaid-diagram-view.mjs.map +1 -0
- package/dist/esm/components/mermaid/mermaid-fullscreen-modal.d.mts +34 -0
- package/dist/esm/components/mermaid/mermaid-fullscreen-modal.mjs +48 -0
- package/dist/esm/components/mermaid/mermaid-fullscreen-modal.mjs.map +1 -0
- package/dist/esm/components/mermaid/mermaid-zoom-controls.d.mts +31 -0
- package/dist/esm/components/mermaid/mermaid-zoom-controls.mjs +39 -0
- package/dist/esm/components/mermaid/mermaid-zoom-controls.mjs.map +1 -0
- package/dist/esm/components/mermaid/mermaid.d.mts +12 -8
- package/dist/esm/components/mermaid/mermaid.mjs +6 -73
- package/dist/esm/components/mermaid/mermaid.mjs.map +1 -1
- package/dist/esm/components/mermaid/use-body-scroll-lock.d.mts +20 -0
- package/dist/esm/components/mermaid/use-body-scroll-lock.mjs +17 -0
- package/dist/esm/components/mermaid/use-body-scroll-lock.mjs.map +1 -0
- package/dist/esm/components/mermaid/use-escape-key.d.mts +21 -0
- package/dist/esm/components/mermaid/use-escape-key.mjs +23 -0
- package/dist/esm/components/mermaid/use-escape-key.mjs.map +1 -0
- package/dist/esm/components/mermaid/use-pan-zoom.d.mts +74 -0
- package/dist/esm/components/mermaid/use-pan-zoom.mjs +203 -0
- package/dist/esm/components/mermaid/use-pan-zoom.mjs.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Props for the CodeBlockCode component.
|
|
5
|
+
*/
|
|
6
|
+
type CodeBlockCodeProps = {
|
|
7
|
+
/** The raw source code to display as fallback */
|
|
8
|
+
code: string;
|
|
9
|
+
/** Pre-rendered HTML from Shiki highlighter */
|
|
10
|
+
highlightedHtml?: string | null;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* A component that renders code with optional syntax highlighting.
|
|
14
|
+
*
|
|
15
|
+
* If `highlightedHtml` is provided, it renders the pre-highlighted HTML.
|
|
16
|
+
* Otherwise, it falls back to displaying the raw code in a `<pre>` block.
|
|
17
|
+
*
|
|
18
|
+
* @param props - The component props
|
|
19
|
+
* @param props.code - The raw source code to display as fallback
|
|
20
|
+
* @param props.highlightedHtml - Pre-rendered HTML from Shiki highlighter
|
|
21
|
+
* @returns The rendered code element
|
|
22
|
+
*/
|
|
23
|
+
declare function CodeBlockCode({ code, highlightedHtml }: CodeBlockCodeProps): React.JSX.Element;
|
|
24
|
+
|
|
25
|
+
export { type CodeBlockCodeProps, CodeBlockCode as default };
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var code_block_code_exports = {};
|
|
30
|
+
__export(code_block_code_exports, {
|
|
31
|
+
default: () => CodeBlockCode
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(code_block_code_exports);
|
|
34
|
+
var import_react = __toESM(require("react"));
|
|
35
|
+
function CodeBlockCode({ code, highlightedHtml }) {
|
|
36
|
+
if (highlightedHtml) {
|
|
37
|
+
return /* @__PURE__ */ import_react.default.createElement("div", { dangerouslySetInnerHTML: { __html: highlightedHtml } });
|
|
38
|
+
}
|
|
39
|
+
return /* @__PURE__ */ import_react.default.createElement("pre", null, /* @__PURE__ */ import_react.default.createElement("code", null, code));
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=code-block-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/code-block/code-block-code.tsx"],"sourcesContent":["import React from 'react';\n\n/**\n * Props for the CodeBlockCode component.\n */\nexport type CodeBlockCodeProps = {\n /** The raw source code to display as fallback */\n code: string;\n /** Pre-rendered HTML from Shiki highlighter */\n highlightedHtml?: string | null;\n};\n\n/**\n * A component that renders code with optional syntax highlighting.\n *\n * If `highlightedHtml` is provided, it renders the pre-highlighted HTML.\n * Otherwise, it falls back to displaying the raw code in a `<pre>` block.\n *\n * @param props - The component props\n * @param props.code - The raw source code to display as fallback\n * @param props.highlightedHtml - Pre-rendered HTML from Shiki highlighter\n * @returns The rendered code element\n */\nexport default function CodeBlockCode({ code, highlightedHtml }: CodeBlockCodeProps) {\n if (highlightedHtml) {\n return <div dangerouslySetInnerHTML={{ __html: highlightedHtml }} />;\n }\n return (\n <pre>\n <code>{code}</code>\n </pre>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAkB;AAuBH,SAAR,cAA+B,EAAE,MAAM,gBAAgB,GAAuB;AACnF,MAAI,iBAAiB;AACnB,WAAO,6BAAAA,QAAA,cAAC,SAAI,yBAAyB,EAAE,QAAQ,gBAAgB,GAAG;AAAA,EACpE;AACA,SACE,6BAAAA,QAAA,cAAC,aACC,6BAAAA,QAAA,cAAC,cAAM,IAAK,CACd;AAEJ;","names":["React"]}
|
|
@@ -32,12 +32,13 @@ __export(code_block_exports, {
|
|
|
32
32
|
});
|
|
33
33
|
module.exports = __toCommonJS(code_block_exports);
|
|
34
34
|
var import_react = __toESM(require("react"));
|
|
35
|
+
var import_code_block_code = __toESM(require("./code-block-code"));
|
|
35
36
|
var import_code_block_header = __toESM(require("./code-block-header"));
|
|
36
37
|
var import_code_block_icon = __toESM(require("./code-block-icon"));
|
|
37
38
|
var import_shiki = require("./shiki");
|
|
38
39
|
async function CodeBlock({ code, ...props }) {
|
|
39
40
|
const [language, filename] = props.language.split(":");
|
|
40
41
|
const html = await (0, import_shiki.highlighteCode)(code, language);
|
|
41
|
-
return /* @__PURE__ */ import_react.default.createElement("div", { className: "code-block" }, /* @__PURE__ */ import_react.default.createElement(import_code_block_header.default, { icon: /* @__PURE__ */ import_react.default.createElement(import_code_block_icon.default, { language }), filename, code }),
|
|
42
|
+
return /* @__PURE__ */ import_react.default.createElement("div", { className: "code-block" }, /* @__PURE__ */ import_react.default.createElement(import_code_block_header.default, { icon: /* @__PURE__ */ import_react.default.createElement(import_code_block_icon.default, { language }), filename, code }), /* @__PURE__ */ import_react.default.createElement(import_code_block_code.default, { code, highlightedHtml: html }));
|
|
42
43
|
}
|
|
43
44
|
//# sourceMappingURL=code-block.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/code-block/code-block.tsx"],"sourcesContent":["import React from 'react';\n\nimport CodeBlockHeader from './code-block-header';\nimport CodeBlockIcon from './code-block-icon';\nimport { highlighteCode } from './shiki';\n\nimport type { CodeBlockComponentProps } from '@hackersheet/react-document-content';\n\n/**\n * A component that renders a syntax-highlighted code block.\n *\n * The header displays a language icon, optional filename (extracted from the\n * colon-delimited language string), and a copy button.\n *\n * Uses Shiki for syntax highlighting. Falls back to a plain `<pre>` block\n * if highlighting fails.\n *\n * @param props - The component props\n * @param props.code - The source code to display\n * @param props.language - Language identifier, optionally with filename (e.g., \"typescript:example.ts\")\n * @returns The rendered code block element\n */\nexport default async function CodeBlock({ code, ...props }: CodeBlockComponentProps) {\n const [language, filename] = props.language.split(':');\n\n const html = await highlighteCode(code, language);\n\n return (\n <div className=\"code-block\">\n <CodeBlockHeader icon={<CodeBlockIcon language={language} />} filename={filename} code={code} />\n
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/code-block/code-block.tsx"],"sourcesContent":["import React from 'react';\n\nimport CodeBlockCode from './code-block-code';\nimport CodeBlockHeader from './code-block-header';\nimport CodeBlockIcon from './code-block-icon';\nimport { highlighteCode } from './shiki';\n\nimport type { CodeBlockComponentProps } from '@hackersheet/react-document-content';\n\n/**\n * A component that renders a syntax-highlighted code block.\n *\n * The header displays a language icon, optional filename (extracted from the\n * colon-delimited language string), and a copy button.\n *\n * Uses Shiki for syntax highlighting. Falls back to a plain `<pre>` block\n * if highlighting fails.\n *\n * @param props - The component props\n * @param props.code - The source code to display\n * @param props.language - Language identifier, optionally with filename (e.g., \"typescript:example.ts\")\n * @returns The rendered code block element\n */\nexport default async function CodeBlock({ code, ...props }: CodeBlockComponentProps) {\n const [language, filename] = props.language.split(':');\n\n const html = await highlighteCode(code, language);\n\n return (\n <div className=\"code-block\">\n <CodeBlockHeader icon={<CodeBlockIcon language={language} />} filename={filename} code={code} />\n <CodeBlockCode code={code} highlightedHtml={html} />\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAkB;AAElB,6BAA0B;AAC1B,+BAA4B;AAC5B,6BAA0B;AAC1B,mBAA+B;AAkB/B,eAAO,UAAiC,EAAE,MAAM,GAAG,MAAM,GAA4B;AACnF,QAAM,CAAC,UAAU,QAAQ,IAAI,MAAM,SAAS,MAAM,GAAG;AAErD,QAAM,OAAO,UAAM,6BAAe,MAAM,QAAQ;AAEhD,SACE,6BAAAA,QAAA,cAAC,SAAI,WAAU,gBACb,6BAAAA,QAAA,cAAC,yBAAAC,SAAA,EAAgB,MAAM,6BAAAD,QAAA,cAAC,uBAAAE,SAAA,EAAc,UAAoB,GAAI,UAAoB,MAAY,GAC9F,6BAAAF,QAAA,cAAC,uBAAAG,SAAA,EAAc,MAAY,iBAAiB,MAAM,CACpD;AAEJ;","names":["React","CodeBlockHeader","CodeBlockIcon","CodeBlockCode"]}
|
|
@@ -57,10 +57,11 @@ async function highlighteCode(code, language) {
|
|
|
57
57
|
});
|
|
58
58
|
return html;
|
|
59
59
|
}
|
|
60
|
+
const additionalLanguages = [import("shiki/langs/mermaid.mjs")];
|
|
60
61
|
const getShikiHighlighter = (0, import_react.cache)(async () => {
|
|
61
62
|
return (0, import_web.getSingletonHighlighterCore)({
|
|
62
63
|
themes: [import("@shikijs/themes/github-light"), import("@shikijs/themes/github-dark-dimmed")],
|
|
63
|
-
langs: Object.values(import_web.bundledLanguages),
|
|
64
|
+
langs: [...Object.values(import_web.bundledLanguages), ...additionalLanguages],
|
|
64
65
|
engine: (0, import_javascript.createJavaScriptRegexEngine)()
|
|
65
66
|
});
|
|
66
67
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/code-block/shiki.ts"],"sourcesContent":["import {\n transformerNotationDiff,\n transformerNotationWordHighlight,\n transformerRemoveNotationEscape,\n transformerNotationHighlight,\n} from '@shikijs/transformers';\nimport { cache } from 'react';\nimport { bundledLanguages, getSingletonHighlighterCore } from 'shiki/bundle/web';\nimport { createJavaScriptRegexEngine } from 'shiki/engine/javascript';\n\nexport async function highlighteCode(code: string, language: string) {\n const highlighter = await getShikiHighlighter();\n const shikiLangs = highlighter.getLoadedLanguages();\n const shikiLang = shikiLangs.find((lang) => lang === language);\n\n if (shikiLang === undefined && language !== 'text') {\n return null;\n }\n\n const html = highlighter.codeToHtml(code.trim(), {\n lang: shikiLang || 'text',\n themes: {\n light: 'github-light',\n dark: 'github-dark-dimmed',\n },\n transformers: [\n transformerNotationDiff(),\n transformerNotationHighlight(),\n transformerNotationWordHighlight(),\n transformerRemoveNotationEscape(),\n ],\n });\n\n return html;\n}\n\nconst getShikiHighlighter = cache(async () => {\n return getSingletonHighlighterCore({\n themes: [import('@shikijs/themes/github-light'), import('@shikijs/themes/github-dark-dimmed')],\n langs: Object.values(bundledLanguages),\n engine: createJavaScriptRegexEngine(),\n });\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAKO;AACP,mBAAsB;AACtB,iBAA8D;AAC9D,wBAA4C;AAE5C,eAAsB,eAAe,MAAc,UAAkB;AACnE,QAAM,cAAc,MAAM,oBAAoB;AAC9C,QAAM,aAAa,YAAY,mBAAmB;AAClD,QAAM,YAAY,WAAW,KAAK,CAAC,SAAS,SAAS,QAAQ;AAE7D,MAAI,cAAc,UAAa,aAAa,QAAQ;AAClD,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,YAAY,WAAW,KAAK,KAAK,GAAG;AAAA,IAC/C,MAAM,aAAa;AAAA,IACnB,QAAQ;AAAA,MACN,OAAO;AAAA,MACP,MAAM;AAAA,IACR;AAAA,IACA,cAAc;AAAA,UACZ,6CAAwB;AAAA,UACxB,kDAA6B;AAAA,UAC7B,sDAAiC;AAAA,UACjC,qDAAgC;AAAA,IAClC;AAAA,EACF,CAAC;AAED,SAAO;AACT;
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/code-block/shiki.ts"],"sourcesContent":["import {\n transformerNotationDiff,\n transformerNotationWordHighlight,\n transformerRemoveNotationEscape,\n transformerNotationHighlight,\n} from '@shikijs/transformers';\nimport { cache } from 'react';\nimport { bundledLanguages, getSingletonHighlighterCore } from 'shiki/bundle/web';\nimport { createJavaScriptRegexEngine } from 'shiki/engine/javascript';\n\nexport async function highlighteCode(code: string, language: string) {\n const highlighter = await getShikiHighlighter();\n const shikiLangs = highlighter.getLoadedLanguages();\n const shikiLang = shikiLangs.find((lang) => lang === language);\n\n if (shikiLang === undefined && language !== 'text') {\n return null;\n }\n\n const html = highlighter.codeToHtml(code.trim(), {\n lang: shikiLang || 'text',\n themes: {\n light: 'github-light',\n dark: 'github-dark-dimmed',\n },\n transformers: [\n transformerNotationDiff(),\n transformerNotationHighlight(),\n transformerNotationWordHighlight(),\n transformerRemoveNotationEscape(),\n ],\n });\n\n return html;\n}\n\n/**\n * Additional languages not included in the web bundle.\n * These are loaded dynamically to keep the initial bundle size small.\n */\nconst additionalLanguages = [import('shiki/langs/mermaid.mjs')];\n\nconst getShikiHighlighter = cache(async () => {\n return getSingletonHighlighterCore({\n themes: [import('@shikijs/themes/github-light'), import('@shikijs/themes/github-dark-dimmed')],\n langs: [...Object.values(bundledLanguages), ...additionalLanguages],\n engine: createJavaScriptRegexEngine(),\n });\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAKO;AACP,mBAAsB;AACtB,iBAA8D;AAC9D,wBAA4C;AAE5C,eAAsB,eAAe,MAAc,UAAkB;AACnE,QAAM,cAAc,MAAM,oBAAoB;AAC9C,QAAM,aAAa,YAAY,mBAAmB;AAClD,QAAM,YAAY,WAAW,KAAK,CAAC,SAAS,SAAS,QAAQ;AAE7D,MAAI,cAAc,UAAa,aAAa,QAAQ;AAClD,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,YAAY,WAAW,KAAK,KAAK,GAAG;AAAA,IAC/C,MAAM,aAAa;AAAA,IACnB,QAAQ;AAAA,MACN,OAAO;AAAA,MACP,MAAM;AAAA,IACR;AAAA,IACA,cAAc;AAAA,UACZ,6CAAwB;AAAA,UACxB,kDAA6B;AAAA,UAC7B,sDAAiC;AAAA,UACjC,qDAAgC;AAAA,IAClC;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAMA,MAAM,sBAAsB,CAAC,OAAO,yBAAyB,CAAC;AAE9D,MAAM,0BAAsB,oBAAM,YAAY;AAC5C,aAAO,wCAA4B;AAAA,IACjC,QAAQ,CAAC,OAAO,8BAA8B,GAAG,OAAO,oCAAoC,CAAC;AAAA,IAC7F,OAAO,CAAC,GAAG,OAAO,OAAO,2BAAgB,GAAG,GAAG,mBAAmB;AAAA,IAClE,YAAQ,+CAA4B;AAAA,EACtC,CAAC;AACH,CAAC;","names":[]}
|
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
export { default as Mermaid, default } from './mermaid.js';
|
|
2
|
+
export { default as MermaidClient, MermaidClientProps } from './mermaid-client.js';
|
|
3
|
+
export { MermaidDiagramView, MermaidDiagramViewProps } from './mermaid-diagram-view.js';
|
|
4
|
+
export { MermaidDiagramContent, MermaidDiagramContentProps } from './mermaid-diagram-content.js';
|
|
5
|
+
export { MermaidFullscreenModal, MermaidFullscreenModalProps } from './mermaid-fullscreen-modal.js';
|
|
6
|
+
export { MermaidZoomControls, MermaidZoomControlsProps } from './mermaid-zoom-controls.js';
|
|
2
7
|
export { hasValidSvgDimensions, normalizeCode } from './mermaid-utils.js';
|
|
3
8
|
export { MermaidRenderResult, renderWithBeautifulMermaid } from './mermaid-renderer.js';
|
|
4
9
|
export { destroyIframe, renderWithIframe } from './mermaid-iframe-renderer.js';
|
|
10
|
+
export { PanZoomState, Position, UsePanZoomReturn, default as usePanZoom } from './use-pan-zoom.js';
|
|
11
|
+
export { default as useBodyScrollLock } from './use-body-scroll-lock.js';
|
|
12
|
+
export { default as useEscapeKey } from './use-escape-key.js';
|
|
5
13
|
import 'react';
|
|
6
14
|
import '@hackersheet/react-document-content';
|
|
@@ -29,26 +29,50 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
29
29
|
var mermaid_exports = {};
|
|
30
30
|
__export(mermaid_exports, {
|
|
31
31
|
Mermaid: () => import_mermaid2.default,
|
|
32
|
+
MermaidClient: () => import_mermaid_client.default,
|
|
33
|
+
MermaidDiagramContent: () => import_mermaid_diagram_content.MermaidDiagramContent,
|
|
34
|
+
MermaidDiagramView: () => import_mermaid_diagram_view.MermaidDiagramView,
|
|
35
|
+
MermaidFullscreenModal: () => import_mermaid_fullscreen_modal.MermaidFullscreenModal,
|
|
36
|
+
MermaidZoomControls: () => import_mermaid_zoom_controls.MermaidZoomControls,
|
|
32
37
|
default: () => import_mermaid.default,
|
|
33
38
|
destroyIframe: () => import_mermaid_iframe_renderer.destroyIframe,
|
|
34
39
|
hasValidSvgDimensions: () => import_mermaid_utils.hasValidSvgDimensions,
|
|
35
40
|
normalizeCode: () => import_mermaid_utils.normalizeCode,
|
|
36
41
|
renderWithBeautifulMermaid: () => import_mermaid_renderer.renderWithBeautifulMermaid,
|
|
37
|
-
renderWithIframe: () => import_mermaid_iframe_renderer.renderWithIframe
|
|
42
|
+
renderWithIframe: () => import_mermaid_iframe_renderer.renderWithIframe,
|
|
43
|
+
useBodyScrollLock: () => import_use_body_scroll_lock.useBodyScrollLock,
|
|
44
|
+
useEscapeKey: () => import_use_escape_key.useEscapeKey,
|
|
45
|
+
usePanZoom: () => import_use_pan_zoom.usePanZoom
|
|
38
46
|
});
|
|
39
47
|
module.exports = __toCommonJS(mermaid_exports);
|
|
40
48
|
var import_mermaid = __toESM(require("./mermaid"));
|
|
41
49
|
var import_mermaid2 = __toESM(require("./mermaid"));
|
|
50
|
+
var import_mermaid_client = __toESM(require("./mermaid-client"));
|
|
51
|
+
var import_mermaid_diagram_view = require("./mermaid-diagram-view");
|
|
52
|
+
var import_mermaid_diagram_content = require("./mermaid-diagram-content");
|
|
53
|
+
var import_mermaid_fullscreen_modal = require("./mermaid-fullscreen-modal");
|
|
54
|
+
var import_mermaid_zoom_controls = require("./mermaid-zoom-controls");
|
|
42
55
|
var import_mermaid_utils = require("./mermaid-utils");
|
|
43
56
|
var import_mermaid_renderer = require("./mermaid-renderer");
|
|
44
57
|
var import_mermaid_iframe_renderer = require("./mermaid-iframe-renderer");
|
|
58
|
+
var import_use_pan_zoom = require("./use-pan-zoom");
|
|
59
|
+
var import_use_body_scroll_lock = require("./use-body-scroll-lock");
|
|
60
|
+
var import_use_escape_key = require("./use-escape-key");
|
|
45
61
|
// Annotate the CommonJS export names for ESM import in node:
|
|
46
62
|
0 && (module.exports = {
|
|
47
63
|
Mermaid,
|
|
64
|
+
MermaidClient,
|
|
65
|
+
MermaidDiagramContent,
|
|
66
|
+
MermaidDiagramView,
|
|
67
|
+
MermaidFullscreenModal,
|
|
68
|
+
MermaidZoomControls,
|
|
48
69
|
destroyIframe,
|
|
49
70
|
hasValidSvgDimensions,
|
|
50
71
|
normalizeCode,
|
|
51
72
|
renderWithBeautifulMermaid,
|
|
52
|
-
renderWithIframe
|
|
73
|
+
renderWithIframe,
|
|
74
|
+
useBodyScrollLock,
|
|
75
|
+
useEscapeKey,
|
|
76
|
+
usePanZoom
|
|
53
77
|
});
|
|
54
78
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/mermaid/index.ts"],"sourcesContent":["/**\n * Mermaid diagram component and utilities.\n * @module\n */\n\nexport { default } from './mermaid';\nexport { default as Mermaid } from './mermaid';\nexport { hasValidSvgDimensions, normalizeCode } from './mermaid-utils';\nexport { renderWithBeautifulMermaid } from './mermaid-renderer';\nexport { destroyIframe, renderWithIframe } from './mermaid-iframe-renderer';\nexport type { MermaidRenderResult } from './mermaid-renderer';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/mermaid/index.ts"],"sourcesContent":["/**\n * Mermaid diagram component and utilities.\n * @module\n */\n\n// Main components\nexport { default } from './mermaid';\nexport { default as Mermaid } from './mermaid';\nexport { default as MermaidClient } from './mermaid-client';\n\n// Sub-components\nexport { MermaidDiagramView } from './mermaid-diagram-view';\nexport { MermaidDiagramContent } from './mermaid-diagram-content';\nexport { MermaidFullscreenModal } from './mermaid-fullscreen-modal';\nexport { MermaidZoomControls } from './mermaid-zoom-controls';\n\n// Utilities\nexport { hasValidSvgDimensions, normalizeCode } from './mermaid-utils';\nexport { renderWithBeautifulMermaid } from './mermaid-renderer';\nexport { destroyIframe, renderWithIframe } from './mermaid-iframe-renderer';\n\n// Hooks\nexport { usePanZoom } from './use-pan-zoom';\nexport { useBodyScrollLock } from './use-body-scroll-lock';\nexport { useEscapeKey } from './use-escape-key';\n\n// Types\nexport type { MermaidRenderResult } from './mermaid-renderer';\nexport type { MermaidClientProps } from './mermaid-client';\nexport type { MermaidDiagramViewProps } from './mermaid-diagram-view';\nexport type { MermaidDiagramContentProps } from './mermaid-diagram-content';\nexport type { MermaidFullscreenModalProps } from './mermaid-fullscreen-modal';\nexport type { MermaidZoomControlsProps } from './mermaid-zoom-controls';\nexport type { PanZoomState, Position, UsePanZoomReturn } from './use-pan-zoom';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,qBAAwB;AACxB,IAAAA,kBAAmC;AACnC,4BAAyC;AAGzC,kCAAmC;AACnC,qCAAsC;AACtC,sCAAuC;AACvC,mCAAoC;AAGpC,2BAAqD;AACrD,8BAA2C;AAC3C,qCAAgD;AAGhD,0BAA2B;AAC3B,kCAAkC;AAClC,4BAA6B;","names":["import_mermaid"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Props for the MermaidClient component.
|
|
5
|
+
*/
|
|
6
|
+
type MermaidClientProps = {
|
|
7
|
+
/** The mermaid diagram code */
|
|
8
|
+
code: string;
|
|
9
|
+
/** Pre-rendered HTML from Shiki highlighter for code view */
|
|
10
|
+
highlightedHtml?: string | null;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Client component for rendering Mermaid diagrams with interactive features.
|
|
14
|
+
*
|
|
15
|
+
* @remarks
|
|
16
|
+
* This component handles:
|
|
17
|
+
* - Diagram rendering using beautiful-mermaid with iframe fallback
|
|
18
|
+
* - Theme switching (light/dark)
|
|
19
|
+
* - Toggle between diagram and code view
|
|
20
|
+
* - Syntax-highlighted code display during loading
|
|
21
|
+
*
|
|
22
|
+
* Component architecture:
|
|
23
|
+
* - MermaidClient: Main controller for rendering and state management
|
|
24
|
+
* - MermaidDiagramView: Diagram display with pan/zoom (separate file)
|
|
25
|
+
* - MermaidFullscreenModal: Fullscreen view (separate file)
|
|
26
|
+
* - MermaidZoomControls: Reusable zoom buttons (memoized)
|
|
27
|
+
* - MermaidDiagramContent: SVG renderer (memoized)
|
|
28
|
+
*
|
|
29
|
+
* @param props - The component props
|
|
30
|
+
* @param props.code - The mermaid diagram code
|
|
31
|
+
* @param props.highlightedHtml - Pre-rendered HTML from Shiki highlighter
|
|
32
|
+
* @returns The rendered mermaid component
|
|
33
|
+
*/
|
|
34
|
+
declare function MermaidClient({ code, highlightedHtml }: MermaidClientProps): React.JSX.Element;
|
|
35
|
+
|
|
36
|
+
export { type MermaidClientProps, MermaidClient as default };
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
var __create = Object.create;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
8
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __export = (target, all) => {
|
|
10
|
+
for (var name in all)
|
|
11
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
12
|
+
};
|
|
13
|
+
var __copyProps = (to, from, except, desc) => {
|
|
14
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
15
|
+
for (let key of __getOwnPropNames(from))
|
|
16
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
17
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
18
|
+
}
|
|
19
|
+
return to;
|
|
20
|
+
};
|
|
21
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
22
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
23
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
24
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
25
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
26
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
27
|
+
mod
|
|
28
|
+
));
|
|
29
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
30
|
+
var mermaid_client_exports = {};
|
|
31
|
+
__export(mermaid_client_exports, {
|
|
32
|
+
default: () => MermaidClient
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(mermaid_client_exports);
|
|
35
|
+
var import_next_themes = require("next-themes");
|
|
36
|
+
var import_react = __toESM(require("react"));
|
|
37
|
+
var import_mermaid_diagram_view = require("./mermaid-diagram-view");
|
|
38
|
+
var import_mermaid_iframe_renderer = require("./mermaid-iframe-renderer");
|
|
39
|
+
var import_mermaid_renderer = require("./mermaid-renderer");
|
|
40
|
+
var import_code_block_code = __toESM(require("../code-block/code-block-code"));
|
|
41
|
+
var import_code_block_header = __toESM(require("../code-block/code-block-header"));
|
|
42
|
+
var import_code_block_icon = __toESM(require("../code-block/code-block-icon"));
|
|
43
|
+
function MermaidClient({ code, highlightedHtml }) {
|
|
44
|
+
const [mounted, setMounted] = (0, import_react.useState)(false);
|
|
45
|
+
const [renderState, setRenderState] = (0, import_react.useState)({ status: "loading" });
|
|
46
|
+
const [viewMode, setViewMode] = (0, import_react.useState)("diagram");
|
|
47
|
+
const { theme, systemTheme } = (0, import_next_themes.useTheme)();
|
|
48
|
+
(0, import_react.useEffect)(() => {
|
|
49
|
+
setMounted(true);
|
|
50
|
+
}, []);
|
|
51
|
+
const renderDiagram = (0, import_react.useCallback)(async () => {
|
|
52
|
+
const currentTheme = theme === "system" ? systemTheme : theme;
|
|
53
|
+
const isDark = currentTheme === "dark";
|
|
54
|
+
try {
|
|
55
|
+
const result2 = await (0, import_mermaid_renderer.renderWithBeautifulMermaid)(code, isDark);
|
|
56
|
+
if (result2) {
|
|
57
|
+
setRenderState({ status: "success", svg: result2 });
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
} catch {
|
|
61
|
+
}
|
|
62
|
+
const result = await (0, import_mermaid_iframe_renderer.renderWithIframe)(code, isDark);
|
|
63
|
+
if (result.success) {
|
|
64
|
+
setRenderState({ status: "success", svg: result.svg });
|
|
65
|
+
} else {
|
|
66
|
+
setRenderState({ status: "error", message: result.error });
|
|
67
|
+
}
|
|
68
|
+
}, [code, theme, systemTheme]);
|
|
69
|
+
(0, import_react.useEffect)(() => {
|
|
70
|
+
if (!mounted) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
renderDiagram();
|
|
74
|
+
}, [mounted, renderDiagram]);
|
|
75
|
+
const toggleViewMode = (0, import_react.useCallback)(() => {
|
|
76
|
+
setViewMode((prev) => prev === "diagram" ? "code" : "diagram");
|
|
77
|
+
}, []);
|
|
78
|
+
const isLoading = !mounted || renderState.status === "loading";
|
|
79
|
+
const hasError = renderState.status === "error";
|
|
80
|
+
const showDiagram = viewMode === "diagram" && !hasError && !isLoading;
|
|
81
|
+
if (showDiagram) {
|
|
82
|
+
return /* @__PURE__ */ import_react.default.createElement(import_mermaid_diagram_view.MermaidDiagramView, { svg: renderState.svg, onToggleViewMode: toggleViewMode });
|
|
83
|
+
}
|
|
84
|
+
return /* @__PURE__ */ import_react.default.createElement(
|
|
85
|
+
MermaidCodeView,
|
|
86
|
+
{
|
|
87
|
+
code,
|
|
88
|
+
highlightedHtml,
|
|
89
|
+
hasError,
|
|
90
|
+
isLoading,
|
|
91
|
+
errorMessage: renderState.status === "error" ? renderState.message : void 0,
|
|
92
|
+
onToggleViewMode: toggleViewMode
|
|
93
|
+
}
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
function MermaidCodeView({
|
|
97
|
+
code,
|
|
98
|
+
highlightedHtml,
|
|
99
|
+
hasError,
|
|
100
|
+
isLoading,
|
|
101
|
+
errorMessage,
|
|
102
|
+
onToggleViewMode
|
|
103
|
+
}) {
|
|
104
|
+
const toggleButton = /* @__PURE__ */ import_react.default.createElement(
|
|
105
|
+
"button",
|
|
106
|
+
{
|
|
107
|
+
type: "button",
|
|
108
|
+
onClick: onToggleViewMode,
|
|
109
|
+
className: "mermaid-toggle-btn",
|
|
110
|
+
title: "Show diagram",
|
|
111
|
+
disabled: hasError || isLoading
|
|
112
|
+
},
|
|
113
|
+
"Diagram"
|
|
114
|
+
);
|
|
115
|
+
return /* @__PURE__ */ import_react.default.createElement(
|
|
116
|
+
"div",
|
|
117
|
+
{
|
|
118
|
+
className: `code-block mermaid-block mermaid-code-view ${hasError ? "has-error" : ""} ${isLoading ? "is-loading" : ""}`
|
|
119
|
+
},
|
|
120
|
+
/* @__PURE__ */ import_react.default.createElement(import_code_block_header.default, { icon: /* @__PURE__ */ import_react.default.createElement(import_code_block_icon.default, { language: "mermaid" }), code, actions: toggleButton }),
|
|
121
|
+
/* @__PURE__ */ import_react.default.createElement("div", { className: "mermaid-code" }, hasError && errorMessage ? /* @__PURE__ */ import_react.default.createElement("div", { className: "mermaid-error-message" }, /* @__PURE__ */ import_react.default.createElement("strong", null, "Syntax Error"), /* @__PURE__ */ import_react.default.createElement("span", null, errorMessage)) : null, /* @__PURE__ */ import_react.default.createElement(import_code_block_code.default, { code, highlightedHtml }))
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=mermaid-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/mermaid/mermaid-client.tsx"],"sourcesContent":["'use client';\n\nimport { useTheme } from 'next-themes';\nimport React, { useCallback, useEffect, useState } from 'react';\n\nimport { MermaidDiagramView } from './mermaid-diagram-view';\nimport { renderWithIframe } from './mermaid-iframe-renderer';\nimport { renderWithBeautifulMermaid } from './mermaid-renderer';\nimport CodeBlockCode from '../code-block/code-block-code';\nimport CodeBlockHeader from '../code-block/code-block-header';\nimport CodeBlockIcon from '../code-block/code-block-icon';\n\n/**\n * Props for the MermaidClient component.\n */\nexport type MermaidClientProps = {\n /** The mermaid diagram code */\n code: string;\n /** Pre-rendered HTML from Shiki highlighter for code view */\n highlightedHtml?: string | null;\n};\n\n/**\n * Render state for the mermaid component.\n */\ntype RenderState = { status: 'loading' } | { status: 'success'; svg: string } | { status: 'error'; message: string };\n\n/**\n * View mode for the mermaid component.\n */\ntype ViewMode = 'diagram' | 'code';\n\n/**\n * Client component for rendering Mermaid diagrams with interactive features.\n *\n * @remarks\n * This component handles:\n * - Diagram rendering using beautiful-mermaid with iframe fallback\n * - Theme switching (light/dark)\n * - Toggle between diagram and code view\n * - Syntax-highlighted code display during loading\n *\n * Component architecture:\n * - MermaidClient: Main controller for rendering and state management\n * - MermaidDiagramView: Diagram display with pan/zoom (separate file)\n * - MermaidFullscreenModal: Fullscreen view (separate file)\n * - MermaidZoomControls: Reusable zoom buttons (memoized)\n * - MermaidDiagramContent: SVG renderer (memoized)\n *\n * @param props - The component props\n * @param props.code - The mermaid diagram code\n * @param props.highlightedHtml - Pre-rendered HTML from Shiki highlighter\n * @returns The rendered mermaid component\n */\nexport default function MermaidClient({ code, highlightedHtml }: MermaidClientProps) {\n const [mounted, setMounted] = useState(false);\n const [renderState, setRenderState] = useState<RenderState>({ status: 'loading' });\n const [viewMode, setViewMode] = useState<ViewMode>('diagram');\n const { theme, systemTheme } = useTheme();\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n const renderDiagram = useCallback(async () => {\n const currentTheme = theme === 'system' ? systemTheme : theme;\n const isDark = currentTheme === 'dark';\n\n try {\n const result = await renderWithBeautifulMermaid(code, isDark);\n if (result) {\n setRenderState({ status: 'success', svg: result });\n return;\n }\n } catch {\n // Fall through to iframe fallback\n }\n\n const result = await renderWithIframe(code, isDark);\n if (result.success) {\n setRenderState({ status: 'success', svg: result.svg });\n } else {\n setRenderState({ status: 'error', message: result.error });\n }\n }, [code, theme, systemTheme]);\n\n useEffect(() => {\n if (!mounted) {\n return;\n }\n renderDiagram();\n }, [mounted, renderDiagram]);\n\n const toggleViewMode = useCallback(() => {\n setViewMode((prev) => (prev === 'diagram' ? 'code' : 'diagram'));\n }, []);\n\n const isLoading = !mounted || renderState.status === 'loading';\n const hasError = renderState.status === 'error';\n const showDiagram = viewMode === 'diagram' && !hasError && !isLoading;\n\n if (showDiagram) {\n return <MermaidDiagramView svg={renderState.svg} onToggleViewMode={toggleViewMode} />;\n }\n\n return (\n <MermaidCodeView\n code={code}\n highlightedHtml={highlightedHtml}\n hasError={hasError}\n isLoading={isLoading}\n errorMessage={renderState.status === 'error' ? renderState.message : undefined}\n onToggleViewMode={toggleViewMode}\n />\n );\n}\n\n/**\n * Props for the MermaidCodeView component.\n */\ntype MermaidCodeViewProps = {\n /** The mermaid diagram code */\n code: string;\n /** Pre-rendered HTML from Shiki highlighter */\n highlightedHtml?: string | null;\n /** Whether there is an error */\n hasError: boolean;\n /** Whether the diagram is loading */\n isLoading: boolean;\n /** Error message if hasError is true */\n errorMessage?: string;\n /** Callback to toggle view mode */\n onToggleViewMode: () => void;\n};\n\n/**\n * Code view for Mermaid diagrams with syntax highlighting.\n *\n * @param props - The component props\n * @returns The code view component\n */\nfunction MermaidCodeView({\n code,\n highlightedHtml,\n hasError,\n isLoading,\n errorMessage,\n onToggleViewMode,\n}: MermaidCodeViewProps) {\n const toggleButton = (\n <button\n type=\"button\"\n onClick={onToggleViewMode}\n className=\"mermaid-toggle-btn\"\n title=\"Show diagram\"\n disabled={hasError || isLoading}\n >\n Diagram\n </button>\n );\n\n return (\n <div\n className={`code-block mermaid-block mermaid-code-view ${hasError ? 'has-error' : ''} ${isLoading ? 'is-loading' : ''}`}\n >\n <CodeBlockHeader icon={<CodeBlockIcon language=\"mermaid\" />} code={code} actions={toggleButton} />\n <div className=\"mermaid-code\">\n {hasError && errorMessage ? (\n <div className=\"mermaid-error-message\">\n <strong>Syntax Error</strong>\n <span>{errorMessage}</span>\n </div>\n ) : null}\n <CodeBlockCode code={code} highlightedHtml={highlightedHtml} />\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,yBAAyB;AACzB,mBAAwD;AAExD,kCAAmC;AACnC,qCAAiC;AACjC,8BAA2C;AAC3C,6BAA0B;AAC1B,+BAA4B;AAC5B,6BAA0B;AA4CX,SAAR,cAA+B,EAAE,MAAM,gBAAgB,GAAuB;AACnF,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAS,KAAK;AAC5C,QAAM,CAAC,aAAa,cAAc,QAAI,uBAAsB,EAAE,QAAQ,UAAU,CAAC;AACjF,QAAM,CAAC,UAAU,WAAW,QAAI,uBAAmB,SAAS;AAC5D,QAAM,EAAE,OAAO,YAAY,QAAI,6BAAS;AAExC,8BAAU,MAAM;AACd,eAAW,IAAI;AAAA,EACjB,GAAG,CAAC,CAAC;AAEL,QAAM,oBAAgB,0BAAY,YAAY;AAC5C,UAAM,eAAe,UAAU,WAAW,cAAc;AACxD,UAAM,SAAS,iBAAiB;AAEhC,QAAI;AACF,YAAMA,UAAS,UAAM,oDAA2B,MAAM,MAAM;AAC5D,UAAIA,SAAQ;AACV,uBAAe,EAAE,QAAQ,WAAW,KAAKA,QAAO,CAAC;AACjD;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,UAAM,SAAS,UAAM,iDAAiB,MAAM,MAAM;AAClD,QAAI,OAAO,SAAS;AAClB,qBAAe,EAAE,QAAQ,WAAW,KAAK,OAAO,IAAI,CAAC;AAAA,IACvD,OAAO;AACL,qBAAe,EAAE,QAAQ,SAAS,SAAS,OAAO,MAAM,CAAC;AAAA,IAC3D;AAAA,EACF,GAAG,CAAC,MAAM,OAAO,WAAW,CAAC;AAE7B,8BAAU,MAAM;AACd,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AACA,kBAAc;AAAA,EAChB,GAAG,CAAC,SAAS,aAAa,CAAC;AAE3B,QAAM,qBAAiB,0BAAY,MAAM;AACvC,gBAAY,CAAC,SAAU,SAAS,YAAY,SAAS,SAAU;AAAA,EACjE,GAAG,CAAC,CAAC;AAEL,QAAM,YAAY,CAAC,WAAW,YAAY,WAAW;AACrD,QAAM,WAAW,YAAY,WAAW;AACxC,QAAM,cAAc,aAAa,aAAa,CAAC,YAAY,CAAC;AAE5D,MAAI,aAAa;AACf,WAAO,6BAAAC,QAAA,cAAC,kDAAmB,KAAK,YAAY,KAAK,kBAAkB,gBAAgB;AAAA,EACrF;AAEA,SACE,6BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc,YAAY,WAAW,UAAU,YAAY,UAAU;AAAA,MACrE,kBAAkB;AAAA;AAAA,EACpB;AAEJ;AA0BA,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyB;AACvB,QAAM,eACJ,6BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAS;AAAA,MACT,WAAU;AAAA,MACV,OAAM;AAAA,MACN,UAAU,YAAY;AAAA;AAAA,IACvB;AAAA,EAED;AAGF,SACE,6BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,8CAA8C,WAAW,cAAc,EAAE,IAAI,YAAY,eAAe,EAAE;AAAA;AAAA,IAErH,6BAAAA,QAAA,cAAC,yBAAAC,SAAA,EAAgB,MAAM,6BAAAD,QAAA,cAAC,uBAAAE,SAAA,EAAc,UAAS,WAAU,GAAI,MAAY,SAAS,cAAc;AAAA,IAChG,6BAAAF,QAAA,cAAC,SAAI,WAAU,kBACZ,YAAY,eACX,6BAAAA,QAAA,cAAC,SAAI,WAAU,2BACb,6BAAAA,QAAA,cAAC,gBAAO,cAAY,GACpB,6BAAAA,QAAA,cAAC,cAAM,YAAa,CACtB,IACE,MACJ,6BAAAA,QAAA,cAAC,uBAAAG,SAAA,EAAc,MAAY,iBAAkC,CAC/D;AAAA,EACF;AAEJ;","names":["result","React","CodeBlockHeader","CodeBlockIcon","CodeBlockCode"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Props for the MermaidDiagramContent component.
|
|
5
|
+
*/
|
|
6
|
+
type MermaidDiagramContentProps = {
|
|
7
|
+
/** The rendered SVG string */
|
|
8
|
+
svg: string;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Component for rendering the Mermaid diagram SVG.
|
|
12
|
+
*
|
|
13
|
+
* @remarks
|
|
14
|
+
* This component is memoized to prevent unnecessary re-renders
|
|
15
|
+
* when only the SVG content matters. Uses dangerouslySetInnerHTML
|
|
16
|
+
* to render the pre-rendered SVG string from Mermaid.
|
|
17
|
+
*
|
|
18
|
+
* @param props - The component props
|
|
19
|
+
* @param props.svg - The rendered SVG string
|
|
20
|
+
* @returns The diagram content
|
|
21
|
+
*/
|
|
22
|
+
declare function MermaidDiagramContentComponent({ svg }: MermaidDiagramContentProps): React.JSX.Element;
|
|
23
|
+
declare const MermaidDiagramContent: React.MemoExoticComponent<typeof MermaidDiagramContentComponent>;
|
|
24
|
+
|
|
25
|
+
export { MermaidDiagramContent, type MermaidDiagramContentProps, MermaidDiagramContent as default };
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
var __create = Object.create;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
8
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __export = (target, all) => {
|
|
10
|
+
for (var name in all)
|
|
11
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
12
|
+
};
|
|
13
|
+
var __copyProps = (to, from, except, desc) => {
|
|
14
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
15
|
+
for (let key of __getOwnPropNames(from))
|
|
16
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
17
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
18
|
+
}
|
|
19
|
+
return to;
|
|
20
|
+
};
|
|
21
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
22
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
23
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
24
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
25
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
26
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
27
|
+
mod
|
|
28
|
+
));
|
|
29
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
30
|
+
var mermaid_diagram_content_exports = {};
|
|
31
|
+
__export(mermaid_diagram_content_exports, {
|
|
32
|
+
MermaidDiagramContent: () => MermaidDiagramContent,
|
|
33
|
+
default: () => mermaid_diagram_content_default
|
|
34
|
+
});
|
|
35
|
+
module.exports = __toCommonJS(mermaid_diagram_content_exports);
|
|
36
|
+
var import_react = __toESM(require("react"));
|
|
37
|
+
function MermaidDiagramContentComponent({ svg }) {
|
|
38
|
+
return /* @__PURE__ */ import_react.default.createElement("div", { className: "mermaid-diagram", dangerouslySetInnerHTML: { __html: svg } });
|
|
39
|
+
}
|
|
40
|
+
const MermaidDiagramContent = (0, import_react.memo)(MermaidDiagramContentComponent);
|
|
41
|
+
var mermaid_diagram_content_default = MermaidDiagramContent;
|
|
42
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
43
|
+
0 && (module.exports = {
|
|
44
|
+
MermaidDiagramContent
|
|
45
|
+
});
|
|
46
|
+
//# sourceMappingURL=mermaid-diagram-content.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/mermaid/mermaid-diagram-content.tsx"],"sourcesContent":["'use client';\n\nimport React, { memo } from 'react';\n\n/**\n * Props for the MermaidDiagramContent component.\n */\nexport type MermaidDiagramContentProps = {\n /** The rendered SVG string */\n svg: string;\n};\n\n/**\n * Component for rendering the Mermaid diagram SVG.\n *\n * @remarks\n * This component is memoized to prevent unnecessary re-renders\n * when only the SVG content matters. Uses dangerouslySetInnerHTML\n * to render the pre-rendered SVG string from Mermaid.\n *\n * @param props - The component props\n * @param props.svg - The rendered SVG string\n * @returns The diagram content\n */\nfunction MermaidDiagramContentComponent({ svg }: MermaidDiagramContentProps) {\n return <div className=\"mermaid-diagram\" dangerouslySetInnerHTML={{ __html: svg }} />;\n}\n\nexport const MermaidDiagramContent = memo(MermaidDiagramContentComponent);\n\nexport default MermaidDiagramContent;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,mBAA4B;AAsB5B,SAAS,+BAA+B,EAAE,IAAI,GAA+B;AAC3E,SAAO,6BAAAA,QAAA,cAAC,SAAI,WAAU,mBAAkB,yBAAyB,EAAE,QAAQ,IAAI,GAAG;AACpF;AAEO,MAAM,4BAAwB,mBAAK,8BAA8B;AAExE,IAAO,kCAAQ;","names":["React"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Props for the MermaidDiagramView component.
|
|
5
|
+
*/
|
|
6
|
+
type MermaidDiagramViewProps = {
|
|
7
|
+
/** The rendered SVG string */
|
|
8
|
+
svg: string;
|
|
9
|
+
/** Callback to toggle between diagram and code view */
|
|
10
|
+
onToggleViewMode: () => void;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Component for displaying Mermaid diagrams with pan and zoom functionality.
|
|
14
|
+
*
|
|
15
|
+
* @remarks
|
|
16
|
+
* This component provides:
|
|
17
|
+
* - Zoom in/out using mouse wheel (Ctrl/Cmd + wheel) or buttons
|
|
18
|
+
* - Pan by dragging when zoomed in
|
|
19
|
+
* - Double-click to reset zoom
|
|
20
|
+
* - Keyboard shortcuts (+/- for zoom, Ctrl+0 for reset)
|
|
21
|
+
* - Fullscreen modal view
|
|
22
|
+
* - Resizable container
|
|
23
|
+
*
|
|
24
|
+
* @param props - The component props
|
|
25
|
+
* @param props.svg - The rendered SVG string
|
|
26
|
+
* @param props.onToggleViewMode - Callback to toggle view mode
|
|
27
|
+
* @returns The rendered diagram view with pan/zoom controls
|
|
28
|
+
*/
|
|
29
|
+
declare function MermaidDiagramViewComponent({ svg, onToggleViewMode }: MermaidDiagramViewProps): React.JSX.Element;
|
|
30
|
+
declare const MermaidDiagramView: React.MemoExoticComponent<typeof MermaidDiagramViewComponent>;
|
|
31
|
+
|
|
32
|
+
export { MermaidDiagramView, type MermaidDiagramViewProps, MermaidDiagramView as default };
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
var __create = Object.create;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
8
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __export = (target, all) => {
|
|
10
|
+
for (var name in all)
|
|
11
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
12
|
+
};
|
|
13
|
+
var __copyProps = (to, from, except, desc) => {
|
|
14
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
15
|
+
for (let key of __getOwnPropNames(from))
|
|
16
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
17
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
18
|
+
}
|
|
19
|
+
return to;
|
|
20
|
+
};
|
|
21
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
22
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
23
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
24
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
25
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
26
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
27
|
+
mod
|
|
28
|
+
));
|
|
29
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
30
|
+
var mermaid_diagram_view_exports = {};
|
|
31
|
+
__export(mermaid_diagram_view_exports, {
|
|
32
|
+
MermaidDiagramView: () => MermaidDiagramView,
|
|
33
|
+
default: () => mermaid_diagram_view_default
|
|
34
|
+
});
|
|
35
|
+
module.exports = __toCommonJS(mermaid_diagram_view_exports);
|
|
36
|
+
var import_react = __toESM(require("react"));
|
|
37
|
+
var import_mermaid_diagram_content = require("./mermaid-diagram-content");
|
|
38
|
+
var import_mermaid_fullscreen_modal = require("./mermaid-fullscreen-modal");
|
|
39
|
+
var import_mermaid_zoom_controls = require("./mermaid-zoom-controls");
|
|
40
|
+
var import_use_pan_zoom = require("./use-pan-zoom");
|
|
41
|
+
function MermaidDiagramViewComponent({ svg, onToggleViewMode }) {
|
|
42
|
+
const { containerRef, contentRef, state, zoomIn, zoomOut, reset, isDragging, isZoomed } = (0, import_use_pan_zoom.usePanZoom)();
|
|
43
|
+
const [isFullscreen, setIsFullscreen] = (0, import_react.useState)(false);
|
|
44
|
+
const cursorStyle = isDragging ? "grabbing" : isZoomed ? "grab" : "default";
|
|
45
|
+
const openFullscreen = (0, import_react.useCallback)(() => {
|
|
46
|
+
setIsFullscreen(true);
|
|
47
|
+
}, []);
|
|
48
|
+
const closeFullscreen = (0, import_react.useCallback)(() => {
|
|
49
|
+
setIsFullscreen(false);
|
|
50
|
+
}, []);
|
|
51
|
+
return /* @__PURE__ */ import_react.default.createElement("div", { className: "mermaid-block mermaid-diagram-view" }, /* @__PURE__ */ import_react.default.createElement("div", { ref: containerRef, className: "mermaid-pan-zoom-container", tabIndex: 0, style: { cursor: cursorStyle } }, /* @__PURE__ */ import_react.default.createElement(
|
|
52
|
+
"div",
|
|
53
|
+
{
|
|
54
|
+
ref: contentRef,
|
|
55
|
+
className: "mermaid-pan-zoom-content",
|
|
56
|
+
style: {
|
|
57
|
+
transform: `translate(${state.position.x}px, ${state.position.y}px) scale(${state.scale})`
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
/* @__PURE__ */ import_react.default.createElement(import_mermaid_diagram_content.MermaidDiagramContent, { svg })
|
|
61
|
+
)), /* @__PURE__ */ import_react.default.createElement("div", { className: "mermaid-controls" }, /* @__PURE__ */ import_react.default.createElement(
|
|
62
|
+
import_mermaid_zoom_controls.MermaidZoomControls,
|
|
63
|
+
{
|
|
64
|
+
onZoomIn: zoomIn,
|
|
65
|
+
onZoomOut: zoomOut,
|
|
66
|
+
onReset: reset,
|
|
67
|
+
isZoomed,
|
|
68
|
+
onFullscreen: openFullscreen
|
|
69
|
+
}
|
|
70
|
+
), /* @__PURE__ */ import_react.default.createElement(
|
|
71
|
+
"button",
|
|
72
|
+
{
|
|
73
|
+
type: "button",
|
|
74
|
+
onClick: onToggleViewMode,
|
|
75
|
+
className: "mermaid-toggle-btn",
|
|
76
|
+
title: "Show code",
|
|
77
|
+
"aria-label": "Show code"
|
|
78
|
+
},
|
|
79
|
+
"Code"
|
|
80
|
+
)), isFullscreen ? /* @__PURE__ */ import_react.default.createElement(import_mermaid_fullscreen_modal.MermaidFullscreenModal, { svg, onClose: closeFullscreen }) : null);
|
|
81
|
+
}
|
|
82
|
+
const MermaidDiagramView = (0, import_react.memo)(MermaidDiagramViewComponent);
|
|
83
|
+
var mermaid_diagram_view_default = MermaidDiagramView;
|
|
84
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
85
|
+
0 && (module.exports = {
|
|
86
|
+
MermaidDiagramView
|
|
87
|
+
});
|
|
88
|
+
//# sourceMappingURL=mermaid-diagram-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/mermaid/mermaid-diagram-view.tsx"],"sourcesContent":["'use client';\n\nimport React, { memo, useCallback, useState } from 'react';\n\nimport { MermaidDiagramContent } from './mermaid-diagram-content';\nimport { MermaidFullscreenModal } from './mermaid-fullscreen-modal';\nimport { MermaidZoomControls } from './mermaid-zoom-controls';\nimport { usePanZoom } from './use-pan-zoom';\n\n/**\n * Props for the MermaidDiagramView component.\n */\nexport type MermaidDiagramViewProps = {\n /** The rendered SVG string */\n svg: string;\n /** Callback to toggle between diagram and code view */\n onToggleViewMode: () => void;\n};\n\n/**\n * Component for displaying Mermaid diagrams with pan and zoom functionality.\n *\n * @remarks\n * This component provides:\n * - Zoom in/out using mouse wheel (Ctrl/Cmd + wheel) or buttons\n * - Pan by dragging when zoomed in\n * - Double-click to reset zoom\n * - Keyboard shortcuts (+/- for zoom, Ctrl+0 for reset)\n * - Fullscreen modal view\n * - Resizable container\n *\n * @param props - The component props\n * @param props.svg - The rendered SVG string\n * @param props.onToggleViewMode - Callback to toggle view mode\n * @returns The rendered diagram view with pan/zoom controls\n */\nfunction MermaidDiagramViewComponent({ svg, onToggleViewMode }: MermaidDiagramViewProps) {\n const { containerRef, contentRef, state, zoomIn, zoomOut, reset, isDragging, isZoomed } = usePanZoom();\n const [isFullscreen, setIsFullscreen] = useState(false);\n\n const cursorStyle = isDragging ? 'grabbing' : isZoomed ? 'grab' : 'default';\n\n const openFullscreen = useCallback(() => {\n setIsFullscreen(true);\n }, []);\n\n const closeFullscreen = useCallback(() => {\n setIsFullscreen(false);\n }, []);\n\n return (\n <div className=\"mermaid-block mermaid-diagram-view\">\n <div ref={containerRef} className=\"mermaid-pan-zoom-container\" tabIndex={0} style={{ cursor: cursorStyle }}>\n <div\n ref={contentRef}\n className=\"mermaid-pan-zoom-content\"\n style={{\n transform: `translate(${state.position.x}px, ${state.position.y}px) scale(${state.scale})`,\n }}\n >\n <MermaidDiagramContent svg={svg} />\n </div>\n </div>\n <div className=\"mermaid-controls\">\n <MermaidZoomControls\n onZoomIn={zoomIn}\n onZoomOut={zoomOut}\n onReset={reset}\n isZoomed={isZoomed}\n onFullscreen={openFullscreen}\n />\n <button\n type=\"button\"\n onClick={onToggleViewMode}\n className=\"mermaid-toggle-btn\"\n title=\"Show code\"\n aria-label=\"Show code\"\n >\n Code\n </button>\n </div>\n {isFullscreen ? <MermaidFullscreenModal svg={svg} onClose={closeFullscreen} /> : null}\n </div>\n );\n}\n\nexport const MermaidDiagramView = memo(MermaidDiagramViewComponent);\n\nexport default MermaidDiagramView;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,mBAAmD;AAEnD,qCAAsC;AACtC,sCAAuC;AACvC,mCAAoC;AACpC,0BAA2B;AA6B3B,SAAS,4BAA4B,EAAE,KAAK,iBAAiB,GAA4B;AACvF,QAAM,EAAE,cAAc,YAAY,OAAO,QAAQ,SAAS,OAAO,YAAY,SAAS,QAAI,gCAAW;AACrG,QAAM,CAAC,cAAc,eAAe,QAAI,uBAAS,KAAK;AAEtD,QAAM,cAAc,aAAa,aAAa,WAAW,SAAS;AAElE,QAAM,qBAAiB,0BAAY,MAAM;AACvC,oBAAgB,IAAI;AAAA,EACtB,GAAG,CAAC,CAAC;AAEL,QAAM,sBAAkB,0BAAY,MAAM;AACxC,oBAAgB,KAAK;AAAA,EACvB,GAAG,CAAC,CAAC;AAEL,SACE,6BAAAA,QAAA,cAAC,SAAI,WAAU,wCACb,6BAAAA,QAAA,cAAC,SAAI,KAAK,cAAc,WAAU,8BAA6B,UAAU,GAAG,OAAO,EAAE,QAAQ,YAAY,KACvG,6BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAU;AAAA,MACV,OAAO;AAAA,QACL,WAAW,aAAa,MAAM,SAAS,CAAC,OAAO,MAAM,SAAS,CAAC,aAAa,MAAM,KAAK;AAAA,MACzF;AAAA;AAAA,IAEA,6BAAAA,QAAA,cAAC,wDAAsB,KAAU;AAAA,EACnC,CACF,GACA,6BAAAA,QAAA,cAAC,SAAI,WAAU,sBACb,6BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,UAAU;AAAA,MACV,WAAW;AAAA,MACX,SAAS;AAAA,MACT;AAAA,MACA,cAAc;AAAA;AAAA,EAChB,GACA,6BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAS;AAAA,MACT,WAAU;AAAA,MACV,OAAM;AAAA,MACN,cAAW;AAAA;AAAA,IACZ;AAAA,EAED,CACF,GACC,eAAe,6BAAAA,QAAA,cAAC,0DAAuB,KAAU,SAAS,iBAAiB,IAAK,IACnF;AAEJ;AAEO,MAAM,yBAAqB,mBAAK,2BAA2B;AAElE,IAAO,+BAAQ;","names":["React"]}
|