/* TWO POP site. Black always; the seven SMPTE colours of the logo's fan are the only accents. */
:root {
  --bg: #0a0a0a; --panel: #141414; --line: #262626; --ink: #f2f1ec; --dim: #a3a29c; --faint: #6d6c67;
  --grey: #dadada; --yellow: #fdd304; --cyan: #0ab9d1; --green: #0b9f3a; --magenta: #e5157a; --red: #e3141e; --blue: #0749aa;
  --display: "Roboto Condensed", "Arial Narrow", "Helvetica Neue", sans-serif;
  --body: "Roboto", "Helvetica Neue", Arial, sans-serif;
  --mono: "JetBrains Mono", ui-monospace, Menlo, monospace;
  color-scheme: dark;
}
* { box-sizing: border-box; }
html { background: var(--bg); }
body { margin: 0; background: var(--bg); color: var(--ink); font: 17px/1.55 var(--body); }
a { color: inherit; }
img, video { max-width: 100%; display: block; }
.wrap { max-width: 1120px; margin: 0 auto; padding-inline: max(20px, env(safe-area-inset-left, 0px)); }

/* the bar of seven colours, used as a rule */
.bars { display: flex; height: 6px; }
.bars i { flex: 1; }
.bars i:nth-child(1) { background: var(--grey); } .bars i:nth-child(2) { background: var(--yellow); }
.bars i:nth-child(3) { background: var(--cyan); } .bars i:nth-child(4) { background: var(--green); }
.bars i:nth-child(5) { background: var(--magenta); } .bars i:nth-child(6) { background: var(--red); }
.bars i:nth-child(7) { background: var(--blue); }
/* the thin strip under the header, from look B (Nate, 2026-10-21: "put the Cinti colors at the top from B onto ... all three of A") */
.bars.strip { height: 4px; }

/* header */
header.site { position: sticky; top: 0; z-index: 10; background: rgba(10,10,10,.92); backdrop-filter: blur(8px); border-bottom: 1px solid var(--line); }
/* logo left, the three links in the middle, a small Sign in on the right */
header.site .wrap { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; height: 72px; }
header.site .logo img { height: 30px; width: auto; }
header.site nav { display: flex; gap: 40px; font: 700 19px/1 var(--display); letter-spacing: .09em; text-transform: uppercase; }
header.site nav a { text-decoration: none; color: var(--dim); }
header.site nav a:hover, header.site nav a[aria-current] { color: var(--ink); }
header.site .right { justify-self: end; display: flex; gap: 10px; align-items: center; }
header.site .signin { padding: 8px 12px; font-size: 13px; }
.menu { display: none; margin-left: auto; background: none; border: 1px solid var(--line); color: var(--ink); font: 600 14px var(--display); letter-spacing: .08em; padding: 8px 12px; border-radius: 6px; }
@media (max-width: 760px) {
  header.site .wrap { grid-template-columns: 1fr auto; height: 64px; }
  .menu { display: block; }
  header.site nav { display: none; position: absolute; top: 64px; left: 0; right: 0; flex-direction: column; gap: 0; background: var(--bg); border-bottom: 1px solid var(--line); font-size: 17px; }
  header.site nav a { padding: 16px max(20px, env(safe-area-inset-left, 0px)); border-top: 1px solid var(--line); }
  header.site.open nav { display: flex; }
}


/* type */
h1, h2, h3 { font-family: var(--display); font-weight: 800; line-height: 1.02; letter-spacing: .01em; text-transform: uppercase; margin: 0; text-wrap: balance; }
h1 { font-size: clamp(44px, 7vw, 88px); }
h2 { font-size: clamp(32px, 4.4vw, 52px); }
h3 { font-size: 26px; }
.kicker { font: 600 14px/1 var(--display); letter-spacing: .16em; text-transform: uppercase; color: var(--dim); margin: 0 0 14px; }
.lede { font-size: 20px; color: var(--dim); max-width: 60ch; }
.mono { font-family: var(--mono); font-size: 14px; }
section { padding-block: 72px; }
section + section { border-top: 1px solid var(--line); }

