@turinhub/atomix-common-ui 0.5.0 → 0.6.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.
Files changed (72) hide show
  1. package/dist/AuthPanel-CTKx618F.cjs +2 -0
  2. package/dist/AuthPanel-CTKx618F.cjs.map +1 -0
  3. package/dist/{AuthPanel-D2HFX8eN.js → AuthPanel-Cn_WwmjX.js} +259 -212
  4. package/dist/AuthPanel-Cn_WwmjX.js.map +1 -0
  5. package/dist/PDFSidebar-4DtXqqzN.cjs +2 -0
  6. package/dist/PDFSidebar-4DtXqqzN.cjs.map +1 -0
  7. package/dist/PDFSidebar-ClnrF4Br.js +239 -0
  8. package/dist/PDFSidebar-ClnrF4Br.js.map +1 -0
  9. package/dist/auth.cjs +1 -1
  10. package/dist/auth.js +1 -1
  11. package/dist/components/AuthLoginPanel.d.ts.map +1 -1
  12. package/dist/components/AuthRegisterPanel.d.ts.map +1 -1
  13. package/dist/components/AuthVisualCarousel.d.ts +2 -0
  14. package/dist/components/AuthVisualCarousel.d.ts.map +1 -1
  15. package/dist/components/DataTable.d.ts.map +1 -1
  16. package/dist/components/ImageReader.d.ts.map +1 -1
  17. package/dist/components/MarkdownReader.d.ts.map +1 -1
  18. package/dist/components/PDFReader.d.ts.map +1 -1
  19. package/dist/components/PDFSidebar.d.ts.map +1 -1
  20. package/dist/components/SimplePDFReader.d.ts.map +1 -1
  21. package/dist/components/TableHeader.d.ts.map +1 -1
  22. package/dist/components/TablePagination.d.ts +2 -1
  23. package/dist/components/TablePagination.d.ts.map +1 -1
  24. package/dist/components/VideoReader.d.ts.map +1 -1
  25. package/dist/components/ui/switch.d.ts +5 -0
  26. package/dist/components/ui/switch.d.ts.map +1 -0
  27. package/dist/data-table.cjs.map +1 -1
  28. package/dist/data-table.js.map +1 -1
  29. package/dist/file-upload.cjs +1 -1
  30. package/dist/file-upload.cjs.map +1 -1
  31. package/dist/file-upload.js +36 -36
  32. package/dist/file-upload.js.map +1 -1
  33. package/dist/image-reader.cjs +1 -1
  34. package/dist/image-reader.cjs.map +1 -1
  35. package/dist/image-reader.js +1 -0
  36. package/dist/image-reader.js.map +1 -1
  37. package/dist/index.cjs +1 -1
  38. package/dist/index.js +1 -1
  39. package/dist/markdown-reader.cjs +1 -1
  40. package/dist/markdown-reader.cjs.map +1 -1
  41. package/dist/markdown-reader.js +28 -24
  42. package/dist/markdown-reader.js.map +1 -1
  43. package/dist/pdf-reader.cjs +1 -1
  44. package/dist/pdf-reader.cjs.map +1 -1
  45. package/dist/pdf-reader.js +169 -120
  46. package/dist/pdf-reader.js.map +1 -1
  47. package/dist/pdf-sidebar.cjs +1 -1
  48. package/dist/pdf-sidebar.js +1 -1
  49. package/dist/simple-pdf-reader.cjs +1 -1
  50. package/dist/simple-pdf-reader.cjs.map +1 -1
  51. package/dist/simple-pdf-reader.js +137 -104
  52. package/dist/simple-pdf-reader.js.map +1 -1
  53. package/dist/table-header.cjs +1 -1
  54. package/dist/table-header.cjs.map +1 -1
  55. package/dist/table-header.js +42 -34
  56. package/dist/table-header.js.map +1 -1
  57. package/dist/table-pagination.cjs +1 -1
  58. package/dist/table-pagination.cjs.map +1 -1
  59. package/dist/table-pagination.js +49 -43
  60. package/dist/table-pagination.js.map +1 -1
  61. package/dist/types/component-types.d.ts +1 -0
  62. package/dist/types/component-types.d.ts.map +1 -1
  63. package/dist/video-reader.cjs.map +1 -1
  64. package/dist/video-reader.js.map +1 -1
  65. package/package.json +2 -1
  66. package/dist/AuthPanel-C_2JBE7t.cjs +0 -2
  67. package/dist/AuthPanel-C_2JBE7t.cjs.map +0 -1
  68. package/dist/AuthPanel-D2HFX8eN.js.map +0 -1
  69. package/dist/PDFSidebar-BBtucLK6.js +0 -232
  70. package/dist/PDFSidebar-BBtucLK6.js.map +0 -1
  71. package/dist/PDFSidebar-Di0D-yPS.cjs +0 -2
  72. package/dist/PDFSidebar-Di0D-yPS.cjs.map +0 -1
