{"version":3,"sources":["../src/components/ActionColumn/index.tsx","../src/components/CustomFieldAdapter/index.tsx","../src/components/DataTableCard/index.tsx","../src/components/DetailPageLayout/index.tsx","../src/components/DynamicFormModal/form-rules.ts","../src/components/DynamicFormModal/field-renderer.tsx","../src/components/DynamicFormModal/index.tsx","../src/components/ErrorBoundary/index.tsx","../src/components/GlobalAntdHolder/index.tsx","../src/components/PageContainer/index.tsx","../src/components/RouteGuard/index.tsx","../src/components/SearchFilterBar/index.tsx","../src/components/StatCard/index.tsx","../src/components/StatusShow/index.tsx","../src/components/StatusTag/index.tsx","../src/components/templates/RecycleBinModal/index.tsx","../src/components/UserAvatar/index.tsx"],"names":["jsx","Button","Popconfirm","App","theme","useMemo","jsxs","Space","Dropdown","Fragment","Card","Table","Empty","Breadcrumb","ArrowLeftOutlined","Spin","Tooltip","QuestionCircleOutlined","Form","Input","InputNumber","Select","Radio","Checkbox","Switch","DatePicker","createLogger","useState","useRef","useEffect","useCallback","Modal","Row","Col","React","Result","Tabs","SearchOutlined","DownOutlined","UpOutlined","StatCard","Skeleton","Tag","logger","useLatestRef","UserAvatar","Avatar"],"mappings":"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","file":"chunk-U674U77S.cjs","sourcesContent":["/**\n * 表格操作列组件\n *\n * 通用的表格操作列，支持主操作按钮 + \"更多\" 下拉菜单。\n * 内置确认弹窗、onSuccess 自动回调和预设 action builder（详情/编辑/删除/切换状态）。\n */\n\nimport type { MenuProps } from 'antd';\nimport { App, Button, Dropdown, Popconfirm, Space, theme } from 'antd';\nimport type { MessageInstance } from 'antd/es/message/interface';\nimport type React from 'react';\nimport { useMemo } from 'react';\n\n/**\n * 操作项定义\n */\nexport interface ActionItem {\n  /** 唯一标识 */\n  key: string;\n  /** 显示文本 */\n  label: string;\n  /** 点击回调 */\n  onClick?: () => void;\n  /** 类型：primary 显示为主按钮，默认为链接按钮 */\n  type?: 'primary' | 'link' | 'text' | 'default';\n  /** 危险样式 */\n  danger?: boolean;\n  /** 是否禁用 */\n  disabled?: boolean;\n  /** 是否隐藏 */\n  hidden?: boolean;\n  /** 图标 */\n  icon?: React.ReactNode;\n  /** 需要确认弹窗 */\n  confirm?: {\n    title: string;\n    description?: string;\n    /** 确认回调，支持异步。配合 onSuccess 使用时：解析即成功、抛异常即失败 */\n    onConfirm: () => void | Promise<void>;\n    /** 操作成功后的提示消息（需配合 ActionColumnProps.onSuccess 使用） */\n    successMessage?: string;\n  };\n}\n\n/**\n * ActionColumn 组件属性\n */\nexport interface ActionColumnProps {\n  /** 主操作（直接展示为按钮） */\n  actions?: ActionItem[];\n  /** 更多操作（收纳到下拉菜单中） */\n  moreActions?: ActionItem[];\n  /** \"更多\" 按钮文本，默认 '更多' */\n  moreText?: string;\n  /** 按钮大小 */\n  size?: 'small' | 'middle' | 'large';\n  /** 自定义间距 */\n  gap?: number;\n  /** confirm 操作成功后的回调（用于刷新列表等） */\n  onSuccess?: () => void;\n  /** 操作失败时的默认提示消息，默认 '操作失败' */\n  defaultErrorMessage?: string;\n}\n\n// ======================== onSuccess 包装 ========================\n\n/**\n * 包装 confirm.onConfirm，操作成功后自动提示并调用 onSuccess\n */\nfunction wrapActionsWithOnSuccess(\n  actions: ActionItem[] | undefined,\n  onSuccess: (() => void) | undefined,\n  message: MessageInstance,\n  defaultErrorMessage: string,\n): ActionItem[] | undefined {\n  if (!actions || !onSuccess) return actions;\n\n  return actions.map((action) => {\n    if (!action.confirm?.onConfirm) return action;\n\n    const originalOnConfirm = action.confirm.onConfirm;\n    const successMsg = action.confirm.successMessage;\n\n    return {\n      ...action,\n      confirm: {\n        ...action.confirm,\n        onConfirm: async () => {\n          try {\n            await originalOnConfirm();\n            if (successMsg) {\n              message.success(successMsg);\n            }\n            onSuccess();\n          } catch (error) {\n            const msg =\n              error instanceof Error ? error.message : defaultErrorMessage;\n            message.error(msg);\n          }\n        },\n      },\n    };\n  });\n}\n\n/**\n * 渲染单个操作按钮\n */\nfunction renderAction(action: ActionItem, size?: 'small' | 'middle' | 'large') {\n  if (action.hidden) return null;\n\n  // 正确映射所有支持的按钮类型\n  const buttonType = action.type ?? 'link';\n  const isCompact = buttonType === 'link' || buttonType === 'text';\n\n  const button = (\n    <Button\n      key={action.key}\n      type={buttonType}\n      danger={action.danger}\n      disabled={action.disabled}\n      icon={action.icon}\n      size={size ?? 'small'}\n      onClick={action.confirm ? undefined : action.onClick}\n      style={isCompact ? { padding: '0 4px' } : undefined}\n    >\n      {action.label}\n    </Button>\n  );\n\n  if (action.confirm) {\n    return (\n      <Popconfirm\n        key={action.key}\n        title={action.confirm.title}\n        description={action.confirm.description}\n        onConfirm={action.confirm.onConfirm}\n      >\n        {button}\n      </Popconfirm>\n    );\n  }\n\n  return button;\n}\n\n/**\n * 表格操作列组件\n *\n * @example\n * ```tsx\n * <ActionColumn\n *   actions={[\n *     { key: 'edit', label: '编辑', onClick: () => goEdit(record.id) },\n *     { key: 'view', label: '查看', onClick: () => goDetail(record.id) },\n *   ]}\n *   moreActions={[\n *     {\n *       key: 'delete', label: '删除', danger: true,\n *       confirm: {\n *         title: '确定要删除吗？',\n *         onConfirm: () => handleDelete(record.id),\n *       },\n *     },\n *   ]}\n * />\n * ```\n */\nexport function ActionColumn({\n  actions = [],\n  moreActions = [],\n  moreText = '更多',\n  size = 'small',\n  gap = 0,\n  onSuccess,\n  defaultErrorMessage = '操作失败',\n}: ActionColumnProps): React.ReactElement | null {\n  const { message } = App.useApp();\n  const { token } = theme.useToken();\n\n  const wrappedActions = useMemo(\n    () =>\n      wrapActionsWithOnSuccess(\n        actions,\n        onSuccess,\n        message,\n        defaultErrorMessage,\n      ),\n    [actions, onSuccess, message, defaultErrorMessage],\n  );\n  const wrappedMoreActions = useMemo(\n    () =>\n      wrapActionsWithOnSuccess(\n        moreActions,\n        onSuccess,\n        message,\n        defaultErrorMessage,\n      ),\n    [moreActions, onSuccess, message, defaultErrorMessage],\n  );\n\n  const visibleActions = (wrappedActions ?? actions).filter((a) => !a.hidden);\n  const visibleMoreActions = (wrappedMoreActions ?? moreActions).filter(\n    (a) => !a.hidden,\n  );\n\n  const menuItems: MenuProps['items'] = useMemo(() => {\n    return visibleMoreActions.map((action) => {\n      if (action.confirm) {\n        return {\n          key: action.key,\n          label: (\n            <Popconfirm\n              title={action.confirm.title}\n              description={action.confirm.description}\n              onConfirm={action.confirm.onConfirm}\n            >\n              <div\n                style={{\n                  color: action.danger ? token.colorError : undefined,\n                  padding: '5px 12px',\n                  margin: '-5px -12px',\n                }}\n              >\n                {action.icon}\n                {action.icon ? ' ' : ''}\n                {action.label}\n              </div>\n            </Popconfirm>\n          ),\n          disabled: action.disabled,\n        };\n      }\n\n      return {\n        key: action.key,\n        label: (\n          <div style={{ color: action.danger ? token.colorError : undefined }}>\n            {action.icon}\n            {action.icon ? ' ' : ''}\n            {action.label}\n          </div>\n        ),\n        disabled: action.disabled,\n        onClick: action.onClick,\n      };\n    });\n  }, [visibleMoreActions, token.colorError]);\n\n  if (visibleActions.length === 0 && visibleMoreActions.length === 0) {\n    return null;\n  }\n\n  return (\n    <Space size={gap}>\n      {visibleActions.map((action) => renderAction(action, size))}\n      {visibleMoreActions.length > 0 && (\n        <Dropdown menu={{ items: menuItems }} trigger={['click']}>\n          <Button type=\"link\" size={size} style={{ padding: '0 4px' }}>\n            {moreText}\n          </Button>\n        </Dropdown>\n      )}\n    </Space>\n  );\n}\n\n// ======================== Action Builders ========================\n\n/**\n * 创建\"查看详情\"操作\n */\nexport function createViewAction(\n  onClick: () => void,\n  options?: Partial<ActionItem>,\n): ActionItem {\n  return {\n    key: 'view',\n    label: '查看',\n    onClick,\n    ...options,\n  };\n}\n\n/**\n * 创建\"编辑\"操作\n */\nexport function createEditAction(\n  onClick: () => void,\n  options?: Partial<ActionItem>,\n): ActionItem {\n  return {\n    key: 'edit',\n    label: '编辑',\n    onClick,\n    ...options,\n  };\n}\n\n/**\n * 创建\"删除\"操作（带确认弹窗）\n */\nexport function createDeleteAction(\n  onConfirm: () => void,\n  options?: Partial<ActionItem> & { confirmTitle?: string },\n): ActionItem {\n  return {\n    key: 'delete',\n    label: '删除',\n    danger: true,\n    confirm: {\n      title: options?.confirmTitle ?? '确定要删除此记录吗？',\n      onConfirm,\n    },\n    ...options,\n  };\n}\n\n/**\n * 创建\"切换状态\"操作\n *\n * @param currentEnabled - 当前是否为启用状态\n * @param onConfirm - 确认切换回调\n * @param options - 覆盖默认属性（可通过 label / confirm.title 自定义文案）\n * @param labels - 自定义文案 (enableLabel, disableLabel, enableConfirm, disableConfirm)\n */\nexport function createToggleStatusAction(\n  currentEnabled: boolean,\n  onConfirm: () => void,\n  options?: Partial<ActionItem>,\n  labels?: {\n    enableLabel?: string;\n    disableLabel?: string;\n    enableConfirm?: string;\n    disableConfirm?: string;\n  },\n): ActionItem {\n  const enableLabel = labels?.enableLabel ?? '启用';\n  const disableLabel = labels?.disableLabel ?? '禁用';\n  const enableConfirm = labels?.enableConfirm ?? '确定要启用吗？';\n  const disableConfirm = labels?.disableConfirm ?? '确定要禁用吗？';\n\n  return {\n    key: 'toggleStatus',\n    label: currentEnabled ? disableLabel : enableLabel,\n    danger: currentEnabled,\n    confirm: {\n      title: currentEnabled ? disableConfirm : enableConfirm,\n      onConfirm,\n    },\n    ...options,\n  };\n}\n","/**\n * 自定义字段适配器\n *\n * 将 `(value, onChange) => ReactNode` 形式的自定义渲染函数\n * 适配为 antd Form.Item 所需的受控组件接口。\n *\n * 被 DynamicFormModal 和 SearchFilterBar 共同使用。\n */\n\nimport type React from 'react';\n\n/**\n * CustomFieldAdapter 属性\n */\nexport interface CustomFieldAdapterProps {\n  /** 自定义渲染函数 */\n  render: (value: unknown, onChange: (v: unknown) => void) => React.ReactNode;\n  /** 受控值 (由 Form.Item 注入) */\n  value?: unknown;\n  /** 变更回调 (由 Form.Item 注入) */\n  onChange?: (v: unknown) => void;\n}\n\n/**\n * 自定义字段适配器 — 将 render 函数适配为受控组件\n *\n * @example\n * ```tsx\n * <Form.Item name=\"custom\">\n *   <CustomFieldAdapter\n *     render={(value, onChange) => (\n *       <MyCustomInput value={value} onChange={onChange} />\n *     )}\n *   />\n * </Form.Item>\n * ```\n */\nexport function CustomFieldAdapter({\n  render,\n  value,\n  onChange,\n}: CustomFieldAdapterProps): React.ReactElement {\n  return <>{render(value, onChange ?? (() => {}))}</>;\n}\n","/**\n * 数据表格卡片组件\n *\n * 用卡片容器包装的数据表格，支持空状态展示和移动端适配。\n */\n\nimport type { CardProps } from 'antd';\nimport { Card, Empty, Table } from 'antd';\nimport type { ColumnsType, TableProps } from 'antd/es/table';\nimport type React from 'react';\n\n/**\n * DataTableCard 组件属性\n */\nexport interface DataTableCardProps<T> {\n  /** 卡片标题 */\n  title?: React.ReactNode;\n  /** 卡片右上角额外内容 */\n  extra?: React.ReactNode;\n  /** 表格列定义 */\n  columns: ColumnsType<T>;\n  /** 表格数据 */\n  dataSource: T[];\n  /** 行唯一标识字段，默认 'id' */\n  rowKey?: string | ((record: T) => string);\n  /** 加载中 */\n  loading?: boolean;\n  /** 空状态描述 */\n  emptyText?: string;\n  /** 表格最大高度（启用垂直滚动） */\n  maxHeight?: number;\n  /** 表格其他属性（可覆盖默认的 pagination={false}、size=\"small\" 等） */\n  tableProps?: Omit<\n    TableProps<T>,\n    'columns' | 'dataSource' | 'loading' | 'rowKey'\n  >;\n  /** 卡片其他属性 */\n  cardProps?: Omit<CardProps, 'title' | 'extra'>;\n  /** 自定义样式 */\n  style?: React.CSSProperties;\n  /** 自定义类名 */\n  className?: string;\n}\n\n/**\n * 数据表格卡片组件\n *\n * @example\n * ```tsx\n * <DataTableCard\n *   title=\"最近订单\"\n *   extra={<Button type=\"link\">查看全部</Button>}\n *   columns={orderColumns}\n *   dataSource={recentOrders}\n *   loading={loading}\n *   emptyText=\"暂无订单数据\"\n *   maxHeight={400}\n * />\n * ```\n */\nexport function DataTableCard<T extends object>({\n  title,\n  extra,\n  columns,\n  dataSource,\n  rowKey = 'id',\n  loading = false,\n  emptyText = '暂无数据',\n  maxHeight,\n  tableProps,\n  cardProps,\n  style,\n  className,\n}: DataTableCardProps<T>): React.ReactElement {\n  return (\n    <Card\n      title={title}\n      extra={extra}\n      style={style}\n      className={className}\n      {...cardProps}\n    >\n      <Table<T>\n        columns={columns}\n        dataSource={dataSource}\n        rowKey={rowKey}\n        loading={loading}\n        pagination={false}\n        size=\"small\"\n        locale={{\n          emptyText: (\n            <Empty\n              description={emptyText}\n              image={Empty.PRESENTED_IMAGE_SIMPLE}\n            />\n          ),\n        }}\n        scroll={\n          maxHeight ? { y: maxHeight, x: 'max-content' } : { x: 'max-content' }\n        }\n        {...tableProps}\n      />\n    </Card>\n  );\n}\n","/**\n * 详情页布局组件\n *\n * @experimental 此组件尚未在消费项目中广泛使用，API 可能调整。\n *\n * 适用于详情/表单页（create/edit/view 模式）。\n * 如果是列表页容器，请使用 {@link PageContainer}。\n *\n * 封装三个项目中通用的详情/表单页布局模式:\n * - 面包屑导航\n * - 页面标题 + 副标题 + 操作按钮\n * - 内容区域 (Card 包裹)\n * - 支持 create / edit / view 三种模式\n * - 返回按钮\n */\n\nimport { ArrowLeftOutlined } from '@ant-design/icons';\nimport { Breadcrumb, Button, Card, Space, Spin, theme } from 'antd';\nimport type React from 'react';\n\n// ===== 类型定义 =====\n\n/**\n * 页面模式\n */\nexport type DetailPageMode = 'create' | 'edit' | 'view';\n\n/**\n * 详情页面包屑项\n */\nexport interface DetailBreadcrumbItem {\n  /** 显示文本 */\n  title: string;\n  /** 链接路径 */\n  path?: string;\n}\n\n/**\n * DetailPageLayout 属性\n */\nexport interface DetailPageLayoutProps {\n  /** 页面模式 */\n  mode?: DetailPageMode;\n  /** 页面标题 (不传则根据 mode 自动生成) */\n  title?: React.ReactNode;\n  /** 副标题 */\n  subtitle?: React.ReactNode;\n  /** 面包屑项 */\n  breadcrumb?: DetailBreadcrumbItem[];\n  /** 右上角操作按钮区域 */\n  actions?: React.ReactNode;\n  /** 底部操作栏 (如保存/取消按钮) */\n  footer?: React.ReactNode;\n  /** 是否显示返回按钮, 默认 true */\n  showBack?: boolean;\n  /** 返回按钮点击回调 */\n  onBack?: () => void;\n  /** 返回按钮的无障碍标签，默认 '返回' */\n  backAriaLabel?: string;\n  /** 面包屑导航回调 (传入 path) */\n  onNavigate?: (path: string) => void;\n  /** 是否加载中 */\n  loading?: boolean;\n  /** 自定义类名 */\n  className?: string;\n  /** 自定义样式 */\n  style?: React.CSSProperties;\n  /** 子内容 */\n  children: React.ReactNode;\n}\n\n// ===== 模式标题映射 =====\n\nconst MODE_TITLES: Record<DetailPageMode, string> = {\n  create: '新建',\n  edit: '编辑',\n  view: '详情',\n};\n\n// ===== 组件实现 =====\n\n/**\n * 详情页布局组件\n *\n * @example\n * ```tsx\n * // 基础用法 — 编辑页\n * <DetailPageLayout\n *   mode=\"edit\"\n *   title=\"编辑用户\"\n *   breadcrumb={[\n *     { title: '用户管理', path: '/users' },\n *     { title: '编辑' },\n *   ]}\n *   onBack={() => history.back()}\n *   footer={\n *     <Space>\n *       <Button onClick={() => history.back()}>取消</Button>\n *       <Button type=\"primary\" loading={submitting} onClick={handleSave}>保存</Button>\n *     </Space>\n *   }\n * >\n *   <Form form={form} layout=\"vertical\">\n *     ...\n *   </Form>\n * </DetailPageLayout>\n *\n * // 详情页 (只读)\n * <DetailPageLayout\n *   mode=\"view\"\n *   title=\"用户详情\"\n *   actions={<Button onClick={() => goEdit(id)}>编辑</Button>}\n *   loading={loading}\n * >\n *   <Descriptions>...</Descriptions>\n * </DetailPageLayout>\n * ```\n */\nexport function DetailPageLayout(props: DetailPageLayoutProps) {\n  const { token } = theme.useToken();\n  const {\n    mode = 'view',\n    title,\n    subtitle,\n    breadcrumb,\n    actions,\n    footer,\n    showBack = true,\n    onBack,\n    backAriaLabel = '返回',\n    onNavigate,\n    loading = false,\n    className,\n    style,\n    children,\n  } = props;\n\n  const displayTitle = title ?? MODE_TITLES[mode];\n\n  // 构建 antd Breadcrumb items\n  const breadcrumbItems = breadcrumb?.map((item, index) => {\n    const isLast = index === breadcrumb.length - 1;\n    if (item.path && !isLast) {\n      const navigatePath = item.path;\n      return {\n        key: `${index}-${item.title}`,\n        title: (\n          <a\n            href={navigatePath}\n            onClick={(e) => {\n              e.preventDefault();\n              if (onNavigate) {\n                onNavigate(navigatePath);\n              } else {\n                onBack?.();\n              }\n            }}\n          >\n            {item.title}\n          </a>\n        ),\n      };\n    }\n    return { key: `${index}-${item.title}`, title: item.title };\n  });\n\n  return (\n    <div\n      className={className}\n      style={{\n        display: 'flex',\n        flexDirection: 'column',\n        gap: token.marginMD,\n        ...style,\n      }}\n    >\n      {/* 面包屑 */}\n      {breadcrumbItems && breadcrumbItems.length > 0 && (\n        <Breadcrumb items={breadcrumbItems} />\n      )}\n\n      {/* 页面头部 */}\n      <div\n        style={{\n          display: 'flex',\n          alignItems: 'center',\n          justifyContent: 'space-between',\n          flexWrap: 'wrap',\n          gap: token.marginSM,\n        }}\n      >\n        <Space align=\"center\">\n          {showBack && onBack && (\n            <Button\n              type=\"text\"\n              icon={<ArrowLeftOutlined />}\n              onClick={onBack}\n              aria-label={backAriaLabel}\n            />\n          )}\n          <div>\n            <h2\n              style={{\n                margin: 0,\n                fontSize: token.fontSizeHeading4,\n                fontWeight: 600,\n                lineHeight: 1.4,\n              }}\n            >\n              {displayTitle}\n            </h2>\n            {subtitle && (\n              <div\n                style={{\n                  fontSize: token.fontSize,\n                  color: token.colorTextTertiary,\n                  marginTop: token.marginXXS,\n                }}\n              >\n                {subtitle}\n              </div>\n            )}\n          </div>\n        </Space>\n        {actions && <Space>{actions}</Space>}\n      </div>\n\n      {/* 内容区域 */}\n      <Spin spinning={loading}>\n        <Card>{children}</Card>\n      </Spin>\n\n      {/* 底部操作栏 */}\n      {footer && (\n        <Card size=\"small\">\n          <div\n            style={{\n              display: 'flex',\n              justifyContent: 'flex-end',\n              gap: token.marginXS,\n            }}\n          >\n            {footer}\n          </div>\n        </Card>\n      )}\n    </div>\n  );\n}\n","/**\n * 动态表单弹窗 — 校验规则转换\n */\n\nimport type { DynamicFormField } from './types';\n\n/** 默认必填消息模板 */\nconst DEFAULT_REQUIRED_MESSAGE = '请输入{label}';\n\n/**\n * 将 DynamicFieldRule 转换为 antd Form.Item 的 rules\n *\n * @param field - 表单字段配置\n * @param requiredMessage - 自定义必填消息模板，使用 `{label}` 占位符\n */\nexport function toAntdRules(field: DynamicFormField, requiredMessage?: string) {\n  if (!field.rules?.length) return undefined;\n\n  const msgTemplate = requiredMessage ?? DEFAULT_REQUIRED_MESSAGE;\n\n  return field.rules.map((rule) => {\n    // 自定义 validator 需要适配 antd 的异步校验签名\n    if (rule.validator) {\n      const userValidator = rule.validator;\n      return {\n        validator(_: unknown, value: unknown) {\n          const errMsg = userValidator(value);\n          return errMsg ? Promise.reject(new Error(errMsg)) : Promise.resolve();\n        },\n      };\n    }\n\n    const antdRule: Record<string, unknown> = {};\n    if (rule.required) antdRule.required = true;\n    if (rule.message) antdRule.message = rule.message;\n    if (rule.min !== undefined) antdRule.min = rule.min;\n    if (rule.max !== undefined) antdRule.max = rule.max;\n    if (rule.pattern) antdRule.pattern = rule.pattern;\n\n    // 为 required 规则提供默认消息\n    if (rule.required && !rule.message) {\n      antdRule.message = msgTemplate.replace('{label}', field.label);\n    }\n\n    return antdRule;\n  });\n}\n","/**\n * 动态表单弹窗 — 字段渲染\n */\n\nimport { QuestionCircleOutlined } from '@ant-design/icons';\nimport {\n  Checkbox,\n  DatePicker,\n  Form,\n  Input,\n  InputNumber,\n  Radio,\n  Select,\n  Switch,\n  Tooltip,\n  theme,\n} from 'antd';\nimport type React from 'react';\nimport { CustomFieldAdapter } from '../CustomFieldAdapter';\nimport { toAntdRules } from './form-rules';\nimport type { DynamicFormField } from './types';\n\n/**\n * 渲染完整的表单项（label + input）\n */\nexport function FormItemRenderer({\n  field,\n  requiredMessage,\n}: {\n  field: DynamicFormField;\n  /** 自定义必填消息模板，使用 `{label}` 占位符 */\n  requiredMessage?: string;\n}): React.ReactNode {\n  const { token } = theme.useToken();\n\n  const label = field.tooltip ? (\n    <span>\n      {field.label}{' '}\n      <Tooltip title={field.tooltip}>\n        <QuestionCircleOutlined style={{ color: token.colorTextQuaternary }} />\n      </Tooltip>\n    </span>\n  ) : (\n    field.label\n  );\n\n  // switch 特殊处理 valuePropName\n  const extraProps: Record<string, unknown> = {};\n  if (field.type === 'switch') {\n    extraProps.valuePropName = 'checked';\n  }\n\n  return (\n    <Form.Item\n      name={field.name}\n      label={label}\n      rules={toAntdRules(field, requiredMessage)}\n      {...extraProps}\n    >\n      <FieldInput field={field} />\n    </Form.Item>\n  );\n}\n\n/**\n * 渲染字段输入控件\n */\nfunction FieldInput({ field }: { field: DynamicFormField }): React.ReactNode {\n  switch (field.type) {\n    case 'input':\n      return (\n        <Input\n          placeholder={field.placeholder ?? `请输入${field.label}`}\n          disabled={field.disabled}\n        />\n      );\n\n    case 'password':\n      return (\n        <Input.Password\n          placeholder={field.placeholder ?? `请输入${field.label}`}\n          disabled={field.disabled}\n        />\n      );\n\n    case 'textarea':\n      return (\n        <Input.TextArea\n          placeholder={field.placeholder ?? `请输入${field.label}`}\n          disabled={field.disabled}\n          rows={field.rows ?? 3}\n        />\n      );\n\n    case 'number':\n      return (\n        <InputNumber\n          style={{ width: '100%' }}\n          placeholder={field.placeholder ?? `请输入${field.label}`}\n          disabled={field.disabled}\n        />\n      );\n\n    case 'select':\n      return (\n        <Select\n          placeholder={field.placeholder ?? `请选择${field.label}`}\n          disabled={field.disabled}\n          options={field.options?.map((opt) => ({\n            label: opt.label,\n            value: opt.value,\n            disabled: opt.disabled,\n          }))}\n          allowClear\n        />\n      );\n\n    case 'radio':\n      return (\n        <Radio.Group disabled={field.disabled}>\n          {field.options?.map((opt) => (\n            <Radio\n              key={String(opt.value)}\n              value={opt.value}\n              disabled={opt.disabled}\n            >\n              {opt.label}\n            </Radio>\n          ))}\n        </Radio.Group>\n      );\n\n    case 'checkbox':\n      return (\n        <Checkbox.Group disabled={field.disabled}>\n          {field.options?.map((opt) => (\n            <Checkbox\n              key={String(opt.value)}\n              value={opt.value}\n              disabled={opt.disabled}\n            >\n              {opt.label}\n            </Checkbox>\n          ))}\n        </Checkbox.Group>\n      );\n\n    case 'switch':\n      return <Switch disabled={field.disabled} />;\n\n    case 'date':\n      return <DatePicker style={{ width: '100%' }} disabled={field.disabled} />;\n\n    case 'dateRange':\n      return (\n        <DatePicker.RangePicker\n          style={{ width: '100%' }}\n          disabled={field.disabled}\n        />\n      );\n\n    case 'custom':\n      if (field.render) {\n        return <CustomFieldAdapter render={field.render} />;\n      }\n      return null;\n\n    default:\n      return null;\n  }\n}\n","/**\n * 动态表单弹窗组件\n *\n * JSON 配置驱动的表单弹窗，通过 fields 配置即可生成完整的表单弹窗。\n * 使用 antd Modal + Form + 标准输入组件，确保与 antd 主题一致。\n */\n\nimport { Col, Form, Modal, Row } from 'antd';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { createLogger } from '../../utils/logger';\nimport { FormItemRenderer } from './field-renderer';\nimport type { DynamicFormModalProps } from './types';\n\nconst logger = createLogger({ prefix: 'DynamicFormModal' });\n\n// 重新导出类型供外部使用\nexport type {\n  DynamicFieldType,\n  DynamicFormField,\n  DynamicFormModalProps,\n} from './types';\n\n/**\n * 动态表单弹窗组件\n *\n * @example\n * ```tsx\n * <DynamicFormModal\n *   open={visible}\n *   title=\"新增用户\"\n *   fields={[\n *     { name: 'name', label: '姓名', type: 'input', rules: [{ required: true }] },\n *     { name: 'email', label: '邮箱', type: 'input', rules: [{ pattern: /^\\S+@\\S+$/, message: '邮箱格式不正确' }] },\n *     { name: 'role', label: '角色', type: 'select', options: [\n *       { label: '管理员', value: 'admin' },\n *       { label: '用户', value: 'user' },\n *     ], rules: [{ required: true }] },\n *     { name: 'status', label: '启用', type: 'switch', defaultValue: true },\n *     { name: 'remark', label: '备注', type: 'textarea', rows: 3 },\n *   ]}\n *   onSubmit={async (values) => {\n *     const res = await createUser(values);\n *     return isApiSuccess(res);\n *   }}\n *   onCancel={() => setVisible(false)}\n * />\n * ```\n */\nexport function DynamicFormModal(props: DynamicFormModalProps) {\n  const {\n    open,\n    title,\n    fields,\n    initialValues,\n    onSubmit,\n    onCancel,\n    onError,\n    okText,\n    cancelText,\n    width = 520,\n    destroyOnClose = true,\n    className,\n    requiredMessage,\n  } = props;\n\n  const [form] = Form.useForm();\n  const [loading, setLoading] = useState(false);\n  const loadingRef = useRef(false);\n\n  // open: false -> true 时初始化表单\n  const prevOpenRef = useRef(false);\n  useEffect(() => {\n    if (open && !prevOpenRef.current) {\n      // 构建初始值\n      const initVals: Record<string, unknown> = {};\n      for (const field of fields) {\n        if (initialValues?.[field.name] !== undefined) {\n          initVals[field.name] = initialValues[field.name];\n        } else if (field.defaultValue !== undefined) {\n          initVals[field.name] = field.defaultValue;\n        }\n      }\n      form.resetFields();\n      form.setFieldsValue(initVals);\n    }\n    prevOpenRef.current = open;\n  }, [open, fields, initialValues, form]);\n\n  const handleOk = useCallback(async () => {\n    if (loadingRef.current) return;\n\n    try {\n      loadingRef.current = true;\n      setLoading(true);\n\n      const values = await form.validateFields();\n      const result = await onSubmit(values);\n      if (result !== false) {\n        onCancel();\n      }\n    } catch (err) {\n      // 表单校验失败不算错误（antd Form.validateFields 抛出的 errorFields 对象）\n      if (err && typeof err === 'object' && 'errorFields' in err) {\n        return;\n      }\n      // onSubmit 抛出的异常由 onError 回调处理，避免 unhandled rejection\n      // 注意：如果未提供 onError，用户无法感知提交失败，建议始终提供 onError 回调\n      if (onError) {\n        onError(err);\n      } else {\n        logger.error(\n          'Submit error (provide onError prop for user-facing feedback):',\n          err,\n        );\n      }\n    } finally {\n      loadingRef.current = false;\n      setLoading(false);\n    }\n  }, [form, onSubmit, onCancel, onError]);\n\n  return (\n    <Modal\n      title={title}\n      open={open}\n      onOk={handleOk}\n      onCancel={onCancel}\n      okText={okText}\n      cancelText={cancelText}\n      confirmLoading={loading}\n      width={width}\n      destroyOnClose={destroyOnClose}\n      className={className}\n    >\n      <Form form={form} layout=\"vertical\" autoComplete=\"off\">\n        <Row gutter={16}>\n          {fields.map((field) => {\n            if (field.hidden) return null;\n\n            // 联动依赖：用 Form.Item 的 noStyle + shouldUpdate 实现\n            if (field.dependencies?.length) {\n              const depFields = field.dependencies.map((d) => d.field);\n              return (\n                <Form.Item\n                  key={field.name}\n                  noStyle\n                  shouldUpdate={(prev, cur) =>\n                    depFields.some((f) => prev[f] !== cur[f])\n                  }\n                >\n                  {({ getFieldValue }) => {\n                    const allMet = field.dependencies?.every((dep) =>\n                      dep.condition(getFieldValue(dep.field)),\n                    );\n                    if (!allMet) return null;\n                    return (\n                      <Col span={field.span ?? 24}>\n                        <FormItemRenderer\n                          field={field}\n                          requiredMessage={requiredMessage}\n                        />\n                      </Col>\n                    );\n                  }}\n                </Form.Item>\n              );\n            }\n\n            return (\n              <Col key={field.name} span={field.span ?? 24}>\n                <FormItemRenderer\n                  field={field}\n                  requiredMessage={requiredMessage}\n                />\n              </Col>\n            );\n          })}\n        </Row>\n      </Form>\n    </Modal>\n  );\n}\n","/**\n * 错误边界组件\n *\n * 使用 antd Result 组件，支持 antd-style。\n */\n\nimport { Button, Result, theme } from 'antd';\nimport React from 'react';\n\n/**\n * ErrorBoundary 组件属性\n */\nexport interface ErrorBoundaryProps {\n  /** 子组件 */\n  children: React.ReactNode;\n  /** 自定义 fallback UI */\n  fallback?:\n    | React.ReactNode\n    | ((error: Error, reset: () => void) => React.ReactNode);\n  /** 错误回调 (用于上报) */\n  onError?: (error: Error, errorInfo: React.ErrorInfo) => void;\n  /** 重置回调 */\n  onReset?: () => void;\n  /** 自定义标题 */\n  title?: string;\n  /** 自定义描述 */\n  description?: string;\n  /**\n   * 是否显示错误详情\n   * - true: 始终显示\n   * - false: 不显示\n   * - 'auto': 默认不显示（可通过 showDetails 显式开启）\n   */\n  showDetails?: boolean | 'auto';\n  /** 刷新页面按钮文本，默认 '刷新页面' */\n  reloadText?: string;\n  /** 重试按钮文本，默认 '重试' */\n  retryText?: string;\n}\n\ninterface ErrorBoundaryState {\n  hasError: boolean;\n  error: Error | null;\n  errorInfo: React.ErrorInfo | null;\n}\n\n/**\n * 错误边界组件\n *\n * 捕获子组件渲染错误，显示 fallback UI 并支持错误恢复。\n *\n * @example\n * ```tsx\n * // 基础用法\n * <ErrorBoundary>\n *   <MyComponent />\n * </ErrorBoundary>\n *\n * // 自定义 fallback\n * <ErrorBoundary\n *   fallback={(error, reset) => (\n *     <div>\n *       <p>出错了: {error.message}</p>\n *       <button onClick={reset}>重试</button>\n *     </div>\n *   )}\n *   onError={(error) => reportError(error)}\n * >\n *   <MyComponent />\n * </ErrorBoundary>\n * ```\n */\nexport class ErrorBoundary extends React.Component<\n  ErrorBoundaryProps,\n  ErrorBoundaryState\n> {\n  constructor(props: ErrorBoundaryProps) {\n    super(props);\n    this.state = { hasError: false, error: null, errorInfo: null };\n  }\n\n  static getDerivedStateFromError(error: Error): Partial<ErrorBoundaryState> {\n    return { hasError: true, error };\n  }\n\n  componentDidCatch(error: Error, errorInfo: React.ErrorInfo): void {\n    this.setState({ errorInfo });\n    this.props.onError?.(error, errorInfo);\n  }\n\n  handleReset = (): void => {\n    this.setState({ hasError: false, error: null, errorInfo: null });\n    this.props.onReset?.();\n  };\n\n  handleReload = (): void => {\n    window.location.reload();\n  };\n\n  shouldShowDetails(): boolean {\n    const { showDetails = 'auto' } = this.props;\n    if (showDetails === 'auto') {\n      return false;\n    }\n    return showDetails;\n  }\n\n  render(): React.ReactNode {\n    if (!this.state.hasError) {\n      return this.props.children;\n    }\n\n    const { error, errorInfo } = this.state;\n    const { fallback, title, description, reloadText, retryText } = this.props;\n\n    // 自定义 fallback\n    if (fallback !== undefined && fallback !== null) {\n      if (typeof fallback === 'function' && error) {\n        return fallback(error, this.handleReset) as React.ReactNode;\n      }\n      if (typeof fallback !== 'function') {\n        return fallback as React.ReactNode;\n      }\n    }\n\n    // 默认 fallback UI\n    return (\n      <Result\n        status=\"error\"\n        title={title || '页面错误'}\n        subTitle={description || '抱歉，页面渲染时发生了错误'}\n        extra={[\n          <Button key=\"reload\" type=\"primary\" onClick={this.handleReload}>\n            {reloadText ?? '刷新页面'}\n          </Button>,\n          <Button key=\"reset\" onClick={this.handleReset}>\n            {retryText ?? '重试'}\n          </Button>,\n        ]}\n      >\n        {this.shouldShowDetails() && error && (\n          <ErrorDetails\n            error={error}\n            componentStack={errorInfo?.componentStack ?? undefined}\n          />\n        )}\n      </Result>\n    );\n  }\n}\n\n/**\n * 错误详情展示（函数组件，可使用 theme token）\n */\nfunction ErrorDetails({\n  error,\n  componentStack,\n}: {\n  error: Error;\n  componentStack?: string;\n}) {\n  const { token } = theme.useToken();\n\n  return (\n    <div\n      style={{\n        textAlign: 'left',\n        padding: token.padding,\n        background: token.colorBgLayout,\n        borderRadius: token.borderRadiusSM,\n        marginTop: token.marginMD,\n        fontSize: token.fontSizeSM,\n        fontFamily: 'monospace',\n        maxHeight: 300,\n        overflow: 'auto',\n      }}\n    >\n      <div style={{ marginBottom: token.marginXS, fontWeight: 'bold' }}>\n        {error.message}\n      </div>\n      {componentStack && (\n        <pre\n          style={{\n            margin: 0,\n            whiteSpace: 'pre-wrap',\n            wordBreak: 'break-all',\n            color: token.colorTextSecondary,\n          }}\n        >\n          {componentStack}\n        </pre>\n      )}\n    </div>\n  );\n}\n","/**\n * 全局 antd 实例持有器\n *\n * 解决 antd v5 静态方法（message.success / Modal.confirm 等）无法消费\n * React Context（动态主题、国际化等）的问题。\n *\n * 使用方式：\n * 1. 在 <App> 内渲染 <GlobalAntdHolder />（已在 app.tsx 中完成）\n * 2. 组件内优先使用 App.useApp()\n * 3. 非组件代码（工具函数、请求拦截器等）使用本文件导出的 getMessageApi() 等\n *\n * **SSR / 微前端安全**: 组件卸载时自动清理全局引用，避免实例污染。\n */\nimport { App } from 'antd';\nimport type { MessageInstance } from 'antd/es/message/interface';\nimport type { ModalStaticFunctions } from 'antd/es/modal/confirm';\nimport type { NotificationInstance } from 'antd/es/notification/interface';\nimport type React from 'react';\nimport { useEffect } from 'react';\n\nlet messageApi: MessageInstance | null = null;\nlet notificationApi: NotificationInstance | null = null;\nlet modalApi: Omit<ModalStaticFunctions, 'warn'> | null = null;\n\n/** 获取全局 message 实例（上下文感知） */\nexport const getMessageApi = (): MessageInstance | null => messageApi;\n\n/** 获取全局 notification 实例（上下文感知） */\nexport const getNotificationApi = (): NotificationInstance | null =>\n  notificationApi;\n\n/** 获取全局 modal 实例（上下文感知） */\nexport const getModalApi = (): Omit<ModalStaticFunctions, 'warn'> | null =>\n  modalApi;\n\n/**\n * 重置全局实例引用（卸载 / 测试场景使用）\n */\nexport function resetGlobalAntdApis(): void {\n  messageApi = null;\n  notificationApi = null;\n  modalApi = null;\n}\n\n/**\n * 全局 antd 实例挂载组件\n *\n * 必须放置在 <App> 内部。捕获上下文感知的 message/notification/modal 实例，\n * 使非组件代码也能使用动态主题感知的 antd API。\n *\n * 组件卸载时自动清理全局引用，防止 SSR / 微前端场景下的实例污染。\n */\nexport const GlobalAntdHolder: React.FC = () => {\n  const { message, notification, modal } = App.useApp();\n\n  useEffect(() => {\n    messageApi = message;\n    notificationApi = notification;\n    modalApi = modal;\n\n    return () => {\n      messageApi = null;\n      notificationApi = null;\n      modalApi = null;\n    };\n  }, [message, notification, modal]);\n\n  return null;\n};\n","/**\n * 页面容器组件\n *\n * @experimental 此组件尚未在消费项目中广泛使用，API 可能调整。\n *\n * 适用于列表页/仪表盘等页面容器。\n * 如果是详情/表单页（create/edit/view），请使用 {@link DetailPageLayout}。\n *\n * 统一的页面包裹组件，提供:\n * - 页面标题 + 副标题\n * - 操作按钮区域\n * - Tab 切换\n * - 内容区域 (Card 或原始)\n */\n\nimport { Card, Tabs, theme } from 'antd';\nimport type React from 'react';\nimport { useCallback, useState } from 'react';\n\n// ===== 类型定义 =====\n\n/**\n * Tab 配置\n */\nexport interface PageTab {\n  /** Tab key */\n  key: string;\n  /** Tab 标签 */\n  tab: React.ReactNode;\n  /** 是否禁用 */\n  disabled?: boolean;\n}\n\n/**\n * PageContainer 属性\n */\nexport interface PageContainerProps {\n  /** 页面标题 */\n  title?: React.ReactNode;\n  /** 副标题 */\n  subtitle?: React.ReactNode;\n  /** 右上角操作区域 */\n  actions?: React.ReactNode;\n  /** Tab 配置 */\n  tabs?: PageTab[];\n  /** 当前激活的 Tab key */\n  activeTab?: string;\n  /** Tab 切换回调 */\n  onTabChange?: (key: string) => void;\n  /** 是否用 Card 包裹内容, 默认 true */\n  wrapCard?: boolean;\n  /** 页面间距, 默认 16 */\n  gap?: number;\n  /** 自定义类名 */\n  className?: string;\n  /** 自定义样式 */\n  style?: React.CSSProperties;\n  /** 头部额外内容 (显示在标题和操作按钮之间) */\n  headerExtra?: React.ReactNode;\n  /** 子内容 */\n  children: React.ReactNode;\n}\n\n// ===== 组件实现 =====\n\n/**\n * 页面容器组件\n *\n * @example\n * ```tsx\n * // 基础列表页\n * <PageContainer\n *   title=\"用户管理\"\n *   subtitle=\"管理系统中的所有用户\"\n *   actions={\n *     <Button type=\"primary\" onClick={goCreate}>新增用户</Button>\n *   }\n * >\n *   <ProTable ... />\n * </PageContainer>\n *\n * // 带 Tab 的页面\n * <PageContainer\n *   title=\"系统设置\"\n *   tabs={[\n *     { key: 'basic', tab: '基础设置' },\n *     { key: 'security', tab: '安全设置' },\n *     { key: 'notification', tab: '通知设置' },\n *   ]}\n *   activeTab={currentTab}\n *   onTabChange={setCurrentTab}\n * >\n *   {currentTab === 'basic' && <BasicSettings />}\n *   {currentTab === 'security' && <SecuritySettings />}\n *   {currentTab === 'notification' && <NotificationSettings />}\n * </PageContainer>\n *\n * // 无 Card 包裹 (自行管理布局)\n * <PageContainer title=\"仪表盘\" wrapCard={false}>\n *   <StatCardGrid items={statItems} />\n *   <ChartPanel />\n * </PageContainer>\n * ```\n */\nexport function PageContainer(props: PageContainerProps) {\n  const { token } = theme.useToken();\n  const {\n    title,\n    subtitle,\n    actions,\n    tabs,\n    activeTab: controlledActiveTab,\n    onTabChange,\n    wrapCard = true,\n    gap = 16,\n    className,\n    style,\n    headerExtra,\n    children,\n  } = props;\n\n  // 非受控 Tab 状态\n  const [internalTab, setInternalTab] = useState(tabs?.[0]?.key ?? '');\n  const activeTab = controlledActiveTab ?? internalTab;\n\n  const handleTabChange = useCallback(\n    (key: string) => {\n      if (onTabChange) {\n        onTabChange(key);\n      } else {\n        setInternalTab(key);\n      }\n    },\n    [onTabChange],\n  );\n\n  const hasHeader = !!(title || subtitle || actions);\n\n  // 将 PageTab[] 转换为 antd Tabs items 格式\n  const tabItems = tabs?.map((tab) => ({\n    key: tab.key,\n    label: tab.tab,\n    disabled: tab.disabled,\n  }));\n\n  return (\n    <div\n      className={className}\n      style={{ display: 'flex', flexDirection: 'column', gap, ...style }}\n    >\n      {/* 页头 */}\n      {hasHeader && (\n        <div\n          style={{\n            display: 'flex',\n            alignItems: 'flex-start',\n            justifyContent: 'space-between',\n            flexWrap: 'wrap',\n            gap: token.marginSM,\n          }}\n        >\n          <div style={{ flex: 1 }}>\n            {title && (\n              <h2\n                style={{\n                  margin: 0,\n                  fontSize: token.fontSizeHeading4,\n                  fontWeight: 600,\n                  lineHeight: 1.4,\n                }}\n              >\n                {title}\n              </h2>\n            )}\n            {subtitle && (\n              <div\n                style={{\n                  fontSize: token.fontSize,\n                  color: token.colorTextTertiary,\n                  marginTop: token.marginXXS,\n                }}\n              >\n                {subtitle}\n              </div>\n            )}\n          </div>\n          {headerExtra}\n          {actions && (\n            <div\n              style={{ display: 'flex', gap: token.marginXS, flexShrink: 0 }}\n            >\n              {actions}\n            </div>\n          )}\n        </div>\n      )}\n\n      {/* Tabs */}\n      {tabItems && tabItems.length > 0 && (\n        <Tabs\n          activeKey={activeTab}\n          onChange={handleTabChange}\n          items={tabItems}\n        />\n      )}\n\n      {/* 内容 */}\n      {wrapCard ? <Card>{children}</Card> : children}\n    </div>\n  );\n}\n","/**\n * 路由守卫组件\n *\n * @experimental 此组件尚未在消费项目中广泛使用，API 可能调整。\n * 大多数 UmiJS 项目倾向于在 wrappers 中直接使用 useModel + Navigate。\n *\n * UmiJS 路由守卫通用模式：\n * - AuthGuard: 登录验证，未登录重定向到登录页\n * - GuestGuard: 游客页面，已登录重定向到首页\n *\n */\n\nimport type React from 'react';\n\n/**\n * AuthGuard 组件属性\n */\nexport interface AuthGuardProps {\n  /** 是否已登录 */\n  isAuthenticated: boolean;\n  /** 登录页路径，默认 '/login' */\n  loginPath?: string;\n  /**\n   * 重定向渲染函数\n   *\n   * 返回一个 React 元素用于执行重定向（如 `<Navigate to={path} />`）。\n   *\n   * @param path - 目标路径\n   * @returns 重定向 React 元素\n   */\n  redirect: (path: string) => React.ReactElement;\n  /** 加载中组件（检查登录状态时展示） */\n  loading?: React.ReactNode;\n  /** 是否正在检查登录状态 */\n  checking?: boolean;\n  /** 子组件 */\n  children: React.ReactNode;\n}\n\n/**\n * 登录验证守卫\n *\n * 用于保护需要登录才能访问的路由，未登录时重定向到登录页。\n *\n * @example\n * ```tsx\n * // UmiJS wrappers/auth.tsx\n * import { Navigate, Outlet, useModel } from '@umijs/max';\n *\n * export default function AuthWrapper() {\n *   const { initialState } = useModel('@@initialState');\n *   return (\n *     <AuthGuard\n *       isAuthenticated={!!initialState?.currentUser}\n *       redirect={(path) => <Navigate to={path} replace />}\n *       loading={<PageLoading />}\n *       checking={initialState === undefined}\n *     >\n *       <Outlet />\n *     </AuthGuard>\n *   );\n * }\n * ```\n */\nexport function AuthGuard({\n  isAuthenticated,\n  loginPath = '/login',\n  redirect,\n  loading,\n  checking = false,\n  children,\n}: AuthGuardProps): React.ReactElement | null {\n  if (checking) {\n    return (loading as React.ReactElement) ?? null;\n  }\n\n  if (!isAuthenticated) {\n    return redirect(loginPath);\n  }\n\n  return children as React.ReactElement;\n}\n\n/**\n * GuestGuard 组件属性\n */\nexport interface GuestGuardProps {\n  /** 是否已登录 */\n  isAuthenticated: boolean;\n  /** 登录后跳转路径，默认 '/' */\n  homePath?: string;\n  /**\n   * 重定向渲染函数\n   *\n   * 返回一个 React 元素用于执行重定向（如 `<Navigate to={path} />`）。\n   *\n   * @param path - 目标路径\n   * @returns 重定向 React 元素\n   */\n  redirect: (path: string) => React.ReactElement;\n  /** 子组件 */\n  children: React.ReactNode;\n}\n\n/**\n * 游客页面守卫\n *\n * 用于登录/注册等页面，已登录用户访问时重定向到首页。\n *\n * @example\n * ```tsx\n * // UmiJS wrappers/guest.tsx\n * import { Navigate, Outlet, useModel } from '@umijs/max';\n *\n * export default function GuestWrapper() {\n *   const { initialState } = useModel('@@initialState');\n *   return (\n *     <GuestGuard\n *       isAuthenticated={!!initialState?.currentUser}\n *       redirect={(path) => <Navigate to={path} replace />}\n *     >\n *       <Outlet />\n *     </GuestGuard>\n *   );\n * }\n * ```\n */\nexport function GuestGuard({\n  isAuthenticated,\n  homePath = '/',\n  redirect,\n  children,\n}: GuestGuardProps): React.ReactElement | null {\n  if (isAuthenticated) {\n    return redirect(homePath);\n  }\n\n  return children as React.ReactElement;\n}\n","/**\n * 搜索过滤栏组件\n *\n * @experimental 此组件尚未在消费项目中广泛使用，API 可能调整。\n *\n * 配置驱动的搜索过滤栏，支持多种字段类型:\n * - input: 文本输入\n * - select: 下拉选择\n * - dateRange: 日期范围\n * - date: 单日期\n * - number: 数字输入\n * - custom: 自定义渲染\n *\n * 使用 antd Form + 标准输入组件，确保与 antd 主题一致。\n */\n\nimport { DownOutlined, SearchOutlined, UpOutlined } from '@ant-design/icons';\nimport {\n  Button,\n  Col,\n  DatePicker,\n  Form,\n  Input,\n  InputNumber,\n  Row,\n  Select,\n  Space,\n} from 'antd';\nimport type React from 'react';\nimport { useCallback, useMemo, useState } from 'react';\nimport { CustomFieldAdapter } from '../CustomFieldAdapter';\n\n// ===== 类型定义 =====\n\n/**\n * 搜索字段类型\n */\nexport type SearchFieldType =\n  | 'input'\n  | 'select'\n  | 'dateRange'\n  | 'date'\n  | 'number'\n  | 'custom';\n\n/**\n * 选项\n */\ninterface FieldOption {\n  label: string;\n  value: string | number;\n  disabled?: boolean;\n}\n\n/**\n * 搜索字段配置\n */\nexport interface SearchField {\n  /** 字段名 (对应表单 name) */\n  name: string;\n  /** 显示标签 */\n  label?: string;\n  /** 字段类型 */\n  type: SearchFieldType;\n  /** 占位符 */\n  placeholder?: string;\n  /** 下拉选项 (type='select') */\n  options?: FieldOption[];\n  /** 默认值 */\n  defaultValue?: unknown;\n  /** 栅格列宽 (24分制), 默认 6 */\n  span?: number;\n  /** 自定义渲染 (type='custom') */\n  render?: (value: unknown, onChange: (v: unknown) => void) => React.ReactNode;\n  /** 输入后是否立即触发搜索 (默认 false, 需点搜索按钮) */\n  immediate?: boolean;\n}\n\n/**\n * SearchFilterBar 属性\n */\nexport interface SearchFilterBarProps {\n  /** 搜索字段配置 */\n  fields: SearchField[];\n  /** 搜索回调 */\n  onSearch: (values: Record<string, unknown>) => void;\n  /** 重置回调 */\n  onReset?: () => void;\n  /** 是否显示重置按钮, 默认 true */\n  showReset?: boolean;\n  /** 搜索按钮文字, 默认 '搜索' */\n  searchText?: string;\n  /** 重置按钮文字, 默认 '重置' */\n  resetText?: string;\n  /** 展开按钮文字, 默认 '展开' */\n  expandText?: string;\n  /** 折叠按钮文字, 默认 '收起' */\n  collapseText?: string;\n  /** 是否默认折叠 (字段数 > collapseThreshold 时自动折叠), 默认 false */\n  defaultCollapsed?: boolean;\n  /** 折叠阈值 (超过此数量的字段默认隐藏), 默认 3 */\n  collapseThreshold?: number;\n  /** 自定义类名 */\n  className?: string;\n  /** 自定义样式 */\n  style?: React.CSSProperties;\n  /** 额外的操作按钮区域 */\n  extra?: React.ReactNode;\n}\n\nfunction pickNonEmptyValues(\n  values: Record<string, unknown>,\n): Record<string, unknown> {\n  const result: Record<string, unknown> = {};\n  for (const [key, value] of Object.entries(values)) {\n    if (value !== undefined && value !== null && value !== '') {\n      result[key] = value;\n    }\n  }\n  return result;\n}\n\n// ===== 组件实现 =====\n\n/**\n * 搜索过滤栏组件\n *\n * @example\n * ```tsx\n * <SearchFilterBar\n *   fields={[\n *     { name: 'keyword', type: 'input', placeholder: '搜索用户名/邮箱...' },\n *     { name: 'status', type: 'select', label: '状态', options: [\n *       { label: '全部', value: '' },\n *       { label: '启用', value: 'active' },\n *       { label: '禁用', value: 'inactive' },\n *     ]},\n *     { name: 'dateRange', type: 'dateRange', label: '创建时间' },\n *   ]}\n *   onSearch={(values) => setSearchParams(values)}\n *   onReset={() => setSearchParams({})}\n * />\n * ```\n */\nexport function SearchFilterBar(props: SearchFilterBarProps) {\n  const {\n    fields,\n    onSearch,\n    onReset,\n    showReset = true,\n    searchText = '搜索',\n    resetText = '重置',\n    expandText = '展开',\n    collapseText = '收起',\n    defaultCollapsed = false,\n    collapseThreshold = 3,\n    className,\n    style,\n    extra,\n  } = props;\n\n  const [form] = Form.useForm();\n  const [collapsed, setCollapsed] = useState(defaultCollapsed);\n\n  // 构建初始值\n  const initialValues = useMemo(() => {\n    const vals: Record<string, unknown> = {};\n    for (const field of fields) {\n      if (field.defaultValue !== undefined) {\n        vals[field.name] = field.defaultValue;\n      }\n    }\n    return vals;\n  }, [fields]);\n\n  const handleSearch = useCallback(() => {\n    onSearch(pickNonEmptyValues(form.getFieldsValue()));\n  }, [form, onSearch]);\n\n  const handleReset = useCallback(() => {\n    form.resetFields();\n    onReset?.();\n    // 发送默认值（而非空对象），保持 UI 和搜索状态一致\n    onSearch(pickNonEmptyValues(form.getFieldsValue()));\n  }, [form, onReset, onSearch]);\n\n  // 记录哪些字段标记为 immediate\n  const immediateFieldNames = useMemo(\n    () => new Set(fields.filter((f) => f.immediate).map((f) => f.name)),\n    [fields],\n  );\n\n  // Form.onValuesChange: 当 immediate 字段变化时自动触发搜索\n  const handleValuesChange = useCallback(\n    (changedValues: Record<string, unknown>) => {\n      const changedKeys = Object.keys(changedValues);\n      if (changedKeys.some((key) => immediateFieldNames.has(key))) {\n        // 使用 Promise.resolve 延迟到当前 setState 批处理完成后再读取表单值\n        Promise.resolve().then(handleSearch);\n      }\n    },\n    [immediateFieldNames, handleSearch],\n  );\n\n  // 可见字段\n  const visibleFields = collapsed ? fields.slice(0, collapseThreshold) : fields;\n  const showCollapse = fields.length > collapseThreshold;\n\n  return (\n    <div className={className} style={style}>\n      <Form\n        form={form}\n        initialValues={initialValues}\n        onValuesChange={handleValuesChange}\n      >\n        <Row gutter={[16, 16]} align=\"middle\">\n          {visibleFields.map((field) => (\n            <Col key={field.name} span={field.span ?? 6}>\n              <Form.Item\n                name={field.name}\n                label={field.label}\n                style={{ marginBottom: 0 }}\n              >\n                {renderSearchField(field, handleSearch)}\n              </Form.Item>\n            </Col>\n          ))}\n\n          {/* 操作按钮 */}\n          <Col flex=\"auto\" style={{ textAlign: 'right' }}>\n            <Space>\n              <Button\n                type=\"primary\"\n                icon={<SearchOutlined />}\n                onClick={handleSearch}\n              >\n                {searchText}\n              </Button>\n              {showReset && <Button onClick={handleReset}>{resetText}</Button>}\n              {showCollapse && (\n                <Button\n                  type=\"link\"\n                  onClick={() => setCollapsed(!collapsed)}\n                  icon={collapsed ? <DownOutlined /> : <UpOutlined />}\n                >\n                  {collapsed ? expandText : collapseText}\n                </Button>\n              )}\n              {extra}\n            </Space>\n          </Col>\n        </Row>\n      </Form>\n    </div>\n  );\n}\n\n// ===== 字段渲染 =====\n\nfunction renderSearchField(\n  field: SearchField,\n  onSearch: () => void,\n): React.ReactNode {\n  switch (field.type) {\n    case 'input':\n      return (\n        <Input\n          placeholder={field.placeholder ?? `请输入${field.label ?? ''}`}\n          allowClear\n          onPressEnter={onSearch}\n        />\n      );\n\n    case 'number':\n      return (\n        <InputNumber\n          style={{ width: '100%' }}\n          placeholder={field.placeholder ?? `请输入${field.label ?? ''}`}\n        />\n      );\n\n    case 'select':\n      return (\n        <Select\n          placeholder={field.placeholder ?? `请选择${field.label ?? ''}`}\n          allowClear\n          options={field.options?.map((opt) => ({\n            label: opt.label,\n            value: opt.value,\n            disabled: opt.disabled,\n          }))}\n        />\n      );\n\n    case 'date':\n      return <DatePicker style={{ width: '100%' }} />;\n\n    case 'dateRange':\n      return <DatePicker.RangePicker style={{ width: '100%' }} />;\n\n    case 'custom':\n      if (field.render) {\n        return <CustomFieldAdapter render={field.render} />;\n      }\n      return null;\n\n    default:\n      return null;\n  }\n}\n","/**\n * 统计卡片组件 + 统计卡片网格组件\n *\n * Dashboard 中常用的统计数据展示卡片，支持图标、数值、标签、颜色预设。\n */\n\nimport type { GlobalToken } from 'antd';\nimport { Card, Col, Row, Skeleton, theme } from 'antd';\nimport React, { useMemo } from 'react';\n\n/**\n * 颜色预设 — 通过 antd token 生成，自动适配暗黑模式\n *\n * 运行时通过 `getThemedColorPresets(token)` 获取当前主题对应的颜色值。\n * 静态常量 `STAT_COLOR_PRESETS` 仅作为浅色模式的回退值使用。\n */\nexport const STAT_COLOR_PRESETS = {\n  blue: { bg: '#e6f4ff', text: '#1677ff', icon: '#1677ff' },\n  green: { bg: '#f6ffed', text: '#52c41a', icon: '#52c41a' },\n  orange: { bg: '#fff7e6', text: '#fa8c16', icon: '#fa8c16' },\n  red: { bg: '#fff2f0', text: '#ff4d4f', icon: '#ff4d4f' },\n  purple: { bg: '#f9f0ff', text: '#722ed1', icon: '#722ed1' },\n  cyan: { bg: '#e6fffb', text: '#13c2c2', icon: '#13c2c2' },\n  gold: { bg: '#fffbe6', text: '#faad14', icon: '#faad14' },\n  lime: { bg: '#fcffe6', text: '#a0d911', icon: '#a0d911' },\n} as const;\n\n/**\n * 安全读取 antd token 扩展色板字段\n *\n * antd v5 GlobalToken 类型未声明 purple1/cyan1 等扩展色板字段，\n * 但运行时它们确实存在于 token 对象中。使用安全索引访问 + 回退值\n * 避免强制类型断言，提高版本兼容性。\n */\nfunction getExtendedTokenColor(\n  token: GlobalToken,\n  key: string,\n  fallback: string,\n): string {\n  const value = (token as unknown as Record<string, unknown>)[key];\n  return typeof value === 'string' && value ? value : fallback;\n}\n\nfunction getThemedColorPresets(token: GlobalToken) {\n  return {\n    blue: {\n      bg: token.colorInfoBg || STAT_COLOR_PRESETS.blue.bg,\n      text: token.colorInfo || STAT_COLOR_PRESETS.blue.text,\n      icon: token.colorInfo || STAT_COLOR_PRESETS.blue.icon,\n    },\n    green: {\n      bg: token.colorSuccessBg || STAT_COLOR_PRESETS.green.bg,\n      text: token.colorSuccess || STAT_COLOR_PRESETS.green.text,\n      icon: token.colorSuccess || STAT_COLOR_PRESETS.green.icon,\n    },\n    orange: {\n      bg: token.colorWarningBg || STAT_COLOR_PRESETS.orange.bg,\n      text: token.colorWarning || STAT_COLOR_PRESETS.orange.text,\n      icon: token.colorWarning || STAT_COLOR_PRESETS.orange.icon,\n    },\n    red: {\n      bg: token.colorErrorBg || STAT_COLOR_PRESETS.red.bg,\n      text: token.colorError || STAT_COLOR_PRESETS.red.text,\n      icon: token.colorError || STAT_COLOR_PRESETS.red.icon,\n    },\n    purple: {\n      bg: getExtendedTokenColor(token, 'purple1', STAT_COLOR_PRESETS.purple.bg),\n      text: getExtendedTokenColor(\n        token,\n        'purple6',\n        STAT_COLOR_PRESETS.purple.text,\n      ),\n      icon: getExtendedTokenColor(\n        token,\n        'purple6',\n        STAT_COLOR_PRESETS.purple.icon,\n      ),\n    },\n    cyan: {\n      bg: getExtendedTokenColor(token, 'cyan1', STAT_COLOR_PRESETS.cyan.bg),\n      text: getExtendedTokenColor(token, 'cyan6', STAT_COLOR_PRESETS.cyan.text),\n      icon: getExtendedTokenColor(token, 'cyan6', STAT_COLOR_PRESETS.cyan.icon),\n    },\n    gold: {\n      bg: getExtendedTokenColor(\n        token,\n        'gold1',\n        token.colorWarningBg || STAT_COLOR_PRESETS.gold.bg,\n      ),\n      text: getExtendedTokenColor(token, 'gold6', STAT_COLOR_PRESETS.gold.text),\n      icon: getExtendedTokenColor(token, 'gold6', STAT_COLOR_PRESETS.gold.icon),\n    },\n    lime: {\n      bg: getExtendedTokenColor(token, 'lime1', STAT_COLOR_PRESETS.lime.bg),\n      text: getExtendedTokenColor(token, 'lime6', STAT_COLOR_PRESETS.lime.text),\n      icon: getExtendedTokenColor(token, 'lime6', STAT_COLOR_PRESETS.lime.icon),\n    },\n  };\n}\n\nexport type StatColorPreset = keyof typeof STAT_COLOR_PRESETS;\n\n/**\n * StatCard 组件属性\n */\nexport interface StatCardProps {\n  /** 标题 */\n  title: string;\n  /** 数值 */\n  value: string | number;\n  /** 图标 */\n  icon?: React.ReactNode;\n  /** 颜色预设 */\n  color?: StatColorPreset;\n  /** 自定义颜色 */\n  customColor?: { bg: string; text: string; icon: string };\n  /** 加载中 */\n  loading?: boolean;\n  /** 后缀文本（如单位） */\n  suffix?: string;\n  /** 前缀文本 */\n  prefix?: string;\n  /** 描述文本 */\n  description?: string;\n  /** 点击回调 */\n  onClick?: () => void;\n  /** 自定义样式 */\n  style?: React.CSSProperties;\n  /** 自定义类名 */\n  className?: string;\n}\n\n/**\n * 统计卡片组件\n *\n * @example\n * ```tsx\n * <StatCard\n *   title=\"总用户数\"\n *   value={1234}\n *   icon={<UserOutlined />}\n *   color=\"blue\"\n *   suffix=\"人\"\n * />\n * ```\n */\nexport const StatCard = React.memo(function StatCard({\n  title,\n  value,\n  icon,\n  color = 'blue',\n  customColor,\n  loading = false,\n  suffix,\n  prefix,\n  description,\n  onClick,\n  style,\n  className,\n}: StatCardProps): React.ReactElement {\n  const { token } = theme.useToken();\n  const themedPresets = useMemo(() => getThemedColorPresets(token), [token]);\n  const colors = customColor ?? themedPresets[color] ?? themedPresets.blue;\n\n  if (loading) {\n    return (\n      <Card size=\"small\" style={style} className={className}>\n        <Skeleton active paragraph={{ rows: 1 }} />\n      </Card>\n    );\n  }\n\n  return (\n    <Card\n      size=\"small\"\n      hoverable={!!onClick}\n      onClick={onClick}\n      style={{\n        background: colors.bg,\n        borderColor: 'transparent',\n        cursor: onClick ? 'pointer' : 'default',\n        ...style,\n      }}\n      className={className}\n    >\n      <div\n        style={{ display: 'flex', alignItems: 'center', gap: token.marginMD }}\n      >\n        {icon && (\n          <div\n            style={{\n              fontSize: token.fontSizeHeading2,\n              color: colors.icon,\n              display: 'flex',\n              alignItems: 'center',\n              justifyContent: 'center',\n              flexShrink: 0,\n            }}\n          >\n            {icon}\n          </div>\n        )}\n        <div style={{ flex: 1, minWidth: 0 }}>\n          <div\n            style={{\n              fontSize: token.fontSizeSM,\n              color: token.colorTextTertiary,\n              marginBottom: token.marginXXS,\n              overflow: 'hidden',\n              textOverflow: 'ellipsis',\n              whiteSpace: 'nowrap',\n            }}\n          >\n            {title}\n          </div>\n          <div\n            style={{\n              fontSize: token.fontSizeHeading3,\n              fontWeight: 600,\n              color: colors.text,\n              lineHeight: 1.2,\n            }}\n          >\n            {prefix}\n            {value}\n            {suffix && (\n              <span\n                style={{\n                  fontSize: token.fontSize,\n                  fontWeight: 400,\n                  marginLeft: token.marginXXS,\n                }}\n              >\n                {suffix}\n              </span>\n            )}\n          </div>\n          {description && (\n            <div\n              style={{\n                fontSize: token.fontSizeSM,\n                color: token.colorTextTertiary,\n                marginTop: token.marginXXS,\n              }}\n            >\n              {description}\n            </div>\n          )}\n        </div>\n      </div>\n    </Card>\n  );\n});\n\n// ======================== StatCardGrid ========================\n\n/**\n * StatCardGrid 配置项\n */\nexport interface StatCardGridItem extends StatCardProps {\n  /** 唯一标识 */\n  key: string;\n  /** 是否隐藏 */\n  hidden?: boolean;\n  /** 列宽配置 (Ant Design Col 的 span 属性) */\n  colSpan?: number;\n  /** 响应式列宽配置 */\n  colProps?: {\n    xs?: number;\n    sm?: number;\n    md?: number;\n    lg?: number;\n    xl?: number;\n    xxl?: number;\n  };\n}\n\n/**\n * StatCardGrid 组件属性\n */\nexport interface StatCardGridProps {\n  /** 卡片数据 */\n  items: StatCardGridItem[];\n  /** 行间距，默认 [16, 16] */\n  gutter?: number | [number, number];\n  /** 默认列宽（当 item 未指定 colSpan 时使用），默认 6 */\n  defaultColSpan?: number;\n  /** 默认响应式列宽配置 */\n  defaultColProps?: StatCardGridItem['colProps'];\n  /** 全局加载状态 */\n  loading?: boolean;\n}\n\n/**\n * 统计卡片网格组件\n *\n * @example\n * ```tsx\n * <StatCardGrid\n *   loading={loading}\n *   items={[\n *     { key: 'users', title: '总用户', value: 1234, color: 'blue', icon: <UserOutlined /> },\n *     { key: 'orders', title: '总订单', value: 567, color: 'green', icon: <ShoppingOutlined /> },\n *     { key: 'revenue', title: '总收入', value: '¥12,345', color: 'orange', icon: <DollarOutlined /> },\n *     { key: 'growth', title: '增长率', value: '12.5%', color: 'purple', icon: <RiseOutlined /> },\n *   ]}\n * />\n * ```\n */\nexport function StatCardGrid({\n  items,\n  gutter = [16, 16],\n  defaultColSpan = 6,\n  defaultColProps,\n  loading = false,\n}: StatCardGridProps): React.ReactElement {\n  const visibleItems = items.filter((item) => !item.hidden);\n\n  return (\n    <Row gutter={gutter}>\n      {visibleItems.map((item) => {\n        const { key, hidden: _hidden, colSpan, colProps, ...cardProps } = item;\n\n        return (\n          <Col\n            key={key}\n            span={colSpan ?? defaultColSpan}\n            {...(colProps ??\n              defaultColProps ?? { xs: 24, sm: 12, md: 12, lg: 6 })}\n          >\n            <StatCard {...cardProps} loading={loading || cardProps.loading} />\n          </Col>\n        );\n      })}\n    </Row>\n  );\n}\n","/**\n * 多状态展示组件\n *\n * @experimental 此组件尚未在消费项目中广泛使用，API 可能调整。\n *\n * 统一的页面状态展示：空状态、错误状态、加载状态、403/404/500、成功结果等。\n * 比 ErrorBoundary 更全面，适用于页面级别的状态展示。\n */\n\nimport { Result, Spin, theme } from 'antd';\nimport type React from 'react';\n\n/**\n * 状态类型\n */\nexport type StatusType =\n  | 'empty'\n  | 'error'\n  | 'loading'\n  | 'success'\n  | '403'\n  | '404'\n  | '500';\n\n/**\n * StatusShow 组件属性\n */\nexport interface StatusShowProps {\n  /** 状态类型 */\n  status: StatusType;\n  /** 标题 */\n  title?: string;\n  /** 描述文本 */\n  description?: string;\n  /** 自定义图标 */\n  icon?: React.ReactNode;\n  /** 操作按钮 */\n  extra?: React.ReactNode;\n  /** 加载中的提示文本 */\n  loadingTip?: string;\n  /** 自定义样式 */\n  style?: React.CSSProperties;\n  /** 自定义类名 */\n  className?: string;\n  /** 子内容（在 loading 状态下包裹显示） */\n  children?: React.ReactNode;\n}\n\n/** 默认文案配置 */\nconst DEFAULT_TEXTS: Record<\n  StatusType,\n  { title: string; description: string }\n> = {\n  empty: {\n    title: '暂无数据',\n    description: '没有可展示的内容',\n  },\n  error: {\n    title: '加载失败',\n    description: '数据加载失败，请稍后重试',\n  },\n  loading: {\n    title: '加载中',\n    description: '正在加载数据...',\n  },\n  success: {\n    title: '操作成功',\n    description: '',\n  },\n  '403': {\n    title: '无访问权限',\n    description: '抱歉，您没有权限访问此页面',\n  },\n  '404': {\n    title: '页面不存在',\n    description: '抱歉，您访问的页面不存在',\n  },\n  '500': {\n    title: '服务器错误',\n    description: '抱歉，服务器发生错误，请稍后重试',\n  },\n};\n\n/**\n * 映射到 antd Result 的 status\n */\nfunction mapToResultStatus(\n  status: StatusType,\n): 'success' | 'error' | 'info' | 'warning' | 403 | 404 | 500 {\n  switch (status) {\n    case 'empty':\n      return 'info';\n    case 'error':\n      return 'error';\n    case 'success':\n      return 'success';\n    case '403':\n      return 403;\n    case '404':\n      return 404;\n    case '500':\n      return 500;\n    default:\n      return 'info';\n  }\n}\n\n/**\n * 多状态展示组件\n *\n * @example\n * ```tsx\n * // 空状态\n * <StatusShow status=\"empty\" />\n *\n * // 错误状态 + 重试按钮\n * <StatusShow\n *   status=\"error\"\n *   description=\"数据加载失败\"\n *   extra={<Button onClick={reload}>重试</Button>}\n * />\n *\n * // 加载状态包裹内容\n * <StatusShow status=\"loading\" loadingTip=\"加载中...\">\n *   <div>实际内容</div>\n * </StatusShow>\n *\n * // 403 无权限\n * <StatusShow\n *   status=\"403\"\n *   extra={<Button type=\"primary\" onClick={() => history.push('/')}>返回首页</Button>}\n * />\n * ```\n */\nexport function StatusShow({\n  status,\n  title,\n  description,\n  icon,\n  extra,\n  loadingTip,\n  style,\n  className,\n  children,\n}: StatusShowProps): React.ReactElement {\n  const { token } = theme.useToken();\n  const defaults = DEFAULT_TEXTS[status];\n\n  // Loading 状态特殊处理\n  if (status === 'loading') {\n    return (\n      <div\n        style={{\n          display: 'flex',\n          justifyContent: 'center',\n          alignItems: 'center',\n          minHeight: 200,\n          padding: token.paddingLG,\n          ...style,\n        }}\n        className={className}\n      >\n        <Spin tip={loadingTip ?? title ?? defaults.title} size=\"large\">\n          {children ?? <div style={{ padding: '50px 0' }} />}\n        </Spin>\n      </div>\n    );\n  }\n\n  return (\n    <div style={{ padding: token.paddingLG, ...style }} className={className}>\n      <Result\n        status={mapToResultStatus(status)}\n        title={title ?? defaults.title}\n        subTitle={description ?? defaults.description}\n        icon={icon}\n        extra={extra}\n      />\n    </div>\n  );\n}\n","/**\n * 通用状态标签组件\n *\n * 使用 antd Tag 组件渲染状态标签\n */\n\nimport { Tag } from 'antd';\nimport type React from 'react';\nimport type { StatusMap } from '../../types/common';\n\n/**\n * StatusTag 组件属性\n */\nexport interface StatusTagProps<T extends string | number = string> {\n  /** 当前状态值 */\n  status: T | undefined | null;\n  /** 状态映射表 */\n  statusMap: StatusMap<T>;\n  /** 未匹配状态时的默认文本，不设置则不渲染 */\n  defaultText?: string;\n  /** 未匹配状态时的默认颜色 */\n  defaultColor?: string;\n  /** 自定义类名 */\n  className?: string;\n  /** 自定义样式 */\n  style?: React.CSSProperties;\n}\n\n/**\n * 通用状态标签组件\n *\n * 根据状态值从映射表中获取显示文本和颜色，渲染为 Ant Design Tag。\n *\n * @example\n * ```tsx\n * const STATUS_MAP: StatusMap<'active' | 'inactive'> = {\n *   active: { text: '启用', color: 'green' },\n *   inactive: { text: '禁用', color: 'red' },\n * };\n *\n * // 基础用法\n * <StatusTag status=\"active\" statusMap={STATUS_MAP} />\n *\n * // 未知状态显示默认文本\n * <StatusTag status=\"unknown\" statusMap={STATUS_MAP} defaultText=\"未知\" defaultColor=\"default\" />\n * ```\n */\nexport function StatusTag<T extends string | number = string>({\n  status,\n  statusMap,\n  defaultText,\n  defaultColor = 'default',\n  className,\n  style,\n}: StatusTagProps<T>): React.ReactElement | null {\n  if (status === undefined || status === null) {\n    if (defaultText) {\n      return (\n        <Tag color={defaultColor} className={className} style={style}>\n          {defaultText}\n        </Tag>\n      );\n    }\n    return null;\n  }\n\n  const config = statusMap[status as T];\n  if (!config) {\n    if (defaultText) {\n      return (\n        <Tag color={defaultColor} className={className} style={style}>\n          {defaultText}\n        </Tag>\n      );\n    }\n    return null;\n  }\n\n  return (\n    <Tag\n      color={config.color}\n      icon={config.icon}\n      className={className}\n      style={style}\n    >\n      {config.text}\n    </Tag>\n  );\n}\n","/**\n * 回收站弹窗组件 (业务模式模板)\n *\n * 管理后台通用的回收站模式：展示已删除数据列表，支持恢复/永久删除/批量操作。\n * 泛型设计，可适用于任何业务实体。\n *\n * **注意**: 此组件为业务模式模板 (Business Pattern Template)，而非纯通用 UI 组件。\n * 它耦合了特定的 API 响应格式 (`ApiResponse<PaginatedData<T>>`)，\n * 适用于后端遵循统一响应格式的管理后台项目。\n * 如果你的 API 格式不同，建议参考此组件的实现模式自行封装。\n */\n\nimport { Button, Modal, Popconfirm, Space, Table } from 'antd';\nimport type { ColumnsType, TablePaginationConfig } from 'antd/es/table';\nimport type React from 'react';\nimport { useCallback, useEffect, useState } from 'react';\nimport { useLatestRef } from '../../../hooks/useLatestRef';\nimport type { ApiResponse, PaginatedData } from '../../../types/api';\nimport { createLogger } from '../../../utils/logger';\n\n/**\n * 回收站项的最小接口约束\n */\nexport interface RecycleBinItem {\n  /** 记录 ID（支持 number 和 string UUID） */\n  id: string | number;\n  /** 删除时间（可选展示） */\n  deletedAt?: string;\n}\n\n/**\n * 回收站 API 接口\n */\nexport interface RecycleBinApi<T extends RecycleBinItem> {\n  /** 获取回收站列表 */\n  list: (params: {\n    pageNo: number;\n    pageSize: number;\n  }) => Promise<ApiResponse<PaginatedData<T>>>;\n  /** 恢复单条记录 */\n  restore: (id: T['id']) => Promise<ApiResponse<unknown>>;\n  /** 永久删除单条记录 */\n  permanentDelete: (id: T['id']) => Promise<ApiResponse<unknown>>;\n  /** 批量恢复（可选） */\n  batchRestore?: (ids: T['id'][]) => Promise<ApiResponse<unknown>>;\n  /** 清空回收站（可选） */\n  clear?: () => Promise<ApiResponse<unknown>>;\n}\n\n/**\n * RecycleBinModal 文案配置\n */\nexport interface RecycleBinMessages {\n  /** 弹窗标题，默认 '回收站' */\n  title?: string;\n  /** 恢复按钮文字，默认 '恢复' */\n  restoreText?: string;\n  /** 删除按钮文字，默认 '删除' */\n  deleteText?: string;\n  /** 批量恢复按钮文字，默认 '批量恢复' */\n  batchRestoreText?: string;\n  /** 清空按钮文字，默认 '清空' */\n  clearAllText?: string;\n  /** 操作列标题，默认 '操作' */\n  actionsColumnTitle?: string;\n  /** 永久删除确认文字，默认 '确定永久删除吗？此操作不可撤销。' */\n  permanentDeleteConfirm?: string;\n  /** 清空确认文字，默认 '确定清空回收站吗？此操作不可撤销。' */\n  clearConfirm?: string;\n  /** 恢复成功提示，默认 '恢复成功' */\n  restoreSuccess?: string;\n  /** 恢复失败提示，默认 '恢复失败' */\n  restoreFailed?: string;\n  /** 删除成功提示，默认 '已永久删除' */\n  deleteSuccess?: string;\n  /** 删除失败提示，默认 '删除失败' */\n  deleteFailed?: string;\n  /** 批量恢复成功提示模板，使用 {count} 占位符，默认 '已恢复 {count} 条记录' */\n  batchRestoreSuccess?: string;\n  /** 批量恢复失败提示，默认 '批量恢复失败' */\n  batchRestoreFailed?: string;\n  /** 清空成功提示，默认 '回收站已清空' */\n  clearSuccess?: string;\n  /** 清空失败提示，默认 '清空失败' */\n  clearFailed?: string;\n  /** 加载失败提示，默认 '加载回收站数据失败' */\n  loadFailed?: string;\n  /** 总数展示模板，使用 {total} 占位符，默认 '共 {total} 条' */\n  totalText?: string;\n}\n\n/** 默认文案 */\nconst DEFAULT_MESSAGES: Required<RecycleBinMessages> = {\n  title: '回收站',\n  restoreText: '恢复',\n  deleteText: '删除',\n  batchRestoreText: '批量恢复',\n  clearAllText: '清空',\n  actionsColumnTitle: '操作',\n  permanentDeleteConfirm: '确定永久删除吗？此操作不可撤销。',\n  clearConfirm: '确定清空回收站吗？此操作不可撤销。',\n  restoreSuccess: '恢复成功',\n  restoreFailed: '恢复失败',\n  deleteSuccess: '已永久删除',\n  deleteFailed: '删除失败',\n  batchRestoreSuccess: '已恢复 {count} 条记录',\n  batchRestoreFailed: '批量恢复失败',\n  clearSuccess: '回收站已清空',\n  clearFailed: '清空失败',\n  loadFailed: '加载回收站数据失败',\n  totalText: '共 {total} 条',\n};\n\n/**\n * RecycleBinModal 组件属性\n *\n * **注意**: 此组件为业务模式模板，耦合了特定的 API 响应格式 (`ApiResponse<PaginatedData<T>>`)。\n * 适用于后端遵循统一响应格式的管理后台项目。\n */\nexport interface RecycleBinModalProps<T extends RecycleBinItem> {\n  /** 是否显示 */\n  open: boolean;\n  /** 关闭回调 */\n  onClose: () => void;\n  /** 回收站 API */\n  api: RecycleBinApi<T>;\n  /** 表格列定义 */\n  columns: ColumnsType<T>;\n  /** 弹窗标题（优先于 messages.title） */\n  title?: string;\n  /** 成功状态码（与 ApiResponse.code 比较时自动转为字符串），默认 200 */\n  successCode?: string | number;\n  /** 恢复成功后的回调（用于刷新主列表） */\n  onRestoreSuccess?: () => void | Promise<void>;\n  /** 弹窗宽度，默认 800 */\n  width?: number;\n  /** 消息展示函数（必须由消费方提供） */\n  showMessage?: (content: string, type: 'success' | 'error') => void;\n  /** 文案配置（国际化支持） */\n  messages?: Partial<RecycleBinMessages>;\n}\n\nconst logger = createLogger({ prefix: 'RecycleBinModal' });\n\n/** 未注入 showMessage 时通过 logger 输出 */\nfunction defaultMessageHandler(content: string, type: 'success' | 'error') {\n  if (type === 'error') {\n    logger.error(content);\n  } else {\n    logger.success(content);\n  }\n}\n\n/**\n * 通用回收站弹窗组件\n *\n * @example\n * ```tsx\n * <RecycleBinModal\n *   open={recycleBinOpen}\n *   onClose={() => setRecycleBinOpen(false)}\n *   api={{\n *     list: getRecycleBinList,\n *     restore: restoreItem,\n *     permanentDelete: permanentDeleteItem,\n *     batchRestore: batchRestoreItems,\n *     clear: clearRecycleBin,\n *   }}\n *   columns={[\n *     { title: '名称', dataIndex: 'name' },\n *     { title: '删除时间', dataIndex: 'deletedAt' },\n *   ]}\n *   showMessage={(content, type) => message[type](content)}\n *   onRestoreSuccess={() => actionRef.current?.reload()}\n * />\n * ```\n */\nexport function RecycleBinModal<T extends RecycleBinItem>({\n  open,\n  onClose,\n  api,\n  columns,\n  title,\n  successCode = '200',\n  onRestoreSuccess,\n  width = 800,\n  showMessage,\n  messages: messagesProp,\n}: RecycleBinModalProps<T>): React.ReactElement {\n  const msg = { ...DEFAULT_MESSAGES, ...messagesProp };\n  const modalTitle = title ?? msg.title;\n  const [data, setData] = useState<T[]>([]);\n  const [loading, setLoading] = useState(false);\n  const [total, setTotal] = useState(0);\n  const [pageNo, setPageNo] = useState(1);\n  const [pageSize, setPageSize] = useState(10);\n  const [selectedRowKeys, setSelectedRowKeys] = useState<T['id'][]>([]);\n\n  // 用 useLatestRef 稳定回调引用，防止重建导致 useCallback / useEffect 链式更新\n  const showMessageRef = useLatestRef(showMessage ?? defaultMessageHandler);\n  const onRestoreSuccessRef = useLatestRef(onRestoreSuccess);\n  const apiRef = useLatestRef(api);\n  const msgRef = useLatestRef(msg);\n\n  const isSuccess = useCallback(\n    (response: ApiResponse<unknown>) =>\n      String(response.code) === String(successCode),\n    [successCode],\n  );\n\n  const fetchData = useCallback(async () => {\n    setLoading(true);\n    try {\n      const response = await apiRef.current.list({ pageNo, pageSize });\n      if (isSuccess(response) && response.data) {\n        setData(response.data.list || []);\n        setTotal(response.data.total || 0);\n      }\n    } catch (err) {\n      logger.error('Failed to load recycle bin data', err);\n      showMessageRef.current(msgRef.current.loadFailed, 'error');\n    } finally {\n      setLoading(false);\n    }\n  }, [pageNo, pageSize, isSuccess, apiRef, msgRef, showMessageRef]);\n\n  useEffect(() => {\n    if (open) {\n      fetchData();\n      setSelectedRowKeys([]);\n    }\n  }, [open, fetchData]);\n\n  const handleRestore = useCallback(\n    async (id: T['id']) => {\n      try {\n        const response = await apiRef.current.restore(id);\n        if (isSuccess(response)) {\n          showMessageRef.current(msgRef.current.restoreSuccess, 'success');\n          fetchData();\n          onRestoreSuccessRef.current?.();\n        } else {\n          showMessageRef.current(\n            response.msg || msgRef.current.restoreFailed,\n            'error',\n          );\n        }\n      } catch (err) {\n        logger.error('Restore failed', err);\n        showMessageRef.current(msgRef.current.restoreFailed, 'error');\n      }\n    },\n    [isSuccess, fetchData, apiRef, msgRef, onRestoreSuccessRef, showMessageRef],\n  );\n\n  const handlePermanentDelete = useCallback(\n    async (id: T['id']) => {\n      try {\n        const response = await apiRef.current.permanentDelete(id);\n        if (isSuccess(response)) {\n          showMessageRef.current(msgRef.current.deleteSuccess, 'success');\n          fetchData();\n        } else {\n          showMessageRef.current(\n            response.msg || msgRef.current.deleteFailed,\n            'error',\n          );\n        }\n      } catch (err) {\n        logger.error('Permanent delete failed', err);\n        showMessageRef.current(msgRef.current.deleteFailed, 'error');\n      }\n    },\n    [isSuccess, fetchData, apiRef, msgRef, showMessageRef],\n  );\n\n  const handleBatchRestore = useCallback(async () => {\n    if (!apiRef.current.batchRestore || selectedRowKeys.length === 0) return;\n    try {\n      const response = await apiRef.current.batchRestore(selectedRowKeys);\n      if (isSuccess(response)) {\n        showMessageRef.current(\n          msgRef.current.batchRestoreSuccess.replace(\n            '{count}',\n            String(selectedRowKeys.length),\n          ),\n          'success',\n        );\n        setSelectedRowKeys([]);\n        fetchData();\n        onRestoreSuccessRef.current?.();\n      } else {\n        showMessageRef.current(\n          response.msg || msgRef.current.batchRestoreFailed,\n          'error',\n        );\n      }\n    } catch (err) {\n      logger.error('Batch restore failed', err);\n      showMessageRef.current(msgRef.current.batchRestoreFailed, 'error');\n    }\n  }, [\n    selectedRowKeys,\n    isSuccess,\n    fetchData,\n    apiRef,\n    msgRef,\n    onRestoreSuccessRef,\n    showMessageRef,\n  ]);\n\n  const handleClear = useCallback(async () => {\n    if (!apiRef.current.clear) return;\n    try {\n      const response = await apiRef.current.clear();\n      if (isSuccess(response)) {\n        showMessageRef.current(msgRef.current.clearSuccess, 'success');\n        fetchData();\n      } else {\n        showMessageRef.current(\n          response.msg || msgRef.current.clearFailed,\n          'error',\n        );\n      }\n    } catch (err) {\n      logger.error('Clear recycle bin failed', err);\n      showMessageRef.current(msgRef.current.clearFailed, 'error');\n    }\n  }, [isSuccess, fetchData, apiRef, msgRef, showMessageRef]);\n\n  const handleTableChange = useCallback((pagination: TablePaginationConfig) => {\n    setPageNo(pagination.current ?? 1);\n    setPageSize(pagination.pageSize ?? 10);\n  }, []);\n\n  // 操作列\n  const actionColumn: ColumnsType<T>[number] = {\n    title: msg.actionsColumnTitle,\n    key: 'action',\n    width: 160,\n    render: (_: unknown, record: T) => (\n      <Space size={4}>\n        <Button\n          type=\"link\"\n          size=\"small\"\n          onClick={() => handleRestore(record.id)}\n        >\n          {msg.restoreText}\n        </Button>\n        <Popconfirm\n          title={msg.permanentDeleteConfirm}\n          onConfirm={() => handlePermanentDelete(record.id)}\n        >\n          <Button type=\"link\" size=\"small\" danger>\n            {msg.deleteText}\n          </Button>\n        </Popconfirm>\n      </Space>\n    ),\n  };\n\n  return (\n    <Modal\n      title={modalTitle}\n      open={open}\n      onCancel={onClose}\n      width={width}\n      footer={null}\n      destroyOnClose\n    >\n      {/* 批量操作栏 */}\n      <div\n        style={{\n          marginBottom: 16,\n          display: 'flex',\n          justifyContent: 'space-between',\n        }}\n      >\n        <Space>\n          {api.batchRestore && (\n            <Button\n              disabled={selectedRowKeys.length === 0}\n              onClick={handleBatchRestore}\n            >\n              {msg.batchRestoreText}{' '}\n              {selectedRowKeys.length > 0 && `(${selectedRowKeys.length})`}\n            </Button>\n          )}\n        </Space>\n        <Space>\n          {api.clear && (\n            <Popconfirm title={msg.clearConfirm} onConfirm={handleClear}>\n              <Button danger>{msg.clearAllText}</Button>\n            </Popconfirm>\n          )}\n        </Space>\n      </div>\n\n      <Table<T>\n        rowKey=\"id\"\n        columns={[...columns, actionColumn]}\n        dataSource={data}\n        loading={loading}\n        pagination={{\n          current: pageNo,\n          pageSize,\n          total,\n          showSizeChanger: true,\n          showTotal: (t) => msg.totalText.replace('{total}', String(t)),\n        }}\n        onChange={handleTableChange}\n        rowSelection={\n          api.batchRestore\n            ? {\n                selectedRowKeys,\n                onChange: (keys) => setSelectedRowKeys(keys as T['id'][]),\n              }\n            : undefined\n        }\n        size=\"small\"\n        scroll={{ x: 'max-content' }}\n      />\n    </Modal>\n  );\n}\n","/**\n * 用户头像组件\n *\n * 显示用户头像，支持图片加载失败时自动显示姓名首字母，基于名字自动生成背景颜色。\n */\n\nimport type { AvatarProps } from 'antd';\nimport { Avatar, theme } from 'antd';\nimport React, { useEffect, useMemo, useState } from 'react';\n\n/**\n * 预设颜色池\n */\nconst AVATAR_COLORS = [\n  '#1677ff',\n  '#52c41a',\n  '#fa8c16',\n  '#722ed1',\n  '#13c2c2',\n  '#eb2f96',\n  '#fa541c',\n  '#2f54eb',\n  '#faad14',\n  '#a0d911',\n  '#1890ff',\n  '#f5222d',\n  '#9254de',\n  '#36cfc9',\n  '#ff7a45',\n  '#597ef7',\n];\n\n/**\n * 根据名字生成稳定的颜色索引\n */\nfunction getColorByName(name: string): string {\n  let hash = 0;\n  for (let i = 0; i < name.length; i++) {\n    hash = name.charCodeAt(i) + ((hash << 5) - hash);\n    hash = hash & hash; // Convert to 32bit integer\n  }\n  const index = Math.abs(hash) % AVATAR_COLORS.length;\n  return AVATAR_COLORS[index];\n}\n\n/**\n * 获取显示的缩写文字\n * - 中文：取最后两个字\n * - 英文：取首字母大写\n * - 混合：取第一个字符\n */\nfunction getInitials(name: string): string {\n  if (!name) return '?';\n  const trimmed = name.trim();\n  if (!trimmed) return '?';\n\n  // 中文名：取最后 1-2 个字\n  const chineseChars = trimmed.match(/[\\u4e00-\\u9fff]/g);\n  if (chineseChars && chineseChars.length >= 2) {\n    return chineseChars.slice(-2).join('');\n  }\n  if (chineseChars && chineseChars.length === 1) {\n    return chineseChars[0];\n  }\n\n  // 英文名：取各单词首字母（最多2个）\n  const words = trimmed.split(/\\s+/).filter(Boolean);\n  if (words.length >= 2) {\n    return (words[0][0] + words[1][0]).toUpperCase();\n  }\n\n  // 单个单词：取第一个字符\n  return trimmed[0].toUpperCase();\n}\n\n/**\n * UserAvatar 组件属性\n */\nexport interface UserAvatarProps extends Omit<AvatarProps, 'src' | 'children'> {\n  /** 头像图片 URL */\n  src?: string | null;\n  /** 用户名（用于生成缩写和颜色） */\n  name?: string;\n  /** 自定义 fallback 文字 */\n  fallbackText?: string;\n  /** 自定义 fallback 颜色 */\n  fallbackColor?: string;\n}\n\n/**\n * 用户头像组件\n *\n * @example\n * ```tsx\n * // 有头像图片\n * <UserAvatar src=\"/avatars/user1.jpg\" name=\"张三\" size={40} />\n *\n * // 无头像 -> 自动显示名字缩写 + 颜色\n * <UserAvatar name=\"张三\" size={40} />\n * // 显示 \"三\" 并自动分配背景色\n *\n * // 英文名\n * <UserAvatar name=\"John Doe\" size={40} />\n * // 显示 \"JD\"\n * ```\n */\nexport const UserAvatar = React.memo(function UserAvatar({\n  src,\n  name = '',\n  fallbackText,\n  fallbackColor,\n  style,\n  ...restProps\n}: UserAvatarProps): React.ReactElement {\n  const { token } = theme.useToken();\n  const [imgError, setImgError] = useState(false);\n\n  // 当 src 变化时重置错误状态，确保新图片可以正常加载\n  useEffect(() => {\n    setImgError(false);\n  }, [src]);\n\n  const initials = useMemo(\n    () => fallbackText ?? getInitials(name),\n    [name, fallbackText],\n  );\n  const bgColor = useMemo(\n    () => fallbackColor ?? getColorByName(name),\n    [name, fallbackColor],\n  );\n\n  const showImage = src && !imgError;\n\n  if (showImage) {\n    return (\n      <Avatar\n        src={src}\n        onError={() => {\n          setImgError(true);\n          return true;\n        }}\n        style={style}\n        {...restProps}\n      />\n    );\n  }\n\n  return (\n    <Avatar\n      style={{\n        backgroundColor: bgColor,\n        color: token.colorTextLightSolid,\n        fontWeight: 500,\n        ...style,\n      }}\n      {...restProps}\n    >\n      {initials}\n    </Avatar>\n  );\n});\n"]}