diff --git a/.workbuddy/memory/CHANGELOG.md b/.workbuddy/memory/CHANGELOG.md index 4457d74..394b376 100644 --- a/.workbuddy/memory/CHANGELOG.md +++ b/.workbuddy/memory/CHANGELOG.md @@ -1,6 +1,12 @@ # tool.xpcool.com 变更记录 > 倒序:最新在上。格式:YYYY-MM-DD | 类型 | 摘要 +2026-09-14 | FIX | 修复主题失效的头号坑:TDesign 浅/深色变量声明在 :root[theme-mode='light'|'dark'](权重 0,2,0),我们此前用 html[theme-mode='dark'](0,1,1),生产构建下被 UI 库深色变量反向覆盖(卡片退回 #242424、输入框描边退回 #ddd)。tokens.scss 与 tdesign-theme.scss 全部改用 :root[theme-mode=...];另记录验证方法:切主题后 getComputedStyle(body).backgroundColor 可能命中计算值缓存,需用探针元素或刷新后再读 + +2026-09-14 | CHG | 界面改版第二版「清晰蓝 · 卡片工作台」(解决「字体/下拉/控件太小」+ 补上 UI 库主题控制):① tokens.scss:主色青玉 #0c7c59 → 宝石蓝 #2563eb、中性色调改蓝灰(浅 f4f6fb/fff/0f1729,深 0b0f18/131926/e9eef8)、圆角放大一档(xs5/sm7/md10/lg12/xl16/2xl22)、字号整体上移一档(正文 14→16px、最小 13px、标题阶梯同步)、密度收敛(space-9 80→68、版心 1120→1200、顶栏 64→68、侧栏 248→268)、卡片由「无框发丝线」改回「白底 + 细描边」;② tdesign-theme.scss:品牌/中性/语义色阶换蓝体系 + 深色反向中性色阶,新增「UI 库尺度控制」段(--td-comp-size-m 32→40 即默认输入框/按钮/下拉高度、xl 40→48、xs/xxs/xxxs 24/20/16→28/24/18、--td-font-size-body-medium 14→16px、body-small 12→13px、title 14/16/18→16/18/20px、行高成对放宽、paddingTB/LR 放宽一档),控件尺度只改变量不再写死高度;③ 27 个 .vue 里残留的 11/12px 硬编码字号提升为 var(--tk-text-xs);④ 外壳与组件跟随:MainLayout(顶栏 68、命令入口 44、内容留白 32/48/72、抽屉 300)、SideNav(筛选框 42、导航项 padding 9/12、图标 19)、HomeView(hero 52、搜索底线 60、索引行 20、服务端卡片 38px 图标)、CommandPalette(搜索行 64、结果项 58、kbd 22)、UploadDrop(缩略图 56、删除热区 36)、AppBrand 36、ThemeSwitch/LocaleSwitch 40、HistoryPanel 条目 48;⑤ index.html 的 theme-color 与 unocss 的 panel/code-block/hint-text 同步。构建通过(vue-tsc + vite,22.86s) + +2026-09-14 | CHG | 界面改版为「更松弛的编辑感」(design-taste-frontend 技能,DESIGN_VARIANCE 6 / MOTION 3 / DENSITY 3):① tokens.scss 新增发丝线 --tk-hairline、排版令牌(--tk-leading-*/-track-*、--tk-text-5xl、--tk-font-display、--tk-space-9=80px)、顶栏高 60→64,并移除未用的 --tk-track-caps;② 全局排版:page-title 改 clamp(26,3vw,34)+640 字重、page-desc 15px/1.75、tool-section 间距 16→32、滚动条 10→8px、reveal 位移 14→10px;③ 容器去框化:t-card / UnoCSS panel 改 2xl 圆角 + hairline 描边 + 大内边距(.t-card .t-card__body 24/32,窄屏收回),品牌图标去掉全站唯一渐变改实色方块;④ 首页重写:删掉 eyebrow 与重复的 hero 链接,标题 58px 左对齐 + 底线式搜索框(聚焦加粗为 2px),事实条去边框,58 个工具改为「发丝线索引行」(图标常态中性灰、hover 才上主色);⑤ 外壳:侧栏去底色与右侧竖线(hover 改用 --tk-surface 统一「抬起」方向)、筛选框改底线式、内容区留白 28→40/48/88、页脚改左右分列 + hairline;⑥ HistoryPanel 改用 --tk-* 令牌与发丝线分行(此前有硬编码 --td-* 与 6px 圆角);⑦ 清理 4 份语言包中已失效的 home.eyebrow/ctaPrimary/ctaSecondary。构建通过(vue-tsc + vite,32.17s) + 2026-09-14 | CHG | 视觉重设计 + 中英日韩四语言 + 三态昼夜主题 + 服务端接口对接(一大批):① 新增 tokens.scss(--tk-* 设计令牌:青玉 Jade 单一强调色、圆角/间距/字号/z-index/动效规范、按语言切换字体栈)+ tdesign-theme.scss(--tk-* → --td-* 桥接,含完整冷调灰阶),60+ 未改动工具页零成本继承新配色;② vue-i18n 11.4.10 + zh-CN/en-US/ja-JP/ko-KR 四份完整语言包 + helpers 中文兜底;③ MainLayout/SideNav/HomeView 重写、新增 CommandPalette(⌘K)/LocaleSwitch(显示 ZH/EN/JA/KO 不用国旗)/ThemeSwitch(三态);④ 新增 openTools.ts 对接 service.xpcool.com /api/service/open/tools 的 5 个接口(实测全 200),改造 ip-info/uuid/hash/timestamp 并新增 random-string/api-status 两工具(均本机+服务端双模式,默认本机);⑤ 修复空分类渲染缺陷(分类 9→6)、panel 快捷类缺内边距、IpInfoView 漏 onBeforeUnmount;⑥ 新增 src/config.ts 集中站点常量,页脚补备案号 黔ICP备2026003933号;⑦ 重写 docs/api-contract.md(旧契约 /api/tools/* 与实际不符)。构建通过(vue-tsc + vite,33.88s) 2026-09-01 | CHG | 全站接入图片预览(TDesign ImageViewer):新增共享 AppImageViewer 组件 + useImageViewer 组合式函数;接入 9 处——UploadDrop 缩略图、Base64 还原图、图片裁剪结果、图片转 ICO 预览(多尺寸成组)、OCR 待识别图、二维码结果、图片压缩(原直连 t-image-viewer 重构为共享组件)、代码转图片画布、占位图画布;全局样式新增 .img-previewable diff --git a/agents.md b/agents.md index ddb5300..bf6eaff 100644 --- a/agents.md +++ b/agents.md @@ -77,11 +77,19 @@ export interface ToolItem { - 文本类工具:`text` 存输入原文,点击历史回填输入框。 - 文件类工具(图片压缩/裁剪等):文件本体**不要**存入 localStorage(会撑爆配额),改为存「文件名 | 关键参数」形式的摘要,点击历史只恢复参数。 -### 3.3 主题机制 +### 3.3 主题机制(色彩 + UI 库尺度两套变量) - TDesign 通过 `document.documentElement.setAttribute('theme-mode', 'dark')` 切换暗黑模式。 - `stores/theme.ts` 负责切换 + 持久化(key:`tool-theme`);`index.html` 内联脚本在挂载前预置属性防闪烁;`main.ts` 再同步一次。 -- **自定义样式一律使用 `var(--td-*)` 令牌**(如 `--td-bg-color-page`、`--td-text-color-primary`、`--td-brand-color`),禁止硬编码颜色,否则暗黑模式会破版。 +- **两套变量各管一段**: + - `src/assets/styles/tokens.scss` 定义 `--tk-*`(配色 / 圆角 / 间距 / **字号** / 动效),是全站唯一真相源; + - `src/assets/styles/tdesign-theme.scss` 把 `--tk-*` 映射为 `--td-*`,并**额外接管 UI 库自身的尺度**: + `--td-comp-size-*`(控件高度,默认控件 40px)、`--td-comp-paddingTB/LR-*`、`--td-font-size-*`、 + `--td-line-height-*`。放大按钮 / 输入框 / 下拉请改这里,**不要给单个组件写死 height**。 +- **自定义样式一律使用 `var(--tk-*)`(或 `var(--td-*)`)令牌**,禁止硬编码颜色与字号,否则暗黑模式会破版。 +- **头号坑**:主题变量必须声明在 `:root[theme-mode='light'|'dark']` 里,**不能写 `html[theme-mode='dark']`** —— + TDesign 自己用的是前者(权重 0,2,0 且后加载者胜),写成后者(0,1,1)会被 UI 库的深色变量盖掉, + 表现为「深色下组件退回 UI 库自带灰(卡片 #242424、描边 #ddd)」。 ### 3.4 公共组件 diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index aee8bad..e2988b5 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -5,6 +5,115 @@ --- +## 2026-09-14 第八批:修「字太小」+ 换风格为「清晰蓝 · 卡片工作台」+ 补上 UI 库主题控制 + +> 用户反馈:① 界面字体、下拉与功能控件都太小;② 再换一种风格;③ UI 库(TDesign)的主题此前没有真正接上, +> 需要用主题变量控制组件的色彩与风格。 +> 三者一并处理:换主色与密度(风格)→ 放大令牌与控件(太小)→ 用 `--td-comp-*` / `--td-font-*` 接管 TDesign 尺度(主题控制)。 +> 构建通过(`vue-tsc --noEmit` + `vite build`,22.86s)。 + +### ⚠️ 本轮挖出的头号坑:`theme-mode` 选择器权重 +TDesign 的浅/深色变量声明在 `:root[theme-mode='light'|'dark']`(权重 0,2,0), +而上一版我们写的是 `html[theme-mode='dark']`(0,1,1)—— 生产构建里即便我们的 CSS 排在 vendor CSS 之后, +**仍会被 UI 库的深色变量盖掉**。表现:深色下卡片/输入框用回 TDesign 自带灰(卡片 `#242424`、描边 `#ddd`)。 +**修复:tokens.scss 与 tdesign-theme.scss 全部改用 `:root[theme-mode=...]`(与 TDesign 同级权重 + 后加载者胜)。** +(验证提醒:切完主题别只看 `getComputedStyle(body).backgroundColor`,它可能命中计算值缓存,需用探针元素或刷新后再读。) + +### 🎨 风格:青玉编辑感 → 宝石蓝 · 卡片工作台 +- 主色:青玉 `#0c7c59` → 宝石蓝 `#2563eb`(与白底 5.17:1 过 AA;深色下按钮底同色 + 白字,链接另用 `#7aa8ff`)。 +- 中性色:青灰 → 蓝灰(浅 `#f4f6fb / #ffffff / #0f1729`,深 `#0b0f18 / #131926 / #e9eef8`); + 品牌/中性/语义三级色板与 `index.html` 的 `theme-color` 同步更新。 +- 形状:圆角整体放大一档(xs5 / sm7 / md10 / lg12 / xl16 / 2xl22); + 卡片由「无框发丝线」改回「白底 + 细描边」,重新有边界感(仅列表条目分隔线仍用 `--tk-hairline`)。 +- 密度:`--tk-space-9` 80→68、版心 1120→1200、顶栏 64→68、侧栏 248→268。 + +### 🔠 字号整体放大一档(tokens.scss) +- 旧 → 新:`12→13 / 13→14 / 14→16 / 15→17 / 17→19 / 20→22 / 26→28 / 34→36 / 44→46 / 58→52`。 +- **正文基准 16px**,全站最小字号 13px(`--tk-text-xs`)。 +- **工具页里残留的 11px/12px 硬编码字号一次性提升为 `var(--tk-text-xs)`**(27 个 `.vue` 文件)。 + +### 🧩 UI 库主题控制(tdesign-theme.scss 新增第 ③ 段,本轮核心) +TDesign 组件样式完全建立在 `--td-*` 变量之上(例如 `.t-input.t-size-l { height: var(--td-comp-size-xl) }`), +所以「控件太小」的正解是改变量,而不是逐个组件写 CSS: + +| 变量分组 | TDesign 默认 | 本版 | 影响面 | +| --- | --- | --- | --- | +| `--td-comp-size-m`(默认控件) | 32px | **40px** | 输入框 / 按钮 / 下拉 / 日期选择器 | +| `--td-comp-size-xl`(large) | 40px | 48px | large 尺寸控件 | +| `--td-comp-size-xs / xxs / xxxs` | 24 / 20 / 16px | 28 / 24 / 18px | 小按钮、标签、复选框 | +| `--td-font-size-body-medium` | 14px | **16px** | 控件文字(与正文同号) | +| `--td-font-size-body-small` | 12px | 13px | 小标签、说明 | +| `--td-font-size-title-*` | 14/16/18px | 16/18/20px | 卡片标题、分组标题 | +| `--td-line-height-body-*` | 20/22/24px | 22/24/26px | **必须与字号成对改**,否则大字号被行高挤住 | +| `--td-comp-paddingTB / LR-*` | size 阶梯 | 放宽一档 | 控件内边距,避免大控件里文字贴边 | + +- 只覆盖 `--td-comp-*`,**不动 `--td-size-*` 原子刻度**(图标/徽标/间距都在用它)。 +- 深色中性色阶(反向,1 最深 → 14 最浅)补进 `:root[theme-mode='dark']`,避免组件在深色下退回 UI 库冷灰。 +- 下拉:`--td-comp-size-m` 放大后 `.t-select-option` / `.t-dropdown__item` 行高自动跟随,仅补一条字号保险。 + +### 🧱 外壳、首页与公共组件(跟随新尺度) +- `MainLayout`:顶栏 68px、命令面板入口 44px、图标按钮 40px、内容区留白 32/48/72、移动端抽屉宽 300。 +- `SideNav`:筛选框 42px、导航项 padding 9/12(行高约 43px)、图标 19px、活动指示条 3×18px。 +- `HomeView`:hero 标题 52px、搜索底线 60px、工具索引行 padding 20px、服务端卡片图标 38px + 轻投影。 +- 公共组件:`CommandPalette`(搜索行 64px、结果项 58px、kbd 22px)、`UploadDrop`(拖拽区加大、 + 缩略图 56px、删除按钮热区 36px)、`AppBrand`(标记 36px)、`ThemeSwitch` / `LocaleSwitch`(40px 高)、 + `HistoryPanel`(条目最小高 48px、操作按钮热区撑大)。 +- `unocss.config.ts` 的 `panel`(改实描边 + 更大内边距)、`code-block`(14px)、`hint-text`(13px)跟随放大。 + +--- + +## 2026-09-14 第七批:界面改版 →「更松弛的编辑感」 + +> 用户反馈对现有主题界面仍不满意,经方向选择后定为**编辑感(Editorial)**: +> 加大留白与字号反差,卡片几乎无边框,靠排版与呼吸感建立层次。 +> 依据 `design-taste-frontend` 技能执行,旋钮 `DESIGN_VARIANCE 6` / `MOTION_INTENSITY 3` / `VISUAL_DENSITY 3`。 +> 构建通过(`vue-tsc --noEmit` + `vite build`,32.17s)。 + +### 🎯 本轮解决的三个真实问题 +1. **首页 hero 超标**:eyebrow + 标题 + 描述 + 搜索框 + 文字链接共 5 个文字元素(超过 hero 上限 4), + 且 eyebrow 是模板化开场 → **删掉 eyebrow 与重复的 hero 链接**(服务端专区入口已在下方,同意图不出现两次)。 +2. **58 张卡片长得一模一样**:全部 14px 圆角 + 1px 描边 + 绿底图标,重复得没有节奏 + → 改为**发丝线索引行**(像书末索引),图标常态中性灰、hover 才上主色。 +3. **层次全靠边框与底纹堆出来**,排版本身承担的信息层级偏弱 + → 标题 58px / 说明 17px 拉开反差,分区之间改用 80px 留白而非横线。 + +### 🧱 令牌层(tokens.scss) +- 新增 `--tk-hairline`(浅 `#e7ecea` / 深 `#232b29`):内容容器与条目分隔线用它; + **功能控件仍用 `--tk-border`**,两类不要互换。 +- 新增排版令牌:`--tk-text-5xl`(58px)、`--tk-leading-display/title/body`、 + `--tk-track-display/title`、`--tk-font-display`。其中展示字体显式等于系统字体族 —— + 中文环境下可用的展示字体就是系统字体本身,引入网络 CJK 展示字体要多付 2MB+ 首屏成本。 +- `--tk-space-9`(80px) 专用于分区之间;`--tk-header-h` 60 → 64。 +- 移除未使用的 `--tk-track-caps`(不在 CJK 场景下用宽字距)。 + +### 📐 全局排版与容器(index.scss / unocss.config.ts / tdesign-theme.scss) +- `.page-title` → `clamp(26px, 3vw, 34px)` + 字重 640;`.page-desc` → 15px / 1.75 / `max-width: 62ch`; + `.tool-section` 间距 16 → 32px;新增 `.section-heading` 与 `.rule`。 +- `t-card` / UnoCSS `panel`:**圆角 → 2xl、描边 → 发丝线、内边距放大一档**(`p-5 md:p-7`、 + `.t-card .t-card__body` 24/32,窄屏在 `@media (max-width: 767px)` 收回)。 +- 滚动条 10 → 8px;`.reveal` 位移 14 → 10px(编辑感入场要「不动声色」)。 + +### 🏠 首页重写(HomeView.vue) +- 抬头区:58px 左对齐标题 + 一句说明 + **底线式搜索框**(聚焦时底线加粗为 2px, + 用 `box-shadow` 叠加避免 `border-width` 变化引起 1px 位移;输入框自身不画焦点环)。 +- 事实条去掉全部边框与底纹,数字直接摊在纸面上。 +- 服务端专区保留青玉底纹(全站唯一),是分区层级的锚点。 +- 分类目录 = 标题 + 数量注记 + 说明 + 发丝线索引网格(列间距 52px,避免两栏读串行)。 + +### 🧭 外壳(MainLayout / SideNav / AppBrand) +- 侧栏**去掉底色块与右侧竖线**,与正文落在同一张纸面上;hover 改用 `--tk-surface` + (浅色下更亮、深色下也更亮,两种主题都是同一种「抬起」方向)。 +- 侧栏筛选框改为底线式;内容区留白 28/28/56 → **40/48/88**;页脚改左右分列 + 发丝线。 +- 品牌图标**去掉全站唯一渐变**,改实色小方块(渐变会把视线从标题上拽走), + 品牌辨识度改由字重与字距承担。 + +### ♻️ 顺带修复 +- `HistoryPanel.vue` 此前混用硬编码的 `--td-*` 与写死的 `border-radius: 6px`, + 违反「样式一律用 `--tk-*`」的硬规则,且每条历史都套一个描边盒子;已改为 `--tk-*` 令牌 + 发丝线分行。 +- 清理 4 份语言包中已失效的 `home.eyebrow` / `home.ctaPrimary` / `home.ctaSecondary`。 + +--- + ## 2026-09-14 第六批:视觉重设计 + 中英日韩四语言 + 昼夜主题 + 服务端接口对接 > 依据 `design-taste-frontend` 技能(BRIEF INFERENCE / 单一强调色 / 形状一致性 / 反 AI-slop 清单)重建全站视觉体系, diff --git a/docs/PROJECT_STATE.md b/docs/PROJECT_STATE.md index 098fcc8..9e2eb7d 100644 --- a/docs/PROJECT_STATE.md +++ b/docs/PROJECT_STATE.md @@ -49,13 +49,36 @@ - `ToolItem.needsNetwork` 标记需联网工具(侧栏圆点 + 首页服务端工具专区)。 - `groupedTools()` / `networkTools()` / `searchTools()` 供首页、服务端专区、命令面板使用。 -### 3.2 视觉体系(令牌 → TDesign 桥接) +### 3.2 视觉体系(令牌 → TDesign 桥接 + UI 库主题控制) - **唯一真相源**:`src/assets/styles/tokens.scss` 定义全部 `--tk-*` 令牌(颜色/圆角/间距/字号/z-index/动效/字体栈)。 -- **桥接层**:`src/assets/styles/tdesign-theme.scss` 把 `--tk-*` 映射到 TDesign 的 `--td-*`。 - **改主题只需改 tokens.scss 一处,60+ 个未改动的工具页会自动继承新配色与圆角** —— 这是低风险全站改造的关键机制。 -- **硬规则**:自定义样式一律引用 `--tk-*`(或 `--td-*`),**禁止硬编码色值/圆角/阴影**,否则昼夜切换会花掉。 -- **形状一致性**:全站只用 tokens 里那一套圆角(xs4/sm6/md8/lg10/xl14/2xl20/pill999)。 -- **单一强调色**:青玉 Jade。全站只允许一处渐变(品牌图标)。 +- **桥接层 + UI 库主题控制**:`src/assets/styles/tdesign-theme.scss` 除了把 `--tk-*` 映射到 `--td-*`, + 还接管两件「UI 库自身」的事: + 1. **组件尺度**:`--td-comp-size-*`(控件高度阶梯)、`--td-comp-paddingTB/LR-*`、`--td-font-size-*`、 + `--td-line-height-*`。**TDesign 的输入框 / 按钮 / 下拉 / 日期选择器高度全部取自这些变量** + (例如 `.t-input.t-size-l { height: var(--td-comp-size-xl) }`),所以放大控件只需改这一处, + **不要再给单个组件写死高度或字号**。 + 2. **色阶**:品牌 / 中性 / 语义的 10 级色板。注意深色下的中性色阶是**反向**的(1 最深 → 14 最浅), + 且必须显式覆盖,否则组件会退回 TDesign 自带的冷灰。 + **改主题 = 改 tokens.scss(配色/字号/圆角/间距)+ tdesign-theme.scss(UI 库尺度与色阶)两处**, + 60+ 个未改动的工具页自动继承 —— 这是低风险全站改造的关键机制。 +- **硬规则**:自定义样式一律引用 `--tk-*`(或 `--td-*`),**禁止硬编码色值/圆角/阴影/字号**,否则昼夜切换会花掉。 +- **形状一致性**:全站只用 tokens 里那一套圆角(xs5/sm7/md10/lg12/xl16/2xl22/pill999)。 +- **单一强调色**:宝石蓝 `#2563eb`。**全站已无任何渐变**(品牌图标为实色圆角方块)。 + 强调色只出现在需要「指向」的地方:hover 的条目、活动导航项、服务端专区底纹、正文链接。 +- **设计方向(2026-09-14 第二次改版):清晰蓝 · 卡片工作台**。四条硬规则: + 1. **字号整体放大一档**:正文 16px 起、说明文字不低于 13px(上一版 12/13/14 的密度在 1080p 屏上偏小); + 2. **控件大于内容**:输入框 / 按钮 / 下拉默认 40px 高、16px 文字,可点区域永远比正文更「实」; + 3. **容器有边界**:卡片用「白底 + 细描边(`--tk-border`)」与页面底(`--tk-bg`)拉开层次,不再追求无框纸面; + 4. **主色单一**:全站只有一个强调色。 +- **发丝线 `--tk-hairline`**:只用于**列表条目之间的分隔线**(历史列表、首页索引行); + 内容容器边界与功能控件(输入框/按钮/下拉)一律用 `--tk-border`。 +- **留白节奏**:分区之间用 `--tk-space-9`(68px)分隔,**不画横线** —— 留白本身就是分隔符。 + 窄屏按断点阶梯式收回(`≤1279px` → `≤1023px` → `≤767px`),不要一档切到底。 +- **排版令牌必须成对使用**:大字号配负字距 + 紧行高(`--tk-track-display/-title` + + `--tk-leading-display/-body`),小字号配正字距 + 松行高。混用(大字号配松行高)会让层级立刻垮掉。 +- **首页是目录,不是卡片墙**:58 个工具用「索引行」呈现(发丝线分隔),不做 58 个描边盒子; + 图标常态中性灰,主色只在 hover 时出现(58 个图标全染主色会把主色的含义稀释掉); + 仅「服务端工具专区」用整块底纹 + 卡片与其它分区区分。 - **动效档位**:克制(上浮淡入 + 颜色过渡),`prefers-reduced-motion` 下全部降为 0ms。 - `v-reveal` 指令(`src/directives/reveal.ts`)做滚动进入,传数字错峰。 @@ -113,6 +136,8 @@ - **Vue 模板 attribute**:内嵌字符串不能直接写 `\"`(HTML 解析器会把 `"` 当属性结束符导致编译错误),字符串常量移到 ` @@ -26,34 +29,36 @@ const { t } = useI18n() .brand { display: inline-flex; align-items: center; - gap: 10px; + gap: 9px; text-decoration: none; color: inherit; flex-shrink: 0; } .brand-mark { - width: 32px; - height: 32px; + width: 36px; + height: 36px; display: inline-flex; align-items: center; justify-content: center; border-radius: var(--tk-radius-md); - font-size: 19px; - color: #fff; - /* 唯一渐变:青玉由深到浅,与强调色同色系 */ - background: linear-gradient(140deg, var(--tk-accent) 0%, #2fb98d 100%); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.28); - transition: transform var(--tk-dur-base) var(--tk-ease-out); + font-size: 21px; + color: var(--tk-text-on-accent); + background: var(--tk-accent); + transition: + background-color var(--tk-dur-base) var(--tk-ease-out), + transform var(--tk-dur-base) var(--tk-ease-out); } .brand:hover .brand-mark { - transform: rotate(-6deg) scale(1.04); + background: var(--tk-accent-hover); + transform: scale(1.04); } .brand-text { + font-family: var(--tk-font-display); font-size: var(--tk-text-lg); font-weight: 650; - letter-spacing: -0.02em; + letter-spacing: var(--tk-track-title); color: var(--tk-text); white-space: nowrap; } diff --git a/src/components/common/CommandPalette.vue b/src/components/common/CommandPalette.vue index 77a6d99..6e35fdc 100644 --- a/src/components/common/CommandPalette.vue +++ b/src/components/common/CommandPalette.vue @@ -252,8 +252,8 @@ onBeforeUnmount(() => { .palette-panel { width: 100%; - max-width: 620px; - max-height: 68vh; + max-width: 680px; + max-height: 70vh; display: flex; flex-direction: column; overflow: hidden; @@ -267,14 +267,14 @@ onBeforeUnmount(() => { .palette-search { display: flex; align-items: center; - gap: 10px; - padding: 0 12px 0 16px; - height: 56px; + gap: 12px; + padding: 0 14px 0 18px; + height: 64px; flex-shrink: 0; border-bottom: 1px solid var(--tk-border-subtle); } .search-icon { - font-size: 18px; + font-size: 20px; color: var(--tk-text-placeholder); flex-shrink: 0; } @@ -286,7 +286,7 @@ onBeforeUnmount(() => { outline: none; background: transparent; font-family: inherit; - font-size: var(--tk-text-md); + font-size: var(--tk-text-lg); color: var(--tk-text); } .search-input::placeholder { @@ -294,17 +294,17 @@ onBeforeUnmount(() => { } .close-btn { flex-shrink: 0; - width: 30px; - height: 30px; + width: 36px; + height: 36px; display: inline-flex; align-items: center; justify-content: center; border: none; - border-radius: var(--tk-radius-sm); + border-radius: var(--tk-radius-md); background: transparent; color: var(--tk-text-placeholder); cursor: pointer; - font-size: 16px; + font-size: 18px; } .close-btn:hover { background: var(--tk-surface-hover); @@ -315,15 +315,16 @@ onBeforeUnmount(() => { .palette-list { flex: 1; overflow-y: auto; - padding: 6px; + padding: 8px; overscroll-behavior: contain; } .palette-item { width: 100%; display: flex; align-items: center; - gap: 12px; - padding: 9px 12px; + gap: 14px; + min-height: 58px; + padding: 10px 14px; border: none; border-radius: var(--tk-radius-md); background: transparent; @@ -337,13 +338,13 @@ onBeforeUnmount(() => { } .item-icon { flex-shrink: 0; - width: 30px; - height: 30px; + width: 36px; + height: 36px; display: inline-flex; align-items: center; justify-content: center; - border-radius: var(--tk-radius-sm); - font-size: 17px; + border-radius: var(--tk-radius-md); + font-size: 19px; color: var(--tk-accent-text); background: var(--tk-surface-sunken); } @@ -355,7 +356,7 @@ onBeforeUnmount(() => { min-width: 0; display: flex; flex-direction: column; - gap: 1px; + gap: 2px; } .item-name { font-size: var(--tk-text-base); @@ -366,7 +367,7 @@ onBeforeUnmount(() => { white-space: nowrap; } .item-desc { - font-size: var(--tk-text-xs); + font-size: var(--tk-text-sm); color: var(--tk-text-placeholder); overflow: hidden; text-overflow: ellipsis; @@ -374,9 +375,9 @@ onBeforeUnmount(() => { } .item-badge { flex-shrink: 0; - padding: 1px 7px; + padding: 2px 9px; border-radius: var(--tk-radius-pill); - font-size: 11px; + font-size: var(--tk-text-xs); font-weight: 500; color: var(--tk-accent-text); background: var(--tk-accent-surface-strong); @@ -408,8 +409,8 @@ onBeforeUnmount(() => { .palette-foot { flex-shrink: 0; display: flex; - gap: 16px; - padding: 8px 16px; + gap: 18px; + padding: 10px 18px; border-top: 1px solid var(--tk-border-subtle); background: var(--tk-surface); font-size: var(--tk-text-xs); @@ -418,20 +419,20 @@ onBeforeUnmount(() => { .foot-item { display: inline-flex; align-items: center; - gap: 4px; + gap: 5px; } .palette-foot kbd { display: inline-flex; align-items: center; justify-content: center; - min-width: 18px; - height: 18px; - padding: 0 4px; + min-width: 22px; + height: 22px; + padding: 0 5px; border: 1px solid var(--tk-border); border-radius: var(--tk-radius-xs); background: var(--tk-surface-raised); font-family: inherit; - font-size: 11px; + font-size: var(--tk-text-xs); color: var(--tk-text-secondary); } diff --git a/src/components/common/HistoryPanel.vue b/src/components/common/HistoryPanel.vue index 0374c8a..2ad2527 100644 --- a/src/components/common/HistoryPanel.vue +++ b/src/components/common/HistoryPanel.vue @@ -2,7 +2,9 @@
历史记录 - 清空 + + 清空 +
@@ -192,13 +192,13 @@ function removeAt(i: number) { .drop-zone { position: relative; border: 2px dashed var(--td-border-level-2-color); - border-radius: 8px; - padding: 24px 16px; + border-radius: var(--tk-radius-lg); + padding: 32px 20px; text-align: center; cursor: pointer; transition: - border-color 0.2s, - background-color 0.2s; + border-color var(--tk-dur-fast) var(--tk-ease-out), + background-color var(--tk-dur-fast) var(--tk-ease-out); } .drop-zone:hover, .drop-zone.dragging { @@ -209,17 +209,17 @@ function removeAt(i: number) { display: none; } .empty-icon { - font-size: 40px; + font-size: 46px; color: var(--td-brand-color); } .tip { - margin: 8px 0 4px; - font-size: 14px; + margin: 10px 0 6px; + font-size: var(--tk-text-md); color: var(--td-text-color-primary); } .sub { margin: 0; - font-size: 12px; + font-size: var(--tk-text-sm); color: var(--td-text-color-placeholder); } .drop-overlay { @@ -233,10 +233,10 @@ function removeAt(i: number) { flex-direction: column; align-items: center; justify-content: center; - gap: 8px; - border-radius: 8px; - font-size: 15px; - font-weight: 500; + gap: 10px; + border-radius: var(--tk-radius-lg); + font-size: var(--tk-text-md); + font-weight: 550; color: var(--td-brand-color); background: var(--td-brand-color-light); pointer-events: none; @@ -244,22 +244,22 @@ function removeAt(i: number) { .file-list { display: flex; flex-direction: column; - gap: 8px; + gap: 10px; text-align: left; } .file-item { display: flex; align-items: center; - gap: 10px; - padding: 8px 10px; + gap: 12px; + padding: 10px 12px; border: 1px solid var(--td-border-level-1-color); - border-radius: 6px; + border-radius: var(--tk-radius-md); background: var(--td-bg-color-container); } .thumb { - width: 48px; - height: 48px; - border-radius: 6px; + width: 56px; + height: 56px; + border-radius: var(--tk-radius-sm); object-fit: cover; flex-shrink: 0; border: 1px solid var(--td-border-level-1-color); @@ -268,14 +268,14 @@ function removeAt(i: number) { display: inline-flex; align-items: center; justify-content: center; - font-size: 22px; + font-size: 24px; color: var(--td-text-color-placeholder); background: var(--td-bg-color-secondarycontainer); } /* 可点击预览的缩略图 */ .thumb-clickable { cursor: zoom-in; - transition: transform 0.15s; + transition: transform var(--tk-dur-fast) var(--tk-ease-out); } .thumb-clickable:hover { transform: scale(1.06); @@ -285,25 +285,30 @@ function removeAt(i: number) { min-width: 0; display: flex; flex-direction: column; - gap: 2px; + gap: 3px; } .name { - font-size: 13px; + font-size: var(--tk-text-base); color: var(--td-text-color-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .size { - font-size: 12px; + font-size: var(--tk-text-sm); color: var(--td-text-color-placeholder); } +/* 删除按钮:t-button size=small 在这版主题下只有 24px,热区太小, + * 这里把它撑到 36px,仍保持「图标按钮」的形态 */ .remove-btn { flex-shrink: 0; + min-width: 36px; + min-height: 36px; + font-size: 17px; } .add-more { margin: 2px 0 0; - font-size: 12px; + font-size: var(--tk-text-sm); color: var(--td-text-color-placeholder); text-align: center; } diff --git a/src/i18n/locales/en-US.ts b/src/i18n/locales/en-US.ts index c1189b5..63af419 100644 --- a/src/i18n/locales/en-US.ts +++ b/src/i18n/locales/en-US.ts @@ -63,11 +63,8 @@ export default { }, home: { - eyebrow: 'Runs locally in your browser', title: 'A toolbox that lives in your browser', desc: '{count} everyday utilities. Every calculation and file operation happens on your own machine.', - ctaPrimary: 'Browse all tools', - ctaSecondary: 'Server tools', statTools: 'Available tools', statCategories: 'Categories', statUpload: 'Data uploaded to a server', diff --git a/src/i18n/locales/ja-JP.ts b/src/i18n/locales/ja-JP.ts index 236568b..4d99c36 100644 --- a/src/i18n/locales/ja-JP.ts +++ b/src/i18n/locales/ja-JP.ts @@ -63,11 +63,8 @@ export default { }, home: { - eyebrow: 'ブラウザ内で動作', title: 'ブラウザだけで使えるツールボックス', desc: '{count} の日常ツール。計算もファイル処理もすべて端末内で完結します。', - ctaPrimary: 'すべてのツール', - ctaSecondary: 'サーバー連携ツール', statTools: '利用できるツール', statCategories: 'カテゴリ', statUpload: 'サーバーへの送信データ', diff --git a/src/i18n/locales/ko-KR.ts b/src/i18n/locales/ko-KR.ts index d7f77c0..d724b7c 100644 --- a/src/i18n/locales/ko-KR.ts +++ b/src/i18n/locales/ko-KR.ts @@ -63,11 +63,8 @@ export default { }, home: { - eyebrow: '브라우저에서 바로 실행', title: '브라우저만 있으면 되는 툴박스', desc: '일상 도구 {count}개. 계산과 파일 처리가 모두 내 기기에서 끝납니다.', - ctaPrimary: '전체 도구 보기', - ctaSecondary: '서버 연동 도구', statTools: '사용 가능한 도구', statCategories: '분류', statUpload: '서버로 전송되는 데이터', diff --git a/src/i18n/locales/zh-CN.ts b/src/i18n/locales/zh-CN.ts index 1ead586..66366ca 100644 --- a/src/i18n/locales/zh-CN.ts +++ b/src/i18n/locales/zh-CN.ts @@ -76,11 +76,8 @@ export default { }, home: { - eyebrow: '浏览器本地运行', title: '在浏览器里就能用的工具箱', desc: '{count} 个日常工具,计算与文件处理全部在本机完成,数据不上传服务器。', - ctaPrimary: '浏览全部工具', - ctaSecondary: '服务端工具', statTools: '可用工具', statCategories: '工具分类', statUpload: '上传到服务器的数据', diff --git a/src/layout/MainLayout.vue b/src/layout/MainLayout.vue index 2b861c8..a865209 100644 --- a/src/layout/MainLayout.vue +++ b/src/layout/MainLayout.vue @@ -75,7 +75,7 @@ { height: 100%; max-width: var(--tk-shell-max); margin: 0 auto; - padding: 0 16px; + padding: 0 24px; display: flex; align-items: center; - gap: 12px; + gap: 14px; } .header-left { display: flex; @@ -177,8 +180,8 @@ const shortcutLabel = computed(() => { /* 顶栏图标按钮(移动端菜单) */ .icon-btn { - width: 34px; - height: 34px; + width: 40px; + height: 40px; display: inline-flex; align-items: center; justify-content: center; @@ -187,7 +190,7 @@ const shortcutLabel = computed(() => { background: transparent; color: var(--tk-text-secondary); cursor: pointer; - font-size: 18px; + font-size: 20px; } .icon-btn:hover { background: var(--tk-surface-hover); @@ -197,18 +200,22 @@ const shortcutLabel = computed(() => { display: none; } -/* 命令面板入口:长得像搜索框,本质是按钮(点开面板而非直接输入) */ +/* 命令面板入口:长得像搜索框,本质是按钮(点开面板而非直接输入)。 + * 用无描边的「安静底纹」而不是带边框的输入框: + * 它不是一个可以直接打字的输入框,画成输入框会让人先去点它再发现要跳面板。 + * 放大镜图标 + 占位文案 + 快捷键角标三重提示已经足够表达可搜索。 + * 高度 44px 与站点默认控件同高,顶栏一眼看去是一排等高的可点区域。 */ .palette-trigger { width: 100%; - max-width: 460px; - height: 36px; + max-width: 520px; + height: 44px; display: flex; align-items: center; - gap: 9px; - padding: 0 10px 0 12px; - border: 1px solid var(--tk-border); + gap: 10px; + padding: 0 10px 0 14px; + border: 1px solid transparent; border-radius: var(--tk-radius-md); - background: var(--tk-surface); + background: var(--tk-surface-sunken); color: var(--tk-text-placeholder); font-family: inherit; font-size: var(--tk-text-base); @@ -218,15 +225,14 @@ const shortcutLabel = computed(() => { background-color var(--tk-dur-fast) var(--tk-ease-out); } .palette-trigger:hover { - border-color: var(--tk-border-strong); - background: var(--tk-surface-hover); + background: var(--tk-surface-active); color: var(--tk-text-secondary); } .palette-trigger:active { transform: translateY(1px); } .trigger-icon { - font-size: 16px; + font-size: 18px; flex-shrink: 0; } .trigger-text { @@ -239,13 +245,13 @@ const shortcutLabel = computed(() => { } .trigger-kbd { flex-shrink: 0; - padding: 1px 6px; + padding: 2px 7px; border: 1px solid var(--tk-border); border-radius: var(--tk-radius-xs); background: var(--tk-surface-sunken); font-family: inherit; - font-size: 11px; - line-height: 16px; + font-size: var(--tk-text-xs); + line-height: 18px; color: var(--tk-text-placeholder); } @@ -259,7 +265,10 @@ const shortcutLabel = computed(() => { align-items: flex-start; } -/* 左侧固定导航(PC 端) */ +/* 左侧固定导航(PC 端) + * 侧栏与正文共用同一张页面底,仅靠留白与字号区分层级; + * 导航项 hover 用 --tk-surface(浅色下更亮的白、深色下同样更亮), + * 两种主题下都是「抬起」的方向感。 */ .app-aside { width: var(--tk-aside-w); flex-shrink: 0; @@ -268,31 +277,34 @@ const shortcutLabel = computed(() => { height: calc(100dvh - var(--tk-header-h)); overflow-y: auto; overscroll-behavior: contain; - border-right: 1px solid var(--tk-border); - padding: 14px 10px 32px; - background: var(--tk-surface); + padding: 26px 20px 56px; + background: transparent; } +/* 内容区留白:字号放大后正文变宽,这里的留白比上一版收敛一档, + * 避免 1080p 屏幕上正文被挤成窄窄一条。 */ .app-content { flex: 1; min-width: 0; - padding: 28px 28px 56px; + padding: 32px 48px 72px; } -/* ==================== 页脚 ==================== */ +/* ==================== 页脚 ==================== + * 承诺在左、备案号在右:两者是不同性质的信息(产品承诺 / 监管信息), + * 居中堆叠会让它们看起来像同一组。 */ .app-footer { - border-top: 1px solid var(--tk-border); - background: var(--tk-surface); + border-top: 1px solid var(--tk-hairline); } .footer-inner { max-width: var(--tk-shell-max); margin: 0 auto; - padding: 18px 16px; + padding: 32px 24px 40px; display: flex; - flex-direction: column; + flex-wrap: wrap; align-items: center; - gap: 8px; - font-size: var(--tk-text-xs); + justify-content: space-between; + gap: 10px 24px; + font-size: var(--tk-text-sm); color: var(--tk-text-placeholder); } .footer-promises { @@ -300,16 +312,16 @@ const shortcutLabel = computed(() => { flex-wrap: wrap; align-items: center; justify-content: center; - gap: 14px; + gap: 16px; } .footer-divider { width: 1px; - height: 11px; - background: var(--tk-border-strong); + height: 12px; + background: var(--tk-border); } /* 备案号:监管信息,压到比产品承诺更弱的视觉层级,但仍要可读、可点 */ .footer-icp { - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--tk-text-placeholder); text-decoration: none; border-bottom: 1px solid transparent; @@ -322,6 +334,13 @@ const shortcutLabel = computed(() => { } /* ==================== 响应式 ==================== */ +/* 中等宽度:收窄留白,但保持「正文两侧有空白」的基本观感 */ +@media (max-width: 1279px) { + .app-content { + padding: 28px 32px 64px; + } +} + @media (max-width: 767px) { .app-aside { display: none; @@ -330,17 +349,22 @@ const shortcutLabel = computed(() => { display: inline-flex; } .app-content { - padding: 18px 14px 44px; + padding: 20px 16px 56px; + } + .footer-inner { + flex-direction: column; + align-items: flex-start; + padding: 24px 16px 32px; } /* 移动端搜索入口收成图标按钮:整条搜索框会挤掉品牌与主题切换 */ .palette-trigger { - max-width: 36px; - height: 34px; + max-width: 40px; + height: 40px; padding: 0; justify-content: center; border-color: transparent; background: transparent; - font-size: 18px; + font-size: 20px; } .palette-trigger:hover { background: var(--tk-surface-hover); diff --git a/src/layout/SideNav.vue b/src/layout/SideNav.vue index 515dca3..8f5c40f 100644 --- a/src/layout/SideNav.vue +++ b/src/layout/SideNav.vue @@ -96,6 +96,9 @@ import { toolName, toolDesc, categoryLabel } from '@/i18n/helpers' * - 需要联网的工具在右侧点一个小圆点标记,且这是全站唯一使用状态点的地方, * 语义明确(是否需联网),不是装饰。 * - 筛选对「已翻译的名称」生效,因此英文/日文/韩文界面下用对应语言也能搜到。 + * + * 尺寸:导航项行高 40px 起步(上一版 34px 偏小,鼠标点起来费劲), + * 字号与正文同号,避免侧栏比正文「小一号」。 */ const { t } = useI18n() const route = useRoute() @@ -171,24 +174,28 @@ const emit = defineEmits<{ .side-nav { display: flex; flex-direction: column; - gap: 2px; } -/* ---------- 筛选框 ---------- */ +/* ---------- 筛选框 ---------- + * 只留一条底线而不是画一个框:侧栏里的框会和下方导航项的背景块打架, + * 视觉上把「筛选」误读成「一个大按钮」。底线 + 聚焦变色已经足够提示可输入。 + * 高度 42px:与导航项同档,点起来有足够的热区。 */ .nav-filter { position: relative; display: flex; align-items: center; - gap: 7px; - height: 34px; - margin-bottom: 10px; - padding: 0 8px 0 10px; - border: 1px solid var(--tk-border); - border-radius: var(--tk-radius-md); - background: var(--tk-surface-sunken); + gap: 10px; + height: 42px; + margin-bottom: 20px; + padding: 0 2px; + border-bottom: 1px solid var(--tk-border); + transition: border-color var(--tk-dur-fast) var(--tk-ease-out); +} +.nav-filter:focus-within { + border-bottom-color: var(--tk-accent); } .filter-icon { - font-size: 15px; + font-size: 17px; color: var(--tk-text-placeholder); flex-shrink: 0; } @@ -199,7 +206,7 @@ const emit = defineEmits<{ outline: none; background: transparent; font-family: inherit; - font-size: var(--tk-text-sm); + font-size: var(--tk-text-base); color: var(--tk-text); } .filter-input::placeholder { @@ -207,33 +214,35 @@ const emit = defineEmits<{ } .filter-clear { flex-shrink: 0; - width: 18px; - height: 18px; + width: 24px; + height: 24px; display: inline-flex; align-items: center; justify-content: center; border: none; - border-radius: var(--tk-radius-xs); + border-radius: var(--tk-radius-sm); background: transparent; color: var(--tk-text-placeholder); cursor: pointer; - font-size: 13px; + font-size: 15px; } .filter-clear:hover { color: var(--tk-text); background: var(--tk-surface-active); } -/* ---------- 分组标题 ---------- */ +/* ---------- 分组标题 ---------- + * 分组之间靠 16px 留白拉开,不画横线; + * 分类名是「目录行」,字号比导航项小一档但字距略开,扫读时先看到分组再看到工具。 */ .nav-group { - margin-top: 6px; + margin-top: 16px; } .group-head { width: 100%; display: flex; align-items: center; gap: 6px; - padding: 6px 8px; + padding: 8px 10px 8px; border: none; background: transparent; border-radius: var(--tk-radius-sm); @@ -244,7 +253,6 @@ const emit = defineEmits<{ } .group-head:hover { color: var(--tk-text-secondary); - background: var(--tk-surface-hover); } .group-caret { font-size: 13px; @@ -259,28 +267,32 @@ const emit = defineEmits<{ min-width: 0; font-size: var(--tk-text-xs); font-weight: 600; - letter-spacing: 0.04em; - text-transform: uppercase; + /* 0.06em:中文分组名(如「工作效率」)在这个字距下刚好成组, + * 再宽就会散成四个孤立的字。 */ + letter-spacing: 0.06em; } .group-count { flex-shrink: 0; - font-size: 11px; + font-size: var(--tk-text-xs); font-variant-numeric: tabular-nums; - opacity: 0.75; + opacity: 0.7; } -/* ---------- 导航项 ---------- */ +/* ---------- 导航项 ---------- + * 行高 40px:这是全站点击最密集的列表,必须给足热区。 + * hover 用 --tk-surface(浅色下更亮、深色下也更亮)而不是 hover 灰, + * 这样两种主题下都是同一种「抬起」的方向感。 */ .group-items { display: flex; flex-direction: column; - gap: 1px; + gap: 2px; } .nav-item { position: relative; display: flex; align-items: center; - gap: 10px; - padding: 7px 10px; + gap: 11px; + padding: 9px 12px; border-radius: var(--tk-radius-md); font-size: var(--tk-text-base); color: var(--tk-text-secondary); @@ -290,32 +302,33 @@ const emit = defineEmits<{ color var(--tk-dur-fast) var(--tk-ease-out); } .nav-item:hover { - background: var(--tk-surface-hover); + background: var(--tk-surface); color: var(--tk-text); } -/* 活动态:青玉底纹 + 左侧 2px 指示条,比纯文字变色更容易在长列表里定位 */ +/* 活动态:主色底纹 + 左侧 3px 指示条,比纯文字变色更容易在长列表里定位。 + * 指示条压在条目左侧外 11px 处,贴在侧栏留白里,像书页边的一条书签。 */ .nav-item.active { - background: var(--tk-accent-surface-strong); + background: var(--tk-accent-surface); color: var(--tk-accent-text); font-weight: 550; } .nav-item.active::before { content: ''; position: absolute; - left: -10px; + left: -11px; top: 50%; transform: translateY(-50%); - width: 2px; - height: 16px; + width: 3px; + height: 18px; border-radius: var(--tk-radius-pill); background: var(--tk-accent); } .home-item { - margin-bottom: 4px; + margin-bottom: 6px; } .nav-icon { - width: 17px; - height: 17px; + width: 19px; + height: 19px; flex-shrink: 0; } .nav-label { @@ -327,8 +340,8 @@ const emit = defineEmits<{ } /* 唯一的语义状态点:该工具需要联网 */ .nav-dot { - width: 5px; - height: 5px; + width: 6px; + height: 6px; flex-shrink: 0; border-radius: 50%; background: var(--tk-accent); @@ -337,27 +350,28 @@ const emit = defineEmits<{ /* ---------- 空状态 ---------- */ .nav-empty { - padding: 20px 10px; + padding: 28px 10px; } .empty-title { - margin: 0 0 4px; + margin: 0 0 6px; font-size: var(--tk-text-sm); font-weight: 600; color: var(--tk-text-secondary); } .empty-hint { - margin: 0 0 10px; + margin: 0 0 12px; font-size: var(--tk-text-xs); - line-height: 1.55; + line-height: 1.6; color: var(--tk-text-placeholder); } .empty-btn { - padding: 5px 10px; + min-height: 34px; + padding: 6px 14px; border: 1px solid var(--tk-border); - border-radius: var(--tk-radius-sm); + border-radius: var(--tk-radius-md); background: var(--tk-surface); font-family: inherit; - font-size: var(--tk-text-xs); + font-size: var(--tk-text-sm); color: var(--tk-text-secondary); cursor: pointer; } diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue index a2655b4..17fc81e 100644 --- a/src/views/HomeView.vue +++ b/src/views/HomeView.vue @@ -1,10 +1,11 @@