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 标准极客桌面规格。 */