@turinhub/atomix-common-ui 0.2.1 → 0.3.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-tIca-Q_M.cjs","sources":["../src/lib/utils.ts","../node_modules/.pnpm/react@19.2.4/node_modules/react/cjs/react-jsx-runtime.production.js","../node_modules/.pnpm/react@19.2.4/node_modules/react/cjs/react-jsx-runtime.development.js","../node_modules/.pnpm/react@19.2.4/node_modules/react/jsx-runtime.js","../src/components/DataTable.tsx","../src/components/DeleteConfirmDialog.tsx","../src/components/TableHeader.tsx","../src/components/TablePagination.tsx","../src/components/ThemeSwitcher.tsx","../src/components/ThemeSwitcherContent.tsx","../src/components/SimplePDFReader.tsx","../src/components/PDFSidebar.tsx","../src/components/PDFReader.tsx","../src/components/FileUpload.tsx"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(type, key, props, owner, debugStack, debugTask) {\n var refProp = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== refProp ? refProp : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n maybeKey,\n getOwner(),\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n isValidElement(node)\n ? node._store && (node._store.validated = 1)\n : \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_LAZY_TYPE &&\n (\"fulfilled\" === node._payload.status\n ? isValidElement(node._payload.value) &&\n node._payload.value._store &&\n (node._payload.value._store.validated = 1)\n : node._store && (node._store.validated = 1));\n }\n function isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n react_stack_bottom_frame: function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsx = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !1,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.jsxs = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !0,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import { MoreVertical } from 'lucide-react';\nimport { ReactNode } from 'react';\nimport type { HTMLAttributes, ButtonHTMLAttributes } from 'react';\n\nimport type {\n UIComponent,\n ButtonComponent,\n CardComponent,\n TableComponent,\n TableRowComponent,\n TableCellComponent,\n} from '../types/component-types';\n\nimport type { TableHeaderProps } from './TableHeader';\nimport type { TablePaginationProps } from './TablePagination';\n\ntype ColumnKey<T> = Extract<keyof T, string>;\n\ntype ActionMenuItem<T> = {\n label: ReactNode;\n icon?: ReactNode;\n onClick: (record: T, index: number) => void;\n className?: string;\n separator?: never;\n};\n\ntype ActionSeparatorItem = {\n separator: true;\n className?: string;\n label?: never;\n icon?: never;\n onClick?: never;\n};\n\ntype ActionItem<T> = ActionMenuItem<T> | ActionSeparatorItem;\n\nexport interface Column<T = unknown> {\n key: ColumnKey<T>;\n title: ReactNode;\n render?: (value: T[ColumnKey<T>], record: T, index: number) => ReactNode;\n width?: string;\n align?: 'left' | 'center' | 'right';\n}\n\n/**\n * UI 组件适配器接口\n * 业务项目应该传入自己项目中的 shadcn/ui 组件\n */\nexport interface UIComponents {\n Card: CardComponent;\n CardContent: UIComponent<HTMLAttributes<HTMLDivElement>>;\n CardFooter: UIComponent<HTMLAttributes<HTMLDivElement>>;\n Table: TableComponent;\n TableBody: UIComponent<HTMLAttributes<HTMLTableSectionElement>>;\n TableCell: TableCellComponent;\n TableHead: TableCellComponent;\n TableHeader: UIComponent<HTMLAttributes<HTMLTableSectionElement>>;\n TableRow: TableRowComponent;\n Button: ButtonComponent;\n DropdownMenu: UIComponent<HTMLAttributes<HTMLDivElement>>;\n DropdownMenuTrigger: ButtonComponent;\n DropdownMenuContent: UIComponent<\n HTMLAttributes<HTMLDivElement> & { align?: 'start' | 'end' | 'center' }\n >;\n DropdownMenuItem: UIComponent<\n ButtonHTMLAttributes<HTMLDivElement> & {\n onClick?: (e: React.MouseEvent) => void;\n }\n >;\n DropdownMenuSeparator: UIComponent;\n Skeleton: UIComponent<HTMLAttributes<HTMLDivElement>>;\n TableHeaderComponent: React.ComponentType<TableHeaderProps>;\n TablePaginationComponent: React.ComponentType<TablePaginationProps>;\n}\n\nexport interface DataTableProps<T = unknown> {\n // 数据相关\n data: T[];\n loading?: boolean;\n columns: Column<T>[];\n rowKey: keyof T | ((record: T) => string);\n\n // 空状态\n emptyText?: string;\n searchActiveEmptyText?: string;\n\n // 头部配置\n header?: TableHeaderProps;\n\n // 分页配置\n pagination?: TablePaginationProps & {\n show?: boolean;\n };\n\n // 表格行样式\n rowClassName?: (record: T, index: number) => string;\n onRow?: (\n record: T,\n index: number\n ) => {\n onClick?: () => void;\n onDoubleClick?: () => void;\n };\n\n // 操作列\n actions?: {\n title?: string;\n mode?: 'expanded' | 'collapsed';\n render?: (record: T, index: number) => ReactNode;\n items?: ActionItem<T>[];\n };\n\n // UI 组件注入(可选)\n components?: UIComponents;\n\n // 自定义渲染函数(更灵活)\n renderCard?: (content: ReactNode) => ReactNode;\n renderTable?: (header: ReactNode, body: ReactNode) => ReactNode;\n renderActions?: (record: T, index: number) => ReactNode;\n}\n\n/**\n * 默认的 DataTable 实现\n * 需要通过 components prop 注入 UI 组件\n */\nexport function DataTable<T extends Record<string, any>>({\n data,\n loading = false,\n columns,\n rowKey,\n emptyText = '暂无数据',\n searchActiveEmptyText = '未找到匹配的记录',\n header,\n pagination,\n rowClassName,\n onRow,\n actions,\n components,\n renderCard,\n renderTable,\n renderActions,\n}: DataTableProps<T>) {\n if (!components) {\n return (\n <div className=\"p-4 text-center text-destructive\">\n 错误:请通过 components prop 注入 UI 组件\n <br />\n <code className=\"text-sm\">\n {'import { Card, Table, Button, ... } from \"@/components/ui\"'}\n </code>\n </div>\n );\n }\n\n const {\n Card,\n CardContent,\n CardFooter,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Button,\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n Skeleton,\n TableHeaderComponent,\n TablePaginationComponent,\n } = components;\n\n // 获取行的唯一标识\n const getRowKey = (record: T, index: number): string => {\n if (typeof rowKey === 'function') {\n return rowKey(record);\n }\n const keyVal = record[rowKey];\n return keyVal !== undefined && keyVal !== null\n ? String(keyVal)\n : `row-${index}`;\n };\n\n // 检查是否有搜索活动\n const isSearchActive = Boolean(\n header?.searchValue && header.searchValue.trim().length > 0\n );\n const hasActions = Boolean(actions?.render || actions?.items?.length);\n const actionMode: 'expanded' | 'collapsed' =\n actions?.mode ?? (actions?.items?.length ? 'collapsed' : 'expanded');\n const isSeparatorItem = (item: ActionItem<T>): item is ActionSeparatorItem =>\n item.separator === true;\n\n // 渲染操作列\n const defaultRenderActions = (record: T, index: number) => {\n if (!actions || !hasActions) return null;\n\n // 折叠模式:使用 DropdownMenu\n if (\n actionMode === 'collapsed' &&\n actions.items &&\n actions.items.length > 0\n ) {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n className=\"h-8 w-8 p-0\"\n aria-label=\"打开行操作菜单\"\n >\n <MoreVertical className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {actions.items.map((item, itemIndex) =>\n isSeparatorItem(item) ? (\n <DropdownMenuSeparator key={`separator-${itemIndex}`} />\n ) : (\n <DropdownMenuItem\n key={`action-${itemIndex}`}\n onClick={() => item.onClick(record, index)}\n className={item.className}\n >\n {item.icon && (\n <span className=\"mr-2 h-4 w-4\">{item.icon}</span>\n )}\n {item.label}\n </DropdownMenuItem>\n )\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n }\n\n // 展开模式:使用自定义 render\n return actions.render ? actions.render(record, index) : null;\n };\n\n // 渲染表头\n const renderTableHeader = () => {\n return (\n <TableHeader>\n <TableRow className=\"bg-muted/50 hover:bg-muted/50\">\n {columns.map((column) => (\n <TableHead\n key={String(column.key)}\n className={`font-semibold text-foreground ${\n column.align === 'center'\n ? 'text-center'\n : column.align === 'right'\n ? 'text-right'\n : 'text-left'\n }`}\n style={{ width: column.width }}\n >\n {column.title}\n </TableHead>\n ))}\n {hasActions && (\n <TableHead className=\"text-right font-semibold text-foreground\">\n {actions?.title || '操作'}\n </TableHead>\n )}\n </TableRow>\n </TableHeader>\n );\n };\n\n // 渲染表体\n const renderTableBody = () => {\n // Loading 状态\n if (loading) {\n return (\n <TableBody>\n {Array.from({ length: 5 }).map((_, index) => (\n <TableRow key={index}>\n {columns.map((column) => (\n <TableCell\n key={String(column.key)}\n style={{ width: column.width }}\n className={\n column.align === 'center'\n ? 'text-center'\n : column.align === 'right'\n ? 'text-right'\n : ''\n }\n >\n <Skeleton className=\"h-4 w-full\" />\n </TableCell>\n ))}\n {hasActions && (\n <TableCell>\n <Skeleton className=\"ml-auto h-4 w-8\" />\n </TableCell>\n )}\n </TableRow>\n ))}\n </TableBody>\n );\n }\n\n // 空数据状态\n if (data.length === 0) {\n return (\n <TableBody>\n <TableRow>\n <TableCell\n colSpan={columns.length + (hasActions ? 1 : 0)}\n className=\"py-8 text-center text-muted-foreground\"\n >\n {isSearchActive ? searchActiveEmptyText : emptyText}\n </TableCell>\n </TableRow>\n </TableBody>\n );\n }\n\n // 数据行\n return (\n <TableBody>\n {data.map((record, index) => {\n const key = getRowKey(record, index);\n const rowProps = onRow?.(record, index);\n const className = rowClassName?.(record, index);\n\n return (\n <TableRow\n key={key}\n className={`${className || ''} hover:bg-muted/50`}\n {...rowProps}\n >\n {columns.map((column) => {\n const value = record[column.key as keyof T];\n const content = column.render\n ? column.render(value as T[ColumnKey<T>], record, index)\n : value;\n\n return (\n <TableCell\n key={String(column.key)}\n className={\n column.align === 'center'\n ? 'text-center'\n : column.align === 'right'\n ? 'text-right'\n : ''\n }\n >\n {content}\n </TableCell>\n );\n })}\n {hasActions && (\n <TableCell className=\"text-right\">\n {renderActions\n ? renderActions(record, index)\n : defaultRenderActions(record, index)}\n </TableCell>\n )}\n </TableRow>\n );\n })}\n </TableBody>\n );\n };\n\n // 默认的卡片渲染\n const defaultRenderCard = (content: ReactNode) => (\n <Card>\n {header && (\n <div className=\"p-6 pb-0\">\n <TableHeaderComponent {...header} />\n </div>\n )}\n <CardContent className=\"p-0\">{content}</CardContent>\n {pagination?.show !== false && pagination && (\n <CardFooter className=\"border-t py-4\">\n <TablePaginationComponent\n currentPage={pagination.currentPage}\n pageSize={pagination.pageSize}\n total={pagination.total}\n onPageChange={pagination.onPageChange}\n onPageSizeChange={pagination.onPageSizeChange}\n pageSizeOptions={pagination.pageSizeOptions}\n showPageSizeSelector={pagination.showPageSizeSelector}\n showJumpToPage={pagination.showJumpToPage}\n showTotal={pagination.showTotal}\n searchActive={isSearchActive}\n />\n </CardFooter>\n )}\n </Card>\n );\n\n // 默认的表格渲染\n const defaultRenderTable = (tableHeader: ReactNode, tableBody: ReactNode) => (\n <Table>\n {tableHeader}\n {tableBody}\n </Table>\n );\n\n return renderCard\n ? renderCard(\n renderTable\n ? renderTable(renderTableHeader(), renderTableBody())\n : defaultRenderTable(renderTableHeader(), renderTableBody())\n )\n : defaultRenderCard(\n renderTable\n ? renderTable(renderTableHeader(), renderTableBody())\n : defaultRenderTable(renderTableHeader(), renderTableBody())\n );\n}\n","import { useState, useEffect } from 'react';\n\nimport type {\n ButtonComponent,\n InputComponent,\n LabelComponent,\n DialogComponent,\n DialogContentComponent,\n DialogHeaderComponent,\n DialogFooterComponent,\n DialogTitleComponent,\n DialogDescriptionComponent,\n} from '../types/component-types';\n\n/**\n * UI 组件适配器接口\n */\nexport interface DialogUIComponents {\n Dialog: DialogComponent;\n DialogContent: DialogContentComponent;\n DialogHeader: DialogHeaderComponent;\n DialogFooter: DialogFooterComponent;\n DialogTitle: DialogTitleComponent;\n DialogDescription: DialogDescriptionComponent;\n Button: ButtonComponent;\n Input: InputComponent;\n Label: LabelComponent;\n}\n\nexport interface DeleteConfirmDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: React.ReactNode;\n description: React.ReactNode;\n onConfirm: () => void;\n loading?: boolean;\n confirmText?: string;\n cancelText?: string;\n confirmButtonVariant?:\n | 'default'\n | 'destructive'\n | 'outline'\n | 'secondary'\n | 'ghost'\n | 'link';\n verification?: {\n targetValue: string;\n label?: string;\n placeholder?: string;\n };\n\n // UI 组件注入\n components?: DialogUIComponents;\n\n // 自定义加载图标(可选)\n loadingIcon?: React.ReactNode;\n}\n\n/**\n * 删除确认对话框\n * 需要通过 components prop 注入 UI 组件\n */\nexport function DeleteConfirmDialog({\n open,\n onOpenChange,\n title,\n description,\n onConfirm,\n loading = false,\n confirmText = '确认删除',\n cancelText = '取消',\n confirmButtonVariant = 'destructive',\n verification,\n components,\n loadingIcon,\n}: DeleteConfirmDialogProps) {\n const [inputValue, setInputValue] = useState('');\n\n // Reset input when dialog opens/closes or target value changes\n useEffect(() => {\n if (open) {\n setInputValue('');\n }\n }, [open, verification?.targetValue]);\n\n if (!components) {\n return (\n <div className=\"p-4 text-center text-destructive\">\n 错误:请通过 components prop 注入 UI 组件\n </div>\n );\n }\n\n const {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n Button,\n Input,\n Label,\n } = components;\n\n const isConfirmDisabled = verification\n ? inputValue !== verification.targetValue\n : false;\n\n const handleConfirm = () => {\n if (isConfirmDisabled) return;\n onConfirm();\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle asChild>\n <div className=\"flex items-center gap-2\">{title}</div>\n </DialogTitle>\n <DialogDescription asChild>\n <div>{description}</div>\n </DialogDescription>\n </DialogHeader>\n\n {verification && (\n <div className=\"space-y-4 py-2\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"confirm-input\">\n {verification.label || '请输入以确认'}\n </Label>\n <Input\n id=\"confirm-input\"\n value={inputValue}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setInputValue(e.target.value)\n }\n placeholder={verification.placeholder}\n disabled={loading}\n />\n </div>\n </div>\n )}\n\n <DialogFooter>\n <Button\n variant=\"outline\"\n onClick={() => onOpenChange(false)}\n disabled={loading}\n >\n {cancelText}\n </Button>\n <Button\n variant={confirmButtonVariant}\n onClick={handleConfirm}\n disabled={isConfirmDisabled || loading}\n >\n {loading && (\n <span className=\"mr-2\">\n {loadingIcon || (\n <svg\n className=\"h-4 w-4 animate-spin\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n )}\n </span>\n )}\n {confirmText}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { Plus, Search } from 'lucide-react';\nimport { ReactNode } from 'react';\n\nimport type { InputComponent, ButtonComponent } from '../types/component-types';\n\n/**\n * UI 组件适配器接口\n */\nexport interface HeaderUIComponents {\n Input: InputComponent;\n Button: ButtonComponent;\n}\n\nexport interface TableHeaderProps {\n title: ReactNode;\n searchPlaceholder?: string;\n searchValue?: string;\n onSearchChange?: (value: string) => void;\n onSearch?: () => void;\n showSearch?: boolean;\n action?: ReactNode;\n actionLabel?: string;\n onActionClick?: () => void;\n loading?: boolean;\n\n // UI 组件注入\n components?: HeaderUIComponents;\n}\n\n/**\n * 表格头部组件\n * 支持搜索框和操作按钮\n */\nexport function TableHeader({\n title,\n searchPlaceholder = '搜索...',\n searchValue = '',\n onSearchChange,\n onSearch,\n showSearch = true,\n action,\n actionLabel,\n onActionClick,\n loading = false,\n components,\n}: TableHeaderProps) {\n if (!components) {\n return (\n <div className=\"p-4 text-center text-destructive\">\n 错误:请通过 components prop 注入 UI 组件\n </div>\n );\n }\n\n const { Input, Button } = components;\n\n const handleKeyPress = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' && onSearch) {\n onSearch();\n }\n };\n\n return (\n <div className=\"flex flex-col gap-4 p-1\">\n <div className=\"flex items-center justify-between\">\n <div className=\"text-lg font-semibold leading-none tracking-tight\">\n {title}\n </div>\n <div className=\"flex items-center gap-2\">\n {action && <div className=\"flex items-center gap-2\">{action}</div>}\n {!action && actionLabel && onActionClick && (\n <Button onClick={onActionClick} disabled={loading} size=\"sm\">\n <Plus className=\"mr-2 h-4 w-4\" />\n {actionLabel}\n </Button>\n )}\n </div>\n </div>\n {showSearch && (\n <div className=\"flex items-center gap-2\">\n <div className=\"relative max-w-sm flex-1\">\n <Search className=\"absolute left-2 top-2.5 h-4 w-4 text-muted-foreground\" />\n <Input\n placeholder={searchPlaceholder}\n value={searchValue}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n onSearchChange?.(e.target.value)\n }\n onKeyPress={handleKeyPress}\n className=\"h-9 pl-8\"\n disabled={loading}\n />\n </div>\n {onSearch && (\n <Button\n onClick={onSearch}\n disabled={loading}\n variant=\"secondary\"\n size=\"sm\"\n >\n 搜索\n </Button>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { useEffect, useState } from 'react';\n\nimport type {\n ButtonComponent,\n SelectComponent,\n SelectTriggerComponent,\n SelectContentComponent,\n SelectItemComponent,\n SelectValueComponent,\n} from '../types/component-types';\n\n/**\n * UI 组件适配器接口\n */\nexport interface PaginationUIComponents {\n Button: ButtonComponent;\n Select: SelectComponent;\n SelectTrigger: SelectTriggerComponent;\n SelectContent: SelectContentComponent;\n SelectItem: SelectItemComponent;\n SelectValue: SelectValueComponent;\n}\n\nexport interface TablePaginationProps {\n currentPage: number;\n pageSize: number;\n total: number;\n onPageChange: (page: number) => void;\n onPageSizeChange?: (pageSize: number) => void;\n pageSizeOptions?: number[];\n showPageSizeSelector?: boolean;\n showJumpToPage?: boolean;\n showTotal?: boolean;\n searchActive?: boolean;\n\n // UI 组件注入\n components?: PaginationUIComponents;\n}\n\n/**\n * 表格分页组件\n * 支持页码切换和每页条数选择\n */\nexport function TablePagination({\n currentPage,\n pageSize,\n total,\n onPageChange,\n onPageSizeChange,\n pageSizeOptions = [10, 20, 50],\n showPageSizeSelector = true,\n showJumpToPage = true,\n showTotal = true,\n searchActive = false,\n components,\n}: TablePaginationProps) {\n const [jumpPageInput, setJumpPageInput] = useState(String(currentPage + 1));\n\n useEffect(() => {\n setJumpPageInput(String(currentPage + 1));\n }, [currentPage]);\n\n if (!components) {\n return (\n <div className=\"p-4 text-center text-destructive\">\n 错误:请通过 components prop 注入 UI 组件\n </div>\n );\n }\n\n const {\n Button,\n Select,\n SelectTrigger,\n SelectContent,\n SelectItem,\n SelectValue,\n } = components;\n\n const totalPages = Math.ceil(total / pageSize);\n const safeTotalPages = Math.max(totalPages, 1);\n const startItem = currentPage * pageSize + 1;\n const endItem = Math.min((currentPage + 1) * pageSize, total);\n const availablePageSizeOptions = Array.from(\n new Set([...pageSizeOptions, pageSize])\n ).sort((a, b) => a - b);\n const canChangePageSize = showPageSizeSelector && Boolean(onPageSizeChange);\n const canSwitchPage = safeTotalPages > 1;\n\n const goToPage = (page: number) => {\n const nextPage = Math.max(0, Math.min(page, safeTotalPages - 1));\n if (nextPage === currentPage) {\n return;\n }\n onPageChange(nextPage);\n };\n\n const pageIndicators = (() => {\n if (safeTotalPages <= 7) {\n return Array.from({ length: safeTotalPages }, (_, index) => index);\n }\n\n const pages = new Set<number>([\n 0,\n 1,\n safeTotalPages - 2,\n safeTotalPages - 1,\n currentPage - 1,\n currentPage,\n currentPage + 1,\n ]);\n\n const visiblePages = Array.from(pages)\n .filter((page) => page >= 0 && page < safeTotalPages)\n .sort((a, b) => a - b);\n const indicators: Array<number | 'ellipsis'> = [];\n\n for (const page of visiblePages) {\n const previous = indicators[indicators.length - 1];\n if (typeof previous === 'number' && page - previous > 1) {\n indicators.push('ellipsis');\n }\n indicators.push(page);\n }\n\n return indicators;\n })();\n\n // 如果没有数据,不显示分页\n if (total === 0) return null;\n\n return (\n <div\n className={`flex w-full items-center gap-3 ${\n showTotal ? 'justify-between' : 'justify-end'\n }`}\n >\n {showTotal && (\n <div className=\"text-sm text-muted-foreground\">\n {searchActive\n ? `找到 ${total} 条匹配记录`\n : total > 0\n ? `显示 ${startItem} - ${endItem} 条,共 ${total} 条记录`\n : '暂无数据'}\n </div>\n )}\n <div className=\"flex flex-wrap items-center justify-end gap-2\">\n {canChangePageSize && (\n <div className=\"mr-2 flex items-center gap-2\">\n <span className=\"text-sm text-muted-foreground\">每页</span>\n <Select\n value={String(pageSize)}\n onValueChange={(value: string) => {\n const nextPageSize = Number(value);\n if (\n Number.isNaN(nextPageSize) ||\n nextPageSize === pageSize ||\n !onPageSizeChange\n ) {\n return;\n }\n onPageSizeChange(nextPageSize);\n }}\n >\n <SelectTrigger className=\"h-8 w-[90px]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {availablePageSizeOptions.map((option) => (\n <SelectItem key={option} value={String(option)}>\n {option}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <span className=\"text-sm text-muted-foreground\">条</span>\n </div>\n )}\n <div className=\"mr-4 text-sm text-muted-foreground\">\n 第 {currentPage + 1} 页,共 {safeTotalPages} 页\n </div>\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => goToPage(currentPage - 1)}\n disabled={currentPage === 0 || !canSwitchPage}\n aria-label=\"上一页\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <div className=\"flex items-center gap-1\">\n {pageIndicators.map((indicator, index) =>\n indicator === 'ellipsis' ? (\n <span\n key={`ellipsis-${index}`}\n className=\"inline-flex h-8 w-8 items-center justify-center text-sm text-muted-foreground\"\n >\n ...\n </span>\n ) : (\n <Button\n key={indicator}\n variant={indicator === currentPage ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => goToPage(indicator)}\n disabled={indicator === currentPage}\n aria-current={indicator === currentPage ? 'page' : undefined}\n >\n {indicator + 1}\n </Button>\n )\n )}\n </div>\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => goToPage(currentPage + 1)}\n disabled={currentPage >= safeTotalPages - 1 || !canSwitchPage}\n aria-label=\"下一页\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n {showJumpToPage && (\n <form\n className=\"ml-1 flex items-center gap-2\"\n onSubmit={(event) => {\n event.preventDefault();\n const nextPage = Number.parseInt(jumpPageInput, 10);\n if (Number.isNaN(nextPage)) {\n return;\n }\n goToPage(nextPage - 1);\n }}\n >\n <span className=\"text-sm text-muted-foreground\">跳至</span>\n <input\n type=\"number\"\n min={1}\n max={safeTotalPages}\n value={jumpPageInput}\n disabled={!canSwitchPage}\n onChange={(event) => setJumpPageInput(event.target.value)}\n className=\"h-8 w-16 rounded-md border border-input bg-background px-2 text-sm\"\n aria-label=\"跳转页码\"\n />\n <Button\n type=\"submit\"\n variant=\"outline\"\n size=\"sm\"\n disabled={!canSwitchPage}\n >\n 跳转\n </Button>\n </form>\n )}\n </div>\n </div>\n );\n}\n","import { useState, useEffect } from 'react';\n\nimport type {\n ButtonComponent,\n DropdownMenuComponent,\n DropdownMenuTriggerComponent,\n DropdownMenuContentComponent,\n DropdownMenuRadioGroupComponent,\n DropdownMenuRadioItemComponent,\n} from '../types/component-types';\n\n/**\n * 主题选项\n */\nexport interface ThemeOption {\n value: string;\n label: string;\n icon: React.ReactNode;\n}\n\n/**\n * UI 组件适配器接口\n */\nexport interface ThemeSwitcherUIComponents {\n DropdownMenu: DropdownMenuComponent;\n DropdownMenuTrigger: DropdownMenuTriggerComponent;\n DropdownMenuContent: DropdownMenuContentComponent;\n DropdownMenuRadioGroup: DropdownMenuRadioGroupComponent;\n DropdownMenuRadioItem: DropdownMenuRadioItemComponent;\n Button: ButtonComponent;\n}\n\nexport interface ThemeSwitcherProps {\n value: string;\n onValueChange: (value: string) => void;\n themes?: ThemeOption[];\n triggerVariant?:\n | 'default'\n | 'destructive'\n | 'outline'\n | 'secondary'\n | 'ghost'\n | 'link';\n triggerSize?: 'default' | 'sm' | 'lg' | 'icon';\n triggerClassName?: string;\n iconSize?: number;\n showCurrentIcon?: boolean;\n enableSSRHandling?: boolean;\n triggerContent?: React.ReactNode;\n components?: ThemeSwitcherUIComponents;\n // 自定义主题图标(可选)\n themeIcons?: Partial<Record<string, React.ReactNode>>;\n}\n\n/**\n * 默认主题配置\n */\nconst defaultThemes: ThemeOption[] = [\n {\n value: 'light',\n label: '浅色',\n icon: (\n <svg\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" strokeWidth=\"2\" />\n <path\n className=\"opacity-75\"\n d=\"M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n ),\n },\n {\n value: 'dark',\n label: '深色',\n icon: (\n <svg\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n d=\"M21 12.79A9 9 0 1111.21 3 7 7 0 0021 12.79z\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n ),\n },\n {\n value: 'system',\n label: '跟随系统',\n icon: (\n <svg\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <rect\n x=\"2\"\n y=\"3\"\n width=\"20\"\n height=\"14\"\n rx=\"2\"\n ry=\"2\"\n strokeWidth=\"2\"\n />\n <path d=\"M8 21h8m-4-4v4\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n ),\n },\n];\n\n/**\n * 主题切换组件\n * 需要通过 components prop 注入 UI 组件\n */\nexport function ThemeSwitcher({\n value,\n onValueChange,\n themes = defaultThemes,\n triggerVariant = 'ghost',\n triggerSize = 'icon',\n triggerClassName,\n iconSize = 16,\n showCurrentIcon = true,\n enableSSRHandling = true,\n triggerContent,\n components,\n themeIcons,\n}: ThemeSwitcherProps) {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n if (enableSSRHandling && !mounted) {\n return null;\n }\n\n if (!components) {\n return (\n <div className=\"p-4 text-center text-destructive\">\n 错误:请通过 components prop 注入 UI 组件\n </div>\n );\n }\n\n const {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n Button,\n } = components;\n\n /**\n * 获取主题图标\n * 优先使用 themeIcons 中的自定义图标,如果没有则使用主题配置中的默认图标\n */\n const getThemeIcon = (themeValue: string): React.ReactNode => {\n if (themeIcons && themeIcons[themeValue]) {\n return themeIcons[themeValue];\n }\n const theme = themes.find((t) => t.value === themeValue);\n return theme?.icon;\n };\n\n const currentIcon = getThemeIcon(value);\n\n const triggerIcon = showCurrentIcon ? currentIcon : null;\n const iconStyle = iconSize ? { width: iconSize, height: iconSize } : {};\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant={triggerVariant}\n size={triggerSize}\n className={triggerClassName}\n >\n {triggerContent || (\n <span\n style={iconStyle}\n className=\"inline-flex items-center justify-center\"\n >\n {triggerIcon}\n </span>\n )}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n <DropdownMenuRadioGroup value={value} onValueChange={onValueChange}>\n {themes.map((theme) => (\n <DropdownMenuRadioItem key={theme.value} value={theme.value}>\n <span className=\"mr-2 inline-flex items-center\">\n {getThemeIcon(theme.value)}\n </span>\n <span>{theme.label}</span>\n </DropdownMenuRadioItem>\n ))}\n </DropdownMenuRadioGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","import type {\n DropdownMenuRadioGroupComponent,\n DropdownMenuRadioItemComponent,\n} from '../types/component-types';\n\n/**\n * 主题选项\n */\nexport interface ThemeOption {\n value: string;\n label: string;\n icon: React.ReactNode;\n}\n\nexport interface ThemeSwitcherContentProps {\n value: string;\n onValueChange: (value: string) => void;\n themes?: ThemeOption[];\n iconSize?: number;\n components?: Pick<\n ThemeSwitcherContentUIComponents,\n 'DropdownMenuRadioGroup' | 'DropdownMenuRadioItem'\n >;\n // 自定义主题图标(可选)\n themeIcons?: Partial<Record<string, React.ReactNode>>;\n}\n\n/**\n * UI 组件适配器接口(轻量版)\n */\nexport interface ThemeSwitcherContentUIComponents {\n DropdownMenuRadioGroup: DropdownMenuRadioGroupComponent;\n DropdownMenuRadioItem: DropdownMenuRadioItemComponent;\n}\n\n/**\n * 默认主题配置\n */\nconst defaultThemes: ThemeOption[] = [\n {\n value: 'light',\n label: '浅色',\n icon: (\n <svg\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" strokeWidth=\"2\" />\n <path\n className=\"opacity-75\"\n d=\"M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n ),\n },\n {\n value: 'dark',\n label: '深色',\n icon: (\n <svg\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n d=\"M21 12.79A9 9 0 1111.21 3 7 7 0 0021 12.79z\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n ),\n },\n {\n value: 'system',\n label: '跟随系统',\n icon: (\n <svg\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <rect\n x=\"2\"\n y=\"3\"\n width=\"20\"\n height=\"14\"\n rx=\"2\"\n ry=\"2\"\n strokeWidth=\"2\"\n />\n <path d=\"M8 21h8m-4-4v4\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n ),\n },\n];\n\n/**\n * 主题切换内容组件(轻量版)\n * 可嵌入到其他 DropdownMenu 中使用\n */\nexport function ThemeSwitcherContent({\n value,\n onValueChange,\n themes = defaultThemes,\n iconSize = 16,\n components,\n themeIcons,\n}: ThemeSwitcherContentProps) {\n if (!components) {\n return (\n <div className=\"p-4 text-center text-destructive\">\n 错误:请通过 components prop 注入 UI 组件\n </div>\n );\n }\n\n const { DropdownMenuRadioGroup, DropdownMenuRadioItem } = components;\n\n /**\n * 获取主题图标\n * 优先使用 themeIcons 中的自定义图标,如果没有则使用主题配置中的默认图标\n */\n const getThemeIcon = (themeValue: string): React.ReactNode => {\n if (themeIcons && themeIcons[themeValue]) {\n return themeIcons[themeValue];\n }\n const theme = themes.find((t) => t.value === themeValue);\n return theme?.icon;\n };\n\n const iconStyle = iconSize ? { width: iconSize, height: iconSize } : {};\n\n return (\n <DropdownMenuRadioGroup value={value} onValueChange={onValueChange}>\n {themes.map((theme) => (\n <DropdownMenuRadioItem key={theme.value} value={theme.value}>\n <span className=\"mr-2 inline-flex items-center\" style={iconStyle}>\n {getThemeIcon(theme.value)}\n </span>\n <span>{theme.label}</span>\n </DropdownMenuRadioItem>\n ))}\n </DropdownMenuRadioGroup>\n );\n}\n","import {\n ChevronLeft as ChevronLeftIcon,\n ChevronRight as ChevronRightIcon,\n Maximize2 as Maximize2Icon,\n Minimize2 as Minimize2Icon,\n ZoomIn as ZoomInIcon,\n ZoomOut as ZoomOutIcon,\n} from 'lucide-react';\nimport { useState, useMemo, useCallback, useEffect, useRef } from 'react';\nimport type { HTMLAttributes } from 'react';\n\nimport type {\n CardComponent,\n ButtonComponent,\n InputComponent,\n SkeletonComponent,\n} from '../types/component-types';\n\n/**\n * react-pdf 类型定义\n * 这些类型由 @types/react-pdf 提供,这里我们定义必要的接口\n */\nexport interface PDFDocumentProxy {\n numPages: number;\n getPage(pageNumber: number): Promise<any>;\n}\n\n/**\n * SimplePDFReader UI 组件接口\n */\nexport interface SimplePDFReaderUIComponents {\n Card: CardComponent;\n CardContent: React.ComponentType<HTMLAttributes<HTMLDivElement>>;\n Button: ButtonComponent;\n Input?: InputComponent;\n Skeleton: SkeletonComponent;\n}\n\n/**\n * SimplePDFReader 组件 Props\n */\nexport interface SimplePDFReaderProps {\n // PDF 数据源\n url: string;\n\n // 初始状态\n initialPage?: number;\n initialScale?: number;\n\n // 缩放控制\n scale?: number;\n onScaleChange?: (scale: number) => void;\n minScale?: number;\n maxScale?: number;\n\n // 页面导航\n currentPage?: number;\n onPageChange?: (page: number) => void;\n\n // 功能开关\n showToolbar?: boolean; // 默认 true\n showPagination?: boolean; // 默认 true\n enableHotkeys?: boolean; // 默认 true\n\n // 样式定制\n className?: string;\n containerClassName?: string;\n pageClassName?: string;\n\n // UI 组件注入\n components: SimplePDFReaderUIComponents;\n\n // 回调函数\n onLoadSuccess?: (pdf: PDFDocumentProxy) => void;\n onLoadError?: (error: Error) => void;\n\n // 加载状态文本\n loadingText?: string; // 默认 \"加载中...\"\n errorText?: string; // 默认 \"加载失败\"\n}\n\n/**\n * SimplePDFReader 组件\n *\n * 用于在 React 应用中展示和浏览 PDF 文档。\n * 支持从 URL 加载 PDF,提供基础的浏览功能(翻页、缩放),并包含性能优化。\n *\n * @example\n * ```tsx\n * import { SimplePDFReader } from '@turinhub/atomix-common-ui';\n * import { Card, Button, Skeleton } from '@/components/ui';\n *\n * <SimplePDFReader\n * url=\"/documents/sample.pdf\"\n * components={{\n * Card,\n * CardContent: Card.Content,\n * Button,\n * Skeleton,\n * }}\n * initialPage={1}\n * initialScale={1.0}\n * showToolbar={true}\n * showPagination={true}\n * enableHotkeys={true}\n * onPageChange={(page) => console.log('Current page:', page)}\n * />\n *\n * Keyboard Shortcuts:\n * - Arrow Left/Right: Navigate pages\n * - Ctrl/Cmd + +/-: Zoom in/out\n * - F: Toggle fullscreen\n * ```\n */\nexport function SimplePDFReader({\n url,\n initialPage = 1,\n initialScale = 1.0,\n scale: controlledScale,\n onScaleChange,\n minScale = 0.5,\n maxScale = 3.0,\n currentPage: controlledPage,\n onPageChange,\n showToolbar = true,\n showPagination = true,\n enableHotkeys = true,\n className,\n containerClassName,\n pageClassName,\n components,\n onLoadSuccess,\n onLoadError,\n loadingText = '加载中...',\n errorText = '加载失败',\n}: SimplePDFReaderProps) {\n // ==================== React Hooks (必须在最顶部) ====================\n\n // 状态管理\n const [pdfDocument, setPdfDocument] = useState<PDFDocumentProxy | null>(null);\n const [internalPage, setInternalPage] = useState(initialPage);\n const [internalScale, setInternalScale] = useState(initialScale);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const [totalPages, setTotalPages] = useState(0);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const readerRef = useRef<HTMLDivElement>(null);\n const loadingTaskRef = useRef<any>(null);\n\n // 动态导入 react-pdf\n const [ReactPDF, setReactPDF] = useState<any>(null);\n\n // 使用受控或非受控模式\n const currentPage = controlledPage ?? internalPage;\n const scale = controlledScale ?? internalScale;\n\n // 预渲染相邻页面以提升翻页体验\n const pagesToPreload = useMemo(() => {\n const pages = [currentPage];\n if (currentPage > 1) pages.push(currentPage - 1);\n if (currentPage < totalPages) pages.push(currentPage + 1);\n return pages;\n }, [currentPage, totalPages]);\n\n // 页面导航处理\n const goToPage = useCallback(\n (page: number) => {\n const maxPage = Math.max(totalPages, 1);\n const targetPage = Math.min(Math.max(page, 1), maxPage);\n if (controlledPage === undefined) {\n setInternalPage(targetPage);\n }\n onPageChange?.(targetPage);\n },\n [totalPages, controlledPage, onPageChange]\n );\n\n const handlePreviousPage = useCallback(() => {\n if (currentPage > 1) {\n goToPage(currentPage - 1);\n }\n }, [currentPage, goToPage]);\n\n const handleNextPage = useCallback(() => {\n if (currentPage < totalPages) {\n goToPage(currentPage + 1);\n }\n }, [currentPage, totalPages, goToPage]);\n\n // 缩放控制处理\n const handleZoomIn = useCallback(() => {\n const newScale = Math.min(scale + 0.25, maxScale);\n if (controlledScale === undefined) {\n setInternalScale(newScale);\n }\n onScaleChange?.(newScale);\n }, [scale, maxScale, controlledScale, onScaleChange]);\n\n const handleZoomOut = useCallback(() => {\n const newScale = Math.max(scale - 0.25, minScale);\n if (controlledScale === undefined) {\n setInternalScale(newScale);\n }\n onScaleChange?.(newScale);\n }, [scale, minScale, controlledScale, onScaleChange]);\n\n const handleToggleFullscreen = useCallback(async () => {\n if (typeof document === 'undefined') return;\n\n if (!document.fullscreenElement) {\n await readerRef.current?.requestFullscreen?.();\n return;\n }\n\n await document.exitFullscreen?.();\n }, []);\n\n // 动态导入 react-pdf 和设置 worker\n useEffect(() => {\n let isMounted = true;\n\n const loadReactPDF = async () => {\n try {\n // 动态导入 react-pdf\n const pdfModule = await import('react-pdf');\n // 设置 worker\n if (typeof window !== 'undefined') {\n const pdfjs = (pdfModule as any).pdfjs;\n const workerVersion = pdfjs?.version;\n if (pdfjs?.GlobalWorkerOptions && workerVersion) {\n pdfjs.GlobalWorkerOptions.workerSrc = `https://cdn.jsdelivr.net/npm/pdfjs-dist@${workerVersion}/build/pdf.worker.min.mjs`;\n }\n }\n if (isMounted) {\n setReactPDF(pdfModule);\n }\n } catch (err) {\n if (isMounted) {\n const loadError =\n err instanceof Error ? err : new Error('无法加载 react-pdf 库');\n setError(loadError);\n setIsLoading(false);\n onLoadError?.(loadError);\n }\n }\n };\n\n loadReactPDF();\n\n return () => {\n isMounted = false;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // 加载 PDF 文档\n useEffect(() => {\n if (!ReactPDF || !url) return;\n\n let isMounted = true;\n\n const loadPDF = async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n const { Document } = ReactPDF;\n if (!Document) {\n throw new Error('react-pdf Document 组件不可用');\n }\n\n // 使用 react-pdf 的 Document 组件内部加载逻辑\n // 我们创建一个加载器来获取 PDF 文档信息\n const loadingTask = (ReactPDF.pdfjs as any).getDocument(url);\n loadingTaskRef.current = loadingTask;\n const pdf = await loadingTask.promise;\n\n if (isMounted) {\n setPdfDocument(pdf as PDFDocumentProxy);\n setTotalPages(pdf.numPages);\n if (controlledPage === undefined) {\n setInternalPage((prev) =>\n Math.max(1, Math.min(prev, pdf.numPages))\n );\n }\n setIsLoading(false);\n onLoadSuccess?.(pdf as PDFDocumentProxy);\n }\n } catch (err) {\n if (isMounted) {\n const loadError =\n err instanceof Error ? err : new Error('PDF 加载失败');\n setError(loadError);\n setIsLoading(false);\n onLoadError?.(loadError);\n }\n }\n };\n\n loadPDF();\n\n return () => {\n isMounted = false;\n if (\n loadingTaskRef.current &&\n typeof loadingTaskRef.current.destroy === 'function'\n ) {\n loadingTaskRef.current.destroy();\n loadingTaskRef.current = null;\n }\n };\n }, [ReactPDF, url, controlledPage, onLoadSuccess, onLoadError]);\n\n useEffect(() => {\n if (typeof document === 'undefined') return;\n\n const handleFullscreenChange = () => {\n setIsFullscreen(document.fullscreenElement === readerRef.current);\n };\n\n document.addEventListener('fullscreenchange', handleFullscreenChange);\n\n return () => {\n document.removeEventListener('fullscreenchange', handleFullscreenChange);\n };\n }, []);\n\n // ==================== 键盘快捷键 ====================\n useEffect(() => {\n if (!enableHotkeys) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n // Don't handle hotkeys if input is focused\n const activeElement = document.activeElement;\n if (\n activeElement &&\n (activeElement.tagName === 'INPUT' ||\n activeElement.getAttribute('role') === 'input')\n ) {\n return;\n }\n\n // Ctrl/Cmd + 加号: 放大\n if ((e.ctrlKey || e.metaKey) && (e.key === '=' || e.key === '+')) {\n e.preventDefault();\n handleZoomIn();\n }\n // Ctrl/Cmd + 减号: 缩小\n else if ((e.ctrlKey || e.metaKey) && e.key === '-') {\n e.preventDefault();\n handleZoomOut();\n }\n // 左箭头: 上一页\n else if (e.key === 'ArrowLeft') {\n e.preventDefault();\n handlePreviousPage();\n }\n // 右箭头: 下一页\n else if (e.key === 'ArrowRight') {\n e.preventDefault();\n handleNextPage();\n }\n // F 键: 全屏切换\n else if (e.key === 'f' || e.key === 'F') {\n e.preventDefault();\n void handleToggleFullscreen();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [\n enableHotkeys,\n handleZoomIn,\n handleZoomOut,\n handlePreviousPage,\n handleNextPage,\n handleToggleFullscreen,\n ]);\n\n // ==================== 组件验证和渲染 ====================\n\n // 验证 components\n if (!components) {\n return (\n <div className=\"p-4 text-center text-destructive\">\n 错误:请通过 components prop 注入 UI 组件\n </div>\n );\n }\n\n const {\n Card,\n CardContent,\n Button,\n Input: InputComponentInjected,\n Skeleton,\n } = components;\n\n // 渲染工具栏\n const renderToolbar = () => {\n if (!showToolbar) return null;\n\n return (\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleZoomOut}\n disabled={scale <= minScale}\n >\n <ZoomOutIcon />\n </Button>\n <span className=\"text-sm\">{Math.round(scale * 100)}%</span>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleZoomIn}\n disabled={scale >= maxScale}\n >\n <ZoomInIcon />\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => {\n void handleToggleFullscreen();\n }}\n >\n {isFullscreen ? <Minimize2Icon /> : <Maximize2Icon />}\n </Button>\n </div>\n );\n };\n\n // 渲染分页控制\n const renderPagination = () => {\n if (!showPagination) return null;\n\n return (\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={handlePreviousPage}\n disabled={currentPage <= 1}\n >\n <ChevronLeftIcon />\n </Button>\n {InputComponentInjected ? (\n <InputComponentInjected\n type=\"number\"\n min={1}\n max={Math.max(totalPages, 1)}\n value={currentPage}\n onChange={(e) => goToPage(parseInt(e.target.value, 10) || 1)}\n className=\"w-16 text-center\"\n />\n ) : (\n <input\n type=\"number\"\n min={1}\n max={Math.max(totalPages, 1)}\n value={currentPage}\n onChange={(e) => goToPage(parseInt(e.target.value, 10) || 1)}\n className=\"w-16 rounded-md border border-input bg-background px-2 text-center text-sm\"\n />\n )}\n <span className=\"text-sm text-muted-foreground\">/ {totalPages}</span>\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={handleNextPage}\n disabled={currentPage >= totalPages}\n >\n <ChevronRightIcon />\n </Button>\n </div>\n );\n };\n\n const renderOperations = () => {\n if (!showToolbar && !showPagination) return null;\n\n return (\n <div\n data-testid=\"pdf-operations-bar\"\n className=\"flex items-center justify-between gap-4 border-b px-4 py-2\"\n >\n {renderToolbar()}\n {renderPagination()}\n </div>\n );\n };\n\n // 渲染加载状态\n const renderLoading = () => (\n <div className=\"flex flex-col items-center justify-center space-y-4 p-8\">\n <Skeleton className=\"h-8 w-32\" />\n <Skeleton className=\"h-64 w-full max-w-2xl\" />\n <p className=\"text-sm text-muted-foreground\">{loadingText}</p>\n </div>\n );\n\n // 渲染错误状态\n const renderError = () => (\n <div className=\"flex flex-col items-center justify-center space-y-4 p-8\">\n <div className=\"text-center text-destructive\">\n <p className=\"font-medium\">{errorText}</p>\n {error && (\n <p className=\"mt-2 text-sm text-muted-foreground\">{error.message}</p>\n )}\n </div>\n </div>\n );\n\n // 渲染 PDF 文档\n const renderPDFDocument = () => {\n if (!ReactPDF || !pdfDocument) return null;\n\n const { Page } = ReactPDF;\n\n return (\n <div\n className={`flex flex-col items-center justify-center ${\n isFullscreen\n ? 'h-[calc(100vh-56px)] overflow-auto'\n : 'overflow-visible'\n }`}\n >\n {pagesToPreload.map((pageNum) => (\n <div\n key={pageNum}\n className={pageClassName}\n style={{\n display: pageNum === currentPage ? 'block' : 'none',\n }}\n >\n <Page\n pdf={pdfDocument}\n pageNumber={pageNum}\n scale={scale}\n renderTextLayer={false}\n renderAnnotationLayer={false}\n className=\"shadow-md\"\n />\n </div>\n ))}\n </div>\n );\n };\n\n return (\n <div ref={readerRef}>\n <Card className={className}>\n {renderOperations()}\n <CardContent className={containerClassName}>\n {isLoading\n ? renderLoading()\n : error\n ? renderError()\n : renderPDFDocument()}\n </CardContent>\n </Card>\n </div>\n );\n}\n","import { useState, useEffect, memo } from 'react';\n\nimport type {\n TabsComponent,\n TabsListComponent,\n TabsTriggerComponent,\n TabsContentComponent,\n ScrollAreaComponent,\n SkeletonComponent,\n} from '../types/component-types';\n\n/**\n * react-pdf 类型定义\n */\nexport interface PDFDocumentProxy {\n numPages: number;\n getPage(pageNumber: number): Promise<PDFPageProxy>;\n getOutline(): Promise<PDFOutline[] | null>;\n getDestination(dest: string): Promise<unknown[] | null>;\n getPageIndex(ref: unknown): Promise<number>;\n}\n\nexport interface PDFPageProxy {\n getViewport(options: { scale: number }): PDFViewport;\n render(renderContext: {\n canvasContext: CanvasRenderingContext2D;\n viewport: PDFViewport;\n canvas: HTMLCanvasElement;\n }): { promise: Promise<void> };\n}\n\nexport interface PDFViewport {\n width: number;\n height: number;\n}\n\nexport interface PDFOutline {\n title: string;\n bold?: boolean;\n italic?: boolean;\n color?: Uint8ClampedArray;\n dest?: string | unknown[] | null;\n url?: string | null;\n unsafeUrl?: string;\n newWindow?: boolean;\n count?: number;\n items?: PDFOutline[];\n pageNumber?: number;\n}\n\n/**\n * PDF 缩略图\n */\ninterface PDFThumbnail {\n pageNumber: number;\n url: string;\n}\n\n/**\n * PDFSidebar 组件 Props\n */\nexport interface PDFSidebarProps {\n /** PDF 文档对象 */\n pdfDocument: PDFDocumentProxy | null;\n /** 当前页码 */\n currentPage: number;\n /** 页面点击回调 */\n onPageClick: (pageNumber: number) => void;\n /** UI 组件注入 */\n components: {\n Tabs: TabsComponent;\n TabsList: TabsListComponent;\n TabsTrigger: TabsTriggerComponent;\n TabsContent: TabsContentComponent;\n ScrollArea: ScrollAreaComponent;\n Skeleton: SkeletonComponent;\n };\n}\n\n/**\n * PDF 缩略图组件 (使用 React.memo 优化性能)\n */\nconst PDFThumbnail = memo(\n ({\n thumbnail,\n isCurrentPage,\n onClick,\n }: {\n thumbnail: PDFThumbnail;\n isCurrentPage: boolean;\n onClick: () => void;\n }) => (\n <div\n className={`flex w-full flex-col items-center rounded p-1 ${\n isCurrentPage ? 'bg-primary/10' : ''\n }`}\n >\n <img\n src={thumbnail.url}\n alt={`Page ${thumbnail.pageNumber}`}\n className=\"w-48 cursor-pointer border transition-opacity hover:opacity-80\"\n onClick={onClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick();\n }\n }}\n role=\"button\"\n tabIndex={0}\n />\n <span className=\"mt-1 text-sm\">第 {thumbnail.pageNumber} 页</span>\n </div>\n )\n);\nPDFThumbnail.displayName = 'PDFThumbnail';\n\n/**\n * PDF 书签组件\n */\nconst PDFBookmark = ({\n bookmark,\n depth,\n onClick,\n}: {\n bookmark: PDFOutline;\n depth: number;\n onClick: (bookmark: PDFOutline) => void;\n}) => (\n <div style={{ paddingLeft: `${depth * 16}px` }}>\n <button\n onClick={() => onClick(bookmark)}\n className=\"w-full rounded px-2 py-1 text-left text-sm hover:bg-primary/10 hover:text-primary\"\n >\n {bookmark.title}\n </button>\n {bookmark.items &&\n bookmark.items.map((item, index) => (\n <PDFBookmark\n key={`${bookmark.title}-${index}`}\n bookmark={item}\n depth={depth + 1}\n onClick={onClick}\n />\n ))}\n </div>\n);\n\n/**\n * PDFSidebar 组件\n *\n * 提供缩略图和书签导航功能。\n *\n * @example\n * ```tsx\n * import { PDFSidebar } from '@turinhub/atomix-common-ui';\n * import { Tabs, ScrollArea, Skeleton } from '@/components/ui';\n *\n * <PDFSidebar\n * pdfDocument={pdfDocument}\n * currentPage={currentPage}\n * onPageClick={handlePageClick}\n * components={{\n * Tabs,\n * TabsList: Tabs.List,\n * TabsTrigger: Tabs.Trigger,\n * TabsContent: Tabs.Content,\n * ScrollArea,\n * Skeleton,\n * }}\n * />\n * ```\n */\nexport function PDFSidebar({\n pdfDocument,\n currentPage,\n onPageClick,\n components,\n}: PDFSidebarProps) {\n const [thumbnails, setThumbnails] = useState<PDFThumbnail[]>([]);\n const [bookmarks, setBookmarks] = useState<PDFOutline[]>([]);\n const [loading, setLoading] = useState(true);\n\n const { Tabs, TabsList, TabsTrigger, TabsContent, ScrollArea, Skeleton } =\n components;\n\n // 加载缩略图\n useEffect(() => {\n const loadThumbnails = async () => {\n if (!pdfDocument) return;\n\n setLoading(true);\n const thumbs: PDFThumbnail[] = [];\n\n for (let i = 1; i <= pdfDocument.numPages; i++) {\n try {\n const page = await pdfDocument.getPage(i);\n const viewport = page.getViewport({ scale: 0.2 });\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n\n if (!context) continue;\n\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n\n await page.render({\n canvasContext: context,\n viewport,\n canvas,\n }).promise;\n\n thumbs.push({\n pageNumber: i,\n url: canvas.toDataURL(),\n });\n } catch (error) {\n console.error(`Error loading thumbnail for page ${i}:`, error);\n }\n }\n\n setThumbnails(thumbs);\n setLoading(false);\n };\n\n loadThumbnails();\n }, [pdfDocument]);\n\n // 加载书签\n useEffect(() => {\n const loadBookmarks = async () => {\n if (!pdfDocument) return;\n try {\n const outline = await pdfDocument.getOutline();\n setBookmarks((outline as PDFOutline[]) || []);\n } catch (error) {\n console.error('Error loading bookmarks:', error);\n setBookmarks([]);\n }\n };\n\n loadBookmarks();\n }, [pdfDocument]);\n\n // 处理书签点击\n const handleBookmarkClick = async (bookmark: PDFOutline) => {\n if (!pdfDocument) return;\n\n try {\n let pageIndex: number | undefined;\n\n // 处理不同类型的书签目标\n if (bookmark.dest) {\n if (typeof bookmark.dest === 'string') {\n // 命名目标\n const destination = await pdfDocument.getDestination(bookmark.dest);\n if (destination && destination[0]) {\n pageIndex = await pdfDocument.getPageIndex(destination[0]);\n }\n } else if (Array.isArray(bookmark.dest) && bookmark.dest[0]) {\n // 显式目标\n pageIndex = await pdfDocument.getPageIndex(bookmark.dest[0]);\n }\n } else if (bookmark.pageNumber) {\n // 直接页码\n pageIndex = bookmark.pageNumber - 1;\n }\n\n if (typeof pageIndex === 'number') {\n onPageClick(pageIndex + 1);\n }\n } catch (error) {\n console.error('Error navigating to bookmark:', error);\n }\n };\n\n // 渲染缩略图骨架屏\n const renderThumbnailSkeleton = () => (\n <div className=\"space-y-2 p-4\">\n {Array.from({ length: pdfDocument?.numPages || 5 }, (_, i) => (\n <div key={i} className=\"flex flex-col items-center p-1\">\n <Skeleton className=\"h-32 w-48\" />\n <Skeleton className=\"mt-1 h-4 w-16\" />\n </div>\n ))}\n </div>\n );\n\n return (\n <div className=\"w-64 border-r bg-muted\">\n <Tabs defaultValue=\"thumbnails\">\n <TabsList className=\"w-full p-2\">\n <TabsTrigger value=\"thumbnails\" className=\"flex-1 bg-transparent\">\n 缩略图\n </TabsTrigger>\n <TabsTrigger value=\"bookmarks\" className=\"flex-1 bg-transparent\">\n 书签\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"thumbnails\">\n <ScrollArea className=\"h-[calc(100vh-8rem)]\">\n {loading ? (\n renderThumbnailSkeleton()\n ) : (\n <div className=\"space-y-2 p-4\">\n {thumbnails.map((thumb) => (\n <PDFThumbnail\n key={thumb.pageNumber}\n thumbnail={thumb}\n isCurrentPage={currentPage === thumb.pageNumber}\n onClick={() => onPageClick(thumb.pageNumber)}\n />\n ))}\n </div>\n )}\n </ScrollArea>\n </TabsContent>\n\n <TabsContent value=\"bookmarks\">\n <ScrollArea className=\"h-[calc(100vh-8rem)]\">\n <div className=\"p-4\">\n {bookmarks.length === 0 ? (\n <div className=\"py-4 text-center text-sm text-muted-foreground\">\n 没有可用的书签\n </div>\n ) : (\n <div className=\"space-y-2\">\n {bookmarks.map((bookmark, index) => (\n <PDFBookmark\n key={`${bookmark.title}-${index}`}\n bookmark={bookmark}\n depth={0}\n onClick={handleBookmarkClick}\n />\n ))}\n </div>\n )}\n </div>\n </ScrollArea>\n </TabsContent>\n </Tabs>\n </div>\n );\n}\n","import {\n ChevronLeft as ChevronLeftIcon,\n ChevronRight as ChevronRightIcon,\n FileText as FileTextIcon,\n Maximize2 as Maximize2Icon,\n Minimize2 as Minimize2Icon,\n PanelLeft as PanelLeftIcon,\n RotateCw as RotateCwIcon,\n ScrollText as ScrollTextIcon,\n ZoomIn as ZoomInIcon,\n ZoomOut as ZoomOutIcon,\n} from 'lucide-react';\nimport { useState, useCallback, useEffect, useMemo, useRef } from 'react';\nimport type { HTMLAttributes } from 'react';\n\nimport type {\n CardComponent,\n ButtonComponent,\n InputComponent,\n SkeletonComponent,\n} from '../types/component-types';\n\nimport type { PDFDocumentProxy } from './PDFSidebar';\nimport { PDFSidebar } from './PDFSidebar';\n\n/**\n * PDFReader UI 组件接口\n */\nexport interface PDFReaderUIComponents {\n /** Card 组件 (必需) */\n Card: CardComponent;\n /** CardContent 组件 (必需) */\n CardContent: React.ComponentType<HTMLAttributes<HTMLDivElement>>;\n /** Button 组件 (必需) */\n Button: ButtonComponent;\n /** Input 组件 (必需) */\n Input: InputComponent;\n /** Skeleton 组件 (必需) */\n Skeleton: SkeletonComponent;\n /** Tabs 组件 (showSidebar=true 时必需) */\n Tabs?: React.ComponentType<{\n value?: string;\n onValueChange?: (value: string) => void;\n children?: React.ReactNode;\n defaultValue?: string;\n }>;\n /** TabsList 组件 (showSidebar=true 时必需) */\n TabsList?: React.ComponentType<HTMLAttributes<HTMLDivElement>>;\n /** TabsTrigger 组件 (showSidebar=true 时必需) */\n TabsTrigger?: React.ComponentType<{\n value: string;\n children?: React.ReactNode;\n }>;\n /** TabsContent 组件 (showSidebar=true 时必需) */\n TabsContent?: React.ComponentType<{\n value: string;\n children?: React.ReactNode;\n }>;\n /** ScrollArea 组件 (showSidebar=true 时必需) */\n ScrollArea?: React.ComponentType<HTMLAttributes<HTMLDivElement>>;\n}\n\n/**\n * PDFReader 组件 Props\n */\nexport interface PDFReaderProps {\n // ==================== 基础配置 ====================\n /** PDF 文件 URL (必需) */\n url: string;\n\n // ==================== 初始状态 ====================\n /** 初始页码 (默认 1) */\n initialPage?: number;\n /** 初始缩放比例 (默认 1.0) */\n initialScale?: number;\n /** 初始旋转角度 (默认 0) */\n initialRotation?: number;\n\n // ==================== 受控模式 ====================\n /** 当前页码 (受控) */\n currentPage?: number;\n /** 页码变化回调 */\n onPageChange?: (page: number) => void;\n /** 缩放比例 (受控) */\n scale?: number;\n /** 缩放变化回调 */\n onScaleChange?: (scale: number) => void;\n /** 旋转角度 (受控) */\n rotation?: number;\n /** 旋转变化回调 */\n onRotationChange?: (rotation: number) => void;\n\n // ==================== 缩放限制 ====================\n /** 最小缩放比例 (默认 0.5) */\n minScale?: number;\n /** 最大缩放比例 (默认 2.5) */\n maxScale?: number;\n\n // ==================== 功能开关 ====================\n /** 显示工具栏 (默认 true) */\n showToolbar?: boolean;\n /** 显示侧边栏 (默认 true) */\n showSidebar?: boolean;\n /** 显示旋转按钮 (默认 true) */\n showRotation?: boolean;\n /** 显示模式切换按钮 (默认 true) */\n showModeToggle?: boolean;\n /** 显示全屏按钮 (默认 true) */\n showFullscreen?: boolean;\n /** 启用键盘快捷键 (默认 true) */\n enableHotkeys?: boolean;\n /** 启用移动端导航 (默认 true) */\n enableMobileNav?: boolean;\n\n // ==================== 显示模式 ====================\n /** 显示模式: 'scroll' 显示所有页面, 'single' 单页模式 (默认 'scroll') */\n displayMode?: 'scroll' | 'single';\n\n // ==================== 样式定制 ====================\n /** 容器类名 */\n className?: string;\n /** 工具栏类名 */\n toolbarClassName?: string;\n /** 内容区域类名 */\n contentClassName?: string;\n /** 阅读区域高度限制 (默认 '80vh') */\n contentHeight?: string | number;\n /** 页面类名 */\n pageClassName?: string;\n\n // ==================== Worker 配置 ====================\n /** Worker 文件 URL (可选,默认使用 CDN) */\n workerUrl?: string;\n /** CMap 文件 URL (可选,默认使用 CDN) */\n cMapUrl?: string;\n /** 标准字体数据 URL (可选,默认使用 CDN) */\n standardFontDataUrl?: string;\n\n // ==================== UI 组件注入 ====================\n /** UI 组件 */\n components: PDFReaderUIComponents;\n\n // ==================== 回调函数 ====================\n /** 加载成功回调 */\n onLoadSuccess?: (pdf: PDFDocumentProxy) => void;\n /** 加载错误回调 */\n onLoadError?: (error: Error) => void;\n /** 页面渲染回调 */\n onPageRender?: (pageIndex: number) => void;\n\n // ==================== 文本配置 ====================\n /** 加载文本 (默认 '正在加载PDF文档...') */\n loadingText?: string;\n /** 错误文本 (默认 'PDF加载失败') */\n errorText?: string;\n}\n\n/**\n * debounce hook (替代 lodash.debounce)\n */\nfunction useDebounce<T extends (...args: any[]) => any>(\n callback: T,\n delay: number\n): T {\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>(\n undefined\n );\n return useCallback(\n (...args: Parameters<T>) => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n timeoutRef.current = setTimeout(() => callback(...args), delay);\n },\n [callback, delay]\n ) as T;\n}\n\n/**\n * PDFReader 组件\n *\n * 功能完整的 PDF 阅读器组件,支持侧边栏导航、页面旋转、显示模式切换等高级特性。\n *\n * @example\n * ```tsx\n * import { PDFReader } from '@turinhub/atomix-common-ui';\n * import { Card, Button, Input, Label, Skeleton } from '@/components/ui';\n * import { Tabs, ScrollArea } from '@/components/ui';\n *\n * <PDFReader\n * url=\"/documents/sample.pdf\"\n * components={{\n * Card,\n * CardContent: Card.Content,\n * Button,\n * Input,\n * Label,\n * Skeleton,\n * Tabs,\n * TabsList: Tabs.List,\n * TabsTrigger: Tabs.Trigger,\n * TabsContent: Tabs.Content,\n * ScrollArea,\n * }}\n * initialPage={1}\n * initialScale={1.0}\n * showSidebar={true}\n * showRotation={true}\n * showModeToggle={true}\n * enableHotkeys={true}\n * />\n * ```\n */\nexport function PDFReader({\n url,\n initialPage = 1,\n initialScale = 1.0,\n initialRotation = 0,\n currentPage: controlledPage,\n onPageChange,\n scale: controlledScale,\n onScaleChange,\n rotation: controlledRotation,\n onRotationChange,\n minScale = 0.5,\n maxScale = 2.5,\n showToolbar = true,\n showSidebar = true,\n showRotation = true,\n showModeToggle = true,\n showFullscreen = true,\n enableHotkeys = true,\n enableMobileNav = true,\n displayMode: initialDisplayMode = 'scroll',\n className,\n toolbarClassName,\n contentClassName,\n contentHeight = '80vh',\n pageClassName,\n workerUrl,\n cMapUrl,\n standardFontDataUrl,\n components,\n onLoadSuccess,\n onLoadError,\n onPageRender,\n loadingText = '正在加载PDF文档...',\n errorText = 'PDF加载失败',\n}: PDFReaderProps) {\n // ==================== 状态管理 ====================\n const [pdfDocument, setPdfDocument] = useState<PDFDocumentProxy | null>(null);\n const [internalPage, setInternalPage] = useState(initialPage);\n const [internalScale, setInternalScale] = useState(initialScale);\n const [internalRotation, setInternalRotation] = useState(initialRotation);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [totalPages, setTotalPages] = useState(0);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [showAllPages, setShowAllPages] = useState(\n initialDisplayMode === 'scroll'\n );\n const [showSidebarState, setShowSidebarState] = useState(showSidebar);\n\n // Sync showSidebarState with prop changes\n useEffect(() => {\n setShowSidebarState(showSidebar);\n }, [showSidebar]);\n\n const [pageWidth, setPageWidth] = useState<number | undefined>(undefined);\n\n // 动态导入 react-pdf\n const [ReactPDF, setReactPDF] = useState<any>(null);\n\n const readerRef = useRef<HTMLDivElement>(null);\n const pdfContainerRef = useRef<HTMLDivElement>(null);\n\n // 使用受控或非受控模式\n const currentPage = controlledPage ?? internalPage;\n const scale = controlledScale ?? internalScale;\n const rotation = controlledRotation ?? internalRotation;\n\n // ==================== 组件解构 ====================\n const { Card, CardContent, Button, Input, Skeleton } = components || {};\n\n // ==================== PDF 选项 ====================\n const pdfOptions = useMemo(() => {\n const options: Record<string, unknown> = {\n withCredentials: false,\n };\n\n if (cMapUrl) {\n options.cMapUrl = cMapUrl;\n options.cMapPacked = true;\n }\n\n if (standardFontDataUrl) {\n options.standardFontDataUrl = standardFontDataUrl;\n }\n\n return options;\n }, [cMapUrl, standardFontDataUrl]);\n\n // ==================== 动态导入 react-pdf ====================\n useEffect(() => {\n let isMounted = true;\n\n const loadReactPDF = async () => {\n try {\n // 动态导入 react-pdf\n const pdfModule = await import('react-pdf');\n\n // 设置 worker\n if (typeof window !== 'undefined') {\n const pdfjs = (pdfModule as any).pdfjs;\n const workerVersion = pdfjs?.version;\n\n if (pdfjs?.GlobalWorkerOptions && workerVersion) {\n if (workerUrl) {\n pdfjs.GlobalWorkerOptions.workerSrc = workerUrl;\n } else {\n // 使用 CDN\n pdfjs.GlobalWorkerOptions.workerSrc = `https://cdn.jsdelivr.net/npm/pdfjs-dist@${workerVersion}/build/pdf.worker.min.mjs`;\n }\n\n // 如果没有提供自定义 URL,使用 CDN 默认值\n if (!cMapUrl && pdfjs.GlobalWorkerOptions) {\n (pdfjs.GlobalWorkerOptions as any).cMapUrl =\n `https://unpkg.com/pdfjs-dist@${workerVersion}/cmaps/`;\n }\n if (!standardFontDataUrl && pdfjs.GlobalWorkerOptions) {\n (pdfjs.GlobalWorkerOptions as any).standardFontDataUrl =\n `https://unpkg.com/pdfjs-dist@${workerVersion}/standard_fonts/`;\n }\n }\n }\n\n if (isMounted) {\n setReactPDF(pdfModule);\n }\n } catch (err) {\n if (isMounted) {\n const loadError =\n err instanceof Error ? err : new Error('无法加载 react-pdf 库');\n setError(loadError);\n setIsLoading(false);\n onLoadError?.(loadError);\n }\n }\n };\n\n loadReactPDF();\n\n return () => {\n isMounted = false;\n };\n }, [workerUrl, cMapUrl, standardFontDataUrl, onLoadError]);\n\n // ==================== 处理加载错误 ====================\n const onDocumentLoadError = useCallback(\n (err: Error) => {\n console.error('PDF加载失败:', err);\n console.error('PDF URL:', url);\n setError(\n new Error(`${errorText}: ${err.message || '请检查文件路径或网络连接'}`)\n );\n onLoadError?.(err);\n },\n [url, errorText, onLoadError]\n );\n\n // ==================== 页面导航 ====================\n const goToPage = useCallback(\n (page: number) => {\n const newPage =\n totalPages > 0 ? Math.max(1, Math.min(page, totalPages)) : page;\n if (controlledPage === undefined) {\n setInternalPage(newPage);\n }\n onPageChange?.(newPage);\n },\n [totalPages, controlledPage, onPageChange]\n );\n\n // ==================== 缩放控制 ====================\n const zoom = useCallback(\n (delta: number) => {\n const newScale = Math.max(minScale, Math.min(maxScale, scale + delta));\n if (controlledScale === undefined) {\n setInternalScale(newScale);\n }\n onScaleChange?.(newScale);\n },\n [scale, minScale, maxScale, controlledScale, onScaleChange]\n );\n\n // ==================== 旋转控制 ====================\n const rotate = useCallback(() => {\n const newRotation = (rotation + 90) % 360;\n if (controlledRotation === undefined) {\n setInternalRotation(newRotation);\n }\n onRotationChange?.(newRotation);\n }, [rotation, controlledRotation, onRotationChange]);\n\n // ==================== 处理窗口大小变化 ====================\n const debouncedUpdatePageWidth = useDebounce((width: number) => {\n setPageWidth(width);\n }, 100);\n\n // Use ResizeObserver to track container size changes\n useEffect(() => {\n if (!pdfContainerRef.current) return;\n\n const container = pdfContainerRef.current;\n const updateWidth = () => {\n debouncedUpdatePageWidth(container.clientWidth);\n };\n\n // Initial measurement\n updateWidth();\n\n // Set up ResizeObserver\n const resizeObserver = new ResizeObserver(() => {\n updateWidth();\n });\n\n resizeObserver.observe(container);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [debouncedUpdatePageWidth]);\n\n // ==================== 键盘快捷键 ====================\n useEffect(() => {\n if (!enableHotkeys) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n // Ctrl/Cmd + 加号: 放大\n if ((e.ctrlKey || e.metaKey) && (e.key === '=' || e.key === '+')) {\n e.preventDefault();\n zoom(0.1);\n }\n // Ctrl/Cmd + 减号: 缩小\n else if ((e.ctrlKey || e.metaKey) && e.key === '-') {\n e.preventDefault();\n zoom(-0.1);\n }\n // 左箭头: 上一页\n else if (e.key === 'ArrowLeft') {\n e.preventDefault();\n goToPage(currentPage - 1);\n }\n // 右箭头: 下一页\n else if (e.key === 'ArrowRight') {\n e.preventDefault();\n goToPage(currentPage + 1);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [enableHotkeys, currentPage, goToPage, zoom]);\n\n // ==================== 全屏切换 ====================\n const toggleFullscreen = useCallback(async () => {\n if (typeof document === 'undefined') return;\n\n if (!document.fullscreenElement) {\n try {\n await readerRef.current?.requestFullscreen?.();\n setIsFullscreen(true);\n } catch (err) {\n console.error('Error attempting to enable fullscreen:', err);\n }\n } else {\n if (document.exitFullscreen) {\n await document.exitFullscreen();\n setIsFullscreen(false);\n }\n }\n }, []);\n\n // ==================== 监听全屏状态变化 ====================\n useEffect(() => {\n if (typeof document === 'undefined') return;\n\n const handleFullscreenChange = () => {\n setIsFullscreen(!!document.fullscreenElement);\n };\n\n document.addEventListener('fullscreenchange', handleFullscreenChange);\n return () => {\n document.removeEventListener('fullscreenchange', handleFullscreenChange);\n };\n }, []);\n\n // ==================== 处理侧边栏页面点击 ====================\n const handleSidebarPageClick = useCallback(\n (pageNumber: number) => {\n goToPage(pageNumber);\n setShowAllPages(false);\n },\n [goToPage]\n );\n\n // ==================== 渲染工具栏 ====================\n const renderToolbar = () => {\n if (!showToolbar) return null;\n\n return (\n <div\n className={`flex items-center justify-between gap-4 border-b px-4 py-2 ${toolbarClassName || ''}`}\n >\n <div className=\"flex items-center gap-2\">\n {/* 侧边栏切换 */}\n {showSidebar && (\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => setShowSidebarState(!showSidebarState)}\n title={showSidebarState ? '隐藏侧边栏' : '显示侧边栏'}\n >\n <PanelLeftIcon />\n </Button>\n )}\n\n {/* 缩放控制 */}\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => zoom(-0.1)}\n disabled={scale <= minScale}\n >\n <ZoomOutIcon />\n </Button>\n <span className=\"min-w-[3rem] text-center text-sm\">\n {Math.round(scale * 100)}%\n </span>\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => zoom(0.1)}\n disabled={scale >= maxScale}\n >\n <ZoomInIcon />\n </Button>\n\n {/* 旋转控制 */}\n {showRotation && (\n <Button variant=\"outline\" size=\"icon\" onClick={rotate}>\n <RotateCwIcon />\n </Button>\n )}\n\n {/* 显示模式切换 */}\n {showModeToggle && (\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => setShowAllPages(!showAllPages)}\n title={showAllPages ? '单页模式' : '滚动模式'}\n >\n {showAllPages ? <ScrollTextIcon /> : <FileTextIcon />}\n </Button>\n )}\n\n {/* 全屏切换 */}\n {showFullscreen && (\n <Button variant=\"outline\" size=\"icon\" onClick={toggleFullscreen}>\n {isFullscreen ? <Minimize2Icon /> : <Maximize2Icon />}\n </Button>\n )}\n </div>\n\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => goToPage(currentPage - 1)}\n disabled={currentPage <= 1}\n >\n <ChevronLeftIcon />\n </Button>\n\n <Input\n type=\"number\"\n min={1}\n max={totalPages}\n value={currentPage}\n onChange={(e) => goToPage(parseInt(e.target.value) || 1)}\n className=\"w-16 text-center\"\n />\n <span className=\"text-sm text-muted-foreground\">/ {totalPages}</span>\n\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => goToPage(currentPage + 1)}\n disabled={totalPages > 0 && currentPage >= totalPages}\n >\n <ChevronRightIcon />\n </Button>\n </div>\n </div>\n );\n };\n\n // ==================== 渲染加载状态 ====================\n const renderLoading = () => (\n <div className=\"flex h-full items-center justify-center\">\n <p className=\"text-muted-foreground\">{loadingText}</p>\n </div>\n );\n\n // ==================== 渲染错误状态 ====================\n const renderError = () => (\n <div className=\"flex h-full min-h-[400px] items-center justify-center px-4 text-center text-destructive\">\n <div className=\"max-w-md\">\n <p className=\"mb-2 text-lg font-medium\">文件加载失败</p>\n <p className=\"text-sm opacity-80\">{error?.message}</p>\n </div>\n </div>\n );\n\n // ==================== 渲染 PDF 文档 ====================\n const renderPDFDocument = () => {\n if (!ReactPDF) return renderLoading();\n\n const { Document, Page } = ReactPDF;\n\n return (\n <div\n ref={pdfContainerRef}\n className={`pdf-container flex-1 overflow-y-auto ${contentClassName || ''}`}\n >\n <div className=\"flex min-h-full justify-center px-4\">\n <Document\n file={url}\n onLoadError={onDocumentLoadError}\n options={pdfOptions}\n loading={renderLoading()}\n error={renderError()}\n onLoadSuccess={(pdf: any) => {\n if (!pdfDocument) {\n setPdfDocument(pdf as PDFDocumentProxy);\n setTotalPages(pdf.numPages);\n setIsLoading(false);\n onLoadSuccess?.(pdf as PDFDocumentProxy);\n }\n }}\n >\n {error ? (\n renderError()\n ) : showAllPages ? (\n // 显示所有页面模式\n Array.from(new Array(totalPages), (_el, index) => (\n <div\n key={`page_${index + 1}`}\n className={`mb-4 ${pageClassName || ''}`}\n >\n <Page\n pageNumber={index + 1}\n renderTextLayer={false}\n renderAnnotationLayer={false}\n width={pageWidth}\n scale={scale}\n rotate={rotation}\n onRenderSuccess={() => onPageRender?.(index + 1)}\n />\n </div>\n ))\n ) : (\n // 单页模式\n <div className={pageClassName || ''}>\n <Page\n pageNumber={currentPage}\n renderTextLayer={false}\n renderAnnotationLayer={false}\n width={pageWidth}\n scale={scale}\n rotate={rotation}\n onRenderSuccess={() => onPageRender?.(currentPage)}\n />\n </div>\n )}\n </Document>\n </div>\n </div>\n );\n };\n\n // ==================== 渲染侧边栏 ====================\n const renderSidebar = () => {\n if (!showSidebar || !showSidebarState || !pdfDocument) return null;\n\n // 使用导入的 PDFSidebar 组件\n const PDFSidebarComponent = PDFSidebar;\n\n return (\n <PDFSidebarComponent\n pdfDocument={pdfDocument}\n currentPage={currentPage}\n onPageClick={handleSidebarPageClick}\n components={{\n Tabs: components.Tabs!,\n TabsList: components.TabsList!,\n TabsTrigger: components.TabsTrigger!,\n TabsContent: components.TabsContent!,\n ScrollArea: components.ScrollArea!,\n Skeleton,\n }}\n />\n );\n };\n\n // ==================== 渲染移动端导航 ====================\n const renderMobileNav = () => {\n if (!enableMobileNav) return null;\n\n return (\n <div className=\"fixed bottom-4 left-1/2 z-50 flex -translate-x-1/2 gap-2 md:hidden\">\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => goToPage(currentPage - 1)}\n disabled={currentPage <= 1}\n >\n <ChevronLeftIcon />\n <span className=\"ml-1\">上一页</span>\n </Button>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => goToPage(currentPage + 1)}\n disabled={currentPage >= totalPages}\n >\n <span className=\"mr-1\">下一页</span>\n <ChevronRightIcon />\n </Button>\n </div>\n );\n };\n\n // ==================== 组件验证 ====================\n if (!components) {\n return (\n <div className=\"p-4 text-center text-destructive\">\n 错误:请通过 components prop 注入 UI 组件\n </div>\n );\n }\n\n // 验证侧边栏所需的所有组件\n if (showSidebar) {\n const missingComponents: string[] = [];\n if (!components.Tabs) missingComponents.push('Tabs');\n if (!components.TabsList) missingComponents.push('TabsList');\n if (!components.TabsTrigger) missingComponents.push('TabsTrigger');\n if (!components.TabsContent) missingComponents.push('TabsContent');\n if (!components.ScrollArea) missingComponents.push('ScrollArea');\n\n if (missingComponents.length > 0) {\n const missingComponentsText =\n missingComponents.length === 1\n ? missingComponents[0]\n : `${missingComponents.slice(0, -1).join('、')} 和 ${missingComponents[missingComponents.length - 1]}`;\n return (\n <div className=\"p-4 text-center text-destructive\">\n 错误:侧边栏功能需要注入 {missingComponentsText} 组件\n </div>\n );\n }\n }\n\n return (\n <div ref={readerRef}>\n <Card className={className}>\n {renderToolbar()}\n <CardContent\n className=\"p-0\"\n style={{ height: isFullscreen ? '100vh' : contentHeight }}\n >\n <div className=\"flex h-full flex-col\">\n {/* PDF 显示区域 */}\n <div className=\"flex flex-1 overflow-hidden\">\n {renderSidebar()}\n {isLoading\n ? renderLoading()\n : error\n ? renderError()\n : renderPDFDocument()}\n </div>\n </div>\n </CardContent>\n </Card>\n {renderMobileNav()}\n </div>\n );\n}\n","import {\n CheckCircle2,\n FileText,\n Loader2,\n UploadCloud,\n X,\n XCircle,\n} from 'lucide-react';\nimport { useEffect, useRef, useState } from 'react';\nimport type { DragEvent, HTMLAttributes, ReactNode } from 'react';\n\nimport { cn } from '../lib/utils';\nimport type {\n ButtonComponent,\n CardComponent,\n UIComponent,\n} from '../types/component-types';\n\nexport type FileUploadStatus = 'ready' | 'uploading' | 'success' | 'error';\n\nexport interface FileUploadItem<TResult = unknown> {\n id: string;\n file: File;\n name: string;\n size: number;\n type: string;\n status: FileUploadStatus;\n progress: number;\n error?: string;\n result?: TResult;\n}\n\nexport interface FileUploadHelpers {\n setProgress: (progress: number) => void;\n}\n\nexport interface FileUploadUIComponents {\n Card: CardComponent;\n CardHeader?: UIComponent<HTMLAttributes<HTMLDivElement>>;\n CardTitle?: UIComponent<HTMLAttributes<HTMLDivElement>>;\n CardDescription?: UIComponent<HTMLAttributes<HTMLDivElement>>;\n CardContent: UIComponent<HTMLAttributes<HTMLDivElement>>;\n CardFooter?: UIComponent<HTMLAttributes<HTMLDivElement>>;\n Button: ButtonComponent;\n}\n\nexport interface FileUploadProps<TResult = unknown> {\n components?: FileUploadUIComponents;\n title?: ReactNode;\n description?: ReactNode;\n helperText?: ReactNode;\n accept?: string;\n multiple?: boolean;\n maxFiles?: number;\n maxSize?: number;\n disabled?: boolean;\n autoUpload?: boolean;\n showUploadButton?: boolean;\n showResetButton?: boolean;\n selectLabel?: string;\n uploadLabel?: string;\n retryLabel?: string;\n resetLabel?: string;\n emptyLabel?: ReactNode;\n dropzoneLabel?: ReactNode;\n dropzoneDescription?: ReactNode;\n uploadingText?: string;\n successText?: string;\n errorText?: string;\n className?: string;\n dropzoneClassName?: string;\n listClassName?: string;\n formatFileSize?: (size: number) => string;\n validateFile?: (\n file: File,\n currentItems: FileUploadItem<TResult>[]\n ) => string | undefined;\n onFilesChange?: (items: FileUploadItem<TResult>[]) => void;\n onUpload?: (\n item: FileUploadItem<TResult>,\n helpers: FileUploadHelpers\n ) => Promise<TResult> | TResult;\n onUploadComplete?: (item: FileUploadItem<TResult>) => void;\n onUploadError?: (item: FileUploadItem<TResult>, error: unknown) => void;\n}\n\nconst defaultFormatFileSize = (size: number) => {\n if (size < 1024) return `${size} B`;\n if (size < 1024 * 1024) return `${(size / 1024).toFixed(1)} KB`;\n if (size < 1024 * 1024 * 1024) {\n return `${(size / 1024 / 1024).toFixed(1)} MB`;\n }\n return `${(size / 1024 / 1024 / 1024).toFixed(1)} GB`;\n};\n\nconst createFileId = (file: File) =>\n `${file.name}-${file.size}-${file.lastModified}-${Math.random()\n .toString(36)\n .slice(2)}`;\n\nconst getFileExtension = (fileName: string) => {\n const index = fileName.lastIndexOf('.');\n return index > -1 ? fileName.slice(index).toLowerCase() : '';\n};\n\nconst matchesAccept = (file: File, accept?: string) => {\n if (!accept) return true;\n\n const fileType = file.type.toLowerCase();\n const fileExtension = getFileExtension(file.name);\n\n return accept\n .split(',')\n .map((item) => item.trim().toLowerCase())\n .filter(Boolean)\n .some((rule) => {\n if (rule.startsWith('.')) {\n return fileExtension === rule;\n }\n if (rule.endsWith('/*')) {\n return fileType.startsWith(rule.slice(0, -1));\n }\n return fileType === rule;\n });\n};\n\nconst getErrorMessage = (error: unknown, fallback: string) => {\n if (error instanceof Error && error.message) {\n return error.message;\n }\n if (typeof error === 'string' && error) {\n return error;\n }\n return fallback;\n};\n\nexport function FileUpload<TResult = unknown>({\n components,\n title = '文件上传',\n description = '选择文件后开始上传,支持 Tale SDK 的直接上传和预签名上传流程。',\n helperText,\n accept,\n multiple = false,\n maxFiles,\n maxSize,\n disabled = false,\n autoUpload = false,\n showUploadButton,\n showResetButton = true,\n selectLabel = '选择文件',\n uploadLabel = '开始上传',\n retryLabel = '重试',\n resetLabel = '清空',\n emptyLabel = '尚未选择文件',\n dropzoneLabel = '拖拽文件到这里,或点击选择',\n dropzoneDescription = '上传前会先完成文件校验,上传逻辑由业务侧注入。',\n uploadingText = '上传中',\n successText = '上传完成',\n errorText = '上传失败',\n className,\n dropzoneClassName,\n listClassName,\n formatFileSize = defaultFormatFileSize,\n validateFile,\n onFilesChange,\n onUpload,\n onUploadComplete,\n onUploadError,\n}: FileUploadProps<TResult>) {\n const [items, setItems] = useState<FileUploadItem<TResult>[]>([]);\n const [isDragging, setIsDragging] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const shouldShowUploadButton = showUploadButton ?? Boolean(onUpload);\n const resolvedMaxFiles = multiple ? maxFiles : 1;\n const hasUploadableItems = items.some((item) => item.status === 'ready');\n const isUploading = items.some((item) => item.status === 'uploading');\n\n useEffect(() => {\n onFilesChange?.(items);\n }, [items, onFilesChange]);\n\n if (!components) {\n return (\n <div className=\"p-4 text-center text-destructive\">\n 错误:请通过 components prop 注入 UI 组件\n </div>\n );\n }\n\n const {\n Card,\n CardHeader,\n CardTitle,\n CardDescription,\n CardContent,\n CardFooter,\n Button,\n } = components;\n\n const updateItems = (\n updater: (\n currentItems: FileUploadItem<TResult>[]\n ) => FileUploadItem<TResult>[]\n ) => {\n setItems((currentItems) => updater(currentItems));\n };\n\n const getValidationError = (\n file: File,\n currentItems: FileUploadItem<TResult>[]\n ) => {\n if (maxSize && file.size > maxSize) {\n return `文件不能超过 ${formatFileSize(maxSize)}`;\n }\n if (!matchesAccept(file, accept)) {\n return '文件类型不符合要求';\n }\n return validateFile?.(file, currentItems);\n };\n\n const createItemsFromFiles = (\n files: File[],\n currentItems: FileUploadItem<TResult>[]\n ) => {\n const nextItems = multiple ? [...currentItems] : [];\n const remainingSlots =\n resolvedMaxFiles === undefined\n ? files.length\n : Math.max(resolvedMaxFiles - nextItems.length, 0);\n\n files.slice(0, remainingSlots).forEach((file) => {\n const error = getValidationError(file, nextItems);\n nextItems.push({\n id: createFileId(file),\n file,\n name: file.name,\n size: file.size,\n type: file.type,\n status: error ? 'error' : 'ready',\n progress: 0,\n error,\n });\n });\n\n if (resolvedMaxFiles !== undefined && files.length > remainingSlots) {\n files.slice(remainingSlots).forEach((file) => {\n nextItems.push({\n id: createFileId(file),\n file,\n name: file.name,\n size: file.size,\n type: file.type,\n status: 'error',\n progress: 0,\n error: `最多只能选择 ${resolvedMaxFiles} 个文件`,\n });\n });\n }\n\n return nextItems;\n };\n\n const uploadItem = async (targetItem: FileUploadItem<TResult>) => {\n if (!onUpload || targetItem.status === 'uploading') return;\n\n updateItems((currentItems) =>\n currentItems.map((item) =>\n item.id === targetItem.id\n ? { ...item, status: 'uploading', progress: item.progress || 5 }\n : item\n )\n );\n\n const setProgress = (progress: number) => {\n updateItems((currentItems) =>\n currentItems.map((item) =>\n item.id === targetItem.id\n ? {\n ...item,\n progress: Math.max(0, Math.min(100, Math.round(progress))),\n }\n : item\n )\n );\n };\n\n try {\n const result = await onUpload(targetItem, { setProgress });\n const completedItem = {\n ...targetItem,\n status: 'success' as const,\n progress: 100,\n error: undefined,\n result,\n };\n updateItems((currentItems) =>\n currentItems.map((item) =>\n item.id === targetItem.id ? completedItem : item\n )\n );\n onUploadComplete?.(completedItem);\n } catch (error) {\n const failedItem = {\n ...targetItem,\n status: 'error' as const,\n progress: 0,\n error: getErrorMessage(error, errorText),\n };\n updateItems((currentItems) =>\n currentItems.map((item) =>\n item.id === targetItem.id ? failedItem : item\n )\n );\n onUploadError?.(failedItem, error);\n }\n };\n\n const uploadReadyItems = async () => {\n const readyItems = items.filter((item) => item.status === 'ready');\n for (const item of readyItems) {\n await uploadItem(item);\n }\n };\n\n const handleFiles = (fileList: FileList | null) => {\n if (!fileList || disabled) return;\n const files = Array.from(fileList);\n updateItems((currentItems) => {\n const nextItems = createItemsFromFiles(files, currentItems);\n if (autoUpload && onUpload) {\n nextItems\n .filter((item) => item.status === 'ready')\n .forEach((item) => {\n window.setTimeout(() => uploadItem(item), 0);\n });\n }\n return nextItems;\n });\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n };\n\n const handleDrop = (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n setIsDragging(false);\n handleFiles(event.dataTransfer.files);\n };\n\n const handleRemove = (id: string) => {\n updateItems((currentItems) =>\n currentItems.filter((item) => item.id !== id)\n );\n };\n\n const handleRetry = (item: FileUploadItem<TResult>) => {\n const error = getValidationError(\n item.file,\n items.filter((currentItem) => currentItem.id !== item.id)\n );\n if (error) {\n updateItems((currentItems) =>\n currentItems.map((currentItem) =>\n currentItem.id === item.id ? { ...currentItem, error } : currentItem\n )\n );\n return;\n }\n uploadItem({ ...item, status: 'ready', error: undefined, progress: 0 });\n };\n\n const renderStatus = (item: FileUploadItem<TResult>) => {\n if (item.status === 'uploading') {\n return (\n <span className=\"inline-flex items-center gap-1 text-xs font-medium text-blue-600 dark:text-blue-300\">\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n {uploadingText}\n </span>\n );\n }\n if (item.status === 'success') {\n return (\n <span className=\"inline-flex items-center gap-1 text-xs font-medium text-emerald-600 dark:text-emerald-300\">\n <CheckCircle2 className=\"h-3.5 w-3.5\" />\n {successText}\n </span>\n );\n }\n if (item.status === 'error') {\n return (\n <span className=\"inline-flex items-center gap-1 text-xs font-medium text-destructive\">\n <XCircle className=\"h-3.5 w-3.5\" />\n {errorText}\n </span>\n );\n }\n return <span className=\"text-xs text-muted-foreground\">待上传</span>;\n };\n\n const header = (\n <>\n {title && CardTitle && <CardTitle>{title}</CardTitle>}\n {title && !CardTitle && (\n <div className=\"text-lg font-semibold leading-none tracking-tight\">\n {title}\n </div>\n )}\n {description && CardDescription && (\n <CardDescription>{description}</CardDescription>\n )}\n {description && !CardDescription && (\n <div className=\"text-sm text-muted-foreground\">{description}</div>\n )}\n </>\n );\n\n return (\n <Card className={cn('overflow-hidden', className)}>\n {CardHeader && (title || description) ? (\n <CardHeader>{header}</CardHeader>\n ) : (\n (title || description) && (\n <div className=\"space-y-1.5 p-6\">{header}</div>\n )\n )}\n <CardContent className=\"space-y-4\">\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n className=\"sr-only\"\n onChange={(event) => handleFiles(event.target.files)}\n disabled={disabled}\n />\n <div\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled}\n className={cn(\n 'flex min-h-40 cursor-pointer flex-col items-center justify-center rounded-lg border border-dashed border-muted-foreground/30 bg-muted/20 px-6 py-8 text-center transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n isDragging && 'border-primary bg-primary/5',\n disabled && 'cursor-not-allowed opacity-60',\n dropzoneClassName\n )}\n onClick={() => {\n if (!disabled) {\n inputRef.current?.click();\n }\n }}\n onKeyDown={(event) => {\n if (!disabled && (event.key === 'Enter' || event.key === ' ')) {\n event.preventDefault();\n inputRef.current?.click();\n }\n }}\n onDragOver={(event) => {\n event.preventDefault();\n if (!disabled) {\n setIsDragging(true);\n }\n }}\n onDragLeave={() => setIsDragging(false)}\n onDrop={handleDrop}\n >\n <div className=\"mb-3 rounded-full bg-primary/10 p-3 text-primary\">\n <UploadCloud className=\"h-6 w-6\" />\n </div>\n <div className=\"text-sm font-medium\">{dropzoneLabel}</div>\n {dropzoneDescription && (\n <div className=\"mt-1 max-w-md text-sm text-muted-foreground\">\n {dropzoneDescription}\n </div>\n )}\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"secondary\"\n className=\"mt-4\"\n disabled={disabled}\n onClick={(event) => {\n event.stopPropagation();\n inputRef.current?.click();\n }}\n >\n {selectLabel}\n </Button>\n </div>\n\n {helperText && (\n <div className=\"text-sm text-muted-foreground\">{helperText}</div>\n )}\n\n <div className={cn('space-y-3', listClassName)}>\n {items.length === 0 ? (\n <div className=\"rounded-md border border-dashed px-4 py-3 text-sm text-muted-foreground\">\n {emptyLabel}\n </div>\n ) : (\n items.map((item) => (\n <div\n key={item.id}\n className=\"rounded-lg border bg-background px-4 py-3\"\n >\n <div className=\"flex items-start gap-3\">\n <div className=\"mt-0.5 rounded-md bg-muted p-2 text-muted-foreground\">\n <FileText className=\"h-4 w-4\" />\n </div>\n <div className=\"min-w-0 flex-1 space-y-2\">\n <div className=\"flex flex-wrap items-start justify-between gap-2\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-medium\">\n {item.name}\n </div>\n <div className=\"text-xs text-muted-foreground\">\n {formatFileSize(item.size)}\n {item.type ? ` · ${item.type}` : ''}\n </div>\n </div>\n {renderStatus(item)}\n </div>\n {item.status === 'uploading' && (\n <div\n className=\"h-2 overflow-hidden rounded-full bg-muted\"\n aria-label={`${item.name} 上传进度`}\n role=\"progressbar\"\n aria-valuenow={item.progress}\n aria-valuemin={0}\n aria-valuemax={100}\n >\n <div\n className=\"h-full rounded-full bg-primary transition-all\"\n style={{ width: `${item.progress}%` }}\n />\n </div>\n )}\n {item.error && (\n <div className=\"text-xs text-destructive\">\n {item.error}\n </div>\n )}\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {item.status === 'error' && onUpload && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n disabled={disabled || isUploading}\n onClick={() => handleRetry(item)}\n >\n {retryLabel}\n </Button>\n )}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label={`移除 ${item.name}`}\n disabled={disabled || item.status === 'uploading'}\n onClick={() => handleRemove(item.id)}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n </div>\n ))\n )}\n </div>\n </CardContent>\n {(shouldShowUploadButton || showResetButton) &&\n (CardFooter ? (\n <CardFooter className=\"justify-end gap-2\">\n {showResetButton && (\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={disabled || isUploading || items.length === 0}\n onClick={() => setItems([])}\n >\n {resetLabel}\n </Button>\n )}\n {shouldShowUploadButton && (\n <Button\n type=\"button\"\n disabled={\n disabled || isUploading || !hasUploadableItems || !onUpload\n }\n onClick={uploadReadyItems}\n >\n {uploadLabel}\n </Button>\n )}\n </CardFooter>\n ) : (\n <div className=\"flex justify-end gap-2 p-6 pt-0\">\n {showResetButton && (\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={disabled || isUploading || items.length === 0}\n onClick={() => setItems([])}\n >\n {resetLabel}\n </Button>\n )}\n {shouldShowUploadButton && (\n <Button\n type=\"button\"\n disabled={\n disabled || isUploading || !hasUploadableItems || !onUpload\n }\n onClick={uploadReadyItems}\n >\n {uploadLabel}\n </Button>\n )}\n </div>\n ))}\n </Card>\n );\n}\n"],"names":["cn","inputs","twMerge","clsx","REACT_ELEMENT_TYPE","REACT_FRAGMENT_TYPE","jsxProd","type","config","maybeKey","key","propName","reactJsxRuntime_production","getComponentNameFromType","REACT_CLIENT_REFERENCE","REACT_PROFILER_TYPE","REACT_STRICT_MODE_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_ACTIVITY_TYPE","REACT_PORTAL_TYPE","REACT_CONTEXT_TYPE","REACT_CONSUMER_TYPE","REACT_FORWARD_REF_TYPE","innerType","REACT_MEMO_TYPE","REACT_LAZY_TYPE","testStringCoercion","value","checkKeyStringCoercion","JSCompiler_inline_result","JSCompiler_temp_const","JSCompiler_inline_result$jscomp$0","getTaskName","name","getOwner","dispatcher","ReactSharedInternals","UnknownOwner","hasValidKey","hasOwnProperty","getter","defineKeyPropWarningGetter","props","displayName","warnAboutAccessingKey","specialPropKeyWarningShown","elementRefGetterWithDeprecationWarning","componentName","didWarnAboutElementRef","ReactElement","owner","debugStack","debugTask","refProp","jsxDEVImpl","isStaticChildren","children","isArrayImpl","validateChildKeys","keys","k","didWarnAboutKeySpread","node","isValidElement","object","React","require$$0","createTask","callStackForError","unknownOwnerDebugStack","unknownOwnerDebugTask","reactJsxRuntime_development","trackActualOwner","jsxRuntimeModule","require$$1","DataTable","data","loading","columns","rowKey","emptyText","searchActiveEmptyText","header","pagination","rowClassName","onRow","actions","components","renderCard","renderTable","renderActions","jsxs","jsx","Card","CardContent","CardFooter","Table","TableBody","TableCell","TableHead","TableHeader","TableRow","Button","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","Skeleton","TableHeaderComponent","TablePaginationComponent","getRowKey","record","index","keyVal","isSearchActive","hasActions","_a","actionMode","_b","isSeparatorItem","item","defaultRenderActions","MoreVertical","itemIndex","renderTableHeader","column","renderTableBody","_","rowProps","className","content","defaultRenderCard","defaultRenderTable","tableHeader","tableBody","DeleteConfirmDialog","open","onOpenChange","title","description","onConfirm","confirmText","cancelText","confirmButtonVariant","verification","loadingIcon","inputValue","setInputValue","useState","useEffect","Dialog","DialogContent","DialogHeader","DialogFooter","DialogTitle","DialogDescription","Input","Label","isConfirmDisabled","handleConfirm","e","searchPlaceholder","searchValue","onSearchChange","onSearch","showSearch","action","actionLabel","onActionClick","handleKeyPress","Plus","Search","TablePagination","currentPage","pageSize","total","onPageChange","onPageSizeChange","pageSizeOptions","showPageSizeSelector","showJumpToPage","showTotal","searchActive","jumpPageInput","setJumpPageInput","Select","SelectTrigger","SelectContent","SelectItem","SelectValue","totalPages","safeTotalPages","startItem","endItem","availablePageSizeOptions","a","b","canChangePageSize","canSwitchPage","goToPage","page","nextPage","pageIndicators","pages","visiblePages","indicators","previous","nextPageSize","option","ChevronLeft","indicator","ChevronRight","event","defaultThemes","ThemeSwitcher","onValueChange","themes","triggerVariant","triggerSize","triggerClassName","iconSize","showCurrentIcon","enableSSRHandling","triggerContent","themeIcons","mounted","setMounted","DropdownMenuRadioGroup","DropdownMenuRadioItem","getThemeIcon","themeValue","theme","t","currentIcon","triggerIcon","iconStyle","ThemeSwitcherContent","SimplePDFReader","url","initialPage","initialScale","controlledScale","onScaleChange","minScale","maxScale","controlledPage","showToolbar","showPagination","enableHotkeys","containerClassName","pageClassName","onLoadSuccess","onLoadError","loadingText","errorText","pdfDocument","setPdfDocument","internalPage","setInternalPage","internalScale","setInternalScale","isLoading","setIsLoading","error","setError","setTotalPages","isFullscreen","setIsFullscreen","readerRef","useRef","loadingTaskRef","ReactPDF","setReactPDF","scale","pagesToPreload","useMemo","useCallback","maxPage","targetPage","handlePreviousPage","handleNextPage","handleZoomIn","newScale","handleZoomOut","handleToggleFullscreen","_c","isMounted","pdfModule","pdfjs","workerVersion","err","loadError","Document","loadingTask","pdf","prev","handleFullscreenChange","handleKeyDown","activeElement","InputComponentInjected","renderToolbar","ZoomOutIcon","ZoomInIcon","Minimize2Icon","Maximize2Icon","renderPagination","ChevronLeftIcon","ChevronRightIcon","renderOperations","renderLoading","renderError","renderPDFDocument","Page","pageNum","PDFThumbnail","memo","thumbnail","isCurrentPage","onClick","PDFBookmark","bookmark","depth","PDFSidebar","onPageClick","thumbnails","setThumbnails","bookmarks","setBookmarks","setLoading","Tabs","TabsList","TabsTrigger","TabsContent","ScrollArea","thumbs","i","viewport","canvas","context","outline","handleBookmarkClick","pageIndex","destination","renderThumbnailSkeleton","thumb","useDebounce","callback","delay","timeoutRef","args","PDFReader","initialRotation","controlledRotation","onRotationChange","showSidebar","showRotation","showModeToggle","showFullscreen","enableMobileNav","initialDisplayMode","toolbarClassName","contentClassName","contentHeight","workerUrl","cMapUrl","standardFontDataUrl","onPageRender","internalRotation","setInternalRotation","showAllPages","setShowAllPages","showSidebarState","setShowSidebarState","pageWidth","setPageWidth","pdfContainerRef","rotation","pdfOptions","options","onDocumentLoadError","newPage","zoom","delta","rotate","newRotation","debouncedUpdatePageWidth","width","container","updateWidth","resizeObserver","toggleFullscreen","handleSidebarPageClick","pageNumber","PanelLeftIcon","RotateCwIcon","ScrollTextIcon","FileTextIcon","_el","renderSidebar","PDFSidebarComponent","renderMobileNav","missingComponents","missingComponentsText","defaultFormatFileSize","size","createFileId","file","getFileExtension","fileName","matchesAccept","accept","fileType","fileExtension","rule","getErrorMessage","fallback","FileUpload","helperText","multiple","maxFiles","maxSize","disabled","autoUpload","showUploadButton","showResetButton","selectLabel","uploadLabel","retryLabel","resetLabel","emptyLabel","dropzoneLabel","dropzoneDescription","uploadingText","successText","dropzoneClassName","listClassName","formatFileSize","validateFile","onFilesChange","onUpload","onUploadComplete","onUploadError","items","setItems","isDragging","setIsDragging","inputRef","shouldShowUploadButton","resolvedMaxFiles","hasUploadableItems","isUploading","CardHeader","CardTitle","CardDescription","updateItems","updater","currentItems","getValidationError","createItemsFromFiles","files","nextItems","remainingSlots","uploadItem","targetItem","setProgress","progress","result","completedItem","failedItem","uploadReadyItems","readyItems","handleFiles","fileList","handleDrop","handleRemove","id","handleRetry","currentItem","renderStatus","Loader2","CheckCircle2","XCircle","Fragment","UploadCloud","FileText","X"],"mappings":"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","x_google_ignoreList":[1,2,3]}
package/dist/index.c.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index-BTZUO0o2.cjs");exports.DataTable=e.DataTable;exports.DeleteConfirmDialog=e.DeleteConfirmDialog;exports.PDFReader=e.PDFReader;exports.PDFSidebar=e.PDFSidebar;exports.SimplePDFReader=e.SimplePDFReader;exports.TableHeader=e.TableHeader;exports.TablePagination=e.TablePagination;exports.ThemeSwitcher=e.ThemeSwitcher;exports.ThemeSwitcherContent=e.ThemeSwitcherContent;exports.cn=e.cn;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index-tIca-Q_M.cjs");exports.DataTable=e.DataTable;exports.DeleteConfirmDialog=e.DeleteConfirmDialog;exports.FileUpload=e.FileUpload;exports.PDFReader=e.PDFReader;exports.PDFSidebar=e.PDFSidebar;exports.SimplePDFReader=e.SimplePDFReader;exports.TableHeader=e.TableHeader;exports.TablePagination=e.TablePagination;exports.ThemeSwitcher=e.ThemeSwitcher;exports.ThemeSwitcherContent=e.ThemeSwitcherContent;exports.cn=e.cn;
2
2
  //# sourceMappingURL=index.c.js.map
