/* ============================================================ ROOY · 08 雪季汇总 ─────────────────────────────────────────────────────────── 需求:一个雪季的 editorial summary,杂志式排版。 结构:NavBar → italic 12 天 hero(vivid cobalt,no black card) + 跟上季 delta → 4 stat row(里程/垂降/时长/心流)→ 高光时刻 → 最常去 / 雪况 / 模式分布 → ROOY 见证(该季成就 rail)。 italic anchor:12(滑行天数 hero)。data 蓝撑住 hero。 ⚠ 编辑性 inline label("SEASON · 2025" / "DAYS" / "ON SNOW" 等 uppercase + tracking 英文)**仅在本屏出现**。其他屏 eyebrow 已 全部去 uppercase + tracking 回归 CN-iOS 标准。本屏 inline 风格 也是为什么这里 hero 不用黑卡 —— 黑卡是 Home 雪季叙事的位置, 08 是 editorial 复盘,是两种语言。 ============================================================ */ function SeasonScreenB({ onNav }) { return (
onNav && onNav('history')} title="雪季汇总" right={( )} />
{/* ── HERO · 纯排版 ────────────────────────── */}

SEASON · 2025

12
DAYS ON SNOW

较上季同期 ↑ 4 天

{/* ── STAT ROWS · hairline rows (padded, not full-bleed) ── */}
{/* ── 最常去 · 高光前的独立 section ───────── */} 最常去

Zermatt.

瑞士阿尔卑斯 · 3 820 m

7

38 h

{/* ── 高光时刻 ──────────────────────────── */} 高光时刻
{/* ── 雪况 + 滑行模式 · 两个独立图表,eyebrow 承担小标识 ── */} 雪况
滑行模式
{/* ── ROOY 见证 ────────────────────────── */} {}} > ROOY 见证
{[ { n: '首破 40°', d: '4 月 30 日', kind: 'trophy', hi: true }, { n: '生涯 100 km', d: '4 月 22 日', kind: 'flag' }, { n: '刃滑 I', d: '4 月 18 日', kind: 'medal' }, { n: '平行式', d: '4 月 10 日', kind: 'flag' }, ].map((m, i, arr) => (
{}} style={{ flexShrink: 0, width: 148, minHeight: 124, padding: '16px 16px', borderRadius: B.card, background: R.card, cursor: 'pointer', marginRight: i === arr.length - 1 ? 16 : 0, border: m.hi ? `1px solid ${R.gold}33` : 'none', }}>
{m.kind === 'trophy' && } {m.kind === 'flag' && } {m.kind === 'medal' && }

{m.n}

{m.d}

))}
); } /* B-prefix helpers — self-contained for 08b. */ function BStatRow({ label, value, unit, first, valueColor }) { return (
{label}
{value} {unit && ( {unit} )}
); } function BRecordRow({ label, value, unit, where, when, first }) { return (

{label}

{where} · {when}

{value} {unit && ( {unit} )}
); } function BSnowMix({ items }) { return (
{items.map((it, i) => (
))}
{items.map((it, i) => (
{it.label} {it.pct}%
))}
); } function BModeSplit({ free, lesson }) { return (
{free} %

自由滑行

{lesson} %

跟 ROOY 上课

); } Object.assign(window, { SeasonScreenB, BStatRow, BRecordRow, BSnowMix, BModeSplit, });