/* ============================================================
   HOLT Crane - Product page (Link-Belt 120|RT)
   Momentum design language · SEO/AEO template
   ============================================================ */

*, *::before, *::after { box-sizing: border-box; }
html { scroll-behavior: smooth; }
body {
  margin: 0;
  font-family: var(--font-body);
  font-size: var(--text-base);
  line-height: 1.6;
  color: var(--color-text);
  background: var(--color-bg);
  overflow-x: hidden;
  -webkit-font-smoothing: antialiased;
}
img { max-width: 100%; display: block; }

/* ---- Twenty Twenty-Five integration: neutralize root padding + block gap
   (TT25 injects --wp--style--block-gap: 1.2rem between every top-level element,
   which shows up as extra space between sections). ---- */
body {
  padding: 0 !important; /* TT25 / Genesis Blocks add body padding (30px) on the server; remove it so sections run full-bleed. .wrap handles content insets. */
  --wp--style--root--padding-top: 0px;
  --wp--style--root--padding-right: 0px;
  --wp--style--root--padding-bottom: 0px;
  --wp--style--root--padding-left: 0px;
}
.wp-site-blocks { padding: 0 !important; margin: 0 !important; }
.wp-site-blocks > * { margin-block: 0 !important; }
.has-global-padding { padding-left: 0 !important; padding-right: 0 !important; }

h1, h2, h3 { font-family: var(--font-heading); font-weight: 800; line-height: 1.03; letter-spacing: -0.02em; margin: 0 0 var(--space-xs); }

.wrap { max-width: 78rem; margin-inline: auto; padding-inline: clamp(20px, 4vw, 48px); }

/* ---- Eyebrow ---- */
/* Size/weight matched to momentum.css's .holt-eyebrow so the label reads the
   same on product pages as on the home page (SA review, 8/3/26). */
.eyebrow { font-family: var(--font-mono); font-weight: 700; font-size: 0.86rem; letter-spacing: 0.24em; text-transform: uppercase; color: var(--hce-yellow); margin: 0 0 var(--space-sm); }
.phero .eyebrow { text-shadow: 0 1px 3px rgba(20,18,17,0.85), 0 2px 14px rgba(20,18,17,0.6); }
.eyebrow.ink { color: var(--color-primary); }

