@lobehub/ui 1.168.17 → 1.168.19

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.
Files changed (40) hide show
  1. package/es/Highlighter/SyntaxHighlighter/index.js +10 -9
  2. package/es/Highlighter/style.d.ts +1 -1
  3. package/es/Hotkey/index.d.ts +1 -0
  4. package/es/Hotkey/index.js +15 -7
  5. package/es/Hotkey/style.js +1 -1
  6. package/es/Hotkey/type.d.ts +1 -0
  7. package/es/Hotkey/type.js +1 -0
  8. package/es/Markdown/Typography.d.ts +5 -5
  9. package/es/Markdown/Typography.js +4 -3
  10. package/es/Markdown/index.d.ts +1 -1
  11. package/es/Markdown/index.js +166 -90
  12. package/es/Markdown/markdown.style.d.ts +1 -18
  13. package/es/Markdown/markdown.style.js +19 -19
  14. package/es/Markdown/style.d.ts +1 -6
  15. package/es/Markdown/style.js +4 -12
  16. package/es/Mermaid/{Controls.js → components/Controls.js} +1 -1
  17. package/es/Mermaid/components/MermaidContainer.d.ts +5 -0
  18. package/es/Mermaid/components/MermaidContainer.js +43 -0
  19. package/es/Mermaid/components/MermaidZoomableContainer.d.ts +5 -0
  20. package/es/Mermaid/components/MermaidZoomableContainer.js +21 -0
  21. package/es/Mermaid/components/style.d.ts +3 -0
  22. package/es/Mermaid/components/style.js +12 -0
  23. package/es/Mermaid/index.js +9 -7
  24. package/es/Mermaid/style.d.ts +1 -1
  25. package/es/Swatches/index.d.ts +2 -1
  26. package/es/Swatches/index.js +34 -22
  27. package/es/Swatches/style.js +2 -2
  28. package/es/chat/MessageInput/index.js +37 -20
  29. package/es/components.d.ts +1 -1
  30. package/es/components.js +1 -1
  31. package/es/hooks/useHighlight.d.ts +8 -1
  32. package/es/hooks/useHighlight.js +121 -41
  33. package/es/hooks/useMermaid.d.ts +9 -0
  34. package/es/{Mermaid → hooks}/useMermaid.js +137 -73
  35. package/es/mdx/Mdx/index.js +1 -1
  36. package/es/utils/genCdnUrl.d.ts +3 -0
  37. package/es/utils/genCdnUrl.js +3 -1
  38. package/package.json +6 -6
  39. package/es/Mermaid/useMermaid.d.ts +0 -3
  40. /package/es/Mermaid/{Controls.d.ts → components/Controls.d.ts} +0 -0
