/* Shared chrome: header states, mega menu, burger, canonical
   footer, accessibility and contrast fixes. Every page needs
   this one. */

/* The shell owns almost nothing: each page's own stylesheet paints the
   page, including body. This is only a floor so there is no flash of the
   host's ground before the active stylesheet is enabled. */
html,body{margin:0;background:#FFFFFF}
#app{display:block}
/* a route that has not been built yet */
.stub{
  min-height:100svh;display:grid;place-content:center;gap:14px;text-align:center;
  padding:64px 24px;background:#fff;color:#06243C;
  font-family:"Hanken Grotesk","Avenir","Segoe UI",system-ui,sans-serif;font-weight:300;
}
.stub h1{font-family:"Fraunces",Georgia,serif;font-weight:300;font-size:2rem;margin:0}
.stub p{margin:0;color:#5C7488}
.stub a{
  color:#1C70EE;text-decoration:none;font-family:"Jost",system-ui,sans-serif;
  font-size:.8rem;letter-spacing:.14em;text-transform:uppercase;margin-top:8px;
}
.stub .stub-actions{display:flex;flex-wrap:wrap;gap:8px 26px;justify-content:center}

/* ── the Services mega menu ─────────────────────────────────────────
   Injected into whichever page is mounted, so one implementation serves
   all seven. It carries its own copy of the palette rather than reading
   the active page's tokens, so the panel is identical over the homepage's
   dark hero and over an interior page's white plate. */
.mega{
  --m-paper:#FFFFFF; --m-ink:#06243C; --m-muted:#5C7488; --m-mut2:#93A5B4;
  --m-line:#DEE6ED; --m-line2:#F6F1E7; --m-accent:#8A5F16;

  position:absolute;top:100%;left:0;right:0;
  background:var(--m-paper);
  border-top:1px solid var(--m-line);
  border-bottom:1px solid var(--m-line);
  box-shadow:0 26px 50px -30px rgba(6,36,60,.42);
  color:var(--m-ink);
}
.mega[hidden]{display:none}
.mega-in{
  display:grid;grid-template-columns:repeat(3,1fr);
  gap:clamp(24px,3vw,54px);
  padding-block:clamp(26px,3vw,40px);
}
@media (max-width:1000px){ .mega-in{grid-template-columns:1fr 1fr} }
@media (max-width:700px){  .mega-in{grid-template-columns:1fr;gap:22px} }

.mega-col{display:grid;gap:12px;align-content:start}
.mega-h{
  font-family:"Jost","Avenir",system-ui,sans-serif;
  font-size:.68rem;font-weight:500;letter-spacing:.2em;text-transform:uppercase;
  color:var(--m-mut2);margin:0;padding-bottom:11px;border-bottom:1px solid var(--m-line);
}
.mega-col ul{list-style:none;margin:0;padding:0;display:grid;gap:2px}
.mega-col a{
  display:grid;gap:1px;text-decoration:none;
  padding:9px 10px;margin-inline:-10px;border-radius:3px;
  font-family:"Hanken Grotesk","Avenir",system-ui,sans-serif;
  font-weight:300;font-size:1rem;color:var(--m-ink);
  transition:background .18s ease, color .18s ease;
}
.mega-col a:hover{background:var(--m-line2);color:var(--m-accent)}
.mega-col a small{
  font-family:"Jost","Avenir",system-ui,sans-serif;
  font-size:.68rem;letter-spacing:.1em;text-transform:uppercase;color:var(--m-mut2);
}
/* the one service with a page designed in this prototype */
.mega-col a.designed strong{font-weight:400}
/* the descriptor carries the emphasis now, in the FAQ gold, so the row
   does not need a marker dot as well */
.mega-col a.designed small{color:#A9762A}

/* ── the hamburger and its drawer ────────────────────────────────────
   Carries its own palette for the same reason the mega panel does: it
   opens over the homepage's dark hero and over white interior headers. */
/* flex, not grid: implicit grid rows stretch to fill the 42px button, which
   puts the bars on a ~15px pitch and leaves the X transform below missing
   by 8px. Flex keeps the bars content-height, so the pitch is exactly
   1.5px + 5px gap = 6.5px - the distance the X translate assumes. */
.burger{
  --m-ink:#06243C; --m-line:#DEE6ED;
  display:none;width:42px;height:42px;flex:none;
  background:none;border:1px solid var(--m-line);border-radius:3px;
  cursor:pointer;padding:0;color:var(--m-ink);
  flex-direction:column;align-items:center;justify-content:center;gap:5px;
}
.burger span{display:block;width:17px;height:1.5px;background:currentColor;transition:transform .25s ease, opacity .2s ease}
.burger.on span:nth-child(1){transform:translateY(6.5px) rotate(45deg)}
.burger.on span:nth-child(2){opacity:0}
.burger.on span:nth-child(3){transform:translateY(-6.5px) rotate(-45deg)}


.drawer{
  --d-paper:#FFFFFF; --d-ink:#06243C; --d-muted:#5C7488; --d-mut2:#93A5B4;
  --d-line:#DEE6ED; --d-line2:#F6F1E7; --d-accent:#8A5F16;
  position:absolute;top:100%;left:0;right:0;
  max-height:calc(100svh - 100%);overflow-y:auto;overscroll-behavior:contain;
  background:var(--d-paper);border-top:1px solid var(--d-line);
  box-shadow:0 26px 50px -30px rgba(6,36,60,.45);color:var(--d-ink);
}
.drawer[hidden]{display:none}
.drawer-in{padding:clamp(18px,4vw,26px) var(--gutter) clamp(26px,6vw,36px);display:grid;gap:22px}
.drawer ul{list-style:none;margin:0;padding:0;display:grid;gap:2px}
.drawer a{
  display:block;text-decoration:none;color:var(--d-ink);
  font-family:var(--f-body);font-weight:300;font-size:1.06rem;
  padding:12px 12px;margin-inline:-12px;border-radius:3px;min-height:44px;
}
.drawer a:hover{background:var(--d-line2);color:var(--d-accent)}
.drawer .drawer-top a{font-family:var(--f-display);font-weight:400;font-size:1.22rem}
.drawer .drawer-top a[aria-current="page"]{color:var(--d-accent)}
.drawer-grp{display:grid;gap:6px}
.drawer-h{
  font-family:var(--f-util);font-size:.66rem;font-weight:500;letter-spacing:.2em;text-transform:uppercase;
  color:var(--d-mut2);margin:0;padding-bottom:9px;border-bottom:1px solid var(--d-line);
}
.drawer a.designed{display:flex;align-items:center;gap:.55em}
/* the same size as the button in the top bar, not a full-width block.
   `.drawer a` out-specifies a bare `.drawer-cta`, which is why this was
   still rendering at body size - hence the descendant selector. */
.drawer a.drawer-cta{
  justify-self:start;margin-top:6px;width:auto;min-height:0;
  display:inline-flex;align-items:center;gap:.6em;
  font-family:var(--f-util);font-weight:500;letter-spacing:.1em;text-transform:uppercase;
  padding:.72em 1.3em;font-size:.74rem;margin-inline:0;border-radius:2px;
}

@media (max-width:900px){
  .burger{display:flex}
  /* the appointment button is the drawer's job below this width */
  .bar > .btn{display:none}
}
@media (min-width:901px){ .drawer{display:none} }


}

/* the social row the shell injects into older footers */
.socials{display:flex;gap:10px;margin-top:20px}
.socials a{
  width:38px;height:38px;border:1px solid #1B2027;border-radius:999px;
  display:grid;place-items:center;color:#97A3AD;
  transition:color .2s ease, border-color .2s ease, background .2s ease;
}
.socials a:hover{color:#fff;border-color:#97A3AD;background:#12161B}
.socials svg{width:16px;height:16px;display:block;fill:currentColor}

/* ── the canonical footer ───────────────────────────────────────────
   Brand block and three link columns, generously spaced; the policies and
   registration details sit in a separate base row. On a phone the columns
   stack in a single left-aligned run, which is what stops the middle one
   drifting out of line. */
footer.cfoot{background:#050506;color:#97A3AD;border-top:1px solid #14181C}
.cf-in{
  display:grid;grid-template-columns:minmax(280px,1.15fr) 2fr;
  gap:clamp(34px,5vw,80px);
  padding-block:clamp(52px,6vw,80px) clamp(34px,4vw,52px);
}
.cf-brand{display:grid;gap:18px;align-content:start;max-width:42ch}
#app footer.cfoot .mark{color:#FFFFFF;width:clamp(104px,11vw,132px);aspect-ratio:69.94/12.45;display:block}
.cf-about{
  font-size:.95rem;line-height:1.75;color:#8D9AA5;margin:0;max-width:40ch;
}
.cf-meta{display:grid;gap:8px;font-size:.93rem;line-height:1.6}
.cf-meta a{color:#97A3AD;text-decoration:none}
.cf-meta a:hover{color:#F4F7FA}
.cf-cols{
  display:grid;grid-template-columns:repeat(3,minmax(0,1fr));
  gap:clamp(26px,3.4vw,54px);
}
.cf-col{min-width:0}
.cf-col h4{
  font-family:var(--f-util,"Jost",system-ui,sans-serif);
  font-size:.7rem;font-weight:500;letter-spacing:.2em;text-transform:uppercase;
  color:#F4F7FA;margin:0 0 16px;
}
.cf-col ul{list-style:none;margin:0;padding:0;display:grid;gap:11px}
.cf-col a{color:#97A3AD;text-decoration:none;font-size:.94rem;line-height:1.4;transition:color .2s ease}
.cf-col a:hover{color:#E2B266}
footer.cfoot .socials{display:flex;gap:10px;margin-top:2px}
footer.cfoot .socials a{
  width:38px;height:38px;border:1px solid #1B2027;border-radius:999px;
  display:grid;place-items:center;color:#97A3AD;
  transition:color .2s ease, border-color .2s ease, background .2s ease;
}
footer.cfoot .socials a:hover{color:#E2B266;border-color:#3A2708;background:#12161B}
footer.cfoot .socials svg{width:16px;height:16px;display:block;fill:currentColor}

.cf-base{
  display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;
  gap:14px 34px;padding-block:22px clamp(26px,3vw,34px);
  border-top:1px solid #16191D;
  font-family:var(--f-util,"Jost",system-ui,sans-serif);
  font-size:.7rem;letter-spacing:.12em;text-transform:uppercase;color:#6C7A85;
}
.cf-legal{display:flex;flex-wrap:wrap;gap:10px 22px;font-size:.62rem;letter-spacing:.13em}
#app .cf-legal a{
  color:#8D9AA5;text-decoration:none;transition:color .2s ease;
  font-family:var(--f-util,"Jost",system-ui,sans-serif);
  font-size:.64rem;letter-spacing:.13em;text-transform:uppercase;line-height:1.5;
}

.cf-reg{display:flex;flex-wrap:wrap;gap:8px 22px}

@media (max-width:960px){
  .cf-in{grid-template-columns:1fr;gap:clamp(32px,5vw,44px)}
  .cf-brand{max-width:none}
}
@media (max-width:640px){
  /* a single left-aligned run: the three columns stack rather than sitting
     in a 2-up grid where the middle one lands off-axis */
  .cf-cols{grid-template-columns:1fr;gap:30px}
  .cf-legal a{padding-block:6px}
  .cf-base{flex-direction:column;align-items:flex-start}
}

/* the "Highlight placeholders" toggle was a drafting aid, not part of the
   site. Hidden here so it never flashes, and removed from the DOM in the
   router once the page's own script has finished with it. */
#app .phbtn{display:none !important}

/* ── artwork frames ─────────────────────────────────────────────────
   Several of these files carry their own empty margin, so a 1px frame
   drawn round the image box landed out in the whitespace and read as a
   broken border - worst on the phone screenshots. The templates no longer
   draw it; this covers the pages baked before they changed. */
#app .split-media img,
#app figure img,
#app .creative img,
#app .shot img{border:0}
#app .split-media img,
#app figure img{background:none}

/* ── text contrast ──────────────────────────────────────────────────
   The two muted greys were the site's one real contrast failure. The
   lighter of them carries eyebrows, captions, counts and figure labels -
   small uppercase type, which is exactly the case the guideline is about -
   and sat at 2.5:1 on white where 4.5 is required. Both are darkened by
   roughly one step, keeping the hue and the ramp between them:

       --muted-2  #93A5B4 -> #5B6E80   2.54 -> 5.27 on white, 4.81 on tint
       --muted    #5C7488 -> #4F6377   4.87 -> 6.21 on white, 5.67 on tint

   Set on #app rather than :root so it reaches every page's own stylesheet,
   including the ones merged as published. Dark sections name their own
   colours and are untouched. */


/* Two smaller misses, both on small text over the tinted band:
     the section eyebrow in Castle blue   4.17 -> 5.42
     the open FAQ question in gold        3.65 -> 5.63
   The gold moves onto the shade already used for links and descriptors, so
   the page ends up with one gold rather than two. */
/* The accent carries small labels, breadcrumbs, step numbers and inline
   links, and at 12px on the tinted band it sat at 4.17. Darkened at the
   token so every one of those is covered rather than the handful I could
   name; it stays recognisably Castle blue. */



/* ── the burger drawer's own nav ────────────────────────────────────
   Several page stylesheets carry a bare `@media (max-width:Npx){ nav
   {display:none} }`, written when the only <nav> on the page was the one
   in the header. The shell puts the drawer's links in a <nav> of their
   own, so those rules hid them too - which is why About, Case Studies,
   Articles and Contact were missing from the burger on exactly the pages
   whose sheet used the bare selector. Named specifically enough to win
   without !important. */
#app .drawer nav{display:block}
/* the page sheets underline the current nav item in Castle blue via
   `nav a[aria-current="page"]::after`; inside the drawer that lands as
   a stray blue rule under a gold word, so it is dropped there */
#app .drawer a[aria-current="page"]::after{display:none}

/* ── the About page's prose, full width ─────────────────────────────
   The reading measure is dropped here on request: the paragraphs and the
   heritage chapters run the width of the column instead. Note this is a
   long line length for body copy - if it reads badly at full desktop
   width, the fix is a narrower container, not a narrower measure. */
html[data-page-key="about"] #app .prose,
html[data-page-key="about"] #app .chapters{max-width:none}

/* ── accessibility ──────────────────────────────────────────────────
   A keyboard reader arriving on any page currently has to tab through the
   whole header - logo, five nav items, the mega trigger and the CTA -
   before reaching the content, on every navigation. The skip link is
   off-screen until it is focused, which is the one time it is useful. */
#app .skip-link{
  position:absolute;left:12px;top:-100px;z-index:200;
  background:#FFFFFF;color:#06243C;border:1px solid #06243C;border-radius:3px;
  padding:.7em 1.2em;text-decoration:none;
  font-family:var(--f-util,"Jost",system-ui,sans-serif);
  font-size:.78rem;letter-spacing:.1em;text-transform:uppercase;
  transition:top .18s ease;
}
#app .skip-link:focus{top:12px}

/* A visible focus ring on every interactive thing, in the site's gold so
   it reads as part of the design rather than a browser default. Several
   page stylesheets set their own; this is the floor. */
#app a:focus-visible,
#app button:focus-visible,
#app [tabindex]:focus-visible,
#app summary:focus-visible{
  outline:2px solid #8A5F16;outline-offset:3px;border-radius:2px;
}

/* Honour a reader who has asked the system to stop things moving. The
   page scripts animate on scroll and autoplay a looping hero; neither is
   information, so both stand down. */
@media (prefers-reduced-motion: reduce){
  #app *,
  #app *::before,
  #app *::after{
    animation-duration:.001ms !important;
    animation-iteration-count:1 !important;
    transition-duration:.001ms !important;
    scroll-behavior:auto !important;
  }
  #app .rise{opacity:1 !important;transform:none !important}
}

/* ── header chrome: one state machine for the whole site ────────────
   Three problems had one cause - no scroll state. The bar was a white
   plate from load, the burger was navy-on-navy over dark heroes (and
   invisible), and the homepage nav sat unreadable on its own hero. The
   header is now transparent until you scroll, and the chrome inverts
   based on whether a dark hero is behind it. */
#app header{
  background:transparent;border-bottom:0 solid transparent;
  transition:background .28s ease, border-color .28s ease;
}
html.scrolled #app header,
html.menu-open #app header{background:#FFFFFF;border-bottom:1px solid #DEE6ED}

/* light chrome while a dark hero sits behind the bar */
html[data-hero="dark"]:not(.scrolled):not(.menu-open) #app .bar nav a{color:rgba(244,247,250,.82)}
html[data-hero="dark"]:not(.scrolled):not(.menu-open) #app .bar nav a:hover,
html[data-hero="dark"]:not(.scrolled):not(.menu-open) #app .bar nav a[aria-current="page"]{color:#FFFFFF}
html[data-hero="dark"]:not(.scrolled):not(.menu-open) #app header a.mark{color:#F4F7FA}
html[data-hero="dark"]:not(.scrolled):not(.menu-open) .burger{color:#F4F7FA;border-color:rgba(244,247,250,.38)}

/* on a light page, and on any page once scrolled, the chrome is dark */
html:not([data-hero="dark"]) #app .bar nav a,
html.menu-open #app .bar nav a,
html.scrolled #app .bar nav a{color:#5C7488}
html:not([data-hero="dark"]) #app .bar nav a:hover,
html.scrolled #app .bar nav a:hover,
html:not([data-hero="dark"]) #app .bar nav a[aria-current="page"],
html.menu-open #app .bar nav a[aria-current="page"]{color:#06243C}
html.scrolled #app .bar nav a[aria-current="page"]{color:#06243C}
html:not([data-hero="dark"]) #app header a.mark,
html.menu-open #app header a.mark,
html.scrolled #app header a.mark{color:#06243C}
html:not([data-hero="dark"]) .burger,
html.menu-open .burger,
html.scrolled .burger{color:#06243C;border-color:#DEE6ED}

/* ── buttons: white and gold, matching the FAQ tone ────────────────── */
/* gold button re-skin removed — see build-theme.py:patch_shell_css */

/* the trigger keeps the host page's nav styling and only adds a caret */
.bar nav a.has-mega{display:inline-flex;align-items:center;gap:.45em}
/* `nav a[aria-current="page"]::after` in the page stylesheets paints an
   underline with a blue background. On a service page Services IS the
   current item, so the caret inherited that fill and rendered as a solid
   blue diamond. Painted explicitly here instead. */
/* mega-menu caret removed — see build-theme.py:patch_shell_css */
.bar nav a.has-mega[aria-expanded="true"]::after{transform:rotate(225deg) translateY(-2px)}

/* ── one header height everywhere — see build-theme.py:patch_shell_css ── */
#app .bar{padding-block:22px}
#app{--barh:83px}

/* ── one nav link size everywhere — see build-theme.py:patch_shell_css ── */
#app .bar nav a{font-size:clamp(.92rem,1.1vw,1.02rem);letter-spacing:.015em}
#app .bar .btn{line-height:1.65}

/* ── drawer CTA keeps the button's own colour — see build-theme.py:patch_shell_css ── */
#app .drawer a.drawer-cta,
#app .drawer a.drawer-cta:hover{color:#3A2708;background:#E2B266;border-color:#E2B266}

/* ── one team photo drops out on small screens — see build-theme.py:patch_shell_css ── */
@media (max-width:640px){ #app .team-grid li.hide-sm{display:none} }

/* ── About Us photos rebalance on small screens — see build-theme.py:patch_shell_css ──
   .duo is two-up and .shots three-up; both drop to two columns at 820px, which
   left .shots with a third photo alone on its own row. The studio photo moves
   out of .duo and into .shots below that width, so both grids come out even.
   The base rule has to come first: at equal specificity the later declaration
   wins, so putting it after the media query would cancel it. */
#app .shots .shot.only-sm{display:none}
@media (max-width:820px){
  #app .duo .shot.hide-sm{display:none}
  #app .shots .shot.only-sm{display:block}
}

/* ── rating badges stay on one line on the narrowest phones — see build-theme.py:patch_shell_css ──
   Trustpilot and Google are 164px + 138px at the 20px badge height, and with an
   18px gap that needs 320px; a 360px screen leaves 305px, so Google wrapped onto
   its own line. Shrinking the badge height scales both proportionally, since the
   images keep width:auto. Height must stay explicit — height:auto lets them
   spring back to their natural 213px and blow the row apart. */
@media (max-width:420px){
  #app .badges{flex-wrap:nowrap;gap:12px}
  #app .badges img{height:clamp(15px,4.6vw,20px)}
}

/* ── hero tag pills, one step down on phones — see build-theme.py:patch_shell_css ──
   Same pill as the desktop rule at a smaller step: .70rem rather than .74rem,
   and .8em side padding rather than 1em. The SEO hero carries ten of these and
   they stacked to seven rows at 360px, so the tighter pill buys back rows
   without changing its shape. */
@media (max-width:430px){
  #app .tags li{font-size:.70rem;padding:.5em .8em}
}

/* ── the "why" team photo moves up the page on phones — see build-theme.py:patch_shell_css ──
   It lives in .split-media, the second grid column, after the stat. Stacked on a
   phone that puts it at the very bottom: heading, four paragraphs, the figure,
   then a photo. It cannot be reordered with CSS alone from another column, so
   each service page carries a second copy directly under the heading and the two
   swap over at 820px. Only one is ever visible.
   Base rules first: at equal specificity the later declaration wins. */
#app .split img.only-sm{display:none}
@media (max-width:820px){
  #app .split-media img.hide-sm{display:none}
  #app .split img.only-sm{display:block;width:100%;height:auto;border-radius:3px;margin-bottom:clamp(20px,3vw,28px)}
}

/* ── tighter clearance under the bar on phones — see build-theme.py:patch_shell_css ──
   --barh is the height the layout leaves for the fixed header: it drives the top
   padding on .masthead and .banner-in, and the scroll-margin on anchor targets.
   83px is the desktop bar; on a phone the bar is 86px but the gap beneath it
   reads as dead space, so the reserved height drops to 60px. Content still
   clears the bar — the padding adds a clamp on top of this value. */
@media (max-width:820px){
  #app{--barh:60px}
}

/* ── dateline tightens on phones — see build-theme.py:patch_shell_css ──
   Same rule as the desktop one at a smaller step: .60rem rather than .74rem and
   a 20px column gap rather than 28px, so "209 articles / 13 categories / Latest"
   holds fewer lines on a narrow screen. */
@media (max-width:820px){
  #app .dateline{gap:10px 20px;font-size:.60rem}
}

/* ── Shopify stats band — see build-theme.py:patch_shell_css ──
   The figures used to sit inside the hero, where .banner styled them light on
   the photograph. Out on their own band they need the light-page treatment
   back: the top rule that separated them from the hero copy is now redundant,
   and the numbers take the page's own ink. */
#app .band.figures{padding-block:clamp(30px,4vw,46px)}
#app .band.figures .keyfigs{margin-top:0;padding-top:0;border-top:0}

/* ── booking CTAs are gold — see build-theme.py:patch_shell_css ──
   Scoped to [data-calendly], the booking buttons, rather than .btn-primary, so
   ordinary primary actions keep Castle blue. The label is navy, not white:
   #E2B266 against white is 1.94:1 and fails WCAG at any size, while against
   #3A2708 it is 7.3:1. A gold button with a white label is the same mistake as
   the dark-on-blue drawer CTA. Palette: #E2B266 fill, #D0A055 hover, #3A2708
   label, #8A5F16 when gold is the text on white. */
#app{--gold-ink:#8A5F16}
#app a.btn[data-calendly]{background:#E2B266;border-color:#E2B266;color:#3A2708}
#app a.btn[data-calendly]:hover{background:#D0A055;border-color:#D0A055;color:#3A2708}

/* Gold as text needs the darker step. #E2B266 on white is 1.95:1 and fails at
   any size; #8A5F16 is the same hue at AA. Only for gold *on* a light ground —
   gold on the dark hero or as a fill is fine as it is. */
#app .quote .qm{color:var(--gold-ink)}

/* ── long tag lists clip on phones — see build-theme.py:patch_shell_css ──
   chrome.js adds .is-clipped and the button below 820px, so with the script
   blocked every tag still shows. The button is an <li> inside the list so it
   flows on from the last visible tag rather than dropping to its own line.

   The wrapper <li> is left alone deliberately: `.tags li` already draws the
   pill, so the control inherits it and is identical to a tag by construction.
   Restyling the button as its own pill instead meant re-stating the border and
   padding, which lost a specificity fight with `#app .tags li` and left a 29px
   control sitting 5px below the 32px tags, ringed in the wrong colour. */
@media (max-width:820px){
  #app .tags.is-clipped > li:nth-child(n+6):not(.tags-more-item){display:none}
  #app .tags-more{
    font:inherit;letter-spacing:inherit;text-transform:inherit;color:inherit;
    background:none;border:0;padding:0;margin:0;cursor:pointer;
  }
  #app .tags li.tags-more-item{transition:border-color .2s ease,color .2s ease}
  #app .tags li.tags-more-item:hover{border-color:currentColor}
}

/* ── client logos in the quote bylines — see build-theme.py:patch_shell_css ──
   .avatar was built to hold the word "Photo": a 44px circle with a tinted fill.
   These are logos rather than headshots, so they are contained, not cropped —
   HNK's is a landscape wordmark and object-fit:cover would cut it in half. The
   fill goes white so a dark wordmark reads against it. */
#app .byline .avatar{
  overflow:hidden;background:#fff;padding:4px;box-sizing:border-box;
}
#app .byline .avatar img{
  width:100%;height:100%;object-fit:contain;display:block;
}