/* buttons */
.btn { display: inline-flex; align-items: center; gap: 8px; background: var(--ink); color: var(--bg); text-decoration: none; border: 0; border-radius: 6px; padding: 12px 18px; font: 700 16px/1 var(--display); letter-spacing: .08em; text-transform: uppercase; cursor: pointer; }
.btn.ghost { background: none; color: var(--ink); border: 1px solid var(--line); }
.btn[disabled] { opacity: .5; cursor: not-allowed; }
.row { display: flex; flex-wrap: wrap; gap: 12px; align-items: center; }

/* placeholder marker: everything not real yet says so; every missing picture is the same striped .thumb.empty */
.ph { display: inline-block; font: 600 11px/1 var(--mono); letter-spacing: .06em; text-transform: uppercase; color: var(--yellow); border: 1px dashed var(--yellow); border-radius: 4px; padding: 4px 6px; vertical-align: middle; }
.thumb { width: 100%; aspect-ratio: 16/9; object-fit: cover; border-radius: 8px; background: #000; }
.thumb.face { aspect-ratio: 1; object-position: 50% 18%; width: 160px; max-width: 100%; }   /* small: "photos are too big" (Nate, 2026-10-27) */   /* coach headshots are portrait: a square, faces up top */
.thumb.square { aspect-ratio: 1; }   /* a picture shown square, like the brand photo */
.thumb.empty { display: grid; place-items: center; background: repeating-linear-gradient(135deg, #141414 0 14px, #181818 14px 28px); border: 1px dashed #3a3a3a; color: var(--faint); text-align: center; padding: 12px; }
.thumb.empty b { display: block; font: 700 20px/1.1 var(--display); letter-spacing: .06em; text-transform: uppercase; color: var(--dim); margin-bottom: 8px; }

/* hero: the see-through intro runs the full width; once the bars have collapsed, the words come up under the logo */
.hero { padding-block: 0 40px; }
.hero .stage { position: relative; max-width: 1600px; margin: 0 auto; }
.hero video { width: 100%; aspect-ratio: 16/9; display: block; }
.hero .over { position: absolute; left: 0; right: 0; bottom: 4%; text-align: center; opacity: 0; transform: translateY(8px); transition: opacity .8s ease, transform .8s ease; }
.hero.settled .over { opacity: 1; transform: none; }
.hero .tag { margin: 0 0 6px; font: 700 clamp(20px, 2.4vw, 30px)/1.1 var(--display); letter-spacing: .1em; text-transform: uppercase; }
.hero .lede { margin: 0 auto; font-size: clamp(15px, 1.4vw, 18px); max-width: 56ch; }
.hero .sound { position: absolute; right: max(16px, 2%); bottom: max(16px, 4%); width: 40px; height: 40px; border-radius: 50%; border: 1px solid #3a3a3a; background: rgba(10,10,10,.6); color: var(--dim); display: grid; place-items: center; cursor: pointer; padding: 0; }
.hero .sound:hover { color: var(--ink); border-color: #666; }
.hero .sound svg { width: 20px; height: 20px; }
.hero .sound .on, .hero .sound.is-on .off { display: none; }
.hero .sound.is-on .on { display: inline; }
.hero > .note { margin-top: 8px; }
/* on a phone the frame is too short to hold the words, so they sit under it */
@media (max-width: 760px) {
  .hero .over { position: static; opacity: 1; transform: none; padding-top: 8px; }
  .hero .sound { bottom: auto; top: 8px; right: 8px; width: 34px; height: 34px; }
}

/* cards */
.grid { display: grid; gap: 16px; grid-template-columns: repeat(auto-fit, minmax(min(100%, 300px), 1fr)); }
.card { background: var(--panel); border: 1px solid var(--line); border-radius: 10px; padding: 24px; display: flex; flex-direction: column; gap: 12px; text-decoration: none; min-width: 0; }
a.card:hover { border-color: #444; }
.card p { margin: 0; color: var(--dim); }
.card .top { height: 4px; border-radius: 2px; margin: -24px -24px 8px; border-radius: 10px 10px 0 0; }
.door { min-height: 260px; justify-content: flex-end; }
.grid.wide { grid-template-columns: repeat(auto-fill, minmax(min(100%, 440px), 1fr)); gap: 24px; }
.grid.three { grid-template-columns: repeat(auto-fill, minmax(min(100%, 300px), 1fr)); gap: 24px; }
.sec-head { display: grid; gap: 10px; margin-bottom: 40px; }
.sec-head .sub { font: 700 22px/1.15 var(--display); letter-spacing: .03em; text-transform: uppercase; color: var(--dim); margin: 0; }
.sec-head .lede { margin: 6px 0 0; }
.card.big { padding: 0; overflow: hidden; gap: 0; }
.card.big .thumb { border-radius: 0; }
.card.big .body { padding: 24px; display: flex; flex-direction: column; gap: 10px; }
.card.big .top { margin: -24px -24px 8px; border-radius: 0; }
.card.big h3 { font-size: 34px; }
.card .from { color: var(--ink); font: 700 20px var(--display); letter-spacing: .04em; margin-top: auto; }
.wordmark { height: clamp(60px, 9vw, 110px); width: auto; }
.card.big h2 { font-size: clamp(32px, 4vw, 48px); }
/* small upright cards for "New from Sport Lab" */
.grid.tall { grid-template-columns: repeat(auto-fill, minmax(min(100%, 230px), 280px)); gap: 20px; }
.card.v { padding: 0; overflow: hidden; gap: 0; }
.card.v .thumb { border-radius: 0; }
.card.v .body { padding: 16px 18px 20px; display: flex; flex-direction: column; gap: 6px; }
.card.v .kicker { margin: 0; font-size: 12px; }
.card.v h3 { font-size: 24px; }
.card.v p { font-size: 15px; }
/* about */
.wordmark.big { height: clamp(90px, 14vw, 170px); }
.about h1 { margin-bottom: 32px; }
.split { display: grid; grid-template-columns: 1.1fr 1fr; gap: 40px; align-items: center; margin-bottom: 40px; }
.split > * { min-width: 0; }
.grid.sides { margin-bottom: 32px; }
@media (max-width: 760px) { .split { grid-template-columns: 1fr; } }
/* a partner: a short wide card, small picture on the left */
.card.partner { flex-direction: row; align-items: center; gap: 20px; padding: 14px; max-width: 720px; }
.card.partner .thumb { width: 180px; flex: none; }
.card.partner h3 { font-size: 24px; }
.card.partner .kicker { margin: 4px 0 8px; font-size: 12px; }
.card.partner p { font-size: 15px; }
.card.partner .link { color: var(--ink); margin-top: 8px; font: 700 15px var(--display); letter-spacing: .04em; }
@media (max-width: 560px) { .card.partner { flex-direction: column; align-items: stretch; } .card.partner .thumb { width: 100%; } }

/* video list */
.videos { list-style: none; margin: 0; padding: 0; border-top: 1px solid var(--line); }
.videos li { display: grid; grid-template-columns: 200px 1fr auto auto; gap: 20px; align-items: center; padding: 16px 0; border-bottom: 1px solid var(--line); }
.videos .thumb.empty b { font-size: 15px; margin-bottom: 4px; }
.videos .n { font: 800 22px var(--display); color: var(--faint); margin-right: 10px; }
.videos .t { font: 700 22px/1.1 var(--display); text-transform: uppercase; letter-spacing: .02em; }
.videos .s { color: var(--dim); font-size: 15px; }
.videos .len { font-family: var(--mono); font-size: 14px; color: var(--dim); }
@media (max-width: 600px) { .videos li { grid-template-columns: 120px 1fr; } .videos .len, .videos .btn { grid-column: 2; justify-self: start; } }

.price { font: 800 44px/1 var(--display); }
.price small { font: 400 15px var(--body); color: var(--dim); }

/* tables */
.tablewrap { overflow-x: auto; }
table { width: 100%; border-collapse: collapse; }
th, td { text-align: left; padding: 14px 12px 14px 0; border-bottom: 1px solid var(--line); vertical-align: top; }
th { font: 600 13px var(--display); letter-spacing: .12em; text-transform: uppercase; color: var(--dim); }
td.num { font: 700 22px var(--display); white-space: nowrap; }

/* forms */
[hidden] { display: none !important; }
form { display: grid; gap: 14px; max-width: 440px; }
label { display: grid; gap: 6px; font: 600 14px var(--display); letter-spacing: .1em; text-transform: uppercase; color: var(--dim); }
input, textarea, select { font: 17px var(--body); color: var(--ink); background: var(--panel); border: 1px solid var(--line); border-radius: 6px; padding: 12px; }
input:focus, textarea:focus { outline: 2px solid var(--cyan); outline-offset: 1px; }
.or { display: flex; align-items: center; gap: 12px; color: var(--faint); font: 600 13px var(--display); letter-spacing: .12em; }
.or::before, .or::after { content: ""; flex: 1; height: 1px; background: var(--line); }
.note { color: var(--faint); font-size: 14px; }
.linkbtn { background: none; border: 0; padding: 0; font: inherit; color: var(--ink); text-decoration: underline; cursor: pointer; }

/* prose */
.prose { max-width: 68ch; }
.prose h2 { font-size: 30px; margin: 40px 0 10px; }
.prose p, .prose li { color: var(--dim); }

/* footer */
footer.site { border-top: 1px solid var(--line); padding-block: 40px; color: var(--faint); font-size: 14px; }
footer.site .wrap { display: flex; flex-wrap: wrap; gap: 16px 28px; align-items: center; }
footer.site a { color: var(--dim); text-decoration: none; }
footer.site .sp { margin-left: auto; }

/* portfolio videos: the card picture is a play button; the video opens over the page */
.play { position: relative; display: block; width: 100%; padding: 0; border: 0; background: none; cursor: pointer; color: inherit; }
.play .pb { position: absolute; left: 50%; top: 50%; width: 64px; height: 64px; margin: -32px 0 0 -32px; border-radius: 50%; background: rgba(0,0,0,.55); border: 2px solid rgba(255,255,255,.85); transition: background .15s; }
.play .pb::after { content: ""; position: absolute; left: 24px; top: 18px; border-style: solid; border-width: 12px 0 12px 20px; border-color: transparent transparent transparent #fff; }
.play:hover .pb, .play:focus-visible .pb { background: rgba(0,0,0,.8); }
.lightbox { position: fixed; inset: 0; z-index: 100; background: rgba(0,0,0,.92); display: grid; place-items: center; padding: max(16px, env(safe-area-inset-top, 0px)) 16px; }
.lightbox video { max-width: 100%; max-height: calc(100vh - 96px); width: auto; height: auto; border-radius: 8px; background: #000; }
.lightbox .x { position: absolute; top: calc(12px + env(safe-area-inset-top, 0px)); right: 16px; font: 600 15px var(--body, sans-serif); color: #fff; background: rgba(255,255,255,.12); border: 0; border-radius: 6px; padding: 8px 14px; cursor: pointer; }

/* reviews: a client's words, then their name and what we made for them (Nate, 2026-10-22) */
.quote { margin: 0; }
.quote blockquote { margin: 0; font: 600 22px/1.35 var(--display); letter-spacing: .01em; }
.quote blockquote::before { content: "\201C"; display: block; font: 800 64px/.55 var(--display); color: var(--yellow); margin-bottom: 6px; }
.quote figcaption { display: flex; flex-direction: column; gap: 2px; margin-top: auto; padding-top: 14px; border-top: 1px solid var(--line); }
.quote figcaption span { color: var(--dim); font-size: 15px; }
.reviews-cta { margin-top: 28px; align-items: center; }

/* More: a menu of extra pages under one word in the header (Nate, 2026-10-22); on a phone its links sit in the menu list */
.more { position: relative; }
.more-btn { all: unset; cursor: pointer; color: var(--dim); }
.more-btn::after { content: " \25BE"; }
.more-btn:hover, .more-btn:focus-visible, .more.current .more-btn { color: var(--ink); }
.more .drop { display: none; position: absolute; top: calc(100% + 20px); left: 50%; transform: translateX(-50%); min-width: 230px;
  flex-direction: column; background: var(--panel); border: 1px solid var(--line); border-radius: 8px; padding: 6px 0; }
.more .drop::before { content: ""; position: absolute; left: 0; right: 0; top: -22px; height: 22px; }
.more .drop a { padding: 13px 20px; white-space: nowrap; }
.more:hover .drop, .more:focus-within .drop, .more.open .drop { display: flex; }
@media (max-width: 760px) {
  .more-btn { display: none; }
  .more .drop { display: flex; position: static; transform: none; min-width: 0; background: none; border: 0; border-radius: 0; padding: 0; }
  .more .drop::before { content: none; }
}

/* back to top: phones only, after a screen of scrolling */
.to-top { display: none; }
@media (max-width: 760px) {
  .to-top { display: grid; place-items: center; position: fixed; z-index: 40; width: 48px; height: 48px; border-radius: 50%;
    right: max(16px, env(safe-area-inset-right, 0px)); bottom: calc(16px + env(safe-area-inset-bottom, 0px));
    background: var(--panel); border: 1px solid var(--line); color: var(--ink); font: 700 22px/1 var(--display);
    opacity: 0; pointer-events: none; transition: opacity .2s; }
  .to-top.show { opacity: .92; pointer-events: auto; }
}

/* gift pop-up (series page) and the gift page's send form: a set of choices in a box */
.gw { border: 1px solid var(--line); border-radius: 6px; padding: 10px 14px; display: grid; gap: 8px; margin: 0; }
.gw legend { font: 600 14px var(--display); letter-spacing: .1em; text-transform: uppercase; color: var(--dim); }
.gw .r { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; text-transform: none; letter-spacing: 0; color: var(--ink); font: 16px var(--body); }
.gw input[type=radio] { margin: 0; padding: 0; }
.gw input[type=date], .gw input[type=time], .gw select { width: auto; max-width: 100%; padding: 4px 8px; font-size: 15px; line-height: 1.2; }
.gw .tzr { color: var(--dim); font-size: 15px; }
#giftdlg { width: min(520px, calc(100% - 32px)); max-height: calc(100% - 32px); overflow: auto; background: var(--bg); color: var(--ink); border: 1px solid var(--line); border-radius: 10px; padding: 28px 24px 20px; }
#giftdlg::backdrop { background: rgba(0, 0, 0, .75); }
#giftdlg form { max-width: none; }
#giftdlg h2 { margin: 0; font-size: 30px; }
#giftdlg .kicker { margin: 0; }
#giftdlg .x { position: absolute; top: 10px; right: 12px; background: none; border: 0; color: var(--dim); font-size: 28px; line-height: 1; cursor: pointer; padding: 4px 8px; }
#giftdlg .row { display: flex; flex-wrap: wrap; gap: 10px; }
#gpe { display: grid; gap: 14px; }
.note.err, #giftp .err, #gform .err, #gs .err { color: #ff6b6b; }   /* every failure line, one red */

/* gift page: each gift is a card with its code */
.btn.sm { padding: 7px 12px; font-size: 13px; }
.glist { display: grid; gap: 12px; margin-top: 18px; max-width: 640px; }
#gnew { margin-top: 22px; max-width: 640px; }
.gc { border: 1px solid var(--line); border-radius: 10px; background: var(--panel); padding: 16px 18px; display: grid; gap: 10px; }
.gc-top { display: flex; justify-content: space-between; align-items: center; gap: 12px; }
.gc-prod { font: 700 20px var(--display); text-transform: uppercase; letter-spacing: .03em; }
.gc-chip { font: 600 12px var(--display); letter-spacing: .12em; text-transform: uppercase; padding: 4px 8px; border-radius: 4px; border: 1px solid var(--line); color: var(--dim); white-space: nowrap; }
.gc-chip.sent, .gc-chip.opened { color: var(--green); border-color: var(--green); }
.gc-chip.scheduled { color: var(--cyan); border-color: var(--cyan); }
.gc-chip.refunded { color: var(--faint); }
.gc-code { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.gc-code code { font: 600 19px var(--mono); letter-spacing: .06em; margin-right: 6px; }
.gc-line { margin: 0; color: var(--dim); font-size: 15px; }
.gc-act { display: flex; flex-wrap: wrap; gap: 8px; }
.gform2 { border: 1px solid var(--line); border-radius: 10px; padding: 18px; max-width: 640px; }
.gform2 h3 { margin: 0; }

/* signed in: the account menu and Sign out in the header (shown by the header script when the tp_in cookie is set) */
header.site .acct { position: relative; }
.acct-btn { all: unset; cursor: pointer; display: grid; place-items: center; width: 34px; height: 34px; border-radius: 50%; border: 1px solid var(--line); color: var(--ink); }
.acct-btn:hover, .acct-btn:focus-visible, .acct.open .acct-btn { border-color: var(--ink); }
.acct-btn svg { width: 18px; height: 18px; }
.acct .drop { display: none; position: absolute; right: 0; top: calc(100% + 10px); z-index: 30; min-width: 210px; flex-direction: column; background: var(--panel); border: 1px solid var(--line); border-radius: 8px; padding: 6px 0; font: 700 15px/1 var(--display); letter-spacing: .08em; text-transform: uppercase; }
.acct .drop a { padding: 13px 18px; color: var(--dim); text-decoration: none; white-space: nowrap; }
.acct .drop a:hover { color: var(--ink); }
.acct.open .drop { display: flex; }
header.site .so { padding: 8px 12px; font-size: 13px; }
@media (max-width: 760px) { header.site .so { display: none; } }
.acct-links { display: flex; flex-wrap: wrap; gap: 10px; }
.optin { display: flex; gap: 8px; align-items: center; text-transform: none; letter-spacing: 0; font: 16px var(--body); color: var(--ink); margin-top: 14px; }
#dl li { margin: 8px 0; } #dl .btn { margin-left: 8px; }

/* Preview on twopop.ca (html.pre, set in each page's head): open before it's finished. No sign-in, no gifts, Buy says
   Coming soon (build.py), the placeholder tags go, and what isn't real yet is blurred: empty pictures, the sample
   reviews and the made-up example gym. The server closes the same things (src/app.js PREVIEW_API). */
.pre header.site .signin, .pre header.site .acct, .pre header.site .so, .pre [data-gift], .pre .ph, .pre #reviews .reviews-cta { display: none !important; }
.pre .thumb.empty, .pre #reviews .grid, .pre #fitness .plans { filter: blur(7px); user-select: none; pointer-events: none; }
.pre [data-buy] { visibility: hidden; }

/* the newsletter box above every footer (build.py news_box) */
section.news { border-top: 1px solid var(--line); padding-block: 22px; }
section.news .wrap { display: flex; flex-wrap: wrap; gap: 12px 40px; align-items: center; justify-content: space-between; }
section.news h2 { font-size: 18px; margin: 0 0 2px; }
section.news p { color: var(--dim); margin: 0; max-width: 52ch; font-size: 14px; }
form.newsf { flex: 1 1 300px; max-width: 420px; gap: 6px; }
form.newsf .row { display: flex; gap: 8px; }
form.newsf input[type=email] { flex: 1; min-width: 0; font-size: 15px; padding: 8px 10px; }
form.newsf .btn { padding: 9px 14px; font-size: 14px; white-space: nowrap; }
form.newsf .hp { position: absolute; left: -9999px; width: 1px; height: 1px; opacity: 0; }
form.newsf .note { color: var(--dim); font-size: 14px; margin: 0; }
@media (max-width: 520px) { form.newsf { flex-basis: 100%; max-width: none; } }
/* twopop.ca with the shop shut: no Sign in button and no Create account; /signin is for the admin only */
.pre header .btn.signin, .pre #si .sw-in { display: none !important; }
