Files
Pet3/wangquan-prototype.html
2026-06-25 18:24:29 +08:00

825 lines
60 KiB
HTML
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.
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>汪圈 · 遛狗小程序原型 V1</title>
<style>
:root {
--bg: #F2EDE6;
--surface: #FBF8F3;
--surface-glass: rgba(251, 248, 243, 0.72);
--surface-2: #EDE6DC;
--ink: #2E2A24;
--ink-2: #6E665B;
--ink-3: #A89F92;
--accent: #E8A04B;
--accent-deep: #C77E2E;
--accent-soft: #F7E5CC;
--success: #6B8E5A;
--success-soft: #E2EBD9;
--warn: #D98A4E;
--danger: #C25A4E;
--danger-soft: #F2DDD8;
--line: rgba(46, 42, 36, 0.10);
--line-2: rgba(46, 42, 36, 0.16);
--radius: 18px;
--radius-sm: 12px;
--radius-pill: 999px;
--shadow: 0 1px 2px rgba(46,42,36,0.04), 0 8px 24px rgba(46,42,36,0.06);
--font: -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
}
* { margin: 0; padding: 0; box-sizing: border-box; -webkit-tap-highlight-color: transparent; }
body {
font-family: var(--font);
background: #DED6CA;
color: var(--ink);
padding: 32px 16px 64px;
line-height: 1.5;
-webkit-font-smoothing: antialiased;
}
.page-head { max-width: 1180px; margin: 0 auto 28px; }
.page-head h1 { font-size: 22px; font-weight: 600; letter-spacing: -0.01em; }
.page-head p { font-size: 14px; color: #6b6357; margin-top: 6px; max-width: 640px; }
.legend { display: flex; flex-wrap: wrap; gap: 16px; margin-top: 16px; font-size: 12.5px; color: #6b6357; }
.legend span { display: inline-flex; align-items: center; gap: 6px; }
.dot { width: 9px; height: 9px; border-radius: 50%; display: inline-block; }
.stage {
max-width: 1180px;
margin: 0 auto;
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 40px 28px;
align-items: start;
}
.frame-wrap { display: flex; flex-direction: column; gap: 12px; }
.frame-label { font-size: 13px; font-weight: 600; color: #4a4339; display: flex; align-items: center; gap: 8px; }
.frame-label .num {
width: 20px; height: 20px; border-radius: 50%; background: var(--ink); color: #fff;
font-size: 11px; display: inline-flex; align-items: center; justify-content: center; font-weight: 600;
}
.frame-note { font-size: 12px; color: #756c5f; line-height: 1.5; }
.phone {
width: 300px;
height: 620px;
background: var(--bg);
border-radius: 36px;
border: 7px solid #2E2A24;
overflow: hidden;
position: relative;
display: flex;
flex-direction: column;
box-shadow: var(--shadow);
}
.statusbar {
height: 32px; flex-shrink: 0; display: flex; align-items: center; justify-content: space-between;
padding: 0 18px 0 22px; font-size: 12px; font-weight: 600; color: var(--ink); padding-top: 6px;
}
.statusbar .right { display: flex; gap: 5px; align-items: center; font-size: 11px; }
.navbar {
height: 44px; flex-shrink: 0; display: flex; align-items: center; justify-content: center;
position: relative; font-size: 15px; font-weight: 600;
}
.navbar .nav-left, .navbar .nav-right {
position: absolute; top: 50%; transform: translateY(-50%); color: var(--ink-2);
width: 28px; height: 28px; display: flex; align-items: center; justify-content: center; cursor: pointer;
}
.navbar .nav-left { left: 12px; }
.navbar .nav-right { right: 12px; }
.screen-body { flex: 1; overflow-y: auto; overflow-x: hidden; }
.screen-body::-webkit-scrollbar { display: none; }
.tabbar {
height: 64px; flex-shrink: 0; background: var(--surface-glass);
backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px);
border-top: 0.5px solid var(--line); display: flex; align-items: flex-start;
justify-content: space-around; padding-top: 8px; position: relative;
}
.tab { display: flex; flex-direction: column; align-items: center; gap: 3px; color: var(--ink-3); font-size: 10.5px; cursor: pointer; flex: 1; }
.tab.active { color: var(--accent-deep); }
.tab svg { width: 22px; height: 22px; }
.tab-center { flex: 1; display: flex; flex-direction: column; align-items: center; gap: 4px; }
.tab-fab {
width: 54px; height: 54px; border-radius: 50%; background: var(--accent);
display: flex; align-items: center; justify-content: center; margin-top: -26px;
border: 4px solid var(--bg); box-shadow: 0 4px 12px rgba(200,126,46,0.35); cursor: pointer;
}
.tab-fab svg { width: 26px; height: 26px; stroke: #fff; }
.tab-center span { font-size: 10.5px; color: var(--ink-2); }
svg.ic { width: 20px; height: 20px; stroke: currentColor; fill: none; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }
/* generic blocks */
.pad { padding: 16px; }
.card {
background: var(--surface); border-radius: var(--radius); border: 0.5px solid var(--line);
box-shadow: var(--shadow);
}
.row { display: flex; align-items: center; gap: 12px; }
.muted { color: var(--ink-2); }
.tiny { font-size: 11px; }
.center { text-align: center; }
.avatar {
border-radius: 50%; background: var(--surface-2); display: flex; align-items: center; justify-content: center;
color: var(--ink-3); flex-shrink: 0;
}
/* map placeholder */
.mapfill {
height: 132px; background:
repeating-linear-gradient(45deg, rgba(46,42,36,0.04), rgba(46,42,36,0.04) 10px, transparent 10px, transparent 20px);
border-top: 0.5px solid var(--line); border-bottom: 0.5px solid var(--line);
display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px; color: var(--ink-3);
}
.timer { font-size: 46px; font-weight: 600; letter-spacing: 1px; line-height: 1.05; font-variant-numeric: tabular-nums; }
.statgrid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.statgrid.three { grid-template-columns: repeat(3,1fr); }
.stat { background: var(--surface-2); border-radius: var(--radius-sm); padding: 11px 8px; text-align: center; }
.stat .v { font-size: 19px; font-weight: 600; font-variant-numeric: tabular-nums; }
.stat .k { font-size: 11px; color: var(--ink-2); margin-top: 1px; }
.btn {
height: 46px; border-radius: var(--radius-pill); border: 0.5px solid var(--line-2);
background: var(--surface); color: var(--ink); font-size: 14px; font-weight: 600; font-family: var(--font);
display: inline-flex; align-items: center; justify-content: center; gap: 6px; cursor: pointer; width: 100%;
}
.btn:active { transform: scale(0.98); }
.btn.primary { background: var(--accent); color: #fff; border-color: transparent; }
.btn.danger { color: var(--danger); border-color: var(--danger-soft); }
.btn.ghost { background: transparent; }
.btn svg { width: 18px; height: 18px; stroke: currentColor; fill: none; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }
.toggle { width: 38px; height: 22px; border-radius: var(--radius-pill); background: var(--line-2); position: relative; transition: background .2s; flex-shrink: 0; cursor: pointer; }
.toggle::after { content:""; position: absolute; top: 2px; left: 2px; width: 18px; height: 18px; border-radius: 50%; background: #fff; transition: transform .2s; box-shadow: 0 1px 2px rgba(0,0,0,0.2); }
.toggle.on { background: var(--success); }
.toggle.on::after { transform: translateX(16px); }
.listrow { display: flex; align-items: center; gap: 10px; padding: 13px 16px; border-bottom: 0.5px solid var(--line); cursor: pointer; }
.listrow:last-child { border-bottom: none; }
.listrow .ti { color: var(--ink-2); }
.listrow .lbl { flex: 1; font-size: 14px; }
.listrow .chev { color: var(--ink-3); }
.badge { display: inline-flex; align-items: center; gap: 5px; background: var(--accent-soft); color: var(--accent-deep); font-size: 11px; font-weight: 600; padding: 3px 10px; border-radius: var(--radius-pill); }
.pill-status { display: inline-flex; align-items: center; gap: 5px; font-size: 11px; font-weight: 600; }
.ach-grid { display: grid; grid-template-columns: repeat(4,1fr); gap: 8px; }
.ach { display: flex; flex-direction: column; align-items: center; gap: 4px; text-align: center; }
.ach .medal { width: 42px; height: 42px; border-radius: 50%; background: var(--surface-2); display: flex; align-items: center; justify-content: center; }
.ach .medal svg { width: 21px; height: 21px; }
.ach.locked .medal { background: var(--surface-2); opacity: 0.55; }
.ach .nm { font-size: 10px; color: var(--ink-2); }
.ach.locked .nm { color: var(--ink-3); }
/* modal / sheet */
.overlay {
position: absolute; inset: 0; background: rgba(46,42,36,0.42);
display: flex; align-items: flex-end; justify-content: center; z-index: 20;
opacity: 0; pointer-events: none; transition: opacity .22s;
}
.overlay.show { opacity: 1; pointer-events: auto; }
.sheet {
width: 100%; background: var(--surface); border-radius: 22px 22px 0 0; padding: 8px 16px 18px;
transform: translateY(20px); transition: transform .26s; max-height: 92%; overflow-y: auto;
}
.overlay.show .sheet { transform: translateY(0); }
.sheet-handle { width: 36px; height: 4px; border-radius: 2px; background: var(--line-2); margin: 6px auto 14px; }
.confirm {
width: 240px; background: var(--surface); border-radius: 18px; padding: 22px 18px 16px; text-align: center;
transform: scale(0.94); transition: transform .2s;
}
.overlay.center { align-items: center; }
.overlay.center.show .confirm { transform: scale(1); }
.confirm h4 { font-size: 16px; font-weight: 600; }
.confirm p { font-size: 13px; color: var(--ink-2); margin: 6px 0 18px; }
.confirm .btns { display: flex; gap: 10px; }
.confirm .btn { height: 42px; }
/* annotations for devs */
.anno {
background: #FFF7E8; border: 1px dashed var(--accent); border-radius: 10px;
padding: 9px 11px; font-size: 11.5px; color: #7a5a1e; line-height: 1.5;
}
.anno b { color: #5e4615; }
.section-title { font-size: 12px; color: var(--ink-2); padding: 14px 16px 6px; }
.field { padding: 11px 16px; border-bottom: 0.5px solid var(--line); }
.field .flabel { font-size: 12px; color: var(--ink-2); margin-bottom: 6px; display: flex; align-items: center; gap: 6px; }
.chips { display: flex; flex-wrap: wrap; gap: 8px; }
.chip { font-size: 12.5px; padding: 6px 12px; border-radius: var(--radius-pill); border: 0.5px solid var(--line-2); background: var(--surface-2); cursor: pointer; }
.chip.sel { background: var(--accent-soft); border-color: var(--accent); color: var(--accent-deep); font-weight: 600; }
.photo-add { width: 64px; height: 64px; border-radius: 12px; border: 1px dashed var(--line-2); display: flex; align-items: center; justify-content: center; color: var(--ink-3); cursor: pointer; }
.input-fake { background: var(--surface-2); border-radius: 10px; padding: 10px 12px; font-size: 13px; color: var(--ink-3); }
.hist-row { display: flex; align-items: center; gap: 10px; padding: 11px; background: var(--surface-2); border-radius: var(--radius-sm); cursor: pointer; }
.hist-row .ti { color: var(--ink-2); }
</style>
</head>
<body>
<div class="page-head">
<h1>汪圈 · 遛狗小程序 — 可交互原型 V1</h1>
<p>首版聚焦遛狗单机闭环,覆盖从「打开小程序」到「第一次遛狗」的完整路径。点击屏幕内的按钮可真实跳转、切换状态。橙色虚线框是给开发的交互/逻辑注释,不属于界面本身。完整流程:登录(0a) → 建档(0b) → 首页(1) → 遛狗(2) → 成果卡(3) → 沉淀(4)。底部导航「记录 + 遛狗 + 我的」三 Tab广场、附近、排行榜、信息站均为 pending。</p>
<div class="legend">
<span><i class="dot" style="background:var(--accent)"></i>主行为入口</span>
<span><i class="dot" style="background:var(--success)"></i>进行中状态</span>
<span><i class="dot" style="background:var(--warn)"></i>暂停状态</span>
<span><i class="dot" style="background:var(--danger)"></i>危险/二次确认</span>
<span><i class="dot" style="background:var(--accent);border:2px dashed var(--accent-deep)"></i>开发注释</span>
</div>
</div>
<div class="stage">
<!-- ============ FRAME 0a: 登录/欢迎 ============ -->
<div class="frame-wrap">
<div class="frame-label"><span class="num">0a</span>欢迎 / 微信授权登录</div>
<div class="phone" id="screen-login">
<div class="statusbar"><span>9:41</span><div class="right"><span>●●●</span><span>5G</span><span>100%</span></div></div>
<div class="navbar"></div>
<div class="screen-body" style="display:flex;flex-direction:column;">
<div class="center" style="padding:48px 28px 24px;flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;">
<div style="width:88px;height:88px;border-radius:26px;background:var(--accent);display:flex;align-items:center;justify-content:center;margin-bottom:20px;box-shadow:0 6px 18px rgba(200,126,46,0.3);">
<svg viewBox="0 0 24 24" fill="none" stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="width:42px;height:42px;"><use href="#i-walk"/></svg>
</div>
<div style="font-size:22px;font-weight:600;letter-spacing:1px;">汪圈</div>
<div class="muted" style="font-size:13px;margin-top:6px;line-height:1.6;max-width:200px;">每一次遛狗,都值得被记录</div>
</div>
<div class="pad" style="padding-bottom:14px;">
<button class="btn primary" onclick="go('screen-create-dog')"><svg><use href="#i-wechat"/></svg>微信一键登录</button>
<div class="tiny muted center" style="margin-top:14px;line-height:1.5;">登录即代表同意 <span style="color:var(--accent-deep)">用户协议</span><span style="color:var(--accent-deep)">隐私政策</span></div>
</div>
<div class="pad" style="padding-top:0;"><div class="anno"><b>注释:</b>首次打开的第一屏。微信授权登录后,<b>若用户尚未建档任何狗狗 → 直接进建档页0b</b>;已建档老用户 → 跳过,直接进首页。协议/隐私为必须的合规要素。</div></div>
</div>
</div>
<div class="frame-note">登录 → 新用户进建档页;老用户直接进首页。</div>
</div>
<!-- ============ FRAME 0b: 建档 / 编辑狗狗 ============ -->
<div class="frame-wrap">
<div class="frame-label"><span class="num">0b</span>建档 / 编辑狗狗(同一表单)</div>
<div class="phone" id="screen-create-dog">
<div class="statusbar"><span>9:41</span><div class="right"><span>●●●</span><span>5G</span><span>100%</span></div></div>
<div class="navbar"><div class="nav-left" onclick="go('screen-login')"><svg class="ic" style="width:18px;height:18px;"><use href="#i-chev-l"/></svg></div>认识你的狗狗</div>
<div class="screen-body">
<div class="center" style="padding:18px 16px 10px;">
<div style="position:relative;width:78px;margin:0 auto;cursor:pointer;">
<div class="avatar" style="width:78px;height:78px;border:0.5px solid var(--line);"><svg class="ic" style="width:36px;height:36px;"><use href="#i-dog"/></svg></div>
<div style="position:absolute;right:-2px;bottom:-2px;width:26px;height:26px;border-radius:50%;background:var(--accent);border:2px solid var(--bg);display:flex;align-items:center;justify-content:center;"><svg viewBox="0 0 24 24" fill="none" stroke="#fff" stroke-width="2" style="width:14px;height:14px;"><use href="#i-camera-plus"/></svg></div>
</div>
<div class="tiny muted" style="margin-top:8px;">点击上传头像(可选)</div>
</div>
<div class="field" style="border-top:0.5px solid var(--line);">
<div class="flabel">名字 <span style="color:var(--danger)">*</span></div>
<div class="input-fake" style="color:var(--ink);">豆豆</div>
</div>
<div class="field">
<div class="flabel">犬种 <span style="color:var(--danger)">*</span></div>
<div class="input-fake row" style="justify-content:space-between;"><span style="color:var(--ink);">柯基</span><svg class="ic" style="width:16px;height:16px;color:var(--ink-3)"><use href="#i-chev-r"/></svg></div>
</div>
<div class="field">
<div class="flabel">性别</div>
<div class="chips"><span class="chip sel"></span><span class="chip"></span></div>
</div>
<div class="field">
<div class="flabel">年龄(可选)</div>
<div class="chips"><span class="chip">幼犬</span><span class="chip sel">成犬 3 岁</span><span class="chip">老年犬</span></div>
</div>
<div class="field" style="border-bottom:none;">
<div class="flabel">体重(可选,用于估算狗步)</div>
<div class="input-fake">12 kg</div>
</div>
<div class="pad">
<button class="btn primary" onclick="go('screen-home')"><svg><use href="#i-check"/></svg>完成,开始遛狗</button>
</div>
<div class="pad" style="padding-top:0;"><div class="anno"><b>注释:</b>建档与编辑<b>复用此表单</b>(编辑时预填已有值,标题改「编辑资料」)。仅名字、犬种必填——降低首次门槛。犬种用于狗步换算系数;体重可选做二次校准。完成后进首页,首页即出现这只狗。</div></div>
</div>
</div>
<div class="frame-note">完成 → 首页(狗狗已建档)。狗狗主页右上「编辑」也进此页(预填)。</div>
</div>
<!-- ============ FRAME 0c: 多狗选择弹层 ============ -->
<div class="frame-wrap">
<div class="frame-label"><span class="num">0c</span>多狗选择(点遛狗时)</div>
<div class="phone" id="screen-multidog">
<div class="statusbar"><span>9:41</span><div class="right"><span>●●●</span><span>5G</span><span>100%</span></div></div>
<div class="navbar">我的</div>
<div class="screen-body" style="filter:brightness(0.96);">
<div class="pad row" style="padding-bottom:16px;opacity:0.5;">
<div class="avatar" style="width:50px;height:50px;"><svg class="ic" style="width:26px;height:26px;"><use href="#i-user"/></svg></div>
<div style="flex:1;"><div style="font-size:15px;font-weight:600;">铲屎官小J</div><div class="tiny muted">遛狗 87 次 · 加入 92 天</div></div>
</div>
<div class="section-title" style="opacity:0.5;">我的狗狗</div>
<div class="pad" style="opacity:0.5;"><div class="card row" style="padding:12px;"><div class="avatar" style="width:44px;height:44px;"><svg class="ic" style="width:22px;height:22px;"><use href="#i-dog"/></svg></div><div style="flex:1;"><div style="font-size:14px;font-weight:600;">豆豆</div><div class="tiny muted">柯基</div></div></div></div>
</div>
<div class="overlay show" style="position:absolute;">
<div class="sheet" style="transform:translateY(0);">
<div class="sheet-handle"></div>
<div style="font-size:16px;font-weight:600;text-align:center;margin-bottom:4px;">今天遛哪只?</div>
<div class="tiny muted center" style="margin-bottom:16px;">可多选,一起遛</div>
<div style="display:flex;flex-direction:column;gap:10px;">
<div class="card row" style="padding:12px;border:2px solid var(--accent);"><div class="avatar" style="width:42px;height:42px;"><svg class="ic" style="width:21px;height:21px;"><use href="#i-dog"/></svg></div><div style="flex:1;"><div style="font-size:14px;font-weight:600;">豆豆</div><div class="tiny muted">柯基 · 连续 7 天</div></div><div style="width:24px;height:24px;border-radius:50%;background:var(--accent);display:flex;align-items:center;justify-content:center;"><svg viewBox="0 0 24 24" fill="none" stroke="#fff" stroke-width="2.5" style="width:14px;height:14px;"><use href="#i-check"/></svg></div></div>
<div class="card row" style="padding:12px;"><div class="avatar" style="width:42px;height:42px;"><svg class="ic" style="width:21px;height:21px;"><use href="#i-dog"/></svg></div><div style="flex:1;"><div style="font-size:14px;font-weight:600;">奶糖</div><div class="tiny muted">比熊 · 连续 2 天</div></div><div style="width:24px;height:24px;border-radius:50%;border:1.5px solid var(--line-2);"></div></div>
</div>
<div style="margin-top:16px;"><button class="btn primary" onclick="go('screen-walking')"><svg><use href="#i-walk"/></svg>开始遛狗</button></div>
</div>
</div>
</div>
<div class="frame-note">仅多狗用户出现;单狗用户点遛狗直接进遛狗中。选定 → 遛狗中。</div>
</div>
<!-- ============ FRAME 1: 我的(首页/入口) ============ -->
<div class="frame-wrap">
<div class="frame-label"><span class="num">1</span>我的(启动后默认页)</div>
<div class="phone" id="screen-home">
<div class="statusbar"><span>9:41</span><div class="right"><span>●●●</span><span>5G</span><span>100%</span></div></div>
<div class="navbar">我的</div>
<div class="screen-body">
<div class="pad row" style="border-bottom:0.5px solid var(--line);padding-bottom:16px;">
<div class="avatar" style="width:50px;height:50px;"><svg class="ic" style="width:26px;height:26px;"><use href="#i-user"/></svg></div>
<div style="flex:1;">
<div style="font-size:15px;font-weight:600;">铲屎官小J</div>
<div class="tiny muted" style="margin-top:2px;">遛狗 87 次 · 加入 92 天</div>
</div>
<svg class="ic" style="color:var(--ink-3)"><use href="#i-chev-r"/></svg>
</div>
<div class="section-title">我的狗狗</div>
<div class="pad" style="padding-top:0;">
<div class="card row" style="padding:12px;cursor:pointer;" onclick="go('screen-dog')">
<div class="avatar" style="width:44px;height:44px;"><svg class="ic" style="width:22px;height:22px;"><use href="#i-dog"/></svg></div>
<div style="flex:1;">
<div style="font-size:14px;font-weight:600;">豆豆</div>
<div class="tiny" style="margin-top:2px;"><span class="pill-status" style="color:var(--success)"><i class="dot" style="background:var(--success)"></i>连续 7 天</span> · 柯基</div>
</div>
<svg class="ic" style="color:var(--ink-3)"><use href="#i-chev-r"/></svg>
</div>
<div style="margin-top:10px;border:1px dashed var(--line-2);border-radius:var(--radius);padding:12px;display:flex;align-items:center;justify-content:center;gap:6px;color:var(--ink-2);font-size:13px;cursor:pointer;">
<svg class="ic"><use href="#i-plus"/></svg> 添加狗狗
</div>
</div>
<div style="border-top:0.5px solid var(--line);">
<div class="listrow" onclick="go('screen-history')"><svg class="ic ti"><use href="#i-history"/></svg><span class="lbl">遛狗历史</span><svg class="ic chev"><use href="#i-chev-r"/></svg></div>
<div class="listrow" onclick="go('screen-achievements')"><svg class="ic ti"><use href="#i-medal"/></svg><span class="lbl">成就</span><svg class="ic chev"><use href="#i-chev-r"/></svg></div>
<div class="listrow"><svg class="ic ti"><use href="#i-settings"/></svg><span class="lbl">设置</span><svg class="ic chev"><use href="#i-chev-r"/></svg></div>
</div>
<div class="pad"><div class="anno"><b>注释:</b>启动后默认进此页。单只狗时点中央「遛狗」按钮直接开始;多只狗弹出选择。「添加狗狗」为多狗预留。</div></div>
</div>
<div class="tabbar">
<div class="tab" onclick="go('screen-records')"><svg class="ic" style="width:22px;height:22px;"><use href="#i-list"/></svg><span>记录</span></div>
<div class="tab-center">
<div class="tab-fab" onclick="go('screen-walking')"><svg viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><use href="#i-walk"/></svg></div>
<span>遛狗</span>
</div>
<div class="tab active"><svg class="ic" style="width:22px;height:22px;"><use href="#i-user"/></svg><span>我的</span></div>
</div>
</div>
<div class="frame-note">点豆豆卡片或「成就」→ 狗狗主页;点中央橙色按钮 → 开始遛狗。</div>
</div>
<!-- ============ FRAME 2: 遛狗中(正常态) ============ -->
<div class="frame-wrap">
<div class="frame-label"><span class="num">2</span>遛狗中 · 进行态</div>
<div class="phone" id="screen-walking">
<div class="statusbar"><span>9:41</span><div class="right"><span>●●●</span><span>5G</span><span>100%</span></div></div>
<div class="navbar" style="font-size:13px;color:var(--ink-2);">
<span class="pill-status" style="color:var(--success)"><i class="dot" style="background:var(--success)"></i>遛狗中</span>
</div>
<div class="screen-body">
<div class="mapfill"><svg class="ic" style="width:26px;height:26px;"><use href="#i-map"/></svg><span class="tiny">地图轨迹(首版可后置)</span></div>
<div class="center" style="padding:18px 16px 8px;">
<div class="tiny muted">已遛时长</div>
<div class="timer" id="live-timer">12:34</div>
</div>
<div class="pad statgrid" style="padding-top:6px;padding-bottom:10px;">
<div class="stat"><div class="v">1.2<span style="font-size:12px;"> km</span></div><div class="k">距离</div></div>
<div class="stat"><div class="v">3,480</div><div class="k">狗步</div></div>
</div>
<div class="row" style="padding:0 16px 12px;justify-content:space-between;">
<span class="row" style="font-size:13px;gap:7px;"><svg class="ic" style="color:var(--ink-2)"><use href="#i-poo"/></svg>便便打卡</span>
<span class="toggle" onclick="this.classList.toggle('on')"></span>
</div>
<div class="pad row" style="gap:10px;padding-top:0;">
<button class="btn ghost" onclick="go('screen-paused')"><svg><use href="#i-pause"/></svg>暂停</button>
<button class="btn danger" onclick="openConfirm()"><svg><use href="#i-stop"/></svg>结束</button>
</div>
<div class="row" style="border-top:0.5px solid var(--line);padding:10px 16px;font-size:12px;color:var(--ink-2);gap:8px;cursor:pointer;">
<svg class="ic" style="width:16px;height:16px;"><use href="#i-dog"/></svg>豆豆 · 柯基 <svg class="ic" style="width:14px;height:14px;margin-left:auto;color:var(--ink-3)"><use href="#i-chev-d"/></svg>
</div>
<div class="pad" style="padding-top:0;"><div class="anno"><b>注释:</b>计时器每秒自增(演示中模拟)。便便打卡为行内开关,遛狗中即时记录。底部可切换当前遛的是哪只狗(单狗不显示箭头)。距离/狗步在未授权定位时降级隐藏。</div></div>
</div>
<div class="tabbar">
<div class="tab" onclick="go('screen-records')"><svg class="ic" style="width:22px;height:22px;"><use href="#i-list"/></svg><span>记录</span></div>
<div class="tab-center"><div class="tab-fab" style="background:var(--success);box-shadow:0 4px 12px rgba(107,142,90,0.35);"><svg viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><use href="#i-walk"/></svg></div><span style="color:var(--success)">遛狗中</span></div>
<div class="tab"><svg class="ic" style="width:22px;height:22px;"><use href="#i-user"/></svg><span>我的</span></div>
</div>
<!-- 结束二次确认 -->
<div class="overlay center" id="confirm-end">
<div class="confirm">
<h4>结束这次遛狗?</h4>
<p>豆豆已经走了 12 分钟,<br>确认结束并生成成果卡。</p>
<div class="btns">
<button class="btn ghost" onclick="closeConfirm()">再遛会</button>
<button class="btn primary" onclick="closeConfirm();go('screen-summary')">结束</button>
</div>
</div>
</div>
</div>
<div class="frame-note">「暂停」→ 暂停态;「结束」→ 二次确认 → 成果卡。</div>
</div>
<!-- ============ FRAME 2b: 暂停态 ============ -->
<div class="frame-wrap">
<div class="frame-label"><span class="num">2b</span>遛狗中 · 暂停态</div>
<div class="phone" id="screen-paused">
<div class="statusbar"><span>9:41</span><div class="right"><span>●●●</span><span>5G</span><span>100%</span></div></div>
<div class="navbar" style="font-size:13px;color:var(--warn);">
<span class="pill-status" style="color:var(--warn)"><i class="dot" style="background:var(--warn)"></i>已暂停</span>
</div>
<div class="screen-body">
<div class="mapfill" style="background:var(--surface-2);"><svg class="ic" style="width:26px;height:26px;"><use href="#i-pause"/></svg><span class="tiny">计时已停止</span></div>
<div class="center" style="padding:18px 16px 8px;opacity:0.45;">
<div class="tiny muted">已遛时长</div>
<div class="timer">12:34</div>
</div>
<div class="pad statgrid" style="padding-top:6px;padding-bottom:10px;opacity:0.45;">
<div class="stat"><div class="v">1.2<span style="font-size:12px;"> km</span></div><div class="k">距离</div></div>
<div class="stat"><div class="v">3,480</div><div class="k">狗步</div></div>
</div>
<div class="pad row" style="gap:10px;padding-top:8px;">
<button class="btn primary" onclick="go('screen-walking')"><svg><use href="#i-play"/></svg>继续</button>
<button class="btn danger" onclick="go('screen-summary')"><svg><use href="#i-stop"/></svg>结束</button>
</div>
<div class="row" style="border-top:0.5px solid var(--line);padding:10px 16px;font-size:12px;color:var(--ink-2);gap:8px;margin-top:8px;">
<svg class="ic" style="width:16px;height:16px;"><use href="#i-dog"/></svg>豆豆 · 柯基
</div>
<div class="pad" style="padding-top:0;"><div class="anno"><b>注释:</b>暂停时停止计时,时长/数据置灰,避免误以为仍在记录。主按钮变「继续」(提示恢复)。遛狗常有等狗、捡便便的停顿,暂停防止污染数据。</div></div>
</div>
<div class="tabbar">
<div class="tab" onclick="go('screen-records')"><svg class="ic" style="width:22px;height:22px;"><use href="#i-list"/></svg><span>记录</span></div>
<div class="tab-center"><div class="tab-fab" style="background:var(--warn);box-shadow:none;"><svg viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><use href="#i-pause"/></svg></div><span style="color:var(--warn)">已暂停</span></div>
<div class="tab"><svg class="ic" style="width:22px;height:22px;"><use href="#i-user"/></svg><span>我的</span></div>
</div>
</div>
<div class="frame-note">「继续」→ 回到进行态;「结束」→ 成果卡。</div>
</div>
<!-- ============ FRAME 3: 成果卡 ============ -->
<div class="frame-wrap">
<div class="frame-label"><span class="num">3</span>成果卡(遛完总结)</div>
<div class="phone" id="screen-summary">
<div class="statusbar"><span>9:41</span><div class="right"><span>●●●</span><span>5G</span><span>100%</span></div></div>
<div class="navbar">今日成果<div class="nav-right" onclick="go('screen-home')"><svg class="ic" style="width:18px;height:18px;"><use href="#i-x"/></svg></div></div>
<div class="screen-body">
<div class="center" style="padding:18px 16px 14px;border-bottom:0.5px solid var(--line);">
<div class="avatar" style="width:58px;height:58px;margin:0 auto 8px;border:0.5px solid var(--line);"><svg class="ic" style="width:28px;height:28px;"><use href="#i-dog"/></svg></div>
<div style="font-size:15px;font-weight:600;">豆豆今天走了</div>
<div style="margin:2px 0;"><span style="font-size:36px;font-weight:600;letter-spacing:1px;font-variant-numeric:tabular-nums;">3,480</span> <span class="muted" style="font-size:15px;">狗步</span></div>
<div class="tiny" style="color:var(--success);font-weight:600;">超过了昨天的 2,900 步</div>
</div>
<div class="statgrid three center" style="padding:14px 12px;">
<div><div style="font-size:18px;font-weight:600;">12:34</div><div class="tiny muted">时长</div></div>
<div><div style="font-size:18px;font-weight:600;">1.2</div><div class="tiny muted">公里</div></div>
<div><div style="font-size:18px;font-weight:600;color:var(--success);">第7天</div><div class="tiny muted">连续</div></div>
</div>
<div style="margin:0 16px 14px;padding:11px 12px;background:var(--accent-soft);border-radius:var(--radius-sm);display:flex;align-items:center;gap:10px;">
<svg class="ic" style="width:22px;height:22px;color:var(--accent-deep)"><use href="#i-medal"/></svg>
<div><div style="font-size:13px;font-weight:600;color:var(--accent-deep)">解锁成就 · 一周不断</div><div class="tiny" style="color:var(--accent-deep);opacity:.8;">连续遛狗满 7 天</div></div>
</div>
<!-- 选填补充信息 -->
<div class="section-title">补充(可选,跳过也能保存)</div>
<div class="pad" style="padding-top:4px;padding-bottom:8px;">
<div class="row" style="gap:8px;">
<div class="photo-add"><svg class="ic"><use href="#i-camera"/></svg></div>
<div class="input-fake" style="flex:1;">给这次遛狗写点什么…</div>
</div>
</div>
<div class="field" style="border-top:0.5px solid var(--line);">
<div class="flabel"><svg class="ic" style="width:14px;height:14px;"><use href="#i-sun"/></svg>天气</div>
<div class="chips">
<span class="chip sel">☀️ 晴</span><span class="chip">☁️ 阴</span><span class="chip">🌧️ 雨</span>
</div>
</div>
<div class="field">
<div class="flabel"><svg class="ic" style="width:14px;height:14px;"><use href="#i-heart"/></svg>状态</div>
<div class="chips">
<span class="chip sel">遛得开心</span><span class="chip">有点累</span><span class="chip">很兴奋</span>
</div>
</div>
<div class="pad" style="display:flex;flex-direction:column;gap:10px;">
<button class="btn primary"><svg><use href="#i-share"/></svg>生成图片分享到朋友圈</button>
<button class="btn ghost" onclick="go('screen-dog')">完成</button>
</div>
<div class="pad" style="padding-top:0;"><div class="anno"><b>注释:</b>所有需要输入的字段集中在此页且全部选填——遛狗时用户腾不出手。视角是「豆豆走了」非「你遛了」。分享为首选项(拉新入口)。「完成」后记录沉淀进狗狗主页。</div></div>
</div>
</div>
<div class="frame-note">「完成」或「分享」→ 沉淀进狗狗主页近期记录。</div>
</div>
<!-- ============ FRAME 4: 狗狗主页 ============ -->
<div class="frame-wrap">
<div class="frame-label"><span class="num">4</span>狗狗主页</div>
<div class="phone" id="screen-dog">
<div class="statusbar"><span>9:41</span><div class="right"><span>●●●</span><span>5G</span><span>100%</span></div></div>
<div class="navbar"><div class="nav-left" onclick="go('screen-home')"><svg class="ic" style="width:18px;height:18px;"><use href="#i-chev-l"/></svg></div>豆豆<div class="nav-right" onclick="go('screen-create-dog')"><svg class="ic" style="width:16px;height:16px;"><use href="#i-edit"/></svg></div></div>
<div class="screen-body">
<div class="center" style="padding:16px;border-bottom:0.5px solid var(--line);">
<div class="avatar" style="width:62px;height:62px;margin:0 auto 8px;border:0.5px solid var(--line);"><svg class="ic" style="width:30px;height:30px;"><use href="#i-dog"/></svg></div>
<div style="font-size:16px;font-weight:600;">豆豆</div>
<div class="tiny muted">柯基 · 3 岁 · 公</div>
</div>
<div class="statgrid three center" style="padding:14px 12px;border-bottom:0.5px solid var(--line);">
<div><div style="font-size:20px;font-weight:600;">87</div><div class="tiny muted">总次数</div></div>
<div><div style="font-size:20px;font-weight:600;">142</div><div class="tiny muted">总公里</div></div>
<div><div style="font-size:20px;font-weight:600;color:var(--success);">7</div><div class="tiny muted">连续天数</div></div>
</div>
<div class="row" style="padding:14px 16px 8px;justify-content:space-between;">
<span style="font-size:13px;font-weight:600;">成就墙</span><span class="tiny" style="color:var(--ink-3)">3 / 12</span>
</div>
<div class="pad ach-grid" style="padding-top:0;padding-bottom:14px;border-bottom:0.5px solid var(--line);">
<div class="ach"><div class="medal"><svg class="ic" style="color:var(--accent)"><use href="#i-medal"/></svg></div><span class="nm">一周不断</span></div>
<div class="ach"><div class="medal"><svg class="ic" style="color:#5b86b3"><use href="#i-rain"/></svg></div><span class="nm">雨天战士</span></div>
<div class="ach"><div class="medal"><svg class="ic" style="color:var(--success)"><use href="#i-flag"/></svg></div><span class="nm">首遛</span></div>
<div class="ach locked"><div class="medal"><svg class="ic" style="color:var(--ink-3)"><use href="#i-lock"/></svg></div><span class="nm">未解锁</span></div>
</div>
<div style="font-size:13px;font-weight:600;padding:14px 16px 8px;">近期记录</div>
<div class="pad" style="padding-top:0;display:flex;flex-direction:column;gap:8px;">
<div class="hist-row" onclick="go('screen-summary')"><svg class="ic ti"><use href="#i-walk"/></svg><div style="flex:1;"><div style="font-size:13px;">今天 早上</div><div class="tiny muted">12分34秒 · 1.2km · 3480狗步</div></div></div>
<div class="hist-row"><svg class="ic ti"><use href="#i-walk"/></svg><div style="flex:1;"><div style="font-size:13px;">昨天 傍晚</div><div class="tiny muted">18分02秒 · 1.8km · 5100狗步</div></div></div>
</div>
<div class="pad"><div class="anno"><b>注释:</b>累计选「次数/公里/连续天数」,不要配速/卡路里——记录陪伴厚度而非运动表现。成就墙露灰锁制造收集欲。点近期记录可回看成果卡。</div></div>
</div>
<div class="tabbar">
<div class="tab" onclick="go('screen-records')"><svg class="ic" style="width:22px;height:22px;"><use href="#i-list"/></svg><span>记录</span></div>
<div class="tab-center"><div class="tab-fab" onclick="go('screen-walking')"><svg viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><use href="#i-walk"/></svg></div><span>遛狗</span></div>
<div class="tab active"><svg class="ic" style="width:22px;height:22px;"><use href="#i-user"/></svg><span>我的</span></div>
</div>
</div>
<div class="frame-note">返回 → 我的页;近期记录 → 回看成果卡。</div>
</div>
<!-- ============ FRAME 5: 遛狗历史 + 手动补记 ============ -->
<div class="frame-wrap">
<div class="frame-label"><span class="num">5</span>遛狗历史 + 手动补记</div>
<div class="phone" id="screen-history">
<div class="statusbar"><span>9:41</span><div class="right"><span>●●●</span><span>5G</span><span>100%</span></div></div>
<div class="navbar"><div class="nav-left" onclick="go('screen-home')"><svg class="ic" style="width:18px;height:18px;"><use href="#i-chev-l"/></svg></div>遛狗历史<div class="nav-right" onclick="openSheet()"><svg class="ic" style="width:18px;height:18px;"><use href="#i-plus"/></svg></div></div>
<div class="screen-body">
<div class="pad" style="display:flex;flex-direction:column;gap:8px;">
<div class="tiny muted" style="padding:4px 2px;">本周</div>
<div class="hist-row"><svg class="ic ti"><use href="#i-walk"/></svg><div style="flex:1;"><div style="font-size:13px;">今天 早上 · 豆豆</div><div class="tiny muted">12分34秒 · 1.2km</div></div></div>
<div class="hist-row"><svg class="ic ti"><use href="#i-walk"/></svg><div style="flex:1;"><div style="font-size:13px;">昨天 傍晚 · 豆豆</div><div class="tiny muted">18分02秒 · 1.8km</div></div></div>
<div class="hist-row" style="border:1px dashed var(--line-2);background:transparent;"><svg class="ic ti" style="color:var(--accent-deep)"><use href="#i-edit"/></svg><div style="flex:1;"><div style="font-size:13px;">前天 · 豆豆 <span class="badge" style="background:var(--surface-2);color:var(--ink-2);">补记</span></div><div class="tiny muted">15分00秒 · 距离未记录</div></div></div>
</div>
<div class="pad"><div class="anno"><b>注释:</b>右上「+」= 手动补记入口(忘记开 App 时事后补)。规则:补记<b>可维持连续打卡不断签</b>,但<b>不计入排行榜</b>(防刷量)。补记记录带标识区分。</div></div>
</div>
<!-- 补记底部弹层 -->
<div class="overlay" id="sheet-add">
<div class="sheet">
<div class="sheet-handle"></div>
<div style="font-size:16px;font-weight:600;text-align:center;margin-bottom:4px;">手动补记</div>
<div class="tiny muted center" style="margin-bottom:14px;">忘记开 App 也能补上这次遛狗</div>
<div class="field" style="border-top:0.5px solid var(--line);"><div class="flabel">哪只狗</div><div class="chips"><span class="chip sel">豆豆</span></div></div>
<div class="field"><div class="flabel">时间</div><div class="input-fake">前天 18:00</div></div>
<div class="field"><div class="flabel">时长</div><div class="input-fake">15 分钟</div></div>
<div class="field" style="border-bottom:none;"><div class="flabel">距离(可选)</div><div class="input-fake">未填写</div></div>
<div class="anno" style="margin:6px 0 12px;">补记不影响连续打卡,但不计入排行榜。</div>
<div class="row" style="gap:10px;">
<button class="btn ghost" onclick="closeSheet()">取消</button>
<button class="btn primary" onclick="closeSheet()">保存补记</button>
</div>
</div>
</div>
<div class="tabbar">
<div class="tab" onclick="go('screen-records')"><svg class="ic" style="width:22px;height:22px;"><use href="#i-list"/></svg><span>记录</span></div>
<div class="tab-center"><div class="tab-fab" onclick="go('screen-walking')"><svg viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><use href="#i-walk"/></svg></div><span>遛狗</span></div>
<div class="tab active"><svg class="ic" style="width:22px;height:22px;"><use href="#i-user"/></svg><span>我的</span></div>
</div>
</div>
<div class="frame-note">右上「+」→ 弹出补记表单。</div>
</div>
<!-- ============ FRAME 6: 记录 Tab成就墙概览 + 历史) ============ -->
<div class="frame-wrap">
<div class="frame-label"><span class="num">6</span>记录 Tab左侧 Tab</div>
<div class="phone" id="screen-records">
<div class="statusbar"><span>9:41</span><div class="right"><span>●●●</span><span>5G</span><span>100%</span></div></div>
<div class="navbar">记录</div>
<div class="screen-body">
<div class="row" style="padding:14px 16px 8px;justify-content:space-between;">
<span style="font-size:13px;font-weight:600;">成就墙</span>
<span class="tiny" style="color:var(--accent-deep);cursor:pointer;" onclick="go('screen-achievements')">全部 3/12 </span>
</div>
<div class="pad ach-grid" style="padding-top:0;padding-bottom:14px;cursor:pointer;" onclick="go('screen-achievements')">
<div class="ach"><div class="medal"><svg class="ic" style="color:var(--accent)"><use href="#i-medal"/></svg></div><span class="nm">一周不断</span></div>
<div class="ach"><div class="medal"><svg class="ic" style="color:#5b86b3"><use href="#i-rain"/></svg></div><span class="nm">雨天战士</span></div>
<div class="ach"><div class="medal"><svg class="ic" style="color:var(--success)"><use href="#i-flag"/></svg></div><span class="nm">首遛</span></div>
<div class="ach locked"><div class="medal"><svg class="ic" style="color:var(--ink-3)"><use href="#i-lock"/></svg></div><span class="nm">未解锁</span></div>
</div>
<div class="row" style="padding:6px 16px 8px;justify-content:space-between;border-top:0.5px solid var(--line);">
<span style="font-size:13px;font-weight:600;">遛狗历史</span>
<span class="tiny" style="color:var(--accent-deep);cursor:pointer;" onclick="openSheet()">+ 补记</span>
</div>
<div class="pad" style="padding-top:0;display:flex;flex-direction:column;gap:8px;">
<div class="tiny muted" style="padding:2px;">本周</div>
<div class="hist-row" onclick="go('screen-summary')"><svg class="ic ti"><use href="#i-walk"/></svg><div style="flex:1;"><div style="font-size:13px;">今天 早上 · 豆豆</div><div class="tiny muted">12分34秒 · 1.2km · 3480狗步</div></div></div>
<div class="hist-row"><svg class="ic ti"><use href="#i-walk"/></svg><div style="flex:1;"><div style="font-size:13px;">昨天 傍晚 · 豆豆</div><div class="tiny muted">18分02秒 · 1.8km · 5100狗步</div></div></div>
<div class="hist-row" style="border:1px dashed var(--line-2);background:transparent;"><svg class="ic ti" style="color:var(--accent-deep)"><use href="#i-edit"/></svg><div style="flex:1;"><div style="font-size:13px;">前天 · 豆豆 <span class="badge" style="background:var(--surface-2);color:var(--ink-2);">补记</span></div><div class="tiny muted">15分00秒 · 距离未记录</div></div></div>
</div>
<div class="pad"><div class="anno"><b>注释:</b>「记录」Tab = 成就墙概览(横向)+ 遛狗历史。成就墙点任意处或「全部 3/12」→ 完整成就页。补记入口在此页和成就页都可达。这是左侧 Tab解决之前底部双「遛狗」重名问题。</div></div>
</div>
<div class="tabbar">
<div class="tab active" onclick="go('screen-records')"><svg class="ic" style="width:22px;height:22px;"><use href="#i-list"/></svg><span>记录</span></div>
<div class="tab-center"><div class="tab-fab" onclick="go('screen-walking')"><svg viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><use href="#i-walk"/></svg></div><span>遛狗</span></div>
<div class="tab" onclick="go('screen-home')"><svg class="ic" style="width:22px;height:22px;"><use href="#i-user"/></svg><span>我的</span></div>
</div>
</div>
<div class="frame-note">成就墙概览 → 完整成就页;「+ 补记」→ 补记弹层;历史项 → 回看成果卡。</div>
</div>
<!-- ============ FRAME 6b: 记录 Tab 空状态 ============ -->
<div class="frame-wrap">
<div class="frame-label"><span class="num">6b</span>记录 Tab · 空状态(新用户)</div>
<div class="phone" id="screen-records-empty">
<div class="statusbar"><span>9:41</span><div class="right"><span>●●●</span><span>5G</span><span>100%</span></div></div>
<div class="navbar">记录</div>
<div class="screen-body" style="display:flex;flex-direction:column;">
<div class="center" style="padding:40px 28px 24px;flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;">
<div style="width:84px;height:84px;border-radius:50%;background:var(--accent-soft);display:flex;align-items:center;justify-content:center;margin-bottom:18px;">
<svg class="ic" style="width:40px;height:40px;color:var(--accent-deep);stroke-width:1.6;"><use href="#i-paw"/></svg>
</div>
<div style="font-size:16px;font-weight:600;margin-bottom:8px;">豆豆已经在门口等了</div>
<div class="muted" style="font-size:13px;line-height:1.6;max-width:220px;">第一次遛狗,从下面那个橙色按钮开始。走完一程,这里就有它的第一条记录啦。</div>
<button class="btn primary" style="width:auto;padding:0 28px;margin-top:22px;" onclick="go('screen-walking')"><svg><use href="#i-walk"/></svg>带豆豆出门</button>
</div>
<div style="border-top:0.5px solid var(--line);">
<div class="row" style="padding:14px 16px 8px;justify-content:space-between;">
<span style="font-size:13px;font-weight:600;">成就墙</span><span class="tiny" style="color:var(--ink-3)">0 / 12 待解锁</span>
</div>
<div class="pad ach-grid" style="padding-top:0;padding-bottom:16px;">
<div class="ach locked"><div class="medal"><svg class="ic" style="color:var(--ink-3)"><use href="#i-flag"/></svg></div><span class="nm">首遛</span></div>
<div class="ach locked"><div class="medal"><svg class="ic" style="color:var(--ink-3)"><use href="#i-medal"/></svg></div><span class="nm">一周不断</span></div>
<div class="ach locked"><div class="medal"><svg class="ic" style="color:var(--ink-3)"><use href="#i-rain"/></svg></div><span class="nm">雨天战士</span></div>
<div class="ach locked"><div class="medal"><svg class="ic" style="color:var(--ink-3)"><use href="#i-lock"/></svg></div><span class="nm">还有 9 个</span></div>
</div>
</div>
<div class="pad" style="padding-top:0;"><div class="anno"><b>注释:</b>新用户第一次进「记录」Tab 的空状态。文案俏皮且把视线引向中央遛狗按钮,"带豆豆出门"按钮 = 第二条引导路径。成就墙不藏,显示全灰待解锁(含"首遛"),制造期待。遛完第一次即切换到正常态(第 6 屏)。</div></div>
</div>
<div class="tabbar">
<div class="tab active" onclick="go('screen-records')"><svg class="ic" style="width:22px;height:22px;"><use href="#i-list"/></svg><span>记录</span></div>
<div class="tab-center"><div class="tab-fab" onclick="go('screen-walking')"><svg viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><use href="#i-walk"/></svg></div><span>遛狗</span></div>
<div class="tab" onclick="go('screen-home')"><svg class="ic" style="width:22px;height:22px;"><use href="#i-user"/></svg><span>我的</span></div>
</div>
</div>
<div class="frame-note">遛完第一次 → 切换为正常态(第 6 屏)。「带豆豆出门」或中央按钮 → 开始遛狗。</div>
</div>
<!-- ============ FRAME 7: 完整成就页 ============ -->
<div class="frame-wrap">
<div class="frame-label"><span class="num">7</span>成就(完整页 · 两入口共用)</div>
<div class="phone" id="screen-achievements">
<div class="statusbar"><span>9:41</span><div class="right"><span>●●●</span><span>5G</span><span>100%</span></div></div>
<div class="navbar"><div class="nav-left" onclick="go('screen-records')"><svg class="ic" style="width:18px;height:18px;"><use href="#i-chev-l"/></svg></div>成就</div>
<div class="screen-body">
<div class="center" style="padding:16px;border-bottom:0.5px solid var(--line);">
<div style="font-size:30px;font-weight:600;font-variant-numeric:tabular-nums;">3<span class="muted" style="font-size:18px;"> / 12</span></div>
<div class="tiny muted">已解锁成就 · 豆豆</div>
</div>
<div class="section-title">已解锁</div>
<div class="pad" style="padding-top:0;display:flex;flex-direction:column;gap:8px;">
<div class="row card" style="padding:11px 12px;gap:11px;">
<div class="medal" style="width:42px;height:42px;border-radius:50%;background:var(--accent-soft);display:flex;align-items:center;justify-content:center;flex-shrink:0;"><svg class="ic" style="color:var(--accent-deep)"><use href="#i-medal"/></svg></div>
<div style="flex:1;"><div style="font-size:13px;font-weight:600;">一周不断</div><div class="tiny muted">连续遛狗满 7 天</div></div>
<span class="tiny muted">今天</span>
</div>
<div class="row card" style="padding:11px 12px;gap:11px;">
<div class="medal" style="width:42px;height:42px;border-radius:50%;background:#E3EBF2;display:flex;align-items:center;justify-content:center;flex-shrink:0;"><svg class="ic" style="color:#5b86b3"><use href="#i-rain"/></svg></div>
<div style="flex:1;"><div style="font-size:13px;font-weight:600;">雨天战士</div><div class="tiny muted">雨天也坚持遛狗</div></div>
<span class="tiny muted">3天前</span>
</div>
<div class="row card" style="padding:11px 12px;gap:11px;">
<div class="medal" style="width:42px;height:42px;border-radius:50%;background:var(--success-soft);display:flex;align-items:center;justify-content:center;flex-shrink:0;"><svg class="ic" style="color:var(--success)"><use href="#i-flag"/></svg></div>
<div style="flex:1;"><div style="font-size:13px;font-weight:600;">首遛</div><div class="tiny muted">第一次记录遛狗</div></div>
<span class="tiny muted">92天前</span>
</div>
</div>
<div class="section-title">未解锁</div>
<div class="pad" style="padding-top:0;display:flex;flex-direction:column;gap:8px;">
<div class="row card" style="padding:11px 12px;gap:11px;opacity:0.6;">
<div class="medal" style="width:42px;height:42px;border-radius:50%;background:var(--surface-2);display:flex;align-items:center;justify-content:center;flex-shrink:0;"><svg class="ic" style="color:var(--ink-3)"><use href="#i-trophy"/></svg></div>
<div style="flex:1;"><div style="font-size:13px;font-weight:600;">满月坚持</div><div class="tiny muted">连续遛狗满 30 天 · 还差 23 天</div></div>
</div>
<div class="row card" style="padding:11px 12px;gap:11px;opacity:0.6;">
<div class="medal" style="width:42px;height:42px;border-radius:50%;background:var(--surface-2);display:flex;align-items:center;justify-content:center;flex-shrink:0;"><svg class="ic" style="color:var(--ink-3)"><use href="#i-walk"/></svg></div>
<div style="flex:1;"><div style="font-size:13px;font-weight:600;">百里同行</div><div class="tiny muted">累计遛狗满 100 公里 · 还差 8 km</div></div>
</div>
<div class="row card" style="padding:11px 12px;gap:11px;opacity:0.6;">
<div class="medal" style="width:42px;height:42px;border-radius:50%;background:var(--surface-2);display:flex;align-items:center;justify-content:center;flex-shrink:0;"><svg class="ic" style="color:var(--ink-3)"><use href="#i-lock"/></svg></div>
<div style="flex:1;"><div style="font-size:13px;font-weight:600;">早起鸟</div><div class="tiny muted">在 7 点前遛狗 10 次</div></div>
</div>
</div>
<div class="pad"><div class="anno"><b>注释:</b>「记录」Tab 和「我的→成就」两个入口指向<b>同一页</b>,文案统一叫「成就」,避免用户误以为是两个东西。未解锁项显示进度(还差 X强化收集与坚持动机。成就基于「连续/累计/场景」而非「最多」。</div></div>
</div>
<div class="tabbar">
<div class="tab active" onclick="go('screen-records')"><svg class="ic" style="width:22px;height:22px;"><use href="#i-list"/></svg><span>记录</span></div>
<div class="tab-center"><div class="tab-fab" onclick="go('screen-walking')"><svg viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><use href="#i-walk"/></svg></div><span>遛狗</span></div>
<div class="tab" onclick="go('screen-home')"><svg class="ic" style="width:22px;height:22px;"><use href="#i-user"/></svg><span>我的</span></div>
</div>
</div>
<div class="frame-note">从「记录」Tab 或「我的→成就」均到达此页。返回回到来源页。</div>
</div>
</div>
<!-- SVG icon defs -->
<svg width="0" height="0" style="position:absolute;">
<defs>
<g id="i-walk"><path d="M13 4a1 1 0 1 0 0 2 1 1 0 0 0 0-2"/><path d="M7 21l2.5-7 2-2"/><path d="M11.5 12l1.5-4 3 2 2 1"/><path d="M9.5 7l3-1 2 3"/><path d="M14 14l1 7"/></g>
<g id="i-user"><circle cx="12" cy="8" r="4"/><path d="M5 21v-1a7 7 0 0 1 14 0v1"/></g>
<g id="i-dog"><path d="M11 5l-1-1-2 1v3l2 2"/><path d="M13 5l1-1 2 1v3l-2 2"/><path d="M8 10c-1 1-2 3-2 6 0 2 2 3 6 3s6-1 6-3c0-3-1-5-2-6"/><circle cx="10" cy="14" r="0.6" fill="currentColor"/><circle cx="14" cy="14" r="0.6" fill="currentColor"/><path d="M12 16v1"/></g>
<g id="i-chev-r"><path d="M9 6l6 6-6 6"/></g>
<g id="i-chev-l"><path d="M15 6l-6 6 6 6"/></g>
<g id="i-chev-d"><path d="M6 9l6 6 6-6"/></g>
<g id="i-plus"><path d="M12 5v14M5 12h14"/></g>
<g id="i-history"><path d="M3 12a9 9 0 1 0 3-6.7L3 8"/><path d="M3 4v4h4"/><path d="M12 8v4l3 2"/></g>
<g id="i-medal"><circle cx="12" cy="14" r="5"/><path d="M9 9L7 3h10l-2 6"/><path d="M12 12l1 2 2 .3-1.5 1.4.4 2-1.9-1-1.9 1 .4-2L9 14l2-.3z"/></g>
<g id="i-settings"><circle cx="12" cy="12" r="3"/><path d="M12 2v3M12 19v3M2 12h3M19 12h3M5 5l2 2M17 17l2 2M5 19l2-2M17 7l2-2"/></g>
<g id="i-map"><path d="M9 4L4 6v14l5-2 6 2 5-2V4l-5 2-6-2z"/><path d="M9 4v14M15 6v14"/></g>
<g id="i-poo"><path d="M9 21h6c2 0 3-1 3-2.5 0-1-.5-1.5-1-2 .5-.5 1-1 1-2s-1-2-2.5-2c.3-.5.5-1 .5-1.5 0-1.5-1.5-2.5-3-2.5-.5-2-2-3-3.5-2.5C8 4 7 5 7 6.5c-1.5.3-2.5 1.3-2.5 2.5 0 1 .5 1.7 1 2-1 .5-1.5 1.3-1.5 2.3 0 1 .7 1.7 1.5 2-.5.5-1 1-1 2C4.5 20 5.5 21 9 21z"/></g>
<g id="i-pause"><path d="M9 5v14M15 5v14"/></g>
<g id="i-play"><path d="M7 5l12 7-12 7z"/></g>
<g id="i-stop"><rect x="6" y="6" width="12" height="12" rx="2"/></g>
<g id="i-x"><path d="M6 6l12 12M18 6L6 18"/></g>
<g id="i-share"><path d="M4 12v7a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-7"/><path d="M12 3v13M8 7l4-4 4 4"/></g>
<g id="i-camera"><path d="M4 8h3l1.5-2h7L17 8h3v11H4z"/><circle cx="12" cy="13" r="3.5"/></g>
<g id="i-sun"><circle cx="12" cy="12" r="4"/><path d="M12 2v2M12 20v2M2 12h2M20 12h2M5 5l1.5 1.5M17.5 17.5L19 19M5 19l1.5-1.5M17.5 6.5L19 5"/></g>
<g id="i-heart"><path d="M12 20s-7-4.5-7-9.5C5 7 7 5.5 9 5.5c1.5 0 2.5 1 3 2 .5-1 1.5-2 3-2 2 0 4 1.5 4 5C19 15.5 12 20 12 20z"/></g>
<g id="i-rain"><path d="M6 14a4 4 0 0 1 .5-8 5 5 0 0 1 9.5 1 3.5 3.5 0 0 1 0 7"/><path d="M8 18l-1 2M12 18l-1 2M16 18l-1 2"/></g>
<g id="i-flag"><path d="M5 21V4M5 4h11l-2 4 2 4H5"/></g>
<g id="i-lock"><rect x="5" y="11" width="14" height="9" rx="2"/><path d="M8 11V8a4 4 0 0 1 8 0v3"/></g>
<g id="i-edit"><path d="M4 20h4L18 10l-4-4L4 16v4z"/><path d="M14 6l4 4"/></g>
<g id="i-list"><path d="M8 6h12M8 12h12M8 18h12M4 6h.01M4 12h.01M4 18h.01"/></g>
<g id="i-trophy"><path d="M7 4h10v4a5 5 0 0 1-10 0z"/><path d="M7 5H4v2a3 3 0 0 0 3 3M17 5h3v2a3 3 0 0 1-3 3"/><path d="M12 13v4M9 21h6M10 17h4l1 4H9z"/></g>
<g id="i-paw"><ellipse cx="12" cy="15" rx="4" ry="3.2"/><ellipse cx="7" cy="10" rx="1.6" ry="2.2"/><ellipse cx="11" cy="8" rx="1.6" ry="2.4"/><ellipse cx="15" cy="9" rx="1.6" ry="2.3"/><ellipse cx="17.5" cy="12.5" rx="1.5" ry="2"/></g>
<g id="i-wechat"><path d="M9 4C5 4 2 6.7 2 10c0 1.9 1 3.6 2.6 4.7L4 17l2.6-1.3c.8.2 1.6.3 2.4.3M16 9c3.3 0 6 2.2 6 5s-2.7 5-6 5c-.7 0-1.4-.1-2-.3L11 20l.5-2.2C10 16.8 10 15 10 14c0-2.8 2.7-5 6-5z"/><circle cx="7" cy="9" r="0.5" fill="currentColor"/><circle cx="11" cy="9" r="0.5" fill="currentColor"/><circle cx="14" cy="13" r="0.5" fill="currentColor"/><circle cx="18" cy="13" r="0.5" fill="currentColor"/></g>
<g id="i-camera-plus"><path d="M4 8h3l1.5-2h7L17 8h3v11H4z"/><circle cx="12" cy="13" r="3"/><path d="M12 11.5v3M10.5 13h3" stroke-width="1.4"/></g>
<g id="i-check"><path d="M5 13l4 4L19 7"/></g>
</defs>
</svg>
<script>
function go(id) {
document.getElementById(id).scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'center' });
const el = document.getElementById(id);
el.style.transition = 'box-shadow .3s';
el.style.boxShadow = '0 0 0 3px var(--accent), var(--shadow)';
setTimeout(()=> el.style.boxShadow = 'var(--shadow)', 900);
}
function openConfirm(){ document.getElementById('confirm-end').classList.add('show'); }
function closeConfirm(){ document.getElementById('confirm-end').classList.remove('show'); }
function openSheet(){ document.getElementById('sheet-add').classList.add('show'); }
function closeSheet(){ document.getElementById('sheet-add').classList.remove('show'); }
// 演示用:遛狗中计时器自增
let sec = 12*60+34;
setInterval(()=>{
sec++;
const m = String(Math.floor(sec/60)).padStart(2,'0');
const s = String(sec%60).padStart(2,'0');
const t = document.getElementById('live-timer');
if(t) t.textContent = m+':'+s;
}, 1000);
// chip 单选
document.querySelectorAll('.field .chips').forEach(group=>{
group.querySelectorAll('.chip').forEach(c=>{
c.addEventListener('click', ()=>{
group.querySelectorAll('.chip').forEach(x=>x.classList.remove('sel'));
c.classList.add('sel');
});
});
});
</script>
</body>
</html>