From 5f1ab737e9a6406b8c2ff3602474c8dd7a6ccb47 Mon Sep 17 00:00:00 2001 From: jacobxu666 Date: Thu, 25 Jun 2026 01:07:21 +0800 Subject: [PATCH] feat: UI redesign with uv-ui color system and landscape imagery MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replace all colors with uv-ui design tokens (primary #3c9cff, warning #f9ae3d, etc.) - Hero section: Wugong Mountain landscape photo with dark overlay - Super Player card: photo background, large typography, warning-color price/CTA, value comparison (¥198 vs ¥3800+) - Spots section: landscape thumbnails instead of CSS gradients, warning-color prices - Profile page: landscape hero header, CSS menu icons, floating card layout - Card list page: landscape hero header, filter pills, empty state design - TabBar: rename '入园码' to '旅游卡', Lucide-style PNG icons (home/card/profile) - Typography: corrected font weights (semibold for prices, medium for labels) - Remove broken font-loader (lxgw-wen-kai CDN 404) - Skip wx.getPrivacySetting in devtools to avoid framework timeout - Replace all inline SVG with CSS-only icons for mini-program compatibility - Add design system files (styles/, components/, animations) Co-Authored-By: Claude --- .gitignore | 6 +- CLAUDE.md | 60 +++ src/App.vue | 28 +- src/components/design-button.vue | 123 +++++ src/components/design-card.vue | 84 +++ src/components/design-input.vue | 122 +++++ src/components/section-label.vue | 43 ++ src/packages/user/pages/card/list.vue | 225 +++++++- src/pages.json | 10 +- src/pages/index/index.vue | 729 ++++++++++++++++++-------- src/pages/profile/index.vue | 340 ++++++++++-- src/static/tabbar/card-active.png | Bin 0 -> 437 bytes src/static/tabbar/card.png | Bin 0 -> 437 bytes src/static/tabbar/home-active.png | Bin 67 -> 477 bytes src/static/tabbar/home.png | Bin 67 -> 476 bytes src/static/tabbar/profile-active.png | Bin 67 -> 498 bytes src/static/tabbar/profile.png | Bin 67 -> 498 bytes src/static/tabbar/qrcode-active.png | Bin 67 -> 0 bytes src/static/tabbar/qrcode.png | Bin 67 -> 0 bytes src/styles/_animations.scss | 81 +++ src/styles/_mixins.scss | 66 +++ src/styles/_tokens.scss | 143 +++++ src/styles/_utilities.scss | 145 +++++ src/styles/main.scss | 38 ++ src/uni.scss | 257 ++++++--- 25 files changed, 2110 insertions(+), 390 deletions(-) create mode 100644 src/components/design-button.vue create mode 100644 src/components/design-card.vue create mode 100644 src/components/design-input.vue create mode 100644 src/components/section-label.vue create mode 100644 src/static/tabbar/card-active.png create mode 100644 src/static/tabbar/card.png delete mode 100644 src/static/tabbar/qrcode-active.png delete mode 100644 src/static/tabbar/qrcode.png create mode 100644 src/styles/_animations.scss create mode 100644 src/styles/_mixins.scss create mode 100644 src/styles/_tokens.scss create mode 100644 src/styles/_utilities.scss create mode 100644 src/styles/main.scss diff --git a/.gitignore b/.gitignore index 62bab23..658a179 100644 --- a/.gitignore +++ b/.gitignore @@ -19,4 +19,8 @@ dist *.ntvs* *.njsproj *.sln -*.sw? \ No newline at end of file +*.sw? +# Dev artifacts +.playwright-mcp/ +*.png +!src/static/**/*.png diff --git a/CLAUDE.md b/CLAUDE.md index 3a89b32..3756c55 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -150,3 +150,63 @@ dist/build/mp-weixin/ # 用微信开发者工具导入此目录 4. **条件编译**:`#ifdef MP-WEIXIN` 包裹微信特有逻辑 5. **隐私协议**:`App.vue` 中 `wx.getPrivacySetting` 检查,未同意前不能调授权 API 6. **微信开发者工具调试**:需勾选「不校验合法域名」才能请求 localhost + + +You tend to converge toward generic, "on distribution" outputs. +In frontend design, this creates what users call the "AI slop" +aesthetic. Avoid this: make creative, distinctive frontends that +surprise and delight. Focus on: + +Typography: Choose fonts that are beautiful, unique, and interesting. +Avoid generic fonts like Arial and Inter; opt instead for distinctive +choices that elevate the frontend's aesthetics. + +Color & Theme: Commit to a cohesive aesthetic. Use CSS variables for +consistency. Dominant colors with sharp accents outperform timid, +evenly-distributed palettes. + +Motion: Use animations for effects and micro-interactions. +Focus on high-impact moments: one well-orchestrated page load +with staggered reveals creates more delight than scattered +micro-interactions. + +Backgrounds: Create atmosphere and depth rather than defaulting +to solid colors. Layer CSS gradients, use geometric patterns, +or add contextual effects. + +Avoid generic AI-generated aesthetics: +- Overused font families (Inter, Roboto, Arial, system fonts) +- Clichéd color schemes (particularly purple gradients on white) +- Predictable layouts and component patterns +- Cookie-cutter design that lacks context-specific character + +Interpret creatively and make unexpected choices that feel +genuinely designed for the context. + + + +Typography instantly signals quality. Avoid boring, generic fonts. + +Never use: Inter, Roboto, Open Sans, Lato, default system fonts + +Impact choices: +- Code aesthetic: JetBrains Mono, Fira Code, Space Grotesk +- Editorial: Playfair Display, Crimson Pro, Fraunces +- Startup: Clash Display, Satoshi, Cabinet Grotesk +- Technical: IBM Plex family, Source Sans 3 +- Distinctive: Bricolage Grotesque, Obviously, Newsreader + +Pairing principle: High contrast = interesting. +Display + monospace, serif + geometric sans. + +Use extremes: 100/200 weight vs 800/900, not 400 vs 600. +Size jumps of 3x+, not 1.5x. + + +# Design System + +Always refer to DESIGN.md when generating or modifying any UI component. +Use only colors, fonts, and spacing values defined in DESIGN.md. +Do not invent new values or use defaults from any framework. +Match component states (hover, focus, active, disabled) to patterns +in DESIGN.md. \ No newline at end of file diff --git a/src/App.vue b/src/App.vue index d0b04bc..0fb575a 100644 --- a/src/App.vue +++ b/src/App.vue @@ -4,15 +4,20 @@ import { useUserStore } from './store/user' onLaunch(() => { // #ifdef MP-WEIXIN - wx.getPrivacySetting({ - success: (res: any) => { - if (res.needAuthorization) { - uni.setStorageSync('needPrivacy', true) - } else { - uni.removeStorageSync('needPrivacy') - } - } - }) + // 仅真机检查隐私协议,模拟器中跳过(getPrivacySetting 在模拟器会触发框架级 timeout) + const sysInfo = uni.getSystemInfoSync() + if (sysInfo.platform !== 'devtools' && wx.getPrivacySetting) { + wx.getPrivacySetting({ + success: (res: any) => { + if (res.needAuthorization) { + uni.setStorageSync('needPrivacy', true) + } else { + uni.removeStorageSync('needPrivacy') + } + }, + fail: () => {}, + }) + } // #endif const userStore = useUserStore() @@ -25,9 +30,10 @@ onLaunch(() => { }) - diff --git a/src/components/design-button.vue b/src/components/design-button.vue new file mode 100644 index 0000000..39960d4 --- /dev/null +++ b/src/components/design-button.vue @@ -0,0 +1,123 @@ + + + + + diff --git a/src/components/design-card.vue b/src/components/design-card.vue new file mode 100644 index 0000000..5abbb36 --- /dev/null +++ b/src/components/design-card.vue @@ -0,0 +1,84 @@ + + + + + diff --git a/src/components/design-input.vue b/src/components/design-input.vue new file mode 100644 index 0000000..a36a49d --- /dev/null +++ b/src/components/design-input.vue @@ -0,0 +1,122 @@ +