/* ============================================================================
   contact · page sheet, scoped to body.ctc

   One split above the fold with a six frame gallery on the left and a single
   scrolling information column on the right, the address and the opening
   hours stacked in that column as labelled blocks, a wide short Google map
   strip under them with an "Open in Google Maps" link, and a phone number
   that floats over the page as a pill you can copy plus a disc that dials.
   Nothing else on the page is a section.

   Type is the Phenome ladder: one family, four statement sizes and four
   inks (phenome-glass.css § 3), so a label is sentence case at 600 in the
   heading ink and the promise line is the only blue on a white page. That was
   settled for the whole store on 2026-09-16 when the capitals overline was
   retired, and this page is the first one drawn after it.

   Three traps from the shared sheets shape this file:
   - shared.css reveals `main > section > *` with a transform. The gallery track
     therefore moves on the independent `translate` property, which the reveal
     cannot overwrite, and the arrows and dots sit OUTSIDE that first child so
     a section that has not been revealed yet still has working controls.
   - phenome-glass.css forces `text-transform: none !important`, so capitals
     would have to be typed. None are.
   - tokens.json records `elevation YOK`. Nothing on the page lifts. The only
     shadows in this file are on the two floating controls, which have no
     ground of their own, and they use the system's own lift and press.
   ========================================================================= */

