/* V3 visual trial (isolated; NOT on the public preview). Loaded after style.css only on this branch.
   Codex 2026-09-24 04:47 .. 22:37: new hero / entry-card visuals, Editor's Picks text card, About single-column timeline,
   phone page-title size. Every block below exists only in the trial. */

/* hero: lighter, local contrast gradient only behind the text column (outdoor-scene-v3, 04:47) */
.hero-slide {
  background:
    linear-gradient(90deg, rgba(15,22,20,0.70) 0%, rgba(15,22,20,0.55) 34%, rgba(15,22,20,0.22) 54%, rgba(15,22,20,0) 66%),
    var(--slide-img) center/cover no-repeat;
}
.hero-media-body { justify-content: center; max-width: 56%; }
.hero-media-body h1 { text-align: left; }
.hero-media .hero-en-title, .hero-media .hero-en-lead { opacity: .86; }

/* phones: text block on top, full 16:9 image below (no text over the photo, nothing cropped or stretched) */
@media (max-width: 560px) {
  .hero-media-body { max-width: 100%; }
  .hero-media { aspect-ratio: auto; min-height: 0; display: flex; flex-direction: column; background: #1c2a26; }
  .hero-media::after { content: ""; display: block; width: 100%; aspect-ratio: 16 / 9; }
  .hero-slide { inset: auto 0 0 0; aspect-ratio: 16 / 9; height: auto; background: var(--slide-img) center/cover no-repeat; }
  .hero-media-body { padding: 18px 18px 16px; }
  .hero-dots { top: auto; bottom: 18px; left: 16px; right: auto; }
  /* arrows at the image's top-left so they never sit on people in the lower half */
  .hero-nav { bottom: calc((100vw - 32px) * 0.5625 - 46px); }
  .hero-nav.prev { left: 12px; right: auto; }
  .hero-nav.next { left: 56px; right: auto; }
  /* fixed text-block height (tallest slide) + CTA row pinned to its bottom: image and CTAs never move between slides (06:30) */
  .hero-media-body { display: flex; flex-direction: column; justify-content: flex-start; min-height: 372px; }
  .hero-media-body .hero-ctas { margin-top: auto; padding-top: 14px; align-items: stretch; }
}
@media (max-width: 350px) { .hero-media-body { min-height: 456px; } }

/* Editor's Picks: full English title; text-only editorial card (Love Binti, 18:04) */
.pick-item .pick-title .en { white-space: normal; overflow: visible; text-overflow: clip; }
.pick-item.pick-text { align-items: stretch; padding-top: 8px; padding-bottom: 8px; }
.pick-item.pick-text .pick-body { border-left: 2px solid var(--home-accent-line, #6a9a5b); padding: 2px 0 2px 14px; display: flex; flex-direction: column; justify-content: center; }
.pick-item .pick-label { font-size: 10.5px; font-weight: 700; letter-spacing: .04em; color: #4a7340; margin-bottom: 3px; text-transform: uppercase; }   /* 5.5:1 on white */
.pick-item .pick-label [lang=en] { font-weight: 600; opacity: .85; }
.pick-item.pick-text .pick-title { font-size: 14px; margin-bottom: 3px; line-height: 1.3; }
.pick-item.pick-text .pick-title .en { display: inline; margin-left: 6px; }
.pick-item.pick-text .pick-excerpt { line-height: 1.35; }
.pick-item.pick-text .pick-excerpt-en { font-size: 11px; margin-top: 1px; }

/* phones: text-band page titles match picture-header titles (30 px) */
@media (max-width: 560px) { .hero:not(.hero-illustrative) h1 { font-size: 30px; line-height: 1.3; } }

/* About, phones: milestones as a single-column timeline (year left, items right), chronological top to bottom (22:37) */
@media (max-width: 600px) {
  .milestones { grid-template-columns: 1fr; gap: 0; }
  .milestones .ms-year { display: grid; grid-template-columns: 58px 1fr; column-gap: 12px; align-items: start; border-top: 0; border-left: 3px solid var(--brand); padding: 8px 0 10px 12px; }
  .milestones .ms-y { font-size: 18px; margin: 0; }
  .milestones .ms-year + .ms-year { border-top: 1px solid var(--border); }
}

/* the four entry cards on Business / Personal now carry AI photos: a caption under each grid */
.seg-ai-note { font-size: 12px; color: var(--muted); margin: 10px 0 0; }

/* split-hero image rotator (includes/img_rotator.php): controls live inside the image box only */
.img-rot { position: relative; }
.hero-illustrative .img-rot img { position: absolute; inset: 0; opacity: 0; transition: opacity .8s ease; }
.hero-illustrative .img-rot img.is-on { opacity: 1; position: relative; }
/* controls: the home-hero classes (.hero-dots/.hero-dot/.hero-nav in style.css) positioned inside the image box. Phones:
   the home rule places arrows from the home's 16:9 image height, so here they are pinned to the top-left of this image */
@media (max-width: 560px) {
  .img-rot .hero-nav { bottom: auto; top: 12px; }
}
@media (prefers-reduced-motion: reduce) { .hero-illustrative .img-rot img { transition: none; } }

/* picks: AI illustration thumbnail = same 40% 16:9 box as the photo rows, with a small corner label (user 14:29) */
.pick-item .pick-thumb { position: relative; width: 40%; flex-shrink: 0; display: block; }
.pick-item .pick-thumb img { width: 100%; display: block; }
.pick-item .pick-illus { position: absolute; left: 4px; bottom: 4px; font-size: 10px; line-height: 1.2; padding: 2px 5px; border-radius: 3px; background: rgba(0,0,0,.6); color: #fff; letter-spacing: .02em; }

/* home hero typography (user 14:30, corrected 14:52): the shared tag = Chinese line, then English line inside the
   original semi-transparent grey box (background/radius/padding from style.css), box only as wide as the longer line. Chinese lead lines break only at punctuation / phrase boundaries (keep-all),
   never inside a word (e.g. 彈|性); overflow-wrap is only a safety net if a phrase could not fit the width at all. */
.page-home .hero-media .hero-tag { display: inline-flex; flex-direction: column; gap: 2px; width: fit-content; max-width: 100%;
  align-self: flex-start; line-height: 1.35; }   /* 14:52: original grey box, radius and padding kept (style.css), sized to the longer line */
.page-home .hero-media .hero-tag > span[lang] { display: block; }
.page-home .hero-media .hero-tag .bi-sep { display: none; }
.hero-media .hero-lead-zh, .hero-media h1 { word-break: keep-all; overflow-wrap: anywhere; line-break: strict; }
.hero-media .hero-lead-zh .zh-cl { display: inline-block; max-width: 100%; }
/* <= 350 px: 12 px side padding and 16 px lead (still >= 15 px) so each clause fits on its own line, no orphan characters */
@media (max-width: 350px) { .hero-media-body { padding-left: 12px; padding-right: 12px; } .hero-media .hero-lead-zh { font-size: 16px; } }

/* header brand block (user 15:04, enlarged 15:50 with the original site's weight as reference): logo 80 px (original
   image, square), mbranfiltra 28/700, company name 20/600 dark, two lines; the nav collapses earlier (<= 1360 px since 18:38: the one-line "中文 / English" nav labels no longer fit on one row at 1280) so
   the brand never has to shrink to make room. Phones: 60 / 22 / 16. */
.brand { gap: 14px; }
.brand img { width: 80px; height: 80px; }
.brand strong { font-size: 28px; font-weight: 700; line-height: 1.15; }
.brand small { font-size: 20px; font-weight: 600; color: var(--ink); text-transform: none; letter-spacing: 0; line-height: 1.3; margin-top: 2px; }
@media (max-width: 1360px) {
  .nav-toggle { display: inline-block; }
  .main-nav { display: none; width: 100%; flex-direction: column; align-items: stretch; padding-top: 8px; }
  .main-nav.open { display: flex; }
  .dropdown-menu { position: static; display: block; box-shadow: none; border: none; padding-left: 14px; }
  .header-inner { flex-wrap: wrap; }
}
@media (max-width: 560px) {
  .brand { gap: 12px; }
  .brand img { width: 60px; height: 60px; }
  .brand strong { font-size: 22px; }
  .brand small { font-size: 16px; }
}
/* contact information: label group "電話 Phone" on one line, then the value in its own column (bilingual values on two lines); see the 18:30 rules below */
.ci-row { margin: 0 0 12px; line-height: 1.45; }
.ci-row .ci-k { display: block; font-weight: 600; }
.ci-row .ci-k .zh, .ci-row .ci-k .en, .ci-row .ci-v .zh, .ci-row .ci-v .en { display: block; }
.ci-row .ci-k .en { font-weight: 400; font-size: 12px; color: var(--muted); }
.ci-row .ci-v { display: block; }
.ci-row .ci-v .en { font-size: 13px; color: var(--muted); }
.site-footer .ci-row .ci-k .en, .site-footer .ci-row .ci-v .en { color: inherit; opacity: .75; }
.site-footer .ci-row { margin-bottom: 10px; }
/* form labels: Chinese line, English line */
.form-row label .bi-inline .zh, .form-row label .bi-inline .en { display: block; }
.form-row label .bi-inline .en { font-size: 12px; font-weight: 400; color: var(--muted); }
.footer-preview { font-size: 12px; opacity: .8; }
.brand-lc { text-transform: none; }
/* contact-row links (phone / email / social): >= 32 px tap height without changing the text */
.ci-row .ci-v a { display: inline-flex; align-items: center; min-height: 32px; }
/* contact submit button: Chinese line, English line (user 15:04 / 15:49) */
form .btn-brand .bi-inline .zh, form .btn-brand .bi-inline .en { display: block; }
form .btn-brand .bi-inline .en { font-size: 12px; font-weight: 500; opacity: .9; }

/* footer (user 15:53, reworked 16:52): three explicit columns (no auto-fit ghost tracks), tight language groups
   (zh 16/22, en 14/19), block rows (no inline baseline gaps), contact = zh label + value on one line and the full English
   label below; test reports / FAQ side by side. */
.site-footer .footer-inner { display: grid; grid-template-columns: minmax(0, 1.25fr) minmax(0, 1fr) minmax(0, 1.25fr); gap: 24px 48px; padding-top: 30px; padding-bottom: 22px; align-items: start; }
@media (max-width: 900px) { .site-footer .footer-inner { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); } .site-footer .footer-col:first-child { grid-column: 1 / -1; } }
@media (max-width: 560px) { .site-footer .footer-inner { grid-template-columns: minmax(0, 1fr); gap: 22px; } }
.site-footer .ft-h { font-size: 18px; line-height: 24px; margin: 0 0 11px; color: #fff; font-weight: 700; }
.site-footer .ft-h .zh, .site-footer .ft-h .en { display: block; }
.site-footer .ft-h .en { font-size: 14px; line-height: 19px; font-weight: 400; margin-top: 1px; }
.site-footer .footer-col p { font-size: 16px; line-height: 22px; margin: 0 0 8px; }
.site-footer .footer-col p:last-child { margin-bottom: 0; }
.site-footer .ft-tagline .zh, .site-footer .ft-tagline .en { display: block; }
.site-footer .ft-tagline .en { font-size: 14px; line-height: 19px; margin-top: 2px; }
.site-footer .ft-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; }
.site-footer .ft-list li { margin: 0; }
.site-footer .ft-list a { display: block; text-decoration: none; }
.site-footer .ft-list a:hover .zh, .site-footer .ft-list a:focus-visible .zh { text-decoration: underline; }
.site-footer .ft-list .zh { display: block; font-size: 16px; line-height: 22px; }
.site-footer .ft-list .en { display: block; font-size: 14px; line-height: 19px; margin-top: 1px; }
.site-footer .ft-contact { display: grid; gap: 8px; margin: 0 0 12px; }
.site-footer .ft-row { display: grid; grid-template-columns: auto minmax(0, 1fr); column-gap: 10px; align-items: baseline; }
.site-footer .ft-row .ft-k { font-size: 16px; line-height: 22px; font-weight: 600; }
.site-footer .ft-row .ft-v { font-size: 16px; line-height: 22px; overflow-wrap: anywhere; }
.site-footer .ft-row .ft-v a { text-decoration: none; }
.site-footer .ft-row .ft-v a:hover, .site-footer .ft-row .ft-v a:focus-visible { text-decoration: underline; }
.site-footer .ft-row .ft-k-en { grid-column: 1 / -1; font-size: 14px; line-height: 19px; margin-top: 1px; }
.site-footer .ft-links { grid-auto-flow: column; grid-auto-columns: max-content; gap: 8px 28px; }
@media (max-width: 340px) { .site-footer .ft-links { grid-auto-flow: row; } }
.site-footer .footer-bottom { padding-top: 16px; padding-bottom: 20px; }
.site-footer .footer-bottom p { margin: 0 0 4px; font-size: 13px; line-height: 19px; }
.site-footer .ft-list .zh, .site-footer .ft-row .ft-k, .site-footer .ft-row .ft-v, .site-footer .ft-row .ft-v a, .site-footer .ft-tagline .zh { color: #fff; }
.site-footer .ft-list .en, .site-footer .ft-row .ft-k-en, .site-footer .ft-tagline .en, .site-footer .ft-h .en { color: rgba(207,231,238,.78); }

/* product spec cards (user 16:17), all cards via the shared renderer: readable column width, 1.5 line-height, actions in
   compact rows — open / download (label zh + en, numbered links grouped with a small gap), then the two inquiry links as
   rows with the arrow fixed on the right. Tap targets >= 36 px without inflating the text line-height. */
.spec-grid { grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); }
.spec-card .spec-pts { line-height: 1.5; margin-bottom: 8px; }
.spec-card .spec-pts li { margin: 3px 0; }
.spec-card .spec-en { line-height: 1.5; margin-bottom: 10px; }
.spec-card .spec-list { line-height: 1.5; }
.spec-card .spec-more summary { display: list-item; padding: 4px 0; }
.spec-card .spec-more summary .bi-inline .zh, .spec-card .spec-more summary .bi-inline .en { display: inline; }
.spec-card .spec-more summary .bi-inline .en { display: block; margin-left: 1.1em; font-size: 12px; font-weight: 500; }
.spec-card .spec-actions { margin-top: 12px; display: flex; flex-direction: column; gap: 12px; font-size: 13px; }
.spec-card .spec-files { display: flex; flex-direction: column; gap: 10px; }
.spec-card .spec-file { display: flex; align-items: center; justify-content: space-between; gap: 10px; flex-wrap: wrap; }
.spec-card .spec-file-lbl .bi-inline .zh, .spec-card .spec-file-lbl .bi-inline .en,
.spec-card .spec-file-single .bi-inline .zh, .spec-card .spec-file-single .bi-inline .en,
.spec-card .spec-ask-txt .bi-inline .zh, .spec-card .spec-ask-txt .bi-inline .en { display: block; line-height: 1.3; }
.spec-card .spec-file-lbl .bi-inline .en, .spec-card .spec-file-single .bi-inline .en, .spec-card .spec-ask-txt .bi-inline .en { font-size: 12px; color: var(--muted); font-weight: 400; margin-top: 1px; }
.spec-card .spec-nums { display: flex; gap: 6px; flex: none; }
.spec-card .spec-nums a { display: inline-flex; align-items: center; justify-content: center; min-width: 36px; height: 36px; margin: 0; border: 1px solid var(--border); border-radius: 6px; line-height: 1; font-weight: 600; }
.spec-card .spec-file-single { display: inline-flex; align-items: center; min-height: 36px; }
.spec-card .spec-asks { display: flex; flex-direction: column; gap: 8px; border-top: 1px solid var(--border); padding-top: 10px; }
.spec-card .spec-ask { display: flex; align-items: center; gap: 10px; min-height: 40px; margin: 0; padding: 2px 0; }
.spec-card .spec-ask-txt { flex: 1; min-width: 0; }
.spec-card .spec-ask-txt .bi-inline .zh { font-weight: 600; }
.spec-card .spec-arrow { flex: none; font-size: 16px; }

/* products: Testing / Equipment / Packaging cards (user 16:19): body 16/400, line-height 1.55, zh line then en line per
   group, even spacing, natural height; report numbers and dates never split. Shared CTA row: zh + en lines, arrow right. */
.sv-card h3 { margin-bottom: 12px; }
.sv-card .sv-p { margin: 0 0 12px; }
.sv-card .sv-p p { margin: 0; }
.sv-card .sv-p .zh { font-size: 16px; font-weight: 400; line-height: 1.55; color: var(--ink); }
.sv-card .sv-p .en { font-size: 14px; font-weight: 400; line-height: 1.5; color: var(--muted); margin-top: 3px; }
.nobr { white-space: nowrap; }
.card-cta { display: flex; align-items: center; gap: 10px; min-height: 40px; padding: 8px 0 2px; border-top: 1px solid var(--border); margin-top: 4px; font-weight: 600; }
.card-cta-txt { flex: 1; min-width: 0; }
.card-cta-txt .bi-inline .zh, .card-cta-txt .bi-inline .en { display: block; line-height: 1.3; }
.card-cta-txt .bi-inline .en { font-size: 12px; font-weight: 400; color: var(--muted); margin-top: 1px; }
.card-cta-arrow { flex: none; font-size: 16px; }

/* two-column key/value tables (technology + medical test results, document status) — user 16:27: short item column
   (~24%), cells top-aligned, item / result each as a Chinese line then an English line, 16/400 body, 1.55 line-height,
   only column headers and item names weighted; phones keep the existing stack-sm pattern (item above result).
   The 6-column D4 spec tables are not affected (.stack-sm only). */
table.spec-table.stack-sm th, table.spec-table.stack-sm td { vertical-align: top; padding: 14px 16px 14px 0; font-size: 16px; line-height: 1.55; }
table.spec-table.stack-sm th { font-size: 14px; font-weight: 600; padding-top: 10px; padding-bottom: 10px; }
table.spec-table.wide.stack-sm tr > :first-child { width: 24%; color: var(--ink); }
table.spec-table.stack-sm td .bi-unit > .zh, table.spec-table.stack-sm td .bi-unit > .en { display: block; }
table.spec-table.stack-sm td .bi-unit > .zh { font-size: 16px; font-weight: 400; color: var(--ink); line-height: 1.55; }
table.spec-table.stack-sm td .bi-unit > .en { font-size: 14px; font-weight: 400; color: var(--muted); line-height: 1.5; margin-top: 5px; }
table.spec-table.stack-sm td:first-child .bi-unit > .zh { font-weight: 600; }
table.spec-table.stack-sm td a { display: inline-flex; align-items: center; min-height: 32px; }
.table-note { margin: 14px 0 0; }
.table-note .zh, .table-note p.zh { font-size: 16px !important; font-weight: 400 !important; line-height: 1.55; color: var(--ink); }
.table-note .en, .table-note p.en { font-size: 14px !important; font-weight: 400 !important; line-height: 1.5; color: var(--muted); margin-top: 4px; }
@media (max-width: 720px) {
  table.spec-table.stack-sm td { padding: 2px 0; }
  table.spec-table.stack-sm tr { padding: 12px 0; }
  table.spec-table.wide.stack-sm tr > :first-child { width: auto; }
  table.stack-sm td:first-child { margin-bottom: 6px; }
}
.site-footer .ft-row { align-items: center; }
.site-footer .ft-row .ft-v a { display: inline-flex; align-items: center; min-height: 32px; }

/* shared split hero (user 17:24): same 16:9 image frame on every split-hero page (outdoor / household / medical /
   industrial / business): the frame is 54% wide, 16:9, top-aligned and never stretched by the text height, so the 16:9
   originals show uncropped; the text column takes the rest (no 480 px cap), stacks above a full-width 16:9 image below
   1024 px. Eyebrow and CTA labels: Chinese line, English line. */
.hero-illustrative-inner { align-items: flex-start; gap: 32px; min-height: 0; }
.hero-illustrative .hero-text { flex: 1 1 0; max-width: none; min-width: 0; }
.hero-illustrative .hero-image { flex: 0 0 54%; align-self: flex-start; aspect-ratio: 16 / 9; height: auto; min-height: 0; max-height: none; }
.hero-illustrative .hero-image img { width: 100%; height: 100%; object-fit: cover; }
.hero-illustrative .sub, .hero-illustrative .illus-note { max-width: none; }
.hero-illustrative .eyebrow .zh, .hero-illustrative .eyebrow .en, .hero-illustrative .eyebrow .lbl > [lang] { display: block; }
.hero-illustrative .eyebrow .en, .hero-illustrative .eyebrow .lbl > [lang="en"] { font-size: 11px; margin-top: 1px; }
.hero-illustrative .hero-cta-group .btn .bi-inline .zh, .hero-illustrative .hero-cta-group .btn .bi-inline .en { display: block; line-height: 1.3; }
.hero-illustrative .hero-cta-group .btn .bi-inline .en { font-size: 12px; font-weight: 500; opacity: .9; }
@media (max-width: 1024px) {
  .hero-illustrative-inner { flex-direction: column; align-items: stretch; gap: 20px; }
  .hero-illustrative .hero-text { flex: none; order: 1; }
  .hero-illustrative .hero-image { flex: none; width: 100%; order: 2; }
}

/* shared On-this-page nav (user 16:31): label and items as Chinese line + English line, no numbering, wraps on phones */
.page-nav .container { gap: 10px 22px; align-items: flex-start; }
.page-nav .tc-anchors-label .zh, .page-nav .tc-anchors-label .en, .page-nav a .zh, .page-nav a .en { display: block; line-height: 1.3; }
.page-nav .tc-anchors-label { padding-top: 6px; }
.page-nav .tc-anchors-label .en, .page-nav a .en { font-size: 12px; color: var(--muted); }
.page-nav a { flex-direction: column; align-items: flex-start; justify-content: center; }
.page-nav a:focus-visible { outline: 3px solid #ffd400; outline-offset: 2px; border-radius: 4px; }
section[id], h2[id], [id].section-title { scroll-margin-top: 120px; }
@media (max-width: 560px) { section[id], h2[id], [id].section-title { scroll-margin-top: 100px; } }
/* Product category intro (shared by every products.php category): uses the full container width, wraps
   naturally per viewport (no 700px cap, no br/nowrap/shrink); zh line then en line; one fixed rhythm:
   title -> 12px -> zh -> 4px -> en -> 24px -> content. No negative margin, no default <p> margins stacked on top. */
.section-lead.cat-lead { max-width: none; margin: 0 0 24px; }
h2.section-title:has(+ .cat-lead) { margin-bottom: 12px; }
.section-lead.cat-lead .bi-unit > p { margin: 0; line-height: 1.7; }
.section-lead.cat-lead .bi-unit > .zh { font-size: 16px; }
.section-lead.cat-lead .bi-unit > .en { font-size: 14px; margin-top: 4px; }
/* Condition note under a category's cards: same full-width alignment and zh/en rhythm, full text, plain note (not a warning). */
.spec-caveat .bi-unit > p { margin: 0; line-height: 1.7; }
.spec-caveat .bi-unit > .en { margin-top: 4px; font-size: 12px; }
/* Short bilingual labels on ONE line (user 2026-09-29 18:30 / 18:33 / 18:38): "完整中文 / Full English", English lighter but
   readable, wrapping naturally -- every short label type: buttons and CTAs (incl. split-hero CTAs), header nav and dropdown
   items, page nav, footer link lists, product-card open / download / ask links and "full spec", card CTAs, form field
   labels and the submit button. The "/" is presentational (empty alt text, not read out). Long text, hero eyebrows /
   H1s, section titles and paragraphs keep their existing layout. A single arrow stays at the end / right. */
.lbl > .zh::after, .btn .bi-inline > .zh::after, .page-nav a > .zh::after, .site-footer .ft-list a > .zh::after,
.card-cta-txt .bi-inline > .zh::after, .spec-card .spec-file-lbl .bi-inline > .zh::after, .spec-card .spec-file-single .bi-inline > .zh::after,
.spec-card .spec-ask-txt .bi-inline > .zh::after, .spec-card .spec-more summary .bi-inline > .zh::after, .form-row label .bi-inline > .zh::after,
.segment-cta .bi-inline > .zh::after, .expo-album summary .bi-inline > .zh::after, a > .bi-inline > .zh::after { content: " /" / ""; font-weight: 400; opacity: .55; }
.eyebrow .lbl > .zh::after, .orig-lbl .lbl > .zh::after { content: none; }
.dropdown-menu a .lbl .en, .page-nav a .zh, .page-nav a .en, .site-footer .ft-list .zh, .site-footer .ft-list .en,
.hero-illustrative .hero-cta-group .btn .bi-inline .zh, .hero-illustrative .hero-cta-group .btn .bi-inline .en,
.card-cta-txt .bi-inline .zh, .card-cta-txt .bi-inline .en,
.spec-card .spec-file-lbl .bi-inline .zh, .spec-card .spec-file-lbl .bi-inline .en, .spec-card .spec-file-single .bi-inline .zh, .spec-card .spec-file-single .bi-inline .en,
.spec-card .spec-ask-txt .bi-inline .zh, .spec-card .spec-ask-txt .bi-inline .en, .spec-card .spec-more summary .bi-inline .en,
.form-row label .bi-inline .zh, .form-row label .bi-inline .en, form .btn-brand .bi-inline .zh, form .btn-brand .bi-inline .en,
a > .bi-inline > .zh, a > .bi-inline > .en, table.spec-table.stack-sm td a .bi-unit > .zh, table.spec-table.stack-sm td a .bi-unit > .en { display: inline; margin: 0; }
.page-nav a { display: inline-block; }
.site-footer .ft-list a .en { margin-top: 0; }
.site-footer .ft-list a { min-height: 32px; padding: 5px 0; }   /* one-line links keep a >= 32 px tap target */
.dropdown-menu a .lbl-arrow { margin-left: .35em; }
@media (min-width: 1361px) { .dropdown-menu { min-width: 0; width: max-content; max-width: 460px; } }
.awards-cell .award-link .lbl > .zh, .awards-cell .award-link .lbl > .en { display: inline; }
/* Contact data rows (footer + contact page): "電話 Phone" label group on one line, the value in its own column; each
   row sizes to its own content (no fixed wide label column); narrow phones stack the whole label group above the value. */
.ci-row, .site-footer .ft-row { display: flex; flex-wrap: wrap; align-items: baseline; column-gap: 14px; row-gap: 2px; }
.ci-row .ci-k, .site-footer .ft-row .ft-k { flex: 0 1 auto; max-width: 100%; }
.ci-row .ci-v { flex: 1 1 10em; min-width: 0; }
.site-footer .ft-row .ft-v { flex: 0 1 auto; min-width: 0; overflow-wrap: normal; }
.ci-row .ci-k .zh, .ci-row .ci-k .en { display: inline; }
.ci-row .ci-k .en { font-size: 14px; font-weight: 400; }
.site-footer .ft-row .ft-k .ft-k-en { grid-column: auto; font-size: 14px; font-weight: 400; margin: 0; }
}
/* About: related media coverage under the awards table (user 18:43) -- compact list, two existing articles, original links */
.award-press { margin: 20px 0 0; }
.award-press-h { font-size: 18px; margin: 0 0 8px; color: var(--brand-dark); }
.award-press-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 10px; }
.award-press-list li { border-top: 1px solid var(--border); padding: 10px 0 0; display: flex; flex-direction: column; gap: 3px; }
.award-press-list .ap-meta { font-size: 13px; color: var(--muted); }
.award-press-list .ap-title { font-weight: 600; }
.award-press-list .bi-unit > .zh, .award-press-list .bi-unit > .en { font-size: 14px; font-weight: 400; color: var(--muted); margin: 0; }
.award-press-list .ap-link { align-self: flex-start; display: inline-flex; align-items: center; min-height: 32px; overflow-wrap: anywhere; }
/* About awards (user 18:48): compact image + text rows -- the original-site award photo first (whole image, natural aspect,
   never cropped, click opens the full original), then year / award / item top-aligned, tighter row padding. Phones: the
   photo sits above the text at a moderate width, no empty frame. */
.awards-table col.c-img { width: 190px; }
.awards-table col.c-year { width: 9%; }
.awards-table col.c-award { width: 34%; }
.awards-table col.c-item { width: auto; }
.awards-table th, .awards-table td { padding: 12px 12px; }
.awards-table td.award-img-cell { padding-left: 0; }
.award-img { display: block; border: 1px solid var(--border); border-radius: 4px; overflow: hidden; background: #fff; line-height: 0; }
.award-img img { display: block; width: 100%; height: auto; }
.award-img:focus-visible { outline: 3px solid #ffd400; outline-offset: 2px; }
.awards-cell .award-link { margin-right: 14px; }
@media (max-width: 640px) {
  .awards-table td.award-img-cell { padding: 0 0 8px; }
  .award-img { max-width: 300px; }
}
/* Resources video card whose heading is the original company site's title: the YouTube title follows as secondary info */
.video-card .video-orig { margin: 2px 0 4px; font-size: 13px; color: var(--muted); line-height: 1.45; }
/* Resources media coverage (user 21:34): text left, the article's own image right (about 30%, 280-360 px), top-aligned,
   whole image at its own ratio (never cropped, never drawn wider than the original), linked to the same article; a small
   credit line under it. Rows without an image keep the full width. Phones: the image follows the text. */
.media-row.has-img { display: grid; grid-template-columns: minmax(0, 1fr) clamp(280px, 30%, 360px); column-gap: 28px; align-items: start; }
.media-row .media-text { min-width: 0; }
.media-fig { margin: 0; }
.media-fig a { display: block; line-height: 0; border: 1px solid var(--border); border-radius: 4px; overflow: hidden; background: #fff; }
.media-fig img { display: block; width: 100%; height: auto; }
.media-fig a:focus-visible { outline: 3px solid #ffd400; outline-offset: 2px; }
.media-credit { margin-top: 6px; font-size: 12px; line-height: 1.45; color: var(--muted); }
.media-credit [lang="en"] { display: block; }
@media (max-width: 720px) {
  .media-row.has-img { grid-template-columns: minmax(0, 1fr); row-gap: 12px; }
}
/* Resources exhibitions (user 21:40): compact image + text rows like the other image/text rows -- the event's lead image as
   a thumbnail column on the left (about 29%, 280-340 px, whole image at its own ratio, never cropped or upscaled; click
   opens the full original), title / full zh + en text / album on the right, top-aligned; card height follows the content.
   Phones: stacked, the thumbnail keeps a moderate cap (never a full-screen banner). Replaces the full-width lead banner. */
.expo-row { display: grid; grid-template-columns: clamp(280px, 29%, 340px) minmax(0, 1fr); column-gap: 28px; align-items: start; }
.expo-row .expo-body { min-width: 0; }
.expo-row .expo-body > h3:first-child { margin-top: 0; }
.expo-thumb { display: block; line-height: 0; border: 1px solid var(--border); border-radius: 6px; overflow: hidden; background: #fff; }
.expo-thumb img { display: block; width: 100%; height: auto; }
.expo-thumb:focus-visible { outline: 3px solid #ffd400; outline-offset: 2px; }
@media (max-width: 720px) {
  .expo-row { grid-template-columns: minmax(0, 1fr); row-gap: 12px; }
  .expo-thumb { max-width: 340px; }
}
/* Page nav label (user 21:47): 「本頁主題 / On this page」 is a short label too -- one group on one line, first-line baseline
   aligned with the links; no block zh/en split, no extra padding; the links wrap to the next row when they do not fit.
   Links keep a >= 32 px tap target via vertical padding (not a fixed height). */
.page-nav .container { align-items: baseline; }
.page-nav .tc-anchors-label { padding-top: 0; }
.page-nav .tc-anchors-label .zh, .page-nav .tc-anchors-label .en { display: inline; }
.page-nav .tc-anchors-label > .zh::after { content: " /" / ""; font-weight: 400; opacity: .55; }
.page-nav a { display: inline-block; min-height: 0; padding: 8px 0; }
/* Spec-card file links carry their language (中文 / English / 中英 / ZH–EN): the button grows with its text instead of a
   fixed number square; the two groups wrap naturally on narrow cards (user 21:50). Card layout otherwise unchanged. */
.spec-card .spec-nums { flex-wrap: wrap; flex: 0 1 auto; justify-content: flex-end; }
.spec-card .spec-nums a { width: auto; min-width: 36px; padding: 0 10px; white-space: nowrap; font-size: 13px; }
/* Non-clickable short labels (user 21:47): case-card stage tags (挑戰 / Challenge, 方案 / Solution, 成果 / Outcome, home
   case tags) and the medical document-step labels (1. 提出需求 / 1. Tell us your need) are one "中文 / English" group on one
   line, wrapping naturally -- like the clickable short labels. Sentences, list items, stats and values keep their layout. */
.case-stage.bi-unit, .case-stage .bi-unit, .doc-steps b .bi-unit { display: block; }
.case-stage.bi-unit > .zh, .case-stage.bi-unit > .en, .case-stage .bi-unit > .zh, .case-stage .bi-unit > .en,
.doc-steps b .bi-unit > .zh, .doc-steps b .bi-unit > .en { display: inline; margin: 0; }
.case-stage.bi-unit > .zh::after, .case-stage .bi-unit > .zh::after, .doc-steps b .bi-unit > .zh::after { content: " / " / ""; font-weight: 400; opacity: .55; }
/* Page heroes with the original teal line-art (user 2026-09-29 22:48): products = fibre bundle, technology = membrane pores,
   resources = four application fields (v2 icons). The whole illustration sits in a right-hand layer that takes the hero's
   own height (16:9, never cropped top/bottom, never making the hero taller); its left part fades into the same teal base;
   the text column stays left and never runs under the drawing. Phones: the drawing follows the text as a square crop of
   its right half (where all of its content is), below the CTAs. Other pages keep the water banner. */
.hero.hero-art { position: relative; overflow: hidden; background: linear-gradient(100deg, #05283a 0%, #073a50 55%, #0a5b74 100%); }
.hero.hero-art::after { content: ""; position: absolute; top: 0; right: 0; bottom: 0; aspect-ratio: 16 / 9; background: var(--hero-art) right center / cover no-repeat;
  -webkit-mask-image: linear-gradient(90deg, transparent 0%, #000 42%); mask-image: linear-gradient(90deg, transparent 0%, #000 42%); pointer-events: none; }
.hero.hero-art .container { position: relative; z-index: 1; }
/* text keeps the original hero measure (sub 640 px, as before the art) so the hero height is unchanged (user 23:26:
   products was 455 px with an orphan 「品。」 at 52 %); the art's drawing starts right of it at every width > 1100 px */
.hero.hero-art .sub { max-width: 640px; }
.hero.hero-art .sub .zh { text-wrap: pretty; }
.hero.art-fibers { --hero-art: url('../hero/hero-fibers.svg'); }
.hero.art-membrane { --hero-art: url('../hero/hero-membrane.svg'); }
.hero.art-fields { --hero-art: url('../hero/hero-fields-v2.svg'); }
@media (max-width: 1100px) {
  .hero.hero-art .eyebrow, .hero.hero-art h1, .hero.hero-art .sub { max-width: none; }
  .hero.hero-art::after { position: static; display: block; width: min(calc(100% - 32px), 360px); aspect-ratio: 1 / 1; margin: 24px 16px 0; border-radius: 10px;
    -webkit-mask-image: none; mask-image: none; }
}
/* hero art on narrow screens: left edge lines up with the page container (same gutter as the text above) */
@media (max-width: 1100px) { .hero.hero-art::after { margin-left: calc(4% ); } }
@media (max-width: 900px) { .hero.hero-art::after { margin-left: 24px; } }
@media (max-width: 560px) { .hero.hero-art::after { margin-left: 16px; } }
/* Entry cards with a photo (personal: outdoor / household; business: medical / industrial -- the only segment-card images,
   user 23:15): the whole 4:3 original at the card width (no fixed 160 px band, no cover crop, no contain letterbox). */
.segment-card img, .segment-card img.img-contain { display: block; width: 100%; height: auto; object-fit: initial; background: none; }
/* Footer rhythm (user 23:13): Solutions list, the three contact rows and the reports / FAQ links share one compact rhythm --
   text 22 px (zh 16) / 20 px (en 14) line boxes, every item a >= 32 px row from symmetric padding (not line-height plus
   padding plus min-height stacked), 4 px between rows; wrapped text simply grows the row. */
.site-footer .ft-list { gap: 4px; }
.site-footer .ft-contact { gap: 4px; margin-bottom: 4px; }
.site-footer .ft-list a { min-height: 32px; padding: 5px 0; line-height: 22px; box-sizing: border-box; }
.site-footer .ft-list a .zh { line-height: 22px; }
.site-footer .ft-list a .en { line-height: 20px; }
.site-footer .ft-row { min-height: 32px; align-items: center; }
.site-footer .ft-row .ft-k, .site-footer .ft-row .ft-v { line-height: 22px; }
.site-footer .ft-row .ft-k .ft-k-en { line-height: 20px; }
.site-footer .ft-row .ft-v a { min-height: 32px; line-height: 22px; }
.site-footer .ft-links { gap: 4px 28px; }
/* Real photos of people (About team / exhibition photos -- the only real-photo grid with people; the outdoor grid holds product
   photos and keeps its layout; user 23:47): each photo whole at its own
   ratio (no fixed 180 px band, no cover crop cutting heads), top-aligned; the source line sits under the caption.
   Spec-card, equipment and report grids keep their own rules. */
.real-photo-grid.about-photos { align-items: start; }
.real-photo-grid.about-photos img { height: auto; object-fit: initial; }
.real-photo-grid .photo-src { display: block; margin-top: 4px; font-size: 12px; line-height: 1.5; color: var(--muted); }
.real-photo-grid .photo-src [lang="en"] { display: block; }
.real-photo-grid .photo-src a { display: inline-flex; align-items: center; min-height: 32px; }
/* Personal / business entry cards as stacked compact image + text rows (user 00:05): the whole 4:3 photo as a small column
   (280-320 px, natural height), the full tag / titles / text / points / CTA beside it, top-aligned; rows keep their own
   height. Narrow screens: photo above the text, <= 320 px. The whole row stays one link. */
.segments-grid.seg-rows { grid-template-columns: minmax(0, 1fr); gap: 28px; }
.seg-rows .segment-card { display: grid; grid-template-columns: clamp(280px, 26%, 320px) minmax(0, 1fr); column-gap: 26px; align-items: start; padding: 16px; }
.seg-rows .segment-card img { width: 100%; height: auto; border-radius: 6px; }
.seg-rows .segment-card .segment-body { padding: 0; }
@media (max-width: 720px) {
  .seg-rows .segment-card { grid-template-columns: minmax(0, 1fr); row-gap: 14px; }
  .seg-rows .segment-card img { max-width: 320px; }
}
.hero.art-about { --hero-art: url('../hero/hero-about-continuity.svg'); }
/* 圖意 / Visual meaning caption (user 00:44): desktop -- the drawing layer stops 52 px above the hero's bottom edge (whole,
   never cropped, hero height unchanged) and the caption sits in that strip, right-aligned under the drawing; <= 1100 px it
   follows the drawing below the text. zh 14 / en 13, zh and en on their own lines. */
.hero.hero-art .hero-art-caption { position: absolute; right: 4%; bottom: 6px; z-index: 1; margin: 0; max-width: min(660px, 50%); text-align: right; color: rgba(255,255,255,.84); }
.hero.hero-art .hero-art-caption .zh, .hero.hero-art .hero-art-caption .en { display: block; }
.hero.hero-art .hero-art-caption .zh { font-size: 14px; line-height: 20px; }
.hero.hero-art .hero-art-caption .en { font-size: 13px; line-height: 18px; color: rgba(255,255,255,.72); }
@media (min-width: 1101px) { .hero.hero-art::after { bottom: 64px; } }   /* 64 px strip: room for a 3-line caption at 1920 */
@media (max-width: 1100px) {
  .hero.hero-art { display: flex; flex-direction: column; }
  .hero.hero-art > .container { order: 0; }
  .hero.hero-art::after { order: 1; }
  .hero.hero-art .hero-art-caption { order: 2; position: static; max-width: none; text-align: left; margin: 10px 24px 0; }
}
@media (max-width: 560px) { .hero.hero-art .hero-art-caption { margin: 10px 16px 0; } }
/* About brand memory row (user 00:41): whole water-splash image as a small left column (280-320 px), short story beside */
.brand-memory { display: grid; grid-template-columns: clamp(280px, 26%, 320px) minmax(0, 1fr); column-gap: 26px; align-items: start; margin: 28px 0 0; }
.brand-memory img { display: block; width: 100%; height: auto; border-radius: 6px; border: 1px solid var(--border); }
.brand-memory-text h3 { margin: 0 0 8px; }
@media (max-width: 720px) { .brand-memory { grid-template-columns: minmax(0, 1fr); row-gap: 12px; } .brand-memory img { max-width: 320px; } }
/* One rhythm for every section title + bilingual intro (user 00:57 / 00:58; the About "公司簡介" baseline), all pages:
   title -> 10 px -> zh line -> 2 px -> en line -> 24 px -> next block. Normal flow only: no -14 px pull-up, no default
   <p> margins stacked inside the nested bi-unit. Title -> card grid / table / list keeps the shared 24 px. */
h2.section-title:has(+ .section-lead), h2.section-title:has(+ .section-intro) { margin-bottom: 10px; }
.section-lead, .section-lead.cat-lead { margin: 0 0 24px; }
.section-intro { margin: 0 0 24px; }
.section-lead p, .section-lead .bi-unit > p, .section-intro .bi-unit > p { margin: 0; }
.section-lead .bi-unit > .en, .section-lead.bi > .en, .section-lead.cat-lead .bi-unit > .en, .section-intro .bi-unit > .en { margin-top: 2px; }
/* Personal entry rows only (user 01:40): photo about a third of the row, 360-400 px, 24 px gap. Business keeps .seg-rows as is. */
.seg-rows.seg-rows-lg .segment-card { grid-template-columns: clamp(360px, 33%, 400px) minmax(0, 1fr); column-gap: 24px; }
@media (max-width: 900px) { .seg-rows.seg-rows-lg .segment-card { grid-template-columns: clamp(240px, 38%, 360px) minmax(0, 1fr); } }
@media (max-width: 720px) { .seg-rows.seg-rows-lg .segment-card { grid-template-columns: minmax(0, 1fr); } .seg-rows.seg-rows-lg .segment-card img { max-width: 400px; } }
/* Household product rows (user 01:10): main image 240-280 px column (whole image, at most 300 px tall), then the album as small
   whole thumbnails; every image opens the full original. Right column: short "中文 / English" block labels + quoted data. */
.hh-rows .segment-card { grid-template-columns: clamp(240px, 24%, 280px) minmax(0, 1fr); column-gap: 24px; }
.hh-media { min-width: 0; }
.hh-main { display: flex; align-items: center; justify-content: center; background: #f4f6f8; border-radius: 6px; padding: 8px; }
.seg-rows .segment-card .hh-main img { width: auto; max-width: 100%; max-height: 300px; border-radius: 4px; }
.hh-album { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 6px; margin-top: 8px; }
.hh-album a { display: flex; align-items: center; justify-content: center; height: 64px; background: #f4f6f8; border-radius: 4px; padding: 3px; }
.seg-rows .segment-card .hh-album img { width: auto; max-width: 100%; max-height: 58px; border-radius: 2px; }
.hh-media .photo-src { margin: 6px 0 0; font-size: 12px; line-height: 1.5; color: var(--muted); }
.hh-media .photo-src .en { display: block; }
.hh-media .photo-src a { display: inline-flex; align-items: center; min-height: 32px; }
.hh-product h3 { margin: 0 0 10px; }
.hh-block { margin-top: 14px; }
.hh-block:first-of-type { margin-top: 0; }
.hh-lbl { margin: 0 0 6px; font-size: 15px; }
.hh-lbl .bi-inline > .zh::after { content: " /" / ""; font-weight: 400; opacity: .55; }
.hh-lbl .bi-inline > .en { font-weight: 500; }
.hh-block .bi-unit > p { margin: 0; }
.hh-block .bi-unit + .bi-unit { margin-top: 8px; }
.hh-block .bi-unit > .en { margin-top: 2px; }
.hh-list { margin: 0; padding-left: 20px; }
.hh-list li + li { margin-top: 6px; }
.hh-list .bi-unit > span { display: block; }
@media (max-width: 720px) { .hh-rows .segment-card { grid-template-columns: minmax(0, 1fr); } .hh-media { max-width: 320px; } }
/* 圖意 / Visual meaning, revised (user 01:45, replaces the 00:44 right-hand strip): the drawing layer is back to its original
   full hero height (no 64 px strip, no shrink); the caption sits in normal flow after the text / CTA, starting at the hero's
   own content edge (same container as the H1), full width, left-aligned, small like the home carousel AI note (measured
   11 px / 1.7; here 12 px / 18 px, weight 400). Desktop: the 70 px bottom padding absorbs it (14 + 20 margin + 2 x 18
   lines = 70), so the hero height and the drawing size equal the pre-caption build 91bda51. <= 1100 px: after the drawing. */
@media (min-width: 1101px) {
  .hero.hero-art::after { bottom: 0; }
  .hero.hero-art { padding-bottom: 14px !important; }
}
.hero.hero-art .hero-art-caption { position: relative; right: auto; bottom: auto; z-index: 1; width: min(92%, 1600px); max-width: none;
  margin: 20px auto 0; text-align: left; color: rgba(255,255,255,.8); font-weight: 400; }
.hero.hero-art .hero-art-caption .zh, .hero.hero-art .hero-art-caption .en { display: block; font-size: 12px; line-height: 18px; font-weight: 400; }
.hero.hero-art .hero-art-caption .en { color: rgba(255,255,255,.7); }
@media (max-width: 1100px) {
  .hero.hero-art .hero-art-caption { width: auto; margin: 12px 24px 0; }
}
@media (max-width: 560px) { .hero.hero-art .hero-art-caption { margin: 12px 16px 0; } }
/* The 20 px above the caption is padding, not margin: on heroes that end with the .sub paragraph its bottom margin used to
   collapse into the caption margin and the hero came out 20 px lower than before the caption (technology 363 vs 383). */
@media (min-width: 1101px) { .hero.hero-art .hero-art-caption { margin-top: 0; padding-top: 20px; } }
/* Household rows: block labels and the source link stay one line "中文 / English" (the .bi column otherwise stacks .en);
   list items use the same size as the paragraphs beside them. */
.hh-lbl .bi-inline > .zh, .hh-lbl .bi-inline > .en, .hh-media .photo-src a .bi-inline > .zh, .hh-media .photo-src a .bi-inline > .en { display: inline; margin: 0; }
.hh-lbl .bi-inline > .en { font-size: 13px; color: var(--muted); }
.hh-list .bi-unit > .zh { font-size: 14px; line-height: 1.6; }
.hh-list .bi-unit > .en { font-size: 14px; line-height: 1.6; margin-top: 1px; }
.hh-lbl .bi-inline { display: inline; }   /* headings default to a zh / en column (style.css h4 .bi-inline) */
.hh-lbl .bi-inline .en { font-size: 13px; font-weight: 400; margin-top: 0; }

/* Award photo credit when the photo is not from the company's original site (2025 100MVP row, user 03:06): small, muted, under the photo */
.awards-table .award-photo-src { display: block; margin-top: 4px; font-size: 12px; line-height: 1.45; color: var(--muted); font-weight: 400; font-style: normal; }
.awards-table .award-photo-src .zh, .awards-table .award-photo-src .en { display: block; }

/* About brand banner (user 04:13): the old water-splash image as a banner at its own ratio (1899 x 776), the original site's
   three hero lines centred on it in white over a light teal veil (image stays visible, not darkened out); grows taller and
   crops the image sides only when the text needs more room (phones), never the text. */
.brand-banner { position: relative; margin: 28px 0 0; border-radius: 8px; overflow: hidden; aspect-ratio: 1899 / 776; min-height: 240px;
  display: flex; align-items: center; justify-content: center; text-align: center; }
.brand-banner > img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.brand-banner::before { content: ""; position: absolute; inset: 0; background: linear-gradient(180deg, rgba(6,42,62,.42), rgba(6,42,62,.52)); }
.brand-banner-text { position: relative; z-index: 1; padding: 28px 24px; color: #fff; text-shadow: 0 1px 3px rgba(0,0,0,.35); max-width: 900px; }
.brand-banner-text p { margin: 0; }
.brand-banner-text .zh, .brand-banner-text .en { display: block; }
.brand-banner-text .en { color: rgba(255,255,255,.88); font-weight: 400; }
.brand-banner .bb-l1 .zh { font-size: clamp(24px, 3.2vw, 40px); line-height: 1.3; font-weight: 700; letter-spacing: .04em; }
.brand-banner .bb-l1 .en { font-size: clamp(14px, 1.4vw, 18px); line-height: 1.45; margin-top: 4px; }
.brand-banner .bb-l2 { margin-top: 18px; }
.brand-banner .bb-l2 .zh, .brand-banner .bb-l3 .zh { font-size: clamp(16px, 1.8vw, 22px); line-height: 1.5; font-weight: 600; letter-spacing: .06em; }
.brand-banner .bb-l2 .en, .brand-banner .bb-l3 .en { font-size: clamp(13px, 1.2vw, 15px); line-height: 1.45; }
.brand-banner .bb-l3 { margin-top: 10px; }
@media (max-width: 720px) { .brand-banner { aspect-ratio: auto; } .brand-banner-text { padding: 32px 18px; } }
/* stacking: image 0, veil 1, text 2 (the ::before veil came before the absolutely placed img and was painted under it) */
.brand-banner > img { z-index: 0; }
.brand-banner::before { z-index: 1; }
.brand-banner-text { z-index: 2; }
.brand-banner-text .zh, .brand-banner-text .en { text-wrap: balance; }
/* Same-level section titles (user 04:18, Codex measurement 68 px per bilingual h2): the title keeps its size / weight and
   zh-above-en order but gets its own tight leading instead of inheriting the 1.7 body leading -- zh 1.3, en 1.4, 2 px between.
   Title -> lead 10 px (rule above), lead zh/en 2 px, lead -> content 24 px; title with no lead -> first content 20 px, no
   empty lead as filler. Only h2.section-title (not hero, CTA band or footer headings); h3 keep their own level. */
h2.section-title .bi-inline .zh { line-height: 1.3; }
h2.section-title .bi-inline .en { line-height: 1.4; margin-top: 2px; }
h2.section-title { margin-bottom: 20px; }
h2.section-title + * { margin-top: 0; }
/* bilingual text blocks: the zh paragraph and its en paragraph are one unit -- 2 px apart, not 16 px browser margins
   collapsing between them; the unit keeps its normal spacing to the next paragraph. */
.bi-unit:not(.bi-inline) > p.zh { margin-bottom: 0; }
.bi-unit:not(.bi-inline) > p.en { margin-top: 2px; }
/* same tight leading for the other section-level h2 (closing CTA band titles), spacing of those bands unchanged */
section:not(.hero) h2 .bi-inline .zh { line-height: 1.3; }
section:not(.hero) h2 .bi-inline .en { line-height: 1.4; margin-top: 2px; }
/* title followed directly by running text (feature lists, FAQ) instead of a card edge: 12 px box gap so the first text line
   sits about as far below the title (~24 px) as a card edge does (20 px) */
h2.section-title:has(+ ul.bi-list), h2.section-title:has(+ .faq-list) { margin-bottom: 12px; }
/* title followed directly by a table (first visible line = header text inside the 12 px cell padding): 8 px box gap -> ~20-24 */
h2.section-title:has(+ table) { margin-bottom: 8px; }
@media (max-width: 720px) { h2.section-title:has(+ .milestones) { margin-bottom: 8px; } }

/* visual-memory note right under the old-site banner (user 07:35): the 00:41 title (14 px) + narrative (12 px / 18 px) in full,
   small, normal flow, same left edge as the banner; zh / en lines 2 px apart */
.brand-banner-note { margin: 10px 0 0; color: var(--muted); font-weight: 400; }
.brand-banner-note p { margin: 0; }
.brand-banner-note .zh, .brand-banner-note .en { display: block; }
.brand-banner-note .en { margin-top: 2px; }
.brand-banner-note .bbn-title .zh { font-size: 14px; line-height: 20px; font-weight: 600; color: var(--ink); }
.brand-banner-note .bbn-title .en { font-size: 13px; line-height: 18px; font-weight: 500; }
.brand-banner-note .bbn-text { margin-top: 6px; }
.brand-banner-note .bbn-text .zh, .brand-banner-note .bbn-text .en { font-size: 12px; line-height: 18px; }

/* technology spinning-line diagram (user 12:50): the five step names under the drawing as one compact row, "中文 / English" */
.proc-steps { display: flex; flex-wrap: wrap; gap: 6px 18px; margin: 10px 0 0; padding: 0; list-style: none; counter-reset: ps; font-size: 14px; line-height: 1.5; }
.proc-steps li { counter-increment: ps; }
.proc-steps li::before { content: counter(ps) ". "; color: var(--muted); }
.proc-steps .bi-inline > .zh::after { content: " /" / ""; font-weight: 400; opacity: .55; }
.proc-steps .bi-inline > .en { font-size: 13px; color: var(--muted); }

/* technology: two real close-ups under the spinning-line drawing (Codex 14:21) -- compact two columns, whole images at their
   own ratio, capped width; phones stack */
.proc-photos { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; max-width: 760px; margin: 18px 0 0; }
.proc-photos figure { margin: 0; }
.proc-photos img { display: block; width: 100%; height: auto; border-radius: 6px; border: 1px solid var(--border); }
.proc-photos figcaption { margin-top: 6px; font-size: 14px; line-height: 1.5; }
.proc-photos figcaption .bi-inline > .zh::after { content: " /" / ""; font-weight: 400; opacity: .55; }
.proc-photos figcaption .bi-inline > .en { font-size: 13px; color: var(--muted); }
@media (max-width: 560px) { .proc-photos { grid-template-columns: minmax(0, 1fr); } }
