- 连接认证成功后自动依次测量心率→血氧→血压→体温→压力 - 列表式进度UI展示每项指标状态(等待/测量中/完成/跳过) - 总进度条百分比实时更新 - 测量完成后保存结果并显示'查看结果并返回'按钮 - 支持取消自动测量,已测得的数据不丢失 - 修复仪表盘中心区域缺少背景色导致数值与底色混淆不可见
620 lines
11 KiB
Plaintext
620 lines
11 KiB
Plaintext
/**
|
|
* Veepoo M2 原生页面样式
|
|
* 设计原型: docs/design/veepoo-measure-prototype.html
|
|
* 复刻小程序 design token
|
|
*/
|
|
|
|
page {
|
|
--pri: #C4623A;
|
|
--pri-l: #F0DDD4;
|
|
--bg: #F5F0EB;
|
|
--card: #FFFFFF;
|
|
--tx: #2D2A26;
|
|
--tx2: #5A554F;
|
|
--tx3: #78716C;
|
|
--bd: #E8E2DC;
|
|
--acc: #5B7A5E;
|
|
--acc-l: #E8F0E8;
|
|
--dan: #B54A4A;
|
|
--dan-l: #FDEAEA;
|
|
background: var(--bg);
|
|
min-height: 100vh;
|
|
}
|
|
|
|
/* ═══════════════════════════════════════
|
|
连接页面(未连接/连接中/错误)
|
|
═══════════════════════════════════════ */
|
|
.connect-screen {
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
justify-content: center;
|
|
min-height: 100vh;
|
|
padding: 0 40px;
|
|
}
|
|
|
|
.connect-anim {
|
|
position: relative;
|
|
width: 120px;
|
|
height: 120px;
|
|
margin-bottom: 28px;
|
|
}
|
|
|
|
.connect-ring {
|
|
position: absolute;
|
|
inset: 0;
|
|
border-radius: 50%;
|
|
border: 3px solid var(--pri);
|
|
animation: pulse-ring 2s ease-out infinite;
|
|
}
|
|
|
|
.connect-ring--active {
|
|
border-color: var(--pri);
|
|
animation: pulse-ring 1.5s ease-out infinite;
|
|
}
|
|
|
|
.connect-center {
|
|
position: absolute;
|
|
inset: 20px;
|
|
border-radius: 50%;
|
|
background: var(--pri);
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
}
|
|
|
|
.connect-bt {
|
|
color: #fff;
|
|
font-size: 20px;
|
|
font-weight: 700;
|
|
}
|
|
|
|
.connect-title {
|
|
font-family: Georgia, 'Times New Roman', serif;
|
|
font-size: 22px;
|
|
font-weight: 700;
|
|
color: var(--tx);
|
|
margin-bottom: 8px;
|
|
line-height: 1.3;
|
|
}
|
|
|
|
.connect-hint {
|
|
font-size: 14px;
|
|
color: var(--tx3);
|
|
margin-bottom: 32px;
|
|
text-align: center;
|
|
}
|
|
|
|
.connect-error {
|
|
margin-bottom: 16px;
|
|
text-align: center;
|
|
}
|
|
|
|
.connect-error-text {
|
|
font-size: 14px;
|
|
color: var(--dan);
|
|
}
|
|
|
|
.connect-btn-wrap {
|
|
width: 200px;
|
|
}
|
|
|
|
.connect-back {
|
|
margin-top: 16px;
|
|
}
|
|
|
|
@keyframes pulse-ring {
|
|
0% { transform: scale(1); opacity: 1; }
|
|
100% { transform: scale(1.4); opacity: 0; }
|
|
}
|
|
|
|
/* ═══════════════════════════════════════
|
|
测量页面(就绪态)
|
|
═══════════════════════════════════════ */
|
|
|
|
/* ═══ 自动测量进度 ═══ */
|
|
.auto-measure {
|
|
padding: 24px 20px 40px;
|
|
}
|
|
|
|
.auto-measure__header {
|
|
text-align: center;
|
|
margin-bottom: 28px;
|
|
}
|
|
|
|
.auto-measure__title {
|
|
display: block;
|
|
font-family: Georgia, 'Times New Roman', serif;
|
|
font-size: 24px;
|
|
font-weight: 700;
|
|
color: var(--tx);
|
|
margin-bottom: 8px;
|
|
}
|
|
|
|
.auto-measure__subtitle {
|
|
display: block;
|
|
font-size: 14px;
|
|
color: var(--tx3);
|
|
}
|
|
|
|
.auto-measure__list {
|
|
background: var(--card);
|
|
border-radius: 16px;
|
|
box-shadow: 0 2px 12px rgba(45,42,38,0.06);
|
|
overflow: hidden;
|
|
}
|
|
|
|
.auto-item {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
padding: 16px 20px;
|
|
border-bottom: 1px solid var(--bd);
|
|
transition: background 200ms ease;
|
|
}
|
|
|
|
.auto-item:last-child {
|
|
border-bottom: none;
|
|
}
|
|
|
|
.auto-item--active {
|
|
background: rgba(196,98,58,0.04);
|
|
}
|
|
|
|
.auto-item--done {
|
|
background: rgba(91,122,94,0.04);
|
|
}
|
|
|
|
.auto-item--error {
|
|
opacity: 0.6;
|
|
}
|
|
|
|
.auto-item__left {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 14px;
|
|
}
|
|
|
|
.auto-item__icon-wrap {
|
|
width: 40px;
|
|
height: 40px;
|
|
border-radius: 12px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
}
|
|
|
|
.auto-item--done .auto-item__icon-wrap {
|
|
background: var(--acc) !important;
|
|
}
|
|
|
|
.auto-item--error .auto-item__icon-wrap {
|
|
background: var(--tx3) !important;
|
|
}
|
|
|
|
.auto-item__icon {
|
|
font-size: 18px;
|
|
color: #fff;
|
|
font-weight: 700;
|
|
}
|
|
|
|
.auto-item__label {
|
|
font-size: 16px;
|
|
font-weight: 600;
|
|
color: var(--tx);
|
|
}
|
|
|
|
.auto-item__right {
|
|
display: flex;
|
|
align-items: baseline;
|
|
gap: 4px;
|
|
}
|
|
|
|
.auto-item__value {
|
|
font-family: Georgia, 'Times New Roman', serif;
|
|
font-size: 22px;
|
|
font-weight: 700;
|
|
}
|
|
|
|
.auto-item__unit {
|
|
font-size: 13px;
|
|
color: var(--tx3);
|
|
}
|
|
|
|
.auto-item__status {
|
|
font-size: 14px;
|
|
color: var(--tx3);
|
|
}
|
|
|
|
.auto-item__status--active {
|
|
color: var(--pri);
|
|
font-weight: 600;
|
|
}
|
|
|
|
.auto-item__status--error {
|
|
color: var(--tx3);
|
|
}
|
|
|
|
/* ── 自动测量进度条 ── */
|
|
.auto-progress {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 12px;
|
|
margin-top: 24px;
|
|
padding: 0 4px;
|
|
}
|
|
|
|
.auto-progress__bar {
|
|
flex: 1;
|
|
height: 6px;
|
|
background: var(--bd);
|
|
border-radius: 3px;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.auto-progress__fill {
|
|
height: 100%;
|
|
background: var(--pri);
|
|
border-radius: 3px;
|
|
transition: width 0.5s ease-out;
|
|
}
|
|
|
|
.auto-progress__text {
|
|
font-size: 14px;
|
|
font-weight: 600;
|
|
color: var(--pri);
|
|
min-width: 36px;
|
|
text-align: right;
|
|
}
|
|
.measure-page {
|
|
min-height: 100vh;
|
|
padding-bottom: 40px;
|
|
}
|
|
|
|
/* ── 设备状态栏 ── */
|
|
.device-bar {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
padding: 10px 20px;
|
|
background: var(--card);
|
|
border-bottom: 1px solid var(--bd);
|
|
}
|
|
|
|
.device-bar__left {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 8px;
|
|
}
|
|
|
|
.device-bar__dot {
|
|
width: 8px;
|
|
height: 8px;
|
|
border-radius: 50%;
|
|
background: var(--acc);
|
|
}
|
|
|
|
.device-bar__name {
|
|
font-size: 16px;
|
|
font-weight: 600;
|
|
color: var(--tx);
|
|
}
|
|
|
|
.device-bar__battery {
|
|
font-size: 13px;
|
|
color: var(--tx3);
|
|
margin-left: 4px;
|
|
}
|
|
|
|
.device-bar__disconnect {
|
|
font-size: 13px;
|
|
color: var(--tx3);
|
|
padding: 6px 12px;
|
|
background: transparent;
|
|
border: 1px solid var(--bd);
|
|
border-radius: 999px;
|
|
}
|
|
|
|
/* ── 指标选择器(药丸式) ── */
|
|
.selector {
|
|
display: flex;
|
|
white-space: nowrap;
|
|
padding: 16px 20px;
|
|
gap: 8px;
|
|
}
|
|
|
|
.selector__pill {
|
|
flex-shrink: 0;
|
|
display: inline-flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
gap: 4px;
|
|
padding: 10px 14px;
|
|
border-radius: 16px;
|
|
position: relative;
|
|
min-width: 64px;
|
|
transition: all 200ms ease;
|
|
}
|
|
|
|
.selector__pill--active {
|
|
background: var(--card);
|
|
box-shadow: 0 2px 12px rgba(45,42,38,0.10);
|
|
}
|
|
|
|
.selector__pill--done::after {
|
|
content: '✓';
|
|
position: absolute;
|
|
top: 4px;
|
|
right: 6px;
|
|
font-size: 10px;
|
|
color: #fff;
|
|
background: var(--acc);
|
|
width: 16px;
|
|
height: 16px;
|
|
border-radius: 50%;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
}
|
|
|
|
.selector__icon-wrap {
|
|
width: 36px;
|
|
height: 36px;
|
|
border-radius: 12px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
transition: transform 200ms ease;
|
|
}
|
|
|
|
.selector__pill--active .selector__icon-wrap {
|
|
transform: scale(1.15);
|
|
}
|
|
|
|
.selector__icon {
|
|
font-size: 18px;
|
|
color: #fff;
|
|
}
|
|
|
|
.selector__label {
|
|
font-size: 13px;
|
|
color: var(--tx3);
|
|
}
|
|
|
|
.selector__pill--active .selector__label {
|
|
color: var(--tx);
|
|
font-weight: 600;
|
|
}
|
|
|
|
/* ── 仪表盘 ── */
|
|
.gauge-section {
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
padding: 16px 0 24px;
|
|
}
|
|
|
|
.gauge {
|
|
position: relative;
|
|
}
|
|
|
|
.gauge--measuring {
|
|
animation: gauge-breathe 2s ease-in-out infinite;
|
|
}
|
|
|
|
@keyframes gauge-breathe {
|
|
0%, 100% { transform: scale(1); }
|
|
50% { transform: scale(1.03); }
|
|
}
|
|
|
|
.gauge__ring-wrap {
|
|
position: relative;
|
|
width: 220px;
|
|
height: 220px;
|
|
}
|
|
|
|
.gauge__ring-bg {
|
|
position: absolute;
|
|
inset: 0;
|
|
border-radius: 50%;
|
|
border: 10px solid var(--bd);
|
|
box-sizing: border-box;
|
|
}
|
|
|
|
.gauge__ring-progress {
|
|
position: absolute;
|
|
inset: 0;
|
|
border-radius: 50%;
|
|
}
|
|
|
|
.gauge__center {
|
|
position: absolute;
|
|
inset: 20px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
justify-content: center;
|
|
background: var(--bg);
|
|
border-radius: 50%;
|
|
}
|
|
|
|
.gauge__icon-lg {
|
|
font-size: 40px;
|
|
margin-bottom: 8px;
|
|
}
|
|
|
|
.gauge__hint {
|
|
font-size: 13px;
|
|
color: var(--tx3);
|
|
text-align: center;
|
|
}
|
|
|
|
.gauge__value {
|
|
font-family: Georgia, 'Times New Roman', serif;
|
|
font-size: 52px;
|
|
font-weight: 700;
|
|
line-height: 1;
|
|
}
|
|
|
|
.gauge__unit {
|
|
font-size: 14px;
|
|
color: var(--tx3);
|
|
margin-top: 4px;
|
|
}
|
|
|
|
.gauge__loading {
|
|
font-size: 16px;
|
|
color: var(--tx2);
|
|
}
|
|
|
|
.gauge__err {
|
|
font-size: 36px;
|
|
color: var(--dan);
|
|
font-weight: 700;
|
|
}
|
|
|
|
.gauge__err-text {
|
|
font-size: 13px;
|
|
color: var(--tx2);
|
|
text-align: center;
|
|
}
|
|
|
|
/* ── 进度条 ── */
|
|
.progress-bar {
|
|
width: 240px;
|
|
height: 4px;
|
|
background: var(--bd);
|
|
border-radius: 2px;
|
|
margin-top: 16px;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.progress-bar__fill {
|
|
height: 100%;
|
|
border-radius: 2px;
|
|
transition: width 0.3s ease-out;
|
|
}
|
|
|
|
/* ── 免责声明 ── */
|
|
.disclaimer {
|
|
text-align: center;
|
|
padding: 0 20px;
|
|
margin-bottom: 16px;
|
|
}
|
|
|
|
.disclaimer__text {
|
|
font-size: 11px;
|
|
color: var(--tx3);
|
|
line-height: 1.5;
|
|
}
|
|
|
|
/* ── 操作按钮 ── */
|
|
.actions {
|
|
padding: 0 20px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 12px;
|
|
}
|
|
|
|
.btn {
|
|
height: 52px;
|
|
border-radius: 16px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
font-size: 18px;
|
|
font-weight: 600;
|
|
text-align: center;
|
|
transition: opacity 150ms;
|
|
}
|
|
|
|
.btn:active {
|
|
opacity: 0.85;
|
|
}
|
|
|
|
.btn--primary {
|
|
background: var(--pri);
|
|
color: #fff;
|
|
box-shadow: 0 4px 16px rgba(196,98,58,0.3);
|
|
}
|
|
|
|
.btn--secondary {
|
|
background: var(--card);
|
|
color: var(--tx);
|
|
border: 1px solid var(--bd);
|
|
}
|
|
|
|
.btn--text {
|
|
background: transparent;
|
|
color: var(--tx3);
|
|
height: 44px;
|
|
font-size: 14px;
|
|
}
|
|
|
|
/* ═══ 旧版兼容样式 ═══ */
|
|
.btn-primary {
|
|
background: var(--pri);
|
|
color: #fff;
|
|
height: 52px;
|
|
border-radius: 16px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
font-size: 18px;
|
|
font-weight: 600;
|
|
box-shadow: 0 4px 16px rgba(196,98,58,0.3);
|
|
}
|
|
.btn-primary:active { opacity: 0.85; }
|
|
|
|
.btn-secondary {
|
|
background: var(--card);
|
|
color: var(--tx);
|
|
height: 52px;
|
|
border-radius: 16px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
font-size: 18px;
|
|
font-weight: 600;
|
|
border: 1px solid var(--bd);
|
|
}
|
|
.btn-secondary:active { opacity: 0.85; }
|
|
|
|
.btn-text {
|
|
background: transparent;
|
|
color: var(--tx3);
|
|
height: 44px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
font-size: 14px;
|
|
}
|
|
|
|
.btn-large { margin: 0; }
|
|
|
|
/* 旧版 header/selector/gauge 兼容 */
|
|
.header { display: none; }
|
|
.header-device { display: none; }
|
|
.header-dot { display: none; }
|
|
.header-name { display: none; }
|
|
.header-battery { display: none; }
|
|
.header-disconnect { display: none; }
|
|
.selector-item { display: none; }
|
|
.selector-icon { display: none; }
|
|
.selector-label { display: none; }
|
|
.selector-check { display: none; }
|
|
.gauge-circle { display: none; }
|
|
.gauge-icon { display: none; }
|
|
.gauge-hint { display: none; }
|
|
.gauge-value { display: none; }
|
|
.gauge-loading { display: none; }
|
|
.gauge-err { display: none; }
|
|
.gauge-err-text { display: none; }
|
|
.gauge-progress-bar { display: none; }
|
|
.gauge-progress-fill { display: none; }
|
|
.assessment { display: none; }
|
|
.assessment-text { display: none; }
|
|
.disclaimer-text { display: none; }
|
|
.measure-error { display: none; }
|
|
.measure-error-text { display: none; }
|