diff --git a/2.Design/ROADMAP-M0-M1.md b/2.Design/ROADMAP-M0-M1.md index b8b6972..93d1d97 100644 --- a/2.Design/ROADMAP-M0-M1.md +++ b/2.Design/ROADMAP-M0-M1.md @@ -359,7 +359,7 @@ 重做不是换配色,而是**先立设计系统、再让页面去用它**,否则下次还是东拼西凑。 ### 4.1 设计系统(两端共用一套 token) -- [x] 色板:纸白 `paper`、景泰蓝 `primary`、陶土橙 `clay`,语义色 sage/wheat/rust/sky(Web `tailwind.config.js`,安卓 `ui/Theme.kt` 同名同值)(2026-11-01 主色由墨绿改蓝系,语义色不变) +- [x] 色板:冷白 `paper`、靛蓝 `primary`(`#4F46E5`)、陶土橙 `clay`,语义色 sage/wheat/rust/sky(Web `tailwind.config.js`,安卓 `ui/Theme.kt` 同名同值)(2026-11-01 主色由墨绿改蓝系;2026-11-02 再由沉靛蓝改为高饱和靛蓝 `#4F46E5`,中性色转 Slate 轴,语义色不变) - [x] 字号阶:11/12/13/14/15/18/22/26/36,正文 14、辅助 11/12;细描边 + 极轻投影 + 14dp 圆角 - [x] 组件:卡片 / 按钮(primary、ghost、subtle、clay、danger)/ 状态 pill / 输入 / 空态 / 骨架屏 / 抽屉 - [x] 图标:Web 用自绘线性图标集(`components/icons.tsx`),安卓用 Material Icons + 少量自绘,线宽一致 @@ -436,7 +436,7 @@ - [x] `ui/UpdateDialog.kt`:当前/新版本号、更新说明、下载进度、失败重试;「允许安装未知应用」只跳系统设置,不代点 - [x] 权限回来那一跳要接住:用户在系统设置里开完开关回到 App,再点同一个按钮时先复查权限,开了就直接装——否则按钮点了没反应 - [x] 启动时自动查一次;首页底部有「检查更新」手动入口,结果用一句话回给用户 -- [x] 图标换成与 Web 的 `` 同一套图形(景泰蓝圆角底 + 三条浅蓝白圆头线 + 亮蓝点),生成 `mipmap-*/ic_launcher{,_round}.png` 与自适应图标 `mipmap-anydpi-v26/ic_launcher{,_round}.xml`,512px 预览存 `2.Design/screens/android-icon-512.png` +- [x] 图标换成与 Web 的 `` 同一套图形(靛蓝圆角底 + 三条白色圆头线 + 淡紫点),生成 `mipmap-*/ic_launcher{,_round}.png` 与自适应图标 `mipmap-anydpi-v26/ic_launcher{,_round}.xml`,512px 预览存 `2.Design/screens/android-icon-512.png` - [x] 版本 `versionCode = 2` / `versionName = "0.2.0"`;发布签名从 `android/keystore.properties` 读,无该文件时回落调试签名(保证别人 clone 下来也能 `assembleRelease`) ### 6.3 构建环境(本机踩过的坑) @@ -520,7 +520,7 @@ ### 8.3 实现 | 位置 | 内容 | |---|---| -| `web/vite.config.ts` | manifest(standalone、主题色 `#274b73`、三个图标)+ workbox(`navigateFallback` 回退 `index.html`,`/vditor/` 走 CacheFirst,`/api/` NetworkOnly) | +| `web/vite.config.ts` | manifest(standalone、主题色 `#4f46e5`、三个图标)+ workbox(`navigateFallback` 回退 `index.html`,`/vditor/` 走 CacheFirst,`/api/` NetworkOnly) | | `web/index.html` | favicon 改成同款 Logo(内联 SVG)、`theme-color`、`apple-touch-icon`、`viewport-fit=cover` | | `web/src/lib/pwa.ts` | 生产环境注册 SW、`dadao:pwa-update-ready` 事件、`applyServiceWorkerUpdate()`、`isStandalone()` | | `web/src/components/UpdatePrompt.tsx` | 底部卡片「有新版了」+ 稍后 / 刷新(**居中用 flex 包一层**:`animate-slide-up` 的 keyframes 自带 transform,会和 `-translate-x-1/2` 抢属性,手机窄屏上卡片会被推出屏幕右侧) | diff --git a/2.Design/screens/android-icon-512.png b/2.Design/screens/android-icon-512.png index 82bbb62..0bb77ab 100644 Binary files a/2.Design/screens/android-icon-512.png and b/2.Design/screens/android-icon-512.png differ diff --git a/README.md b/README.md index ea59a73..0986f19 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ | 安卓端任务 / 看板 / 工单 / 知识 / 成员五个页面 | ✅ 编译成 APK(10.1 MB),模拟器上逐页跑通,截图见 [`2.Design/screens/`](2.Design/screens) | | 工单:升级不搬数据、受理→办理→提交→验收、驳回、改派、站内通知 | ✅ 后端 + Web + 安卓已通,双人 e2e 8 项全绿 | | 知识:工单验收自动生成草稿、核对后发布、来源可追、手记 | ✅ 后端 + Web + 安卓已通,e2e 7 项全绿 | -| 界面:两端统一设计系统(纸白 / 景泰蓝 / 陶土橙,语义色、字号阶、组件库) | ✅ 已重做,见 [`2.Design/ROADMAP-M0-M1.md`](2.Design/ROADMAP-M0-M1.md) 第 4 节 | +| 界面:两端统一设计系统(冷白 / 靛蓝 #4F46E5 / 陶土橙,语义色、字号阶、组件库) | ✅ 已重做,见 [`2.Design/ROADMAP-M0-M1.md`](2.Design/ROADMAP-M0-M1.md) 第 4 节 | | 富文本:备注 / 工单说明 / 知识正文支持图文混排与附件 | ✅ Web 用 Vditor 编辑、安卓用 Markwon 预览编辑(e2e 15 项全绿);接口见 [`2.Design/API.md`](2.Design/API.md) 第 6 节 | | 知识切片与语义检索(混合打分、只搜已发布、带来源) | ✅ 已跑通:`real[]` + SQL 余弦(pgvector 待独立实例),`pytest` 5 个用例 + `e2e/retrieval.mjs` 6 项 | | 后端测试 | ✅ 79 passed,ruff 干净 | diff --git a/android/README.md b/android/README.md index 68fc342..57747c6 100644 --- a/android/README.md +++ b/android/README.md @@ -90,7 +90,7 @@ app/src/main/java/com/dadao/task/ │ ├── Api.kt OkHttp + kotlinx.serialization;信封解包、业务码抛 ApiException │ └── TokenStore.kt 令牌本地存储(TODO:换 EncryptedSharedPreferences) └── ui/ - ├── Theme.kt 与 Web 一致的景泰蓝 + 陶土色板 + ├── Theme.kt 与 Web 一致的靛蓝 #4F46E5 + 陶土色板 ├── LoginScreen.kt 手机号 + 验证码 ├── HomeScreen.kt 工作区列表 / 新建 / 生成邀请码 ├── TaskListScreen.kt 任务视图切换、快速新建、勾选完成、详情与评论 diff --git a/android/app/src/main/java/com/dadao/task/ui/KnowledgeScreen.kt b/android/app/src/main/java/com/dadao/task/ui/KnowledgeScreen.kt index 10eff2b..6087eaf 100644 --- a/android/app/src/main/java/com/dadao/task/ui/KnowledgeScreen.kt +++ b/android/app/src/main/java/com/dadao/task/ui/KnowledgeScreen.kt @@ -329,7 +329,7 @@ private fun KnowledgeBody(text: String) { setTextIsSelectable(true) textSize = 14f setLineSpacing(0f, 1.5f) - setTextColor(android.graphics.Color.parseColor("#262D39")) + setTextColor(android.graphics.Color.parseColor("#1E293B")) markwon.setMarkdown(this, text) } }, diff --git a/android/app/src/main/java/com/dadao/task/ui/RichTextEditorScreen.kt b/android/app/src/main/java/com/dadao/task/ui/RichTextEditorScreen.kt index 0fbbd67..e8b7a7e 100644 --- a/android/app/src/main/java/com/dadao/task/ui/RichTextEditorScreen.kt +++ b/android/app/src/main/java/com/dadao/task/ui/RichTextEditorScreen.kt @@ -350,7 +350,7 @@ private fun PreviewBody( textSize = 15f setPadding(0, 0, 0, 0) setLineSpacing(0f, 1.5f) - setTextColor(android.graphics.Color.parseColor("#4E5867")) + setTextColor(android.graphics.Color.parseColor("#475569")) markwon.setMarkdown(this, text) } }, diff --git a/android/app/src/main/java/com/dadao/task/ui/Theme.kt b/android/app/src/main/java/com/dadao/task/ui/Theme.kt index d9d5fec..6da015f 100644 --- a/android/app/src/main/java/com/dadao/task/ui/Theme.kt +++ b/android/app/src/main/java/com/dadao/task/ui/Theme.kt @@ -13,22 +13,22 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp /** - * 与 Web 端 tailwind.config.js 同一套色板:暖白纸面 + 景泰蓝主色 + 陶土橙强调。 + * 与 Web 端 tailwind.config.js 同一套色板:冷白纸面 + 靛蓝主色(#4F46E5)+ 陶土橙强调。 * 两端看同一张截图时,颜色应该能对上,所以这里的值不要单独调。 */ -val Paper = Color(0xFFF9FAFC) -val PaperSunken = Color(0xFFF3F5F9) -val Line = Color(0xFFE2E6EC) -val LineStrong = Color(0xFFD3D9E1) +val Paper = Color(0xFFFAFAFC) +val PaperSunken = Color(0xFFF4F5F9) +val Line = Color(0xFFE3E7EF) +val LineStrong = Color(0xFFD5DAE4) -val Ink = Color(0xFF262D39) -val InkSoft = Color(0xFF4E5867) -val InkMuted = Color(0xFF5F6B7C) +val Ink = Color(0xFF1E293B) +val InkSoft = Color(0xFF475569) +val InkMuted = Color(0xFF64748B) -val Primary = Color(0xFF274B73) -val PrimaryDeep = Color(0xFF1F3B5B) -val PrimarySoft = Color(0xFFDCE9F7) -val PrimaryTint = Color(0xFFB9D3EC) +val Primary = Color(0xFF4F46E5) +val PrimaryDeep = Color(0xFF4338CA) +val PrimarySoft = Color(0xFFE0E7FF) +val PrimaryTint = Color(0xFFC7D2FE) val Clay = Color(0xFFC2703D) val ClaySoft = Color(0xFFFBEADF) @@ -39,7 +39,7 @@ val Wheat = Color(0xFFA97C25) val WheatSoft = Color(0xFFF8EED7) val Rust = Color(0xFFB04A32) val RustSoft = Color(0xFFFBE5DF) -val Sky = Color(0xFF1E7F94) +val Sky = Color(0xFF16697C) val SkySoft = Color(0xFFE6F4F6) private val colors = lightColorScheme( diff --git a/android/app/src/main/res/drawable/ic_launcher_foreground.xml b/android/app/src/main/res/drawable/ic_launcher_foreground.xml index 79103c1..aa20e88 100644 --- a/android/app/src/main/res/drawable/ic_launcher_foreground.xml +++ b/android/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -1,5 +1,5 @@ - + diff --git a/android/app/src/main/res/values/colors.xml b/android/app/src/main/res/values/colors.xml index 19681ca..7b62310 100644 --- a/android/app/src/main/res/values/colors.xml +++ b/android/app/src/main/res/values/colors.xml @@ -1,5 +1,5 @@ - - #274B73 + + #4F46E5 diff --git a/android/app/src/main/res/values/themes.xml b/android/app/src/main/res/values/themes.xml index a12cb34..2fcf991 100644 --- a/android/app/src/main/res/values/themes.xml +++ b/android/app/src/main/res/values/themes.xml @@ -2,7 +2,7 @@ diff --git a/tools/make-icons.py b/tools/make-icons.py index 3c07cb8..86763b5 100644 --- a/tools/make-icons.py +++ b/tools/make-icons.py @@ -1,4 +1,4 @@ -"""按 Web Logo(icons.tsx 的 )重绘 PWA 图标:景泰蓝底 + 三条浅蓝白线 + 一点亮蓝。 +"""按 Web Logo(icons.tsx 的 )重绘 PWA 图标:靛蓝底 + 三条白线 + 一点淡紫。 用法:python tools/make-icons.py 输出覆盖 web/public/icons/*.png(与 SVG 同一套比例:64 画布,rx=18,线宽 4,点半径 6)。 @@ -13,9 +13,9 @@ from PIL import Image, ImageDraw ROOT = Path(__file__).resolve().parents[1] OUT = ROOT / "web" / "public" / "icons" -BG = "#274B73" -LINE = "#EAF3FB" -DOT = "#5CA8E8" +BG = "#4F46E5" +LINE = "#FFFFFF" +DOT = "#C7D2FE" SS = 8 # 超采样倍数,边缘才不毛 diff --git a/web/e2e/pwa.mjs b/web/e2e/pwa.mjs index 80c5061..584b6b8 100644 --- a/web/e2e/pwa.mjs +++ b/web/e2e/pwa.mjs @@ -118,7 +118,7 @@ async function main() { check("页面骨架已预缓存", shellCached); const themeColor = await page.getAttribute('meta[name="theme-color"]', "content"); - check("主题色是景泰蓝", themeColor === "#274b73", String(themeColor)); + check("主题色是品牌靛蓝", themeColor === "#4f46e5", String(themeColor)); check("桌面尺寸没有控制台报错", errors.length === 0, errors.join(" | ")); await desktop.close(); diff --git a/web/index.html b/web/index.html index b265564..8079865 100644 --- a/web/index.html +++ b/web/index.html @@ -5,13 +5,13 @@ 达道Task - + - + diff --git a/web/public/icons/apple-touch-icon.png b/web/public/icons/apple-touch-icon.png index 2610586..75251bb 100644 Binary files a/web/public/icons/apple-touch-icon.png and b/web/public/icons/apple-touch-icon.png differ diff --git a/web/public/icons/icon-192.png b/web/public/icons/icon-192.png index 1cf1a9b..cd9b613 100644 Binary files a/web/public/icons/icon-192.png and b/web/public/icons/icon-192.png differ diff --git a/web/public/icons/icon-512.png b/web/public/icons/icon-512.png index 82bbb62..0bb77ab 100644 Binary files a/web/public/icons/icon-512.png and b/web/public/icons/icon-512.png differ diff --git a/web/public/icons/maskable-512.png b/web/public/icons/maskable-512.png index 12d3fff..f0496ad 100644 Binary files a/web/public/icons/maskable-512.png and b/web/public/icons/maskable-512.png differ diff --git a/web/src/components/icons.tsx b/web/src/components/icons.tsx index 241bd03..2db712c 100644 --- a/web/src/components/icons.tsx +++ b/web/src/components/icons.tsx @@ -290,13 +290,13 @@ export const Spinner = ({ size = 16, className = "" }: { size?: number; classNam export const Logo = ({ size = 28 }: { size?: number }) => ( - + - + ); diff --git a/web/src/index.css b/web/src/index.css index e89394f..4e3d6a0 100644 --- a/web/src/index.css +++ b/web/src/index.css @@ -72,7 +72,7 @@ disabled:pointer-events-none disabled:opacity-40; } .btn-primary { - @apply btn bg-primary-700 text-white shadow-sm hover:bg-primary-800 active:translate-y-px; + @apply btn bg-primary-600 text-white shadow-sm hover:bg-primary-700 active:translate-y-px; } .btn-ghost { @apply btn border border-line-200 bg-white text-ink-700 hover:border-line-300 hover:bg-paper-50; @@ -157,8 +157,8 @@ scrollbar-width: none; } .grid-lines { - background-image: linear-gradient(to right, rgba(22, 28, 26, 0.04) 1px, transparent 1px), - linear-gradient(to bottom, rgba(22, 28, 26, 0.04) 1px, transparent 1px); + background-image: linear-gradient(to right, rgba(15, 23, 42, 0.04) 1px, transparent 1px), + linear-gradient(to bottom, rgba(15, 23, 42, 0.04) 1px, transparent 1px); background-size: 32px 32px; } } @@ -443,6 +443,6 @@ .rich-text .vditor-hint { border-color: theme("colors.line.200"); border-radius: 10px; - box-shadow: 0 12px 32px -12px rgba(31, 42, 40, 0.28); + box-shadow: 0 12px 32px -12px rgba(15, 23, 42, 0.28); font-size: 0.8rem; } \ No newline at end of file diff --git a/web/src/pages/Workspace.tsx b/web/src/pages/Workspace.tsx index 6d2627a..2951388 100644 --- a/web/src/pages/Workspace.tsx +++ b/web/src/pages/Workspace.tsx @@ -157,7 +157,7 @@ export function WorkspacePage() {