@superlc/md-react 0.1.1 → 0.2.1
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/Markdown.d.ts +10 -0
- package/dist/Markdown.d.ts.map +1 -1
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/mermaid/MermaidBlock.d.ts +5 -0
- package/dist/components/mermaid/MermaidBlock.d.ts.map +1 -0
- package/dist/components/mermaid/MermaidFullscreenViewer.d.ts +5 -0
- package/dist/components/mermaid/MermaidFullscreenViewer.d.ts.map +1 -0
- package/dist/components/mermaid/icons.d.ts +25 -0
- package/dist/components/mermaid/icons.d.ts.map +1 -0
- package/dist/components/mermaid/index.d.ts +8 -0
- package/dist/components/mermaid/index.d.ts.map +1 -0
- package/dist/components/mermaid/types.d.ts +51 -0
- package/dist/components/mermaid/types.d.ts.map +1 -0
- package/dist/components/mermaid/useZoom.d.ts +28 -0
- package/dist/components/mermaid/useZoom.d.ts.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +842 -297
- package/dist/types.d.ts +19 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +9 -3
package/dist/Markdown.d.ts
CHANGED
|
@@ -25,6 +25,16 @@ import { MarkdownProps } from './types';
|
|
|
25
25
|
* [Link](https://example.com)
|
|
26
26
|
* </Markdown>
|
|
27
27
|
* ```
|
|
28
|
+
*
|
|
29
|
+
* @example 启用 Mermaid 渲染
|
|
30
|
+
* ```tsx
|
|
31
|
+
* <Markdown mermaid>
|
|
32
|
+
* ```mermaid
|
|
33
|
+
* graph TD
|
|
34
|
+
* A --> B
|
|
35
|
+
* ```
|
|
36
|
+
* </Markdown>
|
|
37
|
+
* ```
|
|
28
38
|
*/
|
|
29
39
|
export declare const Markdown: FC<MarkdownProps>;
|
|
30
40
|
//# sourceMappingURL=Markdown.d.ts.map
|
package/dist/Markdown.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Markdown.d.ts","sourceRoot":"","sources":["../src/Markdown.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAKhC,OAAO,KAAK,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"Markdown.d.ts","sourceRoot":"","sources":["../src/Markdown.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAKhC,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,SAAS,CAAC;AAkD7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,eAAO,MAAM,QAAQ,EAAE,EAAE,CAAC,aAAa,CAuDtC,CAAC"}
|
|
@@ -1,2 +1,4 @@
|
|
|
1
1
|
export { CodeBlock, type CodeBlockProps } from './CodeBlock';
|
|
2
|
+
export { MermaidBlock, MermaidFullscreenViewer, useZoom } from './mermaid';
|
|
3
|
+
export type { MermaidBlockProps, MermaidFullscreenViewerProps, ViewMode, ZoomConfig, ZoomState, } from './mermaid';
|
|
2
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC3E,YAAY,EACV,iBAAiB,EACjB,4BAA4B,EAC5B,QAAQ,EACR,UAAU,EACV,SAAS,GACV,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MermaidBlock.d.ts","sourceRoot":"","sources":["../../../src/components/mermaid/MermaidBlock.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAmD,MAAM,OAAO,CAAC;AASxE,OAAO,KAAK,EAAE,iBAAiB,EAAY,MAAM,SAAS,CAAC;AAsD3D,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAiUpD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MermaidFullscreenViewer.d.ts","sourceRoot":"","sources":["../../../src/components/mermaid/MermaidFullscreenViewer.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAmD,MAAM,OAAO,CAAC;AACxE,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,SAAS,CAAC;AAW5D,eAAO,MAAM,uBAAuB,EAAE,KAAK,CAAC,EAAE,CAAC,4BAA4B,CA6M1E,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** 图片图标 */
|
|
2
|
+
export declare const ImageIcon: () => import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
/** 代码图标 */
|
|
4
|
+
export declare const CodeIcon: () => import("react/jsx-runtime").JSX.Element;
|
|
5
|
+
/** 放大图标 */
|
|
6
|
+
export declare const ZoomInIcon: () => import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
/** 缩小图标 */
|
|
8
|
+
export declare const ZoomOutIcon: () => import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
/** 重置图标 */
|
|
10
|
+
export declare const ResetIcon: () => import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
/** 全屏图标 */
|
|
12
|
+
export declare const FullscreenIcon: () => import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
/** 退出全屏图标 */
|
|
14
|
+
export declare const FullscreenExitIcon: () => import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
/** 下载图标 */
|
|
16
|
+
export declare const DownloadIcon: () => import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
/** 关闭图标 */
|
|
18
|
+
export declare const CloseIcon: () => import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
/** 复制图标 */
|
|
20
|
+
export declare const CopyIcon: () => import("react/jsx-runtime").JSX.Element;
|
|
21
|
+
/** 复制成功图标 */
|
|
22
|
+
export declare const CheckIcon: () => import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
/** 适应窗口图标 */
|
|
24
|
+
export declare const FitIcon: () => import("react/jsx-runtime").JSX.Element;
|
|
25
|
+
//# sourceMappingURL=icons.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../../src/components/mermaid/icons.tsx"],"names":[],"mappings":"AAAA,WAAW;AACX,eAAO,MAAM,SAAS,+CAIrB,CAAC;AAEF,WAAW;AACX,eAAO,MAAM,QAAQ,+CAIpB,CAAC;AAEF,WAAW;AACX,eAAO,MAAM,UAAU,+CAItB,CAAC;AAEF,WAAW;AACX,eAAO,MAAM,WAAW,+CAIvB,CAAC;AAEF,WAAW;AACX,eAAO,MAAM,SAAS,+CAIrB,CAAC;AAEF,WAAW;AACX,eAAO,MAAM,cAAc,+CAI1B,CAAC;AAEF,aAAa;AACb,eAAO,MAAM,kBAAkB,+CAI9B,CAAC;AAEF,WAAW;AACX,eAAO,MAAM,YAAY,+CAIxB,CAAC;AAEF,WAAW;AACX,eAAO,MAAM,SAAS,+CAIrB,CAAC;AAEF,WAAW;AACX,eAAO,MAAM,QAAQ,+CAIpB,CAAC;AAEF,aAAa;AACb,eAAO,MAAM,SAAS,+CAIrB,CAAC;AAEF,aAAa;AACb,eAAO,MAAM,OAAO,+CAInB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mermaid 组件导出
|
|
3
|
+
*/
|
|
4
|
+
export { MermaidBlock } from './MermaidBlock';
|
|
5
|
+
export { MermaidFullscreenViewer } from './MermaidFullscreenViewer';
|
|
6
|
+
export { useZoom } from './useZoom';
|
|
7
|
+
export type { MermaidBlockProps, MermaidFullscreenViewerProps, ViewMode, ZoomConfig, ZoomState, StreamStatus, } from './types';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/mermaid/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EACV,iBAAiB,EACjB,4BAA4B,EAC5B,QAAQ,EACR,UAAU,EACV,SAAS,EACT,YAAY,GACb,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { MermaidTheme } from '@superlc/md-core';
|
|
2
|
+
|
|
3
|
+
/** 视图模式 */
|
|
4
|
+
export type ViewMode = 'preview' | 'code';
|
|
5
|
+
/** 缩放配置 */
|
|
6
|
+
export interface ZoomConfig {
|
|
7
|
+
min: number;
|
|
8
|
+
max: number;
|
|
9
|
+
step: number;
|
|
10
|
+
default: number;
|
|
11
|
+
}
|
|
12
|
+
/** 缩放状态 */
|
|
13
|
+
export interface ZoomState {
|
|
14
|
+
scale: number;
|
|
15
|
+
translateX: number;
|
|
16
|
+
translateY: number;
|
|
17
|
+
}
|
|
18
|
+
/** 流式状态 */
|
|
19
|
+
export type StreamStatus = 'loading' | 'done';
|
|
20
|
+
/** MermaidBlock Props */
|
|
21
|
+
export interface MermaidBlockProps {
|
|
22
|
+
/** Mermaid 源代码 */
|
|
23
|
+
code: string;
|
|
24
|
+
/** 主题 */
|
|
25
|
+
theme?: MermaidTheme | 'auto';
|
|
26
|
+
/** 是否显示工具栏 */
|
|
27
|
+
showToolbar?: boolean;
|
|
28
|
+
/** 复制成功回调 */
|
|
29
|
+
onCopy?: (code: string) => void;
|
|
30
|
+
/** 额外的 className */
|
|
31
|
+
className?: string;
|
|
32
|
+
/**
|
|
33
|
+
* 流式状态
|
|
34
|
+
* - 'loading': 正在流式输入,代码块可能不完整
|
|
35
|
+
* - 'done': 流式输入完成,代码块已完整
|
|
36
|
+
* 用于优化流式渲染体验:loading 状态下会延迟渲染并保留上次有效结果
|
|
37
|
+
*/
|
|
38
|
+
streamStatus?: StreamStatus;
|
|
39
|
+
}
|
|
40
|
+
/** MermaidFullscreenViewer Props */
|
|
41
|
+
export interface MermaidFullscreenViewerProps {
|
|
42
|
+
/** SVG 内容 */
|
|
43
|
+
svg: string;
|
|
44
|
+
/** 是否显示 */
|
|
45
|
+
open: boolean;
|
|
46
|
+
/** 关闭回调 */
|
|
47
|
+
onClose: () => void;
|
|
48
|
+
/** 下载回调 */
|
|
49
|
+
onDownload?: () => void;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/mermaid/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,WAAW;AACX,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;AAE1C,WAAW;AACX,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,WAAW;AACX,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,WAAW;AACX,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,MAAM,CAAC;AAE9C,yBAAyB;AACzB,MAAM,WAAW,iBAAiB;IAChC,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS;IACT,KAAK,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC;IAC9B,cAAc;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa;IACb,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,oBAAoB;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,oCAAoC;AACpC,MAAM,WAAW,4BAA4B;IAC3C,aAAa;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW;IACX,IAAI,EAAE,OAAO,CAAC;IACd,WAAW;IACX,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,WAAW;IACX,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { ZoomState, ZoomConfig } from './types';
|
|
2
|
+
|
|
3
|
+
export interface UseZoomOptions {
|
|
4
|
+
config?: Partial<ZoomConfig>;
|
|
5
|
+
/** 是否启用拖拽(全屏模式下启用) */
|
|
6
|
+
enableDrag?: boolean;
|
|
7
|
+
/** 是否启用滚轮缩放 */
|
|
8
|
+
enableWheelZoom?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface UseZoomReturn {
|
|
11
|
+
state: ZoomState;
|
|
12
|
+
zoomIn: () => void;
|
|
13
|
+
zoomOut: () => void;
|
|
14
|
+
reset: () => void;
|
|
15
|
+
fitToContainer: (containerRect: DOMRect, contentRect: DOMRect) => void;
|
|
16
|
+
setScale: (scale: number) => void;
|
|
17
|
+
canZoomIn: boolean;
|
|
18
|
+
canZoomOut: boolean;
|
|
19
|
+
containerRef: React.RefObject<HTMLDivElement>;
|
|
20
|
+
contentStyle: React.CSSProperties;
|
|
21
|
+
handlers: {
|
|
22
|
+
onMouseDown: (e: React.MouseEvent) => void;
|
|
23
|
+
onWheel: (e: React.WheelEvent) => void;
|
|
24
|
+
onDoubleClick: () => void;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export declare function useZoom(options?: UseZoomOptions): UseZoomReturn;
|
|
28
|
+
//# sourceMappingURL=useZoom.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useZoom.d.ts","sourceRoot":"","sources":["../../../src/components/mermaid/useZoom.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AASrD,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7B,sBAAsB;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,eAAe;IACf,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,cAAc,EAAE,CAAC,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,KAAK,IAAI,CAAC;IACvE,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAC9C,YAAY,EAAE,KAAK,CAAC,aAAa,CAAC;IAClC,QAAQ,EAAE;QACR,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;QAC3C,OAAO,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;QACvC,aAAa,EAAE,MAAM,IAAI,CAAC;KAC3B,CAAC;CACH;AAED,wBAAgB,OAAO,CAAC,OAAO,GAAE,cAAmB,GAAG,aAAa,CAyJnE"}
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var G=Object.create;var J=Object.defineProperty;var Q=Object.getOwnPropertyDescriptor;var ee=Object.getOwnPropertyNames;var te=Object.getPrototypeOf,re=Object.prototype.hasOwnProperty;var ne=(e,t,c,u)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of ee(t))!re.call(e,n)&&n!==c&&J(e,n,{get:()=>t[n],enumerable:!(u=Q(t,n))||u.enumerable});return e};var se=(e,t,c)=>(c=e!=null?G(te(e)):{},ne(t||!e||!e.__esModule?J(c,"default",{value:e,enumerable:!0}):c,e));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),r=require("react"),E=require("@superlc/md-core"),B=require("hast-util-to-jsx-runtime");async function ae(e){try{return await navigator.clipboard.writeText(e),!0}catch{return ce(e)}}function ce(e){const t=document.createElement("textarea");t.value=e,t.style.position="fixed",t.style.left="-9999px",document.body.appendChild(t),t.select();try{return document.execCommand("copy"),!0}catch{return!1}finally{document.body.removeChild(t)}}const ue=()=>s.jsx("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:s.jsx("path",{d:"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z"})}),oe=()=>s.jsx("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:s.jsx("path",{d:"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"})}),I=({children:e,showCopyButton:t=!0,onCopy:c,className:u})=>{const[n,l]=r.useState(!1),o=r.useCallback(async()=>{const a=U(e);await ae(a)&&(l(!0),c==null||c(a),setTimeout(()=>l(!1),2e3))},[e,c]);return s.jsxs("div",{className:`md-code-block-wrapper${u?` ${u}`:""}`,children:[s.jsx("pre",{children:e}),t&&s.jsx("button",{type:"button",className:`md-copy-button${n?" md-copy-button--copied":""}`,onClick:o,title:n?"已复制":"复制代码","aria-label":n?"已复制":"复制代码",children:n?s.jsx(oe,{}):s.jsx(ue,{})})]})};function U(e){return typeof e=="string"?e:typeof e=="number"?String(e):Array.isArray(e)?e.map(U).join(""):r.isValidElement(e)?U(e.props.children):""}I.displayName="CodeBlock";const K=({children:e,components:t,className:c,copyButton:u=!0,onCodeCopy:n,...l})=>{const o=r.useMemo(()=>{if(!e)return null;const a=E.parseToHast(e,l),p=u?b=>s.jsx(I,{showCopyButton:u,onCopy:n,...b}):void 0,f={...p?{pre:p}:{},...t};return B.toJsxRuntime(a,{Fragment:s.Fragment,jsx:s.jsx,jsxs:s.jsxs,components:f})},[e,t,u,n,l]);return s.jsx("div",{className:c,children:o})};K.displayName="Markdown";function ie(e,t={}){const{components:c={},...u}=t;return r.useMemo(()=>{if(!e)return null;const n=E.parseToHast(e,u);return B.toJsxRuntime(n,{Fragment:s.Fragment,jsx:s.jsx,jsxs:s.jsxs,components:c})},[e,c,u])}const W=r.memo(({block:e,components:t})=>{if(!e.hast)return null;try{return B.toJsxRuntime(e.hast,{jsx:s.jsx,jsxs:s.jsxs,Fragment:s.Fragment,components:t})}catch{return null}},(e,t)=>e.block.key===t.block.key&&e.block.stable&&t.block.stable);W.displayName="StableBlock";function le(e={}){const{components:t,minUpdateInterval:c=16,immediate:u=!1,outputRate:n="medium",...l}=e,o=r.useRef(E.createStreamingParser(l)),a=r.useRef(new E.OutputRateController(n)),[p,f]=r.useState(0),[b,j]=r.useState(!1),[v,x]=r.useState(0),[g,h]=r.useState("idle"),R=r.useRef(0),d=r.useRef(null),S=r.useCallback(()=>{const k=performance.now(),A=k-R.current;u||A>=c?(R.current=k,f(D=>D+1)):d.current===null&&(d.current=window.requestAnimationFrame(()=>{d.current=null,R.current=performance.now(),f(D=>D+1)}))},[c,u]),M=r.useCallback(k=>{o.current.append(k),S()},[S]),T=r.useCallback(k=>{o.current.reset(),j(!1),x(0),h("running"),a.current.start(k,A=>{A&&o.current.append(A),x(a.current.progress),S()},()=>{o.current.finish(),j(!0),x(1),h("complete"),S()})},[S]),w=r.useCallback(()=>{a.current.pause(),h(a.current.status)},[]),F=r.useCallback(()=>{a.current.resume(),h(a.current.status)},[]),N=r.useCallback(()=>{a.current.skipToEnd(),h(a.current.status),x(1)},[]),z=r.useCallback(()=>{a.current.stop(),o.current.finish(),j(!0),h("complete"),d.current!==null&&(cancelAnimationFrame(d.current),d.current=null),f(k=>k+1)},[]),H=r.useCallback(()=>{a.current.stop(),o.current.reset(),j(!1),x(0),h("idle"),d.current!==null&&(cancelAnimationFrame(d.current),d.current=null),f(k=>k+1)},[]);r.useEffect(()=>{a.current.setRate(n)},[n]),r.useEffect(()=>()=>{a.current.stop(),d.current!==null&&cancelAnimationFrame(d.current)},[]);const i=o.current.getState(),m=o.current.getStats(),y=o.current.getContent(),C=r.useMemo(()=>i.blocks.map(k=>s.jsx(W,{block:k,components:t},k.key)),[i.blocks,t,p]);return{element:r.useMemo(()=>i.blocks.length===0?null:s.jsx(s.Fragment,{children:C}),[C,i.blocks.length]),append:M,start:T,pause:w,resume:F,skipToEnd:N,reset:H,finish:z,blocks:i.blocks,stats:m,isComplete:b,content:y,progress:v,outputStatus:g}}const me=16,fe="data:image/svg+xml,",de=()=>s.jsxs("svg",{width:"48",height:"36",viewBox:"0 0 48 36",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[s.jsx("rect",{x:"0",y:"0",width:"48",height:"36",rx:"3",className:"md-image-skeleton-icon"}),s.jsx("circle",{cx:"12",cy:"10",r:"5",className:"md-image-skeleton-icon-detail"}),s.jsx("path",{d:"M0 36 L0 24 L16 16 L28 26 L48 12 L48 36 Z",className:"md-image-skeleton-icon-detail"})]}),q=r.memo(({src:e,alt:t,className:c,"data-width":u,"data-height":n,...l})=>{const a=(e==null?void 0:e.startsWith(fe))?void 0:e,p=u?Number(u):200,f=n?Number(n):120,[b,j]=r.useState(!0),v=r.useRef(null),x=r.useRef(null);r.useLayoutEffect(()=>{v.current&&a&&v.current.complete&&v.current.naturalWidth>0&&j(!1)},[a]);const g=r.useCallback(()=>{x.current&&clearTimeout(x.current),x.current=setTimeout(()=>{j(!1)},me)},[]);return s.jsxs("span",{className:`md-image-container ${c||""}`,style:{width:p,height:f},children:[a&&s.jsx("img",{ref:v,src:a,alt:t,onLoad:g,className:"md-image",...l}),b&&s.jsx("span",{className:"md-image-skeleton",children:s.jsx(de,{})})]})});q.displayName="StreamingImage";let V=!1,L=null;async function _(){if(!V)return L||(L=(async()=>{await import("katex/dist/katex.min.css"),V=!0})(),L)}const pe=r.memo(({children:e})=>(r.useEffect(()=>{V||_()},[]),s.jsx(s.Fragment,{children:e})));pe.displayName="MathProvider";function xe(){return _()}const X=r.memo(({block:e,components:t})=>{if(!e.hast)return null;try{return B.toJsxRuntime(e.hast,{jsx:s.jsx,jsxs:s.jsxs,Fragment:s.Fragment,components:t})}catch{return s.jsx("div",{className:"parse-error",children:e.source})}},(e,t)=>e.block.key===t.block.key&&e.block.stable&&t.block.stable);X.displayName="StableBlock";const Y=({content:e,source:t,outputRate:c="medium",isComplete:u=!1,onComplete:n,onBlockStable:l,onProgress:o,components:a,className:p,minUpdateInterval:f=16,autoStart:b=!0,copyButton:j=!0,onCodeCopy:v,...x})=>{r.useEffect(()=>{x.math&&xe()},[x.math]);const g=r.useRef(E.createStreamingParser(x)),h=r.useRef(new E.OutputRateController(c)),R=r.useRef(""),d=r.useRef(void 0),S=r.useRef([]),[,M]=r.useReducer(i=>i+1,0),T=r.useRef(0),w=r.useRef(null),F=()=>{const i=performance.now();i-T.current>=f?(T.current=i,M()):w.current===null&&(w.current=window.requestAnimationFrame(()=>{w.current=null,T.current=performance.now(),M()}))};r.useEffect(()=>{t!==void 0&&t!==d.current&&(d.current=t,b&&t&&(g.current.reset(),R.current="",h.current.start(t,i=>{i&&(g.current.append(i),R.current+=i),o==null||o(h.current.progress),F()},()=>{g.current.finish(),n==null||n(),F()})))},[t,b,n,o]),r.useEffect(()=>{if(t!==void 0)return;const i=R.current,m=e||"";if(m!==i){if(m.startsWith(i)){const y=m.slice(i.length);y&&g.current.append(y)}else g.current.reset(),m&&g.current.append(m);R.current=m,F()}},[e,t]),r.useEffect(()=>{t===void 0&&u&&(g.current.finish(),w.current!==null&&(cancelAnimationFrame(w.current),w.current=null),M(),n==null||n())},[u,n,t]),r.useEffect(()=>{h.current.setRate(c)},[c]),r.useEffect(()=>{if(l){const i=g.current.getState().blocks,m=S.current;i.forEach((y,C)=>{const O=m[C];y.stable&&(!O||!O.stable)&&l(y)}),S.current=i}}),r.useEffect(()=>()=>{h.current.stop(),w.current!==null&&cancelAnimationFrame(w.current)},[]);const N=g.current.getState(),z=t!==void 0?h.current.status==="complete":u,H=r.useMemo(()=>{const i=m=>{if(j)return y=>s.jsx(I,{showCopyButton:m.stable&&j,onCopy:v,...y})};return N.blocks.map(m=>{const y=i(m),C={img:q,...y?{pre:y}:{},...a};return s.jsx(X,{block:m,components:C},m.key)})},[N.blocks,a,j,v]);return s.jsx("div",{className:p,"data-streaming":!z,children:H})};Y.displayName="StreamingMarkdown";const Z=r.memo(e=>{const{text:t,animationConfig:c}=e,{fadeDuration:u=200,easing:n="ease-in-out"}=c||{},[l,o]=r.useState([]),a=r.useRef("");r.useEffect(()=>{if(t===a.current)return;if(!(a.current&&t.indexOf(a.current)===0)){o([t]),a.current=t;return}const f=t.slice(a.current.length);f&&(o(b=>[...b,f]),a.current=t)},[t]);const p=`md-fade-in ${u}ms ${n} forwards`;return s.jsx(s.Fragment,{children:l.map((f,b)=>s.jsx("span",{className:"md-animation-text",style:{animation:p},children:f},`animation-text-${b}`))})});Z.displayName="AnimationText";let P=null;try{P=require("dompurify")}catch{}function ge(){return P!==null}function he(e,t){if(!P)return e;const c={ADD_ATTR:["target","rel","data-block-key","data-pending","data-predicted"],...t};return P.default.sanitize(e,c)}function $(e){if(e.type==="root")return{...e,children:e.children.map(n=>n.type==="element"?$(n):n)};const t=["onclick","onerror","onload","onmouseover","onfocus","onblur"],c=["javascript:","vbscript:","data:text/html"],u={};if(e.properties)for(const[n,l]of Object.entries(e.properties)){const o=n.toLowerCase();if(!(t.includes(o)||o.startsWith("on"))){if((o==="href"||o==="src")&&typeof l=="string"){const a=l.toLowerCase().trim();if(c.some(p=>a.startsWith(p)))continue}u[n]=l}}return{...e,properties:u,children:e.children.map(n=>n.type==="element"?$(n):n)}}exports.AnimationText=Z;exports.CodeBlock=I;exports.Markdown=K;exports.StreamingImage=q;exports.StreamingMarkdown=Y;exports.isDOMPurifyAvailable=ge;exports.sanitizeHast=$;exports.sanitizeHtml=he;exports.useMarkdown=ie;exports.useStreamingMarkdown=le;
|
|
1
|
+
"use strict";var ue=Object.create;var Q=Object.defineProperty;var de=Object.getOwnPropertyDescriptor;var me=Object.getOwnPropertyNames;var fe=Object.getPrototypeOf,he=Object.prototype.hasOwnProperty;var xe=(t,r,c,o)=>{if(r&&typeof r=="object"||typeof r=="function")for(let s of me(r))!he.call(t,s)&&s!==c&&Q(t,s,{get:()=>r[s],enumerable:!(o=de(r,s))||o.enumerable});return t};var pe=(t,r,c)=>(c=t!=null?ue(fe(t)):{},xe(r||!t||!t.__esModule?Q(c,"default",{value:t,enumerable:!0}):c,t));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),n=require("react"),L=require("@superlc/md-core"),Z=require("hast-util-to-jsx-runtime");async function be(t){try{return await navigator.clipboard.writeText(t),!0}catch{return ge(t)}}function ge(t){const r=document.createElement("textarea");r.value=t,r.style.position="fixed",r.style.left="-9999px",document.body.appendChild(r),r.select();try{return document.execCommand("copy"),!0}catch{return!1}finally{document.body.removeChild(r)}}const ve=()=>e.jsx("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:e.jsx("path",{d:"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z"})}),je=()=>e.jsx("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:e.jsx("path",{d:"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"})}),Y=({children:t,showCopyButton:r=!0,onCopy:c,className:o})=>{const[s,f]=n.useState(!1),l=n.useCallback(async()=>{const a=_(t);await be(a)&&(f(!0),c==null||c(a),setTimeout(()=>f(!1),2e3))},[t,c]);return e.jsxs("div",{className:`md-code-block-wrapper${o?` ${o}`:""}`,children:[e.jsx("pre",{children:t}),r&&e.jsx("button",{type:"button",className:`md-copy-button${s?" md-copy-button--copied":""}`,onClick:l,title:s?"已复制":"复制代码","aria-label":s?"已复制":"复制代码",children:s?e.jsx(je,{}):e.jsx(ve,{})})]})};function _(t){return typeof t=="string"?t:typeof t=="number"?String(t):Array.isArray(t)?t.map(_).join(""):n.isValidElement(t)?_(t.props.children):""}Y.displayName="CodeBlock";const ke={min:.25,max:4,step:.25,default:1};function W(t={}){const{config:r,enableDrag:c=!1,enableWheelZoom:o=!1}=t,s={...ke,...r},f=n.useRef(null),l=n.useRef(!1),a=n.useRef({x:0,y:0}),u=n.useRef({x:0,y:0}),[m,x]=n.useState({scale:s.default,translateX:0,translateY:0}),d=n.useCallback(i=>Math.max(s.min,Math.min(s.max,i)),[s.min,s.max]),g=n.useCallback(()=>{x(i=>({...i,scale:d(i.scale+s.step)}))},[d,s.step]),b=n.useCallback(()=>{x(i=>({...i,scale:d(i.scale-s.step)}))},[d,s.step]),p=n.useCallback(()=>{x({scale:s.default,translateX:0,translateY:0})},[s.default]),k=n.useCallback(i=>{x(j=>({...j,scale:d(i)}))},[d]),E=n.useCallback((i,j)=>{const M=i.width/j.width,B=i.height/j.height,F=Math.min(M,B)*.95;x({scale:d(F),translateX:0,translateY:0})},[d]),v=n.useCallback(i=>{c&&(i.preventDefault(),l.current=!0,a.current={x:i.clientX,y:i.clientY},u.current={x:m.translateX,y:m.translateY})},[c,m.translateX,m.translateY]);n.useEffect(()=>{if(!c)return;const i=M=>{if(!l.current)return;const B=M.clientX-a.current.x,F=M.clientY-a.current.y;x(h=>({...h,translateX:u.current.x+B,translateY:u.current.y+F}))},j=()=>{l.current=!1};return document.addEventListener("mousemove",i),document.addEventListener("mouseup",j),()=>{document.removeEventListener("mousemove",i),document.removeEventListener("mouseup",j)}},[c]);const S=n.useCallback(i=>{if(!o)return;i.preventDefault();const j=i.deltaY>0?-s.step:s.step;x(M=>({...M,scale:d(M.scale+j)}))},[o,s.step,d]),w=n.useCallback(()=>{p()},[p]),C={transform:`translate(${m.translateX}px, ${m.translateY}px) scale(${m.scale})`,transformOrigin:"center center",transition:l.current?"none":"transform 0.2s ease-out",cursor:c?l.current?"grabbing":"grab":"default"};return{state:m,zoomIn:g,zoomOut:b,reset:p,fitToContainer:E,setScale:k,canZoomIn:m.scale<s.max,canZoomOut:m.scale>s.min,containerRef:f,contentStyle:C,handlers:{onMouseDown:v,onWheel:S,onDoubleClick:w}}}const ye=()=>e.jsx("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:e.jsx("path",{d:"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z"})}),we=()=>e.jsx("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:e.jsx("path",{d:"M9.4 16.6L4.8 12l4.6-4.6L8 6l-6 6 6 6 1.4-1.4zm5.2 0l4.6-4.6-4.6-4.6L16 6l6 6-6 6-1.4-1.4z"})}),ee=()=>e.jsx("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:e.jsx("path",{d:"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14zm.5-7H9v2H7v1h2v2h1v-2h2V9h-2V7z"})}),te=()=>e.jsx("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:e.jsx("path",{d:"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14zM7 9h5v1H7V9z"})}),ne=()=>e.jsx("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:e.jsx("path",{d:"M12 5V1L7 6l5 5V7c3.31 0 6 2.69 6 6s-2.69 6-6 6-6-2.69-6-6H4c0 4.42 3.58 8 8 8s8-3.58 8-8-3.58-8-8-8z"})}),Ce=()=>e.jsx("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:e.jsx("path",{d:"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"})}),Me=()=>e.jsx("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:e.jsx("path",{d:"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z"})}),re=()=>e.jsx("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:e.jsx("path",{d:"M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"})}),Re=()=>e.jsx("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:e.jsx("path",{d:"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"})}),Se=()=>e.jsx("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:e.jsx("path",{d:"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z"})}),Ne=()=>e.jsx("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:e.jsx("path",{d:"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"})}),q=({svg:t,open:r,onClose:c,onDownload:o})=>{const s=n.useRef(null),f=n.useRef(null),l=n.useRef(null),[a,u]=n.useState(!1),{state:m,zoomIn:x,zoomOut:d,reset:g,fitToContainer:b,canZoomIn:p,canZoomOut:k,contentStyle:E,handlers:v}=W({enableDrag:!0,enableWheelZoom:!0}),S=n.useCallback(async()=>{if(s.current)try{await s.current.requestFullscreen(),u(!0)}catch{u(!0)}},[]),w=n.useCallback(()=>{document.fullscreenElement&&document.exitFullscreen().catch(()=>{}),u(!1),c()},[c]);n.useEffect(()=>{r?S():a&&w()},[r,S,w,a]),n.useEffect(()=>{const i=()=>{!document.fullscreenElement&&a&&(u(!1),c())};return document.addEventListener("fullscreenchange",i),()=>document.removeEventListener("fullscreenchange",i)},[a,c]),n.useEffect(()=>{if(!a)return;const i=j=>{switch(j.key){case"+":case"=":x();break;case"-":d();break;case"0":g();break}};return document.addEventListener("keydown",i),()=>document.removeEventListener("keydown",i)},[a,x,d,g]);const C=n.useCallback(()=>{if(!f.current||!l.current)return;const i=f.current.getBoundingClientRect(),j=l.current.querySelector("svg");if(j){const M=j.getBoundingClientRect();b(i,M)}},[b]);return e.jsx("div",{ref:s,className:`md-mermaid-fullscreen-wrapper${a?" md-mermaid-fullscreen-wrapper--active":""}`,role:"dialog","aria-modal":"true","aria-label":"Mermaid 图表全屏预览","aria-hidden":!a,children:a&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"md-mermaid-fullscreen-toolbar",children:[e.jsxs("div",{className:"md-mermaid-toolbar-group",children:[e.jsx("button",{type:"button",className:"md-mermaid-toolbar-btn",onClick:d,disabled:!k,title:"缩小 (-)","aria-label":"缩小",children:e.jsx(te,{})}),e.jsxs("span",{className:"md-mermaid-zoom-label",children:[Math.round(m.scale*100),"%"]}),e.jsx("button",{type:"button",className:"md-mermaid-toolbar-btn",onClick:x,disabled:!p,title:"放大 (+)","aria-label":"放大",children:e.jsx(ee,{})}),e.jsx("span",{className:"md-mermaid-toolbar-divider"}),e.jsx("button",{type:"button",className:"md-mermaid-toolbar-btn",onClick:g,title:"重置 (0)","aria-label":"重置",children:e.jsx(ne,{})}),e.jsx("button",{type:"button",className:"md-mermaid-toolbar-btn",onClick:C,title:"适应窗口","aria-label":"适应窗口",children:e.jsx(Me,{})})]}),e.jsxs("div",{className:"md-mermaid-toolbar-group",children:[o&&e.jsx("button",{type:"button",className:"md-mermaid-toolbar-btn",onClick:o,title:"下载 PNG","aria-label":"下载",children:e.jsx(re,{})}),e.jsx("button",{type:"button",className:"md-mermaid-toolbar-btn",onClick:w,title:"退出全屏 (Esc)","aria-label":"退出全屏",children:e.jsx(Re,{})})]})]}),e.jsx("div",{ref:f,className:"md-mermaid-fullscreen-content",onWheel:v.onWheel,children:e.jsx("div",{ref:l,className:"md-mermaid-fullscreen-svg",style:E,onMouseDown:v.onMouseDown,onDoubleClick:v.onDoubleClick,dangerouslySetInnerHTML:{__html:t}})})]})})};q.displayName="MermaidFullscreenViewer";const Ee=150;let O=null;function ze(t="auto"){return O?O.setTheme(t??"auto"):O=new L.MermaidRenderer({theme:t}),O}async function Le(t){try{return await navigator.clipboard.writeText(t),!0}catch{const r=document.createElement("textarea");r.value=t,r.style.position="fixed",r.style.left="-9999px",document.body.appendChild(r),r.select();try{return document.execCommand("copy"),!0}catch{return!1}finally{document.body.removeChild(r)}}}const J=({code:t,theme:r="auto",showToolbar:c=!0,onCopy:o,className:s,streamStatus:f="done"})=>{const[l,a]=n.useState("preview"),[u,m]=n.useState(null),[x,d]=n.useState(!0),[g,b]=n.useState(!1),[p,k]=n.useState(!1),E=n.useRef(null),[v,S]=n.useState(()=>L.detectColorScheme()),w=n.useRef(null),C=n.useRef(null),{state:i,zoomIn:j,zoomOut:M,reset:B,canZoomIn:F,canZoomOut:h,contentStyle:y}=W();n.useEffect(()=>{if(r==="auto")return L.observeColorScheme(z=>{S(z)})},[r]);const N=n.useRef(t),I=n.useRef(f);N.current=t,I.current=f,n.useEffect(()=>{const z=async H=>{console.log("[MermaidBlock] doRender start",{codeLength:H.length});const V=await ze(r).render(H),G=I.current;console.log("[MermaidBlock] render result",{success:V.success,hasSvg:!!V.svg,error:V.error,currentStreamStatus:G}),V.success&&V.svg?(w.current=V.svg,m(V),d(!1),a("preview"),console.log("[MermaidBlock] render success, cached SVG")):G==="loading"?w.current?(m({success:!0,svg:w.current}),d(!1),console.log("[MermaidBlock] render failed, using cache")):console.log("[MermaidBlock] render failed, no cache, keep loading"):(m(V),d(!1),a("code"),console.log("[MermaidBlock] render failed, showing error"))};console.log("[MermaidBlock] useEffect triggered",{streamStatus:f,codeLength:t.length,hasTimer:!!C.current,hasCache:!!w.current}),f==="loading"?C.current?console.log("[MermaidBlock] timer already exists, skipping"):(w.current||d(!0),console.log("[MermaidBlock] setting timer"),C.current=setTimeout(()=>{console.log("[MermaidBlock] timer fired, rendering with latest code"),C.current=null,z(N.current)},Ee)):(console.log("[MermaidBlock] immediate render (not loading)"),C.current&&(clearTimeout(C.current),C.current=null),d(!0),z(t))},[t,r,v,f]);const A=n.useCallback(async()=>{await Le(t)&&(k(!0),o==null||o(t),setTimeout(()=>k(!1),2e3))},[t,o]),R=n.useCallback(async()=>{var z;if(u!=null&&u.svg)try{const H=((z=window.matchMedia)==null?void 0:z.call(window,"(prefers-color-scheme: dark)").matches)??!1;await L.downloadAsPng(u.svg,{backgroundColor:H?"#1a1a2e":"#ffffff",padding:20,scale:2})}catch(H){console.error("Download failed:",H)}},[u]),D=n.useCallback(()=>{b(z=>!z)},[]),T=(u==null?void 0:u.success)&&u.svg;return e.jsxs("div",{className:`md-mermaid-block${s?` ${s}`:""}`,children:[c&&e.jsxs("div",{className:"md-mermaid-toolbar",children:[e.jsxs("div",{className:"md-mermaid-toolbar-group md-mermaid-mode-switch",children:[e.jsx("button",{type:"button",className:`md-mermaid-toolbar-btn${l==="preview"?" md-mermaid-toolbar-btn--active":""}`,onClick:()=>a("preview"),disabled:!T,title:"图片模式","aria-label":"图片模式",children:e.jsx(ye,{})}),e.jsx("button",{type:"button",className:`md-mermaid-toolbar-btn${l==="code"?" md-mermaid-toolbar-btn--active":""}`,onClick:()=>a("code"),title:"代码模式","aria-label":"代码模式",children:e.jsx(we,{})})]}),l==="preview"&&T&&e.jsxs("div",{className:"md-mermaid-toolbar-group",children:[e.jsx("button",{type:"button",className:"md-mermaid-toolbar-btn",onClick:M,disabled:!h,title:"缩小","aria-label":"缩小",children:e.jsx(te,{})}),e.jsxs("span",{className:"md-mermaid-zoom-label",children:[Math.round(i.scale*100),"%"]}),e.jsx("button",{type:"button",className:"md-mermaid-toolbar-btn",onClick:j,disabled:!F,title:"放大","aria-label":"放大",children:e.jsx(ee,{})}),e.jsx("button",{type:"button",className:"md-mermaid-toolbar-btn",onClick:B,title:"重置","aria-label":"重置缩放",children:e.jsx(ne,{})})]}),e.jsxs("div",{className:"md-mermaid-toolbar-group",children:[l==="preview"&&T&&e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",className:"md-mermaid-toolbar-btn",onClick:D,title:"全屏","aria-label":"全屏查看",children:e.jsx(Ce,{})}),e.jsx("button",{type:"button",className:"md-mermaid-toolbar-btn",onClick:R,title:"下载 PNG","aria-label":"下载",children:e.jsx(re,{})})]}),l==="code"&&e.jsx("button",{type:"button",className:`md-mermaid-toolbar-btn${p?" md-mermaid-toolbar-btn--success":""}`,onClick:A,title:p?"已复制":"复制代码","aria-label":p?"已复制":"复制代码",children:p?e.jsx(Ne,{}):e.jsx(Se,{})})]})]}),e.jsx("div",{className:"md-mermaid-content",ref:E,children:x?e.jsx("div",{className:"md-mermaid-skeleton",children:e.jsx("div",{className:"md-mermaid-skeleton-box"})}):l==="preview"&&T&&(u!=null&&u.svg)?e.jsx("div",{className:"md-mermaid-preview",style:{overflow:"hidden"},children:e.jsx("div",{className:"md-mermaid-svg-container",style:y,dangerouslySetInnerHTML:{__html:u.svg}})}):e.jsxs("div",{className:"md-mermaid-code",children:[e.jsx("pre",{children:e.jsx("code",{className:"language-mermaid",children:t})}),u&&!u.success&&f==="done"&&e.jsxs("div",{className:"md-mermaid-error",children:[e.jsx("span",{children:"渲染失败: "}),e.jsx("span",{children:u.error})]})]})}),T&&(u==null?void 0:u.svg)&&e.jsx(q,{svg:u.svg,open:g,onClose:()=>b(!1),onDownload:R})]})};J.displayName="MermaidBlock";function Be(t){const r=t.children;if(!n.isValidElement(r))return!1;const c=r.props,o=c==null?void 0:c.className;return typeof o=="string"?o.includes("language-mermaid"):!1}function Fe(t){if(!n.isValidElement(t))return"";const r=t.props,c=r==null?void 0:r.children;return typeof c=="string"?c:Array.isArray(c)?c.map(o=>typeof o=="string"?o:"").join(""):""}function Ie(t){return t?t===!0?{enabled:!0}:t.enabled!==!1?t:null:null}const se=({children:t,components:r,className:c,copyButton:o=!0,onCodeCopy:s,mermaid:f,...l})=>{const a=Ie(f),u=n.useMemo(()=>{if(!t)return null;const m=L.parseToHast(t,l),d={pre:g=>{if(a&&Be(g)){const b=Fe(g.children);return e.jsx(J,{code:b,theme:a.theme,onCopy:s})}return o?e.jsx(Y,{showCopyButton:o,onCopy:s,...g}):e.jsx("pre",{...g})},...r};return Z.toJsxRuntime(m,{Fragment:e.Fragment,jsx:e.jsx,jsxs:e.jsxs,components:d})},[t,r,o,s,a,l]);return e.jsx("div",{className:c,children:u})};se.displayName="Markdown";function Te(t,r={}){const{components:c={},...o}=r;return n.useMemo(()=>{if(!t)return null;const s=L.parseToHast(t,o);return Z.toJsxRuntime(s,{Fragment:e.Fragment,jsx:e.jsx,jsxs:e.jsxs,components:c})},[t,c,o])}const ae=n.memo(({block:t,components:r})=>{if(!t.hast)return null;try{return Z.toJsxRuntime(t.hast,{jsx:e.jsx,jsxs:e.jsxs,Fragment:e.Fragment,components:r})}catch{return null}},(t,r)=>t.block.key===r.block.key&&t.block.stable&&r.block.stable);ae.displayName="StableBlock";function Ve(t={}){const{components:r,minUpdateInterval:c=16,immediate:o=!1,outputRate:s="medium",...f}=t,l=n.useRef(L.createStreamingParser(f)),a=n.useRef(new L.OutputRateController(s)),[u,m]=n.useState(0),[x,d]=n.useState(!1),[g,b]=n.useState(0),[p,k]=n.useState("idle"),E=n.useRef(0),v=n.useRef(null),S=n.useCallback(()=>{const R=performance.now(),D=R-E.current;o||D>=c?(E.current=R,m(T=>T+1)):v.current===null&&(v.current=window.requestAnimationFrame(()=>{v.current=null,E.current=performance.now(),m(T=>T+1)}))},[c,o]),w=n.useCallback(R=>{l.current.append(R),S()},[S]),C=n.useCallback(R=>{l.current.reset(),d(!1),b(0),k("running"),a.current.start(R,D=>{D&&l.current.append(D),b(a.current.progress),S()},()=>{l.current.finish(),d(!0),b(1),k("complete"),S()})},[S]),i=n.useCallback(()=>{a.current.pause(),k(a.current.status)},[]),j=n.useCallback(()=>{a.current.resume(),k(a.current.status)},[]),M=n.useCallback(()=>{a.current.skipToEnd(),k(a.current.status),b(1)},[]),B=n.useCallback(()=>{a.current.stop(),l.current.finish(),d(!0),k("complete"),v.current!==null&&(cancelAnimationFrame(v.current),v.current=null),m(R=>R+1)},[]),F=n.useCallback(()=>{a.current.stop(),l.current.reset(),d(!1),b(0),k("idle"),v.current!==null&&(cancelAnimationFrame(v.current),v.current=null),m(R=>R+1)},[]);n.useEffect(()=>{a.current.setRate(s)},[s]),n.useEffect(()=>()=>{a.current.stop(),v.current!==null&&cancelAnimationFrame(v.current)},[]);const h=l.current.getState(),y=l.current.getStats(),N=l.current.getContent(),I=n.useMemo(()=>h.blocks.map(R=>e.jsx(ae,{block:R,components:r},R.key)),[h.blocks,r,u]);return{element:n.useMemo(()=>h.blocks.length===0?null:e.jsx(e.Fragment,{children:I}),[I,h.blocks.length]),append:w,start:C,pause:i,resume:j,skipToEnd:M,reset:F,finish:B,blocks:h.blocks,stats:y,isComplete:x,content:N,progress:g,outputStatus:p}}const De=16,He="data:image/svg+xml,",Ae=()=>e.jsxs("svg",{width:"48",height:"36",viewBox:"0 0 48 36",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[e.jsx("rect",{x:"0",y:"0",width:"48",height:"36",rx:"3",className:"md-image-skeleton-icon"}),e.jsx("circle",{cx:"12",cy:"10",r:"5",className:"md-image-skeleton-icon-detail"}),e.jsx("path",{d:"M0 36 L0 24 L16 16 L28 26 L48 12 L48 36 Z",className:"md-image-skeleton-icon-detail"})]}),K=n.memo(({src:t,alt:r,className:c,"data-width":o,"data-height":s,...f})=>{const a=(t==null?void 0:t.startsWith(He))?void 0:t,u=o?Number(o):200,m=s?Number(s):120,[x,d]=n.useState(!0),g=n.useRef(null),b=n.useRef(null);n.useLayoutEffect(()=>{g.current&&a&&g.current.complete&&g.current.naturalWidth>0&&d(!1)},[a]);const p=n.useCallback(()=>{b.current&&clearTimeout(b.current),b.current=setTimeout(()=>{d(!1)},De)},[]);return e.jsxs("span",{className:`md-image-container ${c||""}`,style:{width:u,height:m},children:[a&&e.jsx("img",{ref:g,src:a,alt:r,onLoad:p,className:"md-image",...f}),x&&e.jsx("span",{className:"md-image-skeleton",children:e.jsx(Ae,{})})]})});K.displayName="StreamingImage";let U=!1,$=null;async function ce(){if(!U)return $||($=(async()=>{await import("katex/dist/katex.min.css"),U=!0})(),$)}const Oe=n.memo(({children:t})=>(n.useEffect(()=>{U||ce()},[]),e.jsx(e.Fragment,{children:t})));Oe.displayName="MathProvider";function $e(){return ce()}const le=n.memo(({block:t,components:r})=>{if(!t.hast)return null;try{return Z.toJsxRuntime(t.hast,{jsx:e.jsx,jsxs:e.jsxs,Fragment:e.Fragment,components:r})}catch{return e.jsx("div",{className:"parse-error",children:t.source})}},(t,r)=>t.block.key===r.block.key&&t.block.stable&&r.block.stable);le.displayName="StableBlock";const oe=({content:t,source:r,outputRate:c="medium",isComplete:o=!1,onComplete:s,onBlockStable:f,onProgress:l,components:a,className:u,minUpdateInterval:m=16,autoStart:x=!0,copyButton:d=!0,onCodeCopy:g,...b})=>{n.useEffect(()=>{b.math&&$e()},[b.math]);const p=n.useRef(L.createStreamingParser(b)),k=n.useRef(new L.OutputRateController(c)),E=n.useRef(""),v=n.useRef(void 0),S=n.useRef([]),[,w]=n.useReducer(h=>h+1,0),C=n.useRef(0),i=n.useRef(null),j=()=>{const h=performance.now();h-C.current>=m?(C.current=h,w()):i.current===null&&(i.current=window.requestAnimationFrame(()=>{i.current=null,C.current=performance.now(),w()}))};n.useEffect(()=>{r!==void 0&&r!==v.current&&(v.current=r,x&&r&&(p.current.reset(),E.current="",k.current.start(r,h=>{h&&(p.current.append(h),E.current+=h),l==null||l(k.current.progress),j()},()=>{p.current.finish(),s==null||s(),j()})))},[r,x,s,l]),n.useEffect(()=>{if(r!==void 0)return;const h=E.current,y=t||"";if(y!==h){if(y.startsWith(h)){const N=y.slice(h.length);N&&p.current.append(N)}else p.current.reset(),y&&p.current.append(y);E.current=y,j()}},[t,r]),n.useEffect(()=>{r===void 0&&o&&(p.current.finish(),i.current!==null&&(cancelAnimationFrame(i.current),i.current=null),w(),s==null||s())},[o,s,r]),n.useEffect(()=>{k.current.setRate(c)},[c]),n.useEffect(()=>{if(f){const h=p.current.getState().blocks,y=S.current;h.forEach((N,I)=>{const A=y[I];N.stable&&(!A||!A.stable)&&f(N)}),S.current=h}}),n.useEffect(()=>()=>{k.current.stop(),i.current!==null&&cancelAnimationFrame(i.current)},[]);const M=p.current.getState(),B=r!==void 0?k.current.status==="complete":o,F=n.useMemo(()=>{const h=y=>{if(d)return N=>e.jsx(Y,{showCopyButton:y.stable&&d,onCopy:g,...N})};return M.blocks.map(y=>{const N=h(y),I={img:K,...N?{pre:N}:{},...a};return e.jsx(le,{block:y,components:I},y.key)})},[M.blocks,a,d,g]);return e.jsx("div",{className:u,"data-streaming":!B,children:F})};oe.displayName="StreamingMarkdown";const ie=n.memo(t=>{const{text:r,animationConfig:c}=t,{fadeDuration:o=200,easing:s="ease-in-out"}=c||{},[f,l]=n.useState([]),a=n.useRef("");n.useEffect(()=>{if(r===a.current)return;if(!(a.current&&r.indexOf(a.current)===0)){l([r]),a.current=r;return}const m=r.slice(a.current.length);m&&(l(x=>[...x,m]),a.current=r)},[r]);const u=`md-fade-in ${o}ms ${s} forwards`;return e.jsx(e.Fragment,{children:f.map((m,x)=>e.jsx("span",{className:"md-animation-text",style:{animation:u},children:m},`animation-text-${x}`))})});ie.displayName="AnimationText";let P=null;try{P=require("dompurify")}catch{}function Pe(){return P!==null}function Ze(t,r){if(!P)return t;const c={ADD_ATTR:["target","rel","data-block-key","data-pending","data-predicted"],...r};return P.default.sanitize(t,c)}function X(t){if(t.type==="root")return{...t,children:t.children.map(s=>s.type==="element"?X(s):s)};const r=["onclick","onerror","onload","onmouseover","onfocus","onblur"],c=["javascript:","vbscript:","data:text/html"],o={};if(t.properties)for(const[s,f]of Object.entries(t.properties)){const l=s.toLowerCase();if(!(r.includes(l)||l.startsWith("on"))){if((l==="href"||l==="src")&&typeof f=="string"){const a=f.toLowerCase().trim();if(c.some(u=>a.startsWith(u)))continue}o[s]=f}}return{...t,properties:o,children:t.children.map(s=>s.type==="element"?X(s):s)}}exports.AnimationText=ie;exports.CodeBlock=Y;exports.Markdown=se;exports.MermaidBlock=J;exports.MermaidFullscreenViewer=q;exports.StreamingImage=K;exports.StreamingMarkdown=oe;exports.isDOMPurifyAvailable=Pe;exports.sanitizeHast=X;exports.sanitizeHtml=Ze;exports.useMarkdown=Te;exports.useStreamingMarkdown=Ve;exports.useZoom=W;
|
package/dist/index.d.ts
CHANGED
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export { Markdown } from './Markdown';
|
|
6
6
|
export { useMarkdown } from './useMarkdown';
|
|
7
|
-
export { CodeBlock } from './components';
|
|
8
|
-
export type { CodeBlockProps } from './components';
|
|
9
|
-
export type { MarkdownProps, MarkdownComponents, UseMarkdownOptions } from './types';
|
|
7
|
+
export { CodeBlock, MermaidBlock, MermaidFullscreenViewer, useZoom } from './components';
|
|
8
|
+
export type { CodeBlockProps, MermaidBlockProps, MermaidFullscreenViewerProps, ViewMode, ZoomConfig, ZoomState, } from './components';
|
|
9
|
+
export type { MarkdownProps, MarkdownComponents, UseMarkdownOptions, MermaidOptions } from './types';
|
|
10
10
|
export { useStreamingMarkdown, StreamingMarkdown, StreamingImage, AnimationText, } from './streaming';
|
|
11
11
|
export type { UseStreamingMarkdownOptions, UseStreamingMarkdownResult, StreamingMarkdownProps, AnimationConfig, StreamingConfig, } from './streaming';
|
|
12
12
|
export { sanitizeHast, sanitizeHtml, isDOMPurifyAvailable } from './utils';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,uBAAuB,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACzF,YAAY,EACV,cAAc,EACd,iBAAiB,EACjB,4BAA4B,EAC5B,QAAQ,EACR,UAAU,EACV,SAAS,GACV,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGrG,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,EACd,aAAa,GACd,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,2BAA2B,EAC3B,0BAA0B,EAC1B,sBAAsB,EACtB,eAAe,EACf,eAAe,GAChB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAC3E,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAG9C,YAAY,EACV,gBAAgB,EAChB,YAAY,EACZ,SAAS,EACT,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,uBAAuB,GACxB,MAAM,kBAAkB,CAAC"}
|