/* ---- Buttons ---- */
.btn { display: inline-block; font-family: var(--font-heading); font-weight: 700; font-size: 0.86rem; letter-spacing: 0.02em; text-decoration: none; text-align: center; padding: 0.85em 1.9em; border-radius: var(--radius-pill); border: 1px solid transparent; cursor: pointer; transition: background 0.2s var(--ease), color 0.2s var(--ease), transform 0.2s var(--ease); }
.btn:hover { transform: translateY(-1px); }
.btn-primary { background: var(--color-primary); color: #fff; }
.btn-primary:hover { background: var(--color-primary-hover); }
.btn-glass { background: rgba(255,255,255,0.14); color: #fff; border-color: rgba(255,255,255,0.4); backdrop-filter: blur(8px); }
.btn-glass:hover { background: rgba(255,255,255,0.26); }
/* Secondary button for LIGHT backgrounds. .btn-glass is translucent white with
   white text, so it is invisible on .section / .section-alt. Every hub page's
   new lineup CTA sits on light, so they use .btn-dark instead. Mirrors
   momentum.css's .holt-btn-dark, which is not enqueued on these pages
   (SA "button consistency", raised on 8 pages). */
.btn-dark { background: rgba(45, 41, 38, 0.9); color: #fff; border-color: transparent; }
.btn-dark:hover { background: var(--hce-black); }

/* ---- Nav + footer live in the shared assets/css/chrome.css ---- */

/* ---- Breadcrumb ---- */
.crumbs { background: var(--hce-black); padding-top: var(--header-height); }
.crumbs .wrap { display: flex; gap: 8px; align-items: center; padding-block: 10px; font-family: var(--font-mono); font-size: 0.72rem; letter-spacing: 0.04em; color: rgba(255,255,255,0.5); flex-wrap: wrap; }
.crumbs a { color: rgba(255,255,255,0.7); text-decoration: none; }
.crumbs a:hover { color: #fff; }
.crumbs [aria-current] { color: var(--hce-yellow); }

/* ---- Product hero ---- */
.phero { position: relative; min-height: 68vh; display: flex; align-items: flex-end; overflow: hidden; color: #fff; padding-block: clamp(2.5rem, 6vh, 5rem); }
.phero-media { position: absolute; inset: 0; z-index: 0; }
.phero-media img { width: 100%; height: 100%; object-fit: cover; }
/* 85|RT hero: the source photo is sky-heavy, so zoom in and re-center on the crane. Scoped to this page only. */
.phero-85rt .phero-media img { object-position: 47% 56%; transform: scale(1.28); }
/* The scrim used to bottom out at 15% at 40% height - precisely where the
   eyebrow, H1 and lede sit - so over a pale hazy sky the lede measured 2.86:1
   and the yellow eyebrow about 1.8:1. Floor raised and the thinnest point
   pushed below the text block. Shared by every hub and crane page. */
.phero::after { content: ""; position: absolute; inset: 0; z-index: 1; background: linear-gradient(180deg, rgba(45,41,38,0.6), rgba(45,41,38,0.58) 30%, rgba(45,41,38,0.72) 66%, rgba(45,41,38,0.92)); }
.phero .eyebrow, .phero-sub { text-shadow: 0 1px 3px rgba(20,18,17,0.8), 0 2px 14px rgba(20,18,17,0.55); }
.phero-inner { position: relative; z-index: 2; }
.phero h1 { font-size: clamp(2.6rem, 1.8rem + 4.5vw, 5.5rem); font-weight: 900; margin: 0 0 12px; text-shadow: 0 2px 24px rgba(0,0,0,0.4); }
.phero h1 .model { color: #fff; }
.phero h1 .bar { color: var(--color-primary); margin: 0 0.02em; }
.phero-sub { font-size: var(--text-lg); color: rgba(255,255,255,0.9); max-width: 40rem; margin: 0 0 var(--space-md); }
.phero-cta { display: flex; flex-wrap: wrap; gap: 12px; }

/* ---- Key spec plate ---- */
.keyspecs { background: var(--hce-black); color: #fff; }
.keyspec-grid { display: grid; grid-template-columns: repeat(5, 1fr); gap: 0; padding-block: var(--space-lg); }
/* The 5-up plate used to wrap to 2 columns at tablet, orphaning the fifth cell
   and leaving a divider hanging off the end of row two with nothing beside it.
   Explicit break points, and the divider is drawn per-row instead. */
@media (max-width: 1000px) {
  .keyspec-grid { grid-template-columns: repeat(3, 1fr); row-gap: 20px; }
  .keyspec:nth-child(3n) { border-right: 0; }
}
@media (max-width: 620px) {
  .keyspec-grid { grid-template-columns: repeat(2, 1fr); }
  .keyspec { border-right: 1px solid rgba(255,255,255,0.12); }
  .keyspec:nth-child(2n) { border-right: 0; }
}
.keyspec { text-align: center; padding: 8px 12px; border-right: 1px solid rgba(255,255,255,0.12); }
.keyspec:last-child { border-right: 0; }
.kn { font-family: var(--font-mono); font-weight: 700; font-size: clamp(1.7rem, 1.2rem + 1.8vw, 2.6rem); line-height: 1; color: #fff; }
.ku { font-size: 0.42em; font-weight: 500; color: var(--hce-yellow); margin-left: 4px; letter-spacing: 0.04em; }
.kl { font-family: var(--font-mono); font-size: 0.64rem; letter-spacing: 0.16em; text-transform: uppercase; color: rgba(255,255,255,0.5); margin-top: 10px; }

/* ---- Sections ---- */
.section { padding-block: clamp(3.5rem, 8vh, 6.5rem); }
.section-alt { background: var(--color-bg-alt); }
.section-head { max-width: 44rem; margin-bottom: var(--space-lg); }
.h2 { font-size: clamp(1.9rem, 1.4rem + 2vw, 3rem); }
.section-sub { color: var(--color-text-muted); font-size: 0.98rem; }
.lead { font-size: var(--text-lg); color: var(--color-text); }
.section p { color: var(--color-text-muted); }
.section .lead { color: var(--color-text); }

/* ---- Overview split ---- */
.split-2 { display: grid; grid-template-columns: 1.15fr 0.85fr; gap: clamp(24px, 4vw, 56px); align-items: center; }
/* The Phase-3 block conversion nested the overview figure INSIDE the text
   group instead of leaving it a sibling, so .split-2 ends up with a single
   grid child and column two is permanently empty. That is why every hub page
   pins its overview copy into a ~640px left column and leaves the right 40%
   of a 1200px container blank, top to bottom, in the tallest section on the
   page. Collapse to one column whenever there is only one child, and lay the
   figure out beside the copy inside that child instead. */
/* The Phase-3 block conversion nested the overview figure INSIDE the text
   group rather than leaving it a sibling, so .split-2 has a single grid child
   and column two is empty. Two attempts to rebuild a two-column layout from
   that structure both failed, and the record is worth keeping:

     1. Nested grid, figure auto-placed - the eyebrow, heading, paragraphs and
        button auto-flowed across BOTH tracks and scattered.
     2. Nested grid, copy pinned to column 1 and the figure spanning
        `grid-row: 1 / -1` - a spanning item distributes its height across
        every row it spans, so the tall figure pushed the copy rows apart and
        left ~700px voids between the eyebrow and the heading. align-content
        and grid-auto-rows do not help, because the span is what sizes them.
     3. float:right - the figure is LAST in source, so it simply dropped below
        the copy with nothing left to wrap beside it.

   A real two-column overview needs the figure to be a SIBLING of the text
   group, which is a block-markup change to each hub page, not a CSS one.
   Until that is done this stays single-column: copy full width, figure
   centred beneath it and height-capped so it supports the copy instead of
   dominating the section. */
.split-2:not(:has(> * + *)) { grid-template-columns: 1fr; }
.split-2:not(:has(> * + *)) > * > .overview-fig {
  max-width: 40rem;
  margin: var(--space-lg) auto 0;
}
.split-2:not(:has(> * + *)) > * > .overview-fig img { max-height: 360px; }

.pill-row { display: flex; flex-wrap: wrap; gap: 8px; margin-top: var(--space-md); }
.pill { font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.05em; padding: 6px 12px; border-radius: var(--radius-pill); border: 1px solid rgba(196,22,28,0.45); color: var(--color-primary); }

/* ---- Features ---- */
.feature-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
.feature { background: #fff; border: 1px solid rgba(45,41,38,0.09); border-radius: var(--radius-md); box-shadow: 0 1px 2px rgba(45,41,38,0.04); padding: 26px 24px; transition: transform 0.2s var(--ease), box-shadow 0.2s var(--ease); }
.feature:hover { transform: translateY(-4px); box-shadow: var(--shadow-card-hover); }
.fi { font-size: 1.8rem; margin-bottom: 12px; }
.feature h3 { font-size: 1.15rem; margin-bottom: 8px; }
.feature p { font-size: 0.9rem; color: var(--color-text-muted); margin: 0; }

/* ---- Spec tables ---- */
.spec-tables { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.spec-block { background: #fff; border: 1px solid rgba(45,41,38,0.07); border-radius: var(--radius-md); box-shadow: var(--shadow-card); padding: 26px 28px; }
.spec-title { font-size: 1.1rem; text-transform: uppercase; letter-spacing: 0.04em; padding-bottom: 12px; margin-bottom: 6px; border-bottom: 2px solid var(--color-primary); }
.spec-list { margin: 0; }
.spec-list > div { display: flex; justify-content: space-between; gap: 18px; padding: 11px 0; border-bottom: 1px solid var(--hairline, rgba(45,41,38,0.1)); }
.spec-list > div:last-child { border-bottom: 0; }
.spec-list dt { color: var(--color-text-muted); font-size: 0.86rem; margin: 0; }
.spec-list dd { margin: 0; font-weight: 600; font-size: 0.9rem; text-align: right; font-family: var(--font-mono); }

/* ---- Downloads ---- */
.downloads { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; margin-top: var(--space-lg); }
.download { display: flex; align-items: center; gap: 16px; background: var(--hce-black); color: #fff; text-decoration: none; border-radius: var(--radius-md); padding: 20px 24px; transition: transform 0.2s var(--ease); }
.download:hover { transform: translateY(-3px); }
.download strong { font-family: var(--font-heading); }
.dl-ic { font-size: 1.4rem; width: 2.6rem; height: 2.6rem; flex: none; display: grid; place-items: center; background: var(--color-primary); border-radius: 50%; }

/* ---- Gallery ---- */
.gallery { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; }
.gallery figure { margin: 0; border-radius: var(--radius-md); overflow: hidden; box-shadow: var(--shadow-card); aspect-ratio: 4/3; cursor: zoom-in; }
.gallery img { width: 100%; height: 100%; object-fit: cover; transition: transform 0.4s var(--ease); }
.gallery figure:hover img { transform: scale(1.05); }

/* ---- Lightbox ---- */
.lightbox { display: none; position: fixed; inset: 0; z-index: 1000; align-items: center; justify-content: center; padding: clamp(20px, 6vw, 64px); background: rgba(20,18,17,0.92); opacity: 0; transition: opacity 0.3s var(--ease); }
.lightbox.open { display: flex; }
.lightbox.in { opacity: 1; }
.lightbox-img { max-width: 100%; max-height: 100%; border-radius: var(--radius-md); box-shadow: 0 20px 60px rgba(0,0,0,0.5); opacity: 0; transform: scale(0.97); transition: opacity 0.3s var(--ease), transform 0.3s var(--ease); }
.lightbox.in .lightbox-img { opacity: 1; transform: scale(1); }
.lightbox-close { position: absolute; top: clamp(14px,3vw,28px); right: clamp(14px,3vw,28px); width: 44px; height: 44px; border: none; border-radius: 50%; background: rgba(255,255,255,0.1); color: #fff; font-size: 1.5rem; line-height: 1; cursor: pointer; display: grid; place-items: center; transition: background 0.2s var(--ease); }
.lightbox-close:hover, .lightbox-close:focus-visible { background: rgba(255,255,255,0.22); }

/* ---- FAQ ---- */
/* Each Q&A is a card. Previously it was a bare bottom hairline with zero left
   padding, so the text ran to the edge, and Chrome paints its own focus ring on
   <summary> the instant you click one - which read as a hard black box around
   full-bleed text. The ring is now suppressed for mouse users and redrawn
   brand-red and inset for keyboard users, and the open state is signalled by a
   tint plus a red spine rather than an outline. */
/* Was capped at 52rem and centred, so the FAQ was the only section not using
   the page's full grid width - roughly 490px of empty band beside every row. */
/* The FAQ was the only section not centred: .faq-wrap dropped its cap but the
   accordion kept a 60rem measure with no auto margins, so it sat hard against
   the left gutter with ~430px of dead band to its right. Centre the heading
   block and the accordion on the same axis. */
.faq-wrap { max-width: none; }
.faq-wrap .section-head { margin-inline: auto; text-align: center; }
.faq { max-width: 60rem; margin-inline: auto; }
.faq details {
  background: #fff;
  border: 1px solid rgba(45,41,38,0.09);
  border-left: 3px solid transparent;
  border-radius: var(--radius-md);
  box-shadow: 0 1px 2px rgba(45,41,38,0.04);
  overflow: hidden;
  transition: border-color 0.25s var(--ease), box-shadow 0.25s var(--ease);
}
.faq details + details { margin-top: 10px; }
.faq details:hover { border-color: rgba(45,41,38,0.2); }
.faq details[open] {
  background: linear-gradient(180deg, #fff 0%, var(--grey-50) 100%);
  border-color: rgba(45,41,38,0.12);
  border-left-color: var(--color-primary);
  box-shadow: var(--shadow-card);
}
.faq summary {
  cursor: pointer;
  list-style: none;
  padding: 18px 54px 18px 22px;
  position: relative;
  font-family: var(--font-heading);
  font-weight: 700;
  font-size: 1.08rem;
  line-height: 1.35;
  color: var(--color-text);
  outline: none;
  transition: color 0.2s var(--ease);
}
.faq summary::-webkit-details-marker { display: none; }
.faq summary:hover { color: var(--color-primary); }
.faq details[open] summary { color: var(--color-primary); }
/* Keyboard users keep a visible ring; it traces the card rather than boxing
   the text, and it is brand-red instead of the UA's black. */
.faq summary:focus-visible { outline: 2px solid var(--color-primary); outline-offset: -4px; border-radius: var(--radius-md); }
.faq summary::after { content: "+"; position: absolute; right: 22px; top: 50%; transform: translateY(-50%); font-size: 1.5rem; line-height: 1; color: var(--color-primary); transition: transform 0.25s var(--ease); }
.faq details[open] summary::after { transform: translateY(-50%) rotate(45deg); }
.faq details p { color: var(--color-text-muted); padding: 0 54px 20px 22px; margin: 0; line-height: 1.6; }
.faq details p a { color: var(--color-primary); }

/* ---- CTA band ---- */
.cta-band { background: var(--hce-black); color: var(--color-text-on-dark); text-align: center; padding-block: clamp(3.5rem, 8vh, 6rem); }
.cta-band .accent-rule { width: 4rem; height: 4px; background: var(--color-primary); margin: 0 auto var(--space-md); }
.cta-band h2 { font-size: clamp(1.9rem, 1.4rem + 2vw, 3rem); color: #fff; }
.cta-band p { color: var(--grey-400); max-width: 36rem; margin: 0 auto var(--space-md); }
.cta-row { display: flex; gap: 12px; justify-content: center; flex-wrap: wrap; }

/* ---- Model grid (index page: full model catalog cards) ---- */
/* Was a hard 2-up, so any odd family count (5 RT, 3 AT) ended the section on
   a half-empty row. auto-fit closes the row whatever the count, and the family
   sizes across the site run 3 to 8. */
.model-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(21rem, 1fr)); gap: 20px; }
@media (max-width: 640px) { .model-grid { grid-template-columns: 1fr; } }
.model-card { display: flex; gap: 22px; align-items: center; background: #fff; border: 1px solid rgba(45,41,38,0.09); border-radius: var(--radius-md); box-shadow: 0 1px 2px rgba(45,41,38,0.04); padding: 24px; text-decoration: none; color: var(--color-text); transition: transform 0.2s var(--ease), box-shadow 0.2s var(--ease); }
.model-card:hover { transform: translateY(-4px); box-shadow: var(--shadow-card-hover); }
.model-card-img { flex: none; width: 9rem; height: 7rem; position: relative; }
.model-card-img img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: contain; }
.model-card-body { flex: 1; min-width: 0; }
.model-card-name { font-family: var(--font-heading); font-weight: 800; font-size: 1.4rem; margin: 0 0 2px; }
.model-card-cap { font-family: var(--font-mono); font-size: 0.78rem; color: var(--color-primary); font-weight: 700; margin-bottom: 8px; }
.model-card-desc { font-size: 0.85rem; color: var(--color-text-muted); margin: 0 0 10px; }
.model-card-specs { display: flex; gap: 14px; flex-wrap: wrap; font-family: var(--font-mono); font-size: 0.7rem; color: var(--grey-600, var(--color-text-muted)); margin-bottom: 10px; }
.model-card-specs strong { color: var(--color-text); font-weight: 700; }
.model-card-go { font-family: var(--font-heading); font-weight: 700; font-size: 0.82rem; color: var(--hce-black); }
.model-card:hover .model-card-go { color: var(--color-primary); }

/* ---- Used inventory cards ----
   Photo-first, unlike .model-card: used units come with real jobsite photos,
   not transparent renders, so the photo fills a fixed 4:3 frame (cover)
   instead of floating letterboxed in a side column. */
:root { --price-green: #1b7a3c; } /* 5.4:1 on white */
.uc-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 24px; }
.uc-grid--compact { grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 20px; }
@media (max-width: 1024px) { .uc-grid, .uc-grid--compact { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 640px) { .uc-grid, .uc-grid--compact { grid-template-columns: 1fr; } }

.uc-card { display: flex; flex-direction: column; box-sizing: border-box; background: #fff; border: 1px solid rgba(45,41,38,0.09); border-radius: var(--radius-md); overflow: hidden; text-decoration: none; color: var(--color-text); box-shadow: var(--shadow-card); transition: transform 0.25s var(--ease), box-shadow 0.25s var(--ease); }
.uc-card:hover { transform: translateY(-4px); box-shadow: var(--shadow-card-hover); }
.uc-card:focus-visible { outline: 2px solid var(--color-primary); outline-offset: 3px; }

.uc-card-media { position: relative; aspect-ratio: 4 / 3; overflow: hidden; background: var(--grey-50); }
.uc-card-media img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; transition: transform 0.6s var(--ease); }
.uc-card:hover .uc-card-media img { transform: scale(1.04); }
.uc-card-photos { position: absolute; right: 12px; bottom: 12px; display: inline-flex; align-items: center; gap: 6px; padding: 5px 10px; border-radius: var(--radius-pill); background: rgba(20,18,17,0.66); color: #fff; font-family: var(--font-mono); font-size: 0.68rem; font-weight: 700; letter-spacing: 0.04em; }
.uc-card-photos svg { width: 14px; height: 14px; fill: none; stroke: currentColor; stroke-width: 1.8; }

.uc-card-body { display: flex; flex-direction: column; flex: 1; padding: 20px 22px 18px; }
/* .uc-card scope needed: .section p (0,1,1) otherwise wins and paints it grey. */
.uc-card .uc-card-make { margin: 0 0 4px; font-family: var(--font-mono); font-size: 0.7rem; font-weight: 700; letter-spacing: 0.16em; text-transform: uppercase; color: var(--color-primary); }
.uc-card-model { margin: 0 0 16px; font-family: var(--font-heading); font-weight: 800; font-size: 1.55rem; line-height: 1.08; color: var(--color-text); }

/* Full-bleed red band: negative margins cancel .uc-card-body's side padding. */
.uc-card-specs { display: flex; margin: 0 -22px 18px; padding: 12px 22px; background: var(--color-primary); }
.uc-card-specs > div { flex: none; padding: 2px 16px; border-left: 1px solid rgba(255,255,255,0.28); }
.uc-card-specs > div:last-child { flex: 1 1 auto; min-width: 0; }
.uc-card-specs > div:first-child { padding-left: 0; border-left: 0; }
.uc-card-specs dt { margin: 0 0 3px; font-family: var(--font-mono); font-size: 0.6rem; font-weight: 700; letter-spacing: 0.14em; text-transform: uppercase; color: rgba(255,255,255,0.88); }
.uc-card-specs dd { margin: 0; font-size: 0.9rem; font-weight: 600; color: #fff; }

.uc-card-foot { margin-top: auto; display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
.uc-card-price { font-family: var(--font-heading); font-weight: 800; font-size: 1.35rem; color: var(--price-green); }
.uc-card-price.is-call { font-family: var(--font-body); font-size: 0.95rem; font-weight: 700; }
.uc-card-go { white-space: nowrap; font-family: var(--font-heading); font-weight: 700; font-size: 0.85rem; color: var(--color-primary); transition: color 0.2s var(--ease); }
.uc-card-go span { display: inline-block; transition: transform 0.2s var(--ease); }
.uc-card:hover .uc-card-go { color: var(--color-primary-hover); }
.uc-card:hover .uc-card-go span { transform: translateX(3px); }

.uc-card--compact .uc-card-body { padding: 16px 18px 16px; }
.uc-card--compact .uc-card-specs { margin-inline: -18px; padding-inline: 18px; }
.uc-card--compact .uc-card-model { font-size: 1.25rem; margin-bottom: 14px; }
.uc-card--compact .uc-card-price { font-size: 1.1rem; }

/* ---- Used unit detail: "About this crane" ----
   Copy + highlights on the left, the Unit Details card on the right (sticky on
   desktop, so price and the quote buttons stay in view beside long feature
   lists). Stacks to one column under 900px. */
.uc-about { display: grid; grid-template-columns: minmax(0, 1.3fr) minmax(19rem, 0.7fr); gap: clamp(28px, 4vw, 64px); align-items: start; }
.uc-about-side { position: sticky; top: calc(var(--header-height) + 24px); }
.uc-about-copy > p { font-size: var(--text-lg); color: var(--color-text); margin: 0 0 0.35rem; }
.uc-about-copy > p:empty { display: none; }

.uc-highlights { margin-top: 1.75rem; }
.uc-highlights h3 { margin: 0 0 14px; font-size: 1.05rem; text-transform: uppercase; letter-spacing: 0.04em; }
.uc-highlights ul { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px 14px; }
.uc-highlights li { position: relative; margin: 0; padding: 12px 14px 12px 40px; background: var(--grey-50); border-radius: 10px; font-size: 0.95rem; font-weight: 500; line-height: 1.4; color: var(--color-text); }
.uc-highlights li p { margin: 0; }
.uc-highlights li::before { content: ""; position: absolute; left: 17px; top: 50%; width: 6px; height: 11px; border-right: 2.5px solid var(--color-primary); border-bottom: 2.5px solid var(--color-primary); transform: translateY(-65%) rotate(45deg); }
.uc-highlights p:empty { display: none; }

.uc-unit-card .spec-list .uc-unit-price { padding-top: 14px; }
.uc-unit-card .spec-list .uc-unit-price dt { color: var(--color-text); font-weight: 600; }
.uc-unit-card .spec-list .uc-unit-price dd { font-family: var(--font-heading); font-size: 1.3rem; font-weight: 800; color: var(--price-green); }
.uc-unit-cta { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-top: 18px; }
.uc-unit-cta .btn { padding-inline: 0.8em; }

@media (max-width: 900px) {
  .uc-about { grid-template-columns: 1fr; }
  .uc-about-side { position: static; }
}
@media (max-width: 640px) {
  .uc-highlights ul { grid-template-columns: 1fr; }
  .uc-unit-cta { grid-template-columns: 1fr; }
}
.uc-card--compact .uc-card-price.is-call { font-size: 0.88rem; }

/* ============================================================
   About page (SA review, 8/10/26)
   ============================================================ */

/* Icon size. The emoji live in <p class="fi"> since the block conversion, and
   `.feature p` (0,2,0) was silently beating `.fi` (0,1,0), rendering them at
   0.9rem instead of the intended 1.8rem. This restores and enlarges them. */
.feature p.fi { font-size: 2rem; line-height: 1; margin: 0 0 12px; }

/* Logo panel in "Who we are". Scoped to .logo-fig so the crane-render figures
   on product/hub pages keep their radial-gradient treatment. Matches the
   .feature card so it stops reading as a one-off, and the logo now scales
   instead of being pinned to a hard 260px. */
.overview-fig.logo-fig {
  background: #fff;
  border: 1px solid rgba(45, 41, 38, 0.07);
  box-shadow: var(--shadow-card);
  padding: clamp(26px, 4vw, 44px);
  text-align: center;
}
/* Deliberately NOT grid + place-items:center here: a centered (non-stretch)
   grid item is content-sized, so the image's width:100% has no definite
   reference and collapses to 0. Give the figure the definite width instead. */
.overview-fig.logo-fig .wp-block-image { width: 100%; max-width: 260px; margin: 0 auto; }
.overview-fig.logo-fig img { width: 100%; height: auto; filter: none; }

/* CTA button rows that replaced pill rows. .about-cta kept as an alias so the
   already-live About page markup is not disturbed; .section-cta is the name to
   use going forward on the hub pages. */
.about-cta,
.section-cta { margin-top: var(--space-md); }
.section-cta-note { margin-top: var(--space-md); font-size: 0.98rem; color: var(--color-text); }
/* Lineup CTA rows sit under the model grid on a light panel. */
.section .cta-row.section-cta,
.section-alt .cta-row.section-cta { margin-top: var(--space-lg); justify-content: flex-start; }
.wp-block-button.btn-dark .wp-block-button__link { background: rgba(45, 41, 38, 0.9); color: #fff; }
.wp-block-button.btn-dark .wp-block-button__link:hover { background: var(--hce-black); }

/* Inline quote form in the bottom CTA band (replaces the 3-button row).
   Band is dark, so the WPForms "modern markup" custom properties get a
   dark-surface treatment rather than the light one used in the modal. */
.cta-form { max-width: 34rem; margin: var(--space-md) auto 0; text-align: left; }
.cta-form .wpforms-container {
  --wpforms-field-border-color: rgba(255, 255, 255, 0.28);
  --wpforms-field-background-color: rgba(255, 255, 255, 0.07);
  --wpforms-field-text-color: #fff;
  --wpforms-field-border-radius: var(--radius-sm);
  --wpforms-field-size-input-height: 2.9em;
  --wpforms-label-color: #fff;
  --wpforms-label-error-color: #ffb4b4;
  --wpforms-button-background-color: var(--color-primary);
  --wpforms-button-background-color-alt: var(--color-primary-hover, #a91217);
  --wpforms-button-text-color: #fff;
  --wpforms-button-text-color-alt: #fff;
  --wpforms-button-border-radius: var(--radius-pill);
  margin: 0;
  font-family: var(--font-body);
}
/* WPForms sizes "medium" fields at 60%, which reads ragged next to the
   full-width textarea in a centered band. Even them up. */
.cta-form .wpforms-container .wpforms-field-medium,
.cta-form .wpforms-container .wpforms-field-small,
.cta-form .wpforms-container .wpforms-field-large { max-width: 100%; }
.cta-form .wpforms-field-label { font-family: var(--font-heading); font-weight: 700; }
.cta-form .wpforms-submit { font-family: var(--font-heading); font-weight: 700; letter-spacing: 0.02em; cursor: pointer; }
/* Keeps the phone and locations paths alive now that their buttons are gone. */
.cta-alt { margin-top: var(--space-md); font-size: 0.92rem; }
.cta-band .cta-alt a { color: #fff; text-decoration: underline; }

/* Link-Belt Top 5 Dealer badge in the hero. The artwork is dark-on-transparent,
   so over a photo it needs a light card to stay legible. */
.phero-badge {
  position: absolute;
  top: clamp(16px, 3vh, 34px);
  right: clamp(16px, 4vw, 48px);
  z-index: 3;
  margin: 0;
  width: clamp(116px, 13vw, 178px);
  background: #fff;
  border-radius: var(--radius-md);
  padding: 13px 15px;
  box-shadow: 0 14px 34px rgba(20, 18, 17, 0.38);
}
.phero-badge img { display: block; width: 100%; height: auto; }
@media (max-width: 640px) {
  /* The hero is bottom-aligned, so on a narrow screen the headline grows up
     into the badge. Reserving top padding on the hero guarantees the text
     block can never start above the badge. */
  .phero-badge { width: 96px; padding: 8px 9px; top: 16px; }
  .about-hero-badged { padding-top: 128px; }
}

/* ---- Locations page: narrower, centered 2-up grid + a trailing note ---- */
.locations-grid { max-width: 56rem; margin-inline: auto; }
.section-note { max-width: 52rem; margin-top: var(--space-md); }

/* Phone rows as a real two-column block so labels and numbers line up in
   columns on BOTH cards. The default .model-card-specs is a wrapping flex row,
   which let the Irving card's longer parts number break to a different
   position than San Antonio's (SA review, 8/4/26). */
.loc-phones {
  display: grid;
  grid-template-columns: max-content 1fr;
  gap: 4px 14px;
  align-items: baseline;
}
.loc-phones p { display: contents; }
.loc-phones p strong { color: var(--color-text); font-weight: 700; }
.loc-phones p a { color: var(--color-primary); text-decoration: none; font-family: var(--font-mono); }
.loc-phones p a:hover { text-decoration: underline; }

/* Summary lines promoted from a trailing footnote to intro copy under the
   section header, so they need subhead weight rather than fine print. */
.section-lead { max-width: 52rem; font-size: 0.98rem; color: var(--color-text-muted); margin: 0 0 0.6rem; }
.section-head .section-lead:last-child { margin-bottom: 0; }

/* ---- Lineup figure (index overview: multiple small renders in one card) ---- */
.lineup-fig-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; align-items: end; }
.lineup-fig-grid img { width: 100%; object-fit: contain; filter: drop-shadow(0 12px 14px rgba(45,41,38,0.16)); }
.lineup-fig-grid .lf-wide { grid-column: span 3; }

/* ---- Related ---- */
.related-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; }
.related { background: #fff; border: 1px solid rgba(45,41,38,0.07); border-radius: var(--radius-md); box-shadow: var(--shadow-card); padding: 20px; text-align: center; text-decoration: none; color: var(--color-text); transition: transform 0.2s var(--ease), box-shadow 0.2s var(--ease); }
.related:hover { transform: translateY(-4px); box-shadow: var(--shadow-card-hover); }
.related img { height: 100px; width: auto; margin: 0 auto 12px; object-fit: contain; }
.related .rn { font-family: var(--font-heading); font-weight: 800; font-size: 1.2rem; }
.related .rc { font-family: var(--font-mono); font-size: 0.75rem; color: var(--color-primary); margin-top: 4px; }

/* ---- Related grid, 8-up (lattice crawler family: 7 sibling models + a "view all" card back to the hub) ---- */
.related-grid-8 { grid-template-columns: repeat(8, 1fr); gap: 8px; }
.related-grid-8 .related { padding: 12px 8px; }
.related-grid-8 .related img { height: 52px; margin-bottom: 6px; }
.related-grid-8 .related .rn { font-size: 0.84rem; }
.related-grid-8 .related .rc { font-size: 0.62rem; }

/* ---- Footer lives in the shared assets/css/chrome.css ---- */

/* ---- Reveal ---- */
.reveal { opacity: 0; transform: translateY(20px); transition: opacity 0.7s var(--ease), transform 0.7s var(--ease); }
.reveal.in { opacity: 1; transform: none; }
.verify .reveal { opacity: 1; transform: none; transition: none; }

/* ---- Responsive ---- */
@media (max-width: 900px) {
  .nav-links { display: none; }
  .nav-phone { display: none; }
  .keyspec-grid { grid-template-columns: repeat(2, 1fr); gap: 20px 0; }
  .keyspec:nth-child(2) { border-right: 0; }
  .split-2 { grid-template-columns: 1fr; }
  .feature-grid { grid-template-columns: 1fr 1fr; }
  .spec-tables { grid-template-columns: 1fr; }
  .downloads { grid-template-columns: 1fr; }
  .gallery { grid-template-columns: 1fr; }
  .related-grid { grid-template-columns: 1fr 1fr; }
  .related-grid-8 { grid-template-columns: repeat(4, 1fr); }
  .model-grid { grid-template-columns: 1fr; }
}
@media (max-width: 560px) {
  .feature-grid { grid-template-columns: 1fr; }
  .keyspec-grid { grid-template-columns: 1fr 1fr; }
  .phero-cta .btn, .cta-row .btn { flex: 1 1 auto; }
  .model-card { flex-direction: column; text-align: center; }
  .model-card-specs { justify-content: center; }
  .related-grid-8 { grid-template-columns: 1fr 1fr; }
}
@media (prefers-reduced-motion: reduce) {
  .reveal { opacity: 1; transform: none; transition: none; }
}

/* ============================================================
   Block-markup adapters (MIGRATION.md, Phase 1+)
   Content pages store native block markup in post_content now.
   Core blocks wrap elements differently than the original raw
   HTML did; these rules map block-generated markup onto the
   exact same look. Raw-HTML selectors above stay untouched so
   unconverted pattern pages keep rendering during the migration.
   ============================================================ */

/* Buttons: the editor puts className on .wp-block-button (the wrapper);
   the visible element is the inner __link. Mirrors .btn/.btn-primary/
   .btn-glass so "btn-primary" on a Button block just works. */
.wp-block-buttons { display: flex; flex-wrap: wrap; gap: 12px; }
/* A core Button block is <div class="wp-block-button MODIFIER"><a
   class="wp-block-button__link">. The modifier lands on the WRAPPER, and the
   wrapper is a square div sized exactly like the rounded <a> inside it - so
   the bare .btn-primary / .btn-glass / .btn-dark rules above (written for raw
   <a class="btn btn-primary"> links in the patterns) were painting a hard
   rectangle directly behind every button. btn-primary read as a red rectangle;
   btn-glass showed as a pale square poking out past the pill's corners, and
   its backdrop-filter blurred a square region too. The wrapper is layout only:
   it must never paint. Keep this AFTER the modifier rules - equal specificity,
   so source order is what makes it win. :hover is listed explicitly because
   .btn-primary:hover is (0,2,0) and would otherwise out-rank a bare
   .wp-block-button and bring the rectangle back on mouseover. */
.wp-block-button,
.wp-block-button:hover { background: none; border: 0; box-shadow: none; backdrop-filter: none; -webkit-backdrop-filter: none; }
/* Size/padding matched to momentum.css's .holt-btn so buttons are identical on
   every page, not just similar (SA "button consistency", 8/10/26). */
.wp-block-button .wp-block-button__link { display: inline-block; font-family: var(--font-heading); font-weight: 700; font-size: 0.875rem; letter-spacing: 0.02em; text-decoration: none; text-align: center; padding: 0.9em 2.6em; border-radius: var(--radius-pill); border: 1px solid transparent; cursor: pointer; background: none; color: inherit; transition: background 0.2s var(--ease), color 0.2s var(--ease), transform 0.2s var(--ease); }
.wp-block-button .wp-block-button__link:hover { transform: translateY(-1px); }
.wp-block-button.btn-primary .wp-block-button__link { background: var(--color-primary); color: #fff; }
.wp-block-button.btn-primary .wp-block-button__link:hover { background: var(--color-primary-hover); }
.wp-block-button.btn-glass .wp-block-button__link { background: rgba(255,255,255,0.14); color: #fff; border-color: rgba(255,255,255,0.4); backdrop-filter: blur(8px); }
.wp-block-button.btn-glass .wp-block-button__link:hover { background: rgba(255,255,255,0.26); }

/* Image blocks add a <figure> wrapper the raw markup didn't have. */
.phero-media .wp-block-image { margin: 0; height: 100%; }
.overview-fig .wp-block-image { margin: 0; }
.overview-fig .wp-block-image img { height: auto; }

/* Feature-card emoji icons and pills are Paragraph blocks now. */
p.fi { margin: 0 0 12px; }
p.pill { margin: 0; }

/* Top-level content sections self-pad; cancel any block-gap between them. */
.entry-content > * { margin-block: 0; }
/* Cancel WP's flow block-gap inside components the design lays out with its
   own grid/flex + gap (or intentionally tight stacking), so items align in
   their tracks. Flow prose columns keep block-gap for paragraph rhythm, and
   the design's explicit margins (eyebrow, pill-row, section-head) still win. */
.entry-content .split-2 > *,
.entry-content .feature-grid > *,
.entry-content .spec-tables > *,
.entry-content .downloads > *,
.entry-content .gallery > *,
.entry-content .pill-row > *,
.entry-content .faq > * { margin-block-start: 0; }
/* ...but the FAQ cards do want a gap. This has to out-specify the line above
   ((0,2,0)), which .faq details + details ((0,1,2)) does not. */
.entry-content .faq > details + details { margin-block-start: 10px; }

/* Spec tables: core Table blocks styled to match the old dl.spec-list. */
.spec-block .wp-block-table { margin: 0; }
.spec-block .wp-block-table table { width: 100%; border-collapse: collapse; }
.spec-block .wp-block-table td { padding: 11px 0; border-bottom: 1px solid var(--hairline, rgba(45,41,38,0.1)); font-size: 0.86rem; vertical-align: top; border-left: 0; border-right: 0; }
.spec-block .wp-block-table tr:last-child td { border-bottom: 0; }
.spec-block .wp-block-table td:first-child { color: var(--color-text-muted); }
.spec-block .wp-block-table td:last-child { font-weight: 600; font-size: 0.9rem; text-align: right; font-family: var(--font-mono); }

/* Downloads as content: the card is a Group now, not an <a>; the class-based
   styling still applies. Inner paragraphs carry the icon and the label/link. */
.download.wp-block-group { text-decoration: none; }
.download p { margin: 0; }

/* Gallery as content: a Group.gallery of core Image blocks (figures). */
.gallery .wp-block-image { margin: 0; height: 100%; }
.gallery .wp-block-image img { width: 100%; height: 100%; object-fit: cover; }

/* Separator block as the CTA accent rule (core adds hr borders/opacity). */
.cta-band hr.accent-rule { border: 0; opacity: 1; }

@media (max-width: 560px) {
  .phero-cta .wp-block-button, .cta-row .wp-block-button { flex: 1 1 auto; }
  .phero-cta .wp-block-button .wp-block-button__link, .cta-row .wp-block-button .wp-block-button__link { width: 100%; }
}

/* ---- Inline contact form (replaces the Contact Us drawer) ----------------
   The closing CTA band now carries the real form instead of a pair of buttons
   that opened a modal, and every contact button on the page is a plain anchor
   to #contact-form. Plain anchors were chosen over the JS trigger so the path
   to the form survives with JavaScript disabled or broken.

   The band is --hce-black, and WPForms' "modern markup" exposes CSS custom
   properties for exactly this, so the whole form is themed through those rather
   than by fighting wpforms-full.min.css on specificity. */
.cta-band-form { text-align: left; }
.cta-band-form .wrap { max-width: 46rem; }
.cta-band-form .accent-rule { margin-inline: 0; }
.cta-band-form h2 { text-align: left; }
.cta-band-form > .wrap > p { max-width: 38rem; }

.cta-band .cta-form { max-width: none; margin-top: var(--space-lg); }
.cta-band .cta-form .wpforms-container {
  --wpforms-field-border-color: rgba(255,255,255,0.22);
  --wpforms-field-background-color: rgba(255,255,255,0.06);
  --wpforms-field-text-color: #fff;
  --wpforms-field-border-radius: var(--radius-sm);
  --wpforms-field-size-input-height: 3em;
  --wpforms-label-color: rgba(255,255,255,0.92);
  --wpforms-label-sublabel-color: rgba(255,255,255,0.55);
  --wpforms-label-error-color: #ff9ea2;
  --wpforms-button-background-color: var(--color-primary);
  --wpforms-button-background-color-alt: var(--color-primary-hover, #a91217);
  --wpforms-button-text-color: #fff;
  --wpforms-button-text-color-alt: #fff;
  --wpforms-button-border-radius: var(--radius-pill);
  --wpforms-button-size-font-size: 0.875rem;
  --wpforms-button-size-padding-h: 2.6em;
  --wpforms-button-size-height: 3.1em;
  margin: 0;
  font-family: var(--font-body);
}
.cta-band .cta-form .wpforms-field-label { font-family: var(--font-heading); font-weight: 700; font-size: 0.86rem; }
.cta-band .cta-form .wpforms-field-sublabel,
.cta-band .cta-form .wpforms-field-description { font-size: 0.78rem; }
.cta-band .cta-form select { color: #fff; }
.cta-band .cta-form select option { color: var(--hce-black); }
.cta-band .cta-form .wpforms-submit { font-family: var(--font-heading); font-weight: 700; letter-spacing: 0.02em; cursor: pointer; }
.cta-band .cta-form .wpforms-confirmation-container-full { background: rgba(255,255,255,0.08); border-color: rgba(255,255,255,0.25); color: #fff; }
.cta-band .section-cta-note { color: rgba(255,255,255,0.6); font-size: 0.9rem; margin-top: var(--space-md); }
.cta-band .section-cta-note a { color: var(--hce-yellow); text-decoration: none; }

/* The form is a scroll target, so keep it clear of the fixed header. */
#contact-form { scroll-margin-top: calc(var(--header-height) + 20px); }

/* ============================================================
   Feature card icons (Rough Terrain first)
   Replaces the emoji, which rendered in the OS colour set, at three different
   visual weights, and in a couple of cases had no relationship to the heading
   (a lobster for outriggers, an abacus for remote sites).

   Drawn per card rather than picked from a generic set: a tire for unimproved
   ground, a steering wheel for four steering modes, and so on. Delivered as a
   CSS mask rather than inline SVG so the page content stays a clean
   `<p class="fi fi-tire">` that an editor can move without meeting markup, and
   so one rule recolours the whole set.
   ============================================================ */
.fi {
  width: 44px;
  height: 44px;
  margin: 0 0 16px;
  border-radius: 50%;
  background: var(--color-primary, #c4161c);
  color: #fff;
  position: relative;
  font-size: 0 !important;   /* kills any leftover emoji glyph */
  transition: background 0.25s var(--ease), transform 0.25s var(--ease);
}
.fi::after {
  content: "";
  position: absolute;
  inset: 10px;
  /* Explicit white, NOT currentColor: .fi is a <p> inside .feature, so
     `.feature p { color: var(--color-text-muted) }` at (0,1,1) out-ranks
     `.fi` at (0,1,0) and the glyph came out muted grey on the red chip. */
  background: #fff;
  -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;
  -webkit-mask-position: center;  mask-position: center;
  -webkit-mask-size: contain;     mask-size: contain;
}
/* The whole card lifts on hover already; the chip deepens and rises with it. */
.feature:hover .fi { background: var(--color-primary-hover, #a91217); transform: translateY(-2px); }

.fi-tire::after { -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='9'/><circle cx='12' cy='12' r='3.3'/><path d='M12 3v3.3M12 17.7V21M3 12h3.3M17.7 12H21M5.64 5.64l2.33 2.33M16.03 16.03l2.33 2.33M18.36 5.64l-2.33 2.33M7.97 16.03l-2.33 2.33'/></svg>"); mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='9'/><circle cx='12' cy='12' r='3.3'/><path d='M12 3v3.3M12 17.7V21M3 12h3.3M17.7 12H21M5.64 5.64l2.33 2.33M16.03 16.03l2.33 2.33M18.36 5.64l-2.33 2.33M7.97 16.03l-2.33 2.33'/></svg>"); }
.fi-steering::after { -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='9'/><circle cx='12' cy='12' r='2.5'/><path d='M12 9.5V3.1M9.83 13.26L4.3 16.45M14.17 13.26l5.53 3.19'/></svg>"); mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='9'/><circle cx='12' cy='12' r='2.5'/><path d='M12 9.5V3.1M9.83 13.26L4.3 16.45M14.17 13.26l5.53 3.19'/></svg>"); }
.fi-compact::after { -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M3 4.5v15M21 4.5v15'/><rect x='9' y='8.5' width='6' height='7' rx='1'/><path d='M5 12h2.4M6.3 10.85 7.5 12l-1.2 1.15M19 12h-2.4M17.7 10.85 16.5 12l1.2 1.15'/></svg>"); mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M3 4.5v15M21 4.5v15'/><rect x='9' y='8.5' width='6' height='7' rx='1'/><path d='M5 12h2.4M6.3 10.85 7.5 12l-1.2 1.15M19 12h-2.4M17.7 10.85 16.5 12l1.2 1.15'/></svg>"); }
.fi-pickcarry::after { -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M12 2.4v1.4'/><circle cx='12' cy='5.3' r='1.5'/><path d='M12 6.8v4.2'/><path d='M12 11A4.4 4.4 0 1 1 7.6 15.4'/></svg>"); mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M12 2.4v1.4'/><circle cx='12' cy='5.3' r='1.5'/><path d='M12 6.8v4.2'/><path d='M12 11A4.4 4.4 0 1 1 7.6 15.4'/></svg>"); }
.fi-engine::after { -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><rect x='3.5' y='9' width='13' height='9' rx='1.5'/><path d='M7.5 9V6.2h3.4V9'/><path d='M16.5 12h2.2l1.8 1.8V18h-4'/><path d='M6.5 12.4v2.6M9.3 12.4v2.6M12.1 12.4v2.6'/></svg>"); mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><rect x='3.5' y='9' width='13' height='9' rx='1.5'/><path d='M7.5 9V6.2h3.4V9'/><path d='M16.5 12h2.2l1.8 1.8V18h-4'/><path d='M6.5 12.4v2.6M9.3 12.4v2.6M12.1 12.4v2.6'/></svg>"); }
.fi-backed::after { -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M12 2.8l7.2 3v5.7c0 4.3-3 7.8-7.2 8.7-4.2-.9-7.2-4.4-7.2-8.7V5.8z'/><path d='M8.9 11.9l2.2 2.2 4-4.2'/></svg>"); mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M12 2.8l7.2 3v5.7c0 4.3-3 7.8-7.2 8.7-4.2-.9-7.2-4.4-7.2-8.7V5.8z'/><path d='M8.9 11.9l2.2 2.2 4-4.2'/></svg>"); }

/* Vocabulary extension. The same card component carries 234 feature cards
   across the six hubs, 31 crane pages, About and Locations. These cover the
   recurring concepts so every card gets a drawn icon rather than an emoji. */
.fi-screen::after { -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><rect x='2.6' y='4' width='18.8' height='13' rx='2'/><path d='M8 20.4h8M12 17v3.4'/><path d='M6.5 13.2l3-3.4 2.6 2.4 2.4-3.4 3 4.4'/></svg>"); mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><rect x='2.6' y='4' width='18.8' height='13' rx='2'/><path d='M8 20.4h8M12 17v3.4'/><path d='M6.5 13.2l3-3.4 2.6 2.4 2.4-3.4 3 4.4'/></svg>"); }
.fi-outrigger::after { -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M7 4h10v4H7z'/><path d='M7 8L3 15M17 8l4 7'/><path d='M1.6 15h2.8M19.6 15h2.8M3 15v3.4M21 15v3.4'/><path d='M12 8v6'/></svg>"); mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M7 4h10v4H7z'/><path d='M7 8L3 15M17 8l4 7'/><path d='M1.6 15h2.8M19.6 15h2.8M3 15v3.4M21 15v3.4'/><path d='M12 8v6'/></svg>"); }
.fi-boom::after { -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M3.2 19.4L15 5.6'/><path d='M6.4 15.6l2.6 2.2M9.6 11.8l2.6 2.2'/><path d='M14 4.2l4.4 3.6-1.8 2.2L12.2 6.4z'/><path d='M16.4 10.6v4.2a2 2 0 0 1-2 2'/></svg>"); mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M3.2 19.4L15 5.6'/><path d='M6.4 15.6l2.6 2.2M9.6 11.8l2.6 2.2'/><path d='M14 4.2l4.4 3.6-1.8 2.2L12.2 6.4z'/><path d='M16.4 10.6v4.2a2 2 0 0 1-2 2'/></svg>"); }
.fi-counterweight::after { -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><rect x='4' y='14.5' width='16' height='5' rx='1'/><rect x='6' y='9.6' width='12' height='4.6' rx='1'/><rect x='8.4' y='5' width='7.2' height='4.4' rx='1'/></svg>"); mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><rect x='4' y='14.5' width='16' height='5' rx='1'/><rect x='6' y='9.6' width='12' height='4.6' rx='1'/><rect x='8.4' y='5' width='7.2' height='4.4' rx='1'/></svg>"); }
.fi-telematics::after { -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M12 12.6v7.8'/><path d='M8.6 20.4h6.8'/><circle cx='12' cy='10.4' r='2'/><path d='M7.6 6a6.2 6.2 0 0 0 0 8.8M16.4 6a6.2 6.2 0 0 1 0 8.8'/><path d='M4.8 3.2a10 10 0 0 0 0 14.4M19.2 3.2a10 10 0 0 1 0 14.4'/></svg>"); mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M12 12.6v7.8'/><path d='M8.6 20.4h6.8'/><circle cx='12' cy='10.4' r='2'/><path d='M7.6 6a6.2 6.2 0 0 0 0 8.8M16.4 6a6.2 6.2 0 0 1 0 8.8'/><path d='M4.8 3.2a10 10 0 0 0 0 14.4M19.2 3.2a10 10 0 0 1 0 14.4'/></svg>"); }
.fi-speed::after { -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M3.4 17a9 9 0 1 1 17.2 0'/><path d='M12 17l4.6-5.2'/><circle cx='12' cy='17' r='1.4'/><path d='M3.6 13.2h1.8M18.6 13.2h1.8M6.4 8.2l1.3 1.3M17.6 8.2l-1.3 1.3M12 6.4v1.8'/></svg>"); mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M3.4 17a9 9 0 1 1 17.2 0'/><path d='M12 17l4.6-5.2'/><circle cx='12' cy='17' r='1.4'/><path d='M3.6 13.2h1.8M18.6 13.2h1.8M6.4 8.2l1.3 1.3M17.6 8.2l-1.3 1.3M12 6.4v1.8'/></svg>"); }
.fi-chassis::after { -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M2.6 13.6V9.4a1 1 0 0 1 1-1h9l3.4 3.4h3.4a1.6 1.6 0 0 1 1.6 1.6v2.2'/><path d='M2.6 15.6h1.2M9.4 15.6h4M18.6 15.6h2.4'/><circle cx='6.6' cy='16.6' r='2'/><circle cx='16' cy='16.6' r='2'/></svg>"); mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M2.6 13.6V9.4a1 1 0 0 1 1-1h9l3.4 3.4h3.4a1.6 1.6 0 0 1 1.6 1.6v2.2'/><path d='M2.6 15.6h1.2M9.4 15.6h4M18.6 15.6h2.4'/><circle cx='6.6' cy='16.6' r='2'/><circle cx='16' cy='16.6' r='2'/></svg>"); }
.fi-track::after { -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M6.6 8.4h8.6a5.4 5.4 0 0 1 0 10.8H6.6a5.4 5.4 0 0 1 0-10.8z'/><circle cx='6.8' cy='13.8' r='2.2'/><circle cx='15' cy='13.8' r='2.2'/><path d='M9.4 8.6v-3h6.8'/></svg>"); mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M6.6 8.4h8.6a5.4 5.4 0 0 1 0 10.8H6.6a5.4 5.4 0 0 1 0-10.8z'/><circle cx='6.8' cy='13.8' r='2.2'/><circle cx='15' cy='13.8' r='2.2'/><path d='M9.4 8.6v-3h6.8'/></svg>"); }
.fi-ground::after { -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M2.6 19.4h18.8'/><path d='M6.2 16.4h11.6'/><path d='M12 3.4v8.6M8.6 8.8l3.4 3.4 3.4-3.4'/><path d='M4.6 21.6l1.4-2.2M10.6 21.6l1.4-2.2M16.6 21.6l1.4-2.2'/></svg>"); mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M2.6 19.4h18.8'/><path d='M6.2 16.4h11.6'/><path d='M12 3.4v8.6M8.6 8.8l3.4 3.4 3.4-3.4'/><path d='M4.6 21.6l1.4-2.2M10.6 21.6l1.4-2.2M16.6 21.6l1.4-2.2'/></svg>"); }
.fi-cab::after { -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M5.4 19.4V9.2l5-5.2h6.2a1.6 1.6 0 0 1 1.6 1.6v13.8z'/><path d='M8 10.4h4.6v4.2H8z'/><path d='M5.4 19.4h13.4'/></svg>"); mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M5.4 19.4V9.2l5-5.2h6.2a1.6 1.6 0 0 1 1.6 1.6v13.8z'/><path d='M8 10.4h4.6v4.2H8z'/><path d='M5.4 19.4h13.4'/></svg>"); }
.fi-wrench::after { -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M15.6 3.6a5 5 0 0 0-5.9 6.4L3.4 16.3a2 2 0 1 0 2.8 2.8l6.3-6.3a5 5 0 0 0 6.4-5.9l-2.9 2.9-2.6-.7-.7-2.6z'/></svg>"); mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M15.6 3.6a5 5 0 0 0-5.9 6.4L3.4 16.3a2 2 0 1 0 2.8 2.8l6.3-6.3a5 5 0 0 0 6.4-5.9l-2.9 2.9-2.6-.7-.7-2.6z'/></svg>"); }
.fi-height::after { -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M12 21V3.4'/><path d='M8.6 6.8L12 3.4l3.4 3.4M8.6 17.6L12 21l3.4-3.4'/><path d='M4 3.4h3M4 21h3M17.6 12.2H21'/></svg>"); mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M12 21V3.4'/><path d='M8.6 6.8L12 3.4l3.4 3.4M8.6 17.6L12 21l3.4-3.4'/><path d='M4 3.4h3M4 21h3M17.6 12.2H21'/></svg>"); }
.fi-jib::after { -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M3.4 20.2l9.2-10.8'/><path d='M12.6 9.4l7.6-5.6'/><path d='M5.8 17.4l2.6 2M8.8 13.8l2.6 2'/><circle cx='20.4' cy='3.6' r='1.2'/><path d='M2 20.2h5'/></svg>"); mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M3.4 20.2l9.2-10.8'/><path d='M12.6 9.4l7.6-5.6'/><path d='M5.8 17.4l2.6 2M8.8 13.8l2.6 2'/><circle cx='20.4' cy='3.6' r='1.2'/><path d='M2 20.2h5'/></svg>"); }
.fi-swing::after { -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M20.4 12a8.4 8.4 0 1 1-2.5-6'/><path d='M18.4 2.4v3.8h-3.8'/><circle cx='12' cy='12' r='2.2'/></svg>"); mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M20.4 12a8.4 8.4 0 1 1-2.5-6'/><path d='M18.4 2.4v3.8h-3.8'/><circle cx='12' cy='12' r='2.2'/></svg>"); }
.fi-camera::after { -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><rect x='2.6' y='7' width='18.8' height='12.4' rx='2'/><circle cx='12' cy='13.2' r='3.4'/><path d='M8.4 7l1.4-2.4h4.4L15.6 7'/></svg>"); mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><rect x='2.6' y='7' width='18.8' height='12.4' rx='2'/><circle cx='12' cy='13.2' r='3.4'/><path d='M8.4 7l1.4-2.4h4.4L15.6 7'/></svg>"); }
.fi-eco::after { -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M20 4.4c0 8.4-4.2 12.6-10 12.6a5.6 5.6 0 0 1 0-11.2c4.2 0 5.8-1.4 10-1.4z'/><path d='M4.4 20c1.6-5 4.6-8.4 9-10.6'/></svg>"); mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M20 4.4c0 8.4-4.2 12.6-10 12.6a5.6 5.6 0 0 1 0-11.2c4.2 0 5.8-1.4 10-1.4z'/><path d='M4.4 20c1.6-5 4.6-8.4 9-10.6'/></svg>"); }
.fi-power::after { -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><rect x='3' y='6.6' width='15.4' height='10.8' rx='1.6'/><path d='M18.4 10.4h2.6v4h-2.6'/><path d='M11.6 8.8l-2.6 4.2h3l-1 3'/></svg>"); mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><rect x='3' y='6.6' width='15.4' height='10.8' rx='1.6'/><path d='M18.4 10.4h2.6v4h-2.6'/><path d='M11.6 8.8l-2.6 4.2h3l-1 3'/></svg>"); }
.fi-award::after { -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='9' r='5.6'/><path d='M9 13.8L7.6 21.4l4.4-2.4 4.4 2.4-1.4-7.6'/></svg>"); mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='9' r='5.6'/><path d='M9 13.8L7.6 21.4l4.4-2.4 4.4 2.4-1.4-7.6'/></svg>"); }
.fi-parts::after { -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M12 2.8l8 4.2v10L12 21.2 4 17V7z'/><path d='M4 7l8 4.2L20 7M12 11.2v10'/></svg>"); mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M12 2.8l8 4.2v10L12 21.2 4 17V7z'/><path d='M4 7l8 4.2L20 7M12 11.2v10'/></svg>"); }
.fi-servicetruck::after { -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M2.6 16.4V7.4a1 1 0 0 1 1-1h9.4v10'/><path d='M13 9.4h3.6l3.8 3.8v3.2'/><circle cx='7' cy='17.6' r='1.9'/><circle cx='16.8' cy='17.6' r='1.9'/><path d='M8.9 17.6h6M2.6 17.6h2.5M18.7 17.6h1.7'/></svg>"); mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M2.6 16.4V7.4a1 1 0 0 1 1-1h9.4v10'/><path d='M13 9.4h3.6l3.8 3.8v3.2'/><circle cx='7' cy='17.6' r='1.9'/><circle cx='16.8' cy='17.6' r='1.9'/><path d='M8.9 17.6h6M2.6 17.6h2.5M18.7 17.6h1.7'/></svg>"); }
.fi-cycle::after { -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M4 9.6A8.4 8.4 0 0 1 19 7.2'/><path d='M19.4 3.4v4h-4'/><path d='M20 14.4A8.4 8.4 0 0 1 5 16.8'/><path d='M4.6 20.6v-4h4'/></svg>"); mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M4 9.6A8.4 8.4 0 0 1 19 7.2'/><path d='M19.4 3.4v4h-4'/><path d='M20 14.4A8.4 8.4 0 0 1 5 16.8'/><path d='M4.6 20.6v-4h4'/></svg>"); }
.fi-building::after { -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M3 20.4V9.6l6-3.4v3.4l6-3.4v3.4l6-3.4v14.2z'/><path d='M3 20.4h18'/><path d='M7.4 20.4v-3.6h3v3.6'/></svg>"); mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M3 20.4V9.6l6-3.4v3.4l6-3.4v3.4l6-3.4v14.2z'/><path d='M3 20.4h18'/><path d='M7.4 20.4v-3.6h3v3.6'/></svg>"); }
.fi-lube::after { -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M12 21c-3.4 0-6-2.6-6-5.8C6 11 12 3 12 3s6 8 6 12.2c0 3.2-2.6 5.8-6 5.8z'/><path d='M9.6 15.4a2.6 2.6 0 0 0 2.4 2.6'/></svg>"); mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M12 21c-3.4 0-6-2.6-6-5.8C6 11 12 3 12 3s6 8 6 12.2c0 3.2-2.6 5.8-6 5.8z'/><path d='M9.6 15.4a2.6 2.6 0 0 0 2.4 2.6'/></svg>"); }
.fi-weld::after { -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M14.6 3.4l6 6-2.6 2.6-6-6z'/><path d='M12 6l-8.6 8.6a2 2 0 0 0 0 2.8l1.2 1.2a2 2 0 0 0 2.8 0L16 10'/><path d='M4.4 19.6l-2 2'/></svg>"); mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M14.6 3.4l6 6-2.6 2.6-6-6z'/><path d='M12 6l-8.6 8.6a2 2 0 0 0 0 2.8l1.2 1.2a2 2 0 0 0 2.8 0L16 10'/><path d='M4.4 19.6l-2 2'/></svg>"); }
.fi-hydraulic::after { -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><rect x='3' y='9' width='9.4' height='6' rx='1.4'/><path d='M12.4 12h4'/><path d='M16.4 8.4h4.2v7.2h-4.2z'/><path d='M6 9V5.6h3.4V9'/></svg>"); mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><rect x='3' y='9' width='9.4' height='6' rx='1.4'/><path d='M12.4 12h4'/><path d='M16.4 8.4h4.2v7.2h-4.2z'/><path d='M6 9V5.6h3.4V9'/></svg>"); }
.fi-radiator::after { -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><rect x='3.6' y='4' width='16.8' height='16' rx='2'/><path d='M8 4v16M12 4v16M16 4v16'/><path d='M3.6 9h16.8M3.6 15h16.8'/></svg>"); mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><rect x='3.6' y='4' width='16.8' height='16' rx='2'/><path d='M8 4v16M12 4v16M16 4v16'/><path d='M3.6 9h16.8M3.6 15h16.8'/></svg>"); }
.fi-offroad::after { -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M2.6 17.6l4.6-6 3.4 4 3-4.2 7.8 6.2z'/><circle cx='17.4' cy='5.6' r='2.4'/><path d='M2.6 20.6h18.8'/></svg>"); mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M2.6 17.6l4.6-6 3.4 4 3-4.2 7.8 6.2z'/><circle cx='17.4' cy='5.6' r='2.4'/><path d='M2.6 20.6h18.8'/></svg>"); }

/* ---- 404 page ---- */
.nf-hero { min-height: 70vh; }
.nf-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
@media (max-width: 900px) { .nf-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
