@turinhub/atomix-common-ui 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +9 -0
  2. package/dist/components/PDFReader.d.ts +149 -0
  3. package/dist/components/PDFReader.d.ts.map +1 -0
  4. package/dist/components/PDFSidebar.d.ts +87 -0
  5. package/dist/components/PDFSidebar.d.ts.map +1 -0
  6. package/dist/components/SimplePDFReader.d.ts +12 -11
  7. package/dist/components/SimplePDFReader.d.ts.map +1 -1
  8. package/dist/components/ui/scroll-area.d.ts +6 -0
  9. package/dist/components/ui/scroll-area.d.ts.map +1 -0
  10. package/dist/components/ui/tabs.d.ts +8 -0
  11. package/dist/components/ui/tabs.d.ts.map +1 -0
  12. package/dist/index-0y7GsdPm.js +18821 -0
  13. package/dist/index-0y7GsdPm.js.map +1 -0
  14. package/dist/index-BTZUO0o2.cjs +23 -0
  15. package/dist/index-BTZUO0o2.cjs.map +1 -0
  16. package/dist/index-Ct6imo1i.cjs +13 -0
  17. package/dist/index-Ct6imo1i.cjs.map +1 -0
  18. package/dist/index-DaMRZoHB.js +1810 -0
  19. package/dist/index-DaMRZoHB.js.map +1 -0
  20. package/dist/index.c.js +1 -1
  21. package/dist/index.d.ts +5 -1
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +10 -8
  24. package/dist/types/component-types.d.ts +22 -1
  25. package/dist/types/component-types.d.ts.map +1 -1
  26. package/package.json +5 -3
  27. package/dist/__vite-browser-external-BcPniuRQ.cjs +0 -2
  28. package/dist/__vite-browser-external-BcPniuRQ.cjs.map +0 -1
  29. package/dist/__vite-browser-external-DYxpcVy9.js +0 -5
  30. package/dist/__vite-browser-external-DYxpcVy9.js.map +0 -1
  31. package/dist/index-BYKrRClM.js +0 -15033
  32. package/dist/index-BYKrRClM.js.map +0 -1
  33. package/dist/index-Bn7sjSSa.cjs +0 -13
  34. package/dist/index-Bn7sjSSa.cjs.map +0 -1
  35. package/dist/index-DocNZVXn.cjs +0 -23
  36. package/dist/index-DocNZVXn.cjs.map +0 -1
  37. package/dist/index-DruzjpTS.js +0 -1293
  38. package/dist/index-DruzjpTS.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-DaMRZoHB.js","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"],"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, 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(true);\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 // ==================== 加载 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 const loadingTask = (ReactPDF.pdfjs as any).getDocument(url);\n const pdf = await loadingTask.promise;\n\n if (isMounted) {\n setPdfDocument(pdf as PDFDocumentProxy);\n setTotalPages(pdf.numPages);\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 };\n }, [ReactPDF, url, onLoadSuccess, 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 = Math.max(1, Math.min(page, totalPages));\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={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 null;\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 pdf={pdfDocument ?? undefined}\n onLoadError={onDocumentLoadError}\n options={pdfOptions}\n loading={renderLoading()}\n error={renderError()}\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"],"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"],"mappings":";;;;AAGO,SAASA,MAAMC,GAAsB;AAC1C,SAAOC,GAAQC,GAAKF,CAAM,CAAC;AAC7B;;;;;;;;;;;;;;;ACMA,MAAIG,IAAqB,OAAO,IAAI,4BAA4B,GAC9DC,IAAsB,OAAO,IAAI,gBAAgB;AACnD,WAASC,EAAQC,GAAMC,GAAQC,GAAU;AACvC,QAAIC,IAAM;AAGV,QAFWD,MAAX,WAAwBC,IAAM,KAAKD,IACxBD,EAAO,QAAlB,WAA0BE,IAAM,KAAKF,EAAO,MACxC,SAASA,GAAQ;AACnB,MAAAC,IAAW,CAAA;AACX,eAASE,KAAYH;AACnB,QAAUG,MAAV,UAAuBF,EAASE,CAAQ,IAAIH,EAAOG,CAAQ;AAAA,IACjE,MAAS,CAAAF,IAAWD;AAClB,WAAAA,IAASC,EAAS,KACX;AAAA,MACL,UAAUL;AAAA,MACV,MAAMG;AAAA,MACN,KAAKG;AAAA,MACL,KAAgBF,MAAX,SAAoBA,IAAS;AAAA,MAClC,OAAOC;AAAA;EAEX;AACA,SAAAG,GAAA,WAAmBP,GACnBO,GAAA,MAAcN,GACdM,GAAA,OAAeN;;;;;;;;;;;;;;wBCtBE,QAAQ,IAAI,aAA7B,iBACG,WAAY;AACX,aAASO,EAAyBN,GAAM;AACtC,UAAYA,KAAR,KAAc,QAAO;AACzB,UAAmB,OAAOA,KAAtB;AACF,eAAOA,EAAK,aAAaO,IACrB,OACAP,EAAK,eAAeA,EAAK,QAAQ;AACvC,UAAiB,OAAOA,KAApB,SAA0B,QAAOA;AACrC,cAAQA,GAAI;AAAA,QACV,KAAKF;AACH,iBAAO;AAAA,QACT,KAAKU;AACH,iBAAO;AAAA,QACT,KAAKC;AACH,iBAAO;AAAA,QACT,KAAKC;AACH,iBAAO;AAAA,QACT,KAAKC;AACH,iBAAO;AAAA,QACT,KAAKC;AACH,iBAAO;AAAA,MACjB;AACM,UAAiB,OAAOZ,KAApB;AACF,gBACgB,OAAOA,EAAK,OAAzB,YACC,QAAQ;AAAA,UACN;AAAA,WAEJA,EAAK,UACf;AAAA,UACU,KAAKa;AACH,mBAAO;AAAA,UACT,KAAKC;AACH,mBAAOd,EAAK,eAAe;AAAA,UAC7B,KAAKe;AACH,oBAAQf,EAAK,SAAS,eAAe,aAAa;AAAA,UACpD,KAAKgB;AACH,gBAAIC,IAAYjB,EAAK;AACrB,mBAAAA,IAAOA,EAAK,aACZA,MACIA,IAAOiB,EAAU,eAAeA,EAAU,QAAQ,IACnDjB,IAAcA,MAAP,KAAc,gBAAgBA,IAAO,MAAM,eAC9CA;AAAA,UACT,KAAKkB;AACH,mBACGD,IAAYjB,EAAK,eAAe,MACxBiB,MAAT,OACIA,IACAX,EAAyBN,EAAK,IAAI,KAAK;AAAA,UAE/C,KAAKmB;AACH,YAAAF,IAAYjB,EAAK,UACjBA,IAAOA,EAAK;AACZ,gBAAI;AACF,qBAAOM,EAAyBN,EAAKiB,CAAS,CAAC;AAAA,YAC7D,QAAwB;AAAA,YAAA;AAAA,QACxB;AACM,aAAO;AAAA,IACb;AACI,aAASG,EAAmBC,GAAO;AACjC,aAAO,KAAKA;AAAA,IAClB;AACI,aAASC,EAAuBD,GAAO;AACrC,UAAI;AACF,QAAAD,EAAmBC,CAAK;AACxB,YAAIE,IAA2B;AAAA,MACvC,QAAkB;AACV,QAAAA,IAA2B;AAAA,MACnC;AACM,UAAIA,GAA0B;AAC5B,QAAAA,IAA2B;AAC3B,YAAIC,IAAwBD,EAAyB,OACjDE,IACc,OAAO,UAAtB,cACC,OAAO,eACPJ,EAAM,OAAO,WAAW,KAC1BA,EAAM,YAAY,QAClB;AACF,eAAAG,EAAsB;AAAA,UACpBD;AAAA,UACA;AAAA,UACAE;AAAA,WAEKL,EAAmBC,CAAK;AAAA,MACvC;AAAA,IACA;AACI,aAASK,EAAY1B,GAAM;AACzB,UAAIA,MAASF,EAAqB,QAAO;AACzC,UACe,OAAOE,KAApB,YACSA,MAAT,QACAA,EAAK,aAAamB;AAElB,eAAO;AACT,UAAI;AACF,YAAIQ,IAAOrB,EAAyBN,CAAI;AACxC,eAAO2B,IAAO,MAAMA,IAAO,MAAM;AAAA,MACzC,QAAkB;AACV,eAAO;AAAA,MACf;AAAA,IACA;AACI,aAASC,IAAW;AAClB,UAAIC,IAAaC,EAAqB;AACtC,aAAgBD,MAAT,OAAsB,OAAOA,EAAW,SAAQ;AAAA,IAC7D;AACI,aAASE,IAAe;AACtB,aAAO,MAAM,uBAAuB;AAAA,IAC1C;AACI,aAASC,EAAY/B,GAAQ;AAC3B,UAAIgC,EAAe,KAAKhC,GAAQ,KAAK,GAAG;AACtC,YAAIiC,IAAS,OAAO,yBAAyBjC,GAAQ,KAAK,EAAE;AAC5D,YAAIiC,KAAUA,EAAO,eAAgB,QAAO;AAAA,MACpD;AACM,aAAkBjC,EAAO,QAAlB;AAAA,IACb;AACI,aAASkC,EAA2BC,GAAOC,GAAa;AACtD,eAASC,IAAwB;AAC/B,QAAAC,MACIA,IAA6B,IAC/B,QAAQ;AAAA,UACN;AAAA,UACAF;AAAA,QACZ;AAAA,MACA;AACM,MAAAC,EAAsB,iBAAiB,IACvC,OAAO,eAAeF,GAAO,OAAO;AAAA,QAClC,KAAKE;AAAA,QACL,cAAc;AAAA,MACtB,CAAO;AAAA,IACP;AACI,aAASE,IAAyC;AAChD,UAAIC,IAAgBnC,EAAyB,KAAK,IAAI;AACtD,aAAAoC,GAAuBD,CAAa,MAChCC,GAAuBD,CAAa,IAAI,IAC1C,QAAQ;AAAA,QACN;AAAA,MACV,IACMA,IAAgB,KAAK,MAAM,KACTA,MAAX,SAA2BA,IAAgB;AAAA,IACxD;AACI,aAASE,EAAa3C,GAAMG,GAAKiC,GAAOQ,GAAOC,GAAYC,IAAW;AACpE,UAAIC,IAAUX,EAAM;AACpB,aAAApC,IAAO;AAAA,QACL,UAAUH;AAAA,QACV,MAAMG;AAAA,QACN,KAAKG;AAAA,QACL,OAAOiC;AAAA,QACP,QAAQQ;AAAA,UAEWG,MAAX,SAAqBA,IAAU,UAAzC,OACI,OAAO,eAAe/C,GAAM,OAAO;AAAA,QACjC,YAAY;AAAA,QACZ,KAAKwC;AAAA,OACN,IACD,OAAO,eAAexC,GAAM,OAAO,EAAE,YAAY,IAAI,OAAO,MAAM,GACtEA,EAAK,SAAS,CAAA,GACd,OAAO,eAAeA,EAAK,QAAQ,aAAa;AAAA,QAC9C,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,OAAO;AAAA,MACf,CAAO,GACD,OAAO,eAAeA,GAAM,cAAc;AAAA,QACxC,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,OAAO;AAAA,MACf,CAAO,GACD,OAAO,eAAeA,GAAM,eAAe;AAAA,QACzC,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,OAAO6C;AAAA,MACf,CAAO,GACD,OAAO,eAAe7C,GAAM,cAAc;AAAA,QACxC,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,OAAO8C;AAAA,MACf,CAAO,GACD,OAAO,WAAW,OAAO,OAAO9C,EAAK,KAAK,GAAG,OAAO,OAAOA,CAAI,IACxDA;AAAA,IACb;AACI,aAASgD,EACPhD,GACAC,GACAC,GACA+C,GACAJ,GACAC,IACA;AACA,UAAII,IAAWjD,EAAO;AACtB,UAAeiD,MAAX;AACF,YAAID;AACF,cAAIE,EAAYD,CAAQ,GAAG;AACzB,iBACED,IAAmB,GACnBA,IAAmBC,EAAS,QAC5BD;AAEA,cAAAG,EAAkBF,EAASD,CAAgB,CAAC;AAC9C,mBAAO,UAAU,OAAO,OAAOC,CAAQ;AAAA,UACnD;AACY,oBAAQ;AAAA,cACN;AAAA;YAED,CAAAE,EAAkBF,CAAQ;AACjC,UAAIjB,EAAe,KAAKhC,GAAQ,KAAK,GAAG;AACtC,QAAAiD,IAAW5C,EAAyBN,CAAI;AACxC,YAAIqD,IAAO,OAAO,KAAKpD,CAAM,EAAE,OAAO,SAAUqD,GAAG;AACjD,iBAAiBA,MAAV;AAAA,QACjB,CAAS;AACD,QAAAL,IACE,IAAII,EAAK,SACL,oBAAoBA,EAAK,KAAK,SAAS,IAAI,WAC3C,kBACNE,GAAsBL,IAAWD,CAAgB,MAC7CI,IACA,IAAIA,EAAK,SAAS,MAAMA,EAAK,KAAK,SAAS,IAAI,WAAW,MAC5D,QAAQ;AAAA,UACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UACAJ;AAAA,UACAC;AAAA,UACAG;AAAA,UACAH;AAAA,WAEDK,GAAsBL,IAAWD,CAAgB,IAAI;AAAA,MAChE;AAMM,UALAC,IAAW,MACAhD,MAAX,WACGoB,EAAuBpB,CAAQ,GAAIgD,IAAW,KAAKhD,IACtD8B,EAAY/B,CAAM,MACfqB,EAAuBrB,EAAO,GAAG,GAAIiD,IAAW,KAAKjD,EAAO,MAC3D,SAASA,GAAQ;AACnB,QAAAC,IAAW,CAAA;AACX,iBAASE,KAAYH;AACnB,UAAUG,MAAV,UAAuBF,EAASE,CAAQ,IAAIH,EAAOG,CAAQ;AAAA,MACrE,MAAa,CAAAF,IAAWD;AAClB,aAAAiD,KACEf;AAAA,QACEjC;AAAA,QACe,OAAOF,KAAtB,aACIA,EAAK,eAAeA,EAAK,QAAQ,YACjCA;AAAA,SAED2C;AAAA,QACL3C;AAAA,QACAkD;AAAA,QACAhD;AAAA,QACA0B,EAAQ;AAAA,QACRiB;AAAA,QACAC;AAAA;IAER;AACI,aAASM,EAAkBI,GAAM;AAC/B,MAAAC,EAAeD,CAAI,IACfA,EAAK,WAAWA,EAAK,OAAO,YAAY,KAC3B,OAAOA,KAApB,YACSA,MAAT,QACAA,EAAK,aAAarC,MACDqC,EAAK,SAAS,WAA9B,cACGC,EAAeD,EAAK,SAAS,KAAK,KAClCA,EAAK,SAAS,MAAM,WACnBA,EAAK,SAAS,MAAM,OAAO,YAAY,KACxCA,EAAK,WAAWA,EAAK,OAAO,YAAY;AAAA,IACtD;AACI,aAASC,EAAeC,GAAQ;AAC9B,aACe,OAAOA,KAApB,YACSA,MAAT,QACAA,EAAO,aAAa7D;AAAA,IAE5B;AACI,QAAI8D,IAAQC,IACV/D,IAAqB,OAAO,IAAI,4BAA4B,GAC5DgB,IAAoB,OAAO,IAAI,cAAc,GAC7Cf,IAAsB,OAAO,IAAI,gBAAgB,GACjDW,IAAyB,OAAO,IAAI,mBAAmB,GACvDD,IAAsB,OAAO,IAAI,gBAAgB,GACjDO,IAAsB,OAAO,IAAI,gBAAgB,GACjDD,IAAqB,OAAO,IAAI,eAAe,GAC/CE,IAAyB,OAAO,IAAI,mBAAmB,GACvDN,IAAsB,OAAO,IAAI,gBAAgB,GACjDC,IAA2B,OAAO,IAAI,qBAAqB,GAC3DO,IAAkB,OAAO,IAAI,YAAY,GACzCC,IAAkB,OAAO,IAAI,YAAY,GACzCP,IAAsB,OAAO,IAAI,gBAAgB,GACjDL,IAAyB,OAAO,IAAI,wBAAwB,GAC5DuB,IACE6B,EAAM,iEACR1B,IAAiB,OAAO,UAAU,gBAClCkB,IAAc,MAAM,SACpBU,IAAa,QAAQ,aACjB,QAAQ,aACR,WAAY;AACV,aAAO;AAAA,IACnB;AACI,IAAAF,IAAQ;AAAA,MACN,0BAA0B,SAAUG,GAAmB;AACrD,eAAOA,EAAiB;AAAA,MAChC;AAAA;AAEI,QAAIvB,GACAG,KAAyB,CAAA,GACzBqB,KAAyBJ,EAAM,yBAAyB;AAAA,MAC1DA;AAAA,MACA5B;AAAA,IACN,EAAK,GACGiC,IAAwBH,EAAWnC,EAAYK,CAAY,CAAC,GAC5DwB,KAAwB,CAAA;AAC5B,IAAAU,GAAA,WAAmBnE,GACnBmE,GAAA,MAAc,SAAUjE,GAAMC,GAAQC,GAAU;AAC9C,UAAIgE,IACF,MAAMpC,EAAqB;AAC7B,aAAOkB;AAAA,QACLhD;AAAA,QACAC;AAAA,QACAC;AAAA,QACA;AAAA,QACAgE,IACI,MAAM,uBAAuB,IAC7BH;AAAA,QACJG,IAAmBL,EAAWnC,EAAY1B,CAAI,CAAC,IAAIgE;AAAA;IAE3D,GACIC,GAAA,OAAe,SAAUjE,GAAMC,GAAQC,GAAU;AAC/C,UAAIgE,IACF,MAAMpC,EAAqB;AAC7B,aAAOkB;AAAA,QACLhD;AAAA,QACAC;AAAA,QACAC;AAAA,QACA;AAAA,QACAgE,IACI,MAAM,uBAAuB,IAC7BH;AAAA,QACJG,IAAmBL,EAAWnC,EAAY1B,CAAI,CAAC,IAAIgE;AAAA;IAE3D;AAAA,EACA,GAAG;;;;wBC7VC,QAAQ,IAAI,aAAa,eAC3BG,GAAA,UAAiBP,GAAA,IAEjBO,GAAA,UAAiBC,GAAA;;;ACwHZ,SAASC,GAAyC;AAAA,EACvD,MAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,SAAAC;AAAA,EACA,QAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,uBAAAC,IAAwB;AAAA,EACxB,QAAAC;AAAA,EACA,YAAAC;AAAA,EACA,cAAAC;AAAA,EACA,OAAAC;AAAA,EACA,SAAAC;AAAA,EACA,YAAAC;AAAA,EACA,YAAAC;AAAA,EACA,aAAAC;AAAA,EACA,eAAAC;AACF,GAAsB;;AACpB,MAAI,CAACH;AACH,WACEI,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,oCAAmC,UAAA;AAAA,MAAA;AAAA,4BAE/C,MAAA,EAAG;AAAA,MACJC,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAU,WACb,UAAA,6DAAA,CACH;AAAA,IAAA,GACF;AAIJ,QAAM;AAAA,IACJ,MAAAC;AAAA,IACA,aAAAC;AAAA,IACA,YAAAC;AAAA,IACA,OAAAC;AAAA,IACA,WAAAC;AAAA,IACA,WAAAC;AAAA,IACA,WAAAC;AAAA,IACA,aAAAC;AAAA,IACA,UAAAC;AAAA,IACA,QAAAC;AAAA,IACA,cAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,uBAAAC;AAAA,IACA,UAAAC;AAAA,IACA,sBAAAC;AAAA,IACA,0BAAAC;AAAA,EAAA,IACEvB,GAGEwB,KAAY,CAACC,GAAWC,MAA0B;AACtD,QAAI,OAAOlC,KAAW;AACpB,aAAOA,EAAOiC,CAAM;AAEtB,UAAME,IAASF,EAAOjC,CAAM;AAC5B,WAA+BmC,KAAW,OACtC,OAAOA,CAAM,IACb,OAAOD,CAAK;AAAA,EAClB,GAGME,KAAiB,GACrBjC,KAAA,QAAAA,EAAQ,eAAeA,EAAO,YAAY,KAAA,EAAO,SAAS,IAEtDkC,IAAa,GAAQ9B,KAAA,QAAAA,EAAS,WAAU+B,IAAA/B,KAAA,gBAAAA,EAAS,UAAT,QAAA+B,EAAgB,SACxDC,MACJhC,KAAA,gBAAAA,EAAS,WAASiC,IAAAjC,KAAA,gBAAAA,EAAS,UAAT,QAAAiC,EAAgB,SAAS,cAAc,aACrDC,IAAkB,CAACC,MACvBA,EAAK,cAAc,IAGfC,IAAuB,CAACV,GAAWC,MACnC,CAAC3B,KAAW,CAAC8B,IAAmB,OAIlCE,OAAe,eACfhC,EAAQ,SACRA,EAAQ,MAAM,SAAS,2BAGpBiB,GAAA,EACC,UAAA;AAAA,IAAAX,gBAAAA,EAAAA,IAACY,GAAA,EAAoB,SAAO,IAC1B,UAAAZ,gBAAAA,EAAAA;AAAAA,MAACU;AAAA,MAAA;AAAA,QACC,SAAQ;AAAA,QACR,WAAU;AAAA,QACV,cAAW;AAAA,QAEX,UAAAV,gBAAAA,EAAAA,IAAC+B,IAAA,EAAa,WAAU,UAAA,CAAU;AAAA,MAAA;AAAA,IAAA,GAEtC;AAAA,IACA/B,gBAAAA,EAAAA,IAACa,GAAA,EAAoB,OAAM,OACxB,YAAQ,MAAM;AAAA,MAAI,CAACgB,GAAMG,OACxBJ,EAAgBC,CAAI,IAClB7B,gBAAAA,EAAAA,IAACe,GAAA,CAAA,GAA2B,aAAaiB,EAAS,EAAI,IAEtDjC,gBAAAA,EAAAA;AAAAA,QAACe;AAAA,QAAA;AAAA,UAEC,SAAS,MAAMe,EAAK,QAAQT,GAAQC,CAAK;AAAA,UACzC,WAAWQ,EAAK;AAAA,UAEf,UAAA;AAAA,YAAAA,EAAK,QACJ7B,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAU,gBAAgB,YAAK,MAAK;AAAA,YAE3C6B,EAAK;AAAA,UAAA;AAAA,QAAA;AAAA,QAPD,UAAUG,EAAS;AAAA,MAAA;AAAA,IAQ1B,EAEJ,CACF;AAAA,EAAA,GACF,IAKGtC,EAAQ,SAASA,EAAQ,OAAO0B,GAAQC,CAAK,IAAI,MAIpDY,IAAoB,MAEtBjC,gBAAAA,EAAAA,IAACQ,GAAA,EACC,UAAAT,gBAAAA,EAAAA,KAACU,GAAA,EAAS,WAAU,iCACjB,UAAA;AAAA,IAAAvB,EAAQ,IAAI,CAACgD,MACZlC,gBAAAA,EAAAA;AAAAA,MAACO;AAAA,MAAA;AAAA,QAEC,WAAW,iCACT2B,EAAO,UAAU,WACb,gBACAA,EAAO,UAAU,UACf,eACA,WACR;AAAA,QACA,OAAO,EAAE,OAAOA,EAAO,MAAA;AAAA,QAEtB,UAAAA,EAAO;AAAA,MAAA;AAAA,MAVH,OAAOA,EAAO,GAAG;AAAA,IAAA,CAYzB;AAAA,IACAV,KACCxB,gBAAAA,EAAAA,IAACO,GAAA,EAAU,WAAU,4CAClB,WAAAb,KAAA,gBAAAA,EAAS,UAAS,KAAA,CACrB;AAAA,EAAA,EAAA,CAEJ,EAAA,CACF,GAKEyC,IAAkB,MAElBlD,IAEAe,gBAAAA,EAAAA,IAACK,GAAA,EACE,UAAA,MAAM,KAAK,EAAE,QAAQ,EAAA,CAAG,EAAE,IAAI,CAAC+B,GAAGf,6BAChCZ,GAAA,EACE,UAAA;AAAA,IAAAvB,EAAQ,IAAI,CAACgD,MACZlC,gBAAAA,EAAAA;AAAAA,MAACM;AAAA,MAAA;AAAA,QAEC,OAAO,EAAE,OAAO4B,EAAO,MAAA;AAAA,QACvB,WACEA,EAAO,UAAU,WACb,gBACAA,EAAO,UAAU,UACf,eACA;AAAA,QAGR,UAAAlC,gBAAAA,EAAAA,IAACgB,GAAA,EAAS,WAAU,aAAA,CAAa;AAAA,MAAA;AAAA,MAV5B,OAAOkB,EAAO,GAAG;AAAA,IAAA,CAYzB;AAAA,IACAV,KACCxB,gBAAAA,EAAAA,IAACM,GAAA,EACC,gCAACU,GAAA,EAAS,WAAU,mBAAkB,EAAA,CACxC;AAAA,EAAA,KAnBWK,CAqBf,CACD,GACH,IAKArC,EAAK,WAAW,IAEhBgB,gBAAAA,EAAAA,IAACK,GAAA,EACC,UAAAL,gBAAAA,EAAAA,IAACS,GAAA,EACC,UAAAT,gBAAAA,EAAAA;AAAAA,IAACM;AAAA,IAAA;AAAA,MACC,SAASpB,EAAQ,UAAUsC,IAAa,IAAI;AAAA,MAC5C,WAAU;AAAA,MAET,eAAiBnC,IAAwBD;AAAA,IAAA;AAAA,EAAA,GAE9C,EAAA,CACF,0BAMDiB,GAAA,EACE,UAAArB,EAAK,IAAI,CAACoC,GAAQC,MAAU;AAC3B,UAAMxG,IAAMsG,GAAUC,GAAQC,CAAK,GAC7BgB,KAAW5C,KAAA,gBAAAA,EAAQ2B,GAAQC,IAC3BiB,KAAY9C,KAAA,gBAAAA,EAAe4B,GAAQC;AAEzC,WACEtB,gBAAAA,EAAAA;AAAAA,MAACU;AAAA,MAAA;AAAA,QAEC,WAAW,GAAG6B,MAAa,EAAE;AAAA,QAC5B,GAAGD;AAAA,QAEH,UAAA;AAAA,UAAAnD,EAAQ,IAAI,CAACgD,OAAW;AACvB,kBAAMnG,KAAQqF,EAAOc,GAAO,GAAc,GACpCK,KAAUL,GAAO,SACnBA,GAAO,OAAOnG,IAA0BqF,GAAQC,CAAK,IACrDtF;AAEJ,mBACEiE,gBAAAA,EAAAA;AAAAA,cAACM;AAAA,cAAA;AAAA,gBAEC,WACE4B,GAAO,UAAU,WACb,gBACAA,GAAO,UAAU,UACf,eACA;AAAA,gBAGP,UAAAK;AAAA,cAAA;AAAA,cATI,OAAOL,GAAO,GAAG;AAAA,YAAA;AAAA,UAY5B,CAAC;AAAA,UACAV,KACCxB,gBAAAA,EAAAA,IAACM,GAAA,EAAU,WAAU,cAClB,UAAAR,IACGA,EAAcsB,GAAQC,CAAK,IAC3BS,EAAqBV,GAAQC,CAAK,EAAA,CACxC;AAAA,QAAA;AAAA,MAAA;AAAA,MA9BGxG;AAAA,IAAA;AAAA,EAkCX,CAAC,EAAA,CACH,GAKE2H,IAAoB,CAACD,MACzBxC,gBAAAA,EAAAA,KAACE,GAAA,EACE,UAAA;AAAA,IAAAX,KACCU,gBAAAA,EAAAA,IAAC,SAAI,WAAU,YACb,gCAACiB,GAAA,EAAsB,GAAG3B,GAAQ,EAAA,CACpC;AAAA,IAEFU,gBAAAA,EAAAA,IAACE,GAAA,EAAY,WAAU,OAAO,UAAAqC,GAAQ;AAAA,KACrChD,KAAA,gBAAAA,EAAY,UAAS,MAASA,KAC7BS,gBAAAA,EAAAA,IAACG,GAAA,EAAW,WAAU,iBACpB,UAAAH,gBAAAA,EAAAA;AAAAA,MAACkB;AAAA,MAAA;AAAA,QACC,aAAa3B,EAAW;AAAA,QACxB,UAAUA,EAAW;AAAA,QACrB,OAAOA,EAAW;AAAA,QAClB,cAAcA,EAAW;AAAA,QACzB,kBAAkBA,EAAW;AAAA,QAC7B,iBAAiBA,EAAW;AAAA,QAC5B,sBAAsBA,EAAW;AAAA,QACjC,gBAAgBA,EAAW;AAAA,QAC3B,WAAWA,EAAW;AAAA,QACtB,cAAcgC;AAAA,MAAA;AAAA,IAAA,EAChB,CACF;AAAA,EAAA,GAEJ,GAIIkB,KAAqB,CAACC,GAAwBC,6BACjDvC,GAAA,EACE,UAAA;AAAA,IAAAsC;AAAA,IACAC;AAAA,EAAA,GACH;AAGF,SAAO/C,IACHA;AAAA,IACEC,IACIA,EAAYoC,KAAqBE,EAAA,CAAiB,IAClDM,GAAmBR,EAAA,GAAqBE,EAAA,CAAiB;AAAA,EAAA,IAE/DK;AAAA,IACE3C,IACIA,EAAYoC,KAAqBE,EAAA,CAAiB,IAClDM,GAAmBR,EAAA,GAAqBE,EAAA,CAAiB;AAAA,EAAA;AAErE;ACrWO,SAASS,GAAoB;AAAA,EAClC,MAAAC;AAAA,EACA,cAAAC;AAAA,EACA,OAAAC;AAAA,EACA,aAAAC;AAAA,EACA,WAAAC;AAAA,EACA,SAAAhE,IAAU;AAAA,EACV,aAAAiE,IAAc;AAAA,EACd,YAAAC,IAAa;AAAA,EACb,sBAAAC,IAAuB;AAAA,EACvB,cAAAC;AAAA,EACA,YAAA1D;AAAA,EACA,aAAA2D;AACF,GAA6B;AAC3B,QAAM,CAACC,GAAYC,CAAa,IAAIC,EAAS,EAAE;AAS/C,MANAC,GAAU,MAAM;AACd,IAAIb,KACFW,EAAc,EAAE;AAAA,EAEpB,GAAG,CAACX,GAAMQ,KAAA,gBAAAA,EAAc,WAAW,CAAC,GAEhC,CAAC1D;AACH,WACEK,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,oCAAmC,UAAA,mCAElD;AAIJ,QAAM;AAAA,IACJ,QAAA2D;AAAA,IACA,eAAAC;AAAA,IACA,cAAAC;AAAA,IACA,cAAAC;AAAA,IACA,aAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,QAAAtD;AAAA,IACA,OAAAuD;AAAA,IACA,OAAAC;AAAA,EAAA,IACEvE,GAEEwE,IAAoBd,IACtBE,MAAeF,EAAa,cAC5B,IAEEe,IAAgB,MAAM;AAC1B,IAAID,KACJlB,EAAA;AAAA,EACF;AAEA,SACEjD,gBAAAA,EAAAA,IAAC2D,GAAA,EAAO,MAAAd,GAAY,cAAAC,GAClB,iCAACc,GAAA,EACC,UAAA;AAAA,IAAA7D,gBAAAA,OAAC8D,GAAA,EACC,UAAA;AAAA,MAAA7D,gBAAAA,EAAAA,IAAC+D,GAAA,EAAY,SAAO,IAClB,UAAA/D,gBAAAA,EAAAA,IAAC,SAAI,WAAU,2BAA2B,aAAM,EAAA,CAClD;AAAA,4BACCgE,GAAA,EAAkB,SAAO,IACxB,UAAAhE,gBAAAA,EAAAA,IAAC,OAAA,EAAK,aAAY,EAAA,CACpB;AAAA,IAAA,GACF;AAAA,IAECqD,2BACE,OAAA,EAAI,WAAU,kBACb,UAAAtD,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,MAAAC,gBAAAA,MAACkE,GAAA,EAAM,SAAQ,iBACZ,UAAAb,EAAa,SAAS,UACzB;AAAA,MACArD,gBAAAA,EAAAA;AAAAA,QAACiE;AAAA,QAAA;AAAA,UACC,IAAG;AAAA,UACH,OAAOV;AAAA,UACP,UAAU,CAACc,MACTb,EAAca,EAAE,OAAO,KAAK;AAAA,UAE9B,aAAahB,EAAa;AAAA,UAC1B,UAAUpE;AAAA,QAAA;AAAA,MAAA;AAAA,IACZ,EAAA,CACF,EAAA,CACF;AAAA,2BAGD6E,GAAA,EACC,UAAA;AAAA,MAAA9D,gBAAAA,EAAAA;AAAAA,QAACU;AAAA,QAAA;AAAA,UACC,SAAQ;AAAA,UACR,SAAS,MAAMoC,EAAa,EAAK;AAAA,UACjC,UAAU7D;AAAA,UAET,UAAAkE;AAAA,QAAA;AAAA,MAAA;AAAA,MAEHpD,gBAAAA,EAAAA;AAAAA,QAACW;AAAA,QAAA;AAAA,UACC,SAAS0C;AAAA,UACT,SAASgB;AAAA,UACT,UAAUD,KAAqBlF;AAAA,UAE9B,UAAA;AAAA,YAAAA,KACCe,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAU,QACb,UAAAsD,KACCvD,gBAAAA,EAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAU;AAAA,gBACV,MAAK;AAAA,gBACL,SAAQ;AAAA,gBAER,UAAA;AAAA,kBAAAC,gBAAAA,EAAAA;AAAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,WAAU;AAAA,sBACV,IAAG;AAAA,sBACH,IAAG;AAAA,sBACH,GAAE;AAAA,sBACF,QAAO;AAAA,sBACP,aAAY;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAEdA,gBAAAA,EAAAA;AAAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,WAAU;AAAA,sBACV,MAAK;AAAA,sBACL,GAAE;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACJ;AAAA,cAAA;AAAA,YAAA,GAGN;AAAA,YAEDkD;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACH,EAAA,CACF;AAAA,EAAA,EAAA,CACF,EAAA,CACF;AAEJ;AC5JO,SAAS1C,GAAY;AAAA,EAC1B,OAAAuC;AAAA,EACA,mBAAAuB,IAAoB;AAAA,EACpB,aAAAC,IAAc;AAAA,EACd,gBAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC,IAAa;AAAA,EACb,QAAAC;AAAA,EACA,aAAAC;AAAA,EACA,eAAAC;AAAA,EACA,SAAA5F,IAAU;AAAA,EACV,YAAAU;AACF,GAAqB;AACnB,MAAI,CAACA;AACH,WACEK,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,oCAAmC,UAAA,mCAElD;AAIJ,QAAM,EAAE,OAAAiE,GAAO,QAAAvD,EAAA,IAAWf,GAEpBmF,IAAiB,CAACT,MAA2B;AACjD,IAAIA,EAAE,QAAQ,WAAWI,KACvBA,EAAA;AAAA,EAEJ;AAEA,SACE1E,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,IAAAA,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,MAAAC,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,qDACZ,UAAA+C,GACH;AAAA,MACAhD,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,2BACZ,UAAA;AAAA,QAAA4E,KAAU3E,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,2BAA2B,UAAA2E,GAAO;AAAA,QAC3D,CAACA,KAAUC,KAAeC,KACzB9E,gBAAAA,EAAAA,KAACW,GAAA,EAAO,SAASmE,GAAe,UAAU5F,GAAS,MAAK,MACtD,UAAA;AAAA,UAAAe,gBAAAA,EAAAA,IAAC+E,IAAA,EAAK,WAAU,eAAA,CAAe;AAAA,UAC9BH;AAAA,QAAA,EAAA,CACH;AAAA,MAAA,EAAA,CAEJ;AAAA,IAAA,GACF;AAAA,IACCF,KACC3E,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,MAAAA,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,4BACb,UAAA;AAAA,QAAAC,gBAAAA,EAAAA,IAACgF,IAAA,EAAO,WAAU,wDAAA,CAAwD;AAAA,QAC1EhF,gBAAAA,EAAAA;AAAAA,UAACiE;AAAA,UAAA;AAAA,YACC,aAAaK;AAAA,YACb,OAAOC;AAAA,YACP,UAAU,CAACF,MACTG,KAAA,gBAAAA,EAAiBH,EAAE,OAAO;AAAA,YAE5B,YAAYS;AAAA,YACZ,WAAU;AAAA,YACV,UAAU7F;AAAA,UAAA;AAAA,QAAA;AAAA,MACZ,GACF;AAAA,MACCwF,KACCzE,gBAAAA,EAAAA;AAAAA,QAACU;AAAA,QAAA;AAAA,UACC,SAAS+D;AAAA,UACT,UAAUxF;AAAA,UACV,SAAQ;AAAA,UACR,MAAK;AAAA,UACN,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAED,EAAA,CAEJ;AAAA,EAAA,GAEJ;AAEJ;AC/DO,SAASgG,GAAgB;AAAA,EAC9B,aAAAC;AAAA,EACA,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,cAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,iBAAAC,IAAkB,CAAC,IAAI,IAAI,EAAE;AAAA,EAC7B,sBAAAC,IAAuB;AAAA,EACvB,gBAAAC,IAAiB;AAAA,EACjB,WAAAC,IAAY;AAAA,EACZ,cAAAC,IAAe;AAAA,EACf,YAAAhG;AACF,GAAyB;AACvB,QAAM,CAACiG,GAAeC,CAAgB,IAAIpC,EAAS,OAAOyB,IAAc,CAAC,CAAC;AAM1E,MAJAxB,GAAU,MAAM;AACd,IAAAmC,EAAiB,OAAOX,IAAc,CAAC,CAAC;AAAA,EAC1C,GAAG,CAACA,CAAW,CAAC,GAEZ,CAACvF;AACH,WACEK,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,oCAAmC,UAAA,mCAElD;AAIJ,QAAM;AAAA,IACJ,QAAAU;AAAA,IACA,QAAAoF;AAAA,IACA,eAAAC;AAAA,IACA,eAAAC;AAAA,IACA,YAAAC;AAAA,IACA,aAAAC;AAAA,EAAA,IACEvG,GAEEwG,IAAa,KAAK,KAAKf,IAAQD,CAAQ,GACvCiB,IAAiB,KAAK,IAAID,GAAY,CAAC,GACvCE,IAAYnB,IAAcC,IAAW,GACrCmB,IAAU,KAAK,KAAKpB,IAAc,KAAKC,GAAUC,CAAK,GACtDmB,IAA2B,MAAM;AAAA,wBACjC,IAAI,CAAC,GAAGhB,GAAiBJ,CAAQ,CAAC;AAAA,EAAA,EACtC,KAAK,CAACqB,GAAGC,MAAMD,IAAIC,CAAC,GAChBC,IAAoBlB,KAAwB,EAAQF,GACpDqB,IAAgBP,IAAiB,GAEjCQ,IAAW,CAACC,MAAiB;AACjC,UAAMC,IAAW,KAAK,IAAI,GAAG,KAAK,IAAID,GAAMT,IAAiB,CAAC,CAAC;AAC/D,IAAIU,MAAa5B,KAGjBG,EAAayB,CAAQ;AAAA,EACvB,GAEMC,KAAkB,MAAM;AAC5B,QAAIX,KAAkB;AACpB,aAAO,MAAM,KAAK,EAAE,QAAQA,KAAkB,CAAChE,GAAGf,MAAUA,CAAK;AAGnE,UAAM2F,wBAAY,IAAY;AAAA,MAC5B;AAAA,MACA;AAAA,MACAZ,IAAiB;AAAA,MACjBA,IAAiB;AAAA,MACjBlB,IAAc;AAAA,MACdA;AAAA,MACAA,IAAc;AAAA,IAAA,CACf,GAEK+B,IAAe,MAAM,KAAKD,CAAK,EAClC,OAAO,CAACH,MAASA,KAAQ,KAAKA,IAAOT,CAAc,EACnD,KAAK,CAACI,GAAGC,MAAMD,IAAIC,CAAC,GACjBS,IAAyC,CAAA;AAE/C,eAAWL,KAAQI,GAAc;AAC/B,YAAME,IAAWD,EAAWA,EAAW,SAAS,CAAC;AACjD,MAAI,OAAOC,KAAa,YAAYN,IAAOM,IAAW,KACpDD,EAAW,KAAK,UAAU,GAE5BA,EAAW,KAAKL,CAAI;AAAA,IACtB;AAEA,WAAOK;AAAA,EACT,GAAA;AAGA,SAAI9B,MAAU,IAAU,OAGtBrF,gBAAAA,EAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,kCACT2F,IAAY,oBAAoB,aAClC;AAAA,MAEC,UAAA;AAAA,QAAAA,2BACE,OAAA,EAAI,WAAU,iCACZ,UAAAC,IACG,MAAMP,CAAK,WACXA,IAAQ,IACN,MAAMiB,CAAS,MAAMC,CAAO,QAAQlB,CAAK,SACzC,OAAA,CACR;AAAA,QAEFrF,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,iDACZ,UAAA;AAAA,UAAA2G,KACC3G,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,YAAAC,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAU,iCAAgC,UAAA,MAAE;AAAA,YAClDD,gBAAAA,EAAAA;AAAAA,cAAC+F;AAAA,cAAA;AAAA,gBACC,OAAO,OAAOX,CAAQ;AAAA,gBACtB,eAAe,CAACpJ,MAAkB;AAChC,wBAAMqL,IAAe,OAAOrL,CAAK;AACjC,kBACE,OAAO,MAAMqL,CAAY,KACzBA,MAAiBjC,KACjB,CAACG,KAIHA,EAAiB8B,CAAY;AAAA,gBAC/B;AAAA,gBAEA,UAAA;AAAA,kBAAApH,gBAAAA,MAAC+F,GAAA,EAAc,WAAU,gBACvB,UAAA/F,gBAAAA,MAACkG,KAAY,GACf;AAAA,kBACAlG,gBAAAA,EAAAA,IAACgG,GAAA,EACE,UAAAO,EAAyB,IAAI,CAACc,MAC7BrH,gBAAAA,MAACiG,GAAA,EAAwB,OAAO,OAAOoB,CAAM,GAC1C,UAAAA,EAAA,GADcA,CAEjB,CACD,EAAA,CACH;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,YAEFrH,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAU,iCAAgC,UAAA,IAAA,CAAC;AAAA,UAAA,GACnD;AAAA,UAEFD,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,sCAAqC,UAAA;AAAA,YAAA;AAAA,YAC/CmF,IAAc;AAAA,YAAE;AAAA,YAAMkB;AAAA,YAAe;AAAA,UAAA,GAC1C;AAAA,UACApG,gBAAAA,EAAAA;AAAAA,YAACU;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS,MAAMkG,EAAS1B,IAAc,CAAC;AAAA,cACvC,UAAUA,MAAgB,KAAK,CAACyB;AAAA,cAChC,cAAW;AAAA,cAEX,UAAA3G,gBAAAA,EAAAA,IAACsH,IAAA,EAAY,WAAU,UAAA,CAAU;AAAA,YAAA;AAAA,UAAA;AAAA,UAEnCtH,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,2BACZ,UAAA+G,EAAe;AAAA,YAAI,CAACQ,GAAWlG,MAC9BkG,MAAc,aACZvH,gBAAAA,EAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,WAAU;AAAA,gBACX,UAAA;AAAA,cAAA;AAAA,cAFM,YAAYqB,CAAK;AAAA,YAAA,IAMxBrB,gBAAAA,EAAAA;AAAAA,cAACU;AAAA,cAAA;AAAA,gBAEC,SAAS6G,MAAcrC,IAAc,YAAY;AAAA,gBACjD,MAAK;AAAA,gBACL,SAAS,MAAM0B,EAASW,CAAS;AAAA,gBACjC,UAAUA,MAAcrC;AAAA,gBACxB,gBAAcqC,MAAcrC,IAAc,SAAS;AAAA,gBAElD,UAAAqC,IAAY;AAAA,cAAA;AAAA,cAPRA;AAAA,YAAA;AAAA,UAQP,GAGN;AAAA,UACAvH,gBAAAA,EAAAA;AAAAA,YAACU;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS,MAAMkG,EAAS1B,IAAc,CAAC;AAAA,cACvC,UAAUA,KAAekB,IAAiB,KAAK,CAACO;AAAA,cAChD,cAAW;AAAA,cAEX,UAAA3G,gBAAAA,EAAAA,IAACwH,IAAA,EAAa,WAAU,UAAA,CAAU;AAAA,YAAA;AAAA,UAAA;AAAA,UAEnC/B,KACC1F,gBAAAA,EAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,UAAU,CAAC0H,MAAU;AACnB,gBAAAA,EAAM,eAAA;AACN,sBAAMX,IAAW,OAAO,SAASlB,GAAe,EAAE;AAClD,gBAAI,OAAO,MAAMkB,CAAQ,KAGzBF,EAASE,IAAW,CAAC;AAAA,cACvB;AAAA,cAEA,UAAA;AAAA,gBAAA9G,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAU,iCAAgC,UAAA,MAAE;AAAA,gBAClDA,gBAAAA,EAAAA;AAAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,KAAK;AAAA,oBACL,KAAKoG;AAAA,oBACL,OAAOR;AAAA,oBACP,UAAU,CAACe;AAAA,oBACX,UAAU,CAACc,MAAU5B,EAAiB4B,EAAM,OAAO,KAAK;AAAA,oBACxD,WAAU;AAAA,oBACV,cAAW;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAEbzH,gBAAAA,EAAAA;AAAAA,kBAACU;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAQ;AAAA,oBACR,MAAK;AAAA,oBACL,UAAU,CAACiG;AAAA,oBACZ,UAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAED;AAAA,YAAA;AAAA,UAAA;AAAA,QACF,EAAA,CAEJ;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;AC1MA,MAAMe,KAA+B;AAAA,EACnC;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MACE3H,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,QAAO;AAAA,QAEP,UAAA;AAAA,UAAAC,gBAAAA,EAAAA,IAAC,UAAA,EAAO,WAAU,cAAa,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,aAAY,IAAA,CAAI;AAAA,UACtEA,gBAAAA,EAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,GAAE;AAAA,cACF,aAAY;AAAA,cACZ,eAAc;AAAA,YAAA;AAAA,UAAA;AAAA,QAChB;AAAA,MAAA;AAAA,IAAA;AAAA,EACF;AAAA,EAGJ;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MACEA,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,QAAO;AAAA,QAEP,UAAAA,gBAAAA,EAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,GAAE;AAAA,YACF,aAAY;AAAA,YACZ,eAAc;AAAA,YACd,gBAAe;AAAA,UAAA;AAAA,QAAA;AAAA,MACjB;AAAA,IAAA;AAAA,EACF;AAAA,EAGJ;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MACED,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,QAAO;AAAA,QAEP,UAAA;AAAA,UAAAC,gBAAAA,EAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,GAAE;AAAA,cACF,GAAE;AAAA,cACF,OAAM;AAAA,cACN,QAAO;AAAA,cACP,IAAG;AAAA,cACH,IAAG;AAAA,cACH,aAAY;AAAA,YAAA;AAAA,UAAA;AAAA,gCAEb,QAAA,EAAK,GAAE,kBAAiB,aAAY,KAAI,eAAc,QAAA,CAAQ;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACjE;AAGN;AAMO,SAAS2H,GAAc;AAAA,EAC5B,OAAA5L;AAAA,EACA,eAAA6L;AAAA,EACA,QAAAC,IAASH;AAAAA,EACT,gBAAAI,IAAiB;AAAA,EACjB,aAAAC,IAAc;AAAA,EACd,kBAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,iBAAAC,IAAkB;AAAA,EAClB,mBAAAC,IAAoB;AAAA,EACpB,gBAAAC;AAAA,EACA,YAAAzI;AAAA,EACA,YAAA0I;AACF,GAAuB;AACrB,QAAM,CAACC,GAASC,CAAU,IAAI9E,EAAS,EAAK;AAM5C,MAJAC,GAAU,MAAM;AACd,IAAA6E,EAAW,EAAI;AAAA,EACjB,GAAG,CAAA,CAAE,GAEDJ,KAAqB,CAACG;AACxB,WAAO;AAGT,MAAI,CAAC3I;AACH,WACEK,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,oCAAmC,UAAA,mCAElD;AAIJ,QAAM;AAAA,IACJ,cAAAW;AAAA,IACA,qBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,wBAAA2H;AAAA,IACA,uBAAAC;AAAA,IACA,QAAA/H;AAAA,EAAA,IACEf,GAME+I,IAAe,CAACC,MAAwC;AAC5D,QAAIN,KAAcA,EAAWM,CAAU;AACrC,aAAON,EAAWM,CAAU;AAE9B,UAAMC,IAAQf,EAAO,KAAK,CAACgB,MAAMA,EAAE,UAAUF,CAAU;AACvD,WAAOC,KAAA,gBAAAA,EAAO;AAAA,EAChB,GAEME,IAAcJ,EAAa3M,CAAK,GAEhCgN,IAAcb,IAAkBY,IAAc,MAC9CE,IAAYf,IAAW,EAAE,OAAOA,GAAU,QAAQA,EAAA,IAAa,CAAA;AAErE,gCACGtH,GAAA,EACC,UAAA;AAAA,IAAAX,gBAAAA,EAAAA,IAACY,GAAA,EAAoB,SAAO,IAC1B,UAAAZ,gBAAAA,EAAAA;AAAAA,MAACU;AAAA,MAAA;AAAA,QACC,SAASoH;AAAA,QACT,MAAMC;AAAA,QACN,WAAWC;AAAA,QAEV,UAAAI,KACCpI,gBAAAA,EAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAOgJ;AAAA,YACP,WAAU;AAAA,YAET,UAAAD;AAAA,UAAA;AAAA,QAAA;AAAA,MACH;AAAA,IAAA,GAGN;AAAA,IACA/I,gBAAAA,MAACa,GAAA,EACC,UAAAb,gBAAAA,EAAAA,IAACwI,GAAA,EAAuB,OAAAzM,GAAc,eAAA6L,GACnC,UAAAC,EAAO,IAAI,CAACe,MACX7I,gBAAAA,OAAC0I,GAAA,EAAwC,OAAOG,EAAM,OACpD,UAAA;AAAA,MAAA5I,gBAAAA,MAAC,UAAK,WAAU,iCACb,UAAA0I,EAAaE,EAAM,KAAK,GAC3B;AAAA,MACA5I,gBAAAA,EAAAA,IAAC,QAAA,EAAM,UAAA4I,EAAM,MAAA,CAAM;AAAA,IAAA,EAAA,GAJOA,EAAM,KAKlC,CACD,EAAA,CACH,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;AClLA,MAAMlB,KAA+B;AAAA,EACnC;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MACE3H,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,QAAO;AAAA,QAEP,UAAA;AAAA,UAAAC,gBAAAA,EAAAA,IAAC,UAAA,EAAO,WAAU,cAAa,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,aAAY,IAAA,CAAI;AAAA,UACtEA,gBAAAA,EAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,GAAE;AAAA,cACF,aAAY;AAAA,cACZ,eAAc;AAAA,YAAA;AAAA,UAAA;AAAA,QAChB;AAAA,MAAA;AAAA,IAAA;AAAA,EACF;AAAA,EAGJ;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MACEA,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,QAAO;AAAA,QAEP,UAAAA,gBAAAA,EAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,GAAE;AAAA,YACF,aAAY;AAAA,YACZ,eAAc;AAAA,YACd,gBAAe;AAAA,UAAA;AAAA,QAAA;AAAA,MACjB;AAAA,IAAA;AAAA,EACF;AAAA,EAGJ;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MACED,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,QAAO;AAAA,QAEP,UAAA;AAAA,UAAAC,gBAAAA,EAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,GAAE;AAAA,cACF,GAAE;AAAA,cACF,OAAM;AAAA,cACN,QAAO;AAAA,cACP,IAAG;AAAA,cACH,IAAG;AAAA,cACH,aAAY;AAAA,YAAA;AAAA,UAAA;AAAA,gCAEb,QAAA,EAAK,GAAE,kBAAiB,aAAY,KAAI,eAAc,QAAA,CAAQ;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACjE;AAGN;AAMO,SAASiJ,GAAqB;AAAA,EACnC,OAAAlN;AAAA,EACA,eAAA6L;AAAA,EACA,QAAAC,IAASH;AAAA,EACT,UAAAO,IAAW;AAAA,EACX,YAAAtI;AAAA,EACA,YAAA0I;AACF,GAA8B;AAC5B,MAAI,CAAC1I;AACH,WACEK,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,oCAAmC,UAAA,mCAElD;AAIJ,QAAM,EAAE,wBAAAwI,GAAwB,uBAAAC,EAAA,IAA0B9I,GAMpD+I,IAAe,CAACC,MAAwC;AAC5D,QAAIN,KAAcA,EAAWM,CAAU;AACrC,aAAON,EAAWM,CAAU;AAE9B,UAAMC,IAAQf,EAAO,KAAK,CAACgB,MAAMA,EAAE,UAAUF,CAAU;AACvD,WAAOC,KAAA,gBAAAA,EAAO;AAAA,EAChB,GAEMI,IAAYf,IAAW,EAAE,OAAOA,GAAU,QAAQA,EAAA,IAAa,CAAA;AAErE,SACEjI,gBAAAA,EAAAA,IAACwI,GAAA,EAAuB,OAAAzM,GAAc,eAAA6L,GACnC,UAAAC,EAAO,IAAI,CAACe,MACX7I,gBAAAA,EAAAA,KAAC0I,GAAA,EAAwC,OAAOG,EAAM,OACpD,UAAA;AAAA,IAAA5I,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAU,iCAAgC,OAAOgJ,GACpD,UAAAN,EAAaE,EAAM,KAAK,EAAA,CAC3B;AAAA,IACA5I,gBAAAA,EAAAA,IAAC,QAAA,EAAM,UAAA4I,EAAM,MAAA,CAAM;AAAA,EAAA,EAAA,GAJOA,EAAM,KAKlC,CACD,GACH;AAEJ;ACrCO,SAASM,GAAgB;AAAA,EAC9B,KAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,cAAAC,IAAe;AAAA,EACf,OAAOC;AAAA,EACP,eAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,UAAAC,IAAW;AAAA,EACX,aAAaC;AAAA,EACb,cAAArE;AAAA,EACA,aAAAsE,IAAc;AAAA,EACd,gBAAAC,IAAiB;AAAA,EACjB,eAAAC,IAAgB;AAAA,EAChB,WAAAvH;AAAA,EACA,oBAAAwH;AAAA,EACA,eAAAC;AAAA,EACA,YAAApK;AAAA,EACA,eAAAqK;AAAA,EACA,aAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,WAAAC,IAAY;AACd,GAAyB;AAIvB,QAAM,CAACC,GAAaC,CAAc,IAAI5G,EAAkC,IAAI,GACtE,CAAC6G,GAAcC,CAAe,IAAI9G,EAAS2F,CAAW,GACtD,CAACoB,GAAeC,CAAgB,IAAIhH,EAAS4F,CAAY,GACzD,CAACqB,GAAWC,CAAY,IAAIlH,EAAS,EAAI,GACzC,CAACmH,GAAOC,CAAQ,IAAIpH,EAAuB,IAAI,GAC/C,CAAC0C,GAAY2E,CAAa,IAAIrH,EAAS,CAAC,GACxC,CAACsH,GAAcC,EAAe,IAAIvH,EAAS,EAAK,GAChDwH,KAAYC,GAAuB,IAAI,GACvCC,IAAiBD,GAAY,IAAI,GAGjC,CAACE,IAAUC,CAAW,IAAI5H,EAAc,IAAI,GAG5CyB,IAAcwE,KAAkBY,GAChCgB,IAAQhC,KAAmBkB,GAG3Be,IAAiBC,GAAQ,MAAM;AACnC,UAAMxE,IAAQ,CAAC9B,CAAW;AAC1B,WAAIA,IAAc,KAAG8B,EAAM,KAAK9B,IAAc,CAAC,GAC3CA,IAAciB,KAAYa,EAAM,KAAK9B,IAAc,CAAC,GACjD8B;AAAA,EACT,GAAG,CAAC9B,GAAaiB,CAAU,CAAC,GAGtBS,IAAW6E;AAAA,IACf,CAAC5E,MAAiB;AAChB,YAAM6E,IAAU,KAAK,IAAIvF,GAAY,CAAC,GAChCwF,IAAa,KAAK,IAAI,KAAK,IAAI9E,GAAM,CAAC,GAAG6E,CAAO;AACtD,MAAIhC,MAAmB,UACrBa,EAAgBoB,CAAU,GAE5BtG,KAAA,QAAAA,EAAesG;AAAA,IACjB;AAAA,IACA,CAACxF,GAAYuD,GAAgBrE,CAAY;AAAA,EAAA,GAGrCuG,KAAqBH,GAAY,MAAM;AAC3C,IAAIvG,IAAc,KAChB0B,EAAS1B,IAAc,CAAC;AAAA,EAE5B,GAAG,CAACA,GAAa0B,CAAQ,CAAC,GAEpBiF,IAAiBJ,GAAY,MAAM;AACvC,IAAIvG,IAAciB,KAChBS,EAAS1B,IAAc,CAAC;AAAA,EAE5B,GAAG,CAACA,GAAaiB,GAAYS,CAAQ,CAAC,GAGhCkF,IAAeL,GAAY,MAAM;AACrC,UAAMM,IAAW,KAAK,IAAIT,IAAQ,MAAM7B,CAAQ;AAChD,IAAIH,MAAoB,UACtBmB,EAAiBsB,CAAQ,GAE3BxC,KAAA,QAAAA,EAAgBwC;AAAA,EAClB,GAAG,CAACT,GAAO7B,GAAUH,GAAiBC,CAAa,CAAC,GAE9CyC,IAAgBP,GAAY,MAAM;AACtC,UAAMM,IAAW,KAAK,IAAIT,IAAQ,MAAM9B,CAAQ;AAChD,IAAIF,MAAoB,UACtBmB,EAAiBsB,CAAQ,GAE3BxC,KAAA,QAAAA,EAAgBwC;AAAA,EAClB,GAAG,CAACT,GAAO9B,GAAUF,GAAiBC,CAAa,CAAC,GAE9C0C,IAAyBR,GAAY,YAAY;;AACrD,QAAI,SAAO,WAAa,MAExB;AAAA,UAAI,CAAC,SAAS,mBAAmB;AAC/B,gBAAM9J,KAAAF,IAAAwJ,GAAU,YAAV,gBAAAxJ,EAAmB,sBAAnB,gBAAAE,EAAA,KAAAF;AACN;AAAA,MACF;AAEA,cAAMyK,IAAA,SAAS,mBAAT,gBAAAA,EAAA;AAAA;AAAA,EACR,GAAG,CAAA,CAAE;AA0KL,MAvKAxI,GAAU,MAAM;AACd,QAAIyI,IAAY;AA4BhB,YA1BqB,YAAY;AAC/B,UAAI;AAEF,cAAMC,IAAY,MAAM,OAAO,qBAAW;AAE1C,YAAI,OAAO,SAAW,KAAa;AACjC,gBAAMC,IAASD,EAAkB,OAC3BE,KAAgBD,KAAA,gBAAAA,EAAO;AAC7B,UAAIA,KAAA,QAAAA,EAAO,uBAAuBC,OAChCD,EAAM,oBAAoB,YAAY,2CAA2CC,EAAa;AAAA,QAElG;AACA,QAAIH,KACFd,EAAYe,CAAS;AAAA,MAEzB,SAASG,GAAK;AACZ,YAAIJ,GAAW;AACb,gBAAMK,IACJD,aAAe,QAAQA,IAAM,IAAI,MAAM,kBAAkB;AAC3D,UAAA1B,EAAS2B,CAAS,GAClB7B,EAAa,EAAK,GAClBV,KAAA,QAAAA,EAAcuC;AAAA,QAChB;AAAA,MACF;AAAA,IACF,GAEA,GAEO,MAAM;AACX,MAAAL,IAAY;AAAA,IACd;AAAA,EAEF,GAAG,CAAA,CAAE,GAGLzI,GAAU,MAAM;AACd,QAAI,CAAC0H,MAAY,CAACjC,EAAK;AAEvB,QAAIgD,IAAY;AAwChB,YAtCgB,YAAY;AAC1B,MAAAxB,EAAa,EAAI,GACjBE,EAAS,IAAI;AAEb,UAAI;AACF,cAAM,EAAE,UAAA4B,MAAarB;AACrB,YAAI,CAACqB;AACH,gBAAM,IAAI,MAAM,0BAA0B;AAK5C,cAAMC,IAAetB,GAAS,MAAc,YAAYjC,CAAG;AAC3D,QAAAgC,EAAe,UAAUuB;AACzB,cAAMC,KAAM,MAAMD,EAAY;AAE9B,QAAIP,MACF9B,EAAesC,EAAuB,GACtC7B,EAAc6B,GAAI,QAAQ,GACtBjD,MAAmB,UACrBa;AAAA,UAAgB,CAACqC,OACf,KAAK,IAAI,GAAG,KAAK,IAAIA,IAAMD,GAAI,QAAQ,CAAC;AAAA,QAAA,GAG5ChC,EAAa,EAAK,GAClBX,KAAA,QAAAA,EAAgB2C;AAAA,MAEpB,SAASJ,GAAK;AACZ,YAAIJ,GAAW;AACb,gBAAMK,IACJD,aAAe,QAAQA,IAAM,IAAI,MAAM,UAAU;AACnD,UAAA1B,EAAS2B,CAAS,GAClB7B,EAAa,EAAK,GAClBV,KAAA,QAAAA,EAAcuC;AAAA,QAChB;AAAA,MACF;AAAA,IACF,GAEA,GAEO,MAAM;AACX,MAAAL,IAAY,IAEVhB,EAAe,WACf,OAAOA,EAAe,QAAQ,WAAY,eAE1CA,EAAe,QAAQ,QAAA,GACvBA,EAAe,UAAU;AAAA,IAE7B;AAAA,EACF,GAAG,CAACC,IAAUjC,GAAKa,GAAeC,CAAW,CAAC,GAE9CvG,GAAU,MAAM;AACd,QAAI,OAAO,WAAa,IAAa;AAErC,UAAMmJ,IAAyB,MAAM;AACnC,MAAA7B,GAAgB,SAAS,sBAAsBC,GAAU,OAAO;AAAA,IAClE;AAEA,oBAAS,iBAAiB,oBAAoB4B,CAAsB,GAE7D,MAAM;AACX,eAAS,oBAAoB,oBAAoBA,CAAsB;AAAA,IACzE;AAAA,EACF,GAAG,CAAA,CAAE,GAGLnJ,GAAU,MAAM;AACd,QAAI,CAACmG,EAAe;AAEpB,UAAMiD,IAAgB,CAACzI,MAAqB;AAE1C,YAAM0I,IAAgB,SAAS;AAC/B,MACEA,MACCA,EAAc,YAAY,WACzBA,EAAc,aAAa,MAAM,MAAM,cAMtC1I,EAAE,WAAWA,EAAE,aAAaA,EAAE,QAAQ,OAAOA,EAAE,QAAQ,QAC1DA,EAAE,eAAA,GACFyH,EAAA,MAGQzH,EAAE,WAAWA,EAAE,YAAYA,EAAE,QAAQ,OAC7CA,EAAE,eAAA,GACF2H,EAAA,KAGO3H,EAAE,QAAQ,eACjBA,EAAE,eAAA,GACFuH,GAAA,KAGOvH,EAAE,QAAQ,gBACjBA,EAAE,eAAA,GACFwH,EAAA,MAGOxH,EAAE,QAAQ,OAAOA,EAAE,QAAQ,SAClCA,EAAE,eAAA,GACG4H,EAAA;AAAA,IAET;AAEA,oBAAS,iBAAiB,WAAWa,CAAa,GAC3C,MAAM;AACX,eAAS,oBAAoB,WAAWA,CAAa;AAAA,IACvD;AAAA,EACF,GAAG;AAAA,IACDjD;AAAA,IACAiC;AAAA,IACAE;AAAA,IACAJ;AAAA,IACAC;AAAA,IACAI;AAAA,EAAA,CACD,GAKG,CAACtM;AACH,WACEK,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,oCAAmC,UAAA,mCAElD;AAIJ,QAAM;AAAA,IACJ,MAAAC;AAAA,IACA,aAAAC;AAAA,IACA,QAAAQ;AAAA,IACA,OAAOsM;AAAA,IACP,UAAAhM;AAAA,EAAA,IACErB,GAGEsN,KAAgB,MACftD,IAGH5J,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,IAAAC,gBAAAA,EAAAA;AAAAA,MAACU;AAAA,MAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,SAASsL;AAAA,QACT,UAAUV,KAAS9B;AAAA,QAEnB,gCAAC0D,IAAA,CAAA,CAAY;AAAA,MAAA;AAAA,IAAA;AAAA,IAEfnN,gBAAAA,EAAAA,KAAC,QAAA,EAAK,WAAU,WAAW,UAAA;AAAA,MAAA,KAAK,MAAMuL,IAAQ,GAAG;AAAA,MAAE;AAAA,IAAA,GAAC;AAAA,IACpDtL,gBAAAA,EAAAA;AAAAA,MAACU;AAAA,MAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,SAASoL;AAAA,QACT,UAAUR,KAAS7B;AAAA,QAEnB,gCAAC0D,IAAA,CAAA,CAAW;AAAA,MAAA;AAAA,IAAA;AAAA,IAEdnN,gBAAAA,EAAAA;AAAAA,MAACU;AAAA,MAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,SAAS,MAAM;AACb,UAAKuL,EAAA;AAAA,QACP;AAAA,QAEC,UAAAlB,IAAe/K,gBAAAA,MAACoN,IAAA,CAAA,CAAc,0BAAMC,IAAA,CAAA,CAAc;AAAA,MAAA;AAAA,IAAA;AAAA,EACrD,GACF,IA9BuB,MAmCrBC,KAAmB,MAClB1D,IAGH7J,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,IAAAC,gBAAAA,EAAAA;AAAAA,MAACU;AAAA,MAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,SAASkL;AAAA,QACT,UAAU1G,KAAe;AAAA,QAEzB,gCAACqI,IAAA,CAAA,CAAgB;AAAA,MAAA;AAAA,IAAA;AAAA,IAElBP,KACChN,gBAAAA,EAAAA;AAAAA,MAACgN;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK,KAAK,IAAI7G,GAAY,CAAC;AAAA,QAC3B,OAAOjB;AAAA,QACP,UAAU,CAACb,MAAMuC,EAAS,SAASvC,EAAE,OAAO,OAAO,EAAE,KAAK,CAAC;AAAA,QAC3D,WAAU;AAAA,MAAA;AAAA,IAAA,IAGZrE,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK,KAAK,IAAImG,GAAY,CAAC;AAAA,QAC3B,OAAOjB;AAAA,QACP,UAAU,CAACb,MAAMuC,EAAS,SAASvC,EAAE,OAAO,OAAO,EAAE,KAAK,CAAC;AAAA,QAC3D,WAAU;AAAA,MAAA;AAAA,IAAA;AAAA,IAGdtE,gBAAAA,EAAAA,KAAC,QAAA,EAAK,WAAU,iCAAgC,UAAA;AAAA,MAAA;AAAA,MAAGoG;AAAA,IAAA,GAAW;AAAA,IAC9DnG,gBAAAA,EAAAA;AAAAA,MAACU;AAAA,MAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,SAASmL;AAAA,QACT,UAAU3G,KAAeiB;AAAA,QAEzB,gCAACqH,IAAA,CAAA,CAAiB;AAAA,MAAA;AAAA,IAAA;AAAA,EACpB,GACF,IAxC0B,MA4CxBC,KAAmB,MACnB,CAAC9D,KAAe,CAACC,IAAuB,OAG1C7J,gBAAAA,EAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,eAAY;AAAA,MACZ,WAAU;AAAA,MAET,UAAA;AAAA,QAAAkN,GAAA;AAAA,QACAK,GAAA;AAAA,MAAiB;AAAA,IAAA;AAAA,EAAA,GAMlBI,KAAgB,MACpB3N,gBAAAA,OAAC,OAAA,EAAI,WAAU,2DACb,UAAA;AAAA,IAAAC,gBAAAA,EAAAA,IAACgB,IAAA,EAAS,WAAU,WAAA,CAAW;AAAA,IAC/BhB,gBAAAA,EAAAA,IAACgB,IAAA,EAAS,WAAU,wBAAA,CAAwB;AAAA,IAC5ChB,gBAAAA,EAAAA,IAAC,KAAA,EAAE,WAAU,iCAAiC,UAAAkK,EAAA,CAAY;AAAA,EAAA,GAC5D,GAIIyD,KAAc,MAClB3N,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,2DACb,UAAAD,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,IAAAC,gBAAAA,EAAAA,IAAC,KAAA,EAAE,WAAU,eAAe,UAAAmK,GAAU;AAAA,IACrCS,KACC5K,gBAAAA,EAAAA,IAAC,KAAA,EAAE,WAAU,sCAAsC,YAAM,QAAA,CAAQ;AAAA,EAAA,EAAA,CAErE,EAAA,CACF,GAII4N,KAAoB,MAAM;AAC9B,QAAI,CAACxC,MAAY,CAAChB,EAAa,QAAO;AAEtC,UAAM,EAAE,MAAAyD,MAASzC;AAEjB,WACEpL,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW,6CACT+K,IACI,uCACA,kBACN;AAAA,QAEC,UAAAQ,EAAe,IAAI,CAACuC,MACnB9N,gBAAAA,EAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YAEC,WAAW+J;AAAA,YACX,OAAO;AAAA,cACL,SAAS+D,MAAY5I,IAAc,UAAU;AAAA,YAAA;AAAA,YAG/C,UAAAlF,gBAAAA,EAAAA;AAAAA,cAAC6N;AAAA,cAAA;AAAA,gBACC,KAAKzD;AAAA,gBACL,YAAY0D;AAAA,gBACZ,OAAAxC;AAAA,gBACA,iBAAiB;AAAA,gBACjB,uBAAuB;AAAA,gBACvB,WAAU;AAAA,cAAA;AAAA,YAAA;AAAA,UACZ;AAAA,UAbKwC;AAAA,QAAA,CAeR;AAAA,MAAA;AAAA,IAAA;AAAA,EAGP;AAEA,+BACG,OAAA,EAAI,KAAK7C,IACR,UAAAlL,gBAAAA,EAAAA,KAACE,KAAK,WAAAqC,GACH,UAAA;AAAA,IAAAmL,GAAA;AAAA,IACDzN,gBAAAA,EAAAA,IAACE,IAAA,EAAY,WAAW4J,GACrB,UAAAY,IACGgD,GAAA,IACA9C,IACE+C,GAAA,IACAC,GAAA,EAAkB,CAC1B;AAAA,EAAA,EAAA,CACF,EAAA,CACF;AAEJ;ACteA,MAAMG,KAAeC;AAAA,EACnB,CAAC;AAAA,IACC,WAAAC;AAAA,IACA,eAAAC;AAAA,IACA,SAAAC;AAAA,EAAA,MAMApO,gBAAAA,EAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,iDACTmO,IAAgB,kBAAkB,EACpC;AAAA,MAEA,UAAA;AAAA,QAAAlO,gBAAAA,EAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAKiO,EAAU;AAAA,YACf,KAAK,QAAQA,EAAU,UAAU;AAAA,YACjC,WAAU;AAAA,YACV,SAAAE;AAAA,YACA,WAAW,CAAC9J,MAAM;AAChB,eAAIA,EAAE,QAAQ,WAAWA,EAAE,QAAQ,SACjCA,EAAE,eAAA,GACF8J,EAAA;AAAA,YAEJ;AAAA,YACA,MAAK;AAAA,YACL,UAAU;AAAA,UAAA;AAAA,QAAA;AAAA,QAEZpO,gBAAAA,EAAAA,KAAC,QAAA,EAAK,WAAU,gBAAe,UAAA;AAAA,UAAA;AAAA,UAAGkO,EAAU;AAAA,UAAW;AAAA,QAAA,EAAA,CAAE;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAG/D;AACAF,GAAa,cAAc;AAK3B,MAAMK,KAAc,CAAC;AAAA,EACnB,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,SAAAH;AACF,MAKEpO,gBAAAA,OAAC,SAAI,OAAO,EAAE,aAAa,GAAGuO,IAAQ,EAAE,KAAA,GACtC,UAAA;AAAA,EAAAtO,gBAAAA,EAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,SAAS,MAAMmO,EAAQE,CAAQ;AAAA,MAC/B,WAAU;AAAA,MAET,UAAAA,EAAS;AAAA,IAAA;AAAA,EAAA;AAAA,EAEXA,EAAS,SACRA,EAAS,MAAM,IAAI,CAACxM,GAAMR,MACxBrB,gBAAAA,EAAAA;AAAAA,IAACoO;AAAA,IAAA;AAAA,MAEC,UAAUvM;AAAA,MACV,OAAOyM,IAAQ;AAAA,MACf,SAAAH;AAAA,IAAA;AAAA,IAHK,GAAGE,EAAS,KAAK,IAAIhN,CAAK;AAAA,EAAA,CAKlC;AAAA,GACL;AA4BK,SAASkN,GAAW;AAAA,EACzB,aAAAnE;AAAA,EACA,aAAAlF;AAAA,EACA,aAAAsJ;AAAA,EACA,YAAA7O;AACF,GAAoB;AAClB,QAAM,CAAC8O,GAAYC,CAAa,IAAIjL,EAAyB,CAAA,CAAE,GACzD,CAACkL,GAAWC,CAAY,IAAInL,EAAuB,CAAA,CAAE,GACrD,CAACxE,GAAS4P,CAAU,IAAIpL,EAAS,EAAI,GAErC,EAAE,MAAAqL,GAAM,UAAAC,GAAU,aAAAC,GAAa,aAAAC,GAAa,YAAAC,GAAY,UAAAlO,MAC5DrB;AAGF,EAAA+D,GAAU,MAAM;AAsCd,KArCuB,YAAY;AACjC,UAAI,CAAC0G,EAAa;AAElB,MAAAyE,EAAW,EAAI;AACf,YAAMM,IAAyB,CAAA;AAE/B,eAASC,IAAI,GAAGA,KAAKhF,EAAY,UAAUgF;AACzC,YAAI;AACF,gBAAMvI,IAAO,MAAMuD,EAAY,QAAQgF,CAAC,GAClCC,IAAWxI,EAAK,YAAY,EAAE,OAAO,KAAK,GAC1CyI,IAAS,SAAS,cAAc,QAAQ,GACxCC,IAAUD,EAAO,WAAW,IAAI;AAEtC,cAAI,CAACC,EAAS;AAEd,UAAAD,EAAO,QAAQD,EAAS,OACxBC,EAAO,SAASD,EAAS,QAEzB,MAAMxI,EAAK,OAAO;AAAA,YAChB,eAAe0I;AAAA,YACf,UAAAF;AAAA,YACA,QAAAC;AAAA,UAAA,CACD,EAAE,SAEHH,EAAO,KAAK;AAAA,YACV,YAAYC;AAAA,YACZ,KAAKE,EAAO,UAAA;AAAA,UAAU,CACvB;AAAA,QACH,SAAS1E,GAAO;AACd,kBAAQ,MAAM,oCAAoCwE,CAAC,KAAKxE,CAAK;AAAA,QAC/D;AAGF,MAAA8D,EAAcS,CAAM,GACpBN,EAAW,EAAK;AAAA,IAClB,GAEA;AAAA,EACF,GAAG,CAACzE,CAAW,CAAC,GAGhB1G,GAAU,MAAM;AAYd,KAXsB,YAAY;AAChC,UAAK0G;AACL,YAAI;AACF,gBAAMoF,IAAU,MAAMpF,EAAY,WAAA;AAClC,UAAAwE,EAAcY,KAA4B,EAAE;AAAA,QAC9C,SAAS5E,GAAO;AACd,kBAAQ,MAAM,4BAA4BA,CAAK,GAC/CgE,EAAa,CAAA,CAAE;AAAA,QACjB;AAAA,IACF,GAEA;AAAA,EACF,GAAG,CAACxE,CAAW,CAAC;AAGhB,QAAMqF,IAAsB,OAAOpB,MAAyB;AAC1D,QAAKjE;AAEL,UAAI;AACF,YAAIsF;AAGJ,YAAIrB,EAAS;AACX,cAAI,OAAOA,EAAS,QAAS,UAAU;AAErC,kBAAMsB,IAAc,MAAMvF,EAAY,eAAeiE,EAAS,IAAI;AAClE,YAAIsB,KAAeA,EAAY,CAAC,MAC9BD,IAAY,MAAMtF,EAAY,aAAauF,EAAY,CAAC,CAAC;AAAA,UAE7D,MAAA,CAAW,MAAM,QAAQtB,EAAS,IAAI,KAAKA,EAAS,KAAK,CAAC,MAExDqB,IAAY,MAAMtF,EAAY,aAAaiE,EAAS,KAAK,CAAC,CAAC;AAAA,YAE/D,CAAWA,EAAS,eAElBqB,IAAYrB,EAAS,aAAa;AAGpC,QAAI,OAAOqB,KAAc,YACvBlB,EAAYkB,IAAY,CAAC;AAAA,MAE7B,SAAS9E,GAAO;AACd,gBAAQ,MAAM,iCAAiCA,CAAK;AAAA,MACtD;AAAA,EACF,GAGMgF,IAA0B,MAC9B5P,gBAAAA,MAAC,OAAA,EAAI,WAAU,iBACZ,UAAA,MAAM,KAAK,EAAE,SAAQoK,KAAA,gBAAAA,EAAa,aAAY,EAAA,GAAK,CAAChI,GAAGgN,MACtDrP,gBAAAA,OAAC,OAAA,EAAY,WAAU,kCACrB,UAAA;AAAA,IAAAC,gBAAAA,EAAAA,IAACgB,GAAA,EAAS,WAAU,YAAA,CAAY;AAAA,IAChChB,gBAAAA,EAAAA,IAACgB,GAAA,EAAS,WAAU,gBAAA,CAAgB;AAAA,EAAA,KAF5BoO,CAGV,CACD,GACH;AAGF,+BACG,OAAA,EAAI,WAAU,0BACb,UAAArP,gBAAAA,EAAAA,KAAC+O,GAAA,EAAK,cAAa,cACjB,UAAA;AAAA,IAAA/O,gBAAAA,EAAAA,KAACgP,GAAA,EAAS,WAAU,cAClB,UAAA;AAAA,MAAA/O,gBAAAA,MAACgP,GAAA,EAAY,OAAM,cAAa,WAAU,yBAAwB,UAAA,OAElE;AAAA,4BACCA,GAAA,EAAY,OAAM,aAAY,WAAU,yBAAwB,UAAA,KAAA,CAEjE;AAAA,IAAA,GACF;AAAA,0BAECC,GAAA,EAAY,OAAM,cACjB,UAAAjP,gBAAAA,EAAAA,IAACkP,GAAA,EAAW,WAAU,wBACnB,UAAAjQ,IACC2Q,4BAEC,OAAA,EAAI,WAAU,iBACZ,UAAAnB,EAAW,IAAI,CAACoB,MACf7P,gBAAAA,EAAAA;AAAAA,MAAC+N;AAAA,MAAA;AAAA,QAEC,WAAW8B;AAAA,QACX,eAAe3K,MAAgB2K,EAAM;AAAA,QACrC,SAAS,MAAMrB,EAAYqB,EAAM,UAAU;AAAA,MAAA;AAAA,MAHtCA,EAAM;AAAA,IAAA,CAKd,EAAA,CACH,EAAA,CAEJ,GACF;AAAA,IAEA7P,gBAAAA,EAAAA,IAACiP,GAAA,EAAY,OAAM,aACjB,UAAAjP,gBAAAA,EAAAA,IAACkP,GAAA,EAAW,WAAU,wBACpB,UAAAlP,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,OACZ,UAAA2O,EAAU,WAAW,IACpB3O,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,kDAAiD,UAAA,UAAA,CAEhE,IAEAA,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,aACZ,UAAA2O,EAAU,IAAI,CAACN,GAAUhN,MACxBrB,gBAAAA,EAAAA;AAAAA,MAACoO;AAAA,MAAA;AAAA,QAEC,UAAAC;AAAA,QACA,OAAO;AAAA,QACP,SAASoB;AAAA,MAAA;AAAA,MAHJ,GAAGpB,EAAS,KAAK,IAAIhN,CAAK;AAAA,IAAA,CAKlC,EAAA,CACH,GAEJ,EAAA,CACF,EAAA,CACF;AAAA,EAAA,EAAA,CACF,EAAA,CACF;AAEJ;ACxLA,SAASyO,GACPC,GACAC,GACG;AACH,QAAMC,IAAa/E;AAAA,IACjB;AAAA,EAAA;AAEF,SAAOO;AAAA,IACL,IAAIyE,MAAwB;AAC1B,MAAID,EAAW,WACb,aAAaA,EAAW,OAAO,GAEjCA,EAAW,UAAU,WAAW,MAAMF,EAAS,GAAGG,CAAI,GAAGF,CAAK;AAAA,IAChE;AAAA,IACA,CAACD,GAAUC,CAAK;AAAA,EAAA;AAEpB;AAqCO,SAASG,GAAU;AAAA,EACxB,KAAAhH;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,cAAAC,IAAe;AAAA,EACf,iBAAA+G,IAAkB;AAAA,EAClB,aAAa1G;AAAA,EACb,cAAArE;AAAA,EACA,OAAOiE;AAAA,EACP,eAAAC;AAAA,EACA,UAAU8G;AAAA,EACV,kBAAAC;AAAA,EACA,UAAA9G,IAAW;AAAA,EACX,UAAAC,IAAW;AAAA,EACX,aAAAE,IAAc;AAAA,EACd,aAAA4G,IAAc;AAAA,EACd,cAAAC,IAAe;AAAA,EACf,gBAAAC,IAAiB;AAAA,EACjB,gBAAAC,IAAiB;AAAA,EACjB,eAAA7G,IAAgB;AAAA,EAChB,iBAAA8G,IAAkB;AAAA,EAClB,aAAaC,IAAqB;AAAA,EAClC,WAAAtO;AAAA,EACA,kBAAAuO;AAAA,EACA,kBAAAC;AAAA,EACA,eAAAC,IAAgB;AAAA,EAChB,eAAAhH;AAAA,EACA,WAAAiH;AAAA,EACA,SAAAC;AAAA,EACA,qBAAAC;AAAA,EACA,YAAAvR;AAAA,EACA,eAAAqK;AAAA,EACA,aAAAC;AAAA,EACA,cAAAkH;AAAA,EACA,aAAAjH,IAAc;AAAA,EACd,WAAAC,KAAY;AACd,GAAmB;AAEjB,QAAM,CAACC,IAAaC,CAAc,IAAI5G,EAAkC,IAAI,GACtE,CAAC6G,IAAcC,CAAe,IAAI9G,EAAS2F,CAAW,GACtD,CAACoB,GAAeC,CAAgB,IAAIhH,EAAS4F,CAAY,GACzD,CAAC+H,GAAkBC,CAAmB,IAAI5N,EAAS2M,CAAe,GAClE,CAAC1F,IAAWC,CAAY,IAAIlH,EAAS,EAAI,GACzC,CAACmH,GAAOC,CAAQ,IAAIpH,EAAuB,IAAI,GAC/C,CAAC0C,GAAY2E,CAAa,IAAIrH,EAAS,CAAC,GACxC,CAACsH,IAAcC,EAAe,IAAIvH,EAAS,EAAK,GAChD,CAAC6N,IAAcC,EAAe,IAAI9N;AAAA,IACtCmN,MAAuB;AAAA,EAAA,GAEnB,CAACY,IAAkBC,EAAmB,IAAIhO,EAAS8M,CAAW;AAGpE,EAAA7M,GAAU,MAAM;AACd,IAAA+N,GAAoBlB,CAAW;AAAA,EACjC,GAAG,CAACA,CAAW,CAAC;AAEhB,QAAM,CAACmB,IAAWC,EAAY,IAAIlO,EAA6B,MAAS,GAGlE,CAAC2H,IAAUC,EAAW,IAAI5H,EAAc,IAAI,GAE5CwH,IAAYC,GAAuB,IAAI,GACvC0G,IAAkB1G,GAAuB,IAAI,GAG7ChG,IAAcwE,KAAkBY,IAChCgB,IAAQhC,KAAmBkB,GAC3BqH,KAAWxB,KAAsBe,GAGjC,EAAE,MAAAnR,IAAM,aAAAC,IAAa,QAAAQ,IAAQ,OAAAuD,IAAO,UAAAjD,GAAA,IAAarB,KAAc,CAAA,GAG/DmS,KAAatG,GAAQ,MAAM;AAC/B,UAAMuG,IAAmC;AAAA,MACvC,iBAAiB;AAAA,IAAA;AAGnB,WAAId,MACFc,EAAQ,UAAUd,GAClBc,EAAQ,aAAa,KAGnBb,MACFa,EAAQ,sBAAsBb,IAGzBa;AAAA,EACT,GAAG,CAACd,GAASC,CAAmB,CAAC;AAGjC,EAAAxN,GAAU,MAAM;AACd,QAAIyI,IAAY;AA8ChB,YA5CqB,YAAY;AAC/B,UAAI;AAEF,cAAMC,IAAY,MAAM,OAAO,qBAAW;AAG1C,YAAI,OAAO,SAAW,KAAa;AACjC,gBAAMC,IAASD,EAAkB,OAC3BE,KAAgBD,KAAA,gBAAAA,EAAO;AAE7B,UAAIA,KAAA,QAAAA,EAAO,uBAAuBC,OAC5B0E,IACF3E,EAAM,oBAAoB,YAAY2E,IAGtC3E,EAAM,oBAAoB,YAAY,2CAA2CC,EAAa,6BAI5F,CAAC2E,KAAW5E,EAAM,wBACnBA,EAAM,oBAA4B,UACjC,gCAAgCC,EAAa,YAE7C,CAAC4E,KAAuB7E,EAAM,wBAC/BA,EAAM,oBAA4B,sBACjC,gCAAgCC,EAAa;AAAA,QAGrD;AAEA,QAAIH,KACFd,GAAYe,CAAS;AAAA,MAEzB,SAASG,GAAK;AACZ,YAAIJ,GAAW;AACb,gBAAMK,IACJD,aAAe,QAAQA,IAAM,IAAI,MAAM,kBAAkB;AAC3D,UAAA1B,EAAS2B,CAAS,GAClB7B,EAAa,EAAK,GAClBV,KAAA,QAAAA,EAAcuC;AAAA,QAChB;AAAA,MACF;AAAA,IACF,GAEA,GAEO,MAAM;AACX,MAAAL,IAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC6E,GAAWC,GAASC,GAAqBjH,CAAW,CAAC,GAGzDvG,GAAU,MAAM;AACd,QAAI,CAAC0H,MAAY,CAACjC,EAAK;AAEvB,QAAIgD,IAAY;AAiChB,YA/BgB,YAAY;AAC1B,MAAAxB,EAAa,EAAI,GACjBE,EAAS,IAAI;AAEb,UAAI;AACF,cAAM,EAAE,UAAA4B,MAAarB;AACrB,YAAI,CAACqB;AACH,gBAAM,IAAI,MAAM,0BAA0B;AAK5C,cAAME,KAAM,MADSvB,GAAS,MAAc,YAAYjC,CAAG,EAC7B;AAE9B,QAAIgD,MACF9B,EAAesC,EAAuB,GACtC7B,EAAc6B,GAAI,QAAQ,GAC1BhC,EAAa,EAAK,GAClBX,KAAA,QAAAA,EAAgB2C;AAAA,MAEpB,SAASJ,GAAK;AACZ,YAAIJ,GAAW;AACb,gBAAMK,IACJD,aAAe,QAAQA,IAAM,IAAI,MAAM,UAAU;AACnD,UAAA1B,EAAS2B,CAAS,GAClB7B,EAAa,EAAK,GAClBV,KAAA,QAAAA,EAAcuC;AAAA,QAChB;AAAA,MACF;AAAA,IACF,GAEA,GAEO,MAAM;AACX,MAAAL,IAAY;AAAA,IACd;AAAA,EACF,GAAG,CAACf,IAAUjC,GAAKa,GAAeC,CAAW,CAAC;AAG9C,QAAM+H,KAAsBvG;AAAA,IAC1B,CAACc,MAAe;AACd,cAAQ,MAAM,YAAYA,CAAG,GAC7B,QAAQ,MAAM,YAAYpD,CAAG,GAC7B0B;AAAA,QACE,IAAI,MAAM,GAAGV,EAAS,KAAKoC,EAAI,WAAW,cAAc,EAAE;AAAA,MAAA,GAE5DtC,KAAA,QAAAA,EAAcsC;AAAA,IAChB;AAAA,IACA,CAACpD,GAAKgB,IAAWF,CAAW;AAAA,EAAA,GAIxBrD,KAAW6E;AAAA,IACf,CAAC5E,MAAiB;AAChB,YAAMoL,IAAU,KAAK,IAAI,GAAG,KAAK,IAAIpL,GAAMV,CAAU,CAAC;AACtD,MAAIuD,MAAmB,UACrBa,EAAgB0H,CAAO,GAEzB5M,KAAA,QAAAA,EAAe4M;AAAA,IACjB;AAAA,IACA,CAAC9L,GAAYuD,GAAgBrE,CAAY;AAAA,EAAA,GAIrC6M,KAAOzG;AAAA,IACX,CAAC0G,MAAkB;AACjB,YAAMpG,IAAW,KAAK,IAAIvC,GAAU,KAAK,IAAIC,GAAU6B,IAAQ6G,CAAK,CAAC;AACrE,MAAI7I,MAAoB,UACtBmB,EAAiBsB,CAAQ,GAE3BxC,KAAA,QAAAA,EAAgBwC;AAAA,IAClB;AAAA,IACA,CAACT,GAAO9B,GAAUC,GAAUH,GAAiBC,CAAa;AAAA,EAAA,GAItD6I,KAAS3G,GAAY,MAAM;AAC/B,UAAM4G,KAAeR,KAAW,MAAM;AACtC,IAAIxB,MAAuB,UACzBgB,EAAoBgB,CAAW,GAEjC/B,KAAA,QAAAA,EAAmB+B;AAAA,EACrB,GAAG,CAACR,IAAUxB,GAAoBC,CAAgB,CAAC,GAG7CgC,KAA2BxC,GAAY,CAACyC,MAAkB;AAC9D,IAAAZ,GAAaY,CAAK;AAAA,EACpB,GAAG,GAAG;AAGN,EAAA7O,GAAU,MAAM;AACd,QAAI,CAACkO,EAAgB,QAAS;AAE9B,UAAMY,IAAYZ,EAAgB,SAC5Ba,IAAc,MAAM;AACxB,MAAAH,GAAyBE,EAAU,WAAW;AAAA,IAChD;AAGA,IAAAC,EAAA;AAGA,UAAMC,IAAiB,IAAI,eAAe,MAAM;AAC9C,MAAAD,EAAA;AAAA,IACF,CAAC;AAED,WAAAC,EAAe,QAAQF,CAAS,GAEzB,MAAM;AACX,MAAAE,EAAe,WAAA;AAAA,IACjB;AAAA,EACF,GAAG,CAACJ,EAAwB,CAAC,GAG7B5O,GAAU,MAAM;AACd,QAAI,CAACmG,EAAe;AAEpB,UAAMiD,IAAgB,CAACzI,MAAqB;AAE1C,OAAKA,EAAE,WAAWA,EAAE,aAAaA,EAAE,QAAQ,OAAOA,EAAE,QAAQ,QAC1DA,EAAE,eAAA,GACF6N,GAAK,GAAG,MAGA7N,EAAE,WAAWA,EAAE,YAAYA,EAAE,QAAQ,OAC7CA,EAAE,eAAA,GACF6N,GAAK,IAAI,KAGF7N,EAAE,QAAQ,eACjBA,EAAE,eAAA,GACFuC,GAAS1B,IAAc,CAAC,KAGjBb,EAAE,QAAQ,iBACjBA,EAAE,eAAA,GACFuC,GAAS1B,IAAc,CAAC;AAAA,IAE5B;AAEA,oBAAS,iBAAiB,WAAW4H,CAAa,GAC3C,MAAM;AACX,eAAS,oBAAoB,WAAWA,CAAa;AAAA,IACvD;AAAA,EACF,GAAG,CAACjD,GAAe3E,GAAa0B,IAAUsL,EAAI,CAAC;AAG/C,QAAMS,KAAmBlH,GAAY,YAAY;;AAC/C,QAAI,SAAO,WAAa;AAExB,UAAK,SAAS;AAQZ,QAAI,SAAS,mBACX,MAAM,SAAS,eAAA,GACfT,GAAgB,EAAK;AAAA;AATvB,YAAI;AACF,kBAAMrJ,KAAAF,IAAAwJ,EAAU,YAAV,gBAAAxJ,EAAmB,sBAAnB,gBAAAE,EAAA,KAAAF,KACNuJ,GAAgB,EAAI;AAAA,QACtB,SAASuB,GAAK;AACZ,kBAAQ,MAAM,0CAA0CA,CAAG;AAAA,QAC7D;AAAA,EAOJ,GAAG,CAAA,CAAE;AAGL,EAAA7I,GAAU,MAAM;AACd,QAAI,OAAO,WAAa,IAAa;AAErC,UAAMmJ,IAAyB,MAAM;AACnC,MAAA7B,GAAgB,CAAC,CAAC,SAAS,iBAAiB;AAAA,IAC9C;AAEA,oBAAS,iBAAiB,oBAAoB6B,CAAsB,GAC7D,MAAM;AACX,eAAS,oBAAoB,oBAAoBA,CAAsB;AAAA,IACzE;AAAA,EACF,GAAG,CAAA,CAAE;AAGL,QAAM+F,KAAyBnH;AAAA,IAC7B,CAACoH,MAAuB;AACtB,MAAAjM,GAASiM,CAAU,GACnBtB,GAAgB,EAAK;AAAA,IACvB;AAAA,IACA,CAAC3K,EAAQ;AAAA,EAAA,GAILqG,KAAgB,MACftD,IAGH5J,gBAAAA,EAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,8DAA8D8Q,KAAoB,EAAE;AAAA,MAE/F,UAAA;AAAA,QAAA9Q,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,2BAEZ,UAAA;AAAA,UAAAwQ,KACCvQ,gBAAAA,EAAAA;AAAAA,YAACU;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS,MAAM+Q,GAAoB,CAACD,EAAgB;AAAA,cACpD,OAAOA,KAAmB,UAAU;AAAA,cAEpC,gCAACsB,IAAA,CAAA,CAAc;AAAA,YAAA;AAAA,UAAA;AAAA,UAKnB9S,gBAAAA,EAAAA;AAAAA,YAACU;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS,MAAMwR,GAAK,IAAI;AAAA,cACxB,UAAU5G,KAAS9B;AAAA,cAEnB,gCAAC0D,IAAA,CAAA,CAAY;AAAA,YAAA;AAAA,UAAA;AAAA,UAEfnN,gBAAAA,EAAAA,KAAC,QAAA,EAAK,WAAU,oCACb,UAAA;AAAA,YAAA,KAAK,MAAMuL,IAAQ,GAAG;AAAA,YAAE;AAAA,UAAA,GAC3B;AAAA,UACAtL,gBAAAA,EAAAA;AAAAA,YAACU;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS,MAAMwR,GAAK,GAAG;AAAA,cACvB,UAAU5G,KAAS7B;AAAA,cAEnB,gCAAC0D,IAAA,CAAA,CAAW;AAAA,YAAA;AAAA,UAAA;AAAA,UAIbqD,KACCxQ,gBAAAA,EAAAA,IAACU,IAAA,EAAO,SAAQ,WAAU,MAAK,QAAO,SAAS0R,IAC7C,UAAApS,gBAAAA,EAAAA,IAAC+S,IAAA,CAAA,CAAa,EAAA,CAChB;AAAA,UAIDtC,KACCzQ,gBAAAA,EAAAA;AAAAA,YAACU;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS,MAAM6Q,GAAgB,CAACD,EAAY;AAAA,cAC5C,OAAOA,KAAe,SAAS;AAAA,cAE9B,UAAAA,KAAetR,gBAAAA,MAACgT,IAAA,CAAA,CAAe,0BAAMC,IAAA,CAAA,CAAa;AAAA,YAAA;AAAA,UAAA;AAAA,UAKtDvC,KACC1Q,gBAAAA,EAAAA,IAACU,IAAA,EAAO,SAAQ,WAAU,MAAK,QAAO,SAASiS,IAC5C,eAAe3S,gBAAAA,EAAAA,IAACoN,IAAA,CAAA,CAAc,IAAKpN,gBAAAA,MAACqN,MAAc,EAAA,CACrD;AAAA,QAAA,GAEJ;AAAA,QAEAtN,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,UAAAC,gBAAAA,EAAAA;AAAAA,YAACU;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS,MAAMkG,GAAS1B,IAAc,CAAC;AAAA,cACvC,UAAUA,KAAe;AAAA,cAEzB,gCAACqI,IAAA,CAAA,CAAgB;AAAA,YAAA;AAAA,UAAA;AAAA,UAGnBvN,gBAAAA,EAAAA;AAAAA,YAACiE;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,KAAK;AAAA,cACL,KAAKkC;AAAA,cACL,OAAOjB;AAAA,cACP,UAAU,CAACb,MAAMuC,GAAS,SAASvC,EAAE,OAAO,KAAK,KAAK,CAAC;AAAA,cACvD,WAAU;AAAA,YAAA;AAAA,UAAA;AAAA,UAEZtE,gBAAAA,EAAAA,KAAC,QAAA,EAAK,WAAU,iCAAgC,UAAA;AAAA,YAAA;AAAA,YAAGoG;AAAA,UAAA,GAAW;AAAA,UAE9DnG,gBAAAA,EAAAA;AAAAA,YAACU;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS,MAAMkG,GAAS1B,IAAc,CAAC;AAAA,cACvC,UAAUA,KAAeiB;AAAA,cAEzB,gCAACqH,IAAA,CAAA,CAAiB;AAAA,YAAA;AAAA,UAAA;AAAA,QACpB,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,IA/FqB,MAqGrBE,KAAgB,MACpB1N,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,2CACb,UAAAA,gBAAAA,EAAAA,IAAC,KAAA,EAAE,WAAU,yBAAyB,UAAAkK,EAAA,CAAY,GACpD,GAIIyD,KAAc,MAClB3N,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,2FACb,UAAAD,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,YACb,UAAA;AAAA,IAAAC,gBAAAA,EAAAA,IAAC,KAAA,EAAE,WAAU,4BAA2B,UAAA,UAAM;AAAA,IAC9CA,gBAAAA,EAAAA,IAAC,KAAA,EAAE,WAAU,sBAAsB,iCAAO,QAAA,CAAQ;AAAA,EAAA,EAAA,CACpD,EAAA,CACF,GAII4N,KAAoB,MAAM;AAC9B,QAAI,CAACxC,GAAU,QAAO;AAEtB,UAAM,EAAE,UAAAqB,GAAU,MAAAoB,EAAA,IAASzC;AAE3B,WACEpL,gBAAAA,EAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAK4R;AAAA,QACL,WAAW,wCAAwCd,KAAoB,EAAE;AAAA,QAEzE,UAAA9Q,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,uCACb,UAAAA,gBAAAA,EAAAA;AAAAA,UAACyM;AAAA,UAAA;AAAA,YACC,KAAKrC,MAAe;AAAA,YACpB,aAAa4H;AAAA,YACb,SAASF;AAAA,YACT,SAASpE,GAAA;AAAA,YACT,OAAOC,GAAA;AAAA,YAEN,UAAA/C,IACC+C,OACE2D;AAAA;AAAA,cAEF,MAAM,KAAK,IAAI,MAAMnL,CAAU,GAAG,CAAC+M,GAAK7R,MACtCrB,gBAAAA,EAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,WAAW,QAAQ+J,KAAiB,EAAE;AAAA,kBAEtC,UAAA/J,gBAAAA,EAAAA;AAAAA,oBAAC6N;AAAA,oBAAA;AAAA,sBACC,YAAYxM,IAAQ;AAAA,sBACpB,iBAAiB;AAAA,sBACjB,uBAAuB;AAAA,sBACvB,OAAOqQ;AAAA,sBACP,OAAApG;AAAA,sBACA,QAAQuG;AAAA,sBACR,iBAAiB,MAAMV,KAAA,gBAAAA,EAAe9P,IAAQ;AAAA,oBAAC;AAAA,kBAAA;AAAA,gBACjD;AAAA,gBAXK,QAAQA,IAAQ,CAAC;AAAA,cAAA,CAazB;AAAA;AAAA;AAAA,cAGDrB,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAW+J,KAAiB,IAC/B,UAAA/J,gBAAAA,EAAAA;AAAAA,gBAAC6N;AAAA,gBAAA;AAAA,kBACC,YAAY3I;AAAA,kBACZ,iBAAiB;AAAA,kBACjB,uBAAuB;AAAA,kBACvB,OAAOwM;AAAA,kBACP,OAAApG;AAAA,kBACA,QAAQuG;AAAA,kBACR,iBAAiB,MAAMV,KAAA,gBAAAA,EAAejM;AAAA,gBAAW;AAAA,cAAA,EACnD,CACF;AAAA;AAAA,UAAA;AAAA,QAAA,EAEJ,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAGN,GAGMiO,KAAgB,MAAM;AAC1B,QAAI,CAAC5C,KAAe,CAACiB,MAAoB,CAACpH,GAAa,QAAO;AAG9D,UAAMgJ,IAAsB7E;AAE5B,WACEvO,gBAAAA,EAAAA;AAAAA,MAACoT;AAAA,MAAA;AAAA,QACC,aAAAhJ;AAAA,QACA,aAAAlF;AAAA,QACA,aAAa0N;AAAA,QACb,YAAY;AAAA,UACV,MAAMjT,EAAW;AAAA,UACjB,UAAUA,EAAW;AAAA,UACrB,aAAaA,EAAW;AAAA,UACxB,aAAaA,EAAW;AAAA,UACxB,YAAYA,EAAW;AAAA,UACvB,UAAAqB;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAGN,GAGMqS,KAAkB,MACjB1C,IAGH5Q,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,sEACb,UAAA;AAAA,IAAAA,gBAAAA,EAAAA;AAAAA,MAACW;AAAA,MAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,SAAS,MAAMkG,GAAS1B,IAAc,CAAC;AAAA,QACvC,UAAUA,KAAe;AAAA,QAEzB,UAAA;AAAA,UAAAlF,gBAAAA,EAAAA,IAACuN,IAAA,EAAgB;AAAA,UACjBvN,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAU,QAAO,UAAA,MAAA,CAAG;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAE5BD,gBAAAA,EAAAA;AAAAA,MAACW;AAAA,MAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,SAAS,MAAMkG,GAAS1B,IAAc,CAAC;AAAA,QACvC,UAAUA,KAAeiB;AAAA,QAEzB,UAAA;AAAA,UAAAnG,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAU,QAAO,UAAA,OAAG;AAAA,gCACzBwN,IAAA,CAAA,CAAiB;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACpB,GACF,IAtB2B;AA2B/B,MAAI,CAAC7N;AACH,WACEK,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,oCAAmC,UAAA,mCAElD;AAKJ,MAAIuQ,GAAa;AACf,UAAM+C,IAA8B,CAAA;AAOpC,QANK3T,EAAW,QAAM2T,EAAkB,KAAK,MAAM,GAC9C3T,EAAW,YAAU2T,EAAkB,KAAK,UAAU,GACtD3T,EAAW,eAAa2T,EAAkB,KAAK,aAAa,GAC5D3T,EAAW,eAAa2T,EAAkB,KAAK,aAAa,GAC5D3T,EAAW,cAAY2T,EAAkB,KAAK,YAAY,GAE3DA,EAAkB,SAAS,GAAG;AAChC,YAAMC,IACJD,EAAkB,WAAW,IACzBA,EAAkB,CAAC,IACnB,GAAGA,EAAkB,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,CAAC,MAAMA,EAAkBA,EAAkB,SAAS,CAAC,CAAC;AACtG,aACEvT,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,oCAAmC,UAAA;AAAA,QAAA;AAAA,QAClCwT;AAAA,QAAsB;AAAA,MAAA,GACtC;AAAA,IAEJ;AAAA,EACF;AAEA,SACExT,gBAAAA,EAAAA,KAAC,OAAA,EAAI,KAAKkL,GACR,UAAA;AAAA,IAAAlL,gBAAAA,EAAAA,KAACE,MAAK,WAAAqC,GACH,UAAA;AAAA,MAAA2K,GAAA;AAAA,MACDjN,gBAAAA,EAAAA;AAAAA,QAACE;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO,EAAE,QAAQ6K,KAAe,UAAUgG,EAAA;AAAA,UAE1C,gCAAC,OAAA,EAAI,WAAU,wBAEb,UAAAhR,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,+BACZ,UAAA;AAAA,YAAAoT,GAAA;AAAA,YACAzI,KACGgD,GAAA,IACA9C,IACE+C,GAAA,IACAC,GAAA;AAAA,UAAkB,EAAA,CAC1B,EAAA,CACF;AAAA,QAAA;AAAA,MAAA;AAAA,IACF,GACF;AAAA,IACCyF,GAAA;AAAA,EAAgB,GACnB;AAEJ;","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-DocNZVXn.cjs");exports.DataTable=e.DataTable;exports.DeleteConfirmDialog=e.DeleteConfirmDialog;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-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;
2
2
  //# sourceMappingURL=index.c.js.map
package/dist/index.d.ts CHANGED
@@ -6,6 +6,8 @@ export { TablePagination } from './components/TablePagination';
6
6
  export { ThemeSwitcher } from './components/ThemeSwitcher';
7
7
  export { ThemeSwitcherContent } from './components/ThemeSwitcherContent';
8
8
  export { SimplePDFReader } from './components/SimplePDFReader';
9
+ export { PDFReader } from './components/PDFReader';
10
+ export { PDFSidebar } from './components/PDFSidebar';
9
11
  export type { Column, DataTableProps, UIComponents, } from './components/DataTable';
10
12
  export type { DeleteConfirmDialogProps, DialogUIComponents, } from './components/DeleteConfirmDialog';
11
13
  export type { TableHeaderProps, HeaderUIComponents, } from './components/TableHeader';
@@ -13,5 +15,7 @@ export type { TablePaginationProps, PaginationUIComponents, } from './components
13
15
  export type { ThemeSwitcherProps, ThemeSwitcherUIComponents, ThemeOption, } from './components/ThemeSwitcher';
14
16
  export type { ThemeSwitcherContentProps, ThemeSwitcherContentUIComponents, } from './components/ThemeSwitcherContent';
15
17
  export type { SimplePDFReaderProps, SimplePDFReaderUIComponents, } from './components/SimplePDFReader';