package/dist/index.d.ts CHANGED
@@ -8,6 +8,7 @@ export { ThemeSwitcherContent } from './components/ThemeSwitcherContent';
8
8
  export { SimplePDFReader } from './components/SimplePDFReader';
9
9
  export { PDFReader } from './components/PDFReader';
10
10
  export { PDFSidebar } from './components/PDFSidebar';
11
+ export { FileUpload } from './components/FileUpload';
11
12
  export type { Column, DataTableProps, UIComponents, } from './components/DataTable';
12
13
  export type { DeleteConfirmDialogProps, DialogUIComponents, } from './components/DeleteConfirmDialog';
13
14
  export type { TableHeaderProps, HeaderUIComponents, } from './components/TableHeader';
@@ -17,5 +18,6 @@ export type { ThemeSwitcherContentProps, ThemeSwitcherContentUIComponents, } fro
17
18
  export type { SimplePDFReaderProps, SimplePDFReaderUIComponents, } from './components/SimplePDFReader';
18
19
  export type { PDFReaderProps, PDFReaderUIComponents, } from './components/PDFReader';
19
20
  export type { PDFSidebarProps, PDFDocumentProxy, PDFPageProxy, PDFViewport, PDFOutline, } from './components/PDFSidebar';
21
+ export type { FileUploadProps, FileUploadUIComponents, FileUploadItem, FileUploadStatus, FileUploadHelpers, } from './components/FileUpload';
20
22
  export type { UIComponent, ButtonComponent, InputComponent, CardComponent, TableComponent, TableRowComponent, TableCellComponent, SelectComponent, SelectTriggerComponent, SelectContentComponent, SelectItemComponent, SelectValueComponent, DialogComponent, DialogContentComponent, DialogHeaderComponent, DialogFooterComponent, DialogTitleComponent, DialogDescriptionComponent, LabelComponent, DropdownMenuComponent, DropdownMenuTriggerComponent, DropdownMenuContentComponent, DropdownMenuRadioGroupComponent, DropdownMenuRadioItemComponent, SkeletonComponent, TabsComponent, TabsListComponent, TabsTriggerComponent, TabsContentComponent, ScrollAreaComponent, } from './types/component-types';
