/* Warm grays, one accent for what you can move, no boxes. Zone tones are one ordinal ramp (darker = more scanners read it), validated in both modes. */ :root { color-scheme: light; --surface: #f5f4f0; --ink: #1c1b18; --ink-2: #5c5a53; --ink-3: #8a877e; --rule: #dfddd6; --accent: #d4541c; --z-every: #1c1b18; --z-most: #54524b; --z-some: #86837a; --z-none: #aaa79d; --lane-0: #ebe9e3; } @media (prefers-color-scheme: dark) { :root:where(:not([data-theme="light"])) { color-scheme: dark; --surface: #1c1b18; --ink: #eceae4; --ink-2: #b9b6ad; --ink-3: #8a877e; --rule: #33322e; --accent: #e0602a; --z-every: #eceae4; --z-most: #b2afa6; --z-some: #7b7870; --z-none: #55534d; --lane-0: #262521; } } :root[data-theme="dark"] { color-scheme: dark; --surface: #1c1b18; --ink: #eceae4; --ink-2: #b9b6ad; --ink-3: #8a877e; --rule: #33322e; --accent: #e0602a; --z-every: #eceae4; --z-most: #b2afa6; --z-some: #7b7870; --z-none: #55534d; --lane-0: #262521; } * { box-sizing: border-box; } html, body { margin: 0; background: var(--surface); } body { color: var(--ink); font: 17px/1.55 system-ui, -apple-system, "Helvetica Neue", "Segoe UI", sans-serif; -webkit-font-smoothing: antialiased; } .page { max-width: 1040px; margin: 0 auto; padding: 56px 24px 72px; } .visually-hidden { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; } .kicker { margin: 0 0 14px; font-size: 13px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--ink-3); } h1 { margin: 0; font-size: clamp(32px, 5vw, 48px); line-height: 1.08; font-weight: 600; letter-spacing: -0.02em; max-width: 14em; } .lede { margin: 18px 0 0; font-size: 20px; line-height: 1.5; color: var(--ink-2); max-width: 36em; } .versus { margin-top: 24px; max-width: 46em; } .versus-lede { margin: 0; font-size: 23px; line-height: 1.42; color: var(--ink); } .versus a, .section-lede a, .method a, .fine a, .specimen a, .takeaway a, .primer a { color: inherit; text-decoration: underline; text-decoration-color: var(--accent); text-decoration-thickness: 1.5px; text-underline-offset: 3px; } .versus a:hover, .section-lede a:hover, .method a:hover, .fine a:hover, .specimen a:hover, .takeaway a:hover, .primer a:hover { color: var(--accent); } .vbars { display: grid; gap: 12px; margin: 26px 0 8px; max-width: 660px; } .vbar { display: grid; grid-template-columns: 200px minmax(0, 1fr) 104px; gap: 16px; align-items: center; } .vlabel .name { display: block; font-weight: 600; } .vlabel .what { display: block; font-size: 13px; color: var(--ink-3); } .vtrack { height: 10px; background: var(--rule); border-radius: 0 3px 3px 0; } .vfill { display: block; height: 100%; background: var(--ink); border-radius: 0 3px 3px 0; } .vfill.est { background: repeating-linear-gradient(135deg, var(--ink) 0 3px, transparent 3px 5px); } /* an estimate */ .vval { font-size: 24px; font-weight: 600; text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; } .share { margin: 20px 0 0; font-size: 17px; color: var(--ink-2); max-width: 40em; } .vtrack.spread { position: relative; } .vband { position: absolute; top: 0; bottom: 0; background: var(--ink-3); border-radius: 3px; } .vdot { position: absolute; top: 50%; width: 6px; height: 6px; margin: -3px 0 0 -3px; border-radius: 50%; background: var(--surface); } h2 { margin: 0 0 8px; font-size: 26px; line-height: 1.2; font-weight: 600; letter-spacing: -0.01em; } .section-lede { margin: 0 0 28px; color: var(--ink-2); max-width: 38em; } .fine { margin: 10px 0 0; font-size: 13px; color: var(--ink-3); max-width: 52em; } .block { padding: 56px 0 0; } .block + .block { margin-top: 40px; border-top: 1px solid var(--rule); } /* spectrum */ .spectrum { display: grid; grid-template-columns: minmax(0, 1fr) 220px; gap: 40px; align-items: end; } @media (max-width: 760px) { .spectrum { grid-template-columns: minmax(0, 1fr); gap: 24px; } } .bell-figure { margin: 0; } .chart { display: block; width: 100%; overflow: visible; touch-action: pan-y; } svg text { fill: var(--ink-2); font: 13px system-ui, -apple-system, "Helvetica Neue", "Segoe UI", sans-serif; } svg .muted { fill: var(--ink-3); } svg .strong { fill: var(--ink); font-weight: 600; } .range { -webkit-appearance: none; appearance: none; width: 100%; height: 22px; margin: 6px 0 0; background: transparent; cursor: pointer; } .range::-webkit-slider-runnable-track { height: 1px; background: var(--rule); } .range::-moz-range-track { height: 1px; background: var(--rule); } .range::-webkit-slider-thumb { -webkit-appearance: none; width: 14px; height: 14px; margin-top: -6.5px; border-radius: 50%; background: var(--accent); border: 2px solid var(--surface); } .range::-moz-range-thumb { width: 14px; height: 14px; border-radius: 50%; background: var(--accent); border: 2px solid var(--surface); } .range:focus-visible { outline: 2px solid var(--accent); outline-offset: 4px; } .takeaway { margin: 28px 0 0; font-size: 20px; line-height: 1.45; max-width: 34em; } .bell-key { margin: 0 0 14px; } .readout { margin: 10px 0 0; font-size: 15px; line-height: 1.45; color: var(--ink); font-variant-numeric: tabular-nums; min-height: 1.45em; } .swatch { display: inline-block; width: 12px; height: 12px; border-radius: 2px; margin-right: 6px; vertical-align: -1px; } .zone { font-size: 14px; color: var(--ink-2); } .specimen { display: grid; gap: 10px; align-content: start; } .specimen img { width: 100%; max-width: 220px; aspect-ratio: 1; display: block; border-radius: 2px; background: var(--rule); } .specimen .big { font-size: 22px; line-height: 1.25; font-weight: 600; } .specimen .small { font-size: 14px; color: var(--ink-2); } .specimen .src { font-size: 13px; color: var(--ink-3); } .linklike { font: inherit; font-size: 14px; color: var(--ink-2); background: none; border: 0; padding: 0; cursor: pointer; text-align: left; text-decoration: underline; text-underline-offset: 3px; text-decoration-color: var(--rule); justify-self: start; } .linklike:hover { color: var(--ink); text-decoration-color: var(--ink-3); } /* pairs */ .pairs { display: grid; grid-template-columns: repeat(auto-fill, minmax(290px, 1fr)); gap: 40px 36px; } .pair h3 { margin: 0 0 12px; font-size: 18px; font-weight: 600; } .pair .two { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; } .pair figure { margin: 0; } .pair img { width: 100%; aspect-ratio: 1; display: block; border-radius: 2px; background: var(--rule); } .pair figcaption { margin-top: 8px; font-size: 13px; color: var(--ink-2); display: grid; gap: 4px; } .pair figcaption .count { color: var(--ink); font-weight: 600; } .pair p { margin: 12px 0 0; font-size: 15px; color: var(--ink-2); } /* details */ .more { margin-top: 32px; } .more summary { cursor: pointer; display: inline-block; font-size: 15px; color: var(--ink-2); list-style: none; border-bottom: 1px solid var(--rule); padding-bottom: 2px; } .more summary::-webkit-details-marker { display: none; } .more summary::after { content: " +"; color: var(--ink-3); } .more[open] summary::after { content: " −"; } .more summary:hover { color: var(--ink); } .more-body { padding-top: 24px; } /* segmented control */ .seg { display: inline-flex; gap: 0; border: 1px solid var(--rule); border-radius: 999px; padding: 3px; margin: 0 0 20px; flex-wrap: wrap; } .seg button { font: inherit; font-size: 14px; color: var(--ink-2); background: none; border: 0; border-radius: 999px; padding: 6px 14px; cursor: pointer; } .seg button[aria-pressed="true"] { background: var(--ink); color: var(--surface); } .seg .px { margin-left: 2px; font-size: 12px; color: var(--ink-3); font-variant-numeric: tabular-nums; } .seg button[aria-pressed="true"] .px { color: inherit; opacity: 0.7; } /* image resolution: what the choice sets, each setting in pixels, what the chosen one means */ .res { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 8px 14px; align-items: center; margin: 0 0 22px; } .res-label { font-size: 13px; color: var(--ink-3); } .res .seg { margin: 0; justify-self: start; flex-wrap: nowrap; } .res-note { grid-column: 2; margin: 0; font-size: 14px; color: var(--ink-2); max-width: 44em; } .seg button:focus-visible, .linklike:focus-visible, .more summary:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; } /* android grid */ .grid-wrap { overflow-x: auto; } .phones { border-collapse: collapse; width: 100%; } .phones th, .phones td { padding: 12px 10px; text-align: center; border-bottom: 1px solid var(--rule); font-weight: 400; } .phones thead th { font-size: 13px; color: var(--ink-3); border-bottom-color: var(--ink-3); } .phones th[scope="row"] { text-align: left; } .phones .name { display: block; color: var(--ink); font-size: 15px; } .phones .what { display: block; color: var(--ink-3); font-size: 12px; } .phones .group td, .phones .group th { padding-top: 22px; font-size: 12px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--ink-3); text-align: left; } .phones .pct { display: block; font-size: 11px; color: var(--ink-3); font-variant-numeric: tabular-nums; margin-top: 2px; } /* Android: one strip per set */ .skey { display: flex; flex-wrap: wrap; gap: 6px 22px; font-size: 14px; color: var(--ink-2); margin: 0 0 14px; } .skey > span { display: inline-flex; align-items: center; gap: 8px; } .skey .mark { position: static; margin: 0; } .strips { display: grid; gap: 10px; } .srow { display: grid; grid-template-columns: 132px minmax(0, 1fr) 104px; gap: 16px; align-items: center; } .slabel { font-size: 15px; } .strack { position: relative; height: 24px; } .strack::before { content: ""; position: absolute; left: 0; right: 0; top: 50%; height: 1px; background: var(--rule); } .sband { position: absolute; top: 50%; height: 6px; margin-top: -3px; background: var(--ink-3); opacity: 0.35; border-radius: 3px; } .mark { position: absolute; top: 50%; width: 12px; height: 12px; margin: -6px 0 0 -6px; border-radius: 50%; display: inline-block; } .mark.other { background: var(--ink-3); } .mark.own { background: var(--ink); width: 14px; height: 14px; margin: -7px 0 0 -7px; } .mark.google { background: var(--ink); width: 8px; height: 8px; margin: -4px 0 0 -4px; border-radius: 1px; transform: rotate(45deg); } /* fits inside Apple's ring where they meet */ .mark.apple { background: var(--surface); border: 2px solid var(--ink); width: 16px; height: 16px; margin: -8px 0 0 -8px; } .mark.huawei { background: var(--ink); width: 12px; height: 11px; margin: -6px 0 0 -6px; border-radius: 0; clip-path: polygon(50% 0, 100% 100%, 0 100%); } .mark.samsung { background: var(--surface); border: 2px solid var(--ink); width: 10px; height: 10px; margin: -5px 0 0 -5px; border-radius: 1px; } /* hollow: an estimate */ .skey .mark.own, .skey .mark.apple, .skey .mark.other, .skey .mark.huawei, .skey .mark.samsung { margin: 0; } .skey .mark.google { margin: 0 2px; } .sval { font-size: 15px; text-align: right; color: var(--ink-2); font-variant-numeric: tabular-nums; white-space: nowrap; } .shead .sval, .saxis { font-size: 12px; color: var(--ink-3); } .saxis .strack { height: 16px; display: flex; justify-content: space-between; } .saxis .strack::before { display: none; } #stripNote { font-size: 18px; margin-top: 22px; } #numbers { margin-top: 18px; } .phones td { font-variant-numeric: tabular-nums; } /* advice */ .advice { margin: 0; padding: 0; list-style: none; counter-reset: a; display: grid; gap: 22px; max-width: 44em; } .advice li { counter-increment: a; display: grid; grid-template-columns: 36px minmax(0, 1fr); } .advice li::before { content: counter(a); color: var(--accent); font-weight: 600; font-variant-numeric: tabular-nums; } .advice strong { display: block; font-weight: 600; } .advice span { color: var(--ink-2); } /* explorer (inside "Explore all 15 factors") */ .pills { display: flex; flex-wrap: wrap; gap: 6px 4px; margin-bottom: 20px; } .pills button { font: inherit; font-size: 14px; color: var(--ink-2); background: none; border: 1px solid var(--rule); border-radius: 999px; padding: 4px 12px; cursor: pointer; } .pills button[aria-pressed="true"] { border-color: var(--ink); color: var(--ink); } .about { margin: 0 0 18px; color: var(--ink-2); max-width: 40em; } .about.breaks { margin-top: -8px; } .about.breaks strong, .primer strong { color: var(--ink); font-weight: 600; } .primer { margin: 0 0 28px; max-width: 40em; } .primer h3 { margin: 0 0 8px; font-size: 16px; font-weight: 600; } .primer ol { margin: 0 0 6px; padding-left: 1.4em; color: var(--ink-2); } .primer li { margin: 3px 0; } .explore { display: grid; grid-template-columns: minmax(200px, 360px) minmax(0, 1fr); gap: 32px; align-items: start; } @media (max-width: 720px) { .explore { grid-template-columns: minmax(0, 1fr); } } .explore img { width: 100%; max-width: 360px; aspect-ratio: 1; display: block; border-radius: 2px; background: var(--rule); } .explore .step { margin-top: 10px; font-weight: 600; } .explore .seg { margin: 4px 0 0; } .ends { display: flex; justify-content: space-between; font-size: 12px; color: var(--ink-3); } .headline { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 14px; margin-top: 16px; } .headline .step { margin: 0; } .rows { display: grid; gap: 10px; margin-top: 14px; } .row { display: grid; grid-template-columns: 150px minmax(0, 1fr) 44px; gap: 12px; align-items: center; font-size: 14px; } .row .label { color: var(--ink-3); } .row.ok .label { color: var(--ink); } .row .track { position: relative; height: 6px; background: var(--rule); border-radius: 3px; } .row .fill { display: block; height: 100%; background: var(--ink-3); border-radius: 3px; } .row.ok .fill { background: var(--ink); } .row .mark { position: absolute; top: -4px; bottom: -4px; width: 2px; margin-left: -1px; background: var(--ink-2); } .row .val { text-align: right; font-variant-numeric: tabular-nums; } .tips { display: grid; gap: 6px; margin-top: 40px; } .tips h3 { margin: 0 0 8px; font-size: 16px; font-weight: 600; } .tip-row { display: grid; grid-template-columns: 150px minmax(0, 1fr); gap: 12px; align-items: center; } .tip-row .label { font-size: 13px; color: var(--ink-2); } .tip-cells { display: grid; gap: 2px; } .tip-cells .tip-none { height: 24px; box-sizing: border-box; border: 1px dashed var(--rule); border-radius: 2px; font: 600 10.5px/22px system-ui, -apple-system, sans-serif; color: var(--ink-3); text-align: center; overflow: hidden; white-space: nowrap; } /* printed bigger: too big for the picture */ .tip-cells button { height: 24px; border: 0; border-radius: 2px; padding: 0; cursor: pointer; font: 600 10.5px/24px system-ui, -apple-system, sans-serif; overflow: hidden; white-space: nowrap; font-variant-numeric: tabular-nums; } @media (max-width: 720px) { .tip-row { grid-template-columns: minmax(0, 1fr); gap: 4px; } } .key { display: flex; flex-wrap: wrap; gap: 6px 18px; font-size: 13px; color: var(--ink-2); margin: 14px 0 0; } .key i { display: inline-block; width: 12px; height: 12px; border-radius: 2px; margin-right: 6px; vertical-align: -1px; } .key-title { color: var(--ink-3); } .lanes-key { margin: 0 0 12px; } .key i.ramp { width: 44px; background: linear-gradient(to right, var(--lane-0), var(--z-every)); } .key i.uline { width: 18px; height: 3px; border-radius: 0; background: var(--accent); vertical-align: 3px; } /* method */ .footer { padding-bottom: 8px; } .method p, .method li { color: var(--ink-2); font-size: 15px; max-width: 46em; } .method h3 { margin: 28px 0 6px; font-size: 16px; font-weight: 600; } .method ul { padding-left: 18px; margin: 6px 0; } .method a { color: var(--ink); text-decoration-color: var(--ink-3); text-underline-offset: 3px; } .tooltip { position: fixed; z-index: 20; pointer-events: none; background: var(--surface); color: var(--ink); border: 1px solid var(--rule); border-radius: 6px; padding: 7px 10px; font-size: 13px; line-height: 1.35; box-shadow: 0 6px 20px rgba(0, 0, 0, 0.10); max-width: 260px; } .tooltip .v { font-weight: 600; } .tooltip .k { color: var(--ink-2); } @media (max-width: 560px) { .versus-lede { font-size: 19px; } .vbar { grid-template-columns: 112px minmax(0, 1fr) 84px; gap: 10px; } .vval { font-size: 20px; } .vval.wide { font-size: 16px; } /* a range, "27%–67%", fits the column */ .phones th, .phones td { padding: 10px 4px; } .phones thead th { font-size: 11px; } .phones .name { font-size: 14px; } body { font-size: 16px; } .page { padding: 36px 16px 56px; } .lede, .takeaway { font-size: 18px; } .row { grid-template-columns: 108px minmax(0, 1fr) 44px; gap: 10px; } .srow { grid-template-columns: 84px minmax(0, 1fr) 92px; gap: 10px; } .res { grid-template-columns: minmax(0, 1fr); } .res-note { grid-column: 1; } .res .seg button { padding: 6px 10px; } .slabel, .sval { font-size: 14px; } .block { padding-top: 40px; } } @media print { .range, .seg, .linklike, .tooltip { display: none !important; } .block + .block { break-before: auto; } } .who th.left, .who td.left { text-align: left; } /* the phones table: names left, numbers centred */ .specimen .scan-it { display: inline-block; margin: 8px 0 4px; font-size: 13px; color: var(--ink-2); } /* the exact picture, to scan */