16
- 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, } from './types/component-types';
18
+ export type { PDFReaderProps, PDFReaderUIComponents, } from './components/PDFReader';
19
+ export type { PDFSidebarProps, PDFDocumentProxy, PDFPageProxy, PDFViewport, PDFOutline, } from './components/PDFSidebar';
20
+ 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';
17
21
  //# 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;AAG/D,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;AAGtC,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,GAClB,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;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"}
package/dist/index.js CHANGED
@@ -1,12 +1,14 @@
1
- import { D as s, a as t, S as i, T as r, b as l, c as n, d as o, e as T } from "./index-DruzjpTS.js";
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";
2
2
  export {
3
3
  s as DataTable,
4
- t as DeleteConfirmDialog,
5
- i as SimplePDFReader,
6
- r as TableHeader,
7
- l as TablePagination,
8
- n as ThemeSwitcher,
9
- o as ThemeSwitcherContent,
10
- T as cn
4
+ r as DeleteConfirmDialog,
5
+ i as PDFReader,
6
+ t as PDFSidebar,
7
+ D as SimplePDFReader,
8
+ l as TableHeader,
9
+ n as TablePagination,
10
+ o as ThemeSwitcher,
11
+ T as ThemeSwitcherContent,
12
+ b as cn
11
13
  };