.ctc {
  --ctc-rule:  var(--divider, #203a8514);
  --ctc-edge:  var(--border-strong, #203a8529);
  --ctc-sunk:  var(--gl-tint-sunk, #f4f6fb);
  --ctc-ink:   var(--ph-tone-head, #10214b);
  --ctc-body:  var(--ph-tone-body, #4a5578);
  --ctc-quiet: var(--ph-tone-quiet, #8b93ad);
  --ctc-blue:  var(--phenome-blue-500, #203a85);
  --ctc-ease:  var(--ease-frosted-out, cubic-bezier(.16, 1, .3, 1));
  background: #fff;
}

/* ---------------------------------------------------------------------------
   1 · THE SPLIT

   The gallery and the information column share one row at equal width and
   the taller of the two sets the height. Both tracks are
   floored at zero: 1fr carries an automatic min-content minimum, and the map
   iframe plus one long address line would otherwise push the grid wider than
   the page.

   96px of top padding rather than the hero's 84: there is no eyebrow sitting
   on a grey wash here, the page opens on white, and the gallery's top edge
   needs the extra clearance from the 44px bar to read as a deliberate margin
   rather than as a near miss.
   ------------------------------------------------------------------------ */
.ctc-split-sec { padding: clamp(24px, 3vw, 48px) 0 clamp(64px, 7vw, 112px); }

.ctc-split {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  column-gap: clamp(32px, 4.4vw, 72px);
  align-items: start;
}

/* ---------------------------------------------------------------------------
   2 · THE GALLERY

   Six frames on a track, one visible, moved by `translate` alone. A crossfade
   was drawn first and thrown out: these are six views of the same building at
   the same colour temperature, and dissolving between them read as a fault in
   the image rather than as a change of frame.

   4 / 5 holds at every width, so the column never jumps height when
   a frame with a different intrinsic size arrives.
   ------------------------------------------------------------------------ */
/* The gallery is STICKY and the column beside it is not. Both columns could
   be loose if the right hand column were a few short blocks; ours carries
   the four doors, the address, the hours and the map, and at 1440 that
   is nearly twice the gallery's height. Left loose, the photographs scroll away
   in the first second and the reader spends the rest of the page beside an
   empty half.

   It takes TWO elements, and the reason is the one thing about sticky inside a
   grid that is not obvious: a sticky box travels inside its containing block,
   and for a grid item that block is its own grid area. Under `align-items:
   start` the item is not stretched, so its area is exactly its own height and
   there is nowhere to travel — which is what the first draft of this did, and
   it scrolled away like everything else. So `.ctc-gal` is the item, stretched
   to the full row, and the sticky box is the child inside it.

   Sticky is also safe under shared.css's reveal: that rule animates `transform`
   on this element's PARENT and lands on `transform: none`, which does not
   create a containing block, so the only window in which sticky is suspended is
   the 620ms of the reveal itself, before anything has scrolled. */
.ctc-gal { align-self: stretch; }
.ctc-gal-stick { position: sticky; top: calc(var(--ph-nav-h, 44px) + 24px); }
@media (max-width: 1080px) { .ctc-gal-stick { position: relative; top: auto; } }

.ctc-gal-frame {
  position: relative;
  /* `width: 100%` is not redundant next to `aspect-ratio`. With `width: auto`
     the ratio is free to resolve the box from EITHER axis, so `min-height`
     below turned into a min-WIDTH of 475px at 390 and pushed the whole page
     sideways. The width is stated, and the ratio then only ever decides the
     height. */
  width: 100%;
  aspect-ratio: 4 / 5;
  /* The frame is capped so that IT AND ITS CAPTION both fit on the screen the
     sticky column is pinned to: 116 above it BEFORE it pins (72 of section
     padding under the 44px bar), 36 of caption rail below it, and 98 of
     clearance under that, which is where the floating number sits. The unpinned
     figure is the one that has to be used — it is the larger, and it is the
     state the page opens in. Left uncapped, a 4/5 frame at this column width is
     741px tall and the caption runs under the pill. object-fit: cover absorbs the
     change in ratio, so nothing is distorted, only cropped. svh, not vh: on a
     phone browser vh is the height with the toolbars HIDDEN, which is not the
     height anything is being looked at. */
  max-height: calc(100svh - 170px);
  min-height: 380px;
  border-radius: var(--ph-r27, 27px);
  overflow: hidden;
  background: var(--ctc-sunk);
  /* The hairline is the pane boundary the glass layer gives every surface, not
     an elevation. A photograph that runs to a soft edge on a white page loses
     its corner radius at the top, where these interiors are almost white. */
  box-shadow: var(--gl-inner, inset 0 0 0 1px #10214b0f);
  touch-action: pan-y;
  cursor: grab;
}
.ctc-gal-frame:active { cursor: grabbing; }

.ctc-track {
  /* The list reset is load bearing, not housekeeping: a <ul> arrives with 40px
     of inline padding and 16px of block margin, and inside a flex track that
     pushes every frame off its own corner radius. */
  margin: 0; padding: 0; list-style: none;
  display: flex;
  height: 100%;
  translate: calc(var(--i, 0) * -100%) 0;
  transition: translate 620ms var(--ctc-ease);
}
.ctc-track > li {
  flex: 0 0 100%;
  list-style: none;
  height: 100%;
}
.ctc-track img {
  width: 100%; height: 100%;
  display: block;
  object-fit: cover;
  /* The frames are dragged, and a browser's own image drag would start a file
     drag halfway through the gesture and leave the track mid travel. */
  -webkit-user-drag: none; user-select: none;
}

/* The two arrows. Discs, not chevrons on the photograph: the interiors are
   pale and a bare chevron disappeared into three of the six frames. Same
   geometry as the site's floating tools (46px, 980px radius, the overlay tint
   over the blur) because that is what a control with no ground of its own
   already looks like on this site. */
.ctc-gal-btn {
  position: absolute; top: 50%; translate: 0 -50%;
  z-index: 2;
  width: 46px; height: 46px;
  display: grid; place-items: center;
  border: 0; border-radius: 980px;
  cursor: pointer;
  color: var(--ctc-blue);
  background: var(--gl-tint-overlay, #ffffffd6);
  -webkit-backdrop-filter: var(--gl-blur, blur(24px) saturate(140%));
  backdrop-filter: var(--gl-blur, blur(24px) saturate(140%));
  box-shadow: var(--gl-shadow-lift, 0 14px 34px -18px #4664a04d),
              var(--gl-inner, inset 0 0 0 1px #10214b0f);
  transition: opacity 220ms var(--ctc-ease), box-shadow 220ms var(--ctc-ease);
}
.ctc-gal-prev { left: 16px; }
.ctc-gal-next { right: 16px; }
.ctc-gal-btn svg { width: 18px; height: 18px; display: block; fill: none;
                   stroke: currentColor; stroke-width: 1.7;
                   stroke-linecap: round; stroke-linejoin: round; }
.ctc-gal-btn:active { box-shadow: var(--gl-shadow-press, 0 3px 9px -10px #4664a03d),
                                  var(--gl-inner, inset 0 0 0 1px #10214b0f); }
/* At the ends the arrow stays in the tab order and stays announced, it simply
   has nothing to travel to. Removing it would move the other arrow. */
.ctc-gal-btn[disabled] { opacity: .35; cursor: default; }

/* The dots sit UNDER the frame, centred: over the photograph they would need a
   scrim to stay legible. */
.ctc-gal-foot {
  display: flex; align-items: center; justify-content: center;
  margin-top: 16px;
}
.ctc-gal-dots { display: flex; gap: 8px; flex: 0 0 auto; }
.ctc-gal-dot {
  width: 7px; height: 7px; padding: 0;
  border: 0; border-radius: 980px;
  cursor: pointer;
  background: var(--phenome-blue-200, #a9b5d9);
  transition: background 220ms var(--ctc-ease), width 320ms var(--ctc-ease);
}
.ctc-gal-dot[aria-current="true"] { width: 26px; background: var(--ctc-blue); }

/* ---------------------------------------------------------------------------
   3 · THE INFORMATION COLUMN

   One column, no cards. The four ways to reach us were four grey cards in a
   two by two grid, which is the shape this site uses for four THINGS TO
   CHOOSE BETWEEN. These are not alternatives, they are one list of doors, and
   so they are set as a plain stack of labelled lines: a rule, a name, a line
   under it, and an arrow where the line is live.
   ------------------------------------------------------------------------ */
.ctc-col > :first-child { margin-top: 0; }

/* The page title takes the kit's two tone pair, sized for a column that has a
   gallery beside it rather than for a screen it owns: the same step the rest of
   the page's headings are written to, not the kit's 132px clamp.

   ONE LINE SINCE 2026-09-18, by request. The kit stacks the pair because its
   usual job is a section's whole argument over two lines; this title is four
   words. Both spans go inline at ONE size, so the held back blue and the ink
   sit shoulder to shoulder and the colour carries the emphasis on its own,
   which is the only thing the pair was ever for.

   `nowrap` is safe at every width because the clamp is cut from the column, not
   from the page: 3.4vw against a column that is a little under half the wrap
   means the sentence is always about two thirds of the space it has. */
.ctc-h1 {
  margin: 12px 0 0;
  font-size: clamp(30px, 3.4vw, 52px);
  white-space: nowrap;
}
.ctc-h1 > span { display: inline; }
/* "We're here to help." on one line, a step under the type pass's 80px.
   apple/type.css loads after this sheet and sizes every
   .ph-display with three classes, so this needs more to win. */
.ph-type .ctc-col .ctc-h1.ph-display.ph-display {
  font-size: clamp(30px, 5vw, 72px);
  white-space: nowrap;
}
.ctc-h1 .ph-display-lead { font-size: 1em; line-height: inherit; }
.ctc-title {
  margin: 12px 0 0;
  font-size: clamp(32px, 3.2vw, 48px); line-height: 1.04;
  font-weight: 600; letter-spacing: -0.02em;
  color: var(--ctc-ink);
  text-wrap: balance;
}
.ctc-lede {
  margin: 16px 0 0;
  max-width: 46ch;
  font-size: 17px; line-height: 1.55;
  color: var(--ctc-body);
}
/* An address inside a sentence is still the promise ink: it is the one live
   thing in the paragraph, and underlining it on rest would give a line of body
   copy a second texture it does not need. */
.ctc-lede a { color: var(--ctc-blue); font-weight: 600; text-decoration: none; }
.ctc-lede a:hover { text-decoration: underline; text-underline-offset: 3px; }

/* A block head. The ladder's four statement sizes are for whole sections, and
   "Reach us" is not a section, it is the name of a stack inside one. It takes
   the promise rung's size and weight in the HEADING ink, because the blue on a
   light page is reserved for the promise line and this is not one. */
.ctc-block { margin-top: clamp(28px, 2.6vw, 40px); }
.ctc-h {
  margin: 0 0 12px;
  font-size: clamp(21px, 1.7vw, 24px); line-height: 1.25;
  font-weight: 600; letter-spacing: -0.01em;
  color: var(--ctc-ink);
}

.ctc-rows { margin: 0; padding: 0; list-style: none; }
/* One line per door: name left, address right, arrow. Under 560px the address
   drops under the name. */
.ctc-row {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto auto;
  align-items: center;
  column-gap: 16px;
  padding: 14px 0;
  border-top: 1px solid var(--ctc-rule);
  text-decoration: none;
  color: inherit;
}
.ctc-rows > li:last-child .ctc-row { border-bottom: 1px solid var(--ctc-rule); }
.ctc-row-k {
  font-size: 17px; line-height: 22px; font-weight: 600;
  color: var(--ctc-ink);
  transition: color 180ms var(--ctc-ease);
}
.ctc-row-v {
  font-size: 16px; line-height: 22px;
  color: var(--ctc-body);
  text-align: right;
}
.ctc-row-go {
  width: 16px; height: 16px;
  color: #203a85;
  transition: color 180ms var(--ctc-ease), translate 180ms var(--ctc-ease);
}
.ctc-row-go svg { width: 100%; height: 100%; display: block; fill: none;
                  stroke: currentColor; stroke-width: 1.7;
                  stroke-linecap: round; stroke-linejoin: round; }
/* A door whose second line is a sentence: name over it, both left, the arrow
   held to the right of the pair. */
.ctc-row.is-stack {
  grid-template-columns: minmax(0, 1fr) auto;
  row-gap: 4px;
}
.ctc-row.is-stack .ctc-row-k { grid-column: 1; }
.ctc-row.is-stack .ctc-row-v { grid-column: 1; text-align: left; line-height: 1.5; }
.ctc-row.is-stack .ctc-row-go { grid-column: 2; grid-row: 1 / span 2; }
a.ctc-row:hover .ctc-row-k { color: var(--ctc-blue); }
a.ctc-row:hover .ctc-row-go { color: var(--ctc-blue); translate: 3px 0; }

/* The address and the hours. `.ctc-lines` is the address exactly as it would be
   written on an envelope, one line per line, rather than the slash joined run
   it used to be, and `.ctc-hours` is a name, the days, the times, and an italic note under it for the thing a reader would
   otherwise turn up and discover. */
.ctc-lines {
  margin: 0; font-style: normal;
  font-size: 17px; line-height: 27px;
  color: var(--ctc-body);
}
.ctc-lines a { color: inherit; text-decoration: none; }
.ctc-lines a:hover { color: var(--ctc-blue); }

/* Address left, the map link level with its last line on the right. */
.ctc-find {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  column-gap: 24px;
  align-items: end;
}
/* `.ctc-social` stood here: "Follow us" and four social names on one line. The
   block went from the markup on 2026-09-18, by request, because the footer on
   every page of this site already carries all four, and the rules went with it
   rather than being left behind styling nothing. */

/* ---- the map -----------------------------------------------------------
   A strip, not a square, and that ratio is the whole idea: it is not a map you
   navigate, it is the proof that the address above it is a real place, sized
   so it never competes with the column it ends. It runs a little taller than
   a pure strip because the column is narrow, so a shorter one would have
   cropped the pin and the road name off the same view.

   `loading="lazy"` on the iframe is not a nicety: a Google Maps embed is the
   heaviest thing on this page by an order of magnitude, and it sits below the
   fold on every width. ------------------------------------------------------ */
.ctc-map {
  margin-top: 18px;
  border-radius: var(--ph-r18, 18px);
  overflow: hidden;
  width: 100%;
  aspect-ratio: 4 / 1;
  min-height: 130px;
  background: var(--ctc-sunk);
  box-shadow: var(--gl-inner, inset 0 0 0 1px #10214b0f);
}
.ctc-map iframe { width: 100%; height: 100%; border: 0; display: block; }

.ctc-maplink {
  display: inline-flex; align-items: center; gap: 6px;
  margin-bottom: 3px;
  white-space: nowrap;
  font-size: 16px; line-height: 22px; font-weight: 600;
  color: var(--ctc-blue);
  text-decoration: none;
}
.ctc-maplink svg { width: 14px; height: 14px; fill: none; stroke: currentColor;
                   stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round;
                   transition: translate 180ms var(--ctc-ease); }
.ctc-maplink:hover { text-decoration: underline; text-underline-offset: 3px; }
.ctc-maplink:hover svg { translate: 2px -2px; }

/* The quiet line under a block (the two notes the design carries). */
.ctc-note {
  margin: 16px 0 0;
  font-size: 15px; line-height: 1.5;
  color: var(--ctc-quiet);
}

/* `.ctc-placeholder` stood here: the standing note that the details on this
   page were not real yet. Every detail on it now comes from
   phenomelongevity.com, so the note and its rule are gone rather than kept
   around unused. */

/* ---------------------------------------------------------------------------
   4 · THE MESSAGE FORM

   This section is drawn to the site's own rules. It was a dark band with four identical 48px inputs,
   one of which was a text input asking for a message and another a text input
   with a typed "▾" in its placeholder pretending to be a menu. Both are real
   controls now. The band is the sunken tint rather than navy: the contact
   page never goes dark, least of all at the one moment where somebody is
   being asked to type.
   ------------------------------------------------------------------------ */
.ctc-form-sec { background: var(--ctc-sunk); }

/* A SPLIT AGAIN, 2026-09-18, by request: words left, controls right.

   It was centred on one axis for a day, on the argument that a form is the one
   moment where a reader acts rather than reads. What that produced in practice
   was a 640px card under a 60px headline with a third of the page empty on
   either side, and an enquiry form is not a newsletter box — it carries six
   fields and a twenty eight item menu, and it is answering a question the
   heading beside it asks.

   1fr / 1.15fr, with the controls taking the wider half, because the text side
   is a heading and two short lines and the form side has to hold two fields
   abreast without eliding an address. The head is sticky on wide screens: the
   form runs taller than it does, and a heading that scrolls away leaves a
   column of unlabelled boxes.

   The two ledes stack rather than run together — one is the promise, one is the
   audience, and they are not the same sentence. */
.ctc-form-split {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1.15fr);
  gap: clamp(32px, 4vw, 72px);
  align-items: start;
  text-align: left;
}
/* Stays where it is while the form scrolls past. */
.ctc-form-head { position: static; }
/* The pair takes the Band's heading step rather than the kit's full display
   clamp: 132px beside a form is a headline with a coupon next to it. */
.ctc-form-h { font-size: clamp(32px, 3.6vw, 54px); }
.ctc-form-head .ctc-lede { margin: 18px 0 0; max-width: 42ch; }

.ctc-form {
  padding: clamp(24px, 2.6vw, 36px);
  background: #fff;
  border-radius: var(--ph-r21, 21px);
  box-shadow: var(--gl-inner, inset 0 0 0 1px #10214b0f);
}
.ctc-pair {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: 18px;
}
.ctc-field { display: block; margin-top: 18px; }
.ctc-pair > .ctc-field { margin-top: 0; }
.ctc-field > span {
  display: block;
  margin-bottom: 8px;
  font-size: 15px; line-height: 20px; font-weight: 600;
  color: var(--ctc-ink);
}
.ctc-field input,
.ctc-field select,
.ctc-field textarea {
  width: 100%;
  padding: 0 16px;
  height: 52px;
  font-family: inherit;
  font-size: 17px; line-height: 24px;
  color: var(--ctc-ink);
  background: #fff;
  border: 1px solid var(--ctc-edge);
  border-radius: var(--ph-r12, 12px);
  transition: border-color 180ms var(--ctc-ease);
}
.ctc-field textarea {
  height: auto; min-height: 148px;
  padding: 14px 16px;
  resize: vertical;
}
/* The one control that is not a box you type in gets the one chevron on the
   page, drawn rather than typed, so it cannot be mistaken for placeholder text
   the way the "▾" it replaces was. */
.ctc-field select {
  appearance: none;
  padding-right: 44px;
  background-image:
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1.5 6 6.5l5-5' fill='none' stroke='%23203a85' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 16px center;
  cursor: pointer;
}
.ctc-field input::placeholder,
.ctc-field textarea::placeholder { color: var(--ctc-quiet); }
.ctc-field input:hover,
.ctc-field select:hover,
.ctc-field textarea:hover { border-color: var(--phenome-blue-300, #7185bd); }

/* Inside the card the labels stay LEFT over their fields, and that is not an
   exception to the centring — it is what centring a form means. A label
   centred over a box the reader types left to right points at nothing, and a
   centred placeholder moves as they type. The card is on the centre line; its
   contents are aligned to the thing they describe. */
.ctc-form { text-align: left; }
/* The button starts where every label in the card starts. It was centred while
   the card was, which is the one alignment that made sense on a centre line and
   the wrong one inside a column a reader is filling top to bottom. */
.ctc-actions {
  display: flex; align-items: center; justify-content: flex-start;
  flex-wrap: wrap; gap: 16px;
  margin-top: 26px;
}
.ctc-actions .btn { min-width: 220px; justify-content: center; }
.ctc-sent {
  margin: 0;
  font-size: 16px; line-height: 22px; font-weight: 600;
  color: var(--ctc-blue);
}
.ctc-sent[hidden] { display: none; }

/* The captcha line. It is the smallest thing in the card and it is still 15px:
   the site has a type floor and legal small print does not get an exemption
   from it. Quiet ink, not a smaller size, is how it is held back. */
.ctc-legal {
  margin: 20px 0 0;
  font-size: 15px; line-height: 22px;
  color: var(--ctc-quiet);
}

/* ---------------------------------------------------------------------------
   5 · NARROWER SCREENS

   1080 is where the two columns stop being two readable measures rather than
   where any device is: below it the information column falls under the gallery
   and the gallery stops being a portrait, because a 4/5 frame at full width on
   a phone is taller than the screen and the address never gets seen.
   ------------------------------------------------------------------------ */
@media (max-width: 1080px) {
  .ctc-split { grid-template-columns: minmax(0, 1fr); row-gap: clamp(36px, 6vw, 56px); }
  .ctc-gal-frame { aspect-ratio: 4 / 3; }
  .ctc-map { aspect-ratio: 16 / 5; }
}
/* The form split folds before the gallery split does, at 900 rather than 1080:
   its right hand column is controls, and a 52px input in a 380px column is
   still a usable input where a photograph at that width is not a photograph.
   The sticky head is released with it, since there is nothing beside it to
   stay level with. */
@media (max-width: 900px) {
  .ctc-form-split { grid-template-columns: minmax(0, 1fr); row-gap: clamp(28px, 5vw, 40px); }
  .ctc-form-head { position: static; }
  .ctc-form-head .ctc-lede { max-width: 46ch; }
}
@media (max-width: 560px) {
  .ctc-row { grid-template-columns: minmax(0, 1fr) auto; row-gap: 2px; }
  .ctc-row-k { grid-column: 1; grid-row: 1; }
  .ctc-row-v { grid-column: 1; grid-row: 2; text-align: left; }
  .ctc-row-go { grid-column: 2; grid-row: 1 / span 2; }
  .ctc-find { grid-template-columns: minmax(0, 1fr); row-gap: 12px; }
  .ctc-maplink { justify-self: start; }
  /* The one title on the page that refuses to wrap has to be allowed to, once
     the column is narrower than the sentence at its floor size. */
  .ctc-h1 { white-space: normal; }
  .ctc-actions .btn { min-width: 100%; }
}
@media (max-width: 720px) {
  .ctc-pair { grid-template-columns: minmax(0, 1fr); }
  .ctc-gal-frame { aspect-ratio: 5 / 4; }
  .ctc-gal-btn { width: 40px; height: 40px; }
  .ctc-gal-prev { left: 10px; }
  .ctc-gal-next { right: 10px; }
}

@media (prefers-reduced-motion: reduce) {
  .ctc-track { transition: none; }
  .ctc-gal-dot, .ctc-row-go, .ctc-maplink svg { transition: none; }
}
