Files
training/miniprogram/src/app.scss
T

433 lines
17 KiB
SCSS
Raw Normal View History

/* 像素字体(web 端 BubbledotICG-FinePos 同款,CC BY 4.0)——资源内联为 base64 */
@font-face {
font-family: 'BubbledotICG';
src: url('./assets/fonts/BubbledotICG-FinePos.ttf') format('truetype');
font-display: swap;
}
/* page 是最顶层根节点,所有页面共用 —— 未来感背景直接铺这里,
不依赖任何 App 层 DOMTaro 下 App.render 不会渲染成包裹页面的容器)。 */
/* page = 微信真正的根节点,背景直接铺这里(Taro 下 App.render 不渲染成包裹容器的 DOM)。
星点:平铺小格(各自尺寸 + repeat);光晕与底:满屏(100%);逐层 background-size/repeat 匹配。 */
/* Soft UI 浅色柔彩底色(无动画、无 canvas,真机流畅不遮挡) */
page {
background: #f4f6ff;
color: #3a4672;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", sans-serif;
background-image:
radial-gradient(64% 42% at 12% 2%, rgba(229, 167, 224, 0.26), transparent 60%),
radial-gradient(56% 40% at 94% 4%, rgba(158, 225, 236, 0.30), transparent 60%),
radial-gradient(50% 42% at 84% 100%, rgba(151, 225, 212, 0.22), transparent 60%),
linear-gradient(165deg, #edf2ff 0%, #f6eefc 40%, #ecf7f6 72%, #eaf4ff 100%);
background-attachment: fixed;
}
/* 隐藏滚动条:所有页面内容可滚动,但不显示滚动条(含内部横向滚动容器) */
page::-webkit-scrollbar,
::-webkit-scrollbar {
display: none;
width: 0;
height: 0;
-webkit-appearance: none;
}
page { -ms-overflow-style: none; scrollbar-width: none; }
.ev-tabs, .phase-filters, .quiz-body, .sv-opts, .ot-opts { scrollbar-width: none; }
/* 页面切换淡入:挂到各页面根容器,切换时淡入,缓解硬切/一瞬空白 */
.page-in {
animation: pageIn 0.22s ease both;
}
@keyframes pageIn {
from { opacity: 0; }
to { opacity: 1; }
}
/* 内容层:底部留白避开固定 tabBar(含首页上凸按钮)。
用 @supports 把「基础值」与「安全区增强」分成两条独立规则:
压缩器无法合并去重,即使 env() 在个别基础库不可用,180rpx 基础值仍生效,内容绝不被遮蔽 */
.app {
position: relative;
z-index: 1;
min-height: 100vh;
padding-bottom: 180rpx;
}
/* 测评/政策/流程等:标题/进度头部保持在顶部,仅题目/表单卡片垂直居中。整页不滚动 */
.quiz-center {
position: relative;
z-index: 2;
box-sizing: border-box;
display: flex;
flex-direction: column;
height: 100vh;
overflow: hidden; /* 内容超出即裁剪,杜绝页面滚动 */
}
.quiz-body {
flex: 1;
display: flex;
flex-direction: column;
justify-content: center;
min-height: 0;
}
@supports (padding-bottom: env(safe-area-inset-bottom)) {
.app {
padding-bottom: calc(180rpx + env(safe-area-inset-bottom));
}
}
/* 通用卡片(Soft UI:柔白面 + 软阴影 + 大圆角) */
.card {
background: rgba(255,255,255,0.55); backdrop-filter: blur(20px) saturate(160%); -webkit-backdrop-filter: blur(20px) saturate(160%);
border: 1px solid rgba(99, 132, 255, 0.12);
border-radius: 20px;
padding: 24px;
margin-bottom: 16px;
box-shadow: 0 10rpx 28rpx rgba(59, 79, 125, 0.09);
backdrop-filter: blur(8px);
}
.card-title {
font-size: 30px;
font-weight: 700;
color: #23315c;
}
.card-desc {
font-size: 26px;
color: #6a76a8;
line-height: 1.6;
margin-top: 8px;
}
.btn-main {
background: linear-gradient(135deg, #6b8bff, #8f7bff);
color: #ffffff;
border-radius: 999px;
font-weight: 600;
font-size: 28px;
padding: 0 40px;
line-height: 2.6;
box-shadow: 0 8rpx 24rpx rgba(98, 132, 255, 0.28);
}
.btn-main::after {
border: none;
}
.btn-ghost {
background: rgba(255, 255, 255, 0.55);
backdrop-filter: blur(20px) saturate(160%);
-webkit-backdrop-filter: blur(20px) saturate(160%);
color: #5a6aa3;
border: 1px solid rgba(99, 132, 255, 0.22);
border-radius: 999px;
font-weight: 600;
font-size: 28px;
padding: 0 40px;
line-height: 2.6;
}
.btn-ghost::after {
border: none;
}
/* 禁用态:微信原生 button[disabled] 浅底浅字会盖掉单类样式(特异度更高),这里显式压回可读配色 */
.btn-main[disabled], .btn-main.button-disabled,
.btn-ghost[disabled], .btn-ghost.button-disabled {
background: rgba(120, 140, 220, 0.14);
color: #8b97c4;
border: 1px solid rgba(99, 132, 255, 0.12);
box-shadow: none;
}
.section-head {
font-size: 32px;
font-weight: 700;
color: #23315c;
margin: 32px 0 16px;
}
.muted {
color: #9aa4c6;
font-size: 24px;
}
/* ============================================================
单题一屏 · 共享答题组件(OPC 测评 / 政策测评共用)
============================================================ */
.ot-quiz-head {
padding-top: 8px;
}
.ot-quiz-top {
display: flex;
align-items: baseline;
justify-content: space-between;
}
.ot-quiz-left {
display: flex;
align-items: center;
gap: 10px;
min-width: 0;
}
.ot-back {
flex-shrink: 0;
display: inline-flex;
align-items: center;
font-size: 22px;
color: #6284ff;
background: rgba(99, 132, 255, 0.10);
border: 1px solid rgba(99, 132, 255, 0.24);
border-radius: 999px;
padding: 4px 14px;
}
.ot-quiz-title {
font-size: 30px;
font-weight: 700;
color: #23315c;
}
.ot-quiz-tag {
margin-left: 14px;
font-size: 20px;
font-weight: 600;
color: #fff;
background: linear-gradient(135deg, #6b8bff, #8f7bff);
border-radius: 999px;
padding: 4px 16px;
vertical-align: middle;
}
.ot-progress-text {
font-size: 24px;
color: #9aa4c6;
}
.ot-progress {
height: 10px;
border-radius: 999px;
background: rgba(99, 132, 255, 0.14);
margin: 20px 0;
overflow: hidden;
}
.ot-progress-fill {
height: 100%;
border-radius: 999px;
background: linear-gradient(90deg, #6b8bff, #8f7bff);
transition: width 0.3s ease;
}
.ot-part {
display: block;
font-size: 24px;
color: #6284ff;
margin-bottom: 8px;
}
/* 单题卡片下方的操作提示 */
.ot-hint {
display: block;
margin-top: 16px;
font-size: 22px;
color: #9aa4c6;
text-align: center;
}
.ot-qcard {
background: rgba(255,255,255,0.55); backdrop-filter: blur(20px) saturate(160%); -webkit-backdrop-filter: blur(20px) saturate(160%);
border: 1px solid rgba(99, 132, 255, 0.12);
border-radius: 16px;
padding: 28px 30px;
margin-bottom: 20px;
box-shadow: 0 8rpx 24rpx rgba(59, 79, 125, 0.08);
}
.ot-qcard.answered {
border-color: rgba(98, 132, 255, 0.5);
}
/* 一题一屏:不再包大卡片,题目直接融入页面背景(选项保留玻璃药丸),题目/选项更大 */
.ot-qcard.one {
background: transparent;
backdrop-filter: none;
-webkit-backdrop-filter: none;
border: none;
box-shadow: none;
border-radius: 0;
margin-top: 0;
padding: 12px 8px 0;
}
.ot-qcard.one .ot-qtext {
font-size: 36px;
line-height: 1.5;
margin-bottom: 36px;
}
.ot-qcard.one .ot-opt {
padding: 26px 26px;
}
.ot-qnum {
display: flex;
justify-content: space-between;
align-items: center;
font-size: 22px;
color: #a3abc9;
margin-bottom: 12px;
}
.ot-check {
color: #6284ff;
font-size: 26px;
}
.ot-qtext {
display: block;
font-size: 30px;
font-weight: 600;
color: #23315c;
line-height: 1.5;
margin-bottom: 20px;
}
.ot-opts {
display: flex;
flex-direction: column;
gap: 12px;
}
.ot-opt {
display: flex;
align-items: flex-start;
gap: 12px;
background: #f6f8ff;
border: 1px solid rgba(99, 132, 255, 0.14);
border-radius: 14px;
padding: 20px 22px;
}
/* 选中态全站统一:蓝紫渐变 + 白字 */
.ot-opt.sel {
border-color: transparent;
background: linear-gradient(135deg, #6b8bff, #8f7bff);
box-shadow: 0 8rpx 24rpx rgba(98, 132, 255, 0.28);
}
.ot-opt.sel .opt-text {
color: #ffffff;
}
.opt-key {
font-family: 'BubbledotICG', monospace;
color: #8a94c0;
font-size: 26px;
flex-shrink: 0;
}
.ot-opt.sel .opt-key {
color: #ffffff;
}
.opt-text {
font-size: 27px;
color: #4a5580;
line-height: 1.55;
flex: 1;
}
/* 底部导航(上一题 / 进度计数) */
.ot-nav-one {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
margin: 28px 0 8px;
}
.ot-nav-btn {
flex-shrink: 0;
line-height: 2.4;
padding: 0 28px;
}
.ot-nav-info {
font-family: 'BubbledotICG', monospace;
font-size: 26px;
color: #8e8e8e;
letter-spacing: 2px;
}
/* 单选无右侧按钮时,占位保持计数居中 */
.ot-nav-empty {
width: 110px;
flex-shrink: 0;
}
.ot-loading {
display: block;
text-align: center;
font-size: 26px;
color: #ffd28a;
margin-top: 24px;
}
/* 通用线性图标(CSS mask SVG,仿 lucide;禁用 emoji 图标) */
.ic {
display: inline-block; width: 36rpx; height: 36rpx; background-color: currentColor;
-webkit-mask-repeat: no-repeat; -webkit-mask-position: center; -webkit-mask-size: contain;
mask-repeat: no-repeat; mask-position: center; mask-size: contain;
}
.ic-play { -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23fff'%3E%3Cpath d='M5 3l14 9-14 9V3z'/%3E%3C/svg%3E"); mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23fff'%3E%3Cpath d='M5 3l14 9-14 9V3z'/%3E%3C/svg%3E"); }
.ic-heart { -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='2'%3E%3Cpath d='M20.8 4.6a5.5 5.5 0 0 0-7.8 0L12 5.6l-1-1a5.5 5.5 0 0 0-7.8 7.8l1 1L12 21l7.8-7.6 1-1a5.5 5.5 0 0 0 0-7.8z'/%3E%3C/svg%3E"); mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='2'%3E%3Cpath d='M20.8 4.6a5.5 5.5 0 0 0-7.8 0L12 5.6l-1-1a5.5 5.5 0 0 0-7.8 7.8l1 1L12 21l7.8-7.6 1-1a5.5 5.5 0 0 0 0-7.8z'/%3E%3C/svg%3E"); }
.ic-check { -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='2.5'%3E%3Cpath d='M20 6L9 17l-5-5'/%3E%3C/svg%3E"); mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='2.5'%3E%3Cpath d='M20 6L9 17l-5-5'/%3E%3C/svg%3E"); }
.ic-lock { -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='2'%3E%3Crect x='4' y='11' width='16' height='9' rx='2'/%3E%3Cpath d='M8 11V8a4 4 0 0 1 8 0v3'/%3E%3C/svg%3E"); mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='2'%3E%3Crect x='4' y='11' width='16' height='9' rx='2'/%3E%3Cpath d='M8 11V8a4 4 0 0 1 8 0v3'/%3E%3C/svg%3E"); }
.ic-arrow-left { -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='2.5'%3E%3Cpath d='M15 18l-6-6 6-6'/%3E%3C/svg%3E"); mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='2.5'%3E%3Cpath d='M15 18l-6-6 6-6'/%3E%3C/svg%3E"); }
.ic-thumb { -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='2'%3E%3Cpath d='M7 10v12M15 5.9s0-1-.5-2a1.5 1.5 0 0 0-2.8 1C12.4 6.6 11 10 11 10h6a2 2 0 0 1 2 2.5l-1.4 5.6a2 2 0 0 1-2 1.5H7M15 6l2-1.5a1.5 1.5 0 0 1 2.7 1.3L18 13M7 22H4a2 2 0 0 1-2-2V12a2 2 0 0 1 2-2h3'/%3E%3C/svg%3E"); mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='2'%3E%3Cpath d='M7 10v12M15 5.9s0-1-.5-2a1.5 1.5 0 0 0-2.8 1C12.4 6.6 11 10 11 10h6a2 2 0 0 1 2 2.5l-1.4 5.6a2 2 0 0 1-2 1.5H7M15 6l2-1.5a1.5 1.5 0 0 1 2.7 1.3L18 13M7 22H4a2 2 0 0 1-2-2V12a2 2 0 0 1 2-2h3'/%3E%3C/svg%3E"); }
.ic-share { -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='2'%3E%3Cpath d='M4 12v7a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-7M16 6l-4-4-4 4M12 2v13'/%3E%3C/svg%3E"); mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='2'%3E%3Cpath d='M4 12v7a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-7M16 6l-4-4-4 4M12 2v13'/%3E%3C/svg%3E"); }
.ic-cmt { -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='2'%3E%3Cpath d='M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z'/%3E%3C/svg%3E"); mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='2'%3E%3Cpath d='M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z'/%3E%3C/svg%3E"); }
/* ============================================================
Soft UI 全局降级:表单控件/选项统一柔白面 + 深蓝灰文本(覆盖各页暗色控件)
============================================================ */
.input, .picker, .ot-opt, .sv-opt, .sv-textarea, .sv-lk, .ed-form,
.ca-textarea, .ca-code .input, .pt-picker, .pt-textarea, .pa-textarea, .pa-picker, .step, .summary, .cell {
background: rgba(255, 255, 255, 0.55) !important;
backdrop-filter: blur(20px) saturate(160%);
-webkit-backdrop-filter: blur(20px) saturate(160%);
border-color: rgba(99, 132, 255, 0.16) !important;
color: #3a4672 !important;
}
/* 发布者徽章图标(官方/园区/OPC) */
.ic-shield { -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='2.5'%3E%3Cpath d='M12 3l8 3v5c0 5-3.5 8-8 10-4.5-2-8-5-8-10V6z'/%3E%3Cpath d='M9 12l2 2 4-4'/%3E%3C/svg%3E"); mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='2.5'%3E%3Cpath d='M12 3l8 3v5c0 5-3.5 8-8 10-4.5-2-8-5-8-10V6z'/%3E%3Cpath d='M9 12l2 2 4-4'/%3E%3C/svg%3E"); }
.ic-landmark { -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='2.5'%3E%3Cpath d='M3 10l9-6 9 6'/%3E%3Cpath d='M5 10v9M9.5 10v9M14.5 10v9M19 10v9M3 20h18'/%3E%3C/svg%3E"); mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='2.5'%3E%3Cpath d='M3 10l9-6 9 6'/%3E%3Cpath d='M5 10v9M9.5 10v9M14.5 10v9M19 10v9M3 20h18'/%3E%3C/svg%3E"); }
.ic-users { -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='2.5'%3E%3Ccircle cx='9' cy='8' r='3.5'/%3E%3Cpath d='M2.5 20a6.5 6.5 0 0 1 13 0'/%3E%3Cpath d='M15.5 5a3.5 3.5 0 0 1 0 6.6'/%3E%3Cpath d='M17.5 14.4a6.5 6.5 0 0 1 4 5.6'/%3E%3C/svg%3E"); mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='2.5'%3E%3Ccircle cx='9' cy='8' r='3.5'/%3E%3Cpath d='M2.5 20a6.5 6.5 0 0 1 13 0'/%3E%3Cpath d='M15.5 5a3.5 3.5 0 0 1 0 6.6'/%3E%3Cpath d='M17.5 14.4a6.5 6.5 0 0 1 4 5.6'/%3E%3C/svg%3E"); }
/* ============ 统一固定标题区(像素字 kicker + 彩虹渐变标题 + 像素字注脚) ============ */
.page-navbar {
position: fixed; top: 0; left: 0; right: 0; z-index: 100;
padding: 0 28rpx; /* 标题区上下零冗余:高度 = 安全区 + 三行文字,占位实测自然贴合 */
background: rgba(247, 249, 255, 0.88);
backdrop-filter: blur(20px) saturate(160%);
-webkit-backdrop-filter: blur(20px) saturate(160%);
}
.page-navbar-col { display: flex; flex-direction: column; }
.page-navbar-no { font-family: 'BubbledotICG', monospace; color: #a3abc9; font-size: 26rpx; letter-spacing: 2rpx; line-height: 1.15; }
/* 类别标签行:返回按钮在类别标签左侧,与标签文字同大小同颜色(沉浸式导航下唯一返回入口) */
.page-navbar-norow { display: flex; align-items: center; gap: 10rpx; line-height: 1.15; }
.page-navbar-back-hit { display: flex; align-items: center; padding: 8rpx; margin: -8rpx 0 -8rpx -8rpx; } /* 扩大点击热区,视觉不变 */
.page-navbar-back-ic { width: 26rpx; height: 26rpx; background: #a3abc9; }
.page-navbar-back-hit.pressed { opacity: 0.65; }
.page-navbar-titlerow { display: flex; flex-direction: column; align-items: flex-start; gap: 6rpx; line-height: 1.15; margin-top: 4rpx; }
.page-navbar-title {
font-size: 40rpx; font-weight: 800; letter-spacing: -0.5rpx; line-height: 1.15;
background: linear-gradient(120deg, #8fc3ff 0%, #a8a0ff 45%, #e0a0ff 80%, #7fe0ff 100%);
-webkit-background-clip: text; background-clip: text; color: transparent;
}
.page-navbar-sub { font-size: 24rpx; color: #5a6aa3; line-height: 1.3; }
.page-navbar-en { font-family: 'BubbledotICG', monospace; color: #5b5b5b; font-size: 24rpx; letter-spacing: 2rpx; line-height: 1.15; padding-bottom: 12rpx; }