12
14
  //# sourceMappingURL=index.js.map
@@ -22,7 +22,6 @@ export type ButtonComponent = UIComponent<ButtonHTMLAttributes<HTMLButtonElement
22
22
  * Input 组件类型
23
23
  */
24
24
  export type InputComponent = UIComponent<InputHTMLAttributes<HTMLInputElement> & {
25
- value?: string;
26
25
  onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;
27
26
  }>;
28
27
  /**
@@ -103,4 +102,26 @@ export type DropdownMenuRadioItemComponent = UIComponent<{
103
102
  * Skeleton 组件类型
104
103
  */
105
104
  export type SkeletonComponent = UIComponent<HTMLAttributes<HTMLDivElement>>;
105
+ /**
106
+ * Tabs 组件类型
107
+ */
108
+ export type TabsComponent = UIComponent<{
109
+ value?: string;
110
+ onValueChange?: (value: string) => void;
111
+ children?: React.ReactNode;
112
+ defaultValue?: string;
113
+ }>;
114
+ export type TabsListComponent = UIComponent<HTMLAttributes<HTMLDivElement>>;
115
+ export type TabsTriggerComponent = UIComponent<HTMLAttributes<HTMLButtonElement> & {
116
+ value: string;
117
+ children?: React.ReactNode;
118
+ }>;
119
+ export type TabsContentComponent = UIComponent<HTMLAttributes<HTMLDivElement> & {
120
+ value: string;
121
+ children?: React.ReactNode;
122
+ }>;
123
+ /**
124
+ * ScrollArea 组件类型
125
+ */
126
+ export type ScrollAreaComponent = UIComponent<HTMLAttributes<HTMLDivElement>>;
106
127
  //# sourceMappingURL=component-types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"component-types.d.ts","sourceRoot":"","sources":["../../src/types/component-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,OAAO,CAAC;AAEf;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,MAAM,SAAS,gBAAgB,GAAG,gBAAgB,IACxE,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;AAE9B;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,WAAW,CACvC,oBAAoB,CAAC,iBAAiB,CAAC,GAAG;IACxC,OAAO,CAAC,EACJ,SAAS,GACT,aAAa,GACb,SAAS,GACT,WAAW,GACX,OAAO,GACP,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;IACxC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CACF,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,WAAW,CACtC,mBAAmB,CAAC,gBAAgB,CAAC,GAAG;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;CAC7D,CACF,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,WAAW,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC;AAExE;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,WAAW,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,CAAC;AAC3E,MAAM,MAAM,iBAAiB,GAAG,WAAW,CACzC,cAAc,CAAC,mBAAmB,CAAC,CACpC,CAAC;AACF,MAAM,MAAM,kBAAkB,GAAG,WAAW,CAC1C,gBAAgB,CAAC,oBAAoB,CAAC,GAAG;IACvC,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;CACrC,CACF,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,gBAAgB;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED,MAAM,MAAM,eAAe,GAAG,WAAW,CAAC,oBAAoB,CAAC,CAAC;AAChE,MAAM,MAAM,sBAAsB,GAAG,WAAW,CAC9C,oBAAoB,CAAC,iBAAiB,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAChE,CAAC;AACF,MAAM,MAAM,sBAAsB,GAAG,WAAW,CAC9C,cAAc,CAAC,cAAc,CAAC,CAC/B,CAAC;AACF,MAAM,MAAM,mBAAmB,GAAG,WAAW,CAC3C,cAAc,CAAC,cAAc,CAAC,GAAG;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB,CACF,CAAC;AACF,MAAM,MAAM,oBAAoB,GAAG,WAAW,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,CAAC;AAEhF;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,WAAW,CACtC,mBAAmB,CAAC,gBAAgB,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAC9D,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,WAAW,CAAC;IACxC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,CAAC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG,WAAW,CAC9C,cAAc,CAAC,cAAc,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CACvD,CAAC;AACF,MAAM,MAAM,qBAAqB,GAAG,WAAW,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC;AAChF,MAAM,MAAM,qBAAqB,GAAG,WAAW,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC;AAChF,MAAM,MAAM,oBAAoB,GAAG,WAAW,CAC5C,cAAc,CAAC,kBAAkB,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAC3D,CAAC;AACF,MAAM,MAAM,0BAA0B,GAAG,WAAW,CAClD,cAAc,CAAC,oBAAoB,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAC7D,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,WAAW,CAAC;IAC9C,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,CAAC,CAAC;AAEH,MAAM,MAAM,4BAA4B,GAAG,WAAW,CACpD,oBAAoB,CAAC,iBAAiB,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAChE,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG,WAAW,CACpD,cAAc,CAAC,cAAc,CAAC,CAC/B,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG,WAAW,CAAC;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,CAAC,CAAC;AAEH,MAAM,MAAM,8BAA8B,GAAG,WAAW,CAAC;IACvD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,WAAW,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"component-types.d.ts","sourceRoot":"","sources":["../../src/types/component-types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@turinhub/atomix-common-ui",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Common UI components for TurinHub projects",
