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 @@
{{ t('home.eyebrow') }}
{{ t('home.desc', { count: tools.length }) }}
@@ -28,29 +29,28 @@{{ t('category.online.desc') }}
+{{ t('category.online.desc') }}
+{{ categoryDesc(group.category.key, group.category.desc) }}
- {{ t('nav.toolsCount', { count: group.items.length }) }}{{ t('home.emptyTitle') }}
{{ t('home.emptyHint') }}
@@ -132,12 +137,13 @@ import { SUPPORTED_LOCALES } from '@/i18n' /** * 首页:工具目录。 * - * 版式取舍: - * - 抬头区左对齐而不是居中。居中大标题在目录型产品上会把视线拉向空处, - * 左对齐能让「标题 → 搜索框 → 卡片」形成一条自然的阅读动线。 - * - 抬头区放真实可用的搜索框(直接过滤下方列表),不是装饰性按钮。 - * - 服务端工具单独成区并加底纹,是本期唯一需要联网的部分,值得与本地工具区分。 - * - 筛选期间隐藏概览数字与服务端专区,避免同一批工具在一页里出现两次。 + * 版式取舍(编辑感方向): + * - 抬头区左对齐、不放 eyebrow,标题的字号反差就是这一页的开场。 + * - 搜索框画成一条底线而不是一个输入框盒子,和整页的「纸面感」一致。 + * - 工具列表做成带发丝线的索引,而不是 58 个描边卡片: + * 条目越多,越应该靠排版而不是靠容器来组织。 + * - 服务端工具单独成区并加底纹,是唯一需要联网的部分,值得与本地工具区分。 + * - 筛选期间隐藏事实条与服务端专区,避免同一批工具在一页里出现两次。 */ const { t } = useI18n() @@ -199,58 +205,58 @@ function endpointOf(path: string): string { diff --git a/src/views/address-parse/AddressParseView.vue b/src/views/address-parse/AddressParseView.vue index 1e06858..ada40a5 100644 --- a/src/views/address-parse/AddressParseView.vue +++ b/src/views/address-parse/AddressParseView.vue @@ -225,7 +225,7 @@ function clearAll() { grid-column: 1 / -1; } .info-label { - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--td-text-color-placeholder); } .info-value { diff --git a/src/views/api-status/ApiStatusView.vue b/src/views/api-status/ApiStatusView.vue index 0ddf1d6..592b1a4 100644 --- a/src/views/api-status/ApiStatusView.vue +++ b/src/views/api-status/ApiStatusView.vue @@ -284,14 +284,14 @@ onMounted(() => { .endpoint-path { display: block; margin-top: 2px; - font-size: 11px; + font-size: var(--tk-text-xs); color: var(--tk-text-placeholder); word-break: break-all; } .method-badge { padding: 2px 7px; border-radius: var(--tk-radius-xs); - font-size: 11px; + font-size: var(--tk-text-xs); font-weight: 600; color: var(--tk-text-secondary); background: var(--tk-surface-sunken); @@ -352,7 +352,7 @@ onMounted(() => { } .latency-unit { margin-left: 2px; - font-size: 11px; + font-size: var(--tk-text-xs); color: var(--tk-text-placeholder); } /* 无底槽细条:只表达相对快慢 */ diff --git a/src/views/ascii-art/AsciiArtView.vue b/src/views/ascii-art/AsciiArtView.vue index f3f0455..cd0b41f 100644 --- a/src/views/ascii-art/AsciiArtView.vue +++ b/src/views/ascii-art/AsciiArtView.vue @@ -199,7 +199,7 @@ function onHistorySelect(text: string) { flex-wrap: wrap; } .size-tip { - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--td-text-color-placeholder); } .ascii-block { @@ -209,7 +209,7 @@ function onHistorySelect(text: string) { border-radius: 6px; background: var(--td-bg-color-container); font-family: ui-monospace, 'Courier New', Consolas, monospace; - font-size: 11px; + font-size: var(--tk-text-xs); line-height: 1.1; white-space: pre; overflow-x: auto; diff --git a/src/views/bmi/BmiView.vue b/src/views/bmi/BmiView.vue index 7684d95..bdb3643 100644 --- a/src/views/bmi/BmiView.vue +++ b/src/views/bmi/BmiView.vue @@ -157,7 +157,7 @@ function onHistorySelect(text: string) { } .form-tip { margin: 12px 0 0; - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--td-text-color-placeholder); } diff --git a/src/views/color-namer/ColorNamerView.vue b/src/views/color-namer/ColorNamerView.vue index caf6b69..5979080 100644 --- a/src/views/color-namer/ColorNamerView.vue +++ b/src/views/color-namer/ColorNamerView.vue @@ -234,7 +234,7 @@ function copySwatch(hex: string) { .palette-name { display: block; padding: 4px 6px; - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--td-text-color-secondary); text-align: center; overflow: hidden; diff --git a/src/views/cron/CronView.vue b/src/views/cron/CronView.vue index 28b8ce6..7d0d671 100644 --- a/src/views/cron/CronView.vue +++ b/src/views/cron/CronView.vue @@ -267,7 +267,7 @@ function onHistorySelect(text: string) { background: var(--td-bg-color-secondarycontainer); } .field-label { - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--td-text-color-placeholder); } .field-value { diff --git a/src/views/date-calc/DateCalcView.vue b/src/views/date-calc/DateCalcView.vue index 0acbec0..28dcb88 100644 --- a/src/views/date-calc/DateCalcView.vue +++ b/src/views/date-calc/DateCalcView.vue @@ -398,7 +398,7 @@ function onHistorySelect(text: string) { } .form-tip { margin: 12px 0 0; - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--td-text-color-placeholder); } /* 日期选择器:窄屏下占满可用宽度,避免固定宽度撑出横向滚动条 */ diff --git a/src/views/exchange-rate/ExchangeRateView.vue b/src/views/exchange-rate/ExchangeRateView.vue index e200e16..65bb92f 100644 --- a/src/views/exchange-rate/ExchangeRateView.vue +++ b/src/views/exchange-rate/ExchangeRateView.vue @@ -141,7 +141,7 @@ async function query() { } .w-updated { margin: 8px 0 0; - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--td-text-color-placeholder); } diff --git a/src/views/express-query/ExpressQueryView.vue b/src/views/express-query/ExpressQueryView.vue index 002cd31..1b2c611 100644 --- a/src/views/express-query/ExpressQueryView.vue +++ b/src/views/express-query/ExpressQueryView.vue @@ -91,7 +91,7 @@ async function query() { } .hint { margin: 12px 0 0; - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--td-text-color-placeholder); } .head { @@ -143,7 +143,7 @@ async function query() { line-height: 1.5; } .trace-time { - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--td-text-color-placeholder); margin-top: 2px; } diff --git a/src/views/hello-world/HelloWorldView.vue b/src/views/hello-world/HelloWorldView.vue index 5c327d9..3f1d0fa 100644 --- a/src/views/hello-world/HelloWorldView.vue +++ b/src/views/hello-world/HelloWorldView.vue @@ -116,7 +116,7 @@ function copyItem(item: LangItem) { border-radius: 6px; background: var(--td-bg-color-container); font-family: ui-monospace, SFMono-Regular, Consolas, 'Courier New', monospace; - font-size: 12px; + font-size: var(--tk-text-xs); line-height: 1.6; white-space: pre-wrap; word-break: break-all; diff --git a/src/views/idcard/IdcardView.vue b/src/views/idcard/IdcardView.vue index 44487f2..95ae838 100644 --- a/src/views/idcard/IdcardView.vue +++ b/src/views/idcard/IdcardView.vue @@ -192,7 +192,7 @@ function clearAll() { background: var(--td-bg-color-secondarycontainer); } .info-label { - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--td-text-color-placeholder); } .info-value { diff --git a/src/views/image-compress/ImageCompressView.vue b/src/views/image-compress/ImageCompressView.vue index 07bd418..a78c1de 100644 --- a/src/views/image-compress/ImageCompressView.vue +++ b/src/views/image-compress/ImageCompressView.vue @@ -428,7 +428,7 @@ onBeforeUnmount(() => { width: 200px; } .form-suffix { - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--td-text-color-placeholder); } .form-tip { @@ -489,7 +489,7 @@ onBeforeUnmount(() => { align-items: center; justify-content: center; border-radius: 6px; - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--td-error-color); border: 1px dashed var(--td-border-level-2-color); background: var(--td-bg-color-container); @@ -509,12 +509,12 @@ onBeforeUnmount(() => { } .result-size { margin: 0; - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--td-text-color-secondary); } .result-error { margin: 4px 0 0; - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--td-error-color); } .result-actions { diff --git a/src/views/image-to-ico/ImageToIcoView.vue b/src/views/image-to-ico/ImageToIcoView.vue index 12f306d..49e8d72 100644 --- a/src/views/image-to-ico/ImageToIcoView.vue +++ b/src/views/image-to-ico/ImageToIcoView.vue @@ -404,7 +404,7 @@ onBeforeUnmount(() => { font-weight: 600; } .form-suffix { - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--td-text-color-placeholder); } .form-actions { @@ -470,7 +470,7 @@ onBeforeUnmount(() => { } .summary-tip { margin: 4px 0 0; - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--td-warning-color); } .result-actions { diff --git a/src/views/ip-info/IpInfoView.vue b/src/views/ip-info/IpInfoView.vue index fc7cc6a..50d78e2 100644 --- a/src/views/ip-info/IpInfoView.vue +++ b/src/views/ip-info/IpInfoView.vue @@ -184,7 +184,7 @@ onBeforeUnmount(() => { .block-tag { padding: 1px 8px; border-radius: var(--tk-radius-pill); - font-size: 11px; + font-size: var(--tk-text-xs); color: var(--tk-text-placeholder); background: var(--tk-surface-sunken); } diff --git a/src/views/jwt-parse/JwtParseView.vue b/src/views/jwt-parse/JwtParseView.vue index 3dad027..b5d98d9 100644 --- a/src/views/jwt-parse/JwtParseView.vue +++ b/src/views/jwt-parse/JwtParseView.vue @@ -217,7 +217,7 @@ function clearAll() { font-size: 13px; } .info-label { - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--td-text-color-placeholder); } .info-value { diff --git a/src/views/morse-code/MorseCodeView.vue b/src/views/morse-code/MorseCodeView.vue index 34763f6..70620b6 100644 --- a/src/views/morse-code/MorseCodeView.vue +++ b/src/views/morse-code/MorseCodeView.vue @@ -271,7 +271,7 @@ function onHistorySelect(text: string) { } .note { margin: 12px 0 0; - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--td-text-color-placeholder); } diff --git a/src/views/mortgage/MortgageView.vue b/src/views/mortgage/MortgageView.vue index 88febdb..df21611 100644 --- a/src/views/mortgage/MortgageView.vue +++ b/src/views/mortgage/MortgageView.vue @@ -246,7 +246,7 @@ function onHistorySelect(text: string) { } .form-tip { margin: 12px 0 0; - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--td-text-color-placeholder); } @media (max-width: 767px) { diff --git a/src/views/network-test/NetworkTestView.vue b/src/views/network-test/NetworkTestView.vue index 2edad5d..8294395 100644 --- a/src/views/network-test/NetworkTestView.vue +++ b/src/views/network-test/NetworkTestView.vue @@ -222,7 +222,7 @@ function detailLabel(k: string): string { } .hint { margin: 10px 0 0; - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--td-text-color-placeholder); } .res-main { @@ -259,7 +259,7 @@ function detailLabel(k: string): string { border-radius: 8px; } .ri span { - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--td-text-color-placeholder); } .ri b { diff --git a/src/views/password-gen/PasswordGenView.vue b/src/views/password-gen/PasswordGenView.vue index 2718b7d..58ec731 100644 --- a/src/views/password-gen/PasswordGenView.vue +++ b/src/views/password-gen/PasswordGenView.vue @@ -224,7 +224,7 @@ onMounted(() => { font-weight: 600; } .form-suffix { - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--td-text-color-placeholder); } .form-actions { @@ -253,7 +253,7 @@ onMounted(() => { font-weight: 600; } .strength-entropy { - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--td-text-color-placeholder); } .strength-bar { diff --git a/src/views/phone-locate/PhoneLocateView.vue b/src/views/phone-locate/PhoneLocateView.vue index b685f96..11af913 100644 --- a/src/views/phone-locate/PhoneLocateView.vue +++ b/src/views/phone-locate/PhoneLocateView.vue @@ -106,7 +106,7 @@ async function query() { border-radius: 8px; } .pi span { - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--td-text-color-placeholder); } .pi b { diff --git a/src/views/placeholder-image/PlaceholderImageView.vue b/src/views/placeholder-image/PlaceholderImageView.vue index 7409b76..79c3697 100644 --- a/src/views/placeholder-image/PlaceholderImageView.vue +++ b/src/views/placeholder-image/PlaceholderImageView.vue @@ -234,7 +234,7 @@ watch([width, height, bgColor, textColor, text, fontRatio], draw, { immediate: t } .hex-text { font-family: ui-monospace, Consolas, monospace; - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--td-text-color-placeholder); } .text-input { diff --git a/src/views/pomodoro/PomodoroView.vue b/src/views/pomodoro/PomodoroView.vue index 3b1390b..f62a5fb 100644 --- a/src/views/pomodoro/PomodoroView.vue +++ b/src/views/pomodoro/PomodoroView.vue @@ -215,7 +215,7 @@ onBeforeUnmount(() => { } .form-tip { margin: 12px 0 0; - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--td-text-color-placeholder); } @media (max-width: 767px) { diff --git a/src/views/regex-test/RegexTestView.vue b/src/views/regex-test/RegexTestView.vue index 6d68eb3..c59e76b 100644 --- a/src/views/regex-test/RegexTestView.vue +++ b/src/views/regex-test/RegexTestView.vue @@ -213,7 +213,7 @@ function onHistorySelect(raw: string) { } .hint-text { margin: 8px 0 0; - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--td-text-color-placeholder); } .no-match { @@ -252,7 +252,7 @@ function onHistorySelect(raw: string) { justify-content: center; border-radius: 50%; background: var(--td-bg-color-secondarycontainer); - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--td-text-color-secondary); } .match-text { @@ -264,7 +264,7 @@ function onHistorySelect(raw: string) { word-break: break-all; } .match-pos { - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--td-text-color-placeholder); } .match-groups { @@ -275,7 +275,7 @@ function onHistorySelect(raw: string) { } .group-tag { font-family: monospace; - font-size: 12px; + font-size: var(--tk-text-xs); padding: 2px 8px; border-radius: 4px; background: var(--td-bg-color-secondarycontainer); diff --git a/src/views/regex-visual/RegexVisualView.vue b/src/views/regex-visual/RegexVisualView.vue index b68b6f3..a6c52e7 100644 --- a/src/views/regex-visual/RegexVisualView.vue +++ b/src/views/regex-visual/RegexVisualView.vue @@ -295,7 +295,7 @@ function onHistorySelect(text: string) { } .tag { flex-shrink: 0; - font-size: 11px; + font-size: var(--tk-text-xs); padding: 1px 6px; border-radius: 3px; color: #fff; @@ -334,7 +334,7 @@ function onHistorySelect(text: string) { } .desc { color: var(--td-text-color-secondary); - font-size: 12px; + font-size: var(--tk-text-xs); } .match-list { margin-top: 12px; @@ -352,7 +352,7 @@ function onHistorySelect(text: string) { } .m-index { color: var(--td-text-color-placeholder); - font-size: 12px; + font-size: var(--tk-text-xs); } .m-text { font-family: ui-monospace, Consolas, monospace; diff --git a/src/views/translate/TranslateView.vue b/src/views/translate/TranslateView.vue index 5c6d200..f691738 100644 --- a/src/views/translate/TranslateView.vue +++ b/src/views/translate/TranslateView.vue @@ -695,7 +695,7 @@ function clearAll() { .char-count { margin: 4px 0 0; - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--td-text-color-placeholder); text-align: right; } @@ -753,12 +753,12 @@ function clearAll() { } .dict-example { margin: 6px 0 0; - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--td-text-color-secondary); } .dict-src { margin: 10px 0 0; - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--td-text-color-placeholder); } @@ -782,7 +782,7 @@ function clearAll() { } .s-hint { margin: 8px 0 0; - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--td-text-color-placeholder); } @@ -796,7 +796,7 @@ function clearAll() { } .attr { margin: 0; - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--td-text-color-placeholder); } diff --git a/src/views/url-parse/UrlParseView.vue b/src/views/url-parse/UrlParseView.vue index cb4e691..128031e 100644 --- a/src/views/url-parse/UrlParseView.vue +++ b/src/views/url-parse/UrlParseView.vue @@ -242,7 +242,7 @@ function onHistorySelect(text: string) { background: var(--td-bg-color-secondarycontainer); } .info-label { - font-size: 12px; + font-size: var(--tk-text-xs); color: var(--td-text-color-placeholder); } .info-value { diff --git a/unocss.config.ts b/unocss.config.ts index 56bf323..f8111af 100644 --- a/unocss.config.ts +++ b/unocss.config.ts @@ -6,6 +6,9 @@ import { defineConfig, presetUno, transformerDirectives } from 'unocss' * 颜色一律走设计令牌 CSS 变量(--tk-* / --td-*),不要写死色值, * 这样昼夜主题切换与品牌改色都只需改 tokens.scss 一处。 * 颜色写法用 arbitrary value,例如:bg-[var(--tk-surface)] + * + * 尺寸同理:字号用 text-13px / text-16px 这种「与令牌同一档位」的值, + * 不要在这里写回 12px,那是上一版「字太小」的根因。 */ export default defineConfig({ presets: [presetUno()], @@ -17,13 +20,14 @@ export default defineConfig({ 'form-row': 'flex flex-col gap-2 md:flex-row md:items-center md:gap-4', // 结果代码块:等宽字体 + 面板块底色 'code-block': - 'rounded-[var(--tk-radius-md)] bg-[var(--tk-surface-sunken)] px-3 py-2.5 font-mono text-13px leading-relaxed break-all whitespace-pre-wrap', + 'rounded-[var(--tk-radius-md)] bg-[var(--tk-surface-sunken)] px-4 py-3.5 font-mono text-14px leading-relaxed break-all whitespace-pre-wrap', // 通用面板(自定义区块的轻量容器) // 自带内边距,直接写 class="panel tool-section" 即可,不必每处再补 padding。 + // 本版容器重新「有形」:白底 + 实描边,与页面底(--tk-bg)拉开层次。 // 注意:页面 scoped 样式(如 .block[data-v-*])权重高于本类,需要单独覆盖时照常写即可。 'panel': - 'rounded-[var(--tk-radius-xl)] border border-[var(--tk-border)] bg-[var(--tk-surface)] p-5 md:p-6', + 'rounded-[var(--tk-radius-xl)] border border-[var(--tk-border)] bg-[var(--tk-surface)] p-5 md:p-7', // 说明性小字 - 'hint-text': 'text-12px text-[var(--tk-text-placeholder)]', + 'hint-text': 'text-13px text-[var(--tk-text-placeholder)]', }, })