*{box-sizing:border-box}html{scroll-behavior:smooth;scroll-padding-top:104px;background:var(--ink)}body{margin:0;color:var(--ink);background:var(--paper);font:16px/1.65 system-ui,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif}a{color:inherit;text-underline-offset:3px}img{max-width:100%;height:auto}button,input,select,textarea{font:inherit;color:inherit}button,a,input,select,textarea{touch-action:manipulation}button,a{transition:background-color .15s,border-color .15s,box-shadow .15s}button{cursor:pointer}button:disabled{cursor:default;opacity:.6}h1,h2,h3,h4,p,figure{margin:0 0 var(--space-4)}h1{font-size:40px;line-height:1.18;letter-spacing:-.03em}h2{font-size:32px;line-height:1.22;letter-spacing:-.02em}h3{font-size:22px;line-height:1.3}h4{font-size:18px}p{max-width:70ch}a:hover{text-decoration:underline}:focus-visible{outline:3px solid var(--ink);outline-offset:3px}[hidden]{display:none!important}.wrap{max-width:var(--container);padding-inline:var(--space-6);margin-inline:auto}main{padding-top:var(--space-8);padding-bottom:var(--space-20)}main>h2,main>.related{margin-top:var(--space-8)}.lede{font-size:18px;line-height:1.6}.fine,.sku,figcaption,.crumb{font-size:14px;color:var(--muted)}.section-sub{font-size:16px;color:var(--muted)}.eyebrow{font-size:12px;font-weight:700;letter-spacing:.1em;text-transform:uppercase}.sr-only,.skip{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}.skip:focus{position:fixed;top:8px;left:8px;width:auto;height:auto;clip-path:none;background:var(--paper);padding:12px;z-index:100}.btn{display:inline-flex;justify-content:center;align-items:center;min-height:44px;padding:12px 20px;border:1px solid var(--action);border-radius:var(--radius-control);background:var(--action);color:var(--ink);font-size:14px;font-weight:700;line-height:1.4;text-decoration:none;text-align:center}.btn:hover{background:var(--ink);color:var(--paper);border-color:var(--ink);text-decoration:none}.btn-ghost{background:transparent;border-color:var(--ink);color:var(--ink)}input,select,textarea{min-height:48px;padding:12px 16px;border:1px solid var(--muted);border-radius:var(--radius-control);background:var(--paper);max-width:100%;width:100%;font-size:16px}textarea{resize:vertical}input::placeholder{color:var(--muted)}label{font-size:14px;font-weight:600}label input,label select{display:block;margin-top:8px}.actions,.card-actions{display:flex;gap:12px;flex-wrap:wrap}.site-header,.site-footer,.inquiry{background:var(--ink);color:var(--paper)}.site-header :focus-visible,.site-footer :focus-visible,.inquiry :focus-visible,.help:focus-visible{outline-color:var(--action)}.header-in{min-height:88px;display:flex;align-items:center;gap:20px;padding-block:12px}.logo{display:block;flex:0 0 240px;line-height:0}.logo img{width:240px}.nav-menu{flex:1}.nav-menu>summary{display:none}.nav-menu:not([open])>nav{display:flex}.nav-menu nav{display:flex;gap:20px;align-items:center;font-size:14px;font-weight:600}.nav-menu nav>a{text-decoration:none;white-space:nowrap;padding-block:12px}.nav-menu nav>a:hover{text-decoration:underline}.products-menu{position:relative}.products-menu>summary{cursor:pointer;min-height:44px;padding-block:12px}.products-menu>div{position:absolute;top:100%;left:0;min-width:230px;padding:12px;background:var(--paper);color:var(--ink);border:1px solid var(--line);border-radius:var(--radius-card);box-shadow:var(--shadow-hover);z-index:10}.products-menu a{display:block;padding:8px;min-height:44px}.header-search{display:flex;flex:0 1 200px;gap:4px}.header-search input{flex:1;width:auto;min-width:0;min-height:44px;padding:8px;font-size:14px}.header-search button{background:transparent;border:1px solid var(--action);color:var(--paper);border-radius:8px;min-height:44px;font-size:14px;padding:8px}.header-in>.quote{white-space:nowrap;flex-shrink:0}.bottom-nav{display:none}.site-footer{padding-block:48px 96px}.footer-in{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:32px}.footer-logo img{width:220px}.footer-in h2{font-size:18px;letter-spacing:0}.footer-in a:not(.footer-logo){display:block;color:var(--action);font-size:14px;min-height:36px;padding-block:4px}.footer-in p{font-size:14px}.footer-in .footer-help{font-size:12px!important}.footer-base{display:flex;justify-content:space-between;gap:24px;border-top:1px solid var(--footer-muted);padding-top:24px;margin-top:32px;color:var(--footer-muted)}.languages{display:flex;gap:8px;align-items:center}.languages span,.languages button{font-size:12px;min-height:44px;min-width:44px;border-radius:8px;border:1px solid var(--footer-muted);background:transparent;color:var(--paper)}.languages span{display:grid;place-items:center;background:var(--action);color:var(--ink)}.help{position:fixed;bottom:96px;right:24px;border:1px solid var(--action);border-radius:12px;padding:12px 16px;background:var(--ink);color:var(--paper);text-decoration:none;z-index:20;font-size:14px;font-weight:600}.home>section+section{margin-top:80px}.studio-hero{display:grid;grid-template-columns:1.1fr 1fr;gap:24px;align-items:center;padding-block:48px}.studio-hero h1{font-size:56px;line-height:1.08}.studio-hero .eyebrow{margin-bottom:24px}.studio-hero .actions{margin-block:24px}.studio-hero figure{margin:0;min-width:0}.studio-hero figure img{width:100%;aspect-ratio:4/3;object-fit:contain}.studio-hero figcaption{padding:16px;border-top:1px solid var(--line)}.section-heading{display:flex;justify-content:space-between;gap:24px;align-items:end;margin-bottom:24px}.section-heading h2{margin-bottom:0}.section-heading>a{font-size:14px}.workspace-search{padding:24px;background:var(--tint);border-radius:12px;margin-bottom:24px}.workspace-search>div{display:flex;gap:12px;margin-top:8px}.workspace-search input{flex:1}.workspace-search button{flex:0 0 auto}.category-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:24px}.category-card{border:1px solid var(--line);border-radius:12px;padding:24px;text-decoration:none;display:flex;flex-direction:column;gap:12px}.category-card:hover{box-shadow:var(--shadow-hover);border-color:var(--ink);text-decoration:none}.category-card .eyebrow{color:var(--muted)}.category-card h3{margin:0}.category-card>span:last-child{font-size:14px}.category-grid+.fine{margin-top:16px}.video-section{display:grid;grid-template-columns:240px 1fr;align-items:center;gap:32px;margin-top:32px;padding:24px;border:1px solid var(--line);border-radius:12px}.video-poster{aspect-ratio:9/16;background:var(--tint);border:1px solid var(--line);padding:16px;display:flex;flex-direction:column;justify-content:center;gap:16px;text-align:center;font-size:14px}.video-poster strong{font-size:22px;line-height:1.3}.grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:24px}.featured{grid-template-columns:repeat(3,minmax(0,1fr));margin-top:24px}.card{border:1px solid var(--line);border-radius:12px;padding:16px;background:var(--paper);display:flex;flex-direction:column;min-width:0}.card:hover{box-shadow:var(--shadow-hover);border-color:var(--ink)}.card-img{display:grid;place-items:center;aspect-ratio:4/3;margin-bottom:16px;background:var(--paper);text-decoration:none;overflow:hidden}.card-img img{width:100%;height:100%;object-fit:contain}.image-pending{display:flex;justify-content:center;align-items:center;flex-direction:column;gap:8px;aspect-ratio:4/3;width:100%;padding:16px;color:var(--muted);background:var(--paper);text-align:center;font-size:14px;border:1px solid var(--line)}.image-pending span{font-weight:600}.card h3{font-size:18px;line-height:1.35;margin-bottom:8px}.card h3 a{text-decoration:none}.card p{font-size:14px;margin-bottom:12px}.card-tag{font-size:12px;color:var(--muted);margin-bottom:8px}.card .sku{font-weight:600;margin-top:auto}.card-actions{display:grid;gap:8px}.card .btn{padding:10px 12px;min-height:44px}.process-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:24px;list-style:none;padding:0;margin:24px 0}.process-grid li{padding:24px;border:1px solid var(--line);border-radius:12px}.process-grid li>span{display:block;font-size:14px;color:var(--muted);margin-bottom:24px}.process-grid h3{font-size:22px}.evidence{padding:40px;background:var(--tint);border:1px solid var(--line);border-radius:16px}.inquiry{padding:48px;border-radius:16px}.inquiry .btn:hover{background:var(--paper);color:var(--ink);border-color:var(--paper)}.contact-line{display:flex;flex-wrap:wrap;gap:24px;margin-top:24px}.contact-line a{color:var(--action)}.catalogue-filters{display:flex;gap:16px;flex-wrap:wrap;align-items:end;background:var(--tint);border-radius:12px;padding:24px;margin-block:24px}.catalogue-filters label{flex:1;min-width:200px}.catalogue-filters .clear-filters{padding-block:12px}.product{display:grid;grid-template-columns:1fr 1fr;gap:40px;align-items:center;margin-block:32px}.product-img{width:100%;min-width:0}.product-img img{width:100%;aspect-ratio:4/3;object-fit:contain}.spec-head{margin-top:32px}.specs{border-collapse:collapse;width:100%;font-size:14px;margin-block:24px;table-layout:fixed}.specs th,.specs td{border:1px solid var(--line);padding:12px 16px;text-align:left;overflow-wrap:anywhere}.specs th{background:var(--tint);width:35%}.unconfirmed{color:var(--muted)}.note,.cert-grid>div,.trust>div{padding:24px;background:var(--tint);border:1px solid var(--line);border-radius:12px}.split,.cert-grid,.trust{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:24px;margin-block:32px}.split{grid-template-columns:1fr 1fr}.steps li{margin-bottom:16px}#quote-form{max-width:800px;margin-top:24px}#quote-form>p{max-width:none}#quote-form button{min-width:180px}.contact-box{padding:24px;border:1px solid var(--line);border-radius:12px}.cats{margin-top:24px}.cat-card{border:1px solid var(--line);border-radius:12px;padding:24px;text-decoration:none}.cat-img{display:block}.cat-body{padding-top:16px}.cat-card .count{font-size:14px}.cat-card .arrow{float:right}
@media(min-width:700px){.video-section{display:grid}}
@media(max-width:1199px){.header-in{gap:12px}.logo{flex-basis:205px}.logo img{width:205px}.nav-menu nav{gap:12px}.header-search{flex-basis:164px}.header-search input{width:100px}.header-search button{font-size:12px}.header-in>.btn{padding:12px}.grid{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media(max-width:1099px){h1{font-size:36px}h2{font-size:28px}.studio-hero h1{font-size:44px}.home>section+section{margin-top:56px}.grid,.category-grid{gap:16px}.featured{grid-template-columns:repeat(2,minmax(0,1fr))}.header-search{flex:1}.nav-menu{flex:0 0 auto}.nav-menu>summary{display:block;min-height:44px;padding:10px;cursor:pointer;font-size:14px}.nav-menu:not([open])>nav{display:none}.nav-menu nav{position:absolute;left:24px;right:24px;top:80px;display:flex;align-items:stretch;flex-direction:column;padding:24px;background:var(--ink);border:1px solid var(--action);z-index:30;border-radius:12px}.products-menu>div{position:static}.header-search input{width:100%}.footer-in{grid-template-columns:1fr 1fr}}
@media(max-width:899px){.studio-hero{grid-template-columns:1fr;padding-block:24px}.studio-hero figure{max-width:560px;margin:auto;width:100%}.grid{grid-template-columns:repeat(2,minmax(0,1fr))}.product{gap:24px}.split{grid-template-columns:1fr}}
@media(max-width:699px){.wrap{padding-inline:16px}main{padding-top:24px;padding-bottom:56px}h1{font-size:30px}h2{font-size:26px}h3{font-size:20px}.lede{font-size:17px}.header-in{flex-wrap:wrap;gap:8px;padding-block:8px}.logo{flex:1}.logo img{width:172px}.header-in>.quote{font-size:12px;padding:10px;order:2}.nav-menu{order:1}.header-search{order:3;flex:0 0 100%}.header-search input{height:44px;min-height:44px}.header-search button{min-width:64px}.nav-menu nav{top:72px;left:16px;right:16px}.home>section+section{margin-top:40px}.studio-hero{gap:16px;padding-top:16px;padding-bottom:0}.studio-hero h1{font-size:36px}.studio-hero .eyebrow{margin-bottom:16px}.studio-hero .lede{font-size:17px}.studio-hero .actions{gap:8px;margin-block:16px}.studio-hero .btn{padding:12px}.studio-hero figure{max-width:280px}.studio-hero figure img{max-height:200px}.studio-hero figcaption{padding:8px;font-size:12px}.section-heading{align-items:start;flex-direction:column;gap:12px}.category-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}.category-card{padding:20px;gap:8px}.category-card h3{font-size:20px}.category-card .eyebrow{font-size:10px}.workspace-search{padding:16px}.workspace-search>div{flex-wrap:wrap}.workspace-search input{flex-basis:100%}.video-section{grid-template-columns:120px 1fr;gap:16px;padding:16px}.video-poster{padding:12px;font-size:12px;gap:12px}.video-poster strong{font-size:18px}.video-section h3{font-size:18px}.video-section p,.video-section a{font-size:14px}.grid,.featured{grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}.card{padding:12px}.card-img{margin-bottom:12px}.card .btn{font-size:12px;padding:10px 8px}.card h3{font-size:18px}.card p{font-size:14px}.image-pending{font-size:12px;padding:8px}.process-grid,.cert-grid,.trust{grid-template-columns:1fr;gap:16px}.process-grid li{padding:24px}.process-grid li>span{margin-bottom:12px}.evidence,.inquiry{padding:24px}.contact-line{flex-direction:column;gap:12px;font-size:14px}.product{grid-template-columns:1fr;gap:24px}.specs th,.specs td{padding:12px}.footer-in{grid-template-columns:1fr;gap:32px}.footer-base{flex-direction:column;gap:12px}.site-footer{padding-bottom:160px}.help{bottom:148px;right:16px;font-size:12px;min-height:44px}.bottom-nav{position:fixed;bottom:0;left:0;right:0;display:grid;grid-template-columns:repeat(5,1fr);gap:4px;padding:8px 8px calc(8px + env(safe-area-inset-bottom));background:var(--ink);border-top:1px solid var(--line);z-index:25;color:var(--paper)}.bottom-nav a{display:grid;place-items:center;font-size:13px;font-weight:600;min-height:44px;text-decoration:none;border-radius:8px}.bottom-nav .quote{background:#7CCDEB;color:var(--ink);font-weight:700}.bottom-nav a[aria-current]{text-decoration:underline}.catalogue-filters{padding:16px;gap:12px}.catalogue-filters label{flex-basis:100%}.specs{font-size:14px}}
@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}*{transition:none!important}}

.language-switch{display:flex;justify-content:flex-end;align-items:center;gap:8px;padding-block:4px 12px}.language-switch a{display:inline-flex;align-items:center;justify-content:center;min-height:32px;text-decoration:none;font-size:13px;font-weight:500}.language-switch a:hover,.language-switch a[aria-current]{text-decoration:underline;text-underline-offset:4px}.header-tools{display:flex;align-items:center;gap:12px;flex:0 1 auto;min-width:0}.header-tools>.language-switch{flex:0 0 auto;gap:8px;padding:0;margin:0}.header-tools>.language-switch a{padding:0;background:transparent;border:0;border-radius:0;min-width:0;color:inherit}.header-tools>.header-search{order:0;flex:0 1 200px;min-width:0}.header-tools .header-search input{width:100%;min-width:0}.header-in{gap:12px}html[lang="zh"] h1{line-height:1.25}
@media(max-width:699px){.header-in>.header-tools{order:3;flex:0 0 100%}.header-tools>.header-search{flex:1 1 0}.header-tools>.language-switch{margin-left:auto}.header-in>.logo{min-width:0;flex:1 1 80px}.header-in>.logo img{width:172px;max-width:100%}.header-in>.nav-menu>summary{padding-inline:4px}.header-in>.quote{padding-inline:8px}.header-in{gap:8px}}

.factory-section{display:grid;grid-template-columns:minmax(200px,.7fr) minmax(0,1.3fr);gap:12px 32px;align-items:center}.factory-section .section-heading{grid-column:1;grid-row:1;margin:0;align-self:end}.factory-section .eyebrow{margin-bottom:8px}.factory-gallery{display:grid;grid-column:2;grid-row:1 / span 2;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;width:100%;max-width:640px;justify-self:end}.factory-gallery figure{margin:0;overflow:hidden;border:1px solid var(--line);border-radius:12px;background:var(--paper)}.factory-gallery img{display:block;width:100%;height:auto;aspect-ratio:3/2;object-fit:contain}.factory-gallery figcaption{margin:0;padding:10px 12px;color:var(--ink);font-size:14px;line-height:1.4;font-weight:600}.factory-disclosure{grid-column:1;grid-row:2;align-self:start;margin:0;max-width:32ch}.factory-details{margin-top:48px}.factory-dispatch-photo{max-width:720px;margin:16px 0;border:1px solid var(--line);border-radius:12px;overflow:hidden}.factory-dispatch-photo img{display:block;width:100%;height:auto}.factory-dispatch-photo figcaption{margin:0;padding:12px 16px;color:var(--ink);font-size:14px}
@media(max-width:699px){.factory-section{display:block}.factory-section .section-heading{display:none}.factory-gallery{max-width:none;gap:12px}.factory-gallery figcaption{padding:8px 10px;font-size:12px;line-height:1.4}.factory-disclosure{margin:8px 0 0;max-width:none;font-size:12px;line-height:1.5}}

.help-widget>.help{list-style:none;cursor:pointer}.help-widget>.help::-webkit-details-marker{display:none}.help-widget>.help::marker{content:""}.help-widget:not([open])>.help-panel{display:none}.help-panel{position:fixed;right:24px;bottom:156px;z-index:40;display:grid;gap:8px;width:288px;max-width:calc(100vw - 32px);padding:16px;border:1px solid var(--line);border-radius:12px;background:var(--paper);color:var(--ink);box-shadow:0 12px 32px rgba(0,0,0,.16)}.help-panel>strong{font-size:16px;line-height:1.4}.help-option{display:flex;flex-direction:column;justify-content:center;align-items:flex-start;min-height:44px;padding:10px 12px;border:1px solid var(--line);border-radius:8px;background:var(--paper);color:var(--ink);text-decoration:none;font-size:14px;font-weight:600;line-height:1.4}.help-option:hover{background:var(--tint);text-decoration:none}.help-option small{font-size:12px;font-weight:400;word-break:break-all}
@media(max-width:699px){.help-panel{right:16px;bottom:204px}}

@media(max-width:699px){main.home>.home-discovery{display:contents}.home-discovery>:not(#videos){display:none}.home-discovery>#videos{display:none}.home-discovery>#videos:target{display:grid}.home-certification{display:none}.home-featured>.eyebrow,.home-featured>.section-sub,.home-process>.eyebrow,main.home>.inquiry>.eyebrow{display:none}.home-featured .card .sku,.home-featured .card .fine,.home-featured .card .confirmed-spec,.home-featured .card-actions a[href*="get-quote.html?model="]{display:none}.home-featured .card h3{font-size:18px}.home-featured .card p{font-size:13px;line-height:1.5}.home-featured .card-tag{font-size:11px}.home-process .process-grid{gap:0}.home-process .process-grid li{display:grid;grid-template-columns:28px minmax(0,1fr);gap:4px 12px;padding:14px 0;border:0;border-top:1px solid var(--line);border-radius:0}.home-process .process-grid li>span{grid-column:1;grid-row:1 / span 2;margin:0;font-size:16px;line-height:1.4}.home-process .process-grid h3{grid-column:2;margin:0;font-size:17px;line-height:1.4}.home-process .process-grid p{grid-column:2;margin:0;font-size:14px;line-height:1.5}main.home>.inquiry h2{font-size:26px}main.home>.inquiry p{font-size:15px}.home~.site-footer{padding-top:32px}.home~.site-footer .footer-in{gap:16px}.home~.site-footer .footer-in>div:not(:first-child),.home~.site-footer .footer-in>div:first-child>p{display:none}.home~.site-footer .footer-logo{width:180px}.home~.site-footer .footer-base{padding-block:16px}}

.product-video{display:block;width:100%;max-width:300px;height:auto;aspect-ratio:9/16;object-fit:contain;background:var(--ink);border-radius:8px}
@media(max-width:699px){.home-discovery>#videos:target{grid-template-columns:minmax(0,1fr)}.product-video{margin-inline:auto}}
/* 2026-11-06 fix 1: Videos is video-only. The P90-1 video spans the full width of the section (up to 82vh tall); the side text that duplicated homepage copy is removed from index.html, so nothing else is shown here. */
.video-section{display:block;margin-top:32px;padding:0;border:0;border-radius:12px;overflow:hidden;background:#000}
.video-section .product-video{display:block;width:100%;max-width:none;height:auto;max-height:82vh;aspect-ratio:auto;object-fit:contain;background:#000;border-radius:0;margin-inline:0}
@media(max-width:699px){.video-section{display:block;padding:0}.video-section .product-video{max-height:78vh}}
/* 2026-11-06 fix 2: one uniform treatment for every product photograph. All product images already sit in a 4:3 frame (aspect-ratio:4/3, object-fit:contain, white background); this adds the same saturation, contrast and brightness correction to detail photos, cards and the homepage hero photo, including the 17 restored catalogue photos. */
.product-img img,.card-img img,.studio-hero figure img{filter:saturate(1.08) contrast(1.05) brightness(1.01);background:#fff}
/* 2026-11-06 fix 3: keep the header search usable now the nav has six items. The wider nav squeezed the search form (flex:0 1 220px) and collapsed its input; fix the form width and free space by tightening the logo, header gap and nav gap at wide widths. */
@media(min-width:1200px){.header-in{gap:16px}.logo{flex-basis:240px}.logo img{width:240px}.nav-menu nav{gap:12px}.header-search{flex:0 0 240px}.header-search input{flex:1;min-width:0;width:auto}}
@media(min-width:1440px){.header-tools>.header-search{flex-basis:280px}}
/* 2026-11-06 fix 4: homepage factory video. The P90-1 video on the homepage sits in .hp-video, not .video-section, so .product-video capped it at 300px wide. Same full-width, up-to-82vh treatment as fix 1. */
/* 2026-11-06 header/video fix: factory video is 16:9 (854x480). Override the 9:16 aspect-ratio from .product-video so the player is 16:9 with no black bars. */
.hp-video .product-video{max-width:none;max-height:82vh;aspect-ratio:16/9;width:100%}
/* 2026-11-07: product-page video (RP-C14 W61, 16:9). Scoped to main > .hp-video so only product-page videos are affected; the homepage factory video lives in .hp-media-grid and is styled separately. */
main>.hp-video>.product-video{max-width:none;max-height:82vh;aspect-ratio:16/9;width:100%}

/* Variant gallery — one family page, one image per variant; hover (or keyboard focus / tap) shows that variant's specifications. */
.variant-gallery-wrap{margin-block:var(--space-5) var(--space-4)}
.variant-gallery-wrap>h2{margin-bottom:8px}
.variant-gallery{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:24px}
.variant{position:relative;border:1px solid var(--line);border-radius:12px;overflow:hidden;background:var(--paper);margin:0}
.variant img{display:block;width:100%;aspect-ratio:4/3;object-fit:contain}
.variant figcaption{padding:12px 16px;font-weight:700;font-size:14px;color:var(--ink)}
.variant-specs{position:absolute;left:0;right:0;bottom:0;background:rgba(0,0,0,.88);color:#fff;padding:16px;font-size:14px;line-height:1.5;opacity:0;transform:translateY(8px);transition:opacity .15s ease,transform .15s ease;pointer-events:none}
.variant-specs strong{display:block;margin-bottom:4px}
.variant-specs ul{margin:0;padding-left:18px}
.variant:hover .variant-specs,.variant:focus .variant-specs,.variant:focus-within .variant-specs,.variant:active .variant-specs{opacity:1;transform:none}

/* ---- Five-step loop (home-process) : one closed loop, icons carry the meaning ---- */
.steps-loop{position:relative;max-width:880px;height:300px;margin:104px auto 88px}
.steps-loop-path{position:absolute;inset:0;width:100%;height:100%}
.steps-loop-path .loop-solid{fill:none;stroke:var(--brand-ice-cyan);stroke-width:2;vector-effect:non-scaling-stroke}
.steps-loop-path .loop-return{fill:none;stroke:var(--brand-petrol);stroke-width:2;stroke-dasharray:7 6;vector-effect:non-scaling-stroke}
.steps-loop-nodes{position:absolute;inset:0;list-style:none;margin:0;padding:0}
.loop-node{position:absolute;left:var(--nx);top:var(--ny);transform:translate(-50%,-50%);display:flex;flex-direction:column;align-items:center;margin:0;padding:0}
.loop-disc{width:84px;height:84px;border:1.5px solid var(--brand-petrol);border-radius:50%;background:var(--brand-white);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;color:var(--brand-petrol)}
.loop-disc svg{width:30px;height:30px}
.loop-num{font-size:11px;font-weight:700;letter-spacing:.12em;line-height:1}
.loop-label{display:block;max-width:170px;margin-top:10px;font-size:15px;font-weight:600;line-height:1.45;text-align:center;color:var(--brand-petrol)}
.loop-node.hot .loop-disc{border-color:var(--brand-coral);color:var(--brand-coral)}
.loop-arrow{position:absolute;width:13px;height:13px;border-top:2px solid var(--brand-petrol);border-right:2px solid var(--brand-petrol);transform:translate(-50%,-50%) rotate(45deg)}
.loop-arrow.a1{left:36.5%;top:0}
.loop-arrow.a2{left:63.5%;top:0}
.loop-arrow.a3{left:100%;top:50%}
.loop-arrow.a4{left:50%;top:100%}
.loop-arrow.a5{left:0;top:50%}
.loop-arrow.down{transform:translate(-50%,-50%) rotate(135deg)}
.loop-arrow.left{transform:translate(-50%,-50%) rotate(225deg)}
.loop-arrow.up{transform:translate(-50%,-50%) rotate(315deg)}
.loop-return-label{position:absolute;left:10%;top:50%;transform:translate(-50%,-50%);background:var(--brand-white);border:1px solid var(--line);border-radius:999px;padding:4px 12px;font-size:12px;font-weight:600;line-height:1.4;color:var(--brand-petrol);white-space:nowrap}
.loop-centre{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:34%;height:auto;pointer-events:none}
.loop-centre .lc-main{fill:none;stroke:var(--brand-petrol);stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.loop-centre .lc-water{fill:none;stroke:var(--brand-ice-cyan);stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}
@media(max-width:699px){
.steps-loop{height:230px;margin:112px auto 76px}
.loop-arrow.a3{left:98%}
.loop-arrow.a5{left:2%}
.loop-return-label{left:13%}
.loop-disc{width:62px;height:62px;gap:2px}
.loop-disc svg{width:22px;height:22px}
.loop-num{font-size:10px}
.loop-label{max-width:96px;margin-top:8px;font-size:13px;line-height:1.4}
.loop-arrow{width:11px;height:11px}
.loop-return-label{font-size:11px;padding:3px 10px}
.loop-centre{width:40%}
}


/* ---- Homepage airier spacing (2026-11-06): section gaps ~1.5x of the intended 80px, more card air. Scoped with :has(.studio-hero) so only the two homepages are affected; the old .home rules in this file never matched (no .home ancestor exists) and are left alone. Loop internals untouched. ---- */
main:has(>section.studio-hero)>section+section{margin-top:120px}
main:has(>section.studio-hero) .section-heading{margin-bottom:36px}
main:has(>section.studio-hero) .factory-section .section-heading{margin:0}
main:has(>section.studio-hero) .section>h2{margin-bottom:28px}
main:has(>section.studio-hero) .section-sub{margin-bottom:28px}
main:has(>section.studio-hero) .studio-hero{padding-block:44px 40px}
main:has(>section.studio-hero)>section.studio-hero+section{margin-top:64px}
main:has(>section.studio-hero) .grid,main:has(>section.studio-hero) .category-grid{gap:32px}
main:has(>section.studio-hero) .featured{margin-top:32px}
main:has(>section.studio-hero) .card{padding:24px}
main:has(>section.studio-hero) .category-card{padding:32px;gap:16px}
main:has(>section.studio-hero) .cert-grid>div,main:has(>section.studio-hero) .trust>div{padding:32px}
@media(max-width:1099px){main:has(>section.studio-hero)>section+section{margin-top:84px}}
@media(max-width:899px){main:has(>section.studio-hero) .studio-hero{padding-block:36px}}
@media(max-width:699px){main:has(>section.studio-hero)>section+section{margin-top:60px}main:has(>section.studio-hero) .studio-hero{padding-top:24px;padding-bottom:16px}main:has(>section.studio-hero) .grid,main:has(>section.studio-hero) .featured,main:has(>section.studio-hero) .category-grid{gap:24px}main:has(>section.studio-hero) .card{padding:16px}main:has(>section.studio-hero) .category-card{padding:24px;gap:12px}main:has(>section.studio-hero) .cert-grid>div,main:has(>section.studio-hero) .trust>div{padding:24px}}

/* 2026-11-06 polish round (local only, not pushed):
   6. Sticky header — the live site never had position:sticky in components.css
      (only the unused legacy styles.css did); header scrolled away. Anchor
      offset raised so sticky header no longer covers #anchors. */
.site-header{position:sticky;top:0;z-index:30}
@media(max-width:699px){html{scroll-padding-top:132px}}
/* 2. Featured cards — pin the action row to the card foot so buttons sit level
   even when the spec line wraps (RP-C04 wraps to 2 lines, others 1). The
   spec line is normalised to two lines of height on desktop. */
.home-featured .card-actions,.featured .card-actions{margin-top:auto}
.home-featured .card .confirmed-spec{min-height:calc(2 * 1.65em)}
/* 1. Container-loading photo — full width. On desktop the 3:2 photo is cropped
   to a 21:9 band so it does not dominate the page; on mobile (<=600px) the
   original uncropped image is kept exactly as before. */
@media(min-width:601px){.hp-fig-wide img{aspect-ratio:21/9;object-fit:cover}}
/* 7. Mobile bottom nav — five items now (Videos removed); slightly tighter so
   all five labels fit at 390px. Get a Quote keeps its highlighted style. */
@media(max-width:699px){.bottom-nav{grid-template-columns:repeat(5,1fr);gap:2px;padding:6px 6px calc(6px + env(safe-area-inset-bottom))}.bottom-nav a{font-size:13px;font-weight:600}}

/* 2026-11-07 round 2: certification tiles — compact, code only, no long copy. */
.cert-tiles{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:12px;margin-block:20px 16px}
.cert-tile{border:1px solid var(--line);border-radius:10px;background:var(--paper);padding:14px 6px;text-align:center;font-size:15px;font-weight:700;line-height:1.3;overflow-wrap:anywhere}
@media(max-width:699px){.cert-tiles{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px}.cert-tile{padding:12px 4px;font-size:14px}}

/* 2026-11-07 round 2: insight horizontal cards — thumbnail left, text right, stacked. */
.guide-list{display:grid;gap:20px}
.guide-card{display:grid;grid-template-columns:200px minmax(0,1fr);gap:20px;border:1px solid var(--line);border-radius:12px;overflow:hidden;background:var(--paper)}
.guide-card>img{display:block;width:100%;height:100%;object-fit:cover}
.guide-card-body{padding:20px 20px 20px 0;display:flex;flex-direction:column}
.guide-card-body h3{margin:0 0 6px;font-size:20px;line-height:1.3}
.guide-card-body p{margin:0 0 10px}
.guide-card-body p:last-child{margin-top:auto;margin-bottom:0}
.guide-card--text{grid-template-columns:minmax(0,1fr)}
.guide-card--text .guide-card-body{padding:20px 24px}
@media(max-width:699px){.guide-card{grid-template-columns:132px minmax(0,1fr);gap:12px}.guide-card--text{grid-template-columns:minmax(0,1fr)}.guide-card-body{padding:16px 16px 16px 0}.guide-card--text .guide-card-body{padding:16px 20px}.guide-card-body h3{font-size:17px}.guide-card-body p{font-size:14px}}

/* 2026-11-07 round 3: factory media 2x2 grid, cert box (Fu Min style), insights pill. */
.hp-media-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:16px;margin-block:24px}.hp-media-grid>#videos{grid-column:1/-1}
.hp-media{margin:0;min-width:0}
.hp-media video,.hp-media img{display:block;width:100%;height:auto;border-radius:12px}
.hp-media video{aspect-ratio:16/9;object-fit:cover;background:#000;max-width:none}
.hp-media img{aspect-ratio:4/3;object-fit:cover}
.hp-media .fine,.hp-media figcaption{margin:8px 0 0}
.cert-box{background:var(--tint);border:1px solid var(--line);border-radius:16px;padding:32px}
.cert-box .section-heading{margin-bottom:16px}
.pill-link{display:block;text-align:center;padding:14px 16px;border:1px solid var(--line);border-radius:12px;background:var(--tint);font-weight:700;text-decoration:none}
.pill-link:hover{text-decoration:none;border-color:var(--ink)}
@media(max-width:699px){.hp-media-grid{gap:12px;grid-template-columns:repeat(2,minmax(0,1fr))}.cert-box{padding:20px}}
.hp-keywords{text-align:center;color:var(--muted);font-size:14px;max-width:none;margin:32px 0 88px}
@media(max-width:699px){.hp-keywords{margin:24px 0 60px}}

.wa-float{position:fixed;bottom:24px;right:24px;width:56px;height:56px;border-radius:50%;background:#25d366;display:grid;place-items:center;z-index:30;box-shadow:0 4px 14px rgba(0,0,0,.25);text-decoration:none}
.wa-float svg{width:30px;height:30px;fill:#fff}
.wa-float:hover{background:#1eb856}
@media(max-width:699px){.wa-float{bottom:80px;right:16px;width:52px;height:52px}.wa-float svg{width:28px;height:28px}}

/* =====================================================================
   2026-11-07 premium polish — surpass the old site on four dimensions:
   规整度 (neatness) · 排版 (typography) · 框架 (framework) · 渐变 (gradients)
   Visual only: no content, wording or structure is changed anywhere.
   ===================================================================== */

/* ---- 排版 · self-hosted variable fonts (latin; CJK falls back to system) ---- */
@font-face{font-family:"Plus Jakarta Sans";src:url(../assets/fonts/PlusJakartaSans-Variable.woff2) format("woff2");font-weight:200 800;font-style:normal;font-display:swap}
@font-face{font-family:"Inter";src:url(../assets/fonts/Inter-Variable.woff2) format("woff2");font-weight:100 900;font-style:normal;font-display:swap}

:root{
  --font-display:"Plus Jakarta Sans","Inter",system-ui,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
  --font-body:"Inter",system-ui,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
  --shadow-card:0 1px 2px rgba(0,52,61,.05),0 10px 28px rgba(0,52,61,.07);
  --shadow-lift:0 4px 8px rgba(0,52,61,.06),0 20px 44px rgba(0,52,61,.13);
}

body{font-family:var(--font-body)}
h1,h2,h3,h4{font-family:var(--font-display);text-wrap:balance}
h1{font-size:clamp(2rem,4vw,3.5rem);line-height:1.08;letter-spacing:-.03em;font-weight:800}
h2{font-size:clamp(1.75rem,2.6vw,2.25rem);line-height:1.16;letter-spacing:-.02em;font-weight:800}
h3{font-size:1.375rem;line-height:1.3;letter-spacing:-.01em;font-weight:700}
.lede{font-size:1.125rem;line-height:1.65}

/* ---- 框架 · buttons ---- */
.btn{background:linear-gradient(180deg,#A2DDF2,#7CCDEB);border:1px solid #6ABFDE;box-shadow:0 6px 16px rgba(0,52,61,.16),inset 0 1px 0 rgba(255,255,255,.55)}
.btn:hover{background:linear-gradient(180deg,#C2F1F3,#9BE8EA);box-shadow:0 10px 24px rgba(0,52,61,.22),inset 0 1px 0 rgba(255,255,255,.6);transform:translateY(-1px)}
.btn-ghost{background:#fff;box-shadow:0 2px 8px rgba(0,52,61,.08)}

/* ---- 框架 · header ---- */
.site-header{border-top:3px solid var(--brand-ice-cyan);box-shadow:0 10px 30px rgba(0,0,0,.22)}
.nav-menu nav>a{padding:10px 14px;border-radius:8px}
.nav-menu nav>a:hover{background:rgba(140,226,228,.14);text-decoration:none}
.products-menu>summary{border-radius:8px;padding:10px 14px}
.products-menu>summary:hover{background:rgba(140,226,228,.14)}

/* ---- 框架 · footer ---- */
.site-footer{border-top:4px solid var(--brand-coral);border-image:linear-gradient(90deg,var(--brand-ice-cyan) 0%,var(--brand-coral) 50%,var(--brand-ice-cyan) 100%) 1}
.footer-in{padding:48px 20px 40px}
.footer-in h2{font-size:13px;letter-spacing:.14em;text-transform:uppercase;color:var(--brand-ice-cyan);margin:0 0 16px}

/* ---- 框架 · cards ---- */
.card{border-radius:16px;box-shadow:var(--shadow-card);transition:box-shadow .2s ease,transform .2s ease,border-color .2s ease}
.card:hover{box-shadow:var(--shadow-lift);border-color:rgba(0,52,61,.35);transform:translateY(-3px)}
.card-img{background:linear-gradient(180deg,#fff,#F1F8F9);border:1px solid rgba(212,229,231,.7)}
.cat-card{border-radius:16px;box-shadow:var(--shadow-card);transition:box-shadow .2s ease,transform .2s ease,border-color .2s ease}
.cat-card:hover{box-shadow:var(--shadow-lift);border-color:rgba(0,52,61,.35);transform:translateY(-3px)}
.guide-card{box-shadow:var(--shadow-card);transition:box-shadow .2s ease,border-color .2s ease}
.guide-card:hover{box-shadow:var(--shadow-lift);border-color:rgba(0,52,61,.35)}

/* ---- 规整度 · section rhythm + headings ---- */
.section-heading{margin-bottom:28px}
.section-heading .eyebrow::before{content:"";display:inline-block;width:22px;height:2px;background:var(--brand-coral);vertical-align:middle;margin-right:10px}
main:has(>section.studio-hero)>section+section{margin-top:96px}
main:has(>section.studio-hero) .section-heading{margin-bottom:32px}
.hp-keywords{display:flex;align-items:center;gap:16px;margin:28px auto 0;max-width:760px}
.hp-keywords::before,.hp-keywords::after{content:"";flex:1;height:1px;background:var(--line)}

/* ---- 渐变 · hero: dark petrol panel with ice glow ---- */
main:has(>section.studio-hero) .studio-hero{
  background:
    radial-gradient(900px 420px at 88% -10%,rgba(140,226,228,.32),transparent 60%),
    radial-gradient(720px 420px at -8% 108%,rgba(255,120,108,.16),transparent 55%),
    linear-gradient(135deg,#00343D 0%,#00424E 55%,#00515E 100%);
  border:1px solid rgba(140,226,228,.28);
  border-radius:24px;
  padding:64px 56px;
  box-shadow:0 24px 60px rgba(0,52,61,.28);
  gap:48px;
}
main:has(>section.studio-hero) .studio-hero h1{color:#fff;font-size:clamp(2.375rem,4.6vw,4rem);line-height:1.05}
main:has(>section.studio-hero) .studio-hero .eyebrow{color:var(--brand-ice-cyan)}
main:has(>section.studio-hero) .studio-hero .lede{color:#D7E8E8}
main:has(>section.studio-hero) .studio-hero figure{background:#fff;border-radius:18px;padding:14px;box-shadow:0 20px 44px rgba(0,0,0,.35)}
main:has(>section.studio-hero) .studio-hero figcaption{padding:12px 4px 2px;text-align:center}
main:has(>section.studio-hero) .studio-hero .btn-ghost{background:transparent;border-color:var(--brand-ice-cyan);color:#fff!important}
main:has(>section.studio-hero) .studio-hero .btn-ghost:hover{background:var(--brand-ice-cyan);color:var(--brand-petrol)!important;border-color:var(--brand-ice-cyan)}
/* trust list becomes a stat row with dividers */
.studio-hero .hp-trust{margin:32px 0 0;gap:0}
.studio-hero .hp-trust li{flex:1;padding:0 18px;border-left:1px solid rgba(140,226,228,.35);color:#D7E8E8;font-size:14px;line-height:1.5}
.studio-hero .hp-trust li:first-child{padding-left:0;border-left:0}
.studio-hero .hp-trust strong{display:block;font-family:var(--font-display);font-size:18px;font-weight:800;color:var(--brand-ice-cyan);line-height:1.2}

/* ---- 框架 · scenario cards ---- */
.hp-grid-4 .hp-card{border-radius:16px;box-shadow:var(--shadow-card);transition:box-shadow .2s ease,transform .2s ease,border-color .2s ease}
.hp-grid-4 .hp-card:hover{box-shadow:var(--shadow-lift);transform:translateY(-3px);border-color:rgba(0,52,61,.35)}
.hp-grid-4 .hp-card>img{background:linear-gradient(180deg,#fff,#F1F8F9)}

/* ---- 渐变 · certification becomes a dark panel ---- */
.cert-box{
  background:
    radial-gradient(700px 260px at 85% 0%,rgba(140,226,228,.20),transparent 60%),
    linear-gradient(135deg,#00343D 0%,#00424E 60%,#00515E 100%);
  border:1px solid rgba(140,226,228,.28);
  box-shadow:0 24px 60px rgba(0,52,61,.22);
}
.cert-box h2{color:#fff}
.cert-box .eyebrow{color:var(--brand-ice-cyan)}
.cert-box .lede{color:#D7E8E8}
.cert-box .fine{color:#B8D4D8}
.cert-box a{color:var(--brand-ice-cyan)}
.cert-tile{background:linear-gradient(180deg,#fff,#F5FAFA);box-shadow:0 6px 16px rgba(0,0,0,.18)}

/* ---- 渐变 · closing CTA ---- */
main .hp-cta{
  background:
    radial-gradient(800px 300px at 50% -20%,rgba(140,226,228,.28),transparent 60%),
    linear-gradient(135deg,#07333B 0%,#00424E 60%,#00515E 100%);
  border:1px solid rgba(140,226,228,.28);
  border-radius:24px;
  box-shadow:0 24px 60px rgba(0,52,61,.25);
}

/* ---- 框架 · poster banners + factory media ---- */
.poster-banner{border-radius:20px;box-shadow:0 18px 44px rgba(0,52,61,.18)}
main:has(>section.studio-hero) .poster-banner{margin-bottom:0}
.hp-media img,.hp-media video{box-shadow:0 10px 28px rgba(0,52,61,.12)}

/* ---- 框架 · five-step loop ---- */
.home-process .steps-loop{margin:72px auto 64px}
.loop-disc{box-shadow:0 8px 20px rgba(0,52,61,.12)}
.loop-node.hot .loop-disc{background:linear-gradient(180deg,#FFF5F4,#FFE9E6)}

/* ---- 框架 · forms + spec tables ---- */
form fieldset{border-radius:16px;box-shadow:var(--shadow-card)}
form legend{font-family:var(--font-display);font-weight:800;font-size:18px}
table.specs{border-radius:16px}
table.specs th{background:linear-gradient(180deg,#E9F8F8,#DFF3F4)}

/* ---- responsive ---- */
@media(max-width:1099px){
  main:has(>section.studio-hero)>section+section{margin-top:72px}
  main:has(>section.studio-hero) .studio-hero{padding:48px 36px}
}
@media(max-width:699px){
  main:has(>section.studio-hero)>section+section{margin-top:64px}
  main:has(>section.studio-hero) .studio-hero{padding:36px 22px;gap:28px;border-radius:20px}
  main:has(>section.studio-hero) .studio-hero h1{font-size:2.375rem}
  .studio-hero .hp-trust{display:grid;gap:0}
  .studio-hero .hp-trust li{padding:12px 0;border-left:0;border-top:1px solid rgba(140,226,228,.25)}
  .studio-hero .hp-trust li:first-child{padding-top:0;border-top:0}
  .studio-hero .hp-trust strong{font-size:17px}
  .hp-keywords{display:block;text-align:center}
  .home-process .steps-loop{margin:64px auto 48px}
  .cert-box{padding:24px 20px}
  .footer-in h2{margin:0 0 12px}
}
/* ================================================================
   2026-11-07 desktop rebuild
   Desktop (min-width:1100px) structural fixes + hero collage
   (min-width:1440px) + mobile detail fixes (max-width:699px).
   Desktop and mobile are independent layouts; no rule crosses its
   breakpoint. Content and wording are untouched; palette unchanged.
   ================================================================ */

/* ---------- CTA: one centred axis (homepage only, all widths) ---------- */
main .hp-cta{display:flex;flex-direction:column;align-items:center;text-align:center}
main .hp-cta p{max-width:none;margin-bottom:16px}
main .hp-cta p:last-child{margin-bottom:0}
main .hp-cta h2{margin-bottom:12px}
main .hp-cta .cta-dot{color:#8fb9bd}

/* ---------- search toggle button (JS-injected; hidden on desktop) ---------- */
.search-toggle{display:none}

/* ---------- hero collage images: hidden below 1440px (mobile keeps the RP-C11 figure) ---------- */
.hero-media{display:none}

/* ---------- step 05 uses the same petrol disc as the other steps (all widths) ---------- */
.loop-node.hot .loop-disc{background:var(--brand-white);border-color:var(--brand-petrol);color:var(--brand-petrol)}

/* ---------- keywords row lives inside the hero text column (all widths) ---------- */
.hero-copy .hp-keywords{display:block;text-align:left;color:var(--brand-ice-cyan);font-size:14px;margin:20px 0 0;max-width:none}
.hero-copy .hp-keywords::before,
.hero-copy .hp-keywords::after{display:none}

/* ================= DESKTOP ================= */
@media(min-width:1100px){
  /* --- tighter section rhythm (audit #9) --- */
  main:has(>section.studio-hero)>section+section{margin-top:64px}
  main:has(>section.studio-hero) .home-process .steps-loop{margin:56px auto 48px}
  /* --- CTA padding --- */
  main .hp-cta{padding:40px 32px 36px}
  /* --- pill links become normal buttons, left aligned (audit #3/#4) --- */
  main:has(>section.studio-hero) .pill-link{display:inline-block;width:auto;max-width:none;padding:12px 22px}
  main:has(>section.studio-hero) #guides .pill-link{margin-top:20px}
  /* --- keywords row now lives inside .hero-copy (base rule above) --- */
  /* --- banners read as banners, not fullscreen posters (fix #3) --- */
  main:has(>section.studio-hero) .poster-banner-link img{aspect-ratio:3.2/1;max-height:420px}
  /* --- factory video capped at ~half a viewport (fix #1) --- */
  main:has(>section.studio-hero) #factory .hp-media #videos video{object-fit:cover}
  /* --- scenario cards: align description + model lines (audit #7) --- */
  main:has(>section.studio-hero) .hp-grid-4 .hp-card-body h3{min-height:calc(2 * 1.3em)}
  main:has(>section.studio-hero) .hp-grid-4 .hp-card-body h3 + p{min-height:calc(3 * 1.65em)}
  main:has(>section.studio-hero) .hp-grid-4 .hp-card-body>p:nth-of-type(3){min-height:calc(2 * 1.65em)}
  main:has(>section.studio-hero) .hp-grid-4 .hp-card-body p a{white-space:nowrap}
  /* --- featured cards: align MOQ rows (audit #8) --- */
  main:has(>section.studio-hero) .home-featured .card h3 + p{min-height:calc(2 * 1.65em)}
  /* --- OEM vs ODM: white boxed cards with breathing room (audit #10) --- */
  main:has(>section.studio-hero) .hp-grid-2 .hp-path{background:var(--paper);border:1px solid var(--line);border-top:2px solid var(--brand-petrol);border-radius:16px;box-shadow:var(--shadow-card);padding:28px}
  /* --- five-step loop: tighter orbit, centred link (audit #5; step-05 colour is a base rule above) --- */
  main:has(>section.studio-hero) .home-process .steps-loop{max-width:720px;height:300px}
  main:has(>section.studio-hero) .loop-centre{width:40%;top:52%}
  main:has(>section.studio-hero) .loop-return-label{font-size:14px;padding:6px 14px}
  main:has(>section.studio-hero) .loop-arrow.a1{left:34%}
  main:has(>section.studio-hero) .loop-arrow.a2{left:66%}
  main:has(>section.studio-hero) .loop-arrow.a3{left:89%}
  main:has(>section.studio-hero) .loop-arrow.a5{left:11%}
  main:has(>section.studio-hero) .home-process .steps-loop + p,
  main:has(>section.studio-hero) .home-process .steps-loop + a{display:block;text-align:center;margin-top:40px;max-width:none}
  /* --- insights cards --- */
  main:has(>section.studio-hero) .hp-guides{margin-top:28px}
  /* --- certification: keep the dark panel, trim its empty bottom --- */
  main:has(>section.studio-hero) .cert-box{padding-bottom:32px}
}

/* ---------- desktop hero collage (min-width:1440px only) ---------- */
@media(min-width:1440px){
  main:has(>section.studio-hero) .studio-hero{display:grid;grid-template-columns:1.55fr 1fr;grid-template-rows:repeat(2,minmax(0,1fr));gap:14px;align-items:stretch;min-height:600px;padding:0;background:none;border:0;box-shadow:none;border-radius:0}
  main:has(>section.studio-hero) .hero-media{display:contents}
  main:has(>section.studio-hero) .hero-img{display:block;width:100%;height:100%;object-fit:cover;border-radius:18px}
  main:has(>section.studio-hero) .hero-img-main{grid-column:1;grid-row:1/-1;object-position:50% 50%}
  main:has(>section.studio-hero) .hero-img-top{grid-column:2;grid-row:1;object-position:50% 16%}
  main:has(>section.studio-hero) .hero-img-bottom{grid-column:2;grid-row:2;object-position:62% 50%}
  main:has(>section.studio-hero) .studio-hero .hero-copy{grid-column:1;grid-row:1/-1;position:relative;z-index:2;display:flex;flex-direction:column;justify-content:center;padding:48px;border-radius:18px 0 0 18px;background:linear-gradient(90deg,rgba(0,22,26,.82) 0%,rgba(0,22,26,.6) 45%,rgba(0,22,26,.28) 70%,rgba(0,22,26,.08) 90%,rgba(0,22,26,0) 100%)}
  main:has(>section.studio-hero) .studio-hero .hero-copy h1{font-size:2.5rem;line-height:1.12;max-width:600px}
  main:has(>section.studio-hero) .studio-hero figure{display:none}
}

/* ================= MOBILE (max-width:699px) ================= */
@media(max-width:699px){
  /* --- 1. header: single row <=64px; logo + hamburger + quote; search is an icon; EN/ZH into the menu --- */
  .header-in{min-height:56px;flex-wrap:nowrap;gap:8px;padding-block:6px}
  .logo{flex:1 1 auto;min-width:0}
  .logo img{width:150px}
  .nav-menu{order:1}
  .search-toggle{order:2;display:grid;place-items:center;width:44px;height:44px;flex:0 0 auto;background:transparent;border:1px solid var(--action);border-radius:8px;color:var(--paper)}
  .search-toggle svg{width:20px;height:20px}
  .header-in>.quote{order:3;font-size:12px;padding:10px 12px;min-height:44px;white-space:nowrap}
  .header-tools{display:contents}
  .header-tools .header-search{display:none}
  .header-tools .header-search.open{display:flex;position:absolute;top:100%;left:0;right:0;padding:12px 16px;background:var(--ink);border-top:1px solid var(--line);z-index:45}
  .header-tools .header-search.open input{flex:1}
  .header-tools .language-switch{display:none}
  .nav-menu .language-switch{display:flex;gap:8px;padding:12px 0 4px;border-top:1px solid var(--line);margin-top:8px}
  /* --- 2. hero H1: compact, shorter block --- */
  main:has(>section.studio-hero) .studio-hero h1{font-size:26px;line-height:1.2;margin-bottom:10px}
  main:has(>section.studio-hero) .studio-hero .eyebrow{margin-bottom:10px}
  main:has(>section.studio-hero) .studio-hero .lede{font-size:15px;line-height:1.5;margin-bottom:12px}
  main:has(>section.studio-hero) .studio-hero .hp-keywords{font-size:13px;line-height:1.5}
  /* --- 3. hero trust: compact, 12px, tighter --- */
  .studio-hero .hp-trust{margin-top:12px}
  .studio-hero .hp-trust li{padding:2px 0;border-top:0;font-size:12px;line-height:1.4}
  .studio-hero .hp-trust li:first-child{padding-top:2px}
  .studio-hero .hp-trust strong{display:inline;font-size:12px}
  /* --- 4. hero buttons: side by side, 44px, smaller text (shorter block) --- */
  main:has(>section.studio-hero) .studio-hero p:has(>.btn){display:grid;grid-template-columns:1fr 1fr;gap:10px}
  main:has(>section.studio-hero) .studio-hero p:has(>.btn) .btn{width:100%;min-height:44px;font-size:13px;padding:10px 8px}
  /* --- 5. hero figure: hidden on mobile (no link, not meaningful; shortens the block) --- */
  main:has(>section.studio-hero) .studio-hero figure{display:none}
  main:has(>section.studio-hero) .studio-hero{padding-top:16px;padding-bottom:16px}
  /* --- 6. scenario cards: 2x2 square blocks, smaller text --- */
  main:has(>section.studio-hero) .hp-grid-4{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
  main:has(>section.studio-hero) .hp-grid-4 .hp-card>img{height:auto;aspect-ratio:4/3;padding:10px}
  main:has(>section.studio-hero) .hp-grid-4 .hp-card-body{padding:12px}
  main:has(>section.studio-hero) .hp-grid-4 .hp-card-body .eyebrow{font-size:10px}
  main:has(>section.studio-hero) .hp-grid-4 .hp-card-body h3{font-size:14px;line-height:1.3;min-height:calc(2 * 1.3em)}
  main:has(>section.studio-hero) .hp-grid-4 .hp-card-body>p:nth-of-type(2),
  main:has(>section.studio-hero) .hp-grid-4 .hp-card-body>p:nth-of-type(3){display:none}
  main:has(>section.studio-hero) .hp-grid-4 .hp-card-body>p:last-child{margin-top:8px;font-size:13px}
  main:has(>section.studio-hero) .hp-grid-4 .hp-card-body p a{white-space:normal}
  /* --- 7. featured heading: title 24px, unhide subtitle, View all as 44px tap target below subtitle --- */
  main:has(>section.studio-hero) .home-featured h2{font-size:24px}
  main:has(>section.studio-hero) .home-featured{display:flex;flex-direction:column}
  main:has(>section.studio-hero) .home-featured .section-heading{display:contents}
  main:has(>section.studio-hero) .home-featured .section-heading>div{order:1}
  main:has(>section.studio-hero) .home-featured>.section-sub{order:2;display:block;font-size:14px;margin:8px 0 0}
  main:has(>section.studio-hero) .home-featured .section-heading>a{order:3;align-self:flex-start;display:inline-flex;align-items:center;min-height:44px;margin-top:8px}
  main:has(>section.studio-hero) .home-featured .grid{order:4;margin-top:20px}
  /* --- 8+9. featured cards: 2-col compact grid, 6 cards --- */
  main:has(>section.studio-hero) .home-featured .featured{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
  main:has(>section.studio-hero) .home-featured .card{padding:12px}
  main:has(>section.studio-hero) .home-featured .card-img{margin-bottom:8px}
  main:has(>section.studio-hero) .home-featured .card-tag{font-size:11px;margin-bottom:4px}
  main:has(>section.studio-hero) .home-featured .card h3{font-size:16px;margin-bottom:4px}
  main:has(>section.studio-hero) .home-featured .card h3 + p{font-size:13px;line-height:1.5;min-height:calc(2 * 1.5em);margin-bottom:8px}
  main:has(>section.studio-hero) .home-featured .card .confirmed-spec,
  main:has(>section.studio-hero) .home-featured .card .fine{display:none}
  main:has(>section.studio-hero) .home-featured .card-actions a[href*="get-quote.html?model="]{display:none}
  main:has(>section.studio-hero) .home-featured .card .btn{min-height:44px;font-size:12px;padding:10px 6px}
  /* --- 10. RP-C14 banner: 16:10, text 18px, padding 16px, deeper gradient --- */
  main:has(>section.studio-hero) .poster-banner-link img{aspect-ratio:8/5}
  main:has(>section.studio-hero) .poster-banner-caption{font-size:18px;padding:2rem 16px 16px;background:linear-gradient(180deg,transparent 0%,rgba(0,32,38,.25) 45%,rgba(0,32,38,.88) 100%)}
  /* --- 11. OEM vs ODM: 2-col side-by-side on mobile, compact, links pinned to bottom --- */
  main:has(>section.studio-hero) .hp-grid-2{gap:12px}
  main:has(>section.studio-hero) .hp-grid-2 .hp-path{padding:14px;display:flex;flex-direction:column}
  main:has(>section.studio-hero) .hp-grid-2 .hp-path h3{font-size:17px;min-height:calc(3 * 1.3em)}
  main:has(>section.studio-hero) .hp-grid-2 .hp-path p{font-size:14px;line-height:1.55}
  main:has(>section.studio-hero) .hp-grid-2 .hp-path p:last-child{margin-top:auto;margin-bottom:0}
  main:has(>section.studio-hero) .hp-grid-2 .hp-path p:last-child a{font-size:11px;letter-spacing:-.02em;white-space:nowrap}
  /* --- 12. five-step loop -> vertical list with 32px numbered circles --- */
  main:has(>section.studio-hero) .home-process .steps-loop{max-width:none;height:auto;margin:32px 0 24px;display:flex;flex-direction:column;gap:12px}
  main:has(>section.studio-hero) .steps-loop-path,
  main:has(>section.studio-hero) .loop-centre,
  main:has(>section.studio-hero) .loop-arrow{display:none}
  main:has(>section.studio-hero) .steps-loop-nodes{position:static;display:flex;flex-direction:column;gap:12px}
  main:has(>section.studio-hero) .loop-node{position:static;transform:none;flex-direction:row;align-items:center;gap:12px}
  main:has(>section.studio-hero) .loop-disc{width:32px;height:32px;flex:0 0 auto;gap:0}
  main:has(>section.studio-hero) .loop-disc svg{display:none}
  main:has(>section.studio-hero) .loop-num{font-size:12px}
  main:has(>section.studio-hero) .loop-label{margin-top:0;font-size:16px;text-align:left;max-width:none}
  main:has(>section.studio-hero) .loop-return-label{position:static;transform:none;display:block;text-align:center;margin-top:4px;font-size:14px;padding:10px 14px}
  /* --- 14. factory photos: already 2x2; tighten caption --- */
  main:has(>section.studio-hero) .hp-media-grid .fine{font-size:13px}
  /* --- 15. cert: chips already 3-col; market link becomes a full-width button --- */
  main:has(>section.studio-hero) .cert-box p a{display:block;text-align:center;min-height:44px;padding:10px 12px;border:1px solid var(--brand-ice-cyan);border-radius:8px;text-decoration:none}
  /* --- 16. injection banner -> FAQ gap --- */
  main:has(>section.studio-hero) .poster-banner + section{margin-top:32px}
  /* --- 17. FAQ --- */
  main .hp-faq details{padding:16px 0}
  main .hp-faq summary{font-size:16px;line-height:1.4}
  main .hp-faq summary::marker{font-size:16px}
  /* --- 18. insights cards (added in HTML): tighter gap; guides -> CTA gap 48px --- */
  main:has(>section.studio-hero) .hp-guides{gap:12px}
  main:has(>section.studio-hero) #guides + section{margin-top:48px}
  /* --- 19. CTA: less bottom padding, title 26px, button full-width 48px, contact lines stacked --- */
  main .hp-cta{padding:36px 20px 32px}
  main .hp-cta h2{font-size:26px}
  main .hp-cta p:has(>.btn){width:100%}
  main .hp-cta p:has(>.btn) .btn{width:100%;min-height:48px;font-size:16px}
  main .hp-cta .cta-dot{display:none}
  main .hp-cta p:last-child a{display:block;min-height:44px;line-height:44px}
  /* --- 20. footer: lighter group titles, tighter gaps, Back to top as a button at top-right --- */
  .site-footer .footer-in{gap:24px}
  .site-footer .footer-logo img{width:180px}
  .site-footer .footer-in h2{font-size:15px;font-weight:600}
  .site-footer .footer-in a:not(.footer-logo){font-size:15px;line-height:1.6}
  .site-footer .footer-base small{font-size:13px}
  .site-footer{position:relative}
  .site-footer .footer-base a[href="#top"]{position:absolute;top:48px;right:16px;display:inline-flex;align-items:center;min-height:44px;min-width:44px;padding:0 12px;border:1px solid var(--footer-muted);border-radius:8px;text-decoration:none}
  /* --- 21. floats: only WhatsApp, 48px, above the bottom nav --- */
  .help-widget{display:none}
  .wa-float{bottom:72px;right:16px;width:48px;height:48px}
  .wa-float svg{width:26px;height:26px}
}

/* ---- 2026-11-07 mobile compact batch 2: hero AI bg, tighter gaps + headings ---- */
@media(max-width:699px){
  /* hero: AI purifier background (old-site look), dark overlay keeps white text readable */
  main:has(>section.studio-hero) .studio-hero{
    background:
      linear-gradient(180deg,rgba(0,52,61,.88) 0%,rgba(0,52,61,.60) 45%,rgba(0,52,61,.45) 100%),
      url(../assets/hero/hero-ai-purifier-mobile.webp) right bottom/cover no-repeat,
      linear-gradient(135deg,#00343D 0%,#00424E 55%,#00515E 100%);
  }
  /* section gaps: 60px -> 40px */
  main:has(>section.studio-hero)>section+section{margin-top:40px}
  /* section headings one size smaller: 26px -> 24px */
  main:has(>section.studio-hero) .section-heading h2{font-size:24px}
  /* cert: tiles are already 3-col (2 rows) on mobile — the most compact; just tighten spacing */
  main:has(>section.studio-hero) .cert-tiles{margin-block:16px 12px}
}

/* ================================================================
   2026-11-07 homepage visual-audit fixes (desktop audit, 25 items)
   Text + layout first, then images. Local only; content wording
   changes are the short, factual ones the audit asked for.
   ================================================================ */

/* --- 1. header nav: Products must not wrap (its <summary> had no nowrap) --- */
.products-menu{flex-shrink:0}
.products-menu>summary{white-space:nowrap;list-style:none}
.products-menu>summary::-webkit-details-marker{display:none}
.products-menu>summary::after{content:"▾";margin-left:6px;font-size:11px}

/* --- 3. language switcher: JS clones it into the nav menu for mobile;
   on desktop (>=1100px) the nav is always open, so the clone showed twice --- */
@media(min-width:1100px){.nav-menu .language-switch{display:none}}

/* --- 10. insights titles: balance lines, no orphan word --- */
.guide-card-body h3{text-wrap:balance}

/* --- 15. insights cards: tighter body so the card reads ~180px, not ~220px --- */
.guide-card-body{padding:16px 20px 16px 0}
@media(max-width:699px){.guide-card-body{padding:14px 14px 14px 0}}
/* --- 25. insights thumbnails are square graphics; on mobile the image
   column is 132px wide but the card is ~300px tall, so height:100% cropped
   them to a portrait strip. Cap the image to a 132px square, top-aligned. --- */
@media(max-width:699px){.guide-card>img{height:132px;align-self:start}}

/* --- 8+13. featured cards: compact spec list, one primary button + text link --- */
main:has(>section.studio-hero) .home-featured .card{padding:20px}
main:has(>section.studio-hero) .home-featured .card-img{margin-bottom:12px}
main:has(>section.studio-hero) .home-featured .card p{margin-bottom:8px}
.home-featured .card ul.confirmed-spec{margin:0 0 12px;padding-left:18px;font-size:14px;line-height:1.6;min-height:calc(2 * 1.6em);color:var(--ink)}
.home-featured .card ul.confirmed-spec li{margin:0}
.home-featured .card-actions .quote-link{display:block;text-align:center;font-size:14px;font-weight:600;line-height:1.4;padding:8px 4px;color:var(--ink);text-decoration:none}
.home-featured .card-actions .quote-link:hover{text-decoration:underline}

/* --- 14. certification: markets row fills the dark panel --- */
.cert-markets{margin:4px 0 16px;color:#D7E8E8;font-size:14px}
.cert-markets span{color:var(--brand-ice-cyan);font-weight:700;margin-right:8px}

/* --- 19. video duration badge --- */
.hp-media{position:relative}
.video-duration{position:absolute;top:10px;right:10px;z-index:2;background:rgba(0,0,0,.75);color:#fff;font-size:12px;font-weight:700;line-height:1;padding:5px 8px;border-radius:6px}

/* --- 18. factory media: video left at ~50%, 4 photos 2x2 on the right --- */
@media(min-width:700px){
  #factory .hp-media-grid>#videos{grid-column:span 2;grid-row:span 2}
  #factory .hp-media-grid #videos{display:flex;flex-direction:column}
  #factory .hp-media-grid #videos video{flex:1 1 auto;min-height:0;aspect-ratio:auto;height:auto}
  #factory .hp-media-grid #videos .fine{margin:8px 0 0}
}

/* --- 11. five-step timeline: straight horizontal track, link on its own line --- */
.steps-timeline{position:relative;display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:16px;list-style:none;margin:8px 0 0;padding:0}
.steps-timeline::before{content:"";position:absolute;left:10%;right:10%;top:42px;height:2px;background:var(--brand-ice-cyan)}
.steps-timeline li{position:relative;display:flex;flex-direction:column;align-items:center;text-align:center;margin:0;padding:0}
.step-disc{position:relative;z-index:1;width:84px;height:84px;border:1.5px solid var(--brand-petrol);border-radius:50%;background:var(--brand-white);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;color:var(--brand-petrol);box-shadow:0 8px 20px rgba(0,52,61,.12)}
.step-disc svg{width:30px;height:30px}
.step-num{font-size:11px;font-weight:700;letter-spacing:.12em;line-height:1}
.step-label{display:block;max-width:170px;margin-top:12px;font-size:15px;font-weight:600;line-height:1.45;color:var(--brand-petrol)}
.steps-timeline li:last-child .step-disc{border-color:var(--brand-coral);color:var(--brand-coral)}
.steps-note{text-align:center;color:var(--muted);font-size:14px;margin:24px 0 0}
.steps-link{text-align:center;margin:12px 0 0}
@media(max-width:699px){
  .steps-timeline{grid-template-columns:1fr;gap:0}
  .steps-timeline::before{left:27px;right:auto;top:40px;bottom:40px;width:2px;height:auto}
  .steps-timeline li{flex-direction:row;gap:16px;text-align:left;padding:12px 0}
  .step-disc{width:56px;height:56px;flex:0 0 auto;gap:2px}
  .step-disc svg{width:22px;height:22px}
  .step-num{font-size:10px}
  .step-label{margin-top:0;font-size:15px;max-width:none}
}

/* 2026-11-07: faint water-droplet texture on the top header and bottom nav bars (user request: add droplets, faded, for a premium feel). Tile is a sparse, low-alpha condensation bead pattern; nav text stays fully readable. */
.site-header{background-color:var(--ink);background-image:url("../assets/nav-droplets.png");background-repeat:repeat;background-size:240px 240px}

/* ================================================================
   2026-11-07 premium polish round 2 — surpass the old site on
   first-impression quality. Visual only: no content, copy, model
   numbers, prices or links changed. Palette unchanged.
   Targets: (A) one visual system — kill hardcoded hex + mixed
   radii left in the homepage inline <style>; (B) hero headline
   impact on wide desktop; (C) "View all" as a subtle pill;
   (D) products-page category rhythm; (E) scenario-card image
   panels read as designed panels, not pasted white boxes.
   ================================================================ */

/* ---- A. one visual system (beats the inline <style> in index.html
   via higher specificity: main .hp-card etc.) ---- */
main .hp-card{border-color:var(--line);border-radius:16px}
main .hp-path{border-color:var(--line);border-radius:16px}
main .hp-cert{border-color:var(--line);border-radius:16px}
main .hp-faq details{border-top-color:var(--line)}
main .hp-faq details:last-of-type{border-bottom-color:var(--line)}
main .poster-banner{border-radius:20px}

/* ---- E. scenario-card image panels (desktop only; mobile keeps its
   2-col square blocks from the mobile batch) ---- */
@media(min-width:700px){
  main .hp-card>img{height:240px;padding:20px;background:linear-gradient(180deg,#fff,#F1F8F9);border-bottom:1px solid var(--line)}
}

/* ---- B. hero headline impact on the wide-desktop collage ---- */
@media(min-width:1440px){
  main:has(>section.studio-hero) .studio-hero .hero-copy h1{font-size:2.875rem;max-width:640px}
}

/* ---- C. "View all" links as subtle pills (only the homepage
   Featured link uses .section-heading>a today) ---- */
main .section-heading>a{display:inline-flex;align-items:center;gap:6px;padding:10px 18px;border:1px solid var(--line);border-radius:999px;background:#fff;font-weight:700;text-decoration:none;white-space:nowrap}
main .section-heading>a:hover{border-color:var(--ink);background:var(--tint);text-decoration:none}

/* ---- D. products-page category rhythm ---- */
main:has(.catalogue-filters) .catalogue-filters{border-radius:16px;box-shadow:var(--shadow-card)}
main:has(.catalogue-filters)>h2{margin-top:64px;padding-top:32px;border-top:1px solid var(--line)}
main:has(.catalogue-filters) #result-count{font-size:14px;font-weight:700;color:var(--muted)}

/* ================================================================
   2026-11-07: OEM vs ODM — dark vs light cards so the two choices
   read as distinct at a glance (user request). OEM (first card) is
   dark petrol #00343D with white / ice-cyan text; ODM (second card)
   stays pale blue-grey. Scoped to the two homepages via
   :has(>section.studio-hero); :first-child is OEM and :last-child
   is ODM in both EN and ZH. Specificity beats the inline <style>
   .hp-path background and the desktop paper background.
   ================================================================ */
main:has(>section.studio-hero) .hp-grid-2 .hp-path:first-child{background:var(--brand-petrol);border-color:var(--brand-petrol);border-top-color:var(--brand-ice-cyan);color:var(--brand-white)}
main:has(>section.studio-hero) .hp-grid-2 .hp-path:first-child h3{color:var(--brand-white)}
main:has(>section.studio-hero) .hp-grid-2 .hp-path:first-child p{color:#D7E8E8}
main:has(>section.studio-hero) .hp-grid-2 .hp-path:first-child p a{color:var(--brand-ice-cyan)}
main:has(>section.studio-hero) .hp-grid-2 .hp-path:last-child{background:#F4F8F8}

/* 2026-11-08 mobile comparison picker (see script.js mobileCompare): hidden by
   default; JS shows it as flex on narrow screens only. */
.spec-compare-picker{display:none;gap:12px;margin:16px 0 0}
.spec-compare-picker label{flex:1;min-width:0;font-size:14px;font-weight:600}
.spec-compare-picker select{width:100%;font-size:14px;min-height:44px}
@media(max-width:699px){.specs.compare-two th,.specs.compare-two td{padding:10px 12px}}

/* ================================================================
   2026-11-09 desktop fixes (1920px audit) + P80 delisting support.
   Local only. Layout/CSS only; no copy, spec, price or factory
   changes. Appended at the end so these rules win at equal
   specificity over the rules above.
   NOTE: the live stylesheet is styles/components.css — styles.css
   is legacy (only preview/v5 links it) and was left untouched.
   ================================================================ */

/* --- (7) anchor offset: sticky header must not cover section titles --- */
html{scroll-padding-top:120px}
main section[id],main .hp-cta{scroll-margin-top:120px}

/* --- (8) footer: trim the empty dark space below the link columns --- */
.site-footer{padding-block:48px 32px}
.footer-in{padding:40px 20px 32px}
.footer-base{margin-top:20px}

/* --- (10) product cards: pin the buttons to the card bottom --- */
.card .card-actions{margin-top:auto}

/* --- (11)+(6) card images: zoom into the baked-in white margins so the
   product fills more of the 4/3 frame (image files untouched) --- */
.card-img img{transform:scale(1.18)}

/* --- (12) products page: tighter gap between filters and first heading;
   hide the header search on this page only (the in-page filter search
   is the live one wired to script.js) --- */
main:has(.catalogue-filters)>h2{margin-top:24px;padding-top:20px}
body:has(.catalogue-filters) .header-search{display:none}

/* --- (14) RP-C14 variant comparison: columns size to content,
   first column narrow, never break a word mid-token --- */
.variant-gallery-wrap table.specs{table-layout:auto}
.variant-gallery-wrap table.specs th{width:150px}
.variant-gallery-wrap table.specs th,.variant-gallery-wrap table.specs td{overflow-wrap:normal;word-break:normal;hyphens:none;font-size:13px;line-height:1.5}

/* --- (15) text-only variant cards (no photo published yet) --- */
.variant-noimg{display:grid;place-items:center;aspect-ratio:4/3;background:var(--tint);color:var(--muted);font-size:14px;font-weight:600;text-align:center;padding:16px}

/* --- (16) RP-C14 videos side by side on desktop, stacked on mobile --- */
.video-duo .hp-video .product-video{max-width:none;width:100%;aspect-ratio:16/9;max-height:82vh}
@media(min-width:700px){.video-duo{display:grid;grid-template-columns:1fr 1fr;gap:20px;align-items:start;margin-block:24px}}

/* --- (17) product hero: zoom into the baked-in white margins --- */
.product-img{overflow:hidden}
.product-img img{transform:scale(1.25)}

/* --- (2) scenario cards: taller image panel so portrait products
   (under-sink unit, freestanding dispenser, softener) render wider;
   all four cards share the same box --- */
main .hp-card>img{height:360px;padding:16px 12px;object-fit:cover;object-position:50% 50%}

/* --- (5) homepage Insights: vertical cards in 3 columns so the text
   column is no longer a wide strip with ~40% empty space --- */
@media(min-width:700px){
  main:has(>section.studio-hero) .hp-guides{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:24px}
  main:has(>section.studio-hero) .hp-guides .guide-card{display:flex;flex-direction:column}
  main:has(>section.studio-hero) .hp-guides .guide-card>img{width:100%;height:300px;object-fit:contain;background:#fff}
  main:has(>section.studio-hero) .hp-guides .guide-card-body{padding:20px}
}

/* --- (3) RP-C14 banner: taller frame, product end of the image --- */
@media(min-width:1100px){
  main:has(>section.studio-hero) .poster-banner-link img{aspect-ratio:2/1;max-height:560px;object-position:100% 50%}
  /* --- RP-C14 banner: caption becomes a left-side text block (desktop),
     filling the empty gradient; machine stays right --- */
  main:has(>section.studio-hero) .poster-banner-caption{left:0;right:auto;top:0;bottom:0;display:flex;align-items:center;max-width:42%;padding:0 24px 0 48px;background:linear-gradient(90deg,rgba(255,255,255,.55),rgba(255,255,255,0));color:#00343D;font-size:clamp(22px,2vw,30px);font-weight:700}
}

/* --- (1) hero collage (>=1440px): copy gets its own column instead of
   sitting on top of the main product photo --- */
@media(min-width:1440px){
  main:has(>section.studio-hero) .studio-hero{grid-template-columns:1.05fr 1fr 1fr;grid-template-rows:repeat(2,minmax(0,1fr))}
  /* --- hero collage: keep the product in frame once rows grow taller --- */
  main:has(>section.studio-hero) .hero-img-main{object-position:65% 50%}
  main:has(>section.studio-hero) .hero-img-bottom{object-position:60% 50%}
  main:has(>section.studio-hero) .hero-img-main{grid-column:2;grid-row:1/-1}
  main:has(>section.studio-hero) .hero-img-top{grid-column:3;grid-row:1}
  main:has(>section.studio-hero) .hero-img-bottom{grid-column:3;grid-row:2}
  main:has(>section.studio-hero) .studio-hero .hero-copy{grid-column:1;grid-row:1/-1;background:linear-gradient(135deg,#00343D 0%,#00424E 55%,#00515E 100%);border:1px solid rgba(140,226,228,.28);border-radius:18px;padding:48px 40px}
}

/* 2026-11-09: mobile-only scrolling topbar (mirrors amyskinoem .topbar pattern:
   two identical sets, translateX(-50%), ~30s, pause on hover).
   Normal flow above the sticky header: scrolls away, never overlaps the nav.
   Hidden on desktop. */
.topbar{display:none}
@media(max-width:699px){
  .topbar{display:block;background:var(--ink);color:var(--footer-muted);font-size:12px;letter-spacing:.04em;overflow:hidden}
  .topbar .wrap{display:flex;width:max-content;max-width:none;margin:0;padding:7px 0;align-items:center;animation:topbar-marquee 30s linear infinite}
  .topbar-set{display:flex;flex-shrink:0;align-items:center;gap:2px 10px;padding-right:10px}
  .topbar span{white-space:nowrap}
  .topbar i{font-style:normal;color:var(--action)}
  .topbar:hover .wrap{animation-play-state:paused}
}
@keyframes topbar-marquee{to{transform:translateX(-50%)}}
@media(max-width:699px) and (prefers-reduced-motion:reduce){
  .topbar .wrap{animation:none;width:auto;max-width:1200px;flex-wrap:wrap;justify-content:center}
  .topbar-set[aria-hidden="true"]{display:none}
  .topbar{overflow:visible}
}

/* ================================================================
   2026-11-09: slim desktop header (user: nav bar too thick on PC
   at 1920px). Desktop only (>=1200px); mobile (<=699px) untouched.
   Bar: min-height 88px -> 64px, padding-block 12px -> 6px; logo
   240px -> 190px (1600x480 source, so 57px tall; total bar ~69px).
   Search: 200px at >=1200px, 240px at >=1440px (was 280px).
   Quote button padding tightened 12px 20px -> 10px 16px.
   scroll-padding-top 120px -> 80px at >=1200px (bar 69px + ~11px).
   NOTE: the pre-existing mobile rule scroll-padding-top:132px
   (max-width:699px) is shadowed by the later 120px rule above, so
   mobile effectively uses 120px today and still does after this
   change; left untouched on purpose.
   ================================================================ */
@media(min-width:1200px){
  .header-in{min-height:64px;padding-block:6px;gap:16px}
  .logo{flex-basis:190px}
  .logo img{width:190px}
  .nav-menu nav{gap:12px}
  .header-tools>.header-search{flex-basis:200px}
  .header-in>.quote{padding:10px 16px;min-height:40px}
  html{scroll-padding-top:80px}
}
@media(min-width:1440px){
  .header-tools>.header-search{flex-basis:240px}
}

/* ================================================================
   2026-11-09: video cover gallery (videos.html / zh/videos.html)
   Static poster grid + modal player replaces the auto-playing
   vertical feed. The old inline feed styles were removed from both
   pages; the rules still needed here (.videos-topbar, .video-toast)
   live below. Page background returns to the site default (the old
   black .videos-page background is gone with the feed).
   ================================================================ */
.videos-topbar{display:flex;justify-content:space-between;align-items:center;gap:16px;padding:18px 20px;background:#0b0e11;color:#fff;border-bottom:1px solid rgba(255,255,255,.1)}
.videos-topbar h1{font-size:24px;margin:0;color:#fff}
.video-cover-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:24px;padding:32px 0}
.video-cover-card{background:var(--paper);border:1px solid var(--line);border-radius:12px;overflow:hidden;display:flex;flex-direction:column}
.video-cover-open{display:block;width:100%;padding:0;border:0;background:none;cursor:pointer;text-align:left;font:inherit}
.video-cover-thumb{position:relative;display:block;aspect-ratio:16/9;overflow:hidden;background:#000}
.video-cover-thumb img{width:100%;height:100%;object-fit:cover;display:block}
.video-cover-play{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:56px;height:56px;border-radius:50%;background:rgba(0,0,0,.55);color:#fff;display:grid;place-items:center;font-size:20px;line-height:1}
.video-cover-open:hover .video-cover-play,.video-cover-open:focus-visible .video-cover-play{background:rgba(0,0,0,.75)}
.video-cover-title{display:block;padding:12px 16px;font-size:15px;font-weight:600;line-height:1.4;color:var(--ink)}
.video-cover-meta{display:flex;align-items:center;gap:18px;padding:0 16px 14px;font-size:13px;color:var(--muted)}
.video-cover-meta button{display:inline-flex;align-items:center;gap:5px;padding:0;border:0;background:none;color:inherit;font:inherit;cursor:pointer}
.video-cover-meta svg{width:20px;height:20px}
.video-cover-meta .liked svg{fill:#ff2d55;stroke:#ff2d55}
.video-cover-views{display:inline-flex;align-items:center;gap:5px}
.video-modal{position:fixed;inset:0;z-index:80;display:flex;align-items:center;justify-content:center;padding:16px}
.video-modal[hidden]{display:none}
.video-modal-backdrop{position:absolute;inset:0;background:rgba(0,0,0,.88)}
.video-modal-box{position:relative;width:min(960px,94vw)}
.video-modal-box video{display:block;width:100%;max-height:78vh;background:#000;border-radius:12px}
.video-modal-close{position:absolute;top:10px;right:10px;z-index:2;width:38px;height:38px;border-radius:50%;border:1px solid rgba(255,255,255,.5);background:rgba(0,0,0,.6);color:#fff;font-size:22px;line-height:1;cursor:pointer}
.video-modal-bar{display:flex;justify-content:space-between;align-items:center;gap:16px;margin-top:12px;color:#fff}
.video-modal-title{font-size:15px;font-weight:600;line-height:1.4}
.video-modal-mute{flex:0 0 auto;background:rgba(255,255,255,.12);color:#fff;border:1px solid rgba(255,255,255,.4);border-radius:999px;padding:8px 16px;font-size:13px;font-weight:700;cursor:pointer;white-space:nowrap}
.video-toast{position:fixed;left:50%;bottom:110px;transform:translateX(-50%);background:rgba(0,0,0,.85);color:#fff;padding:10px 18px;border-radius:999px;font-size:14px;z-index:90;opacity:0;pointer-events:none;transition:opacity .2s}
.video-toast.show{opacity:1}
@media(max-width:699px){
  .videos-topbar{padding:14px 16px}
  .videos-topbar h1{font-size:20px}
  .video-cover-grid{grid-template-columns:repeat(2,1fr);gap:12px;padding:20px 0}
  .video-cover-title{padding:10px 12px;font-size:14px}
  .video-cover-meta{padding:0 12px 12px;gap:12px}
  .video-cover-play{width:44px;height:44px;font-size:16px}
}

/* ================================================================
   2026-11-09: sticky mobile topbar (user: topbar scrolled away on
   scroll, keep it pinned at the top). Mobile only (<=699px);
   desktop untouched (topbar hidden, header top:0).
   Topbar fixed height 30px so the sticky header can sit exactly
   beneath it at top:30px. Marquee animation untouched.
   Reduced-motion: topbar back to normal flow (height auto) so
   wrapped content is never clipped by the fixed 30px. */
@media(max-width:699px){
  .topbar{position:sticky;top:0;z-index:31;height:30px}
  .topbar .wrap{height:30px;padding:0}
  .site-header{top:30px}
}
@media(max-width:699px) and (prefers-reduced-motion:reduce){
  .topbar{position:static;height:auto}
  .topbar .wrap{height:auto;padding:7px 0}
  .site-header{top:0}
}
