:root{color-scheme:dark;--bg:#101312;--surface:#191d1b;--raised:#202622;--text:#f0f2ed;--muted:#a1aaa4;--line:#303832;--accent:#c4edda;--accent-ink:#1b3527;--header:rgba(16,19,18,.94);--soft:#26382e;--shadow:0 30px 120px #0008}
:root[data-theme=light]{color-scheme:light;--bg:#f6f7f3;--surface:#fff;--raised:#eef1eb;--text:#202923;--muted:#637066;--line:#dce2d9;--accent:#264f3d;--accent-ink:#fff;--header:rgba(246,247,243,.96);--soft:#e5eee7;--shadow:0 30px 100px #24372b25}
*{box-sizing:border-box}html{scroll-behavior:smooth;scroll-padding-top:100px}body{margin:0;background:var(--bg);color:var(--text);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;font-size:15px;line-height:1.6;-webkit-font-smoothing:antialiased}a{color:inherit;text-decoration:none}button,input,select{font:inherit}button,a,input,select{-webkit-tap-highlight-color:transparent}button{cursor:pointer;color:inherit}button{border:0}button:disabled{cursor:default;opacity:.45}button:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible{outline:2px solid var(--accent);outline-offset:5px}svg{fill:none;stroke:currentColor;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}button svg{width:19px;height:19px}h1,h2,h3,p{margin:0}h1,h2,h3{font-weight:560}button{background:transparent}.shell{width:min(1240px,calc(100% - 80px));margin:auto}.site-header{height:88px;border-bottom:1px solid var(--line);background:var(--header)}.header-inner{height:100%;width:min(1360px,calc(100% - 80px));margin:auto;display:flex;align-items:center;gap:60px}.brand{display:flex;align-items:center;gap:11px;white-space:nowrap;font-size:19px;font-weight:650;letter-spacing:.02em}.brand svg{width:35px;height:35px;color:var(--accent)}.brand-dot{fill:var(--accent)}.brand small{display:block;font-size:8px;letter-spacing:.14em;font-weight:500;color:var(--muted);margin-top:-1px}.header-inner nav{display:flex;gap:30px;align-items:center;font-size:14px}.header-inner nav>a,.header-inner nav>button{padding:28px 0;white-space:nowrap;color:var(--muted)}.header-inner nav .current{color:var(--text);position:relative}.current:after{content:"";height:2px;position:absolute;bottom:0;left:0;right:0;background:var(--accent)}#saved-count{margin-left:3px;font-variant-numeric:tabular-nums;color:var(--muted)}.header-actions{margin-left:auto;display:flex;align-items:center;gap:22px;white-space:nowrap}.quiet{font-size:13px;color:var(--muted);padding:10px 0}.quiet:hover{color:var(--text)}.icon-button{display:inline-flex;align-items:center;justify-content:center;width:38px;height:38px;border:1px solid var(--line);border-radius:50%;font-size:25px;flex-shrink:0}.icon-button:hover{background:var(--raised)}.intro{padding:55px 0 36px;display:flex;align-items:flex-end;justify-content:space-between;gap:30px}.eyebrow{font-size:11px;letter-spacing:.09em;font-weight:550;display:flex;align-items:center;gap:9px;color:var(--muted)}.live-dot{width:6px;height:6px;border-radius:50%;background:var(--accent)}h1{font-size:43px;line-height:1.3;letter-spacing:-.045em;margin:15px 0 12px}.intro-copy{font-size:15px;color:var(--muted)}.edition{text-align:right;display:grid;gap:4px;flex-shrink:0}.edition span{font-size:11px;color:var(--muted)}.edition strong{font-weight:500;font-size:18px;font-variant-numeric:tabular-nums;letter-spacing:.03em}.opening{display:grid;grid-template-columns:minmax(0,2.3fr) minmax(270px,1fr);gap:28px}.feature{position:relative;overflow:hidden;min-height:340px;border-radius:16px;background:#192d25;color:#f2f5eb;isolation:isolate;border:1px solid #355044}.feature-art{position:absolute;inset:0;z-index:-1;overflow:hidden;pointer-events:none}.feature-art svg{height:100%;width:100%;stroke-width:1;opacity:.9}.feature-art:after{content:"";position:absolute;inset:0;background:linear-gradient(90deg,#182c25 5%,#182c25eb 36%,#182c2500 85%)}.feature-content{position:relative;padding:30px 34px;max-width:68%;display:flex;align-items:flex-start;flex-direction:column;gap:15px}.feature .eyebrow{color:#c1dacb;font-size:10px}.feature h2{font-size:42px;letter-spacing:-.04em;line-height:1;margin-top:13px}.feature h3{font-size:20px;font-weight:500;line-height:1.6;max-width:310px}.feature-description{font-size:13px;color:#b8cec1;max-width:340px}.feature-actions{display:flex;align-items:center;gap:10px;margin-top:6px}.primary{background:var(--accent);color:var(--accent-ink);padding:11px 18px;border-radius:7px;font-weight:600;font-size:13px;display:inline-flex;align-items:center;justify-content:center;gap:15px}.feature .primary{background:#d3ecdc;color:#203b2a}.primary:hover{filter:brightness(1.06)}.feature-save{color:#d8eadc;border-color:#63806e}.art-caption{position:absolute;bottom:21px;right:23px;font-size:9px;color:#a2bda9;letter-spacing:.08em}.editorial{padding:15px 0 7px 5px;display:flex;flex-direction:column;align-items:flex-start}.line{height:1px;background:var(--line);flex:1;min-width:40px}.editorial>.eyebrow{width:100%}.editorial h2{font-size:25px;line-height:1.55;letter-spacing:-.025em;margin:21px 0 13px}.editorial p{font-size:13px;color:var(--muted);line-height:1.85;margin-bottom:8px;max-width:300px}.text-link{font-size:12px;font-weight:550;display:inline-flex;align-items:center;gap:20px;padding:8px 0}.text-link:hover{color:var(--accent)}.text-link>span{font-size:17px}.editorial .text-link{margin-top:4px}.editorial-foot{border-top:1px solid var(--line);width:100%;margin-top:auto;padding-top:15px;display:flex;align-items:center;justify-content:space-between;gap:8px;color:var(--muted);font-size:11px}.editorial-foot svg{color:var(--accent)}.curated{margin:54px 0 65px}.section-heading{display:flex;align-items:flex-end;justify-content:space-between;gap:24px;margin-bottom:23px}.section-heading .eyebrow{font-size:10px;letter-spacing:.07em;margin-bottom:8px}.section-heading h2{font-size:24px;letter-spacing:-.025em}.curated-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:24px}.product-card{overflow:hidden;min-width:0}.card-art{height:124px;border-radius:10px;position:relative;overflow:hidden;display:flex;align-items:center;justify-content:center;background:#222b32;color:#bad0e2}.art-atelier{background:#252633;color:#b9b5d9}.art-crew,.art-standup{background:#282d26;color:#c9d3b8}.art-themes{background:#2b2c32;color:#cbc2dd}.card-art:after{content:"概念示意";position:absolute;right:14px;bottom:9px;font-size:9px;letter-spacing:.08em;opacity:.65}.card-art svg{width:220px;height:110px}.card-body{padding:19px 2px 0}.card-top{display:flex;justify-content:space-between;align-items:center;gap:10px}.card-top h3{font-size:22px;letter-spacing:-.035em}.card-top h3 button{padding:0;text-align:left;font-weight:inherit}.card-top h3 button:hover{color:var(--accent)}.card-save{border:0;width:30px;height:30px;color:var(--muted)}.save-button[aria-pressed=true]{color:var(--accent);background:var(--soft)}.card-description{color:var(--muted);font-size:13px;line-height:1.85;margin:8px 0 15px;min-height:48px}.card-meta{display:flex;align-items:center;justify-content:space-between;gap:10px;border-top:1px solid var(--line);padding-top:12px;font-size:11px;color:var(--muted)}.tiny-dot{display:inline-block;width:4px;height:4px;border-radius:50%;background:var(--accent);margin-right:5px}.library{padding-top:40px;border-top:1px solid var(--line);scroll-margin-top:30px}.count{font-size:14px;color:var(--muted);font-weight:400;margin-left:10px;letter-spacing:0}.search{display:flex;align-items:center;gap:10px;border:1px solid var(--line);border-radius:7px;background:var(--surface);padding:10px 13px;width:320px}.search svg{width:17px;height:17px;flex-shrink:0;color:var(--muted)}.search input{min-width:0;width:100%;border:0;outline:none;background:transparent;color:var(--text);font-size:13px}.search input::placeholder{color:var(--muted)}.search:focus-within{outline:2px solid var(--accent);outline-offset:2px}.filters{display:flex;align-items:center;justify-content:space-between;gap:20px;padding:7px 0 19px;border-bottom:1px solid var(--line)}.filter-buttons{display:flex;flex-wrap:wrap;gap:8px}.filter-buttons button{border:1px solid transparent;padding:8px 14px;border-radius:6px;font-size:12px;color:var(--muted)}.filter-buttons button[aria-pressed=true]{background:var(--soft);color:var(--accent);border-color:var(--line)}.filter-buttons button:hover{background:var(--raised)}.category-label{display:flex;align-items:center;gap:10px;font-size:12px;color:var(--muted)}select{border:1px solid var(--line);padding:8px 30px 8px 10px;border-radius:6px;background:var(--surface);color:var(--text);font-size:12px;max-width:200px}.results-meta{display:flex;align-items:center;justify-content:space-between;font-size:11px;color:var(--muted);padding:14px 0 4px}.results{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));column-gap:32px}.result{display:flex;gap:15px;padding:24px 0;border-bottom:1px solid var(--line);min-width:0}.initial{width:45px;height:45px;background:var(--raised);border:1px solid var(--line);border-radius:10px;display:flex;justify-content:center;align-items:center;flex-shrink:0;font-size:18px;font-weight:550;color:var(--accent)}.result-main{min-width:0;flex:1}.result-title{font-size:15px;font-weight:550;text-align:left;padding:0;overflow-wrap:anywhere;line-height:1.55}.result-title:hover{color:var(--accent)}.result p{font-size:12px;color:var(--muted);margin:7px 0 11px;line-height:1.75;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.result-meta{display:flex;gap:10px;font-size:10px;color:var(--muted);flex-wrap:wrap}.result-meta span+span{border-left:1px solid var(--line);padding-left:10px}.result .save-button{align-self:flex-start}.pagination{display:flex;align-items:center;justify-content:center;gap:25px;margin:32px 0;font-size:12px;color:var(--muted)}.pagination button{border:1px solid var(--line);border-radius:6px;padding:9px 15px;color:var(--text)}.empty{padding:55px 20px;text-align:center;color:var(--muted);grid-column:1/-1}.empty h3{color:var(--text);font-size:19px;margin-bottom:10px}.empty button{margin-top:20px}.source-note{display:flex;align-items:center;gap:24px;padding:32px 0;border-top:1px solid var(--line);margin-top:45px}.source-mark{font-size:36px;font-weight:300;color:var(--muted)}.source-note h2{font-size:17px;margin-bottom:6px}.source-note p{color:var(--muted);font-size:12px;max-width:700px;line-height:1.85}.source-note .text-link{margin-left:auto;flex-shrink:0}.footer{display:flex;justify-content:space-between;gap:20px;border-top:1px solid var(--line);padding-top:24px;padding-bottom:32px;font-size:11px;color:var(--muted)}.footer>span:first-child{color:var(--text)}.muted{color:var(--muted)}dialog{border:1px solid var(--line);border-radius:17px;background:var(--bg);color:var(--text);padding:0;width:min(900px,calc(100vw - 40px));max-height:90vh;box-shadow:var(--shadow)}dialog::backdrop{background:#0009;backdrop-filter:blur(7px)}.dialog-top{display:flex;align-items:center;justify-content:space-between;padding:21px 28px;border-bottom:1px solid var(--line);position:sticky;top:0;background:var(--bg);z-index:2}.dialog-top .icon-button{width:32px;height:32px}.detail-grid{display:grid;grid-template-columns:1.15fr 1fr;gap:36px;padding:32px}.detail-main h2{font-size:31px;letter-spacing:-.03em;line-height:1.3;overflow-wrap:anywhere;margin:15px 0}.detail-main>p{font-size:14px;line-height:1.85;color:var(--muted)}.detail-main .eyebrow{letter-spacing:0}.detail-art{height:130px;border-radius:10px;overflow:hidden;background:#25352b;margin-bottom:24px}.detail-art svg{width:100%;height:100%}.detail-main .original-copy{margin-top:23px;border-top:1px solid var(--line);padding-top:20px;font-size:12px;overflow-wrap:anywhere}.detail-main .original-copy summary{cursor:pointer;color:var(--muted)}.detail-main .original-copy p{margin-top:10px}.detail-section{padding:0 0 22px;margin-bottom:22px;border-bottom:1px solid var(--line)}.detail-section h3{font-size:13px;margin-bottom:12px}.detail-section p{font-size:12px;line-height:1.85;color:var(--muted)}.evidence-row{display:flex;justify-content:space-between;gap:16px;padding:9px 0;border-bottom:1px solid var(--line);font-size:12px}.evidence-row span{color:var(--muted)}.evidence-row strong{font-weight:500;text-align:right;overflow-wrap:anywhere}.evidence-note{margin-top:12px!important}.detail-unknown{padding:16px;border-radius:8px;background:var(--raised)}.detail-unknown h3{font-size:12px;margin-bottom:8px}.detail-unknown p{font-size:12px;color:var(--muted);line-height:1.8}.detail-actions{display:flex;flex-wrap:wrap;gap:10px;margin-top:23px}.detail-actions .save-button{border:1px solid var(--line);padding:9px 15px;display:flex;align-items:center;gap:8px;border-radius:6px;font-size:12px}.source-link{display:block;font-size:12px;margin-top:12px;color:var(--accent);overflow-wrap:anywhere}.detail-date{font-size:10px;color:var(--muted);margin-top:20px}.method-content{padding:32px;max-width:700px;margin:auto}.method-content h2{font-size:33px;line-height:1.35;letter-spacing:-.03em;margin-bottom:22px}.method-content p,.method-content li{font-size:13px;line-height:1.9;color:var(--muted)}.method-content ul{padding-left:20px}.method-content h3{font-size:17px;margin-top:25px}.method-content dl{display:grid;grid-template-columns:1fr 1fr;gap:30px;margin:30px 0}.method-content dt{font-size:28px}.method-content dd{margin:4px 0 0;font-size:12px;color:var(--muted)}.method-content>.primary{margin-top:22px}.skip{position:fixed;top:-100px;left:20px;z-index:20;background:var(--accent);color:var(--accent-ink);padding:10px 18px}.skip:focus{top:10px}#toast{position:fixed;bottom:28px;left:50%;transform:translateX(-50%);padding:12px 22px;background:var(--text);color:var(--bg);border-radius:8px;box-shadow:var(--shadow);font-size:12px;z-index:5;opacity:0;pointer-events:none;transition:opacity .15s;max-width:90vw}#toast.show{opacity:1}
@media(min-width:1700px){.shell{max-width:1320px}.feature{min-height:365px}.feature-content{padding:34px 40px}.feature h2{font-size:48px}.card-art{height:145px}}
@media(max-width:1050px){.shell,.header-inner{width:calc(100% - 48px)}.header-inner{gap:28px}.header-inner nav{gap:20px}.header-actions{gap:15px}.opening{grid-template-columns:minmax(0,1.8fr) minmax(230px,1fr);gap:23px}.feature-content{max-width:83%;padding:27px}.feature-art:after{background:linear-gradient(90deg,#182c25 4%,#182c25d9 58%,#182c2511 100%)}h1{font-size:35px}.intro-copy{max-width:520px}.editorial h2{font-size:23px}.curated-grid{gap:20px}.card-description{font-size:12px}}
@media(max-width:900px){.site-header{height:auto}.header-inner{flex-wrap:wrap;gap:0;padding-top:16px}.header-actions{order:2;margin-left:auto;gap:15px}.header-inner nav{order:3;width:100%;justify-content:flex-start;gap:29px;margin-top:5px}.header-inner nav>a,.header-inner nav>button{padding:14px 0;font-size:12px}}
@media(max-width:760px){.shell,.header-inner{width:calc(100% - 40px)}.brand{font-size:17px}.brand small{font-size:7px}.brand svg{width:31px;height:31px}.header-actions .quiet{display:none}.intro{padding:32px 0 26px;display:block}.intro .eyebrow{font-size:10px}h1{font-size:30px;letter-spacing:-.05em;margin:13px 0 11px;line-height:1.35}.intro-copy{font-size:13px;max-width:300px;line-height:1.85}.edition{margin-top:17px;display:flex;text-align:left;align-items:center;gap:10px}.edition span{font-size:9px}.edition strong{font-size:11px}.opening{grid-template-columns:1fr;gap:27px}.feature{min-height:340px}.feature-content{max-width:90%;padding:25px;gap:14px}.feature h2{font-size:39px}.feature h3{font-size:19px;max-width:260px}.feature-description{max-width:230px;font-size:12px}.feature-art svg{width:155%;margin-left:-20%}.feature-art:after{background:linear-gradient(90deg,#182c25 2%,#182c25e0 45%,#182c2500 120%)}.art-caption{bottom:15px;right:16px;font-size:8px}.editorial{padding:15px 0;border-top:1px solid var(--line)}.editorial h2{font-size:23px;margin:17px 0 10px}.editorial h2 br{display:none}.editorial p{max-width:none}.editorial-foot{display:none}.curated{margin:30px 0 40px}.section-heading{gap:18px;align-items:flex-start}.section-heading h2{font-size:21px;line-height:1.5}.section-heading>.text-link{display:none}.curated-grid{grid-template-columns:1fr;gap:28px}.product-card{display:grid;grid-template-columns:100px minmax(0,1fr);gap:17px;border-bottom:1px solid var(--line);padding-bottom:22px}.card-art{height:132px;border-radius:8px}.card-art svg{min-width:170px;height:90px}.card-art:after{font-size:7px;right:8px;bottom:8px}.card-body{padding:0}.card-top h3{font-size:21px}.card-description{margin:7px 0 12px;min-height:0;font-size:12px;line-height:1.7}.card-meta{font-size:9px;gap:3px;flex-wrap:wrap;padding-top:9px}.library{padding-top:30px}.library .section-heading{display:block}.search{width:100%;margin-top:20px}.filters{display:block;padding-top:0}.filter-buttons{gap:4px}.filter-buttons button{padding:8px 10px;font-size:11px}.category-label{margin-top:18px;justify-content:flex-end}.results{grid-template-columns:1fr;gap:0}.result{padding:20px 0;gap:12px}.result-title{font-size:14px}.result p{font-size:12px}.source-note{align-items:flex-start;gap:12px;flex-wrap:wrap}.source-mark{font-size:28px}.source-note>div:nth-child(2){flex:1}.source-note p{font-size:11px}.source-note .text-link{width:auto;margin:2px 0 0}.footer{display:block;padding-bottom:30px}.footer>span{display:block;margin-bottom:8px}dialog{width:calc(100vw - 20px);max-height:94dvh;border-radius:12px}.dialog-top{padding:15px 20px}.detail-grid{grid-template-columns:1fr;padding:24px;gap:30px}.detail-main h2{font-size:27px}.detail-art{height:100px}.method-content{padding:25px}.method-content h2{font-size:28px}.method-content dl{gap:20px}.method-content dt{font-size:24px}}
@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}*{transition:none!important}}

#detail-status:not(:empty){padding:12px 28px;background:var(--soft);color:var(--accent);font-size:12px}

/* Product media layout. Actual visual review status is recorded in evidence/. */
.feature{display:grid;grid-template-columns:minmax(0,.9fr) minmax(0,1.25fr);align-items:center;gap:24px;padding:32px;background:var(--surface);color:var(--text);border-color:var(--line);min-height:360px}
.feature-content{padding:0;max-width:none;gap:15px}.feature .eyebrow{color:var(--muted)}.feature h2{font-size:42px;margin-top:7px}.feature h3{font-size:22px;max-width:none;line-height:1.45;letter-spacing:0;text-wrap:balance}.feature-description{color:var(--muted);font-size:13px;line-height:1.85}.feature-signal{font-size:11px;color:var(--muted);line-height:1.7}.feature-signal span{margin:0 4px}.feature-save{color:var(--text);border-color:var(--line)}
.feature-media{min-width:0;text-align:left;padding:0;display:grid;gap:12px;align-content:center}.feature-media img{display:block;width:100%;border:1px solid #37333e;border-radius:8px;box-shadow:0 12px 30px #0003}.feature-media>span{display:flex;justify-content:space-between;color:var(--muted);font-size:10px}.feature-media:hover img{border-color:var(--accent)}
.card-art{width:100%;height:auto;aspect-ratio:1.65;display:block;padding:0;text-align:left;border:1px solid var(--line);background:#11131b}.card-art img{width:100%;height:100%;object-fit:contain;display:block;transition:transform .2s}.card-art:hover img{transform:scale(1.025)}.card-art:after{content:none}.media-caption{position:absolute;bottom:9px;right:10px;background:#111b;color:#fff;padding:3px 6px;border-radius:3px;font-size:9px;pointer-events:none}
/* Ranked cards do not all have a screenshot; the letter stands in, as in the lead. */
.card-art{position:relative}.card-monogram{display:grid;place-items:center;width:100%;height:100%;background:var(--raised);color:var(--accent);font-size:56px;font-weight:600;line-height:1}
/* The stand-in sits under every picture and is revealed only when the picture
   fails to load. `display:grid` in the rules above would otherwise win over the
   browser's own [hidden] rule and both would paint. */
[data-fallback][hidden]{display:none}
/* Ranked cards carry descriptions of different lengths, so the three have to
   share a height and agree on where the meta line sits — otherwise the row ends
   in a ragged edge and the cards look like they were pasted in. */
.curated-grid .product-card{display:flex;flex-direction:column}
.curated-grid .card-body{display:flex;flex-direction:column;flex:1}
.curated-grid .card-meta{margin-top:auto}
.detail-art{display:block;height:auto;aspect-ratio:auto;margin-bottom:12px;background:transparent}.detail-art img{width:100%;height:auto;display:block;border:1px solid var(--line);border-radius:8px}.media-credit{font-size:10px!important;line-height:1.6!important;color:var(--muted)}.media-credit a{text-decoration:underline;text-underline-offset:3px}.detail-section{padding-bottom:16px;margin-bottom:16px}.detail-section h3{font-size:14px}.detail-section p{font-size:13px}.detail-body .detail-date{font-size:11px}.detail-unknown p{font-size:13px}.detail-unknown h3{font-size:13px}
@media(max-width:1050px) and (min-width:761px){.feature{grid-template-columns:1fr;padding:25px;gap:20px}.feature-media img{max-height:200px;object-fit:contain}.feature-content{padding:0;max-width:none}.feature h2{font-size:36px}.feature-description{max-width:none}}
@media(max-width:760px){.feature{grid-template-columns:1fr;gap:23px;padding:24px;min-height:0}.feature-content{max-width:none;padding:0;gap:12px}.feature h2{font-size:36px}.feature h3{font-size:21px;max-width:none}.feature-description{max-width:none}.feature-media img{max-height:190px;object-fit:contain}.feature-media>span{font-size:9px}.product-card{display:block}.card-art{height:auto;aspect-ratio:1.65}.card-body{padding:16px 0 0}.card-description{font-size:13px}.card-meta{font-size:11px}.detail-grid{grid-template-columns:1fr;gap:22px}.detail-art{height:auto}.detail-section p,.detail-unknown p{font-size:13px}}

/* ---------- language switch, account, auth (added for the public site) ---------- */
.pill{font-size:12px;font-weight:600;letter-spacing:.04em;padding:8px 12px;border-radius:7px;border:1px solid var(--line);background:var(--surface);color:var(--muted);line-height:1;transition:border-color .15s,color .15s}
.pill:hover{border-color:var(--accent);color:var(--text)}
.account-slot{display:flex;align-items:center}
.account-signin{background:var(--accent);color:var(--accent-ink);border-color:transparent;padding:10px 15px;font-size:13px;letter-spacing:0}
.account-signin:hover{color:var(--accent-ink);filter:brightness(1.06)}
.account-button{width:36px;height:36px;border-radius:50%;display:grid;place-items:center;background:var(--soft);border:1px solid var(--line)}
.account-button:hover{border-color:var(--accent)}
.avatar{font-size:13px;font-weight:650;color:var(--accent);line-height:1}
#saved-count.on{color:var(--accent)}

#auth,#account{width:min(440px,calc(100vw - 32px))}
.auth-content{padding:2px 30px 30px}
.auth-content h2{font-size:24px;letter-spacing:-.02em;line-height:1.3;margin:4px 0 10px}
.auth-content>div>p,.auth-content>p{font-size:13.5px;color:var(--muted);margin:0 0 20px}
#auth-step-link strong{color:var(--text);font-weight:600;word-break:break-all}
.field{display:block;margin-bottom:4px}
.field>span{display:block;font-size:11px;letter-spacing:.09em;text-transform:uppercase;color:var(--muted);margin-bottom:8px}
.field input{width:100%;padding:12px 13px;border-radius:7px;border:1px solid var(--line);background:var(--surface);color:var(--text);font-size:14px}
.field input::placeholder{color:var(--muted);opacity:.7}
.field input:focus{outline:2px solid var(--accent);outline-offset:1px;border-color:transparent}
.auth-content>div>p.auth-hint{font-size:12.5px;line-height:1.75;color:var(--muted);margin:0 0 22px;padding-left:14px;border-left:2px solid var(--accent)}
.field-error{min-height:17px;font-size:12px;line-height:1.5;color:#e08b91;margin:3px 0 11px}
:root[data-theme=light] .field-error{color:#b23c45}
.auth-submit{width:100%;margin-top:2px;padding:12px 18px}
.auth-content>div>p.auth-fine,.auth-content>p.auth-fine{font-size:11.5px;line-height:1.65;color:var(--muted);margin:18px 0 0}
.auth-links{display:flex;justify-content:space-between;align-items:center;gap:12px;margin-top:14px}
.auth-links .text-link{font-size:12px;padding:4px 0;color:var(--muted)}
.auth-links .text-link:hover{color:var(--accent)}
.auth-links .text-link:disabled{opacity:.5;cursor:default}
.account-facts{margin:2px 0 16px}
.account-facts>div{display:flex;align-items:baseline;justify-content:space-between;gap:18px;padding:12px 0;border-bottom:1px solid var(--line);font-size:13px}
.account-facts>div:first-child{border-top:1px solid var(--line)}
.account-facts dt{color:var(--muted);flex-shrink:0}
.account-facts dd{margin:0;font-weight:600;text-align:right;word-break:break-all}
@media(max-width:760px){#method-open{display:none}.header-actions{gap:12px}.auth-content{padding:2px 20px 24px}.auth-content h2{font-size:21px}}

/* detail: closing note spans the dialog so the two columns stay balanced */
.detail-after{padding:0 32px 32px}
.detail-after .detail-unknown{margin-bottom:4px}
.detail-after .source-link{margin-top:10px}
@media(max-width:760px){.detail-after{padding:0 20px 24px}}
/* keep the feature's one-liner from pushing the layout on long descriptions */
.feature h3{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;max-width:330px}
/* softer focus ring on form fields */
.field input:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px rgba(196,237,218,.16)}
:root[data-theme=light] .field input:focus{box-shadow:0 0 0 3px rgba(38,79,61,.14)}
.detail-loading{padding:48px 32px;color:var(--muted);font-size:13px;text-align:center}

/* ---------- sign-in providers ---------- */
.auth-providers{display:grid;gap:9px;margin:0 0 2px}
.auth-provider{display:flex;align-items:center;justify-content:center;gap:10px;width:100%;padding:11px 16px;border-radius:7px;border:1px solid var(--line);background:var(--surface);color:var(--text);font:inherit;font-size:13.5px;font-weight:550;cursor:pointer;transition:border-color .15s,color .15s}
.auth-provider:hover{border-color:var(--accent);color:var(--accent)}
.auth-provider:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.auth-provider svg{width:16px;height:16px;flex:0 0 auto}
.auth-provider:disabled{opacity:.55;cursor:default}
.auth-or{display:flex;align-items:center;gap:12px;margin:18px 0 16px;color:var(--muted);font-size:10.5px;letter-spacing:.1em;text-transform:uppercase}
.auth-or::before,.auth-or::after{content:'';flex:1;height:1px;background:var(--line)}

/* ---------- guest limit band ---------- */
.guest-band{margin:20px 0 4px}
.guest-band-inner{display:flex;flex-wrap:wrap;align-items:center;gap:10px 20px;padding:18px 20px;border:1px solid var(--line);border-radius:9px;background:var(--surface)}
.guest-band-title{flex:1 1 200px;margin:0;font-size:13.5px;font-weight:600;letter-spacing:-.01em}
.guest-band-body{flex:1 1 260px;margin:0;font-size:12px;line-height:1.65;color:var(--muted)}
.guest-band .primary{flex:0 0 auto;white-space:nowrap}
@media(max-width:640px){.guest-band .primary{width:100%}}

/* author display rules (grid/flex) otherwise beat the UA [hidden] rule */
[hidden]{display:none!important}

/* ---------- two header entries: sign in (quiet) + sign up (primary) ---------- */
.account-slot{gap:14px}
.account-signin{background:none;border:0;color:var(--muted);padding:8px 0;font-size:12.5px;font-weight:550;letter-spacing:.02em;line-height:1}
.account-signin:hover{background:none;color:var(--text);filter:none;border:0}
.account-signup{font-size:12px;font-weight:600;letter-spacing:.04em;padding:9px 14px;border-radius:7px;border:1px solid transparent;background:var(--accent);color:var(--accent-ink);line-height:1;transition:filter .15s}
.account-signup:hover{filter:brightness(1.06)}
.account-signup:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
@media(max-width:520px){.account-slot{gap:10px}.account-signin{font-size:12px}}

/* ---------- "already have an account?" switch ---------- */
.auth-content>div>p.auth-switch-line{margin:14px 0 0;font-size:12px}
.auth-switch-line .text-link{display:inline;gap:0;padding:0;font-size:12px;font-weight:500;color:var(--muted)}
.auth-switch-line .text-link:hover{color:var(--accent)}

/* ---------- newsletter entry: one button in the header, one dialog ---------- */
.subscribe-open{display:inline-flex;align-items:center;gap:7px;padding:8px 12px;border:1px solid var(--line);border-radius:7px;background:var(--surface);color:var(--text);font-family:inherit;font-size:12.5px;font-weight:600;line-height:1;cursor:pointer;transition:border-color .15s,color .15s}
.subscribe-open svg{width:15px;height:15px;flex:none;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round}
.subscribe-open:hover{border-color:var(--accent);color:var(--accent)}
.subscribe-open.is-subscribed{border-color:var(--accent);color:var(--accent)}
/* Unconfirmed is a different promise from subscribed: dashed and unpainted, so
   the two states are told apart at a glance without reading the label — and the
   icon stays legible when the label collapses on a phone. */
.subscribe-open.is-pending{border-style:dashed}
.subscribe-open.is-pending:hover{border-style:solid;border-color:var(--accent);color:var(--accent)}
.sub-done-actions{display:flex;flex-wrap:wrap;gap:8px 18px;margin-top:16px}
.sub-done-actions .text-link{font-size:12px;padding:2px 0;color:var(--muted)}
.sub-done-actions .text-link:hover{color:var(--accent)}
.sub-done-actions .text-link[hidden]{display:none}
.sub-hint{margin:2px 0 12px;padding:0;border:0;background:none;color:var(--accent);font-family:inherit;font-size:12.5px;line-height:1.5;text-align:left;text-decoration:underline;text-underline-offset:2px;cursor:pointer}
.sub-hint[hidden]{display:none}
.replace-note{margin:2px 0 12px;font-size:12.5px;line-height:1.6;color:var(--muted)}
.replace-note[hidden]{display:none}
.replace-note strong{color:var(--text);font-weight:600}
#subscribe{max-width:460px}
@media(max-width:520px){.subscribe-open{padding:8px}.subscribe-open span{display:none}}
.visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}

/* ---------- language picker ---------- */
.lang-picker{position:relative}
.lang-trigger{display:inline-flex;align-items:center;gap:7px;padding:8px 10px}
.lang-trigger svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round;flex:none}
.lang-trigger .caret{width:11px;height:11px;opacity:.6;stroke-width:2}
.lang-trigger[aria-expanded=true]{border-color:var(--accent);color:var(--text)}
.lang-menu{position:absolute;top:calc(100% + 8px);right:0;z-index:60;display:grid;gap:2px;min-width:172px;padding:5px;background:var(--raised);border:1px solid var(--line);border-radius:10px;box-shadow:0 14px 34px rgba(0,0,0,.42)}
.lang-menu[hidden]{display:none}
.lang-option{display:flex;align-items:center;justify-content:space-between;gap:14px;width:100%;padding:9px 10px;border:0;border-radius:7px;background:none;color:var(--muted);font-family:inherit;font-size:13px;line-height:1.2;text-align:left;cursor:pointer}
.lang-option:hover{background:var(--surface);color:var(--text)}
.lang-option[aria-checked=true]{color:var(--text);font-weight:600}
.lang-option:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}
.lang-check{width:14px;height:14px;flex:none;fill:none;stroke:var(--accent);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;opacity:0}
.lang-option[aria-checked=true] .lang-check{opacity:1}
/* The same "Method & sources" dialog opens from the editorial block and the
   footer, so the header copy can go before the subscribe button is squeezed. */
@media(max-width:1200px){.header-actions .quiet{display:none}}
@media(max-width:520px){.lang-menu{left:0;right:auto}}

/* ---------- past letters (archive view, behind the nav) ---------- */
#letters{padding:46px 0 96px}
.archive{margin:0}
.archive-list{display:grid;gap:14px;margin-top:26px}
.issue{border:1px solid var(--line);border-radius:10px;background:var(--surface);overflow:hidden}
.issue-head{display:flex;align-items:center;gap:16px;width:100%;padding:16px 20px;text-align:left}
.issue-head svg{width:16px;height:16px;flex:none;color:var(--muted);transition:transform .15s,color .15s}
.issue.open .issue-head svg{transform:rotate(180deg);color:var(--accent)}
.issue-date{font-size:15px;font-weight:650;letter-spacing:.02em;font-variant-numeric:tabular-nums}
.issue-count{font-size:12px;color:var(--muted);margin-left:auto}
.issue-head:hover .issue-date{color:var(--accent)}
.issue-body{padding:0 20px 8px;border-top:1px solid var(--line)}
.issue-entries{list-style:none;margin:0;padding:0}
.issue-entry{padding:16px 0;border-bottom:1px solid var(--line)}
.issue-entry:last-child{border-bottom:0;padding-bottom:10px}
.issue-entry-top{display:flex;align-items:baseline;justify-content:space-between;gap:14px}
/* The entry badge now carries the same wording as every status chip, which can
   be longer than the old four-character mark — keep the badge on one line and
   let the name absorb the squeeze. Without min-width:0 a single unbreakable
   token ("discountschoolsupply.com") holds the row open and pushes the badge
   off the right edge on a 360px phone. */
.issue-entry-top .issue-name{min-width:0;overflow-wrap:anywhere}
.issue-entry-top .issue-count{white-space:nowrap;flex-shrink:0}
.issue-name{font-size:14px;font-weight:600;text-align:left;padding:0}
.issue-name:hover{color:var(--accent)}
.issue-link{font-size:12px;color:var(--accent);white-space:nowrap;text-decoration:underline;text-underline-offset:3px}
.issue-what{margin:6px 0 0;font-size:13px;line-height:1.75;color:var(--muted)}
.issue-row{margin:4px 0 0;font-size:12.5px;line-height:1.7;color:var(--muted)}
.issue-row strong{color:var(--text);font-weight:600}
@media(max-width:760px){#letters{padding:32px 0 64px}.issue-head{padding:14px 16px}.issue-body{padding:0 16px 4px}}

/* ---------- the library is a page of its own, not a section of the home page ---------- */
#library{padding:46px 0 96px}
/* The title used to be the second heading of the home page, so it borrowed
   `.section-heading h2`. On its own page it is the first heading and has to
   carry the page without shouting like the home hero. */
#library-title{font-size:26px;letter-spacing:-.025em;line-height:1.35;margin:9px 0 0}
.page-copy{margin-top:10px;font-size:13.5px;line-height:1.75;color:var(--muted);max-width:640px}
@media(max-width:760px){#library{padding:32px 0 64px}#library-title{font-size:21px;line-height:1.45}.page-copy{font-size:12.5px;max-width:none}}

/* ---------- editions a reader cannot open yet ---------- */
.issue.is-locked .issue-head{cursor:pointer}
.issue.is-locked .issue-head:hover .issue-date{color:var(--accent)}
.issue-lock{color:var(--muted)!important}
.issue-locked{display:flex;flex-wrap:wrap;align-items:center;gap:12px 22px;padding:18px 0 20px}
.issue-locked p{flex:1 1 240px;margin:0;font-size:12.5px;line-height:1.7;color:var(--muted)}
.issue-locked .primary{flex:0 0 auto;white-space:nowrap}
@media(max-width:640px){.issue-locked .primary{width:100%}}

/* ---------- loading placeholders ----------
   An empty box under a heading does not read as "loading": the header and the
   intro are already painted, so the gap reads as a failure. These blocks reuse
   the real wrappers and the real sizes, so nothing moves when content lands.
   The pulse is the smallest possible signal — no spinner, no progress bar,
   nothing to watch, just enough to say the page is still working. */
.sk{background:var(--raised);border-radius:5px;animation:sk-breathe 1.5s ease-in-out infinite}
@keyframes sk-breathe{0%,100%{opacity:.4}50%{opacity:.85}}
.sk-line{height:12px;width:100%}
.sk-stack{display:grid;gap:9px}
.sk-title{height:15px;width:42%;border-radius:4px}
.sk-meta{height:9px;width:34%}
.sk-eyebrow{height:9px}
.sk-initial{width:45px;height:45px;border-radius:10px;flex-shrink:0}
.sk-hero-title{height:30px;width:62%;border-radius:7px}
.sk-feature-media{width:100%;aspect-ratio:1.5;border-radius:8px}
.sk-card-art{width:100%;aspect-ratio:1.65;border-radius:8px}
.sk-card-title{height:17px;width:45%}
.sk-card-line{height:11px;margin-top:10px}
.sk-card-meta{height:9px;margin-top:16px}
.sk-w-15{width:15%}
.sk-w-25{width:25%}
.sk-w-30{width:30%}
.sk-w-40{width:40%}
.sk-w-45{width:45%}
.sk-w-60{width:60%}
.sk-w-70{width:70%}
.sk-w-75{width:75%}
.sk-w-90{width:90%}
/* a placeholder row is not content: it must never take a click or a focus */
.is-skeleton{pointer-events:none}
@media(prefers-reduced-motion:reduce){.sk{animation:none;opacity:.6}}
/* the real media blocks are height-capped when the feature stacks, so the
   placeholder has to be capped too or the page jumps when the image lands */
@media(max-width:1050px){.sk-feature-media{aspect-ratio:auto;height:200px}}
@media(max-width:760px){.sk-feature-media{height:190px}}
:root[data-theme=light] .sk{background:#e5eae1}

/* ---------- daily snapshots (archive as a time series) ---------- */
/* The hero slot can hold a vendor image or, when the day's pick has none,
   an initial mark — most collected projects never shipped a screenshot. */
.feature-monogram{display:grid;place-items:center;width:100%;aspect-ratio:16/10;max-height:280px;border:1px solid var(--line);border-radius:10px;background:var(--raised);color:var(--accent);font-size:82px;font-weight:600;line-height:1}
/* Collected names often carry the vendor's one-line pitch after a comma. The
   heading keeps every word but steps down a size so a five-line title does not
   push the media block off the first screen. */
.feature h2.is-long{font-size:31px;line-height:1.28;letter-spacing:-.03em}
.feature-media:hover .feature-monogram{border-color:var(--accent)}
.day-summary{margin:0 0 14px;font-size:12px;color:var(--muted);font-variant-numeric:tabular-nums}
.day-letter{margin:0 0 18px;padding:14px 16px;border:1px solid var(--line);border-radius:9px;background:var(--raised)}
.day-letter-title{margin:0 0 10px;font-size:12px;font-weight:600;color:var(--accent)}
.day-letter .issue-entries{margin:0}
@media(max-width:760px){.feature-monogram{font-size:64px;aspect-ratio:16/9}.feature h2.is-long{font-size:26px;line-height:1.3}}

/* ---------- detail: the four explained sections ----------
   Each block now leads with a short reason and follows with a reading of the
   number, so the column needs a nested heading level and two numbered lists. */
.detail-section h4{margin:18px 0 9px;font-size:10.5px;font-weight:600;letter-spacing:.09em;text-transform:uppercase;color:var(--muted)}
.detail-section h4:first-of-type{margin-top:0}
.section-intro{margin-bottom:13px!important}
.reason-list,.check-list{display:grid;gap:13px;margin:0;padding:0;list-style:none;counter-reset:item}
.reason-list li,.check-list li{position:relative;counter-increment:item;display:grid;gap:2px;padding-left:20px}
.reason-list li::before,.check-list li::before{content:counter(item) ".";position:absolute;left:0;top:0;color:var(--accent);font-size:11px;font-weight:650;line-height:1.85;font-variant-numeric:tabular-nums}
.reason-list li strong,.check-list li strong{font-size:12.5px;font-weight:600;line-height:1.7}
.reason-list li span,.check-list li span{font-size:12px;line-height:1.8;color:var(--muted)}
.reading+.reading{margin-top:11px}
.reading .evidence-row{padding:0 0 6px;border-bottom:0}
.reading .evidence-note{margin-top:3px!important}
.business-shape{font-size:13px!important;font-weight:600;color:var(--text)!important;margin-bottom:5px!important}
.guess{font-size:12px!important;line-height:1.85}
.desc-label{padding:1px 6px;border-radius:4px;background:var(--raised);color:var(--muted);font-size:10px;letter-spacing:.02em}
.detail-unknown .check-list li strong{color:var(--text)}
@media(max-width:760px){.reason-list li strong,.check-list li strong{font-size:13px}.reason-list li span,.check-list li span{font-size:12.5px}}
/* The verification list is the reader's own to-do, so it sits under the open
   button rather than spanning the dialog — and it fills the left column, which
   otherwise goes empty once the evidence column grows. */
.detail-main .detail-unknown{margin-top:30px}
.detail-main .detail-unknown h3{font-size:12.5px}
.desc-label{display:block;width:fit-content;margin:0 0 6px}

/* ---------- detail: what the reader could do with it ----------
   The one block that answers "so what for me". It closes the dialog, so it gets
   the full width and an accent rule rather than another grey paragraph. */
.detail-angle{padding:18px 20px;border-radius:9px;border-left:2px solid var(--accent);background:var(--surface)}
.detail-angle h3{margin:0 0 10px;font-size:12.5px}
.detail-angle .angle-head{margin:0 0 8px;font-size:13.5px;font-weight:600;line-height:1.65;letter-spacing:-.01em}
.detail-angle .angle-body{margin:0 0 10px;font-size:12.5px;line-height:1.85;color:var(--muted)}
.detail-angle .evidence-note{margin-top:0!important;font-size:11px}
/* The one sentence written about this record rather than about its line of
   business. Set apart from the paragraph above it so a reader can tell which
   is the general read and which is about the thing in front of them. */
.detail-angle .angle-cut{margin:0 0 10px;padding:10px 12px;border-radius:7px;background:var(--bg);border:1px solid var(--line)}
.detail-angle .angle-cut p{margin:0;font-size:12.5px;line-height:1.8}
.detail-angle .angle-cut-label{display:block;margin-bottom:5px;font-size:9.5px;letter-spacing:.09em;text-transform:uppercase;color:var(--accent)}
@media(max-width:760px){.detail-angle{padding:15px 16px}.detail-angle .angle-head{font-size:13px}}

/* ---------- detail page: four numbered blocks ----------
   One column, one order, the same order a reader asks the questions. The page
   used to be two columns — the take on the left, the receipts on the right —
   which made the reader assemble the argument from two places and let the same
   fact appear twice. The number in the gutter is what makes it scannable:
   a reader who only wants the money skips to 02. */
.detail-body{padding:20px 32px 8px;max-width:none}
/* The title had no rule of its own and rode on the browser default, which left
   it flush against the sticky header on first paint. Given a size and some air
   so the dialog opens on a name, not on a button. */
#detail-title{font-size:26px;font-weight:620;line-height:1.25;letter-spacing:-.02em;margin:0 0 12px}
.dlist{list-style:none;margin:26px 0 0;padding:0;display:grid;gap:26px;counter-reset:none}
.dsec{padding-top:22px;border-top:1px solid var(--line)}
.dsec:first-child{padding-top:0;border-top:0}
.dsec h3{display:flex;align-items:baseline;gap:9px;margin:0 0 12px;font-size:13.5px;letter-spacing:.01em}
.dnum{font-size:10.5px;font-weight:650;color:var(--accent);font-variant-numeric:tabular-nums;letter-spacing:.06em}
.dsec .dlead{margin:0 0 10px;font-size:13.5px;font-weight:600;line-height:1.7;letter-spacing:-.01em}
.dsec .dquote{margin:0 0 8px;font-size:13px;line-height:1.8;color:var(--muted)}
.dsec .dnote{margin:10px 0 0;font-size:11.5px;line-height:1.75;color:var(--muted)}
.dsec .dnote-guess{padding-top:10px;border-top:1px dashed var(--line)}
/* Where the money comes from: one row per detected trace, the way it charges
   in bold, who pays underneath. */
.dtrace{list-style:none;margin:0;padding:0;display:grid;gap:10px}
.dtrace li{display:grid;gap:3px;padding-left:14px;position:relative}
.dtrace li::before{content:"";position:absolute;left:0;top:7px;width:5px;height:5px;border-radius:50%;background:var(--accent)}
.dtrace b{font-size:12.5px;font-weight:600;line-height:1.6}
.dtrace span{font-size:12px;line-height:1.75;color:var(--muted)}
/* The numbers: the figure first and big enough to read, the list it came from
   beside it, the reading underneath. */
.dmetrics{display:grid;gap:14px}
.dmetric{display:grid;grid-template-columns:auto 1fr;gap:2px 12px;align-items:baseline}
.dmetric strong{font-size:16px;font-weight:650;font-variant-numeric:tabular-nums;letter-spacing:-.01em}
.dmetric span{font-size:11.5px;color:var(--muted);line-height:1.6}
.dmetric p{grid-column:1/-1;margin:3px 0 0;font-size:11.5px;line-height:1.75;color:var(--muted)}
/* What it means for me: the verdict in one line, then the labelled rows.
   The label column is sized once for the whole list, not per row — each `li`
   used to size its own grid, so every row started its text at a different x
   and the block looked hand-placed. `display:contents` drops the `li` box and
   lets the label and the line join the list's grid, so one width serves all. */
.dbullets{list-style:none;margin:14px 0 0;padding:0;display:grid;grid-template-columns:max-content minmax(0,1fr);column-gap:12px}
.dbullets li{display:contents}
.dbullets b,.dbullets span{padding-top:10px;border-top:1px solid var(--line)}
.dbullets li:first-child b,.dbullets li:first-child span{padding-top:0;border-top:0}
.dbullets b{font-size:12px;font-weight:600;color:var(--text);line-height:1.75;white-space:nowrap}
.dbullets span{font-size:12px;line-height:1.8;color:var(--muted)}
/* A guest gets the first row and the *label* of the rest. The label is the
   point — it says what is behind the account instead of leaving a hole, and the
   row it belongs to stays in the same grid, so the block still lines up. */
.dbullets .is-locked b{color:var(--muted);font-weight:500}
.dbullets .is-locked span{color:var(--muted);opacity:.55;letter-spacing:.05em}
/* A row with no label spans both columns rather than being squeezed into the
   narrow one. */
.dbullets span:only-child{grid-column:1/-1}
/* The single ask on the page, sitting where the reader runs into the cut. */
.dlock-cta{margin:20px 0 0;padding-top:16px;border-top:1px solid var(--line)}
.dlock-cta p{margin:0 0 12px;font-size:12px;line-height:1.75;color:var(--muted)}
.dlock-cta .auth-submit{width:auto;min-width:170px;padding:11px 18px}
.dlock-cta .auth-fine{margin:10px 0 0}
/* The industry guess ships as one sentence with ①②③ inside it. Numbered,
   because three routes are three routes; the payer gets its own line because
   it answers the block title rather than naming a fourth route. */
.dguess-block{margin:16px 0 0;padding-top:13px;border-top:1px dashed var(--line)}
.dguess-title{margin:0 0 9px;font-size:11px;letter-spacing:.03em;color:var(--muted)}
.dguess{display:grid;grid-template-columns:max-content minmax(0,1fr);column-gap:9px;row-gap:6px}
.dguess .dg{display:contents}
.dguess b{font-size:9.5px;font-weight:650;color:var(--accent);opacity:.8;font-variant-numeric:tabular-nums;line-height:1.95}
.dguess span{font-size:11.5px;line-height:1.75;color:var(--muted)}
.dguess-payer{margin:9px 0 0;font-size:11.5px;line-height:1.75;color:var(--text)}
.detail-body .angle-cut{margin:16px 0 0;padding:11px 13px;border-radius:7px;background:var(--surface);border-left:2px solid var(--accent)}
.detail-body .angle-cut p{margin:0;font-size:12.5px;line-height:1.8}
.detail-body .angle-cut-label{display:block;margin-bottom:5px;font-size:9.5px;letter-spacing:.09em;text-transform:uppercase;color:var(--accent)}
.detail-body .detail-unknown{margin-top:26px;padding-top:20px;border-top:1px solid var(--line)}
.detail-body .detail-unknown h3{font-size:12.5px;margin:0 0 12px}
@media(max-width:760px){
  .detail-body{padding:16px 20px 6px}
  #detail-title{font-size:23px}
  .dsec h3{font-size:13px}.dsec .dlead{font-size:13px}
  .dmetric strong{font-size:15px}
  /* One column: label above its line, the rule moves up to the label. */
  .dbullets{grid-template-columns:1fr;row-gap:2px}
  .dbullets b{padding-top:10px;border-top:1px solid var(--line);white-space:normal}
  .dbullets span{padding-top:0;border-top:0}
  .dguess{grid-template-columns:1fr;row-gap:2px}
  .dguess b{line-height:1.6;padding-top:2px}
}

/* ---------- list card: the verdict chip ----------
   One label that says what the record is good for, before the reader opens it.
   Actionable verdicts carry the accent; the two weak ones stay quiet so a page
   of cards does not turn into a wall of colour. */
.angle-tag{display:inline-block;padding:2px 7px;border-radius:99px;border:1px solid var(--line);font-size:9.5px;letter-spacing:.02em;line-height:1.55;white-space:nowrap;color:var(--muted)}
.angle-tag.is-build,.angle-tag.is-reuse{border-color:var(--accent);color:var(--accent)}
.angle-tag.is-skip{opacity:.6}
/* A category-derived label is a weaker claim than a keyword hit, and the page
   says so in the same line rather than burying it. */
.shape-basis{display:inline-block;margin-left:7px;font-size:10px;font-weight:400;color:var(--muted);letter-spacing:0}
.result-shape{color:var(--muted);font-size:10px;letter-spacing:.01em}

/* Movement: a third cell in a card's meta line, and the opening of the featured
   line. Only the upward case is ever rendered (see growthLine) — a card is a
   list of things worth a look, and "slipped 12 places" is not an invitation.
   So there is one colour here, not two. */
.result-meta .growth{display:inline-flex;align-items:baseline;gap:3px;color:var(--accent);font-variant-numeric:tabular-nums}
.result-meta .growth-arrow{font-weight:400;font-size:9px;line-height:1;transform:translateY(-1px)}
.feature-signal .growth{display:inline-flex;align-items:baseline;gap:3px;color:var(--accent);font-variant-numeric:tabular-nums}
.feature-signal .growth-arrow{font-weight:400;font-size:9px;line-height:1;transform:translateY(-1px)}

/* The featured line is one short sentence and breaks badly: a trailing "索" on
   its own row reads as a typo before it reads as a line break. */
.feature-signal{text-wrap:pretty}
