/* Homepage: hero frame and typing entrance (the globe itself is in
   home-globe.css), then the sections below it. */
.hero{position:relative;min-height:100dvh;overflow:hidden;display:flex;flex-direction:column;isolation:isolate}
.hero-content{position:relative;flex:1;max-width:1200px;width:100%;margin:0 auto;padding:clamp(48px,10vh,120px) 40px clamp(120px,22vh,240px);display:flex;flex-direction:column;justify-content:flex-end;gap:28px}
.hero-sub{font:500 clamp(17px,1.6vw,20px)/1.55 'Noto Sans TC',sans-serif;color:#F1F5F9;max-width:560px;text-wrap:pretty}
.hero-actions{display:flex;align-items:center;gap:16px;flex-wrap:wrap;padding-top:8px}
.hero-cta{display:inline-flex;align-items:center;min-height:44px;color:#fff;padding:0 24px;font:500 13px 'Space Grotesk',sans-serif;letter-spacing:.02em;border:1px solid rgba(255,255,255,.35);border-radius:4px}

/* Typing entrance: hidden until the script reveals each line character by character. */
.observatory-title{position:relative}
.js-typing .observatory-title>span{clip-path:inset(0 100% 0 0)}
.js-typing .hero-sub,.js-typing .hero-actions{opacity:0}
.type-caret{position:absolute;left:0;top:0;width:.16em;background:var(--accent-on-dark);pointer-events:none}
.observatory-title.is-typing i{visibility:hidden}

@media(max-width:800px){
    .hero-content{padding:48px 20px 100px}
}

/* Below-the-hero sections. Colours come from tokens.css only;
   blue is the single interactive accent. Every section uses its own layout
   family; entrances are defined per family and only when motion is allowed. */
:root{
  --s-ground:#04060A; --s-band:#0B1426; --s-line:rgba(229,234,242,.1); --s-line-strong:rgba(229,234,242,.2);
  --s-ease:cubic-bezier(.16,1,.3,1);
}
.s-wrap{max-width:1200px;margin:0 auto;padding-inline:40px;box-sizing:border-box}
.s-feature h2,.s-index h2,.s-topics h2,.s-tools h2,.s-about h2,.s-contact h2{margin:0;font:700 clamp(24px,2.4vw,32px)/1.4 'Noto Sans TC',sans-serif;color:var(--text-heading);letter-spacing:.02em}
.s-link{display:inline-flex;align-items:center;gap:8px;min-height:44px;color:var(--text-body);font:500 14px/1.6 'Noto Sans TC',sans-serif;text-decoration:none}
.s-link::after{content:'→';transition:transform 150ms var(--s-ease)}
.s-link:hover{color:var(--accent-on-dark);text-decoration:none}.s-link:hover::after{transform:translateX(4px)}
.s-meta{display:flex;gap:16px;margin:0;font:400 13px/1.7 'IBM Plex Mono','Noto Sans TC',monospace;color:var(--text-muted)}

/* Feature band: the one colour-field shift on the page. */
.s-feature{position:relative;padding-block:clamp(72px,9vw,120px);isolation:isolate}
.s-feature::before{content:'';position:absolute;inset:0;z-index:-1;background:linear-gradient(180deg,var(--s-ground) 0%,var(--s-band) 22%,var(--s-band) 78%,var(--s-ground) 100%)}
.s-feature__grid{display:grid;grid-template-columns:minmax(0,5fr) minmax(0,7fr);gap:clamp(32px,5vw,72px);align-items:center}
.s-feature__copy{display:flex;flex-direction:column;align-items:flex-start;gap:20px}
.s-feature__title{margin:0;font:700 clamp(28px,3.4vw,44px)/1.3 'Noto Sans TC',sans-serif;color:var(--text-white);letter-spacing:.01em;text-wrap:balance}
.s-feature__title a{color:inherit;text-decoration:none}.s-feature__title a:hover{color:var(--accent-on-dark);text-decoration:none}
.s-feature__lead{margin:0;max-width:40ch;font:400 17px/1.85 'Noto Sans TC',sans-serif;color:var(--text-body)}
/* "最新研究": a short blue label, set apart from the report title. */
.s-feature .s-feature__heading{font:700 16px/1.6 'Noto Sans TC',sans-serif;color:var(--accent-on-dark);letter-spacing:.12em}

/* Two reports as printed papers side by side: portrait A4, sheets fanned behind.
   Each paper and its list entry take the colour of their research topic (see .s-hub). */
.s-feature__item--geo,.s-paper--geo{--hub:#7ee0d5;--paper-ink:#0E7C70}
.s-feature__item--tso,.s-paper--tso{--hub:#c2b0ff;--paper-ink:#5B3FD1}
.s-feature__list{display:flex;flex-direction:column;gap:28px;margin:4px 0 0;padding:0;list-style:none}
.s-feature__item{display:flex;flex-direction:column;gap:8px;padding-left:18px;border-left:2px solid color-mix(in srgb,var(--hub) 45%,transparent);transition:border-color 300ms var(--s-ease)}
.s-feature__item:hover,.s-feature__item:focus-within{border-left-color:var(--hub)}
.s-feature__tag{font:700 13px/1.7 'Space Grotesk',sans-serif;color:var(--hub);letter-spacing:.08em}
.s-feature__item .s-feature__title{font-size:clamp(20px,1.9vw,26px)}
.s-feature__item .s-feature__lead{font-size:15px;line-height:1.8}
.s-papers{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:clamp(28px,4vw,56px);align-items:start;padding-block:12px 40px;padding-inline-end:clamp(16px,3.5vw,56px)}
.s-papers .s-paper:nth-child(2){margin-top:56px}
.s-paper{position:relative;justify-self:center;width:min(100%,300px);aspect-ratio:1/1.414;margin:0}
.s-paper__sheet,.s-paper__cover{position:absolute;inset:0;border-radius:2px}
.s-paper__sheet{background:#DDE3EC;box-shadow:0 24px 48px -24px rgba(2,6,16,.8)}
.s-paper__sheet--2{transform:rotate(6deg) translate(18px,8px);background:#C9D1DD}
.s-paper__sheet--1{transform:rotate(2.5deg) translate(8px,4px)}
.s-paper__cover{display:flex;flex-direction:column;overflow:hidden;background:#F4F7FA;color:#0B1F3B;text-decoration:none;transform:rotate(-2deg);box-shadow:0 40px 80px -30px rgba(2,6,16,.9),0 12px 24px -12px rgba(2,6,16,.6);transition:transform 500ms var(--s-ease)}
.s-paper:nth-child(2) .s-paper__cover{transform:rotate(2deg)}
.s-paper .s-paper__cover:hover,.s-feature__grid:has([data-paper-for="tcc"]:hover) [data-paper="tcc"] .s-paper__cover,.s-feature__grid:has([data-paper-for="mcac"]:hover) [data-paper="mcac"] .s-paper__cover{transform:rotate(0) translateY(-6px);text-decoration:none;color:#0B1F3B}
.s-paper__cover:focus-visible{outline:3px solid var(--accent-on-dark);outline-offset:6px}
/* Journal-style two-tone cover: a navy title block lit from one corner, a
   brand-blue rule, then the light page. */
.s-paper__band{position:relative;display:flex;flex-direction:column;gap:12px;padding:8% 8% 7%;background:radial-gradient(120% 90% at 100% 0%,color-mix(in srgb,var(--paper-ink) 55%,transparent) 0%,color-mix(in srgb,var(--paper-ink) 20%,transparent) 38%,rgba(11,31,59,0) 70%),#0B1F3B;color:#F8FAFC;border-bottom:3px solid var(--hub)}
.s-paper__top{display:flex;align-items:center;gap:8px;font:500 10px/1.4 'Noto Sans TC',sans-serif;color:#CBD5E1;letter-spacing:.06em}
.s-paper__top span:last-child{margin-left:auto;font-family:'Space Grotesk',sans-serif;letter-spacing:.08em}
.s-paper__title{margin-top:8%;font:700 clamp(17px,1.65vw,22px)/1.35 'Noto Sans TC',sans-serif;color:#FFFFFF}
.s-paper__sub{font:400 10px/1.7 'Noto Sans TC',sans-serif;color:#CBD5E1}
.s-paper__art{flex:1;min-height:0;display:flex;align-items:center;padding:5% 7% 2%}
.s-paper__art img{display:block;width:100%;height:auto;max-height:100%;object-fit:contain}
/* The report's own framework as the cover's type motif. */
.s-paper__letters{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(0,1fr);margin:0 7%;border-top:1px solid rgba(11,31,59,.14)}
.s-paper__letters>span{display:flex;flex-direction:column;gap:2px;padding:8px 0 6px;font:400 8.5px/1.3 'Space Grotesk',sans-serif;color:#64748B;letter-spacing:.04em}
.s-paper__letters>span+span{padding-left:8px;border-left:1px solid rgba(11,31,59,.1)}
.s-paper__letters b{font:700 clamp(18px,1.8vw,26px)/1 'Space Grotesk',sans-serif;color:var(--paper-ink);letter-spacing:-.02em}
.s-paper__letters>span:nth-child(even) b{color:color-mix(in srgb,var(--paper-ink) 70%,#0B1F3B)}
.s-paper__foot{display:flex;justify-content:space-between;gap:12px;margin:0 7%;padding:8px 0 7%;border-top:1px solid rgba(11,31,59,.14);font:400 10px/1.5 'Space Grotesk','Noto Sans TC',sans-serif;color:#64748B;letter-spacing:.04em}
/* Coated-paper sheen: sweeps once when the cover lands and again on hover. */
.s-paper__sheen{position:absolute;inset:0;pointer-events:none;background:linear-gradient(105deg,transparent 35%,rgba(255,255,255,.5) 48%,rgba(255,255,255,.08) 55%,transparent 62%);mix-blend-mode:soft-light;transform:translateX(-120%)}
.s-paper__cover:hover .s-paper__sheen{transform:translateX(120%);transition:transform 900ms var(--s-ease)}
.s-feature.is-in .s-paper__sheen{animation:s-sheen 1200ms var(--s-ease) 900ms 1 both}
@keyframes s-sheen{from{transform:translateX(-120%)}to{transform:translateX(120%)}}

/* Latest writing: an index, not cards. */
.s-index{padding-block:clamp(72px,9vw,120px) clamp(40px,5vw,64px)}
.s-index__head{display:flex;justify-content:space-between;align-items:baseline;gap:20px;margin-bottom:24px}
.s-index__list{list-style:none;margin:0;padding:0;border-top:1px solid var(--s-line-strong)}
.s-index__list li{position:relative}
.s-index__list li::after{content:'';position:absolute;left:0;right:0;bottom:0;height:1px;background:var(--s-line);transform-origin:left}
.s-index__list a{display:grid;grid-template-columns:72px 96px minmax(0,1fr) 24px;gap:24px;align-items:baseline;padding:24px 0;color:var(--text-body);text-decoration:none}
.s-index__list a::after{content:'→';color:var(--text-muted);transition:transform 150ms var(--s-ease),color 150ms var(--s-ease)}
.s-index__list time{font:400 14px/1.6 'IBM Plex Mono',monospace;color:var(--text-muted);font-variant-numeric:tabular-nums}
.s-cat{font:400 13px/1.6 'Noto Sans TC',sans-serif;color:var(--text-muted)}
.s-title{font:500 clamp(17px,1.5vw,20px)/1.6 'Noto Sans TC',sans-serif;color:var(--text-heading);transition:color 150ms var(--s-ease)}
.s-index__list a:hover{text-decoration:none}.s-index__list a:hover .s-title{color:var(--accent-on-dark)}.s-index__list a:hover::after{color:var(--accent-on-dark);transform:translateX(4px)}

/* Topics: a wrap of labels. */
.s-topics{padding-block:clamp(48px,6vw,80px)}
.s-topics .focus-list{margin-top:32px}

/* Tools: two framed panels. */
.s-tools{padding-block:clamp(48px,6vw,80px)}
.s-tools__grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:24px;margin-top:24px}
.s-panel{position:relative;display:flex;flex-direction:column;align-items:flex-start;padding:32px;border:1px solid var(--s-line);border-radius:4px;transition:border-color 150ms var(--s-ease)}
.s-panel::before{content:'';position:absolute;left:-1px;right:-1px;top:-1px;height:1px;background:var(--accent-surface);transform:scaleX(0);transform-origin:left}
.s-panel:hover{border-color:var(--s-line-strong)}
.s-panel h3{margin:0 0 12px;font:500 22px/1.5 'Noto Sans TC',sans-serif;color:var(--text-heading)}
.s-panel p{margin:0 0 24px;max-width:44ch;font:400 15px/1.9 'Noto Sans TC',sans-serif;color:var(--text-muted)}
.s-panel .s-link{margin-top:auto}

/* About: founder line and a large faint mark beside a pull quote. */
.s-about{position:relative;display:grid;grid-template-columns:minmax(0,4fr) minmax(0,8fr);gap:40px 64px;padding-block:clamp(72px,9vw,120px)}
.s-about__side{position:relative;display:flex;flex-direction:column;gap:28px}
.s-founder{display:flex;flex-direction:column;gap:2px;padding-left:16px;border-left:1px solid var(--s-line-strong)}
.s-founder strong{font:700 18px/1.5 'Noto Sans TC',sans-serif;color:var(--text-heading)}
.s-founder>span{font:400 13px/1.6 'Noto Sans TC',sans-serif;color:var(--text-muted)}
.s-founder .s-link{margin-top:4px}
.s-about__mark{width:clamp(180px,20vw,260px);height:auto;-webkit-mask-image:linear-gradient(to right,transparent,#000 35%),linear-gradient(to top,transparent,#000 35%);-webkit-mask-composite:source-in;mask-image:linear-gradient(to right,transparent,#000 35%),linear-gradient(to top,transparent,#000 35%);mask-composite:intersect}
.s-quote{margin:0 0 32px!important;max-width:18em!important;font:500 clamp(24px,2.6vw,34px)/1.5 'Noto Sans TC',sans-serif!important;color:var(--text-white)!important}
.s-about__body p{margin:0 0 20px;max-width:62ch;font:400 17px/1.95 'Noto Sans TC',sans-serif;color:var(--text-body)}
.s-about__body a{color:var(--text-heading);text-decoration:underline;text-decoration-color:rgba(96,165,250,.5);text-underline-offset:5px}
.s-about__body a:hover{color:var(--accent-on-dark)}

/* Contact: a quiet closing row. */
.s-contact{padding-block:clamp(56px,6vw,80px) 32px;border-top:1px solid var(--s-line)}
.s-contact__row{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:16px 32px}
.s-contact h2{font-size:clamp(20px,1.8vw,24px)}
.s-contact__links{display:flex;flex-wrap:wrap;align-items:center;gap:8px 24px}
.s-contact__links a,.s-contact__links button{display:inline-flex;align-items:center;min-height:44px;padding:0;border:0;background:none;font:400 15px/1.5 'Noto Sans TC',sans-serif;color:var(--text-body);text-decoration:none}
.s-contact__links a,.s-contact__links button{font-family:'Space Grotesk','Noto Sans TC',sans-serif}
.s-contact__links .contact-email{font:500 17px/1.5 'Space Grotesk','Noto Sans TC',sans-serif;letter-spacing:.01em;color:var(--text-heading)}
.s-contact__links a:hover{color:var(--accent-on-dark);text-decoration:none}
.s-contact__links button:disabled{color:var(--text-muted)}
.s-contact__foot{display:flex;justify-content:space-between;flex-wrap:wrap;gap:16px 24px;margin-top:40px;padding-top:20px;border-top:1px solid var(--s-line);font:400 12px/1.7 'IBM Plex Mono','Noto Sans TC',monospace;color:var(--text-muted)}
.s-contact__foot nav{display:flex;flex-wrap:wrap;gap:8px 24px}.s-contact__foot a{color:var(--text-muted);text-decoration:none}.s-contact__foot a:hover{color:var(--text-heading)}

/* Compact bar after the hero. */
.site-bar{position:fixed;inset:0 0 auto;z-index:20;display:flex;align-items:center;justify-content:space-between;gap:24px;height:56px;padding-inline:max(40px,calc((100vw - 1200px)/2 + 40px));background:rgba(4,6,10,.78);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border-bottom:1px solid var(--s-line);transform:translateY(-100%);transition:transform 300ms var(--s-ease)}
.site-bar.is-shown{transform:none}
.site-bar__brand{display:inline-flex;align-items:center;gap:10px;font:700 17px/1 'Space Grotesk',sans-serif;color:var(--text-white);text-decoration:none}
.site-bar nav{display:flex;gap:24px}.site-bar nav a{display:inline-flex;align-items:center;min-height:44px;font:400 13px/1.5 'Noto Sans TC',sans-serif;color:var(--text-body);text-decoration:none}.site-bar nav a:hover{color:var(--text-white)}
.site-bar__progress{position:absolute;left:0;right:0;bottom:-1px;height:1px;background:var(--accent-surface);transform:scaleX(0);transform-origin:left}
@supports (animation-timeline: scroll()){
  .site-bar__progress{animation:s-progress linear both;animation-timeline:scroll(root)}
}
@keyframes s-progress{to{transform:scaleX(1)}}

/* ---------- Entrances (only with .s-motion, set by sections.js) ---------- */
/* Feature: the band opens from the centre line, the cover rises through a mask. */
.s-motion [data-anim="feature"]::before{clip-path:inset(0 50% 0 50%);transition:clip-path 1100ms var(--s-ease)}
.s-motion [data-anim="feature"] .s-paper__sheet,.s-motion [data-anim="feature"] .s-paper__cover{transition:transform 1100ms var(--s-ease),opacity 700ms var(--s-ease)}
.s-motion [data-anim="feature"]:not(.is-in) .s-paper__sheet,.s-motion [data-anim="feature"]:not(.is-in) .s-paper__cover{transform:translateY(60px) rotate(0);opacity:0}
.s-motion [data-anim="feature"] .s-paper__sheet--1{transition-delay:120ms}
.s-motion [data-anim="feature"] .s-paper__cover{transition-delay:240ms}
.s-motion [data-anim="feature"] .s-paper:nth-child(2) .s-paper__sheet{transition-delay:300ms}
.s-motion [data-anim="feature"] .s-paper:nth-child(2) .s-paper__cover{transition-delay:420ms}
.s-motion [data-anim="feature"] .s-feature__copy>:not([data-scatter]){opacity:0;transform:translateY(20px);transition:opacity 700ms var(--s-ease),transform 700ms var(--s-ease);transition-delay:calc(200ms + var(--i,0) * 80ms)}
.s-motion [data-anim="feature"].is-in::before{clip-path:inset(0)}
.s-motion [data-anim="feature"].is-in .s-feature__copy>:not([data-scatter]){opacity:1;transform:none}
/* List: rows arrive in order and each rule is drawn under its row. */
.s-motion [data-anim="list"] .s-index__list li>a{opacity:0;transform:translateY(12px);transition:opacity 500ms var(--s-ease),transform 500ms var(--s-ease);transition-delay:calc(var(--i,0) * 70ms)}
.s-motion [data-anim="list"] .s-index__list li::after{transform:scaleX(0);transition:transform 700ms var(--s-ease);transition-delay:calc(120ms + var(--i,0) * 70ms)}
.s-motion [data-anim="list"].is-in .s-index__list li>a{opacity:1;transform:none}
.s-motion [data-anim="list"].is-in .s-index__list li::after{transform:none}
/* Tools: a blue edge traces across the top of each panel. */
.s-motion [data-anim="panels"] .s-panel::before{transition:transform 800ms var(--s-ease);transition-delay:calc(var(--i,0) * 150ms)}
.s-motion [data-anim="panels"].is-in .s-panel::before{transform:scaleX(1)}
.s-motion [data-anim="panels"] .s-panel>*{opacity:0;transition:opacity 600ms var(--s-ease);transition-delay:calc(250ms + var(--i,0) * 150ms)}
.s-motion [data-anim="panels"].is-in .s-panel>*{opacity:1}
/* About: paragraphs settle in reading order. */
.s-motion [data-anim="read"] .s-about__body>:not([data-scatter]),.s-motion [data-anim="read"] .s-founder{opacity:0;transform:translateY(14px);transition:opacity 600ms var(--s-ease),transform 600ms var(--s-ease);transition-delay:calc(var(--i,0) * 90ms)}
.s-motion [data-anim="read"].is-in .s-about__body>:not([data-scatter]),.s-motion [data-anim="read"].is-in .s-founder{opacity:1;transform:none}

/* The mark slowly settles as About enters. */
.s-motion [data-anim="read"] .s-about__mark{transition:transform 1400ms var(--s-ease),opacity 1400ms var(--s-ease)}
.s-motion [data-anim="read"]:not(.is-in) .s-about__mark{transform:translateY(24px);opacity:0}

/* Scattered letters: split into .s-ch by sections.js; hidden until their
   section enters, then each glyph flies back from its own offset. */
.s-word{display:inline-block;white-space:nowrap}
.s-ch{display:inline-block}
.s-motion [data-anim]:not(.is-in) .s-ch{opacity:0}

/* Rise (tools and below): each line slides up from behind its own baseline. */
.s-line{display:block;overflow:hidden;padding-bottom:.08em;margin-bottom:-.08em}
.s-line>span{display:block}
.s-motion [data-anim]:not(.is-in) .s-line>span{transform:translateY(110%)}
.s-motion [data-anim] .s-line>span{transition:transform 900ms var(--s-ease);transition-delay:calc(var(--l,0) * 110ms + var(--d,0ms))}
.s-motion [data-anim="panels"] .s-panel h3,.s-motion [data-anim="panels"] .s-panel p,.s-motion [data-anim="panels"] .s-panel .s-link{transform:translateY(16px)}
.s-motion [data-anim="panels"].is-in .s-panel h3,.s-motion [data-anim="panels"].is-in .s-panel p,.s-motion [data-anim="panels"].is-in .s-panel .s-link{transform:none;transition:opacity 600ms var(--s-ease),transform 700ms var(--s-ease);transition-delay:calc(250ms + var(--i,0) * 150ms)}
.s-motion [data-anim="contact"] .s-contact__links>*{opacity:0;transform:translateY(12px);transition:opacity 500ms var(--s-ease),transform 600ms var(--s-ease);transition-delay:calc(300ms + var(--i,0) * 80ms)}
.s-motion [data-anim="contact"].is-in .s-contact__links>*{opacity:1;transform:none}
.s-motion [data-anim="contact"] .s-contact__foot{opacity:0;transition:opacity 800ms var(--s-ease) 600ms}
.s-motion [data-anim="contact"].is-in .s-contact__foot{opacity:1}

/* Hero hands over: the title drifts up and fades as the page scrolls away. */
@supports (animation-timeline: view()){
  .s-motion .hero-content{animation:s-hero-exit linear both;animation-timeline:view();animation-range:exit 0% exit 90%}
}
@keyframes s-hero-exit{to{transform:translateY(-72px);opacity:0}}

@media (max-width:800px){
  .s-wrap{padding-inline:20px}
  .s-feature__grid,.s-about{grid-template-columns:1fr}
  .s-papers{width:min(100%,600px);margin-top:8px;padding-inline-end:0}
  .s-paper__foot span:last-child{display:none}
  .s-quote{font-size:22px!important}
  .s-about__mark{position:absolute;right:0;top:0;width:120px}
  .s-index__list a{grid-template-columns:56px minmax(0,1fr) 20px;gap:8px 16px;padding:20px 0}
  .s-index__list time{grid-row:1/3}
  .s-cat{grid-column:2;grid-row:1}
  .s-index__list .s-title{grid-column:2;grid-row:2}
  .s-index__list a::after{grid-column:3;grid-row:1/3;align-self:center}
  .s-tools__grid{grid-template-columns:1fr}
  .s-about{gap:20px}
  .site-bar{padding-inline:20px}.site-bar nav{gap:16px}.site-bar nav a:nth-child(n+3){display:none}
}

/* Screen-reader copy of scattered text. */
.s-sr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}
/* observatory.css (shared with /brand/) forces #contact h2 to 42px with !important. */
.home-observatory #contact.s-contact h2{font:700 clamp(20px,1.8vw,24px)/1.4 'Noto Sans TC',sans-serif !important;letter-spacing:.02em}

/* ---------- Phones: one column, one idea per screen ----------
   The desktop layout's framing (fanned paper, boxed panels, side marks,
   four-column rows) turns into clutter at 390px. Here each section keeps only
   its content and one rule or image. */
@media (max-width:640px){
  .s-feature,.s-index,.s-topics,.s-tools,.s-about,.s-contact{overflow-x:clip}

  /* Header: logo and links on one 56px row. */
  .home-observatory .hero>header{height:56px!important;min-height:0!important;padding:0 16px!important;flex-wrap:nowrap!important;gap:12px!important}
  .home-observatory .hero>header>a>span{display:none}
  .home-observatory .hero>header>a>picture>img{width:28px!important;height:28px!important}
  .hero>header .site-navigation{width:auto;gap:16px;flex-wrap:nowrap}
  .hero>header .tool-panel{left:auto;right:-16px;width:calc(100vw - 32px)}

  /* Hero copy: shorter measure, breaks at the comma, not inside a word. */
  .home-observatory [data-screen-label="Hero"]>div:last-child{padding:0 20px 88px!important;gap:20px}
  .hero-sub{font-size:16px;word-break:keep-all;overflow-wrap:anywhere;text-wrap:balance}

  /* Research: text first, then the two covers, small and flat, side by side. */
  .s-feature{padding-block:56px 64px}
  .s-feature__grid{gap:32px}
  .s-feature__copy{gap:14px}
  .s-feature__title{font-size:26px}
  .s-feature__lead{font-size:15px;word-break:keep-all;overflow-wrap:anywhere}
  .s-feature__list{gap:24px}
  .s-feature__item .s-feature__title{font-size:20px}
  .s-papers{gap:16px;padding-block:0}
  .s-papers .s-paper:nth-child(2){margin-top:0}
  .s-paper{width:100%}
  .s-paper__title{font-size:15px}
  .s-paper__sub,.s-paper__top span:last-child{display:none}
  .s-paper__sheet{display:none}
  .s-papers .s-paper .s-paper__cover,.s-papers .s-paper .s-paper__cover:hover{transform:none}
  /* At this size the cover keeps its title block and its framework letters. */
  .s-paper__art,.s-paper__foot{display:none}
  .s-paper__letters{flex:1;align-items:center;border-top:0}
  .s-paper__letters>span{font-size:0;padding:0;align-items:center}
  .s-paper__letters>span+span{padding-left:0}
  .s-paper__letters b{font-size:24px}

  /* Latest: date and category on one quiet line, title below, no arrow. */
  .s-index{padding-block:48px 24px}
  .s-index__head{margin-bottom:12px}
  .s-index__list a{grid-template-columns:auto minmax(0,1fr);gap:4px 12px;padding:18px 0}
  .s-index__list time{grid-row:1;grid-column:1;font-size:13px}
  .s-cat{grid-row:1;grid-column:2}
  .s-index__list .s-title{grid-row:2;grid-column:1/-1;font-size:16px;word-break:keep-all;overflow-wrap:anywhere}
  .s-index__list a::after{display:none}

  /* Topics */
  .s-topics{padding-block:40px}
  .s-topics .focus-list{margin-top:16px}

  /* Tools: rows between rules instead of boxes. */
  .s-tools{padding-block:40px}
  .s-tools__grid{gap:0;margin-top:16px;border-top:1px solid var(--s-line-strong)}
  .s-panel{padding:20px 0;border:0;border-bottom:1px solid var(--s-line);border-radius:0}
  .s-panel::before{display:none}
  .s-panel h3{font-size:19px;margin-bottom:8px}
  .s-panel p{font-size:14px;margin-bottom:8px}

  /* About: heading, quote, text, then the founder line. No mark. */
  .s-about{display:flex;flex-direction:column;gap:20px;padding-block:48px}
  .s-about__side{display:contents}
  .s-about__mark{display:none}
  .s-about__body{order:2}
  .s-founder{order:3}
  .s-quote{font-size:21px!important;margin-bottom:20px!important}
  .s-about__body p{font-size:16px;line-height:1.9}

  /* Contact: a plain list. */
  .s-contact{padding-block:48px 24px}
  .s-contact__row{flex-direction:column;align-items:flex-start;gap:8px}
  .s-contact__links{flex-direction:column;align-items:flex-start;gap:0}
  .s-contact__foot{flex-direction:column;gap:8px;margin-top:24px}
  .s-contact__foot nav{display:grid;grid-template-columns:1fr 1fr;gap:0 16px}
  .s-contact__foot nav a{display:inline-flex;align-items:center;min-height:44px}

  /* Compact bar */
  .site-bar{height:52px}
}

/* The topic menu needs a full row on narrow phones. Keep language beside the logo. */
@media(max-width:420px){
  .home-observatory .hero>header:has(.topic-disclosure) {
    height: auto !important;
    padding-block: 8px !important;
    flex-wrap: wrap !important;
    gap: 4px !important;
  }
  .home-observatory .hero>header:has(.topic-disclosure)>a {
    min-height: 44px;
  }
  .home-observatory .hero>header:has(.topic-disclosure) .site-navigation {
    position: static;
    width: 100%;
    flex-wrap: wrap;
    justify-content: space-between;
    column-gap: 8px !important;
  }
  .home-observatory .hero>header:has(.topic-disclosure) .language-disclosure {
    position: absolute;
    inset-block-start: 8px;
    inset-inline-end: 16px;
    margin: 0;
  }
  .home-observatory .hero>header:has(.topic-disclosure) .language-panel {
    width: 176px;
    max-width: calc(100vw - 32px);
  }
  .home-observatory .hero>header:has(.topic-disclosure) .tool-panel {
    inset-inline: 16px;
    width: auto;
  }
}
@media(max-width:380px){
  .home-observatory .hero>header:has(.topic-disclosure) .site-navigation>a,
  .home-observatory .hero>header:has(.topic-disclosure) .site-navigation summary {
    font-size: 12px;
  }
}

/* English labels need a separate row so the mobile logo cannot collapse. */
@media(max-width:800px){
  html[lang="en"] .home-observatory .hero>header{height:auto!important;min-height:80px!important;flex-wrap:wrap!important;gap:4px!important;padding-block:10px!important}
  html[lang="en"] .home-observatory .hero>header>a{flex:0 0 28px}
  html[lang="en"] .hero>header .site-navigation{width:100%;flex-wrap:wrap;gap:8px 12px}
}

/* Social accounts use the same compact, accessible icon controls as articles. */
.contact-socials{display:flex;align-items:center;gap:8px}
.s-contact__links .contact-social-link{box-sizing:border-box;justify-content:center;width:44px;height:44px;min-width:44px;padding:0;border:1px solid var(--s-line);border-radius:4px;color:var(--text-body)}
.contact-social-link svg{display:block;width:20px;height:20px;flex:none}
.s-contact__links .contact-social-link:hover{border-color:var(--accent-on-dark);color:var(--accent-on-dark)}
.s-contact__links .contact-social-link:focus-visible{outline:2px solid var(--accent-on-dark);outline-offset:3px}
@media(max-width:800px){.s-contact__links .contact-socials{margin-top:8px}}
/* AI search topic hubs: three panels, each with its character peeking over the top edge. */
.s-hubs__grid{grid-template-columns:repeat(3,minmax(0,1fr));margin-top:72px}
.s-hub{--hub:#7ee0d5}.s-hub--tso{--hub:#c2b0ff}.s-hub--ax{--hub:#ffc294}.s-hub--aiads{--hub:#ff9fc6}
.s-hub--aiads .s-hub__tag{font-family:'Space Grotesk','Noto Sans TC',sans-serif!important}
@media(min-width:1101px){.s-hubs__grid:has(>:nth-child(4)){grid-template-columns:repeat(4,minmax(0,1fr))}}
@media(min-width:861px) and (max-width:1100px){.s-hubs__grid:has(>:nth-child(4)){grid-template-columns:repeat(2,minmax(0,1fr));row-gap:72px}}
.s-hub::before{background:var(--hub)}
.s-hub:hover{border-color:color-mix(in srgb,var(--hub) 55%,transparent)}
.s-hub__peek{position:absolute;right:24px;bottom:100%;width:84px;height:62px;overflow:hidden;pointer-events:none}
.s-hub__peek img{display:block;width:100%;height:auto;transform:translateY(10px);transition:transform 300ms var(--s-ease)}
.s-hub:hover .s-hub__peek img{transform:translateY(0)}
.s-hub__tag{margin:0 0 4px!important;font:700 15px/1.4 'Space Grotesk',sans-serif!important;color:var(--hub)!important;letter-spacing:.06em}
.s-hub .s-link{color:var(--text-heading)}
@media(max-width:860px){.s-hubs__grid{grid-template-columns:1fr;row-gap:72px;margin-top:64px}}
/* Phones drop the panel boxes for rules; put each rule on top so every character sits on one. */
@media(max-width:640px){.s-hubs__grid{border-top:0}.s-hubs__grid .s-hub{border-bottom:0;border-top:1px solid var(--s-line-strong)}}
@media(prefers-reduced-motion:reduce){.s-hub__peek img{transition:none}}