@@ -5,70 +5,150 @@ function _asyncToGenerator(fn) { return function () { var self = this, args = ar
5
5
  import { transformerNotationDiff, transformerNotationErrorLevel, transformerNotationFocus, transformerNotationHighlight, transformerNotationWordHighlight } from '@shikijs/transformers';
6
6
  import { useTheme, useThemeMode } from 'antd-style';
7
7
  import { useMemo } from 'react';
8
- import { codeToHtml } from 'shiki';
9
8
  import useSWR from 'swr';
10
9
  import { Md5 } from 'ts-md5';
11
10
  import languageMap from "./languageMap";
12
11
  export var FALLBACK_LANG = 'txt';
12
+
13
+ // 应用级缓存,避免重复计算
14
+ var highlightCache = new Map();
15
+ var MD5_LENGTH_THRESHOLD = 10000; // 超过该长度使用异步MD5
16
+
17
+ // 颜色替换映射类型
18
+
19
+ // 懒加载 shiki
20
+ var loadShiki = function loadShiki() {
21
+ return import('shiki').then(function (mod) {
22
+ return mod.codeToHtml;
23
+ });
24
+ };
25
+ var shikiPromise = loadShiki();
26
+
27
+ // 辅助函数:安全的HTML转义
28
+ var escapeHtml = function escapeHtml(str) {
29
+ return str.replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;').replaceAll('"', '&quot;').replaceAll("'", '&#039;');
30
+ };
31
+
32
+ // 主高亮组件
13
33
  export var useHighlight = function useHighlight(text, lang, enableTransformer) {
14
34
  var _useThemeMode = useThemeMode(),
15
35
  isDarkMode = _useThemeMode.isDarkMode;
36
+ var theme = useTheme();
16
37
  var language = lang.toLowerCase();
38
+
39
+ // 匹配支持的语言
17
40
  var matchedLanguage = useMemo(function () {
18
41
  return languageMap.includes(language) ? language : FALLBACK_LANG;
19
42
  }, [language]);
20
- var theme = useTheme();
43
+
44
+ // 优化transformer创建
21
45
  var transformers = useMemo(function () {
22
46
  if (!enableTransformer) return;
23
47
  return [transformerNotationDiff(), transformerNotationHighlight(), transformerNotationWordHighlight(), transformerNotationFocus(), transformerNotationErrorLevel()];
24
48
  }, [enableTransformer]);
25
- var key = useMemo(function () {
26
- return Md5.hashStr(text);
27
- }, [text]);
28
- return useSWR([matchedLanguage, isDarkMode ? 'd' : 'l', key].join('-'), /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
49
+
50
+ // 优化颜色替换配置
51
+ var colorReplacements = useMemo(function () {
52
+ return {
53
+ 'slack-dark': {
54
+ '#4ec9b0': theme.yellow,
55
+ '#569cd6': theme.colorError,
56
+ '#6a9955': theme.gray,
57
+ '#9cdcfe': theme.colorText,
58
+ '#b5cea8': theme.purple10,
59
+ '#c586c0': theme.colorInfo,
60
+ '#ce9178': theme.colorSuccess,
61
+ '#dcdcaa': theme.colorWarning,
62
+ '#e6e6e6': theme.colorText
63
+ },
64
+ 'slack-ochin': {
65
+ '#002339': theme.colorText,
66
+ '#0991b6': theme.colorError,
67
+ '#174781': theme.purple10,
68
+ '#2f86d2': theme.colorText,
69
+ '#357b42': theme.gray,
70
+ '#7b30d0': theme.colorInfo,
71
+ '#7eb233': theme.colorWarningTextActive,
72
+ '#a44185': theme.colorSuccess,
73
+ '#dc3eb7': theme.yellow11
74
+ }
75
+ };
76
+ }, [theme]);
77
+
78
+ // 构建缓存键
79
+ var cacheKey = useMemo(function () {
80
+ // 长文本使用 hash
81
+ var hash = text.length < MD5_LENGTH_THRESHOLD ? text : Md5.hashStr(text);
82
+ return [matchedLanguage, isDarkMode ? 'd' : 'l', hash].join('-');
83
+ }, [matchedLanguage, isDarkMode]);
84
+
85
+ // 使用SWR获取高亮HTML
86
+ return useSWR(cacheKey, /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
87
+ var codeToHtml, html, _codeToHtml, _html, fallbackHtml;
29
88
  return _regeneratorRuntime().wrap(function _callee$(_context) {
30
89
  while (1) switch (_context.prev = _context.next) {
31
90
  case 0:
32
- _context.prev = 0;
33
- return _context.abrupt("return", codeToHtml(text, {
34
- colorReplacements: {
35
- 'slack-dark': {
36
- '#4ec9b0': theme.yellow,
37
- '#569cd6': theme.colorError,
38
- '#6a9955': theme.gray,
39
- '#9cdcfe': theme.colorText,
40
- '#b5cea8': theme.purple10,
41
- '#c586c0': theme.colorInfo,
42
- '#ce9178': theme.colorSuccess,
43
- '#dcdcaa': theme.colorWarning,
44
- '#e6e6e6': theme.colorText
45
- },
46
- 'slack-ochin': {
47
- '#002339': theme.colorText,
48
- '#0991b6': theme.colorError,
49
- '#174781': theme.purple10,
50
- '#2f86d2': theme.colorText,
51
- '#357b42': theme.gray,
52
- '#7b30d0': theme.colorInfo,
53
- '#7eb233': theme.colorWarningTextActive,
54
- '#a44185': theme.colorSuccess,
55
- '#dc3eb7': theme.yellow11
56
- }
57
- },
91
+ if (!(cacheKey && highlightCache.has(cacheKey))) {
92
+ _context.next = 2;
93
+ break;
94
+ }
95
+ return _context.abrupt("return", highlightCache.get(cacheKey));
96
+ case 2:
97
+ _context.prev = 2;
98
+ _context.next = 5;
99
+ return shikiPromise;
100
+ case 5:
101
+ codeToHtml = _context.sent;
102
+ _context.next = 8;
103
+ return codeToHtml(text, {
104
+ colorReplacements: colorReplacements,
58
105
  lang: matchedLanguage,
59
106
  theme: isDarkMode ? 'slack-dark' : 'slack-ochin',
60
107
  transformers: transformers
61
- }));
62
- case 4:
63
- _context.prev = 4;
64
- _context.t0 = _context["catch"](0);
65
- console.error('shiki Highlight error:', _context.t0);
66
- return _context.abrupt("return", text);
108
+ });
67
109
  case 8:
110
+ html = _context.sent;
111
+ // 缓存结果
112
+ if (cacheKey) highlightCache.set(cacheKey, html);
113
+ return _context.abrupt("return", html);
114
+ case 13:
115
+ _context.prev = 13;
116
+ _context.t0 = _context["catch"](2);
117
+ console.error('高级渲染失败:', _context.t0);
118
+ _context.prev = 16;
119
+ _context.next = 19;
120
+ return shikiPromise;
121
+ case 19:
122
+ _codeToHtml = _context.sent;
123
+ _context.next = 22;
124
+ return _codeToHtml(text, {
125
+ lang: matchedLanguage,
126
+ theme: isDarkMode ? 'dark-plus' : 'light-plus'
127
+ });
128
+ case 22:
129
+ _html = _context.sent;
130
+ if (cacheKey) highlightCache.set(cacheKey, _html);
131
+ return _context.abrupt("return", _html);
132
+ case 27:
133
+ _context.prev = 27;
134
+ _context.t1 = _context["catch"](16);
135
+ // 最终降级到纯文本
136
+ fallbackHtml = "<pre class=\"fallback\"><code>".concat(escapeHtml(text), "</code></pre>");
137
+ if (cacheKey) highlightCache.set(cacheKey, fallbackHtml);
138
+ return _context.abrupt("return", fallbackHtml);
139
+ case 32:
68
140
  case "end":
69
141
  return _context.stop();
70
142
  }
71
- }, _callee, null, [[0, 4]]);
72
- })));
143
+ }, _callee, null, [[2, 13], [16, 27]]);
144
+ })), {
145
+ dedupingInterval: 3000,
146
+ // 3秒内相同请求只执行一次
147
+ errorRetryCount: 2,
148
+ // 最多重试2次
149
+ revalidateOnFocus: false,
150
+ revalidateOnReconnect: false
151
+ });
73
152
  };
