/* G-Mart Grocery public site. Shared stylesheet for every page.
 * Tokens 1:1 with the previous index.html (Signal Green ramp).
 * Aesthetic family: clean retail, friendly local. Light theme, G-Mart green accent, 12px radius, system font stack.
 * Mobile first: base rules are the phone layout; desktop rules live in the min-width queries at the end.
 * z-index scale: gate 300, nav sheet 200, header 100, lightbox 350. No other z-index values.
 */
:root{
  --g-900:#03290f; --g-800:#005c1d; --g-700:#007e27; --g-600:#349745; --g-500:#6cb444; --g-200:#a9d88c;
  --g-50:#f0f8ea;
  --ink:#18181b; --dim-2:#71717a; --line:#e4e4e7; --paper:#ffffff; --bg:#fafafa;
  --mono:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  --r:12px;
  --hdr:60px;
  --ease-in:cubic-bezier(.16,1,.3,1);
  --ease-ui:cubic-bezier(.4,0,.2,1);
}
*{box-sizing:border-box}
html,body{margin:0}
html{scroll-padding-top:calc(var(--hdr) + 8px)}
/* Hide the page scrollbar on desktop browsers. Android Chrome already uses an overlay scrollbar.
 * The page still scrolls by touch, wheel, and keyboard. */
html{scrollbar-width:none}
html::-webkit-scrollbar{display:none}
body{
  font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Noto Sans","Noto Sans SC",sans-serif;
  background:var(--bg);color:var(--ink);font-size:16px;line-height:1.5;-webkit-font-smoothing:antialiased;
  min-height:100vh;min-height:100dvh;display:flex;flex-direction:column;
}
html[lang="zh"] body{font-family:"Noto Sans SC","PingFang SC","Microsoft YaHei",system-ui,sans-serif}
img{max-width:100%;height:auto;display:block}
a{color:inherit}
main{flex:1}
[hidden]{display:none!important}
.svg{width:22px;height:22px;stroke:currentColor;fill:none;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;flex:none}
.wrap{max-width:1100px;margin-inline:auto;padding-inline:16px}
h1,h2,h3{margin:0;letter-spacing:-.01em;line-height:1.15}
h2{font-size:22px;font-weight:700}
p{margin:0}
.hint{color:var(--dim-2);font-size:14px;margin-top:4px}
:focus-visible{outline:3px solid var(--g-500);outline-offset:2px}

