Files
Neo-ZQYY/apps/DEMO-miniprogram/miniprogram/pages/task-list/task-list.wxss

1416 lines
38 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* 任务列表页样式 — 2026-03-13 全量重写1:1 对齐 H5 原型 task-list.html */
/* AI_CHANGELOG
| 日期 | Prompt | 变更 |
|------|--------|------|
| 2026-03-13 | 重写 task-list 1:1 还原 H5 | 全量重写 |
| 2026-03-13 | banner 错位重做 | 页面内实现完整 banner |
| 2026-03-13 | 5项修复+精确还原 | 恢复纹理CSS层、盖戳改回CSS、标签恢复CSS渐变、abandoned灰化、全量line-height按排版字典校准 |
*/
/* 换算公式rpx = H5_px × 1.8204(基于 412px 验收宽度)
* 排版字典 B.3 硬映射:
* text-xs → 22rpx / 29rpx
* text-sm → 26rpx / 36rpx
* text-base→ 30rpx / 44rpx
* text-lg → 33rpx / 51rpx
* text-xl → 36rpx / 51rpx
* text-2xl → 44rpx / 58rpx
* text-3xl → 54rpx / 66rpx
* text-[9px]→ 16rpx行高需视觉校准
*/
/* ============================================
* 页面容器
* ============================================ */
.page-task-list {
min-height: 100vh;
background-color: var(--color-gray-1);
padding-bottom: 180rpx;
}
/* ============================================
* Banner 区域
* 方案SVG 做渐变底图 + CSS 做纹理叠加
* 原因SVG pattern 在小程序 image 组件中不渲染
* ============================================ */
.banner-area {
position: relative;
/* H5: pb-4 = 16px → 29rpx */
padding-bottom: 29rpx;
overflow: hidden;
}
/* 渐变底图 — SVG 包含 7 层渐变 + 光晕 */
.banner-bg-img {
position: absolute;
top: -50rpx;
left: 0;
width: 100%;
height: 110%;
z-index: 0;
}
/* 纹理层已烘焙进 banner-bg-combined.svg此层保留占位供未来扩展 */
/* ============================================
* 用户信息区 — H5: .px-5.pt-10.pb-3
* px-5=20px→36rpx, pt-10=40px→73rpx, pb-3=12px→22rpx
* ============================================ */
.user-info-section {
position: relative;
z-index: 2;
padding: 36rpx 29rpx 29rpx 29rpx;
}
/* H5: .flex.items-center.gap-4 → gap-4=16px→29rpx */
.user-info-row {
display: flex;
align-items: center;
gap: 29rpx;
}
/* 头像容器 — H5: w-14 h-14 rounded-2xl bg-white/20 shadow-lg overflow-hidden */
/* w-14=56px→102rpx, rounded-2xl=16px→29rpx (实际 24rpx 更接近视觉) */
.avatar-wrap {
width: 102rpx;
height: 102rpx;
border-radius: 24rpx;
background: rgba(255,255,255,0.2);
box-shadow: 0 10rpx 15rpx -3rpx rgba(0,0,0,0.1), 0 4rpx 6rpx -4rpx rgba(0,0,0,0.1);
overflow: hidden;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
}
.avatar-img {
width: 100%;
height: 100%;
}
.user-detail {
flex: 1;
}
/* H5: .flex.items-center.gap-2.mb-1 → gap-2=8px→15rpx, mb-1=4px→7rpx */
.user-name-row {
display: flex;
align-items: center;
gap: 15rpx;
margin-bottom: 7rpx;
line-height: 51rpx; /* text-xl line-height 容器 */
}
/* H5: text-xl font-semibold → 36rpx/51rpx */
.user-name {
font-size: 36rpx;
font-weight: 600;
color: #ffffff;
}
/* H5: px-2 py-0.5 bg-white/20 rounded-full text-xs
* px-2=8px→15rpx, py-0.5=2px→4rpx, text-xs→22rpx/29rpx */
.user-role-tag {
font-size: 22rpx;
padding: 0rpx 20rpx 0 20rpx;
background: rgba(255,255,255,0.2);
border-radius: 9999rpx;
color: #ffffff;
height: 35rpx;
line-height: 35rpx;
}
/* H5: text-white/70 text-sm → 26rpx/36rpx */
.user-store-row {
line-height: 36rpx;
}
.user-store {
font-size: 26rpx;
color: rgba(255,255,255,0.7);
}
/* ============================================
* 业绩进度卡片 — H5: .mx-4 > .bg-white/15.backdrop-blur-md.rounded-2xl.px-4.py-3.border.border-white/20
* mx-4=16px→29rpx, px-4=16px→29rpx, py-3=12px→22rpx, rounded-2xl=16px→29rpx
* ============================================ */
.perf-card {
position: relative;
z-index: 2;
margin: 0 29rpx;
background: rgba(255,255,255,0.15);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
border-radius: 29rpx;
padding: 22rpx 29rpx;
border: 1rpx solid rgba(255,255,255,0.2);
}
/* --- L1: 跳档提示行 --- */
/* H5: .flex.items-center.justify-between.mb-2 → mb-2=8px→15rpx */
.perf-l1 {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 15rpx;
}
/* H5: .flex.items-baseline.gap-2 → gap-2=8px→15rpx */
.perf-l1-left {
display: flex;
align-items: baseline;
gap: 15rpx;
line-height: 51rpx; /* text-xl 行高容器 */
}
/* H5: stat-label text-sm font-medium → 26rpx/36rpx */
.perf-label {
font-size: 26rpx;
font-weight: 500;
color: rgba(255,255,255,0.9);
text-shadow: 0 2rpx 4rpx rgba(0,0,0,0.15);
}
/* H5: stat-accent text-xl font-bold → 36rpx/51rpx */
.perf-accent {
font-size: 36rpx;
font-weight: 700;
color: #fcd34d;
text-shadow: 0 2rpx 4rpx rgba(0,0,0,0.2);
}
/* H5: stat-secondary text-xs → 22rpx/29rpx */
.perf-l1-right {
display: flex;
align-items: center;
gap: 4rpx;
line-height: 29rpx;
}
.perf-secondary {
font-size: 22rpx;
color: rgba(255,255,255,0.7);
}
/* --- L2: 5段档位进度条 --- */
/* H5: .relative.mb-6 → mb-6=24px→44rpx */
.perf-l2 {
position: relative;
}
/* ═══════════════════════════════════════════════════
* 进度条 — 一整根方案
* 结构tier-track > tier-track-bg + tier-track-fill + tier-divider×4
* ═══════════════════════════════════════════════════ */
/* 外层容器撑高、relative 供分隔线绝对定位 */
.tier-track {
position: relative;
height: 14rpx;
border-radius: 9rpx;
overflow: visible;
}
/* 底轨:整条灰白背景 */
.tier-track-bg {
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
border-radius: 9rpx;
background: rgba(255,255,255,0.18);
}
/* 填充条仅控制裁剪宽度overflow:hidden不设背景色 */
.tier-track-fill {
position: absolute;
top: 0; left: 0; bottom: 0;
border-radius: 9rpx;
overflow: hidden;
transition: width 0.4s cubic-bezier(0.34, 1.2, 0.64, 1);
box-shadow: 0 0 14rpx rgba(239,68,68,0.45);
}
/* 全宽渐变层:宽度撑满轨道 100%(相对于 tier-track不随填充宽度缩放 */
/* 小程序中 position:absolute + left:0 + width 用 vw 单位近似轨道宽度 */
.tier-gradient-bar {
position: absolute;
top: 0; left: 0; bottom: 0;
/* 轨道 = perf-card 内宽,约 (100vw - 29rpx*2 - 29rpx*2) ≈ 100vw - 116rpx */
/* 用 100vw 保证渐变铺满,超出部分被父层 overflow:hidden 裁掉 */
width: 100vw;
background: linear-gradient(
90deg,
#fde68a 0%,
#fbbf24 20%,
#f97316 45%,
#ef4444 70%,
#910a0a 100%
);
}
/* ══════════════════════════════════════════════════════
* 高光动画
* 默认状态不播放animation: none
* 触发JS 设置 shineRunning=true → 挂上 .tier-shine--active → 单次播放
* duration 由 WXML style 注入shineDurMs每轮由 JS 按进度+速度重算
*
* ★ 外观旋钮(在此修改)★
* --shine-width : 光束宽度默认50%
* --shine-opacity: 峰值亮度 0~1默认1.0
* --shine-color : RGB颜色默认纯白
* 255,220,100=暖黄255,180,80=橙
* ══════════════════════════════════════════════════════ */
.tier-shine {
--shine-width: 120rpx; /* ★固定宽度,不随进度条长短变化;改大=光晕更宽 */
--shine-opacity: 1.0;
--shine-color: 255, 255, 255;
position: absolute;
top: 0;
left: -70%; /* 静止时停在左侧外,不可见 */
width: var(--shine-width);
height: 100%;
background: linear-gradient(
90deg,
transparent 0%,
rgba(var(--shine-color), 0.08) 20%,
rgba(var(--shine-color), var(--shine-opacity)) 50%,
rgba(var(--shine-color), 0.08) 80%,
transparent 100%
);
animation: none; /* 默认不播放 */
pointer-events: none;
}
/* JS 设置 shineRunning=true 时挂上此 class触发单次播放 */
.tier-shine--active {
animation: tierShine 1s linear 1 forwards; /* duration 被 style 覆盖 */
}
@keyframes tierShine {
/* left 用固定 rpx确保起终点与填充条宽度无关 */
0% { left: -130rpx; opacity: 0; } /* 从左侧外出发(≈ shine-width + 10rpx */
5% { opacity: 1; } /* 淡入 */
95% { opacity: 1; } /* 接近右端 */
100% { left: calc(100% + 10rpx); opacity: 0; } /* 到达右侧外,淡出 */
}
/* ══════════════════════════════════════════════════════
* 进度末端导火索效果
* 默认状态:光柱微弱待机,火花不播放
* 触发JS 设置 sparkRunning=true → 挂上 --active class → 单次播放
* duration 由 WXML style 注入sparkDurMs = SPARK_DUR_MS
*
* ★ 外观旋钮(在此修改)★
* --spark-scale : 整体缩放,影响光柱+粒子大小+飞射距离
* --spark-pole-h: 光柱高度(宽度自动=高度/2
* ══════════════════════════════════════════════════════ */
.tier-edge-glow {
--spark-scale: 0.7;
--spark-pole-h: 30rpx;
position: absolute;
top: 50%;
transform: translate(-50%, -50%) scale(var(--spark-scale));
transform-origin: center center;
width: calc(var(--spark-pole-h) / 2);
height: var(--spark-pole-h);
border-radius: 999rpx;
background: rgba(255,255,255,1);
/* 默认:微弱待机光 */
opacity: 0.25;
box-shadow: 0 0 4rpx 2rpx rgba(255,200,80,0.35);
animation: none;
pointer-events: none;
overflow: visible;
z-index: 10;
transition: opacity 0.1s, box-shadow 0.1s;
}
/* 触发时:爆亮并消散(单次) */
.tier-edge-glow--active {
animation: edgePulse 1s ease-out 1 forwards;
}
@keyframes edgePulse {
0% { opacity: 1; box-shadow: 0 0 22rpx 12rpx rgba(255,255,255,0.95); }
15% { opacity: 1; box-shadow: 0 0 26rpx 14rpx rgba(255,220, 80,0.90); }
55% { opacity: 0.6; box-shadow: 0 0 12rpx 6rpx rgba(255,160, 40,0.60); }
85% { opacity: 0.25; box-shadow: 0 0 4rpx 2rpx rgba(255,200, 80,0.35); }
100% { opacity: 0.25; box-shadow: 0 0 4rpx 2rpx rgba(255,200, 80,0.35); }
}
/* 火星粒子基础样式:默认隐藏,从光柱中心出发 */
.spark {
position: absolute;
border-radius: 999rpx;
pointer-events: none;
opacity: 0;
top: 50%;
left: 50%;
animation: none;
}
/* 触发时播放单次散射动画 */
.spark--active { animation-iteration-count: 1; animation-fill-mode: forwards; }
/* ──────────────────────────────────────────────────────
* 6粒火星方向/颜色/大小各异,在 0%~15% 之间依次爆发
* timing-function 用 linear减速效果由关键帧间距控制
* 前段(爆发):帧间距大 → 视觉上快
* 后段(消散):帧间距小 → 视觉上慢,自然减速飘散
* ────────────────────────────────────────────────────── */
/* 粒子1右上亮白第一个爆发 */
.spark-1 { width: 10rpx; height: 10rpx; background: #ffffff; }
.spark-1.spark--active { animation-name: spark1; animation-timing-function: linear; }
@keyframes spark1 {
0% { opacity: 0; transform: translate( 0rpx, 0rpx) scale(0.0); }
8% { opacity: 1; transform: translate( 8rpx, -16rpx) scale(1.6); } /* 爆发 */
25% { opacity: 0.9; transform: translate( 16rpx, -30rpx) scale(1.2); }
45% { opacity: 0.7; transform: translate( 22rpx, -40rpx) scale(0.9); }
62% { opacity: 0.5; transform: translate( 27rpx, -48rpx) scale(0.7); }
76% { opacity: 0.3; transform: translate( 31rpx, -53rpx) scale(0.5); }
87% { opacity: 0.15;transform: translate( 34rpx, -57rpx) scale(0.3); }
100% { opacity: 0; transform: translate( 36rpx, -60rpx) scale(0.1); }
}
/* 粒子2右下橙色 */
.spark-2 { width: 12rpx; height: 12rpx; background: #fb923c; }
.spark-2.spark--active { animation-name: spark2; animation-timing-function: linear; }
@keyframes spark2 {
0% { opacity: 0; transform: translate( 0rpx, 0rpx) scale(0.0); }
12% { opacity: 1; transform: translate( 10rpx, 14rpx) scale(1.5); } /* 爆发 */
28% { opacity: 0.8; transform: translate( 19rpx, 24rpx) scale(1.1); }
46% { opacity: 0.6; transform: translate( 26rpx, 32rpx) scale(0.8); }
62% { opacity: 0.4; transform: translate( 31rpx, 38rpx) scale(0.6); }
76% { opacity: 0.25;transform: translate( 35rpx, 43rpx) scale(0.4); }
88% { opacity: 0.1; transform: translate( 38rpx, 47rpx) scale(0.25); }
100% { opacity: 0; transform: translate( 42rpx, 56rpx) scale(0.1); }
}
/* 粒子3正上黄色快速 */
.spark-3 { width: 8rpx; height: 8rpx; background: #fde68a; }
.spark-3.spark--active { animation-name: spark3; animation-timing-function: linear; }
@keyframes spark3 {
0% { opacity: 0; transform: translate( 0rpx, 0rpx) scale(0.0); }
6% { opacity: 1; transform: translate( 4rpx, -22rpx) scale(1.8); } /* 爆发 */
20% { opacity: 0.9; transform: translate( 7rpx, -36rpx) scale(1.3); }
38% { opacity: 0.7; transform: translate( 9rpx, -48rpx) scale(1.0); }
55% { opacity: 0.5; transform: translate( 10rpx, -57rpx) scale(0.7); }
70% { opacity: 0.3; transform: translate( 11rpx, -63rpx) scale(0.5); }
84% { opacity: 0.15;transform: translate( 11rpx, -68rpx) scale(0.3); }
100% { opacity: 0; transform: translate( 12rpx, -74rpx) scale(0.1); }
}
/* 粒子4右斜上红橙拖尾长条 */
.spark-4 { width: 16rpx; height: 6rpx; background: #ef4444; }
.spark-4.spark--active { animation-name: spark4; animation-timing-function: linear; }
@keyframes spark4 {
0% { opacity: 0; transform: translate( 0rpx, 0rpx) rotate( 0deg) scale(0.0); }
10% { opacity: 1; transform: translate( 14rpx, -10rpx) rotate(-20deg) scale(1.4); } /* 爆发 */
26% { opacity: 0.8; transform: translate( 24rpx, -16rpx) rotate(-30deg) scale(1.0); }
44% { opacity: 0.6; transform: translate( 32rpx, -21rpx) rotate(-38deg) scale(0.75);}
60% { opacity: 0.4; transform: translate( 39rpx, -26rpx) rotate(-45deg) scale(0.55);}
74% { opacity: 0.25;transform: translate( 44rpx, -30rpx) rotate(-50deg) scale(0.4); }
87% { opacity: 0.1; transform: translate( 48rpx, -33rpx) rotate(-53deg) scale(0.25);}
100% { opacity: 0; transform: translate( 58rpx, -40rpx) rotate(-55deg) scale(0.1); }
}
/* 粒子5正右黄白最先弹出 */
.spark-5 { width: 10rpx; height: 10rpx; background: #fbbf24; }
.spark-5.spark--active { animation-name: spark5; animation-timing-function: linear; }
@keyframes spark5 {
0% { opacity: 0; transform: translate( 0rpx, 0rpx) scale(0.0); }
5% { opacity: 1; transform: translate( 18rpx, 2rpx) scale(1.7); } /* 爆发(最早)*/
20% { opacity: 0.85;transform: translate( 30rpx, 3rpx) scale(1.2); }
38% { opacity: 0.65;transform: translate( 40rpx, 4rpx) scale(0.9); }
55% { opacity: 0.45;transform: translate( 47rpx, 5rpx) scale(0.7); }
70% { opacity: 0.3; transform: translate( 52rpx, 6rpx) scale(0.5); }
84% { opacity: 0.15;transform: translate( 56rpx, 7rpx) scale(0.3); }
100% { opacity: 0; transform: translate( 60rpx, 8rpx) scale(0.1); }
}
/* 粒子6右下斜淡橙最大最慢 */
.spark-6 { width: 14rpx; height: 14rpx; background: #fed7aa; }
.spark-6.spark--active { animation-name: spark6; animation-timing-function: linear; }
@keyframes spark6 {
0% { opacity: 0; transform: translate( 0rpx, 0rpx) scale(0.0); }
15% { opacity: 0.9; transform: translate( 6rpx, 18rpx) scale(1.5); } /* 爆发(最晚)*/
30% { opacity: 0.75;transform: translate( 10rpx, 28rpx) scale(1.1); }
47% { opacity: 0.55;transform: translate( 14rpx, 36rpx) scale(0.85);}
62% { opacity: 0.4; transform: translate( 17rpx, 43rpx) scale(0.65);}
75% { opacity: 0.25;transform: translate( 19rpx, 48rpx) scale(0.5); }
87% { opacity: 0.1; transform: translate( 21rpx, 53rpx) scale(0.35);}
100% { opacity: 0; transform: translate( 24rpx, 64rpx) scale(0.1); }
}
/* 分隔竖线:绝对定位叠在进度条上 */
.tier-divider {
position: absolute;
top: 0;
width: 8rpx;
height: 100%;
background: #5381D9;
transform: translateX(-50%);
pointer-events: none;
z-index: 2;
}
/* 刻度 — 完成后高亮 */
.tick--done {
color: rgba(255,255,255,0.95);
font-weight: 600;
}
.tick--highlight {
color: rgba(255,255,255,0.85);
font-weight: 500;
}
/* 刻度 — H5: text-[9px] → 16rpx */
.tier-ticks {
position: absolute;
width: 100%;
top: 100%;
margin-top: 6rpx;
height: 24rpx;
}
.tick {
position: absolute;
font-size: 16rpx;
color: rgba(255,255,255,0.55);
transition: color 0.3s ease, font-weight 0.3s ease;
}
.tick--current {
color: rgba(255,255,255,0.8);
font-weight: 500;
}
/* ============================================
* 调试面板task-list 专属)
* ============================================ */
.debug-panel {
position: fixed;
bottom: 180rpx;
right: 30rpx;
width: 540rpx;
background: #ffffff;
border-radius: 28rpx;
padding: 30rpx 28rpx 24rpx;
box-shadow: 0 12rpx 48rpx rgba(0,0,0,0.18);
z-index: 999;
opacity: 0;
transform: translateY(20rpx) scale(0.96);
pointer-events: none;
transition: opacity 0.2s ease, transform 0.2s ease;
}
.debug-panel--visible {
opacity: 1;
transform: translateY(0) scale(1);
pointer-events: all;
}
.debug-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 24rpx;
padding-bottom: 20rpx;
border-bottom: 2rpx solid #f3f3f3;
}
.debug-title {
font-size: 28rpx;
font-weight: 600;
color: #242424;
line-height: 40rpx;
}
.debug-close {
display: flex;
align-items: center;
justify-content: center;
width: 52rpx;
height: 52rpx;
border-radius: 999rpx;
background: #f3f3f3;
}
.debug-close--hover { opacity: 0.6; }
.debug-section {
margin-bottom: 22rpx;
}
.debug-section:last-child { margin-bottom: 0; }
.debug-section--row {
display: flex;
align-items: center;
justify-content: space-between;
}
.debug-label-row {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 8rpx;
}
.debug-label {
font-size: 24rpx;
color: #5e5e5e;
line-height: 36rpx;
}
.debug-value-chip {
font-size: 22rpx;
font-weight: 600;
color: #10b981;
background: rgba(16,185,129,0.10);
padding: 4rpx 14rpx;
border-radius: 999rpx;
line-height: 32rpx;
}
.debug-chip--green {
color: #10b981;
background: rgba(16,185,129,0.10);
}
.debug-chip--yellow {
color: #d97706;
background: rgba(251,191,36,0.12);
}
.debug-slider {
width: 100%;
margin: 4rpx 0 0;
}
.debug-tick-row {
display: flex;
justify-content: space-between;
margin-top: 4rpx;
}
.debug-tick {
font-size: 18rpx;
color: #a6a6a6;
line-height: 28rpx;
}
.debug-tick--key {
color: #8b8b8b;
font-weight: 500;
}
.debug-tick--current {
color: #0052d9;
font-weight: 600;
}
.debug-btn-group {
display: flex;
flex-wrap: wrap;
gap: 12rpx;
margin-top: 10rpx;
}
.debug-btn {
padding: 10rpx 18rpx;
background: #f3f3f3;
border-radius: 12rpx;
font-size: 22rpx;
color: #5e5e5e;
line-height: 32rpx;
border: 2rpx solid transparent;
}
.debug-btn--active {
background: #ecf2fe;
color: #0052d9;
border-color: #0052d9;
font-weight: 600;
}
/* Toggle switch */
.debug-toggle {
width: 88rpx;
height: 48rpx;
border-radius: 999rpx;
background: #e7e7e7;
position: relative;
transition: background 0.25s ease;
flex-shrink: 0;
}
.debug-toggle--on {
background: #10b981;
}
.debug-toggle-thumb {
position: absolute;
top: 6rpx;
left: 6rpx;
width: 36rpx;
height: 36rpx;
border-radius: 999rpx;
background: #ffffff;
box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.15);
transition: left 0.25s ease;
}
.debug-toggle--on .debug-toggle-thumb {
left: 46rpx;
}
/* 调试触发按钮 */
.debug-trigger {
position: fixed;
bottom: 230rpx;
right: 30rpx;
width: 88rpx;
height: 88rpx;
background: linear-gradient(135deg, #667eea, #764ba2);
border-radius: 999rpx;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 8rpx 24rpx rgba(102,126,234,0.40);
z-index: 998;
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.debug-trigger--active {
background: linear-gradient(135deg, #764ba2, #667eea);
box-shadow: 0 12rpx 32rpx rgba(102,126,234,0.55);
transform: rotate(15deg);
}
.debug-trigger--hover { opacity: 0.88; }
.debug-trigger-icon {
font-size: 44rpx;
line-height: 1;
}
/* --- L3: 课时 + 红戳 + 奖金 --- */
/* H5: .flex.items-stretch.mb-2.5 → mb-2.5=10px→18rpx */
.perf-l3 {
display: flex;
align-items: stretch;
margin: 40rpx 0 30rpx 0;
}
/* 左侧:课时数据 + 红戳flex:3 */
/* H5: .pr-4.border-r.border-white/25.flex.justify-center.items-center */
.perf-l3-left {
flex: 3.5;
padding-right: 0rpx;
border-right: 1rpx solid rgba(255,255,255,0.25);
display: flex;
justify-content: center;
align-items: center;
}
/* H5: .red-stamp.inline-block.relative padding-right:35px→64rpx */
.perf-hours-wrap {
display: inline-block;
position: relative;
padding-right: 62rpx;
text-align: center;
}
/* H5: .flex.items-baseline.justify-center.gap-1.5 → gap-1.5=6px→11rpx */
.perf-hours-row {
display: flex;
align-items: baseline;
justify-content: center;
gap: 11rpx;
line-height: 51rpx; /* text-xl 行高容器 */
}
/* H5: stat-highlight text-xl font-bold → 36rpx, color:#6ee7b7 */
.hours-green {
font-size: 38rpx;
font-weight: 700;
color: #6ee7b7;
text-shadow: 0 2rpx 4rpx rgba(0,0,0,0.2);
}
/* H5: stat-secondary text-sm → 26rpx */
.hours-sep {
font-size: 32rpx;
color: rgba(255,255,255,0.7);
}
/* H5: stat-accent text-xl font-bold → 36rpx, color:#fcd34d */
.hours-yellow {
font-size: 38rpx;
font-weight: 700;
color: #fcd34d;
text-shadow: 0 2rpx 4rpx rgba(0,0,0,0.2);
}
/* H5: stat-value text-xl font-bold → 36rpx, color:#ffffff */
.hours-white {
font-size: 38rpx;
font-weight: 700;
color: #ffffff;
text-shadow: 0 2rpx 6rpx rgba(0,0,0,0.25);
}
/* H5: stat-label text-xs mt-1.5 → 22rpx/29rpx, mt-1.5=6px→11rpx */
.hours-label-row {
margin-top: 0;
line-height: 29rpx;
}
.hours-label {
font-size: 22rpx;
color: rgba(255,255,255,0.9);
text-shadow: 0 2rpx 4rpx rgba(0,0,0,0.15);
}
/* --- 红戳徽章 — SVG 实现 --- */
/* H5: position:absolute, top:5px, right:-5px (相对于 .red-stamp 容器)
* 52px→95rpx, rotate(-12deg), opacity:0.8 */
.stamp-badge {
position: absolute;
top: 9rpx;
right: -9rpx;
width: 95rpx;
height: 95rpx;
pointer-events: none;
opacity: 0;
transform: rotate(-12deg) scale(0);
}
/* 盖戳动画 */
@keyframes stampDown {
0% { transform: rotate(-12deg) scale(3); opacity: 0; }
50% { transform: rotate(-12deg) scale(0.9); opacity: 0.6; }
70% { transform: rotate(-12deg) scale(1.05); opacity: 0.75; }
100% { transform: rotate(-12deg) scale(1); opacity: 0.80; }
}
.stamp-animate {
animation: stampDown 0.5s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;
}
/* 右侧奖金激励flex:2 */
/* H5: .pl-3.text-center.flex.flex-col.justify-center → pl-3=12px→22rpx */
.perf-l3-right {
flex: 2;
padding-left: 22rpx;
text-align: center;
display: flex;
flex-direction: column;
justify-content: center;
}
.bonus-wrap {
display: flex;
align-items: baseline;
justify-content: center;
padding-top: 10rpx;
}
/* H5: text-3xl font-bold text-amber-300 → 54rpx/66rpx */
.bonus-amount {
font-size: 54rpx;
font-weight: 700;
color: #fcd34d;
text-shadow:
0 4rpx 7rpx rgba(0, 0, 0, 0.35),
0 0 22rpx rgba(251, 191, 36, 0.5);
}
/* H5: text-base text-amber-300/80 → 30rpx */
.bonus-unit {
font-size: 30rpx;
color: rgba(252, 211, 77, 0.8);
}
/* H5: stat-label text-xs mt-1.5 → 22rpx/29rpx, mt-1.5=6px→11rpx */
.bonus-label-row {
margin-top: -8rpx;
line-height: 29rpx;
}
.bonus-label {
font-size: 22rpx;
color: rgba(255,255,255,0.9);
text-shadow: 0 2rpx 4rpx rgba(0,0,0,0.15);
}
/* --- L4: 预计收入 --- */
/* H5: .flex.items-center.justify-between.pt-2.border-t.border-white/25 → pt-2=8px→15rpx */
.perf-l4 {
display: flex;
align-items: center;
justify-content: space-between;
padding-top: 16rpx;
border-top: 1rpx solid rgba(255,255,255,0.25);
line-height: 29rpx;
}
/* H5: stat-label text-xs → 22rpx/29rpx */
.perf-l4-label {
font-size: 22rpx;
color: rgba(255,255,255,0.9);
text-shadow: 0 2rpx 4rpx rgba(0,0,0,0.15);
white-space: pre;
}
/* H5: .flex.items-center.gap-1.5 → gap-1.5=6px→11rpx */
.perf-l4-right {
display: flex;
align-items: center;
gap: 11rpx;
}
/* H5: stat-value text-lg font-bold → 33rpx/51rpx */
.income-value {
font-size: 33rpx;
font-weight: 700;
color: #ffffff;
text-shadow: 0 2rpx 6rpx rgba(0,0,0,0.25);
}
/* H5: trend-down → color:rgba(255,255,255,0.5), font-size:12px→22rpx */
.income-trend {
font-size: 22rpx;
color: rgba(255,255,255,0.7);
}
.trend-down {
color: rgba(255,255,255,0.5);
}
/* ============================================
* Loading / Empty / Error 状态
* ============================================ */
.state-loading {
padding: 36rpx 29rpx;
}
.loading-placeholder {
background: #ffffff;
border-radius: 22rpx;
padding: 29rpx;
margin-bottom: 22rpx;
}
.ph-line {
height: 22rpx;
background: #f3f3f3;
border-radius: 7rpx;
margin-bottom: 15rpx;
}
.ph-line--title { width: 40%; height: 29rpx; }
.ph-line--body { width: 80%; }
.ph-line--short { width: 55%; margin-bottom: 0; }
.state-empty {
padding: 120rpx 0;
text-align: center;
}
.empty-text {
font-size: 26rpx;
color: #a6a6a6;
}
.state-error {
padding: 120rpx 0;
text-align: center;
}
.error-text {
font-size: 26rpx;
color: #a6a6a6;
display: block;
margin-bottom: 29rpx;
}
.retry-btn {
display: inline-block;
padding: 15rpx 44rpx;
background: #0052d9;
border-radius: 18rpx;
color: #ffffff;
}
.retry-btn-text {
font-size: 26rpx;
color: #ffffff;
}
/* ============================================
* 任务列表区域
* ============================================ */
/* H5: .px-4.py-5 → padding: 36rpx 29rpx */
.task-section {
padding: 36rpx 29rpx;
}
/* --- 标题行 --- */
/* H5: .flex.items-center.justify-between.mb-4 → mb-4=16px→29rpx */
.section-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 29rpx;
line-height: 44rpx; /* text-base 行高容器 */
}
/* H5: text-base font-semibold text-gray-13 → 30rpx/44rpx */
.section-title {
font-size: 28rpx;
font-weight: 600;
color: #242424;
}
/* H5: text-sm text-gray-6 → 26rpx/36rpx */
.section-count {
font-size: 26rpx;
color: #a6a6a6;
}
/* --- 任务分组 --- */
/* H5: .mb-5 → mb-5=20px→36rpx */
.task-group {
margin-bottom: 36rpx;
}
/* H5: .flex.items-center.gap-1.5.mb-2.5 → gap-1.5=6px→11rpx, mb-2.5=10px→18rpx */
.group-label-row {
display: flex;
align-items: center;
gap: 11rpx;
margin-bottom: 18rpx;
}
/* H5: .section-label → font-size:13px→24rpx, font-weight:500, padding:3px 10px→6rpx 18rpx, border-radius:4px→8rpx */
.group-label {
display: inline-flex;
align-items: center;
gap: 7rpx;
font-size: 24rpx;
font-weight: 500;
padding: 6rpx 18rpx;
border-radius: 8rpx;
}
/* H5: text-amber-700 bg-amber-50 */
.group-label--pinned {
color: #b45309;
background: #fffbeb;
/* 确保 📌 Emoji 在 Android 真机上正确渲染 */
font-family: "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji", sans-serif;
}
/* H5: text-gray-9 bg-gray-2 */
.group-label--normal {
color: #5e5e5e;
background: #eeeeee;
}
/* H5: text-gray-6 bg-gray-2 */
.group-label--abandoned {
color: #a6a6a6;
background: #eeeeee;
}
/* H5: text-sm text-gray-6 → 26rpx/36rpx */
.group-count {
font-size: 26rpx;
color: #a6a6a6;
line-height: 36rpx;
}
/* --- 卡片列表 --- */
/* H5: .space-y-3 → gap 12px→22rpx */
.task-card-list {
display: flex;
flex-direction: column;
gap: 22rpx;
}
/* ============================================
* 任务卡片
* H5: .task-card → border-left:4px solid transparent, bg-white rounded-xl p-4 shadow-sm
* border-left:4px→8rpx, rounded-xl=12px→22rpx, p-4=16px→29rpx
* ============================================ */
.task-card {
position: relative;
background: #ffffff;
border-radius: 20rpx;
border-left: 12rpx solid transparent;
box-shadow:0rpx 4rpx 6rpx rgba(0,0,0,0.08);
display: flex;
align-items: flex-start;
justify-content: space-between;
}
/* 卡片边框颜色 — 严格对齐 VI-DESIGN-SYSTEM.md 1.1 节 */
.task-card--high_priority { border-left-color: var(--task-high-priority-border); }
.task-card--priority_recall { border-left-color: var(--task-priority-recall-border); }
.task-card--relationship { border-left-color: var(--task-relationship-border); }
.task-card--callback { border-left-color: var(--task-callback-border); }
/* 置顶卡片微亮边框 — 严格对齐 VI-DESIGN-SYSTEM.md 4.1 节 */
.task-card--pinned {
box-shadow: 0 5rpx 7rpx var(--status-pinned-shadow-light), 0 0 0 8rpx var(--status-pinned-shadow-glow);
}
/* 已放弃卡片 — 严格对齐 VI-DESIGN-SYSTEM.md 4.2 节 */
.task-card--abandoned {
border-left-color: var(--status-abandoned-border) !important;
opacity: var(--status-abandoned-opacity);
}
/* hover 态 */
.task-card--hover {
background: #f9f9f9;
}
/* H5: p-4 → 29rpx */
.card-body {
flex: 1;
padding: 32rpx 4rpx 32rpx 32rpx;
min-width: 0;
}
/* 右侧箭头 — H5: w-5 h-5 text-gray-5 flex-shrink-0 ml-2 mt-1 */
.card-arrow {
flex-shrink: 0;
padding: 0 22rpx 0 0;
display: flex;
align-items: center;
align-self: stretch;
}
/* --- 卡片第一行:标签 + 客户名 + 心形 + 备注 --- */
/* H5: .flex.items-center.gap-2.mb-1.5 → gap-2=8px→15rpx, mb-1.5=6px→11rpx */
.card-row-1 {
display: flex;
align-items: center;
gap: 15rpx;
margin-bottom: 14rpx;
line-height: 29rpx; /* text-xs 行高容器(标签高度基准) */
}
/* --- 任务类型标签 --- */
/* H5: px-2 py-0.5 text-white text-xs font-medium → padding:2px 8px→4rpx 15rpx, 22rpx/29rpx, border-radius:4px→8rpx */
.task-type-tag {
display: inline-flex;
align-items: center;
padding: 8rpx 16rpx;
border-radius: 8rpx;
flex-shrink: 0;
}
.tag-text {
font-size: 22rpx;
font-weight: 500;
color: #ffffff;
line-height: 1;
}
/* 标签渐变色 — 严格对齐 VI-DESIGN-SYSTEM.md 1.1 节 */
.task-type-tag--high_priority {
background: linear-gradient(135deg, var(--task-high-priority-from) 0%, var(--task-high-priority-to) 100%);
}
.task-type-tag--priority_recall {
background: linear-gradient(135deg, var(--task-priority-recall-from) 0%, var(--task-priority-recall-to) 100%);
}
.task-type-tag--relationship {
background: linear-gradient(135deg, var(--task-relationship-from) 0%, var(--task-relationship-to) 100%);
}
.task-type-tag--callback {
background: linear-gradient(135deg, var(--task-callback-from) 0%, var(--task-callback-to) 100%);
}
/* 已放弃标签灰化 — 严格对齐 VI-DESIGN-SYSTEM.md 4.2 节 */
.task-type-tag--abandoned {
background: var(--status-abandoned-border) !important;
}
/* H5: text-base font-semibold text-gray-13 → 30rpx/44rpx */
.customer-name {
font-size: 30rpx;
font-weight: 600;
color: #242424;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* 已放弃客户名灰色 — 严格对齐 VI-DESIGN-SYSTEM.md 4.2 节 */
.customer-name--abandoned {
color: var(--status-abandoned-text);
}
/* H5: note-indicator → font-size:12px→22rpx, margin-left:2px→4rpx */
.note-indicator {
font-size: 22rpx;
flex-shrink: 0;
}
/* --- 卡片第二行:到店/余额 --- */
/* H5: text-sm text-gray-7 leading-relaxed → 26rpx/36rpxleading-relaxed≈1.625,但按字典取 36rpx */
.card-row-2 {
margin-bottom: 4rpx;
line-height: 36rpx;
}
.visit-text {
font-size: 26rpx;
color: #8b8b8b;
}
/* 已放弃到店文字 — H5: .task-card.abandoned .task-desc { color: #c5c5c5 } */
.visit-text--abandoned {
color: #c5c5c5;
}
/* --- 卡片第三行AI 建议 --- */
/* H5: text-sm text-gray-6 leading-relaxed → 26rpx/36rpx */
.card-row-3 {
display: flex;
align-items: baseline;
gap: 0;
line-height: 36rpx;
}
/* AI 图标 — 全局样式见 app.wxss .ai-inline-icon / .ai-title-badge */
/* task-list 使用默认 indigo 配色,无需额外覆盖 */
.ai-suggestion-text {
font-size: 26rpx;
color: #a6a6a6;
flex: 1;
line-height: 36rpx;
}
.ai-suggestion-text {
font-size: 26rpx;
color: #a6a6a6;
flex: 1;
}
/* --- 放弃原因行 --- */
.card-row-abandon {
margin-top: 7rpx;
line-height: 36rpx;
}
.abandon-reason {
font-size: 26rpx;
color: #a6a6a6;
}
/* --- 加载更多 --- */
.load-more {
padding: 36rpx 0;
text-align: center;
}
.load-more-text {
font-size: 24rpx;
color: #c5c5c5;
}
/* ============================================
* 长按上下文菜单
* H5: .context-overlay / .context-menu / .ctx-item
* ============================================ */
.ctx-overlay {
position: fixed;
top: 0; left: 0; right: 0; bottom: 0;
background: rgba(0, 0, 0, 0.35);
z-index: 100;
opacity: 0;
pointer-events: none;
transition: opacity 0.2s ease;
}
.ctx-overlay--active {
opacity: 1;
pointer-events: all;
}
/* H5: .context-menu → border-radius:14px→25rpx, min-width:192px→350rpx, padding:6px 0→11rpx 0 */
.ctx-menu {
position: fixed;
z-index: 101;
background: #ffffff;
border-radius: 25rpx;
box-shadow: 0 22rpx 73rpx rgba(0, 0, 0, 0.18);
min-width: 350rpx;
padding: 11rpx 0;
opacity: 0;
transform: scale(0.88);
pointer-events: none;
transition: opacity 0.15s ease, transform 0.15s ease;
transform-origin: top left;
}
.ctx-menu--active {
opacity: 1;
transform: scale(1);
pointer-events: all;
}
/* H5: .ctx-item → gap:10px→18rpx, padding:13px 18px→24rpx 33rpx, font-size:14px→26rpx */
.ctx-item {
display: flex;
align-items: center;
gap: 18rpx;
padding: 24rpx 33rpx;
line-height: 36rpx;
}
.ctx-item + .ctx-item {
border-top: 1rpx solid #f3f3f3;
}
.ctx-item--hover {
background: #f3f3f3;
}
.ctx-emoji {
font-size: 30rpx;
flex-shrink: 0;
/* 确保 Emoji 在 Android 真机上正确渲染 */
font-family: "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji", sans-serif;
}
.ctx-text {
font-size: 26rpx;
color: #393939;
}
/* ============================================
* 放弃弹窗
* H5: .modal-overlay / .modal-card
* ============================================ */
.abandon-overlay {
position: fixed;
top: 0; left: 0; right: 0; bottom: 0;
background: rgba(0, 0, 0, 0.5);
z-index: 200;
display: flex;
align-items: flex-start;
justify-content: center;
padding-top: 30vh;
transition: align-items 0.3s ease, padding-top 0.3s ease;
}
/* 键盘弹出时,弹窗移到顶部 */
.abandon-overlay--keyboard-open {
align-items: flex-start;
padding-top: 0;
}
/* H5: .modal-card → border-radius:16px→29rpx, width:88%, padding:24px 20px 20px→44rpx 36rpx 36rpx */
.abandon-modal {
background: #ffffff;
border-radius: 29rpx;
width: 88%;
max-width: 655rpx;
padding: 44rpx 36rpx 36rpx;
box-shadow: 0 36rpx 109rpx rgba(0, 0, 0, 0.2);
max-height: 80vh;
overflow-y: auto;
transition: border-radius 0.3s ease;
}
/* 键盘弹出时,改为全圆角 */
.abandon-overlay--keyboard-open .abandon-modal {
border-radius: 0;
max-height: none;
}
/* 弹窗标题行 */
.abandon-header {
display: flex;
align-items: center;
margin-bottom: 7rpx;
line-height: 44rpx;
}
.abandon-header-left {
display: flex;
align-items: center;
gap: 11rpx;
}
.abandon-header-emoji {
font-size: 30rpx;
}
/* H5: text-base font-semibold text-gray-13 → 30rpx/44rpx */
.abandon-header-title {
font-size: 30rpx;
font-weight: 600;
color: #242424;
}
.abandon-header-name {
color: #e34d59;
}
/* H5: text-xs text-gray-6 mb-3 → 22rpx/29rpx, mb-3=12px→22rpx */
.abandon-desc-row {
margin-bottom: 22rpx;
line-height: 29rpx;
}
.abandon-desc {
font-size: 22rpx;
color: #a6a6a6;
}
/* H5: textarea → border:1.5px→3rpx solid #e7e7e7, border-radius:10px→18rpx, padding:12px 14px→22rpx 25rpx, font-size:14px→26rpx */
.abandon-textarea {
width: 100%;
min-height: 180rpx;
border: 3rpx solid #e7e7e7;
border-radius: 18rpx;
padding: 22rpx 25rpx;
font-size: 26rpx;
line-height: 1.6;
color: #2c2c2c;
box-sizing: border-box;
transition: border-color 0.2s;
}
.abandon-textarea:focus {
border-color: #0052d9;
background: #fff;
}
.abandon-textarea--error {
border-color: #e34d59;
}
/* H5: .modal-error → color:#e34d59, font-size:12px→22rpx, margin-top:6px→11rpx */
.abandon-error {
color: #e34d59;
font-size: 22rpx;
margin-top: 11rpx;
}
/* 弹窗按钮行 */
.abandon-actions {
display: flex;
gap: 18rpx;
margin-top: 25rpx;
}
/* 键盘弹出时固定在键盘上方 */
.abandon-actions--float {
position: fixed;
left: 0;
right: 0;
padding: 12rpx 36rpx 16rpx;
background: #fff;
box-shadow: 0 -2rpx 16rpx rgba(0, 0, 0, 0.06);
z-index: 201;
}
.abandon-btn {
flex: 1;
padding: 22rpx 0;
border-radius: 18rpx;
text-align: center;
font-size: 27rpx;
font-weight: 500;
}
.abandon-btn--cancel {
background: #f3f3f3;
color: #5e5e5e;
}
.abandon-btn--cancel-hover {
background: #e7e7e7;
}
.abandon-btn--confirm {
background: #e34d59;
color: #ffffff;
}
.abandon-btn--confirm-hover {
background: #c9363f;
}
/* 逾期徽章 — 姓名行最右,红色半透明背景 */
.overdue-badge {
margin-left: auto;
flex-shrink: 0;
font-size: 22rpx;
font-weight: 600;
color: #e34d59;
background: rgba(227, 77, 89, 0.12);
border: 1rpx solid rgba(227, 77, 89, 0.25);
border-radius: 8rpx;
padding: 4rpx 14rpx;
line-height: 1.4;
}
/* 截止日期行 — DISPLAY-STANDARDS §7 */
.card-row-deadline {
display: flex;
align-items: center;
margin-top: 4rpx;
margin-bottom: 2rpx;
}
.deadline-text {
font-size: 22rpx;
line-height: 29rpx;
font-weight: 500;
}
.deadline-text--muted { color: #a6a6a6; }
.deadline-text--normal { color: #5e5e5e; }
.deadline-text--warning { color: #ed7b2f; }
.deadline-text--danger { color: #e34d59; font-weight: 600; }