@superlc/md-react 0.1.0 → 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.
@@ -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
@@ -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;AAEhC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,QAAQ,EAAE,EAAE,CAAC,aAAa,CAStC,CAAC"}
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"}
@@ -0,0 +1,16 @@
1
+ import { default as React, ReactNode } from 'react';
2
+
3
+ export interface CodeBlockProps {
4
+ children?: ReactNode;
5
+ /** 是否显示复制按钮 */
6
+ showCopyButton?: boolean;
7
+ /** 复制成功回调 */
8
+ onCopy?: (code: string) => void;
9
+ /** 额外的 className */
10
+ className?: string;
11
+ }
12
+ /**
13
+ * 代码块组件,包装 <pre> 元素并添加复制按钮
14
+ */
15
+ export declare const CodeBlock: React.FC<CodeBlockProps>;
16
+ //# sourceMappingURL=CodeBlock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodeBlock.d.ts","sourceRoot":"","sources":["../../src/components/CodeBlock.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAyB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAqDrE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,eAAe;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa;IACb,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,oBAAoB;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CAoC9C,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { CodeBlock, type CodeBlockProps } from './CodeBlock';
2
+ export { MermaidBlock, MermaidFullscreenViewer, useZoom } from './mermaid';
3
+ export type { MermaidBlockProps, MermaidFullscreenViewerProps, ViewMode, ZoomConfig, ZoomState, } from './mermaid';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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;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,5 @@
1
+ import { default as React } from 'react';
2
+ import { MermaidBlockProps } from './types';
3
+
4
+ export declare const MermaidBlock: React.FC<MermaidBlockProps>;
5
+ //# sourceMappingURL=MermaidBlock.d.ts.map
@@ -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,5 @@
1
+ import { default as React } from 'react';
2
+ import { MermaidFullscreenViewerProps } from './types';
3
+
4
+ export declare const MermaidFullscreenViewer: React.FC<MermaidFullscreenViewerProps>;
5
+ //# sourceMappingURL=MermaidFullscreenViewer.d.ts.map
@@ -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 Y=Object.create;var H=Object.defineProperty;var Z=Object.getOwnPropertyDescriptor;var G=Object.getOwnPropertyNames;var Q=Object.getPrototypeOf,ee=Object.prototype.hasOwnProperty;var te=(e,t,c,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of G(t))!ee.call(e,n)&&n!==c&&H(e,n,{get:()=>t[n],enumerable:!(i=Z(t,n))||i.enumerable});return e};var re=(e,t,c)=>(c=e!=null?Y(Q(e)):{},te(t||!e||!e.__esModule?H(c,"default",{value:e,enumerable:!0}):c,e));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("react/jsx-runtime"),r=require("react"),M=require("@superlc/md-core"),U=require("hast-util-to-jsx-runtime");function $(e,t={}){const{components:c={},...i}=t;return r.useMemo(()=>{if(!e)return null;const n=M.parseToHast(e,i);return U.toJsxRuntime(n,{Fragment:a.Fragment,jsx:a.jsx,jsxs:a.jsxs,components:c})},[e,c,i])}const J=({children:e,components:t,className:c,...i})=>{const n=$(e,{components:t,...i});return a.jsx("div",{className:c,children:n})};J.displayName="Markdown";const K=r.memo(({block:e,components:t})=>{if(!e.hast)return null;try{return U.toJsxRuntime(e.hast,{jsx:a.jsx,jsxs:a.jsxs,Fragment:a.Fragment,components:t})}catch{return null}},(e,t)=>e.block.key===t.block.key&&e.block.stable&&t.block.stable);K.displayName="StableBlock";function ne(e={}){const{components:t,minUpdateInterval:c=16,immediate:i=!1,outputRate:n="medium",...k}=e,u=r.useRef(M.createStreamingParser(k)),s=r.useRef(new M.OutputRateController(n)),[y,p]=r.useState(0),[w,h]=r.useState(!1),[l,f]=r.useState(0),[S,R]=r.useState("idle"),v=r.useRef(0),m=r.useRef(null),j=r.useCallback(()=>{const g=performance.now(),A=g-v.current;i||A>=c?(v.current=g,p(B=>B+1)):m.current===null&&(m.current=window.requestAnimationFrame(()=>{m.current=null,v.current=performance.now(),p(B=>B+1)}))},[c,i]),b=r.useCallback(g=>{u.current.append(g),j()},[j]),E=r.useCallback(g=>{u.current.reset(),h(!1),f(0),R("running"),s.current.start(g,A=>{A&&u.current.append(A),f(s.current.progress),j()},()=>{u.current.finish(),h(!0),f(1),R("complete"),j()})},[j]),C=r.useCallback(()=>{s.current.pause(),R(s.current.status)},[]),T=r.useCallback(()=>{s.current.resume(),R(s.current.status)},[]),O=r.useCallback(()=>{s.current.skipToEnd(),R(s.current.status),f(1)},[]),o=r.useCallback(()=>{s.current.stop(),u.current.finish(),h(!0),R("complete"),m.current!==null&&(cancelAnimationFrame(m.current),m.current=null),p(g=>g+1)},[]),d=r.useCallback(()=>{s.current.stop(),u.current.reset(),h(!1),f(0),R("idle"),m.current!==null&&(cancelAnimationFrame(m.current),m.current=null),p(g=>g+1)},[]);r.useEffect(()=>{s.current.setRate(n)},[n]),r.useEffect(()=>()=>{s.current.stop(),m.current!==null&&cancelAnimationFrame(m.current)},[]);const x=u.current.getState(),P=u.current.getStats(),N=u.current.getContent(),z=r.useMemo(()=>x.blocks.map(g=>a.jsx(K,{block:g,components:t},g.key)),[x.blocks,t,y]);return{element:r.useMemo(()=>x.blocks.length===0?null:a.jsx(a.Fragment,{children:z}),[z,x.blocks.length]),append:b,start:E,pause:C,resume:T,skipToEnd:O,reset:d,finish:o,blocks:x.blocks,stats:P,isComplete:w,content:N,progress:l,outputStatus:S}}const se=16,ae="data:image/svg+xml,",ce=()=>a.jsxs("svg",{width:"48",height:"36",viewBox:"0 0 48 36",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[a.jsx("rect",{x:"0",y:"0",width:"48",height:"36",rx:"3",className:"md-image-skeleton-icon"}),a.jsx("circle",{cx:"12",cy:"10",r:"5",className:"md-image-skeleton-icon-detail"}),a.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":i,"data-height":n,...k})=>{const s=(e==null?void 0:e.startsWith(ae))?void 0:e,y=i?Number(i):200,p=n?Number(n):120,[w,h]=r.useState(!0),l=r.useRef(null),f=r.useRef(null);r.useLayoutEffect(()=>{l.current&&s&&l.current.complete&&l.current.naturalWidth>0&&h(!1)},[s]);const S=r.useCallback(()=>{f.current&&clearTimeout(f.current),f.current=setTimeout(()=>{h(!1)},se)},[]);return a.jsxs("span",{className:`md-image-container ${c||""}`,style:{width:y,height:p},children:[s&&a.jsx("img",{ref:l,src:s,alt:t,onLoad:S,className:"md-image",...k}),w&&a.jsx("span",{className:"md-image-skeleton",children:a.jsx(ce,{})})]})});q.displayName="StreamingImage";let I=!1,F=null;async function W(){if(!I)return F||(F=(async()=>{await import("katex/dist/katex.min.css"),I=!0})(),F)}const ue=r.memo(({children:e})=>(r.useEffect(()=>{I||W()},[]),a.jsx(a.Fragment,{children:e})));ue.displayName="MathProvider";function ie(){return W()}const _=r.memo(({block:e,components:t})=>{if(!e.hast)return null;try{return U.toJsxRuntime(e.hast,{jsx:a.jsx,jsxs:a.jsxs,Fragment:a.Fragment,components:t})}catch{return a.jsx("div",{className:"parse-error",children:e.source})}},(e,t)=>e.block.key===t.block.key&&e.block.stable&&t.block.stable);_.displayName="StableBlock";const V=({content:e,source:t,outputRate:c="medium",isComplete:i=!1,onComplete:n,onBlockStable:k,onProgress:u,components:s,className:y,minUpdateInterval:p=16,autoStart:w=!0,...h})=>{r.useEffect(()=>{h.math&&ie()},[h.math]);const l=r.useRef(M.createStreamingParser(h)),f=r.useRef(new M.OutputRateController(c)),S=r.useRef(""),R=r.useRef(void 0),v=r.useRef([]),[,m]=r.useReducer(o=>o+1,0),j=r.useRef(0),b=r.useRef(null),E=()=>{const o=performance.now();o-j.current>=p?(j.current=o,m()):b.current===null&&(b.current=window.requestAnimationFrame(()=>{b.current=null,j.current=performance.now(),m()}))};r.useEffect(()=>{t!==void 0&&t!==R.current&&(R.current=t,w&&t&&(l.current.reset(),S.current="",f.current.start(t,o=>{o&&(l.current.append(o),S.current+=o),u==null||u(f.current.progress),E()},()=>{l.current.finish(),n==null||n(),E()})))},[t,w,n,u]),r.useEffect(()=>{if(t!==void 0)return;const o=S.current,d=e||"";if(d!==o){if(d.startsWith(o)){const x=d.slice(o.length);x&&l.current.append(x)}else l.current.reset(),d&&l.current.append(d);S.current=d,E()}},[e,t]),r.useEffect(()=>{t===void 0&&i&&(l.current.finish(),b.current!==null&&(cancelAnimationFrame(b.current),b.current=null),m(),n==null||n())},[i,n,t]),r.useEffect(()=>{f.current.setRate(c)},[c]),r.useEffect(()=>{if(k){const o=l.current.getState().blocks,d=v.current;o.forEach((x,P)=>{const N=d[P];x.stable&&(!N||!N.stable)&&k(x)}),v.current=o}}),r.useEffect(()=>()=>{f.current.stop(),b.current!==null&&cancelAnimationFrame(b.current)},[]);const C=l.current.getState(),T=t!==void 0?f.current.status==="complete":i,O=r.useMemo(()=>{const o={img:q,...s};return C.blocks.map(d=>a.jsx(_,{block:d,components:o},d.key))},[C.blocks,s]);return a.jsx("div",{className:y,"data-streaming":!T,children:O})};V.displayName="StreamingMarkdown";const X=r.memo(e=>{const{text:t,animationConfig:c}=e,{fadeDuration:i=200,easing:n="ease-in-out"}=c||{},[k,u]=r.useState([]),s=r.useRef("");r.useEffect(()=>{if(t===s.current)return;if(!(s.current&&t.indexOf(s.current)===0)){u([t]),s.current=t;return}const p=t.slice(s.current.length);p&&(u(w=>[...w,p]),s.current=t)},[t]);const y=`md-fade-in ${i}ms ${n} forwards`;return a.jsx(a.Fragment,{children:k.map((p,w)=>a.jsx("span",{className:"md-animation-text",style:{animation:y},children:p},`animation-text-${w}`))})});X.displayName="AnimationText";let L=null;try{L=require("dompurify")}catch{}function oe(){return L!==null}function le(e,t){if(!L)return e;const c={ADD_ATTR:["target","rel","data-block-key","data-pending","data-predicted"],...t};return L.default.sanitize(e,c)}function D(e){if(e.type==="root")return{...e,children:e.children.map(n=>n.type==="element"?D(n):n)};const t=["onclick","onerror","onload","onmouseover","onfocus","onblur"],c=["javascript:","vbscript:","data:text/html"],i={};if(e.properties)for(const[n,k]of Object.entries(e.properties)){const u=n.toLowerCase();if(!(t.includes(u)||u.startsWith("on"))){if((u==="href"||u==="src")&&typeof k=="string"){const s=k.toLowerCase().trim();if(c.some(y=>s.startsWith(y)))continue}i[n]=k}}return{...e,properties:i,children:e.children.map(n=>n.type==="element"?D(n):n)}}exports.AnimationText=X;exports.Markdown=J;exports.StreamingImage=q;exports.StreamingMarkdown=V;exports.isDOMPurifyAvailable=oe;exports.sanitizeHast=D;exports.sanitizeHtml=le;exports.useMarkdown=$;exports.useStreamingMarkdown=ne;
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,7 +4,9 @@
4
4
  */
5
5
  export { Markdown } from './Markdown';
6
6
  export { useMarkdown } from './useMarkdown';
7
- 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';
8
10
  export { useStreamingMarkdown, StreamingMarkdown, StreamingImage, AnimationText, } from './streaming';
9
11
  export type { UseStreamingMarkdownOptions, UseStreamingMarkdownResult, StreamingMarkdownProps, AnimationConfig, StreamingConfig, } from './streaming';
10
12
  export { sanitizeHast, sanitizeHtml, isDOMPurifyAvailable } from './utils';
@@ -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,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAGrF,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"}
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"}