@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.
Files changed (161) hide show
  1. package/README.md +50 -17
  2. package/dist/AuthPanel-C_2JBE7t.cjs +2 -0
  3. package/dist/AuthPanel-C_2JBE7t.cjs.map +1 -0
  4. package/dist/AuthPanel-D2HFX8eN.js +656 -0
  5. package/dist/AuthPanel-D2HFX8eN.js.map +1 -0
  6. package/dist/PDFSidebar-BBtucLK6.js +232 -0
  7. package/dist/PDFSidebar-BBtucLK6.js.map +1 -0
  8. package/dist/PDFSidebar-Di0D-yPS.cjs +2 -0
  9. package/dist/PDFSidebar-Di0D-yPS.cjs.map +1 -0
  10. package/dist/auth.cjs +2 -0
  11. package/dist/auth.cjs.map +1 -0
  12. package/dist/auth.d.ts +11 -0
  13. package/dist/auth.d.ts.map +1 -0
  14. package/dist/auth.js +9 -0
  15. package/dist/auth.js.map +1 -0
  16. package/dist/component-types.cjs +2 -0
  17. package/dist/component-types.cjs.map +1 -0
  18. package/dist/component-types.d.ts +2 -0
  19. package/dist/component-types.d.ts.map +1 -0
  20. package/dist/component-types.js +2 -0
  21. package/dist/component-types.js.map +1 -0
  22. package/dist/components/AuthLoginPanel.d.ts +55 -0
  23. package/dist/components/AuthLoginPanel.d.ts.map +1 -0
  24. package/dist/components/AuthPageShell.d.ts +11 -0
  25. package/dist/components/AuthPageShell.d.ts.map +1 -0
  26. package/dist/components/AuthPanel.d.ts +20 -0
  27. package/dist/components/AuthPanel.d.ts.map +1 -0
  28. package/dist/components/AuthRegisterPanel.d.ts +34 -0
  29. package/dist/components/AuthRegisterPanel.d.ts.map +1 -0
  30. package/dist/components/AuthVisualCarousel.d.ts +20 -0
  31. package/dist/components/AuthVisualCarousel.d.ts.map +1 -0
  32. package/dist/components/DataTable.d.ts +2 -2
  33. package/dist/components/DataTable.d.ts.map +1 -1
  34. package/dist/components/ImageReader.d.ts +44 -0
  35. package/dist/components/ImageReader.d.ts.map +1 -0
  36. package/dist/components/MarkdownReader.d.ts +26 -0
  37. package/dist/components/MarkdownReader.d.ts.map +1 -0
  38. package/dist/components/PDFReader.d.ts +2 -2
  39. package/dist/components/PDFReader.d.ts.map +1 -1
  40. package/dist/components/PDFSidebar.d.ts +1 -1
  41. package/dist/components/PDFSidebar.d.ts.map +1 -1
  42. package/dist/components/SimplePDFReader.d.ts +1 -1
  43. package/dist/components/VideoReader.d.ts +39 -0
  44. package/dist/components/VideoReader.d.ts.map +1 -0
  45. package/dist/components/media-utils.d.ts +9 -0
  46. package/dist/components/media-utils.d.ts.map +1 -0
  47. package/dist/data-table.cjs +2 -0
  48. package/dist/data-table.cjs.map +1 -0
  49. package/dist/data-table.d.ts +3 -0
  50. package/dist/data-table.d.ts.map +1 -0
  51. package/dist/data-table.js +169 -0
  52. package/dist/data-table.js.map +1 -0
  53. package/dist/delete-confirm-dialog.cjs +2 -0
  54. package/dist/delete-confirm-dialog.cjs.map +1 -0
  55. package/dist/delete-confirm-dialog.d.ts +3 -0
  56. package/dist/delete-confirm-dialog.d.ts.map +1 -0
  57. package/dist/delete-confirm-dialog.js +109 -0
  58. package/dist/delete-confirm-dialog.js.map +1 -0
  59. package/dist/file-upload.cjs +2 -0
  60. package/dist/file-upload.cjs.map +1 -0
  61. package/dist/file-upload.d.ts +3 -0
  62. package/dist/file-upload.d.ts.map +1 -0
  63. package/dist/file-upload.js +354 -0
  64. package/dist/file-upload.js.map +1 -0
  65. package/dist/image-reader.cjs +2 -0
  66. package/dist/image-reader.cjs.map +1 -0
  67. package/dist/image-reader.d.ts +3 -0
  68. package/dist/image-reader.d.ts.map +1 -0
  69. package/dist/image-reader.js +214 -0
  70. package/dist/image-reader.js.map +1 -0
  71. package/dist/index.cjs +2 -0
  72. package/dist/index.cjs.map +1 -0
  73. package/dist/index.d.ts +10 -20
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +8 -12
  76. package/dist/index.js.map +1 -1
  77. package/dist/jsx-runtime-B4hRZ52C.js +283 -0
  78. package/dist/jsx-runtime-B4hRZ52C.js.map +1 -0
  79. package/dist/jsx-runtime-BB_1_6y_.cjs +23 -0
  80. package/dist/jsx-runtime-BB_1_6y_.cjs.map +1 -0
  81. package/dist/markdown-reader.cjs +2 -0
  82. package/dist/markdown-reader.cjs.map +1 -0
  83. package/dist/markdown-reader.d.ts +3 -0
  84. package/dist/markdown-reader.d.ts.map +1 -0
  85. package/dist/markdown-reader.js +145 -0
  86. package/dist/markdown-reader.js.map +1 -0
  87. package/dist/media-utils-5UPuocc1.js +23 -0
  88. package/dist/media-utils-5UPuocc1.js.map +1 -0
  89. package/dist/media-utils-X1dDYP9W.cjs +2 -0
  90. package/dist/media-utils-X1dDYP9W.cjs.map +1 -0
  91. package/dist/pdf-reader.cjs +2 -0
  92. package/dist/pdf-reader.cjs.map +1 -0
  93. package/dist/pdf-reader.d.ts +3 -0
  94. package/dist/pdf-reader.d.ts.map +1 -0
  95. package/dist/pdf-reader.js +427 -0
  96. package/dist/pdf-reader.js.map +1 -0
  97. package/dist/pdf-sidebar.cjs +2 -0
  98. package/dist/pdf-sidebar.cjs.map +1 -0
  99. package/dist/pdf-sidebar.d.ts +3 -0
  100. package/dist/pdf-sidebar.d.ts.map +1 -0
  101. package/dist/pdf-sidebar.js +5 -0
  102. package/dist/pdf-sidebar.js.map +1 -0
  103. package/dist/simple-pdf-reader.cjs +2 -0
  104. package/dist/simple-pdf-reader.cjs.map +1 -0
  105. package/dist/simple-pdf-reader.d.ts +3 -0
  106. package/dist/simple-pdf-reader.d.ts.map +1 -0
  107. package/dist/simple-pdf-reader.js +268 -0
  108. package/dist/simple-pdf-reader.js.map +1 -0
  109. package/dist/table-header.cjs +2 -0
  110. package/dist/table-header.cjs.map +1 -0
  111. package/dist/table-header.d.ts +3 -0
  112. package/dist/table-header.d.ts.map +1 -0
  113. package/dist/table-header.js +63 -0
  114. package/dist/table-header.js.map +1 -0
  115. package/dist/table-pagination.cjs +2 -0
  116. package/dist/table-pagination.cjs.map +1 -0
  117. package/dist/table-pagination.d.ts +3 -0
  118. package/dist/table-pagination.d.ts.map +1 -0
  119. package/dist/table-pagination.js +172 -0
  120. package/dist/table-pagination.js.map +1 -0
  121. package/dist/theme-switcher-content.cjs +2 -0
  122. package/dist/theme-switcher-content.cjs.map +1 -0
  123. package/dist/theme-switcher-content.d.ts +3 -0
  124. package/dist/theme-switcher-content.d.ts.map +1 -0
  125. package/dist/theme-switcher-content.js +103 -0
  126. package/dist/theme-switcher-content.js.map +1 -0
  127. package/dist/theme-switcher.cjs +2 -0
  128. package/dist/theme-switcher.cjs.map +1 -0
  129. package/dist/theme-switcher.d.ts +3 -0
  130. package/dist/theme-switcher.d.ts.map +1 -0
  131. package/dist/theme-switcher.js +140 -0
  132. package/dist/theme-switcher.js.map +1 -0
  133. package/dist/types/component-types.d.ts +1 -0
  134. package/dist/types/component-types.d.ts.map +1 -1
  135. package/dist/utils-B6yFEsav.js +9 -0
  136. package/dist/utils-B6yFEsav.js.map +1 -0
  137. package/dist/utils-IjLH3w2e.cjs +2 -0
  138. package/dist/utils-IjLH3w2e.cjs.map +1 -0
  139. package/dist/utils.cjs +2 -0
  140. package/dist/utils.cjs.map +1 -0
  141. package/dist/utils.d.ts +2 -0
  142. package/dist/utils.d.ts.map +1 -0
  143. package/dist/utils.js +5 -0
  144. package/dist/utils.js.map +1 -0
  145. package/dist/video-reader.cjs +2 -0
  146. package/dist/video-reader.cjs.map +1 -0
  147. package/dist/video-reader.d.ts +3 -0
  148. package/dist/video-reader.d.ts.map +1 -0
  149. package/dist/video-reader.js +158 -0
  150. package/dist/video-reader.js.map +1 -0
  151. package/package.json +191 -3
  152. package/dist/index-DJdfLA8M.js +0 -2140
  153. package/dist/index-DJdfLA8M.js.map +0 -1
  154. package/dist/index-DUxYhmkV.js +0 -18821
  155. package/dist/index-DUxYhmkV.js.map +0 -1
  156. package/dist/index-miejqTjn.cjs +0 -13
  157. package/dist/index-miejqTjn.cjs.map +0 -1
  158. package/dist/index-tIca-Q_M.cjs +0 -23
  159. package/dist/index-tIca-Q_M.cjs.map +0 -1
  160. package/dist/index.c.js +0 -2
  161. package/dist/index.c.js.map +0 -1