74
- export { default as languageMap } from "./languageMap";
153
+ export { default as languageMap } from "./languageMap";
154
+ export { escapeHtml, highlightCache, loadShiki, MD5_LENGTH_THRESHOLD, shikiPromise };
@@ -0,0 +1,9 @@
1
+ import { SWRResponse } from 'swr';
2
+ /**
3
+ * 验证并处理 Mermaid 图表内容
4
+ */
5
+ export declare const useMermaid: (id: string, content: string) => SWRResponse<string, Error>;
6
+ /**
7
+ * 初始化 Mermaid 配置
8
+ */
9
+ export declare const useMermaidInit: () => void;
@@ -9,29 +9,118 @@ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len
9
9
  function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
10
10
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
11
11
  import { useTheme } from 'antd-style';
12
- import mermaid from 'mermaid';
13
- import { useCallback, useEffect, useState } from 'react';
14
- import { Center } from 'react-layout-kit';
15
- import { TransformComponent, TransformWrapper } from 'react-zoom-pan-pinch';
16
- import Controls from "./Controls";
17
- import { jsx as _jsx } from "react/jsx-runtime";
18
- import { jsxs as _jsxs } from "react/jsx-runtime";
19
- export var useMermaid = function useMermaid(content) {
20
- var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
21
- enablePanZoom = _ref.enablePanZoom;
22
- var _useState = useState(),
12
+ import { useEffect, useMemo, useState } from 'react';
13
+ import useSWR from 'swr';
14
+ import { Md5 } from 'ts-md5';
15
+
16
+ // 缓存已验证的图表内容
17
+ var mermaidCache = new Map();
18
+ var MD5_LENGTH_THRESHOLD = 10000;
19
+
20
+ // 懒加载 mermaid 实例
21
+ var loadMermaid = function loadMermaid() {
22
+ if (typeof window === 'undefined') return Promise.resolve(null);
23
+ return import('mermaid').then(function (mod) {
24
+ return mod.default;
25
+ });
26
+ };
27
+ var mermaidPromise = loadMermaid();
28
+
29
+ /**
30
+ * 验证并处理 Mermaid 图表内容
31
+ */
32
+ export var useMermaid = function useMermaid(id, content) {
33
+ // 用于存储最近一次有效的内容
34
+ var _useState = useState(''),
23
35
  _useState2 = _slicedToArray(_useState, 2),
24
- mermaidContent = _useState2[0],
25
- setMermaidContent = _useState2[1];
36
+ validContent = _useState2[0],
37
+ setValidContent = _useState2[1];
38
+ console.log(id, content);
39
+
40
+ // 为长内容生成哈希键
41
+ var cacheKey = useMemo(function () {
42
+ var hash = content.length < MD5_LENGTH_THRESHOLD ? content : Md5.hashStr(content);
43
+ return "mermaid-".concat(hash);
44
+ }, [content]);
45
+ return useSWR(cacheKey, /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
46
+ var mermaidInstance, isValid, _yield$mermaidInstanc, svg;
47
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
48
+ while (1) switch (_context.prev = _context.next) {
49
+ case 0:
50
+ if (!mermaidCache.has(cacheKey)) {
51
+ _context.next = 2;
52
+ break;
53
+ }
54
+ return _context.abrupt("return", validContent);
55
+ case 2:
56
+ _context.prev = 2;
57
+ _context.next = 5;
58
+ return mermaidPromise;
59
+ case 5:
60
+ mermaidInstance = _context.sent;
61
+ if (mermaidInstance) {
62
+ _context.next = 8;
63
+ break;
64
+ }
65
+ return _context.abrupt("return", content);
66
+ case 8:
67
+ _context.next = 10;
68
+ return mermaidInstance.parse(content);
69
+ case 10:
70
+ isValid = _context.sent;
71
+ if (!isValid) {
72
+ _context.next = 22;
73
+ break;
74
+ }
75
+ _context.next = 14;
76
+ return mermaidInstance.render(id, content);
77
+ case 14:
78
+ _yield$mermaidInstanc = _context.sent;
79
+ svg = _yield$mermaidInstanc.svg;
80
+ console.log(svg);
81
+ setValidContent(svg);
82
+ // 缓存验证结果
83
+ mermaidCache.set(cacheKey, true);
84
+ return _context.abrupt("return", svg);
85
+ case 22:
86
+ throw new Error('Mermaid 语法无效');
87
+ case 23:
88
+ _context.next = 29;
89
+ break;
90
+ case 25:
91
+ _context.prev = 25;
92
+ _context.t0 = _context["catch"](2);
93
+ console.error('Mermaid 解析错误:', _context.t0);
94
+ // 返回最近一次有效的内容,或空字符串
95
+ return _context.abrupt("return", validContent || '');
96
+ case 29:
97
+ case "end":
98
+ return _context.stop();
99
+ }
100
+ }, _callee, null, [[2, 25]]);
101
+ })), {
102
+ dedupingInterval: 3000,
103
+ errorRetryCount: 2,
104
+ revalidateOnFocus: false,
105
+ revalidateOnReconnect: false
106
+ });
107
+ };
108
+
109
+ /**
110
+ * 初始化 Mermaid 配置
111
+ */
112
+ export var useMermaidInit = function useMermaidInit() {
26
113
  var theme = useTheme();
27
- useEffect(function () {
28
- mermaid.initialize({
114
+
115
+ // 提取主题相关配置到 useMemo 中
116
+ var mermaidConfig = useMemo(function () {
117
+ return {
29
118
  fontFamily: theme.fontFamilyCode,
30
119
  gantt: {
31
120
  useWidth: 1920
32
121
  },
33
122
  securityLevel: 'loose',
34
- startOnLoad: true,
123
+ startOnLoad: false,
35
124
  theme: theme.isDarkMode ? 'dark' : 'neutral',
36
125
  themeVariables: {
37
126
  errorBkgColor: theme.colorTextDescription,
@@ -57,63 +146,38 @@ export var useMermaid = function useMermaid(content) {
57
146
  tertiaryTextColor: theme.colorSuccessText,
58
147
  textColor: theme.colorText
59
148
  }
60
- });
61
- mermaid.contentLoaded();
62
- }, [mermaidContent, theme.isDarkMode]);
63
- var checkSyntax = /*#__PURE__*/function () {
64
- var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(textStr) {
65
- return _regeneratorRuntime().wrap(function _callee$(_context) {
66
- while (1) switch (_context.prev = _context.next) {
67
- case 0:
68
- _context.prev = 0;
69
- _context.next = 3;
70
- return mermaid.parse(textStr);
71
- case 3:
72
- if (!_context.sent) {
73
- _context.next = 5;
74
- break;
75
- }
76
- setMermaidContent(textStr);
77
- case 5:
78
- _context.next = 9;
79
- break;
80
- case 7:
81
- _context.prev = 7;
82
- _context.t0 = _context["catch"](0);
83
- case 9:
84
- case "end":
85
- return _context.stop();
86
- }
87
- }, _callee, null, [[0, 7]]);
88
- }));
89
- return function checkSyntax(_x) {
90
- return _ref2.apply(this, arguments);
91
149
  };
92
- }();
150
+ }, [theme.isDarkMode]);
151
+
152
+ // 初始化 mermaid 配置
93
153
  useEffect(function () {
94
- checkSyntax(content);
95
- }, [content]);
96
- return useCallback(function () {
97
- if (enablePanZoom) {
98
- return /*#__PURE__*/_jsxs(TransformWrapper, {
99
- children: [/*#__PURE__*/_jsx(Controls, {}), /*#__PURE__*/_jsx(TransformComponent, {
100
- contentClass: 'mermaid',
101
- contentStyle: {
102
- padding: 16
103
- },
104
- wrapperStyle: {
105
- minHeight: 240,
106
- width: '100%'
107
- },
108
- children: mermaidContent
109
- })]
110
- });
111
- }
112
- return /*#__PURE__*/_jsx(Center, {
113
- as: 'pre',
114
- className: 'mermaid',
115
- padding: 16,
116
- children: mermaidContent
117
- });
118
- }, [mermaidContent, theme.isDarkMode, enablePanZoom]);
154
+ var initMermaid = /*#__PURE__*/function () {
155
+ var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
156
+ var mermaidInstance;
157
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
158
+ while (1) switch (_context2.prev = _context2.next) {
159
+ case 0:
160
+ _context2.next = 2;
161
+ return mermaidPromise;
162
+ case 2:
163
+ mermaidInstance = _context2.sent;
164
+ if (mermaidInstance) {
165
+ _context2.next = 5;
166
+ break;
167
+ }
168
+ return _context2.abrupt("return");
169
+ case 5:
170
+ mermaidInstance.initialize(mermaidConfig);
171
+ case 6:
172
+ case "end":
173
+ return _context2.stop();
174
+ }
175
+ }, _callee2);
176
+ }));
177
+ return function initMermaid() {
178
+ return _ref2.apply(this, arguments);
179
+ };
180
+ }();
181
+ initMermaid();
182
+ }, [mermaidConfig]);
119
183
  };