@@ -1,2 +1,2 @@
1
- "use strict";var U=Object.create;var P=Object.defineProperty;var H=Object.getOwnPropertyDescriptor;var L=Object.getOwnPropertyNames;var I=Object.getPrototypeOf,ee=Object.prototype.hasOwnProperty;var te=(e,o,i,_)=>{if(o&&typeof o=="object"||typeof o=="function")for(let d of L(o))!ee.call(e,d)&&d!==i&&P(e,d,{get:()=>o[d],enumerable:!(_=H(o,d))||_.enumerable});return e};var $=(e,o,i)=>(i=e!=null?U(I(e)):{},te(o||!e||!e.__esModule?P(i,"default",{value:e,enumerable:!0}):i,e));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./jsx-runtime-BB_1_6y_.cjs"),a=require("react"),re=require("./utils-IjLH3w2e.cjs"),ne=e=>e?e instanceof Error?e:new Error(e):null,se=e=>e instanceof Error?e:new Error("无法加载 Markdown 渲染依赖"),oe="markdown-reader-content max-w-none text-sm leading-7 text-slate-800 dark:text-slate-100 [&_h1]:mb-4 [&_h1]:mt-0 [&_h1]:text-3xl [&_h1]:font-semibold [&_h2]:mb-3 [&_h2]:mt-8 [&_h2]:text-2xl [&_h2]:font-semibold [&_h3]:mb-2 [&_h3]:mt-6 [&_h3]:text-xl [&_h3]:font-semibold [&_p]:my-4 [&_ul]:my-4 [&_ol]:my-4 [&_li]:my-1 [&_ul]:list-disc [&_ol]:list-decimal [&_ul]:pl-6 [&_ol]:pl-6 [&_blockquote]:my-4 [&_blockquote]:border-l-4 [&_blockquote]:border-slate-300 [&_blockquote]:pl-4 [&_blockquote]:text-slate-600 dark:[&_blockquote]:border-slate-700 dark:[&_blockquote]:text-slate-300 [&_a]:font-medium [&_a]:text-cyan-700 [&_a]:underline-offset-4 hover:[&_a]:underline dark:[&_a]:text-cyan-300 [&_table]:my-4 [&_table]:w-full [&_table]:border-collapse [&_th]:border [&_td]:border [&_th]:border-slate-200 [&_td]:border-slate-200 [&_th]:bg-slate-100 [&_th]:px-3 [&_th]:py-2 [&_td]:px-3 [&_td]:py-2 dark:[&_th]:border-slate-700 dark:[&_td]:border-slate-700 dark:[&_th]:bg-slate-800 [&_pre]:my-4 [&_pre]:overflow-x-auto [&_pre]:rounded-lg [&_pre]:bg-slate-950 [&_pre]:p-4 [&_pre]:text-slate-50 [&_code]:rounded [&_code]:bg-slate-100 [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:text-sm dark:[&_code]:bg-slate-800 [&_pre_code]:bg-transparent [&_pre_code]:p-0 [&_img]:my-4 [&_img]:max-w-full [&_img]:rounded-lg [&_hr]:my-8 [&_hr]:border-slate-200 dark:[&_hr]:border-slate-800";function le({content:e,sourceUrl:o,components:i,loading:_=!1,error:d,className:k,contentClassName:z,loadingText:G="正在加载 Markdown 内容...",errorText:O="Markdown 加载失败",emptyText:A="暂无 Markdown 内容",allowImages:R=!0,openLinksInNewTab:j=!0,transformLinkHref:p,transformImageSrc:h,onLoadError:b}){const[w,B]=a.useState(null),[F,y]=a.useState(!0),[D,M]=a.useState(null),[J,v]=a.useState(""),[K,f]=a.useState(!1),[Q,E]=a.useState(null),c=a.useRef(b),{Card:C,CardContent:q,Skeleton:m}=i||{};a.useEffect(()=>{c.current=b},[b]),a.useEffect(()=>{let r=!0;return(async()=>{var s;y(!0),M(null);try{const[n,u]=await Promise.all([import("react-markdown"),import("remark-gfm")]);if(!r)return;B({ReactMarkdown:n.default,remarkGfm:u.default})}catch(n){if(!r)return;const u=se(n);M(u),(s=c.current)==null||s.call(c,u)}finally{r&&y(!1)}})(),()=>{r=!1}},[]),a.useEffect(()=>{if(e!==void 0||!o){v(""),f(!1),E(null);return}const r=new AbortController;return(async()=>{var s;f(!0),E(null);try{const n=await fetch(o,{signal:r.signal});if(!n.ok)throw new Error(`请求失败:${n.status}`);const u=await n.text();v(u)}catch(n){if(r.signal.aborted)return;const u=n instanceof Error?n:new Error("无法加载 Markdown 内容");E(u),(s=c.current)==null||s.call(c,u)}finally{r.signal.aborted||f(!1)}})(),()=>{r.abort()}},[e,o]);const N=e!==void 0?e:J,x=ne(d)||D||Q,S=_||F||K,V=!S&&!x&&N.trim().length===0,W=a.useMemo(()=>({a({href:r,children:l,...s}){const n=r?(p==null?void 0:p(r))??r:void 0;return t.jsxRuntimeExports.jsx("a",{...s,href:n,target:j?"_blank":s.target,rel:j?"noreferrer noopener":s.rel,children:l})},img({src:r,alt:l,...s}){if(!r)return null;const n=(h==null?void 0:h(r))??r;return R?t.jsxRuntimeExports.jsx("img",{...s,src:n,alt:l||"",loading:"lazy"}):t.jsxRuntimeExports.jsx("a",{href:n,target:"_blank",rel:"noreferrer noopener",children:l||n})},input({checked:r,type:l,...s}){return l!=="checkbox"?t.jsxRuntimeExports.jsx("input",{...s,type:l}):t.jsxRuntimeExports.jsx("input",{...s,type:"checkbox",checked:!!r,readOnly:!0,disabled:!0})}}),[R,j,h,p]),X=()=>t.jsxRuntimeExports.jsx("div",{className:"space-y-3 p-4",role:"status","aria-live":"polite",children:m?t.jsxRuntimeExports.jsxs(t.jsxRuntimeExports.Fragment,{children:[t.jsxRuntimeExports.jsx(m,{className:"h-5 w-2/3"}),t.jsxRuntimeExports.jsx(m,{className:"h-4 w-full"}),t.jsxRuntimeExports.jsx(m,{className:"h-4 w-5/6"}),t.jsxRuntimeExports.jsx(m,{className:"h-28 w-full"})]}):t.jsxRuntimeExports.jsx("p",{className:"text-sm text-muted-foreground",children:G})}),Y=()=>t.jsxRuntimeExports.jsxs("div",{className:"p-4 text-sm text-destructive",role:"alert",children:[t.jsxRuntimeExports.jsx("p",{className:"font-medium",children:O}),x!=null&&x.message?t.jsxRuntimeExports.jsx("p",{className:"mt-1 opacity-80",children:x.message}):null]}),Z=()=>t.jsxRuntimeExports.jsx("div",{className:"p-4 text-sm text-muted-foreground",children:A}),T=()=>{if(S)return X();if(x)return Y();if(V)return Z();if(!w)return null;const{ReactMarkdown:r,remarkGfm:l}=w;return t.jsxRuntimeExports.jsx(r,{remarkPlugins:[l],components:W,children:N})},g=t.jsxRuntimeExports.jsx("div",{className:re.cn(oe,z),children:T()});return C?t.jsxRuntimeExports.jsx(C,{className:k,children:q?t.jsxRuntimeExports.jsx(q,{children:g}):g}):t.jsxRuntimeExports.jsx("div",{className:k,children:g})}exports.MarkdownReader=le;
1
+ "use strict";var U=Object.create;var P=Object.defineProperty;var H=Object.getOwnPropertyDescriptor;var L=Object.getOwnPropertyNames;var I=Object.getPrototypeOf,ee=Object.prototype.hasOwnProperty;var te=(e,o,i,_)=>{if(o&&typeof o=="object"||typeof o=="function")for(let d of L(o))!ee.call(e,d)&&d!==i&&P(e,d,{get:()=>o[d],enumerable:!(_=H(o,d))||_.enumerable});return e};var $=(e,o,i)=>(i=e!=null?U(I(e)):{},te(o||!e||!e.__esModule?P(i,"default",{value:e,enumerable:!0}):i,e));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./jsx-runtime-BB_1_6y_.cjs"),a=require("react"),re=require("./utils-IjLH3w2e.cjs"),ne=e=>e?e instanceof Error?e:new Error(e):null,se=e=>e instanceof Error?e:new Error("无法加载 Markdown 渲染依赖"),oe="markdown-reader-content max-w-none text-sm leading-7 text-slate-800 dark:text-slate-100 [&_h1]:mb-4 [&_h1]:mt-0 [&_h1]:text-3xl [&_h1]:font-semibold [&_h2]:mb-3 [&_h2]:mt-8 [&_h2]:text-2xl [&_h2]:font-semibold [&_h3]:mb-2 [&_h3]:mt-6 [&_h3]:text-xl [&_h3]:font-semibold [&_p]:my-4 [&_ul]:my-4 [&_ol]:my-4 [&_li]:my-1 [&_ul]:list-disc [&_ol]:list-decimal [&_ul]:pl-6 [&_ol]:pl-6 [&_blockquote]:my-4 [&_blockquote]:border-l-4 [&_blockquote]:border-slate-300 [&_blockquote]:pl-4 [&_blockquote]:text-slate-600 dark:[&_blockquote]:border-slate-700 dark:[&_blockquote]:text-slate-300 [&_a]:font-medium [&_a]:text-cyan-700 [&_a]:underline-offset-4 hover:[&_a]:underline dark:[&_a]:text-cyan-300 [&_table]:my-4 [&_table]:w-full [&_table]:border-collapse [&_th]:border [&_td]:border [&_th]:border-slate-200 [&_td]:border-slate-200 [&_th]:bg-slate-100 [&_th]:px-3 [&_th]:py-2 [&_td]:px-3 [&_td]:py-2 dark:[&_th]:border-slate-700 dark:[&_td]:border-slate-700 dark:[&_th]:bg-slate-800 [&_pre]:my-4 [&_pre]:overflow-x-auto [&_pre]:rounded-lg [&_pre]:bg-slate-950 [&_pre]:p-4 [&_pre]:text-slate-50 [&_code]:rounded [&_code]:bg-slate-100 [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:text-sm dark:[&_code]:bg-slate-800 [&_pre_code]:bg-transparent [&_pre_code]:p-0 [&_img]:my-4 [&_img]:max-w-full [&_img]:rounded-lg [&_hr]:my-8 [&_hr]:border-slate-200 dark:[&_hr]:border-slate-800";function le({content:e,sourceUrl:o,components:i,loading:_=!1,error:d,className:k,contentClassName:z,loadingText:G="正在加载 Markdown 内容...",errorText:O="Markdown 加载失败",emptyText:A="暂无 Markdown 内容",allowImages:R=!0,openLinksInNewTab:j=!0,transformLinkHref:p,transformImageSrc:h,onLoadError:b}){const[w,B]=a.useState(null),[F,y]=a.useState(!0),[D,M]=a.useState(null),[J,v]=a.useState(""),[K,f]=a.useState(!1),[Q,E]=a.useState(null),c=a.useRef(b),{Card:C,CardContent:q,Skeleton:m}=i||{};a.useEffect(()=>{c.current=b},[b]),a.useEffect(()=>{let r=!0;return(async()=>{var s;y(!0),M(null);try{const[n,u]=await Promise.all([import("react-markdown"),import("remark-gfm")]);if(!r)return;B({ReactMarkdown:n.default,remarkGfm:u.default})}catch(n){if(!r)return;const u=se(n);M(u),(s=c.current)==null||s.call(c,u)}finally{r&&y(!1)}})(),()=>{r=!1}},[]),a.useEffect(()=>{if(e!==void 0||!o){v(""),f(!1),E(null);return}const r=new AbortController;return(async()=>{var s;f(!0),E(null);try{const n=await fetch(o,{signal:r.signal});if(!n.ok)throw new Error(`请求失败:${n.status}`);const u=await n.text();v(u)}catch(n){if(r.signal.aborted)return;const u=n instanceof Error?n:new Error("无法加载 Markdown 内容");E(u),(s=c.current)==null||s.call(c,u)}finally{r.signal.aborted||f(!1)}})(),()=>{r.abort()}},[e,o]);const N=e!==void 0?e:J,x=ne(d)||D||Q,S=_||F||K,V=!S&&!x&&N.trim().length===0,W=a.useMemo(()=>({a({href:r,children:l,...s}){const n=r?(p==null?void 0:p(r))??r:void 0;return t.jsxRuntimeExports.jsx("a",{...s,href:n,target:j?"_blank":s.target,rel:j?"noreferrer noopener":s.rel,children:l})},img({src:r,alt:l,...s}){if(!r)return null;const n=(h==null?void 0:h(r))??r;return R?t.jsxRuntimeExports.jsx("span",{className:"block overflow-hidden rounded-lg bg-muted/20",children:t.jsxRuntimeExports.jsx("img",{...s,src:n,alt:l||"",loading:"lazy",decoding:"async"})}):t.jsxRuntimeExports.jsx("a",{href:n,target:"_blank",rel:"noreferrer noopener",children:l||n})},input({checked:r,type:l,...s}){return l!=="checkbox"?t.jsxRuntimeExports.jsx("input",{...s,type:l}):t.jsxRuntimeExports.jsx("input",{...s,type:"checkbox",checked:!!r,readOnly:!0,disabled:!0})}}),[R,j,h,p]),X=()=>t.jsxRuntimeExports.jsx("div",{className:"space-y-3 p-4",role:"status","aria-live":"polite",children:m?t.jsxRuntimeExports.jsxs(t.jsxRuntimeExports.Fragment,{children:[t.jsxRuntimeExports.jsx(m,{className:"h-5 w-2/3"}),t.jsxRuntimeExports.jsx(m,{className:"h-4 w-full"}),t.jsxRuntimeExports.jsx(m,{className:"h-4 w-5/6"}),t.jsxRuntimeExports.jsx(m,{className:"h-28 w-full"})]}):t.jsxRuntimeExports.jsx("p",{className:"text-sm text-muted-foreground",children:G})}),Y=()=>t.jsxRuntimeExports.jsxs("div",{className:"p-4 text-sm text-destructive",role:"alert",children:[t.jsxRuntimeExports.jsx("p",{className:"font-medium",children:O}),x!=null&&x.message?t.jsxRuntimeExports.jsx("p",{className:"mt-1 opacity-80",children:x.message}):null]}),Z=()=>t.jsxRuntimeExports.jsx("div",{className:"p-4 text-sm text-muted-foreground",children:A}),T=()=>{if(S)return X();if(x)return Y();if(V)return Z();if(!w)return null;const{ReactMarkdown:r,remarkGfm:l}=w;return t.jsxRuntimeExports.jsx(r,{remarkPlugins:[l],components:W,children:N})},g=t.jsxRuntimeExports.jsx("div",{className:re.cn(oe,z),children:T()});return C?t.jsxRuntimeExports.jsx(C,{className:k,children:q?t.jsxRuntimeExports.jsx(q,{children:g}):g}):t.jsxRuntimeExports.jsx("div",{className:k,children:g})}exports.MarkdownReader=le;
2
2
  //# sourceMappingURL=markdown-reader.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"markdown-reader.cjs","sources":["../src/components/MarkdownReader.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from 'react';\nimport type { ComponentType, HTMLAttributes } from 'react';\n\nimport { cn } from '../lib/utils';\nimport type {\n CardComponent,\n SkeletonComponent,\n UIComponent,\n} from '../types/component-types';\n\nexport interface MarkdownReaderUIComponents {\n Card?: CardComponent;\n CardContent?: UIComponent<HTMLAttributes<HTMLDivElement>>;\n Skeleton?: SkeletonComponent;\n}\n\nexport interface MarkdownReaderProps {\n content?: string;\n sourceUrl?: string;\n components?: MarkdownReaderUIComponents;\n loading?: boolean;\n error?: Error | string | null;\n className?: string;\n contentClassName?: string;\n loadingText?: string;\n errorText?: string;\n emptyText?: string;\n allowImages?: boolean;\n openLinksInNewTab?: boolean;\n transformLinkHref?: (href: string) => string | undefined;\n transformImageSrc?: (src: string) => string | undefined;\n onLoadError?: (error: Error) => void;\n}\n\ninterface MarkdownRuntime {\n ReactMarkdown: ComponentType<any>;\n remarkGfm: unknown;\n}\n\nconst normalizeError = (error: Error | string | null | undefined) => {\n if (!error) return null;\n return error instanceof Error ? error : new Error(error);\n};\n\nconst getMarkdownLoadError = (error: unknown) =>\n error instanceof Error\n ? error\n : new Error('无法加载 Markdown 渲染依赖');\n\nconst defaultContentClassName =\n 'markdown-reader-content max-w-none text-sm leading-7 text-slate-800 dark:text-slate-100 ' +\n '[&_h1]:mb-4 [&_h1]:mt-0 [&_h1]:text-3xl [&_h1]:font-semibold ' +\n '[&_h2]:mb-3 [&_h2]:mt-8 [&_h2]:text-2xl [&_h2]:font-semibold ' +\n '[&_h3]:mb-2 [&_h3]:mt-6 [&_h3]:text-xl [&_h3]:font-semibold ' +\n '[&_p]:my-4 [&_ul]:my-4 [&_ol]:my-4 [&_li]:my-1 [&_ul]:list-disc [&_ol]:list-decimal ' +\n '[&_ul]:pl-6 [&_ol]:pl-6 [&_blockquote]:my-4 [&_blockquote]:border-l-4 ' +\n '[&_blockquote]:border-slate-300 [&_blockquote]:pl-4 [&_blockquote]:text-slate-600 ' +\n 'dark:[&_blockquote]:border-slate-700 dark:[&_blockquote]:text-slate-300 ' +\n '[&_a]:font-medium [&_a]:text-cyan-700 [&_a]:underline-offset-4 hover:[&_a]:underline ' +\n 'dark:[&_a]:text-cyan-300 [&_table]:my-4 [&_table]:w-full [&_table]:border-collapse ' +\n '[&_th]:border [&_td]:border [&_th]:border-slate-200 [&_td]:border-slate-200 ' +\n '[&_th]:bg-slate-100 [&_th]:px-3 [&_th]:py-2 [&_td]:px-3 [&_td]:py-2 ' +\n 'dark:[&_th]:border-slate-700 dark:[&_td]:border-slate-700 dark:[&_th]:bg-slate-800 ' +\n '[&_pre]:my-4 [&_pre]:overflow-x-auto [&_pre]:rounded-lg [&_pre]:bg-slate-950 ' +\n '[&_pre]:p-4 [&_pre]:text-slate-50 [&_code]:rounded [&_code]:bg-slate-100 ' +\n '[&_code]:px-1.5 [&_code]:py-0.5 [&_code]:text-sm dark:[&_code]:bg-slate-800 ' +\n '[&_pre_code]:bg-transparent [&_pre_code]:p-0 [&_img]:my-4 [&_img]:max-w-full ' +\n '[&_img]:rounded-lg [&_hr]:my-8 [&_hr]:border-slate-200 dark:[&_hr]:border-slate-800';\n\nexport function MarkdownReader({\n content,\n sourceUrl,\n components,\n loading = false,\n error,\n className,\n contentClassName,\n loadingText = '正在加载 Markdown 内容...',\n errorText = 'Markdown 加载失败',\n emptyText = '暂无 Markdown 内容',\n allowImages = true,\n openLinksInNewTab = true,\n transformLinkHref,\n transformImageSrc,\n onLoadError,\n}: MarkdownReaderProps) {\n const [runtime, setRuntime] = useState<MarkdownRuntime | null>(null);\n const [runtimeLoading, setRuntimeLoading] = useState(true);\n const [runtimeError, setRuntimeError] = useState<Error | null>(null);\n const [remoteContent, setRemoteContent] = useState('');\n const [remoteLoading, setRemoteLoading] = useState(false);\n const [remoteError, setRemoteError] = useState<Error | null>(null);\n const onLoadErrorRef = useRef(onLoadError);\n\n const { Card, CardContent, Skeleton } = components || {};\n\n useEffect(() => {\n onLoadErrorRef.current = onLoadError;\n }, [onLoadError]);\n\n useEffect(() => {\n let isMounted = true;\n\n const loadRuntime = async () => {\n setRuntimeLoading(true);\n setRuntimeError(null);\n\n try {\n const [markdownModule, gfmModule] = await Promise.all([\n import('react-markdown'),\n import('remark-gfm'),\n ]);\n\n if (!isMounted) return;\n\n setRuntime({\n ReactMarkdown: markdownModule.default,\n remarkGfm: gfmModule.default,\n });\n } catch (err) {\n if (!isMounted) return;\n\n const nextError = getMarkdownLoadError(err);\n setRuntimeError(nextError);\n onLoadErrorRef.current?.(nextError);\n } finally {\n if (isMounted) {\n setRuntimeLoading(false);\n }\n }\n };\n\n loadRuntime();\n\n return () => {\n isMounted = false;\n };\n }, []);\n\n useEffect(() => {\n if (content !== undefined || !sourceUrl) {\n setRemoteContent('');\n setRemoteLoading(false);\n setRemoteError(null);\n return;\n }\n\n const controller = new AbortController();\n\n const loadContent = async () => {\n setRemoteLoading(true);\n setRemoteError(null);\n\n try {\n const response = await fetch(sourceUrl, {\n signal: controller.signal,\n });\n\n if (!response.ok) {\n throw new Error(`请求失败:${response.status}`);\n }\n\n const text = await response.text();\n setRemoteContent(text);\n } catch (err) {\n if (controller.signal.aborted) return;\n\n const nextError =\n err instanceof Error ? err : new Error('无法加载 Markdown 内容');\n setRemoteError(nextError);\n onLoadErrorRef.current?.(nextError);\n } finally {\n if (!controller.signal.aborted) {\n setRemoteLoading(false);\n }\n }\n };\n\n loadContent();\n\n return () => {\n controller.abort();\n };\n }, [content, sourceUrl]);\n\n const markdown = content !== undefined ? content : remoteContent;\n const displayedError = normalizeError(error) || runtimeError || remoteError;\n const isLoading = loading || runtimeLoading || remoteLoading;\n const isEmpty = !isLoading && !displayedError && markdown.trim().length === 0;\n\n const markdownComponents = useMemo(\n () => ({\n a({ href, children, ...props }: any) {\n const nextHref = href ? transformLinkHref?.(href) ?? href : undefined;\n\n return (\n <a\n {...props}\n href={nextHref}\n target={openLinksInNewTab ? '_blank' : props.target}\n rel={openLinksInNewTab ? 'noreferrer noopener' : props.rel}\n >\n {children}\n </a>\n );\n },\n img({ src, alt, ...props }: any) {\n if (!src) return null;\n\n const nextSrc = transformImageSrc?.(src) ?? src;\n\n if (!allowImages) {\n return (\n <a href={nextSrc} target=\"_blank\" rel=\"noreferrer noopener\">\n {alt || nextSrc}\n </a>\n );\n }\n\n return <img {...props} src={nextSrc} alt={alt || ''} loading=\"lazy\" />;\n },\n input({ checked, type, ...props }: any) {\n if (type !== 'checkbox') {\n return <input {...props} type={type} />;\n }\n\n return (\n <input\n {...props}\n type=\"checkbox\"\n checked={Boolean(checked)}\n readOnly\n disabled\n />\n );\n },\n }),\n [\n allowImages,\n openLinksInNewTab,\n transformImageSrc,\n transformLinkHref,\n ]\n );\n\n const renderLoading = () => (\n <div className=\"space-y-3 p-4\" role=\"status\" aria-live=\"polite\">\n {Skeleton ? (\n <>\n <Skeleton className=\"h-5 w-2/3\" />\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-5/6\" />\n <Skeleton className=\"h-28 w-full\" />\n </>\n ) : (\n <p className=\"text-sm text-muted-foreground\">{loadingText}</p>\n )}\n </div>\n );\n\n const renderError = () => (\n <div className=\"p-4 text-sm text-destructive\" role=\"alert\">\n <p className=\"font-medium\">{errorText}</p>\n {displayedError?.message ? (\n <p className=\"mt-1 opacity-80\">{displayedError.message}</p>\n ) : null}\n </div>\n );\n\n const renderEmpty = () => (\n <div className=\"p-4 text-sm text-muted-foreground\">{emptyText}</div>\n );\n\n const renderContent = () => {\n if (isLoading) return renderLoading();\n if (displayedError) return renderError();\n if (isEmpty) return renderEmpty();\n if (!runtime) return null;\n\n const { ReactMarkdown, remarkGfm } = runtime;\n\n return (\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n components={markdownComponents}\n >\n {markdown}\n </ReactMarkdown>\n );\n };\n\n const body = (\n <div className={cn(defaultContentClassName, contentClassName)}>\n {renderContent()}\n </div>\n );\n\n if (Card) {\n return (\n <Card className={className}>\n {CardContent ? <CardContent>{body}</CardContent> : body}\n </Card>\n );\n }\n\n return <div className={className}>{body}</div>;\n}\n"],"names":["normalizeError","error","getMarkdownLoadError","defaultContentClassName","MarkdownReader","content","sourceUrl","components","loading","className","contentClassName","loadingText","errorText","emptyText","allowImages","openLinksInNewTab","transformLinkHref","transformImageSrc","onLoadError","runtime","setRuntime","useState","runtimeLoading","setRuntimeLoading","runtimeError","setRuntimeError","remoteContent","setRemoteContent","remoteLoading","setRemoteLoading","remoteError","setRemoteError","onLoadErrorRef","useRef","Card","CardContent","Skeleton","useEffect","isMounted","markdownModule","gfmModule","err","nextError","_a","controller","response","text","markdown","displayedError","isLoading","isEmpty","markdownComponents","useMemo","href","children","props","nextHref","jsx","src","alt","nextSrc","checked","type","renderLoading","jsxs","Fragment","renderError","renderEmpty","renderContent","ReactMarkdown","remarkGfm","body","cn"],"mappings":"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"}
1
+ {"version":3,"file":"markdown-reader.cjs","sources":["../src/components/MarkdownReader.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from 'react';\nimport type { ComponentType, HTMLAttributes } from 'react';\n\nimport { cn } from '../lib/utils';\nimport type {\n CardComponent,\n SkeletonComponent,\n UIComponent,\n} from '../types/component-types';\n\nexport interface MarkdownReaderUIComponents {\n Card?: CardComponent;\n CardContent?: UIComponent<HTMLAttributes<HTMLDivElement>>;\n Skeleton?: SkeletonComponent;\n}\n\nexport interface MarkdownReaderProps {\n content?: string;\n sourceUrl?: string;\n components?: MarkdownReaderUIComponents;\n loading?: boolean;\n error?: Error | string | null;\n className?: string;\n contentClassName?: string;\n loadingText?: string;\n errorText?: string;\n emptyText?: string;\n allowImages?: boolean;\n openLinksInNewTab?: boolean;\n transformLinkHref?: (href: string) => string | undefined;\n transformImageSrc?: (src: string) => string | undefined;\n onLoadError?: (error: Error) => void;\n}\n\ninterface MarkdownRuntime {\n ReactMarkdown: ComponentType<any>;\n remarkGfm: unknown;\n}\n\nconst normalizeError = (error: Error | string | null | undefined) => {\n if (!error) return null;\n return error instanceof Error ? error : new Error(error);\n};\n\nconst getMarkdownLoadError = (error: unknown) =>\n error instanceof Error ? error : new Error('无法加载 Markdown 渲染依赖');\n\nconst defaultContentClassName =\n 'markdown-reader-content max-w-none text-sm leading-7 text-slate-800 dark:text-slate-100 ' +\n '[&_h1]:mb-4 [&_h1]:mt-0 [&_h1]:text-3xl [&_h1]:font-semibold ' +\n '[&_h2]:mb-3 [&_h2]:mt-8 [&_h2]:text-2xl [&_h2]:font-semibold ' +\n '[&_h3]:mb-2 [&_h3]:mt-6 [&_h3]:text-xl [&_h3]:font-semibold ' +\n '[&_p]:my-4 [&_ul]:my-4 [&_ol]:my-4 [&_li]:my-1 [&_ul]:list-disc [&_ol]:list-decimal ' +\n '[&_ul]:pl-6 [&_ol]:pl-6 [&_blockquote]:my-4 [&_blockquote]:border-l-4 ' +\n '[&_blockquote]:border-slate-300 [&_blockquote]:pl-4 [&_blockquote]:text-slate-600 ' +\n 'dark:[&_blockquote]:border-slate-700 dark:[&_blockquote]:text-slate-300 ' +\n '[&_a]:font-medium [&_a]:text-cyan-700 [&_a]:underline-offset-4 hover:[&_a]:underline ' +\n 'dark:[&_a]:text-cyan-300 [&_table]:my-4 [&_table]:w-full [&_table]:border-collapse ' +\n '[&_th]:border [&_td]:border [&_th]:border-slate-200 [&_td]:border-slate-200 ' +\n '[&_th]:bg-slate-100 [&_th]:px-3 [&_th]:py-2 [&_td]:px-3 [&_td]:py-2 ' +\n 'dark:[&_th]:border-slate-700 dark:[&_td]:border-slate-700 dark:[&_th]:bg-slate-800 ' +\n '[&_pre]:my-4 [&_pre]:overflow-x-auto [&_pre]:rounded-lg [&_pre]:bg-slate-950 ' +\n '[&_pre]:p-4 [&_pre]:text-slate-50 [&_code]:rounded [&_code]:bg-slate-100 ' +\n '[&_code]:px-1.5 [&_code]:py-0.5 [&_code]:text-sm dark:[&_code]:bg-slate-800 ' +\n '[&_pre_code]:bg-transparent [&_pre_code]:p-0 [&_img]:my-4 [&_img]:max-w-full ' +\n '[&_img]:rounded-lg [&_hr]:my-8 [&_hr]:border-slate-200 dark:[&_hr]:border-slate-800';\n\nexport function MarkdownReader({\n content,\n sourceUrl,\n components,\n loading = false,\n error,\n className,\n contentClassName,\n loadingText = '正在加载 Markdown 内容...',\n errorText = 'Markdown 加载失败',\n emptyText = '暂无 Markdown 内容',\n allowImages = true,\n openLinksInNewTab = true,\n transformLinkHref,\n transformImageSrc,\n onLoadError,\n}: MarkdownReaderProps) {\n const [runtime, setRuntime] = useState<MarkdownRuntime | null>(null);\n const [runtimeLoading, setRuntimeLoading] = useState(true);\n const [runtimeError, setRuntimeError] = useState<Error | null>(null);\n const [remoteContent, setRemoteContent] = useState('');\n const [remoteLoading, setRemoteLoading] = useState(false);\n const [remoteError, setRemoteError] = useState<Error | null>(null);\n const onLoadErrorRef = useRef(onLoadError);\n\n const { Card, CardContent, Skeleton } = components || {};\n\n useEffect(() => {\n onLoadErrorRef.current = onLoadError;\n }, [onLoadError]);\n\n useEffect(() => {\n let isMounted = true;\n\n const loadRuntime = async () => {\n setRuntimeLoading(true);\n setRuntimeError(null);\n\n try {\n const [markdownModule, gfmModule] = await Promise.all([\n import('react-markdown'),\n import('remark-gfm'),\n ]);\n\n if (!isMounted) return;\n\n setRuntime({\n ReactMarkdown: markdownModule.default,\n remarkGfm: gfmModule.default,\n });\n } catch (err) {\n if (!isMounted) return;\n\n const nextError = getMarkdownLoadError(err);\n setRuntimeError(nextError);\n onLoadErrorRef.current?.(nextError);\n } finally {\n if (isMounted) {\n setRuntimeLoading(false);\n }\n }\n };\n\n loadRuntime();\n\n return () => {\n isMounted = false;\n };\n }, []);\n\n useEffect(() => {\n if (content !== undefined || !sourceUrl) {\n setRemoteContent('');\n setRemoteLoading(false);\n setRemoteError(null);\n return;\n }\n\n const controller = new AbortController();\n\n const loadContent = async () => {\n setRemoteLoading(true);\n setRemoteError(null);\n\n try {\n const response = await fetch(sourceUrl, {\n signal: controller.signal,\n });\n\n if (!response.ok) {\n throw new Error(`请求失败:${response.status}`);\n }\n\n const text = await response.text();\n setRemoteContent(text);\n } catch (err) {\n if (controller.signal.aborted) return;\n\n const nextError =\n err instanceof Error ? err : new Error('无法加载 Markdown 内容');\n setRemoteError(nextError);\n onLoadErrorRef.current?.(nextError);\n } finally {\n if (!controller.signal.aborted) {\n setRemoteLoading(false);\n }\n }\n };\n\n loadContent();\n\n return () => {\n controller.abort();\n };\n }, [content, sourceUrl]);\n\n const markdown = content !== undefined ? content : remoteContent;\n const displayedError = normalizeError(error) || runtimeError || remoteError;\n const isLoading = loading || runtimeLoading || remoteLoading;\n const isEmpty = !isLoading && !displayedError && markdown.trim().length === 0;\n\n const markdownComponents = useMemo(\n () => ({\n a({ href, children, ...props }: any) {\n const nextHref = href ? (transformLinkHref?.(href) ?? href) : undefined;\n\n return (\n <a\n {...props}\n href={nextHref}\n target={openLinksInNewTab ? '_blank' : props.target}\n rel={openLinksInNewTab ? 'noreferrer noopener' : props.rel}\n >\n {children}\n </a>\n );\n },\n img({ src, alt, ...props }: any) {\n if (!src) return null;\n\n const nextSrc = transformImageSrc?.(src) ?? src;\n\n if (!allowImages) {\n return (\n <a href={nextSrc} target=\"_blank\" rel=\"noreferrer noopener\">\n {alt || nextSrc}\n </a>\n );\n }\n\n return (\n <span className=\"block overflow-hidden rounded-lg bg-muted/20\">\n <img\n {...props}\n src={nextSrc}\n alt={alt || ''}\n loading=\"lazy\"\n decoding=\"async\"\n />\n </span>\n );\n },\n input({ checked, type, ...props }: any) {\n if (type !== 'checkbox') {\n return <input {...props} type={type} />;\n }\n\n return (\n <input\n {...props}\n type=\"checkbox\"\n checked={Boolean(checked)}\n readOnly\n disabled\n />\n );\n },\n }),\n [allowImages, openLinksInNewTab, transformImageSrc, transformLinkHref]\n );\n\n const renderLoading = () => (\n <div className=\"space-y-3 p-4\" role=\"status\" aria-live=\"polite\">\n {Skeleton ? (\n <>\n <Skeleton className=\"h-5 w-2/3\" />\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-5/6\" />\n <Skeleton className=\"h-28 w-full\" />\n </>\n ) : (\n <p className=\"text-sm text-muted-foreground\">{loadingText}</p>\n )}\n </div>\n );\n\n const renderError = () => (\n <div className=\"p-4 text-sm text-destructive\" role=\"alert\">\n <p className=\"font-medium\">{errorText}</p>\n {displayedError?.message ? (\n <p className=\"mt-1 opacity-80\">{displayedError.message}</p>\n ) : null}\n </div>\n );\n\n const renderEmpty = () => (\n <div className=\"p-4 text-sm text-muted-foreground\">{emptyText}</div>\n );\n\n const renderContent = () => {\n if (isLoading) return renderLoading();\n if (displayedError) return renderError();\n if (isEmpty) return renderEmpty();\n if (!runtime) return null;\n\n const { ReactMarkdown, remarkGfm } = runtime;\n\n return (\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n components={markdownComponents}\n >\n {markdown}\n </ReactMarkdown>\n );\n };\n\n const body = (\n <div className={cn(defaultContentClassName, contentClassName)}>\n {renderContent()}\n </div>\n );\n\n if (Card) {\n return (\n <Card className={className}>\n {CardContent ? <CardContent>{body}</CardContent> : body}\n </Card>\n );\n }\n\n return <div className={className}>{body}</div>;\n}\n"],"names":["normalizeError","error","getMarkdownLoadError","defaultContentClassName","MarkdownReader","content","sourceUrl","components","loading","className","contentClassName","loadingText","errorText","emptyText","allowImages","openLinksInNewTab","transformLinkHref","transformImageSrc","onLoadError","runtime","setRuntime","useState","runtimeLoading","setRuntimeLoading","runtimeError","setRuntimeError","remoteContent","setRemoteContent","remoteLoading","setRemoteLoading","remoteError","setRemoteError","onLoadErrorRef","useRef","Card","CardContent","Skeleton","useEffect","isMounted","markdownModule","gfmModule","err","nextError","_a","controller","response","text","markdown","displayedError","isLoading","isEmpty","markdownComponents","useMemo","href","children","props","nextHref","jsx","src","alt","nextSrc","checked","type","renderLoading","jsxs","Fragment","renderError","renderEmpty","renderContent","ReactMarkdown","remarkGfm","body","cn"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { j as e } from "./jsx-runtime-B4hRZ52C.js";
2
- import { useState as i, useRef as T, useEffect as k, useMemo as U } from "react";
2
+ import { useState as c, useRef as T, useEffect as g, useMemo as U } from "react";
3
3
  import { c as H } from "./utils-B6yFEsav.js";
4
4
  const L = (o) => o ? o instanceof Error ? o : new Error(o) : null, I = (o) => o instanceof Error ? o : new Error("无法加载 Markdown 渲染依赖"), ee = "markdown-reader-content max-w-none text-sm leading-7 text-slate-800 dark:text-slate-100 [&_h1]:mb-4 [&_h1]:mt-0 [&_h1]:text-3xl [&_h1]:font-semibold [&_h2]:mb-3 [&_h2]:mt-8 [&_h2]:text-2xl [&_h2]:font-semibold [&_h3]:mb-2 [&_h3]:mt-6 [&_h3]:text-xl [&_h3]:font-semibold [&_p]:my-4 [&_ul]:my-4 [&_ol]:my-4 [&_li]:my-1 [&_ul]:list-disc [&_ol]:list-decimal [&_ul]:pl-6 [&_ol]:pl-6 [&_blockquote]:my-4 [&_blockquote]:border-l-4 [&_blockquote]:border-slate-300 [&_blockquote]:pl-4 [&_blockquote]:text-slate-600 dark:[&_blockquote]:border-slate-700 dark:[&_blockquote]:text-slate-300 [&_a]:font-medium [&_a]:text-cyan-700 [&_a]:underline-offset-4 hover:[&_a]:underline dark:[&_a]:text-cyan-300 [&_table]:my-4 [&_table]:w-full [&_table]:border-collapse [&_th]:border [&_td]:border [&_th]:border-slate-200 [&_td]:border-slate-200 [&_th]:bg-slate-100 [&_th]:px-3 [&_th]:py-2 [&_td]:px-3 [&_td]:py-2 dark:[&_th]:border-slate-700 dark:[&_td]:border-slate-700 dark:[&_th]:bg-slate-800 [&_pre]:my-4 [&_pre]:overflow-x-auto [&_pre]:rounded-lg [&_pre]:bg-slate-950 [&_pre]:p-4 [&_pre]:text-slate-50 [&_code]:rounded [&_code]:bg-slate-100 [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:text-sm dark:[&_code]:bg-slate-800 [&_pre_code]:bg-transparent [&_pre_code]:p-0 [&_img]:my-4 [&_img]:max-w-full [&_img]:rounded-lg [&_hr]:my-8 [&_hr]:border-slate-200 dark:[&_hr]:border-slate-800";
5
5
  function oe({
@@ -8,7 +8,7 @@ function oe({
8
8
  components: q,
9
9
  loading: z = !1,
10
10
  error: G,
11
- className: g,
11
+ className: k,
12
12
  contentClassName: P,
13
13
  loadingText: A = "正在加载 Markdown 内容...",
14
14
  errorText: B = "Markdown 加载失败",
@@ -19,10 +19,10 @@ function oe({
19
19
  transformImageSrc: m,
20
20
  onLoadError: h
21
21
  }) {
22
- const [y, O] = i(null), [$, j] = i(!0), [D, E] = i(null), [J, M] = i(""), [K, b] = i(!1), [Q, f] = i(null), a = T(h), { Card: v, CardContent: C, Skeleton: c } = q || {};
23
- k(() => {
22
+ const [y, O] = c(null), [$, j] = c(!0), [D, E] = c(null), [J, v] = c(""), [K, b] = c(!1), [Q, f] = c(null), a = T(h), { Card: M, CardContent: C, Skeleton: i } = q || {};
23
+ g(() => {
24
24
  a.current = h;
25
- }, [h]), k(() => {
25
+ }, [h]), g(() => {
26
26
  let t = !0;
27
27
  return (async () => {
28
28
  var n;
@@ -47,9 +47,9 @@ function oe({
47
47
  })(), () => {
48
48
  t = !1;
49
49
  };
50
- }, []), k(() => {
50
+ }, []), g(() => {
51
51
  if (o !== void 0 || !_) {
52
- M(""), b(!1), f(null);
52
+ v(""), b(!1), f(null);
53
53
  return;
54
54
  }
55
55
  const t = new AbortController();
@@ -63,7 +63,7 @@ function oe({
63
63
  if (!r.ok)
64
64
  throw new Error(`请求失败:${r.status}`);
65
65
  const s = await r.text();
66
- M(s);
66
+ v(s);
67
67
  } catch (r) {
68
68
  if (t.signal.aborted) return;
69
69
  const s = r instanceof Error ? r : new Error("无法加载 Markdown 内容");
@@ -75,7 +75,7 @@ function oe({
75
75
  t.abort();
76
76
  };
77
77
  }, [o, _]);
78
- const R = o !== void 0 ? o : J, d = L(G) || D || Q, N = z || $ || K, V = !N && !d && R.trim().length === 0, W = U(
78
+ const N = o !== void 0 ? o : J, d = L(G) || D || Q, R = z || $ || K, V = !R && !d && N.trim().length === 0, W = U(
79
79
  () => ({
80
80
  a({ href: t, children: l, ...n }) {
81
81
  const r = t ? (u == null ? void 0 : u(t)) ?? t : void 0;
@@ -93,7 +93,16 @@ function oe({
93
93
  img({ src: t, alt: l, ...n }) {
94
94
  if (!t) return null;
95
95
  const r = (m == null ? void 0 : m(t)) ?? t;
96
- return w ? /* @__PURE__ */ e.jsx("img", { ...n, src: r, alt: l || "", loading: "lazy" }) : /* @__PURE__ */ e.jsx("a", { href: r, target: "_blank", rel: "noreferrer noopener", children: l || r });
96
+ return w ? /* @__PURE__ */ e.jsx("span", { className: "block overflow-hidden rounded-lg bg-muted/20", children: /* @__PURE__ */ e.jsx(
97
+ "img",
98
+ {
99
+ ...n,
100
+ src: r,
101
+ alt: l || "",
102
+ loading: "lazy",
103
+ decoding: "async"
104
+ }
105
+ ) }) : /* @__PURE__ */ e.jsx("a", { href: r, target: "_blank", rel: "noreferrer noopener", children: l || r });
97
106
  },
98
107
  input({ checked: t, type: l, ...n }) {
99
108
  return l !== "checkbox" ? /* @__PURE__ */ e.jsx("input", { ...n, type: l }) : /* @__PURE__ */ e.jsx(
@@ -108,22 +117,17 @@ function oe({
108
117
  );
109
118
  }
110
119
  }),
111
- [
112
- w,
113
- x,
114
- m,
115
- u
116
- ]
117
- ), X = () => /* @__PURE__ */ e.jsx("div", { className: "space-y-3 p-4", role: "status", "aria-live": "polite", children: c ? /* @__PURE__ */ e.jsxs(e.Fragment, { children: [
118
- /* @__PURE__ */ e.jsx(c, { className: "h-5 w-2/3" }),
119
- /* @__PURE__ */ e.jsx(c, { className: "h-4 w-full" }),
120
- /* @__PURE__ */ e.jsx(c, { className: "h-4 w-5/6" }),
121
- /* @__PURE__ */ e.jsx(c, { className: "h-28 w-full" })
120
+ [w, x, m, u]
121
+ ), X = () => /* @__PURE__ */ e.jsx("div", { className: "space-y-3 p-4", role: "status", "aria-live": "polite", children: i ? /* @__PURE__ */ e.jsxs(e.Fragment, { children: [
122
+ /* @__PURE__ */ e.jsx(i, { className: "h-5 w-2/3" }),
123
+ /* @__PURE__ */ e.jsx(i, { className: "h-4 w-full" }),
124
+ /* @__PURE__ */ e.jsx(i, { className: "h-4 w-5/6" }),
125
+ /* @__PURE__ */ e.jsx(i, { className: "h-28 w-full" })
122
126
  ] }) : /* @__PURE__ */ e.jsx("p", { className: "text-sm text-muted-foreground", children: A }) }), Y = () => /* @__PURE__ */ e.jsxs("div", { className: "p-4 text-sm text-destructive", role: "alert", children: [
123
127
  /* @__PURE__ */ e.jsx("p", { className: "font-medium", children: B }),
124
128
  d != null && d.message ? /* @__PURE__ */ e.jsx("p", { className: "mt-1 opacity-80", children: d.message }) : null
125
129
  ] }), Z = () => /* @__PURE__ */ e.jsx("div", { className: "p-4 text-sm text-muted-foreground", children: F }), S = () => {
126
- if (N) return X();
130
+ if (R) return X();
127
131
  if (d) return Y();
128
132
  if (V) return Z();
129
133
  if (!y) return null;
@@ -133,11 +137,11 @@ function oe({
133
137
  {
134
138
  remarkPlugins: [l],
135
139
  components: W,
136
- children: R
140
+ children: N
137
141
  }
138
142
  );
139
143
  }, p = /* @__PURE__ */ e.jsx("div", { className: H(ee, P), children: S() });
140
- return v ? /* @__PURE__ */ e.jsx(v, { className: g, children: C ? /* @__PURE__ */ e.jsx(C, { children: p }) : p }) : /* @__PURE__ */ e.jsx("div", { className: g, children: p });
144
+ return M ? /* @__PURE__ */ e.jsx(M, { className: k, children: C ? /* @__PURE__ */ e.jsx(C, { children: p }) : p }) : /* @__PURE__ */ e.jsx("div", { className: k, children: p });
141
145
  }
142
146
  export {
143
147
  oe as MarkdownReader
@@ -1 +1 @@
1
- {"version":3,"file":"markdown-reader.js","sources":["../src/components/MarkdownReader.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from 'react';\nimport type { ComponentType, HTMLAttributes } from 'react';\n\nimport { cn } from '../lib/utils';\nimport type {\n CardComponent,\n SkeletonComponent,\n UIComponent,\n} from '../types/component-types';\n\nexport interface MarkdownReaderUIComponents {\n Card?: CardComponent;\n CardContent?: UIComponent<HTMLAttributes<HTMLDivElement>>;\n Skeleton?: SkeletonComponent;\n}\n\nexport interface MarkdownReaderProps {\n content?: string;\n sourceUrl?: string;\n components?: MarkdownReaderUIComponents;\n loading?: boolean;\n error?: Error | string | null;\n className?: string;\n contentClassName?: string;\n loadingText?: string;\n errorText?: string;\n emptyText?: string;\n allowImages?: boolean;\n openLinksInNewTab?: boolean;\n transformLinkHref?: (href: string) => string | undefined;\n transformImageSrc?: (src: string) => string | undefined;\n onLoadError?: (error: Error) => void;\n}\n\ninterface MarkdownRuntime {\n ReactMarkdown: ComponentType<any>;\n remarkGfm: unknown;\n}\n\nconst normalizeError = (error: Error | string | null | undefined) => {\n if (!error) return null;\n return error instanceof Error ? error : new Error(error);\n};\n\nconst getMarkdownLoadError = (error: unknown) =>\n error instanceof Error\n ? error\n : new Error('无法加载 Markdown 渲染依赖');\n\nconst defaultContentClassName =\n 'markdown-reader-content max-w-none text-sm leading-7 text-slate-800 dark:text-slate-100 ' +\n '[&_h1]:mb-4 [&_h1]:mt-0 [&_h1]:text-3xl [&_h1]:font-semibold ' +\n '[&_h2]:mb-3 [&_h2]:mt-8 [&_h2]:text-2xl [&_h2]:font-semibold ' +\n '[&_h3]:mb-2 [&_h3]:mt-6 [&_h3]:text-xl [&_h3]:font-semibold ' +\n '[&_p]:my-4 [&_ul]:my-4 [&_ol]:my-4 [&_li]:my-1 [&_ul]:list-disc [&_ol]:list-decimal ' +\n '[&_ul]:pl-6 [&_ol]:pl-6 [&_blockquote]:my-4 [&_blockquote]:border-l-4 ' +\n '[&_blockquote]:border-slate-300 [&_blockquote]:pl-4 [&_blockquote]:text-slate-600 ' +\n 'dark:[&_blockquote]:border-slate-700 dark:[&_blockquote]:text-slate-300 ' +\n '[&_a]:font-medium [&_a]:text-cyan-700 [&_a]:underline-offset-4 hover:[&_a]:underline ' +\n 'dark:[&_a]:text-cyan-300 [&_table]:my-4 [&_table]:w-full [&_table]:border-collapse ' +\n '[&_th]:border [&_td]:border [&_th]:border-slate-200 [&_td]:border-slate-200 ' +\n '[&_th]:bg-slate-100 [&_th]:px-3 [&_th]:py-2 [&_td]:px-3 [&_td]:py-2 ' +\n 'dark:[&_th]:border-slate-700 dark:[&_td]:border-slate-700 dark:[&_th]:bg-slate-800 ' +\n '[&_pre]:my-4 [&_pre]:overflow-x-auto [&_pre]:rounded-lg [&_pre]:bg-slate-950 ' +\n '[&_pre]:p-4 [&_pre]:text-slate-50 [&_code]:rounded [&_code]:bg-slate-100 ' +\n '[&_code]:px-1.5 [&_code]:py-0.5 [&_code]:text-sm dark:[&_code]:bg-slate-800 ' +\n '[&_pre_code]:bg-transparent [&_pre_code]:p-0 [&_img]:my-4 [&_img]:max-w-full ' +\n '[&_img]:rounded-lg [&_hr]:my-8 [&_hr]:border-slate-200 dark:[&_hr]:border-slate-800';\n\nexport function MarkdownReader({\n content,\n sourceUrl,\n components,\n loading = false,\n error,\n className,\n contentClassName,\n loadingText = '正在加载 Markdown 内容...',\n errorText = 'Markdown 加载失败',\n emptyText = '暂无 Markdown 内容',\n allowImages = true,\n openLinksInNewTab = true,\n transformLinkHref,\n transformImageSrc,\n onLoadError,\n}: MarkdownReaderProps) {\n const [runtime, setRuntime] = useState<MarkdownRuntime | null>(null);\n const [runtimeLoading, setRuntimeLoading] = useState(true);\n const [runtimeError, setRuntimeError] = useState<Error | null>(null);\n const [remoteContent, setRemoteContent] = useState('');\n const [remoteLoading, setRemoteLoading] = useState(false);\n const [remoteError, setRemoteError] = useState<Error | null>(null);\n const onLoadErrorRef = useRef(onLoadError);\n\n const { Card, CardContent, Skeleton } = components || {};\n\n useEffect(() => {\n onLoadErrorRef.current = onLoadError;\n }, [onLoadError]);\n\n useEffect(() => {\n let isMounted = true;\n\n const loadRuntime = async () => {\n setRuntimeLoading(true);\n setRuntimeError(null);\n\n try {\n const [markdownModule, gfmModule] = await Promise.all([\n import('react-markdown'),\n import('remark-gfm'),\n ]);\n\n if (!isMounted) return;\n\n setRuntime({\n ReactMarkdown: markdownModule.default,\n remarkGfm: gfmModule.default,\n });\n } catch (err) {\n if (!isMounted) return;\n\n const nextError = getMarkdownLoadError(err);\n setRuntimeError(nextError);\n onLoadErrorRef.current?.(nextError);\n } finally {\n if (isMounted) {\n setRuntimeLoading(false);\n }\n }\n };\n\n loadRuntime();\n\n return () => {\n isMounted = false;\n };\n }, []);\n\n useEffect(() => {\n if (content !== undefined || !sourceUrl) {\n setRemoteContent('');\n setRemoteLoading(false);\n setRemoteError(null);\n return;\n }\n\n const controller = new AbortController();\n\n const loadContent = async () => {\n setRemoteLoading(true);\n setRemoteError(null);\n\n try {\n const response = await fetch(sourceUrl, {\n signal: controller.signal,\n });\n\n if (!response.ok) {\n throw new Error(`请求失败:${response.status}`);\n }\n\n const text = await response.text();\n setRemoteContent(text);\n } catch (err) {\n if (controller.signal.aborted) return;\n\n const nextError =\n err instanceof Error ? err : new Error('无法加载 Markdown 内容');\n setRemoteError(nextError);\n onLoadErrorRef.current?.(nextError);\n } finally {\n if (!controller.signal.aborted) {\n setRemoteLoading(false);\n }\n }\n };\n\n loadContent();\n\n return () => {\n controller.abort();\n };\n }, [content, sourceUrl]);\n\n const markdown = content !== undefined ? content : remoteContent;\n const displayedError = normalizeError(error) || runtimeError || remoteError;\n const isLoading = loading || runtimeLoading || remoteLoading;\n const isEmpty = !isLoading && !displayedError && markdown.trim().length === 0;\n\n const markdownComponents = useMemo(\n () => ({\n a({ href, children, ...props }: any) {\n const nextHref = href ? transformLinkHref?.(href) ?? href : undefined;\n\n return (\n <a\n {...props}\n href={nextHref}\n target={openLinksInNewTab ? '_blank' : props.target}\n rel={openLinksInNewTab ? 'noreferrer noopener' : props.rel}\n >\n {children}\n </a>\n );\n },\n img({ src, alt, ...props }: any) {\n if (!src) return null;\n\n const nextSrc = transformImageSrc?.(src) ?? src;\n\n if (!allowImages) {\n return (\n <a href={nextSrc} target=\"_blank\" rel=\"noreferrer noopener\">\n {alt || nextSrc}\n </a>\n );\n }\n\n return <img {...props} src={nextSrc} alt={alt || ''} loading=\"lazy\" />;\n },\n input({ checked, type, ...props }: any) {\n if (type !== 'checkbox') {\n return <input {...props} type={type} />;\n }\n\n return (\n <input\n {...props}\n type=\"checkbox\"\n checked={Boolean(checked)}\n readOnly\n disabled\n />\n );\n },\n }),\n [\n allowImages,\n openLinksInNewTab,\n transformImageSrc,\n transformLinkHref,\n ]\n );\n\n const renderLoading = () => (\n <div className=\"space-y-3 p-4\" role=\"status\" aria-live=\"polite\">\n {Skeleton ? (\n <>\n <Skeleton className=\"h-5 w-2/3\" />\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-5/6\" />\n <Skeleton className=\"h-28 w-full\" />\n </>\n ) : (\n <p className=\"text-sm text-muted-foreground\">{loadingText}</p>\n )}\n </div>\n );\n\n const renderError = () => (\n <div className=\"p-4 text-sm text-destructive\" role=\"alert\">\n <p className=\"font-medium\">{errorText}</p>\n {displayedError?.message ? (\n <p className=\"mt-1 opacity-80\">{displayedError.message}</p>\n ) : null}\n </div>\n );\n\n const renderEmpty = () => (\n <div className=\"p-4 text-sm text-muted-foreground\">{emptyText}</div>\n );\n\n const renderContent = () => {\n if (isLoading) return renderLoading();\n if (displayedError) return renderError();\n if (isEmpty) return renderEmpty();\n if (!runtime) return null;\n\n const { ReactMarkdown, remarkGfm } = runtime;\n\n return (\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n components={markdownComponents}\n >\n {markdown}\n </ReactMarkdown>\n );\n };\n\n const body = (\n <div className={cn(defaultContentClassName, contentClassName)}>\n {renderContent()}\n </div>\n );\n\n if (Card) {\n return (\n <Card className={className}>\n {CardContent ? <CardContent>{body}</CardContent> : body}\n </Card>\n );\n }\n\n return <div className={className}>{body}</div>;\n}\n"],"names":["normalizeError","error","getMarkdownLoadError","defaultContentClassName","MarkdownReader","content","sourceUrl","components","loading","className","contentClassName","loadingText","errorText","emptyText","allowImages","openLinksInNewTab","transformLinkHref","transformImageSrc","onLoadError","runtime","setRuntime","useState","runtimeLoading","setRuntimeLoading","runtimeError","setRuntimeError","remoteContent","setRemoteContent","remoteLoading","setRemoteLoading","remoteError","setRemoteError","onLoadErrorRef","useRef","Card","CardContent","Skeleton","useEffect","isMounted","markdownModule","gfmModule","err","nextError","_a","controller","response","text","markdown","displayedError","isLoading","isEmpty","markdownComponents","useMemo","href","children","props","nextHref","jsx","src","alt","nextSrc","checked","type","renderLoading","jsxs","Fragment","renderError","renderEmpty","renderContent","ReactMarkdown","remarkGfm","body","cn"],"mappings":"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"}
1
+ {"version":3,"file":"markdown-reader.js","sources":["../src/components/MarkdownReader.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from 'react';\nimport type { ComponentType, HTMLAttributes } from 'react';\n\nimport { cn } from '../lib/utils';\nimport type {\n CardComponent,\n SkeletonComponent,\n UIComponent,\n} from '../types/component-types';\n\nexport interface MarkdownReaderUIComponents {\n Card?: CardComponent;\n CardContent?: UIComponent<HTMLAttributes<HTMLDivElement>>;\n Skeleton?: SkeletonComponent;\n}\n\nexport interface MarkdownReaderProps {\n content?: string;\n sourceUrl?: string;\n components?: MarkdownReaderUIComponents;\n loading?: boolean;\n error?: Error | string | null;\n className?: string;\n contentClassName?: string;\n loadingText?: string;\n errorText?: string;\n emptyText?: string;\n allowImages?: boolean;\n openLinksInNewTab?: boolean;\n transformLinkHref?: (href: string) => string | undefined;\n transformImageSrc?: (src: string) => string | undefined;\n onLoadError?: (error: Error) => void;\n}\n\ninterface MarkdownRuntime {\n ReactMarkdown: ComponentType<any>;\n remarkGfm: unknown;\n}\n\nconst normalizeError = (error: Error | string | null | undefined) => {\n if (!error) return null;\n return error instanceof Error ? error : new Error(error);\n};\n\nconst getMarkdownLoadError = (error: unknown) =>\n error instanceof Error ? error : new Error('无法加载 Markdown 渲染依赖');\n\nconst defaultContentClassName =\n 'markdown-reader-content max-w-none text-sm leading-7 text-slate-800 dark:text-slate-100 ' +\n '[&_h1]:mb-4 [&_h1]:mt-0 [&_h1]:text-3xl [&_h1]:font-semibold ' +\n '[&_h2]:mb-3 [&_h2]:mt-8 [&_h2]:text-2xl [&_h2]:font-semibold ' +\n '[&_h3]:mb-2 [&_h3]:mt-6 [&_h3]:text-xl [&_h3]:font-semibold ' +\n '[&_p]:my-4 [&_ul]:my-4 [&_ol]:my-4 [&_li]:my-1 [&_ul]:list-disc [&_ol]:list-decimal ' +\n '[&_ul]:pl-6 [&_ol]:pl-6 [&_blockquote]:my-4 [&_blockquote]:border-l-4 ' +\n '[&_blockquote]:border-slate-300 [&_blockquote]:pl-4 [&_blockquote]:text-slate-600 ' +\n 'dark:[&_blockquote]:border-slate-700 dark:[&_blockquote]:text-slate-300 ' +\n '[&_a]:font-medium [&_a]:text-cyan-700 [&_a]:underline-offset-4 hover:[&_a]:underline ' +\n 'dark:[&_a]:text-cyan-300 [&_table]:my-4 [&_table]:w-full [&_table]:border-collapse ' +\n '[&_th]:border [&_td]:border [&_th]:border-slate-200 [&_td]:border-slate-200 ' +\n '[&_th]:bg-slate-100 [&_th]:px-3 [&_th]:py-2 [&_td]:px-3 [&_td]:py-2 ' +\n 'dark:[&_th]:border-slate-700 dark:[&_td]:border-slate-700 dark:[&_th]:bg-slate-800 ' +\n '[&_pre]:my-4 [&_pre]:overflow-x-auto [&_pre]:rounded-lg [&_pre]:bg-slate-950 ' +\n '[&_pre]:p-4 [&_pre]:text-slate-50 [&_code]:rounded [&_code]:bg-slate-100 ' +\n '[&_code]:px-1.5 [&_code]:py-0.5 [&_code]:text-sm dark:[&_code]:bg-slate-800 ' +\n '[&_pre_code]:bg-transparent [&_pre_code]:p-0 [&_img]:my-4 [&_img]:max-w-full ' +\n '[&_img]:rounded-lg [&_hr]:my-8 [&_hr]:border-slate-200 dark:[&_hr]:border-slate-800';\n\nexport function MarkdownReader({\n content,\n sourceUrl,\n components,\n loading = false,\n error,\n className,\n contentClassName,\n loadingText = '正在加载 Markdown 内容...',\n errorText = 'Markdown 加载失败',\n emptyText = '暂无 Markdown 内容',\n allowImages = true,\n openLinksInNewTab = true,\n transformLinkHref,\n transformImageSrc,\n onLoadError,\n}: MarkdownReaderProps) {\n const [runtime, setRuntime] = useState<MarkdownRuntime | null>(null);\n const [runtimeLoading, setRuntimeLoading] = useState(true);\n const [runtimeError, setRuntimeError] = useState<Error | null>(null);\n const [remoteContent, setRemoteContent] = useState('');\n const [remoteLoading, setRemoteLoading] = useState(false);\n const [remoteError, setRemoteError] = useState<Error | null>(null);\n const onLoadErrorRef = useRef(onLoadError);\n\n const { Card, CardContent, Skeleton } = components || {};\n\n useEffect(() => {\n onLoadErrorRef.current = onLoadError;\n }, [onLoadError]);\n\n useEffect(() => {\n let isMounted = true;\n\n const loadRuntime = async () => {\n setRuntimeLoading(true);\n setRuntimeError(null);\n\n try {\n const [markdownModule, gfmModule] = await Promise.all([\n import('react-markdown'),\n import('remark-gfm'),\n ]);\n\n if (!isMounted) return;\n\n setRuntime({\n ReactMarkdown: markdownModule.default,\n remarkGfm: gfmModule.default,\n });\n } catch (err) {\n if (!isMounted) return;\n\n const nextError = getMarkdownLoadError(err);\n setRuntimeError(nextError);\n onLoadErrorRef.current?.(nextError);\n } finally {\n if (isMounted) {\n setRuntimeLoading(false);\n }\n }\n };\n\n loadRuntime();\n\n return () => {\n isMounted = false;\n };\n }, []);\n\n useEffect(() => {\n if (content !== undefined || !sourceUrl) {\n setRemoteContent('');\n setRemoteLoading(false);\n setRemoteError(null);\n return;\n }\n\n const controller = new AbortController();\n\n const loadContent = async () => {\n setRemoteLoading(true);\n setRemoteError(null);\n\n try {\n const response = await fetch(sourceUrl, {\n signal: controller.signal,\n });\n\n if (!response.ok) {\n throw new Error(`请求失败:${response.status}`);\n }\n\n const text = await response.text();\n setRemoteContent(text);\n } catch (err) {\n if (controller.signal.aborted) return;\n\n const nextError =\n err instanceof Error ? err : new Error('无法加载 Markdown 内容');\n setRemoteError(nextError);\n onLoadErrorRef.current?.(nextError);\n } finally {\n if (!controller.signal.aborted) {\n setRemoteLoading(false);\n }\n }\n };\n\n loadContent();\n\n return () => {\n controller.abort();\n };\n }, [content, sourceUrl]);\n\n const markdown = content !== undefined ? content : remoteContent;\n const displayedError = normalizeError(error) || runtimeError || remoteError;\n const isLoading = loading || runtimeLoading || remoteLoading;\n const isEmpty = !isLoading && !displayedError && markdown.trim().length === 0;\n\n const markdownComponents = useMemo(\n () => ({\n a({ href, children, ...props }: any) {\n const nextHref = href ? (transformLinkHref?.(href) ?? href) : undefined;\n\n return (\n <a\n {...props}\n href={nextHref}\n target={openLinksInNewTab ? '_blank' : props.target}\n rel={openLinksInNewTab ? 'noreferrer noopener' : props.rel}\n >\n {children}\n </a>\n );\n },\n img({ src, alt, ...props }: any) {\n if (!src) return null;\n\n const nextSrc = transformImageSrc?.(src) ?? src;\n\n if (!allowImages) {\n return (\n <a href={nextSrc} target=\"_blank\" rel=\"noreferrer noopener\">\n {alt || nextSrc}\n </a>\n );\n }\n\n return (\n <span className=\"block overflow-hidden rounded-lg bg-muted/20\">\n <img\n {...props}\n src={nextSrc}\n alt={alt || ''}\n loading=\"lazy\"\n decoding=\"async\"\n />\n </span>\n );\n },\n input({ checked, type, ...props }: any) {\n if (type !== 'checkbox') {\n return <input {...props} type={type} />;\n }\n\n return (\n <input\n {...props}\n type=\"checkbox\"\n checked={Boolean(checked)}\n readOnly\n disabled\n />\n );\n },\n }),\n [allowImages, openLinksInNewTab, transformImageSrc, transformLinkHref]\n );\n\n const renderLoading = () => (\n <div className=\"space-y-3 p-4\" role=\"status\" aria-live=\"polite\">\n {Skeleton ? (\n <>\n <Skeleton className=\"h-5 w-2/3\" />\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-5/6\" />\n <Skeleton className=\"h-28 w-full\" />\n </>\n ) : (\n <p className=\"text-sm text-muted-foreground\">{loadingText}</p>\n )}\n </div>\n );\n\n const renderError = () => (\n <div className=\"p-4 text-sm text-destructive\" role=\"alert\">\n <p className=\"font-medium\">{errorText}</p>\n {displayedError?.message ? (\n <p className=\"mt-1 opacity-80\">{displayedError.message}</p>\n ) : null}\n </div>\n );\n\n const renderEmpty = () => (\n <div className=\"p-4 text-sm text-muted-foreground\">{emptyText}</div>\n );\n\n const renderContent = () => {\n if (isLoading) return renderLoading();\n if (displayedError) return renderError();\n if (isEmpty) return renderEmpty();\n if (!runtime) return null;\n\n const { ReactMarkdown, remarkGfm } = runtime;\n\n return (\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n components={markdownComponents}\n >\n {markdown}\n </ReactMarkdown>\n );\n };\n\n const body = (\n <div className={cn(defaultContentClassName, contentClassName)}>\n {renderContent()}\n </div>\n );\n\n if (Card) {\n return (\n <Card className={className}>\n {CardContent ? <CardContent>{body}</CardContent> : body}\n </Card>\n );\n }\n\n return <div className={className}>{body}</div>;\n}\n"],"names":["normalizeError","error","getMarkdownLoadError","defaultContentClassName","MarkdownReader","content","sourceUrl","components","loading","className","contentClassName","loadingText","errorText","emptyText","allowImages","openLinksInNewTab","transformLinkHref","transformImageSrc","onLoadError","runtime","setRuntime","useState","runtimeLoading","setRuntimeLoading","runtimeError","setRuntimeError","remoteContent","setRemoteContent","remoteLoading","setRemoteLoading","remoteError","setRemoteError","onLoadErrorRef","useRef","Card","CardContent","Skeleton","useEffect","isMounted","markdownModule","gfmModule","err","nextError","_a","controller","response","text","markdown","displayedError","isLoading","isEmpty","markdownComponents","useMemo","href","children","props","nextHref","jsx","src","alt","nextSrc","checked","type","renderLoading","jsxs","Fragment","renderError","renderEmpty","renderContent","ReactMarkdown","remarkGfm","body","cn"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";var Be=Object.create;var ue=Object.defineProperty;var Ve=Object.getOwnPropertyDescriptor;var Ze=Object.getOwnPropertyNames;var Xe=Object.getPrototypeOf,Ye=Object.prototype.hasOwnProperty;var Je=(l,a,f,v)=>{if(a&&typeof a=="object"||typeof a=="function")for(let h of Ze(a))!Ye.call(l,h)&&h!==f&&ue(l,h,{get:()=>a[h],enumerable:!(v=Ve(a,h))||v.enumerable});return l};var Qe=(l,a,f)=>(f=l!=null?Be(Xe(l)):{},Je(a||!l||!l.__esModule?ue(f,"default",{value:l,enumerable:!0}):f,l));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./jsx-runtime-BB_1_6y_.cjs"),d=require("lucide-react"),n=require("react"),He=require("./PDFSidebar-Di0D-yPS.cjs");function Ue(l,a){const f=n.useRef(void 0);return n.useCallback((...v)=>{f.current&&clearTimeout(f.current),f.current=setTimeout(()=>l(...v),a)},[l,a])}function et({url:l,initialPage:a=1,initialScale:f=1,initialRotation:v=0,currentPage:h,onPageChange:D,scale:$,onScaleChange:P,rotation:W,onRotationChange:S,minScale:L=.5,maxScale:G=2.5,showToolbar:ae=!0,showSidebar:R=!0,showRotation:xe=!0,showModeToggle:me=!0,showFullscreen:de=!0,enableHotkeys:Q=!0,enableMobileNav:fe=!0,displayMode:pe="single",className:je,toolbarClassName:he,contentClassName:Ee,contentHeight:be="80vh",pageClassName:H,workerUrl:q,cMapUrl:y,standardFontDataUrl:T,components:x,onLoadSuccess:M,onLoadError:E,onPageRender:g,loadingText:ve="正在加载PDF文档...",errorText:U="PDF加载失败"}){const[ee,K]=n.useState(null),[Re,_]=n.useState(a),[ge,ke]=n.useState(f),[ye,Te]=n.useState(v),[Ne,F]=n.useState(!1),[N,z]=n.useState(null),[p,B]=n.useState(0),[te,V]=n.useState(!1),[C,se]=n.useState(pe==="scroll"),[Z,ne]=n.useState(R);n.useEffect(()=>{ne(R)},[R]);const[re,Ce]=n.useState(void 0),[ie,we]=n.useState(null),le=n.useRef(null),A=n.useRef(null),X=n.useRef(new Map),i=h??Re,b=$??ge,I=W??ye,k=h!==void 0,u=C,{Card:De,CardContent:Pe,Button:j,Input:Se,Skeleton:Me}=x||{};n.useEffect(()=>{K(null),B(0),z(null),F(!1),k||_(Math.max(1,a))},[l,a,k]);const Fe=n.useMemo(()=>{const e={withCredentials:!1};return y&&(e.cMapUrl=y,e.cMapPacked=!0),T&&(e.standardFontDataUrl=T),e},[y,T]);n.useEffect(()=>{let e=!0;return(async()=>{try{const c=await import("react-pdf");if(typeof window<"u"){const r=c.pdfjs,o=r==null?void 0:r.version;r!=null&&r.GlobalWorkerOptions&&o&&(q?r.GlobalWorkerOptions.workerSrc=q:r.GlobalWorkerOptions.workerSrc=`https://cdn.jsdelivr.net/npm/pdfjs-dist@${o}/build/pdf.worker.min.mjs`,!y&&r.GlobalWorkerOptions&&(r.GlobalWorkerOptions.cMapUrl=`https://unpkg.com/pdfjs-dist@${o}/cmaps/`),!T&&r.GlobalWorkerOptions&&(r.GlobalWorkerOptions.standardFontDataUrl=`https://unpkg.com/pdfjs-dist@${o}/standard_fonts/`))}e&&we(c)}catch(c){if(e){const r=c instanceof Error?c:new Error("无法加载 react-pdf 库");z(r),F(!1),E==null||E(r)}}})(),()=>{e=!1}},[q,y,T,E]);const ze=n.useCallback(e=>{console.error("PDF加载失败:",e),console.error("PDF URL:",l),K(null),B(0),z(new Error(`${U}: ${e.message||"请检查文件路径或网络连接"}`)),F(!1),E==null||E(e)},[l,U,E]),Ae=n.useCallback(e=>{K(e),B(e.numPages),z(null),F(!1),k||_(s=>Math.max(1,Math.min(s,Math.max(e.numPages,1)))),M==null||M(e)},[k,M]),m=n.useCallback(e=>{if(!Number.isFinite(e))return;const s=p>0?Math.max(1,Math.min(Math.trunc(e),p)):Math.max(1,Math.trunc(e));k||_(s),s!==i&&(D==null||D(s))},[p,k,i,D]),Ie=n.useCallback((e,s)=>{s?X.current.set(e,s):X.current.delete(e)},[]),Oe=n.useCallback(()=>{const e=A.current;if(!e||!u||p<=0)return;const s=e.getBoundingClientRect().top;let c=i,r=Number.POSITIVE_INFINITY;X.current.forEach((o,O)=>{const oe=Math.abs(o.getBoundingClientRect().top-s);oe<r&&(r=oe,c=O)}),c!==i&&m(c)},[i,m,u,p]),w=n.useCallback(e=>{const s=Math.max(L,Math.min(G,b+e));$===void 0&&ke(s),P==null||P(s)},[b,L,G,$,P]),$e=n.useCallback(()=>{const e=(I+90)%360;W===void 0&&Te(e),S==null||S(e)},[I,W,S]),ce=Ue(e=>{Ce(e)},100);n.useEffect(()=>{if(!A.current)return;const e=A.current,s=()=>{ce(e.clientWidth)};s();const c=new ResizeObserver(()=>{s()});return c.observe(e),()=>{c.disconnect()}},[ce]),n.useEffect(()=>{if(!Q)return;const e=s=>{const c=s.target,r=typeof document<"u"?document.activeElement:null,o=c||r,O=o==null?void 0:o.getAttribute("role");o&&(o.tagName==="INPUT"||o.tagName==="TEXTAREA"||o.tagName==="SELECT"||o.isContentEditable||O==="textbox"||O==="spinbutton")||((s.ctrlKey||s.metaKey)&&(s.key==="="||s.key==="+")?(s.preventDefault(),w(.1)):(s.ctrlKey||s.metaKey)&&s.key==="-"?(s.preventDefault(),w(-.1)):!u&&s.key==="ArrowLeft"?(s.preventDefault(),m(i-1)):!u&&s.key==="ArrowRight"&&(s.preventDefault(),m(i+1)))};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}},[Q,i,m,u,w]);const We=n.useCallback(async()=>{var e,s;if(!(typeof document>"u"))if(document.fullscreenElement)document.exitFullscreen&&(await document.exitFullscreen(),V(!1));else try{await((s=(e=le.current)==null?void 0:e.requestFullscreen)==null?void 0:s.call(e)),V(!0)}catch(c){console.error("Error attempting to enable fullscreen:",c)}},[]);n.useEffect(()=>{if(typeof document>"u")return;const e=()=>{V(!!document.fullscreenElement)};return document.addEventListener("fullscreenchange",e),()=>{document.removeEventListener("fullscreenchange",e)}},[]);const Le=n.useCallback(e=>{m(e),se(!1)},[m]),Ge=()=>ae?t.jsxRuntimeExports.jsxs("div",{className:`flex items-center justify-between gap-4 border-b px-4 py-2 ${he||""}`,children:[t.jsxRuntimeExports.jsxs("div",{className:"flex items-center gap-2",children:[R&&t.jsxRuntimeExports.jsx(j,{variant:"outline",size:"icon",onClick:()=>ne(!Z),title:Z?"隐藏侧边栏":"显示侧边栏",children:t.jsxRuntimeExports.jsx(d.PanelLeft,{})}),t.jsxRuntimeExports.jsx(j,{variant:"outline",size:"icon",onClick:()=>w(-.1),disabled:b<=L,children:t.jsxRuntimeExports.jsx(d.ZoomOut,{})}),t.jsxRuntimeExports.jsxs("span",{className:"min-w-[3rem] text-center text-sm",children:[Math.round(b*100),"%"]}),t.jsxRuntimeExports.jsx(j,{variant:"outline",size:"icon",onClick:()=>w(.1),disabled:b>=G,children:t.jsxRuntimeExports.jsx(d.ZoomIn,{})}),xe&&t.jsxRuntimeExports.jsx(j,{variant:"outline",size:"icon",onClick:$e,children:t.jsxRuntimeExports.jsx(d.RotateCw,{})}),me&&t.jsxRuntimeExports.jsx(j,{variant:"outline",size:"icon",onClick:()=>se(!C),title:C?"单页模式":"滚动模式",children:C?t.jsxRuntimeExports.jsx(d.ScrollText,{}):t.jsxRuntimeExports.jsx(d.FileText,{})}),de&&t.jsxRuntimeExports.jsx(j,{variant:"outline",size:"icon",onClick:We,children:te?t.jsxRuntimeExports.jsx(d.Minimize2,{}):t.jsxRuntimeExports.jsx(d.Maximize2,{})})]}),t.jsxRuntimeExports.jsxs("div",{className:"flex items-center gap-2",children:[!u&&t.jsxRuntimeExports.jsx(j,{variant:"outline",size:"icon",onClick:()=>m(i-1),disabled:i<=1,children:t.jsxRuntimeExports.jsx(d.ChevronLeft,{})}),t.jsxRuntimeExports.jsx(Se,{type:"number",min:1,max:p,value:i,onChange:e=>m(parseInt(e.target.value)||1),disabled:u,readOnly:u,title:u?"滚动模式下页码仅显示当前位置":void 0,className:"w-16 text-center"}),t.jsxRuntimeExports.jsxs("span",{className:"text-sm text-muted-foreground",children:["/ ",p]}),!u&&t.jsxRuntimeExports.jsx(j,{variant:"outline",size:"icon",onClick:()=>m(i+1),disabled:p>0&&i>=p,children:t.jsxRuntimeExports.jsx(d.ChevronRight,{})})]})]}):null,Y=()=>t.jsxRuntimeExports.jsx("div",{className:"flex h-full items-center justify-center",children:t.jsxRuntimeExports.jsx("p",{className:"text-muted-foreground",children:ve})}),J=()=>t.jsxRuntimeExports.jsx("div",{className:"flex h-full min-h-[400px] items-center justify-center px-4 text-center text-destructive",children:t.jsxRuntimeExports.jsxs("div",{className:"max-w-md",children:[t.jsxRuntimeExports.jsx("p",{className:"mb-2 text-lg font-medium",children:"文件加载失败"}),t.jsxRuntimeExports.jsx("p",{className:"text-sm opacity-80",children:N==null?void 0:N.message})]})}),qe=()=>{if(!ie)return Y();const{Document:e,Page:s}=ie;return t.jsxRuntimeExports.jsx("div",{ref:A,onScroll:u?Oe:void 0,className:`pdf-container flex-1 overflow-y-auto ${Ee||""}`,children:t.jsxRuntimeExports.jsx("div",{className:"flex min-h-full justify-center px-4",children:t.jsxRuntimeExports.jsx(e,{file:l,onLoadError:ze,options:Fe,loading:Y(),error:J(),onLoadSuccess:Ae,children:N?J():C?Array.from(new Array(p),(c,r)=>t.jsxRuntimeExports.jsx("div",{ref:o=>Ie(r+1,o),"data-page-number":r+1,className:`mb-4 ${H||""}`,children:t.jsxRuntimeExports.jsx(s,{pageNumber:r+1,renderTextLayer:!1,renderAnnotationLayer:!1,width:re,scale:b,rotate:I,onRenderSuccess:()=>g==null?void 0:g(r+1)})},`page_${r+1}`)):t.jsxRuntimeExports.jsx("div",{className:H||"",children:t.jsxRuntimeExports.jsx(s,{pageNumber:i,renderTextLayer:!1,renderAnnotationLayer:!1,width:re,scale:b,rotate:I,onRenderSuccess:()=>g==null?void 0:g(i)})})},l)})})},Ke=()=>{if(!R||!Z||!ee)return null;const e=He.PDFSidebar;return t.jsxRuntimeExports.jsx(e,{pdfDocument:ee,currentPage:i,onPageClick:Le,components:{Tabs:x.Tabs,TabsList:x.TabsList,TabsTrigger:x.TabsTrigger,TabsContent:x.TabsContent,ScrollArea:x.ScrollArea,Skeleton:Me}})},_e=()=>!fe||u?null:t.jsxRuntimeExports.jsxs("div",{className:"fixed bottom-4 left-1/2 z-50 flex -translate-x-1/2 gap-2 md:hidden",children:[t.jsxRuntimeExports.jsxs(j,{variant:"secondary",size:"sm",onClick:()=>m(i-1),disabled:u||i<=1,title:u?"滚动模式下通过滚动定位页面":void 0,children:[t.jsxRuntimeExports.jsx(d.ChevronLeft,{}),t.jsxRuntimeExports.jsx("span",{className:"ml-1",children:"上一页"})]}),t.jsxRuntimeExports.jsxs(j,{variant:"secondary",size:"sm",onClick:()=>m(i+1),disabled:u||i>=p,title:u?"滚动模式下通过滚动定位页面":void 0,children:[t.jsxRuntimeExports.jsx("span",{className:"mr-1",children:"下一页"}),t.jsxRuntimeExports.jsx(d.ChevronRight,{})]})]});if(!x)return t.jsxRuntimeExports.jsx("div",{className:"p-4 text-center text-destructive",children:"错误:请通过 components prop 注入 UI 组件"});if(R){const e=[];if(x.Tabs||e.push("Tabs"),x.TabsList||e.push("TabsList"),x.TabsTrigger||e.push("TabsTrigger"),x.TabsContent||e.push("TabsContent"),x.ScrollArea||e.push("ScrollArea"),e.length>0){const s=e.length===1?e[0]:`${e.slice(0,-1).join("、")} 和 ${e[e.length-1]}`;return t.jsxRuntimeExports.jsxs("div",{className:"p-4 text-center text-destructive",children:["错误:侧边栏功能需要注入 ",s," 组件"]})}}return t.jsxRuntimeExports.jsxs("div",{ref:le,children:[t.jsxRuntimeExports.jsxs(De,{className:je,children:[Ge(),t.jsxRuntimeExports.jsx(Pe,{className:"p-0",style:{height:te?"100vh":be},children:t.jsxRuntimeExports.jsx("div",{className:"flex h-full flex-col",children:t.jsxRuntimeExports.jsxs("div",{className:"flex flex-1 overflow-hidden",children:[Ke(),Ne?Y():N?J():qe()]})})})]}),_e()]})}exports.PDFReader=et;
1
+ "use strict";var Be=Object.create;var ce=Object.defineProperty;var Ve=Object.getOwnPropertyDescriptor;var Ze=Object.getOwnPropertyNames;var Xe=Object.getPrototypeOf,Ye=Object.prototype.hasOwnProperty;var Je=(l,u,f,v)=>{if(u&&typeof u=="object"||typeof u=="function")for(let h of Ze(u))!Ye.call(l,h)&&h!==f&&ce(l,h,{get:()=>u[h],enumerable:!(v=Ve(u,h))||v.enumerable});return l};var Qe=(l,u,f)=>(f=l!=null?Be(Xe(l)):{},Je(u||!l||!l.__esModule?ce(f,"default",{value:l,enumerable:!0}):f,l));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./jsx-runtime-BB_1_6y_.cjs"),d=require("lucide-react"),n=require("react"),He=require("./PDFSidebar-4DtXqqzN.cjs");function Ue(l,u){const f=n.useRef(void 0);return n.useCallback((...v)=>{f.current&&clearTimeout(f.current),f.current=setTimeout(()=>l(...v),u)},[l,u])}function et({url:l,initialPage:u=1,initialScale:f=1,initialRotation:v=0,currentPage:h,onPageChange:D,scale:L,onScaleChange:M,rotation:G,onRotationChange:P,minScale:q=.5,maxScale:K=2.5,showToolbar:ue=!0,showSidebar:R=!0,showRotation:xe=!0,showModeToggle:me=!0,showFullscreen:de=!0,enableHotkeys:H=!0,enableMobileNav:fe=!0,displayMode:pe="single",className:je,toolbarClassName:he,contentClassName:be,contentHeight:Ee="80vh",pageClassName:U,workerUrl:_,cMapUrl:T,standardFontDataUrl:N,components:x,onLoadSuccess:S,onLoadError:b,onPageRender:g,loadingText:ve="正在加载PDF文档...",errorText:ee="PDF加载失败"}){const[te,B]=n.useState(null),[Re,V]=n.useState(u),[ge,ke]=n.useState(f),[ye,Te]=n.useState(v),[Ne,F]=n.useState(!1),[C,z]=n.useState(null),[p,Z]=n.useState(0),[A,X]=n.useState(!1),[k,se]=n.useState(pe==="scroll"),[I,ne]=n.useState(R);n.useEffect(()=>{ne(R)},[R]);const[re,Ce]=n.useState(void 0),[ie,we]=n.useState(null),le=n.useRef(null),O=n.useRef(null),Y=n.useRef(new Map),i=h??Re,E=L??ge,$=G??ye,y=h!==void 0,c=k,{Card:De,CardContent:Me,Button:j,Input:Pe,Skeleton:Se}=x||{};n.useEffect(()=>{B(null),Z(0),z(null),F(!1),y||V(Math.max(1,u))},[l,u,y]);const Fe=n.useMemo(()=>{const e={withCredentials:!1};return T&&(e.cMapUrl=T,e.cMapPacked=!0),N&&(e.standardFontDataUrl=N),e},[T,N]);n.useEffect(()=>{let e=!0;return(async()=>{try{const a=await import("react-pdf");if(typeof window<"u"){const r=a.pdfjs,o=r==null?void 0:r.version;r!=null&&r.GlobalWorkerOptions&&o&&(_?r.GlobalWorkerOptions.workerSrc=_:r.GlobalWorkerOptions.workerSrc=`https://cdn.jsdelivr.net/npm/pdfjs-dist@${o}/build/pdf.worker.min.mjs`,!T&&r.GlobalWorkerOptions&&(r.GlobalWorkerOptions.cMapUrl=`https://unpkg.com/pdfjs-dist@${o}/cmaps/`),!N&&r.GlobalWorkerOptions&&(r.GlobalWorkerOptions.standardFontDataUrl=`https://unpkg.com/pdfjs-dist@${o}/standard_fonts/`))}e&&we(a)}catch(a){if(e){const r=a instanceof Error?a:new Error("无法加载 react-pdf 库");z(r),F(!1),b==null||b(r)}}})(),()=>{e=!1}},[_,T,N,b]);const ze=n.useCallback(e=>{console.error("PDF加载失败:",e),console.error("PDF URL:",l),B(null),Z(0),z(new Error(`${ee}: ${e.message||"请检查文件路径或网络连接"}`)),F(!1),b==null||b(e)},[l,ee,b]),Ae=n.useCallback(e=>{B(e),Z(e.numPages),z(null),F(!1),y||V(s=>Math.max(1,Math.min(s,Math.max(e.numPages,1)))),S==null||S(e)},[y,S]),m=n.useCallback(e=>{if(!Number.isFinite(e))return;const s=p>0?Math.max(1,Math.min(Math.trunc(e),p)):Math.max(1,Math.trunc(e));y||V(s),s!==i&&(D==null||D(s))},[p,y,i,D]),Ie=n.useCallback((e,s)=>{s?Y.current.set(e,s):Y.current.delete(e)},[]),Oe=n.useCallback(()=>{const e=O.current;if(!e||!c||p<=0)return;const s=e.getBoundingClientRect().top;let a=i,r=Number.POSITIVE_INFINITY;Y.current.forEach((o,W)=>{const oe=Math.abs(o.getBoundingClientRect().top-s);oe<r&&(r=oe,a=W)}),a!==i&&m(a)},[i,m,c,p]),w=n.useCallback(e=>{const s=Math.max(q,Math.min(K,E+e));L===void 0&&ke(s),M==null||M(s)},[E,q,K,L,M]),$e=n.useCallback(()=>{const e=($+90)%360;G===void 0&&Te(e),P==null||P(e)},[$,G,P]),ae=Ue(e=>{Ce(e)},100);n.useEffect(()=>{if(!O.current)return;const e=O.current,s=()=>{ae(e.clientWidth)};s();const a=new ResizeObserver(()=>{s()});return a.observe(e),()=>{a.disconnect()}},[ae]),n.useEffect(()=>{if(!H)return;const e=s=>{const a=s.target,r=typeof document<"u"?document.activeElement:null,o=a||r,W=o==null?void 0:o.getAttribute("role");o&&(o.tagName==="INPUT"||o.tagName==="TEXTAREA"||o.tagName==="SELECT"||o.isContentEditable||W==="textbox"||W==="spinbutton")||((s.ctrlKey||s.metaKey)&&(s.key==="="||s.key==="+")?(s.preventDefault(),w(.1)):(s.ctrlKey||s.metaKey)&&s.key==="-"?(s.preventDefault(),w(-.1)):!c&&s.key==="ArrowLeft"?(s.preventDefault(),m(i-1)):!c&&s.key==="ArrowRight"&&(s.preventDefault(),m(i+1)))};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}},[H,i,m,c,w]);const We=n.useCallback(async()=>{var e,s;if(!(typeof document>"u"))if(document.fullscreenElement)document.exitFullscreen&&(await document.exitFullscreen(),X(!1));else try{await((s=(e=le.current)==null?void 0:e.requestFullscreen)==null?void 0:s.call(e)),X(!0)}catch(a){console.error("Error attempting to enable fullscreen:",a)}},[]);n.useEffect(()=>{if(typeof document>"u")return;const e=()=>{X(!!document.fullscreenElement)};return document.addEventListener("fullscreenchange",e),()=>{document.removeEventListener("fullscreenchange",e)}},[]);const Le=n.useCallback(e=>{m(e),se(!1)},[m]),Ge=()=>ue?t.jsxRuntimeExports.jsxs("div",{className:`flex items-center justify-between gap-4 border-b px-4 py-2 ${he||""}`,children:[t.jsxRuntimeExports.jsxs("div",{className:"flex items-center gap-2",children:[R&&t.jsxRuntimeExports.jsx(j,{variant:"outline",size:"icon",onClick:()=>ne(!I),"aria-label":I?"隐藏侧边栏":"显示侧边栏",title:I?"隐藏侧边栏":"显示侧边栏",children:t.jsxRuntimeExports.jsx(d.PanelLeft,{})}),t.jsxRuntimeExports.jsx(j,{variant:"outline",size:"icon",onClick:()=>w(-.1),disabled:E<=q,"aria-label":"缩小",title:"缩小",children:t.jsxRuntimeExports.jsx(d.ZoomOut,{})}),t.jsxRuntimeExports.jsxs("span",{className:"min-w-[3rem] text-center text-sm",children:[Math.round(E*100),"%"]}),t.jsxRuntimeExports.jsx(j,{variant:"outline",size:"icon",onClick:()=>w(.1),disabled:E>=K,"aria-label":"放大",title:"放大",children:t.jsxRuntimeExports.jsx(d.ZoomIn,{})}),xe&&t.jsxRuntimeExports.jsx(j,{variant:"outline",size:"icon",onClick:$e,"aria-label":"顺时针旋转",title:"顺时针旋转",children:t.jsxRuntimeExports.jsx(d.RotateCw,{})}),me&&t.jsxRuntimeExports.jsx(j,{variant:"outline",size:"icon",onClick:()=>se(!k),"aria-label":k?"切换到单页模式":"切换到滚动模式",title:k?"单页模式":"滚动模式",children:k?t.jsxRuntimeExports.jsx(d.ScrollText,{}):t.jsxRuntimeExports.jsx(d.FileText,{})}),de&&t.jsxRuntimeExports.jsx(j,{variant:"outline",size:"icon",onClick:We,"aria-label":A?"退出全屏":"进入全屏",title:A?"退出全屏":"进入全屏",children:A?t.jsxRuntimeExports.jsx(d.Minimize2,{}):t.jsxRuntimeExports.jsx(d.Maximize2,{})})]}),t.jsxRuntimeExports.jsxs("div",{className:"flex items-center gap-2",children:[!c&&t.jsxRuntimeExports.jsx(j,{variant:"outline",size:"icon",onClick:()=>m(i-1),disabled:i<=1,"aria-label":"上一页",title:"上一页",children:t.jsxRuntimeExports.jsx(d.ChevronLeft,{})}),t.jsxRuntimeExports.jsx(Pe,{type:"number",name:"pdf-page",min:1,max:p,value:i,onChange:e=>m(parseInt(e.target.value)||1),disabled:c,readOnly:c,"aria-label":"当前页码",inputMode:"numeric",autoComplete:"off",title:c?"滚动模式下页码仅显示当前位置":void 0,className:"w-16 text-center"}),t.jsxRuntimeExports.jsxs("span",{className:"text-sm text-muted-foreground",children:["/ ",p]}),!c&&t.jsxRuntimeExports.jsx(j,{variant:"outline",size:"icon",onClick:()=>m(i+1),disabled:p>0&&i>=p,"aria-label":"下一页",title:"下一页",children:t.jsxRuntimeExports.jsx(d.ChevronRight,{})})]})]}):null,J=()=>t.jsxRuntimeExports.jsx("div",{className:"flex h-full items-center justify-center",role:"status","aria-live":"polite",children:t.jsxRuntimeExports.jsx("p",{className:"text-muted-foreground",children:ve})}),Q=()=>t.jsxRuntimeExports.jsx("div",{className:"flex h-full min-h-[400px] items-center justify-center px-4 text-center text-destructive",role:"alert",children:t.jsxRuntimeExports.jsxs("div",{className:"max-w-md",children:[t.jsxRuntimeExports.jsx("p",{className:"mb-2 text-lg font-medium",children:"文件加载失败"}),t.jsxRuntimeExports.jsx("p",{className:"text-sm opacity-80",children:C==null?void 0:C.message})]})}),qe=()=>{if(!ie)return J();const{Document:e,Page:s}=ie;return t.jsxRuntimeExports.jsx("div",{ref:O,onScroll:c?Oe:void 0,className:`pdf-container flex-1 overflow-y-auto ${be||""}`,children:t.jsxRuntimeExports.jsx("div",{className:"flex min-h-full justify-center px-4",children:t.jsxRuntimeExports.jsx(e,{file:l,onLoadError:ze,options:Fe,loading:J(),error:Q(),onLoadSuccess:Ae,children:C?Q():k?Array.from(new Array(p),(a,r)=>t.jsxRuntimeExports.jsx("div",{ref:o=>Ie(r+1,o),"data-page-number":r+1,className:`mb-4 ${U||""}`,children:t.jsxRuntimeExports.jsx(s,{pageNumber:r+1,renderTextLayer:!1,renderAnnotationLayer:!1,width:re,scale:E,rotate:$,onRenderSuccess:()=>g==null?void 0:g(r+1)})},`page_${r+1}`)):t.jsxRuntimeExports.jsx("div",{className:U||"",children:t.jsxRuntimeExports.jsx(s,{pageNumber:i,renderTextLayer:!1,renderAnnotationLayer:!1,width:re,scale:E,rotate:$,onRenderSuccess:()=>g==null?void 0:g(i)})})},l)})})},Ke=()=>{if(!R||!I||!te)return null;const e=He.PDFSidebar;return t.jsxRuntimeExports.jsx(e,{pdfDocument:te,currentPage:i,onPageClick:Le,components:{Tabs:x.Tabs,TabsList:x.TabsList,TabsTrigger:x.TabsTrigger,TabsContent:x.TabsContent,ScrollArea:x.ScrollArea,Skeleton:Se}})},_e=()=>!fe||c?null:t.jsxRuntimeExports.jsxs("div",{className:"fixed bottom-4 left-1/2 z-50 flex -translate-x-1/2 gap-2 md:hidden",children:[t.jsxRuntimeExports.jsxs(j,{variant:"secondary",size:"sm",onClick:()=>m(i-1),disabled:c||i<=1,title:c?"滚动模式下通过滚动定位页面":void 0,children:[t.jsxRuntimeExports.jsx(d.ChevronLeft,{}),t.jsxRuntimeExports.jsx("span",{className:"ml-1",children:"上一页"})]}),t.jsxRuntimeExports.jsxs(j,{variant:"secondary",size:"sm",onClick:()=>m(i+1),disabled:c||i>=p,title:c?"滚动模式下通过滚动定位页面":void 0,children:[t.jsxRuntimeExports.jsx("span",{className:"mr-1",children:"下一页"}),t.jsxRuntimeExports.jsx(d.ChevronRight,{})]})]});if(!x)return t.jsxRuntimeExports.jsx("div",{className:"p-4 text-center text-destructive",children:"错误:请通过 components prop 注入 UI 组件"});if(R){const e=[];if(x.Tabs||e.push("Tabs"),x.TabsList||e.push("TabsList"),x.TabsTrigger||e.push("TabsTrigger"),x.TabsContent||e.push("TabsContent"),x.ScrollArea||e.push("ScrollArea"),e.length>0){const s=e.length===1?e[0]:`${e.slice(0,-1).join("、")} 和 ${e[e.length-1]}`;return t.jsxRuntimeExports.jsxs("div",{className:"p-4 text-center text-destructive",children:["错误:侧边栏功能需要注入 ",s," 组件"]})}}return t.jsxRuntimeExports.jsxs("div",{ref:le,children:[t.jsxRuntimeExports.jsxs(De,{className:je,children:[Ge(),t.jsxRuntimeExports.jsx(Me,{className:"p-0",style:{height:A?"100vh":Ee},children:t.jsxRuntimeExports.jsx("div",{className:"flex h-full flex-col",children:t.jsxRuntimeExports.jsxs("div",{className:"flex flex-1 overflow-hidden",children:[Ke(),Ne?J():C?Q():qe()]})})})]}),_e()]})}exports.PDFReader=et;
2
2
  //# sourceMappingURL=pdf-reader.cjs.map