/* 任务列表页样式 — 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/36rpx(leading-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; }