21
23
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAGjC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAGrD,YAAY,EACV,MAAM,EACN,cAAc,EACd,YAAY,GACb,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACV,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,kCAAkC,CAAC;AAC1C,YAAY,EACV,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,kBAAkB,EAClB,yBAAyB,EACzB,WAAW,GACZ,MAAM,4BAA4B,CAAC;AACpC,YAAY,EACV,yBAAyB,EACzB,gCAAgC,GACjC,MAAM,mCAAmC,CAAC;AAC3C,YAAY,EACV,oBAAoB,EACpB,2BAA2B,GAC5B,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,cAAc,EACd,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,UAAU,GACX,MAAM,yBAAyB,CAAC;AAGjC,YAAY,EACV,WAAW,EACX,eAAe,EACf,cAAc,EACd,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,0BAA0B,EAC1B,cAAc,EACd,qBAAqB,EACrB,4BAA4B,EAC5B,4BAA4B,EAC5B,+BAA+B,EAC/B,8BAA8B,EAC9B,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAGjC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAGrD,YAAY,EACV,MAAM,EACN,cAAc,EACd,YAAY,GACb,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACV,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,kCAAkC,CAAC;AAC1C,YAAY,EACV,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,kBAAkB,EAClB,yBAAyB,EACzB,WAAW,GACZ,MAAM,4BAA4B,CAAC;AACpC,YAAY,EACV,yBAAyB,EACzB,gCAAgC,GACjC,MAAM,mCAAmC,CAAC;AAC3C,YAAY,EACV,oBAAoB,EACpB,2BAA2B,GAC5B,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,cAAc,EACd,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,UAAU,GACX,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,eAAe,EACf,sBAAsB,EACtB,cAAc,EACd,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,yBAAyB,CAAC;AAGjC,YAAY,EACV,WAAW,EACX,eAAe,EACf,cAAc,EACd,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,0BAA0B,EAC1B,cAAc,EACd,qBAAqB,EACrB,4BAA4B,EAC5B,4BAA4B,EAC5B,+BAA+B,EAC/B,8BAA8B,EAC9B,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,yBAAyB,CAAC"}
package/dist/index.js CHANGED
@@ -1,13 +1,14 @@
1
- import { D as s, a as r, P as i, b as t, S as D, T as l, c as n, d as o, e as T, f as b } from "./index-DaMRZoHB.js";
1
+ import { D as s, a as i, F as r, P as l, b as t, S as o, T as D, c as d, d as n, e as T, f as b } from "./index-DJdfLA8M.js";
2
2
  export {
3
3
  s as DataTable,
4
- r as DeleteConfirmDialog,
5
- i as PDFReader,
4
+ i as DeleteConfirmDialog,
5
+ r as FileUpload,
6
+ l as PDFReader,
6
7
  t as PDFSidebar,
7
- D as SimplePDFReader,
8
- l as TableHeader,
9
- n as TablePagination,
10
- o as ThemeSwitcher,
8
+ o as SimplePDFReader,
9
+ D as TableHeader,
10
+ d as TablePagination,
11
+ n as ThemeSwitcher,
11
12
  T as ThemeSwitcherContent,
12
13
  b as cn
13
14
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@turinhub/atomix-common-ui",
3
- "version": "0.2.1",
3
+ "version": "0.3.0",
4
4
  "description": "Common UI components for TurinHub projects",
5
5
  "type": "module",
6
6
  "main": "./dist/index.c.js",
@@ -48,7 +48,7 @@
48
48
  "class-variance-authority": "^0.7.0",
49
49
  "clsx": "^2.1.0",
50
50
  "lucide-react": "^0.475.0",
51
- "pdfjs-dist": "^5.5.207",
51
+ "pdfjs-dist": "^5.4.296",
52
52
  "react": "^18.0.0 || ^19.0.0",
53
53
  "react-dom": "^18.0.0 || ^19.0.0",
54
54
  "react-pdf": "^10.1.0",
@@ -72,6 +72,7 @@
72
72
  "eslint-plugin-react-refresh": "^0.4.0",
73
73
  "globals": "^15.0.0",
74
74
  "jsdom": "^25.0.0",
75
+ "pdfjs-dist": "5.4.296",
75
76
  "prettier": "^3.6.0",
76
77
  "prettier-plugin-tailwindcss": "^0.7.0",
77
78
  "tailwindcss": "^3.4.0",