/* ==========================================================================
   Investigating the Effects of LLM Use on Critical Thinking Under Time
   Constraints — CHI '26 project page.

   This is the production stylesheet from the original build, adopted whole
   rather than re-derived: every earlier attempt to approximate it by
   measuring rendered elements drifted. Only the hero art path is changed,
   since the asset now lives in ./assets rather than at the site root.
   ========================================================================== */

*,:before,:after{box-sizing:border-box}body{background:#fff;margin:0;padding:0}#root{width:100%}.carousel-container{flex-direction:column;gap:12px;width:100%;display:flex}.carousel-body{align-items:center;gap:12px;width:100%;display:flex}.carousel-track-wrap{aspect-ratio:16/9;border-radius:10px;flex:1;min-width:0;overflow:hidden}.carousel-track{height:100%;transition:transform .45s cubic-bezier(.4,0,.2,1);display:flex}.carousel-item{cursor:pointer;flex:0 0 100%;height:100%;position:relative;overflow:hidden}.carousel-item img{object-fit:contain;object-position:center;width:100%;height:100%;display:block}.carousel-caption{opacity:0;pointer-events:none;background:linear-gradient(#0000 0%,#000000a6 100%);padding:32px 20px 16px;transition:opacity .25s;position:absolute;bottom:0;left:0;right:0}.carousel-item:hover .carousel-caption{opacity:1}.carousel-caption p{color:#fff;margin:0;font-family:Instrument Sans,sans-serif;font-size:14px;font-weight:500;line-height:1.5}.carousel-btn{cursor:pointer;background-color:#293e8c;border:none;border-radius:15px;flex-shrink:0;justify-content:center;align-items:center;width:36px;height:36px;transition:background-color .2s,opacity .2s;display:flex}.carousel-btn:hover{opacity:1;background-color:#3750aa}.carousel-indicators{justify-content:center;align-items:center;gap:7px;display:flex}.carousel-dot{cursor:pointer;background-color:#0003;border:none;border-radius:50%;width:8px;height:8px;padding:0;transition:background-color .2s,transform .2s}.carousel-dot.active{background-color:#293e8c;transform:scale(1.25)}.carousel-dot:hover:not(.active){background-color:#0006}@media (width<=768px){.carousel-btn{border-radius:10px;width:30px;height:30px}.carousel-caption p{font-size:12px}}@media (width<=480px){.carousel-btn{border-radius:8px;width:26px;height:26px}.carousel-btn svg{width:16px;height:16px}.carousel-caption p{font-size:11px}}.carousel-section{width:100%;margin:0}.findings-carousel{flex-direction:column;align-items:center;gap:14px;width:100%;display:flex}.findings-carousel-body{justify-content:center;align-items:center;gap:12px;width:100%;display:flex}.findings-carousel-image-wrap{border-radius:10px;width:100%;overflow:hidden}.findings-carousel-image-wrap img{object-fit:contain;object-position:center;width:100%;height:100%;display:block}.findings-carousel-btn{cursor:pointer;opacity:.8;background-color:#293e8c;border:none;border-radius:10px;flex-shrink:0;justify-content:center;align-items:center;width:32px;height:32px;transition:opacity .2s,background-color .2s;display:flex}.findings-carousel-btn:hover{opacity:1;background-color:#3750aa}.findings-carousel-caption{color:#000000bf;width:100%;margin:0;font-family:Instrument Sans,sans-serif;font-size:15px;line-height:1.5}.findings-carousel-indicators{justify-content:center;align-items:center;gap:7px;display:flex}.findings-carousel-dot{cursor:pointer;background-color:#0003;border:none;border-radius:50%;width:7px;height:7px;padding:0;transition:background-color .2s,transform .2s}.findings-carousel-dot.active{background-color:#293e8c;transform:scale(1.25)}.findings-carousel-dot:hover:not(.active){background-color:#0006}@media (width<=500px){.findings-carousel-btn{border-radius:8px;width:26px;height:26px}.findings-carousel-btn svg{width:14px;height:14px}}html{scroll-behavior:smooth}@font-face{font-family:Instrument Sans;font-style:italic;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/instrumentsans/v4/pxigypc9vsFDm051Uf6KVwgkfoSbSnNPooZAN0lInHGpCWNE27lgU-XJojENut22oy4H2w.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Instrument Sans;font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/instrumentsans/v4/pxiTypc9vsFDm051Uf6KVwgkfoSxQ0GsQv8ToedPibnr0SZe1Q.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Instrument Sans;font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/instrumentsans/v4/pxiTypc9vsFDm051Uf6KVwgkfoSxQ0GsQv8ToedPibnr0SZe1Q.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Instrument Sans;font-style:normal;font-weight:600;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/instrumentsans/v4/pxiTypc9vsFDm051Uf6KVwgkfoSxQ0GsQv8ToedPibnr0SZe1Q.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Instrument Sans;font-style:normal;font-weight:700;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/instrumentsans/v4/pxiTypc9vsFDm051Uf6KVwgkfoSxQ0GsQv8ToedPibnr0SZe1Q.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Fragment Mono;font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/fragmentmono/v6/4iCr6K5wfMRRjxp0DA6-2CLnB4NHhg.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:normal;font-weight:300;src:url(https://framerusercontent.com/assets/GrgcKwrN6d3Uz8EwcLHZxwEfC4.woff2);unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+2000-206F,U+2070,U+2074-207E,U+2080-208E,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}html{scroll-padding-top:72px}body{color:#000;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fff;font-family:Instrument Sans,sans-serif}p{margin:0}strong{font-weight:600}a{text-decoration:none}.page-root{background:#fff;flex-direction:column;align-items:center;width:100%;max-width:1705px;min-height:100vh;margin:0 auto;display:flex;position:relative}.top-nav{z-index:100;background:#fff;border-bottom:1px solid #00000012;justify-content:center;width:100%;max-width:1705px;padding:16px 0;display:flex;position:fixed;top:0;left:50%;transform:translate(-50%)}.nav-links{align-items:center;gap:30px;display:flex}.nav-item{letter-spacing:-.01em;color:#757575;cursor:pointer;background:#fff;border-radius:4px;align-items:center;gap:4px;padding:0 8px;font-family:Instrument Sans,sans-serif;font-size:15px;font-weight:500;line-height:2em;transition:background .15s;display:flex}.nav-item:hover{background:#0000000a}.nav-caret{flex-shrink:0;width:14px;height:14px;transition:transform .15s}.nav-item:hover .nav-caret{transform:rotate(180deg)}.dropdown{position:relative}.dropdown:after{content:"";width:100%;height:16px;position:absolute;bottom:-8px;left:0}.dropdown-menu{z-index:1000;opacity:0;background:#fff;border:1px solid #0000001a;border-radius:8px;min-width:180px;margin-top:8px;padding:8px 0;transition:opacity .15s,transform .15s;display:none;position:absolute;top:100%;left:0;transform:translateY(0);box-shadow:0 2px 10px #0000001a}.dropdown:hover .dropdown-menu{opacity:1;display:block;transform:translateY(0)}.dropdown-item{color:#757575;white-space:nowrap;padding:8px 16px;font-family:Instrument Sans,sans-serif;font-size:14px;font-weight:500;line-height:1.4em;text-decoration:none;transition:background .15s;display:block}.dropdown-item:hover{color:#2d3c83;background:#0000000a}#main{box-sizing:border-box;width:100%;margin-top:53px}.hero-section{box-sizing:border-box;background-image:url(../assets/bg-hero.png);background-position:50%;background-repeat:no-repeat;background-size:cover;flex-direction:column;justify-content:flex-start;align-items:flex-start;width:100%;height:calc(100vh - 53px);display:flex;position:relative;overflow:hidden}@media (width<=768px){.hero-section{background-image:url(../bg-hero-h5.png)}}.content-section{box-sizing:border-box;padding-top:20px}.hero-overlay{z-index:1;outline:none;flex-direction:column;justify-content:center;align-items:flex-start;width:100%;height:100%;padding:0 0 0 12%;display:flex;position:relative}.hero-inner{justify-content:flex-start;align-items:center;width:100%;padding:0;display:flex}.hero-text-block{text-align:left;flex-direction:column;align-items:flex-start;gap:45px;width:100%;max-width:1000px;display:flex}.hero-title{color:#2d3c83;text-align:left;max-width:1000px;margin:0;font-family:Instrument Sans,sans-serif;font-size:55px;font-weight:700;line-height:1.6em}.hero-actions{align-items:center;gap:30px;display:flex}.btn-primary{color:#fff;background-color:#2d3c83;border-radius:20px;align-items:center;gap:0;width:270px;height:54px;padding:0 0 0 20px;font-family:Instrument Sans,sans-serif;font-size:23px;font-weight:500;line-height:1.4em;text-decoration:none;transition:opacity .15s;display:inline-flex;box-shadow:0 2px 4px #0000001a}.btn-primary:hover{font-weight:700}.btn-arrow{aspect-ratio:1;--1335ju:1;--18mrqx2:#969696;flex:none;width:50px;height:50px}.resources-button .btn-primary{cursor:pointer;height:40px;overflow:var(--overflow-clip-fallback,clip);will-change:var(--framer-will-change-override,transform);opacity:1;color:#fff;white-space:nowrap;background-color:#394ba0;border-radius:18px;flex-flow:row;place-content:center;align-items:center;gap:10px;width:189px;padding:0 0 0 5px;font-family:Instrument Sans,sans-serif;font-size:14px;font-weight:500;line-height:1.4em;text-decoration:none;transition:all .15s;display:flex;position:relative;box-shadow:0 2px 4px #0000001a}.resources-button .btn-primary:hover{font-weight:700}.resources-button .btn-arrow{aspect-ratio:1;fill:#fff;flex:none;width:16px;height:16px}.content-section{box-sizing:border-box;flex-direction:column;align-items:flex-start;gap:25px;width:100%;max-width:1000px;margin:0 auto;padding:80px 40px;display:flex;position:relative}.content-section:after{content:"";background-color:#ccc;width:150px;height:1px;position:absolute;bottom:50px;left:50%;transform:translate(-50%)}.content-section.no-divider:after{display:none}.section-abstract{padding:120px 40px 100px;scroll-margin-top:182px}.abstract-top{flex-direction:column;align-items:center;gap:15px;width:100%;display:flex}.paper-subtitle{text-align:center;color:#394ba0;margin:0;font-family:Lora,serif;font-size:28px;font-weight:400;line-height:1.3em}.paper-subtitle strong{font-weight:700}.authors-line{text-align:center;color:#000;font-family:Instrument Sans,sans-serif;font-size:16px;line-height:1.6em}.resource-links{flex-wrap:wrap;justify-content:center;align-items:center;gap:15px;width:100%;padding:0;display:flex}.res-btn{color:#fff;white-space:nowrap;background-color:#394ba0;border-radius:12px;flex:none;justify-content:center;align-items:center;gap:10px;height:32px;padding:0;font-family:Instrument Sans,sans-serif;font-size:14px;line-height:1.4em;text-decoration:none;transition:opacity .15s;display:inline-flex}.res-btn:hover{font-weight:700}.res-btn img{filter:brightness(0)invert()}.res-btn-wide{width:100px}.res-btn-standard{width:78px}.res-btn-lg{width:133px;padding:0 0 0 5px}.section-heading{color:#0009;text-align:left;margin:0;font-family:Lora,serif;font-size:28px;font-weight:700;line-height:1.3em}.subsection-heading{color:#0009;text-align:left;margin:0;font-family:Lora,serif;font-size:22px;font-weight:700;line-height:1.3em}.bibtex-title{color:#0009;text-align:left;margin:0;font-family:Instrument Sans,sans-serif;font-size:24px;font-weight:700;line-height:1.3em}.body-text{color:#000;width:100%;font-family:Instrument Sans,sans-serif;font-size:17px;line-height:1.6em}.body-text p{font-family:Instrument Sans,sans-serif;font-size:17px;line-height:1.6em}.text-link{color:#a10000;text-decoration:none}.text-link:hover{text-decoration:underline}.section-body{flex-direction:column;gap:20px;width:100%;display:flex}.section-subsections{flex-direction:column;gap:60px;width:100%;display:flex}.subsection{flex-direction:column;align-items:flex-start;gap:20px;width:100%;display:flex}.bg-icons-row{justify-content:center;align-items:center;gap:25px;width:100%;height:40px;display:flex}.bg-icon{justify-content:center;align-items:center;width:10%;height:40px;display:flex;position:relative;overflow:hidden}.bg-icon img{object-fit:contain;object-position:center;width:100%;height:100%;display:block}.aspect-img-wrap{width:100%;position:relative;overflow:hidden}.aspect-img-wrap img{object-fit:contain;object-position:center;width:100%;height:100%;display:block;position:absolute;inset:0}.tc-table-wrap{width:100%;padding:20px 0}.tc-responsive-container{flex-direction:column;gap:24px;margin-bottom:10px;display:flex;overflow-x:auto}.tc-responsive-container::-webkit-scrollbar{height:8px}.tc-responsive-container::-webkit-scrollbar-track{background:#f1f1f1;border-radius:4px}.tc-responsive-container::-webkit-scrollbar-thumb{background:#d1d5db;border-radius:4px}.tc-responsive-container::-webkit-scrollbar-thumb:hover{background:#9ca3af}@media (width>=769px){.tc-table{border:1px solid #e5e7eb;border-radius:8px;flex-direction:column;min-width:100%;display:flex;overflow:hidden;box-shadow:0 1px 3px #0000000d}.tc-row{width:100%;transition:all .2s;display:flex}.tc-row:hover{background-color:#f3f4f680}.tc-cell{white-space:normal;text-align:left;border-bottom:1px solid #f0f0f0;min-height:80px;padding:16px 20px;font-family:Instrument Sans,sans-serif;font-size:14px;line-height:1.3em;display:block}.nowrap-content{white-space:nowrap}.tc-corner,.tc-row-hd,.tc-prior-corner{width:15%}.tc-col-hd,.tc-data,.tc-prior-cell{width:21.25%}.tc-cell:not(:last-child){border-right:1px solid #f0f0f0}.tc-header-row{color:#374151;background:#fff;border-bottom:2px solid #e5e7eb}.tc-header-row .tc-cell{background:#f9fafb;height:56px;font-weight:600}.tc-corner{background:#f3f4f6;font-weight:600}.tc-col-hd{color:#374151;background:#f9fafb}.tc-col-hd strong{font-weight:700}.tc-col-gray{background:#fefefe}.tc-row-hd{color:#1f2937;background:#fff;height:60px;font-size:14px;font-weight:600}.tc-row-hd strong{font-weight:700}.tc-data{color:#4b5563;white-space:normal;background:#fff;height:80px;font-size:14px}.tc-data strong{color:#1f2937;white-space:nowrap;align-items:center;gap:6px;font-weight:600;display:flex}.tc-prior-row .tc-cell{height:80px}.tc-prior-corner{color:#4b5563;font-weight:600}.tc-prior-cell{color:#374151;white-space:nowrap}.tc-prior-text{color:#4b5563}.tc-prior-text strong{color:#374151;white-space:nowrap;align-items:center;gap:6px;font-weight:600;display:flex}.tc-mobile-cards{display:none}}@media (width<=850px){.tc-table{display:none}.tc-mobile-cards{flex-direction:column;gap:24px;display:flex}.tc-time-section{flex-direction:column;gap:16px;display:flex}.tc-time-heading{color:#1f2937;background:#f3f4f6;border-radius:8px;padding:12px 16px;font-family:Instrument Sans,sans-serif;font-size:16px;font-weight:600}.tc-access-group{flex-direction:column;gap:12px;display:flex}.tc-access-heading{color:#374151;background:#f9fafb;border-radius:6px;padding:8px 16px;font-family:Instrument Sans,sans-serif;font-size:14px;font-weight:500}.tc-result-card{background:#fff;border:1px solid #e5e7eb;border-radius:8px;margin-left:16px;padding:16px;box-shadow:0 1px 3px #0000000d}.tc-result-title{color:#374151;margin-bottom:8px;font-family:Instrument Sans,sans-serif;font-size:13px;font-weight:500}.tc-result-content{color:#6b7280;font-family:Instrument Sans,sans-serif;font-size:12px;line-height:1.4em}.tc-result-content strong{color:#1f2937;font-weight:600}.tc-prior-section{border-top:1px solid #e5e7eb;margin-top:24px;padding-top:24px}.tc-prior-heading{color:#1f2937;margin-bottom:16px;font-family:Instrument Sans,sans-serif;font-size:16px;font-weight:600}.tc-prior-group{flex-direction:column;gap:12px;display:flex}.tc-prior-card{background:#fff;border:1px solid #e5e7eb;border-radius:8px;padding:16px;box-shadow:0 1px 3px #0000000d}.tc-prior-title{color:#374151;margin-bottom:8px;font-family:Instrument Sans,sans-serif;font-size:13px;font-weight:500}.tc-prior-content{color:#6b7280;font-family:Instrument Sans,sans-serif;font-size:12px;line-height:1.4em}.tc-prior-content strong{color:#1f2937;font-weight:600}}.table-caption{color:#6b7280;text-align:left;width:100%;padding:0 4px;font-family:Instrument Sans,sans-serif;font-size:14px;font-weight:800;line-height:1.6em}.impl-list{flex-direction:column;gap:12px;margin-top:12px;padding-left:24px;font-family:Instrument Sans,sans-serif;font-size:14px;line-height:1.6em;display:flex}.impl-list li{font-weight:400}.impl-list li p{margin:0}.rt-table-wrap{flex-direction:column;gap:10px;width:100%;display:flex}.rt-table{background:#f2f2f2;flex-direction:column;gap:2px;width:100%;display:flex}.rt-row{gap:2px;display:flex}.rt-cell{background:#fff;flex-direction:column;flex:1;justify-content:center;align-items:flex-start;min-height:30px;padding:6px 8px;font-family:Instrument Sans,sans-serif;font-size:9px;line-height:1.5em;display:flex}.rt-cell p{color:#757575;margin:0;font-family:Instrument Sans,sans-serif;font-size:9px;line-height:1.5em}.rt-header-row .rt-cell{background:#f2f2f2;min-height:30px}.rt-corner{background:#f2f2f2;min-width:18%;max-width:18%}.rt-col-hd{color:#757575;background:#f2f2f2;font-size:9px}.rt-col-hd strong{font-weight:700}.rt-row-hd{color:#575757;background:#fff;min-width:18%;max-width:18%;min-height:45px;font-size:9px}.rt-row-hd strong{font-weight:700}.rt-data{min-height:45px}.fw-high{color:#404040;font-weight:700}.fw-semi{color:#757575;font-weight:600}.fw-reg{color:#757575;font-weight:400}.bibtex-wrap{flex-direction:column;gap:15px;width:100%;display:flex}.bibtex-toolbar{justify-content:flex-end;align-items:center;gap:5px;display:flex}.btn-copy{color:#fff;cursor:pointer;white-space:nowrap;background:#3a4ba1;border:none;border-radius:15px;padding:10px 20px;font-family:Instrument Sans,sans-serif;font-size:16px;font-weight:600;line-height:1em;transition:opacity .15s}.btn-copy:hover{font-weight:700}.bibtex-code-box{background:#fafafa;border:2px solid #f2f2f2;border-radius:15px;width:100%;padding:20px;overflow:hidden}.bibtex-pre{color:#666;white-space:pre;margin:0;font-family:Fragment Mono,monospace;font-size:14px;line-height:1.5em;overflow-x:auto}.page-footer{justify-content:center;width:100%;max-width:1000px;margin:0 auto;padding:80px 0 40px;display:flex}.page-footer p{color:#000;font-family:Inter,sans-serif;font-size:14px;font-weight:300;line-height:1.6em}.research-table-wrap{flex-direction:column;gap:10px;width:100%;display:flex;overflow-x:auto}.research-table{border:1px solid #e5e7eb;border-radius:8px;flex-direction:column;width:100%;display:flex;overflow:hidden;box-shadow:0 1px 3px #0000000d}.research-mobile-cards{display:none}.research-row{border-bottom:1px solid #f0f0f0;display:flex}.research-row:hover{background-color:#f3f4f680}.research-cell{border-bottom:1px solid #f0f0f0;flex-direction:column;justify-content:flex-start;align-items:flex-start;width:20%;padding:6px 8px;font-family:Instrument Sans,sans-serif;font-size:14px;line-height:1.5em;display:flex}.research-cell:not(:last-child){border-right:1px solid #f0f0f0}.research-cell p{color:#4b5563;margin:0 0 2px;font-family:Instrument Sans,sans-serif;font-size:14px;line-height:1.5em}.research-header-row{color:#374151;background:#fff;border-bottom:2px solid #e5e7eb}.research-header-row .research-cell{background:#f9fafb;border-bottom:none;flex-direction:column;justify-content:center;align-items:center;width:20%;height:60px;padding:6px 8px;font-size:14px;font-weight:600;line-height:1.5em;display:flex}.research-corner{background:#f3f4f6;width:20%;font-weight:600}.research-col-hd{color:#374151;background:#f9fafb;border-bottom:none;font-size:10px}.research-col-hd strong{font-weight:700}.research-row-hd{color:#1f2937;background:#fff;border-bottom:none;width:20%;height:40px;padding:6px 8px;font-size:14px;font-weight:600}.research-row-hd strong{font-weight:700}.research-data{color:#4b5563;background:#fff;border-bottom:none;width:20%;height:60px;padding:6px 8px;font-size:10px}.content-container{flex-direction:column;align-items:flex-start;width:100%;max-width:1000px;margin:0 auto;display:flex}.resources-content{max-width:1000px;margin:0 auto;padding:0 20px}.resources-body{margin-top:24px}.resources-body p{margin-bottom:16px}.resources-body ul{margin-bottom:24px}.resources-button{margin-top:32px}@media (width<=768px){html{scroll-padding-top:60px}#main{scroll-snap-type:none;height:auto;margin-top:53px;position:relative;top:auto;overflow-y:visible}.hero-section{scroll-snap-align:none;scroll-snap-stop:unset;height:calc(100vh - 53px)}.content-section{height:auto;min-height:unset;scroll-snap-align:none;scroll-snap-stop:unset;overflow:visible}.top-nav{padding:12px 0}.nav-links{gap:15px}.nav-item{padding:0 6px;font-size:14px}.hero-overlay{padding:0 0 0 20px}.hero-text-block{gap:30px;width:85%}.hero-title{font-size:28px;line-height:1.4em}.btn-primary{width:220px;height:48px;padding:0 0 0 16px;font-size:18px}.btn-arrow{width:44px;height:44px}.content-section{width:90%;margin-bottom:20px;padding:53px 0}.content-section:after{width:90px;bottom:30px}.section-abstract{padding:80px 0 60px}.paper-subtitle{font-size:22px;line-height:1.2em}.resource-links{gap:10px}.res-btn{gap:8px;height:28px;font-size:12px}.res-btn-wide{width:85px}.res-btn-standard{width:68px}.res-btn-lg{width:110px}.section-heading{font-size:26px}.subsection-heading{font-size:18px}.bibtex-title{font-size:20px}.body-text{font-size:14px}.bg-icons-row{gap:15px}.tc-table-wrap,.rt-table-wrap,.research-table-wrap{overflow-x:auto}.tc-table,.rt-table,.research-table{display:none}.tc-mobile-cards,.research-mobile-cards{flex-direction:column;gap:24px;display:flex}.tc-time-section,.research-time-section{flex-direction:column;gap:16px;display:flex}.tc-time-heading,.research-time-heading{color:#1f2937;background:#f3f4f6;border-radius:8px;padding:12px 16px;font-family:Instrument Sans,sans-serif;font-size:16px;font-weight:600}.tc-access-group,.research-access-group{flex-direction:column;gap:12px;display:flex}.tc-access-heading,.research-access-heading{color:#374151;background:#f9fafb;border-radius:6px;padding:8px 16px;font-family:Instrument Sans,sans-serif;font-size:14px;font-weight:500}.tc-result-card,.research-result-card{background:#fff;border:1px solid #e5e7eb;border-radius:8px;margin-left:16px;padding:16px;box-shadow:0 1px 3px #0000000d}.tc-result-title,.research-result-title{color:#374151;margin-bottom:8px;font-family:Instrument Sans,sans-serif;font-size:13px;font-weight:500}.tc-result-content,.research-result-content{color:#6b7280;font-family:Instrument Sans,sans-serif;font-size:12px;line-height:1.4em}.tc-result-content strong,.research-result-content strong{color:#1f2937;font-weight:600}.bibtex-code-box{padding:15px}.bibtex-pre{font-size:12px}.page-footer{width:90%;padding:60px 0 30px}.page-footer p{font-size:12px}}@media (width<=480px){.hero-section{height:calc(100vh - 53px)}.hero-title{font-size:35px;line-height:1.8em}.btn-primary{width:180px;height:40px;font-size:16px}.btn-arrow{width:36px;height:36px}.paper-subtitle{font-size:20px}.resource-links{flex-direction:column;align-items:stretch}.res-btn{justify-content:center;width:100%}.tc-cell{padding:4px 5px;font-size:9px}.rt-cell{padding:5px 6px;font-size:8px}}.measure-list{flex-direction:column;gap:12px;margin:0;padding-left:24px;display:flex}.measure-list li{color:#000;font-family:Instrument Sans,sans-serif;font-size:17px;line-height:1.6em}.measure-list strong{font-weight:600}.section-body{flex-direction:column;gap:20px;display:flex}.section-body strong{color:#505050;font-weight:600}.resource-buttons{flex-wrap:wrap;justify-content:flex-start;align-items:center;gap:15px;width:100%;padding:0;display:flex}.resource-btn{color:#fff;white-space:nowrap;cursor:pointer;will-change:transform;opacity:1;white-space:nowrap;background-color:#394ba0;border-radius:18px;flex-flow:row;flex:none;place-content:center;align-items:center;gap:10px;width:189px;height:40px;padding:0 0 0 5px;font-family:Instrument Sans,sans-serif;font-size:14px;font-weight:500;line-height:1.4em;text-decoration:none;transition:all .15s;display:flex;position:relative;overflow:clip;box-shadow:0 2px 4px #0000001a}.resource-btn:hover{font-weight:700}.resource-btn .btn-arrow{width:20px;height:20px;transition:transform .2s}


/* ==========================================================================
   Condition coding
   --------------------------------------------------------------------------
   The original marks the experimental conditions inline, on two axes that
   carry different meanings and so are given different signals:

     access timing   black text, underlined — the blue ramp runs pale to
                     deep as the LLM arrives later, matching the charts
     time availability   coloured text, no underline

   Reproduced here as classes rather than inline styles.
   ========================================================================== */

.cond {
  font-style: italic;
  font-weight: 500;
  text-underline-offset: 4px;
}

.cond-early      { text-decoration: underline 3px #bde6ff; }
.cond-continuous { text-decoration: underline 3px #82cdff; }
.cond-late       { text-decoration: underline 3px #0144be; }
.cond-none       { text-decoration: underline 3px #00338f; }

/* No colour is set, so these inherit — black in body copy, 75% black
   inside a figure caption, exactly as on the original. */

.time-sufficient   { color: #008e05; }
.time-insufficient { color: #ed6500; }


/* ==========================================================================
   Adjustments
   ========================================================================== */

/* ---- Hero: a title screen ------------------------------------------------
   The artwork holds the whole viewport. The hero is not part of the paper —
   it is the cover, and "About the Paper" is the door into the content. */
.hero-section {
  height: calc(100vh - var(--nav-h, 53px));
  min-height: 520px;
  background: url("../assets/bg-hero.png") center / cover no-repeat;
}

.hero-section:before { content: none; }

.hero-overlay { z-index: 1; }

/* The 55px line at 1.6em was sized for a full screen; at 62vh it needs to
   sit tighter or the two lines swallow the block. */
.hero-title { line-height: 1.28em; }
.hero-text-block { gap: 30px; }

/* ---- Section divider: typographic ----------------------------------------
   Three spaced periods in Lora, the book convention for a section break,
   replacing the 150px hairline. The trailing letter-space sits to the right
   of the last period, so the centring is nudged back by half of it. */
.content-section:after {
  content: "\B7 \B7 \B7";
  width: auto;
  height: auto;
  bottom: 40px;
  background: none;
  color: #c8c8c8;
  font-family: Lora, serif;
  font-size: 26px;
  line-height: 1;
  letter-spacing: 0.35em;
  transform: translateX(calc(-50% - 0.175em));
}


/* The link-button glyphs are 200px SVGs shown at ~18px. Their size comes from
   width/height attributes on the img; without a floor here, a missing
   attribute renders them at full size and `invert` paints white shapes
   across the page. */
.res-btn img { max-width: 24px; max-height: 20px; }


/* ---- Section spine --------------------------------------------------------
   One dot per section in the left margin, label on hover. It sits in space
   the 1000px shell was already wasting, so nothing else has to move.      */
.spine {
  position: fixed;
  left: 26px;
  top: 50%;
  transform: translateY(-50%);
  z-index: 90;
}

.spine ul {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: 22px;
  margin: 0;
  padding: 0;
  list-style: none;
}

.spine ul:before {
  content: "";
  position: absolute;
  left: 4px;
  top: -8px;
  bottom: -8px;
  width: 1px;
  background: #ececec;
}

.spine a {
  position: relative;
  display: block;
  width: 9px;
  height: 9px;
}

.spine .dot {
  display: block;
  width: 9px;
  height: 9px;
  border-radius: 50%;
  background: #d7dae0;
  transition: background-color 0.2s, transform 0.2s;
}

.spine a.current .dot {
  background: #2d3c83;
  transform: scale(1.35);
}

.spine .lab {
  position: absolute;
  left: 20px;
  top: 50%;
  transform: translateY(-50%);
  padding: 3px 9px;
  white-space: nowrap;
  background: #fff;
  border: 1px solid #e5e7eb;
  border-radius: 5px;
  color: #555;
  font-size: 12.5px;
  line-height: 1.4;
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.16s;
}

/* Gated, or the label latches open after a tap on iOS. */
@media (hover: hover) and (pointer: fine) {
  .spine a:hover .dot { background: #9aa2b8; }
  .spine a:hover .lab { opacity: 1; }
}

.spine a:focus-visible .lab { opacity: 1; }

/* Below this the margin is gone and the top bar is the navigation. */
@media (max-width: 1080px) {
  .spine { display: none; }
}


/* ==========================================================================
   Type scale, measure and rhythm
   --------------------------------------------------------------------------
   The sizes on the page had accumulated rather than been chosen: 17/16/15/14
   were four steps doing nearly the same job, the BibTeX heading was the only
   h2 not in Lora, the footer used Inter for one line, and the findings table
   sat at 10px. This is a 1.25 ratio anchored on the 17px body:

       13 · 15 · 17 · 21 · 26 · 33 · 41
   ========================================================================== */

:root {
  --t-fine: 13px;
  --t-small: 15px;
  --t-body: 17px;
  --t-sub: 21px;
  --t-section: 26px;
  --t-hero: 41px;

  --measure: 680px;
  --shell: 1000px;
}

/* ---- heading steps ---- */
.hero-title { font-size: var(--t-hero); line-height: 1.24em; }
.section-heading { font-size: var(--t-section); }
.paper-subtitle { font-size: var(--t-section); line-height: 1.3em; }
.subsection-heading { font-size: var(--t-sub); }

/* The BibTeX heading was the only h2 set in the sans. It sits at the same
   level as Findings and Implications, so it takes the same face. */
.bibtex-title,
#bibtex .section-heading {
  font-family: Lora, serif;
  font-size: var(--t-section);
  font-weight: 700;
}

/* ---- body steps ---- */
.body-text, .body-text p { font-size: var(--t-body); line-height: 1.62em; }
.authors-line { font-size: var(--t-body); }
.findings-carousel-caption { font-size: var(--t-small); }
.table-caption { font-size: var(--t-small); font-weight: 400; }
.carousel-caption p { font-size: var(--t-small); }

/* 10px was below the floor for reading. */
.research-data, .research-col-hd { font-size: var(--t-fine); }
.tc-cell { font-size: var(--t-fine); }

/* Inter appeared once, for the copyright line. */
.page-footer p {
  font-family: "Instrument Sans", -apple-system, sans-serif;
  font-size: var(--t-small);
  font-weight: 400;
  color: #6b7280;
}

/* ---- measure -------------------------------------------------------------
   One width for everything. Prose and figures share an edge, so nothing
   steps in or out as you scroll. This does put running text back at roughly
   110 characters a line, which is long; the alternative is to bring the
   whole column in, figures included, rather than to split the two. */
.content-section .body-text,
.content-section .section-body,
.subsection .body-text,
.impl-list,
.abstract-top,
.aspect-img-wrap,
.carousel-section,
.tc-table-wrap,
.research-table-wrap,
.bibtex-wrap,
.bg-icons-row {
  max-width: none;
  margin-left: 0;
  margin-right: 0;
}

/* ---- rhythm --------------------------------------------------------------
   Every section used to be 80px top and bottom, so Findings weighed the same
   as Background. More air before a new movement than between subsections
   inside one. */
.content-section { padding-top: 96px; padding-bottom: 84px; }
.section-abstract { padding-top: 104px; padding-bottom: 88px; }
.subsection + .subsection { margin-top: 56px; }
.section-subsections > .subsection > .body-text { margin-top: 18px; }

@media (max-width: 768px) {
  :root {
    --t-hero: 35px;
    --t-section: 26px;
    --t-sub: 18px;
    --t-body: 16px;
    --t-small: 14px;
    --measure: 100%;
  }
  .content-section { padding-top: 56px; padding-bottom: 48px; }
  .section-abstract { padding-top: 64px; padding-bottom: 52px; }
  .subsection + .subsection { margin-top: 40px; }
}


/* ==========================================================================
   Controls
   --------------------------------------------------------------------------
   Three problems with the buttons as they were:

   1. Every one of them hovered by going to font-weight 700. Reflowing text
      on hover shifts the label inside a fixed-width button and jitters the
      width of an auto one — the single worst thing a hover can do.
   2. Five indigos doing one job: #2d3c83 #394ba0 #3a4ba1 #293e8c #3750aa.
   3. Five radii for the same family of shapes: 20 18 15 12 10.

   So: one indigo, one rule for radius (pills are fully round, icon buttons
   are circles), and hovers that move light rather than metrics.
   ========================================================================== */

:root {
  --btn: #2d3c83;
  --btn-hover: #3a4ba1;
  --btn-active: #25316d;
  --btn-shadow: 0 1px 2px rgba(17, 24, 39, 0.14);
  --btn-shadow-hover: 0 5px 14px rgba(45, 60, 131, 0.24);
}

.btn-primary,
.resources-button .btn-primary,
.res-btn,
.resource-btn,
.btn-copy {
  background-color: var(--btn);
  border-radius: 999px;
  box-shadow: var(--btn-shadow);
  transition: background-color 0.18s, box-shadow 0.18s, transform 0.18s;
}

.btn-primary:hover,
.resources-button .btn-primary:hover,
.res-btn:hover,
.resource-btn:hover,
.btn-copy:hover {
  /* Weight stays put. */
  font-weight: inherit;
  background-color: var(--btn-hover);
  box-shadow: var(--btn-shadow-hover);
  transform: translateY(-1px);
}

.btn-primary:active,
.resources-button .btn-primary:active,
.res-btn:active,
.resource-btn:active,
.btn-copy:active {
  background-color: var(--btn-active);
  box-shadow: var(--btn-shadow);
  transform: translateY(0);
}

/* The label weights the sheet set per button are preserved explicitly, so
   `font-weight: inherit` above cannot flatten them. */
.btn-primary, .resources-button .btn-primary, .resource-btn, .res-btn { font-weight: 500; }
.btn-copy { font-weight: 600; }

/* The hero button had gap:0 and no padding on the right, so the arrow sat
   flush against the word. */
.btn-primary {
  gap: 12px;
  padding: 0 24px;
  width: auto;
  min-width: 240px;
  justify-content: center;
}

.btn-arrow { transition: transform 0.22s cubic-bezier(0.3, 0.7, 0.3, 1); }
.btn-primary:hover .btn-arrow,
.resource-btn:hover .btn-arrow { transform: translateX(4px); }

.res-btn { gap: 9px; padding: 0 16px; width: auto; }
.res-btn img { transition: transform 0.18s; }
.res-btn:hover img { transform: scale(1.06); }

/* ---- icon buttons: circles, and they grow slightly rather than lighten ---- */
.carousel-btn,
.findings-carousel-btn {
  border-radius: 50%;
  background-color: var(--btn);
  opacity: 1;
  transition: background-color 0.18s, transform 0.18s, box-shadow 0.18s;
  box-shadow: var(--btn-shadow);
}

.carousel-btn:hover,
.findings-carousel-btn:hover {
  background-color: var(--btn-hover);
  transform: scale(1.08);
  box-shadow: var(--btn-shadow-hover);
}

.carousel-btn:active,
.findings-carousel-btn:active { transform: scale(0.96); background-color: var(--btn-active); }

.carousel-dot.active,
.findings-carousel-dot.active { background-color: var(--btn); }

/* ---- nav ---- */
.nav-item:hover { background: rgba(45, 60, 131, 0.06); color: var(--btn); }
.dropdown-item:hover { background: rgba(45, 60, 131, 0.06); color: var(--btn); }

/* ---- keyboard ---- */
.btn-primary:focus-visible,
.res-btn:focus-visible,
.resource-btn:focus-visible,
.btn-copy:focus-visible,
.carousel-btn:focus-visible,
.findings-carousel-btn:focus-visible,
.carousel-dot:focus-visible,
.findings-carousel-dot:focus-visible,
.nav-item:focus-visible,
.dropdown-item:focus-visible,
.text-link:focus-visible,
.spine a:focus-visible {
  outline: 2px solid var(--btn);
  outline-offset: 3px;
}

/* ---- charts ---------------------------------------------------------------
   A 4:3 chart across the full column stood 690px tall, taller than most of
   the viewport. Capped so it sits near the caption's own width. */
.findings-carousel-image-wrap {
  max-width: 620px;
  margin: 0 auto;
}

@media (prefers-reduced-motion: reduce) {
  .btn-primary, .res-btn, .resource-btn, .btn-copy,
  .carousel-btn, .findings-carousel-btn, .btn-arrow { transition: none; }
  .btn-primary:hover, .res-btn:hover, .resource-btn:hover, .btn-copy:hover { transform: none; }
  .carousel-btn:hover, .findings-carousel-btn:hover { transform: none; }
}


/* ---- Entering the content ------------------------------------------------
   The hero button is the threshold, so the move through it should read as a
   deliberate arrival rather than a jump-cut. Their sheet set a 182px
   scroll-margin on the abstract, which overshot and left the section title
   stranded well below the fold. */
html { scroll-behavior: smooth; }

.section-abstract { scroll-margin-top: calc(var(--nav-h, 53px) + 24px); }

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
}


/* ==========================================================================
   Chosen button treatments
   ========================================================================== */

/* ---- Hero: the arrow rides in its own chip -------------------------------
   Only the chip moves on hover, so the label never shifts. */
.hero-actions .btn-primary {
  gap: 16px;
  padding: 0 8px 0 26px;
  min-width: 0;
  justify-content: center;
}

.btn-chip {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 38px;
  height: 38px;
  flex: none;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.16);
  transition: background-color 0.18s, transform 0.22s cubic-bezier(0.3, 0.7, 0.3, 1);
}

.btn-chip .btn-arrow { width: 18px; height: 18px; transform: none; }

.hero-actions .btn-primary:hover .btn-chip {
  background: rgba(255, 255, 255, 0.28);
  transform: translateX(3px);
}

/* the chip carries the motion, so the button itself stays still */
.hero-actions .btn-primary:hover { transform: none; }
.hero-actions .btn-primary:hover .btn-arrow { transform: none; }

/* ---- Carousel arrows: soft squares ---------------------------------------
   Four of these are on screen at once in Findings, flanking the figures. A
   tinted tile carries far less ink than a solid indigo disc, so the chart
   keeps the attention. */
.carousel-btn,
.findings-carousel-btn {
  background-color: #f2f4f9;
  color: #2d3c83;
  border-radius: 10px;
  box-shadow: none;
  transition: background-color 0.18s, color 0.18s, transform 0.18s;
}

.carousel-btn svg path,
.findings-carousel-btn svg path { stroke: currentColor; }

.carousel-btn:hover,
.findings-carousel-btn:hover {
  background-color: #e4e8f4;
  color: #25316d;
  transform: none;
  box-shadow: none;
}

.carousel-btn:active,
.findings-carousel-btn:active { background-color: #d7dcee; transform: scale(0.96); }


/* ==========================================================================
   Hero layout
   --------------------------------------------------------------------------
   Three things were off. The title was allowed 1000px, so its second line
   ran under the head in the artwork. The block sat on the exact vertical
   centre, which reads low. And a full-screen cover with nothing below the
   fold gives no sign there is a paper underneath it.
   ========================================================================== */

.hero-overlay { padding-bottom: 4vh; }   /* optical centring: nudge up */

.hero-text-block {
  gap: 0;
  max-width: 620px;   /* clears the illustration on the right */
}

.hero-title {
  max-width: 100%;
  margin: 0;
  text-wrap: balance;
}

.hero-actions { margin-top: 34px; }

@media (max-width: 768px) {
  .hero-text-block { max-width: 85%; }
  .hero-actions { margin-top: 26px; }
}


/* ---- Arriving in the abstract --------------------------------------------
   Landing has to put the abstract's top edge flush under the bar, or the
   last band of the hero artwork stays on screen and the transition reads as
   a half-press rather than an arrival. --nav-h is set from the measured bar
   on load; the fallback matches it. */
:root { --nav-h: 63px; }

.hero-section { height: calc(100vh - var(--nav-h)); }

.section-abstract,
#abstract { scroll-margin-top: var(--nav-h); }

/* Every other section keeps a little air above it — only the abstract wants
   to sit hard against the bar, because it is an arrival rather than a jump. */
.content-section:not(.section-abstract) { scroll-margin-top: calc(var(--nav-h) + 20px); }


/* ---- Resource buttons: outline pills --------------------------------------
   Light at rest so they stop outweighing the paper title above them, and
   committing to solid indigo on hover. The glyphs ship dark (#2c2c2c) and
   are inverted to white only once the fill arrives. */
.res-btn {
  background-color: #fff;
  border: 1.5px solid var(--btn);
  color: var(--btn);
  box-shadow: none;
}

/* The glyph files now carry the indigo directly, so the icon and the
   label are the same colour rather than dark grey beside indigo. */
.res-btn img { filter: none; opacity: 1; }

.res-btn:hover {
  background-color: var(--btn);
  border-color: var(--btn);
  color: #fff;
  box-shadow: none;
  transform: none;
}

.res-btn:hover img { filter: brightness(0) invert(1); opacity: 1; transform: none; }

.res-btn:active { background-color: var(--btn-active); border-color: var(--btn-active); color: #fff; }
.res-btn:active img { filter: brightness(0) invert(1); }

/* The fixed widths were sized for a borderless pill; the border needs the
   extra couple of pixels or the labels crowd it. */
.res-btn-wide { width: auto; min-width: 104px; }
.res-btn-standard { width: auto; min-width: 82px; }
.res-btn-lg { width: auto; min-width: 137px; padding: 0 16px; }


/* ---- Anchor landing, corrected -------------------------------------------
   The original sheet hardcodes a 53px bar in two places and then adds a
   72px scroll-padding on top. Since scroll-padding and scroll-margin stack,
   an anchor landed 135px down — which is why a band of hero artwork stayed
   on screen after "About the Paper". Both are now driven by the measured
   bar, and the abstract carries no margin of its own so it arrives flush. */
html { scroll-padding-top: var(--nav-h); }

#main { margin-top: var(--nav-h); }

.section-abstract,
#abstract { scroll-margin-top: 0; }

.content-section:not(.section-abstract) { scroll-margin-top: 20px; }

@media (max-width: 768px) {
  #main { margin-top: var(--nav-h); }
  html { scroll-padding-top: var(--nav-h); }
}


/* ---- Carousel arrows: one treatment ---------------------------------------
   Both carousels place their arrows beside the figure rather than on it, so
   there is no reason for them to differ. Same size, same tile, same icon. */
.carousel-btn,
.findings-carousel-btn {
  width: 36px;
  height: 36px;
  border-radius: 10px;
  background-color: #f2f4f9;
  color: #2d3c83;
  box-shadow: none;
}

.carousel-btn svg,
.findings-carousel-btn svg { width: 18px; height: 18px; }

.carousel-btn:hover,
.findings-carousel-btn:hover { background-color: #e4e8f4; color: #25316d; }

.carousel-btn:active,
.findings-carousel-btn:active { background-color: #d7dcee; transform: scale(0.96); }

@media (max-width: 768px) {
  .carousel-btn, .findings-carousel-btn { width: 30px; height: 30px; border-radius: 8px; }
  .carousel-btn svg, .findings-carousel-btn svg { width: 15px; height: 15px; }
}


/* ---- Resource button glyphs ----------------------------------------------
   Inlined rather than loaded as <img>, so they take `currentColor` and track
   the label automatically: indigo at rest, white once the pill fills. The
   previous approach painted them with a filter, which meant the icon colour
   and the text colour were set in two different places and could — and did —
   fall out of step. */
.res-btn .res-icon {
  flex: none;
  color: inherit;
  transition: transform 0.18s;
}

.res-btn:hover .res-icon { transform: none; }


/* ==========================================================================
   Hero: wash behind, finding on top
   --------------------------------------------------------------------------
   The artwork drops to a 16% wash so it reads as texture, and the study's own
   result sits over it: the temporal reversal, in the same colours the prose
   uses for the conditions. Pale blue is LLM access from the start, flat
   across both time conditions; deep blue is working independently first,
   climbing steeply once there is time to think.
   ========================================================================== */

.hero-section { background-image: none; }

.hero-wash {
  position: absolute;
  inset: 0;
  background: url("../assets/bg-hero.png") center / cover no-repeat;
  opacity: 0.16;
  pointer-events: none;
}

.hero-plot {
  position: absolute;
  inset: 0;
  z-index: 1;
  display: flex;
  align-items: center;
  justify-content: flex-end;
  padding-right: 6%;
  pointer-events: none;
}

.hero-plot svg { width: 38%; max-width: 460px; height: auto; }

.hero-overlay { z-index: 2; }
.hero-text-block { max-width: 54%; }

/* Below this the plot and the title would overlap, and the chart is too fine
   to survive at phone width anyway. */
@media (max-width: 900px) {
  .hero-plot { display: none; }
  .hero-text-block { max-width: 85%; }
}

/* ==========================================================================
   Type: Newsreader headings, Source Serif 4 body
   ========================================================================== */

.section-heading,
.subsection-heading,
.paper-subtitle,
.bibtex-title,
#bibtex .section-heading {
  font-family: Newsreader, Georgia, serif;
  font-weight: 600;
}

.section-heading { font-size: 28px; color: rgba(0, 0, 0, 0.66); }
.subsection-heading { font-size: 22px; color: rgba(0, 0, 0, 0.66); }
.paper-subtitle { font-size: 28px; font-weight: 600; color: var(--indigo-2, #394ba0); }
.paper-subtitle strong { font-weight: 600; }

/* The hero was the one heading not set in the heading face. */
.hero-title { font-family: Newsreader, Georgia, serif; font-weight: 600; font-size: 46px; line-height: 1.14; }

.body-text,
.body-text p,
.measure-list li,
.impl-list,
.impl-list li p,
.section-body p,
.authors-line {
  font-family: "Source Serif 4", Georgia, serif;
  font-size: 18.5px;
  line-height: 1.64;
  color: #1c1f24;
}

.findings-carousel-caption,
.table-caption { font-family: "Source Serif 4", Georgia, serif; color: #4a5058; }

/* Interface, controls and data stay in the sans — they are not reading. */
.nav-item, .dropdown-item, .btn-primary, .res-btn, .resource-btn, .btn-copy,
.tc-cell, .research-cell, .research-cell p, .tc-result-content, .research-result-content,
.tc-time-heading, .tc-access-heading, .research-time-heading, .research-access-heading,
.page-footer p, .spine .lab, .carousel-caption p {
  font-family: "Instrument Sans", -apple-system, sans-serif;
}

@media (max-width: 768px) {
  .hero-title { font-size: 34px; }
  .section-heading { font-size: 25px; }
  .subsection-heading { font-size: 20px; }
  .paper-subtitle { font-size: 22px; }
  .body-text, .body-text p, .measure-list li, .impl-list li p, .section-body p, .authors-line {
    font-size: 17px;
  }
}


/* ---- corrections ---------------------------------------------------------
   The title block and the plot were both sized as a share of the viewport
   and met in the middle at 1280px. The text now takes a fixed share and the
   plot takes what is left, so they cannot collide at any width. */
.hero-text-block { max-width: 46%; }
.hero-plot svg { width: 34%; max-width: 430px; }

/* Captions and the author line are not running text and should not inherit
   its size. */
.authors-line { font-size: 17px; }
.table-caption { font-size: 15px; line-height: 1.6; }
.findings-carousel-caption { font-size: 16px; line-height: 1.55; }

@media (max-width: 900px) {
  .hero-text-block { max-width: 85%; }
}

@media (max-width: 768px) {
  .authors-line { font-size: 15.5px; }
  .table-caption { font-size: 14px; }
  .findings-carousel-caption { font-size: 15px; }
}


/* The table caption is a <p> inside .section-body, so the generic
   `.section-body p` rule (0,1,1) outranked `.table-caption` (0,1,0) and the
   caption inherited the running-text size. Matched on the element too so the
   specificities tie and source order decides. */
p.table-caption,
.section-body p.table-caption {
  font-size: 15px;
  line-height: 1.6;
  color: #4a5058;
}


/* ==========================================================================
   One family: Lato
   --------------------------------------------------------------------------
   Lato ships 100/300/400/700/900 and nothing between. Every 500 and 600 in
   the sheet would therefore be synthesised — the browser smears the 400
   outlines — so they are remapped to real weights here. That also lets the
   findings table keep three genuine steps rather than two real ones and a
   fake: regular 400, semi 700, high 900.
   ========================================================================== */

:root { --sans: "Lato", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; }

body,
.body-text, .body-text p, .measure-list li, .impl-list, .impl-list li p,
.section-body p, .authors-line,
.hero-title, .paper-subtitle, .section-heading, .subsection-heading, .bibtex-title,
.findings-carousel-caption, .table-caption, p.table-caption,
.nav-item, .dropdown-item, .btn-primary, .res-btn, .resource-btn, .btn-copy,
.tc-cell, .research-cell, .research-cell p, .tc-result-content, .research-result-content,
.tc-time-heading, .tc-access-heading, .research-time-heading, .research-access-heading,
.page-footer p, .spine .lab, .carousel-caption p {
  font-family: var(--sans);
}

/* ---- headings ---- */
.hero-title { font-weight: 900; font-size: 44px; line-height: 1.18; letter-spacing: -0.02em; }
.section-heading { font-weight: 900; font-size: 27px; letter-spacing: -0.012em; color: rgba(0, 0, 0, 0.66); }
.subsection-heading { font-weight: 700; font-size: 21px; letter-spacing: -0.008em; color: rgba(0, 0, 0, 0.66); }
.paper-subtitle { font-weight: 700; font-size: 26px; line-height: 1.32; letter-spacing: -0.008em; }
.paper-subtitle strong { font-weight: 700; }
.bibtex-title, #bibtex .section-heading { font-weight: 900; font-size: 27px; }

/* ---- running text ---- */
/* Lato has a smaller x-height than Source Serif, so it wants a touch less
   size and a touch more leading to hold the same colour on the page. */
.body-text, .body-text p, .measure-list li, .impl-list li p, .section-body p {
  font-size: 17.5px;
  line-height: 1.72;
  color: #1c1f24;
}

.authors-line { font-size: 16.5px; }
.findings-carousel-caption { font-size: 15.5px; line-height: 1.6; }
p.table-caption, .section-body p.table-caption { font-size: 14.5px; line-height: 1.65; }

strong, .body-text strong, .section-body strong { font-weight: 700; }

/* ---- conditions: 500 is not a Lato weight ---- */
.cond { font-weight: 700; font-style: italic; }

/* ---- the three performance steps, all real weights ---- */
.fw-reg { font-weight: 400; }
.fw-semi { font-weight: 700; }
.fw-high { font-weight: 900; }

/* ---- interface ---- */
.nav-item, .dropdown-item { font-weight: 400; }
.nav-item { font-size: 15.5px; }
.btn-primary, .res-btn, .resource-btn, .btn-copy { font-weight: 700; }
.tc-cell, .tc-header-row .tc-cell, .tc-row-hd,
.research-header-row .research-cell, .research-row-hd,
.tc-time-heading, .tc-access-heading, .research-time-heading, .research-access-heading { font-weight: 700; }
.tc-data, .research-data, .research-cell p { font-weight: 400; }
.page-footer p { font-weight: 400; }

@media (max-width: 768px) {
  .hero-title { font-size: 33px; }
  .section-heading, .bibtex-title, #bibtex .section-heading { font-size: 24px; }
  .subsection-heading { font-size: 19px; }
  .paper-subtitle { font-size: 21px; }
  .body-text, .body-text p, .measure-list li, .impl-list li p, .section-body p { font-size: 16.5px; }
  .authors-line { font-size: 15px; }
}


/* ---- two stragglers from the Lato switch ---------------------------------
   The interface-carousel caption still asked for 500, which Lato does not
   ship, and #bibtex .section-heading (1,1,0) outranked the .section-heading
   (0,1,0) in the Lato block, so that one heading stayed in Newsreader. */
.carousel-caption p { font-family: var(--sans); font-weight: 700; }

#bibtex .section-heading,
.bibtex-title { font-family: var(--sans); }

/* ---- larger titles -------------------------------------------------------
   Lato runs small for its point size, so the previous numbers read a step
   quieter than the Newsreader they replaced. */
.hero-title { font-size: 54px; line-height: 1.14; }
.section-heading, #bibtex .section-heading, .bibtex-title { font-size: 32px; }
.subsection-heading { font-size: 23px; }
.paper-subtitle { font-size: 30px; line-height: 1.28; }

@media (max-width: 900px) {
  .hero-title { font-size: 44px; }
}

@media (max-width: 768px) {
  .hero-title { font-size: 36px; line-height: 1.18; }
  .section-heading, #bibtex .section-heading, .bibtex-title { font-size: 27px; }
  .subsection-heading { font-size: 20px; }
  .paper-subtitle { font-size: 23px; }
}


/* ==========================================================================
   One family: Roboto
   --------------------------------------------------------------------------
   Unlike Lato, Roboto does ship a 500, so the semi-bold step the original
   design asked for is a real weight again rather than something remapped.
   The findings table therefore reads exactly as its caption claims:
   regular 400, semi-bold 500, bold 700.

   Roboto also has a noticeably larger x-height than Lato, so everything
   comes down about half a step to hold the same apparent size.
   ========================================================================== */

:root { --sans: "Roboto", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; }

/* ---- headings ---- */
.hero-title { font-weight: 700; font-size: 52px; line-height: 1.16; letter-spacing: -0.022em; }
.section-heading,
#bibtex .section-heading,
.bibtex-title { font-weight: 700; font-size: 30px; letter-spacing: -0.012em; }
.subsection-heading { font-weight: 500; font-size: 22px; letter-spacing: -0.006em; }
.paper-subtitle { font-weight: 500; font-size: 28px; line-height: 1.3; letter-spacing: -0.008em; }
.paper-subtitle strong { font-weight: 500; }

/* ---- running text ---- */
.body-text, .body-text p, .measure-list li, .impl-list li p, .section-body p {
  font-size: 17px;
  line-height: 1.7;
  color: #1c1f24;
}

.authors-line { font-size: 16px; }
.findings-carousel-caption { font-size: 15px; line-height: 1.6; }
p.table-caption, .section-body p.table-caption { font-size: 14px; line-height: 1.65; }

strong, .body-text strong, .section-body strong { font-weight: 500; }

/* ---- conditions: 500 exists in Roboto, so back to the original weight ---- */
.cond { font-weight: 500; font-style: italic; }

/* ---- the three performance steps, all real ---- */
.fw-reg { font-weight: 400; }
.fw-semi { font-weight: 500; }
.fw-high { font-weight: 700; }

/* ---- interface ---- */
.nav-item, .dropdown-item { font-weight: 500; }
.nav-item { font-size: 15px; }
.btn-primary, .res-btn, .resource-btn { font-weight: 500; }
.btn-copy { font-weight: 500; }
.carousel-caption p { font-family: var(--sans); font-weight: 500; }
.tc-cell, .tc-header-row .tc-cell, .tc-row-hd,
.research-header-row .research-cell, .research-row-hd,
.tc-time-heading, .tc-access-heading, .research-time-heading, .research-access-heading { font-weight: 500; }
.tc-data, .research-data, .research-cell p, .page-footer p { font-weight: 400; }

@media (max-width: 900px) {
  .hero-title { font-size: 42px; }
}

@media (max-width: 768px) {
  .hero-title { font-size: 34px; line-height: 1.2; }
  .section-heading, #bibtex .section-heading, .bibtex-title { font-size: 26px; }
  .subsection-heading { font-size: 19px; }
  .paper-subtitle { font-size: 22px; }
  .body-text, .body-text p, .measure-list li, .impl-list li p, .section-body p { font-size: 16px; }
  .authors-line { font-size: 15px; }
}


/* ---- Hero as two real columns --------------------------------------------
   The title and the chart used to be separate absolutely-positioned layers,
   each sized as a percentage of the viewport, so neither could be widened
   without the two meeting in the middle. They are now a grid: the row
   divides the space and an overlap is not expressible. */
.hero-overlay { padding: 0 6%; }

.hero-inner {
  display: grid;
  grid-template-columns: 1.02fr 0.98fr;
  gap: 4%;
  align-items: center;
  width: 100%;
}

.hero-text-block { max-width: none; }

.hero-plot {
  position: static;
  inset: auto;
  display: block;
  padding: 0;
}

.hero-plot svg { width: 100%; max-width: 560px; height: auto; margin-left: auto; }

@media (max-width: 900px) {
  .hero-inner { grid-template-columns: 1fr; }
  .hero-plot { display: none; }
  .hero-overlay { padding: 0 8%; }
}


/* The paper title is the second most important line on the page and was
   sitting only two points above the section headings. */
.paper-subtitle { font-size: 34px; line-height: 1.26; }

@media (max-width: 900px) { .paper-subtitle { font-size: 28px; } }
@media (max-width: 768px) { .paper-subtitle { font-size: 24px; line-height: 1.28; } }


/* ==========================================================================
   The workshop site's type system, transferred
   --------------------------------------------------------------------------
   cscw2026-website runs Lato throughout at 12 / 14 / 17 / 19 / 24 / 32 /
   clamp(28px, 3.7vw, 46px), body 17 at 1.72, headings at 700. Its serif is
   reserved for one thing — the word "Ripples" in the wordmark — and this
   page has no equivalent mark, so the serif has no job here and is not
   loaded.

   That scale gives three heading steps for four levels, so they map:
   hero to --t-hero, the paper's name to 32, sections to 24, subsections
   to 19. Lato ships no 500 or 600, so weights stay on 400 / 700 / 900.
   ========================================================================== */

:root {
  --sans: "Lato", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
  --t-meta: 14px;
  --t-body: 17px;
  --t-h4: 19px;
  --t-h3: 24px;
  --t-h2: 32px;
  --t-hero: clamp(28px, 3.7vw, 46px);
}

body { line-height: 1.72; }

/* ---- headings ---- */
.hero-title { font-size: var(--t-hero); font-weight: 700; line-height: 1.2; letter-spacing: -0.02em; }
.paper-subtitle { font-size: var(--t-h2); font-weight: 700; line-height: 1.28; letter-spacing: -0.012em; }
.paper-subtitle strong { font-weight: 700; }
.section-heading,
#bibtex .section-heading,
.bibtex-title { font-size: var(--t-h3); font-weight: 700; letter-spacing: -0.008em; }
.subsection-heading { font-size: var(--t-h4); font-weight: 700; letter-spacing: normal; }

/* ---- running text ---- */
.body-text, .body-text p, .measure-list li, .impl-list li p, .section-body p {
  font-size: var(--t-body);
  line-height: 1.72;
  color: #1c1f24;
}

.authors-line { font-size: var(--t-body); }
.findings-carousel-caption { font-size: var(--t-meta); line-height: 1.65; }
p.table-caption, .section-body p.table-caption { font-size: var(--t-meta); line-height: 1.65; }

strong, .body-text strong, .section-body strong { font-weight: 700; }

/* ---- Lato has no 500 or 600 ---- */
.cond { font-weight: 700; font-style: italic; }
.fw-reg { font-weight: 400; }
.fw-semi { font-weight: 700; }
.fw-high { font-weight: 900; }

.nav-item, .dropdown-item { font-weight: 400; font-size: var(--t-meta); }
.btn-primary, .res-btn, .resource-btn, .btn-copy { font-weight: 700; }
.carousel-caption p { font-weight: 700; }
.tc-cell, .tc-header-row .tc-cell, .tc-row-hd,
.research-header-row .research-cell, .research-row-hd,
.tc-time-heading, .tc-access-heading, .research-time-heading, .research-access-heading { font-weight: 700; }
.tc-data, .research-data, .research-cell p, .page-footer p { font-weight: 400; }
.page-footer p { font-size: var(--t-meta); }

@media (max-width: 768px) {
  :root { --t-h2: 26px; --t-h3: 21px; --t-h4: 18px; --t-body: 16px; }
}


/* ---- hero breathing room --------------------------------------------------
   6% of a 1280px window is only 77px, which put the title and the button
   almost against the edge. The overlay now uses the same gutter the content
   sections below it use, so the hero and the paper line up. */
.hero-overlay { padding: 0 max(6%, 60px) 0 max(10%, 88px); }

.hero-inner { grid-template-columns: 1.08fr 0.92fr; gap: 5%; }

.hero-plot svg { max-width: 440px; }

@media (max-width: 900px) {
  .hero-overlay { padding: 0 8%; }
}


/* The paper's name should hold two lines at every width rather than gaining
   a third as the window narrows, so it scales with the viewport up to the
   32px ceiling. `balance` evens the two lines instead of leaving a long
   first line and a short second. */
.paper-subtitle {
  font-size: clamp(22px, 2.55vw, 32px);
  text-wrap: balance;
}

@media (max-width: 768px) {
  .paper-subtitle { font-size: clamp(19px, 4.6vw, 24px); }
}


/* ---- heading hierarchy ----------------------------------------------------
   At 24px against 17px body the section headings were only a 1.4x step,
   which is not enough separation to read as the top of a section. The steps
   are now 46 / 34 / 30 / 21 / 17 — each clearly above the one below. */
.section-heading,
#bibtex .section-heading,
.bibtex-title {
  font-size: 30px;
  line-height: 1.26;
  letter-spacing: -0.014em;
}

.subsection-heading { font-size: 21px; line-height: 1.3; }

.paper-subtitle { font-size: clamp(24px, 2.7vw, 34px); }

@media (max-width: 900px) {
  .section-heading, #bibtex .section-heading, .bibtex-title { font-size: 27px; }
  .subsection-heading { font-size: 20px; }
}

@media (max-width: 768px) {
  .section-heading, #bibtex .section-heading, .bibtex-title { font-size: 24px; }
  .subsection-heading { font-size: 19px; }
  .paper-subtitle { font-size: clamp(20px, 4.8vw, 25px); }
}


/* ==========================================================================
   IBM Plex — one superfamily, three voices
   --------------------------------------------------------------------------
   Serif for headings, sans for the argument, mono for the BibTeX. The code
   block stops being a guest: it is now the same hand as the rest of the page.
   Plex ships real 500 and 600, so nothing here is synthesised.
   ========================================================================== */

:root {
  --sans: "IBM Plex Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
  --serif: "IBM Plex Serif", Georgia, "Times New Roman", serif;
  --mono: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, monospace;
  --blue: #2d3c83;
  --ink: #1c1f24;
}

body { font-family: var(--sans); }

/* ---- headings: serif, and larger ---- */
.hero-title {
  font-family: var(--serif);
  font-weight: 600;
  font-size: clamp(34px, 4.1vw, 54px);
  line-height: 1.14;
  letter-spacing: -0.018em;
  color: var(--blue);
}

.paper-subtitle {
  font-family: var(--serif);
  font-weight: 600;
  font-size: clamp(26px, 3.1vw, 40px);
  line-height: 1.24;
  letter-spacing: -0.012em;
  color: var(--indigo-2, #394ba0);
}
.paper-subtitle strong { font-weight: 600; }

/* Section headings carry the blue; subsections sit in ink underneath, so the
   two levels are told apart by colour as well as size. */
.section-heading,
#bibtex .section-heading,
.bibtex-title {
  font-family: var(--serif);
  font-weight: 600;
  font-size: 34px;
  line-height: 1.24;
  letter-spacing: -0.014em;
  color: var(--blue);
}

.subsection-heading {
  font-family: var(--sans);
  font-weight: 600;
  font-size: 22px;
  line-height: 1.3;
  letter-spacing: -0.008em;
  color: var(--ink);
}

/* ---- running text ---- */
.body-text, .body-text p, .measure-list li, .impl-list li p, .section-body p {
  font-family: var(--sans);
  font-size: 17px;
  line-height: 1.68;
  color: var(--ink);
}

.authors-line { font-family: var(--sans); font-size: 17px; }
.findings-carousel-caption { font-family: var(--sans); font-size: 15px; line-height: 1.6; }
p.table-caption, .section-body p.table-caption { font-family: var(--sans); font-size: 14px; line-height: 1.62; }

strong, .body-text strong, .section-body strong { font-weight: 600; }

/* ---- Plex has real 500 and 600 ---- */
.cond { font-weight: 500; font-style: italic; }
.fw-reg { font-weight: 400; }
.fw-semi { font-weight: 500; }
.fw-high { font-weight: 700; }

/* ---- interface ---- */
.nav-item, .dropdown-item { font-family: var(--sans); font-weight: 500; font-size: 15px; }
.btn-primary, .res-btn, .resource-btn, .btn-copy { font-family: var(--sans); font-weight: 500; }
.carousel-caption p { font-family: var(--sans); font-weight: 500; }
.tc-cell, .research-cell, .research-cell p,
.tc-result-content, .research-result-content,
.tc-time-heading, .tc-access-heading,
.research-time-heading, .research-access-heading,
.page-footer p, .spine .lab { font-family: var(--sans); }
.tc-header-row .tc-cell, .tc-row-hd,
.research-header-row .research-cell, .research-row-hd { font-weight: 600; }
.tc-data, .research-data, .research-cell p, .page-footer p { font-weight: 400; }

/* ---- the code block now belongs ---- */
.bibtex-pre { font-family: var(--mono); font-size: 13.5px; line-height: 1.6; }

@media (max-width: 900px) {
  .section-heading, #bibtex .section-heading, .bibtex-title { font-size: 29px; }
  .subsection-heading { font-size: 20px; }
}

@media (max-width: 768px) {
  .section-heading, #bibtex .section-heading, .bibtex-title { font-size: 26px; }
  .subsection-heading { font-size: 19px; }
  .body-text, .body-text p, .measure-list li, .impl-list li p, .section-body p { font-size: 16px; }
  .authors-line { font-size: 15.5px; }
  .bibtex-pre { font-size: 12.5px; }
}


/* `balance` evens the line lengths, which on a title this long meant every
   line stopping short of the measure — it read as a narrow column inside a
   wide one. `pretty` only guards the last line against a widow, so the rest
   fill the width available. */
.paper-subtitle { text-wrap: pretty; }


/* ==========================================================================
   Blue and yellow
   --------------------------------------------------------------------------
   Yellow rather than orange: #ed6500 already means "Insufficient time" in
   the condition coding, so an orange accent would be indistinguishable from
   a semantic one. The yellow is used as a highlighter — the same role it
   plays on jzhi.app — never as a brand fill.
   ========================================================================== */

:root {
  --amber: #e9b830;          /* solid marks */
  --amber-wash: rgba(247, 208, 70, 0.45);   /* the highlighter */
  --amber-line: rgba(233, 184, 48, 0.55);
}

/* ---- selection: the highlighter ---- */
::selection { background: var(--amber-wash); color: #1a1a1a; }
::-moz-selection { background: var(--amber-wash); color: #1a1a1a; }

/* ---- the carousel's current slide ----
   Blue carries interaction (the arrows), so the indicator uses the other
   colour: what is showing is marked, not merely coloured in the same hue as
   the buttons beside it. */
.carousel-dot.active,
.findings-carousel-dot.active {
  background-color: var(--amber);
  transform: scale(1.35);
}

.carousel-dot:hover:not(.active),
.findings-carousel-dot:hover:not(.active) { background-color: rgba(0, 0, 0, 0.38); }

/* ---- the section spine, same logic ---- */
.spine a.current .dot { background: var(--amber); }

/* ---- inline links keep the blue, but pick up the highlighter on hover ---- */
.text-link:hover {
  background: var(--amber-wash);
  box-shadow: 0 0 0 2px var(--amber-wash);
  text-decoration: none;
}


/* ---- chart width ----------------------------------------------------------
   The 620px cap was set when the charts were 4:3 and stood 690px tall in the
   column. The engagement charts are 3:1, so the same cap left them tiny —
   the cap now scales with the figure's own proportions instead of being one
   number for both shapes. */
.findings-carousel-image-wrap { max-width: 820px; }

@media (max-width: 900px) { .findings-carousel-image-wrap { max-width: 100%; } }


/* ==========================================================================
   Blue and red
   --------------------------------------------------------------------------
   The red is not new: #a10000 already carries every citation on the page, so
   promoting it to the accent makes an existing colour do more work rather
   than introducing a sixth one. Everything decorative now runs through
   --accent, so the whole theme is one value to change.

   The wash is red at 14%, which stays well clear of #ed6500 ("Insufficient")
   — a tint, not a second orange.
   ========================================================================== */

:root {
  --accent: #a10000;
  --accent-wash: rgba(161, 0, 0, 0.14);
  --accent-soft: rgba(161, 0, 0, 0.55);
}

::selection { background: var(--accent-wash); color: #1a1a1a; }
::-moz-selection { background: var(--accent-wash); color: #1a1a1a; }

.carousel-dot.active,
.findings-carousel-dot.active { background-color: var(--accent); transform: scale(1.35); }

.spine a.current .dot { background: var(--accent); }

/* Citations already sit in this colour, so hovering tints the ground behind
   them rather than restating the colour. */
.text-link:hover {
  background: var(--accent-wash);
  box-shadow: 0 0 0 2px var(--accent-wash);
  text-decoration: none;
}

/* The section break picks up the accent at low strength — the one place the
   red appears without meaning "citation". */
.content-section:after { color: var(--accent-soft); opacity: 0.45; }


/* ==========================================================================
   Links: two jobs, two treatments
   --------------------------------------------------------------------------
   Author names and inline citations look the same in the markup but are not
   the same thing. The three names are a short, scannable list you might
   actually click; the forty-odd citations interrupt sentences and are read
   past. So the names get a quiet permanent mark, and the citations get a
   highlighter that only appears under the pointer.
   ========================================================================== */

/* ---- inline citations: the highlighter ---- */
.text-link {
  color: var(--ink);
  background-image: linear-gradient(var(--accent-wash), var(--accent-wash));
  background-repeat: no-repeat;
  background-position: 0 100%;
  /* both ends are percentages: a length and a percentage will not animate */
  background-size: 100% 0%;
  box-shadow: none;
  text-decoration: none;
  transition: background-size 0.28s ease-out, color 0.28s;
  -webkit-box-decoration-break: clone;
  box-decoration-break: clone;
}

.text-link:hover,
.text-link:focus-visible {
  background-size: 100% 100%;
  background-color: transparent;
  box-shadow: none;
  color: #1a1a1a;
  text-decoration: none;
}

/* Citations inside the tables sit on a tinted ground, so the wash needs to
   read against #f9fafb rather than white. */
.tc-cell .text-link, .research-cell .text-link { color: var(--ink); }

/* ---- author names: the dotted rule ---- */
.authors-line .text-link {
  color: var(--ink);
  background-image: none;
  border-bottom: 1px dotted rgba(161, 0, 0, 0.55);
  transition: border-bottom-color 0.16s, border-bottom-style 0.16s, color 0.16s;
}

.authors-line .text-link:hover,
.authors-line .text-link:focus-visible {
  border-bottom-style: solid;
  border-bottom-color: var(--accent);
  color: var(--accent);
  background-image: none;
}

@media (prefers-reduced-motion: reduce) {
  .text-link { transition: none; }
}


/* ==========================================================================
   One link treatment: the dotted rule
   --------------------------------------------------------------------------
   Citations and author names now read the same way. The mark is permanent,
   so a link can be found by looking rather than only by hovering, and the
   colour stays out of the sentence — the only coloured words in a paragraph
   remain the ones that mean something.
   ========================================================================== */

.text-link,
.authors-line .text-link {
  color: var(--ink);
  background-image: none;
  background-color: transparent;
  box-shadow: none;
  text-decoration: none;
  border-bottom: 1px dotted rgba(161, 0, 0, 0.55);
  transition: border-bottom-color 0.16s, color 0.16s;
}

.text-link:hover,
.text-link:focus-visible,
.authors-line .text-link:hover,
.authors-line .text-link:focus-visible {
  background-image: none;
  background-color: transparent;
  box-shadow: none;
  border-bottom-style: solid;
  border-bottom-color: var(--accent);
  color: var(--accent);
}

/* ---- chart size ----------------------------------------------------------
   Capping by width could not serve both shapes: the performance charts are
   4:3 and the engagement charts 3:1, so any width that suited one starved or
   towered over the other. Capping the height instead lets each figure take
   the width its own proportions ask for. */
.findings-carousel-image-wrap {
  max-width: 820px;
  margin: 0 auto;
  display: flex;
  justify-content: center;
}

.findings-carousel-image-wrap img {
  width: auto;
  max-width: 100%;
  max-height: 400px;
  object-fit: contain;
}

@media (max-width: 900px) {
  .findings-carousel-image-wrap img { max-height: 300px; }
}


/* The paper's name takes the same indigo as the hero and the section
   headings, so the three blues on the page become one, and comes down a step
   so it sits below the hero rather than rivalling it. */
.paper-subtitle {
  color: var(--blue);
  font-size: clamp(24px, 2.8vw, 36px);
}

@media (max-width: 768px) { .paper-subtitle { font-size: clamp(20px, 4.6vw, 24px); } }


/* ==========================================================================
   Hero: one left column, artwork ramping across
   --------------------------------------------------------------------------
   Title, then the finding, then the way in — read top to bottom on a single
   left edge rather than split across two columns. The artwork returns to
   full strength but only earns it on the right: a horizontal mask takes it
   from 10% at the left, where the words are, to 100% at the far edge.
   ========================================================================== */

.hero-wash {
  opacity: 1;
  -webkit-mask-image: linear-gradient(90deg,
    rgba(0, 0, 0, 0.10) 0%,
    rgba(0, 0, 0, 0.10) 30%,
    rgba(0, 0, 0, 0.55) 62%,
    rgba(0, 0, 0, 1) 100%);
  mask-image: linear-gradient(90deg,
    rgba(0, 0, 0, 0.10) 0%,
    rgba(0, 0, 0, 0.10) 30%,
    rgba(0, 0, 0, 0.55) 62%,
    rgba(0, 0, 0, 1) 100%);
}

.hero-inner { display: block; }

.hero-text-block {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 30px;
  max-width: 560px;
  text-align: left;
}

.hero-title { margin: 0; max-width: 100%; }

/* The plot is now part of the stack rather than a facing column. */
.hero-plot {
  position: static;
  inset: auto;
  display: block;
  width: 100%;
  max-width: 430px;
  padding: 0;
}

.hero-plot svg { width: 100%; max-width: none; margin: 0; }

.hero-actions { margin: 0; }

@media (max-width: 900px) {
  .hero-text-block { max-width: 78%; gap: 22px; }
  .hero-plot { display: block; max-width: 340px; }
}

@media (max-width: 620px) {
  .hero-plot { display: none; }
  .hero-text-block { max-width: 88%; }
}


/* ==========================================================================
   Carousel: a counter, and a frame that does not move
   --------------------------------------------------------------------------
   The engagement carousel holds two different shapes — two charts at 3:1 and
   one at 4:3 — so the figure changed height between slides and dragged the
   arrows up and down with it. The figure area is now a fixed frame and each
   chart is contained inside it, so the controls stay where you left them.
   ========================================================================== */

.findings-carousel-image-wrap {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 400px;
  max-width: 820px;
  margin: 0 auto;
}

.findings-carousel-image-wrap img {
  width: auto;
  height: auto;
  max-width: 100%;
  max-height: 100%;
  object-fit: contain;
}

/* ---- the counter ---- */
.carousel-indicators,
.findings-carousel-indicators { min-height: 20px; }

.carousel-counter {
  font-family: var(--sans);
  font-size: 13px;
  font-weight: 500;
  color: var(--grey, #757575);
  font-variant-numeric: tabular-nums;   /* the digits cannot shift the row */
  letter-spacing: 0.04em;
}

@media (max-width: 900px) {
  .findings-carousel-image-wrap { height: 300px; }
}

@media (max-width: 620px) {
  .findings-carousel-image-wrap { height: 240px; }
}


/* A harder ramp: the artwork stays a whisper for the whole left half, then
   climbs quickly, so the right-hand third reads at nearly full strength
   instead of easing in gently. */
.hero-wash {
  -webkit-mask-image: linear-gradient(90deg,
    rgba(0, 0, 0, 0.10) 0%,
    rgba(0, 0, 0, 0.10) 30%,
    rgba(0, 0, 0, 0.70) 62%,
    rgba(0, 0, 0, 1) 100%);
  mask-image: linear-gradient(90deg,
    rgba(0, 0, 0, 0.10) 0%,
    rgba(0, 0, 0, 0.10) 30%,
    rgba(0, 0, 0, 0.70) 62%,
    rgba(0, 0, 0, 1) 100%);
}


/* Ramp brought forward: the climb starts at 55% instead of 62%, so the
   artwork reaches strength earlier and holds it across more of the right. */
.hero-wash {
  -webkit-mask-image: linear-gradient(90deg,
    rgba(0, 0, 0, 0.10) 0%,
    rgba(0, 0, 0, 0.10) 30%,
    rgba(0, 0, 0, 0.70) 55%,
    rgba(0, 0, 0, 1) 100%);
  mask-image: linear-gradient(90deg,
    rgba(0, 0, 0, 0.10) 0%,
    rgba(0, 0, 0, 0.10) 30%,
    rgba(0, 0, 0, 0.70) 55%,
    rgba(0, 0, 0, 1) 100%);
}


/* ---- the artwork holds its right edge -------------------------------------
   `cover` centred re-crops from both sides as the window narrows, so the
   head and gears — the part the ramp exists to reveal — drift and get cut.
   Anchored right, the scaling takes its loss from the left instead, which is
   the band already masked down to 10%. The right-hand content is therefore
   unchanged at every width until the layout actually breaks. */
.hero-wash { background-position: 100% 50%; }

@media (max-width: 900px) {
  /* The text column gives way first; the artwork is still doing its job. */
  .hero-wash { background-position: 100% 50%; }
}


/* ---- captions, up a step --------------------------------------------------
   They carry the actual reading of each figure and each table, so they were
   sitting a long way below the 17px body for text that has to be read
   carefully rather than skimmed. */
.findings-carousel-caption { font-size: 16.5px; line-height: 1.62; }
p.table-caption, .section-body p.table-caption { font-size: 15.5px; line-height: 1.62; }
.carousel-caption p { font-size: 15.5px; line-height: 1.5; }

@media (max-width: 900px) {
  .findings-carousel-caption { font-size: 15.5px; }
  p.table-caption, .section-body p.table-caption { font-size: 15px; }
  .carousel-caption p { font-size: 14px; }
}

@media (max-width: 620px) {
  .findings-carousel-caption { font-size: 15px; }
  p.table-caption, .section-body p.table-caption { font-size: 14.5px; }
  .carousel-caption p { font-size: 13px; }
}


/* ==========================================================================
   Motion on scroll
   --------------------------------------------------------------------------
   Restrained on purpose: blocks arrive, they do not perform. One transform,
   one distance, one duration, applied at the level of a heading or a figure
   rather than every paragraph — a page where each sentence animates reads as
   a template rather than a paper.

   The reveal class is only ever added by script, so if the script does not
   run nothing is left hidden.
   ========================================================================== */

@media (prefers-reduced-motion: no-preference) {
  .rise {
    opacity: 0;
    transform: translateY(16px);
    transition: opacity 0.55s cubic-bezier(0.22, 0.7, 0.3, 1),
                transform 0.55s cubic-bezier(0.22, 0.7, 0.3, 1);
  }

  .rise.in { opacity: 1; transform: none; }

  /* The hero states itself on arrival rather than being revealed by scroll. */
  .hero-title, .hero-plot, .hero-actions {
    opacity: 0;
    transform: translateY(14px);
    transition: opacity 0.7s cubic-bezier(0.22, 0.7, 0.3, 1),
                transform 0.7s cubic-bezier(0.22, 0.7, 0.3, 1);
  }

  .hero-ready .hero-title,
  .hero-ready .hero-plot,
  .hero-ready .hero-actions { opacity: 1; transform: none; }

  .hero-ready .hero-plot { transition-delay: 0.12s; }
  .hero-ready .hero-actions { transition-delay: 0.22s; }

  /* The artwork drifts a little slower than the page, so the hero has depth
     without anything sliding around. */
  .hero-wash { will-change: transform; }
}


/* ==========================================================================
   Prior-work table: one weight
   --------------------------------------------------------------------------
   The cells were carrying three different weights for no reason: the column
   headers were 600 via .tc-header-row, the row headers 600 via .tc-row-hd,
   the finding text 600 through a <strong>, and the citation inside the same
   sentence 400. Reading across a row meant reading four weights. One weight
   now, and the emphasis the table needs comes from its tinted header band
   rather than from the type.
   ========================================================================== */

.tc-table .tc-cell,
.tc-table .tc-cell strong,
.tc-table .tc-cell span,
.tc-table .tc-cell .text-link,
.tc-table .tc-col-hd,
.tc-table .tc-col-hd strong,
.tc-table .tc-row-hd,
.tc-table .tc-row-hd strong,
.tc-table .tc-data,
.tc-table .tc-data strong,
.tc-table .tc-prior-cell,
.tc-table .tc-prior-cell strong,
.tc-table .tc-prior-text,
.tc-table .tc-prior-text strong {
  font-weight: 500;
}

/* strong inside a data cell was also a flex container, which forced the
   emoji and the text onto their own line box */
.tc-table .tc-data strong,
.tc-table .tc-prior-text strong {
  display: inline;
  gap: 0;
}

/* the mobile cards carry the same table, so they take the same rule */
.tc-mobile-cards .tc-result-content,
.tc-mobile-cards .tc-result-content strong,
.tc-mobile-cards .tc-result-content .text-link { font-weight: 500; }


/* ==========================================================================
   Resources buttons: the hero button, scaled down
   --------------------------------------------------------------------------
   Same construction as "About the Paper" — a pill with the arrow riding in
   its own translucent chip, so only the chip moves on hover and the label
   never shifts. Smaller throughout, because these sit inside a section
   rather than opening the page.
   ========================================================================== */

.resource-btn,
.resources-button .btn-primary {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 13px;
  width: auto;
  height: 44px;
  padding: 0 7px 0 22px;
  background-color: var(--btn, #2d3c83);
  border-radius: 999px;
  color: #fff;
  font-family: var(--sans);
  font-size: 15.5px;
  font-weight: 500;
  box-shadow: var(--btn-shadow, 0 1px 2px rgba(17, 24, 39, 0.14));
  transition: background-color 0.18s, box-shadow 0.18s;
}

.resource-btn .btn-chip,
.resources-button .btn-primary .btn-chip {
  width: 30px;
  height: 30px;
}

.resource-btn .btn-arrow,
.resources-button .btn-primary .btn-arrow {
  width: 15px;
  height: 15px;
  transform: none;
}

.resource-btn:hover,
.resources-button .btn-primary:hover {
  background-color: var(--btn-hover, #3a4ba1);
  box-shadow: var(--btn-shadow-hover, 0 5px 14px rgba(45, 60, 131, 0.24));
  transform: none;
}

.resource-btn:hover .btn-chip,
.resources-button .btn-primary:hover .btn-chip {
  background: rgba(255, 255, 255, 0.28);
  transform: translateX(3px);
}

.resource-btn:active,
.resources-button .btn-primary:active {
  background-color: var(--btn-active, #25316d);
  box-shadow: var(--btn-shadow, 0 1px 2px rgba(17, 24, 39, 0.14));
}

@media (max-width: 768px) {
  .resource-btn, .resources-button .btn-primary { height: 40px; font-size: 14.5px; padding: 0 6px 0 18px; }
  .resource-btn .btn-chip, .resources-button .btn-primary .btn-chip { width: 27px; height: 27px; }
}


/* ==========================================================================
   Prior-work table, corrected
   --------------------------------------------------------------------------
   Three things: the citations were carrying the same 500 as the surrounding
   text but reading heavier because of their rule, so they drop to 400 with
   the rest of the cell; the cells declared `white-space: nowrap`, which is
   why a long citation ran past its column instead of wrapping inside it; and
   the column and row names were at the data size, so nothing marked them as
   the frame of the table.
   ========================================================================== */

/* ---- one weight for the data, links included ---- */
.tc-table .tc-data,
.tc-table .tc-data strong,
.tc-table .tc-data span,
.tc-table .tc-data .text-link,
.tc-table .tc-prior-cell,
.tc-table .tc-prior-cell strong,
.tc-table .tc-prior-cell span,
.tc-table .tc-prior-cell .text-link,
.tc-table .tc-prior-text,
.tc-table .tc-prior-text strong {
  font-weight: 400;
  font-size: 13.5px;
}

/* ---- text wraps inside its cell ---- */
.tc-table .tc-cell,
.tc-table .tc-data,
.tc-table .tc-prior-cell,
.tc-table .nowrap-content,
.tc-table .tc-data strong,
.tc-table .tc-prior-text,
.tc-table .tc-prior-text strong {
  white-space: normal;
  overflow-wrap: anywhere;
}

/* the emoji-and-text strongs were flex containers, which forced a line break
   between the glyph and the words */
.tc-table .tc-data strong,
.tc-table .tc-prior-text strong { display: inline; gap: 0; }

/* ---- the frame of the table, one step up ---- */
.tc-table .tc-col-hd,
.tc-table .tc-col-hd strong,
.tc-table .tc-row-hd,
.tc-table .tc-row-hd strong {
  font-size: 15px;
  font-weight: 500;
  line-height: 1.35;
}

/* the findings table keeps the same treatment */
.research-table .research-col-hd,
.research-table .research-col-hd strong,
.research-table .research-row-hd,
.research-table .research-row-hd strong {
  font-size: 15px;
  font-weight: 500;
}

.research-table .research-data,
.research-table .research-data p { font-size: 13.5px; }


/* The two Resources buttons sit in the same column one section apart, so
   they have to be the same object. `width: auto` let each size to its own
   label — 178px against 240px — which read as two slightly different
   buttons. A shared minimum makes them a pair again, with the label left and
   the chip parked at the right edge the way the hero button does it. */
.resource-btn,
.resources-button .btn-primary {
  min-width: 244px;
  justify-content: space-between;
}

@media (max-width: 768px) {
  .resource-btn, .resources-button .btn-primary { min-width: 216px; }
}


/* ==========================================================================
   Findings table: everything on one left edge
   --------------------------------------------------------------------------
   The header row was centring its cells while the data rows were left
   aligned, so the column names floated free of the values beneath them.
   Every cell is now a left-aligned column with its lines stacked from the
   same edge.
   ========================================================================== */

.research-table .research-cell,
.research-table .research-header-row .research-cell,
.research-table .research-col-hd,
.research-table .research-row-hd,
.research-table .research-data {
  align-items: flex-start;
  justify-content: flex-start;
  text-align: left;
}

.research-table .research-cell p { text-align: left; margin: 0 0 4px; }
.research-table .research-cell p:last-child { margin-bottom: 0; }

/* The column headers were vertically centred in a 60px box while the data
   sat at the top of theirs; both now start from the top. */
.research-table .research-header-row .research-cell { padding-top: 10px; }

/* Same for the prior-work table's column headers, which were centred. */
.tc-table .tc-col-hd { text-align: left; }


/* The 244px minimum was making both buttons wider than either label needs —
   equal, but padded out with empty space. They size to their content again,
   with the padding tightened so each sits close around its own label. */
.resource-btn,
.resources-button .btn-primary {
  min-width: 0;
  width: auto;
  gap: 11px;
  padding: 0 6px 0 20px;
  justify-content: flex-start;
}

@media (max-width: 768px) {
  .resource-btn, .resources-button .btn-primary { min-width: 0; padding: 0 5px 0 16px; }
}


/* ==========================================================================
   Phone
   --------------------------------------------------------------------------
   Three real problems at 390px, none of them visible from the desktop view:

   1. The hero kept its desktop gutter. `max(10%, 88px)` is a tenth of a wide
      window but nearly a quarter of a phone, so the title was reading in a
      278px column inside a 390px screen.
   2. The carousels put their arrows beside the figure. Two 30px buttons plus
      gaps took 84px of a 351px column, leaving the chart 267px — the arrows
      were costing a quarter of the figure.
   3. The findings frame stayed 240px tall regardless of the chart's shape,
      so a 3:1 chart sat in a box two thirds empty.
   ========================================================================== */

@media (max-width: 620px) {
  /* ---- hero: the gutter comes back to a phone gutter ---- */
  .hero-overlay { padding: 0 20px; }
  .hero-text-block { max-width: 100%; gap: 20px; }
  .hero-title { font-size: clamp(28px, 8.6vw, 36px); line-height: 1.18; }
  .hero-actions .btn-primary { height: 46px; font-size: 16px; padding: 0 6px 0 20px; }
  .hero-actions .btn-chip { width: 32px; height: 32px; }

  /* ---- carousels: the figure takes the full width, controls sit under ---- */
  .findings-carousel-body,
  .carousel-body {
    flex-wrap: wrap;
    justify-content: center;
    gap: 14px;
  }

  .findings-carousel-image-wrap,
  .carousel-track-wrap {
    order: -1;
    flex: 1 0 100%;
    width: 100%;
  }

  .findings-carousel-image-wrap { height: auto; max-height: 260px; }
  .findings-carousel-image-wrap img { max-height: 260px; }

  .findings-carousel-btn, .carousel-btn { width: 34px; height: 34px; }

  /* ---- the interface caption cannot be hover-only on a touch screen ---- */
  .carousel-caption {
    opacity: 1;
    position: static;
    background: none;
    padding: 10px 2px 0;
  }
  .carousel-caption p { color: #4a5058; font-weight: 400; }

  /* ---- tighter frame for the rest ---- */
  .content-section { padding-left: 0; padding-right: 0; }
  .abstract-top { gap: 12px; }
  .bibtex-code-box { padding: 14px; }
  .bibtex-pre { font-size: 11.5px; }
  .btn-copy { padding: 8px 16px; font-size: 14px; }
}

@media (max-width: 390px) {
  .hero-title { font-size: 28px; }
  .findings-carousel-image-wrap, .findings-carousel-image-wrap img { max-height: 220px; }
}


/* ==========================================================================
   Hero as a header, not a cover
   --------------------------------------------------------------------------
   The workshop site's pattern: the hero sits in normal flow, the artwork is
   a contained figure with its own edges rather than a full-bleed background,
   and the paper begins straight after it. Nothing is cropped, nothing is
   masked, and the page no longer spends a whole screen before it says
   anything.

   The reversal plot is out of the hero: two figures in a header compete, and
   the artwork is the one that reads at a glance. The plot belongs in
   Findings if you want it back.
   ========================================================================== */

.hero-section {
  height: auto;
  min-height: 0;
  background: none;
  overflow: visible;
  padding: 76px 0 0;
}

.hero-overlay {
  height: auto;
  padding: 0 var(--gutter, 40px);
  justify-content: flex-start;
}

.hero-inner {
  display: block;
  max-width: var(--shell, 1000px);
  margin: 0 auto;
}

.hero-text-block { max-width: 780px; gap: 26px; }

.hero-figure {
  margin: 44px 0 0;
  border-radius: 14px;
  overflow: hidden;
  background: #f6f6f6;
}

.hero-figure img {
  display: block;
  width: 100%;
  height: auto;
}

@media (max-width: 900px) {
  .hero-section { padding-top: 56px; }
  .hero-text-block { max-width: 100%; }
  .hero-figure { margin-top: 32px; }
}

@media (max-width: 620px) {
  .hero-section { padding-top: 40px; }
  .hero-overlay { padding: 0 20px; }
  .hero-figure { margin-top: 26px; border-radius: 10px; }
}


/* ==========================================================================
   Touch
   --------------------------------------------------------------------------
   Every hover on this page was written without a guard, which on a phone
   means the state latches: tap a button and it stays "hovered" until you tap
   somewhere else. So all of them move behind a pointer query, and touch gets
   :active instead — a state that ends when the finger lifts.

   Tap targets are raised to 44px where they were smaller, which is the
   floor a finger can hit reliably.
   ========================================================================== */

@media (hover: none), (pointer: coarse) {

  /* ---- nothing latches ---- */
  .btn-primary:hover, .res-btn:hover, .resource-btn:hover, .btn-copy:hover,
  .carousel-btn:hover, .findings-carousel-btn:hover,
  .nav-item:hover, .dropdown-item:hover,
  .text-link:hover, .authors-line .text-link:hover,
  .spine a:hover, .tc-row:hover, .research-row:hover {
    background-color: initial;
    box-shadow: none;
    transform: none;
  }

  .res-btn:hover { background-color: #fff; color: var(--btn); }
  .res-btn:hover .res-icon { color: var(--btn); }
  .btn-primary:hover, .resource-btn:hover, .btn-copy:hover { background-color: var(--btn); }
  .carousel-btn:hover, .findings-carousel-btn:hover { background-color: #f2f4f9; }
  .text-link:hover, .authors-line .text-link:hover {
    border-bottom-color: rgba(161, 0, 0, 0.55);
    border-bottom-style: dotted;
    color: var(--ink);
  }
  .btn-primary:hover .btn-chip, .resource-btn:hover .btn-chip {
    background: rgba(255, 255, 255, 0.16);
    transform: none;
  }

  /* ---- pressed states, which end when the finger lifts ---- */
  .btn-primary:active, .resource-btn:active, .btn-copy:active {
    background-color: var(--btn-active);
    transform: scale(0.985);
  }
  .res-btn:active { background-color: var(--btn); color: #fff; }
  .res-btn:active .res-icon { color: #fff; }
  .carousel-btn:active, .findings-carousel-btn:active { background-color: #d7dcee; transform: scale(0.94); }
  .text-link:active, .authors-line .text-link:active {
    border-bottom-style: solid;
    border-bottom-color: var(--accent);
    color: var(--accent);
  }
  .nav-item:active, .dropdown-item:active { background: rgba(45, 60, 131, 0.08); }
  .spine a:active .dot { background: var(--accent); }

  /* ---- targets a finger can actually hit ---- */
  .carousel-btn, .findings-carousel-btn { width: 44px; height: 44px; }
  .carousel-btn svg, .findings-carousel-btn svg { width: 20px; height: 20px; }
  .res-btn { height: 40px; }
  .dropdown-item { padding: 12px 16px; }
  .nav-item { min-height: 44px; }
  .btn-copy { min-height: 44px; }

  /* A hover-revealed caption can never be reached, so it is simply shown. */
  .carousel-caption { opacity: 1; }
}


/* ---- hero row: words left, finding right -----------------------------------
   The header is a two-column row — title and button on one side, the
   reversal on the other — with the artwork spanning beneath both. The plot
   is a grid item rather than an absolute layer, so the two can never meet in
   the middle however the window is sized. */
.hero-inner {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 0.78fr);
  gap: 6%;
  align-items: center;
}

.hero-text-block { max-width: none; }

.hero-plot {
  position: static;
  display: block;
  width: 100%;
  max-width: 400px;
  margin-left: auto;
  padding: 0;
}

.hero-plot svg { width: 100%; height: auto; max-width: none; margin: 0; }

.hero-figure { grid-column: 1 / -1; }

@media (max-width: 900px) {
  .hero-inner { grid-template-columns: 1fr; gap: 30px; }
  .hero-plot { margin: 0; max-width: 360px; }
}

@media (max-width: 620px) {
  /* The artwork below already carries the header; a fine two-line chart at
     phone width would be a third graphic competing for the same glance. */
  .hero-plot { display: none; }
}


/* ---- more room for the question, less for the chart ------------------------
   The columns were sized as fractions, so the chart grew with the window and
   took width the title wanted. The chart is now a fixed 320px and the title
   takes everything else. */
.hero-inner {
  grid-template-columns: minmax(0, 1fr) 320px;
  gap: 48px;
}

.hero-plot { max-width: 320px; }

/* ---- a shorter artwork ----------------------------------------------------
   The figure was showing the full 16:9 frame at 562px tall, which pushed the
   paper a long way down. Cropped to 380 with the centre held, so the head and
   the wave both survive — the loss is sky at the top and empty ground at the
   bottom. */
.hero-figure { height: 380px; }

.hero-figure img {
  height: 100%;
  object-fit: cover;
  object-position: center;
}

@media (max-width: 900px) {
  .hero-inner { grid-template-columns: 1fr; }
  .hero-figure { height: 300px; }
}

@media (max-width: 620px) {
  .hero-figure { height: 210px; }
}


/* The text block still carried an 88% cap from an earlier layout, so on a
   phone the title was reading in 298px of a 350px column. It takes the
   column now. */
@media (max-width: 620px) {
  .hero-text-block { max-width: 100%; width: 100%; }
}