package/dist/utils.js ADDED
@@ -0,0 +1,5 @@
1
+ import { c as r } from "./utils-B6yFEsav.js";
2
+ export {
3
+ r as cn
4
+ };
5
+ //# sourceMappingURL=utils.js.map
@@ -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,3 @@
1
+ export { VideoReader, SUPPORTED_VIDEO_EXTENSIONS, SUPPORTED_VIDEO_MIME_TYPES, } from './components/VideoReader';
2
+ export type { VideoReaderProps, VideoReaderTrack, VideoReaderUIComponents, } from './components/VideoReader';
3
+ //# sourceMappingURL=video-reader.d.ts.map
@@ -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":";;;;;AAmBO,MAAMA,KAA6B;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAEaC,KAA6B;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GA2CMC,KAAiB,CAACC,MACjBA,IACEA,aAAiB,QAAQA,IAAQ,IAAI,MAAMA,CAAK,IADpC;AAId,SAASC,GAAY;AAAA,EAC1B,KAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,YAAAC;AAAA,EACA,QAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,OAAAR;AAAA,EACA,WAAAS;AAAA,EACA,oBAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,WAAAC,IAAY;AAAA,EACZ,iBAAAC,IAAkB;AAAA,EAClB,aAAAC,IAAc;AAAA,EACd,kBAAAC,IAAmB;AAAA,EACnB,wBAAAC,IAAyB;AAAA,EACzB,qBAAAC,IAAsBtB;AAAA,EACtB,oBAAAuB,IAAqBtB;AAAA,EACrB,UAAAuB,IAAW;AAAA,EACX,SAAAC,IAAU;AAAA,EACV,aAAAC,IAAc;AAAA,EACd,cAAAC;AAAA,EACA,SAAAC;AAAA,EACA,GAAGC;AACL,GAAqB;AACnB,QAAM,EAAE,MAAAC,GAAM,aAAAC,GAAa,QAAAC,GAAQ,UAAAC,EAAA,IAAaxB,KAAc,CAAA,GACxD,CAACyB,GAAgBC,CAAiB,IAAIC,EAAS,EAAI,GACnD,CAACC,GAAYC,CAAa,IAAIF,EAAuB,IAAI,GAEzDG,IAAiBrC,GAAeC,CAAK,KAAKkC,GAC1CG,IACJnB,KACAoB,EAAuB;AAAA,IACrB,KAAApC;AAAA,IACA,UAAAC;AAAA,IACA,UAAAC;AAAA,IACA,qBAAAe;AAAA,IACA,oBAAAC;AAAA,EAAA,CACD,GACGmB,IAAY/B,KAAYuB,KAAkB,CAACK,GAE3CI,IAAcC,EAAQ,MAAM;AAChC,UAAMC,IAAYC,GAAkBzC,GAAKC,CAAQ;AACjD,WAAOuC,IAAYA,EAAU,YAAA,IAAgBtC,KAAY;AAAA,EAC3D,GAAG,CAACD,GAAUC,GAAUF,CAAG,CAAC;AAE5B,EAAA0C,EAAU,MAAM;AACd,IAAAZ,EAAkB,EAAI,GACtBG,EAAc,IAAI;AAAA,EACpB,GAAG,CAACjC,CAAG,CAAC;AAER,QAAM2C,IAAe,CACnBC,GACAC,GACAC,MACG;AACH,UAAMC,IACJ;AAEF,WAAIpB,IAEAqB,gBAAAA,EAAAA;AAAAA,MAACrB;AAAA,MAAA;AAAA,QACC,cAAYiB;AAAA,QACZ,WAAU;AAAA,QACV,SAAAE;AAAA,QACA,MAAK;AAAA,QACL,OAAOF;AAAA,QACP,MAAK;AAAA,QACL,SAAQ;AAAA,QAEP,UAAAC;AAAA,MAAA;AAAA,IAAA,IAMLG,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,cAAYJ;AAAA,QACZ,WAAWG;AAAA,QACX,SAAAD;AAAA,QACA,OAAOF;AAAA,QACP,MAAK;AAAA,QAEJ,UAAAC;AAAA,MAAA;AAAA,IAAA;AAAA,EAGP,GAEMI,IAAgB,MACpBD,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,wBAAuB,MAAK,UAAS,aAAU,UAC3D,UAAApB,IACCsB,gBAAAA,EAAAA,KAAAC,EAAAA,UAAA,EACE,UAAA;AAAA,IAAAH,gBAAAA,EAAAA,IAACpB,GAAA,EAAS,WAAU,WAAA,CAAW;AAAA,IAC/BoB,gBAAAA,EAAAA,IAACpB,GAAA,EAAS,WAAU,sBAAA,CAAsB;AAAA,EAAA,GAC5C,IAEAoB,gBAAAA,MAAC,KAAA,EAAE,WAAU,iCAAiC,aAAY,GAE9D,GAGII,IAAc,CAACC,MACnBH,gBAAAA,EAAAA,KAAC,SAAI,WAAU,4CAA2C,MAAK,SAC7D,UAAA;AAAA,IAAAF,gBAAAA,EAAAA,IAAC,KAAA,EAAE,WAAU,eAAe,UAAAK,KAAWzC,GAAU;AAAA,IAChDsB,KAAA,QAAAA,EAAgB,UACfc,gBAAAA,MAAC,KAAA,EAAE,WAAU,mBAAmB,UAAAd,EAAe,SAAQ,IACrD;AAAA,EAAA,GACN,GAGIoB,IACJJ,gBAAAA,EAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWK;AAAA,QACT;AAAA,QACA/C;AAAA,MAAA;AAAA,MAGD,UAAA;AAAA,QAAAM,IACCoC,gBAAAA,EAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWK;AAAA,cACT;AAAA,cACA7C;AAAA,YAAA;AAAA,YAGF,UAAA;AAAA,cAAAsC,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAU,6CACb,UAAA7C,KAASmC,GACZ;AAAA,cACCvB,IACG4B;AAAA,gBAAa;AAAA,gBAASK,gBAAAA,EAAAA,IAACQ,GAAA,EAAiB,WAAU,UAAA,CAAU;AAAA,gBAAI,MAC9D,OAAO,KAAKxD,GAAK,UAAU,YAAY;AAAA,cAAA,IAEzC;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA,IAEJ;AAAA,QACJkD,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,4EACZ,UAAA;AAAA,UAACf,IAEED,IACEkB,MACA,OAHFA,EAAYvC,CAAe;AAAA,UAI9BsB,KAAe,CAACD,IACfgB,gBAAAA,EAAAA,KAAAC,EAAAA,UAAA,EACG,UAAA;AAAA,YAAAd,IAAYY,MAAkB;AAAA,YAC/B,gBAAAQ;AAAA,cAAC;AAAA,cAAA;AAAA,gBACE,GAAGjC;AAAA,gBACJ,KAAKxB;AAAA,gBACL,WAAWuD;AAAA,kBACT;AAAA,kBACAlB,IAAY,uBAAuB;AAAA,kBACnC5B;AAAA,gBAAA;AAAA,gBAEF,UAAAU;AAAA,gBACA,SAAS,MAAM;AACb,wBAAMuC,IAAY,IAAI,MAAM9C,CAAS;AACrC,kBAAAkB,EAAkB,EAAK,GACvBG,EAAcyB,CAAS,GACvBnC,KAAA,QAAAA,EAAUmC;AAAA,gBACZ;AAAA,gBACA,cAAc,MAAM;AAClB,kBAAA5B,EAAkB,EAAK,GACvBG,EAAc,IAAI,GAClBX,KAAA,QAAAA;AAAA,gBACF;AAAA,gBACA,aAAAD;AAAA,gBACA,SAAAD;AAAA,gBACA,OAAAjB;AAAA,cAAA;AAAA,cAEA6C,gBAAAA,EAAAA,IAAC,UAAA,EAAO,KAAAhD,GAAU,MAAME,EAAA,CAAU;AAAA,cACjCG,KAAA,gBAAAA,EAAQ,IAAI,CAACsD,MACZX,gBAAAA,EAAAA,IAAC,WAAgD,GAAGW,EAAA,GAAxC,GAAGA,EAAM,GAAG,IAAIA,EAAM,QAAQ,EAAE,EAAe;AAAA,YAC5D;AAAA,UACH,EAAA,CACF,IACE;AAAA,QAAA,EAAA,CACN;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIJ,SAAIlC,IAEAuB,gBAAAA,EAAAA,IAACvB,KAAK,WAAAlB,GACH,UAAAmB,0BAAeA,GAAA,EAAa,UAAA4B,EAAA,CAAK,IAAiBA,EAAA,CACrD,IAIGN,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAAzC,GAAuB,UAAA+C,EAAA,CAAK;AAC1C;"}
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@turinhub/atomix-common-ui",
3
- "version": "0.3.0",
3
+ "version": "0.5.0",
4
4
  "description": "Common UI components for TurinHub projects",
5
5
  "type": "module",
6
- "main": "./dist/index.c.js",
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.c.js"
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",