/* ===========================================================================
   Benjamin Moore BG — design system
   ---------------------------------------------------------------------------
   Every class is `bm-` prefixed on purpose: Bootstrap and the legacy
   style.css are still loaded for pages that haven't been converted yet, and
   unprefixed names like .btn / .header / .nav would collide with them.
   When the last template is converted, the old libraries come out and the
   prefix can stay — it costs nothing and keeps the origin obvious.

   Chrome is achromatic. All colour on the site comes from the paint.
   =========================================================================== */

/* ============ FONT (self-hosted; no third-party connection) ============ */

@font-face {
  font-family: 'Onest'; font-style: normal; font-weight: 400 800; font-display: swap;
  src: url('/fonts/onest/onest-cyrillic-ext.woff2') format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
@font-face {
  font-family: 'Onest'; font-style: normal; font-weight: 400 800; font-display: swap;
  src: url('/fonts/onest/onest-cyrillic.woff2') format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
  font-family: 'Onest'; font-style: normal; font-weight: 400 800; font-display: swap;
  src: url('/fonts/onest/onest-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Onest'; font-style: normal; font-weight: 400 800; font-display: swap;
  src: url('/fonts/onest/onest-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* ============ TOKENS ============ */

:root {
  --bm-bg: #ffffff;
  --bm-card: #ffffff;
  --bm-brand: #101010;
  --bm-brand-hover: #3a3a3a;
  --bm-ink: #101010;
  --bm-body: #56534e;
  --bm-meta: #8c8880;
  --bm-border: #e4e0d9;
  --bm-cream: #f4f1ec;
  --bm-paper: #fafaf7;   /* near-white ground for card grids (prototype --bg) */
  --bm-navy: #0e2e4a;    /* prototype --navy: card titles, so they read as links */
  --bm-red: #c8102e;              /* logo red — the only accent */
  --bm-ok: #2e7d5b;
  --bm-radius: 2px;   /* prototype --radius; softens cards, chips and inputs */
  --bm-section: 96px;
  --bm-section-sm: 56px;
  --bm-container: 1280px;
  --bm-font: 'Moderat', 'Onest', Helvetica, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
}

/* ============ BASE ============ */

/* The UA sheet's [hidden] { display: none } is beaten by any author rule that
   sets display — .bm-prod is display:flex, so hidden cards stayed on screen.
   One authoritative rule, so `el.hidden = true` means hidden everywhere. */
[hidden] { display: none !important; }


/* The prototype resets with `* { box-sizing: border-box; margin: 0; padding: 0 }`.
   The port kept only box-sizing AND scoped it to `.bm *`, which is a DESCENDANT
   selector — <body class="bm"> is not matched by it. So body kept the UA default
   margin: 8px and every page rendered inside an 8px frame. The scattered
   `margin: 0` rules further down this file are all symptoms of this. */
.bm { font-family: var(--bm-font); color: var(--bm-ink); background: var(--bm-bg); font-size: 16px; line-height: 1.6;
      margin: 0; padding: 0;
      -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }
.bm, .bm *, .bm *::before, .bm *::after { box-sizing: border-box; }
/* Zero specificity, so any explicit rule below still wins. */
.bm :where(*) { margin: 0; padding: 0; }
/* :where() keeps these resets at ZERO specificity. Without it `.bm button`
   (0,1,1) beats `.bm-btn` (0,1,0) and every <button class="bm-btn"> loses its
   background — which is exactly what happened before this was fixed. */
.bm :where(img, svg) { max-width: 100%; display: block; }
.bm :where(a) { color: inherit; text-decoration: none; }
.bm :where(button) { font-family: inherit; cursor: pointer; border: none; background: none; color: inherit; }

/* The colours hero links down to its own sections, so scrolling has to be
   smooth and has to clear the sticky header. Respects reduced-motion. */
html { scroll-behavior: smooth; }
@media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } }
[id="families"], [id="collections"], [id="colors"] { scroll-margin-top: 96px; }

/* Swapping 120 tiles is fast but not instant — dim rather than blank, so the
   grid does not collapse and jump the page. */
[data-bm-loading] { opacity: .45; transition: opacity .15s ease; pointer-events: none; }

.bm-container { max-width: var(--bm-container); margin: 0 auto; padding: 0 32px; }
@media (max-width: 640px) { .bm-container { padding: 0 20px; } }

.bm-visually-hidden {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}
.bm-skip {
  position: absolute; left: -9999px; top: 0; z-index: 999; background: var(--bm-brand);
  color: #fff; padding: 12px 20px; font-weight: 600;
}
.bm-skip:focus { left: 0; }
/* A single focus colour that flips on dark surfaces — a black ring on the
   black header bar, painted hero or footer is invisible at best and an ugly
   box at worst. */
.bm :focus-visible { outline: 2px solid var(--bm-focus, var(--bm-brand)); outline-offset: 2px; }
.bm-header-top, .bm-footer, .bm-section--dark,
.bm-colors-hero, .bm-coy-paint, .bm-color-hero { --bm-focus: #fff; }

/* ============ TYPOGRAPHY ============ */

.bm :where(h1, h2, h3, h4) {
  font-weight: 700; color: var(--bm-ink); line-height: 1.15;
  letter-spacing: -0.01em; margin: 0;
}
.bm :where(h1) { font-size: 56px; }
.bm :where(h2) { font-size: 40px; }
.bm :where(h3) { font-size: 22px; }
.bm :where(h4) { font-size: 18px; }
@media (max-width: 768px) {
  .bm :where(h1) { font-size: 36px; }
  .bm :where(h2) { font-size: 28px; }
  .bm :where(h3) { font-size: 18px; }
}

.bm-eyebrow {
  font-size: 11px; font-weight: 600; letter-spacing: 2px;
  text-transform: uppercase; color: var(--bm-meta); display: inline-block;
}
.bm-section-title { font-size: 36px; color: var(--bm-brand); margin-bottom: 12px; }
.bm-section-sub { font-size: 16px; color: var(--bm-body); max-width: 560px; }
@media (max-width: 768px) { .bm-section-title { font-size: 26px; } }

/* Raw CMS content — /about-us, /news, /ideas, /pages have no styling of their
   own, so they inherit this and cost nothing to convert. */
/* flow-root contains floats. The admin panel lets editors set float:left on an
   inline image; without this the float escapes the article and lands on top of
   whatever follows — on /bg/ideas/stilno-sinyo it overlapped the footer. */
.bm-prose { color: var(--bm-body); font-size: 17px; line-height: 1.75; max-width: 760px; display: flow-root; }
.bm-prose > * + * { margin-top: 1.1em; }
.bm-prose h2 { font-size: 30px; color: var(--bm-ink); margin-top: 1.8em; }
.bm-prose h3 { font-size: 21px; color: var(--bm-ink); margin-top: 1.6em; }
.bm-prose a { color: var(--bm-brand); text-decoration: underline; text-underline-offset: 3px; }
.bm-prose ul, .bm-prose ol { padding-left: 1.3em; }
/* Long SEO copy demoted below the page's real content: same measure, centred,
   a notch smaller so it reads as supporting text rather than the main event. */
.bm-prose--wide { margin-left: auto; margin-right: auto; font-size: 16px; }

/* ---- CMS content normaliser ----
   Everything inside .bm-prose is typed or pasted in the admin panel, and a
   paste out of Word arrives carrying font-family, point sizes, mso-* junk and
   sometimes a <font> tag. The database already holds a few of these. !important
   is required rather than preferred: an inline style beats any author rule
   without it, and this content is not ours to clean by hand.

   Deliberately NOT reset: font-weight and font-style (bold and italic are
   real editorial intent), headings (they keep the scale set above), and link
   colour. */
/* <pre> included on purpose. The English terms were pasted out of Google
   Translate as one <pre> block — monospace, no wrapping, so the page scrolled
   sideways. There is no legitimate code block on a paint retailer's site;
   <code> keeps its monospace below for the rare inline case. */
.bm-prose :where(pre) { white-space: pre-wrap !important; word-break: break-word; overflow-wrap: anywhere; }
.bm-prose :where(p, span, div, li, td, th, font, small, section, article, pre) {
  font-family: inherit !important;
  font-size: inherit !important;
  line-height: inherit !important;
  letter-spacing: normal !important;
  color: inherit !important;
  background-color: transparent !important;
}
.bm-prose :where(h1, h2, h3, h4, h5, h6) {
  font-family: inherit !important;
  color: var(--bm-ink) !important;
  background-color: transparent !important;
}
.bm-prose a { color: var(--bm-brand) !important; }
.bm-prose code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace !important; font-size: .92em !important; }
.bm-prose img { max-width: 100%; height: auto; }
/* Word tables arrive with fixed pixel widths that overflow the column. */
.bm-prose table { width: 100% !important; max-width: 100%; border-collapse: collapse; display: block; overflow-x: auto; }
.bm-prose td, .bm-prose th { border: 1px solid var(--bm-border); padding: 8px 10px; }

/* The terms/privacy modal is a dense legal document in an 860px window —
   17px/1.75 is an editorial size, too loose for reading a contract. */
/* Named -docpage, not -doc: `.bm-doc` is already the PDF/TDS download row on
   the product page (flex, bordered). Reusing that name inherited its layout —
   the heading became a narrow column beside the text, with a stray border. */
.bm-docpage { max-width: var(--bm-container); margin: 0 auto; padding: 32px 32px 40px; }
.bm-docpage > h1 { font-size: 26px; margin: 0 0 18px; color: var(--bm-ink); }
.bm-docpage .bm-prose { font-size: 15px; line-height: 1.65; max-width: 100%; }
@media (max-width: 640px) { .bm-docpage { padding: 24px 20px 32px; } }
.bm-prose li + li { margin-top: .4em; }
.bm-prose img { margin: 1.6em 0; }
/* Video embeds are pasted from YouTube with width="640" height="360", which
   overflows the page on a phone. height:auto is required — the height attribute
   is a presentational hint that would otherwise make aspect-ratio inert. */
.bm-prose iframe[src*="youtube"], .bm-prose iframe[src*="youtu.be"], .bm-prose iframe[src*="vimeo"] {
  width: 100%; max-width: 100%; height: auto; aspect-ratio: 16 / 9; border: 0; display: block; margin: 1.6em 0;
}
.bm-prose iframe { max-width: 100%; }
.bm-prose img[style*="float: left"], .bm-prose img[style*="float:left"] { margin: .3em 1.6em 1.2em 0; }
.bm-prose img[style*="float: right"], .bm-prose img[style*="float:right"] { margin: .3em 0 1.2em 1.6em; }
/* A 300px float next to text is unreadable on a phone — drop it to full width. */
@media (max-width: 620px) {
  .bm-prose img[style*="float"] { float: none !important; width: 100% !important; height: auto !important; margin: 1.6em 0; }
}
.bm-prose blockquote {
  border-left: 3px solid var(--bm-brand); padding-left: 22px;
  font-size: 19px; color: var(--bm-ink);
}
.bm-prose table { width: 100%; border-collapse: collapse; font-size: 15px; }
.bm-prose th, .bm-prose td { text-align: left; padding: 12px 14px; border-bottom: 1px solid var(--bm-border); }
.bm-prose th { font-weight: 600; color: var(--bm-ink); }

/* ============ BUTTONS ============ */

.bm-btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 10px;
  padding: 14px 28px; background: var(--bm-brand); color: #fff;
  font-size: 16px; font-weight: 700; line-height: 1.2; text-align: center;
  border-radius: var(--bm-radius); transition: background .2s ease;
}
.bm-btn:hover { background: var(--bm-brand-hover); color: #fff; }
.bm-btn--outline { background: transparent; color: var(--bm-brand); box-shadow: inset 0 0 0 1.5px var(--bm-brand); }
.bm-btn--outline:hover { background: var(--bm-brand); color: #fff; }
.bm-btn--light { background: #fff; color: var(--bm-brand); }
.bm-btn--light:hover { background: #f0f0f0; color: var(--bm-brand); }
.bm-btn--ghost { background: transparent; color: #fff; box-shadow: inset 0 0 0 1.5px rgba(255,255,255,.7); }
.bm-btn--ghost:hover { background: #fff; color: var(--bm-brand); }
.bm-btn--block { display: flex; width: 100%; }
/* On the painted hero the background is an arbitrary colour from the DB, so
   neither white nor black text is safe. The template hands us the ink colour
   (already contrast-checked by getTextColour) and the paint colour; hover
   simply swaps the two, so it is readable by construction. Previously this
   was done with an inline style="color:currentColor", which beat the :hover
   rule and left white text on a white background. */
.bm-btn--on-paint {
  background: transparent;
  color: var(--bm-on-paint, #fff);
  box-shadow: inset 0 0 0 1.5px currentColor;
}
.bm-btn--on-paint:hover {
  background: var(--bm-on-paint, #fff);
  color: var(--bm-paint, var(--bm-brand));
}

.bm-btn--lg { padding: 18px 36px; font-size: 17px; }
/* Shared by 404, coming-soon and the colour-albums intro. */
.bm-hero-actions { display: flex; gap: 12px; flex-wrap: wrap; margin-top: 34px; }
.bm-btn[disabled], .bm-btn--disabled { opacity: .45; pointer-events: none; }

.bm-link {
  display: inline-flex; align-items: center; gap: 6px;
  color: var(--bm-brand); font-size: 15px; font-weight: 700; transition: gap .2s ease;
}
.bm-link::after { content: '→'; }
.bm-link:hover { gap: 10px; }

/* ============ FORMS ============ */

.bm-field { display: block; margin-bottom: 18px; }
.bm-label { display: block; font-size: 13px; font-weight: 600; color: var(--bm-ink); margin-bottom: 7px; }
.bm-input, .bm-select, .bm-textarea {
  width: 100%; font-family: inherit; font-size: 15px; color: var(--bm-ink);
  background: #fff; border: 1px solid var(--bm-border); border-radius: var(--bm-radius);
  padding: 13px 14px; transition: border-color .15s ease;
}
.bm-input:focus, .bm-select:focus, .bm-textarea:focus { outline: none; border-color: var(--bm-brand); }
.bm-input::placeholder, .bm-textarea::placeholder { color: var(--bm-meta); }
.bm-textarea { min-height: 130px; resize: vertical; }
.bm-select {
  appearance: none; padding-right: 40px; cursor: pointer;
  background-image: url("data:image/svg+xml,%3Csvg width='12' height='8' viewBox='0 0 12 8' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%23101010' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right 14px center;
}
.bm-help { font-size: 13px; color: var(--bm-meta); margin-top: 6px; }
.bm-error { font-size: 13px; color: var(--bm-red); margin-top: 6px; }
.bm-input--error { border-color: var(--bm-red); }

/* ============ SECTIONS ============ */

.bm-section { padding: var(--bm-section) 0; }
.bm-section--tight { padding: 64px 0; }
/* For sections ending in a full-bleed element (the trend band): the bottom
   padding shows up as an empty white strip between the colour and whatever
   section follows. */
.bm-section--flush { padding-bottom: 0; }
.bm-section--cream { background: var(--bm-cream); }
/* Cream is warm enough that white cards sitting on it read as hard blocks.
   Card grids get this near-white ground instead — the prototype's --bg. */
.bm-section--paper { background: var(--bm-paper); }
.bm-section--dark { background: var(--bm-brand); color: rgba(255,255,255,.72); }
.bm-section--dark h2, .bm-section--dark h3 { color: #fff; }

/* Two adjacent sections on the SAME background each pay their full vertical
   padding — 96px + 96px = 192px of empty space with no colour change to
   justify it. The prototype never hits this because it strictly alternates
   white/cream; the CMS emits whatever sections have data, so it does.
   Collapse the second one's top padding when the background doesn't change. */
.bm-section:not(.bm-section--cream):not(.bm-section--paper):not(.bm-section--dark)
  + .bm-section:not(.bm-section--cream):not(.bm-section--paper):not(.bm-section--dark) { padding-top: 0; }
.bm-section--cream + .bm-section--cream { padding-top: 0; }
.bm-section--dark  + .bm-section--dark  { padding-top: 0; }

.bm-section-head {
  display: flex; align-items: flex-end; justify-content: space-between;
  margin-bottom: 56px; gap: 32px; flex-wrap: wrap;
}
.bm-section-head--center { flex-direction: column; align-items: center; text-align: center; }
.bm-section-head--center .bm-section-sub { margin: 0 auto; }
@media (max-width: 768px) {
  .bm-section { padding: var(--bm-section-sm) 0; }
  .bm-section-head { margin-bottom: 36px; }
}

/* ============ GRID ============ */

.bm-grid { display: grid; gap: 32px; }
.bm-grid--2 { grid-template-columns: repeat(2, 1fr); }
.bm-grid--3 { grid-template-columns: repeat(3, 1fr); }
.bm-grid--4 { grid-template-columns: repeat(4, 1fr); }
@media (max-width: 980px) { .bm-grid--3, .bm-grid--4 { grid-template-columns: repeat(2, 1fr); gap: 20px; } }
@media (max-width: 560px) { .bm-grid--2, .bm-grid--3, .bm-grid--4 { grid-template-columns: 1fr; } }

/* ============ BREADCRUMB ============ */

.bm-crumbs { background: #fff; border-bottom: 1px solid var(--bm-border); padding: 14px 0; font-size: 13px; }
.bm-crumbs .bm-container { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
.bm-crumbs a { color: var(--bm-meta); }
.bm-crumbs a:hover { color: var(--bm-brand); }
.bm-crumbs .bm-sep { color: var(--bm-meta); opacity: .5; }
.bm-crumbs [aria-current] { color: var(--bm-ink); font-weight: 500; }
/* Product titles are long enough to wrap the trail onto three or four lines.
   One line on phones: ancestors shrink first, the current page ellipsises, and
   nothing scrolls sideways. The full title is in the h1 immediately below. */
@media (max-width: 700px) {
  .bm-crumbs .bm-container { flex-wrap: nowrap; gap: 6px; }
  .bm-crumbs a, .bm-crumbs [aria-current] {
    min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  }
  .bm-crumbs a { flex: 0 1 auto; }
  .bm-crumbs .bm-sep { flex: 0 0 auto; }
  .bm-crumbs [aria-current] { flex: 1 1 70px; }
}

/* ============ PRODUCT CARD ============ */

.bm-prod {
  background: var(--bm-card); border-radius: var(--bm-radius); padding: 22px;
  display: flex; flex-direction: column;
  transition: transform .2s ease, box-shadow .2s ease;
}
.bm-prod:hover { transform: translateY(-6px); box-shadow: 0 16px 40px rgba(16,16,16,.10); }
.bm-prod-img {
  aspect-ratio: 1; background: #fff; margin-bottom: 22px; position: relative;
  overflow: hidden; display: flex; align-items: center; justify-content: center; padding: 12%;
}
.bm-prod-img img { max-width: 100%; max-height: 100%; width: auto; height: auto; object-fit: contain; transition: transform .3s ease; }
.bm-prod:hover .bm-prod-img img { transform: scale(1.04); }
.bm-prod-cat { font-size: 12px; font-weight: 600; letter-spacing: 1.4px; text-transform: uppercase; color: var(--bm-meta); margin-bottom: 8px; }
/* 19px matches the prototype, but the prototype's titles are 2-3 words and the
   real ones run to six ("524 Benjamin Moore Aura(R) Eggshell Finish Zero VOC
   Interiorna boya"). At that length 19px dominates the card, so 17px here. */
.bm-prod-name { font-size: 17px; font-weight: 700; color: var(--bm-navy); margin-bottom: 6px; line-height: 1.3; }
.bm-prod-meta { font-size: 14px; color: var(--bm-body); margin-bottom: 6px; }
.bm-prod-price { font-size: 19px; font-weight: 700; color: var(--bm-ink); margin-top: auto; padding-top: 12px; }
.bm-prod-price s { color: var(--bm-meta); font-weight: 400; font-size: 15px; margin-left: 8px; }
.bm-tag {
  position: absolute; top: 14px; left: 14px; z-index: 3;
  background: var(--bm-brand); color: #fff; font-size: 11px; font-weight: 700;
  letter-spacing: 1px; text-transform: uppercase; padding: 6px 11px;
}
.bm-tag--sale { background: var(--bm-red); }

/* ============ SWATCH / ALBUM CARD ============ */

/* The collection albums are product photos of fan decks shot on white. On a
   white card inside a white section they had no edge at all — the photos read
   as floating on the page rather than as cards. Same framing the product page
   already uses for its white-background shots. */
.bm-album {
  background: #fff; overflow: hidden; display: block;
  border: 1px solid var(--bm-border);
  transition: transform .25s ease, box-shadow .25s ease, border-color .25s ease;
}
.bm-album:hover {
  transform: translateY(-4px); box-shadow: 0 16px 36px rgba(16,16,16,.1);
  border-color: var(--bm-brand);
}
/* One row, however many swatches the palette returns. Do NOT pin this to
   repeat(5, 1fr) to match the prototype — the prototype hand-wrote exactly five
   per card, but getSwatches() returns a variable count, so a fixed five wraps
   the extras onto a second row inside a fixed-height box. */
.bm-album-swatches { aspect-ratio: 1/1; display: grid; grid-auto-flow: column; grid-auto-columns: 1fr; }
.bm-album-swatches span { display: block; }
.bm-album-info { padding: 22px 24px 26px; border-top: 1px solid var(--bm-border); }
.bm-album-name { font-size: 18px; font-weight: 600; color: var(--bm-brand); margin-bottom: 4px; }
.bm-album-count { font-size: 13px; color: var(--bm-meta); }
.bm-album-cta {
  display: inline-flex; align-items: center; gap: 6px; margin-top: 14px;
  font-size: 12px; font-weight: 600; letter-spacing: 1px;
  text-transform: uppercase; color: var(--bm-brand); transition: gap .2s ease;
}
.bm-album-cta::after { content: '→'; }
.bm-album:hover .bm-album-cta { gap: 10px; }

/* ============ HEADER ============ */

/* The sticky offset is negative by exactly the top bar's height, so the bar
   scrolls away and only the 85px nav row pins to the viewport. No JS and no
   gap above the header — sticking at a negative top pushes the bar off-screen
   rather than translating the whole element down the page. JS sets the real
   measured height; 43px is the fallback. */
.bm-header {
  background: #fff; border-bottom: 1px solid var(--bm-border);
  position: sticky; top: calc(-1 * var(--bm-topbar, 43px)); z-index: 100;
  transition: transform .28s ease;
}
/* Hidden while reading, back on the first upward scroll. */
.bm-header[data-bm-hidden] { transform: translateY(-100%); }
@media (prefers-reduced-motion: reduce) { .bm-header { transition: none; } }
.bm-header-top { background: var(--bm-brand); color: rgba(255,255,255,.85); font-size: 13px; padding: 9px 0; }
.bm-header-top .bm-container { display: flex; justify-content: space-between; align-items: center; }
.bm-header-top a { color: rgba(255,255,255,.85); display: inline-flex; align-items: center; gap: 6px; }
.bm-header-top a:hover { color: #fff; }
.bm-header-top svg { width: 14px; height: 14px; }

.bm-lang { position: relative; }
.bm-lang-btn { color: rgba(255,255,255,.85); font-size: 13px; display: inline-flex; align-items: center; gap: 6px; padding: 4px 0; }
.bm-lang-btn:hover { color: #fff; }
.bm-lang-menu {
  position: absolute; top: 100%; left: 0; margin-top: 8px; background: #fff;
  min-width: 160px; padding: 6px 0; box-shadow: 0 8px 24px rgba(0,0,0,.15);
  opacity: 0; visibility: hidden; transform: translateY(-4px); z-index: 200;
  transition: opacity .18s ease, transform .18s ease, visibility .18s;
}
.bm-lang:hover .bm-lang-menu, .bm-lang-menu:focus-within { opacity: 1; visibility: visible; transform: translateY(0); }
.bm-lang-menu a { display: block; padding: 8px 16px; color: var(--bm-ink); font-size: 13px; }
/* .bm-header-top a:hover sets color:#fff for the black bar. The menu below it
   is white, so the hover colour has to be restated here or the label turns
   white-on-cream and disappears. */
.bm-lang-menu a:hover { background: var(--bm-cream); color: var(--bm-brand); }

.bm-header-main .bm-container { display: flex; align-items: center; height: 84px; gap: 32px; }
/* The mark is 394x62 (6.355:1). A fixed height plus the `max-width: 100%`
   from the reset squashes it on narrow screens, and the footer rule below had
   no `width: auto` at all, so the width attribute won and squeezed it even on
   desktop. object-fit keeps the ratio whatever the box ends up being. */
.bm-logo img { height: 36px; width: auto; max-width: 100%; object-fit: contain; }

.bm-nav { display: flex; gap: 28px; flex: 1; justify-content: flex-end; align-items: center; margin-right: 8px; }
.bm-nav-item { position: relative; height: 84px; display: flex; align-items: center; }
.bm-nav-item > a {
  font-size: 14px; font-weight: 500; color: var(--bm-ink); padding: 8px 0;
  position: relative; display: inline-flex; align-items: center; gap: 5px; transition: color .2s ease;
}
.bm-nav-item > a:hover { color: var(--bm-brand); }
.bm-nav-item.is-active > a::after {
  content: ''; position: absolute; bottom: -4px; left: 0; right: 0; height: 2px; background: var(--bm-brand);
}
.bm-caret { width: 9px; height: 6px; transition: transform .2s ease; }
.bm-nav-item:hover .bm-caret { transform: rotate(180deg); }

.bm-drop {
  position: absolute; top: 100%; left: -16px; background: #fff; min-width: 250px;
  padding: 12px 0; box-shadow: 0 12px 32px rgba(0,0,0,.12); border-top: 3px solid var(--bm-brand);
  opacity: 0; visibility: hidden; transform: translateY(-4px); z-index: 200;
  transition: opacity .18s ease, transform .18s ease, visibility .18s;
}
.bm-nav-item:hover > .bm-drop, .bm-drop:focus-within { opacity: 1; visibility: visible; transform: translateY(0); }
.bm-drop a { display: block; padding: 10px 22px; color: var(--bm-ink); font-size: 14px; }
.bm-drop a:hover { background: var(--bm-cream); font-weight: 500; }
.bm-drop-sub a { padding-left: 38px; color: var(--bm-body); font-size: 13px; }

.bm-actions { display: flex; align-items: center; gap: 12px; }
.bm-icon-btn {
  width: 40px; height: 40px; border-radius: 50%; display: flex;
  align-items: center; justify-content: center; color: var(--bm-ink);
  transition: background .2s ease; position: relative;
}
.bm-icon-btn:hover { background: var(--bm-cream); }
.bm-icon-btn svg { width: 20px; height: 20px; }
.bm-badge {
  position: absolute; top: 3px; right: 3px; min-width: 18px; height: 18px; padding: 0 4px;
  background: var(--bm-red); color: #fff; border-radius: 9px; font-size: 10px; font-weight: 700;
  display: flex; align-items: center; justify-content: center;
}

/* ---- search ---- */
.bm-search {
  position: absolute; top: 100%; left: 0; right: 0; background: #fff;
  border-bottom: 1px solid var(--bm-border); box-shadow: 0 12px 32px rgba(0,0,0,.06);
  transform: translateY(-12px); opacity: 0; visibility: hidden; z-index: 90;
  transition: transform .25s ease, opacity .25s ease, visibility 0s linear .25s;
}
.bm-search.is-open {
  transform: translateY(0); opacity: 1; visibility: visible;
  transition: transform .25s ease, opacity .25s ease, visibility 0s;
}
.bm-search .bm-container { padding-top: 28px; padding-bottom: 28px; display: flex; align-items: center; gap: 16px; }
.bm-search form {
  flex: 1; display: flex; align-items: center; gap: 12px;
  border-bottom: 1.5px solid var(--bm-border); padding-bottom: 12px;
  transition: border-color .15s ease;
}
.bm-search form:focus-within { border-bottom-color: var(--bm-brand); border-bottom-width: 2px; padding-bottom: 11.5px; }
.bm-search input:focus, .bm-search input:focus-visible { outline: none; }
.bm-search svg { width: 22px; height: 22px; flex-shrink: 0; }
.bm-search input {
  flex: 1; border: none; outline: none; font-family: inherit; font-size: 22px;
  color: var(--bm-ink); background: transparent; padding: 4px 0;
}
.bm-search input::placeholder { color: var(--bm-meta); }
/* 22px is a display size on a phone. 17px stays above the 16px floor that
   stops iOS zooming the page on focus, and the panel loses padding it cannot
   afford on a small screen. */
@media (max-width: 700px) {
  .bm-search .bm-container { padding-top: 16px; padding-bottom: 16px; gap: 10px; }
  .bm-search input { font-size: 17px; }
  .bm-search svg { width: 19px; height: 19px; }
}

/* ---- mobile ---- */
.bm-burger { display: none; width: 40px; height: 40px; align-items: center; justify-content: center; }
.bm-burger svg { width: 24px; height: 24px; }

.bm-drawer {
  position: fixed; inset: 0; background: rgba(16,16,16,.45); z-index: 300;
  opacity: 0; visibility: hidden; transition: opacity .25s ease, visibility 0s linear .25s;
}
.bm-drawer.is-open { opacity: 1; visibility: visible; transition: opacity .25s ease, visibility 0s; }
.bm-drawer-panel {
  position: absolute; top: 0; right: 0; bottom: 0; width: min(360px, 86vw);
  background: #fff; transform: translateX(100%); transition: transform .3s ease;
  overflow-y: auto; padding: 24px 0; overscroll-behavior: contain;
}
.bm-drawer.is-open .bm-drawer-panel { transform: translateX(0); }
.bm-drawer-head { display: flex; justify-content: space-between; align-items: center; padding: 0 24px 20px; border-bottom: 1px solid var(--bm-border); }
.bm-drawer-head img { height: 28px; width: auto; max-width: 100%; object-fit: contain; }
.bm-mnav-item { border-bottom: 1px solid var(--bm-border); }
.bm-mnav-item > a, .bm-mnav-row {
  display: flex; justify-content: space-between; align-items: center; width: 100%;
  padding: 16px 24px; font-size: 16px; font-weight: 500; color: var(--bm-ink); text-align: left;
}
.bm-mnav-row::after { content: '+'; font-size: 22px; font-weight: 300; }
.bm-mnav-item.is-open .bm-mnav-row::after { content: '−'; }
.bm-mnav-sub { display: none; padding: 10px 24px 16px 36px; background: var(--bm-cream); }
.bm-mnav-item.is-open .bm-mnav-sub { display: block; }
.bm-mnav-sub a { display: block; padding: 10px 0; font-size: 14px; color: var(--bm-body); }
.bm-drawer-foot { padding: 20px 24px; display: flex; flex-direction: column; gap: 14px; }
.bm-drawer-foot a { display: inline-flex; align-items: center; gap: 8px; font-size: 14px; }

@media (max-width: 980px) {
  .bm-nav { display: none; }
  .bm-burger { display: inline-flex; }
  .bm-header-main .bm-container { gap: 16px; justify-content: space-between; height: 68px; }
  .bm-logo { flex: 1; display: flex; justify-content: center; }
  .bm-logo img { height: 30px; }
}
.bm-noscroll { overflow: hidden; }

/* ============ FOOTER ============ */

.bm-footer { background: var(--bm-brand); color: rgba(255,255,255,.75); padding: 80px 0 32px; }
.bm-footer-grid { display: grid; grid-template-columns: 2fr 1fr 1fr 1fr 1fr; gap: 48px; margin-bottom: 64px; }
@media (max-width: 880px) { .bm-footer-grid { grid-template-columns: 1fr 1fr; gap: 32px; } }
@media (max-width: 520px) { .bm-footer-grid { grid-template-columns: 1fr; } }
.bm-footer img.bm-footer-logo { height: 38px; width: auto; max-width: 100%; object-fit: contain; filter: brightness(0) invert(1); margin-bottom: 16px; }
.bm-footer-about { font-size: 14px; line-height: 1.7; max-width: 320px; }
.bm-footer-social { display: flex; flex-wrap: wrap; gap: 8px 18px; margin-top: 20px; list-style: none; }
.bm-footer-social li { margin: 0; }
.bm-footer-social a { font-size: 13px; color: rgba(255,255,255,.75); border-bottom: 1px solid rgba(255,255,255,.25); padding-bottom: 2px; }
.bm-footer-social a:hover { color: #fff; border-bottom-color: #fff; }
.bm-footer h3 { font-size: 12px; font-weight: 700; letter-spacing: 2px; text-transform: uppercase; color: #fff; margin-bottom: 20px; }
.bm-footer ul { list-style: none; margin: 0; padding: 0; }
.bm-footer li { margin-bottom: 10px; }
.bm-footer li a, .bm-footer li { font-size: 14px; color: rgba(255,255,255,.75); }
.bm-footer li a:hover { color: #fff; }
.bm-footer-contact li { display: flex; gap: 10px; align-items: flex-start; }
.bm-footer-contact svg { width: 15px; height: 15px; margin-top: 4px; flex-shrink: 0; }
.bm-footer-bottom {
  border-top: 1px solid rgba(255,255,255,.15); padding-top: 28px; display: flex;
  justify-content: center; text-align: center; flex-wrap: wrap; gap: 16px;
  font-size: 12px; color: rgba(255,255,255,.55);
}

/* ============ COOKIE CONSENT ============

   A centred modal over a dimmed page, not a bar: it has to be answered before
   the site is used, so it should read as a question rather than a notice.

   The one rule that is legal and not aesthetic: "Accept all" and "Reject all"
   are the SAME button in the same row. Do not make refusing quieter — an
   unequal pair is the dark pattern regulators act on, and it would invalidate
   the consent this whole panel exists to collect. */

.bm-consent {
  position: fixed; inset: 0; z-index: 900;
  display: flex; align-items: center; justify-content: center;
  padding: 24px; background: rgba(16,16,16,.6);
  overflow-y: auto; overscroll-behavior: contain;
}
.bm-consent-box {
  position: relative; width: 100%; max-width: 560px; margin: auto;
  background: var(--bm-card); border-radius: var(--bm-radius);
  box-shadow: 0 24px 60px rgba(0,0,0,.28); padding: 36px;
}
.bm-consent-logo { display: block; width: 168px; height: auto; margin: 0 0 20px; }
.bm-consent-box h2 { font-size: 24px; line-height: 1.2; margin: 0 0 12px; color: var(--bm-ink); }
.bm-consent-box > p { margin: 0 0 24px; font-size: 15px; line-height: 1.6; color: var(--bm-body); }

.bm-consent-close {
  position: absolute; top: 14px; right: 14px; width: 34px; height: 34px;
  display: flex; align-items: center; justify-content: center;
  font-size: 24px; line-height: 1; color: var(--bm-meta);
  border-radius: var(--bm-radius); transition: color .2s ease, background .2s ease;
}
.bm-consent-close:hover { color: var(--bm-ink); background: var(--bm-cream); }

.bm-consent-cats { border-top: 1px solid var(--bm-border); margin-bottom: 24px; }
.bm-consent-cat { border-bottom: 1px solid var(--bm-border); padding: 16px 0; }
.bm-consent-cat-head {
  display: flex; align-items: center; justify-content: space-between; gap: 16px;
}
.bm-consent-cat-head strong { font-size: 15px; color: var(--bm-ink); }
.bm-consent-cat-head label { cursor: pointer; }
.bm-consent-cat p { margin: 6px 0 0; font-size: 13px; line-height: 1.6; color: var(--bm-body); }
.bm-consent-locked { font-size: 12px; font-weight: 600; color: var(--bm-meta); }
.bm-consent-cat input[type="checkbox"] { width: 20px; height: 20px; flex: none; cursor: pointer; accent-color: var(--bm-brand); }

/* Accept and Reject are deliberately IDENTICAL — same class, same width, same
   row. Styling one louder than the other is the deceptive-design pattern EDPB
   Guidelines 03/2022 describes, and it invalidates the consent collected.

   "Save choices" is a different action, not half of that pair, so it is allowed
   to look different — and it should, otherwise the panel is three identical
   buttons and the visitor has to read all three to tell them apart. It also
   drops onto its own row, which separates it from the pair. */
.bm-consent-actions { display: flex; gap: 12px; flex-wrap: wrap; }
.bm-consent-actions .bm-btn { flex: 1 1 0; min-width: 150px; }
.bm-consent-actions .bm-btn--outline { flex: 1 1 100%; }

.bm-consent-links {
  display: flex; gap: 24px; flex-wrap: wrap; align-items: center;
  margin-top: 20px; padding-top: 18px; border-top: 1px solid var(--bm-border);
}
.bm-consent-links .bm-link { font-size: 14px; }

/* The footer entry point for changing a stored choice. It is a <button>, so it
   needs the surrounding footer link styling rather than the brand-coloured
   .bm-link, which is invisible on the dark ground. */
.bm-footer-bottom [data-bm-consent-open] {
  font-size: 12px; color: rgba(255,255,255,.55); text-decoration: underline;
  transition: color .2s ease;
}
.bm-footer-bottom [data-bm-consent-open]:hover { color: #fff; }

/* Stays a modal on a phone — a card with the page still visible around it.
   Edge-to-edge it read as a different site rather than a question from this
   one, so the gutter and the corners are load-bearing, not decoration. The
   card scrolls inside itself instead of growing to the full screen. */
@media (max-width: 560px) {
  .bm-consent { padding: 16px; }
  .bm-consent-box {
    padding: 26px 20px; max-width: none;
    max-height: calc(100vh - 32px); overflow-y: auto; overscroll-behavior: contain;
  }
  .bm-consent-actions .bm-btn { flex: 1 1 100%; }
}
@supports (height: 100dvh) {
  @media (max-width: 560px) {
    /* dvh so the card is not cut off by the browser's collapsing address bar. */
    .bm-consent-box { max-height: calc(100dvh - 32px); }
  }
}

/* ============ NOTICES ============ */

/* Had padding but no margin, so a flash message sat flush against the first
   field label under it. */
.bm-note { padding: 14px 18px; margin-bottom: 22px; font-size: 14px; border-left: 3px solid var(--bm-brand); background: var(--bm-cream); }
.bm-note--error { border-color: var(--bm-red); background: #fdf2f3; color: #7d1020; }
.bm-note--ok { border-color: var(--bm-ok); background: #f1f8f4; color: #1e5740; }

/* ============ MOTION ============ */

@media (prefers-reduced-motion: reduce) {
  .bm *, .bm *::before, .bm *::after {
    animation-duration: .001ms !important; transition-duration: .001ms !important;
  }
}

/* ============ HERO ============ */
/* Banners are uploaded 1800x700. The image runs full-bleed at that ratio so
   nothing is cropped; height:auto is required here or the HTML height
   attribute wins over aspect-ratio. */

.bm-hero-photo { position: relative; background: var(--bm-cream); }
.bm-hero-photo-link { position: relative; display: block; color: #fff; }
.bm-hero-photo img {
  display: block; width: 100%; height: auto;
  aspect-ratio: 18/7; object-fit: cover;
}
.bm-hero-photo-copy {
  position: absolute; inset: auto 0 0 0; display: block;
  padding: 120px max(32px, calc((100vw - var(--bm-container)) / 2 + 32px)) 44px;
  background: linear-gradient(to top, rgba(16,16,16,.6), transparent);
}
.bm-hero-eyebrow { display: block; color: rgba(255,255,255,.85); margin-bottom: 14px; }
.bm-hero-title {
  display: block; color: #fff; font-size: clamp(30px, 4.4vw, 60px);
  max-width: 700px; line-height: 1.05; font-weight: 700; letter-spacing: -.01em; margin: 0;
}

/* ============ COLOUR OF THE YEAR STRIP ============ */
/* Sits directly under the banner: one painted band carrying the colour, its
   code and the two ways in. Nothing to crop, nothing to mis-size. */

.bm-coy-strip { background: var(--bm-paint); color: var(--bm-on-paint); --bm-focus: var(--bm-on-paint); }
.bm-coy-inner {
  display: flex; align-items: center; justify-content: space-between;
  flex-wrap: wrap; gap: 22px 40px; padding-top: 32px; padding-bottom: 32px;
}
.bm-coy-eyebrow { display: block; color: currentColor; opacity: .72; margin-bottom: 10px; }
.bm-coy-name {
  margin: 0; font-size: clamp(26px, 3.4vw, 42px); font-weight: 700;
  line-height: 1.05; letter-spacing: -.015em;
  display: flex; align-items: baseline; gap: 14px; flex-wrap: wrap;
}
.bm-coy-code { font-size: 13px; font-weight: 500; letter-spacing: 1.6px; opacity: .68; }
.bm-coy-actions { display: flex; gap: 12px; flex-wrap: wrap; }

@media (max-width: 640px) {
  .bm-hero-photo-copy { padding-top: 80px; padding-bottom: 24px; }
  .bm-coy-inner { padding-top: 26px; padding-bottom: 26px; }
  .bm-coy-actions { width: 100%; }
  .bm-coy-actions .bm-btn { flex: 1; justify-content: center; }
}

/* ============ CATEGORY CARD ============ */

.bm-cat {
  position: relative; display: block; overflow: hidden; color: #fff;
  aspect-ratio: 4/3;
}
.bm-cat img { width: 100%; height: 100%; object-fit: cover; transition: transform .5s ease; }
.bm-cat:hover img { transform: scale(1.04); }
/* Product packshots are often light, so the scrim has to be strong enough to
   carry white text over a white can — a soft gradient is not enough here. */
.bm-cat-body {
  position: absolute; inset: auto 0 0 0; padding: 32px;
  background: linear-gradient(to top, rgba(16,16,16,.92) 0%, rgba(16,16,16,.72) 45%, rgba(16,16,16,0) 100%);
  padding-top: 72px; display: block;
}
.bm-cat-title { display: block; font-size: 36px; font-weight: 700; margin-bottom: 14px; }
.bm-cat-link { display: inline-flex; gap: 8px; font-size: 15px; font-weight: 700; }
.bm-cat-link::after { content: '→'; transition: transform .2s ease; }
.bm-cat:hover .bm-cat-link::after { transform: translateX(4px); }
@media (max-width: 640px) { .bm-cat-body { padding: 22px; } .bm-cat-title { font-size: 21px; } }

/* ============ ALBUM CARD (image variant) ============ */

/* Every album photo in the database is square (0.88-1.11). A 16/11 tile was
   cropping 30-40% off the top and bottom of all nine. Square tiles match the
   source, so the worst case now loses ~12% instead. `contain` was the wrong
   answer: the shots have different background tints, so letterboxing them
   against one colour looks worse than a slight crop. */
.bm-album img { width: 100%; height: auto; aspect-ratio: 1/1; object-fit: cover; background: var(--bm-cream); }
.bm-album-info { display: block; }
.bm-album-name, .bm-album-count { display: block; }

/* ============ TRUST BAND ============ */

.bm-trust { display: grid; grid-template-columns: 1fr 2fr; gap: 64px; align-items: start; }
.bm-trust-items { display: grid; grid-template-columns: repeat(3, 1fr); gap: 40px; }
.bm-trust-num {
  font-size: 30px; font-weight: 700; color: #fff; letter-spacing: -.02em;
  margin-bottom: 10px; padding-bottom: 14px; border-bottom: 1px solid rgba(255,255,255,.2);
}
.bm-trust p { font-size: 15px; line-height: 1.6; margin: 0; }
@media (max-width: 880px) {
  .bm-trust { grid-template-columns: 1fr; gap: 32px; }
  .bm-trust-items { grid-template-columns: 1fr; gap: 28px; }
}

/* ============ SPLIT ============ */

.bm-split { display: grid; grid-template-columns: 1fr 1fr; align-items: center; gap: 80px; }
.bm-split img { width: 100%; height: auto; aspect-ratio: 4/3; object-fit: cover; }
.bm-split-body .bm-eyebrow { margin-bottom: 18px; }
.bm-split-body h2 { color: var(--bm-brand); margin-bottom: 28px; max-width: 460px; }
@media (max-width: 880px) { .bm-split { grid-template-columns: 1fr; gap: 32px; } }

/* ============ PAGE BANNER ============ */

/* The banner sources are 1800x700 with text baked into the artwork, and a
   340px box against a 2.57:1 image cropped away 41% of its height — enough to
   cut "OPEN FOR BUSINESS. OPEN FOR YOU" through the middle of a word. Showing
   the source's own ratio means nothing is severed; the cap only engages above
   ~1340px wide, and then trims about 11%. */
.bm-page-banner img {
  width: 100%; height: auto; aspect-ratio: 18 / 7;
  max-height: 560px; object-fit: cover; display: block;
  /* Banners are authored 1800x700 (= 18/7), so up to 1440px wide nothing is
     cropped. Past that the cap kicks in; biasing below centre keeps the subject
     — product shots stand on the lower edge — instead of slicing it in half. */
  object-position: center 62%;
}

/* ============ BROWSE ============ */

/* Cream band in place of the photo banner. */
.bm-browse-hero { background: var(--bm-cream); padding: 56px 0 60px; }
.bm-browse-hero h1 { font-size: 44px; color: var(--bm-ink); margin-bottom: 14px; }
.bm-browse-hero p { font-size: 17px; color: var(--bm-body); line-height: 1.65; max-width: 640px; }
@media (max-width: 768px) {
  .bm-browse-hero { padding: 34px 0 38px; }
  .bm-browse-hero h1 { font-size: 28px; margin-bottom: 10px; }
  .bm-browse-hero p { font-size: 15px; }
}

/* Toolbar — result count left, sort right. Full-width white bar that sticks
   under the header. --bm-stick is maintained in bm.js: it is the nav row
   height, and 0 while the header is hidden, so this rides up with it. */
.bm-browse-bar {
  background: #fff; border-bottom: 1px solid var(--bm-border);
  padding: 14px 0; position: sticky; top: var(--bm-stick, 0px); z-index: 50;
}
.bm-browse-bar .bm-container {
  display: flex; align-items: center; justify-content: space-between;
  gap: 16px; flex-wrap: wrap;
}
.bm-result-count { margin: 0; font-size: 14px; color: var(--bm-body); }
/* On the album page the bar is the album's own count rather than a toolbar,
   and the family chips sat directly on its bottom border. */
[data-bm-colorpanel] > .bm-browse-bar { margin-bottom: 26px; }

.bm-result-count strong { color: var(--bm-ink); font-weight: 700; }
.bm-sort { display: flex; align-items: center; gap: 10px; font-size: 14px; }
.bm-sort label { color: var(--bm-meta); }
.bm-sort-select {
  appearance: none; font-family: inherit; font-size: 14px; font-weight: 500;
  color: var(--bm-brand); background-color: #fff;
  border: 1px solid var(--bm-border); border-radius: var(--bm-radius);
  padding: 9px 38px 9px 14px; cursor: pointer;
  background-image: url("data:image/svg+xml,%3Csvg width='12' height='8' viewBox='0 0 12 8' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%23101010' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right 13px center;
}
.bm-sort-select:focus { outline: none; border-color: var(--bm-brand); }
/* One row on phones: the count loses its "of N" half and the sort loses its
   label, so the sticky bar stays a single line instead of eating two. */
@media (max-width: 560px) {
  .bm-browse-bar { padding: 11px 0; }
  .bm-browse-bar .bm-container { gap: 12px; flex-wrap: nowrap; }
  .bm-result-count { font-size: 13px; white-space: nowrap; }
  .bm-sort-label { display: none; }
  .bm-sort-select { padding: 7px 32px 7px 12px; font-size: 13px; }
}

.bm-browse { display: grid; grid-template-columns: 260px 1fr; gap: 48px; align-items: start; }
@media (max-width: 980px) { .bm-browse { grid-template-columns: 1fr; gap: 24px; } }

.bm-filters-toggle {
  display: none; width: 100%; justify-content: space-between; align-items: center;
  padding: 14px 16px; border: 1px solid var(--bm-border); font-weight: 600; font-size: 14px;
  text-transform: uppercase; letter-spacing: 1px;
}
.bm-filters-toggle[aria-expanded="true"] .bm-caret { transform: rotate(180deg); }
/* Filters are a panel, not loose labels on the page ground, and they stay put
   while the grid scrolls. */
.bm-filters {
  position: sticky; top: calc(var(--bm-stick, 0px) + var(--bm-bar, 67px) + 32px); align-self: start;
  background: #fff; border: 1px solid var(--bm-border); border-radius: var(--bm-radius);
}
.bm-filter-head {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 15px 20px; border-bottom: 1px solid var(--bm-border);
}
.bm-filter-head h2 { font-size: 17px; color: var(--bm-ink); }
.bm-filter-group { padding: 16px 20px; border-bottom: 1px solid var(--bm-border); }
.bm-filter-group:last-child { border-bottom: none; }
.bm-filter-label {
  font-size: 11px; font-weight: 600; letter-spacing: 1.6px; text-transform: uppercase;
  color: var(--bm-meta); margin-bottom: 10px;
}
.bm-filter-chips { display: flex; flex-wrap: wrap; gap: 8px; }
.bm-filter-clear { font-size: 12px; font-weight: 500; letter-spacing: .5px; text-transform: uppercase; color: var(--bm-meta); }
/* The footer copy only exists for the collapsed mobile panel. */
.bm-filter-apply .bm-filter-clear { display: none; }
/* Active-filter count on the collapsed toggle. */
.bm-filters-n {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 20px; height: 20px; margin-left: 9px; padding: 0 6px;
  background: var(--bm-brand); color: #fff; border-radius: 10px;
  font-size: 12px; font-weight: 700; letter-spacing: 0;
}
.bm-filter-clear:hover { color: var(--bm-brand); }

.bm-chip {
  display: inline-flex; align-items: center; justify-content: center;
  padding: 9px 14px; font-size: 14px; font-family: inherit; color: var(--bm-ink);
  border: 1px solid var(--bm-border); background: #fff; transition: all .15s ease;
}
.bm-chip:hover { border-color: var(--bm-brand); }
.bm-chip.is-on { background: var(--bm-brand); border-color: var(--bm-brand); color: #fff; }
.bm-chip--static { pointer-events: none; background: var(--bm-cream); border-color: transparent; }

/* Family chips on an album page. Wraps rather than scrolls: a collection can
   span all 12 families and a hidden horizontal overflow would bury half of
   them. */
.bm-famfilter { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 28px; }
/* Desktop shows the chips outright — they cost two rows. The toggle only
   exists below 880px, where they cost five. */
.bm-famfilter-toggle { display: none; }
.bm-chip-n { margin-left: 7px; font-size: 12px; color: var(--bm-meta); }
.bm-chip.is-on .bm-chip-n { color: rgba(255,255,255,.7); }

.bm-paging { margin-top: 48px; display: flex; justify-content: center; }
.bm-paging ul { display: flex; flex-wrap: wrap; justify-content: center; list-style: none; margin: 0; padding: 0; }
.bm-paging li.active a, .bm-paging li.current a { background: var(--bm-brand); border-color: var(--bm-brand); color: #fff; }
.bm-paging a, .bm-paging span {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 40px; height: 40px; padding: 0 10px; margin: 0 3px;
  border: 1px solid var(--bm-border); font-size: 14px; color: var(--bm-ink);
}
.bm-paging a:hover { border-color: var(--bm-brand); }
.bm-paging .active, .bm-paging .current { background: var(--bm-brand); border-color: var(--bm-brand); color: #fff; }

/* Keeps scrollIntoView from parking the first row under the sticky bars. */
[data-bm-prodgrid] { scroll-margin-top: calc(var(--bm-stick, 0px) + var(--bm-bar, 67px) + 20px); }

/* Desktop keeps the panel open, so there is nothing to apply. */
.bm-filter-apply { display: none; }

@media (max-width: 980px) {
  /* Below the two-column breakpoint the panel collapses behind its own button,
     so it must not stick or it would hover over the grid. */
  .bm-filters { position: static; border: none; background: transparent; }
  .bm-filter-apply {
    display: flex; flex-direction: column; align-items: center; gap: 14px;
    padding: 16px 20px; border-top: 1px solid var(--bm-border);
  }
  .bm-filter-apply .bm-filter-clear { display: inline-block; }
  .bm-filters-toggle { display: flex; }
  .bm-filters-body { display: none; background: #fff; border: 1px solid var(--bm-border); border-top: none; }
  .bm-filters-body.is-open { display: block; }
  .bm-filter-head { display: none; }
}

/* ============ PRODUCT DETAIL ============ */

.bm-pdp { display: grid; grid-template-columns: 1fr 1fr; gap: 64px; align-items: start; }
@media (max-width: 880px) { .bm-pdp { grid-template-columns: 1fr; gap: 32px; } }

.bm-pdp-left { min-width: 0; }
.bm-pdp-media { position: relative; background: #fff; border: 1px solid var(--bm-border); padding: 6%; }
.bm-pdp-media img { width: 100%; height: auto; object-fit: contain; }

.bm-pdp-info h1 { font-size: 38px; margin-bottom: 18px; }
@media (max-width: 768px) { .bm-pdp-info h1 { font-size: 27px; } }
.bm-pdp-price { display: flex; align-items: baseline; gap: 12px; margin-bottom: 28px; }
.bm-price-now { font-size: 30px; font-weight: 700; }
.bm-price-old { font-size: 18px; color: var(--bm-meta); }

.bm-pdp-row {
  display: grid; grid-template-columns: 130px 1fr; gap: 16px; align-items: start;
  padding: 16px 0; border-top: 1px solid var(--bm-border);
}
.bm-pdp-key { font-size: 13px; font-weight: 600; color: var(--bm-meta); padding-top: 8px; }
.bm-pdp-val { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
@media (max-width: 560px) { .bm-pdp-row { grid-template-columns: 1fr; gap: 8px; } .bm-pdp-key { padding-top: 0; } }
/* Inline "pick a size" message, in the options column under the chips. */
.bm-pdp-hint { display: none; grid-column: 2; font-size: 13px; font-weight: 600; color: var(--bm-red); }
.bm-pdp-row.is-missing .bm-pdp-hint { display: block; margin-top: 4px; }
.bm-pdp-row.is-missing .bm-chip { border-color: var(--bm-red); }
@media (max-width: 560px) { .bm-pdp-hint { grid-column: 1; } }

.bm-pdp-buy { display: flex; gap: 14px; align-items: stretch; margin-top: 28px; flex-wrap: wrap; }
.bm-qty { display: flex; border: 1px solid var(--bm-border); }
.bm-qty button { width: 46px; font-size: 18px; color: var(--bm-ink); }
.bm-qty button:hover { background: var(--bm-cream); }
.bm-qty input { width: 54px; border: none; text-align: center; font-family: inherit; font-size: 16px; outline: none; }
.bm-pdp-buy .bm-btn { flex: 1; min-width: 200px; }
/* On a 375px screen the 200px minimum plus the stepper cannot share a line, so
   the button wrapped and left the stepper stranded on a row of its own. Narrow
   both a little and they fit together, which is also how they read on desktop. */
@media (max-width: 560px) {
  .bm-pdp-buy { gap: 10px; flex-wrap: nowrap; }
  .bm-pdp-buy .bm-btn { min-width: 0; padding-left: 12px; padding-right: 12px; }
  .bm-qty { flex: 0 0 auto; }
  .bm-qty button { width: 40px; }
  .bm-qty input { width: 40px; }
}

.bm-color-trigger {
  display: flex; align-items: center; gap: 10px; padding: 11px 16px;
  border: 1px solid var(--bm-border); font-size: 15px; color: var(--bm-ink); font-family: inherit;
}
.bm-color-trigger:hover { border-color: var(--bm-brand); }
.bm-color-dot { width: 20px; height: 20px; border: 1px solid rgba(0,0,0,.12); flex-shrink: 0; }
.bm-color-change { font-size: 12px; color: var(--bm-meta); text-decoration: underline; text-underline-offset: 3px; margin-left: 6px; }
.bm-color-remove { font-size: 13px; color: var(--bm-red); text-decoration: underline; text-underline-offset: 3px; }

.bm-pdp-detail { margin-top: 72px; display: grid; grid-template-columns: 1fr 340px; gap: 64px; align-items: start; }
@media (max-width: 980px) { .bm-pdp-detail { grid-template-columns: 1fr; gap: 36px; margin-top: 48px; } }
.bm-doc {
  display: flex; align-items: center; gap: 14px; padding: 16px;
  border: 1px solid var(--bm-border); margin-top: 12px; font-size: 14px;
}
.bm-doc:hover { border-color: var(--bm-brand); }
.bm-doc-type { font-size: 11px; font-weight: 700; background: var(--bm-brand); color: #fff; padding: 4px 7px; }
.bm-doc span:nth-child(2) { flex: 1; }
.bm-doc-dl { color: var(--bm-meta); }

/* ============ COLOUR SIDE SHEET ============ */

.bm-sheet {
  position: fixed; inset: 0; background: rgba(16,16,16,.45); z-index: 350;
  opacity: 0; visibility: hidden; transition: opacity .25s ease, visibility 0s linear .25s;
}
.bm-sheet.is-open { opacity: 1; visibility: visible; transition: opacity .25s ease, visibility 0s; }
.bm-sheet-panel {
  position: absolute; top: 0; right: 0; bottom: 0; width: min(440px, 92vw);
  background: #fff; display: flex; flex-direction: column;
  transform: translateX(100%); transition: transform .3s ease;
}
.bm-sheet.is-open .bm-sheet-panel { transform: translateX(0); }
.bm-sheet-head { display: flex; justify-content: space-between; align-items: center; padding: 20px 24px; border-bottom: 1px solid var(--bm-border); }
.bm-sheet-search { padding: 20px 24px; }
.bm-sheet-results { flex: 1; overflow-y: auto; padding: 0 12px 12px; overscroll-behavior: contain; }
.bm-sheet-msg { padding: 20px 12px; color: var(--bm-meta); font-size: 14px; }
.bm-sheet-foot { padding: 18px 24px; border-top: 1px solid var(--bm-border); }
.bm-color-row {
  display: flex; align-items: center; gap: 14px; width: 100%;
  padding: 11px 12px; font-family: inherit; font-size: 15px; text-align: left; color: var(--bm-ink);
}
.bm-color-row:hover { background: var(--bm-cream); }
.bm-color-chip { width: 30px; height: 30px; flex-shrink: 0; border: 1px solid rgba(0,0,0,.12); }

/* Browse-by tabs inside the colour sheet. */
.bm-sheet-tabs { display: flex; gap: 4px; padding: 0 24px; border-bottom: 1px solid var(--bm-border); }
.bm-sheet-tab {
  padding: 11px 2px; margin-right: 22px; font-family: inherit; font-size: 14px; font-weight: 600;
  color: var(--bm-meta); border-bottom: 2px solid transparent; margin-bottom: -1px;
}
.bm-sheet-tab:hover { color: var(--bm-ink); }
.bm-sheet-tab.is-on { color: var(--bm-brand); border-bottom-color: var(--bm-brand); }

.bm-sheet-back {
  display: flex; align-items: center; gap: 7px; width: 100%;
  padding: 12px 24px; font-family: inherit; font-size: 13px; font-weight: 600;
  color: var(--bm-meta); text-align: left; border-bottom: 1px solid var(--bm-border);
}
.bm-sheet-back:hover { color: var(--bm-brand); }

/* A palette row: five hexes say more about a collection than its name does. */
.bm-album-row {
  display: flex; align-items: center; gap: 14px; width: 100%;
  padding: 10px 12px; font-family: inherit; font-size: 15px; text-align: left; color: var(--bm-ink);
}
.bm-album-row:hover { background: var(--bm-cream); }
.bm-album-strip { display: flex; flex-shrink: 0; width: 72px; height: 30px; border: 1px solid rgba(0,0,0,.12); }
.bm-album-strip i { flex: 1; }
.bm-album-name { flex: 1; min-width: 0; }
.bm-album-n { color: var(--bm-meta); font-size: 13px; flex-shrink: 0; }
.bm-sheet-more { display: block; width: calc(100% - 24px); margin: 14px 12px 4px; }

/* ============ DIALOG ============ */

/* margin:auto is what centres a modal <dialog> — it comes from the UA
   stylesheet, and the `.bm :where(*)` reset above wipes it (author styles beat
   UA styles regardless of specificity), which pinned every modal to a corner.
   Set it explicitly so the reset can't take it away again. */
.bm-dialog, .bm-lightbox { margin: auto; }
.bm-dialog { border: none; padding: 32px; max-width: 460px; width: calc(100% - 40px); box-shadow: 0 24px 60px rgba(0,0,0,.2); }
.bm-dialog::backdrop { background: rgba(16,16,16,.5); }
.bm-dialog h2 { font-size: 22px; margin-bottom: 12px; }
.bm-dialog p { color: var(--bm-body); margin-bottom: 24px; }
.bm-dialog-actions { display: flex; gap: 12px; flex-wrap: wrap; }
.bm-dialog-actions > * { flex: 1; }

/* ============ COLOURS ============ */

.bm-colors-intro { max-width: 760px; }
.bm-colors-intro h1 { font-size: 44px; margin-bottom: 12px; }
.bm-colors-intro .bm-eyebrow { margin-bottom: 14px; }
.bm-colors-intro .bm-album-count { margin-bottom: 20px; }
/* The h1's 12px is sized for a lead paragraph directly under it. On the products
   page the category grid follows instead, so space the block off when something
   comes after it inside the same container. */
.bm-colors-intro:not(:last-child) { margin-bottom: 40px; }
@media (max-width: 768px) {
  .bm-colors-intro h1 { font-size: 30px; }
  .bm-colors-intro:not(:last-child) { margin-bottom: 26px; }
}

/* Full-bleed swatch wall — the paint fills the page edge to edge. */
.bm-swatch-wall {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
}
.bm-swatch-wall--sm { grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); }
.bm-swatch {
  display: flex; flex-direction: column; justify-content: flex-end;
  min-height: 180px; padding: 18px; transition: transform .18s ease;
}
.bm-swatch-wall--sm .bm-swatch { min-height: 140px; }
.bm-swatch:hover { transform: scale(1.03); z-index: 2; position: relative; }
.bm-swatch-name { font-size: 15px; font-weight: 600; line-height: 1.25; }
.bm-swatch-code { font-size: 12px; opacity: .75; letter-spacing: .5px; margin-top: 3px; }

/* A 250px strip on a page whose whole subject is one colour. The paint should
   dominate. */
.bm-color-hero {
  display: flex; align-items: center; position: relative; overflow: hidden;
  min-height: 540px; padding: 72px 0;
}
.bm-color-hero::after {
  content: ''; position: absolute; inset: 0; pointer-events: none;
  background: linear-gradient(135deg, transparent 60%, rgba(0,0,0,.15) 100%);
}
/* width:100% because the container is now a flex item — without it the box
   shrinks to its content and `margin: 0 auto` centres it, pushing the name
   into the middle of the hero. */
.bm-color-hero > .bm-container { position: relative; z-index: 1; width: 100%; }
.bm-color-hero h1 { color: inherit; font-size: clamp(44px, 7vw, 104px); line-height: .95; letter-spacing: -.04em; }
.bm-color-code { font-size: 22px; opacity: .72; margin-top: 16px; letter-spacing: 4px; }

/* Hero CTA. The hero paints itself the colour being viewed, so the button has
   to work on anything from Hale Navy to Frostine — hence currentColor for the
   border and a transparent fill rather than a fixed palette colour. */
.bm-color-cta {
  margin-top: 30px; background: transparent; color: inherit;
  border: 1.5px solid currentColor; padding: 14px 30px;
}
/* No colour-swap on hover: the hero can be Hale Navy or Frostine, and any
   fixed pair would vanish against one of them. */
.bm-color-cta:hover { opacity: .75; }
#order { scroll-margin-top: calc(var(--bm-stick, 0px) + 20px); }

.bm-color-meta {
  display: flex; flex-wrap: wrap; gap: 10px 24px; margin-bottom: 24px;
  font-size: 13px; letter-spacing: 1px; text-transform: uppercase;
}
.bm-color-meta a { color: inherit; opacity: .75; border-bottom: 1px solid currentColor; padding-bottom: 2px; }
.bm-color-meta a:hover { opacity: 1; }
@media (max-width: 768px) { .bm-color-hero { min-height: 380px; padding: 56px 0; } }
.bm-color-flag {
  display: inline-block; background: var(--bm-red); color: #fff; font-size: 11px;
  font-weight: 700; letter-spacing: 1px; text-transform: uppercase; padding: 5px 10px; margin-bottom: 18px;
}

.bm-color-body { display: grid; grid-template-columns: 1.6fr 1fr; gap: 80px; align-items: start; }
.bm-color-about h2 { font-size: 36px; color: var(--bm-brand); line-height: 1.15; margin: 14px 0 0; letter-spacing: -.02em; }
.bm-color-lead { font-size: 18px; line-height: 1.7; color: var(--bm-body); margin-top: 20px; }
.bm-color-specs { background: var(--bm-cream); padding: 28px 30px 32px; }
.bm-color-specs .bm-specs > div { grid-template-columns: 1fr auto; gap: 20px; }
.bm-color-specs .bm-specs > div:last-child { border-bottom: 0; }
@media (max-width: 980px) { .bm-color-body { grid-template-columns: 1fr; gap: 40px; } }

/* LRV is a 0-100 reflectance figure. The number is real data on 4021 of 4082
   colours but nobody reads 8.36 as "nearly black". */
.bm-lrv {
  position: relative; height: 10px; margin-top: 14px;
  background: linear-gradient(90deg, #101010 0%, #8c8880 50%, #ffffff 100%);
  border: 1px solid var(--bm-border);
}
.bm-lrv-marker { position: absolute; top: 50%; width: 0; }
.bm-lrv-marker span {
  display: block; width: 18px; height: 18px; margin: -9px 0 0 -9px;
  box-shadow: 0 0 0 2px #fff, 0 0 0 3px rgba(16,16,16,.35);
}
.bm-lrv-labels {
  display: flex; justify-content: space-between; margin-top: 10px;
  font-size: 11px; letter-spacing: .5px; color: var(--bm-meta); text-transform: uppercase;
}

.bm-specs { margin: 0; }
.bm-specs > div { display: grid; grid-template-columns: 200px 1fr; gap: 16px; padding: 13px 0; border-bottom: 1px solid var(--bm-border); }
.bm-specs dt { font-size: 14px; color: var(--bm-meta); margin: 0; }
.bm-specs dd { font-size: 15px; font-weight: 600; color: var(--bm-ink); margin: 0; }
@media (max-width: 560px) { .bm-specs > div { grid-template-columns: 1fr; gap: 4px; } }

.bm-side-title { font-size: 12px; font-weight: 700; letter-spacing: 2px; text-transform: uppercase; color: var(--bm-meta); margin-bottom: 16px; }

.bm-combo { display: flex; flex-direction: column; }
/* Same hairline the colour tiles carry. Without it a pale pairing dissolves
   into the cream section behind it, and two pale blocks next to each other
   read as one. */
.bm-combo-main, .bm-combo-pair a {
  display: flex; flex-direction: column; justify-content: flex-end;
  padding: 18px; min-height: 140px;
  box-shadow: inset 0 0 0 1px rgba(16,16,16,.10);
}
.bm-combo-main strong, .bm-combo-pair a strong { font-size: 15px; }
.bm-combo-main span, .bm-combo-pair a span { font-size: 12px; opacity: .78; }
.bm-combo-pair { display: grid; grid-template-columns: 1fr 1fr; }
.bm-combo-pair a { min-height: 110px; transition: transform .18s ease; }
.bm-combo-pair a:hover { transform: scale(1.03); z-index: 2; }

/* ============ CART ============ */

.bm-page-title { font-size: 40px; margin-bottom: 36px; }
@media (max-width: 768px) { .bm-page-title { font-size: 28px; margin-bottom: 24px; } }

.bm-cart { display: grid; grid-template-columns: 1fr 360px; gap: 56px; align-items: start; }
@media (max-width: 980px) { .bm-cart { grid-template-columns: 1fr; gap: 32px; } }

.bm-cart-item {
  display: grid; grid-template-columns: 100px 1fr auto auto; gap: 24px;
  align-items: center; padding: 22px 0; border-bottom: 1px solid var(--bm-border);
}
.bm-cart-item:first-child { border-top: 1px solid var(--bm-border); }
.bm-cart-thumb { background: #fff; border: 1px solid var(--bm-border); padding: 8px; }
.bm-cart-thumb img { width: 100%; height: auto; object-fit: contain; }
.bm-cart-name { font-size: 16px; font-weight: 700; margin-bottom: 6px; }
.bm-cart-attr { font-size: 13px; color: var(--bm-body); display: flex; align-items: center; gap: 8px; margin-top: 3px; }
.bm-cart-attr .bm-color-dot { width: 15px; height: 15px; }
.bm-cart-remove { display: inline-block; margin-top: 10px; font-size: 13px; color: var(--bm-red); text-decoration: underline; text-underline-offset: 3px; }
.bm-cart-line { text-align: right; white-space: nowrap; }
.bm-cart-line strong { font-size: 17px; display: block; }
.bm-cart-line span { font-size: 12px; color: var(--bm-meta); }
/* Deliberately NOT pointer-events:none. The old site let you tap + four times
   and sent one request with the final number; disabling the control on the
   first tap made the debounce behind it unreachable. Feedback only. */
.bm-qty.is-pending { border-color: var(--bm-brand); }
.bm-qty.is-pending input { color: var(--bm-meta); }

@media (max-width: 700px) {
  .bm-cart-item { grid-template-columns: 80px 1fr; gap: 16px; }
  .bm-cart-qty, .bm-cart-line { grid-column: 2; }
  /* Grid items stretch by default, so the stepper filled the whole column and
     threw the - and + to opposite edges of the screen. */
  .bm-cart-qty { justify-self: start; }
  .bm-cart-line { text-align: left; }
}

.bm-cart-summary { background: var(--bm-cream); padding: 32px; position: sticky; top: 110px; }
.bm-cart-summary h2 { font-size: 13px; font-weight: 700; letter-spacing: 2px; text-transform: uppercase; margin-bottom: 24px; }
.bm-sum-row { display: flex; justify-content: space-between; gap: 16px; padding: 11px 0; font-size: 15px; color: var(--bm-body); }
.bm-sum-row strong { color: var(--bm-ink); }
.bm-sum-row--total { border-top: 1px solid var(--bm-border); margin-top: 8px; padding-top: 18px; font-size: 18px; }
.bm-sum-row--total strong { font-size: 22px; }
.bm-cart-summary .bm-btn { margin-top: 24px; }
.bm-cart-continue { display: block; text-align: center; margin-top: 16px; font-size: 14px; color: var(--bm-body); text-decoration: underline; text-underline-offset: 3px; }
/* Promo code, in the cart summary. `.bm-cart-summary .bm-btn` carries a
   24px top margin for the checkout button, so the Apply button has to opt out
   or it sits a row below its own input. */
.bm-promo { margin-top: 22px; padding-top: 20px; border-top: 1px solid var(--bm-border); }
.bm-promo .bm-label { margin-bottom: 8px; }
/* Wraps rather than squeezing: the button's label is editable in Преводи, and
   a long one used to shrink the input until "Въведи код" was clipped. The
   input keeps a 150px basis, so the button drops to its own line instead. */
.bm-promo-row { display: flex; flex-wrap: wrap; gap: 8px; }
.bm-promo-row .bm-input { flex: 1 1 150px; }
.bm-promo-row .bm-btn { margin-top: 0; flex: 0 1 auto; padding-left: 18px; padding-right: 18px; }
.bm-promo--on { display: flex; justify-content: space-between; align-items: baseline; gap: 16px; font-size: 15px; }
.bm-promo--on b { display: block; letter-spacing: 1px; text-transform: uppercase; }
.bm-promo--on small { display: block; margin-top: 3px; font-size: 13px; color: var(--bm-body); }
.bm-promo--on a { flex: 0 0 auto; font-size: 13px; color: var(--bm-body); text-decoration: underline; text-underline-offset: 3px; }
.bm-promo--on a:hover { color: var(--bm-ink); }
@media (max-width: 980px) { .bm-cart-summary { position: static; } }

.bm-empty { padding: 64px 0; text-align: center; }
.bm-empty p { color: var(--bm-body); margin-bottom: 24px; }

/* ============ CHECKOUT ============ */

.bm-checkout { display: grid; grid-template-columns: 1fr 400px; gap: 56px; align-items: start; }
@media (max-width: 980px) { .bm-checkout { grid-template-columns: 1fr; gap: 32px; } }
.bm-field-row { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; }
@media (max-width: 560px) { .bm-field-row { grid-template-columns: 1fr; gap: 0; } }

.bm-check { display: flex; gap: 10px; align-items: flex-start; margin: 14px 0; font-size: 14px; color: var(--bm-body); }
.bm-check input { margin-top: 3px; width: 16px; height: 16px; accent-color: var(--bm-brand); flex-shrink: 0; }
.bm-check label { cursor: pointer; }
.bm-check a { text-decoration: underline; text-underline-offset: 3px; color: var(--bm-brand); }
.bm-invoice { border-left: 2px solid var(--bm-border); padding-left: 22px; margin: 18px 0 8px; }

.bm-checkout-summary { background: var(--bm-cream); padding: 32px; }
.bm-checkout-summary h2 { font-size: 13px; font-weight: 700; letter-spacing: 2px; text-transform: uppercase; margin-bottom: 22px; }
.bm-order-lines { margin-bottom: 20px; }
.bm-order-line {
  display: flex; justify-content: space-between; gap: 16px; align-items: flex-start;
  padding: 12px 0; border-bottom: 1px solid var(--bm-border); font-size: 14px;
}
.bm-order-name { display: block; color: var(--bm-ink); }

.bm-pay { display: grid; gap: 10px; margin-bottom: 20px; }
.bm-pay-option {
  display: flex; gap: 12px; align-items: flex-start; padding: 14px;
  background: #fff; border: 1px solid var(--bm-border); cursor: pointer; transition: border-color .15s ease;
}
.bm-pay-option:hover { border-color: var(--bm-brand); }
.bm-pay-option:has(input:checked) { border-color: var(--bm-brand); box-shadow: inset 0 0 0 1px var(--bm-brand); }
.bm-pay-option input { margin-top: 3px; width: 16px; height: 16px; accent-color: var(--bm-brand); flex-shrink: 0; }
.bm-pay-option strong { display: block; font-size: 15px; }
.bm-pay-option small { display: block; font-size: 13px; color: var(--bm-body); margin-top: 4px; }

.bm-dialog--wide { max-width: 860px; width: calc(100% - 40px); height: 80vh; max-height: calc(100% - 40px); padding: 0; position: relative; }
.bm-dialog--wide iframe { width: 100%; height: 100%; border: 0; display: block; }
.bm-dialog-x { position: absolute; top: 10px; right: 10px; background: #fff; z-index: 2; }

/* ============ ARTICLES ============ */

/* Same framing the album cards use — a white card on a white section has no
   edge at all, which is why the related-news strip (on cream) read better than
   the listing. The border makes it work on either background. */
.bm-article {
  display: block; background: #fff; border: 1px solid var(--bm-border);
  transition: transform .25s ease, box-shadow .25s ease, border-color .25s ease;
}
.bm-article:hover {
  transform: translateY(-4px); box-shadow: 0 16px 36px rgba(16,16,16,.1);
  border-color: var(--bm-brand);
}
.bm-article img { width: 100%; height: auto; aspect-ratio: 16/10; object-fit: cover; }
.bm-article-body { display: block; padding: 22px 24px 26px; }
.bm-article-date { display: block; font-size: 12px; color: var(--bm-meta); letter-spacing: .5px; margin-bottom: 8px; }
.bm-article-title { display: block; font-size: 19px; font-weight: 700; line-height: 1.3; color: var(--bm-ink); margin-bottom: 10px; }
.bm-article-excerpt { display: block; font-size: 14px; color: var(--bm-body); line-height: 1.6; }

.bm-article-head { max-width: 760px; margin-bottom: 36px; }
.bm-article-head h1 { font-size: 44px; margin-top: 10px; }
@media (max-width: 768px) { .bm-article-head h1 { font-size: 29px; } }
.bm-article-hero { margin: 0 0 40px; }
.bm-article-hero img { width: 100%; height: auto; }
.bm-article-body-full { max-width: 760px; }

.bm-catlist { list-style: none; margin: 0; padding: 0; }
.bm-catlist li { border-bottom: 1px solid var(--bm-border); }
.bm-catlist a { display: flex; justify-content: space-between; gap: 12px; padding: 12px 20px; font-size: 15px; color: var(--bm-body); }
.bm-catlist a:hover { color: var(--bm-brand); }
.bm-catlist a.is-on { color: var(--bm-brand); font-weight: 700; }
.bm-catlist span { color: var(--bm-meta); font-size: 13px; }

/* ============ GALLERY + LIGHTBOX ============ */

.bm-gallery { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 16px; }
.bm-gallery img { width: 100%; height: auto; aspect-ratio: 4/3; object-fit: cover; transition: opacity .2s ease; }
.bm-gallery a:hover img { opacity: .85; }

.bm-lightbox {
  border: none; background: transparent; padding: 0; max-width: 96vw; max-height: 96vh;
  display: flex; align-items: center; gap: 12px;
}
.bm-lightbox::backdrop { background: rgba(16,16,16,.9); }
.bm-lightbox img { max-width: min(1200px, 88vw); max-height: 88vh; width: auto; height: auto; }
.bm-lightbox-x {
  position: fixed; top: 20px; right: 24px; color: #fff; font-size: 26px; line-height: 1; padding: 8px;
}
.bm-lightbox-nav { color: #fff; font-size: 44px; line-height: 1; padding: 12px; opacity: .7; }
.bm-lightbox-nav:hover { opacity: 1; }
@media (max-width: 640px) { .bm-lightbox-nav { font-size: 30px; padding: 6px; } }

/* ============ STORES ============ */

.bm-store { display: flex; flex-direction: column; background: #fff; border: 1px solid var(--bm-border); transition: transform .25s ease, box-shadow .25s ease; }
.bm-store:hover { transform: translateY(-4px); box-shadow: 0 16px 36px rgba(16,16,16,.1); }
/* height:auto is load-bearing. The width/height attributes on <img> map to
   presentational hints; these rules override width but not height, so the
   attribute's `height` stayed definite and aspect-ratio was ignored — the one
   store with a photo rendered 400px tall on mobile instead of 208px. */
.bm-store img { width: 100%; height: auto; aspect-ratio: 16/10; object-fit: cover; }
.bm-store-body { display: flex; flex-direction: column; padding: 22px 24px 24px; flex: 1; }
.bm-store-city { display: block; font-size: 21px; font-weight: 700; color: var(--bm-ink); margin-bottom: 4px; }
.bm-store-name { display: block; font-size: 14px; font-weight: 600; color: var(--bm-meta); margin-bottom: 14px; }
.bm-store-lines { display: flex; flex-direction: column; gap: 7px; flex: 1; }
.bm-store-line { display: flex; gap: 9px; align-items: flex-start; font-size: 14px; color: var(--bm-body); line-height: 1.45; }
.bm-store-line svg { width: 15px; height: 15px; margin-top: 3px; flex-shrink: 0; color: var(--bm-meta); }
.bm-store-cta {
  display: inline-flex; align-items: center; gap: 6px; margin-top: 18px;
  font-size: 12px; font-weight: 700; letter-spacing: 1.2px; text-transform: uppercase; color: var(--bm-brand);
}
.bm-store-cta::after { content: '→'; transition: transform .2s ease; }
.bm-store:hover .bm-store-cta::after { transform: translateX(4px); }

.bm-store-detail { display: grid; grid-template-columns: 1fr 1fr; gap: 56px; align-items: start; }
@media (max-width: 880px) { .bm-store-detail { grid-template-columns: 1fr; gap: 32px; } }
.bm-map iframe, .bm-map > * { width: 100% !important; min-height: 380px; border: 0; display: block; }

/* ============ CONTACT ============ */

.bm-contact { display: grid; grid-template-columns: 1fr 380px; gap: 56px; align-items: start; }
@media (max-width: 880px) { .bm-contact { grid-template-columns: 1fr; gap: 32px; } }
.bm-contact-form { max-width: 620px; }
.bm-contact-card { background: var(--bm-cream); padding: 28px; margin-bottom: 20px; }
.bm-contact-card .bm-side-title { display: block; margin-bottom: 14px; }
.bm-contact-card .bm-prose { font-size: 15px; }
.bm-contact-list { list-style: none; margin: 0; padding: 0; }
.bm-contact-list li { padding: 9px 0; border-bottom: 1px solid var(--bm-border); font-size: 15px; }
.bm-contact-list li:last-child { border-bottom: none; }
.bm-contact-list a:hover { text-decoration: underline; text-underline-offset: 3px; }

/* ============ ACCOUNT ============ */

.bm-auth { max-width: 460px; margin: 0 auto; }
.bm-auth h1 { font-size: 32px; margin-bottom: 8px; }
.bm-auth .bm-section-sub { margin-bottom: 28px; }
.bm-auth-link { display: block; margin-top: 16px; font-size: 14px; text-align: center; text-decoration: underline; text-underline-offset: 3px; color: var(--bm-body); }
.bm-auth-alt { margin-top: 40px; padding-top: 32px; border-top: 1px solid var(--bm-border); text-align: center; }
.bm-auth-alt p { color: var(--bm-body); margin-bottom: 16px; }

/* Account forms ------------------------------------------------------------ */
.bm-acct-form { max-width: 620px; }
.bm-acct-legend {
  font-size: 15px; letter-spacing: .06em; text-transform: uppercase;
  color: var(--bm-ink); margin: 0 0 18px;
  padding-bottom: 10px; border-bottom: 1px solid var(--bm-border);
}
.bm-acct-pass { margin: 30px 0 28px; }

/* Order preview */
.bm-orderhead { display: flex; gap: 40px; flex-wrap: wrap; margin-bottom: 26px; }
.bm-orderhead .bm-label { display: block; margin-bottom: 4px; }
.bm-orderhead strong { font-size: 16px; }
.bm-orderbox { border: 1px solid var(--bm-border); padding: 20px 22px; margin-bottom: 28px; }
.bm-orderbox p { margin: 0 0 4px; color: var(--bm-body); }
.bm-orderbox .bm-acct-legend { margin-bottom: 14px; }
.bm-order-note { margin-top: 12px !important; }
.bm-cart-item--static { grid-template-columns: 100px 1fr auto; }
@media (max-width: 700px) { .bm-cart-item--static { grid-template-columns: 80px 1fr; } }
.bm-ordersum { border-top: 1px solid var(--bm-ink); margin-top: 8px; padding-top: 18px; max-width: 420px; margin-left: auto; margin-bottom: 28px; }

/* Title with an action to its right (address book). The h1 carries its own
   bottom margin, so the row kills it and owns the spacing instead. */
.bm-page-head { display: flex; align-items: baseline; justify-content: space-between; gap: 20px; flex-wrap: wrap; margin-bottom: 36px; }
.bm-page-head .bm-page-title { margin-bottom: 0; }
@media (max-width: 768px) { .bm-page-head { margin-bottom: 24px; } }

/* Saved addresses */
.bm-addr-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 18px; margin-bottom: 34px; }
.bm-addr { border: 1px solid var(--bm-border); padding: 18px 20px; }
.bm-addr.is-default { border-color: var(--bm-ink); }
.bm-addr p { margin: 0 0 4px; color: var(--bm-body); font-size: 14px; }
.bm-addr-actions { margin-top: 14px; display: flex; gap: 16px; font-size: 14px; }
.bm-addr-actions a { text-decoration: underline; text-underline-offset: 3px; }
.bm-addr-remove { color: var(--bm-body); }
.bm-addr-remove:hover { color: var(--bm-brand); }
.bm-acct-pass[hidden] { display: none; }

.bm-order-card {
  display: flex; justify-content: space-between; align-items: center; gap: 20px; flex-wrap: wrap;
  border: 1px solid var(--bm-border); padding: 20px 22px; margin-bottom: 14px;
}
.bm-order-id { font-size: 16px; font-weight: 700; }
.bm-order-id:hover { text-decoration: underline; text-underline-offset: 3px; }
.bm-order-meta { font-size: 13px; color: var(--bm-body); margin-top: 4px; }

.bm-account-cards { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; }
@media (max-width: 880px) { .bm-account-cards { grid-template-columns: 1fr; } }

/* ---------------------------------------------------------------------------
   COMPAT SHIM
   Bootstrap is gone, but a few low-traffic templates (account sub-pages) still
   carry .row/.col-* markup. This keeps them laid out sensibly instead of
   collapsing into a single column of full-width blocks. Delete when those
   templates get a bespoke pass.
   ------------------------------------------------------------------------- */
.bm .row { display: flex; flex-wrap: wrap; gap: 24px; }
.bm .row > [class*="col-"] { flex: 1 1 260px; min-width: 0; }
.bm .row > .col-12, .bm .row > .col-md-12, .bm .row > .col-lg-12 { flex-basis: 100%; }
.bm .form-group { margin-bottom: 18px; }
.bm .text-center { text-align: center; }
.bm .text-right { text-align: right; }
.bm .float-right { float: right; }
.bm .form-group label { display: block; font-size: 13px; font-weight: 600; margin-bottom: 7px; }
.bm .account-section { margin-bottom: 44px; }
.bm .account-heading h1, .bm .account-heading h2 { font-size: 26px; margin-bottom: 18px; }
.bm .account-column-holder { border: 1px solid var(--bm-border); padding: 22px; height: 100%; }
.bm .account-column-title { font-size: 12px; font-weight: 700; letter-spacing: 1.5px; text-transform: uppercase; color: var(--bm-meta); margin-bottom: 12px; }
.bm .account-column-content p { font-size: 14px; color: var(--bm-body); margin-bottom: 4px; }
.bm .account-column-links { margin-top: 16px; font-size: 12px; font-weight: 700; letter-spacing: 1px; }
.bm .account-column-links a { text-decoration: underline; text-underline-offset: 3px; }
.bm .account-column-links .sep { display: inline-block; width: 12px; }
.bm .account { display: grid; grid-template-columns: 260px 1fr; gap: 48px; align-items: start; padding: 56px 0; }
@media (max-width: 980px) { .bm .account { grid-template-columns: 1fr; gap: 24px; } }

/* ============ FILTER LIST (checkbox-styled links) ============ */

.bm-filter-list { display: flex; flex-direction: column; }
.bm-filter-item {
  display: flex; align-items: center; gap: 10px; padding: 7px 0;
  font-size: 14px; color: var(--bm-ink); line-height: 1.35; cursor: pointer;
}
.bm-filter-item:hover { color: var(--bm-brand); }
/* The native box is kept (focus, keyboard, form submit with JS off) but sized
   to nothing; .bm-filter-box is what you actually see. */
.bm-filter-item input {
  position: absolute; opacity: 0; width: 16px; height: 16px; margin: 0;
}
.bm-filter-box {
  width: 16px; height: 16px; flex-shrink: 0; position: relative;
  border: 1.5px solid var(--bm-border); background: #fff; border-radius: var(--bm-radius);
  transition: all .15s ease;
}
.bm-filter-item:hover .bm-filter-box { border-color: var(--bm-brand); }
.bm-filter-item input:focus-visible + .bm-filter-box { outline: 2px solid var(--bm-navy); outline-offset: 2px; }
.bm-filter-item input:checked + .bm-filter-box { background: var(--bm-brand); border-color: var(--bm-brand); }
/* Centred by transform rather than hand-tuned offsets, so it stays centred if
   the box size or border ever changes. 46% not 50%: rotating an L about its
   geometric centre leaves it sitting optically low. */
.bm-filter-item input:checked + .bm-filter-box::after {
  content: ''; position: absolute; left: 50%; top: 46%;
  width: 4px; height: 8px; border: solid #fff; border-width: 0 2px 2px 0;
  transform: translate(-50%, -50%) rotate(45deg);
}
.bm-filter-item input:checked ~ .bm-filter-text { font-weight: 600; }
.bm-filter-text { flex: 1; }
.bm-filter-n { color: var(--bm-meta); font-size: 12px; }
/* An option that would return nothing stays clickable but stops advertising. */
.bm-filter-item.is-empty { opacity: .42; }

/* Card needs a hairline when it can't sit on cream (safety net). */
.bm-section:not(.bm-section--cream):not(.bm-section--paper) .bm-prod { border: 1px solid var(--bm-border); }

/* ============ IMAGE PLACEHOLDER ============ */
/* Shown when a record genuinely has no image, instead of a broken <img>. */
.bm-ph {
  display: flex; align-items: center; justify-content: center;
  width: 100%; aspect-ratio: 16/10; color: var(--bm-meta);
  font-size: 44px; font-weight: 700; letter-spacing: -.02em; user-select: none;
}
.bm-ph--square { aspect-ratio: 1; }

/* ============ TABS ============ */

.bm-tabs { margin-top: 72px; }
@media (max-width: 980px) { .bm-tabs { margin-top: 48px; } }
.bm-tablist {
  display: flex; gap: 4px; border-bottom: 1px solid var(--bm-border);
  margin-bottom: 36px; overflow-x: auto; scrollbar-width: none;
}
.bm-tablist::-webkit-scrollbar { display: none; }
.bm-tab {
  padding: 14px 22px; font-size: 14px; font-weight: 600; color: var(--bm-meta);
  font-family: inherit; white-space: nowrap; border-bottom: 2px solid transparent;
  margin-bottom: -1px; transition: color .15s ease, border-color .15s ease;
}
.bm-tab:hover { color: var(--bm-ink); }
.bm-tab.is-on { color: var(--bm-brand); border-bottom-color: var(--bm-brand); }
/* Three Bulgarian labels at 22px padding overflow a 375px screen and turn the
   strip into a sideways scroller. Tightened so they fit down to ~360px. */
@media (max-width: 560px) {
  .bm-tablist { gap: 0; margin-bottom: 26px; }
  .bm-tab { padding: 12px 11px; font-size: 13px; letter-spacing: -0.01em; }
}

.bm-tabpanel { display: none; }
.bm-tabpanel.is-on { display: block; }
.bm-docs { max-width: 640px; }

/* ============ COLOUR COLLECTION TILES ============ */
/* The albums are shown as the paint they contain, evenly sampled across the
   deck, rather than as photographs of fan decks — seven fan photos in a row
   were indistinguishable from each other. */

.bm-decks { display: grid; grid-template-columns: repeat(4, 1fr); gap: 24px; }
.bm-deck {
  display: block; background: #fff; overflow: hidden;
  border: 1px solid var(--bm-border);
  transition: transform .25s ease, box-shadow .25s ease, border-color .25s ease;
}
.bm-deck:hover { transform: translateY(-4px); box-shadow: 0 16px 36px rgba(16,16,16,.1); }
.bm-deck-swatches {
  display: grid; grid-auto-flow: column; grid-auto-columns: 1fr;
  aspect-ratio: 8/5; background: var(--bm-cream);
}
.bm-deck-swatches span { display: block; }
.bm-deck-img { display: block; width: 100%; height: auto; aspect-ratio: 8/5; object-fit: cover; }
.bm-deck-info { display: block; padding: 16px 18px 18px; border-top: 1px solid var(--bm-border); }
.bm-deck-name { display: block; font-size: 15px; font-weight: 600; color: var(--bm-brand); line-height: 1.3; }
.bm-deck-count { display: block; font-size: 13px; color: var(--bm-meta); margin-top: 3px; }

/* Last cell: keeps the grid square instead of leaving an orphan row. */
.bm-deck--all {
  display: flex; align-items: center; justify-content: center;
  background: var(--bm-cream); border-color: transparent;
}
.bm-deck--all:hover { background: var(--bm-paper); transform: none; box-shadow: none; }
.bm-deck-all {
  display: inline-flex; align-items: center; gap: 8px;
  font-size: 13px; font-weight: 600; letter-spacing: 1px; text-transform: uppercase;
  color: var(--bm-brand);
}

@media (max-width: 980px) { .bm-decks { grid-template-columns: repeat(3, 1fr); gap: 20px; } }
@media (max-width: 700px) { .bm-decks { grid-template-columns: repeat(2, 1fr); gap: 16px; } }

/* ============ CLOSING PROSE ============ */

.bm-index-prose { margin-top: 56px; padding-top: 44px; border-top: 1px solid var(--bm-border); }
.bm-index-prose:first-child { margin-top: 0; padding-top: 0; border-top: 0; }
.bm-index-prose-title { text-align: center; margin-bottom: 26px; }

/* ============ TREND BAND ============ */

.bm-trend-band { display: grid; grid-auto-flow: column; grid-auto-columns: 1fr; }
.bm-trend {
  display: flex; flex-direction: column; justify-content: flex-end;
  /* Portrait tiles, as in the prototype — a 260px strip reads as a divider,
     not as paint. The clamp is because the count is CMS-driven: three trend
     codes would give 480px-wide tiles and an 850px-tall band. */
  /* width:100% is load-bearing: without it the max-height clamp makes the
     browser shrink the tile's WIDTH to preserve the ratio, so the tiles stop
     filling their grid tracks and gaps open up between them on wide screens. */
  aspect-ratio: 9 / 16; width: 100%; min-height: 300px; max-height: 420px;
  padding: 28px 22px; position: relative; overflow: hidden;
  transition: transform .35s ease, box-shadow .35s ease;
}
.bm-trend::before {
  content: ''; position: absolute; inset: 0; pointer-events: none;
  background: linear-gradient(180deg, transparent 50%, rgba(0,0,0,.22) 100%);
}
.bm-trend:hover { transform: scale(1.04); z-index: 2; box-shadow: 0 28px 56px rgba(0,0,0,.18); }
.bm-trend-name { font-size: 17px; font-weight: 700; line-height: 1.2; position: relative; z-index: 1; }
.bm-trend-code { font-size: 12px; opacity: .8; margin-top: 4px; letter-spacing: .5px; position: relative; z-index: 1; }
@media (max-width: 880px) {
  .bm-trend-band { grid-auto-flow: row; grid-template-columns: repeat(2, 1fr); grid-auto-columns: auto; }
  .bm-trend { aspect-ratio: 3 / 4; min-height: 0; max-height: none; padding: 22px 18px; }
  /* The trend codes are entered in admin, so the count can be odd — seven of
     them today. Rather than hide the seventh (it is the client's data), the
     odd one out spans both columns. 3/2 keeps it the same height as the pair
     above it, so the band still reads as a grid. */
  .bm-trend:last-child:nth-child(odd) { grid-column: span 2; aspect-ratio: 3 / 2; }
}

/* ============ SPLIT (reverse) + EDITORIAL ============ */

.bm-split--reverse .bm-split-body { order: 1; }
.bm-split--reverse img { order: 2; }
@media (max-width: 880px) {
  .bm-split--reverse .bm-split-body { order: 2; }
  .bm-split--reverse img { order: 1; }
}

.bm-editorial { max-width: 760px; margin: 0 auto; text-align: center; }
.bm-editorial h2 { color: var(--bm-brand); margin-bottom: 22px; }
.bm-editorial p { font-size: 17px; line-height: 1.8; color: var(--bm-body); }

/* ============ COLOURS PAGE HERO + COLOUR OF THE YEAR ============ */

/* 560, not 480: the search panel drops out of the input and has to land inside
   the hero rather than across the boundary into the next section. The taller
   hero also matches the prototype and gives the chip-wall photo more room. */
.bm-colors-hero { display: grid; grid-template-columns: 1fr 1fr; min-height: 560px; background: var(--bm-brand); }
.bm-colors-hero-copy {
  position: relative; z-index: 2;
  display: flex; flex-direction: column; justify-content: center; color: #fff;
  padding: 80px clamp(32px, 5vw, 72px) 80px
           max(32px, calc((100vw - var(--bm-container)) / 2 + 32px));
}
.bm-colors-hero-copy h1 { color: #fff; font-size: clamp(36px, 5vw, 62px); line-height: 1.02; margin: 18px 0 0; }
.bm-colors-hero-copy p { color: rgba(255,255,255,.85); font-size: 17px; line-height: 1.6; margin-top: 18px; max-width: 440px; }
.bm-colorsearch-wrap { position: relative; max-width: 440px; }
.bm-colorsearch {
  display: flex; align-items: center; gap: 12px; margin-top: 26px;
  background: rgba(255,255,255,.10); border: 1px solid rgba(255,255,255,.28);
  padding: 14px 18px;
}
.bm-colorsearch:focus-within {
  background: rgba(255,255,255,.16); border-color: #fff;
  box-shadow: 0 0 0 3px rgba(255,255,255,.18);
}
.bm-colorsearch input:focus, .bm-colorsearch input:focus-visible { outline: none; }
.bm-colorsearch svg { width: 20px; height: 20px; flex-shrink: 0; color: rgba(255,255,255,.7); }
.bm-colorsearch input {
  flex: 1; background: none; border: 0; outline: none; color: #fff;
  font-family: inherit; font-size: 16px;
}
.bm-colorsearch input::placeholder { color: rgba(255,255,255,.55); }
.bm-colorsearch input::-webkit-search-cancel-button { filter: invert(1); opacity: .6; }
/* Floats over the hero rather than sitting in flow — see the note in the
   template. Opaque background because it now overlaps the headline and the
   buttons underneath it. */
.bm-colorsearch-results:not(:empty) {
  position: absolute; top: 100%; left: 0; right: 0; z-index: 5; margin-top: 6px;
  display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
  /* Capped so the panel stays inside the black hero. Below the input there is
     roughly the buttons row plus the hero's bottom padding — ~190px — and a
     dropdown that crosses into the next section reads as a bug, not a layer. */
  gap: 2px; max-height: 190px; overflow-y: auto; overscroll-behavior: contain;
  /* Wider than the field so it fully covers the button row underneath, whose
     two buttons run a little past 440px. */
  right: auto; width: 480px; max-width: calc(100vw - 40px);
  background: var(--bm-brand); box-shadow: 0 24px 48px rgba(0,0,0,.45);
}
.bm-colorsearch-results a { display: block; padding: 12px 14px; }
.bm-colorsearch-results .n { display: block; font-size: 14px; font-weight: 600; line-height: 1.2; }
.bm-colorsearch-results .c { display: block; font-size: 11px; letter-spacing: .5px; opacity: .75; margin-top: 3px; }
.bm-colorsearch-msg { color: rgba(255,255,255,.7); font-size: 14px; padding: 16px 18px; }
@media (max-width: 880px) { .bm-colorsearch-wrap { max-width: none; } }

/* Absolute fill rather than height:100% — the parent is a stretched grid item
   with no definite height of its own, so a percentage has nothing to resolve
   against. The source is 1800x700 and the subject is a repeating grid, so a
   hard crop into a tall column costs nothing. */
.bm-colors-hero-media { position: relative; overflow: hidden; }
.bm-colors-hero-media img {
  position: absolute; inset: 0; display: block;
  width: 100%; height: 100%; object-fit: cover;
}

.bm-colors-hero-stripes { display: grid; grid-auto-flow: column; grid-auto-columns: 1fr; }
.bm-colors-hero-stripes span { display: block; }
@media (max-width: 880px) {
  .bm-colors-hero { grid-template-columns: 1fr; min-height: 0; }
  .bm-colors-hero-copy { padding: 56px 20px; }
  .bm-colors-hero-stripes { height: 140px; }
  /* 220px cropped the chip wall to a thin strip that read as a divider rather
     than as the hero image. Square gives it the same presence the right-hand
     column has on desktop. */
  .bm-colors-hero-media { aspect-ratio: 1 / 1; height: auto; }
  /* Full-width stacked buttons: at 375px they were two different widths sitting
     left-aligned against a lot of empty black. */
  .bm-hero-actions { flex-direction: column; align-items: stretch; }
  .bm-hero-actions .bm-btn { justify-content: center; }
}

.bm-coy { display: grid; grid-template-columns: 1fr 1fr; align-items: stretch; }
.bm-coy-paint { position: relative; min-height: 420px; }
.bm-coy-label {
  position: absolute; left: 28px; bottom: 24px; font-size: 11px;
  letter-spacing: 1.6px; text-transform: uppercase; opacity: .8;
}
.bm-coy-copy {
  background: var(--bm-cream); display: flex; flex-direction: column; justify-content: center;
  padding: 72px clamp(32px, 5vw, 80px);
}
.bm-coy-copy h2 { font-size: clamp(30px, 4vw, 50px); margin: 14px 0 6px; }
.bm-coy-code { font-size: 15px; color: var(--bm-meta); letter-spacing: 1px; margin-bottom: 16px; }
@media (max-width: 880px) {
  .bm-coy { grid-template-columns: 1fr; }
  .bm-coy-paint { min-height: 240px; }
  .bm-coy-copy { padding: 44px 20px; }
}

/* ============ PDP THUMBS + TRUST ROW ============ */

.bm-pdp-thumbs { display: flex; gap: 10px; margin-top: 14px; flex-wrap: wrap; }
.bm-thumb { width: 74px; height: 74px; border: 1px solid var(--bm-border); padding: 6px; background: #fff; transition: border-color .15s ease; }
.bm-thumb img { width: 100%; height: 100%; object-fit: contain; }
.bm-thumb:hover { border-color: var(--bm-meta); }
.bm-thumb.is-on { border-color: var(--bm-brand); }

.bm-trust-row { list-style: none; margin: 24px 0 0; padding: 0; display: grid; gap: 9px; }
.bm-trust-row li { display: flex; gap: 10px; align-items: center; font-size: 14px; color: var(--bm-body); }
.bm-trust-row svg { width: 16px; height: 16px; color: var(--bm-ok); flex-shrink: 0; }


/* ============ PALETTE COLOUR TILES ============ */

/* The album page used to render every colour in the palette into one
   edge-to-edge wall. The largest palette holds 1680 colours, which came to
   420KB of HTML and was unreadable besides. Tiles, paged at 120. */
.bm-colorgrid { display: grid; grid-template-columns: repeat(6, 1fr); gap: 12px; }
.bm-colortile {
  display: block; background: #fff; overflow: hidden;
  border: 1px solid var(--bm-border);
  transition: transform .2s ease, box-shadow .2s ease, border-color .2s ease;
}
.bm-colortile:hover {
  transform: translateY(-4px); box-shadow: 0 14px 32px rgba(16,16,16,.10);
  border-color: var(--bm-brand);
}
.bm-colortile-swatch {
  display: block; aspect-ratio: 1;
  box-shadow: inset 0 0 0 1px rgba(16,16,16,.10);
}
.bm-colortile-info { display: block; padding: 12px 14px 14px; }
.bm-colortile-name {
  display: block; font-size: 14px; font-weight: 600; line-height: 1.25;
  color: var(--bm-ink); margin-bottom: 2px;
}
.bm-colortile-code {
  display: block; font-size: 11px; color: var(--bm-meta);
  letter-spacing: 1px; text-transform: uppercase;
}
@media (max-width: 1100px) { .bm-colorgrid { grid-template-columns: repeat(5, 1fr); } }
@media (max-width: 900px)  { .bm-colorgrid { grid-template-columns: repeat(4, 1fr); } }
@media (max-width: 600px)  { .bm-colorgrid { grid-template-columns: repeat(3, 1fr); gap: 10px; } }
@media (max-width: 420px)  { .bm-colorgrid { grid-template-columns: repeat(2, 1fr); } }


/* ============ PALETTE HERO ============ */

.bm-palette-hero { display: grid; grid-template-columns: 1fr 1fr; min-height: 560px; }
.bm-palette-hero-copy {
  display: flex; flex-direction: column; justify-content: center;
  background: var(--bm-cream);
  padding: 96px clamp(32px, 5vw, 72px) 96px
           max(32px, calc((100vw - var(--bm-container)) / 2 + 32px));
}
.bm-palette-hero-copy h1 {
  font-size: clamp(38px, 4.4vw, 64px); line-height: 1.0;
  color: var(--bm-brand); margin: 18px 0 0; letter-spacing: -.02em;
}
.bm-palette-hero-lead {
  font-size: 18px; color: var(--bm-body); line-height: 1.7;
  margin-top: 22px; max-width: 480px;
}
.bm-palette-stats {
  display: flex; gap: 40px; margin-top: 32px; padding-top: 28px;
  border-top: 1px solid var(--bm-border);
  font-size: 13px; color: var(--bm-meta); letter-spacing: 1px; text-transform: uppercase;
}
.bm-palette-stats strong {
  display: block; font-size: 28px; color: var(--bm-brand);
  letter-spacing: -.01em; text-transform: none; font-weight: 700; margin-bottom: 2px;
}
.bm-palette-mosaic { display: grid; grid-template-columns: repeat(4, 1fr); grid-template-rows: repeat(4, 1fr); }
.bm-palette-mosaic span { display: block; box-shadow: inset 0 0 0 1px rgba(16,16,16,.06); }

@media (max-width: 880px) {
  .bm-palette-hero { grid-template-columns: 1fr; min-height: 0; }
  .bm-palette-hero-copy { padding: 56px 20px; order: 2; }
  .bm-palette-hero-lead { font-size: 16px; }
  /* 8x2 at 375px came to a 94px stripe — decoration, not a portrait of the
     palette. Keeps the 4x4 block desktop gets, at 4:3 so it does not eat the
     whole screen. */
  .bm-palette-mosaic {
    order: 1; grid-template-columns: repeat(4, 1fr); grid-template-rows: repeat(4, 1fr);
    aspect-ratio: 4 / 3;
  }
  .bm-palette-stats { flex-wrap: wrap; gap: 24px 32px; }
}

@media (max-width: 880px) {
  .bm-famfilter-toggle {
    display: flex; align-items: center; justify-content: space-between; gap: 12px;
    width: 100%; margin-bottom: 20px; padding: 13px 16px;
    background: #fff; border: 1px solid var(--bm-border);
    font-family: inherit; font-size: 15px; font-weight: 600; color: var(--bm-ink);
  }
  .bm-famfilter-toggle[aria-expanded="true"] .bm-caret { transform: rotate(180deg); }
  .bm-famfilter { display: none; }
  .bm-famfilter.is-open { display: flex; }
}

/* Legal and text pages: title and body are one centred column. Left-pinned
   under a full-bleed page they read as unfinished; the narrow measure itself
   is deliberate — 1280px of running text is unreadable. */
.bm-textpage { max-width: 760px; margin-left: auto; margin-right: auto; }
