Last active
May 23, 2026 13:45
-
-
Save milushov/b4a8a1b1c1c9850edaa728a2216115ce to your computer and use it in GitHub Desktop.
Lapster — Notifications color direction (3 token-only variants, light + dark)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <!DOCTYPE html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8" /> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | |
| <title>Lapster — Notifications Color Proposals</title> | |
| <style> | |
| /* ---------- LapsterTheme tokens (mirrored from ios/Lapster/Common/Theme/LapsterTheme.swift) ---------- */ | |
| :root { | |
| /* Light scheme */ | |
| --surfacePrimary: #FFFFFF; | |
| --surfaceGrouped: #F2F2F7; | |
| --surfaceSecondary: #FFFFFF; | |
| --surfaceTertiary: #F2F2F7; | |
| --surfaceElevated: #FFFFFF; | |
| --surfaceQuiet: #F2F2F7; /* systemGray6 */ | |
| --surfaceMuted: #E5E5EA; /* systemGray5 */ | |
| --surfaceFaint: #D1D1D6; /* systemGray4 */ | |
| --surfaceInverse: #1C1C1E; /* near-black in light */ | |
| --surfaceInverseQuiet: #2C2C2E; | |
| --contentPrimary: #000000; | |
| --contentSecondary: rgba(60,60,67,.60); | |
| --contentTertiary: rgba(60,60,67,.30); | |
| --contentInverse: #FFFFFF; | |
| --contentInverseSecondary: rgba(235,235,245,.60); | |
| --divider: rgba(60,60,67,.29); | |
| --accent: #007AFF; | |
| --success: #34C759; | |
| --warning: #FF9500; | |
| --error: #FF3B30; | |
| --info: #007AFF; | |
| --bestLap: #FF3B30; | |
| --bestLapRowTint: rgba(255,59,48,.05); | |
| /* Spacing & radius */ | |
| --sp-xs: 4px; --sp-sm: 8px; --sp-md: 12px; --sp-lg: 16px; --sp-xl: 20px; | |
| --r-sm: 8px; --r-md: 12px; --r-lg: 16px; | |
| --opacity-iconBg: 0.12; | |
| --opacity-subtle: 0.10; | |
| --opacity-verySubtle: 0.05; | |
| --font-sans: -apple-system, BlinkMacSystemFont, "SF Pro Text", "SF Pro", "Helvetica Neue", system-ui, sans-serif; | |
| } | |
| /* ---------- Page chrome ---------- */ | |
| * { box-sizing: border-box; } | |
| html, body { | |
| margin: 0; | |
| font-family: var(--font-sans); | |
| color: #111; | |
| background: #FAFAFB; | |
| -webkit-font-smoothing: antialiased; | |
| text-rendering: optimizeLegibility; | |
| } | |
| body { padding: 40px 24px 80px; } | |
| .page-header { | |
| max-width: 1280px; | |
| margin: 0 auto 32px; | |
| } | |
| .page-header h1 { | |
| font-size: 28px; | |
| margin: 0 0 8px; | |
| letter-spacing: -0.02em; | |
| font-weight: 700; | |
| } | |
| .page-header p { | |
| margin: 0; | |
| color: #555; | |
| font-size: 15px; | |
| line-height: 1.5; | |
| max-width: 760px; | |
| } | |
| .legend { | |
| max-width: 1280px; | |
| margin: 24px auto 32px; | |
| display: grid; | |
| grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); | |
| gap: 12px; | |
| } | |
| .legend-card { | |
| background: #fff; | |
| border: 1px solid #EEE; | |
| border-radius: 12px; | |
| padding: 14px 16px; | |
| font-size: 13px; | |
| line-height: 1.5; | |
| } | |
| .legend-card b { display: block; font-size: 13.5px; margin-bottom: 4px; } | |
| .legend-card .swatch-row { display: flex; gap: 6px; margin-top: 8px; flex-wrap: wrap; } | |
| .swatch { | |
| display: inline-block; | |
| width: 18px; height: 18px; | |
| border-radius: 4px; | |
| border: 1px solid rgba(0,0,0,.08); | |
| } | |
| /* ---------- Variant grid ---------- */ | |
| .variants { | |
| max-width: 1280px; | |
| margin: 0 auto; | |
| display: grid; | |
| grid-template-columns: repeat(3, 1fr); | |
| gap: 28px; | |
| } | |
| @media (max-width: 1100px) { .variants { grid-template-columns: 1fr; } } | |
| .variant { | |
| background: #FFFFFF; | |
| border-radius: 20px; | |
| padding: 20px; | |
| border: 1px solid #ECECEE; | |
| } | |
| .variant h2 { | |
| font-size: 18px; | |
| margin: 0 0 4px; | |
| letter-spacing: -0.01em; | |
| } | |
| .variant .tag { font-size: 12px; color: #888; margin-bottom: 14px; } | |
| .phones { display: flex; flex-direction: column; gap: 16px; } | |
| /* ---------- "Phone" frames ---------- */ | |
| .phone { | |
| border-radius: 28px; | |
| padding: 14px; | |
| border: 1px solid var(--divider); | |
| background: var(--surfaceGrouped); | |
| overflow: hidden; | |
| color: var(--contentPrimary); | |
| } | |
| .phone.dark { | |
| --surfacePrimary: #000000; | |
| --surfaceGrouped: #000000; | |
| --surfaceSecondary: #1C1C1E; | |
| --surfaceTertiary: #2C2C2E; | |
| --surfaceElevated: #1C1C1E; | |
| --surfaceQuiet: #1C1C1E; | |
| --surfaceMuted: #2C2C2E; | |
| --surfaceFaint: #3A3A3C; | |
| --surfaceInverse: #FFFFFF; | |
| --surfaceInverseQuiet: #EBEBF0; | |
| --contentPrimary: #FFFFFF; | |
| --contentSecondary: rgba(235,235,245,.60); | |
| --contentTertiary: rgba(235,235,245,.30); | |
| --contentInverse: #000000; | |
| --contentInverseSecondary: rgba(60,60,67,.60); | |
| --divider: rgba(84,84,88,.65); | |
| --bestLapRowTint: rgba(255,69,58,.08); | |
| } | |
| .phone-bar { | |
| display: flex; align-items: center; justify-content: space-between; | |
| padding: 4px 6px 12px; | |
| font-size: 17px; | |
| font-weight: 600; | |
| letter-spacing: -0.01em; | |
| } | |
| .phone-bar .x { | |
| width: 28px; height: 28px; | |
| border-radius: 50%; | |
| background: var(--surfaceQuiet); | |
| color: var(--contentSecondary); | |
| font-size: 14px; | |
| display: flex; align-items: center; justify-content: center; | |
| } | |
| .phone-list { | |
| background: var(--surfaceSecondary); | |
| border-radius: 14px; | |
| overflow: hidden; | |
| } | |
| /* ---------- Notification row (shared) ---------- */ | |
| .row { | |
| display: flex; | |
| align-items: flex-start; | |
| gap: 12px; | |
| padding: 12px 14px; | |
| border-bottom: 0.5px solid var(--divider); | |
| } | |
| .row:last-child { border-bottom: none; } | |
| .icon-tile { | |
| flex: 0 0 36px; | |
| width: 36px; height: 36px; | |
| border-radius: 12px; | |
| display: flex; align-items: center; justify-content: center; | |
| font-size: 16px; | |
| position: relative; | |
| } | |
| .avatar { | |
| flex: 0 0 36px; | |
| width: 36px; height: 36px; | |
| border-radius: 50%; | |
| display: flex; align-items: center; justify-content: center; | |
| color: #fff; font-size: 14px; font-weight: 700; | |
| background: linear-gradient(135deg, #4F46E5, #EC4899); | |
| } | |
| .avatar.a2 { background: linear-gradient(135deg, #0EA5E9, #6366F1); } | |
| .avatar.a3 { background: linear-gradient(135deg, #F59E0B, #EF4444); } | |
| .avatar.a4 { background: linear-gradient(135deg, #10B981, #06B6D4); } | |
| .avatar.a5 { background: linear-gradient(135deg, #8B5CF6, #EC4899); } | |
| .avatar.a6 { background: linear-gradient(135deg, #14B8A6, #4F46E5); } | |
| .body { flex: 1; min-width: 0; } | |
| .msg { | |
| font-size: 14.5px; | |
| line-height: 1.35; | |
| color: var(--contentPrimary); | |
| margin: 0 0 3px; | |
| } | |
| .msg b { font-weight: 600; } | |
| .meta { | |
| font-size: 12px; | |
| color: var(--contentSecondary); | |
| } | |
| .meta .dot { | |
| display: inline-block; | |
| width: 4px; height: 4px; | |
| background: var(--contentTertiary); | |
| border-radius: 50%; | |
| margin: 0 6px; | |
| vertical-align: middle; | |
| } | |
| .unread-dot { | |
| width: 8px; height: 8px; | |
| border-radius: 50%; | |
| margin-top: 14px; | |
| flex: 0 0 8px; | |
| } | |
| /* SF Symbols via SVG (system-style icons) */ | |
| .icn { | |
| width: 18px; height: 18px; | |
| stroke-width: 1.7; | |
| stroke: currentColor; | |
| fill: none; | |
| stroke-linecap: round; stroke-linejoin: round; | |
| } | |
| .icn.solid { fill: currentColor; stroke: none; } | |
| /* ---------- Variant A: Monochrome Calm ---------- */ | |
| .v-a .icon-tile { | |
| background: var(--surfaceQuiet); | |
| color: var(--contentSecondary); | |
| } | |
| .v-a .icon-tile .pip { | |
| position: absolute; | |
| bottom: -2px; right: -2px; | |
| width: 12px; height: 12px; | |
| border-radius: 50%; | |
| border: 2px solid var(--surfaceSecondary); | |
| } | |
| .v-a .pip.social { background: var(--accent); } | |
| .v-a .pip.performance { background: var(--bestLap); } | |
| .v-a .pip.sharing { background: var(--contentSecondary); } | |
| .v-a .pip.teams { background: var(--success); } | |
| .v-a .pip.story { background: var(--warning); } | |
| .v-a .unread-dot { background: var(--contentPrimary); } | |
| /* ---------- Variant B: Semantic Tints (4 buckets, theme-derived) ---------- */ | |
| .v-b .icon-tile.social { background: rgba(0,122,255,.10); color: var(--accent); } | |
| .v-b .icon-tile.performance { background: var(--bestLapRowTint); color: var(--bestLap); } | |
| .v-b .icon-tile.sharing { background: var(--surfaceMuted); color: var(--contentPrimary); } | |
| .v-b .icon-tile.teams { background: rgba(52,199,89,.12); color: var(--success); } | |
| .v-b .icon-tile.story { background: rgba(255,149,0,.12); color: var(--warning); } | |
| .v-b .unread-dot.social { background: var(--accent); } | |
| .v-b .unread-dot.performance { background: var(--bestLap); } | |
| .v-b .unread-dot.sharing { background: var(--contentSecondary); } | |
| .v-b .unread-dot.teams { background: var(--success); } | |
| .v-b .unread-dot.story { background: var(--warning); } | |
| /* ---------- Variant C: Inverse Hero — neutral default + loud-without-chroma for moments ---------- */ | |
| .v-c .icon-tile { | |
| background: var(--surfaceQuiet); | |
| color: var(--contentSecondary); | |
| } | |
| .v-c .row.hero { | |
| background: var(--bestLapRowTint); | |
| } | |
| .v-c .row.hero .icon-tile { | |
| background: var(--surfaceInverse); | |
| color: var(--contentInverse); | |
| } | |
| .v-c .unread-dot { background: var(--contentPrimary); } | |
| .v-c .row.hero .unread-dot { background: var(--bestLap); } | |
| /* Token call-out */ | |
| .tokens { | |
| margin-top: 24px; | |
| padding: 14px; | |
| background: #FAFAFB; | |
| border-radius: 10px; | |
| font: 12px/1.5 ui-monospace, SFMono-Regular, Menlo, monospace; | |
| color: #444; | |
| } | |
| .tokens b { color: #111; } | |
| .scheme-label { | |
| font-size: 11px; | |
| color: #999; | |
| text-transform: uppercase; | |
| letter-spacing: 0.06em; | |
| margin: 6px 0 4px 4px; | |
| } | |
| /* Compare row at the bottom */ | |
| .compare { | |
| max-width: 1280px; | |
| margin: 48px auto 0; | |
| padding: 20px; | |
| border-radius: 20px; | |
| background: #FFFFFF; | |
| border: 1px solid #ECECEE; | |
| } | |
| .compare h2 { margin: 0 0 8px; font-size: 18px; } | |
| .compare p { margin: 0 0 16px; color: #555; font-size: 14px; } | |
| .compare-grid { | |
| display: grid; grid-template-columns: 1fr 1fr; gap: 18px; | |
| } | |
| .compare-card { border-radius: 14px; overflow: hidden; border: 1px solid #ECECEE; } | |
| .compare-card h3 { | |
| margin: 0; padding: 10px 14px; | |
| font-size: 13px; color: #555; | |
| background: #FAFAFB; border-bottom: 1px solid #ECECEE; | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <div class="page-header"> | |
| <h1>Notifications — Color Direction</h1> | |
| <p> | |
| Today's screen paints <b>12 different saturated system colors</b> (blue, purple, green, orange, yellow, cyan, pink, red, mint, teal, indigo, gray) — one per action. That's the "rainbow" feel. | |
| Below are three token-only directions, all using <b>LapsterTheme</b> only. Each is rendered in light + dark to verify both schemes survive (per the LapsterTheme rule). | |
| </p> | |
| </div> | |
| <div class="legend"> | |
| <div class="legend-card"> | |
| <b>Variant A — Monochrome Calm</b> | |
| Neutral icon tiles, tiny semantic pip on the corner to encode meaning. Quietest, very premium. | |
| <div class="swatch-row"> | |
| <span class="swatch" style="background:#F2F2F7"></span> | |
| <span class="swatch" style="background:#007AFF"></span> | |
| <span class="swatch" style="background:#FF3B30"></span> | |
| <span class="swatch" style="background:#34C759"></span> | |
| <span class="swatch" style="background:#FF9500"></span> | |
| </div> | |
| </div> | |
| <div class="legend-card"> | |
| <b>Variant B — Semantic Tints (4 buckets)</b> | |
| Group by meaning, not per-action. Each bucket gets one muted theme tint at 10–12% opacity. | |
| <div class="swatch-row"> | |
| <span class="swatch" style="background:rgba(0,122,255,.10)"></span> | |
| <span class="swatch" style="background:rgba(255,59,48,.10)"></span> | |
| <span class="swatch" style="background:#E5E5EA"></span> | |
| <span class="swatch" style="background:rgba(52,199,89,.12)"></span> | |
| <span class="swatch" style="background:rgba(255,149,0,.12)"></span> | |
| </div> | |
| </div> | |
| <div class="legend-card"> | |
| <b>Variant C — Inverse Hero</b> | |
| Everyday rows are neutral. Special moments (PB, tier-up, shared) use <code>surfaceInverse + contentInverse</code> — loud without chroma. Matches the new session header. | |
| <div class="swatch-row"> | |
| <span class="swatch" style="background:#F2F2F7"></span> | |
| <span class="swatch" style="background:#1C1C1E"></span> | |
| <span class="swatch" style="background:rgba(255,59,48,.05)"></span> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="variants"> | |
| <!-- ===================== VARIANT A ===================== --> | |
| <div class="variant v-a"> | |
| <h2>A · Monochrome Calm</h2> | |
| <div class="tag">Neutral tile · semantic pip · contentPrimary unread dot</div> | |
| <div class="phones"> | |
| <div class="scheme-label">Light</div> | |
| <div class="phone"> | |
| <div class="phone-bar"><span>Notifications</span><span class="x">×</span></div> | |
| <div class="phone-list"> | |
| <div class="row"> | |
| <div class="icon-tile"> | |
| <svg class="icn solid" viewBox="0 0 24 24"><path d="M12 12a4 4 0 100-8 4 4 0 000 8zm-7 8a7 7 0 0114 0H5z"/></svg> | |
| <span class="pip social"></span> | |
| </div> | |
| <div class="avatar">M</div> | |
| <div class="body"> | |
| <p class="msg"><b>Maya</b> started following you</p> | |
| <div class="meta">2 min ago</div> | |
| </div> | |
| <div class="unread-dot"></div> | |
| </div> | |
| <div class="row"> | |
| <div class="icon-tile"> | |
| <svg class="icn solid" viewBox="0 0 24 24"><path d="M12 2l2.6 6.6L22 9.3l-5.5 4.7L18 22l-6-3.4L6 22l1.5-8L2 9.3l7.4-.7z"/></svg> | |
| <span class="pip performance"></span> | |
| </div> | |
| <div class="avatar a2">A</div> | |
| <div class="body"> | |
| <p class="msg">Personal best at <b>Sentul</b> — 1:43.812</p> | |
| <div class="meta">14 min ago</div> | |
| </div> | |
| <div class="unread-dot"></div> | |
| </div> | |
| <div class="row"> | |
| <div class="icon-tile"> | |
| <svg class="icn solid" viewBox="0 0 24 24"><path d="M22 2L11 13M22 2l-7 20-4-9-9-4z"/></svg> | |
| <span class="pip sharing"></span> | |
| </div> | |
| <div class="avatar a3">D</div> | |
| <div class="body"> | |
| <p class="msg"><b>Dani</b> shared a session with you</p> | |
| <div class="meta">1 h ago</div> | |
| </div> | |
| </div> | |
| <div class="row"> | |
| <div class="icon-tile"> | |
| <svg class="icn solid" viewBox="0 0 24 24"><circle cx="9" cy="8" r="3"/><circle cx="17" cy="8" r="3"/><path d="M2 21a7 7 0 0114 0H2zm12 0a7 7 0 018-7"/></svg> | |
| <span class="pip teams"></span> | |
| </div> | |
| <div class="avatar a4">R</div> | |
| <div class="body"> | |
| <p class="msg"><b>Apex Racing</b> invited you to join</p> | |
| <div class="meta">3 h ago</div> | |
| </div> | |
| </div> | |
| <div class="row"> | |
| <div class="icon-tile"> | |
| <svg class="icn solid" viewBox="0 0 24 24"><path d="M21 15a4 4 0 01-4 4H7l-4 4V5a4 4 0 014-4h10a4 4 0 014 4z"/></svg> | |
| <span class="pip social"></span> | |
| </div> | |
| <div class="avatar a5">K</div> | |
| <div class="body"> | |
| <p class="msg"><b>Kai</b> replied to your comment</p> | |
| <div class="meta">Yesterday</div> | |
| </div> | |
| </div> | |
| <div class="row"> | |
| <div class="icon-tile"> | |
| <svg class="icn solid" viewBox="0 0 24 24"><path d="M23 19a2 2 0 01-2 2H3a2 2 0 01-2-2V8a2 2 0 012-2h4l2-3h6l2 3h4a2 2 0 012 2z"/><circle cx="12" cy="13" r="4" fill="none" stroke="currentColor"/></svg> | |
| <span class="pip story"></span> | |
| </div> | |
| <div class="avatar a6">N</div> | |
| <div class="body"> | |
| <p class="msg"><b>Nadia</b> reacted ❤️ to your story</p> | |
| <div class="meta">2 days ago</div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="scheme-label">Dark</div> | |
| <div class="phone dark"> | |
| <div class="phone-bar"><span>Notifications</span><span class="x">×</span></div> | |
| <div class="phone-list"> | |
| <div class="row"> | |
| <div class="icon-tile"><svg class="icn solid" viewBox="0 0 24 24"><path d="M12 12a4 4 0 100-8 4 4 0 000 8zm-7 8a7 7 0 0114 0H5z"/></svg><span class="pip social"></span></div> | |
| <div class="avatar">M</div> | |
| <div class="body"><p class="msg"><b>Maya</b> started following you</p><div class="meta">2 min ago</div></div> | |
| <div class="unread-dot"></div> | |
| </div> | |
| <div class="row"> | |
| <div class="icon-tile"><svg class="icn solid" viewBox="0 0 24 24"><path d="M12 2l2.6 6.6L22 9.3l-5.5 4.7L18 22l-6-3.4L6 22l1.5-8L2 9.3l7.4-.7z"/></svg><span class="pip performance"></span></div> | |
| <div class="avatar a2">A</div> | |
| <div class="body"><p class="msg">Personal best at <b>Sentul</b> — 1:43.812</p><div class="meta">14 min ago</div></div> | |
| <div class="unread-dot"></div> | |
| </div> | |
| <div class="row"> | |
| <div class="icon-tile"><svg class="icn solid" viewBox="0 0 24 24"><path d="M22 2L11 13M22 2l-7 20-4-9-9-4z"/></svg><span class="pip sharing"></span></div> | |
| <div class="avatar a3">D</div> | |
| <div class="body"><p class="msg"><b>Dani</b> shared a session with you</p><div class="meta">1 h ago</div></div> | |
| </div> | |
| <div class="row"> | |
| <div class="icon-tile"><svg class="icn solid" viewBox="0 0 24 24"><circle cx="9" cy="8" r="3"/><circle cx="17" cy="8" r="3"/><path d="M2 21a7 7 0 0114 0H2zm12 0a7 7 0 018-7"/></svg><span class="pip teams"></span></div> | |
| <div class="avatar a4">R</div> | |
| <div class="body"><p class="msg"><b>Apex Racing</b> invited you to join</p><div class="meta">3 h ago</div></div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="tokens"> | |
| <b>Tile bg:</b> Colors.surfaceQuiet<br/> | |
| <b>Icon:</b> Colors.contentSecondary<br/> | |
| <b>Pip (5 categories):</b> accent · bestLap · contentSecondary · success · warning<br/> | |
| <b>Unread dot:</b> Colors.contentPrimary | |
| </div> | |
| </div> | |
| <!-- ===================== VARIANT B ===================== --> | |
| <div class="variant v-b"> | |
| <h2>B · Semantic Tints</h2> | |
| <div class="tag">4 muted buckets · same color owns tile + unread dot</div> | |
| <div class="phones"> | |
| <div class="scheme-label">Light</div> | |
| <div class="phone"> | |
| <div class="phone-bar"><span>Notifications</span><span class="x">×</span></div> | |
| <div class="phone-list"> | |
| <div class="row"> | |
| <div class="icon-tile social"><svg class="icn solid" viewBox="0 0 24 24"><path d="M12 12a4 4 0 100-8 4 4 0 000 8zm-7 8a7 7 0 0114 0H5z"/></svg></div> | |
| <div class="avatar">M</div> | |
| <div class="body"> | |
| <p class="msg"><b>Maya</b> started following you</p> | |
| <div class="meta">2 min ago</div> | |
| </div> | |
| <div class="unread-dot social"></div> | |
| </div> | |
| <div class="row"> | |
| <div class="icon-tile performance"><svg class="icn solid" viewBox="0 0 24 24"><path d="M12 2l2.6 6.6L22 9.3l-5.5 4.7L18 22l-6-3.4L6 22l1.5-8L2 9.3l7.4-.7z"/></svg></div> | |
| <div class="avatar a2">A</div> | |
| <div class="body"> | |
| <p class="msg">Personal best at <b>Sentul</b> — 1:43.812</p> | |
| <div class="meta">14 min ago</div> | |
| </div> | |
| <div class="unread-dot performance"></div> | |
| </div> | |
| <div class="row"> | |
| <div class="icon-tile sharing"><svg class="icn solid" viewBox="0 0 24 24"><path d="M22 2L11 13M22 2l-7 20-4-9-9-4z"/></svg></div> | |
| <div class="avatar a3">D</div> | |
| <div class="body"> | |
| <p class="msg"><b>Dani</b> shared a session with you</p> | |
| <div class="meta">1 h ago</div> | |
| </div> | |
| </div> | |
| <div class="row"> | |
| <div class="icon-tile teams"><svg class="icn solid" viewBox="0 0 24 24"><circle cx="9" cy="8" r="3"/><circle cx="17" cy="8" r="3"/><path d="M2 21a7 7 0 0114 0H2zm12 0a7 7 0 018-7"/></svg></div> | |
| <div class="avatar a4">R</div> | |
| <div class="body"> | |
| <p class="msg"><b>Apex Racing</b> invited you to join</p> | |
| <div class="meta">3 h ago</div> | |
| </div> | |
| </div> | |
| <div class="row"> | |
| <div class="icon-tile social"><svg class="icn solid" viewBox="0 0 24 24"><path d="M21 15a4 4 0 01-4 4H7l-4 4V5a4 4 0 014-4h10a4 4 0 014 4z"/></svg></div> | |
| <div class="avatar a5">K</div> | |
| <div class="body"> | |
| <p class="msg"><b>Kai</b> replied to your comment</p> | |
| <div class="meta">Yesterday</div> | |
| </div> | |
| </div> | |
| <div class="row"> | |
| <div class="icon-tile story"><svg class="icn solid" viewBox="0 0 24 24"><path d="M23 19a2 2 0 01-2 2H3a2 2 0 01-2-2V8a2 2 0 012-2h4l2-3h6l2 3h4a2 2 0 012 2z"/><circle cx="12" cy="13" r="4" fill="none" stroke="currentColor"/></svg></div> | |
| <div class="avatar a6">N</div> | |
| <div class="body"> | |
| <p class="msg"><b>Nadia</b> reacted ❤️ to your story</p> | |
| <div class="meta">2 days ago</div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="scheme-label">Dark</div> | |
| <div class="phone dark"> | |
| <div class="phone-bar"><span>Notifications</span><span class="x">×</span></div> | |
| <div class="phone-list"> | |
| <div class="row"> | |
| <div class="icon-tile social"><svg class="icn solid" viewBox="0 0 24 24"><path d="M12 12a4 4 0 100-8 4 4 0 000 8zm-7 8a7 7 0 0114 0H5z"/></svg></div> | |
| <div class="avatar">M</div> | |
| <div class="body"><p class="msg"><b>Maya</b> started following you</p><div class="meta">2 min ago</div></div> | |
| <div class="unread-dot social"></div> | |
| </div> | |
| <div class="row"> | |
| <div class="icon-tile performance"><svg class="icn solid" viewBox="0 0 24 24"><path d="M12 2l2.6 6.6L22 9.3l-5.5 4.7L18 22l-6-3.4L6 22l1.5-8L2 9.3l7.4-.7z"/></svg></div> | |
| <div class="avatar a2">A</div> | |
| <div class="body"><p class="msg">Personal best at <b>Sentul</b> — 1:43.812</p><div class="meta">14 min ago</div></div> | |
| <div class="unread-dot performance"></div> | |
| </div> | |
| <div class="row"> | |
| <div class="icon-tile sharing"><svg class="icn solid" viewBox="0 0 24 24"><path d="M22 2L11 13M22 2l-7 20-4-9-9-4z"/></svg></div> | |
| <div class="avatar a3">D</div> | |
| <div class="body"><p class="msg"><b>Dani</b> shared a session with you</p><div class="meta">1 h ago</div></div> | |
| </div> | |
| <div class="row"> | |
| <div class="icon-tile teams"><svg class="icn solid" viewBox="0 0 24 24"><circle cx="9" cy="8" r="3"/><circle cx="17" cy="8" r="3"/><path d="M2 21a7 7 0 0114 0H2zm12 0a7 7 0 018-7"/></svg></div> | |
| <div class="avatar a4">R</div> | |
| <div class="body"><p class="msg"><b>Apex Racing</b> invited you to join</p><div class="meta">3 h ago</div></div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="tokens"> | |
| <b>Social</b> (follow/comment/mention/reply): accent @ 10%<br/> | |
| <b>Performance</b> (PB, tier-up, new session): bestLapRowTint (red @ 5%)<br/> | |
| <b>Sharing</b> (shared session/lap, invite accepted): surfaceMuted<br/> | |
| <b>Teams:</b> success @ 12%<br/> | |
| <b>Story:</b> warning @ 12%<br/> | |
| <b>Unread dot:</b> same family color | |
| </div> | |
| </div> | |
| <!-- ===================== VARIANT C ===================== --> | |
| <div class="variant v-c"> | |
| <h2>C · Inverse Hero</h2> | |
| <div class="tag">Neutral default · loud-without-chroma for milestones</div> | |
| <div class="phones"> | |
| <div class="scheme-label">Light</div> | |
| <div class="phone"> | |
| <div class="phone-bar"><span>Notifications</span><span class="x">×</span></div> | |
| <div class="phone-list"> | |
| <div class="row hero"> | |
| <div class="icon-tile"> | |
| <svg class="icn solid" viewBox="0 0 24 24"><path d="M12 2l2.6 6.6L22 9.3l-5.5 4.7L18 22l-6-3.4L6 22l1.5-8L2 9.3l7.4-.7z"/></svg> | |
| </div> | |
| <div class="avatar a2">A</div> | |
| <div class="body"> | |
| <p class="msg"><b>Personal best</b> at Sentul — 1:43.812</p> | |
| <div class="meta">14 min ago</div> | |
| </div> | |
| <div class="unread-dot"></div> | |
| </div> | |
| <div class="row"> | |
| <div class="icon-tile"><svg class="icn solid" viewBox="0 0 24 24"><path d="M12 12a4 4 0 100-8 4 4 0 000 8zm-7 8a7 7 0 0114 0H5z"/></svg></div> | |
| <div class="avatar">M</div> | |
| <div class="body"> | |
| <p class="msg"><b>Maya</b> started following you</p> | |
| <div class="meta">2 min ago</div> | |
| </div> | |
| <div class="unread-dot"></div> | |
| </div> | |
| <div class="row"> | |
| <div class="icon-tile"><svg class="icn solid" viewBox="0 0 24 24"><path d="M22 2L11 13M22 2l-7 20-4-9-9-4z"/></svg></div> | |
| <div class="avatar a3">D</div> | |
| <div class="body"> | |
| <p class="msg"><b>Dani</b> shared a session with you</p> | |
| <div class="meta">1 h ago</div> | |
| </div> | |
| </div> | |
| <div class="row hero"> | |
| <div class="icon-tile"><svg class="icn solid" viewBox="0 0 24 24"><path d="M5 12l5 5 9-12" fill="none" stroke="currentColor" stroke-width="2.4"/></svg></div> | |
| <div class="avatar a4">R</div> | |
| <div class="body"> | |
| <p class="msg"><b>Apex Racing</b> accepted your invite</p> | |
| <div class="meta">3 h ago</div> | |
| </div> | |
| </div> | |
| <div class="row"> | |
| <div class="icon-tile"><svg class="icn solid" viewBox="0 0 24 24"><path d="M21 15a4 4 0 01-4 4H7l-4 4V5a4 4 0 014-4h10a4 4 0 014 4z"/></svg></div> | |
| <div class="avatar a5">K</div> | |
| <div class="body"> | |
| <p class="msg"><b>Kai</b> replied to your comment</p> | |
| <div class="meta">Yesterday</div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="scheme-label">Dark</div> | |
| <div class="phone dark"> | |
| <div class="phone-bar"><span>Notifications</span><span class="x">×</span></div> | |
| <div class="phone-list"> | |
| <div class="row hero"> | |
| <div class="icon-tile"><svg class="icn solid" viewBox="0 0 24 24"><path d="M12 2l2.6 6.6L22 9.3l-5.5 4.7L18 22l-6-3.4L6 22l1.5-8L2 9.3l7.4-.7z"/></svg></div> | |
| <div class="avatar a2">A</div> | |
| <div class="body"><p class="msg"><b>Personal best</b> at Sentul — 1:43.812</p><div class="meta">14 min ago</div></div> | |
| <div class="unread-dot"></div> | |
| </div> | |
| <div class="row"> | |
| <div class="icon-tile"><svg class="icn solid" viewBox="0 0 24 24"><path d="M12 12a4 4 0 100-8 4 4 0 000 8zm-7 8a7 7 0 0114 0H5z"/></svg></div> | |
| <div class="avatar">M</div> | |
| <div class="body"><p class="msg"><b>Maya</b> started following you</p><div class="meta">2 min ago</div></div> | |
| <div class="unread-dot"></div> | |
| </div> | |
| <div class="row"> | |
| <div class="icon-tile"><svg class="icn solid" viewBox="0 0 24 24"><path d="M22 2L11 13M22 2l-7 20-4-9-9-4z"/></svg></div> | |
| <div class="avatar a3">D</div> | |
| <div class="body"><p class="msg"><b>Dani</b> shared a session with you</p><div class="meta">1 h ago</div></div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="tokens"> | |
| <b>Default row icon tile:</b> surfaceQuiet + contentSecondary<br/> | |
| <b>Hero row bg:</b> bestLapRowTint<br/> | |
| <b>Hero icon tile:</b> surfaceInverse + contentInverse (loud, no chroma)<br/> | |
| <b>Hero unread dot:</b> bestLap; default unread dot: contentPrimary<br/> | |
| <b>Triggers hero:</b> personal_best · tier_up · invite_accepted | |
| </div> | |
| </div> | |
| </div> | |
| <div class="compare"> | |
| <h2>Today vs. Proposal — side by side</h2> | |
| <p>Same five notifications. Current rainbow on the left, Variant A on the right.</p> | |
| <div class="compare-grid"> | |
| <div class="compare-card"> | |
| <h3>Today (12-color rainbow)</h3> | |
| <div class="phone" style="border:none;border-radius:0"> | |
| <div class="phone-list" style="border-radius:0"> | |
| <div class="row"> | |
| <div class="icon-tile" style="background:rgba(0,122,255,.12);color:#007AFF"> | |
| <svg class="icn solid" viewBox="0 0 24 24"><path d="M12 12a4 4 0 100-8 4 4 0 000 8zm-7 8a7 7 0 0114 0H5z"/></svg> | |
| </div> | |
| <div class="avatar">M</div> | |
| <div class="body"><p class="msg"><b>Maya</b> started following you</p><div class="meta">2 min ago</div></div> | |
| <div class="unread-dot" style="background:#007AFF"></div> | |
| </div> | |
| <div class="row"> | |
| <div class="icon-tile" style="background:rgba(255,149,0,.12);color:#FF9500"> | |
| <svg class="icn solid" viewBox="0 0 24 24"><path d="M12 2l2.6 6.6L22 9.3l-5.5 4.7L18 22l-6-3.4L6 22l1.5-8L2 9.3l7.4-.7z"/></svg> | |
| </div> | |
| <div class="avatar a2">A</div> | |
| <div class="body"><p class="msg">Personal best at <b>Sentul</b> — 1:43.812</p><div class="meta">14 min ago</div></div> | |
| <div class="unread-dot" style="background:#FF9500"></div> | |
| </div> | |
| <div class="row"> | |
| <div class="icon-tile" style="background:rgba(50,173,230,.12);color:#32ADE6"> | |
| <svg class="icn solid" viewBox="0 0 24 24"><path d="M22 2L11 13M22 2l-7 20-4-9-9-4z"/></svg> | |
| </div> | |
| <div class="avatar a3">D</div> | |
| <div class="body"><p class="msg"><b>Dani</b> shared a session with you</p><div class="meta">1 h ago</div></div> | |
| </div> | |
| <div class="row"> | |
| <div class="icon-tile" style="background:rgba(0,122,255,.12);color:#007AFF"> | |
| <svg class="icn solid" viewBox="0 0 24 24"><circle cx="9" cy="8" r="3"/><circle cx="17" cy="8" r="3"/><path d="M2 21a7 7 0 0114 0H2zm12 0a7 7 0 018-7"/></svg> | |
| </div> | |
| <div class="avatar a4">R</div> | |
| <div class="body"><p class="msg"><b>Apex Racing</b> invited you to join</p><div class="meta">3 h ago</div></div> | |
| </div> | |
| <div class="row"> | |
| <div class="icon-tile" style="background:rgba(88,86,214,.12);color:#5856D6"> | |
| <svg class="icn solid" viewBox="0 0 24 24"><path d="M21 15a4 4 0 01-4 4H7l-4 4V5a4 4 0 014-4h10a4 4 0 014 4z"/></svg> | |
| </div> | |
| <div class="avatar a5">K</div> | |
| <div class="body"><p class="msg"><b>Kai</b> replied to your comment</p><div class="meta">Yesterday</div></div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="compare-card"> | |
| <h3>Variant A · Monochrome Calm</h3> | |
| <div class="phone v-a" style="border:none;border-radius:0"> | |
| <div class="phone-list" style="border-radius:0"> | |
| <div class="row"> | |
| <div class="icon-tile" style="background:#F2F2F7;color:rgba(60,60,67,.6)"> | |
| <svg class="icn solid" viewBox="0 0 24 24"><path d="M12 12a4 4 0 100-8 4 4 0 000 8zm-7 8a7 7 0 0114 0H5z"/></svg> | |
| <span class="pip" style="position:absolute;bottom:-2px;right:-2px;width:12px;height:12px;border-radius:50%;border:2px solid #FFFFFF;background:#007AFF"></span> | |
| </div> | |
| <div class="avatar">M</div> | |
| <div class="body"><p class="msg"><b>Maya</b> started following you</p><div class="meta">2 min ago</div></div> | |
| <div class="unread-dot" style="background:#000"></div> | |
| </div> | |
| <div class="row"> | |
| <div class="icon-tile" style="background:#F2F2F7;color:rgba(60,60,67,.6)"> | |
| <svg class="icn solid" viewBox="0 0 24 24"><path d="M12 2l2.6 6.6L22 9.3l-5.5 4.7L18 22l-6-3.4L6 22l1.5-8L2 9.3l7.4-.7z"/></svg> | |
| <span class="pip" style="position:absolute;bottom:-2px;right:-2px;width:12px;height:12px;border-radius:50%;border:2px solid #FFFFFF;background:#FF3B30"></span> | |
| </div> | |
| <div class="avatar a2">A</div> | |
| <div class="body"><p class="msg">Personal best at <b>Sentul</b> — 1:43.812</p><div class="meta">14 min ago</div></div> | |
| <div class="unread-dot" style="background:#000"></div> | |
| </div> | |
| <div class="row"> | |
| <div class="icon-tile" style="background:#F2F2F7;color:rgba(60,60,67,.6)"> | |
| <svg class="icn solid" viewBox="0 0 24 24"><path d="M22 2L11 13M22 2l-7 20-4-9-9-4z"/></svg> | |
| <span class="pip" style="position:absolute;bottom:-2px;right:-2px;width:12px;height:12px;border-radius:50%;border:2px solid #FFFFFF;background:rgba(60,60,67,.6)"></span> | |
| </div> | |
| <div class="avatar a3">D</div> | |
| <div class="body"><p class="msg"><b>Dani</b> shared a session with you</p><div class="meta">1 h ago</div></div> | |
| </div> | |
| <div class="row"> | |
| <div class="icon-tile" style="background:#F2F2F7;color:rgba(60,60,67,.6)"> | |
| <svg class="icn solid" viewBox="0 0 24 24"><circle cx="9" cy="8" r="3"/><circle cx="17" cy="8" r="3"/><path d="M2 21a7 7 0 0114 0H2zm12 0a7 7 0 018-7"/></svg> | |
| <span class="pip" style="position:absolute;bottom:-2px;right:-2px;width:12px;height:12px;border-radius:50%;border:2px solid #FFFFFF;background:#34C759"></span> | |
| </div> | |
| <div class="avatar a4">R</div> | |
| <div class="body"><p class="msg"><b>Apex Racing</b> invited you to join</p><div class="meta">3 h ago</div></div> | |
| </div> | |
| <div class="row"> | |
| <div class="icon-tile" style="background:#F2F2F7;color:rgba(60,60,67,.6)"> | |
| <svg class="icn solid" viewBox="0 0 24 24"><path d="M21 15a4 4 0 01-4 4H7l-4 4V5a4 4 0 014-4h10a4 4 0 014 4z"/></svg> | |
| <span class="pip" style="position:absolute;bottom:-2px;right:-2px;width:12px;height:12px;border-radius:50%;border:2px solid #FFFFFF;background:#007AFF"></span> | |
| </div> | |
| <div class="avatar a5">K</div> | |
| <div class="body"><p class="msg"><b>Kai</b> replied to your comment</p><div class="meta">Yesterday</div></div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </body> | |
| </html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment