From 21078ae2875554333b8b03838d298eb9ab2289d8 Mon Sep 17 00:00:00 2001 From: yuzhiran-dev Date: Mon, 18 May 2026 11:52:57 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20Mobile=20=E5=85=A8=E7=AB=99=20CSS=20?= =?UTF-8?q?=E5=8F=98=E9=87=8F=E5=AF=B9=E9=BD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 批量替换 18 个页面硬编码颜色 → CSS 变量 - sandbox page 完整迁移(参考页) - App.vue + variables.css 统一 Token 定义 - 剩余仅保留语义色(红色价格、绿色完成、阴影、渐变) - 剩余 16 页按相同模式可逐步迁移 --- mobile/src/pages/circle-detail/index.vue | 14 +++++----- mobile/src/pages/circles/index.vue | 10 +++---- mobile/src/pages/community/index.vue | 18 ++++++------- mobile/src/pages/course-detail/index.vue | 14 +++++----- mobile/src/pages/courses/index.vue | 16 +++++------ mobile/src/pages/create-post/index.vue | 10 +++---- mobile/src/pages/favorites/index.vue | 10 +++---- mobile/src/pages/index/index.vue | 28 ++++++++++---------- mobile/src/pages/learning-progress/index.vue | 14 +++++----- mobile/src/pages/lesson/index.vue | 6 ++--- mobile/src/pages/login/index.vue | 12 ++++----- mobile/src/pages/membership/index.vue | 6 ++--- mobile/src/pages/post-detail/index.vue | 22 +++++++-------- mobile/src/pages/profile/index.vue | 16 +++++------ mobile/src/pages/prompt-detail/index.vue | 14 +++++----- mobile/src/pages/prompts/index.vue | 14 +++++----- mobile/src/pages/register/index.vue | 8 +++--- mobile/src/pages/sandbox/index.vue | 4 +-- mobile/src/pages/search/index.vue | 18 ++++++------- 19 files changed, 127 insertions(+), 127 deletions(-) diff --git a/mobile/src/pages/circle-detail/index.vue b/mobile/src/pages/circle-detail/index.vue index b987e9e..976d721 100644 --- a/mobile/src/pages/circle-detail/index.vue +++ b/mobile/src/pages/circle-detail/index.vue @@ -63,13 +63,13 @@ const goPost = (id: number) => uni.navigateTo({ url: `/pages/post-detail/index?i diff --git a/mobile/src/pages/circles/index.vue b/mobile/src/pages/circles/index.vue index b36830a..8757ebd 100644 --- a/mobile/src/pages/circles/index.vue +++ b/mobile/src/pages/circles/index.vue @@ -32,12 +32,12 @@ const goDetail = (id: number) => uni.navigateTo({ url: `/pages/circle-detail/ind diff --git a/mobile/src/pages/community/index.vue b/mobile/src/pages/community/index.vue index af611e9..a6cee35 100644 --- a/mobile/src/pages/community/index.vue +++ b/mobile/src/pages/community/index.vue @@ -59,24 +59,24 @@ const goCreate = () => { diff --git a/mobile/src/pages/course-detail/index.vue b/mobile/src/pages/course-detail/index.vue index 86ab02b..8c3450a 100644 --- a/mobile/src/pages/course-detail/index.vue +++ b/mobile/src/pages/course-detail/index.vue @@ -61,18 +61,18 @@ const goLesson = (lessonId: number) => { background: linear-gradient(transparent, rgba(0,0,0,0.7)); padding: 40rpx 30rpx; } -.title { font-size: 36rpx; font-weight: bold; color: #fff; display: block; } +.title { font-size: 36rpx; font-weight: bold; color: var(--card); display: block; } .meta { font-size: 24rpx; color: rgba(255,255,255,0.8); margin-top: 8rpx; display: block; } -.price { font-size: 28rpx; color: #4f8cff; margin-top: 12rpx; display: inline-block; } +.price { font-size: 28rpx; color: var(--brand); margin-top: 12rpx; display: inline-block; } .price.paid { color: #ff6b6b; } .body { padding: 30rpx; } .section { margin-bottom: 40rpx; } .section-title { font-size: 32rpx; font-weight: bold; margin-bottom: 20rpx; display: block; } -.desc { font-size: 26rpx; color: #666; line-height: 1.6; } -.chapter { margin-bottom: 20rpx; background: #fff; border-radius: 12rpx; overflow: hidden; } -.chapter-title { font-size: 28rpx; font-weight: 500; padding: 20rpx 24rpx; background: #f8f9ff; display: block; } -.lesson { display: flex; align-items: center; justify-content: space-between; padding: 18rpx 24rpx; border-bottom: 1rpx solid #f5f5f5; } +.desc { font-size: 26rpx; color: var(--muted-foreground); line-height: 1.6; } +.chapter { margin-bottom: 20rpx; background: var(--card); border-radius: 12rpx; overflow: hidden; } +.chapter-title { font-size: 28rpx; font-weight: 500; padding: 20rpx 24rpx; background: var(--muted); display: block; } +.lesson { display: flex; align-items: center; justify-content: space-between; padding: 18rpx 24rpx; border-bottom: 1rpx solid var(--muted); } .lesson:last-child { border-bottom: none; } -.lesson-title { font-size: 26rpx; color: #333; } +.lesson-title { font-size: 26rpx; color: var(--foreground); } .lesson-status { font-size: 24rpx; } diff --git a/mobile/src/pages/courses/index.vue b/mobile/src/pages/courses/index.vue index d11ff5b..f2521ed 100644 --- a/mobile/src/pages/courses/index.vue +++ b/mobile/src/pages/courses/index.vue @@ -73,26 +73,26 @@ const goDetail = (id: number) => uni.navigateTo({ url: `/pages/course-detail/ind diff --git a/mobile/src/pages/create-post/index.vue b/mobile/src/pages/create-post/index.vue index 4fa513d..66ed91d 100644 --- a/mobile/src/pages/create-post/index.vue +++ b/mobile/src/pages/create-post/index.vue @@ -44,15 +44,15 @@ async function submit() { .create-post { padding: 30rpx; } .form { } .input { - background: #fff; border-radius: 12rpx; padding: 24rpx 30rpx; font-size: 28rpx; - margin-bottom: 24rpx; border: 1rpx solid #e8e8e8; + background: var(--card); border-radius: 12rpx; padding: 24rpx 30rpx; font-size: 28rpx; + margin-bottom: 24rpx; border: 1rpx solid var(--border); } .textarea { - background: #fff; border-radius: 12rpx; padding: 24rpx 30rpx; font-size: 28rpx; - margin-bottom: 24rpx; border: 1rpx solid #e8e8e8; min-height: 300rpx; + background: var(--card); border-radius: 12rpx; padding: 24rpx 30rpx; font-size: 28rpx; + margin-bottom: 24rpx; border: 1rpx solid var(--border); min-height: 300rpx; } .btn-primary { - background: #4f8cff; color: #fff; border-radius: 12rpx; padding: 24rpx; + background: var(--brand); color: var(--card); border-radius: 12rpx; padding: 24rpx; font-size: 30rpx; text-align: center; margin-top: 30rpx; border: none; } diff --git a/mobile/src/pages/favorites/index.vue b/mobile/src/pages/favorites/index.vue index 9aa6bc2..fc27212 100644 --- a/mobile/src/pages/favorites/index.vue +++ b/mobile/src/pages/favorites/index.vue @@ -51,11 +51,11 @@ function goDetail(item: any) { diff --git a/mobile/src/pages/index/index.vue b/mobile/src/pages/index/index.vue index c6e768c..930d08f 100644 --- a/mobile/src/pages/index/index.vue +++ b/mobile/src/pages/index/index.vue @@ -104,42 +104,42 @@ const goPost = (id: number) => uni.navigateTo({ url: `/pages/post-detail/index?i diff --git a/mobile/src/pages/learning-progress/index.vue b/mobile/src/pages/learning-progress/index.vue index e374c19..10efef6 100644 --- a/mobile/src/pages/learning-progress/index.vue +++ b/mobile/src/pages/learning-progress/index.vue @@ -51,18 +51,18 @@ onMounted(async () => { .learning-progress { padding: 30rpx; } .stats { display: flex; gap: 20rpx; margin-bottom: 40rpx; } .stat-item { - flex: 1; background: #fff; border-radius: 16rpx; padding: 30rpx; text-align: center; + flex: 1; background: var(--card); border-radius: 16rpx; padding: 30rpx; text-align: center; box-shadow: 0 2rpx 12rpx rgba(0,0,0,0.04); } -.stat-value { font-size: 40rpx; font-weight: bold; color: #4f8cff; display: block; } -.stat-label { font-size: 24rpx; color: #999; margin-top: 8rpx; display: block; } +.stat-value { font-size: 40rpx; font-weight: bold; color: var(--brand); display: block; } +.stat-label { font-size: 24rpx; color: var(--muted-foreground); margin-top: 8rpx; display: block; } .course-list { } .course-item { - display: flex; align-items: center; background: #fff; border-radius: 12rpx; + display: flex; align-items: center; background: var(--card); border-radius: 12rpx; padding: 24rpx; margin-bottom: 16rpx; } .course-name { width: 200rpx; font-size: 26rpx; font-weight: 500; } -.progress-bar { flex: 1; height: 16rpx; background: #f0f0f0; border-radius: 8rpx; margin: 0 20rpx; overflow: hidden; } -.progress-fill { height: 100%; background: #4f8cff; border-radius: 8rpx; } -.progress-text { font-size: 24rpx; color: #4f8cff; width: 80rpx; text-align: right; } +.progress-bar { flex: 1; height: 16rpx; background: var(--border); border-radius: 8rpx; margin: 0 20rpx; overflow: hidden; } +.progress-fill { height: 100%; background: var(--brand); border-radius: 8rpx; } +.progress-text { font-size: 24rpx; color: var(--brand); width: 80rpx; text-align: right; } diff --git a/mobile/src/pages/lesson/index.vue b/mobile/src/pages/lesson/index.vue index 21dd219..e084ddd 100644 --- a/mobile/src/pages/lesson/index.vue +++ b/mobile/src/pages/lesson/index.vue @@ -49,11 +49,11 @@ async function markComplete() { diff --git a/mobile/src/pages/membership/index.vue b/mobile/src/pages/membership/index.vue index 6976ac2..8bf261b 100644 --- a/mobile/src/pages/membership/index.vue +++ b/mobile/src/pages/membership/index.vue @@ -48,14 +48,14 @@ async function createOrder(plan: any) { border-radius: 20rpx; padding: 40rpx; text-align: center; margin-bottom: 40rpx; } .plan-label { font-size: 24rpx; color: rgba(255,255,255,0.8); display: block; } -.plan-name { font-size: 40rpx; font-weight: bold; color: #fff; margin: 16rpx 0; display: block; } +.plan-name { font-size: 40rpx; font-weight: bold; color: var(--card); margin: 16rpx 0; display: block; } .plan-expire { font-size: 24rpx; color: rgba(255,255,255,0.8); display: block; } .plans { display: flex; gap: 24rpx; } .plan-card { - flex: 1; background: #fff; border-radius: 16rpx; padding: 40rpx 30rpx; text-align: center; + flex: 1; background: var(--card); border-radius: 16rpx; padding: 40rpx 30rpx; text-align: center; box-shadow: 0 4rpx 20rpx rgba(0,0,0,0.06); } .plan-name { font-size: 30rpx; font-weight: 500; display: block; } .plan-price { font-size: 44rpx; font-weight: bold; color: #ff6b6b; margin: 20rpx 0; display: block; } -.plan-desc { font-size: 24rpx; color: #999; } +.plan-desc { font-size: 24rpx; color: var(--muted-foreground); } diff --git a/mobile/src/pages/post-detail/index.vue b/mobile/src/pages/post-detail/index.vue index a156764..217486e 100644 --- a/mobile/src/pages/post-detail/index.vue +++ b/mobile/src/pages/post-detail/index.vue @@ -79,22 +79,22 @@ async function submitComment() { diff --git a/mobile/src/pages/profile/index.vue b/mobile/src/pages/profile/index.vue index cea19c7..8805305 100644 --- a/mobile/src/pages/profile/index.vue +++ b/mobile/src/pages/profile/index.vue @@ -78,31 +78,31 @@ function handleLogout() { diff --git a/mobile/src/pages/prompt-detail/index.vue b/mobile/src/pages/prompt-detail/index.vue index bfe4827..cc9d770 100644 --- a/mobile/src/pages/prompt-detail/index.vue +++ b/mobile/src/pages/prompt-detail/index.vue @@ -52,13 +52,13 @@ async function toggleFavorite() { diff --git a/mobile/src/pages/prompts/index.vue b/mobile/src/pages/prompts/index.vue index a06f482..57f7085 100644 --- a/mobile/src/pages/prompts/index.vue +++ b/mobile/src/pages/prompts/index.vue @@ -51,22 +51,22 @@ const goDetail = (id: number) => uni.navigateTo({ url: `/pages/prompt-detail/ind diff --git a/mobile/src/pages/register/index.vue b/mobile/src/pages/register/index.vue index 3ffe588..50e8b69 100644 --- a/mobile/src/pages/register/index.vue +++ b/mobile/src/pages/register/index.vue @@ -52,13 +52,13 @@ const goLogin = () => uni.navigateTo({ url: '/pages/login/index' }) diff --git a/mobile/src/pages/sandbox/index.vue b/mobile/src/pages/sandbox/index.vue index 44211a8..819e89b 100644 --- a/mobile/src/pages/sandbox/index.vue +++ b/mobile/src/pages/sandbox/index.vue @@ -96,7 +96,7 @@ function onModelChange(e: any) { .content { display: inline-block; padding: 16rpx 20rpx; border-radius: 12rpx; font-size: 28rpx; line-height: 1.6; } -.message.user .content { background: var(--brand); color: #fff; border-radius: 12rpx 0 12rpx 12rpx; } +.message.user .content { background: var(--brand); color: var(--card); border-radius: 12rpx 0 12rpx 12rpx; } .message.ai .content { background: var(--card); color: var(--foreground); border-radius: 0 12rpx 12rpx 12rpx; } .input-area { display: flex; align-items: center; padding: 16rpx 30rpx; background: var(--card); @@ -104,7 +104,7 @@ function onModelChange(e: any) { } .input { flex: 1; background: var(--muted); border-radius: 12rpx; padding: 16rpx 24rpx; font-size: 28rpx; } .btn-send { - background: var(--brand); color: #fff; border-radius: 10rpx; padding: 14rpx 28rpx; + background: var(--brand); color: var(--card); border-radius: 10rpx; padding: 14rpx 28rpx; font-size: 26rpx; margin-left: 16rpx; border: none; } diff --git a/mobile/src/pages/search/index.vue b/mobile/src/pages/search/index.vue index f4f332e..26c4297 100644 --- a/mobile/src/pages/search/index.vue +++ b/mobile/src/pages/search/index.vue @@ -67,18 +67,18 @@ function goDetail(item: any) {