/* ============================================================ ROOY · 09 滑行历史 ─────────────────────────────────────────────────────────── 需求:生涯卡片 + 雪季分组列表。每条 = 日期 + 雪场 + 趟数 / 里 程 / 时长。当前雪季默认展开,往年默认折叠。 结构:NavBar → 生涯黑卡 hero(avatar + name + 累计里程 italic) → 3 列累计 strip(在 hero 内)→ 雪季分组(年份 + 汇总行 + 可展 开的当日记录列表)。 italic anchor:累计里程数字(hero 内)—— 跟 Home 的"天数"互补, 两屏都用 italic 但不会同屏出现。 ============================================================ */ function HistoryScreen({ onNav }) { const [openSeasons, setOpenSeasons] = React.useState({ '25-26': true }); const seasons = [ { id: '25-26', year: '2025 — 26', summary: '12 天 | 64.8 km | 最爱 Zermatt', days: [ { date: '4.30', place: 'Zermatt', runs: 13, km: 8.4, time: '2:18 h', lesson: true }, { date: '4.22', place: 'Verbier', runs: 9, km: 6.2, time: '1:42 h', lesson: false }, { date: '4.18', place: 'Zermatt', runs: 11, km: 7.1, time: '2:04 h', lesson: true }, { date: '4.10', place: 'Saas-Fee', runs: 7, km: 4.6, time: '1:18 h', lesson: false }, { date: '3.16', place: 'Zermatt', runs: 14, km: 9.8, time: '2:42 h', lesson: true }, ], }, { id: '24-25', year: '2024 — 25', summary: '8 天 | 42.8 km | 最爱 万龙', days: [ { date: '3.04', place: '万龙雪场', runs: 12, km: 7.4, time: '3:12 h', lesson: true }, { date: '2.18', place: '万龙雪场', runs: 9, km: 5.8, time: '2:38 h', lesson: false }, { date: '1.25', place: '南山雪场', runs: 7, km: 4.2, time: '1:46 h', lesson: false }, ], }, { id: '23-24', year: '2023 — 24', summary: '4 天 | 18.2 km | 最爱 南山', days: [], }, ]; return (
onNav && onNav('home')} title="滑行历史"/>
{/* Career hero — v6 · dark editorial card. italic anchor on cumulative km (187). The year list below is the per-season detail; the hero only carries the lifetime totals. Tap → 当季雪季汇总 (08). */}
onNav && onNav('season')} style={{ borderRadius: B.hero, padding: '22px 22px 22px', background: R.ink, color: '#fff', cursor: 'pointer', position: 'relative', overflow: 'hidden', boxShadow: Shadow.hero, }}> {/* two-line topography — softened so it sits as background texture rather than competing with the italic anchor */}

生涯总览

24
{/* Seasons */} {seasons.map((s, si) => { const open = openSeasons[s.id]; return (
setOpenSeasons({ ...openSeasons, [s.id]: !open })} style={{ padding: '0 22px', display: 'flex', alignItems: 'center', cursor: 'pointer', gap: 12, }}>
{s.year}

{s.summary.split(' | ').map((part, i, arr) => ( {part} {i < arr.length - 1 && |} ))}

{open && s.days.length > 0 && (
{s.days.map((d, i) => ( onNav && onNav('daily')}/> ))}
)}
); })}
); } /* CareerStat — secondary stat cell inside the dark career hero. Used as a 3-up strip under the italic anchor. */ function CareerStat({ l, v, u }) { return (

{l}

{v} {u && {u}}
); } /* DayRow — 单日记录行:左 date pill (月/日) + 中 place + meta (趟 数 / 里程 / 时长 vertical-bar 分隔). lesson flag 是 pill 角上的 ROOY 绿小点,不放文字标签。 */ function DayRow({ day, onClick }) { const [month, dayNum] = day.date.split('.'); return (
{month} 月 {dayNum} {day.lesson && ( )}

{day.place}

{day.runs} 趟 | {day.km} km | {day.time}

); } Object.assign(window, { HistoryScreen });