Files
training/miniprogram/src/app.scss
T

442 lines
17 KiB
SCSS
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.
/* 像素字体(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-titlerow { display: flex; align-items: center; gap: 16rpx; line-height: 1.15; }
/* 标题区返回按钮:玻璃圆形 + 线性箭头(沉浸式导航下唯一返回入口) */
.page-navbar-back {
width: 56rpx; height: 56rpx; border-radius: 50%;
display: flex; align-items: center; justify-content: center;
background: rgba(255, 255, 255, 0.55);
backdrop-filter: blur(20rpx) saturate(160%);
-webkit-backdrop-filter: blur(20rpx) saturate(160%);
border: 1px solid rgba(99, 132, 255, 0.22);
color: #5a6aa3;
box-shadow: 0 4rpx 14rpx rgba(59, 79, 125, 0.10);
flex-shrink: 0;
}
.page-navbar-back .ic { width: 30rpx; height: 30rpx; }
.page-navbar-back.pressed { opacity: 0.65; }
.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; }
.page-navbar-en { font-family: 'BubbledotICG', monospace; color: #5b5b5b; font-size: 24rpx; letter-spacing: 2rpx; line-height: 1.15; padding-bottom: 12rpx; }