/** * 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; }