diff --git a/components/QrCodePreview.tsx b/components/QrCodePreview.tsx index 13e5d8f..5640f03 100644 --- a/components/QrCodePreview.tsx +++ b/components/QrCodePreview.tsx @@ -1,7 +1,10 @@ -import { Download, Copy } from 'lucide-react'; +import React from 'react'; +import { Copy, Download } from 'lucide-react'; import { useLazyTranslation } from '@/utils/useLazyTranslation'; +import { cn } from '@/lib/utils'; // 1. 引入标准的 shadcn 工具函数 -interface QrCodePreviewProps { +// 继承原生 HTML Div 属性,方便外部无缝扩充类名或监听事件 +interface QrCodePreviewProps extends React.HTMLAttributes { /** 二维码 Data URL */ qrCodeDataUrl: string; /** 下载回调 */ @@ -10,39 +13,72 @@ interface QrCodePreviewProps { onCopy: () => void; } -const QrCodePreview = ({ qrCodeDataUrl, onDownload, onCopy }: QrCodePreviewProps) => { +const QrCodePreview = ({ + qrCodeDataUrl, + onDownload, + onCopy, + className, + ...props +}: QrCodePreviewProps) => { const { t } = useLazyTranslation('qrCode'); + // 空状态下的虚线骨架屏 if (!qrCodeDataUrl) { return ( -
- - {t('qrCode:qrCodeWillShow')} - +
+

{t('qrCode:qrCodeWillShow')}

); } return ( -
-
- QR Code -
+
+
+ {/* + 2. 二维码容器适配: + 在暗黑模式下,纯黑白的二维码如果直接暴露在暗色背景下,会导致手机摄像头极难识别。 + 通过裹一层 bg-white 和 p-3,确保黑白对比度绝对安全,同时加入 shadow 增强卡片感。 + */} +
+ QR Code Preview +
+ + {/* 3. 按钮群全面向 shadcn 官方 Button 视觉规范对齐 */} +
+ {/* 下载按钮:使用标准的次要按钮风格 (Outline) */} + + {/* 复制按钮:使用标准的主要行动按钮风格 (Default) */}
diff --git a/components/__tests__/QrCodePreview.test.tsx b/components/__tests__/QrCodePreview.test.tsx index efe3d20..d32d87a 100644 --- a/components/__tests__/QrCodePreview.test.tsx +++ b/components/__tests__/QrCodePreview.test.tsx @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; -import { render, screen, fireEvent } from '@testing-library/react'; +import { fireEvent, render, screen } from '@testing-library/react'; import QrCodePreview from '@/components/QrCodePreview'; describe('QrCodePreview 组件', () => { @@ -30,7 +30,7 @@ describe('QrCodePreview 组件', () => { onCopy={mockOnCopy} />, ); - const img = screen.getByAltText('QR Code'); + const img = screen.getByAltText('QR Code Preview'); expect(img).toBeInTheDocument(); expect(img).toHaveAttribute('src', testDataUrl); });