@@ -31,7 +31,7 @@ import remarkGfm from 'remark-gfm';
31
31
  import remarkMath from 'remark-math';
32
32
  import Alert from "../../Alert";
33
33
  import ImageGallery from "../../Image/ImageGallery";
34
- import { Typography } from "../../Markdown/Typography";
34
+ import Typography from "../../Markdown/Typography";
35
35
  import { useStyles } from "../../Markdown/style";
36
36
  import { escapeBrackets, escapeMhchem, fixMarkdownBold } from "../../Markdown/utils";
37
37
  import mdxComponents from "../mdxComponents";
@@ -1,3 +1,5 @@
1
+ declare const UNPKG_API = "https://unpkg.com";
2
+ declare const ALIYUN_API = "https://registry.npmmirror.com";
1
3
  export type CDN = 'aliyun' | 'unpkg';
2
4
  export interface CdnApi {
3
5
  path: string;
@@ -6,3 +8,4 @@ export interface CdnApi {
6
8
  version?: string;
7
9
  }
8
10
  export declare const genCdnUrl: ({ pkg, version, path, proxy }: CdnApi) => string;
11
+ export { ALIYUN_API, UNPKG_API };
@@ -39,4 +39,6 @@ export var genCdnUrl = function genCdnUrl(_ref) {
39
39
  // return urlJoin(LOBEHUB_API, 'gh', repo, path);
40
40
  // }
41
41
  // }
42
- // };
42
+ // };
43
+
44
+ export { ALIYUN_API, UNPKG_API };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lobehub/ui",
3
- "version": "1.168.17",
3
+ "version": "1.168.19",
4
4
  "description": "Lobe UI is an open-source UI component library for building AIGC web apps",
5
5
  "keywords": [
6
6
  "lobehub",
@@ -55,7 +55,7 @@
55
55
  "@floating-ui/react": "^0.27.5",
56
56
  "@giscus/react": "^3.1.0",
57
57
  "@lobehub/fluent-emoji": "^1.2.0",
58
- "@lobehub/icons": "^1.93.0",
58
+ "@lobehub/icons": "^1.94.0",
59
59
  "@mdx-js/mdx": "^3.1.0",
60
60
  "@mdx-js/react": "^3.1.0",
61
61
  "@radix-ui/react-slot": "^1.1.2",
@@ -69,10 +69,10 @@
69
69
  "emoji-mart": "^5.6.0",
70
70
  "fast-deep-equal": "^3.1.3",
71
71
  "immer": "^10.1.1",
72
- "leva": "^0.9.36",
72
+ "leva": "^0.10.0",
73
73
  "lodash-es": "^4.17.21",
74
- "lucide-react": "^0.475.0",
75
- "mermaid": "^11.5.0",
74
+ "lucide-react": "^0.484.0",
75
+ "mermaid": "^11.6.0",
76
76
  "numeral": "^2.0.6",
77
77
  "polished": "^4.3.1",
78
78
  "query-string": "^9.1.1",
@@ -82,7 +82,7 @@
82
82
  "react-error-boundary": "^5.0.0",
83
83
  "react-hotkeys-hook": "^4.6.1",
84
84
  "react-layout-kit": "^1.9.1",
85
- "react-markdown": "^9.1.0",
85
+ "react-markdown": "^10.1.0",
86
86
  "react-merge-refs": "^2.1.1",
87
87
  "react-rnd": "^10.5.2",
88
88
  "react-zoom-pan-pinch": "^3.7.0",
@@ -1,3 +0,0 @@
1
- export declare const useMermaid: (content: string, { enablePanZoom }?: {
2
- enablePanZoom?: boolean | undefined;
3
- }) => () => import("react/jsx-runtime").JSX.Element;