chore: 前端工程化 + Git hooks + 对齐 PathEditor 规范

- 新增 .gitattributes(CRLF 统一)+ rust-toolchain.toml
- 新增 Prettier + ESLint + markdownlint 配置
- 新增 Husky Git hooks(pre-commit lint-staged + commit-msg commitlint)
- 新增 vitest 前端测试(12 tests, utils/qrText.ts)
- 新增 @ 路径别名(vite + tsconfig)
- 新增 ROADMAP / SUPPORT / CODEOWNERS / FUNDING / dependabot
- 更新 .gitignore + .editorconfig
- 更新 package.json(新增 lint/format/test 脚本)
- 全项目 prettier 格式化 + eslint 通过
- 更新 CLAUDE.md + README.md
This commit is contained in:
2026-06-19 19:42:13 +08:00
parent ce8063431e
commit c3956f0f36
40 changed files with 4034 additions and 148 deletions
@@ -17,7 +17,7 @@ export default function HistoryList() {
const handleDelete = (e: React.MouseEvent, id: string) => {
e.stopPropagation();
const updated = state.history.filter(h => h.id !== id);
const updated = state.history.filter((h) => h.id !== id);
dispatch({ type: 'SET_HISTORY', payload: updated });
persistHistory(updated);
};
@@ -39,8 +39,10 @@ export default function HistoryList() {
📋
</span>
{state.history.length > 0 && (
<button onClick={handleClear}
className="text-xs text-red-400 hover:text-red-600 transition-colors">
<button
onClick={handleClear}
className="text-xs text-red-400 hover:text-red-600 transition-colors"
>
</button>
)}
@@ -50,10 +52,12 @@ export default function HistoryList() {
{state.history.length === 0 && (
<p className="text-xs text-gray-400 text-center py-4"></p>
)}
{state.history.map(entry => (
<div key={entry.id}
{state.history.map((entry) => (
<div
key={entry.id}
onClick={() => handleClick(entry)}
className="group flex items-center justify-between px-2 py-1.5 rounded-lg text-xs cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-800 transition-all">
className="group flex items-center justify-between px-2 py-1.5 rounded-lg text-xs cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-800 transition-all"
>
<div className="flex-1 min-w-0">
<div className="flex items-center gap-1.5">
<span className="px-1 py-0.5 rounded text-[10px] font-medium bg-blue-100 dark:bg-blue-900/30 text-blue-600 dark:text-blue-400">
@@ -65,8 +69,10 @@ export default function HistoryList() {
{entry.content.length > 20 ? entry.content.slice(0, 20) + '...' : entry.content}
</span>
</div>
<button onClick={(e) => handleDelete(e, entry.id)}
className="opacity-0 group-hover:opacity-100 text-red-400 hover:text-red-600 ml-1 transition-all text-lg leading-none">
<button
onClick={(e) => handleDelete(e, entry.id)}
className="opacity-0 group-hover:opacity-100 text-red-400 hover:text-red-600 ml-1 transition-all text-lg leading-none"
>
×
</button>
</div>