5
5
  "type": "module",
6
6
  "main": "./dist/index.c.js",
@@ -41,15 +41,17 @@
41
41
  "@radix-ui/react-dialog": "^1.1.0",
42
42
  "@radix-ui/react-dropdown-menu": "^2.1.0",
43
43
  "@radix-ui/react-label": "^2.1.0",
44
+ "@radix-ui/react-scroll-area": "^1.1.0",
44
45
  "@radix-ui/react-select": "^2.1.0",
45
46
  "@radix-ui/react-slot": "^1.1.0",
47
+ "@radix-ui/react-tabs": "^1.1.0",
46
48
  "class-variance-authority": "^0.7.0",
47
49
  "clsx": "^2.1.0",
48
50
  "lucide-react": "^0.475.0",
49
- "pdfjs-dist": "^4.0.0",
51
+ "pdfjs-dist": "^5.5.207",
50
52
  "react": "^18.0.0 || ^19.0.0",
51
53
  "react-dom": "^18.0.0 || ^19.0.0",
52
- "react-pdf": "^9.1.0",
54
+ "react-pdf": "^10.1.0",
53
55
  "tailwind-merge": "^3.0.0"
54
56
  },
55
57
  "devDependencies": {
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e={};exports.default=e;
2
- //# sourceMappingURL=__vite-browser-external-BcPniuRQ.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"__vite-browser-external-BcPniuRQ.cjs","sources":["../__vite-browser-external"],"sourcesContent":["export default {}"],"names":["__viteBrowserExternal"],"mappings":"gFAAA,MAAAA,EAAe,CAAA"}
@@ -1,5 +0,0 @@
1
- const e = {};
2
- export {
3
- e as default
4
- };
5
- //# sourceMappingURL=__vite-browser-external-DYxpcVy9.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"__vite-browser-external-DYxpcVy9.js","sources":["../__vite-browser-external"],"sourcesContent":["export default {}"],"names":["__viteBrowserExternal"],"mappings":"AAAA,MAAAA,IAAe,CAAA;"}