@ug666/ui-react 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/blocks/index.cjs +238 -0
- package/dist/blocks/index.cjs.map +1 -0
- package/dist/blocks/index.d.cts +86 -0
- package/dist/blocks/index.d.ts +86 -0
- package/dist/blocks/index.js +153 -0
- package/dist/blocks/index.js.map +1 -0
- package/dist/button-CaLZig8j.d.cts +22 -0
- package/dist/button-CaLZig8j.d.ts +22 -0
- package/dist/chunk-2IVRUJKO.js +377 -0
- package/dist/chunk-2IVRUJKO.js.map +1 -0
- package/dist/chunk-73WQAE3E.js +3003 -0
- package/dist/chunk-73WQAE3E.js.map +1 -0
- package/dist/chunk-RUDEZA5Q.js +62 -0
- package/dist/chunk-RUDEZA5Q.js.map +1 -0
- package/dist/chunk-S45GP6IB.js +254 -0
- package/dist/chunk-S45GP6IB.js.map +1 -0
- package/dist/components/index.cjs +3993 -0
- package/dist/components/index.cjs.map +1 -0
- package/dist/components/index.d.cts +1097 -0
- package/dist/components/index.d.ts +1097 -0
- package/dist/components/index.js +330 -0
- package/dist/components/index.js.map +1 -0
- package/dist/hooks/index.cjs +1 -0
- package/dist/hooks/index.cjs.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/index.cjs +1410 -710
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +274 -1340
- package/dist/index.d.ts +274 -1340
- package/dist/index.js +385 -3229
- package/dist/index.js.map +1 -1
- package/dist/labs/index.cjs +34 -0
- package/dist/labs/index.cjs.map +1 -0
- package/dist/labs/index.d.cts +12 -0
- package/dist/labs/index.d.ts +12 -0
- package/dist/labs/index.js +9 -0
- package/dist/labs/index.js.map +1 -0
- package/dist/patterns/index.cjs +758 -0
- package/dist/patterns/index.cjs.map +1 -0
- package/dist/patterns/index.d.cts +158 -0
- package/dist/patterns/index.d.ts +158 -0
- package/dist/patterns/index.js +320 -0
- package/dist/patterns/index.js.map +1 -0
- package/dist/primitives/index.cjs +384 -0
- package/dist/primitives/index.cjs.map +1 -0
- package/dist/primitives/index.d.cts +137 -0
- package/dist/primitives/index.d.ts +137 -0
- package/dist/primitives/index.js +56 -0
- package/dist/primitives/index.js.map +1 -0
- package/dist/sidebar-vl00Z2o-.d.cts +93 -0
- package/dist/sidebar-vl00Z2o-.d.ts +93 -0
- package/dist/styles.css +2499 -0
- package/dist/tokens.css +86 -9
- package/package.json +36 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/patterns/index.ts","../../src/patterns/admin-shell.tsx","../../src/components/button.tsx","../../src/internal/cn.ts","../../src/components/sidebar.tsx","../../src/patterns/confirm-dialog.tsx","../../src/components/modal.tsx","../../src/hooks/use-escape-key.ts","../../src/internal/use-portal-container.ts","../../src/patterns/copy-field.tsx","../../src/patterns/page-header.tsx"],"sourcesContent":["/**\n * @description: React patterns 子入口 — 后台与工具型通用模式组件\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-05-30\n */\n'use client'\n\nexport {\n AdminShell,\n AdminShell as UGAdminShell,\n type AdminShellProps,\n type AdminShellProps as UGAdminShellProps,\n} from './admin-shell'\nexport {\n ConfirmDialog,\n ConfirmDialog as UGConfirmDialog,\n type ConfirmDialogProps,\n type ConfirmDialogProps as UGConfirmDialogProps,\n type ConfirmDialogVariant,\n type ConfirmDialogVariant as UGConfirmDialogVariant,\n} from './confirm-dialog'\nexport {\n CopyField,\n CopyField as UGCopyField,\n type CopyFieldProps,\n type CopyFieldProps as UGCopyFieldProps,\n} from './copy-field'\nexport {\n PageHeader,\n PageHeader as UGPageHeader,\n type PageHeaderProps,\n type PageHeaderProps as UGPageHeaderProps,\n} from './page-header'\n","/**\n * @description: AdminShell 后台框架模式 — 组合侧栏、顶栏和内容区域\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-05-30\n */\n'use client'\n\nimport { forwardRef, useState, type HTMLAttributes, type ReactNode } from 'react'\nimport { Menu } from 'lucide-react'\nimport { Button } from '../components/button'\nimport { Sidebar, type SidebarItem, type SidebarVariant } from '../components/sidebar'\nimport { cn } from '../internal/cn'\n\nexport interface AdminShellProps extends HTMLAttributes<HTMLDivElement> {\n /** 侧栏导航项 */\n navItems: SidebarItem[]\n /** 侧栏顶部区域,通常是品牌、租户或产品名 */\n sidebarHeader?: ReactNode\n /** 侧栏底部区域,通常是用户区或退出入口 */\n sidebarFooter?: ReactNode\n /** 侧栏视觉风格 */\n sidebarVariant?: SidebarVariant\n /** 是否启用侧栏搜索 */\n sidebarSearchable?: boolean\n /** 是否启用侧栏折叠 */\n sidebarCollapsible?: boolean\n /** 受控折叠状态 */\n sidebarCollapsed?: boolean\n /** 非受控默认折叠状态 */\n defaultSidebarCollapsed?: boolean\n /** 折叠状态变化 */\n onSidebarCollapsedChange?: (collapsed: boolean) => void\n /** 受控移动端侧栏状态 */\n mobileSidebarOpen?: boolean\n /** 移动端侧栏状态变化 */\n onMobileSidebarOpenChange?: (open: boolean) => void\n /** 顶栏左侧内容 */\n topbarStart?: ReactNode\n /** 顶栏右侧内容 */\n topbarEnd?: ReactNode\n /** 完全自定义顶栏内容 */\n topbar?: ReactNode\n /** main 元素类名 */\n mainClassName?: string\n /** 内容容器类名 */\n contentClassName?: string\n /** 页面内容 */\n children: ReactNode\n}\n\n/**\n * 后台框架模式\n * @example\n * <AdminShell\n * navItems={items}\n * sidebarHeader={<Brand />}\n * topbarEnd={<UserMenu />}\n * >\n * <PageHeader title=\"控制台\" />\n * </AdminShell>\n */\nconst AdminShell = forwardRef<HTMLDivElement, AdminShellProps>(\n (\n {\n navItems,\n sidebarHeader,\n sidebarFooter,\n sidebarVariant = 'dark',\n sidebarSearchable = false,\n sidebarCollapsible = true,\n sidebarCollapsed,\n defaultSidebarCollapsed = false,\n onSidebarCollapsedChange,\n mobileSidebarOpen,\n onMobileSidebarOpenChange,\n topbarStart,\n topbarEnd,\n topbar,\n mainClassName,\n contentClassName,\n children,\n className,\n ...props\n },\n ref,\n ) => {\n const [internalMobileOpen, setInternalMobileOpen] = useState(false)\n const effectiveMobileOpen = mobileSidebarOpen ?? internalMobileOpen\n\n function setMobileOpen(open: boolean) {\n if (mobileSidebarOpen === undefined) {\n setInternalMobileOpen(open)\n }\n onMobileSidebarOpenChange?.(open)\n }\n\n return (\n <div\n ref={ref}\n className={cn('min-h-screen bg-surface-0 text-text-primary', className)}\n {...props}\n >\n <div className=\"flex min-h-screen min-w-0\">\n <Sidebar\n items={navItems}\n variant={sidebarVariant}\n header={sidebarHeader}\n footer={sidebarFooter}\n searchable={sidebarSearchable}\n collapsible={sidebarCollapsible}\n collapsed={sidebarCollapsed}\n defaultCollapsed={defaultSidebarCollapsed}\n onCollapsedChange={onSidebarCollapsedChange}\n responsive\n mobileOpen={effectiveMobileOpen}\n onMobileOpenChange={setMobileOpen}\n className=\"shrink-0\"\n />\n\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <header className=\"sticky top-0 z-30 flex min-h-14 items-center gap-3 border-b border-border-base bg-surface-0/95 px-4 backdrop-blur sm:px-6 lg:px-8\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"md:hidden\"\n aria-label=\"打开侧边栏\"\n onClick={() => setMobileOpen(true)}\n >\n <Menu size={18} />\n </Button>\n\n {topbar ? (\n <div className=\"min-w-0 flex-1\">{topbar}</div>\n ) : (\n <>\n <div className=\"min-w-0 flex-1\">{topbarStart}</div>\n {topbarEnd ? (\n <div className=\"flex shrink-0 items-center gap-2\">{topbarEnd}</div>\n ) : null}\n </>\n )}\n </header>\n\n <main className={cn('min-w-0 flex-1 overflow-x-hidden', mainClassName)}>\n <div className={cn('mx-auto w-full max-w-7xl px-4 py-6 sm:px-6 lg:px-8', contentClassName)}>\n {children}\n </div>\n </main>\n </div>\n </div>\n </div>\n )\n },\n)\n\nAdminShell.displayName = 'AdminShell'\n\nexport { AdminShell }\n","/**\n * @description: Button 按钮组件 — 基于 CVA 管理变体,支持 loading/disabled 状态\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-15\n */\nimport { forwardRef } from 'react'\nimport { Loader2 } from 'lucide-react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../internal/cn'\n\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-lg text-sm font-medium transition-[background,border-color,color,box-shadow,transform] duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',\n {\n variants: {\n variant: {\n default:\n 'bg-primary text-primary-fg shadow-sm hover:bg-primary-hover hover:shadow-md focus-visible:ring-ring',\n destructive:\n 'bg-danger text-danger-fg shadow-sm hover:bg-danger-hover hover:shadow-md focus-visible:ring-danger',\n outline:\n 'border border-border-strong bg-surface-1 text-text-primary shadow-sm hover:border-primary/55 hover:bg-surface-2 focus-visible:ring-ring/30',\n secondary:\n 'border border-border-base bg-surface-2 text-text-primary shadow-sm hover:bg-surface-3 focus-visible:ring-ring/30',\n ghost:\n 'text-text-primary hover:bg-surface-2 focus-visible:ring-ring/30',\n link: 'text-text-primary underline-offset-4 hover:underline focus-visible:ring-ring/30',\n },\n size: {\n default: 'h-9 px-4 py-2',\n sm: 'h-8 px-3 text-xs',\n lg: 'h-11 px-5 text-base',\n icon: 'h-9 w-9',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n /** 是否处于加载状态,加载时显示旋转图标并禁用点击 */\n loading?: boolean\n}\n\n/**\n * 通用按钮组件\n * @example\n * <Button variant=\"default\" size=\"lg\" onClick={handleClick}>确认</Button>\n * <Button variant=\"destructive\" loading>删除中...</Button>\n * <Button variant=\"outline\" size=\"sm\">取消</Button>\n */\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, loading = false, disabled, children, ...props }, ref) => {\n return (\n <button\n ref={ref}\n className={cn(buttonVariants({ variant, size }), className)}\n disabled={disabled || loading}\n {...props}\n >\n {loading && <Loader2 className=\"animate-spin\" size={16} />}\n {children}\n </button>\n )\n }\n)\n\nButton.displayName = 'Button'\n\nexport { Button, buttonVariants }\n","/**\n * @description: React 包内部类名合并工具\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-05-27\n */\nimport { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs))\n}\n","/**\n * @description: Sidebar 侧边栏布局组件 — 支持 primary/dark 两种风格,collapsed 折叠态,底部 slot\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-18\n */\nimport { forwardRef, useMemo, useState } from 'react'\nimport {\n ChevronDown,\n PanelLeftClose,\n PanelLeftOpen,\n Search,\n X,\n type LucideIcon,\n} from 'lucide-react'\nimport { cn } from '../internal/cn'\n\nexport interface SidebarItem {\n id?: string\n label: string\n href?: string\n icon: LucideIcon\n active?: boolean\n children?: SidebarItem[]\n}\n\nexport type SidebarVariant = 'primary' | 'dark'\n\nexport interface SidebarProps {\n /** 导航菜单项 */\n items: SidebarItem[]\n /** 视觉变体:primary 品牌色(默认),dark 深灰色(推荐后台管理) */\n variant?: SidebarVariant\n /** 是否折叠,折叠时只显示图标 */\n collapsed?: boolean\n /** 非受控折叠默认值 */\n defaultCollapsed?: boolean\n /** 折叠状态变化回调 */\n onCollapsedChange?: (collapsed: boolean) => void\n /** 是否显示内置折叠按钮 */\n collapsible?: boolean\n /** 是否显示内置搜索 */\n searchable?: boolean\n /** 搜索输入占位文案 */\n searchPlaceholder?: string\n /** 是否启用移动端抽屉模式 */\n responsive?: boolean\n /** 移动端抽屉是否打开 */\n mobileOpen?: boolean\n /** 移动端抽屉开关回调 */\n onMobileOpenChange?: (open: boolean) => void\n /** 顶部插槽,用于品牌或用户信息 */\n header?: React.ReactNode\n /** 底部插槽,用于退出登录等操作 */\n footer?: React.ReactNode\n /** 额外类名 */\n className?: string\n}\n\nconst variantStyles: Record<SidebarVariant, {\n container: string\n active: string\n inactive: string\n divider: string\n icon: string\n activeIcon: string\n}> = {\n primary: {\n container: 'border-r border-border-base bg-surface-1 text-text-primary shadow-sm',\n active: 'bg-primary/10 text-primary shadow-sm ring-1 ring-primary/20 before:absolute before:left-0 before:top-1/2 before:h-6 before:w-[3px] before:-translate-y-1/2 before:rounded-r-full before:bg-primary',\n inactive: 'text-text-secondary hover:bg-surface-2 hover:text-text-primary',\n divider: 'border-border-base',\n icon: 'bg-transparent text-text-tertiary group-hover:bg-surface-3 group-hover:text-primary',\n activeIcon: 'bg-primary/15 text-primary',\n },\n dark: {\n container: 'border-r border-border-base bg-surface-1 text-text-primary shadow-sm',\n active: 'bg-primary/10 text-primary shadow-sm ring-1 ring-primary/20 before:absolute before:left-0 before:top-1/2 before:h-6 before:w-[3px] before:-translate-y-1/2 before:rounded-r-full before:bg-primary',\n inactive: 'text-text-secondary hover:bg-surface-2 hover:text-text-primary',\n divider: 'border-border-base',\n icon: 'bg-transparent text-text-tertiary group-hover:bg-surface-3 group-hover:text-primary',\n activeIcon: 'bg-primary/15 text-primary',\n },\n}\n\nfunction getItemKey(item: SidebarItem, index: number, parentKey: string): string {\n return item.id ?? item.href ?? `${parentKey}-${index}-${item.label}`\n}\n\nfunction itemHasActiveChild(item: SidebarItem): boolean {\n return Boolean(item.children?.some((child) => child.active || itemHasActiveChild(child)))\n}\n\nfunction normalizeSearch(value: string): string {\n return value.toLowerCase().replace(/\\s+/g, '')\n}\n\nfunction filterSidebarItems(items: SidebarItem[], query: string): SidebarItem[] {\n if (!query) return items\n\n return items.reduce<SidebarItem[]>((result, item) => {\n const children = item.children ? filterSidebarItems(item.children, query) : []\n const matched = normalizeSearch(item.label).includes(query)\n\n if (matched || children.length > 0) {\n result.push({ ...item, children })\n }\n\n return result\n }, [])\n}\n\n/**\n * 侧边栏布局组件\n * @example\n * <Sidebar variant=\"dark\" items={navItems} footer={<LogoutButton />} />\n */\nconst Sidebar = forwardRef<HTMLElement, SidebarProps>(\n (\n {\n items,\n variant = 'primary',\n collapsed,\n defaultCollapsed = false,\n onCollapsedChange,\n collapsible = false,\n searchable = false,\n searchPlaceholder = '搜索菜单...',\n responsive = false,\n mobileOpen = false,\n onMobileOpenChange,\n header,\n footer,\n className,\n },\n ref,\n ) => {\n const styles = variantStyles[variant]\n const [internalCollapsed, setInternalCollapsed] = useState(defaultCollapsed)\n const [expandedKeys, setExpandedKeys] = useState<Set<string>>(() => new Set())\n const [query, setQuery] = useState('')\n const effectiveCollapsed = collapsed ?? internalCollapsed\n const normalizedQuery = normalizeSearch(query)\n const visibleItems = useMemo(() => filterSidebarItems(items, normalizedQuery), [items, normalizedQuery])\n\n function setCollapsedState(nextCollapsed: boolean) {\n setInternalCollapsed(nextCollapsed)\n onCollapsedChange?.(nextCollapsed)\n }\n\n function toggleExpanded(key: string) {\n setExpandedKeys((current) => {\n const next = new Set(current)\n if (next.has(key)) {\n next.delete(key)\n } else {\n next.add(key)\n }\n return next\n })\n }\n\n function closeMobile() {\n onMobileOpenChange?.(false)\n }\n\n function renderItems(list: SidebarItem[], depth = 0, parentKey = 'root') {\n return (\n <ul className={cn('flex flex-col gap-1', depth === 0 ? 'px-2.5' : 'ml-6 mt-1 border-l border-border-base pl-2')}>\n {list.map((item, index) => {\n const key = getItemKey(item, index, parentKey)\n const hasChildren = Boolean(item.children?.length)\n const active = Boolean(item.active || itemHasActiveChild(item))\n const expanded = !effectiveCollapsed && hasChildren && (normalizedQuery.length > 0 || active || expandedKeys.has(key))\n const itemContent = (\n <>\n <span\n className={cn(\n 'flex h-8 w-8 shrink-0 items-center justify-center rounded-lg transition-colors',\n active ? styles.activeIcon : styles.icon,\n )}\n >\n <item.icon size={16} />\n </span>\n {!effectiveCollapsed && <span className=\"min-w-0 flex-1 truncate text-left\">{item.label}</span>}\n {!effectiveCollapsed && hasChildren && (\n <ChevronDown\n size={15}\n className={cn('shrink-0 text-text-tertiary transition-transform', expanded && 'rotate-180')}\n aria-hidden=\"true\"\n />\n )}\n </>\n )\n const itemClassName = cn(\n 'group relative flex min-w-0 items-center gap-2.5 rounded-lg px-2.5 py-2 text-sm font-medium outline-none transition-all duration-150 focus-visible:ring-2 focus-visible:ring-primary/35',\n effectiveCollapsed && 'justify-center px-2',\n active ? styles.active : styles.inactive,\n )\n\n return (\n <li key={key}>\n {hasChildren ? (\n <button\n type=\"button\"\n className={cn('w-full', itemClassName)}\n aria-expanded={expanded}\n title={effectiveCollapsed ? item.label : undefined}\n onClick={() => toggleExpanded(key)}\n >\n {itemContent}\n </button>\n ) : (\n <a\n href={item.href ?? '#'}\n aria-current={item.active ? 'page' : undefined}\n className={itemClassName}\n title={effectiveCollapsed ? item.label : undefined}\n onClick={closeMobile}\n >\n {itemContent}\n </a>\n )}\n {expanded && item.children ? renderItems(item.children, depth + 1, key) : null}\n </li>\n )\n })}\n </ul>\n )\n }\n\n const sidebar = (\n <aside\n ref={ref}\n className={cn(\n 'flex flex-col overflow-hidden transition-all duration-300',\n styles.container,\n effectiveCollapsed ? 'w-[72px]' : 'w-64',\n responsive && [\n 'fixed inset-y-0 left-0 z-50 md:relative md:inset-auto md:z-auto',\n mobileOpen ? 'translate-x-0' : '-translate-x-full md:translate-x-0',\n ],\n className,\n )}\n >\n {(header || collapsible || (responsive && mobileOpen)) && (\n <div\n className={cn(\n 'flex border-b px-3 py-3',\n styles.divider,\n effectiveCollapsed ? 'justify-center' : 'items-center gap-2',\n )}\n >\n {!effectiveCollapsed && header ? <div className=\"min-w-0 flex-1\">{header}</div> : null}\n {collapsible && (\n <button\n type=\"button\"\n className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-border-base bg-surface-2 text-text-secondary transition-colors hover:border-primary/40 hover:text-text-primary\"\n aria-label={effectiveCollapsed ? '展开侧边栏' : '折叠侧边栏'}\n onClick={() => setCollapsedState(!effectiveCollapsed)}\n >\n {effectiveCollapsed ? <PanelLeftOpen size={17} /> : <PanelLeftClose size={17} />}\n </button>\n )}\n {responsive && (\n <button\n type=\"button\"\n className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-border-base bg-surface-2 text-text-secondary transition-colors hover:border-primary/40 hover:text-text-primary md:hidden\"\n aria-label=\"关闭侧边栏\"\n onClick={closeMobile}\n >\n <X size={17} />\n </button>\n )}\n </div>\n )}\n\n {searchable && !effectiveCollapsed && (\n <div className={cn('border-b px-3 py-3', styles.divider)}>\n <label className=\"sr-only\" htmlFor=\"ug-sidebar-search\">搜索菜单</label>\n <div className=\"relative\">\n <Search className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-tertiary\" aria-hidden=\"true\" />\n <input\n id=\"ug-sidebar-search\"\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n placeholder={searchPlaceholder}\n autoComplete=\"off\"\n className=\"h-10 w-full rounded-lg border border-border-base bg-surface-0 px-3 pl-9 pr-9 text-sm text-text-primary outline-none transition-colors placeholder:text-text-tertiary focus:border-primary focus:ring-2 focus:ring-primary/20\"\n type=\"text\"\n role=\"searchbox\"\n />\n {query ? (\n <button\n type=\"button\"\n className=\"absolute right-1 top-1/2 flex h-8 w-8 -translate-y-1/2 items-center justify-center rounded-md text-text-tertiary transition-colors hover:bg-surface-2 hover:text-text-primary\"\n aria-label=\"清空搜索\"\n onClick={() => setQuery('')}\n >\n <X size={14} />\n </button>\n ) : null}\n </div>\n </div>\n )}\n\n <nav className=\"flex-1 overflow-y-auto py-3.5\">\n {visibleItems.length > 0 ? (\n renderItems(visibleItems)\n ) : (\n <p className=\"mx-3 rounded-lg border border-dashed border-border-base bg-surface-0 px-3 py-3 text-sm text-text-tertiary\">\n 没有匹配的菜单\n </p>\n )}\n </nav>\n\n {footer && (\n <div\n className={cn(\n 'border-t px-2.5 py-3',\n styles.divider,\n effectiveCollapsed && 'flex justify-center',\n )}\n >\n {footer}\n </div>\n )}\n </aside>\n )\n\n return (\n <>\n {responsive && mobileOpen ? (\n <button\n type=\"button\"\n className=\"fixed inset-0 z-40 bg-overlay md:hidden\"\n aria-label=\"关闭侧边栏遮罩\"\n onClick={closeMobile}\n />\n ) : null}\n {sidebar}\n </>\n )\n },\n)\n\nSidebar.displayName = 'Sidebar'\n\nexport { Sidebar }\n","/**\n * @description: ConfirmDialog 确认弹窗模式 — 统一危险操作和关键确认流程\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-05-30\n */\n'use client'\n\nimport { forwardRef, type ReactNode } from 'react'\nimport { AlertTriangle, HelpCircle, type LucideIcon } from 'lucide-react'\nimport { Button } from '../components/button'\nimport {\n Modal,\n ModalContent,\n ModalFooter,\n ModalHeader,\n ModalTitle,\n type ModalContentProps,\n} from '../components/modal'\nimport { cn } from '../internal/cn'\n\nexport type ConfirmDialogVariant = 'default' | 'destructive'\n\nexport interface ConfirmDialogProps extends Omit<ModalContentProps, 'children' | 'title'> {\n /** 是否打开 */\n open: boolean\n /** 打开状态变化回调 */\n onOpenChange: (open: boolean) => void\n /** 标题 */\n title: ReactNode\n /** 描述 */\n description?: ReactNode\n /** 自定义正文内容 */\n children?: ReactNode\n /** 变体,destructive 用于危险操作 */\n variant?: ConfirmDialogVariant\n /** 自定义图标 */\n icon?: LucideIcon\n /** 取消按钮文案 */\n cancelText?: string\n /** 确认按钮文案 */\n confirmText?: string\n /** 是否展示确认按钮 loading */\n loading?: boolean\n /** 是否禁用确认按钮 */\n disabled?: boolean\n /** 确认后是否自动关闭 */\n closeOnConfirm?: boolean\n /** 取消回调 */\n onCancel?: () => void\n /** 确认回调 */\n onConfirm?: () => void | Promise<void>\n}\n\n/**\n * 确认弹窗模式\n * @example\n * <ConfirmDialog\n * open={open}\n * onOpenChange={setOpen}\n * title=\"删除文件?\"\n * description=\"删除后不可恢复。\"\n * variant=\"destructive\"\n * confirmText=\"删除\"\n * onConfirm={handleDelete}\n * />\n */\nconst ConfirmDialog = forwardRef<HTMLDivElement, ConfirmDialogProps>(\n (\n {\n open,\n onOpenChange,\n title,\n description,\n children,\n variant = 'destructive',\n icon,\n cancelText = '取消',\n confirmText = '确认',\n loading = false,\n disabled = false,\n closeOnConfirm = true,\n onCancel,\n onConfirm,\n className,\n ...props\n },\n ref,\n ) => {\n const Icon = icon ?? (variant === 'destructive' ? AlertTriangle : HelpCircle)\n\n function handleCancel() {\n onCancel?.()\n onOpenChange(false)\n }\n\n function handleConfirm() {\n const result = onConfirm?.()\n if (closeOnConfirm) onOpenChange(false)\n return result\n }\n\n return (\n <Modal open={open} onClose={handleCancel}>\n <ModalContent\n ref={ref}\n className={cn('max-w-md', className)}\n {...props}\n >\n <ModalHeader className=\"items-start gap-3\">\n <div\n className={cn(\n 'flex h-10 w-10 shrink-0 items-center justify-center rounded-md',\n variant === 'destructive'\n ? 'bg-danger-soft text-danger-soft-fg'\n : 'bg-primary-soft text-primary-soft-fg',\n )}\n >\n <Icon size={20} aria-hidden=\"true\" />\n </div>\n <div className=\"min-w-0 flex-1 space-y-1\">\n <ModalTitle className=\"break-words text-base\">{title}</ModalTitle>\n {description ? (\n <p className=\"text-sm leading-6 text-text-secondary\">{description}</p>\n ) : null}\n </div>\n </ModalHeader>\n\n {children ? <div className=\"px-6 py-4 text-sm text-text-secondary\">{children}</div> : null}\n\n <ModalFooter className=\"flex-col-reverse gap-2 sm:flex-row\">\n <Button type=\"button\" variant=\"outline\" disabled={loading} onClick={handleCancel}>\n {cancelText}\n </Button>\n <Button\n type=\"button\"\n variant={variant === 'destructive' ? 'destructive' : 'default'}\n loading={loading}\n disabled={disabled}\n onClick={handleConfirm}\n >\n {confirmText}\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n )\n },\n)\n\nConfirmDialog.displayName = 'ConfirmDialog'\n\nexport { ConfirmDialog }\n","/**\n * @description: Modal 对话框组件 — 纯原生实现,支持遮罩点击关闭和 ESC 关闭,无 Radix 依赖\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-15\n */\nimport { forwardRef } from 'react'\nimport { createPortal } from 'react-dom'\nimport { X } from 'lucide-react'\nimport { cn } from '../internal/cn'\nimport { useEscapeKey } from '../hooks/use-escape-key'\nimport { usePortalContainer } from '../internal/use-portal-container'\n\nexport interface ModalProps {\n /** 是否显示 */\n open: boolean\n /** 关闭回调 */\n onClose: () => void\n /** 子内容 */\n children: React.ReactNode\n /** 额外类名 */\n className?: string\n}\n\nexport interface ModalContentProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 最大宽度,默认 max-w-lg */\n maxWidth?: string\n}\n\nexport type ModalHeaderProps = React.HTMLAttributes<HTMLDivElement>\nexport type ModalTitleProps = React.HTMLAttributes<HTMLHeadingElement>\nexport type ModalFooterProps = React.HTMLAttributes<HTMLDivElement>\nexport interface ModalCloseButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {}\n\n/**\n * 对话框组件\n * @example\n * <Modal open={isOpen} onClose={() => setIsOpen(false)}>\n * <ModalContent>\n * <ModalHeader>\n * <ModalTitle>确认删除</ModalTitle>\n * </ModalHeader>\n * <p className=\"px-6 pb-4 text-sm text-text-secondary\">此操作不可撤销。</p>\n * <ModalFooter>\n * <Button variant=\"outline\" onClick={() => setIsOpen(false)}>取消</Button>\n * <Button variant=\"destructive\">删除</Button>\n * </ModalFooter>\n * </ModalContent>\n * </Modal>\n */\nconst Modal = forwardRef<HTMLDivElement, ModalProps>(({ open, onClose, children, className }, ref) => {\n useEscapeKey(open, onClose)\n const portalContainer = usePortalContainer()\n\n if (!open || !portalContainer) return null\n\n return createPortal(\n <div\n ref={ref}\n className={cn(\n 'fixed inset-0 z-[80] flex items-center justify-center p-4',\n className\n )}\n role=\"dialog\"\n aria-modal=\"true\"\n >\n {/* 遮罩层,点击关闭 */}\n <div\n className=\"absolute inset-0 bg-overlay\"\n onClick={onClose}\n aria-hidden=\"true\"\n />\n {/* 内容区域,阻止事件冒泡 */}\n <div className=\"relative z-10\">{children}</div>\n </div>,\n portalContainer\n )\n})\n\nconst ModalContent = forwardRef<HTMLDivElement, ModalContentProps>(({ className, maxWidth = 'max-w-lg', children, ...props }, ref) => {\n return (\n <div ref={ref} className={cn('flex max-h-[85vh] w-full flex-col rounded-lg border border-border-base bg-surface-1 shadow-xl', maxWidth, className)} {...props}>\n {children}\n </div>\n )\n})\n\nconst ModalHeader = forwardRef<HTMLDivElement, ModalHeaderProps>(({ className, ...props }, ref) => {\n return <div ref={ref} className={cn('flex shrink-0 items-center justify-between border-b border-border-base px-6 py-4', className)} {...props} />\n})\n\nconst ModalTitle = forwardRef<HTMLHeadingElement, ModalTitleProps>(({ className, ...props }, ref) => {\n return <h2 ref={ref} className={cn('text-lg font-semibold text-text-primary', className)} {...props} />\n})\n\nconst ModalFooter = forwardRef<HTMLDivElement, ModalFooterProps>(({ className, ...props }, ref) => {\n return <div ref={ref} className={cn('flex shrink-0 items-center justify-end gap-2 border-t border-border-base px-6 py-4', className)} {...props} />\n})\n\n/** 独立关闭按钮,可放在 ModalHeader 右侧 */\nconst ModalCloseButton = forwardRef<HTMLButtonElement, ModalCloseButtonProps>(({ onClick, className, type = 'button', ...props }, ref) => {\n return (\n <button\n ref={ref}\n type={type}\n onClick={onClick}\n className={cn(\n 'rounded-md p-1 text-text-tertiary transition-colors hover:bg-surface-3 hover:text-text-secondary',\n className\n )}\n aria-label=\"关闭\"\n {...props}\n >\n <X size={18} />\n </button>\n )\n})\n\nModal.displayName = 'Modal'\nModalContent.displayName = 'ModalContent'\nModalHeader.displayName = 'ModalHeader'\nModalTitle.displayName = 'ModalTitle'\nModalFooter.displayName = 'ModalFooter'\nModalCloseButton.displayName = 'ModalCloseButton'\n\nexport { Modal, ModalContent, ModalHeader, ModalTitle, ModalFooter, ModalCloseButton }\n","/**\n * @description: 内部 hook — 当组件处于 open 状态时,监听 Escape 键并锁定 body 滚动\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-17\n */\nimport { useCallback, useEffect } from 'react'\n\n/**\n * 叠加层组件(Modal / Sheet / Drawer / Dialog)公共行为:\n * - open 为 true 时:注册 keydown 监听,锁定 body 滚动\n * - open 为 false 或卸载时:移除监听,解锁 body 滚动\n *\n * @param open - 组件是否处于展开状态\n * @param onEscape - 按下 Escape 时的回调\n */\nexport function useEscapeKey(open: boolean, onEscape: () => void): void {\n const handleEscape = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === 'Escape') onEscape()\n },\n [onEscape],\n )\n\n useEffect(() => {\n if (!open || typeof document === 'undefined') return\n document.addEventListener('keydown', handleEscape)\n document.body.style.overflow = 'hidden'\n return () => {\n document.removeEventListener('keydown', handleEscape)\n document.body.style.overflow = ''\n }\n }, [open, handleEscape])\n}\n","/**\n * @description: 内部 hook — 在客户端挂载后提供 portal 容器,避免 SSR render 阶段访问 document\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-05-31\n */\nimport { useEffect, useState } from 'react'\n\nexport function usePortalContainer(): HTMLElement | null {\n const [container, setContainer] = useState<HTMLElement | null>(null)\n\n useEffect(() => {\n if (typeof document === 'undefined') return\n setContainer(document.body)\n }, [])\n\n return container\n}\n","/**\n * @description: CopyField 可复制字段模式 — 用于 URL、Token、ID 等只读值展示与复制\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-05-30\n */\n'use client'\n\nimport { forwardRef, useEffect, useRef, useState, type HTMLAttributes, type ReactNode } from 'react'\nimport { Check, Copy } from 'lucide-react'\nimport { Button } from '../components/button'\nimport { cn } from '../internal/cn'\n\nexport interface CopyFieldProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {\n /** 实际复制的值 */\n value: string\n /** 字段标签 */\n label?: ReactNode\n /** 展示值;不传时展示 value */\n displayValue?: ReactNode\n /** 是否使用等宽字体展示 */\n monospace?: boolean\n /** 是否禁用复制 */\n disabled?: boolean\n /** 复制按钮文案 */\n copyLabel?: string\n /** 复制成功后的短暂文案 */\n copiedLabel?: string\n /** 复制成功回调 */\n onCopied?: (value: string) => void\n /** 复制失败回调 */\n onCopyError?: (error: unknown) => void\n}\n\n/**\n * 可复制字段模式\n * @example\n * <CopyField label=\"访问地址\" value=\"https://cdn.ug666.top/file.png\" />\n */\nconst CopyField = forwardRef<HTMLDivElement, CopyFieldProps>(\n (\n {\n value,\n label,\n displayValue,\n monospace = true,\n disabled = false,\n copyLabel = '复制',\n copiedLabel = '已复制',\n onCopied,\n onCopyError,\n className,\n ...props\n },\n ref,\n ) => {\n const [copied, setCopied] = useState(false)\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current)\n }\n }, [])\n\n async function handleCopy() {\n if (disabled) return\n\n try {\n if (!navigator.clipboard?.writeText) {\n throw new Error('Clipboard API is not available')\n }\n\n await navigator.clipboard.writeText(value)\n setCopied(true)\n onCopied?.(value)\n\n if (timeoutRef.current) clearTimeout(timeoutRef.current)\n timeoutRef.current = setTimeout(() => setCopied(false), 1400)\n } catch (error) {\n onCopyError?.(error)\n }\n }\n\n return (\n <div ref={ref} className={cn('space-y-2', className)} {...props}>\n {label ? <div className=\"text-xs font-medium text-text-secondary\">{label}</div> : null}\n <div\n className={cn(\n 'flex min-w-0 items-stretch overflow-hidden rounded-md border border-border-base bg-surface-1',\n disabled && 'opacity-60',\n )}\n >\n <div\n className={cn(\n 'min-w-0 flex-1 truncate px-3 py-2 text-sm text-text-primary',\n monospace && 'font-mono',\n )}\n title={typeof displayValue === 'string' ? displayValue : value}\n >\n {displayValue ?? value}\n </div>\n <div className=\"flex shrink-0 items-center border-l border-border-base bg-surface-2 px-1.5\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n disabled={disabled}\n onClick={handleCopy}\n aria-live=\"polite\"\n >\n {copied ? <Check size={15} /> : <Copy size={15} />}\n {copied ? copiedLabel : copyLabel}\n </Button>\n </div>\n </div>\n </div>\n )\n },\n)\n\nCopyField.displayName = 'CopyField'\n\nexport { CopyField }\n","/**\n * @description: PageHeader 页面标题模式 — 用于后台列表、详情页和工具页的统一页头\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-05-30\n */\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react'\nimport { cn } from '../internal/cn'\n\nexport interface PageHeaderProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {\n /** 标题上方的短标签,例如模块名或当前范围 */\n eyebrow?: ReactNode\n /** 页面主标题 */\n title: ReactNode\n /** 页面说明文案 */\n description?: ReactNode\n /** 标题旁的状态、徽标或计数 */\n badge?: ReactNode\n /** 面包屑、返回入口或路径区域 */\n breadcrumb?: ReactNode\n /** 右侧主要操作区 */\n actions?: ReactNode\n /** 标题下方的元信息,例如更新时间、所有者、环境 */\n meta?: ReactNode\n /** 页头底部扩展区,例如 tabs 或筛选入口 */\n children?: ReactNode\n}\n\n/**\n * 后台页面标题模式\n * @example\n * <PageHeader\n * eyebrow=\"Storage\"\n * title=\"文件空间\"\n * description=\"管理项目文件、外链和访问策略。\"\n * actions={<Button>上传文件</Button>}\n * />\n */\nconst PageHeader = forwardRef<HTMLElement, PageHeaderProps>(\n (\n {\n eyebrow,\n title,\n description,\n badge,\n breadcrumb,\n actions,\n meta,\n children,\n className,\n ...props\n },\n ref,\n ) => {\n return (\n <header\n ref={ref}\n className={cn(\n 'flex min-w-0 flex-col gap-5 border-b border-border-base pb-6',\n className,\n )}\n {...props}\n >\n {breadcrumb ? <div className=\"min-w-0\">{breadcrumb}</div> : null}\n\n <div className=\"flex min-w-0 flex-col gap-4 lg:flex-row lg:items-start lg:justify-between\">\n <div className=\"min-w-0 space-y-3\">\n {eyebrow ? (\n <div className=\"text-xs font-semibold uppercase text-primary\">{eyebrow}</div>\n ) : null}\n <div className=\"flex min-w-0 flex-wrap items-center gap-2.5\">\n <h1 className=\"min-w-0 break-words text-2xl font-bold leading-tight text-text-primary sm:text-3xl\">\n {title}\n </h1>\n {badge ? <div className=\"shrink-0\">{badge}</div> : null}\n </div>\n {description ? (\n <p className=\"max-w-3xl text-sm leading-6 text-text-secondary\">{description}</p>\n ) : null}\n {meta ? (\n <div className=\"flex min-w-0 flex-wrap items-center gap-x-4 gap-y-2 text-xs text-text-tertiary\">\n {meta}\n </div>\n ) : null}\n </div>\n\n {actions ? (\n <div className=\"flex shrink-0 flex-wrap items-center gap-2 lg:justify-end\">{actions}</div>\n ) : null}\n </div>\n\n {children ? <div className=\"min-w-0\">{children}</div> : null}\n </header>\n )\n },\n)\n\nPageHeader.displayName = 'PageHeader'\n\nexport { PageHeader }\n"],"mappings":"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","names":["import_react","import_lucide_react","import_react","import_lucide_react","import_jsx_runtime","import_jsx_runtime","import_react","import_lucide_react","import_react","import_lucide_react","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_react","import_jsx_runtime"]}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { HTMLAttributes, ReactNode } from 'react';
|
|
3
|
+
import { l as SidebarItem, n as SidebarVariant, d as ModalContentProps } from '../sidebar-vl00Z2o-.cjs';
|
|
4
|
+
import { LucideIcon } from 'lucide-react';
|
|
5
|
+
|
|
6
|
+
interface AdminShellProps extends HTMLAttributes<HTMLDivElement> {
|
|
7
|
+
/** 侧栏导航项 */
|
|
8
|
+
navItems: SidebarItem[];
|
|
9
|
+
/** 侧栏顶部区域,通常是品牌、租户或产品名 */
|
|
10
|
+
sidebarHeader?: ReactNode;
|
|
11
|
+
/** 侧栏底部区域,通常是用户区或退出入口 */
|
|
12
|
+
sidebarFooter?: ReactNode;
|
|
13
|
+
/** 侧栏视觉风格 */
|
|
14
|
+
sidebarVariant?: SidebarVariant;
|
|
15
|
+
/** 是否启用侧栏搜索 */
|
|
16
|
+
sidebarSearchable?: boolean;
|
|
17
|
+
/** 是否启用侧栏折叠 */
|
|
18
|
+
sidebarCollapsible?: boolean;
|
|
19
|
+
/** 受控折叠状态 */
|
|
20
|
+
sidebarCollapsed?: boolean;
|
|
21
|
+
/** 非受控默认折叠状态 */
|
|
22
|
+
defaultSidebarCollapsed?: boolean;
|
|
23
|
+
/** 折叠状态变化 */
|
|
24
|
+
onSidebarCollapsedChange?: (collapsed: boolean) => void;
|
|
25
|
+
/** 受控移动端侧栏状态 */
|
|
26
|
+
mobileSidebarOpen?: boolean;
|
|
27
|
+
/** 移动端侧栏状态变化 */
|
|
28
|
+
onMobileSidebarOpenChange?: (open: boolean) => void;
|
|
29
|
+
/** 顶栏左侧内容 */
|
|
30
|
+
topbarStart?: ReactNode;
|
|
31
|
+
/** 顶栏右侧内容 */
|
|
32
|
+
topbarEnd?: ReactNode;
|
|
33
|
+
/** 完全自定义顶栏内容 */
|
|
34
|
+
topbar?: ReactNode;
|
|
35
|
+
/** main 元素类名 */
|
|
36
|
+
mainClassName?: string;
|
|
37
|
+
/** 内容容器类名 */
|
|
38
|
+
contentClassName?: string;
|
|
39
|
+
/** 页面内容 */
|
|
40
|
+
children: ReactNode;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 后台框架模式
|
|
44
|
+
* @example
|
|
45
|
+
* <AdminShell
|
|
46
|
+
* navItems={items}
|
|
47
|
+
* sidebarHeader={<Brand />}
|
|
48
|
+
* topbarEnd={<UserMenu />}
|
|
49
|
+
* >
|
|
50
|
+
* <PageHeader title="控制台" />
|
|
51
|
+
* </AdminShell>
|
|
52
|
+
*/
|
|
53
|
+
declare const AdminShell: react.ForwardRefExoticComponent<AdminShellProps & react.RefAttributes<HTMLDivElement>>;
|
|
54
|
+
|
|
55
|
+
type ConfirmDialogVariant = 'default' | 'destructive';
|
|
56
|
+
interface ConfirmDialogProps extends Omit<ModalContentProps, 'children' | 'title'> {
|
|
57
|
+
/** 是否打开 */
|
|
58
|
+
open: boolean;
|
|
59
|
+
/** 打开状态变化回调 */
|
|
60
|
+
onOpenChange: (open: boolean) => void;
|
|
61
|
+
/** 标题 */
|
|
62
|
+
title: ReactNode;
|
|
63
|
+
/** 描述 */
|
|
64
|
+
description?: ReactNode;
|
|
65
|
+
/** 自定义正文内容 */
|
|
66
|
+
children?: ReactNode;
|
|
67
|
+
/** 变体,destructive 用于危险操作 */
|
|
68
|
+
variant?: ConfirmDialogVariant;
|
|
69
|
+
/** 自定义图标 */
|
|
70
|
+
icon?: LucideIcon;
|
|
71
|
+
/** 取消按钮文案 */
|
|
72
|
+
cancelText?: string;
|
|
73
|
+
/** 确认按钮文案 */
|
|
74
|
+
confirmText?: string;
|
|
75
|
+
/** 是否展示确认按钮 loading */
|
|
76
|
+
loading?: boolean;
|
|
77
|
+
/** 是否禁用确认按钮 */
|
|
78
|
+
disabled?: boolean;
|
|
79
|
+
/** 确认后是否自动关闭 */
|
|
80
|
+
closeOnConfirm?: boolean;
|
|
81
|
+
/** 取消回调 */
|
|
82
|
+
onCancel?: () => void;
|
|
83
|
+
/** 确认回调 */
|
|
84
|
+
onConfirm?: () => void | Promise<void>;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 确认弹窗模式
|
|
88
|
+
* @example
|
|
89
|
+
* <ConfirmDialog
|
|
90
|
+
* open={open}
|
|
91
|
+
* onOpenChange={setOpen}
|
|
92
|
+
* title="删除文件?"
|
|
93
|
+
* description="删除后不可恢复。"
|
|
94
|
+
* variant="destructive"
|
|
95
|
+
* confirmText="删除"
|
|
96
|
+
* onConfirm={handleDelete}
|
|
97
|
+
* />
|
|
98
|
+
*/
|
|
99
|
+
declare const ConfirmDialog: react.ForwardRefExoticComponent<ConfirmDialogProps & react.RefAttributes<HTMLDivElement>>;
|
|
100
|
+
|
|
101
|
+
interface CopyFieldProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {
|
|
102
|
+
/** 实际复制的值 */
|
|
103
|
+
value: string;
|
|
104
|
+
/** 字段标签 */
|
|
105
|
+
label?: ReactNode;
|
|
106
|
+
/** 展示值;不传时展示 value */
|
|
107
|
+
displayValue?: ReactNode;
|
|
108
|
+
/** 是否使用等宽字体展示 */
|
|
109
|
+
monospace?: boolean;
|
|
110
|
+
/** 是否禁用复制 */
|
|
111
|
+
disabled?: boolean;
|
|
112
|
+
/** 复制按钮文案 */
|
|
113
|
+
copyLabel?: string;
|
|
114
|
+
/** 复制成功后的短暂文案 */
|
|
115
|
+
copiedLabel?: string;
|
|
116
|
+
/** 复制成功回调 */
|
|
117
|
+
onCopied?: (value: string) => void;
|
|
118
|
+
/** 复制失败回调 */
|
|
119
|
+
onCopyError?: (error: unknown) => void;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* 可复制字段模式
|
|
123
|
+
* @example
|
|
124
|
+
* <CopyField label="访问地址" value="https://cdn.ug666.top/file.png" />
|
|
125
|
+
*/
|
|
126
|
+
declare const CopyField: react.ForwardRefExoticComponent<CopyFieldProps & react.RefAttributes<HTMLDivElement>>;
|
|
127
|
+
|
|
128
|
+
interface PageHeaderProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {
|
|
129
|
+
/** 标题上方的短标签,例如模块名或当前范围 */
|
|
130
|
+
eyebrow?: ReactNode;
|
|
131
|
+
/** 页面主标题 */
|
|
132
|
+
title: ReactNode;
|
|
133
|
+
/** 页面说明文案 */
|
|
134
|
+
description?: ReactNode;
|
|
135
|
+
/** 标题旁的状态、徽标或计数 */
|
|
136
|
+
badge?: ReactNode;
|
|
137
|
+
/** 面包屑、返回入口或路径区域 */
|
|
138
|
+
breadcrumb?: ReactNode;
|
|
139
|
+
/** 右侧主要操作区 */
|
|
140
|
+
actions?: ReactNode;
|
|
141
|
+
/** 标题下方的元信息,例如更新时间、所有者、环境 */
|
|
142
|
+
meta?: ReactNode;
|
|
143
|
+
/** 页头底部扩展区,例如 tabs 或筛选入口 */
|
|
144
|
+
children?: ReactNode;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* 后台页面标题模式
|
|
148
|
+
* @example
|
|
149
|
+
* <PageHeader
|
|
150
|
+
* eyebrow="Storage"
|
|
151
|
+
* title="文件空间"
|
|
152
|
+
* description="管理项目文件、外链和访问策略。"
|
|
153
|
+
* actions={<Button>上传文件</Button>}
|
|
154
|
+
* />
|
|
155
|
+
*/
|
|
156
|
+
declare const PageHeader: react.ForwardRefExoticComponent<PageHeaderProps & react.RefAttributes<HTMLElement>>;
|
|
157
|
+
|
|
158
|
+
export { AdminShell, type AdminShellProps, ConfirmDialog, type ConfirmDialogProps, type ConfirmDialogVariant, CopyField, type CopyFieldProps, PageHeader, type PageHeaderProps, AdminShell as UGAdminShell, type AdminShellProps as UGAdminShellProps, ConfirmDialog as UGConfirmDialog, type ConfirmDialogProps as UGConfirmDialogProps, type ConfirmDialogVariant as UGConfirmDialogVariant, CopyField as UGCopyField, type CopyFieldProps as UGCopyFieldProps, PageHeader as UGPageHeader, type PageHeaderProps as UGPageHeaderProps };
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { HTMLAttributes, ReactNode } from 'react';
|
|
3
|
+
import { l as SidebarItem, n as SidebarVariant, d as ModalContentProps } from '../sidebar-vl00Z2o-.js';
|
|
4
|
+
import { LucideIcon } from 'lucide-react';
|
|
5
|
+
|
|
6
|
+
interface AdminShellProps extends HTMLAttributes<HTMLDivElement> {
|
|
7
|
+
/** 侧栏导航项 */
|
|
8
|
+
navItems: SidebarItem[];
|
|
9
|
+
/** 侧栏顶部区域,通常是品牌、租户或产品名 */
|
|
10
|
+
sidebarHeader?: ReactNode;
|
|
11
|
+
/** 侧栏底部区域,通常是用户区或退出入口 */
|
|
12
|
+
sidebarFooter?: ReactNode;
|
|
13
|
+
/** 侧栏视觉风格 */
|
|
14
|
+
sidebarVariant?: SidebarVariant;
|
|
15
|
+
/** 是否启用侧栏搜索 */
|
|
16
|
+
sidebarSearchable?: boolean;
|
|
17
|
+
/** 是否启用侧栏折叠 */
|
|
18
|
+
sidebarCollapsible?: boolean;
|
|
19
|
+
/** 受控折叠状态 */
|
|
20
|
+
sidebarCollapsed?: boolean;
|
|
21
|
+
/** 非受控默认折叠状态 */
|
|
22
|
+
defaultSidebarCollapsed?: boolean;
|
|
23
|
+
/** 折叠状态变化 */
|
|
24
|
+
onSidebarCollapsedChange?: (collapsed: boolean) => void;
|
|
25
|
+
/** 受控移动端侧栏状态 */
|
|
26
|
+
mobileSidebarOpen?: boolean;
|
|
27
|
+
/** 移动端侧栏状态变化 */
|
|
28
|
+
onMobileSidebarOpenChange?: (open: boolean) => void;
|
|
29
|
+
/** 顶栏左侧内容 */
|
|
30
|
+
topbarStart?: ReactNode;
|
|
31
|
+
/** 顶栏右侧内容 */
|
|
32
|
+
topbarEnd?: ReactNode;
|
|
33
|
+
/** 完全自定义顶栏内容 */
|
|
34
|
+
topbar?: ReactNode;
|
|
35
|
+
/** main 元素类名 */
|
|
36
|
+
mainClassName?: string;
|
|
37
|
+
/** 内容容器类名 */
|
|
38
|
+
contentClassName?: string;
|
|
39
|
+
/** 页面内容 */
|
|
40
|
+
children: ReactNode;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 后台框架模式
|
|
44
|
+
* @example
|
|
45
|
+
* <AdminShell
|
|
46
|
+
* navItems={items}
|
|
47
|
+
* sidebarHeader={<Brand />}
|
|
48
|
+
* topbarEnd={<UserMenu />}
|
|
49
|
+
* >
|
|
50
|
+
* <PageHeader title="控制台" />
|
|
51
|
+
* </AdminShell>
|
|
52
|
+
*/
|
|
53
|
+
declare const AdminShell: react.ForwardRefExoticComponent<AdminShellProps & react.RefAttributes<HTMLDivElement>>;
|
|
54
|
+
|
|
55
|
+
type ConfirmDialogVariant = 'default' | 'destructive';
|
|
56
|
+
interface ConfirmDialogProps extends Omit<ModalContentProps, 'children' | 'title'> {
|
|
57
|
+
/** 是否打开 */
|
|
58
|
+
open: boolean;
|
|
59
|
+
/** 打开状态变化回调 */
|
|
60
|
+
onOpenChange: (open: boolean) => void;
|
|
61
|
+
/** 标题 */
|
|
62
|
+
title: ReactNode;
|
|
63
|
+
/** 描述 */
|
|
64
|
+
description?: ReactNode;
|
|
65
|
+
/** 自定义正文内容 */
|
|
66
|
+
children?: ReactNode;
|
|
67
|
+
/** 变体,destructive 用于危险操作 */
|
|
68
|
+
variant?: ConfirmDialogVariant;
|
|
69
|
+
/** 自定义图标 */
|
|
70
|
+
icon?: LucideIcon;
|
|
71
|
+
/** 取消按钮文案 */
|
|
72
|
+
cancelText?: string;
|
|
73
|
+
/** 确认按钮文案 */
|
|
74
|
+
confirmText?: string;
|
|
75
|
+
/** 是否展示确认按钮 loading */
|
|
76
|
+
loading?: boolean;
|
|
77
|
+
/** 是否禁用确认按钮 */
|
|
78
|
+
disabled?: boolean;
|
|
79
|
+
/** 确认后是否自动关闭 */
|
|
80
|
+
closeOnConfirm?: boolean;
|
|
81
|
+
/** 取消回调 */
|
|
82
|
+
onCancel?: () => void;
|
|
83
|
+
/** 确认回调 */
|
|
84
|
+
onConfirm?: () => void | Promise<void>;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 确认弹窗模式
|
|
88
|
+
* @example
|
|
89
|
+
* <ConfirmDialog
|
|
90
|
+
* open={open}
|
|
91
|
+
* onOpenChange={setOpen}
|
|
92
|
+
* title="删除文件?"
|
|
93
|
+
* description="删除后不可恢复。"
|
|
94
|
+
* variant="destructive"
|
|
95
|
+
* confirmText="删除"
|
|
96
|
+
* onConfirm={handleDelete}
|
|
97
|
+
* />
|
|
98
|
+
*/
|
|
99
|
+
declare const ConfirmDialog: react.ForwardRefExoticComponent<ConfirmDialogProps & react.RefAttributes<HTMLDivElement>>;
|
|
100
|
+
|
|
101
|
+
interface CopyFieldProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {
|
|
102
|
+
/** 实际复制的值 */
|
|
103
|
+
value: string;
|
|
104
|
+
/** 字段标签 */
|
|
105
|
+
label?: ReactNode;
|
|
106
|
+
/** 展示值;不传时展示 value */
|
|
107
|
+
displayValue?: ReactNode;
|
|
108
|
+
/** 是否使用等宽字体展示 */
|
|
109
|
+
monospace?: boolean;
|
|
110
|
+
/** 是否禁用复制 */
|
|
111
|
+
disabled?: boolean;
|
|
112
|
+
/** 复制按钮文案 */
|
|
113
|
+
copyLabel?: string;
|
|
114
|
+
/** 复制成功后的短暂文案 */
|
|
115
|
+
copiedLabel?: string;
|
|
116
|
+
/** 复制成功回调 */
|
|
117
|
+
onCopied?: (value: string) => void;
|
|
118
|
+
/** 复制失败回调 */
|
|
119
|
+
onCopyError?: (error: unknown) => void;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* 可复制字段模式
|
|
123
|
+
* @example
|
|
124
|
+
* <CopyField label="访问地址" value="https://cdn.ug666.top/file.png" />
|
|
125
|
+
*/
|
|
126
|
+
declare const CopyField: react.ForwardRefExoticComponent<CopyFieldProps & react.RefAttributes<HTMLDivElement>>;
|
|
127
|
+
|
|
128
|
+
interface PageHeaderProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {
|
|
129
|
+
/** 标题上方的短标签,例如模块名或当前范围 */
|
|
130
|
+
eyebrow?: ReactNode;
|
|
131
|
+
/** 页面主标题 */
|
|
132
|
+
title: ReactNode;
|
|
133
|
+
/** 页面说明文案 */
|
|
134
|
+
description?: ReactNode;
|
|
135
|
+
/** 标题旁的状态、徽标或计数 */
|
|
136
|
+
badge?: ReactNode;
|
|
137
|
+
/** 面包屑、返回入口或路径区域 */
|
|
138
|
+
breadcrumb?: ReactNode;
|
|
139
|
+
/** 右侧主要操作区 */
|
|
140
|
+
actions?: ReactNode;
|
|
141
|
+
/** 标题下方的元信息,例如更新时间、所有者、环境 */
|
|
142
|
+
meta?: ReactNode;
|
|
143
|
+
/** 页头底部扩展区,例如 tabs 或筛选入口 */
|
|
144
|
+
children?: ReactNode;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* 后台页面标题模式
|
|
148
|
+
* @example
|
|
149
|
+
* <PageHeader
|
|
150
|
+
* eyebrow="Storage"
|
|
151
|
+
* title="文件空间"
|
|
152
|
+
* description="管理项目文件、外链和访问策略。"
|
|
153
|
+
* actions={<Button>上传文件</Button>}
|
|
154
|
+
* />
|
|
155
|
+
*/
|
|
156
|
+
declare const PageHeader: react.ForwardRefExoticComponent<PageHeaderProps & react.RefAttributes<HTMLElement>>;
|
|
157
|
+
|
|
158
|
+
export { AdminShell, type AdminShellProps, ConfirmDialog, type ConfirmDialogProps, type ConfirmDialogVariant, CopyField, type CopyFieldProps, PageHeader, type PageHeaderProps, AdminShell as UGAdminShell, type AdminShellProps as UGAdminShellProps, ConfirmDialog as UGConfirmDialog, type ConfirmDialogProps as UGConfirmDialogProps, type ConfirmDialogVariant as UGConfirmDialogVariant, CopyField as UGCopyField, type CopyFieldProps as UGCopyFieldProps, PageHeader as UGPageHeader, type PageHeaderProps as UGPageHeaderProps };
|