@turinhub/atomix-common-ui 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +50 -17
- package/dist/AuthPanel-C_2JBE7t.cjs +2 -0
- package/dist/AuthPanel-C_2JBE7t.cjs.map +1 -0
- package/dist/AuthPanel-D2HFX8eN.js +656 -0
- package/dist/AuthPanel-D2HFX8eN.js.map +1 -0
- package/dist/PDFSidebar-BBtucLK6.js +232 -0
- package/dist/PDFSidebar-BBtucLK6.js.map +1 -0
- package/dist/PDFSidebar-Di0D-yPS.cjs +2 -0
- package/dist/PDFSidebar-Di0D-yPS.cjs.map +1 -0
- package/dist/auth.cjs +2 -0
- package/dist/auth.cjs.map +1 -0
- package/dist/auth.d.ts +11 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +9 -0
- package/dist/auth.js.map +1 -0
- package/dist/component-types.cjs +2 -0
- package/dist/component-types.cjs.map +1 -0
- package/dist/component-types.d.ts +2 -0
- package/dist/component-types.d.ts.map +1 -0
- package/dist/component-types.js +2 -0
- package/dist/component-types.js.map +1 -0
- package/dist/components/AuthLoginPanel.d.ts +55 -0
- package/dist/components/AuthLoginPanel.d.ts.map +1 -0
- package/dist/components/AuthPageShell.d.ts +11 -0
- package/dist/components/AuthPageShell.d.ts.map +1 -0
- package/dist/components/AuthPanel.d.ts +20 -0
- package/dist/components/AuthPanel.d.ts.map +1 -0
- package/dist/components/AuthRegisterPanel.d.ts +34 -0
- package/dist/components/AuthRegisterPanel.d.ts.map +1 -0
- package/dist/components/AuthVisualCarousel.d.ts +20 -0
- package/dist/components/AuthVisualCarousel.d.ts.map +1 -0
- package/dist/components/DataTable.d.ts +2 -2
- package/dist/components/DataTable.d.ts.map +1 -1
- package/dist/components/ImageReader.d.ts +44 -0
- package/dist/components/ImageReader.d.ts.map +1 -0
- package/dist/components/MarkdownReader.d.ts +26 -0
- package/dist/components/MarkdownReader.d.ts.map +1 -0
- package/dist/components/PDFReader.d.ts +2 -2
- package/dist/components/PDFReader.d.ts.map +1 -1
- package/dist/components/PDFSidebar.d.ts +1 -1
- package/dist/components/PDFSidebar.d.ts.map +1 -1
- package/dist/components/SimplePDFReader.d.ts +1 -1
- package/dist/components/VideoReader.d.ts +39 -0
- package/dist/components/VideoReader.d.ts.map +1 -0
- package/dist/components/media-utils.d.ts +9 -0
- package/dist/components/media-utils.d.ts.map +1 -0
- package/dist/data-table.cjs +2 -0
- package/dist/data-table.cjs.map +1 -0
- package/dist/data-table.d.ts +3 -0
- package/dist/data-table.d.ts.map +1 -0
- package/dist/data-table.js +169 -0
- package/dist/data-table.js.map +1 -0
- package/dist/delete-confirm-dialog.cjs +2 -0
- package/dist/delete-confirm-dialog.cjs.map +1 -0
- package/dist/delete-confirm-dialog.d.ts +3 -0
- package/dist/delete-confirm-dialog.d.ts.map +1 -0
- package/dist/delete-confirm-dialog.js +109 -0
- package/dist/delete-confirm-dialog.js.map +1 -0
- package/dist/file-upload.cjs +2 -0
- package/dist/file-upload.cjs.map +1 -0
- package/dist/file-upload.d.ts +3 -0
- package/dist/file-upload.d.ts.map +1 -0
- package/dist/file-upload.js +354 -0
- package/dist/file-upload.js.map +1 -0
- package/dist/image-reader.cjs +2 -0
- package/dist/image-reader.cjs.map +1 -0
- package/dist/image-reader.d.ts +3 -0
- package/dist/image-reader.d.ts.map +1 -0
- package/dist/image-reader.js +214 -0
- package/dist/image-reader.js.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +10 -20
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -12
- package/dist/index.js.map +1 -1
- package/dist/jsx-runtime-B4hRZ52C.js +283 -0
- package/dist/jsx-runtime-B4hRZ52C.js.map +1 -0
- package/dist/jsx-runtime-BB_1_6y_.cjs +23 -0
- package/dist/jsx-runtime-BB_1_6y_.cjs.map +1 -0
- package/dist/markdown-reader.cjs +2 -0
- package/dist/markdown-reader.cjs.map +1 -0
- package/dist/markdown-reader.d.ts +3 -0
- package/dist/markdown-reader.d.ts.map +1 -0
- package/dist/markdown-reader.js +145 -0
- package/dist/markdown-reader.js.map +1 -0
- package/dist/media-utils-5UPuocc1.js +23 -0
- package/dist/media-utils-5UPuocc1.js.map +1 -0
- package/dist/media-utils-X1dDYP9W.cjs +2 -0
- package/dist/media-utils-X1dDYP9W.cjs.map +1 -0
- package/dist/pdf-reader.cjs +2 -0
- package/dist/pdf-reader.cjs.map +1 -0
- package/dist/pdf-reader.d.ts +3 -0
- package/dist/pdf-reader.d.ts.map +1 -0
- package/dist/pdf-reader.js +427 -0
- package/dist/pdf-reader.js.map +1 -0
- package/dist/pdf-sidebar.cjs +2 -0
- package/dist/pdf-sidebar.cjs.map +1 -0
- package/dist/pdf-sidebar.d.ts +3 -0
- package/dist/pdf-sidebar.d.ts.map +1 -0
- package/dist/pdf-sidebar.js +5 -0
- package/dist/pdf-sidebar.js.map +1 -0
- package/dist/simple-pdf-reader.cjs +2 -0
- package/dist/simple-pdf-reader.cjs.map +1 -0
- package/dist/simple-pdf-reader.d.ts +3 -0
- package/dist/simple-pdf-reader.d.ts.map +1 -0
- package/dist/simple-pdf-reader.js +268 -0
- package/dist/simple-pdf-reader.js.map +1 -0
- package/dist/table-header.cjs +2 -0
- package/dist/table-header.cjs.map +1 -0
- package/dist/table-header.d.ts +3 -0
- package/dist/table-header.d.ts.map +1 -0
- package/dist/table-header.js +63 -0
- package/dist/table-header.js.map +1 -0
- package/dist/table-pagination.cjs +2 -0
- package/dist/table-pagination.cjs.map +1 -0
- package/dist/table-pagination.d.ts +3 -0
- package/dist/table-pagination.d.ts.map +1 -0
- package/dist/table-pagination.js +172 -0
- package/dist/table-pagination.js.map +1 -0
- package/dist/theme-switcher-content.cjs +2 -0
- package/dist/theme-switcher-content.cjs.map +1 -0
- package/dist/theme-switcher-content.d.ts +3 -0
- package/dist/theme-switcher-content.d.ts.map +1 -0
- package/dist/theme-switcher-content.js +103 -0
- package/dist/theme-switcher-content.js.map +1 -0
- package/dist/theme-switcher.cjs +2 -0
- package/dist/theme-switcher.cjs.map +1 -0
- package/dist/theme-switcher.d.ts +3 -0
- package/dist/theme-switcher.d.ts.map +1 -0
- package/dist/theme-switcher.js +140 -0
- package/dist/theme-switcher.js.map +1 -0
- package/dist/types/component-types.d.ts +1 -0
- package/dist/types/component-types.d.ts.map +1 -1
- package/dist/utils-B6yFEsav.js +9 -0
- package/dist/utils-B6yFEsav.js.map +1 -0
- package/dist/utils-IjLH3w2e.cjs +2 -0
- package/dist/utils-IjLH3w2e.cjs.map +1 -0
- package/dist/utils.cjs +2 -0
- package/dist/utils.cjs.map +1 -0
- package/dist/utils.d.ts +2 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +5 -0
- package/dist/utils.js.map +1 -0
- package/dist/video-reader.cjs +2 -0
- package/dist/video-reader.cjs.map +1 -0
- package/dist/video-reader.d.ts +3 -0
- package/dist/video-reader.d.ts.map +1 -0
- package/dist/video-reader.js +158 -0
- package/dist/video-reader.js.map +1 -0
- package/package.json +191 -3
- package/dist/index-DJdfLA8M.js +0 -2140
- package/dist/index-DJdfLA8M.js.map +0 -1
- package/dist/index-DUxYhmkV.js +0 -18821
- package/dist/index-DUxYhmkV.js.map +0 -1
- package/dist/index-miejqTjn.cjs +0 -13
- package/dist/index-miejqTjn.cjs.map +0 -1
- package/dist/index-tIca-Q_M.cjs +0 -23
- package/dist/index-tIca-Q_M.cjs.map +0 -1
- package/dist/index.c.js +0 -2
- package/dist/index.c.js.map +0 -1
package/dist/utils.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./jsx-runtime-BB_1_6y_.cjs"),r=require("react"),W=require("lucide-react"),p=require("./utils-IjLH3w2e.cjs"),O=require("./media-utils-X1dDYP9W.cjs"),P=["mp4","webm","ogg","ogv","mov","m4v"],_=["video/mp4","video/webm","video/ogg","video/quicktime","video/x-m4v"],Z=s=>s?s instanceof Error?s:new Error(s):null;function ee({src:s,fileName:o,mimeType:i,title:j,components:y,tracks:u,loading:I=!1,error:V,className:E,containerClassName:M,videoClassName:q,toolbarClassName:U,loadingText:D="正在加载视频...",errorText:f="视频加载失败",unsupportedText:T="暂不支持该视频格式",showToolbar:C=!0,showOpenInNewTab:$=!0,allowUnsupportedFormat:k=!1,supportedExtensions:L=P,supportedMimeTypes:z=_,controls:B=!0,preload:F="metadata",playsInline:X=!0,onLoadedData:l,onError:x,...Y}){const{Card:R,CardContent:g,Button:h,Skeleton:a}=y||{},[A,d]=r.useState(!0),[G,c]=r.useState(null),n=Z(V)||G,v=k||O.isSupportedMediaSource({src:s,fileName:o,mimeType:i,supportedExtensions:L,supportedMimeTypes:z}),b=I||A&&!n,H=r.useMemo(()=>{const t=O.getMediaExtension(s,o);return t?t.toUpperCase():i||"视频"},[o,i,s]);r.useEffect(()=>{d(!0),c(null)},[s]);const J=(t,S,N)=>{const Q="inline-flex h-8 w-8 items-center justify-center rounded-md border border-input bg-background text-foreground shadow-sm transition-colors hover:bg-accent hover:text-accent-foreground";return h?e.jsxRuntimeExports.jsx(h,{"aria-label":t,className:"h-8 w-8",onClick:N,size:"icon",title:t,type:"button",variant:"outline",children:S}):e.jsxRuntimeExports.jsx("button",{"aria-label":t,className:Q,onClick:N,title:t,type:"button",children:S})},K=()=>e.jsxRuntimeExports.jsx("div",{className:"w-full space-y-3 p-4",role:"status","aria-live":"polite",children:a?e.jsxRuntimeExports.jsxs(e.jsxRuntimeExports.Fragment,{children:[e.jsxRuntimeExports.jsx(a,{className:"h-4 w-32"}),e.jsxRuntimeExports.jsx(a,{className:"aspect-video w-full"})]}):e.jsxRuntimeExports.jsx("p",{className:"text-sm text-muted-foreground",children:D})}),w=t=>e.jsxRuntimeExports.jsxs("div",{className:"p-4 text-center text-sm text-destructive",role:"alert",children:[e.jsxRuntimeExports.jsx("p",{className:"font-medium",children:t||f}),n!=null&&n.message?e.jsxRuntimeExports.jsx("p",{className:"mt-1 opacity-80",children:n.message}):null]}),m=e.jsxRuntimeExports.jsxs("div",{className:p.cn("flex h-full min-h-[360px] flex-col overflow-hidden rounded-md border bg-background",M),children:[C?e.jsxRuntimeExports.jsxs("div",{className:p.cn("flex flex-wrap items-center justify-between gap-2 border-b px-3 py-2",U),children:[e.jsxRuntimeExports.jsx("span",{className:"text-xs font-medium text-muted-foreground",children:j||H}),$?J("新窗口打开",e.jsxRuntimeExports.jsx(W.ExternalLink,{className:"h-4 w-4"}),()=>window.open(s,"_blank","noreferrer")):null]}):null,e.jsxRuntimeExports.jsxs("div",{className:"relative flex min-h-0 flex-1 items-center justify-center bg-muted/20 p-4",children:[v?n?w():null:w(T),v&&!n?e.jsxRuntimeExports.jsxs(e.jsxRuntimeExports.Fragment,{children:[b?K():null,r.createElement("video",{...Y,key:s,className:p.cn("max-h-full w-full max-w-full bg-black",b?"invisible absolute":"visible",q),controls:B,onError:()=>{const t=new Error(f);d(!1),c(t),x==null||x(t)},onLoadedData:()=>{d(!1),c(null),l==null||l()},playsInline:X,preload:F,title:j},e.jsxRuntimeExports.jsx("source",{src:s,type:i}),u==null?void 0:u.map(t=>e.jsxRuntimeExports.jsx("track",{...t},`${t.src}-${t.kind||""}`)))]}):null]})]});return R?e.jsxRuntimeExports.jsx(R,{className:E,children:g?e.jsxRuntimeExports.jsx(g,{children:m}):m}):e.jsxRuntimeExports.jsx("div",{className:E,children:m})}exports.SUPPORTED_VIDEO_EXTENSIONS=P;exports.SUPPORTED_VIDEO_MIME_TYPES=_;exports.VideoReader=ee;
|
|
2
|
+
//# sourceMappingURL=video-reader.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"video-reader.cjs","sources":["../src/components/VideoReader.tsx"],"sourcesContent":["import { ExternalLink as ExternalLinkIcon } from 'lucide-react';\nimport { useEffect, useMemo, useState } from 'react';\nimport type {\n HTMLAttributes,\n ReactNode,\n TrackHTMLAttributes,\n VideoHTMLAttributes,\n} from 'react';\n\nimport { cn } from '../lib/utils';\nimport type {\n ButtonComponent,\n CardComponent,\n SkeletonComponent,\n UIComponent,\n} from '../types/component-types';\n\nimport { getMediaExtension, isSupportedMediaSource } from './media-utils';\n\nexport const SUPPORTED_VIDEO_EXTENSIONS = [\n 'mp4',\n 'webm',\n 'ogg',\n 'ogv',\n 'mov',\n 'm4v',\n] as const;\n\nexport const SUPPORTED_VIDEO_MIME_TYPES = [\n 'video/mp4',\n 'video/webm',\n 'video/ogg',\n 'video/quicktime',\n 'video/x-m4v',\n] as const;\n\nexport interface VideoReaderUIComponents {\n Card?: CardComponent;\n CardContent?: UIComponent<HTMLAttributes<HTMLDivElement>>;\n Button?: ButtonComponent;\n Skeleton?: SkeletonComponent;\n}\n\nexport interface VideoReaderTrack\n extends Omit<TrackHTMLAttributes<HTMLTrackElement>, 'children'> {\n src: string;\n}\n\nexport interface VideoReaderProps\n extends Omit<\n VideoHTMLAttributes<HTMLVideoElement>,\n 'children' | 'className' | 'onError' | 'onLoadedData' | 'src'\n > {\n src: string;\n fileName?: string;\n mimeType?: string;\n title?: string;\n components?: VideoReaderUIComponents;\n tracks?: VideoReaderTrack[];\n loading?: boolean;\n error?: Error | string | null;\n className?: string;\n containerClassName?: string;\n videoClassName?: string;\n toolbarClassName?: string;\n loadingText?: string;\n errorText?: string;\n unsupportedText?: string;\n showToolbar?: boolean;\n showOpenInNewTab?: boolean;\n allowUnsupportedFormat?: boolean;\n supportedExtensions?: readonly string[];\n supportedMimeTypes?: readonly string[];\n onLoadedData?: () => void;\n onError?: (error: Error) => void;\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\nexport function VideoReader({\n src,\n fileName,\n mimeType,\n title,\n components,\n tracks,\n loading = false,\n error,\n className,\n containerClassName,\n videoClassName,\n toolbarClassName,\n loadingText = '正在加载视频...',\n errorText = '视频加载失败',\n unsupportedText = '暂不支持该视频格式',\n showToolbar = true,\n showOpenInNewTab = true,\n allowUnsupportedFormat = false,\n supportedExtensions = SUPPORTED_VIDEO_EXTENSIONS,\n supportedMimeTypes = SUPPORTED_VIDEO_MIME_TYPES,\n controls = true,\n preload = 'metadata',\n playsInline = true,\n onLoadedData,\n onError,\n ...videoProps\n}: VideoReaderProps) {\n const { Card, CardContent, Button, Skeleton } = components || {};\n const [isVideoLoading, setIsVideoLoading] = useState(true);\n const [videoError, setVideoError] = useState<Error | null>(null);\n\n const displayedError = normalizeError(error) || videoError;\n const isSupported =\n allowUnsupportedFormat ||\n isSupportedMediaSource({\n src,\n fileName,\n mimeType,\n supportedExtensions,\n supportedMimeTypes,\n });\n const isLoading = loading || (isVideoLoading && !displayedError);\n\n const formatLabel = useMemo(() => {\n const extension = getMediaExtension(src, fileName);\n return extension ? extension.toUpperCase() : mimeType || '视频';\n }, [fileName, mimeType, src]);\n\n useEffect(() => {\n setIsVideoLoading(true);\n setVideoError(null);\n }, [src]);\n\n const renderButton = (\n label: string,\n icon: ReactNode,\n onClick: () => void\n ) => {\n const buttonClassName =\n 'inline-flex h-8 w-8 items-center justify-center rounded-md border border-input bg-background text-foreground shadow-sm transition-colors hover:bg-accent hover:text-accent-foreground';\n\n if (Button) {\n return (\n <Button\n aria-label={label}\n className=\"h-8 w-8\"\n onClick={onClick}\n size=\"icon\"\n title={label}\n type=\"button\"\n variant=\"outline\"\n >\n {icon}\n </Button>\n );\n }\n\n return (\n <button\n aria-label={label}\n className={buttonClassName}\n onClick={onClick}\n title={label}\n type=\"button\"\n >\n {icon}\n </button>\n );\n };\n\n const renderLoading = () => (\n <div className=\"w-full space-y-3 p-4\" role=\"status\" aria-live=\"polite\">\n {Skeleton ? (\n <>\n <Skeleton className=\"h-4 w-32\" />\n <Skeleton className=\"aspect-video w-full\" />\n </>\n ) : (\n <p className=\"text-sm text-muted-foreground\">{loadingText}</p>\n )}\n </div>\n );\n\n const renderError = (message?: string) => (\n <div className=\"p-4 text-center text-sm text-destructive\" role=\"alert\">\n <p className=\"font-medium\">{message || errorText}</p>\n {displayedError?.message ? (\n <p className=\"mt-1 opacity-80\">{displayedError.message}</p>\n ) : null}\n </div>\n );\n\n const body = (\n <div\n className={cn(\n 'flex h-full min-h-[360px] flex-col overflow-hidden rounded-md border bg-background',\n containerClassName\n )}\n >\n {showToolbar ? (\n <div\n className={cn(\n 'flex flex-wrap items-center justify-between gap-2 border-b px-3 py-2',\n toolbarClassName\n )}\n >\n <span className=\"text-xs font-medium text-muted-foreground\">\n {title || formatLabel}\n </span>\n {showOpenInNewTab\n ? renderButton('新窗口打开', <ExternalLinkIcon className=\"h-4 w-4\" />, () =>\n window.open(src, '_blank', 'noreferrer')\n )\n : null}\n </div>\n ) : null}\n <div className=\"relative flex min-h-0 flex-1 items-center justify-center bg-muted/20 p-4\">\n {!isSupported\n ? renderError(unsupportedText)\n : displayedError\n ? renderError()\n : null}\n {isSupported && !displayedError ? (\n <>\n {isLoading ? renderLoading() : null}\n <video\n {...videoProps}\n key={src}\n className={cn(\n 'max-h-full w-full max-w-full bg-black',\n isLoading ? 'invisible absolute' : 'visible',\n videoClassName\n )}\n controls={controls}\n onError={() => {\n const nextError = new Error(errorText);\n setIsVideoLoading(false);\n setVideoError(nextError);\n onError?.(nextError);\n }}\n onLoadedData={() => {\n setIsVideoLoading(false);\n setVideoError(null);\n onLoadedData?.();\n }}\n playsInline={playsInline}\n preload={preload}\n title={title}\n >\n <source src={src} type={mimeType} />\n {tracks?.map((track) => (\n <track key={`${track.src}-${track.kind || ''}`} {...track} />\n ))}\n </video>\n </>\n ) : null}\n </div>\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":["SUPPORTED_VIDEO_EXTENSIONS","SUPPORTED_VIDEO_MIME_TYPES","normalizeError","error","VideoReader","src","fileName","mimeType","title","components","tracks","loading","className","containerClassName","videoClassName","toolbarClassName","loadingText","errorText","unsupportedText","showToolbar","showOpenInNewTab","allowUnsupportedFormat","supportedExtensions","supportedMimeTypes","controls","preload","playsInline","onLoadedData","onError","videoProps","Card","CardContent","Button","Skeleton","isVideoLoading","setIsVideoLoading","useState","videoError","setVideoError","displayedError","isSupported","isSupportedMediaSource","isLoading","formatLabel","useMemo","extension","getMediaExtension","useEffect","renderButton","label","icon","onClick","buttonClassName","jsx","renderLoading","jsxs","Fragment","renderError","message","body","cn","ExternalLinkIcon","createElement","nextError","track"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"video-reader.d.ts","sourceRoot":"","sources":["../src/video-reader.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { j as e } from "./jsx-runtime-B4hRZ52C.js";
|
|
2
|
+
import { useState as y, useMemo as K, useEffect as Q, createElement as T } from "react";
|
|
3
|
+
import { ExternalLink as W } from "lucide-react";
|
|
4
|
+
import { c as x } from "./utils-B6yFEsav.js";
|
|
5
|
+
import { i as Z, g as ee } from "./media-utils-5UPuocc1.js";
|
|
6
|
+
const te = [
|
|
7
|
+
"mp4",
|
|
8
|
+
"webm",
|
|
9
|
+
"ogg",
|
|
10
|
+
"ogv",
|
|
11
|
+
"mov",
|
|
12
|
+
"m4v"
|
|
13
|
+
], se = [
|
|
14
|
+
"video/mp4",
|
|
15
|
+
"video/webm",
|
|
16
|
+
"video/ogg",
|
|
17
|
+
"video/quicktime",
|
|
18
|
+
"video/x-m4v"
|
|
19
|
+
], ne = (s) => s ? s instanceof Error ? s : new Error(s) : null;
|
|
20
|
+
function de({
|
|
21
|
+
src: s,
|
|
22
|
+
fileName: o,
|
|
23
|
+
mimeType: r,
|
|
24
|
+
title: f,
|
|
25
|
+
components: V,
|
|
26
|
+
tracks: i,
|
|
27
|
+
loading: _ = !1,
|
|
28
|
+
error: I,
|
|
29
|
+
className: p,
|
|
30
|
+
containerClassName: M,
|
|
31
|
+
videoClassName: O,
|
|
32
|
+
toolbarClassName: P,
|
|
33
|
+
loadingText: C = "正在加载视频...",
|
|
34
|
+
errorText: h = "视频加载失败",
|
|
35
|
+
unsupportedText: R = "暂不支持该视频格式",
|
|
36
|
+
showToolbar: k = !0,
|
|
37
|
+
showOpenInNewTab: L = !0,
|
|
38
|
+
allowUnsupportedFormat: U = !1,
|
|
39
|
+
supportedExtensions: z = te,
|
|
40
|
+
supportedMimeTypes: B = se,
|
|
41
|
+
controls: F = !0,
|
|
42
|
+
preload: $ = "metadata",
|
|
43
|
+
playsInline: q = !0,
|
|
44
|
+
onLoadedData: l,
|
|
45
|
+
onError: a,
|
|
46
|
+
...D
|
|
47
|
+
}) {
|
|
48
|
+
const { Card: g, CardContent: v, Button: j, Skeleton: d } = V || {}, [X, u] = y(!0), [Y, c] = y(null), n = ne(I) || Y, b = U || Z({
|
|
49
|
+
src: s,
|
|
50
|
+
fileName: o,
|
|
51
|
+
mimeType: r,
|
|
52
|
+
supportedExtensions: z,
|
|
53
|
+
supportedMimeTypes: B
|
|
54
|
+
}), w = _ || X && !n, A = K(() => {
|
|
55
|
+
const t = ee(s, o);
|
|
56
|
+
return t ? t.toUpperCase() : r || "视频";
|
|
57
|
+
}, [o, r, s]);
|
|
58
|
+
Q(() => {
|
|
59
|
+
u(!0), c(null);
|
|
60
|
+
}, [s]);
|
|
61
|
+
const G = (t, N, S) => {
|
|
62
|
+
const J = "inline-flex h-8 w-8 items-center justify-center rounded-md border border-input bg-background text-foreground shadow-sm transition-colors hover:bg-accent hover:text-accent-foreground";
|
|
63
|
+
return j ? /* @__PURE__ */ e.jsx(
|
|
64
|
+
j,
|
|
65
|
+
{
|
|
66
|
+
"aria-label": t,
|
|
67
|
+
className: "h-8 w-8",
|
|
68
|
+
onClick: S,
|
|
69
|
+
size: "icon",
|
|
70
|
+
title: t,
|
|
71
|
+
type: "button",
|
|
72
|
+
variant: "outline",
|
|
73
|
+
children: N
|
|
74
|
+
}
|
|
75
|
+
) : /* @__PURE__ */ e.jsx(
|
|
76
|
+
"button",
|
|
77
|
+
{
|
|
78
|
+
"aria-label": t,
|
|
79
|
+
className: J,
|
|
80
|
+
onClick: S,
|
|
81
|
+
title: t,
|
|
82
|
+
type: "button",
|
|
83
|
+
children: N
|
|
84
|
+
}
|
|
85
|
+
);
|
|
86
|
+
}, H = () => /* @__PURE__ */ e.jsx("div", { className: "w-full space-y-3 p-4", role: "status", "aria-live": "polite", children: d ? /* @__PURE__ */ e.jsxs(e.Fragment, { children: [
|
|
87
|
+
/* @__PURE__ */ e.jsx(d, { className: "h-4 w-32" }),
|
|
88
|
+
/* @__PURE__ */ e.jsx(d, { className: "aspect-video w-full" })
|
|
89
|
+
] }) : /* @__PURE__ */ e.jsx("p", { className: "text-sm text-muted-foreground", children: C }) }), E = (t) => /* @__PURE__ */ e.jsxs("div", { className: "p-4 text-center text-sm text-destructive", role: "alert", children: [
|
|
90
|
+
/* @__PURE__ */ e.jsx("p", { className: "font-medium", children: t || h }),
|
|
91
|
+
n != null && n.message ? /* @__PURE__ */ e.jsx("p", { className: "mt-1 opacity-80", children: n.message }) : null
|
|
92
|
+
] }), m = /* @__PURE__ */ e.jsxs(
|
|
93
|
+
"div",
|
|
94
|
+
{
|
|
95
|
+
className: x(
|
|
96
|
+
"flex h-full min-h-[360px] flex-col overflow-hidden rounded-md border bg-background",
|
|
97
|
+
M
|
|
98
|
+
),
|
|
99
|
+
children: [
|
|
100
|
+
k ? /* @__PURE__ */ e.jsxs(
|
|
101
|
+
"div",
|
|
102
|
+
{
|
|
103
|
+
className: x(
|
|
104
|
+
"flex flex-wrap items-center justify-between gap-2 border-b px-3 py-2",
|
|
105
|
+
P
|
|
106
|
+
),
|
|
107
|
+
children: [
|
|
108
|
+
/* @__PURE__ */ e.jsx("span", { className: "text-xs font-medium text-muted-foreground", children: f || A }),
|
|
109
|
+
L ? G(
|
|
110
|
+
"新窗口打开",
|
|
111
|
+
/* @__PURE__ */ e.jsx(W, { className: "h-4 w-4" }),
|
|
112
|
+
() => window.open(s, "_blank", "noreferrer")
|
|
113
|
+
) : null
|
|
114
|
+
]
|
|
115
|
+
}
|
|
116
|
+
) : null,
|
|
117
|
+
/* @__PURE__ */ e.jsxs("div", { className: "relative flex min-h-0 flex-1 items-center justify-center bg-muted/20 p-4", children: [
|
|
118
|
+
b ? n ? E() : null : E(R),
|
|
119
|
+
b && !n ? /* @__PURE__ */ e.jsxs(e.Fragment, { children: [
|
|
120
|
+
w ? H() : null,
|
|
121
|
+
/* @__PURE__ */ T(
|
|
122
|
+
"video",
|
|
123
|
+
{
|
|
124
|
+
...D,
|
|
125
|
+
key: s,
|
|
126
|
+
className: x(
|
|
127
|
+
"max-h-full w-full max-w-full bg-black",
|
|
128
|
+
w ? "invisible absolute" : "visible",
|
|
129
|
+
O
|
|
130
|
+
),
|
|
131
|
+
controls: F,
|
|
132
|
+
onError: () => {
|
|
133
|
+
const t = new Error(h);
|
|
134
|
+
u(!1), c(t), a == null || a(t);
|
|
135
|
+
},
|
|
136
|
+
onLoadedData: () => {
|
|
137
|
+
u(!1), c(null), l == null || l();
|
|
138
|
+
},
|
|
139
|
+
playsInline: q,
|
|
140
|
+
preload: $,
|
|
141
|
+
title: f
|
|
142
|
+
},
|
|
143
|
+
/* @__PURE__ */ e.jsx("source", { src: s, type: r }),
|
|
144
|
+
i == null ? void 0 : i.map((t) => /* @__PURE__ */ e.jsx("track", { ...t }, `${t.src}-${t.kind || ""}`))
|
|
145
|
+
)
|
|
146
|
+
] }) : null
|
|
147
|
+
] })
|
|
148
|
+
]
|
|
149
|
+
}
|
|
150
|
+
);
|
|
151
|
+
return g ? /* @__PURE__ */ e.jsx(g, { className: p, children: v ? /* @__PURE__ */ e.jsx(v, { children: m }) : m }) : /* @__PURE__ */ e.jsx("div", { className: p, children: m });
|
|
152
|
+
}
|
|
153
|
+
export {
|
|
154
|
+
te as SUPPORTED_VIDEO_EXTENSIONS,
|
|
155
|
+
se as SUPPORTED_VIDEO_MIME_TYPES,
|
|
156
|
+
de as VideoReader
|
|
157
|
+
};
|
|
158
|
+
//# sourceMappingURL=video-reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"video-reader.js","sources":["../src/components/VideoReader.tsx"],"sourcesContent":["import { ExternalLink as ExternalLinkIcon } from 'lucide-react';\nimport { useEffect, useMemo, useState } from 'react';\nimport type {\n HTMLAttributes,\n ReactNode,\n TrackHTMLAttributes,\n VideoHTMLAttributes,\n} from 'react';\n\nimport { cn } from '../lib/utils';\nimport type {\n ButtonComponent,\n CardComponent,\n SkeletonComponent,\n UIComponent,\n} from '../types/component-types';\n\nimport { getMediaExtension, isSupportedMediaSource } from './media-utils';\n\nexport const SUPPORTED_VIDEO_EXTENSIONS = [\n 'mp4',\n 'webm',\n 'ogg',\n 'ogv',\n 'mov',\n 'm4v',\n] as const;\n\nexport const SUPPORTED_VIDEO_MIME_TYPES = [\n 'video/mp4',\n 'video/webm',\n 'video/ogg',\n 'video/quicktime',\n 'video/x-m4v',\n] as const;\n\nexport interface VideoReaderUIComponents {\n Card?: CardComponent;\n CardContent?: UIComponent<HTMLAttributes<HTMLDivElement>>;\n Button?: ButtonComponent;\n Skeleton?: SkeletonComponent;\n}\n\nexport interface VideoReaderTrack\n extends Omit<TrackHTMLAttributes<HTMLTrackElement>, 'children'> {\n src: string;\n}\n\nexport interface VideoReaderProps\n extends Omit<\n VideoHTMLAttributes<HTMLVideoElement>,\n 'children' | 'className' | 'onError' | 'onLoadedData' | 'src'\n > {\n src: string;\n fileName?: string;\n mimeType?: string;\n title?: string;\n components?: VideoReaderUIComponents;\n tracks?: VideoReaderTrack[];\n loading?: boolean;\n error?: Error | string | null;\n className?: string;\n containerClassName?: string;\n videoClassName?: string;\n toolbarClassName?: string;\n loadingText?: string;\n errorText?: string;\n unsupportedText?: string;\n showToolbar?: boolean;\n showOpenInNewTab?: boolean;\n allowUnsupportedFormat?: boolean;\n supportedExtensions?: readonly string[];\n supportedMimeTypes?: readonly string[];\n onLoadedData?: () => void;\n onError?: (error: Error) => void;\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\nexport function VideoReader({\n src,\n fileName,\n mimeType,\n title,\n components,\n tracks,\n loading = false,\n error,\n className,\n containerClassName,\n videoClassName,\n toolbarClassName,\n loadingText = '正在加载视频...',\n errorText = '视频加载失败',\n unsupportedText = '暂不支持该视频格式',\n showToolbar = true,\n showOpenInNewTab = true,\n allowUnsupportedFormat = false,\n supportedExtensions = SUPPORTED_VIDEO_EXTENSIONS,\n supportedMimeTypes = SUPPORTED_VIDEO_MIME_TYPES,\n controls = true,\n preload = 'metadata',\n playsInline = true,\n onLoadedData,\n onError,\n ...videoProps\n}: VideoReaderProps) {\n const { Card, CardContent, Button, Skeleton } = components || {};\n const [isVideoLoading, setIsVideoLoading] = useState(true);\n const [videoError, setVideoError] = useState<Error | null>(null);\n\n const displayedError = normalizeError(error) || videoError;\n const isSupported =\n allowUnsupportedFormat ||\n isSupportedMediaSource({\n src,\n fileName,\n mimeType,\n supportedExtensions,\n supportedMimeTypes,\n });\n const isLoading = loading || (isVideoLoading && !displayedError);\n\n const formatLabel = useMemo(() => {\n const extension = getMediaExtension(src, fileName);\n return extension ? extension.toUpperCase() : mimeType || '视频';\n }, [fileName, mimeType, src]);\n\n useEffect(() => {\n setIsVideoLoading(true);\n setVideoError(null);\n }, [src]);\n\n const renderButton = (\n label: string,\n icon: ReactNode,\n onClick: () => void\n ) => {\n const buttonClassName =\n 'inline-flex h-8 w-8 items-center justify-center rounded-md border border-input bg-background text-foreground shadow-sm transition-colors hover:bg-accent hover:text-accent-foreground';\n\n if (Button) {\n return (\n <Button\n aria-label={label}\n className=\"h-8 w-8\"\n onClick={onClick}\n size=\"icon\"\n title={label}\n type=\"button\"\n variant=\"outline\"\n >\n {icon}\n </Button>\n );\n }\n\n return (\n <button\n aria-label={label}\n className={buttonClassName}\n onClick={onClick}\n title={label}\n type=\"button\"\n >\n {icon}\n </button>\n );\n };\n\n const renderLoading = () => (\n <div className=\"w-full space-y-3 p-4\" role=\"status\" aria-live=\"polite\">\n {Skeleton ? (\n <>\n <Skeleton className=\"h-4 w-32\" />\n <Skeleton className=\"aspect-video w-full\" />\n </>\n ) : (\n <p className=\"text-sm text-muted-foreground\">{loadingText}</p>\n )}\n </div>\n );\n\n const renderError = (message?: string) => (\n <div className=\"p-4 text-center text-sm text-destructive\" role=\"alert\">\n <p className=\"font-medium\">{message || errorText}</p>\n {displayedError?.message ? (\n <p className=\"mt-1 opacity-80\">{displayedError.message}</p>\n ) : null}\n </div>\n );\n\n const body = (\n <div\n className={cn(\n 'flex h-full min-h-[360px] flex-col overflow-hidden rounded-md border bg-background',\n containerClassName\n )}\n >\n {showToolbar ? (\n <div\n className={cn(\n 'flex flex-wrap items-center justify-between gap-2 border-b px-3 py-2',\n toolbarClassName\n )}\n >\n <span className=\"text-xs font-medium text-muted-foreground\">\n {title || formatLabel}\n </span>\n {showOpenInNewTab\n ? renderButton('新窗口打开', <ExternalLinkIcon className=\"h-4 w-4\" />, () =>\n window.open(src, '_blank', 'noreferrer')\n )\n : null}\n </div>\n ) : null}\n <div className=\"relative flex min-h-0 flex-1 items-center justify-center bg-muted/20 p-4\">\n {!isSupported\n ? renderError(unsupportedText)\n : displayedError\n ? renderError()\n : null}\n {isSupported && !displayedError ? (\n <>\n {isLoading ? renderLoading() : null}\n <video\n {...videoProps}\n key={src}\n className={cn(\n 'max-h-full w-full max-w-full bg-black',\n isLoading ? 'invisible absolute' : 'visible',\n videoClassName\n )}\n controls={controls}\n onError={() => {\n const nextError = new Error(errorText);\n setIsVideoLoading(false);\n setVideoError(nextError);\n onError?.(nextError);\n }}\n onLoadedData={() => {\n setIsVideoLoading(false);\n setVideoError(null);\n onLoadedData?.();\n }}\n playsInline={playsInline}\n preload={preload}\n title={title}\n >\n <source src={src} type={mimeType} />\n {tracks?.map((track) => (\n <track key={`${track.src}-${track.kind || ''}`} {...track} />\n ))}\n </video>\n </>\n ) : null}\n </div>\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":["SUPPORTED_VIDEO_EXTENSIONS","SUPPORTED_VIDEO_MIME_TYPES","normalizeError","error","VideoReader","src","fileName","mimeType","title","components","tracks","loading","className","containerClassName","videoClassName","toolbarClassName","loadingText","errorText","unsupportedText","showToolbar","showOpenInNewTab","allowUnsupportedFormat","supportedExtensions","supportedMimeTypes","controls","preload","playsInline","onLoadedData","onError","videoProps","Card","CardContent","Button","Skeleton","isVideoLoading","setIsVideoLoading","useState","videoError","setVideoError","displayedError","isSupported","isSupportedMediaSource","isLoading","formatLabel","useMemo","extension","getMediaExtension","useEffect","renderButton","label","icon","onClick","buttonClassName","jsx","renderLoading","jsxs","Fragment","renderError","message","body","cn","ExternalLinkIcon","createElement","nextError","track"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@turinhub/atomix-common-ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Common UI components for TurinHub projects",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"main": "./dist/index.
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
7
|
"module": "./dist/index.js",
|
|
8
8
|
"types": "./dist/index.d.ts",
|
|
9
9
|
"exports": {
|
|
@@ -14,7 +14,177 @@
|
|
|
14
14
|
},
|
|
15
15
|
"require": {
|
|
16
16
|
"types": "./dist/index.d.ts",
|
|
17
|
-
"default": "./dist/index.
|
|
17
|
+
"default": "./dist/index.cjs"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"./auth": {
|
|
21
|
+
"import": {
|
|
22
|
+
"types": "./dist/auth.d.ts",
|
|
23
|
+
"default": "./dist/auth.js"
|
|
24
|
+
},
|
|
25
|
+
"require": {
|
|
26
|
+
"types": "./dist/auth.d.ts",
|
|
27
|
+
"default": "./dist/auth.cjs"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"./data-table": {
|
|
31
|
+
"import": {
|
|
32
|
+
"types": "./dist/data-table.d.ts",
|
|
33
|
+
"default": "./dist/data-table.js"
|
|
34
|
+
},
|
|
35
|
+
"require": {
|
|
36
|
+
"types": "./dist/data-table.d.ts",
|
|
37
|
+
"default": "./dist/data-table.cjs"
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"./delete-confirm-dialog": {
|
|
41
|
+
"import": {
|
|
42
|
+
"types": "./dist/delete-confirm-dialog.d.ts",
|
|
43
|
+
"default": "./dist/delete-confirm-dialog.js"
|
|
44
|
+
},
|
|
45
|
+
"require": {
|
|
46
|
+
"types": "./dist/delete-confirm-dialog.d.ts",
|
|
47
|
+
"default": "./dist/delete-confirm-dialog.cjs"
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
"./table-header": {
|
|
51
|
+
"import": {
|
|
52
|
+
"types": "./dist/table-header.d.ts",
|
|
53
|
+
"default": "./dist/table-header.js"
|
|
54
|
+
},
|
|
55
|
+
"require": {
|
|
56
|
+
"types": "./dist/table-header.d.ts",
|
|
57
|
+
"default": "./dist/table-header.cjs"
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
"./table-pagination": {
|
|
61
|
+
"import": {
|
|
62
|
+
"types": "./dist/table-pagination.d.ts",
|
|
63
|
+
"default": "./dist/table-pagination.js"
|
|
64
|
+
},
|
|
65
|
+
"require": {
|
|
66
|
+
"types": "./dist/table-pagination.d.ts",
|
|
67
|
+
"default": "./dist/table-pagination.cjs"
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
"./theme-switcher": {
|
|
71
|
+
"import": {
|
|
72
|
+
"types": "./dist/theme-switcher.d.ts",
|
|
73
|
+
"default": "./dist/theme-switcher.js"
|
|
74
|
+
},
|
|
75
|
+
"require": {
|
|
76
|
+
"types": "./dist/theme-switcher.d.ts",
|
|
77
|
+
"default": "./dist/theme-switcher.cjs"
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
"./theme-switcher-content": {
|
|
81
|
+
"import": {
|
|
82
|
+
"types": "./dist/theme-switcher-content.d.ts",
|
|
83
|
+
"default": "./dist/theme-switcher-content.js"
|
|
84
|
+
},
|
|
85
|
+
"require": {
|
|
86
|
+
"types": "./dist/theme-switcher-content.d.ts",
|
|
87
|
+
"default": "./dist/theme-switcher-content.cjs"
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
"./file-upload": {
|
|
91
|
+
"import": {
|
|
92
|
+
"types": "./dist/file-upload.d.ts",
|
|
93
|
+
"default": "./dist/file-upload.js"
|
|
94
|
+
},
|
|
95
|
+
"require": {
|
|
96
|
+
"types": "./dist/file-upload.d.ts",
|
|
97
|
+
"default": "./dist/file-upload.cjs"
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
"./image-reader": {
|
|
101
|
+
"import": {
|
|
102
|
+
"types": "./dist/image-reader.d.ts",
|
|
103
|
+
"default": "./dist/image-reader.js"
|
|
104
|
+
},
|
|
105
|
+
"require": {
|
|
106
|
+
"types": "./dist/image-reader.d.ts",
|
|
107
|
+
"default": "./dist/image-reader.cjs"
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
"./video-reader": {
|
|
111
|
+
"import": {
|
|
112
|
+
"types": "./dist/video-reader.d.ts",
|
|
113
|
+
"default": "./dist/video-reader.js"
|
|
114
|
+
},
|
|
115
|
+
"require": {
|
|
116
|
+
"types": "./dist/video-reader.d.ts",
|
|
117
|
+
"default": "./dist/video-reader.cjs"
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
"./simple-pdf-reader": {
|
|
121
|
+
"import": {
|
|
122
|
+
"types": "./dist/simple-pdf-reader.d.ts",
|
|
123
|
+
"default": "./dist/simple-pdf-reader.js"
|
|
124
|
+
},
|
|
125
|
+
"require": {
|
|
126
|
+
"types": "./dist/simple-pdf-reader.d.ts",
|
|
127
|
+
"default": "./dist/simple-pdf-reader.cjs"
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
"./pdf-reader": {
|
|
131
|
+
"import": {
|
|
132
|
+
"types": "./dist/pdf-reader.d.ts",
|
|
133
|
+
"default": "./dist/pdf-reader.js"
|
|
134
|
+
},
|
|
135
|
+
"require": {
|
|
136
|
+
"types": "./dist/pdf-reader.d.ts",
|
|
137
|
+
"default": "./dist/pdf-reader.cjs"
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
"./pdf-sidebar": {
|
|
141
|
+
"import": {
|
|
142
|
+
"types": "./dist/pdf-sidebar.d.ts",
|
|
143
|
+
"default": "./dist/pdf-sidebar.js"
|
|
144
|
+
},
|
|
145
|
+
"require": {
|
|
146
|
+
"types": "./dist/pdf-sidebar.d.ts",
|
|
147
|
+
"default": "./dist/pdf-sidebar.cjs"
|
|
148
|
+
}
|
|
149
|
+
},
|
|
150
|
+
"./markdown-reader": {
|
|
151
|
+
"import": {
|
|
152
|
+
"types": "./dist/markdown-reader.d.ts",
|
|
153
|
+
"default": "./dist/markdown-reader.js"
|
|
154
|
+
},
|
|
155
|
+
"require": {
|
|
156
|
+
"types": "./dist/markdown-reader.d.ts",
|
|
157
|
+
"default": "./dist/markdown-reader.cjs"
|
|
158
|
+
}
|
|
159
|
+
},
|
|
160
|
+
"./components/MarkdownReader": {
|
|
161
|
+
"import": {
|
|
162
|
+
"types": "./dist/markdown-reader.d.ts",
|
|
163
|
+
"default": "./dist/markdown-reader.js"
|
|
164
|
+
},
|
|
165
|
+
"require": {
|
|
166
|
+
"types": "./dist/markdown-reader.d.ts",
|
|
167
|
+
"default": "./dist/markdown-reader.cjs"
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
"./utils": {
|
|
171
|
+
"import": {
|
|
172
|
+
"types": "./dist/utils.d.ts",
|
|
173
|
+
"default": "./dist/utils.js"
|
|
174
|
+
},
|
|
175
|
+
"require": {
|
|
176
|
+
"types": "./dist/utils.d.ts",
|
|
177
|
+
"default": "./dist/utils.cjs"
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
"./component-types": {
|
|
181
|
+
"import": {
|
|
182
|
+
"types": "./dist/component-types.d.ts",
|
|
183
|
+
"default": "./dist/component-types.js"
|
|
184
|
+
},
|
|
185
|
+
"require": {
|
|
186
|
+
"types": "./dist/component-types.d.ts",
|
|
187
|
+
"default": "./dist/component-types.cjs"
|
|
18
188
|
}
|
|
19
189
|
}
|
|
20
190
|
},
|
|
@@ -51,9 +221,25 @@
|
|
|
51
221
|
"pdfjs-dist": "^5.4.296",
|
|
52
222
|
"react": "^18.0.0 || ^19.0.0",
|
|
53
223
|
"react-dom": "^18.0.0 || ^19.0.0",
|
|
224
|
+
"react-markdown": "^10.1.0",
|
|
54
225
|
"react-pdf": "^10.1.0",
|
|
226
|
+
"remark-gfm": "^4.0.1",
|
|
55
227
|
"tailwind-merge": "^3.0.0"
|
|
56
228
|
},
|
|
229
|
+
"peerDependenciesMeta": {
|
|
230
|
+
"pdfjs-dist": {
|
|
231
|
+
"optional": true
|
|
232
|
+
},
|
|
233
|
+
"react-markdown": {
|
|
234
|
+
"optional": true
|
|
235
|
+
},
|
|
236
|
+
"react-pdf": {
|
|
237
|
+
"optional": true
|
|
238
|
+
},
|
|
239
|
+
"remark-gfm": {
|
|
240
|
+
"optional": true
|
|
241
|
+
}
|
|
242
|
+
},
|
|
57
243
|
"devDependencies": {
|
|
58
244
|
"@testing-library/jest-dom": "^6.4.0",
|
|
59
245
|
"@testing-library/react": "^16.0.0",
|
|
@@ -75,6 +261,8 @@
|
|
|
75
261
|
"pdfjs-dist": "5.4.296",
|
|
76
262
|
"prettier": "^3.6.0",
|
|
77
263
|
"prettier-plugin-tailwindcss": "^0.7.0",
|
|
264
|
+
"react-markdown": "^10.1.0",
|
|
265
|
+
"remark-gfm": "^4.0.1",
|
|
78
266
|
"tailwindcss": "^3.4.0",
|
|
79
267
|
"tailwindcss-animate": "^1.0.7",
|
|
80
268
|
"typescript": "^5.6.0",
|