import { useCallback, useMemo, useState } from 'react'; import { Download, Trash2 } from 'lucide-react'; import { useI18n } from '@/utils/chromeI18n'; import CopyButton from '@/components/CopyButton'; import SwitchButtonGroup from '@/components/SwitchButtonGroup'; import { Button } from '@/components/ui/button'; // 💡 1. 全面回归规范:引入原生的 shadcn 原子 Button import { useStorageState } from '@/utils/useStorageState'; import type { HtmlToMarkdownPreviewMode } from '@/types/storage'; import { downloadMarkdownFile, htmlToMarkdown, SAMPLE_HTML } from '@/utils/htmlToMarkdown'; import { cn } from '@/lib/utils'; const isValidPreviewMode = (val: unknown): val is HtmlToMarkdownPreviewMode => typeof val === 'string' && ['split', 'preview', 'markdown'].includes(val); export default function HtmlToMarkdownPage() { const { t } = useI18n('htmlToMarkdown'); const [previewMode, setPreviewMode] = useStorageState( 'htmlToMarkdown/previewMode', 'split' as HtmlToMarkdownPreviewMode, isValidPreviewMode, ); const [html, setHtml] = useState(SAMPLE_HTML); const result = useMemo(() => htmlToMarkdown(html), [html]); const error = result.hasError ? (result.error ?? null) : null; const handleModeChange = useCallback( (newMode: HtmlToMarkdownPreviewMode) => { setPreviewMode(newMode); }, [setPreviewMode], ); const handleClear = useCallback(() => { setHtml(''); }, []); const handleDownload = useCallback(() => { if (result.markdown) { downloadMarkdownFile(result.markdown, 'converted.md'); } }, [result.markdown]); const showInput = previewMode !== 'preview'; const showOutput = previewMode !== 'markdown'; return ( /* 💡 统一间距尺寸: - 彻底清除多余的 container max-w-7xl 这种网页大边距, - 统一收拢为我们先前在 Dashboard 页、JSON 工具箱制定的 p-4 space-y-4 标准极客桌面规格。 */
{/* 工具栏集成区 */}
{/* 2. 重塑下载按钮:接入受控 Button,追加 active 物理微缩放动效 */} {/* 重塑清空按钮 */}
{/* 错误提示: - 💡 核心修复点:将硬编码的 bg-red-50 实色,完美超进化为系统的全自适应透明色变体 */} {error && (
{error}
)} {/* 双翼/单栏联动面板展示区 */}
{/* HTML 输入端卡片面板 */} {showInput && ( /* 3. 智能聚焦框联动(Focus Ring Clamping): - 外层容器追加 focus-within 变量追踪大闸。 - 只要用户用鼠标点击了内部的 textarea,外层整块精巧的圆角大边框会一帧内亮起 primary 系统的深色呼吸发光环, - 这种“全外包裹层框聚焦”的体验极大模仿了本地原生 IDE 的硬核专业体验! */
{/* 卡片头部:改用标准的灰色 bg-muted/50 */}
{t('inputLabel')} {t('charCount', { count: html.length })}