From b39173643da2b64dc66b0a00d1a36e20c6b49e8f Mon Sep 17 00:00:00 2001 From: chiyi Date: Thu, 8 Oct 2026 17:09:11 +0800 Subject: [PATCH] =?UTF-8?q?style(ui):=20=E7=A7=BB=E9=99=A4=E5=90=89?= =?UTF-8?q?=E7=A5=A5=E7=89=A9=E6=8F=92=E7=94=BB=EF=BC=8C=E5=89=8D=E5=8F=B0?= =?UTF-8?q?=20hero=20=E6=94=B9=E4=B8=BA=20Memphis=20=E8=A3=85=E9=A5=B0?= =?UTF-8?q?=E5=85=83=E7=B4=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 首页 hero 去掉 Mascot,换成漂浮的蜡笔色墨边方块(float/wiggle/bounce 动画) - KPI 卡片轮流使用黄/粉/蓝/薄荷平涂色,能力卡图标、模型卡光晕统一 Memphis 调色 - 画廊跑马灯加粗黑上下边;About 页 hero 改为色块拼贴,文案不再以"薇薇"自称 - 空状态统一用旋转的 .empty-badge 黄色星标替代吉祥物 - 邀请页顶部卡片改为 ink-card + 蜡笔色统计块 + 橙色复制按钮 - 删除 Mascot.vue Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- frontend/src/components/Mascot.vue | 102 --------------- frontend/src/style.css | 19 +++ frontend/src/views/AboutView.vue | 89 +++++++++---- frontend/src/views/HomeView.vue | 153 ++++++++++++++++------- frontend/src/views/InviteView.vue | 33 +++-- frontend/src/views/OrdersView.vue | 3 +- frontend/src/views/UserLogsTableView.vue | 3 +- frontend/src/views/UserLogsView.vue | 3 +- 8 files changed, 209 insertions(+), 196 deletions(-) delete mode 100644 frontend/src/components/Mascot.vue diff --git a/frontend/src/components/Mascot.vue b/frontend/src/components/Mascot.vue deleted file mode 100644 index e11c436..0000000 --- a/frontend/src/components/Mascot.vue +++ /dev/null @@ -1,102 +0,0 @@ - - - - - diff --git a/frontend/src/style.css b/frontend/src/style.css index e8f5ea4..9401e19 100644 --- a/frontend/src/style.css +++ b/frontend/src/style.css @@ -473,6 +473,25 @@ html.dark .memphis-dots { .memphis-press { transition: transform 0.15s ease; } .memphis-press:active { transform: scale(0.97) translateY(2px); } +/* Empty-state badge — a rotated crayon tile with a star, replaces the old + mascot illustration in empty lists. */ +.empty-badge { + width: 4.5rem; + height: 4.5rem; + display: grid; + place-items: center; + font-size: 1.8rem; + font-weight: 900; + color: #111; + background: var(--m-yellow); + border: 3px solid var(--ink); + border-radius: 1rem; + box-shadow: 5px 5px 0 var(--shadow-ink); + transform: rotate(-6deg); + animation: memphis-float 6s ease-in-out infinite; +} +@media (prefers-reduced-motion: reduce) { .empty-badge { animation: none; } } + @keyframes memphis-wiggle { 0%, 100% { transform: rotate(-3deg); } 50% { transform: rotate(3deg); } } @keyframes memphis-float { 0%, 100% { transform: translateY(0) rotate(0deg); } 50% { transform: translateY(-10px) rotate(1.5deg); } } @keyframes memphis-bounce { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-8px); } } diff --git a/frontend/src/views/AboutView.vue b/frontend/src/views/AboutView.vue index 66743bb..719003f 100644 --- a/frontend/src/views/AboutView.vue +++ b/frontend/src/views/AboutView.vue @@ -1,59 +1,63 @@ + + diff --git a/frontend/src/views/HomeView.vue b/frontend/src/views/HomeView.vue index fd5472b..e4776e8 100644 --- a/frontend/src/views/HomeView.vue +++ b/frontend/src/views/HomeView.vue @@ -4,8 +4,6 @@ import { useRouter } from 'vue-router' import { api, generatedUrl } from '../api' import { site } from '../site' import { isAuthed, openLogin } from '../auth' -import Mascot from '../components/Mascot.vue' - const router = useRouter() // Navigate to a signed-in page, or pop the login modal (remembering the @@ -123,32 +121,32 @@ const caps = computed(() => { { key: 't2i', title: '文字生图', model: imageModels.value[0]?.id, desc: '一句话出图,画幅与分辨率按所选模型的可用范围给出。', - tint: 'rgb(52 211 153 / 0.14)', color: 'rgb(52 211 153)', + tint: '#a7f3d0', color: '#065f46', metas: [resRange.value, `${imageModels.value.length} 个模型`].filter(Boolean), }, { key: 'i2i', title: '参考图生图', model: i2iModels[0]?.id, desc: '上传参考图换风格、改构图、做变体,支持多张参考。', - tint: 'rgb(217 70 239 / 0.14)', color: 'rgb(232 121 249)', + tint: '#ffc1cc', color: '#9f1239', metas: ['多图参考', `${i2iModels.length} 个模型`], }, { key: 't2v', title: '文字生视频', model: videoModels.value[0]?.id, desc: '一段描述生成短片,时长与分辨率按模型能力可选。', - tint: 'rgb(14 165 233 / 0.14)', color: 'rgb(56 189 248)', + tint: '#bae6fd', color: '#075985', metas: [durationRange.value, videoRes.value, `${videoModels.value.length} 个模型`].filter(Boolean), }, { key: 'i2v', title: '图生视频', model: i2vModels[0]?.id, desc: '给参考图或首帧,让静态画面动起来。', - tint: 'rgb(245 158 11 / 0.14)', color: 'rgb(251 191 36)', + tint: '#fef08a', color: '#92400e', metas: ['参考图', `${i2vModels.length} 个模型`], }, ].filter((c) => c.model) }) // ---- model cards: the admin-set alias wins, so no upstream naming leaks ---- -const MODEL_TINT = ['#a78bfa', '#f0abfc', '#fb7185', '#fbbf24', '#38bdf8', '#34d399', '#94a3b8'] +const MODEL_TINT = ['#ec5b13', '#ffc1cc', '#bae6fd', '#a7f3d0', '#fef08a', '#f472b6', '#94a3b8'] const modelCards = computed(() => managed.value.map((m, i) => { const bits = [] if (m.resolutions?.length) bits.push(m.resolutions.join(' / ')) @@ -199,38 +197,43 @@ function useExample(ex) {