feat: 小程序与管理端迭代(神仙AI、了解自己CRM、AI测试入口、报表与分润等)

Made-with: Cursor
This commit is contained in:
卡若
2026-04-17 19:46:48 +08:00
parent cf835ea585
commit 7108f28280
239 changed files with 21061 additions and 2175 deletions

View File

@@ -65,7 +65,11 @@ Page({
/** 最新测试横滑区:有问卷/面相权限即显示;无记录时卡片灰阶占位,不隐藏 */
showLatestTestRow: false,
/** 用户卡片下性格标签:在「当前权限下无任何问卷结果」时显示灰色提示 */
showEmptyPersonalityTags: true
showEmptyPersonalityTags: true,
/** 我的页底部 Soul 推荐条(超管可配) */
profileRecoShow: false,
profileRecoSectionLabel: '',
profileRecoArticle: null
},
_computeShowLatestTestRow(d) {
@@ -203,9 +207,72 @@ Page({
if (token || userInfo) {
this._loadRecentFromAPI()
this._loadPromoStats()
this._loadProfileRecoTeaser()
} else {
this.setData({ profileRecoShow: false, profileRecoArticle: null, profileRecoSectionLabel: '' })
}
},
/** 拉取「我的」页推荐条:与超管 Soul 文章推荐位第 1 篇一致 */
_loadProfileRecoTeaser() {
const t = Date.now()
request({
url: `/api/ai/articles/profile-teaser?_t=${t}`,
method: 'GET',
needAuth: false,
success: (res) => {
const payload = res && res.data
if (!payload || payload.code !== 200 || !payload.data) {
this.setData({ profileRecoShow: false, profileRecoArticle: null })
return
}
const d = payload.data
const art = d.article && d.article.url ? d.article : null
const show = !!(d.enabled && art)
this.setData({
profileRecoShow: show,
profileRecoSectionLabel: (d.sectionLabel && String(d.sectionLabel).trim()) || '推荐阅读',
profileRecoArticle: show ? art : null
})
},
fail: () => {
this.setData({ profileRecoShow: false, profileRecoArticle: null })
}
})
},
onTapProfileReco(e) {
const { id, url, title } = (e && e.currentTarget && e.currentTarget.dataset) || {}
if (!url) return
try {
require('../../utils/analytics').track('tap_ai_article', {
articleId: id,
url,
title,
from: 'profile_teaser'
})
} catch (err) {}
if (id) {
request({
url: `/api/ai/articles/${id}/click`,
method: 'POST',
needAuth: false,
success() {},
fail() {}
})
}
const enc = encodeURIComponent(url)
wx.navigateTo({
url: `/pages/webview/index?url=${enc}`,
fail: () => {
wx.setClipboardData({
data: url,
success: () => wx.showToast({ title: '已复制链接', icon: 'none' })
})
}
})
},
/** 从 /api/test/recent 拉取各类型最新记录 */
_loadRecentFromAPI() {
// 固定 scope=all与 appScope 无关。个人/企业 scope 会按 enterpriseId 过滤,若提交时写过
@@ -359,6 +426,14 @@ Page({
wx.navigateTo({ url: '/pages/history/index' })
},
goToUserProfile() { wx.navigateTo({ url: '/pages/user-profile/index' }) },
/** 合并后的用户卡片点击:按登录态分发 */
onUserCardTap() {
if (this.data.hasLogin) {
this.goToUserProfile()
} else {
this.doLogin()
}
},
/** 深度服务统一入口(页内 Tab个人 / 团队与企业) */
goToDeepService() {
try { require('../../utils/analytics').track('tap_deep_service', {}) } catch (e) {}
@@ -376,8 +451,23 @@ Page({
goToPurchasePersonal() { wx.navigateTo({ url: '/pages/purchase/index?tab=personal' }) },
goToPurchaseEnterprise() { wx.navigateTo({ url: '/pages/purchase/index?tab=enterprise' }) },
goToEnterprise() { wx.navigateTo({ url: '/pages/enterprise/index' }) },
goToPromo() { wx.navigateTo({ url: '/pages/promo/index' }) },
goToMyResume() { wx.navigateTo({ url: '/pages/enterprise/resume-history' }) },
goToPromoWithdrawals() {
try { require('../../utils/analytics').track('tap_promo_withdrawals', { from: 'profile' }) } catch (e) {}
wx.navigateTo({ url: '/pages/promo/withdrawals' })
},
goToPromo() {
try { require('../../utils/analytics').track('tap_promo_center', { from: 'profile' }) } catch (e) {}
wx.navigateTo({ url: '/pages/promo/index' })
},
goToMyResume() {
try { require('../../utils/analytics').track('tap_my_resume', {}) } catch (e) {}
wx.navigateTo({ url: '/pages/enterprise/resume-history' })
},
/** 匹配工作:新入口,跳转匹配工作中间页 */
goToMatchJob() {
try { require('../../utils/analytics').track('tap_match_job', {}) } catch (e) {}
wx.navigateTo({ url: '/pages/match-job/index' })
},
goToSettings() {
wx.showToast({ title: '开发中', icon: 'none' })
},

View File

@@ -1,5 +1,5 @@
<!--pages/profile/index.wxml-->
<view class="page">
<view class="page tabbar-pad">
<!-- 顶部栏 -->
<view class="topbar">
@@ -11,28 +11,12 @@
</view>
</view>
<!-- 未登录 -->
<view class="user-card" wx:if="{{!hasLogin}}" bindtap="doLogin">
<view class="avatar-ring">
<view class="avatar-letter-wrap" style="background:{{avatarBgColor}}">
<text class="avatar-letter">{{avatarLetter}}</text>
</view>
</view>
<view class="user-meta">
<text class="user-name" wx:if="{{loginLoading}}">登录中...</text>
<text class="user-name" wx:elif="{{loginFailed}}">登录失败,点击重试</text>
<text class="user-name" wx:else>点击登录</text>
<text class="user-sub">登录后查看你的测试结果</text>
</view>
<text class="chevron"></text>
</view>
<!-- 已登录:用户卡片(点击进入个人资料) -->
<view class="user-card" wx:if="{{hasLogin}}" bindtap="goToUserProfile">
<!-- 头像区 -->
<!-- 用户卡片:未登录点击登录,已登录点击进入个人资料(合并双态) -->
<view class="user-card" bindtap="onUserCardTap">
<!-- 头像区:已登录显示用户头像 + 在线点,未登录仅字母圆 -->
<view class="avatar-wrap">
<view class="avatar-ring">
<image wx:if="{{userInfo && (userInfo.avatarUrl || userInfo.avatar)}}"
<image wx:if="{{hasLogin && userInfo && (userInfo.avatarUrl || userInfo.avatar)}}"
class="avatar-img"
src="{{userInfo.avatarUrl || userInfo.avatar}}"
mode="aspectFill"/>
@@ -40,48 +24,88 @@
<text class="avatar-letter">{{avatarLetter}}</text>
</view>
</view>
<view class="online-dot"></view>
<view wx:if="{{hasLogin}}" class="online-dot"></view>
</view>
<!-- 昵称 + 标签 -->
<!-- 元信息:已登录昵称+标签;未登录登录提示 -->
<view class="user-meta">
<text class="nickname-text">{{nicknameDisplay || '点击设置昵称'}}</text>
<!-- 类型标签 -->
<scroll-view scroll-x class="tags-scroll">
<view class="tags-row">
<view class="tag tag-purple" wx:if="{{mbtiType && permMbti}}">
<text class="tag-text">{{mbtiType}}</text>
<block wx:if="{{hasLogin}}">
<text class="nickname-text">{{nicknameDisplay || '点击设置昵称'}}</text>
<scroll-view scroll-x class="tags-scroll">
<view class="tags-row">
<view class="tag tag-purple" wx:if="{{mbtiType && permMbti}}">
<text class="tag-text">{{mbtiType}}</text>
</view>
<view class="tag tag-sbti" wx:if="{{sbtiType && permSbti}}">
<text class="tag-text">{{sbtiType}}</text>
</view>
<view class="tag tag-blue" wx:if="{{discType && permDisc}}">
<text class="tag-text">{{discType}}</text>
</view>
<view class="tag tag-orange" wx:if="{{pdpType && permPdp}}">
<text class="tag-text">{{pdpType}}</text>
</view>
<view class="tag tag-gray" wx:if="{{showEmptyPersonalityTags}}">
<text class="tag-text">暂无测试记录</text>
</view>
</view>
<view class="tag tag-sbti" wx:if="{{sbtiType && permSbti}}">
<text class="tag-text">{{sbtiType}}</text>
</view>
<view class="tag tag-blue" wx:if="{{discType && permDisc}}">
<text class="tag-text">{{discType}}</text>
</view>
<view class="tag tag-orange" wx:if="{{pdpType && permPdp}}">
<text class="tag-text">{{pdpType}}</text>
</view>
<view class="tag tag-gray" wx:if="{{showEmptyPersonalityTags}}">
<text class="tag-text">暂无测试记录</text>
</view>
</view>
</scroll-view>
</scroll-view>
</block>
<block wx:else>
<text class="user-name" wx:if="{{loginLoading}}">登录中...</text>
<text class="user-name" wx:elif="{{loginFailed}}">登录失败,点击重试</text>
<text class="user-name" wx:else>点击登录</text>
<text class="user-sub">登录后查看你的测试结果</text>
</block>
</view>
<text class="chevron"></text>
</view>
<!-- 深度解析:四字标题下整合「最新测试 + 查看全部/历史」与深度服务入口(单面板 -->
<!-- 数据条:测试数 / 邀请 / 收益 / 可提现(营销数据融入身份,不再独立突兀卡 -->
<view class="user-stats" wx:if="{{hasLogin}}">
<view class="user-stat" bindtap="goToHistory">
<text class="user-stat__v">{{testCount || 0}}</text>
<text class="user-stat__l">测评记录</text>
</view>
<view
class="user-stat"
wx:if="{{promoDistributionEnabled && !reviewMode && permDistribution}}"
bindtap="goToPromo"
>
<text class="user-stat__v">{{promoTotalInvite || 0}}</text>
<text class="user-stat__l">邀请好友</text>
</view>
<!-- 第三格:可提现 → 分销中心 -->
<view
class="user-stat user-stat--highlight"
wx:if="{{promoDistributionEnabled && !reviewMode && permDistribution}}"
bindtap="goToPromo"
>
<text class="user-stat__v">¥{{promoWithdrawable || '0.00'}}</text>
<text class="user-stat__l">可提现 </text>
</view>
<!-- 第四格:累计 → 提现记录 -->
<view
class="user-stat user-stat--sub"
wx:if="{{promoDistributionEnabled && !reviewMode && permDistribution}}"
bindtap="goToPromoWithdrawals"
>
<text class="user-stat__v user-stat__v--sm">¥{{promoTotalEarned || '0.00'}}</text>
<text class="user-stat__l">累计 </text>
</view>
</view>
<!-- 我的测评:最新测试横滑 + 功能图标网格Soul 风:图标网格代替长列表) -->
<view class="section px-section" wx:if="{{hasLogin}}">
<text class="section-title depth-parse-title">深度解析</text>
<view class="depth-unified-card">
<view class="depth-unified-header">
<text class="depth-unified-subtitle">最新测试</text>
<view class="depth-header-link" bindtap="goToHistory">
<text class="depth-header-link-text">查看全部<text wx:if="{{testCount > 0}}"> · {{testCount}}条</text></text>
<text class="depth-header-chevron"></text>
</view>
<view class="sec-head">
<text class="sec-head__title">我的测评</text>
<view class="sec-head__link" bindtap="goToHistory">
<text>全部<text wx:if="{{testCount > 0}}"> · {{testCount}}</text></text>
<text class="sec-head__chev"></text>
</view>
</view>
<view class="depth-unified-card">
<scroll-view wx:if="{{showLatestTestRow}}" scroll-x class="cards-scroll cards-scroll--in-card" enhanced show-scrollbar="{{false}}">
<view class="cards-row cards-row--in-card">
<view class="result-card card-purple {{mbtiType ? '' : 'result-card--placeholder'}}" bindtap="viewMBTI" wx:if="{{permMbti}}">
@@ -140,84 +164,51 @@
</view>
</view>
</scroll-view>
<view wx:if="{{showLatestTestRow}}" class="depth-empty-hint depth-empty-hint--compact">
<text>点击卡片查看详情;右上方可查看全部测试记录。</text>
</view>
</view>
<!-- 快捷入口图标网格Soul 风2×N 图标 + 短标题) -->
<view class="section px-section" wx:if="{{hasLogin}}">
<view class="quick-grid quick-grid--4">
<view class="quick-grid__item" bindtap="goToTestSelect">
<view class="quick-grid__ic quick-grid__ic--purple">🧠</view>
<text class="quick-grid__label">性格测试</text>
</view>
<view class="depth-inner-divider"></view>
<view class="menu-item menu-item--flat" bindtap="goToTestSelect">
<view class="menu-icon-wrap menu-icon-test-select">
<text class="menu-icon">🧠</text>
</view>
<view class="menu-content">
<text class="menu-title">详细性格测试</text>
<text class="menu-sub">MBTI、PDP、DISC 三套问卷,任选一项开始</text>
</view>
<text class="menu-chevron"></text>
<view class="quick-grid__item" bindtap="goToOrders">
<view class="quick-grid__ic quick-grid__ic--emerald">🧾</view>
<text class="quick-grid__label">我的订单</text>
</view>
<view class="menu-divider menu-divider--in-card"></view>
<view class="menu-item menu-item--flat" bindtap="goToDeepService">
<view class="menu-icon-wrap menu-icon-purple">
<text class="menu-icon">✨</text>
</view>
<view class="menu-content">
<text class="menu-title">深度解读与方案</text>
<text class="menu-sub">个人报告与团队/企业服务,进入后按需选择</text>
</view>
<text class="menu-chevron"></text>
<view class="quick-grid__item" bindtap="goToDeepService">
<view class="quick-grid__ic quick-grid__ic--indigo">💎</view>
<text class="quick-grid__label">了解自己</text>
</view>
<view class="menu-divider menu-divider--in-card"></view>
<view class="menu-item menu-item--flat" bindtap="goToOrders">
<view class="menu-icon-wrap menu-icon-emerald">
<text class="menu-icon">🧾</text>
</view>
<view class="menu-content">
<text class="menu-title">我的订单</text>
<text class="menu-sub">支付记录与订单状态</text>
</view>
<text class="menu-chevron"></text>
</view>
<view class="menu-divider menu-divider--in-card" wx:if="{{hasEnterprise}}"></view>
<view class="menu-item menu-item--flat" wx:if="{{hasEnterprise}}" bindtap="goToMyResume">
<view class="menu-icon-wrap menu-icon-indigo">
<text class="menu-icon">📋</text>
</view>
<view class="menu-content">
<text class="menu-title">我的简历</text>
<text class="menu-sub">查看与设置默认简历</text>
</view>
<text class="menu-chevron"></text>
<view class="quick-grid__item" bindtap="goToMatchJob">
<view class="quick-grid__ic quick-grid__ic--blue">💼</view>
<text class="quick-grid__label">匹配工作</text>
</view>
</view>
</view>
<!-- 推广中心(与管理端开关、标题配置一致;卡片样式与其他区块统一 -->
<view class="section px-section" wx:if="{{hasLogin && promoDistributionEnabled && !reviewMode && permDistribution}}">
<view class="promo-card" bindtap="goToPromo">
<view class="promo-header">
<view class="promo-title-wrap">
<text class="promo-icon">📈</text>
<text class="promo-title">{{promoCenterTitle}}</text>
</view>
</view>
<view class="promo-stats">
<view class="promo-stat-item">
<text class="promo-stat-label">邀请好友</text>
<text class="promo-stat-value">{{promoTotalInvite}}</text>
</view>
<view class="promo-stat-divider"></view>
<view class="promo-stat-item">
<text class="promo-stat-label">累计收益</text>
<text class="promo-stat-value">¥{{promoTotalEarned}}</text>
</view>
<view class="promo-stat-divider"></view>
<view class="promo-stat-item">
<text class="promo-stat-label">可提现</text>
<text class="promo-stat-value promo-highlight">¥{{promoWithdrawable}}</text>
</view>
<!-- Soul 引流:后台「当前推荐」第 1 篇 + 可配区块标题(灰字可点 -->
<view class="section px-section profile-reco-wrap" wx:if="{{hasLogin && profileRecoShow}}">
<view
class="profile-reco-card"
hover-class="profile-reco-card--press"
bindtap="onTapProfileReco"
data-id="{{profileRecoArticle.id}}"
data-url="{{profileRecoArticle.url}}"
data-title="{{profileRecoArticle.title}}"
>
<text class="profile-reco-label">{{profileRecoSectionLabel}}</text>
<view class="profile-reco-row">
<text class="profile-reco-title">{{profileRecoArticle.title}}</text>
<text class="profile-reco-chev"></text>
</view>
</view>
</view>
<!-- 分销/提现入口已上移至数据条下方promo-quick-bar -->
<view class="bottom-safe"></view>
<custom-tab-bar />
</view>

View File

@@ -280,6 +280,28 @@ custom-tab-bar {
margin-bottom: 16rpx;
}
.section-title--quiet {
font-size: 26rpx;
font-weight: 500;
color: #6b7280;
letter-spacing: 2rpx;
margin-top: 8rpx;
margin-bottom: 12rpx;
}
.menu-item--quiet .menu-icon-wrap.menu-icon-quiet {
background: #f1f5f9;
}
.menu-item--quiet .menu-icon-quiet .menu-icon {
color: #475569;
}
.menu-sub--highlight {
color: #e11d48;
font-weight: 600;
}
/* 深度解析:单卡整合 */
.depth-unified-card {
background: #FFFFFF;
@@ -688,3 +710,351 @@ custom-tab-bar {
.bottom-safe {
height: 40rpx;
}
/* ===== 用户数据条Soul 风,营销数据融入身份卡下方)===== */
.user-stats {
display: flex;
align-items: stretch;
margin: 16rpx 32rpx 0;
padding: 28rpx 8rpx;
background: #fff;
border-radius: 24rpx;
box-shadow: 0 4rpx 20rpx rgba(15, 23, 42, 0.05);
border: 1rpx solid #f1f5f9;
}
.user-stat {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 6rpx;
position: relative;
}
.user-stat + .user-stat::before {
content: '';
position: absolute;
left: 0;
top: 14rpx;
bottom: 14rpx;
width: 1rpx;
background: #f1f5f9;
}
.user-stat__v {
font-size: 36rpx;
font-weight: 700;
color: #111827;
line-height: 1.1;
letter-spacing: -0.01em;
}
.user-stat__l {
font-size: 22rpx;
color: #94a3b8;
}
.user-stat--highlight .user-stat__v {
color: #7c3aed;
}
.user-stat:active {
background: rgba(124, 58, 237, 0.04);
border-radius: 12rpx;
}
/* "累计"第四格:金额字号略小,紫色辅文字呼应高亮格 */
.user-stat__v--sm {
font-size: 30rpx;
}
.user-stat--sub .user-stat__v {
color: #a78bfa;
}
.user-stat--sub .user-stat__l {
color: #7c3aed;
font-weight: 600;
}
/* ===== 小节标题Soul 风:短促、带副箭头链接)===== */
.sec-head {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 8rpx 16rpx;
}
.sec-head__title {
font-size: 30rpx;
font-weight: 700;
color: #111827;
letter-spacing: -0.01em;
}
.sec-head__link {
display: flex;
align-items: center;
gap: 4rpx;
font-size: 24rpx;
color: #94a3b8;
}
.sec-head__chev {
font-size: 26rpx;
color: #cbd5e1;
}
/* ===== 快捷入口图标网格 2×3 / 2×4 ===== */
.quick-grid {
display: grid;
gap: 12rpx;
padding: 24rpx 20rpx;
background: #fff;
border-radius: 24rpx;
box-shadow: 0 4rpx 20rpx rgba(15, 23, 42, 0.05);
border: 1rpx solid #f1f5f9;
}
.quick-grid--3 { grid-template-columns: repeat(3, 1fr); }
.quick-grid--4 { grid-template-columns: repeat(4, 1fr); }
.quick-grid__item {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 10rpx;
padding: 16rpx 8rpx;
border-radius: 16rpx;
transition: background 0.2s;
}
.quick-grid__item:active {
background: #f8fafc;
}
.quick-grid__ic {
width: 72rpx;
height: 72rpx;
border-radius: 20rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 36rpx;
}
.quick-grid__ic--purple { background: #f5f3ff; color: #7c3aed; }
.quick-grid__ic--emerald { background: #ecfdf5; color: #059669; }
.quick-grid__ic--indigo { background: #eef2ff; color: #4f46e5; }
.quick-grid__ic--blue { background: #eff6ff; color: #2563eb; }
.quick-grid__label {
font-size: 24rpx;
color: #374151;
line-height: 1.2;
}
/* ===== 我的页 · Soul 推荐条(灰字、可读) ===== */
.profile-reco-wrap {
margin-top: 8rpx;
}
.profile-reco-card {
background: #fff;
border-radius: 20rpx;
padding: 22rpx 26rpx 24rpx;
border: 1rpx solid #eef2f7;
box-shadow: 0 2rpx 12rpx rgba(15, 23, 42, 0.04);
}
.profile-reco-card--press {
opacity: 0.92;
background: #fafbfc;
}
.profile-reco-label {
display: block;
font-size: 22rpx;
color: #9ca3af;
letter-spacing: 0.02em;
margin-bottom: 10rpx;
}
.profile-reco-row {
display: flex;
align-items: flex-start;
gap: 12rpx;
}
.profile-reco-title {
flex: 1;
min-width: 0;
font-size: 26rpx;
line-height: 1.45;
color: #6b7280;
font-weight: 500;
}
.profile-reco-chev {
flex-shrink: 0;
font-size: 30rpx;
color: #d1d5db;
line-height: 1.4;
margin-top: 2rpx;
}
/* ===== 克制菜单(推广中心/提现历史 等低调入口)===== */
.plain-menu {
background: #fff;
border-radius: 24rpx;
box-shadow: 0 4rpx 20rpx rgba(15, 23, 42, 0.05);
border: 1rpx solid #f1f5f9;
overflow: hidden;
}
.plain-menu__item {
display: flex;
align-items: center;
gap: 16rpx;
padding: 24rpx 28rpx;
}
.plain-menu__item:active {
background: #f8fafc;
}
.plain-menu__ic {
width: 56rpx;
height: 56rpx;
border-radius: 16rpx;
background: #f1f5f9;
color: #64748b;
display: flex;
align-items: center;
justify-content: center;
font-size: 28rpx;
}
.plain-menu__main {
flex: 1;
display: flex;
flex-direction: column;
gap: 4rpx;
}
.plain-menu__title {
font-size: 28rpx;
color: #111827;
font-weight: 500;
}
.plain-menu__sub {
font-size: 22rpx;
color: #94a3b8;
}
.plain-menu__arrow {
color: #cbd5e1;
font-size: 32rpx;
}
.plain-menu__divider {
height: 1rpx;
background: #f1f5f9;
margin-left: 100rpx;
}
/* ===== 赚取分润卡(保留定义以兼容旧引用;当前页面已不使用)===== */
.earn-card {
position: relative;
padding: 32rpx 36rpx 28rpx;
border-radius: 28rpx;
overflow: hidden;
background: linear-gradient(135deg, #7c3aed 0%, #6366f1 55%, #4f46e5 100%);
box-shadow: 0 14rpx 36rpx rgba(99, 102, 241, 0.22);
color: #fff;
}
.earn-card__bg {
position: absolute;
inset: 0;
pointer-events: none;
background:
radial-gradient(circle at 85% 0%, rgba(255, 255, 255, 0.25) 0 120rpx, transparent 200rpx),
radial-gradient(circle at 0% 100%, rgba(255, 255, 255, 0.12) 0 180rpx, transparent 320rpx);
}
.earn-card__head {
position: relative;
margin-bottom: 24rpx;
}
.earn-card__title-row {
display: flex;
align-items: center;
gap: 14rpx;
margin-bottom: 8rpx;
}
.earn-card__ic {
width: 52rpx;
height: 52rpx;
border-radius: 14rpx;
background: rgba(255, 255, 255, 0.18);
display: flex;
align-items: center;
justify-content: center;
font-size: 32rpx;
}
.earn-card__title {
font-size: 32rpx;
font-weight: 700;
letter-spacing: 0.02em;
}
.earn-card__title-em {
color: #fde047;
font-weight: 800;
margin: 0 4rpx;
}
.earn-card__sub {
display: block;
font-size: 24rpx;
color: rgba(255, 255, 255, 0.85);
line-height: 1.55;
max-width: 540rpx;
}
.earn-card__stats {
position: relative;
display: flex;
align-items: stretch;
gap: 12rpx;
padding: 20rpx 4rpx;
border-top: 1rpx solid rgba(255, 255, 255, 0.18);
border-bottom: 1rpx solid rgba(255, 255, 255, 0.18);
margin-bottom: 20rpx;
}
.earn-card__stat {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 4rpx;
}
.earn-card__stat-v {
font-size: 36rpx;
font-weight: 700;
line-height: 1.1;
letter-spacing: -0.01em;
}
.earn-card__stat-l {
font-size: 22rpx;
color: rgba(255, 255, 255, 0.78);
}
.earn-card__stat--highlight .earn-card__stat-v {
color: #fde047;
}
.earn-card__cta {
position: relative;
display: flex;
align-items: center;
justify-content: center;
gap: 8rpx;
font-size: 26rpx;
font-weight: 600;
color: #fff;
padding: 14rpx 0;
}
.earn-card__cta-arrow {
font-size: 28rpx;
opacity: 0.9;
}
.earn-card:active {
transform: scale(0.995);
}