@superlc/md-react 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/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 +42 -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 +824 -296
- 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;;;GAGG;AAEH,OAAO,KAAmD,MAAM,OAAO,CAAC;AASxE,OAAO,KAAK,EAAE,iBAAiB,EAAY,MAAM,SAAS,CAAC;AAmD3D,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAuPpD,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, } 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,GACV,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
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
|
+
/** MermaidBlock Props */
|
|
19
|
+
export interface MermaidBlockProps {
|
|
20
|
+
/** Mermaid 源代码 */
|
|
21
|
+
code: string;
|
|
22
|
+
/** 主题 */
|
|
23
|
+
theme?: MermaidTheme | 'auto';
|
|
24
|
+
/** 是否显示工具栏 */
|
|
25
|
+
showToolbar?: boolean;
|
|
26
|
+
/** 复制成功回调 */
|
|
27
|
+
onCopy?: (code: string) => void;
|
|
28
|
+
/** 额外的 className */
|
|
29
|
+
className?: string;
|
|
30
|
+
}
|
|
31
|
+
/** MermaidFullscreenViewer Props */
|
|
32
|
+
export interface MermaidFullscreenViewerProps {
|
|
33
|
+
/** SVG 内容 */
|
|
34
|
+
svg: string;
|
|
35
|
+
/** 是否显示 */
|
|
36
|
+
open: boolean;
|
|
37
|
+
/** 关闭回调 */
|
|
38
|
+
onClose: () => void;
|
|
39
|
+
/** 下载回调 */
|
|
40
|
+
onDownload?: () => void;
|
|
41
|
+
}
|
|
42
|
+
//# 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,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;CACpB;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 ce=Object.create;var q=Object.defineProperty;var le=Object.getOwnPropertyDescriptor;var oe=Object.getOwnPropertyNames;var ie=Object.getPrototypeOf,ue=Object.prototype.hasOwnProperty;var me=(t,r,c,l)=>{if(r&&typeof r=="object"||typeof r=="function")for(let a of oe(r))!ue.call(t,a)&&a!==c&&q(t,a,{get:()=>r[a],enumerable:!(l=le(r,a))||l.enumerable});return t};var de=(t,r,c)=>(c=t!=null?ce(ie(t)):{},me(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"),A=require("hast-util-to-jsx-runtime");async function fe(t){try{return await navigator.clipboard.writeText(t),!0}catch{return he(t)}}function he(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 xe=()=>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"})}),pe=()=>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"})}),O=({children:t,showCopyButton:r=!0,onCopy:c,className:l})=>{const[a,u]=n.useState(!1),i=n.useCallback(async()=>{const s=P(t);await fe(s)&&(u(!0),c==null||c(s),setTimeout(()=>u(!1),2e3))},[t,c]);return e.jsxs("div",{className:`md-code-block-wrapper${l?` ${l}`:""}`,children:[e.jsx("pre",{children:t}),r&&e.jsx("button",{type:"button",className:`md-copy-button${a?" md-copy-button--copied":""}`,onClick:i,title:a?"已复制":"复制代码","aria-label":a?"已复制":"复制代码",children:a?e.jsx(pe,{}):e.jsx(xe,{})})]})};function P(t){return typeof t=="string"?t:typeof t=="number"?String(t):Array.isArray(t)?t.map(P).join(""):n.isValidElement(t)?P(t.props.children):""}O.displayName="CodeBlock";const be={min:.25,max:4,step:.25,default:1};function U(t={}){const{config:r,enableDrag:c=!1,enableWheelZoom:l=!1}=t,a={...be,...r},u=n.useRef(null),i=n.useRef(!1),s=n.useRef({x:0,y:0}),p=n.useRef({x:0,y:0}),[m,h]=n.useState({scale:a.default,translateX:0,translateY:0}),d=n.useCallback(o=>Math.max(a.min,Math.min(a.max,o)),[a.min,a.max]),b=n.useCallback(()=>{h(o=>({...o,scale:d(o.scale+a.step)}))},[d,a.step]),x=n.useCallback(()=>{h(o=>({...o,scale:d(o.scale-a.step)}))},[d,a.step]),v=n.useCallback(()=>{h({scale:a.default,translateX:0,translateY:0})},[a.default]),k=n.useCallback(o=>{h(j=>({...j,scale:d(o)}))},[d]),N=n.useCallback((o,j)=>{const M=o.width/j.width,F=o.height/j.height,I=Math.min(M,F)*.95;h({scale:d(I),translateX:0,translateY:0})},[d]),g=n.useCallback(o=>{c&&(o.preventDefault(),i.current=!0,s.current={x:o.clientX,y:o.clientY},p.current={x:m.translateX,y:m.translateY})},[c,m.translateX,m.translateY]);n.useEffect(()=>{if(!c)return;const o=M=>{if(!i.current)return;const F=M.clientX-s.current.x,I=M.clientY-s.current.y;h(f=>({...f,translateX:p.current.x+F,translateY:p.current.y+I}))},j=()=>{i.current=!1};return document.addEventListener("mousemove",o),document.addEventListener("mouseup",j),()=>{document.removeEventListener("mousemove",o),document.removeEventListener("mouseup",j)}},[c]);const S=n.useCallback(o=>{if(!l)return;o.preventDefault();const j=o.deltaY>0?-a.step:a.step;h(M=>({...M,scale:d(M.scale+j)}))},[l,a.step,d]),E=n.useCallback(()=>{v()},[v]),z={transform:`translate(${m.translateX}px, ${m.translateY}px) scale(${m.scale})`,transformOrigin:"center center",transition:i.current?"none":"transform 0.2s ease-out",cursor:c?i.current?"grabbing":"grab":"default"};return{state:m,zoomIn:b,zoomOut:x,reset:v,fitToContainer:N,setScale:k,canZoomIn:m.scale<a.max,canZoomOut:m.scale>a.min,containerRef:u,contentStyle:z,handlers:{onMouseDown:g,onWheel:S,onDoubleClick:E}}}const ve=()=>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"})}),ge=()=>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"})}),J=()=>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"})}),K=()=>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"})}),G=()=>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"})}),je=()=>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"})}),ke=()=>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"})}),Q=()=>e.jsx("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:e.jsx("path",{d:"M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"})}),ye=()=>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"})}),Ce=()=>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"})}),we=()=>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"})}),X=({svg:t,open:r,onClose:c,onDownload:l})=>{const a=n.useRef(null),u=n.useRef(null),i=n.useRef(null),[s,p]=n.useState(!1),{state:m,zoomIn:h,zoomOut:d,reset:b,fitToContainer:x,canZoomIn:v,canZoomOut:k,contentStyle:N,handlers:g}=U({enableDrag:!0,enableWheelZoom:!0}),S=n.useCallback(async()=>{if(a.current)try{await a.current.requestFullscreen(),p(!0)}catch{p(!0)}},[]),E=n.useCallback(()=>{document.fullscreenElement&&document.exitFullscreen().catch(()=>{}),p(!1),c()},[c]);n.useEffect(()=>{r?S():s&&E()},[r,S,E,s]),n.useEffect(()=>{const o=()=>{!document.fullscreenElement&&s&&(p(!1),c())};return document.addEventListener("fullscreenchange",o),()=>document.removeEventListener("fullscreenchange",o)},[s,c]),n.useEffect(()=>{if(!s)return;const o=j=>{switch(j.key){case"+":case"=":h();break;case"-":d();break;case"0":b();break}};return document.addEventListener("keydown",o),()=>document.removeEventListener("keydown",o)},[s,h,d,b]);const z=n.useCallback(()=>{if(!u.current||!i.current)return;const o=u.current.getBoundingClientRect(),j=i.current.querySelector("svg");if(j){const M=j.getBoundingClientRect();x(o,M)}},[x]);return e.jsx("div",{ref:a,className:`md-mermaid-fullscreen-wrapper${s?" md-mermaid-fullscreen-wrapper--active":""}`,role:"dialog","aria-modal":"true","aria-label":"Mermaid 图表全屏预览","aria-hidden":!s,children:s&&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(K,{})}),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:h,disabled:!v,title:"放大 (+)","aria-label":"放大",children:e.jsx(J,{})}),e.jsx("span",{className:"md-mermaid-toolbar-divider"}),e.jsx("button",{type:"button",className:"md-mermaid-toolbar-btn",onClick:b,title:"重置 (0)","aria-label":"重置",children:e.jsx(G,{})}),e.jsx("button",{type:"button",className:"md-mermaid-toolbar-btn",onClick:z,title:"适应窗口","aria-label":"适应窗口",children:e.jsx(ke,{})})]}),e.jsxs("div",{className:"md-mermaid-toolbar-group",children:[l&&e.jsx("button",{type:"button",className:"md-mermaid-toolbar-btn",onClick:l,title:"下载 PNG","aria-label":"下载",children:e.jsx(Q,{})}),e.jsx("button",{type:"button",className:"md-mermaid-toolbar-btn",onClick:E,title:"退出全屏 (Esc)","aria-label":"退出全屏",children:e.jsx(ye,{})})]})]}),e.jsx("div",{ref:u,className:"md-mermaid-fullscreen-content",onWheel:g.onWheel,children:e.jsx("div",{ref:i,className:"md-mermaid-fullscreen-svg",style:N,onMouseDown:g.onMouseDown,onDoubleClick:g.onDoubleClick,dangerouslySetInnerHTML:{__html:t}})})]})})};X.displayName="MermaidFullscreenViewer";let B=null;function Me(t="auto"){return B?B.setTheme(t??"auto"):B=new L.MermaidRenderer({theme:t}),B}async function Se(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 W=({code:t,theme:r="auto",showToolbar:c=!0,onCopy:l,className:a})=>{const[u,i]=n.useState("preview"),[s,p]=n.useState(null),[m,h]=n.useState(!0),[d,b]=n.useState(!1),[x,v]=n.useState(!1),k=n.useRef(null),[N,g]=n.useState(()=>L.detectColorScheme()),{state:S,zoomIn:E,zoomOut:z,reset:o,canZoomIn:j,canZoomOut:M,contentStyle:F}=U();n.useEffect(()=>{if(r==="auto")return L.observeColorScheme(w=>{g(w)})},[r]),n.useEffect(()=>{let w=!1;return(async()=>{h(!0);const V=await Me(r).render(t);w||(p(V),h(!1),V.success||i("code"))})(),()=>{w=!0}},[t,r,N]);const I=n.useCallback(async()=>{await Se(t)&&(v(!0),l==null||l(t),setTimeout(()=>v(!1),2e3))},[t,l]),f=n.useCallback(async()=>{var w;if(s!=null&&s.svg)try{const T=((w=window.matchMedia)==null?void 0:w.call(window,"(prefers-color-scheme: dark)").matches)??!1;await L.downloadAsPng(s.svg,{backgroundColor:T?"#1a1a2e":"#ffffff",padding:20,scale:2})}catch(T){console.error("Download failed:",T)}},[s]),y=n.useCallback(()=>{b(w=>!w)},[]),C=(s==null?void 0:s.success)&&s.svg;return e.jsxs("div",{className:`md-mermaid-block${a?` ${a}`:""}`,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${u==="preview"?" md-mermaid-toolbar-btn--active":""}`,onClick:()=>i("preview"),disabled:!C,title:"图片模式","aria-label":"图片模式",children:e.jsx(ve,{})}),e.jsx("button",{type:"button",className:`md-mermaid-toolbar-btn${u==="code"?" md-mermaid-toolbar-btn--active":""}`,onClick:()=>i("code"),title:"代码模式","aria-label":"代码模式",children:e.jsx(ge,{})})]}),u==="preview"&&C&&e.jsxs("div",{className:"md-mermaid-toolbar-group",children:[e.jsx("button",{type:"button",className:"md-mermaid-toolbar-btn",onClick:z,disabled:!M,title:"缩小","aria-label":"缩小",children:e.jsx(K,{})}),e.jsxs("span",{className:"md-mermaid-zoom-label",children:[Math.round(S.scale*100),"%"]}),e.jsx("button",{type:"button",className:"md-mermaid-toolbar-btn",onClick:E,disabled:!j,title:"放大","aria-label":"放大",children:e.jsx(J,{})}),e.jsx("button",{type:"button",className:"md-mermaid-toolbar-btn",onClick:o,title:"重置","aria-label":"重置缩放",children:e.jsx(G,{})})]}),e.jsxs("div",{className:"md-mermaid-toolbar-group",children:[u==="preview"&&C&&e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",className:"md-mermaid-toolbar-btn",onClick:y,title:"全屏","aria-label":"全屏查看",children:e.jsx(je,{})}),e.jsx("button",{type:"button",className:"md-mermaid-toolbar-btn",onClick:f,title:"下载 PNG","aria-label":"下载",children:e.jsx(Q,{})})]}),u==="code"&&e.jsx("button",{type:"button",className:`md-mermaid-toolbar-btn${x?" md-mermaid-toolbar-btn--success":""}`,onClick:I,title:x?"已复制":"复制代码","aria-label":x?"已复制":"复制代码",children:x?e.jsx(we,{}):e.jsx(Ce,{})})]})]}),e.jsx("div",{className:"md-mermaid-content",ref:k,children:m?e.jsx("div",{className:"md-mermaid-skeleton",children:e.jsx("div",{className:"md-mermaid-skeleton-box"})}):u==="preview"&&C&&(s!=null&&s.svg)?e.jsx("div",{className:"md-mermaid-preview",style:{overflow:"hidden"},children:e.jsx("div",{className:"md-mermaid-svg-container",style:F,dangerouslySetInnerHTML:{__html:s.svg}})}):e.jsxs("div",{className:"md-mermaid-code",children:[e.jsx("pre",{children:e.jsx("code",{className:"language-mermaid",children:t})}),s&&!s.success&&e.jsxs("div",{className:"md-mermaid-error",children:[e.jsx("span",{children:"渲染失败: "}),e.jsx("span",{children:s.error})]})]})}),C&&(s==null?void 0:s.svg)&&e.jsx(X,{svg:s.svg,open:d,onClose:()=>b(!1),onDownload:f})]})};W.displayName="MermaidBlock";function Ne(t){const r=t.children;if(!n.isValidElement(r))return!1;const c=r.props,l=c==null?void 0:c.className;return typeof l=="string"?l.includes("language-mermaid"):!1}function Re(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(l=>typeof l=="string"?l:"").join(""):""}function Ee(t){return t?t===!0?{enabled:!0}:t.enabled!==!1?t:null:null}const ee=({children:t,components:r,className:c,copyButton:l=!0,onCodeCopy:a,mermaid:u,...i})=>{const s=Ee(u),p=n.useMemo(()=>{if(!t)return null;const m=L.parseToHast(t,i),d={pre:b=>{if(s&&Ne(b)){const x=Re(b.children);return e.jsx(W,{code:x,theme:s.theme,onCopy:a})}return l?e.jsx(O,{showCopyButton:l,onCopy:a,...b}):e.jsx("pre",{...b})},...r};return A.toJsxRuntime(m,{Fragment:e.Fragment,jsx:e.jsx,jsxs:e.jsxs,components:d})},[t,r,l,a,s,i]);return e.jsx("div",{className:c,children:p})};ee.displayName="Markdown";function ze(t,r={}){const{components:c={},...l}=r;return n.useMemo(()=>{if(!t)return null;const a=L.parseToHast(t,l);return A.toJsxRuntime(a,{Fragment:e.Fragment,jsx:e.jsx,jsxs:e.jsxs,components:c})},[t,c,l])}const te=n.memo(({block:t,components:r})=>{if(!t.hast)return null;try{return A.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);te.displayName="StableBlock";function Le(t={}){const{components:r,minUpdateInterval:c=16,immediate:l=!1,outputRate:a="medium",...u}=t,i=n.useRef(L.createStreamingParser(u)),s=n.useRef(new L.OutputRateController(a)),[p,m]=n.useState(0),[h,d]=n.useState(!1),[b,x]=n.useState(0),[v,k]=n.useState("idle"),N=n.useRef(0),g=n.useRef(null),S=n.useCallback(()=>{const R=performance.now(),V=R-N.current;l||V>=c?(N.current=R,m($=>$+1)):g.current===null&&(g.current=window.requestAnimationFrame(()=>{g.current=null,N.current=performance.now(),m($=>$+1)}))},[c,l]),E=n.useCallback(R=>{i.current.append(R),S()},[S]),z=n.useCallback(R=>{i.current.reset(),d(!1),x(0),k("running"),s.current.start(R,V=>{V&&i.current.append(V),x(s.current.progress),S()},()=>{i.current.finish(),d(!0),x(1),k("complete"),S()})},[S]),o=n.useCallback(()=>{s.current.pause(),k(s.current.status)},[]),j=n.useCallback(()=>{s.current.resume(),k(s.current.status)},[]),M=n.useCallback(()=>{s.current.skipToEnd(),k(s.current.status),x(1)},[]),F=n.useCallback(()=>{s.current.stop(),i.current.finish(),d(!0),k("complete"),g.current!==null&&(cancelAnimationFrame(g.current),g.current=null),m(R=>R+1)},[]),I=n.useCallback(()=>{s.current.stop(),i.current.reset(),d(!1),x(0),k("idle"),g.current!==null&&(cancelAnimationFrame(g.current),g.current=null),m(R=>R+1)},[]);n.useEffect(()=>{s.current.setRate(a)},[a]),n.useEffect(()=>()=>{s.current.stop(),g.current!==null&&cancelAnimationFrame(g.current)},[]);const f=i.current.getState(),y=i.current.getStats(),C=i.current.getContent(),w=n.useMemo(()=>f.blocks.map(R=>e.jsx(te,{block:R,components:r},R.key)),[f.blocks,r,p]);return{element:n.useMemo(()=>f.blocks.length===0?null:e.jsx(e.Fragment,{children:w}),[w,f.blocks.length]),append:E,start:z,pause:o,resume:j,skipToEnd:M,reset:I,finish:F,blocks:f.blocks,stats:y,isComplete:h,content:C,progress:b,outputStatus:v}}const Fe=16,Ie="data:image/svg+xml,",Te=()=>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"})]}),_=n.memo(({src:t,alt:r,className:c,"data-width":l,"data-height":a,...u})=>{const s=(t==null?void 0:t.startsWith(Ie))?void 0:t,p=l?Number(l):200,m=a?Number(a):120,[h,d]=n.useState(!0),b=n.useRef(null),x=n.useRef(null);n.useLayoutEffect(()=>{b.current&&s&&b.current.complete&&b.current.naturalWidth>0&&d(!1)},[s]);const v=n.useCallback(()=>{x.current&&clearTimeout(x.current),x.current=setTimeout(()=>{d(!1)},Fe)},[]);return e.jsxs("span",{className:`md-image-container ${c||""}`,style:{width:p,height:m},children:[s&&e.jsx("img",{ref:b,src:s,alt:r,onLoad:v,className:"md-image",...u}),h&&e.jsx("span",{className:"md-image-skeleton",children:e.jsx(Te,{})})]})});_.displayName="StreamingImage";let Z=!1,H=null;async function ne(){if(!Z)return H||(H=(async()=>{await import("katex/dist/katex.min.css"),Z=!0})(),H)}const Ve=n.memo(({children:t})=>(n.useEffect(()=>{Z||ne()},[]),e.jsx(e.Fragment,{children:t})));Ve.displayName="MathProvider";function Be(){return ne()}const re=n.memo(({block:t,components:r})=>{if(!t.hast)return null;try{return A.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);re.displayName="StableBlock";const se=({content:t,source:r,outputRate:c="medium",isComplete:l=!1,onComplete:a,onBlockStable:u,onProgress:i,components:s,className:p,minUpdateInterval:m=16,autoStart:h=!0,copyButton:d=!0,onCodeCopy:b,...x})=>{n.useEffect(()=>{x.math&&Be()},[x.math]);const v=n.useRef(L.createStreamingParser(x)),k=n.useRef(new L.OutputRateController(c)),N=n.useRef(""),g=n.useRef(void 0),S=n.useRef([]),[,E]=n.useReducer(f=>f+1,0),z=n.useRef(0),o=n.useRef(null),j=()=>{const f=performance.now();f-z.current>=m?(z.current=f,E()):o.current===null&&(o.current=window.requestAnimationFrame(()=>{o.current=null,z.current=performance.now(),E()}))};n.useEffect(()=>{r!==void 0&&r!==g.current&&(g.current=r,h&&r&&(v.current.reset(),N.current="",k.current.start(r,f=>{f&&(v.current.append(f),N.current+=f),i==null||i(k.current.progress),j()},()=>{v.current.finish(),a==null||a(),j()})))},[r,h,a,i]),n.useEffect(()=>{if(r!==void 0)return;const f=N.current,y=t||"";if(y!==f){if(y.startsWith(f)){const C=y.slice(f.length);C&&v.current.append(C)}else v.current.reset(),y&&v.current.append(y);N.current=y,j()}},[t,r]),n.useEffect(()=>{r===void 0&&l&&(v.current.finish(),o.current!==null&&(cancelAnimationFrame(o.current),o.current=null),E(),a==null||a())},[l,a,r]),n.useEffect(()=>{k.current.setRate(c)},[c]),n.useEffect(()=>{if(u){const f=v.current.getState().blocks,y=S.current;f.forEach((C,w)=>{const T=y[w];C.stable&&(!T||!T.stable)&&u(C)}),S.current=f}}),n.useEffect(()=>()=>{k.current.stop(),o.current!==null&&cancelAnimationFrame(o.current)},[]);const M=v.current.getState(),F=r!==void 0?k.current.status==="complete":l,I=n.useMemo(()=>{const f=y=>{if(d)return C=>e.jsx(O,{showCopyButton:y.stable&&d,onCopy:b,...C})};return M.blocks.map(y=>{const C=f(y),w={img:_,...C?{pre:C}:{},...s};return e.jsx(re,{block:y,components:w},y.key)})},[M.blocks,s,d,b]);return e.jsx("div",{className:p,"data-streaming":!F,children:I})};se.displayName="StreamingMarkdown";const ae=n.memo(t=>{const{text:r,animationConfig:c}=t,{fadeDuration:l=200,easing:a="ease-in-out"}=c||{},[u,i]=n.useState([]),s=n.useRef("");n.useEffect(()=>{if(r===s.current)return;if(!(s.current&&r.indexOf(s.current)===0)){i([r]),s.current=r;return}const m=r.slice(s.current.length);m&&(i(h=>[...h,m]),s.current=r)},[r]);const p=`md-fade-in ${l}ms ${a} forwards`;return e.jsx(e.Fragment,{children:u.map((m,h)=>e.jsx("span",{className:"md-animation-text",style:{animation:p},children:m},`animation-text-${h}`))})});ae.displayName="AnimationText";let D=null;try{D=require("dompurify")}catch{}function He(){return D!==null}function De(t,r){if(!D)return t;const c={ADD_ATTR:["target","rel","data-block-key","data-pending","data-predicted"],...r};return D.default.sanitize(t,c)}function Y(t){if(t.type==="root")return{...t,children:t.children.map(a=>a.type==="element"?Y(a):a)};const r=["onclick","onerror","onload","onmouseover","onfocus","onblur"],c=["javascript:","vbscript:","data:text/html"],l={};if(t.properties)for(const[a,u]of Object.entries(t.properties)){const i=a.toLowerCase();if(!(r.includes(i)||i.startsWith("on"))){if((i==="href"||i==="src")&&typeof u=="string"){const s=u.toLowerCase().trim();if(c.some(p=>s.startsWith(p)))continue}l[a]=u}}return{...t,properties:l,children:t.children.map(a=>a.type==="element"?Y(a):a)}}exports.AnimationText=ae;exports.CodeBlock=O;exports.Markdown=ee;exports.MermaidBlock=W;exports.MermaidFullscreenViewer=X;exports.StreamingImage=_;exports.StreamingMarkdown=se;exports.isDOMPurifyAvailable=He;exports.sanitizeHast=Y;exports.sanitizeHtml=De;exports.useMarkdown=ze;exports.useStreamingMarkdown=Le;exports.useZoom=U;
|
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"}
|