/* v4 homepage on top of v3 CSS: footprint card (the map beside five projects, 10/15),
   two-up specialist row, typographic working-together section, more air between sections */
.work-card--map{background:#142634}
.footprint__map{overflow:hidden;perspective:1600px;filter:none!important;background:radial-gradient(ellipse 80% 90% at 62% 42%,#13242f 0%,#0b151d 72%);-webkit-mask-image:radial-gradient(ellipse 78% 86% at 60% 48%,#000 58%,transparent 100%);mask-image:radial-gradient(ellipse 78% 86% at 60% 48%,#000 58%,transparent 100%)}
/* The plane overhangs the pane so its tilted top edge still reaches the corners; the tilt pivots
   where it did on the pane (50% 58%). footprint.js draws the camera through the SVG's viewBox. */
.footprint__plane{position:absolute;inset:-25% -15% -10%;transform:rotateX(30deg);transform-origin:50% 61.48%}
.footprint__canvas{position:absolute;inset:0;opacity:0;transition:opacity 1.4s ease}
.footprint__canvas.is-ready{opacity:1}
.footprint__canvas svg{display:block;width:100%;height:100%}
.footprint .map-land{fill:#1a3543;stroke:rgba(239,181,46,.5);stroke-width:.8}
.footprint .map-depth{fill:#03080b}
.footprint .map-depth--mid{fill:#09131a}
.footprint .dot{transition:opacity 1.4s ease}
.footprint .dot-core{fill:#ffe3a3;r:var(--core,1.8px)}
.footprint .dot-halo{fill:url(#glow);r:var(--halo,10px);transform-box:fill-box;transform-origin:center;animation:fp-breathe var(--t) ease-in-out calc(var(--d) * -1) infinite}
/* A region button lights its own dots; hovering previews, choosing also moves the camera */
.footprint[data-region=island]:not([data-hover]) .dot:not(.is-island),.footprint[data-hover=island] .dot:not(.is-island),
.footprint[data-region=kowloon]:not([data-hover]) .dot:not(.is-kowloon),.footprint[data-hover=kowloon] .dot:not(.is-kowloon),
.footprint[data-region=nt]:not([data-hover]) .dot:not(.is-nt),.footprint[data-hover=nt] .dot:not(.is-nt){opacity:.12}
.footprint .map-label{fill:rgba(246,245,239,.6);font-family:var(--sans);font-weight:500;font-size:var(--label,12px);letter-spacing:.24em;text-anchor:middle;opacity:0;transition:opacity .9s ease}
.footprint[data-view=island] .map-label.is-island,.footprint[data-view=kn] .map-label.is-kn,.footprint[data-view=all] .map-label.is-wide{opacity:1;transition-delay:1.2s}
/* landmark projects (10/13): a gold ring at the real location, with its name */
.footprint .landmark{transition:opacity .6s ease}
.footprint .lm-ring{r:var(--lm,6px);fill:rgba(12,22,30,.8);stroke:var(--gold);stroke-width:1.2px;vector-effect:non-scaling-stroke;transition:fill .4s ease}
.footprint .lm-core{r:var(--lmcore,2px);fill:var(--gold);transition:fill .4s ease}
.footprint .lm-label{fill:#f6f5ef;font-family:var(--sans);font-weight:500;font-size:var(--lmlabel,12px);letter-spacing:.04em;
  paint-order:stroke;stroke:rgba(9,17,24,.85);stroke-width:var(--lmhalo,3px);stroke-linejoin:round;transition:fill .4s ease}
.footprint.has-spot .landmark:not(.is-spot){opacity:.35}
.footprint.has-spot .dot{opacity:.45}
.footprint .landmark.is-spot .lm-ring{fill:var(--gold)}
.footprint .landmark.is-spot .lm-core{fill:#111e28}
.footprint .landmark.is-spot .lm-label{fill:var(--gold)}
/* The card (10/15, works-lab G3+): the map on the left, five projects as rows on the right. Pointing
   at a row opens it and marks its place; pressing it flies the map in (footprint.js). */
.fp-card__map{position:relative;overflow:hidden}
.fp-chips{position:absolute;left:36px;bottom:26px;z-index:2;display:flex;gap:8px}
/* no backdrop blur: the map moves under the buttons, and a blur behind them would be redone every frame */
html body .fp-chip{display:inline-flex;width:auto;padding:8px 16px;border:1px solid rgba(246,245,239,.22);border-radius:999px;background:rgba(14,24,32,.82);
  color:#f5f4ef;font:inherit;font-size:13px;letter-spacing:.06em;cursor:pointer;
  transition:border-color .3s ease,color .3s ease}
html body .fp-chip:is(:hover,[aria-pressed=true]){border-color:var(--gold);color:var(--gold)}
.fp-chip:focus-visible{outline:1px solid var(--gold);outline-offset:3px}
.fp-rows{display:flex;flex-direction:column;gap:12px;min-height:0;padding:10px}
html body .fp-row{position:relative;flex:1 1 0;min-height:0;padding:0;border:0;border-radius:8px;overflow:hidden;background:#0d1821;color:#f5f4ef;
  font:inherit;text-align:left;cursor:pointer;transition:flex-grow .8s cubic-bezier(.2,.7,.2,1)}
html body .fp-row.is-on{flex-grow:4.6}
.fp-row:focus-visible{outline:1px solid var(--gold);outline-offset:3px}
.fp-row img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;filter:saturate(.45) brightness(.42);transition:filter .6s ease}
.fp-row.is-on img{filter:none}
.fp-row:not(.is-on):hover img{filter:saturate(.7) brightness(.6)}
.fp-row__no,.fp-row__name,.fp-row__aside{position:absolute;top:50%;translate:0 -50%;white-space:nowrap;transition:opacity .4s ease}
.fp-row__no{left:24px;font-family:var(--mono,ui-monospace,monospace);font-size:11px}
.fp-row__name{left:64px;font-family:var(--serif);font-size:19px;line-height:1;letter-spacing:.06em}
html[lang=en] .fp-row__name{font-size:18px;letter-spacing:.02em}
.fp-row__aside{right:24px;font-size:12px;letter-spacing:.08em;color:#aeb7c2}
.fp-row.is-on :is(.fp-row__no,.fp-row__name,.fp-row__aside){opacity:0}
.fp-row__cap{position:absolute;left:0;right:0;bottom:0;display:flex;flex-direction:column;gap:3px;padding:56px 20px 16px;white-space:nowrap;
  background:linear-gradient(transparent,rgba(8,14,20,.62) 45%,rgba(8,14,20,.9));opacity:0;transition:opacity .5s ease .2s}
.fp-row.is-on .fp-row__cap{opacity:1}
.fp-row__kind{font-size:11px;letter-spacing:.14em;color:var(--gold)}
.fp-row__title{font-family:var(--serif);font-size:22px;color:#fff}
.fp-row__place{font-size:12px;letter-spacing:.06em;color:#c9d0d6}
@media(min-width:901px){
  html body .fp-card.work-card{height:600px;display:grid;grid-template-columns:minmax(0,7fr) minmax(0,5fr)}
  .fp-card .work-card__top{inset:28px 36px auto}
}
.fp-card .work-card__top span{font-size:12px}  /* v3's 10px label was below the site's reading floor */
/* phones and tablets (v3 stacks the card under 900px): the map stays under the header while the
   rows scroll past, so a tap is seen to move it; the card and v3's track must not be scroll
   containers for sticky to work */
@media(max-width:900px){
  .fp-card{display:flex;flex-direction:column}
  .fp-card__map{position:sticky;top:68px;z-index:3;background:var(--v4-card)}
  .fp-chips{position:static;flex-wrap:wrap;padding:14px 20px 4px}
  .fp-rows{height:600px}
  .fp-row__no{left:18px}
  .fp-row__name{left:56px;font-size:17px}
  .footprint .work-track{overflow:visible}
  html body .fp-card.work-card{overflow:clip}
}
@keyframes fp-breathe{0%,100%{opacity:.35;transform:scale(.8)}50%{opacity:1;transform:scale(1.15)}}
@media (prefers-reduced-motion:reduce){
  .footprint__canvas,.footprint .dot,.footprint .map-label,.fp-row,.fp-row *{transition:none}
  .footprint .dot-halo{animation:none;opacity:.8}
}
@media (min-width:851px){.specialist-scenes--two{grid-template-columns:repeat(2,minmax(0,1fr))}}
/* 10/16: the second row of services (IT security, frontier technology, bespoke) as cards: the photo
   above, clear of any overlay, the icon, name, title, a line and the link below */
.svc-cards{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:24px;margin-top:24px}
.svc-card{display:flex;flex-direction:column;border-radius:12px;overflow:hidden;background:var(--v4-card);box-shadow:inset 0 0 0 1px var(--v4-line);
  color:inherit;text-decoration:none;transition:box-shadow .5s ease}
.svc-card:focus-visible{outline:1px solid var(--gold);outline-offset:4px}
.svc-card__media{margin:0;aspect-ratio:16/10;overflow:hidden;background:#0d1821}
.svc-card__media img{display:block;width:100%;height:100%;object-fit:cover;transition:scale 1.6s var(--ucs-entry-ease,ease)}
.svc-card:hover .svc-card__media img{scale:1.03}
.svc-card__body{display:flex;flex-direction:column;flex:1;padding:28px 30px 30px}
.svc-card__top{display:flex;align-items:center;gap:12px;margin-bottom:18px}
html body .svc-card .ucs-icon{flex:none;width:24px;height:24px;margin:0;color:var(--gold)}
html body .svc-card .eyebrow{margin:0;color:var(--gold)}
html body .svc-card h3{margin:0;font-size:clamp(24px,2vw,28px);line-height:1.4;color:#f5f4ef}
html body .svc-card p:not(.eyebrow){margin:12px 0 0;font-size:15px;line-height:1.8;color:#aeb7c2}
.svc-card__link{display:flex;align-items:center;justify-content:space-between;margin-top:auto;padding-top:28px;color:var(--gold);font-size:14px;letter-spacing:.04em}
.svc-card__link i{display:grid;place-items:center;width:34px;height:34px;border-radius:50%;box-shadow:inset 0 0 0 1px rgba(246,245,239,.25);
  font-style:normal;color:#f5f4ef;transition:background-color .4s ease,color .4s ease,box-shadow .4s ease}
.svc-card:hover .svc-card__link i{background:var(--gold);color:#111e28;box-shadow:none}
@media (max-width:1000px){.svc-card__body{padding:24px}}
@media (max-width:850px){.svc-cards{grid-template-columns:1fr;gap:16px}}

/* Space and scale: sections about a third more air, larger and lighter headings */
body.page-index main>.section:not(.final-invitation){padding-block:clamp(48px,5vw,76px)}
body.page-index main .section-head h2{font-size:clamp(34px,3.4vw,50px);line-height:1.3}

/* Working together (10/16, from v4b): three cards in a double bezel (an outer shell with a hairline,
   an inner core with its own top highlight), each with its number and an icon. They were set at
   angles and overlapping at first; the user found the overlap and the layered shadows did not work,
   so they now stand level, side by side. */
.process-quiet{background:#122029}
.process-quiet .eyebrow{color:var(--gold)}
.process-quiet__steps{list-style:none;margin:56px 0 0;padding:0;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:24px}
html body .process-quiet__card{margin:0;padding:8px;border-radius:2rem;background:rgba(255,255,255,.035);box-shadow:inset 0 0 0 1px rgba(255,255,255,.08);
  transition:box-shadow .5s ease}
.process-quiet__core{height:100%;min-height:340px;padding:40px clamp(28px,3vw,40px) 44px;border-radius:calc(2rem - 8px);
  background:linear-gradient(160deg,#1e313e,#152530 70%);box-shadow:inset 0 1px 1px rgba(255,255,255,.09)}
.process-quiet__top{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:64px}
.process-quiet__num{display:block;font-size:clamp(64px,6vw,96px);font-weight:400;line-height:1;letter-spacing:-.03em;color:#dcbb78;font-variant-numeric:tabular-nums}
html body .process-quiet__num{font-family:var(--serif)!important}  /* v3's brand-type sets every span in the sans with !important */
html body .process-quiet .ucs-icon{flex:none;width:34px;height:34px;margin:6px 0 0;color:var(--gold)}
.process-quiet h3{margin:0;font-size:clamp(24px,2vw,30px);line-height:1.35}
.process-quiet p{max-width:30ch;margin:14px 0 0;font-size:16px;line-height:1.8;color:#c2c9d0}
@media (max-width:850px){
  .process-quiet__steps{grid-template-columns:1fr;gap:16px;margin-top:40px}
  .process-quiet__core{min-height:0}
  .process-quiet__top{margin-bottom:36px}
}

/* Hero credentials: moved left under the copy, larger and brighter */
body.page-index .opening-cinema__bottom{justify-content:flex-start}
body.page-index .opening-credentials{gap:clamp(40px,5vw,80px);padding-top:24px;border-top:1px solid rgba(239,181,46,.55)}
body.page-index .opening-credentials strong{font-family:var(--serif);font-size:clamp(40px,4.2vw,64px);font-weight:400;line-height:1;letter-spacing:-.02em;color:#fff}
body.page-index .opening-credentials strong span{color:var(--gold)}
body.page-index .opening-credentials strong small{margin-right:8px;font-family:var(--sans);font-size:12px;letter-spacing:.22em;color:var(--gold);vertical-align:.9em}
body.page-index .opening-credentials p{margin-top:12px;font-size:14px;letter-spacing:.04em;color:#e3e7ec}

/* Working together, 10/21 (user): a line icon for each step at the right of the number (build_site
   STEP_ICONS). The line drawings across the top of the cards before it looked crude on a phone. */
.process-quiet__icon{flex:none;width:64px;height:64px;margin-top:8px}

/* Phones (10/21, user: 「手機版有些問題，未對齊」): 2013 sat a line below 250+, since SINCE took the first line
   of a 135px column; and the gold rule hung 25px under the grey one, which on wider screens it covers */
@media (max-width:650px){
  .process-quiet__icon{width:56px;height:56px;margin-top:4px}
  body.page-index .opening-cinema__bottom{padding-top:0}
  body.page-index .opening-credentials{flex:1;gap:40px}
  body.page-index .opening-credentials strong{white-space:nowrap}
}