/* Buttons. One radius, one height, three fills. */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:46px;padding:0 18px;border-radius:var(--r);font-weight:700;font-size:15px;text-decoration:none;border:0;cursor:pointer;white-space:nowrap;transition:transform .15s var(--ease-ui),background .15s var(--ease-ui)}
.btn:active{transform:translateY(1px)}
.btn-p{background:var(--g-600);color:#fff}
.btn-p:hover{background:var(--g-700)}
.btn-s{background:var(--paper);color:var(--g-700);border:1.5px solid var(--g-600)}
.btn-s:hover{background:var(--g-50)}
.btn-w{background:var(--paper);color:var(--g-800)}

/* Header: logo, name, language switch, menu button. Same on every page. */
.hdr{position:sticky;top:0;z-index:100;background:rgba(255,255,255,.94);backdrop-filter:blur(8px);border-bottom:1px solid var(--line)}
.hdr .wrap{display:flex;align-items:center;gap:10px;height:var(--hdr)}
.hdr .logo{display:flex;align-items:center;gap:10px;text-decoration:none;min-width:0}
.hdr .logo img{width:34px;height:34px;border-radius:9px}
.hdr .logo b{display:block;font-size:15px;line-height:1.1;white-space:nowrap}
.hdr .logo small{display:block;font-size:11px;color:var(--dim-2);text-transform:uppercase;letter-spacing:.06em}
.hdr nav{display:none}
.lsw{margin-left:auto;display:flex;border:1px solid var(--line);border-radius:999px;overflow:hidden;flex:none}
.lsw button{background:none;border:0;padding:6px 9px;font:600 12px system-ui,sans-serif;color:var(--dim-2);cursor:pointer}
.lsw button.on{background:var(--g-600);color:#fff}
.who{display:none!important;align-items:center;gap:6px;font-size:13px;color:var(--g-800);background:var(--g-50);border-radius:999px;padding:6px;flex:none}
.who .svg{width:16px;height:16px}
.who .n{display:none}
body.in .who{display:inline-flex}
.sheet .pn .me{font-size:14px;color:var(--g-800);padding:6px 12px 10px;font-weight:600}
.menu{width:40px;height:40px;border-radius:10px;border:1px solid var(--line);background:var(--paper);display:grid;place-items:center;cursor:pointer;color:var(--ink);flex:none}

/* Mobile nav sheet. Opens from the menu button; closes on link tap, backdrop tap, or Escape. */
.sheet{position:fixed;inset:0;z-index:200;display:none}
.sheet.open{display:block}
.sheet .bd{position:absolute;inset:0;background:rgba(3,41,15,.45)}
.sheet .pn{position:absolute;top:0;right:0;bottom:0;width:min(320px,86vw);background:var(--paper);padding:16px;display:flex;flex-direction:column;gap:6px;box-shadow:-12px 0 40px rgba(3,41,15,.2)}
.sheet .pn .close{align-self:flex-end;width:40px;height:40px;border-radius:10px;border:1px solid var(--line);background:var(--paper);cursor:pointer;color:var(--ink);display:grid;place-items:center}
.sheet .pn a{display:flex;align-items:center;gap:12px;padding:14px 12px;border-radius:var(--r);text-decoration:none;font-weight:700;font-size:17px}
.sheet .pn a:hover,.sheet .pn a[aria-current="page"]{background:var(--g-50);color:var(--g-800)}
.sheet .pn a .svg{color:var(--g-700)}
.sheet .pn .sp{flex:1}
.sheet .pn .acct{border-top:1px solid var(--line);padding-top:12px;display:flex;flex-direction:column;gap:8px}
@media (prefers-reduced-motion:no-preference){
  .sheet .pn{transform:translateX(100%);transition:transform .25s var(--ease-in)}
  .sheet.open .pn{transform:none}
}

/* Members-only pages: with no session, only the hero (card prompt) shows. While checking, nothing below the hero shows either.
 * Exception: a section with class pub is for everyone (New this week, 17 Oct 2026) and shows logged out too. */
body.out main > section:not(.hero):not(.pub),body.out .hero .in-only,body.checking main > section:not(.hero):not(.pub),body.checking .hero .in-only{display:none}
body.in .hero .out-only{display:none}
body.out footer [data-when="in"]{display:none}

/* Hero (variant A): headline left, the member's live card right. Logged out the card is greyed and locked. */
.hero{background:var(--paper);border-bottom:1px solid var(--line);padding-block:32px 36px}
.hero .wrap{display:grid;gap:24px}
.hero h1{font-size:clamp(30px,7vw,48px);font-weight:800;letter-spacing:-.02em;max-width:14ch}
.hero .sub{margin-top:12px;color:var(--dim-2);max-width:40ch}
.hero .ctas{display:flex;gap:10px;margin-top:22px;flex-wrap:wrap}
.hero .cardwrap{max-width:420px}
.hero .cardnote{margin-top:12px;font-size:13px;color:var(--dim-2);text-align:center}

/* The card face is the HQ template (assets/card.webp, 1632 x 841). Name, number, and barcode sit below the wave.
 * Same geometry as member.gmartgrocery.com so the card looks identical on both sites. */
.card{display:block;text-decoration:none;position:relative;aspect-ratio:1.9405/1;border-radius:15px;overflow:hidden;color:#fff;background:#00561b url(card.webp) center/100% 100% no-repeat;box-shadow:0 16px 40px rgba(0,126,39,.22)}
.card .cn{position:absolute;left:7.5%;top:52%;font-size:12px;line-height:1.1;font-weight:700;letter-spacing:.04em;text-transform:uppercase;max-width:48%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.card .cno{position:absolute;left:7.5%;top:60.5%;font-weight:700;font-family:var(--mono);font-size:12px;line-height:1.1;letter-spacing:.08em;color:#f0d78a;white-space:nowrap}
.card .cbar{position:absolute;left:5%;right:5%;bottom:5%;height:20%;background:#fff;border-radius:4px;padding:1% 2%;overflow:hidden}
.card .cbar svg{width:100%;height:100%;display:block}
.card .lock{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:rgba(3,41,15,.55)}
.card .lock .svg{width:36px;height:36px;color:#f0d78a}
body:not(.in) .card .cn,body:not(.in) .card .cno{opacity:.55;font-weight:400}
body:not(.in) .card .cbar{background:rgba(255,255,255,.35)}
body.in .card .lock{display:none}
@media (min-width:480px){.card .cn,.card .cno{font-size:14px}}
@media (min-width:768px){.card .cn,.card .cno{font-size:15px}}

/* Sections */
section{padding-block:40px}
section.tight{padding-top:0}
.mt{margin-top:20px}
.sec-h{display:flex;align-items:end;justify-content:space-between;gap:12px;margin-bottom:16px}
.sec-h a{font-size:14px;font-weight:600;color:var(--g-700);text-decoration:none;display:inline-flex;align-items:center;gap:4px;white-space:nowrap}
.sec-h a .svg{width:16px;height:16px}

/* Empty state for a section whose content has not arrived yet. */
.empty{border:1.5px dashed var(--g-200);background:var(--g-50);border-radius:var(--r);padding:24px 16px;text-align:center;color:var(--g-700);font-size:14px}
.empty .svg{width:28px;height:28px;margin:0 auto 8px}

/* Poster tile and lightbox, ready for the promo posters. */
.rail{display:flex;gap:12px;overflow-x:auto;scroll-snap-type:x mandatory;padding:4px 16px 12px;margin-inline:-16px;scrollbar-width:none}
.rail::-webkit-scrollbar{display:none}
.rail .poster{flex:0 0 72%;max-width:320px;scroll-snap-align:start}
.poster{position:relative;display:block;border-radius:var(--r);overflow:hidden;background:var(--paper);border:1px solid var(--line);text-decoration:none;color:inherit}
.poster img{width:100%;height:auto;aspect-ratio:1/1.41;object-fit:cover}
.poster figcaption{padding:10px 12px;font-size:14px;font-weight:600;border-top:1px solid var(--line)}
/* Poster viewer, variant B "ambient glow" with animation E "flip and shine" (Tun, 16 Oct 2026).
 * The page blurs and sinks into deep G-Mart green; a blurred copy of the poster (.amb) glows behind it,
 * so each promo tints the screen in its own colours. The blur and the poster ease in together.
 * Hidden with visibility, not display, so the open and close can animate. */
.lb{position:fixed;inset:0;z-index:350;display:grid;grid-template-columns:minmax(0,1fr);place-items:center;padding:16px;
  background:rgba(3,41,15,.55);-webkit-backdrop-filter:blur(0);backdrop-filter:blur(0);visibility:hidden;opacity:0;
  transition:opacity .32s var(--ease-ui),visibility 0s linear .32s,-webkit-backdrop-filter .32s var(--ease-ui),backdrop-filter .32s var(--ease-ui)}
.lb.open{visibility:visible;opacity:1;-webkit-backdrop-filter:blur(28px) saturate(140%) brightness(.8);backdrop-filter:blur(28px) saturate(140%) brightness(.8);
  transition:opacity .32s var(--ease-ui),visibility 0s,-webkit-backdrop-filter .32s var(--ease-ui),backdrop-filter .32s var(--ease-ui)}
/* The poster's own movement (the 3D flip, the light sweep, the shrink on close) runs from site.js,
 * because the close must start from wherever the flip is. Without JS animation support the poster just shows. */
.lb .stage{position:relative;margin:0;width:min(100%,420px)}
.lb .frame{position:relative;border-radius:14px;overflow:hidden;box-shadow:0 0 0 1px rgba(255,255,255,.14),0 40px 80px -20px rgba(0,0,0,.6);will-change:transform}
.lb .pic{width:100%;height:auto;max-height:76vh;max-height:76dvh;object-fit:contain}
.lb .shine{position:absolute;inset:0;pointer-events:none;background:linear-gradient(105deg,transparent 35%,rgba(255,255,255,.45) 50%,transparent 65%);transform:translateX(-120%)}
.lb .amb{position:absolute;inset:0;z-index:-1;width:100%;height:100%;object-fit:cover;filter:blur(60px) saturate(160%);transform:scale(1.25);opacity:0;transition:opacity .6s var(--ease-ui);pointer-events:none}
.lb.open .amb{opacity:.75}
.lb figcaption{margin-top:14px;text-align:center;color:#fff;opacity:0;transform:translateY(8px);transition:opacity .2s var(--ease-ui),transform .2s var(--ease-ui)}
.lb.open figcaption{opacity:1;transform:none;transition:opacity .32s var(--ease-in) .26s,transform .32s var(--ease-in) .26s}
.lb figcaption b{display:block;font-size:16px}
.lb figcaption small{font-size:13px;opacity:.75}
.lb .x{position:absolute;top:max(14px,env(safe-area-inset-top));right:14px;z-index:1;width:44px;height:44px;border-radius:999px;display:grid;place-items:center;cursor:pointer;color:#fff;
  background:rgba(255,255,255,.14);border:1px solid rgba(255,255,255,.25);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}
.lb .x .svg{width:20px;height:20px}
body.lbopen{overflow:hidden}
/* Browsers without backdrop-filter: a stronger solid green instead of the blur. */
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){.lb{background:rgba(3,41,15,.94)}}
@media (prefers-reduced-motion:reduce){.lb,.lb .amb,.lb figcaption{transition:none}}

/* Card tile */
.cardtile{display:flex;align-items:center;gap:14px;background:var(--g-700);color:#fff;border-radius:var(--r);padding:16px;text-decoration:none}
.cardtile .svg{width:28px;height:28px}
.cardtile b{display:block;font-size:16px}
.cardtile small{display:block;opacity:.85;font-size:13px}
.cardtile .go{margin-left:auto}

/* Outlet row */
.out-row{display:flex;align-items:center;gap:12px;padding:12px 0;border-bottom:1px solid var(--line)}
.out-row:last-child{border-bottom:0}
.out-row .t{flex:1;min-width:0}
.out-row b{display:block;font-size:15px}
.out-row small{display:block;font-size:13px;color:var(--dim-2)}
.out-row .acts{display:flex;gap:6px}
.out-row .acts a{width:40px;height:40px;border-radius:10px;border:1px solid var(--line);display:grid;place-items:center;color:var(--g-700);text-decoration:none}
.out-row .acts .svg{width:18px;height:18px}

/* Outlet accordion, grouped by town (variant A). */
details.town{border:1px solid var(--line);border-radius:var(--r);background:var(--paper);margin-bottom:8px}
details.town summary{list-style:none;cursor:pointer;padding:14px 16px;font-weight:700;display:flex;align-items:center;gap:8px}
details.town summary::-webkit-details-marker{display:none}
details.town summary .svg{margin-left:auto;width:18px;height:18px;transition:transform .2s var(--ease-ui)}
details.town[open] summary .svg{transform:rotate(90deg)}
details.town .body{padding:0 16px 8px}

/* Product tiles (New this week). Filled by site.js; a tile is a photo and a name, no link (Tun, 17 Oct 2026). */
.arr{display:grid;grid-template-columns:repeat(2,1fr);gap:12px}
.arr .tile{border-radius:var(--r);overflow:hidden;background:var(--paper);border:1px solid var(--line);text-decoration:none;color:inherit}
.arr .tile img{aspect-ratio:1;object-fit:cover;width:100%}
.arr .tile b{display:block;padding:8px 10px 0;font-size:14px}
.arr .tile b:last-child{padding-bottom:10px}
.arr .tile small{display:block;padding:0 10px 10px;color:var(--dim-2);font-size:13px}

/* Job posts (careers.html, 17 Oct 2026). One card per post; blank fields are left out by site.js. */
.jobs{display:grid;gap:12px}
.job{background:var(--paper);border:1px solid var(--line);border-radius:var(--r);padding:16px}
.job h2{font-size:18px}
.job .meta{display:flex;gap:6px;flex-wrap:wrap;margin-top:10px}
.chip{display:inline-flex;align-items:center;line-height:1;padding:6px 10px;border-radius:999px;font-size:13px;font-weight:600;background:var(--g-50);color:var(--g-800)}
.chip.dim{background:#f4f4f5;color:#3f3f46}
.job p{margin-top:10px;font-size:14px;color:#3f3f46;white-space:pre-line}
.job small{display:block;margin-top:10px;font-size:13px;color:var(--dim-2)}
.applybox{margin-top:20px}
.applybox p{color:var(--dim-2);font-size:14px}
.apply{display:flex;gap:10px;margin-top:12px;flex-wrap:wrap}
.apply .btn{flex:1 1 140px}

/* Contact rows (contact.html, 17 Oct 2026). Each row is a link: call, WhatsApp, or email. */
.clist{display:grid;gap:10px}
.crow{display:flex;align-items:center;gap:14px;background:var(--paper);border:1px solid var(--line);border-radius:var(--r);padding:14px 16px;text-decoration:none;color:inherit}
.crow:hover{background:var(--g-50)}
.crow .ic{width:44px;height:44px;border-radius:12px;background:var(--g-50);color:var(--g-700);display:grid;place-items:center;flex:none}
.crow .t{min-width:0}
.crow small{display:block;font-size:13px;color:var(--dim-2)}
.crow b{display:block;font-size:17px;overflow-wrap:anywhere}
@media (min-width:768px){.jobs{grid-template-columns:repeat(2,1fr)}.clist{grid-template-columns:repeat(3,1fr)}}

/* Dark band, used once per page at most. */
.band{background:var(--g-900);color:#fff;padding-block:48px}
.band h2{font-size:26px}
.band p{margin-top:12px;opacity:.9;max-width:52ch}
.band .btn{margin-top:20px}

/* Page header for inner pages (outlets, careers, contact). */
.ph{background:var(--paper);border-bottom:1px solid var(--line);padding-block:28px}
.ph h1{font-size:clamp(28px,6vw,40px);font-weight:800;letter-spacing:-.02em}
.ph p{margin-top:8px;color:var(--dim-2);max-width:50ch}

/* Footer. Same on every page. */
footer{border-top:1px solid var(--line);padding:24px 0 max(24px,env(safe-area-inset-bottom));font-size:13px;color:var(--dim-2)}
footer .wrap{display:flex;flex-wrap:wrap;gap:8px 20px;align-items:center}
footer a{text-decoration:none}
footer .cp{margin-left:auto;font-family:var(--mono);font-size:12px}

/* Reveal on scroll. Reason: draws the eye down the page in reading order. Off under reduced motion. */
.reveal{opacity:0;transform:translateY(20px);transition:opacity .55s var(--ease-in),transform .55s var(--ease-in);transition-delay:calc(var(--i,0)*60ms)}
.reveal.is-in{opacity:1;transform:none}
@media (prefers-reduced-motion:reduce){.reveal{opacity:1;transform:none;transition:none}}

/* Desktop */
@media (min-width:768px){
  .hero{padding-block:56px}
  .hero .wrap{grid-template-columns:1.1fr 1fr;align-items:center}
  .rail{display:grid;grid-template-columns:repeat(3,1fr);overflow:visible;margin:0;padding:0}
  .rail .poster{max-width:none}
  section{padding-block:56px}
  .ph{padding-block:44px}
  .arr{grid-template-columns:repeat(4,1fr)}
}
@media (min-width:1024px){
  .hdr nav{display:flex;gap:4px;margin-left:16px}
  .hdr nav a{padding:8px 12px;border-radius:8px;text-decoration:none;font-weight:600;font-size:14px;color:var(--ink);white-space:nowrap}
  .hdr nav a:hover,.hdr nav a[aria-current="page"]{background:var(--g-50);color:var(--g-800)}
  .menu{display:none}
  body.in .who{display:inline-flex!important;padding:6px 10px 6px 8px}
  .who .n{display:inline}
}

/* Logged-in and logged-out variants. Last so it wins over component display rules. */
body.in [data-when="out"],body:not(.in) [data-when="in"]{display:none}
