/*
Theme Name: Astra Child - GrabberPro
Template: astra
Version: 1.0
*/

/* ===== GrabberPro Homepage Recreation ===== */
:root {
    /* Palette read from the Optimizely storefront's compiled styles, so these
       are the design system's actual values rather than approximations. */
    --gp-red:        #BB0027;   /* Primary            */
    --gp-red-dark:   #95001F;   /* Primary contrast - hover/active */
    --gp-dark:       #212121;   /* Text main          */
    --gp-grey:       #666666;   /* Text accent        */
    --gp-secondary:  #3A3B3D;   /* Secondary          */
    --gp-border:     #E6E7E8;   /* Border             */
    --gp-disabled:   #CCCCCC;   /* Disabled           */
    --gp-panel:      #F7F7F7;   /* Accent / panel bg  */
}

.gp-home { max-width: 1400px; margin: 0 auto; }

/* Hero */
.gp-hero { position: relative; width: 100%; overflow: hidden; background: #000; }
.gp-hero-video { width: 100%; display: block; aspect-ratio: 21 / 9; object-fit: cover; }
.gp-hero-caption {
    position: absolute; left: 3%; top: 40%; transform: translateY(-50%);
    color: #444; background: none; text-shadow: none;
}
.gp-hero-caption h1 { font-size: 1.75rem; font-weight: 700; font-family: "URWDINStdBold", Arial, Helvetica, sans-serif; line-height: 1.2; margin: 0; color: var(--gp-grey); }

/* Category icon row */
.gp-category-row {
    display: flex; flex-wrap: wrap; justify-content: center;
    gap: 2.5rem; padding: 2.5rem 1rem;
    border-top: 1px solid var(--gp-red, #BB0027);
    border-bottom: 1px solid var(--gp-red, #BB0027);
    background: #f7f7f7;
}
.gp-cat-item {
    display: flex; flex-direction: column; align-items: center;
    text-decoration: none; color: var(--gp-dark); width: 110px;
}
.gp-cat-item img {
    width: 64px; height: 64px;
    margin-bottom: 0.6rem; transition: opacity 0.2s;
}
.gp-cat-item:hover img { opacity: 0.8; }
.gp-cat-item span {
    color: var(--gp-grey) !important;
    font-size: 0.75rem; font-weight: 700; font-family: "URWDINStdBold", Arial, Helvetica, sans-serif; text-transform: uppercase;
    text-align: center; letter-spacing: 0.02em;
}

/* Catalog promo */
.gp-catalog-promo { padding: 2.5rem 1.5rem; text-align: center; }
.gp-catalog-promo h2 {
    text-transform: uppercase; font-size: 1.1rem; font-weight: 700; font-family: "URWDINStdBold", Arial, Helvetica, sans-serif;
    border-bottom: 2px solid var(--gp-red, #BB0027); padding-bottom: 1rem; margin-bottom: 2rem;
}
.gp-catalog-promo-inner {
    display: flex; flex-wrap: wrap; gap: 2.5rem; align-items: center;
    text-align: left; max-width: 1100px; margin: 0 auto;
}
.gp-catalog-promo-inner > a { flex: 0 0 320px; }
.gp-catalog-promo-inner img { max-width: 100%; height: auto; display: block; }
.gp-catalog-promo-text { flex: 1 1 400px; }
.gp-catalog-promo-text ul { padding-left: 1.2rem; }
.gp-catalog-promo-buttons { margin-top: 1.2rem; display: flex; gap: 1rem; flex-wrap: wrap; }

.gp-btn {
    display: inline-block; padding: 0.8rem 1.6rem; font-weight: 700; font-family: "URWDINStdBold", Arial, Helvetica, sans-serif;
    text-transform: uppercase; font-size: 0.85rem; text-decoration: none;
    border-radius: 2px; letter-spacing: 0.03em;
}
.gp-page-body .gp-btn-primary { background: var(--gp-red); color: #fff; }
.gp-page-body .gp-btn-primary:hover { background: var(--gp-red-dark, var(--gp-red-dark, #95001F)); color: #fff; }
.gp-page-body .gp-btn-outline { background: transparent; color: var(--gp-grey); border: 2px solid var(--gp-grey); }
.gp-page-body .gp-btn-outline:hover { background: var(--gp-grey); color: #fff; }

/* Featured products */
.gp-featured { padding: 2.5rem 1.5rem; text-align: center; background: #f7f7f7; }
.gp-featured h2 {
    text-transform: uppercase; font-size: 1.1rem; font-weight: 700; font-family: "URWDINStdBold", Arial, Helvetica, sans-serif;
    border-bottom: 2px solid var(--gp-red, #BB0027); padding-bottom: 1rem; margin-bottom: 2rem;
}
.gp-featured-grid {
    display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
    gap: 2rem; max-width: 1200px; margin: 0 auto; text-align: left;
}
.gp-featured-item { background: #fff; padding: 1.2rem; border: 1px solid var(--gp-border, #E6E7E8); }
.gp-featured-item img { width: 100%; height: auto; margin-bottom: 1rem; }
.gp-featured-item h3 { font-size: 1rem; margin: 0 0 0.6rem; }
.gp-featured-item p { font-size: 0.9rem; color: var(--gp-grey); }
.gp-link-arrow {
    color: var(--gp-red); font-weight: 700; font-family: "URWDINStdBold", Arial, Helvetica, sans-serif; text-decoration: none;
    font-size: 0.85rem; text-transform: uppercase;
}
.gp-link-arrow:after { content: " \2192"; }

/* Search by application
   8 tiles: one row of 8 on desktop, 4 across (two rows of 4) on tablets
   and phones. */
.gp-by-application { padding: 2.5rem 1.5rem; text-align: center; }
.gp-by-application h2 {
    text-transform: uppercase; font-size: 1.1rem; font-weight: 700; font-family: "URWDINStdBold", Arial, Helvetica, sans-serif;
    border-bottom: 2px solid var(--gp-red, #BB0027); padding-bottom: 1rem; margin-bottom: 2rem;
}
.gp-application-grid {
    display: grid; grid-template-columns: repeat(8, 1fr);
    gap: 1.5rem; max-width: 1400px; margin: 0 auto;
}
.gp-app-item { text-decoration: none; color: var(--gp-dark); }
.gp-app-item img { width: 100%; max-width: 160px; height: auto; display: block; border-radius: 4px; margin: 0 auto 0.5rem; }
.gp-app-item span { display: block; font-size: 0.85rem; font-weight: 600; line-height: 1.3; }

@media (max-width: 1100px) {
    .gp-application-grid { grid-template-columns: repeat(4, 1fr); max-width: 720px; }
}
@media (max-width: 782px) {
    .gp-by-application { padding: 2rem 1rem; }
    .gp-application-grid { gap: 1.25rem 0.5rem; max-width: 520px; }
    .gp-app-item img { max-width: 72px; margin-bottom: 0.4rem; }
    .gp-app-item span { font-size: 0.7rem; line-height: 1.25; }
}

/* ===== GrabberPro Header & Footer ===== */
* { box-sizing: border-box; }
body { margin: 0; font-family: "URWDINStdRegular", Arial, Helvetica, sans-serif; }

/* Utility bar */
.gp-utility-bar { background: #212121; color: #fff; font-size: 0.75rem; }
.gp-utility-inner {
    max-width: 1400px; margin: 0 auto; padding: 0.5rem 1.5rem;
    display: flex; justify-content: space-between; flex-wrap: wrap; gap: 0.5rem;
}
.gp-utility-bar a {
    color: #fff; text-decoration: none; margin-right: 1.2rem;
    /* 400, not 600: URWDINStdRegular ships a single 400 face, so anything else
       is a browser-synthesised weight and renders soft. */
    font-weight: 400; letter-spacing: 0.02em;
}
.gp-utility-bar a:last-child { margin-right: 0; }
.gp-utility-bar a:hover { text-decoration: underline; }
.gp-utility-right a { margin-right: 0; margin-left: 1.2rem; }

/* Main red header */
.gp-main-header { background: var(--gp-red, #BB0027); }
.gp-header-inner {
    max-width: 1400px; margin: 0 auto; padding: 0.8rem 1.5rem;
    display: flex; align-items: center; gap: 2rem;
}
/* Height alone made the logo a fixed block that would not give way when the
   window narrowed, so the header chrome overflowed while the window was being
   dragged. Cap the width too and let the height follow. */
.gp-logo img { height: 42px; width: auto; max-width: 100%; display: block; }
.gp-logo { flex: 0 1 auto; min-width: 0; }
@media (max-width: 700px) {
    .gp-logo img { height: 34px; }
}

.gp-menu-toggle {
    display: none; background: none; border: none; color: #fff;
    font-size: 1.6rem; cursor: pointer; margin-left: auto;
}

.gp-main-nav { display: flex; gap: 2.5rem; flex: 1; justify-content: flex-start; }
.gp-main-nav a {
    color: #fff; text-decoration: none; font-weight: 700; font-family: "URWDINStdBold", Arial, Helvetica, sans-serif;
    font-size: 1rem; letter-spacing: 0.08em;
}
.gp-main-nav a:hover { text-decoration: underline; }

.gp-search-form { display: flex; align-items: center; }
.gp-search-form input {
    background: transparent; border: none; border-bottom: 1px solid #fff;
    color: #fff; padding: 0.3rem 0; font-size: 0.85rem; width: 200px;
}
.gp-search-form input::placeholder { color: rgba(255,255,255,0.8); }
.gp-search-form button {
    background: none; border: none; color: #fff; font-size: 1rem;
    cursor: pointer; margin-left: 0.5rem;
}

/* Footer */
.gp-footer { background: #212121; color: #ccc; padding: 2rem 1.5rem; margin-top: 2rem; }
.gp-footer-inner { max-width: 1400px; margin: 0 auto; text-align: center; font-size: 0.8rem; }

/* Mobile */
@media (max-width: 900px) {
    .gp-menu-toggle { display: block; }
    .gp-main-nav {
        display: none; flex-direction: column; width: 100%;
        background: var(--gp-red, #BB0027); position: absolute;
        left: 0; top: 100%; padding: 1rem 1.5rem; gap: 1rem; z-index: 100;
    }
    .gp-main-nav.gp-nav-open { display: flex; }
    .gp-header-inner { flex-wrap: wrap; position: relative; }
    .gp-search-form { width: 100%; order: 3; margin-top: 0.5rem; }
    .gp-search-form input { flex: 1; }
    .gp-utility-inner { flex-direction: column; }
    .gp-hero-caption { left: 4%; }
}

/* Force full width, override any Astra container constraints */
.gp-home, .gp-hero, .gp-utility-bar, .gp-main-header, .gp-footer {
    max-width: none !important;
    width: 100% !important;
}
.site-content, .ast-container, #content, #primary {
    max-width: none !important;
    padding: 0 !important;
    margin: 0 !important;
}

/* Force white background on content sections (fixes Astra's default blue-grey tint) */
html, body, .ast-container, .site, .site-content, #content, #primary,
.gp-catalog-promo {
    background-color: #fff !important;
    background-image: none !important;
}

/* =====================================================================
   Keyboard focus - follow-up to the 15 Oct accessibility fixes
   ===================================================================== */

/* Every focusable thing in the page body gets a visible ring when reached
   by keyboard. (The old ".gp-home a:focus { outline: none }" rule removed
   it from the whole homepage.) Red reads on the white content areas. */
.gp-main-content a:focus-visible,
.gp-main-content button:focus-visible,
.gp-main-content input:focus-visible,
.gp-main-content select:focus-visible,
.gp-main-content textarea:focus-visible,
.gp-main-content summary:focus-visible,
.gp-main-content [tabindex]:not([tabindex="-1"]):focus-visible {
    outline: 3px solid var(--gp-red, #BB0027);
    outline-offset: 2px;
    border-radius: 2px;
}

/* The drop-down panels are white, so the white header ring vanished there. */
.gp-main-nav .gp-mega-menu a:focus-visible,
.gp-main-nav .gp-mega-flyout a:focus-visible {
    outline-color: var(--gp-red, #BB0027);
    outline-offset: -3px;          /* inside the link, so the panel edge cannot clip it */
}

/* The footer is near-black (#0a0a0a): a red ring there is ~2.5:1, under
   the 3:1 minimum, and vanishes into the red "Subscribe" button entirely.
   White reads on both. (.site-footer prefix: footer.css loads after
   style.css and sets its own red ring.) */
.site-footer a:focus-visible,
.site-footer button:focus-visible {
    outline: 3px solid #fff;
    outline-offset: 2px;
}

/* Escape closes a drop-down even though focus is still on its trigger
   (see keyboard.js). Cleared again as soon as focus or the mouse leaves. */
.gp-nav-item.gp-has-mega.gp-mega-dismissed .gp-mega-menu,
.gp-mega-item.gp-has-flyout.gp-mega-dismissed .gp-mega-flyout {
    display: none !important;
}


/* ===== Generic content pages, catalog, category archive, single product ===== */
.gp-page-content {
    max-width: 1200px; margin: 0 auto; padding: 2.5rem 1.5rem;
}
.gp-page-content h1 {
    font-size: 1.8rem; margin-bottom: 1.5rem; color: var(--gp-dark, #212121);
}
.gp-page-body { line-height: 1.7; color: #333; }
/* Excludes every component that paints its own text, not just the buttons.
   Missing .gp-banner here is what turned the Solutions tiles red: at 0-4-1 -
   each :not() argument counts as a class - this beat .gp-banner { color:#fff }
   at 0-1-0, and the heading/sub/button spans inherited it. */
.gp-page-body a:not(.gp-btn):not(.gp-btn-primary):not(.gp-btn-outline):not(.gp-banner):not(.gp-catalog-card):not(.gp-gallery-item):not(.gp-product-card):not(.gp-subcategory-link) { color: var(--gp-red); }
/* No underline on hover. The links are already underlined at rest further down,
   which is what satisfies WCAG 1.4.1 - colour must not be the only signal that
   something is a link - so removing the hover underline costs nothing. */
.gp-page-body ul, .gp-page-body ol { padding-left: 1.4rem; }

/* Catalog landing */
.gp-catalog-category-grid {
    display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
    gap: 1.5rem; margin-top: 2rem;
}
.gp-catalog-category-card {
    display: block; text-decoration: none; color: var(--gp-dark, #212121);
    background: #f7f7f7; border: 1px solid var(--gp-border, #E6E7E8); border-radius: 4px;
    padding: 1.5rem; text-align: center; transition: border-color 0.2s;
}
.gp-catalog-category-card:hover h3 { color: var(--gp-red); }
.gp-catalog-category-card h3 { margin: 0 0 0.5rem; font-size: 1.1rem; }
.gp-catalog-category-card p { margin: 0; color: #666; font-size: 0.85rem; }

/* Category archive */
.gp-category-archive h1 { text-transform: uppercase; }
.gp-category-description { color: #666; margin-bottom: 1.5rem; }
.gp-subcategory-row {
    display: flex; flex-wrap: wrap; gap: 0.8rem; margin-bottom: 1.5rem;
}
.gp-subcategory-link {
    display: inline-block; padding: 0.5rem 1rem; background: #f0f0f0;
    border-radius: 20px; text-decoration: none; color: var(--gp-dark, #212121);
    font-size: 0.85rem; font-weight: 600;
}
.gp-subcategory-link:hover { background: var(--gp-red, #BB0027); color: #fff; }
.gp-result-count { color: #666; font-size: 0.9rem; margin-bottom: 1.5rem; }

.gp-product-grid {
    display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
    gap: 1.5rem;
}
.gp-product-card {
    display: block; text-decoration: none; color: var(--gp-dark, #212121);
    border: 1px solid var(--gp-border, #E6E7E8); border-radius: 4px; padding: 1rem;
    transition: box-shadow 0.2s;
}
.gp-product-card:hover { box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
.gp-product-card img { width: 100%; height: 160px; object-fit: contain; margin-bottom: 0.8rem; }
.gp-product-noimage {
    width: 100%; height: 160px; background: #f5f5f5; display: flex;
    align-items: center; justify-content: center; color: #999;
    font-size: 0.8rem; margin-bottom: 0.8rem; border-radius: 4px;
}
.gp-product-card h3 { font-size: 0.95rem; margin: 0 0 0.5rem; line-height: 1.3; }
.gp-product-sku, .gp-product-spec { font-size: 0.8rem; color: #666; margin: 0.2rem 0; }
.gp-pagination { margin-top: 2rem; text-align: center; }
.gp-pagination a, .gp-pagination span { padding: 0.5rem 0.9rem; margin: 0 0.2rem; border: 1px solid var(--gp-border, #E6E7E8); text-decoration: none; color: var(--gp-dark, #212121); }
.gp-pagination .current { background: var(--gp-red, #BB0027); color: #fff; border-color: #fff; background: var(--gp-red, #BB0027); }

/* Single product */
.gp-product-header { display: flex; flex-wrap: wrap; gap: 2.5rem; margin-bottom: 2rem; }
.gp-product-image { flex: 0 0 320px; }
.gp-product-image img { width: 100%; height: auto; }
.gp-product-noimage-large {
    width: 100%; height: 260px; background: #f5f5f5; display: flex;
    align-items: center; justify-content: center; color: #999; border-radius: 4px;
}
.gp-product-info { flex: 1 1 400px; }
.gp-product-brand { text-transform: uppercase; font-size: 0.8rem; color: #999; font-weight: 700; font-family: "URWDINStdBold", Arial, Helvetica, sans-serif; margin: 0; }
.gp-product-info h1 { margin: 0.3rem 0; font-size: 1.5rem; }
.gp-product-description { margin-top: 1rem; line-height: 1.6; color: #444; }

.gp-specs-box, .gp-content-section, .gp-documents-section {
    margin-bottom: 2rem; padding-top: 1.5rem; border-top: 1px solid #eee;
}
.gp-specs-box h2, .gp-content-section h2, .gp-documents-section h2 {
    font-size: 1.1rem; text-transform: uppercase; margin-bottom: 1rem;
}
.gp-specs-table { width: 100%; border-collapse: collapse; }
.gp-specs-table tr:nth-child(even) { background: #f9f9f9; }
.gp-specs-table td,
.gp-specs-table th { padding: 0.5rem 0.8rem; font-size: 0.9rem; }
.gp-spec-label { text-align: left; font-weight: 700; font-family: "URWDINStdBold", Arial, Helvetica, sans-serif; width: 200px; color: #555; }
.gp-documents-section ul { padding-left: 1.2rem; }
/* ==========================================================================
   Reusable static-content page styling — centered sections, divider lines,
   red section labels, and a responsive values/feature grid.
   Used first on Mission/Vision/Values; reusable anywhere a similar
   centered-with-dividers layout is needed later.
   ========================================================================== */

.gp-mvv-wrap {
	max-width: 700px;
	margin: 0 auto;
	text-align: center;
	padding: 1rem 1.5rem 3rem;
}

.gp-mvv-section {
	padding: 2rem 0;
	border-bottom: 1px solid var(--gp-red, #BB0027);
}

.gp-mvv-section:last-of-type {
	border-bottom: none;
}

.gp-mvv-label {
	display: block;
	color: #fff; background: var(--gp-red, #BB0027);
	font-weight: 700; font-family: "URWDINStdBold", Arial, Helvetica, sans-serif;
	font-size: 0.8rem;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	margin-bottom: 0.75rem;
}

.gp-mvv-section p {
	margin: 0;
	font-size: 1rem;
	line-height: 1.5;
}

.gp-values-grid {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
	gap: 2.5rem 2rem;
	margin-top: 1.5rem;
	text-align: center;
}

.gp-value-card h5 {
	font-size: 0.85rem;
	font-weight: 700; font-family: "URWDINStdBold", Arial, Helvetica, sans-serif;
	letter-spacing: 0.04em;
	text-transform: uppercase;
	margin: 0 0 0.75rem;
}

.gp-value-card p {
	font-size: 0.9rem;
	line-height: 1.5;
	margin: 0 0 0.5rem;
}

.gp-value-card p em {
	font-style: italic;
}

@media (max-width: 600px) {
	.gp-mvv-wrap { padding: 1rem 1rem 2rem; }
}

.gp-subscribe-form-placeholder input,
.gp-subscribe-form-placeholder select {
    width: 100%; max-width: 400px; padding: 0.6rem 0.8rem;
    border: 1px solid #999; border-radius: 3px;
    background: #fff; color: #333; font-size: 1rem;
    box-sizing: border-box; margin-top: 0.3rem;
    -webkit-appearance: none; opacity: 1;
}
.gp-subscribe-form-placeholder label { display: block; margin-bottom: 1.2rem; font-weight: 700; }

.gp-region-tile-grid {
    display: flex; flex-wrap: wrap; gap: 1.5rem;
    margin: 2rem 0; padding-bottom: 2rem;
    border-bottom: 1px solid var(--gp-border, #E6E7E8);
}
.gp-region-tile { flex: 1 1 200px; max-width: 260px; text-align: center; }
.gp-region-tile img {
    width: 100%; display: block; margin-bottom: 0.8rem;
    border-radius: 2px;
}
.gp-region-btn {
    display: inline-block; padding: 0.6rem 1.2rem;
    border: 2px solid var(--gp-dark, #212121); color: var(--gp-dark, #212121);
    text-decoration: none; font-weight: 700; text-transform: uppercase;
    font-size: 0.85rem; letter-spacing: 0.02em; transition: background 0.2s, color 0.2s;
}
.gp-region-btn:hover { background: var(--gp-dark, #212121); color: #fff; }
.gp-region-tile-grid-secondary {
    justify-content: flex-start; align-items: center; border-bottom: none;
    gap: 1.5rem 2rem;
}
@media (max-width: 700px) {
    .gp-region-tile-grid, .gp-region-tile-grid-secondary { flex-direction: column; }
    .gp-region-tile { max-width: 100%; }
}

.gp-region-map-img {
    max-width: 260px; width: 100%; height: auto;
    display: block; margin: 1.5rem 0; border: 1px solid var(--gp-border, #E6E7E8);
}
.gp-region-section-bar {
    background: var(--gp-dark, #212121); color: #fff;
    padding: 0.7rem 1.2rem; margin: 2rem 0 1rem;
    font-size: 1rem; text-transform: none;
}

.gp-lit-intro { display: flex; gap: 2rem; align-items: flex-start; flex-wrap: wrap; }
.gp-lit-intro-text { flex: 2 1 400px; }
.gp-lit-intro-image { flex: 1 1 200px; max-width: 220px; }
.gp-lit-intro-image img { width: 100%; display: block; }
.gp-lit-cta-row {
    display: flex; gap: 1rem; flex-wrap: wrap; align-items: center;
    margin: 1.5rem 0 2rem;
}
.gp-lit-resource-grid {
    display: flex; gap: 2rem; flex-wrap: wrap;
    padding-top: 1.5rem; border-top: 1px solid var(--gp-red, #BB0027);
}
.gp-lit-resource-grid ul { flex: 1 1 200px; list-style: none; margin: 0; padding: 0; }
.gp-lit-resource-grid li { margin-bottom: 0.6rem; }
@media (max-width: 700px) {
    .gp-lit-intro, .gp-lit-resource-grid { flex-direction: column; }
    .gp-lit-intro-image { max-width: 160px; }
}

.gp-region-card { background: #f7f7f7; margin-bottom: 2rem; }
.gp-region-section-bar {
    background: var(--gp-dark, #212121); color: #fff;
    padding: 0.7rem 1.2rem; margin: 0 0 0; font-size: 1rem; text-transform: none;
}
.gp-region-card-body { padding: 1.5rem; border-bottom: 1px solid var(--gp-border, #E6E7E8); }
.gp-region-card-body:last-child { border-bottom: none; }
.gp-region-card-body .gp-person-name { font-weight: 700; display: block; margin-bottom: 0.2rem; }
.gp-region-card-body .gp-person-title { color: var(--gp-grey, #666666); display: block; margin-bottom: 0.8rem; }
.gp-region-sales-list { margin-top: 0.5rem; }
.gp-region-sales-list strong { display: block; margin-bottom: 0.5rem; }
.gp-two-col-list {
    display: grid; grid-template-columns: repeat(2, 1fr); gap: 0.3rem 2rem;
    list-style: none; padding: 0; margin: 0;
}
.gp-two-col-list li { color: var(--gp-dark, #212121); font-weight: 400; }
.gp-branch-grid {
    display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
    gap: 1.5rem; padding: 1.5rem;
}
.gp-branch-item { font-size: 0.9rem; }
.gp-branch-item .gp-branch-name { font-weight: 700; text-decoration: underline; display: block; margin-bottom: 0.4rem; }
.gp-branch-item .gp-branch-manager { display: block; margin: 0.6rem 0; }
.gp-btn-sm { padding: 0.5rem 1.2rem; font-size: 0.75rem; }
@media (max-width: 700px) {
    .gp-two-col-list { grid-template-columns: 1fr; }
    .gp-branch-grid { grid-template-columns: 1fr; }
}

.gp-utility-icon {
    color: #fff; background: var(--gp-red, #BB0027);
    width: 20px; height: 20px; padding: 3px; box-sizing: border-box;
    border-radius: 50%;
    margin-right: 0.4rem; vertical-align: -6px; display: inline-block;
}
.gp-utility-bar a { display: inline-flex; align-items: center; }

.gp-utility-left, .gp-utility-right { display: flex; align-items: center; }

/* FacetWP catalog layout */
.gp-catalog-layout {
    display: flex; gap: 2rem; align-items: flex-start; margin-top: 1.5rem;
}
.gp-facet-sidebar {
    width: 260px; flex-shrink: 0; background: #f7f7f7; padding: 1.5rem;
    border-radius: 4px;
}
.gp-facet-heading {
    font-family: "URWDINStdBold", Arial, Helvetica, sans-serif; text-transform: uppercase; font-size: 1rem;
    margin-bottom: 1rem; color: var(--gp-dark);
}
.gp-facet-group {
    margin-bottom: 1.2rem; border-bottom: 1px solid var(--gp-border, #E6E7E8); padding-bottom: 1rem;
}
.gp-facet-group h4 {
    font-size: 0.85rem; text-transform: uppercase; letter-spacing: 0.03em;
    margin-bottom: 0.6rem; color: var(--gp-dark);
}
.gp-facet-group .facetwp-checkbox {
    display: block; margin-bottom: 0.4rem; font-size: 0.9rem; cursor: pointer;
}
.gp-catalog-results { flex: 1; min-width: 0; }
.gp-result-count { font-weight: 700; margin-bottom: 1rem; }
@media (max-width: 900px) {
    .gp-catalog-layout { flex-direction: column; }
    .gp-facet-sidebar { width: 100%; }
}

/* Products mega-menu (nested flyout) */
.gp-nav-item.gp-has-mega {
    position: relative;
    display: inline-block;
}
.gp-mega-menu {
    display: none;
    position: absolute;
    top: 100%;
    left: 0;
    background: #fff;
    border-top: 3px solid var(--gp-red);
    box-shadow: 0 8px 24px rgba(0,0,0,0.15);
    padding: 0.5rem 0;
    min-width: 260px;
    z-index: 100;
}
.gp-nav-item.gp-has-mega:hover .gp-mega-menu,
.gp-nav-item.gp-has-mega.is-open .gp-mega-menu {
    display: block;
}
/* .is-open is held for a moment after the cursor leaves - see catalog-filters.js.
   Marketing asked for this: the Products panel is long, and on a pure :hover the
   menu vanishes the instant the pointer clips a corner on the way down to it. */
.gp-mega-item {
    position: relative;
}
.gp-main-nav .gp-mega-item > a {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 0.6rem 1.2rem;
    font-size: 0.85rem;
    color: var(--gp-dark);
    text-decoration: none;
}
.gp-mega-item > a:hover {
    background: #f5f5f5;
    color: var(--gp-red);
}
.gp-flyout-arrow {
    color: #999;
    font-size: 1rem;
}
.gp-mega-flyout {
    display: none;
    position: absolute;
    top: 0;
    left: 100%;
    background: #fff;
    border-top: 3px solid var(--gp-red);
    box-shadow: 0 8px 24px rgba(0,0,0,0.15);
    padding: 0.5rem 0;
    min-width: 260px;
}
.gp-mega-item.gp-has-flyout:hover .gp-mega-flyout {
    display: block;
}
.gp-main-nav .gp-flyout-viewall {
    display: block;
    padding: 0.6rem 1.2rem;
    font-size: 0.85rem;
    font-family: "URWDINStdBold", Arial, Helvetica, sans-serif;
    color: var(--gp-red);
    text-decoration: none;
    border-bottom: 1px solid #eee;
    margin-bottom: 0.3rem;
}
.gp-mega-sublist {
    list-style: none;
    margin: 0;
    padding: 0;
}
.gp-main-nav .gp-mega-sublist li a {
    display: block;
    padding: 0.5rem 1.2rem;
    font-size: 0.8rem;
    color: #555;
    text-decoration: none;
}
.gp-mega-sublist li a:hover {
    background: #f5f5f5;
    color: var(--gp-red);
}
@media (max-width: 900px) {
    .gp-mega-menu {
        position: static;
        border-top: none;
        box-shadow: none;
    }
    .gp-mega-flyout {
        position: static;
        border-top: none;
        box-shadow: none;
        padding-left: 1rem;
    }
}

/* Facet toolbar additions: reset, sort, selected filters */
.gp-facet-header-row {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 1rem;
}
.facetwp-reset {
    display: inline-block;
    background: var(--gp-red);
    color: #fff !important;
    font-size: 0.8rem;
    font-weight: 700;
    text-transform: uppercase;
    padding: 0.5rem 1rem;
    border-radius: 3px;
    cursor: pointer;
    text-decoration: none !important;
    border: none;
}
.facetwp-reset:hover {
    background: var(--gp-red-dark, var(--gp-red-dark, #95001F));
}
.gp-results-toolbar {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 1rem;
}
.gp-sort-wrap select {
    padding: 0.4rem 0.6rem;
    border: 1px solid #ccc;
    border-radius: 3px;
    font-size: 0.85rem;
}
.facetwp-selected-filters {
    margin-bottom: 1rem;
}
.facetwp-selected-filter {
    display: inline-flex;
    align-items: center;
    background: #f0f0f0;
    border-radius: 3px;
    padding: 0.3rem 0.6rem;
    margin: 0 0.4rem 0.4rem 0;
    font-size: 0.8rem;
}
.facetwp-selected-filter-remove {
    margin-left: 0.4rem;
    cursor: pointer;
    color: var(--gp-red);
    font-weight: bold;
}

/* Header search autocomplete dropdown */
.gp-search-form {
    position: relative;
}
.gp-search-dropdown {
    display: none;
    position: absolute;
    top: 100%;
    right: 0;
    width: 420px;
    background: #fff;
    border: 1px solid var(--gp-border, #E6E7E8);
    box-shadow: 0 8px 20px rgba(0,0,0,0.15);
    max-height: 80vh;
    overflow-y: auto;
    z-index: 200;
}
.gp-search-result-text {
    min-width: 0;
    display: block;
}
.gp-search-result {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    padding: 0.6rem 1rem;
    text-decoration: none;
    color: var(--gp-dark);
    border-bottom: 1px solid #f0f0f0;
}
.gp-search-result:hover {
    background: #f5f5f5;
}
.gp-search-result img {
    width: 40px;
    height: 40px;
    object-fit: contain;
    flex-shrink: 0;
}
.gp-search-result strong {
    font-size: 0.85rem;
}
.gp-search-result-sku {
    color: #777;
    font-size: 0.75rem;
}

/* Search dropdown section headings + category/page results */
.gp-search-dropdown-heading {
    padding: 0.7rem 1rem 0.2rem;
    font-size: 0.8rem;
    font-family: "URWDINStdBold", Arial, Helvetica, sans-serif;
    text-transform: uppercase;
    color: var(--gp-dark);
    border-top: 2px solid #eee;
}
.gp-search-dropdown-heading:first-child {
    border-top: none;
}
.gp-search-dropdown-count {
    padding: 0 1rem 0.5rem;
    font-size: 0.75rem;
    color: #888;
}
.gp-search-category-result {
    display: block;
    padding: 0.5rem 1rem;
    font-size: 0.85rem;
    color: var(--gp-dark);
    text-decoration: none;
    border-bottom: 1px solid #f5f5f5;
}
.gp-search-category-result:hover {
    background: #f5f5f5;
}

/* Partners page grid + individual partner page logos */
.gp-partner-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
    gap: 1.5rem;
    margin: 2rem 0;
}
.gp-partner-card {
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
    padding: 1.5rem 1rem;
    border: 1px solid #eee;
    border-radius: 4px;
    text-decoration: none;
    color: var(--gp-dark);
    transition: box-shadow 0.2s;
}
.gp-partner-card:hover {
    box-shadow: 0 4px 12px rgba(0,0,0,0.1);
}
.gp-partner-card img {
    max-width: 160px;
    max-height: 110px;
    object-fit: contain;
}
.gp-partner-logo {
    display: block;
    max-width: 200px;
    max-height: 150px;
    object-fit: contain;
    margin-bottom: 1.5rem;
}
@media (max-width: 700px) {
    .gp-partner-grid {
        grid-template-columns: repeat(2, 1fr);
    }
}

/* Partners page: top logo row + caption divider */
.gp-partner-top-row {
    display: flex;
    justify-content: center;
    align-items: center;
    gap: 2.5rem;
    margin: 2rem 0;
}
.gp-partner-top-row img {
    max-width: 90px;
    max-height: 70px;
    object-fit: contain;
}
.gp-partner-caption {
    text-align: center;
    border-top: 1px solid var(--gp-border, #E6E7E8);
    border-bottom: 1px solid var(--gp-border, #E6E7E8);
    padding: 1.2rem 0;
    margin-bottom: 2rem;
}
.gp-partner-caption p {
    margin: 0.3rem 0;
    font-size: 0.9rem;
}
@media (max-width: 600px) {
    .gp-partner-top-row {
        flex-wrap: wrap;
        gap: 1.5rem;
    }
}

/* Catalogs page list */
.gp-catalog-list {
    display: grid;
    gap: 1.5rem;
    margin: 2rem 0;
}
.gp-catalog-item {
    padding: 1.2rem 1.5rem;
    border: 1px solid #eee;
    border-radius: 4px;
}
.gp-catalog-item h3 {
    margin: 0 0 0.5rem;
    font-size: 1.05rem;
}
.gp-catalog-item h3 a {
    color: var(--gp-red);
    text-decoration: none;
}
.gp-catalog-item h3 a:hover {
    text-decoration: underline;
}
.gp-catalog-item p {
    margin: 0.3rem 0;
    color: #555;
    font-size: 0.9rem;
}
.gp-catalog-note {
    font-style: italic;
    color: #999 !important;
    font-size: 0.8rem !important;
}

.gp-region-btn { border-radius: 0.25rem; }

.gp-region-btn:hover { background: var(--gp-red, #BB0027); color: #fff; border-color: var(--gp-red, #BB0027); }

.gp-region-btn { color: #212121; background: transparent; }
.gp-region-btn:hover { color: var(--gp-red, #BB0027); background: transparent; border-color: var(--gp-red, #BB0027); }

.gp-region-tile-grid-secondary { justify-content: flex-start; align-items: flex-start; }

.gp-region-tile-grid .gp-region-btn:hover,
.gp-region-tile-grid a.gp-region-btn:hover { border-color: #212121 !important; }

.gp-region-tile-grid .gp-region-btn,
.gp-region-tile-grid a.gp-region-btn { color: #212121 !important; text-decoration: none !important; background: transparent !important; }
.gp-region-tile-grid .gp-region-btn:hover,
.gp-region-tile-grid a.gp-region-btn:hover { color: var(--gp-red, #BB0027) !important; text-decoration: none !important; background: transparent !important; }

/* Astra renders the scroll-to-top button as id="ast-scroll-top" with class
   "ast-scroll-top-icon" - there is no .ast-scroll-top class, so the previous
   selector never matched and the button kept Astra's default blue from the
   theme's inline #ast-scroll-top{background-color:var(--ast-global-color-0)}. */
#ast-scroll-top,
.ast-scroll-top-icon {
    background-color: var(--gp-red, #BB0027) !important;
    color: #fff !important;
}
#ast-scroll-top:hover,
#ast-scroll-top:focus,
.ast-scroll-top-icon:hover {
    background-color: var(--gp-dark, #212121) !important;
    color: #fff !important;
}
#ast-scroll-top svg,
#ast-scroll-top .ast-icon svg { fill: currentColor; }
#ast-scroll-top:focus-visible {
    outline: 3px solid var(--gp-dark, #212121);
    outline-offset: 2px;
}

/* ===================================================================
   PanelMax / machine product pages
   Mirrors the Optimizely layout: full-bleed hero with family nav
   overlay, two-column content rows, accordions, spec table.
   =================================================================== */

/* --- Hero + family nav ------------------------------------------- */
.gp-pm-hero {
    position: relative;
    width: 100%;
    min-height: 300px;
    background-size: cover;
    background-position: center;
    background-repeat: no-repeat;
    background-color: var(--gp-dark, #212121);
    display: flex;
    align-items: flex-start;
}
.gp-pm-nav {
    display: flex;
    flex-direction: column;
    gap: 6px;
    padding: 1.5rem 0 1.5rem 1.5rem;
    width: 210px;
    flex-shrink: 0;
}
.gp-pm-nav-item {
    display: block;
    padding: 0.55rem 0.9rem;
    background: rgba(90, 90, 90, 0.92);
    color: #fff;
    text-decoration: none;
    font-size: 0.78rem;
    font-weight: 700;
    letter-spacing: 0.03em;
    text-align: center;
    text-transform: none;
    transition: background-color 0.15s ease;
}
.gp-pm-nav-item:hover {
    background: rgba(60, 60, 60, 0.95);
    color: #fff;
}
.gp-pm-nav-current,
.gp-pm-nav-current:hover {
    background: var(--gp-red, #BB0027);
    color: #fff;
}

/* --- Page body ---------------------------------------------------- */
.gp-pm-page {
    max-width: 1100px;
}
.gp-pm-body {
    line-height: 1.7;
    color: #333;
}

/* Row = one CMS row; columns are the Content0 / Content1 zones. */
.gp-pm-row {
    display: flex;
    flex-wrap: wrap;
    gap: 2.5rem;
    align-items: flex-start;
    margin-bottom: 2.5rem;
}
.gp-pm-col {
    flex: 1 1 320px;
    min-width: 0;
}
.gp-pm-row-1 .gp-pm-col {
    flex-basis: 100%;
}

/* Nested button row shouldn't inherit the big outer gap. */
.gp-pm-col .gp-pm-row {
    gap: 1rem;
    margin-bottom: 0;
}
.gp-pm-col .gp-pm-row .gp-pm-col {
    flex: 0 0 auto;
}

/* --- Headings ------------------------------------------------------ */
.gp-pm-title {
    font-size: 1.9rem;
    font-weight: 700;
    color: var(--gp-dark, #212121);
    margin: 0 0 0.4rem;
    padding-bottom: 0.6rem;
    border-bottom: 1px solid var(--gp-border, #E6E7E8);   /* the <hr> under the title on the live site */
}
.gp-pm-body h4 {
    font-size: 1.05rem;
    font-weight: 700;
    color: var(--gp-dark, #212121);
    margin: 0 0 0.5rem;
    padding-bottom: 0.5rem;
    border-bottom: 1px solid var(--gp-border, #E6E7E8);
}
.gp-pm-body ul {
    padding-left: 1.3rem;
    margin: 0 0 1rem;
}
.gp-pm-body li {
    margin-bottom: 0.3rem;
}
.gp-pm-body p {
    margin: 0 0 1rem;
}

/* --- Product image -------------------------------------------------- */
.gp-pm-image {
    text-align: center;
    margin-bottom: 1.5rem;
}
.gp-pm-image img {
    max-width: 100%;
    height: auto;
}

/* --- Buttons -------------------------------------------------------- */
/* Specificity note: .gp-page-body a / .gp-pm-body a would otherwise win on
   colour, so these are scoped to at least the same weight. */
.gp-pm-body a.gp-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 0.7rem 1.4rem;
    font-size: 0.8rem;
    font-weight: 700;
    text-transform: uppercase;
    text-decoration: none;
    letter-spacing: 0.03em;
    border-radius: 2px;
    transition: background-color 0.15s ease, color 0.15s ease;
}
.gp-pm-body a.gp-btn-primary {
    background: var(--gp-red, #BB0027);
    color: #fff;
    border: 2px solid var(--gp-red, #BB0027);
}
.gp-pm-body a.gp-btn-primary:hover {
    background: var(--gp-red-dark, #95001F);
    border-color: var(--gp-red-dark, #95001F);
    color: #fff;
}
.gp-pm-body a.gp-btn-outline {
    background: var(--gp-dark, #212121);
    color: #fff;
    border: 2px solid var(--gp-dark, #212121);
}
.gp-pm-body a.gp-btn-outline:hover {
    background: #000;
    border-color: #000;
    color: #fff;
}

/* --- Technical specifications table ---------------------------------- */
.gp-pm-body table {
    width: 100%;
    border-collapse: collapse;
    margin: 0 0 1rem;
    font-size: 0.9rem;
}
.gp-pm-body table th {
    text-align: left;
    font-weight: 700;
    padding: 0.35rem 0;
    color: var(--gp-dark, #212121);
    width: 70%;
}
.gp-pm-body table td {
    text-align: right;
    padding: 0.35rem 0;
    color: #333;
    width: 30%;
}

/* --- Accordion (Advantages) ------------------------------------------ */
.gp-accordion {
    border-top: 1px solid var(--gp-border, #E6E7E8);
    margin-bottom: 1rem;
}
.gp-accordion-item {
    border-bottom: 1px solid var(--gp-border, #E6E7E8);
}
.gp-accordion-title {
    cursor: pointer;
    list-style: none;
    padding: 0.85rem 2rem 0.85rem 0.75rem;
    background: #f5f5f5;
    font-size: 0.82rem;
    font-weight: 700;
    letter-spacing: 0.03em;
    color: var(--gp-dark, #212121);
    position: relative;
    transition: background-color 0.15s ease;
}
.gp-accordion-title:hover {
    background: #ececec;
}
/* Hide the native disclosure marker in both engines. */
.gp-accordion-title::-webkit-details-marker { display: none; }
.gp-accordion-title::marker { content: ''; }
/* Chevron */
.gp-accordion-title::after {
    content: '';
    position: absolute;
    right: 1rem;
    top: 50%;
    width: 8px;
    height: 8px;
    border-right: 2px solid var(--gp-dark, #212121);
    border-bottom: 2px solid var(--gp-dark, #212121);
    transform: translateY(-70%) rotate(45deg);
    transition: transform 0.2s ease;
}
.gp-accordion-item[open] > .gp-accordion-title::after {
    transform: translateY(-30%) rotate(-135deg);
}
.gp-accordion-body {
    padding: 1rem 0.75rem;
    font-size: 0.92rem;
}
.gp-accordion-body p:last-child,
.gp-accordion-body ul:last-child {
    margin-bottom: 0;
}

/* --- Responsive ------------------------------------------------------- */
@media (max-width: 900px) {
    .gp-pm-hero {
        min-height: 200px;
    }
    .gp-pm-nav {
        width: 170px;
        padding: 1rem 0 1rem 1rem;
    }
    .gp-pm-nav-item {
        font-size: 0.7rem;
        padding: 0.45rem 0.6rem;
    }
}
@media (max-width: 700px) {
    /* Nav drops below the hero image and goes horizontal, so the hero art
       is not obscured on a phone. */
    .gp-pm-hero {
        min-height: 160px;
        align-items: stretch;
    }
    .gp-pm-nav {
        flex-direction: row;
        flex-wrap: wrap;
        width: 100%;
        padding: 0.75rem;
        gap: 4px;
        align-self: flex-end;
        background: rgba(0, 0, 0, 0.35);
    }
    .gp-pm-nav-item {
        flex: 1 1 auto;
        font-size: 0.65rem;
        padding: 0.4rem 0.5rem;
    }
    .gp-pm-row {
        gap: 1.5rem;
        margin-bottom: 1.75rem;
    }
    .gp-pm-col {
        flex-basis: 100%;
    }
    .gp-pm-title {
        font-size: 1.45rem;
    }
    .gp-pm-body a.gp-btn {
        width: 100%;
    }
    .gp-pm-col .gp-pm-row .gp-pm-col {
        flex: 1 1 100%;
    }
}

/* ===== Homepage: What's New ===== */
.gp-whats-new {
    max-width: 1200px;
    margin: 0 auto;
    padding: 2.5rem 1.5rem 3rem;
}
.gp-whats-new h2 {
    text-align: center;
    text-transform: uppercase;
    font-size: 1rem;
    letter-spacing: 0.08em;
    font-weight: 700;
    color: var(--gp-dark, #212121);
    border-top: 2px solid var(--gp-red, #BB0027);
    border-bottom: 2px solid var(--gp-red, #BB0027);
    padding: 0.75rem 0;
    margin: 0 0 2.5rem;
}
.gp-whats-new-grid {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 3rem;
    align-items: start;
}
.gp-whats-new-item {
    text-align: center;
}
.gp-whats-new-item h3 {
    font-size: 1.15rem;
    font-weight: 700;
    line-height: 1.2;
    margin: 0 0 0.75rem;
    color: var(--gp-dark, #212121);
}
.gp-whats-new-item p {
    font-size: 0.95rem;
    line-height: 1.6;
    color: #333;
    margin: 0 0 1.25rem;
}
.gp-whats-new-media {
    position: relative;
    display: block;
    text-decoration: none;
}
.gp-whats-new-media img {
    width: 100%;
    height: auto;
    display: block;
}
/* The live site overlays a small product label on the Combat Mat image. */
.gp-whats-new-badge {
    position: absolute;
    left: 50%;
    bottom: 1rem;
    transform: translateX(-50%);
    background: rgba(255, 255, 255, 0.92);
    color: var(--gp-dark, #212121);
    font-size: 0.7rem;
    font-weight: 700;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    padding: 0.4rem 0.9rem;
    white-space: nowrap;
}

@media (max-width: 700px) {
    .gp-whats-new {
        padding: 1.75rem 1rem 2rem;
    }
    .gp-whats-new-grid {
        grid-template-columns: 1fr;
        gap: 2.25rem;
    }
}

/* ===== Homepage: Grabber Resources ===== */
.gp-resources {
    max-width: 1200px;
    margin: 0 auto;
    padding: 2.5rem 1.5rem 3.5rem;
}
.gp-resources h2 {
    text-align: center;
    text-transform: uppercase;
    font-size: 1rem;
    letter-spacing: 0.08em;
    font-weight: 700;
    color: var(--gp-dark, #212121);
    border-top: 2px solid var(--gp-red, #BB0027);
    border-bottom: 2px solid var(--gp-red, #BB0027);
    padding: 0.75rem 0;
    margin: 0 0 2.5rem;
}
.gp-resources-grid {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 2rem;
    align-items: start;
}
.gp-resources-col h3 {
    font-size: 0.8rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--gp-dark, #212121);
    margin: 0 0 0.9rem;
    padding-bottom: 0.5rem;
    border-bottom: 1px solid var(--gp-border, #E6E7E8);
}
/* Catalogs spans two columns on the live site; the second column's heading is
   a spacer that keeps the lists aligned without repeating the label visually. */
.gp-resources-col-continued {
    visibility: hidden;
}
.gp-resources-col ul {
    list-style: none;
    margin: 0;
    padding: 0;
}
.gp-resources-col li {
    margin-bottom: 0.7rem;
    line-height: 1.4;
}
.gp-resources-col a {
    color: var(--gp-dark, #212121);
    text-decoration: none;
    font-size: 0.85rem;
}
.gp-resources-col a:hover {
    color: var(--gp-red, #BB0027);
    text-decoration: underline;
}
.gp-resources-new {
    display: block;
    color: var(--gp-red, #BB0027);
    font-size: 0.72rem;
    font-weight: 700;
    font-style: italic;
    margin-top: 0.15rem;
}

@media (max-width: 900px) {
    .gp-resources-grid {
        grid-template-columns: repeat(2, 1fr);
        gap: 1.75rem;
    }
    /* Two-up: the continued Catalogs column sits beside its sibling, so keep
       the hidden heading for alignment. */
}
@media (max-width: 560px) {
    .gp-resources {
        padding: 1.75rem 1rem 2.25rem;
    }
    .gp-resources-grid {
        grid-template-columns: 1fr;
        gap: 1.5rem;
    }
    /* Stacked: a hidden heading would leave a confusing gap, so drop it. */
    .gp-resources-col-continued {
        display: none;
    }
}

/* ===== Submittal data sheets: document accordions ===== */
.gp-sub-accordion .gp-accordion-title {
    font-size: 0.85rem;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.75rem;
    padding-right: 2.5rem;
}
.gp-sub-count {
    display: inline-block;
    background: rgba(0, 0, 0, 0.18);
    color: inherit;
    font-size: 0.7rem;
    font-weight: 700;
    padding: 0.1rem 0.5rem;
    border-radius: 10px;
    flex-shrink: 0;
}
.gp-sub-list {
    list-style: none;
    margin: 0;
    padding: 0;
}
.gp-sub-item {
    padding: 0.6rem 0;
    border-bottom: 1px solid #eee;
}
.gp-sub-item:last-child { border-bottom: 0; }
.gp-sub-item a {
    display: block;
    font-size: 0.88rem;
    font-weight: 600;
    color: var(--gp-dark, #212121);
    text-decoration: none;
}
.gp-sub-item a:hover {
    color: var(--gp-red, #BB0027);
    text-decoration: underline;
}
.gp-sub-skus {
    display: block;
    margin-top: 0.2rem;
    font-size: 0.72rem;
    line-height: 1.45;
    color: #777;
    word-break: break-word;
}

/* ===================================================================
   MOBILE PASS
   Custom .gp-* sections were built desktop-first. These rules make the
   multi-column layouts collapse and stop wide content overflowing.
   =================================================================== */
@media (max-width: 782px) {

    /* --- generic page shell --- */
    .gp-page-content {
        padding: 1.5rem 1rem;
    }
    .gp-page-content h1,
    .gp-page-title {
        font-size: 1.45rem;
        line-height: 1.25;
        word-break: break-word;
    }
    .gp-page-body { font-size: 0.95rem; }

    /* Media must never push the page wider than the viewport. */
    .gp-page-body img,
    .gp-pm-image img,
    .gp-page-content img {
        max-width: 100%;
        height: auto;
    }
    .gp-page-body iframe,
    .gp-page-body embed,
    .gp-page-body object {
        max-width: 100%;
    }

    /* Wide content scrolls inside itself rather than the page. */
    .gp-page-body table,
    .gp-pm-body table {
        display: block;
        width: 100%;
        overflow-x: auto;
        -webkit-overflow-scrolling: touch;
    }

    /* --- extracted CMS rows --- */
    .gp-pm-row { flex-direction: column; gap: 1.25rem; margin-bottom: 1.5rem; }
    .gp-pm-col { flex: 1 1 100%; min-width: 0; }

    /* --- catalogue / product grids --- */
    .gp-product-grid,
    .gp-catalog-category-grid {
        grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
        gap: 1rem;
    }
    .gp-product-card img { height: 120px; }

    /* --- single product --- */
    .gp-product-header { flex-direction: column; gap: 1.25rem; }
    .gp-product-image { flex: 1 1 100%; }
    .gp-specs-table td,
    .gp-specs-table th { font-size: 0.85rem; }

    /* --- homepage --- */
    .gp-category-row { flex-wrap: wrap; gap: 1rem; }
    .gp-cat-item { width: 90px; }
    .gp-catalog-promo-inner { flex-direction: column; }
    .gp-catalog-promo-inner > a { flex: 1 1 100%; }
    .gp-featured-grid { grid-template-columns: 1fr; gap: 1.5rem; }
 

    /* --- accordions: keep the tap target comfortable --- */
    .gp-accordion-title { padding: 0.9rem 2.25rem 0.9rem 0.7rem; font-size: 0.8rem; }
    .gp-sub-accordion .gp-accordion-title { flex-wrap: wrap; gap: 0.4rem; }
    .gp-sub-item a { font-size: 0.85rem; }

    /* --- buttons go full width so they are easy to hit --- */
    .gp-page-body a.gp-btn,
    .gp-pm-body a.gp-btn { width: 100%; }

    /* --- documents --- */
    .gp-doc-item a { font-size: 0.88rem; }
}

@media (max-width: 480px) {
    .gp-product-grid { grid-template-columns: repeat(2, 1fr); }
    .gp-page-content h1,
    .gp-page-title { font-size: 1.3rem; }
    .gp-cat-item { width: 78px; }
}

/* Belt-and-braces: nothing should ever cause a horizontal scrollbar. */
html, body { max-width: 100%; overflow-x: hidden; }

/* --- Mobile: neutralise fixed pixel widths that would force horizontal scroll.
       Appended after the main mobile block so these win on specificity/order. --- */
@media (max-width: 782px) {

    /* Search dropdown is 420px wide by default - wider than most phones. */
    .gp-search-dropdown {
        width: auto;
        left: 0;
        right: 0;
        max-width: 100vw;
    }
    .gp-search-form input { width: 100%; min-width: 0; }
    .gp-search-form { width: 100%; }

    /* Mega-menu panels: 260px min-width can exceed a small viewport. */
    .gp-mega-panel,
    .gp-mega-flyout {
        min-width: 0;
        width: 100%;
        left: 0;
        position: static;
        box-shadow: none;
    }

    /* FacetWP sidebar stacks above results instead of sitting beside them. */
    .gp-catalog-layout { flex-direction: column; gap: 1.25rem; }
    .gp-facet-sidebar { width: 100%; flex-shrink: 1; }

    /* Spec table label column: 200px is too rigid on a narrow screen. */
    .gp-spec-label { width: auto; min-width: 7.5rem; }
    .gp-specs-table td,
    .gp-specs-table th { padding: 0.45rem 0.5rem; font-size: 0.85rem; }
}

/* ===== Submittal data sheets: page furniture ===== */

/* Top resource links (Catalogs / Certifications / Manuals) */
.gp-sub-links {
    background: #f7f7f7;
    border-left: 3px solid var(--gp-red, #BB0027);
    padding: 1rem 1.25rem;
    margin-bottom: 1rem;
}
.gp-sub-links h4 {
    font-size: 0.78rem;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    margin: 0 0 0.6rem;
    color: var(--gp-dark, #212121);
}
.gp-sub-links ul { list-style: none; margin: 0; padding: 0; }
.gp-sub-links li { margin-bottom: 0.45rem; }
.gp-sub-links li:last-child { margin-bottom: 0; }
.gp-sub-links a {
    font-size: 0.88rem;
    font-weight: 600;
    color: var(--gp-dark, #212121);
    text-decoration: none;
}
.gp-sub-links a:hover { color: var(--gp-red, #BB0027); text-decoration: underline; }

/* Brand band: "Grabber Fasteners" / "Scorpion Fasteners" */
.gp-sub-band {
    font-size: 1.15rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    color: var(--gp-dark, #212121);
    border-top: 2px solid var(--gp-red, #BB0027);
    border-bottom: 2px solid var(--gp-red, #BB0027);
    padding: 0.7rem 0;
    margin: 2.5rem 0 1.25rem;
    text-align: center;
}
.gp-sub-rule {
    border: 0;
    border-top: 2px solid var(--gp-red, #BB0027);
    margin: 2.25rem 0 1.25rem;
}

/* Per-group document filter */
.gp-sub-group { margin-bottom: 2rem; }
.gp-sub-search {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    margin-bottom: 0.9rem;
}
.gp-sub-filter {
    flex: 1 1 auto;
    min-width: 0;
    padding: 0.6rem 0.85rem;
    border: 1px solid #ccc;
    border-radius: 3px;
    font-size: 0.9rem;
    font-family: inherit;
}
.gp-sub-filter:focus {
    outline: none;
    border-color: var(--gp-red, #BB0027);
    box-shadow: 0 0 0 2px rgba(226, 35, 26, 0.15);
}
.gp-sub-result {
    font-size: 0.8rem;
    color: #666;
    white-space: nowrap;
    flex-shrink: 0;
}

/* Section header: title left, count pill right */
.gp-sub-accordion .gp-accordion-title {
    font-weight: 700;
    text-transform: uppercase;
}
.gp-sub-section[hidden] { display: none; }
.gp-sub-item[hidden] { display: none; }

@media (max-width: 782px) {
    .gp-sub-band { font-size: 1rem; margin: 1.75rem 0 1rem; }
    .gp-sub-search { flex-wrap: wrap; gap: 0.5rem; }
    .gp-sub-result { width: 100%; }
    .gp-sub-links { padding: 0.85rem 1rem; }
}

/* ===================================================================
   Submittal accordions — brand-aligned restyle.

   Replaces the CMS's 11 arbitrary hues with the site palette. Hierarchy
   is carried by weight, spacing and a single red accent rather than by
   colour-coding, which was adding noise rather than information (the
   Grabber / Scorpion bands already carry the real distinction).
   =================================================================== */

.gp-sub-accordion {
    border-top: 0;
}

.gp-sub-accordion .gp-accordion-item {
    border: 1px solid var(--gp-border, #E6E7E8);
    border-radius: 3px;
    margin-bottom: 0.5rem;
    background: #fff;
    overflow: hidden;
    transition: border-color 0.15s ease, box-shadow 0.15s ease;
}
.gp-sub-accordion .gp-accordion-item:hover {
    border-color: #cfcfcf;
}

/* Header: neutral ground, red accent edge, dark type. */
.gp-sub-accordion .gp-accordion-title {
    background: #f4f4f4;
    color: var(--gp-dark, #212121);
    border-left: 4px solid #c9c9c9;
    font-size: 0.82rem;
    font-weight: 700;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    padding: 0.95rem 2.75rem 0.95rem 1rem;
    transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease;
}
.gp-sub-accordion .gp-accordion-title:hover {
    background: #ededed;
    border-left-color: var(--gp-red, #BB0027);
}

/* Open: lifts to white, accent goes solid red, title picks up the red. */
.gp-sub-accordion .gp-accordion-item[open] {
    border-color: #d8d8d8;
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);
}
.gp-sub-accordion .gp-accordion-item[open] > .gp-accordion-title {
    background: #fff;
    border-left-color: var(--gp-red, #BB0027);
    color: var(--gp-red, #BB0027);
    border-bottom: 1px solid #eee;
}

/* Count pill: quiet by default, red when the section is open. */
.gp-sub-accordion .gp-sub-count {
    background: var(--gp-border, #E6E7E8);
    color: #555;
    font-size: 0.68rem;
    font-weight: 700;
    padding: 0.12rem 0.55rem;
    border-radius: 10px;
    margin-left: 0.6rem;
    transition: background-color 0.15s ease, color 0.15s ease;
}
.gp-sub-accordion .gp-accordion-item[open] > .gp-accordion-title .gp-sub-count {
    background: var(--gp-red, #BB0027);
    color: #fff;
}

/* Chevron inherits the header colour, so it turns red on open too. */
.gp-sub-accordion .gp-accordion-title::after {
    border-right-color: currentColor;
    border-bottom-color: currentColor;
    right: 1.1rem;
}

.gp-sub-accordion .gp-accordion-body {
    padding: 0.5rem 1rem 0.9rem;
}

/* Document rows: quiet dividers, red on hover, SKUs de-emphasised. */
.gp-sub-accordion .gp-sub-item {
    padding: 0.65rem 0.25rem;
    border-bottom: 1px solid #f0f0f0;
}
.gp-sub-accordion .gp-sub-item a {
    font-weight: 600;
    color: var(--gp-dark, #212121);
}
.gp-sub-accordion .gp-sub-item a:hover {
    color: var(--gp-red, #BB0027);
}
.gp-sub-accordion .gp-sub-skus {
    color: #8a8a8a;
    font-size: 0.7rem;
}

/* Keyboard focus must stay visible - the theme kills outlines elsewhere. */
.gp-sub-accordion .gp-accordion-title:focus-visible {
    outline: 2px solid var(--gp-red, #BB0027);
    outline-offset: -2px;
}

/* Brand bands: slightly quieter than the hard double rule. */
.gp-sub-band {
    border-top: 3px solid var(--gp-red, #BB0027);
    border-bottom: 1px solid var(--gp-border, #E6E7E8);
    background: #fafafa;
    padding: 0.85rem 1rem;
}

/* ===================================================================
   Layout for extracted CMS pages.

   Flex `basis` was the wrong tool: with a narrow content column three
   220px columns could not fit, so they silently stacked. These rows have
   a KNOWN column count, so grid states it explicitly and the layout holds
   at any width until the mobile breakpoint deliberately collapses it.
   =================================================================== */

/* A single-column row is not a flex container. */
.gp-pm-row-1,
.gp-pm-row.gp-pm-row-1 {
    display: block;
}

/* Fallback for anything without an explicit rule below. */
.gp-pm-row {
    display: flex;
    flex-wrap: wrap;
    gap: 1rem;
    margin-bottom: 1.1rem;
    align-items: flex-start;
}
.gp-pm-col {
    flex: 1 1 130px;
    min-width: 0;
}

/* --- Resource links: one panel, three columns, as on the live site --- */
.gp-pm-row:has(> .gp-pm-col > .gp-sub-links) {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 0;
    background: #f7f7f7;
    border: 1px solid #E6E7E8;
    padding: 0.9rem 1rem;
    margin-bottom: 1.25rem;
}
.gp-pm-row:has(> .gp-pm-col > .gp-sub-links) > .gp-pm-col {
    padding: 0 0.9rem;
}
.gp-sub-links {
    background: none;
    border: 0;
    border-left: 2px solid var(--gp-red, #BB0027);
    padding: 0.1rem 0 0.1rem 0.7rem;
    margin: 0;
    height: 100%;
}
.gp-sub-links li { margin-bottom: 0.3rem; }
.gp-sub-links a { font-size: 0.8rem; line-height: 1.3; }

/* --- Catalogue promo: intro text wide, two compact thumbnails --- */
/* Two different shapes share the .gp-pm-image markup:
     - the catalogue promo: wide intro text then two thumbnails, so the FIRST
       column has no image and the grid is deliberately asymmetric
     - icon-card grids (About Us and friends): every column is a card, so the
       columns must be equal. The live site declares columns [12,6,6,3,3] -
       one across on mobile, two on tablet, four on desktop.
   "Does the first column contain an image" separates the two without needing a
   new class on markup that is already generated. The old blanket rule forced
   every image row into 2.4fr/1fr/1fr, which crammed About Us's four equal
   cards into three lopsided columns and wrapped the fourth. */
.gp-pm-row:has(> .gp-pm-col > .gp-pm-image) {
    display: grid;
    gap: 1.1rem;
    align-items: start;
    margin-bottom: 1.25rem;
}

/* Catalogue promo - first column is text, then two thumbnails. */
.gp-pm-row:has(> .gp-pm-col > .gp-pm-image):not(:has(> .gp-pm-col:first-child > .gp-pm-image)) {
    grid-template-columns: 2.4fr 1fr 1fr;
}

/* two-column text + image rows. Previously these inherited the three-track
   promo grid above and left an empty third column. The live site declares
   these as [5,7] / [7,5] - roughly 1.4:1 - not 2.4:1. */
.gp-pm-row:has(> .gp-pm-col > .gp-pm-image):not(:has(> .gp-pm-col:first-child > .gp-pm-image)):not(:has(> .gp-pm-col:nth-child(3))) {
    grid-template-columns: 1.4fr 1fr;
}

/* icon-card grid - every column is a card. Equal columns, count aware. */
.gp-pm-row:has(> .gp-pm-col:first-child > .gp-pm-image) {
    grid-template-columns: repeat(4, 1fr);
    gap: 1.9rem 1.25rem;
}
.gp-pm-row:has(> .gp-pm-col:first-child > .gp-pm-image):not(:has(> .gp-pm-col:nth-child(2))) {
    grid-template-columns: 1fr;
}
.gp-pm-row:has(> .gp-pm-col:first-child > .gp-pm-image):has(> .gp-pm-col:nth-child(2)):not(:has(> .gp-pm-col:nth-child(3))) {
    grid-template-columns: repeat(2, 1fr);
}
.gp-pm-row:has(> .gp-pm-col:first-child > .gp-pm-image):has(> .gp-pm-col:nth-child(3)):not(:has(> .gp-pm-col:nth-child(4))) {
    grid-template-columns: repeat(3, 1fr);
}

/* Cards are equal-height columns so the buttons line up along the bottom. */
.gp-pm-row:has(> .gp-pm-col:first-child > .gp-pm-image) > .gp-pm-col {
    display: flex;
    flex-direction: column;
    align-items: center;
    height: 100%;
}
.gp-pm-row:has(> .gp-pm-col:first-child > .gp-pm-image) > .gp-pm-col > .gp-btn {
    margin-top: auto;
}
.gp-pm-row:has(> .gp-pm-col:first-child > .gp-pm-image) > .gp-pm-col h4 {
    font-size: 0.95rem;
    letter-spacing: 0.02em;
    margin-bottom: 0.35rem;
}
.gp-page-body .gp-pm-image { margin: 0.4rem 0 0.6rem; }
.gp-page-body .gp-pm-image img {
    max-width: 120px;
    width: 100%;
    height: auto;
}
/* Only the catalogue thumbnails are bordered. The icon illustrations are
   transparent PNGs and a border boxes them in, which the live site never does. */
.gp-pm-row:not(:has(> .gp-pm-col:first-child > .gp-pm-image)) .gp-pm-image img {
    border: 1px solid var(--gp-border, #E6E7E8);
}
.gp-pm-row:has(> .gp-pm-col > .gp-pm-image):not(:has(> .gp-pm-col:first-child > .gp-pm-image)) .gp-btn {
    font-size: 0.68rem;
    padding: 0.5rem 0.6rem;
    text-align: center;
}
.gp-pm-row:has(> .gp-pm-col:first-child > .gp-pm-image) .gp-btn {
    font-size: 0.78rem;
    padding: 0.55rem 1.05rem;
    text-align: center;
}

/* --- Tighter vertical rhythm --- */
.gp-page-content { padding: 1.5rem 1.5rem 2rem; }
.gp-page-body p { margin: 0 0 0.7rem; font-size: 0.92rem; line-height: 1.55; }
.gp-page-body h4 { margin: 0 0 0.5rem; }
.gp-page-body .gp-page-title { margin-bottom: 0.75rem; }

.gp-sub-band { margin: 1.4rem 0 0.8rem; padding: 0.65rem 1rem; font-size: 1.05rem; }
.gp-sub-group { margin-bottom: 1rem; }
.gp-sub-search { margin-bottom: 0.6rem; }
.gp-sub-filter { padding: 0.45rem 0.7rem; font-size: 0.85rem; }

.gp-sub-accordion .gp-accordion-item { margin-bottom: 0.3rem; }
.gp-sub-accordion .gp-accordion-title {
    padding: 0.7rem 2.5rem 0.7rem 0.9rem;
    font-size: 0.78rem;
}
.gp-sub-accordion .gp-sub-item { padding: 0.45rem 0.25rem; }

/* Nested button rows hug their content. */
.gp-pm-col .gp-pm-row { gap: 0.6rem; margin-bottom: 0; }
.gp-pm-col .gp-pm-row .gp-pm-col { flex: 0 0 auto; }

@media (max-width: 700px) {
    .gp-pm-row:has(> .gp-pm-col > .gp-sub-links),
    .gp-pm-row:has(> .gp-pm-col > .gp-pm-image) {
        grid-template-columns: 1fr;
        gap: 0.75rem;
    }
    .gp-pm-row:has(> .gp-pm-col > .gp-sub-links) > .gp-pm-col { padding: 0; }
    .gp-sub-links { height: auto; margin-bottom: 0.5rem; }
    .gp-page-body .gp-pm-image img { max-width: 160px; }
}

/* --- Catalogue columns: centre the label, thumbnail and button as a unit.
       Scoped to columns that actually contain an image, so the intro text
       column beside them keeps its left alignment. --- */
.gp-page-body .gp-pm-col:has(> .gp-pm-image) {
    text-align: center;
}
.gp-page-body .gp-pm-col:has(> .gp-pm-image) > p {
    margin-bottom: 0.4rem;
}
.gp-page-body .gp-pm-col:has(> .gp-pm-image) .gp-pm-image {
    text-align: center;
}
.gp-page-body .gp-pm-col:has(> .gp-pm-image) .gp-pm-image img {
    display: inline-block;
}
.gp-page-body .gp-pm-col:has(> .gp-pm-image) .gp-btn {
    display: inline-flex;
    margin: 0 auto;
}

/* Fallback for browsers without :has() - centre by grid position instead.
   Columns 2 and 3 of the catalogue row are the two catalogue tiles. */
@supports not selector(:has(*)) {
    .gp-page-body .gp-pm-row > .gp-pm-col:nth-child(2),
    .gp-page-body .gp-pm-row > .gp-pm-col:nth-child(3) {
        text-align: center;
    }
}

/* ===== Catalogue pager + sort ===== */
.gp-pager-wrap {
    margin: 2rem 0 1rem;
    display: flex;
    justify-content: center;
}
.facetwp-pager {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: center;
    gap: 0.35rem;
}
.facetwp-page {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 2.2rem;
    padding: 0.45rem 0.7rem;
    border: 1px solid var(--gp-border, #E6E7E8);
    background: #fff;
    color: var(--gp-dark, #212121);
    font-size: 0.85rem;
    font-weight: 600;
    text-decoration: none;
    cursor: pointer;
    border-radius: 2px;
    transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease;
}
.facetwp-page:hover {
    border-color: var(--gp-red, #BB0027);
    color: var(--gp-red, #BB0027);
}
.facetwp-page.active {
    background: var(--gp-red, #BB0027);
    border-color: var(--gp-red, #BB0027);
    color: #fff;
    cursor: default;
}
.facetwp-page.dots {
    border-color: transparent;
    cursor: default;
    min-width: 1.2rem;
    padding: 0.45rem 0.2rem;
}
.facetwp-page.dots:hover { color: var(--gp-dark, #212121); }

/* Result counter */
.gp-result-count,
.facetwp-counts {
    font-size: 0.85rem;
    color: var(--gp-grey, #666666);
    margin: 0;
}

/* Sort dropdown */
.gp-sort-wrap select,
.facetwp-sort-select {
    padding: 0.45rem 0.7rem;
    border: 1px solid var(--gp-border, #E6E7E8);
    border-radius: 2px;
    font-size: 0.85rem;
    font-family: inherit;
    background: #fff;
    color: var(--gp-dark, #212121);
}
.gp-results-toolbar {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    flex-wrap: wrap;
    margin-bottom: 1rem;
}

/* Per-page selector, if shown */
.facetwp-per-page-select {
    padding: 0.4rem 0.6rem;
    border: 1px solid var(--gp-border, #E6E7E8);
    border-radius: 2px;
    font-size: 0.8rem;
}

@media (max-width: 700px) {
    .facetwp-page { min-width: 2rem; padding: 0.4rem 0.55rem; font-size: 0.8rem; }
    .gp-results-toolbar { flex-direction: column; align-items: flex-start; gap: 0.5rem; }
}


/* --- icon-card grid breakpoints: 4 across -> 2 -> 1, matching the live
       site's [12,6,6,3,3] column declaration. The 700px rule must come after
       the 900px rule so it wins on narrow viewports. --- */
@media (max-width: 900px) {
    .gp-pm-row:has(> .gp-pm-col:first-child > .gp-pm-image),
    .gp-pm-row:has(> .gp-pm-col:first-child > .gp-pm-image):has(> .gp-pm-col:nth-child(3)):not(:has(> .gp-pm-col:nth-child(4))) {
        grid-template-columns: repeat(2, 1fr);
    }
}
@media (max-width: 700px) {
    .gp-pm-row:has(> .gp-pm-col:first-child > .gp-pm-image) {
        grid-template-columns: 1fr;
        gap: 1.5rem;
    }
    .gp-page-body .gp-pm-col:has(> .gp-pm-image) .gp-pm-image img { max-width: 120px; }
}

/* Fallback for browsers without :has() - four equal columns is the common case. */
@supports not selector(:has(*)) {
    .gp-page-body .gp-pm-row { display: flex; flex-wrap: wrap; }
    .gp-page-body .gp-pm-row > .gp-pm-col { flex: 1 1 180px; }
}

/* ===== Solutions banner grid =====
   The live Solutions hub is a grid of image tiles with a dark overlay, a
   heading, a subheading and a button. WP had a plain bullet list whose links
   all 404'd (they pointed at /solutions/<slug>/ but the pages are flat).
   Two large tiles, then four smaller ones, matching the live [6,6] and
   [12,12,6,3,3] column declarations. */
.gp-banner-grid {
    display: grid;
    gap: 1.1rem;
    margin: 1.4rem 0 1.6rem;
}
.gp-banner-grid-2 { grid-template-columns: repeat(2, 1fr); }
.gp-banner-grid-4 { grid-template-columns: repeat(4, 1fr); }

.gp-banner {
    position: relative;
    display: block;
    overflow: hidden;
    min-height: 230px;
    border-radius: 2px;
    text-decoration: none;
    color: #fff;
    isolation: isolate;
}
.gp-banner-grid-2 .gp-banner { min-height: 320px; }

.gp-banner-img {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    /* the theme adds a border to .gp-pm-image img; these are full-bleed */
    border: 0;
    transition: transform 0.4s ease;
}
.gp-banner::after {
    content: "";
    position: absolute;
    inset: 0;
    background: rgba(0, 0, 0, 0.5);
    transition: background-color 0.25s ease;
}
.gp-banner:hover .gp-banner-img { transform: scale(1.04); }
.gp-banner:hover::after { background: rgba(0, 0, 0, 0.38); }

.gp-banner-body {
    position: relative;
    z-index: 1;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    text-align: center;
    height: 100%;
    min-height: inherit;
    padding: 1.4rem 1.1rem;
    gap: 0.5rem;
}
.gp-banner-heading {
    font-size: 1.25rem;
    font-weight: 700;
    line-height: 1.15;
    text-shadow: 0 1px 3px rgba(0, 0, 0, 0.45);
}
.gp-banner-grid-4 .gp-banner-heading { font-size: 1.05rem; }
.gp-banner-sub {
    font-size: 0.9rem;
    line-height: 1.35;
    max-width: 34ch;
    text-shadow: 0 1px 3px rgba(0, 0, 0, 0.45);
}
.gp-banner-grid-4 .gp-banner-sub { font-size: 0.8rem; }
.gp-banner-btn {
    margin-top: 0.4rem;
    display: inline-block;
    padding: 0.5rem 1.1rem;
    border: 2px solid #fff;
    font-size: 0.78rem;
    font-weight: 700;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    transition: background-color 0.2s ease, color 0.2s ease;
}
.gp-banner:hover .gp-banner-btn {
    background: var(--gp-red, #BB0027);
    border-color: var(--gp-red, #BB0027);
    color: #fff;
}
.gp-banner:focus-visible {
    outline: 3px solid var(--gp-red, #BB0027);
    outline-offset: 3px;
}

.gp-solutions-more {
    margin-top: 0.4rem;
    font-size: 0.9rem;
    color: var(--gp-grey, #666);
}
.gp-solutions-more a { color: var(--gp-dark, #212121); }
.gp-solutions-more a:hover { color: var(--gp-red, #BB0027); }

@media (max-width: 900px) {
    .gp-banner-grid-4 { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 620px) {
    .gp-banner-grid-2,
    .gp-banner-grid-4 { grid-template-columns: 1fr; }
    .gp-banner,
    .gp-banner-grid-2 .gp-banner { min-height: 200px; }
}

/* ===== RedBorderedTitle + hero banner =====
   Optimizely's RedBorderedTitle widget renders as an uppercase heading with a
   red rule above and below it. Used as a section divider on The Grabber
   Difference and the Literature & Resources pages. */
.gp-page-body .gp-red-title {
    margin: 1.9rem 0 1rem;
    padding: 0.55rem 0;
    border-top: 2px solid var(--gp-red, #BB0027);
    border-bottom: 2px solid var(--gp-red, #BB0027);
    text-align: center;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    font-size: 0.95rem;
    font-weight: 700;
    line-height: 1.3;
    color: var(--gp-dark, #212121);
}

/* Full-width hero banner: left aligned, taller, image anchored top-left to
   match the live focalPoint. */
.gp-banner-hero {
    min-height: 380px;
    margin-bottom: 1.4rem;
}
.gp-banner-hero .gp-banner-img { object-position: top left; }
.gp-banner-hero .gp-banner-body {
    align-items: flex-start;
    text-align: left;
    padding: 2rem 2.2rem;
    gap: 0.75rem;
}
.gp-banner-hero .gp-banner-heading {
    font-size: 2rem;
    max-width: 22ch;
    line-height: 1.1;
}
.gp-banner-hero .gp-banner-sub {
    max-width: 52ch;
    font-size: 0.95rem;
}
/* A hero with no destination is not interactive, so drop the hover affordances. */
div.gp-banner-hero:hover .gp-banner-img { transform: none; }
div.gp-banner-hero:hover::after { background: rgba(0, 0, 0, 0.5); }

@media (max-width: 700px) {
    .gp-banner-hero { min-height: 260px; }
    .gp-banner-hero .gp-banner-heading { font-size: 1.4rem; }
    .gp-banner-hero .gp-banner-body { padding: 1.3rem 1.2rem; }
}

/* ===== Catalogs page =====
   Mirrors the live layout: two featured interactive catalogs at the top, then a
   grid of downloadable PDF catalogs shown as cover thumbnail + title. Live uses
   70x100 covers, so the aspect ratio is fixed to keep the row even. */
.gp-catalog-featured {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 1.5rem;
    margin: 1.4rem 0 1.8rem;
}
.gp-catalog-feature {
    display: flex;
    gap: 1rem;
    align-items: flex-start;
    padding: 1rem;
    border: 1px solid var(--gp-border, #E6E7E8);
    background: var(--gp-panel, #F7F7F7);
}
.gp-catalog-feature-thumb { flex: 0 0 auto; }
.gp-catalog-feature-thumb img {
    display: block;
    width: 84px;
    height: 120px;
    object-fit: cover;
    border: 1px solid var(--gp-border, #E6E7E8);
    background: #fff;
}
.gp-catalog-feature-body { min-width: 0; }
.gp-catalog-feature-body h3 {
    margin: 0 0 0.35rem;
    font-size: 1rem;
    line-height: 1.25;
}
.gp-catalog-feature-body h3 a { color: var(--gp-dark, #212121); text-decoration: none; }
.gp-catalog-feature-body h3 a:hover { color: var(--gp-red, #BB0027); }
.gp-catalog-feature-body p { margin: 0 0 0.5rem; font-size: 0.85rem; line-height: 1.45; }
.gp-catalog-note {
    font-size: 0.72rem !important;
    color: var(--gp-grey, #666);
    font-style: italic;
}
.gp-catalog-actions { display: flex; flex-wrap: wrap; gap: 0.5rem; }
.gp-catalog-actions .gp-btn { font-size: 0.72rem; padding: 0.45rem 0.8rem; }

/* Downloadable catalogs */
.gp-catalog-grid {
    display: grid;
    grid-template-columns: repeat(5, 1fr);
    gap: 1.25rem;
    margin: 1rem 0 1.6rem;
}
.gp-catalog-card {
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
    text-decoration: none;
    color: var(--gp-dark, #212121);
    padding: 0.85rem 0.6rem;
    border: 1px solid var(--gp-border, #E6E7E8);
    background: #fff;
    transition: border-color 0.18s ease, box-shadow 0.18s ease;
}
.gp-catalog-card:hover {
    border-color: var(--gp-red, #BB0027);
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
}
.gp-catalog-card-thumb {
    width: 84px;
    height: 120px;
    object-fit: cover;
    border: 1px solid var(--gp-border, #E6E7E8);
    margin-bottom: 0.6rem;
    background: #fff;
}
.gp-catalog-card-body { display: block; }
.gp-catalog-card-title {
    display: block;
    font-size: 0.82rem;
    font-weight: 700;
    line-height: 1.25;
    margin-bottom: 0.3rem;
}
.gp-catalog-card:hover .gp-catalog-card-title { color: var(--gp-red, #BB0027); }
.gp-catalog-card-desc {
    display: block;
    font-size: 0.72rem;
    line-height: 1.35;
    color: var(--gp-grey, #666);
}
.gp-catalog-card:focus-visible,
.gp-catalog-feature-thumb:focus-visible {
    outline: 3px solid var(--gp-red, #BB0027);
    outline-offset: 2px;
}
.gp-catalog-more { font-size: 0.9rem; }

@media (max-width: 1100px) {
    .gp-catalog-grid { grid-template-columns: repeat(3, 1fr); }
}
@media (max-width: 780px) {
    .gp-catalog-featured { grid-template-columns: 1fr; }
    .gp-catalog-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 460px) {
    .gp-catalog-grid { grid-template-columns: 1fr; }
    .gp-catalog-card { flex-direction: row; text-align: left; gap: 0.8rem; }
    .gp-catalog-card-thumb { margin-bottom: 0; }
}

/* ===== AWCI event page =====
   Mirrors the live layout: full-width event logo, two 3-up product banners,
   a button row, then two square photo galleries (Build25 and Build24). */

.gp-awci-hero { margin: 0 0 1.4rem; }
.gp-awci-hero img {
    display: block;
    width: 100%;
    height: auto;
    border: 0;
}

/* the third banner width, alongside the -1 / -2 / -4 variants */
.gp-banner-grid-3 { grid-template-columns: repeat(3, 1fr); }

/* These banners carry only a button, no heading, so they need less height
   than the Solutions tiles and a lighter overlay - the product shot is the
   point, the button is the affordance. */
.gp-banner-grid-3 .gp-banner { min-height: 190px; }
.gp-banner-grid-3 .gp-banner::after { background: rgba(0, 0, 0, 0.32); }
.gp-banner-grid-3 .gp-banner:hover::after { background: rgba(0, 0, 0, 0.2); }
.gp-banner-grid-3 .gp-banner-body { justify-content: flex-end; padding: 1rem; }

.gp-btn-row {
    display: flex;
    flex-wrap: wrap;
    gap: 0.6rem;
    margin: 0.9rem 0 1.4rem;
}

/* Photo gallery: square crops on a fixed grid so rows stay even whatever the
   source aspect ratio. auto-fill rather than a fixed count, because these
   blocks hold 20+ images and should reflow rather than step at breakpoints. */
.gp-gallery {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
    gap: 0.6rem;
    margin: 1rem 0 1.8rem;
}
.gp-gallery-item {
    display: block;
    position: relative;
    aspect-ratio: 1 / 1;
    overflow: hidden;
    background: var(--gp-panel, #F7F7F7);
    border: 1px solid var(--gp-border, #E6E7E8);
}
.gp-gallery-item img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
    border: 0;
    transition: transform 0.35s ease;
}
.gp-gallery-item:hover img { transform: scale(1.05); }
.gp-gallery-item:focus-visible {
    outline: 3px solid var(--gp-red, #BB0027);
    outline-offset: 2px;
}

/* Fallback for browsers without aspect-ratio */
@supports not (aspect-ratio: 1 / 1) {
    .gp-gallery-item { height: 0; padding-bottom: 100%; }
    .gp-gallery-item img { position: absolute; inset: 0; }
}

@media (max-width: 780px) {
    .gp-banner-grid-3 { grid-template-columns: repeat(2, 1fr); }
    .gp-gallery { grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); }
}
@media (max-width: 520px) {
    .gp-banner-grid-3 { grid-template-columns: 1fr; }
}

/* ===== Astra accent token -> Grabber red =====
   Astra's --ast-global-color-0 is its accent/link slot and ships as #046bd2.
   It drives 58 generated rules: the base a{} colour and hover, outline buttons,
   pagination, the mobile menu trigger, form focus borders and ::selection.
   Blue is not a Grabber colour anywhere, so retargeting the two tokens fixes
   every one of them at once - 482 content links across 54 pages were rendering
   blue - rather than chasing individual selectors and missing some.

   Astra defines these on :root in inline CSS in the head; this stylesheet is
   enqueued afterwards, so an equally specific :root wins on source order.
   --ast-global-color-1 is Astra's hover/active shade, so it maps to our darker
   red rather than the same value, keeping a visible hover state. */
:root {
    --ast-global-color-0: #BB0027;
    --ast-global-color-1: #95001F;

    /* the block editor's palette copies of the same two slots */
    --wp--preset--color--ast-global-color-0: #BB0027;
    --wp--preset--color--ast-global-color-1: #95001F;
}

/* Content links: keep them underlined so colour is not the only signal that
   something is a link (WCAG 1.4.1). Astra does this for .entry-content only. */
.gp-page-body a:not(.gp-btn):not(.gp-banner):not(.gp-catalog-card):not(.gp-gallery-item):not(.gp-product-card),
.gp-product-body a:not(.gp-btn):not(.gp-banner):not(.gp-catalog-card):not(.gp-gallery-item) {
    text-decoration: underline;
    text-underline-offset: 0.15em;
}
/* The same exclusions as the underline rule above. Without them this matched
   .gp-banner - which IS an <a> inside .gp-page-body - and at specificity 0-2-1 it
   beat .gp-banner { color: #fff } at 0-1-0. Tile text turned dark red on a
   50%-black scrim over a photo: roughly 10.4:1 contrast down to about 1.2:1.
   Worse on touch, where iOS applies :hover on tap and leaves it stuck there. */
.gp-page-body a:not(.gp-btn):not(.gp-banner):not(.gp-catalog-card):not(.gp-gallery-item):not(.gp-product-card):hover,
.gp-product-body a:not(.gp-btn):not(.gp-banner):not(.gp-catalog-card):not(.gp-gallery-item):hover {
    color: var(--gp-red-dark, #95001F);
}

/* gp-banner-hover-guard
   Components that paint their own text over imagery restate their colour for
   every interaction state, so a future descendant selector cannot quietly
   repaint them the way the rule above did. */
.gp-banner,
.gp-banner:hover,
.gp-banner:focus,
.gp-banner:focus-visible,
.gp-banner:active,
.gp-banner:visited {
    color: #fff;
}
.gp-banner:hover .gp-banner-heading,
.gp-banner:hover .gp-banner-sub,
.gp-banner:focus .gp-banner-heading,
.gp-banner:focus .gp-banner-sub {
    color: inherit;
}

/* Elements that carry their own colour must not inherit the accent. */
.gp-banner,
.gp-banner:hover,
.gp-gallery-item,
.gp-catalog-card,
.gp-product-card {
    text-decoration: none;
}

/* ===== Extra product images =====
   Live product records often carry several shots; the template rendered only
   the featured one. Anything beyond the first shows here. */
.gp-product-thumbs {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(72px, 1fr));
    gap: 0.5rem;
    margin-top: 0.7rem;
}
.gp-product-thumb {
    display: block;
    aspect-ratio: 1 / 1;
    overflow: hidden;
    border: 1px solid var(--gp-border, #E6E7E8);
    background: #fff;
    text-decoration: none;
}
.gp-product-thumb img {
    width: 100%;
    height: 100%;
    object-fit: contain;
    display: block;
    border: 0;
}
.gp-product-thumb:hover { border-color: var(--gp-red, #BB0027); }
.gp-product-thumb:focus-visible {
    outline: 3px solid var(--gp-red, #BB0027);
    outline-offset: 2px;
}
@supports not (aspect-ratio: 1 / 1) {
    .gp-product-thumb { height: 0; padding-bottom: 100%; position: relative; }
    .gp-product-thumb img { position: absolute; inset: 0; }
}

/* ===================================================================
   Header bars: match the live site's spacing, type and search field
   ===================================================================
   Three differences from the live site, all reported side by side:

   1. The live chrome container is 1570px; ours was 1400px, which pulled
      JOIN / LITERATURE and the logo / search noticeably inward. The
      content container stays narrower on purpose - long lines of body
      copy should not run the full width of a wide monitor - which is
      also what the live site does (1570 chrome, 1199 content).
   2. The utility bar was 12px, a step smaller than live, and had no
      font smoothing, which is most of the "crisper" difference.
   3. The search field's underline sat on the input only, so it stopped
      before the icon. Moving it to the form makes one continuous rule
      under the field and the button, as on the live site.
   =================================================================== */

.gp-utility-inner,
.gp-header-inner,
.gp-footer-inner {
    max-width: 1570px;
}

/* Slightly larger, and smoothed - the live bar reads crisper mostly
   because of antialiasing, not size alone. */
.gp-utility-bar {
    font-size: 0.8125rem;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
}
.gp-utility-bar a {
    letter-spacing: 0.03em;
    padding: 0.15rem 0;
}
.gp-utility-left,
.gp-utility-right { gap: 1.6rem; }
/* the per-link margins are replaced by flex gap, so they would double up */
.gp-utility-bar a,
.gp-utility-right a { margin-right: 0; margin-left: 0; }

.gp-main-header,
.gp-main-nav a { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }

/* ---- search field ---- */
.gp-search-form {
    border-bottom: 1px solid rgba(255, 255, 255, 0.85);
    align-items: stretch;
    transition: border-color 0.18s ease;
}
.gp-search-form:focus-within { border-bottom-color: #fff; }
.gp-search-form input {
    /* the rule now lives on the form so it runs under the icon too */
    border-bottom: 0;
    font-size: 0.9rem;
    padding: 0.35rem 0;
    width: 230px;
}
.gp-search-form input::placeholder {
    color: rgba(255, 255, 255, 0.85);
    font-size: 0.85rem;
}
.gp-search-submit {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    margin-left: 0;
    padding: 0 0.15rem 0 0.55rem;
    line-height: 1;
    color: #fff;
    opacity: 0.9;
    transition: opacity 0.18s ease;
}
.gp-search-submit:hover,
.gp-search-form:focus-within .gp-search-submit { opacity: 1; }
.gp-search-icon { width: 18px; height: 18px; display: block; }
.gp-search-submit:focus-visible {
    outline: 2px solid #fff;
    outline-offset: 2px;
    border-radius: 2px;
}

/* Scoped above the phone breakpoint on purpose: the 782px block already
   sets this input to 100%, and being later in the file this rule was
   overriding it on phones - a fixed 170px field in a wrapped header row. */
@media (min-width: 783px) and (max-width: 1024px) {
    .gp-search-form input { width: 170px; }
}
@media (max-width: 900px) {
    .gp-utility-bar { font-size: 0.75rem; }
    .gp-utility-left, .gp-utility-right { gap: 1rem; }
}

/* ===== Mobile overflow fixes =====
   Two things the source-level audit caught, both of which force sideways
   scrolling of the whole page on a 360px phone - the narrowest common width.

   1. The search autocomplete panel is a fixed 420px, wider than the viewport.
   2. Spec tables and imported content tables (some carry an inline
      width: 400px from the Optimizely CMS) have no scroll container, so they
      push the page instead of scrolling themselves. */

.gp-search-dropdown {
    width: min(420px, calc(100vw - 1.5rem));
    max-width: calc(100vw - 1.5rem);
}

/* The spec box is already the table's wrapper, so it only needs to scroll. */
.gp-specs-box { overflow-x: auto; }

@media (max-width: 700px) {
    /* Make the table itself the scroll container. Without a wrapper element to
       add, this is the standard way to stop a wide table dragging the page
       sideways; the inner rows still lay out as a table. */
    .gp-page-body table,
    .gp-product-description table,
    .gp-content-section table {
        display: block;
        overflow-x: auto;
        max-width: 100%;
        width: auto !important;
        -webkit-overflow-scrolling: touch;
    }
    /* Long SKU strings and URLs should wrap rather than widen the page. */
    .gp-page-body,
    .gp-product-description { overflow-wrap: break-word; }
}

/* Belt and braces: nothing should be able to scroll the document sideways. */
html, body { overflow-x: hidden; }

/* ===== Red banner: centre the nav on the page =====
   The nav was flex:1 / flex-start, so it sat hard against the logo. Centring it
   as a flex item would only centre it in the space BETWEEN the logo and the
   search field - and those differ in width by roughly 100px, so the nav would
   land about 50px left of true centre.

   A three-column grid with equal 1fr edges puts the middle column at the real
   page centre regardless of what the logo and search field measure. justify-self
   keeps the logo anchor at its natural width, so it does not become a
   full-third-width invisible click target.

   Scoped above 900px: below that the nav collapses into the toggle menu and the
   grid must not apply. */
@media (min-width: 901px) {
    .gp-header-inner {
        display: grid;
        grid-template-columns: 1fr auto 1fr;
        align-items: center;
        gap: 1.5rem;
    }
    .gp-logo        { justify-self: start; }
    .gp-main-nav    { justify-self: center; flex: 0 1 auto; justify-content: center; }
    .gp-search-form { justify-self: end; }
}

/* Tighten the nav before it can crowd the logo or search field. */
@media (min-width: 901px) and (max-width: 1280px) {
    .gp-main-nav { gap: 1.6rem; }
    .gp-main-nav a { letter-spacing: 0.05em; }
}
@media (min-width: 901px) and (max-width: 1080px) {
    .gp-main-nav { gap: 1.1rem; }
    .gp-main-nav a { font-size: 0.94rem; }
}

/* ===== Product image gallery =====
   Thumbnails select the main image, as on the live product pages, so the
   selected one needs to read as selected. */
.gp-product-main { position: relative; }
.gp-product-main img {
    display: block;
    width: 100%;
    height: auto;
}
.gp-product-thumb {
    cursor: pointer;
    transition: border-color 0.15s ease, box-shadow 0.15s ease;
}
.gp-product-thumb.is-active {
    border-color: var(--gp-red, #BB0027);
    box-shadow: inset 0 0 0 1px var(--gp-red, #BB0027);
}
/* The active thumb should not look hoverable-into-something-else. */
.gp-product-thumb.is-active { cursor: default; }

/* ===== Search synonym notice ===== */
.gp-search-note {
    margin: 0 0 0.9rem;
    padding: 0.6rem 0.85rem;
    background: var(--gp-panel, #F7F7F7);
    border-left: 3px solid var(--gp-red, #BB0027);
    font-size: 0.88rem;
    color: var(--gp-dark, #212121);
}
.gp-search-note strong { font-family: "URWDINStdBold", Arial, Helvetica, sans-serif; }
.gp-search-note em { color: var(--gp-grey, #666); font-style: italic; }

/* ===== Free-form homepage area =====
   Whatever marketing adds as blocks on the Home page renders here. It has to
   sit inside the same container as the designed sections and inherit sensible
   type, otherwise added content is full-bleed and unstyled. Renders nothing at
   all when the page content is empty. */
.gp-home-free {
    max-width: 1400px;
    margin: 2rem auto 2.5rem;
    padding: 0 1.5rem;
}
.gp-home-free > *:first-child { margin-top: 0; }
.gp-home-free > *:last-child { margin-bottom: 0; }
.gp-home-free h2 {
    font-family: "URWDINStdBold", Arial, Helvetica, sans-serif;
    text-transform: uppercase;
    font-size: 1.4rem;
    letter-spacing: 0.02em;
    margin: 0 0 0.9rem;
    color: var(--gp-dark, #212121);
}
.gp-home-free h3 {
    font-family: "URWDINStdBold", Arial, Helvetica, sans-serif;
    font-size: 1.05rem;
    margin: 1.4rem 0 0.5rem;
}
.gp-home-free p { font-size: 0.95rem; line-height: 1.6; margin: 0 0 0.9rem; }
.gp-home-free a { color: var(--gp-red, #BB0027); }
.gp-home-free img,
.gp-home-free video,
.gp-home-free iframe { max-width: 100%; height: auto; display: block; }
/* embedded video keeps its aspect ratio */
.gp-home-free .wp-block-embed__wrapper iframe,
.gp-home-free iframe[src*="youtube"],
.gp-home-free iframe[src*="vimeo"] { width: 100%; aspect-ratio: 16 / 9; height: auto; }
.gp-home-free ul, .gp-home-free ol { font-size: 0.95rem; line-height: 1.6; }

@media (max-width: 700px) {
    .gp-home-free { margin: 1.5rem auto 2rem; }
    .gp-home-free h2 { font-size: 1.2rem; }
}

/* ==================================================================
   Mobile filter drawer (catalogue)
   ------------------------------------------------------------------
   Eleven facet groups ahead of the grid meant several screens of
   scrolling before the first product on a phone. Below 900px the
   sidebar becomes an off-canvas panel. Desktop is unchanged.
   ================================================================== */

.gp-filter-bar,
.gp-filter-backdrop,
.gp-facet-close,
.gp-facet-apply { display: none; }

@media (max-width: 900px) {

    .gp-filter-bar {
        display: block;
        position: sticky;
        top: 0;
        z-index: 30;
        padding: 0.6rem 0;
        background: #fff;
    }

    .gp-filter-toggle {
        display: inline-flex;
        align-items: center;
        gap: 0.5rem;
        width: 100%;
        justify-content: center;
        padding: 0.7rem 1rem;
        font: inherit;
        font-weight: 700;
        color: #fff;
        background: var(--gp-red, #BB0027);
        border: none;
        border-radius: 3px;
        cursor: pointer;
    }
    .gp-filter-toggle svg { flex: none; }

    .gp-filter-count {
        display: inline-block;
        min-width: 1.35rem;
        padding: 0 0.3rem;
        border-radius: 999px;
        background: rgba(255, 255, 255, 0.25);
        font-size: 0.8rem;
        font-variant-numeric: tabular-nums;
    }

    /* The panel itself. Fixed, so it leaves the flow entirely and the
       results become the first thing on screen. */
    .gp-facet-sidebar {
        position: fixed;
        top: 0;
        bottom: 0;
        left: 0;
        width: min(88vw, 340px);
        max-width: none;
        margin: 0;
        z-index: 60;
        overflow-y: auto;
        -webkit-overflow-scrolling: touch;
        border-radius: 0;
        box-shadow: 2px 0 18px rgba(0, 0, 0, 0.22);
        transform: translateX(-100%);
        transition: transform 0.24s ease;
        padding-bottom: 5rem;
    }
    .gp-facet-sidebar.is-open { transform: translateX(0); }

    /* No transition for anyone who asked not to have one. */
    @media (prefers-reduced-motion: reduce) {
        .gp-facet-sidebar { transition: none; }
    }

    .gp-filter-backdrop {
        display: block;
        position: fixed;
        inset: 0;
        z-index: 50;
        background: rgba(0, 0, 0, 0.45);
        opacity: 0;
        pointer-events: none;
        transition: opacity 0.24s ease;
    }
    .gp-filter-backdrop.is-open { opacity: 1; pointer-events: auto; }

    .gp-facet-close {
        display: block;
        position: absolute;
        top: 0.35rem;
        right: 0.5rem;
        width: 2.2rem;
        height: 2.2rem;
        font-size: 1.6rem;
        line-height: 1;
        color: var(--gp-dark, #1a1a1a);
        background: none;
        border: none;
        cursor: pointer;
    }

    /* The close button is absolutely positioned against the sidebar, so it
       takes no space in the flow - and .gp-facet-header-row puts the Reset
       button hard against that same right edge. On an iPad in portrait the
       two overlapped: Sam's screenshot shows the x sitting on the corner of
       RESET, where neither could be tapped reliably.

       Reserving the close button's own width plus its offset keeps Reset
       clear of it. Done on the row rather than by moving the x, because the
       x belongs in the corner - it is the control people reach for first. */
    .gp-facet-header-row {
        padding-right: 2.9rem;
    }

    .gp-facet-apply {
        display: block;
        position: sticky;
        bottom: 0;
        width: 100%;
        margin-top: 1rem;
        padding: 0.75rem 1rem;
        font: inherit;
        font-weight: 700;
        color: #fff;
        background: var(--gp-dark, #1a1a1a);
        border: none;
        border-radius: 3px;
        cursor: pointer;
    }

    /* Secondary only. This never locked anything on its own: html carries
       overflow-x, so html is the scrolling element and hiding body overflow
       governs nothing - and iOS ignores it on body regardless. The real lock
       is position:fixed applied from catalog-filters.js. Kept because it
       costs nothing and documents the intent. */
    body.gp-filters-open { overflow: hidden; }
}

/* gp-banner-text-legibility
   ------------------------------------------------------------------
   Colour the text-bearing children directly rather than relying on
   inheritance from the anchor.

   Reported as red and unreadable over the tile imagery. Every
   server-side check said the anchor computes to #fff - comments and
   braces balanced, .gp-banner { color: #fff } live, no inline styles,
   no :where()/:is()/universal rule that matches, and Astra's
   `a { color: var(--ast-global-color-0) }` loses to .gp-banner on
   specificity (0-0-1 against 0-1-0). So the cause was never
   identified from the server.

   Setting the colour on the spans themselves makes the anchor's
   computed colour irrelevant: whatever wins there, the text no longer
   inherits it. Specificity 0-3-1 clears every colour rule found on
   this page, the highest of which was 0-3-0.

   Text over photography has to stay legible regardless of what a
   future rule does to link colours, so this is deliberately specific
   rather than minimal. */
.gp-page-body a.gp-banner,
.gp-page-body a.gp-banner .gp-banner-body,
.gp-page-body a.gp-banner .gp-banner-heading,
.gp-page-body a.gp-banner .gp-banner-sub,
.gp-page-body a.gp-banner .gp-banner-btn,
.gp-page-body a.gp-banner:hover .gp-banner-heading,
.gp-page-body a.gp-banner:hover .gp-banner-sub,
.gp-page-body a.gp-banner:hover .gp-banner-btn,
.gp-page-body a.gp-banner:focus .gp-banner-heading,
.gp-page-body a.gp-banner:focus .gp-banner-sub,
.gp-page-body a.gp-banner:focus .gp-banner-btn {
    color: #fff;
}

/* The hero variant of the same component, same reasoning. */
.gp-page-body .gp-banner-hero .gp-banner-heading,
.gp-page-body .gp-banner-hero .gp-banner-sub {
    color: #fff;
}

/* Skip link (WCAG 2.4.1). Off-screen until focused rather than
   display:none, because a hidden element cannot receive focus. */
.gp-skip-link {
    position: absolute;
    left: -9999px;
    top: 0;
    z-index: 1000;
    padding: 0.75rem 1.25rem;
    background: var(--gp-dark, #1a1a1a);
    color: #fff;
    font-weight: 700;
    text-decoration: none;
}
.gp-skip-link:focus {
    left: 0;
    outline: 3px solid var(--gp-red, #BB0027);
    outline-offset: 2px;
}
/* The target is programmatically focusable so focus really moves there, but it
   must not draw a ring when clicked with a mouse. */
.gp-main-content:focus { outline: none; }

/* Available to assistive technology, absent from the visual design.
   Clip rather than display:none, which would remove it from the
   accessibility tree along with the visual layout. */
.gp-sr-only {
    position: absolute !important;
    width: 1px; height: 1px;
    padding: 0; margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}

/* Hero video pause control (WCAG 2.2.2).
   Created by script only when the video is actually attached, so it never
   appears on a phone or for a reduced-motion visitor. Contrast is carried by
   the solid dark chip rather than by the video behind it, which is unknowable. */
.gp-hero-videotoggle {
    position: absolute;
    right: 1rem;
    bottom: 1rem;
    z-index: 3;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2.5rem;
    height: 2.5rem;
    padding: 0;
    color: #fff;
    background: rgba(20, 20, 20, 0.78);
    border: 1px solid rgba(255, 255, 255, 0.55);
    border-radius: 50%;
    cursor: pointer;
}
.gp-hero-videotoggle svg { width: 1rem; height: 1rem; }
.gp-hero-videotoggle:hover { background: rgba(20, 20, 20, 0.92); }
.gp-hero-videotoggle:focus-visible {
    outline: 3px solid #fff;
    outline-offset: 2px;
}

/* ============================================================
   Block styles for core blocks  (registered in inc/blocks.php)

   These mirror the .gp-btn / .gp-red-title rules above so a core
   button inserted by marketing is indistinguishable from a
   hand-written one. Kept adjacent in intent: if the .gp-* rules
   change, these must change with them.
   ============================================================ */

.gp-page-body .wp-block-button.is-style-gp-primary > .wp-block-button__link,
.gp-page-body .wp-block-button.is-style-gp-outline > .wp-block-button__link {
    display: inline-block;
    padding: 0.8rem 1.6rem;
    font-weight: 700;
    font-family: "URWDINStdBold", Arial, Helvetica, sans-serif;
    text-transform: uppercase;
    font-size: 0.85rem;
    text-decoration: none;
    border-radius: 2px;
    letter-spacing: 0.03em;
}

.gp-page-body .wp-block-button.is-style-gp-primary > .wp-block-button__link {
    background: var(--gp-red, #BB0027);
    color: #fff;
    border: 2px solid var(--gp-red, #BB0027);
}
.gp-page-body .wp-block-button.is-style-gp-primary > .wp-block-button__link:hover,
.gp-page-body .wp-block-button.is-style-gp-primary > .wp-block-button__link:focus-visible {
    background: var(--gp-red-dark, #95001F);
    border-color: var(--gp-red-dark, #95001F);
    color: #fff;
}

.gp-page-body .wp-block-button.is-style-gp-outline > .wp-block-button__link {
    background: transparent;
    color: var(--gp-grey, #666);
    border: 2px solid var(--gp-grey, #666);
}
.gp-page-body .wp-block-button.is-style-gp-outline > .wp-block-button__link:hover,
.gp-page-body .wp-block-button.is-style-gp-outline > .wp-block-button__link:focus-visible {
    background: var(--gp-grey, #666);
    color: #fff;
}

.gp-page-body .is-style-gp-red-title {
    margin: 1.9rem 0 1rem;
    padding: 0.55rem 0;
    border-top: 2px solid var(--gp-red, #BB0027);
    border-bottom: 2px solid var(--gp-red, #BB0027);
    text-align: center;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    font-size: 0.95rem;
    font-weight: 700;
    line-height: 1.3;
}

.gp-page-body .wp-block-group.is-style-gp-panel {
    background: #f7f7f7;
    border: 1px solid var(--gp-border, #E6E7E8);
    padding: 1.6rem;
    margin: 1.6rem 0;
}

/* ============================================================
   Pack-size variants  ("Also available in")
   ============================================================ */

.gp-variants-box { margin: 1.6rem 0 1.2rem; }
.gp-variants-box h2 {
    text-transform: uppercase;
    font-size: 1rem;
    font-weight: 700;
    font-family: "URWDINStdBold", Arial, Helvetica, sans-serif;
    border-bottom: 2px solid var(--gp-red, #BB0027);
    padding-bottom: 0.6rem;
    margin: 0 0 1rem;
}
.gp-variant-list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-wrap: wrap;
    gap: 0.6rem;
}
.gp-variant-list li { margin: 0; }
.gp-variant-chip {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
    min-width: 7.5rem;
    padding: 0.6rem 0.95rem;
    border: 1px solid var(--gp-border, #E6E7E8);
    border-radius: 2px;
    background: #fff;
    text-decoration: none;
    font-size: 0.9rem;
    font-weight: 700;
    color: var(--gp-dark, #1a1a1a);
    line-height: 1.25;
}
a.gp-variant-chip:hover,
a.gp-variant-chip:focus-visible {
    border-color: var(--gp-red, #BB0027);
    color: var(--gp-red, #BB0027);
}
.gp-variant-chip .gp-variant-sku {
    font-size: 0.75rem;
    font-weight: 400;
    color: var(--gp-grey, #666);
    letter-spacing: 0.02em;
}
/* The pack being viewed stays in the row, flagged rather than removed, so the
   set always reads as complete. */
.gp-variant-chip.is-current {
    background: var(--gp-red, #BB0027);
    border-color: var(--gp-red, #BB0027);
    color: #fff;
    cursor: default;
}
.gp-variant-chip.is-current .gp-variant-sku { color: rgba(255, 255, 255, 0.85); }

@media (max-width: 480px) {
    .gp-variant-list { gap: 0.45rem; }
    .gp-variant-chip { min-width: 6.4rem; padding: 0.5rem 0.7rem; font-size: 0.85rem; }
}

/* Second chip row: lengths sit directly under pack sizes, so the heading needs
   a little more air above it than the first one gets. */
.gp-lengths-box { margin-top: 1.9rem; }

/* Product family archives */
.gp-family-archive { max-width: 1570px; margin: 0 auto; padding: 1.5rem 1.5rem 3rem; }
.gp-family-archive > h1 {
    text-transform: uppercase;
    font-family: "URWDINStdBold", Arial, Helvetica, sans-serif;
    border-bottom: 2px solid var(--gp-red, #BB0027);
    padding-bottom: 0.7rem;
    margin: 0.4rem 0 0.9rem;
}
.gp-family-intro { color: var(--gp-grey, #666); margin: 0 0 1.6rem; }
.gp-family-pager { margin-top: 2rem; }
.gp-family-pager .nav-links { display: flex; flex-wrap: wrap; gap: 0.4rem; }
.gp-family-pager .page-numbers {
    display: inline-block; padding: 0.5rem 0.85rem;
    border: 1px solid var(--gp-border, #E6E7E8);
    text-decoration: none; color: var(--gp-dark, #1a1a1a); font-weight: 700;
}
.gp-family-pager .page-numbers:hover { border-color: var(--gp-red, #BB0027); color: var(--gp-red, #BB0027); }
.gp-family-pager .page-numbers.current {
    background: var(--gp-red, #BB0027); border-color: var(--gp-red, #BB0027); color: #fff;
}
.gp-family-others { margin-top: 2.6rem; }

/* Part number lookup */
.gp-part-lookup { max-width: 1100px; margin: 0 auto; padding: 1.5rem 1.5rem 3rem; }
.gp-part-lookup > h1 {
    text-transform: uppercase;
    font-family: "URWDINStdBold", Arial, Helvetica, sans-serif;
    border-bottom: 2px solid var(--gp-red, #BB0027);
    padding-bottom: 0.7rem; margin: 0.4rem 0 1rem;
}
.gp-lookup-intro { color: var(--gp-grey, #666); max-width: 62ch; margin-bottom: 1.6rem; }
.gp-lookup-form { background: #f7f7f7; border: 1px solid var(--gp-border, #E6E7E8); padding: 1.3rem; margin-bottom: 2rem; }
.gp-lookup-label { display: block; font-weight: 700; margin-bottom: 0.5rem;
    font-family: "URWDINStdBold", Arial, Helvetica, sans-serif; text-transform: uppercase; font-size: 0.85rem; }
.gp-lookup-form textarea {
    width: 100%; padding: 0.7rem; border: 1px solid var(--gp-border, #E6E7E8);
    font-family: ui-monospace, Consolas, monospace; font-size: 0.95rem; line-height: 1.5; resize: vertical;
}
.gp-lookup-form textarea:focus-visible { outline: 2px solid var(--gp-red, #BB0027); outline-offset: 1px; }
.gp-lookup-hint { font-size: 0.85rem; color: var(--gp-grey, #666); margin: 0.5rem 0 1rem; }
.gp-lookup-actions { display: flex; gap: 0.6rem; flex-wrap: wrap; }
.gp-lookup-summary { font-weight: 700; margin-bottom: 1rem; font-size: 1.05rem; }
.gp-lookup-tablewrap { overflow-x: auto; border: 1px solid var(--gp-border, #E6E7E8); }
.gp-lookup-table { width: 100%; border-collapse: collapse; min-width: 640px; }
.gp-lookup-table th, .gp-lookup-table td { padding: 0.7rem 0.9rem; text-align: left; border-bottom: 1px solid var(--gp-border, #E6E7E8); vertical-align: top; }
.gp-lookup-table thead th {
    background: #f2f2f2; font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.06em;
    font-family: "URWDINStdBold", Arial, Helvetica, sans-serif;
}
.gp-lookup-table tbody tr:last-child td { border-bottom: none; }
.gp-lookup-sku { font-family: ui-monospace, Consolas, monospace; font-weight: 700; white-space: nowrap; }
.gp-lookup-size { white-space: nowrap; color: var(--gp-grey, #666); font-size: 0.9rem; }
.gp-lookup-docs { list-style: none; margin: 0; padding: 0; }
.gp-lookup-docs li { margin-bottom: 0.25rem; }
.gp-lookup-none { color: var(--gp-grey, #666); font-size: 0.9rem; }
.gp-lookup-missing { margin-top: 2rem; padding: 1.1rem 1.3rem; background: #fdf6f5; border-left: 3px solid var(--gp-red, #BB0027); }
.gp-lookup-missing h2 { margin: 0 0 0.5rem; font-size: 1.05rem; text-transform: uppercase;
    font-family: "URWDINStdBold", Arial, Helvetica, sans-serif; }
.gp-lookup-missing ul { margin: 0.6rem 0 0; padding-left: 1.2rem; font-family: ui-monospace, Consolas, monospace; }
@media (max-width: 600px) {
    .gp-part-lookup { padding: 1rem 1rem 2rem; }
    .gp-lookup-form { padding: 1rem; }
}

/* ============================================================
   Print.

   Estimators print product pages as spec sheets. Without this they
   get the navigation, the mega-menu, the cookie banner and the
   accessibility overlay across three pages. Link destinations are
   printed after documents, because a printed link is useless
   otherwise.
   ============================================================ */
@media print {
    .site-header, .site-footer, .gp-utility-bar, .gp-mega, .gp-filter-bar,
    .gp-facet-sidebar, .gp-filter-backdrop, .ast-scroll-top-icon, #ast-scroll-top,
    .cmplz-cookiebanner, #cmplz-cookiebanner-container, .uwy, #userwayAccessibilityIcon,
    .gp-product-thumbs, .gp-skip-link, .gp-lookup-form, .gp-family-others,
    .gp-variants-box .gp-variant-chip.is-current + *, .gp-banner-grid {
        display: none !important;
    }
    html, body { background: #fff !important; color: #000 !important; font-size: 11pt; }
    .gp-page-content, .gp-single-product { max-width: none !important; padding: 0 !important; margin: 0 !important; }
    a { color: #000 !important; text-decoration: underline; }
    .gp-doc-list a::after,
    .gp-lookup-docs a::after {
        content: " (" attr(href) ")";
        font-size: 8.5pt;
        word-break: break-all;
        font-weight: 400;
    }
    .gp-specs-table { width: 100% !important; page-break-inside: auto; }
    .gp-specs-table tr { page-break-inside: avoid; }
    .gp-specs-table th, .gp-specs-table td { border-bottom: 1px solid #ccc !important; }
    .gp-specs-box h2, .gp-content-section h2, .gp-documents-section h2 {
        border-bottom: 1.5pt solid #000 !important; color: #000 !important;
        page-break-after: avoid;
    }
    .gp-product-image img { max-width: 55mm !important; height: auto !important; }
    .gp-variant-chip { border: 1pt solid #666 !important; background: none !important; color: #000 !important; }
    .gp-lookup-table { page-break-inside: auto; }
    .gp-lookup-table tr { page-break-inside: avoid; }
}

/* Product families index */
.gp-family-index { max-width: 1200px; margin: 0 auto; padding: 1.5rem 1.5rem 3rem; }
.gp-family-index > h1 {
    text-transform: uppercase;
    font-family: "URWDINStdBold", Arial, Helvetica, sans-serif;
    border-bottom: 2px solid var(--gp-red, #BB0027);
    padding-bottom: 0.7rem; margin: 0.4rem 0 1rem;
}
.gp-family-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
    gap: 1.4rem;
    margin: 1.8rem 0 2rem;
}
.gp-family-card {
    display: block; text-decoration: none; color: inherit;
    border: 1px solid var(--gp-border, #E6E7E8); background: #fff;
    padding: 1rem; transition: border-color .13s ease, transform .13s ease;
}
.gp-family-card:hover, .gp-family-card:focus-visible {
    border-color: var(--gp-red, #BB0027); transform: translateY(-2px);
}
.gp-family-card__media {
    aspect-ratio: 4 / 3; display: flex; align-items: center; justify-content: center;
    overflow: hidden; margin-bottom: 0.9rem; background: #f7f7f7;
}
.gp-family-card__media img { max-width: 100%; height: auto; object-fit: contain; }
.gp-family-card__name {
    font-size: 1.05rem; margin: 0 0 0.3rem;
    font-family: "URWDINStdBold", Arial, Helvetica, sans-serif;
}
.gp-family-card:hover .gp-family-card__name { color: var(--gp-red, #BB0027); }
.gp-family-card__count { margin: 0; color: var(--gp-grey, #666); font-size: 0.88rem; }
.gp-family-allproducts { margin-top: 1.5rem; color: var(--gp-grey, #666); }
@media (prefers-reduced-motion: reduce) { .gp-family-card { transition: none; } .gp-family-card:hover { transform: none; } }

/* ============================================================
   Literature & Resources: section nav + grouped document lists

   The live site puts the section list in a boxed three-column
   block at the TOP with the current page unlinked and bold. That
   placement is most of why it reads as part of a section rather
   than a page that happens to have links at the bottom.
   ============================================================ */
.gp-lr-nav {
    background: #f5f5f5;
    border-top: 1px solid var(--gp-border, #E6E7E8);
    border-bottom: 1px solid var(--gp-border, #E6E7E8);
    padding: 1.5rem 2rem;
    margin: 0 0 2.2rem;
}
.gp-lr-nav ul {
    list-style: none;
    margin: 0;
    padding: 0;
    columns: 3;
    column-gap: 2.5rem;
}
.gp-lr-nav li {
    margin: 0 0 0.65rem;
    break-inside: avoid;
    font-size: 0.95rem;
}
.gp-lr-nav a { color: var(--gp-red, #BB0027); text-decoration: none; }
.gp-lr-nav a:hover, .gp-lr-nav a:focus-visible { text-decoration: underline; }
.gp-lr-nav .is-current span { font-weight: 700; color: var(--gp-dark, #1a1a1a); }

.gp-submittal-note { margin: -0.6rem 0 1.4rem; color: var(--gp-grey, #666); }

/* Documents inside an accordion section run two-up, as on the live page. */
.gp-doc-columns {
    list-style: none;
    margin: 0;
    padding: 0;
    columns: 2;
    column-gap: 2.5rem;
}
.gp-doc-columns li { margin: 0 0 0.6rem; break-inside: avoid; }
.gp-doc-columns a { color: var(--gp-red, #BB0027); text-decoration: none; }
.gp-doc-columns a:hover, .gp-doc-columns a:focus-visible { text-decoration: underline; }

.gp-submittal-accordion { margin: 1.6rem 0 2.4rem; }
.gp-submittal-accordion .gp-sub-count {
    float: right;
    margin-right: 2.2rem;
    color: var(--gp-grey, #666);
    font-weight: 400;
    font-size: 0.85rem;
}

@media (max-width: 900px) {
    .gp-lr-nav { padding: 1.2rem 1.2rem; }
    .gp-lr-nav ul { columns: 2; }
    .gp-doc-columns { columns: 1; }
}
@media (max-width: 600px) {
    .gp-lr-nav ul { columns: 1; }
}

/* ============================================================
   Proposition 65 warning

   A legal notice, so it is deliberately plain and unmissable
   rather than styled to blend in. The symbol is decorative -
   the word WARNING carries the meaning for screen readers.
   ============================================================ */
.gp-prop65 {
    display: flex;
    gap: 1.1rem;
    align-items: flex-start;
    border: 1px solid var(--gp-red, #BB0027);
    background: #fff;
    padding: 1.2rem 1.4rem;
    margin: 2rem 0;
}
.gp-prop65-symbol {
    font-size: 1.9rem;
    line-height: 1;
    color: var(--gp-red, #BB0027);
    flex: none;
}
.gp-prop65-body { min-width: 0; }
.gp-prop65-heading {
    margin: 0 0 0.35rem;
    font-family: "URWDINStdBold", Arial, Helvetica, sans-serif;
    letter-spacing: 0.04em;
    font-size: 1rem;
}
.gp-prop65-body p { margin: 0; font-size: 0.95rem; line-height: 1.55; }
.gp-prop65-body a { color: var(--gp-red, #BB0027); }

@media (max-width: 600px) {
    .gp-prop65 { padding: 1rem; gap: 0.8rem; }
    .gp-prop65-symbol { font-size: 1.5rem; }
}
@media print {
    /* The warning must survive printing - it is the point of the notice. */
    .gp-prop65 { border: 1.5pt solid #000 !important; page-break-inside: avoid; }
    .gp-prop65-symbol, .gp-prop65-body a { color: #000 !important; }
}

/* ============================================================
   Availability notices

   Amber for limited stock, grey for discontinued. Deliberately
   NOT red - red is the Prop 65 warning on the same page, and two
   red boxes would flatten the distinction between a legal notice
   and a stock message.
   ============================================================ */
.gp-availability {
    border: 1px solid var(--gp-border, #E6E7E8);
    border-left: 4px solid #8A5A12;
    background: #FBF6EC;
    padding: 1rem 1.2rem;
    margin: 0 0 1.6rem;
}
.gp-availability p { margin: 0 0 0.4rem; font-size: 0.95rem; line-height: 1.55; }
.gp-availability p:last-child { margin: 0; }
.gp-availability strong { font-family: "URWDINStdBold", Arial, Helvetica, sans-serif; }
.gp-availability--discontinued {
    border-left-color: var(--gp-grey, #666);
    background: #f4f4f4;
}
.gp-availability-cta a { color: var(--gp-red, #BB0027); font-weight: 700; }
@media print { .gp-availability { border: 1pt solid #000 !important; background: none !important; } }

/* ============================================================
   Solutions banner tiles: text is always white.

   The tiles sit on photography, so the text colour cannot be
   inherited - it has to be stated. Previously it relied on not
   being caught by the page link rule, which is a fragile way to
   end up the right colour.
   ============================================================ */
.gp-banner-grid .gp-banner,
.gp-banner-grid .gp-banner-heading,
.gp-banner-grid .gp-banner-sub,
.gp-banner-hero .gp-banner-heading,
.gp-banner-hero .gp-banner-sub {
    color: #fff;
}
.gp-banner-grid .gp-banner-btn { color: #fff; border-color: #fff; }
.gp-banner-grid .gp-banner:hover .gp-banner-btn,
.gp-banner-grid .gp-banner:focus-visible .gp-banner-btn {
    background: var(--gp-red, #BB0027);
    border-color: var(--gp-red, #BB0027);
    color: #fff;
}

/* ============================================================
   Collapsible filter groups

   Built on <details>/<summary>, so the open/closed behaviour and
   keyboard support come from the browser rather than from us -
   and the filters still work with JavaScript disabled.

   This became necessary when the ten-value cap came off: the
   sidebar went from about 110 options to 357, and eleven groups
   expanded at once is a wall.
   ============================================================ */
.gp-facet-group { border-bottom: 1px solid var(--gp-border, #E6E7E8); padding: 0; margin: 0; }
.gp-facet-summary {
    display: flex; align-items: center; justify-content: space-between;
    gap: 0.6rem; cursor: pointer; padding: 0.85rem 0; list-style: none;
}
.gp-facet-summary::-webkit-details-marker { display: none; }
.gp-facet-summary::marker { content: ''; }
.gp-facet-summary h3 {
    margin: 0; font-size: 0.85rem; text-transform: uppercase; letter-spacing: 0.04em;
    font-family: "URWDINStdBold", Arial, Helvetica, sans-serif;
}
.gp-facet-summary:hover h3 { color: var(--gp-red, #BB0027); }
.gp-facet-summary:focus-visible { outline: 2px solid var(--gp-red, #BB0027); outline-offset: 2px; }

/* the +/- indicator, drawn rather than an icon font */
.gp-facet-summary::after {
    content: ''; flex: none; width: 14px; height: 14px; margin-left: auto;
    background:
        linear-gradient(var(--gp-red, #BB0027), var(--gp-red, #BB0027)) center/14px 2px no-repeat,
        linear-gradient(var(--gp-red, #BB0027), var(--gp-red, #BB0027)) center/2px 14px no-repeat;
    transition: transform .15s ease;
}
.gp-facet-group[open] > .gp-facet-summary::after {
    background:
        linear-gradient(var(--gp-red, #BB0027), var(--gp-red, #BB0027)) center/14px 2px no-repeat;
}
.gp-facet-group > .facetwp-facet { margin: 0 0 1rem; }
/* catalog-filters.js hides a group with nothing to offer in the current result
   set - that is how the specialist attributes stay scoped to the categories
   where they apply. Stated here so a later `display` rule on .gp-facet-group
   cannot silently outrank the [hidden] attribute. */
.gp-facet-group[hidden] { display: none; }
/* Collapse all / Expand all. Quiet by design - it is a utility beside eighteen
   filter groups, not something to compete with them for attention. */
.gp-facet-collapse-all {
    display: block; width: 100%; margin: 0 0 1rem; padding: 0.45rem 0.6rem;
    background: none; border: 1px solid var(--gp-border, #E6E7E8); border-radius: 2px;
    font-size: 0.8rem; text-transform: uppercase; letter-spacing: 0.04em;
    color: var(--gp-grey, #666); cursor: pointer;
}
/* Astra paints `button:hover` with --ast-global-color-1, which we retargeted to
   Grabber red - so tinting the TEXT red on hover put red on red. Hover matches
   .facetwp-reset instead: red ground, white label. */
.gp-facet-collapse-all:hover,
.gp-facet-collapse-all:focus-visible {
    background: var(--gp-red, #BB0027);
    border-color: var(--gp-red, #BB0027);
    color: #fff;
}
.gp-facet-collapse-all[hidden] { display: none; }

/* how many filters are active inside a collapsed group */
.gp-facet-active {
    flex: none; min-width: 1.35rem; padding: 0 0.4rem; border-radius: 999px;
    background: var(--gp-red, #BB0027); color: #fff;
    font-size: 0.72rem; font-weight: 700; line-height: 1.35rem; text-align: center;
}
@media (prefers-reduced-motion: reduce) { .gp-facet-summary::after { transition: none; } }

/* "No matches in this category - search all products" - see catalog-filters.js.
   Styled as guidance rather than an error: nothing has gone wrong, the visitor
   is just standing in the wrong aisle. */
.gp-search-elsewhere {
    margin: 0 0 1.25rem;
    padding: 0.85rem 1rem;
    background: var(--gp-border, #E6E7E8);
    border-left: 3px solid var(--gp-red, #BB0027);
    font-size: 0.95rem;
    color: var(--gp-dark, #1a1a1a);
}
.gp-search-elsewhere a { font-weight: 700; color: var(--gp-red, #BB0027); }
.gp-search-elsewhere a:hover { text-decoration: underline; }

/* The category row falls back to siblings when a category has no children, so
   the visitor keeps the set they were choosing from. The current one is a span,
   not a link - it needs to read as "you are here" rather than as a dead link. */
.gp-subcategory-link.is-current {
    background: var(--gp-red, #BB0027);
    color: #fff;
    cursor: default;
}
.gp-subcategory-link.gp-subcategory-up { font-weight: 700; }

/* Non-PDF documents say so. A .docx opened in a new tab just starts a download
   and leaves an empty tab behind, which reads as a broken link. */
.gp-doc-kind { color: var(--gp-grey, #666); font-size: 0.85em; font-weight: 400; }

/* ===================================================================
   Content image sizing  (Jason 9/15, Carly 9/21)
   -------------------------------------------------------------------
   Jason: "Can we make the images bigger? See existing site for
   reference" (green-construction-leed).
   Carly: "The images are sized very small, can that be fixed?" and
   "Can the images and thumbnail size be increased?" (the-grabber-
   difference, twice).

   One rule caused all three. `.gp-page-body .gp-pm-image img` capped
   EVERY extracted CMS image at max-width:120px. That number was chosen
   for the small catalogue thumbnails that sit beside a text column, and
   it was then inherited by every other kind of image on the page.

   Live declares an explicit imageWidth per image - 600 for the LEED
   graphic, 500 for the adhesive product shots - so a blanket 120px
   renders them at a fifth of their intended size. On the LEED page the
   600x550 graphic is not even inside a .gp-pm-col; it sits directly in
   a single-column row, so nothing else was ever going to constrain it.

   Three contexts, three sizes, matching what the CMS actually declares:

     single-column row   a content image, the page's main visual   600px
     card / logo grid    partner logos, product cards              300px
     promo thumbnail     catalogue cover beside a text column      220px

   width:auto rather than width:100% - a 300px logo stretched to fill a
   590px grid cell is upscaled and blurry. max-width carries the sizing;
   the 100% keeps it inside a narrow cell.
   =================================================================== */

.gp-page-body .gp-pm-image img,
.gp-page-body .gp-pm-col:has(> .gp-pm-image) .gp-pm-image img {
    width: auto;
    max-width: min(100%, 220px);
    height: auto;
}

/* A single-column row is the page's main content image. */
.gp-page-body .gp-pm-row-1 .gp-pm-image img,
.gp-page-body .gp-pm-row.gp-pm-row-1 .gp-pm-image img {
    max-width: min(100%, 600px);
}

/* Card / logo grids: every column is a card, so the image fills it. */
.gp-page-body .gp-pm-row:has(> .gp-pm-col:first-child > .gp-pm-image) .gp-pm-image img,
.gp-page-body .gp-pm-row:has(> .gp-pm-col:first-child > .gp-pm-image) .gp-pm-col:has(> .gp-pm-image) .gp-pm-image img {
    max-width: min(100%, 300px);
}

/* Centre a single-column content image; it is the focal point of the row. */
.gp-page-body .gp-pm-row-1 .gp-pm-image {
    text-align: center;
}

/* Fallback for browsers without :has() - keep images usefully large
   rather than falling back to the old 120px. */
@supports not selector(:has(*)) {
    .gp-page-body .gp-pm-image img { max-width: min(100%, 300px); }
}

@media (max-width: 700px) {
    .gp-page-body .gp-pm-image img,
    .gp-page-body .gp-pm-col:has(> .gp-pm-image) .gp-pm-image img {
        max-width: min(100%, 220px);
    }
    .gp-page-body .gp-pm-row-1 .gp-pm-image img,
    .gp-page-body .gp-pm-row.gp-pm-row-1 .gp-pm-image img {
        max-width: 100%;
    }
    .gp-page-body .gp-pm-row:has(> .gp-pm-col:first-child > .gp-pm-image) .gp-pm-image img {
        max-width: min(100%, 260px);
    }
}

/* The "More Literature & Resources" panel is one grey box split into three
   columns (the .gp-pm-row:has(> .gp-pm-col > .gp-sub-links) rule above).
   The .gp-sub-links component carries its own background and red rule for
   standalone use, which doubles up inside that panel - neutralise it there. */
.gp-pm-row:has(> .gp-pm-col > .gp-sub-links) .gp-sub-links {
    background: none;
    border-left: 0;
    padding: 0 0.75rem;
    margin-bottom: 0;
}

/* What's New: line the two images up on a common baseline.
   Carly: "Can the ACTup photo align horizontally with the combat mat image?"

   Both images are the same 2560x1783, so the images were never the problem.
   The grid was align-items:start, so each tile sized to its own text - and the
   Combat Mat description is several lines longer than the ACTup one, which
   pushed its image down and left the two out of line.

   Each tile is now a full-height flex column with the media pushed to the
   bottom, so the images share a baseline whatever the copy above them does.
   Same technique as the icon-card grid, where margin-top:auto holds the
   buttons on one line. Marketing can now write copy of any length without
   knocking the layout out. */
.gp-whats-new-grid {
    align-items: stretch;
}
.gp-whats-new-item {
    display: flex;
    flex-direction: column;
}
.gp-whats-new-item .gp-whats-new-media {
    margin-top: auto;
}

/* ===================================================================
   Carly 9/24 - two corrections
   ------------------------------------------------------------------- */

/* 1. "The star icons are massive" (The Grabber Difference).
      Those are the four small product shots in a row - Grabber screws,
      SuperDrive N7, CM10P, No-Coat bucket - which read as icons at the
      intended size. Live declares imageWidth 150 for each of them.

      This is a regression from my own fix on 23 Sep: raising the blanket
      120px cap to 300px for card grids was right for partner logos and
      wrong for these, which doubled. Live is the reference, so match it
      exactly rather than splitting the difference.

      A card grid of three or more is an icon row: 150.
      A card grid of exactly two is an image beside text - live declares
      300 for the Marvin Maxwell portrait in that layout. */
.gp-page-body .gp-pm-row:has(> .gp-pm-col:first-child > .gp-pm-image):has(> .gp-pm-col:nth-child(3)) .gp-pm-image img {
    max-width: min(100%, 150px);
}
.gp-page-body .gp-pm-row:has(> .gp-pm-col:first-child > .gp-pm-image):has(> .gp-pm-col:nth-child(2)):not(:has(> .gp-pm-col:nth-child(3))) .gp-pm-image img {
    max-width: min(100%, 300px);
}

/* 2. "Scorpion thumbnail cut off. I uploaded a larger version and it is
      still being cut off."

      Two causes. The catalogue covers we inherited are all 70x100 portrait,
      so the thumb was built as a fixed 84x120 box with object-fit:cover -
      a 0.7 ratio that those images fill exactly, with nothing cropped.
      Carly's replacement is 2000x1765, which is LANDSCAPE. Forcing a 1.13
      ratio into a 0.7 box with `cover` crops roughly 38% off the width, so
      supplying a better image made the crop worse rather than better.

      `contain` letterboxes instead of cropping, so any aspect ratio now
      renders whole. The white background fills the unused space, which the
      box already had. Slightly larger box since a real asset now exists. */
.gp-catalog-feature-thumb img,
.gp-catalog-card-thumb {
    width: 100px;
    height: 140px;
    object-fit: contain;
}

/* =====================================================================
   Accessibility fixes from Meticular's pre-launch review, 15 Oct 2026
   ===================================================================== */

/* Header drop-downs were mouse-only.
   .gp-mega-menu and .gp-mega-flyout were shown on :hover and on a JS
   .is-open class, so a keyboard user could Tab to "PRODUCTS" and never
   reach anything inside it. :focus-within opens the panel as soon as
   focus lands on any descendant, which is what Tab does, and closes it
   again when focus leaves - no JS, and it cannot get out of step with
   the hover behaviour. */
.gp-nav-item.gp-has-mega:focus-within .gp-mega-menu {
    display: block;
}
.gp-mega-item.gp-has-flyout:focus-within .gp-mega-flyout {
    display: block;
}

/* Consistent, visible focus.
   Reported as weak or missing on the main nav (white on red), the
   consent button, the mobile filter button, and inconsistent on the
   search icon. One rule, high contrast on both the red chrome and white
   content, and only for keyboard users so mouse clicks stay clean. */
.gp-main-nav a:focus-visible,
.gp-main-nav button:focus-visible,
.gp-utility-bar a:focus-visible,
.gp-search-form button:focus-visible,
.gp-search-form input:focus-visible,
.gp-logo:focus-visible,
.gp-menu-toggle:focus-visible {
    outline: 3px solid #fff;
    outline-offset: 2px;
    border-radius: 2px;
}

.gp-filter-toggle:focus-visible,
.gp-facet-close:focus-visible,
.gp-facet-collapse-all:focus-visible,
.gp-facet-summary:focus-visible,
.cmplz-manage-consent:focus-visible,
.cmplz-btn:focus-visible,
.footer-col a:focus-visible,
.footer-col__cta:focus-visible,
.site-footer__legal a:focus-visible {
    outline: 3px solid var(--gp-red, #BB0027);
    outline-offset: 2px;
    border-radius: 2px;
}

/* The consent banner sits on its own white panel, so the red ring above
   works there - but the floating "Your Privacy Choices" trigger can land
   on either, so give it a ring that reads on both. */
.cmplz-manage-consent:focus-visible {
    outline: 3px solid #1a1a1a;
    box-shadow: 0 0 0 6px rgba(255, 255, 255, 0.9);
}

/* Filter options are now keyboard-operable (see catalog-filters.js), so
   they need a focus ring of their own - without this the fix works but is
   invisible, which is no use to a sighted keyboard user. */
.gp-facet-sidebar .facetwp-checkbox:focus-visible,
.gp-facet-sidebar .facetwp-link:focus-visible {
    outline: 3px solid var(--gp-red, #BB0027);
    outline-offset: 1px;
    border-radius: 2px;
}

/* The live region that announces result counts must be available to a
   screen reader but never visible. Clip rather than display:none, which
   would hide it from assistive technology as well. */
.screen-reader-text {
    position: absolute !important;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}

/* A drawer marked inert should not respond to a stray click either. */
.gp-facet-sidebar[inert] {
    pointer-events: none;
}

/* =====================================================================
   Layout shift on the form pages - Meticular, 15 Oct 2026
   =====================================================================
   CLS measured at ~0.91 on /contact-us/, with the same risk on the
   subscriber and catalog order forms. Two causes, both fixed here.

   1. The HubSpot form is injected by JavaScript into an empty div. Until
      it arrives the div is zero-height, so everything below it - the rest
      of the page and the whole footer - sits too high and then jumps down
      when the form renders. That is the bulk of the 0.91.

      Reserving height stops the jump. The values below are an ESTIMATE:
      HubSpot's form definition endpoint returns nothing for this form, so
      the height could not be measured from here, and there is no browser
      in this environment to render it. They are deliberately a little
      generous - a small gap under the form is a far smaller problem than
      the page lurching - and they should be tuned once somebody can
      measure the rendered height. Tune these numbers, do not remove them.

   2. Web font swap. font-display:swap keeps text visible while URW DIN
      loads, which is right, but the fallback and the real face have
      different metrics so the text reflows on arrival. Preloading the two
      woff2 files (see gp_preload_fonts in functions.php) shortens that
      window; the remaining shift is small and confined to text.
   ===================================================================== */

#hubspot-contact-form,
.gp-hubspot-form,
.hbspt-form {
    min-height: 620px;
}

@media (max-width: 782px) {
    /* Fields stack on a phone, so the same form is considerably taller. */
    #hubspot-contact-form,
    .gp-hubspot-form,
    .hbspt-form {
        min-height: 780px;
    }
}

/* Once the form is actually in the DOM, let it size itself - otherwise a
   short form leaves a permanent gap. The class is added by the embed
   itself, so this needs no JavaScript of ours. */
#hubspot-contact-form:has(form),
.gp-hubspot-form:has(form),
.hbspt-form:has(form) {
    min-height: 0;
}
.gp-pm-image-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 10px;
}
.gp-pm-image-grid .gp-pm-image { margin: 0; }
.gp-pm-image-grid img {
  width: 50%;
  aspect-ratio: 1 / 1;
  object-fit: cover;
  display: block;
}
.gp-pm-row { display: flex; gap: 30px; }
.gp-pm-row > .gp-pm-col { flex: 1; }
@media (max-width: 768px) { .gp-pm-row { flex-direction: column; }
}
/* ===== Hero banner fixes ===== */
/* 1. Phones: the "media must never push the page wider" rule
      (.gp-page-body img { height: auto }) out-ranks .gp-banner-img and
      shrinks the image, leaving a grey band. Restore the full-cover fill. */
.gp-page-body .gp-banner-img {
    height: 100%;
}
/* 2. The Grabber Difference: full-width hero like the Optimizely page,
      sitting directly under the red header. */
.page-id-5386 .gp-page-content { padding-top: 0; }
.page-id-5386 .gp-banner-hero {
    width: 100vw;
    margin-left: calc(50% - 50vw);
    margin-top: 0;
    margin-bottom: 0;
    min-height: 430px;
    border-radius: 0;
}
.page-id-5386 .gp-banner-hero .gp-banner-body {
    max-width: 1200px;
    margin: 0 auto;
    padding: 2rem 2.5rem;
    justify-content: flex-start;
}
.page-id-5386 .gp-banner-hero .gp-banner-heading { font-size: 2.6rem; }
.page-id-5386 { overflow-x: clip; }   /* 100vw includes the scrollbar; stop a sideways scroll */
/* 3. Hide the page title above the hero (still read by screen readers & Google). */
.page-id-5386 .gp-page-content > h1 {
    position: absolute;
    width: 1px;
    height: 1px;
    overflow: hidden;
    clip: rect(0 0 0 0);
    white-space: nowrap;
}
@media (max-width: 700px) {
    .page-id-5386 .gp-banner-hero { min-height: 340px; }
    .page-id-5386 .gp-banner-hero .gp-banner-heading { font-size: 1.7rem; }
    .page-id-5386 .gp-banner-hero .gp-banner-body { padding: 2rem 1.25rem; }
}
/* ===================================================================
   The Grabber Difference page
   Mirrors the Optimizely layout: centred content, image/text rows,
   grey dividers between sections, 2x2 feature grid, small product tiles.
   =================================================================== */
.gp-gd {
    max-width: 1080px;
    margin: 0 auto;
    padding: 3rem 1rem 1rem;
}
.gp-gd section {
    max-width: 880px;
    margin: 0 auto;
}
/* Grey rule between sections */
.gp-gd-divider {
    border: 0;
    border-top: 1px solid #CFCFCF;
    margin: 3.5rem 0;
}
/* Centred section heading (THE GRABBER DIFFERENCE / LET US SHOW YOU...) */
.gp-page-body .gp-gd-heading {
    text-align: center;
    font-size: 1.5rem;
    font-weight: 700;
    letter-spacing: 0.02em;
    line-height: 1.2;
    color: #212121;
    margin: 0 0 3.5rem;
}
/* Small red-ruled title, left-aligned */
.gp-page-body .gp-gd-title {
    margin: 0 0 1.25rem;
    padding: 0.55rem 0;
    border-top: 1px solid var(--gp-red, #BB0027);
    border-bottom: 1px solid var(--gp-red, #BB0027);
    text-align: left;
    text-transform: uppercase;
    letter-spacing: 0.02em;
    font-size: 0.85rem;
    font-weight: 700;
    color: #212121;
}
.gp-gd p {
    font-size: 0.9rem;
    line-height: 1.7;
    margin: 0 0 1rem;
}
.gp-gd-center { text-align: center; }
/* WordPress auto-formatting adds <br> and empty <p> tags to this markup;
   inside the grids they become extra cells, so hide them. */
.gp-gd p:empty,
.gp-gd-tiles br { display: none; }
/* Image | text row */
.gp-gd-split {
    display: flex;
    align-items: center;
    gap: 3.5rem;
}
.gp-gd-media { flex: 0 0 48%; }
.gp-gd-media-sm { flex-basis: 40%; text-align: center; }
.gp-gd-media-sm img { max-width: 280px; }
.gp-gd-text { flex: 1; min-width: 0; }
.gp-gd-media img {
    display: block;
    width: 100%;
    height: auto;
}
.gp-gd-media-sm img { margin: 0 auto; }
/* 2x2 feature grid */
.gp-gd-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 4rem 3.5rem;
    max-width: 720px;
    margin: 0 auto;
}
/* Portfolio: text left, small 2x2 product tiles right */
.gp-gd-portfolio .gp-gd-text { flex: 1 1 55%; }
.gp-gd-tiles {
    flex: 0 0 auto;
    display: grid;
    grid-template-columns: repeat(2, 120px);
    gap: 1.5rem 3rem;
}
.gp-gd-tiles img {
    display: block;
    width: 120px;
    height: 120px;
    object-fit: cover;
}
/* Phones / small tablets: stack everything */
@media (max-width: 768px) {
    .gp-gd-split { flex-direction: column; gap: 1.5rem; }
    .gp-gd-media, .gp-gd-media-sm { flex-basis: auto; width: 100%; }
    .gp-gd-grid { grid-template-columns: 1fr; gap: 2rem; }
    .gp-gd-tiles { grid-template-columns: repeat(2, 1fr); gap: 1rem; width: 100%; max-width: 320px; margin: 0 auto; }
    .gp-gd-tiles img { width: 100%; height: auto; aspect-ratio: 1 / 1; }
    .gp-gd-divider { margin: 2.5rem 0; }
    .gp-page-body .gp-gd-heading { margin-bottom: 2rem; }
}
/* Hero copy: white on the dark hero image, red accent, red CTA button.
   (The grey .gp-hero-caption colours above were for the old light video.) */
.gp-hero-caption { color: #fff; z-index: 2; max-width: 46%; }
.gp-hero-caption h1 {
    color: #fff;
    font-size: clamp(1.75rem, 2.6vw, 2.75rem);
    line-height: 1.15;
}
.gp-hero-caption .gp-red-text { color: var(--gp-red, #BB0027); }
.gp-hero-subheadline {
    margin: 0.75rem 0 1.5rem;
    color: #fff;
    font-size: 1.05rem;
}
.gp-home a.gp-hero-button,
.gp-home a.gp-hero-button:visited {
    display: inline-block;
    padding: 0.75rem 1.6rem;
    background: var(--gp-red, #BB0027);
    color: #fff;
    border: 2px solid var(--gp-red, #BB0027);
    border-radius: 2px;
    font-family: "URWDINStdBold", Arial, Helvetica, sans-serif;
    font-size: 0.85rem;
    font-weight: 700;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    text-decoration: none;
    transition: background-color 0.15s ease, border-color 0.15s ease;
}
.gp-home a.gp-hero-button:hover,
.gp-home a.gp-hero-button:focus-visible {
    background: var(--gp-red-dark, #95001F);
    border-color: var(--gp-red-dark, #95001F);
    color: #fff;
}
.gp-home a.gp-hero-button:focus-visible { outline: 3px solid #fff; outline-offset: 2px; }
@media (max-width: 767px) {
    /* Keep the copy in the black sky at the top of the portrait image. */
    .gp-hero-caption { max-width: 90%; top: 1.75rem; transform: none; }
    .gp-hero-subheadline { font-size: 0.95rem; margin-bottom: 1rem; }
}
/* ===================================================================
   Site-wide content width
   One value controls how wide the header, page content, homepage
   sections and footer are, so their left and right edges line up on
   every page. Backgrounds, banners and red rules stay full-bleed; only
   the content inside them is capped and centred.
   Change --gp-site-width to make the whole site wider or narrower.
   Every container below is border-box with 1.5rem side padding, so the
   visible content edge is the same everywhere.
   =================================================================== */
:root { --gp-site-width: 1400px; }
.gp-utility-inner,
.gp-header-inner,
.gp-footer-inner,
.site-footer .site-footer__inner,      /* footer.css loads after style.css */
.gp-page-content,
.gp-pm-page,
.gp-part-lookup,
.gp-family-index,
.gp-family-archive,
.gp-home-free,
.gp-whats-new,
.gp-resources { max-width: var(--gp-site-width); }
/* Homepage sections whose inner wrapper has no side padding of its own. */
.gp-catalog-promo-inner,
.gp-featured-grid,
.gp-application-grid { max-width: calc(var(--gp-site-width) - 3rem); }
/* Full-width hero copy on The Grabber Difference lines up with the logo. */
.page-id-5386 .gp-banner-hero .gp-banner-body { max-width: var(--gp-site-width); padding-left: 1.5rem; padding-right: 1.5rem; }
/* Phones: image rows (.gp-pm-row with a .gp-pm-image) stack.
   The 700px rule above is meant to do this, but the desktop column rules
   (2.4fr 1fr 1fr, 1.4fr 1fr, ...) use longer :has()/:not() selectors and
   out-rank it, so phones kept the 3-column desktop grid. !important is the
   only reliable way past selectors that specific. */
@media (max-width: 700px) {
    .gp-page-body .gp-pm-row:has(> .gp-pm-col > .gp-pm-image) {
        grid-template-columns: 1fr !important;
    }
    /* Text + two catalog covers: text full width, covers side by side. */
    .gp-page-body .gp-pm-row:has(> .gp-pm-col:nth-child(3) > .gp-pm-image):not(:has(> .gp-pm-col:first-child > .gp-pm-image)) {
        grid-template-columns: 1fr 1fr !important;
    }
    .gp-page-body .gp-pm-row:has(> .gp-pm-col:nth-child(3) > .gp-pm-image):not(:has(> .gp-pm-col:first-child > .gp-pm-image)) > .gp-pm-col:first-child {
        grid-column: 1 / -1;
    }
}
/* Last row: let the image fill its column like the two video rows above,
   instead of the 280px cap meant for the old square headshot. */
.gp-gd-media.gp-gd-media-sm { flex-basis: 48%; }
.gp-gd-media-sm img { max-width: 100%; }

/* Hero banner: the art is a black panel on the left (for the text) and the
   photo on the right, starting about 53% of the way across. On narrower
   screens the black panel must not show inside the photo.
   - Wide screens (over 1200px): unchanged - text on the black panel, photo
     on the right. The image is pinned to its right edge.
   - Tablets (701-1200px): text on the left half on black, the photo cropped
     to fill the right half.
   - Phones (700px and below): the photo on top, cropped to just the photo,
     full width, with the text underneath on black. */
.gp-banner-hero .gp-banner-img { object-position: right center; }

@media (max-width: 1200px) {
    .gp-page-body .gp-banner-hero {
        background: #000;
        min-height: 0;
    }
    .gp-page-body .gp-banner-hero::after { display: none; }   /* no dimming: the text is never on the photo here */
    .gp-page-body .gp-banner-hero .gp-banner-body {
        max-width: none;
        margin: 0;
    }
}

/* Tablets: side by side. */
@media (min-width: 701px) and (max-width: 1200px) {
    .gp-page-body .gp-banner-hero {
        display: block;
        position: relative;
    }
    .gp-page-body .gp-banner-hero .gp-banner-img {
        position: absolute;
        top: 0;
        right: 0;
        bottom: 0;
        left: auto;
        width: 50%;
        height: 100%;
        aspect-ratio: auto;
        max-height: none;
        object-fit: cover;
        object-position: right center;
    }
    .gp-page-body .gp-banner-hero .gp-banner-body {
        position: relative;
        width: 50%;
        min-height: 360px;
        padding: 2rem 1.75rem;
        justify-content: center;
    }
}

/* Phones: stacked, photo only. A 7:5 crop pinned to the right edge stays
   inside the photo (which is about 3:2), so no black shows at either side. */
@media (max-width: 700px) {
    .gp-page-body .gp-banner-hero {
        display: flex;
        flex-direction: column;
    }
    .gp-page-body .gp-banner-hero .gp-banner-img {
        position: static;
        width: 100%;
        height: auto;
        aspect-ratio: 7 / 5;
        max-height: none;
        object-fit: cover;
        object-position: right center;
    }
    .gp-page-body .gp-banner-hero .gp-banner-body {
        min-height: 0;
        align-self: stretch;
        padding: 1.25rem 1.25rem 1.5rem;
    }
}

/* What's New: images at 65% of their column (about a third smaller),
   centred under their text. Phones keep the full width - there the
   images are already small. Change 65% to tune: 75% = 25% smaller,
   60% = 40% smaller. */
@media (min-width: 783px) {
    .gp-whats-new-item .gp-whats-new-media {
        width: 65%;
        margin-left: auto;
        margin-right: auto;
    }
}
/* Homepage hero: always fill the full width of the banner.
   The <img> carries width="1920" from WordPress, so on screens wider than
   1920px it stopped there and the black section background showed to its
   right. Stretch it to 100% instead, and cap the height at 600px so very
   wide screens don't get a giant banner - object-fit crops the top and
   bottom rather than squashing the photo, keeping the right-hand side
   (the subject) in view. */
.gp-hero picture,
.gp-hero .gp-hero-image {
    display: block;
    width: 100%;
}
.gp-hero .gp-hero-image {
    height: auto;
    max-height: 600px;
    object-fit: cover;
    object-position: right center;
}
/* Homepage: light grey from "Search Fasteners by Application" down to the
   footer, the same #f7f7f7 as the category row and Featured Products, to
   break up the run of white. Grabber Resources is a centred box, so its grey
   is extended to the screen edges with a wide box-shadow (clip-path stops
   it spilling above or below the section). */
.gp-by-application {
    background: #f7f7f7;
}
.gp-resources {
    background: #f7f7f7;
    box-shadow: 0 0 0 100vmax #f7f7f7;
    clip-path: inset(0 -100vmax);
}

/* "Search Fasteners by Application" heading: same red lines as What's New
   and Grabber Resources - a rule above and below, the same width as those
   sections' content instead of the full width of the screen. */
.gp-by-application h2,
.gp-featured h2 {
    max-width: calc(var(--gp-site-width, 1400px) - 3rem);
    margin: 0 auto 2.5rem;
    padding: 0.75rem 0;
    border-top: 2px solid var(--gp-red, #BB0027);
    border-bottom: 2px solid var(--gp-red, #BB0027);
    font-size: 1rem;
    letter-spacing: 0.08em;
}
/* Hero banners: no dark overlay. The hero art carries its own solid black
   panel for the text, so the 50% dimming meant for text-on-photo tiles only
   darkened the photo - and only on screens wider than 1100px, since the
   stacked tablet/phone layout already drops it. */
.gp-banner-hero::after { display: none; }

/* Find Your GrabberPro: the <br> tags between the Canada / International /
   LBM buttons count as extra spacers in the row, doubling the gap. */
.gp-region-tile-grid-secondary br { display: none; }

/* Phones: centre the stacked buttons, like the region buttons above them. */
@media (max-width: 700px) {
    .gp-region-tile-grid-secondary { align-items: center; }
}

/* Dealers / Where to Buy: header image at half size (640px instead of its
   full 1280px), lined up with the left edge of the text below it.
   Smaller screens keep it at full width. For a centred image instead,
   change "margin: 0 0 1.5rem" to "margin: 0 auto 1.5rem". */
.gp-cta-image img {
    display: block;
    width: 100%;
    max-width: 640px;
    height: auto;
    margin: 0 0 1.5rem;
}
/* Spacing that the empty <p>&nbsp;</p> lines used to fake: room above and
   below the button, and a readable line length for the intro text. */
.gp-cta-content p { max-width: 70ch; }
.gp-cta-content .gp-cta-button { margin: 1.75rem 0; }

/* ===================================================================
   Literature & Resources hub
   The page's job is to route people to one of eight resource pages, so
   the resources come first as large, fully clickable cards; the help
   options sit right under them; the descriptive (SEO) copy follows.
   =================================================================== */
.gp-lit-lead {
    max-width: 70ch;
    font-size: 1.05rem;
    margin: 0 0 1.75rem;
}

.gp-lit-cards {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 1rem;
    margin: 0 0 2.5rem;
}
.gp-page-body a.gp-lit-card {
    display: flex;
    flex-direction: column;
    gap: 0.45rem;
    padding: 1.25rem 1.25rem 1.1rem;
    background: #fff;
    border: 1px solid var(--gp-border, #E6E7E8);
    border-top: 3px solid var(--gp-red, #BB0027);
    border-radius: 2px;
    /* !important: the site-wide content-link rules (red, underlined) use long
       :not() chains that out-rank anything shorter. A whole card is one link,
       so it must not inherit link styling. */
    color: #333 !important;
    text-decoration: none !important;
    transition: box-shadow 0.15s ease, border-color 0.15s ease;
}
.gp-page-body a.gp-lit-card:hover {
    box-shadow: 0 4px 14px rgba(0, 0, 0, 0.08);
    border-color: #cfcfcf;
    border-top-color: var(--gp-red, #BB0027);
}
.gp-lit-card-title {
    font-family: "URWDINStdBold", Arial, Helvetica, sans-serif;
    font-weight: 700;
    font-size: 1.05rem;
    line-height: 1.25;
    color: var(--gp-dark, #212121);
}
.gp-lit-card-text {
    font-size: 0.9rem;
    line-height: 1.5;
    flex: 1;                       /* pushes the "View" line to the bottom so cards line up */
}
.gp-lit-card-go {
    margin-top: 0.4rem;
    font-size: 0.8rem;
    font-weight: 700;
    letter-spacing: 0.03em;
    text-transform: uppercase;
    color: var(--gp-red, #BB0027);
}
.gp-page-body a.gp-lit-card:hover .gp-lit-card-go { text-decoration: underline; }

/* Help strip */
.gp-lit-help {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: 1rem 2rem;
    padding: 1.5rem 1.75rem;
    margin: 0 0 3rem;
    background: #f7f7f7;
    border-left: 4px solid var(--gp-red, #BB0027);
}
.gp-lit-help h2 { font-size: 1.2rem; margin: 0 0 0.25rem; }
.gp-lit-help p { margin: 0; }
.gp-lit-help-actions { display: flex; flex-wrap: wrap; gap: 0.75rem; }

/* Descriptive copy, below the fold on purpose */
.gp-lit-about { max-width: 75ch; }
.gp-lit-about h2 { font-size: 1.1rem; margin: 0 0 0.75rem; }
.gp-lit-about p { font-size: 0.92rem; }

@media (max-width: 1100px) {
    .gp-lit-cards { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 600px) {
    .gp-lit-lead { font-size: 1rem; margin-bottom: 1.25rem; }
    .gp-lit-cards { grid-template-columns: 1fr; gap: 0.75rem; }
    .gp-page-body a.gp-lit-card { padding: 1rem; }
    .gp-lit-card-text { font-size: 0.88rem; }
    .gp-lit-help { padding: 1.25rem; }
    .gp-lit-help-actions,
    .gp-lit-help-actions .gp-btn { width: 100%; }
}
/* Literature & Resources - fixes after review */

/* WordPress auto-formatting turns the line breaks in this page's HTML into
   <br> tags - inside each card (doubling its height) and between cards
   (where each <br> takes a grid cell). They carry no content; hide them. */
.gp-lit-cards br,
.gp-lit-help br { display: none; }

/* Keyboard users get a clear ring on each card (the browser default was a
   1px dotted line, easy to miss). */
.gp-page-body a.gp-lit-card:focus-visible {
    outline: 3px solid var(--gp-red, #BB0027);
    outline-offset: 2px;
}
/* ===================================================================
   Literature & Resources child pages (SDS, Certifications, Manuals,
   Online Training, Catalogs): one shared layout.
   Intro line -> "Find a document" search -> documents grouped in cards
   -> partner logos -> the same "Can't find a document?" help strip as the
   hub page (styled by the .gp-lit-help rules).
   =================================================================== */
.gp-docs-lead {
    max-width: 70ch;
    font-size: 1.05rem;
    margin: 0 0 1.5rem;
}

/* Search box (shown by docs-filter.js; hidden if scripts don't run) */
.gp-docs-filter {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.5rem 1rem;
    margin: 0 0 1.75rem;
}
.gp-docs-filter[hidden] { display: none; }
.gp-docs-filter label {
    font-weight: 700;
    color: var(--gp-dark, #212121);
}
.gp-docs-filter input {
    flex: 0 1 26rem;
    min-width: 0;
    padding: 0.7rem 0.9rem;
    font: inherit;
    border: 1px solid #b5b5b5;
    border-radius: 2px;
}
.gp-docs-filter input:focus-visible {
    outline: 3px solid var(--gp-red, #BB0027);
    outline-offset: 1px;
}
.gp-docs-count {
    margin: 0;
    font-size: 0.85rem;
    color: var(--gp-grey, #666);
}

/* Document groups: cards in two columns on wide screens */
.gp-docs {
    columns: 2;
    column-gap: 1.25rem;
    margin: 0 0 2.5rem;
}
.gp-docs-group {
    break-inside: avoid;
    margin: 0 0 1.25rem;
    padding: 1.1rem 1.25rem 0.6rem;
    background: #fff;
    border: 1px solid var(--gp-border, #E6E7E8);
    border-top: 3px solid var(--gp-red, #BB0027);
    border-radius: 2px;
}
.gp-docs-group[hidden] { display: none; }
.gp-page-body .gp-docs-group h2 {
    font-size: 1.05rem;
    line-height: 1.3;
    margin: 0 0 0.5rem;
    color: var(--gp-dark, #212121);
}
.gp-page-body .gp-docs-list {
    list-style: none;
    margin: 0;
    padding: 0;
}
.gp-docs-list li {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: 0.25rem 0.6rem;
    padding: 0.55rem 0;
    border-top: 1px solid var(--gp-border, #E6E7E8);
    font-size: 0.92rem;
    line-height: 1.4;
}
.gp-docs-list li:first-child { border-top: 0; }
.gp-docs-list li[hidden] { display: none; }
.gp-docs-list a { flex: 1 1 14rem; }
.gp-docs-note {
    font-size: 0.8rem;
    color: var(--gp-grey, #666);
}
/* What kind of thing opens: PDF / Video / External site */
.gp-docs-type {
    flex: 0 0 auto;
    margin-left: auto;
    padding: 0.05rem 0.45rem;
    font-size: 0.7rem;
    font-weight: 700;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    color: #555;
    background: #f1f1f1;
    border-radius: 2px;
}

.gp-docs-empty {
    padding: 1rem 1.25rem;
    margin: 0 0 2rem;
    background: #f7f7f7;
}
.gp-docs-empty[hidden] { display: none; }

/* Partner logos */
.gp-docs-partners { margin: 0 0 2.5rem; }
.gp-page-body .gp-docs-partners h2,
.gp-page-body .gp-docs-heading {
    font-size: 1.15rem;
    margin: 0 0 0.5rem;
}
.gp-docs-logos {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
    gap: 1rem;
    margin-top: 1rem;
}
.gp-docs-logos a {
    display: block;
    border: 1px solid var(--gp-border, #E6E7E8);
    border-radius: 2px;
    background: #fff;
}
.gp-docs-logos img {
    display: block;
    width: 100%;
    height: auto;
}

/* Catalogs: its own featured/grid layout, with the shared heading size */
.gp-page-body .gp-docs-heading { margin-top: 2rem; }

/* WordPress auto-formatting can add <br> tags; they carry no content here */
.gp-docs br, .gp-docs-partners br, .gp-docs-filter br, .gp-catalog-grid > br { display: none; }

@media (max-width: 900px) {
    .gp-docs { columns: 1; }
    .gp-docs-logos { grid-template-columns: repeat(4, 1fr); }
}
@media (max-width: 600px) {
    .gp-docs-lead { font-size: 1rem; }
    .gp-docs-filter input { flex-basis: 100%; }
    .gp-docs-group { padding: 1rem 1rem 0.5rem; }
	.gp-docs-logos { grid-template-columns: repeat(3, 1fr); gap: 0.6rem; }
}

/* Literature & Resources sub-navigation on phones (see lr-nav.js).
   The toggle button only exists once the script has run, so without
   JavaScript the full list still shows, exactly as before. */
.gp-lr-toggle { display: none; }

@media (max-width: 782px) {
    .gp-lr-nav.gp-lr-collapsible {
        padding: 0;
        margin-bottom: 1.5rem;
    }
    .gp-lr-toggle {
        display: flex;
        flex-direction: column;
        align-items: flex-start;
        width: 100%;
        padding: 0.8rem 3rem 0.8rem 1rem;
        position: relative;
        background: none;
        border: 0;
        text-align: left;
        font: inherit;
        color: var(--gp-dark, #1a1a1a);
        cursor: pointer;
    }
    .gp-lr-toggle-kicker {
        font-size: 0.72rem;
        text-transform: uppercase;
        letter-spacing: 0.06em;
        color: var(--gp-grey, #666);
    }
    .gp-lr-toggle-current {
        font-weight: 700;
        font-size: 0.95rem;
        line-height: 1.3;
    }
    /* Chevron: points down when closed, up when open. */
    .gp-lr-toggle::after {
        content: "";
        position: absolute;
        right: 1.2rem;
        top: 50%;
        width: 0.6rem;
        height: 0.6rem;
        border-right: 2px solid var(--gp-red, #BB0027);
        border-bottom: 2px solid var(--gp-red, #BB0027);
        transform: translateY(-70%) rotate(45deg);
    }
    .gp-lr-nav.is-open .gp-lr-toggle::after {
        transform: translateY(-30%) rotate(-135deg);
    }
    /* Astra turns every button red on hover/focus/tap; keep this one plain. */
    .gp-lr-nav .gp-lr-toggle:hover,
    .gp-lr-nav .gp-lr-toggle:focus,
    .gp-lr-nav .gp-lr-toggle:active {
        background: transparent;
        color: var(--gp-dark, #1a1a1a);
    }
    .gp-lr-toggle:focus-visible {
        outline: 3px solid var(--gp-red, #BB0027);
        outline-offset: -3px;
    }

    .gp-lr-nav.gp-lr-collapsible ul { display: none; }
    .gp-lr-nav.gp-lr-collapsible.is-open ul {
        display: block;
        padding: 0.25rem 1rem 1rem;
        border-top: 1px solid var(--gp-border, #E6E7E8);
    }
    .gp-lr-nav.gp-lr-collapsible li {
        margin: 0;
        border-bottom: 1px solid var(--gp-border, #E6E7E8);
    }
    .gp-lr-nav.gp-lr-collapsible li:last-child { border-bottom: 0; }
    /* Full-width rows give a comfortable tap target (at least 44px tall). */
    .gp-lr-nav.gp-lr-collapsible li a,
    .gp-lr-nav.gp-lr-collapsible li > span {
        display: block;
        padding: 0.7rem 0;
    }
}

/* Literature & Resources sub-navigation on phones (see lr-nav.js).
   The toggle button only exists once the script has run, so without
   JavaScript the full list still shows, exactly as before. */
.gp-lr-toggle { display: none; }

@media (max-width: 782px) {
    .gp-lr-nav.gp-lr-collapsible {
        padding: 0;
        margin-bottom: 1.5rem;
    }
    .gp-lr-toggle {
        display: flex;
        flex-direction: column;
        align-items: flex-start;
        width: 100%;
        padding: 0.8rem 3rem 0.8rem 1rem;
        position: relative;
        background: none;
        border: 0;
        text-align: left;
        font: inherit;
        color: var(--gp-dark, #1a1a1a);
        cursor: pointer;
    }
    .gp-lr-toggle-kicker {
        font-size: 0.72rem;
        text-transform: uppercase;
        letter-spacing: 0.06em;
        color: var(--gp-grey, #666);
    }
    .gp-lr-toggle-current {
        font-weight: 700;
        font-size: 0.95rem;
        line-height: 1.3;
    }
    /* Chevron: points down when closed, up when open. */
    .gp-lr-toggle::after {
        content: "";
        position: absolute;
        right: 1.2rem;
        top: 50%;
        width: 0.6rem;
        height: 0.6rem;
        border-right: 2px solid var(--gp-red, #BB0027);
        border-bottom: 2px solid var(--gp-red, #BB0027);
        transform: translateY(-70%) rotate(45deg);
    }
    .gp-lr-nav.is-open .gp-lr-toggle::after {
        transform: translateY(-30%) rotate(-135deg);
    }
    /* Astra turns every button red on hover/focus/tap; keep this one plain. */
    .gp-lr-nav .gp-lr-toggle:hover,
    .gp-lr-nav .gp-lr-toggle:focus,
    .gp-lr-nav .gp-lr-toggle:active {
        background: transparent;
        color: var(--gp-dark, #1a1a1a);
    }
    .gp-lr-toggle:focus-visible {
        outline: 3px solid var(--gp-red, #BB0027);
        outline-offset: -3px;
    }

    .gp-lr-nav.gp-lr-collapsible ul { display: none; }
    .gp-lr-nav.gp-lr-collapsible.is-open ul {
        display: block;
        padding: 0.25rem 1rem 1rem;
        border-top: 1px solid var(--gp-border, #E6E7E8);
    }
    .gp-lr-nav.gp-lr-collapsible li {
        margin: 0;
        border-bottom: 1px solid var(--gp-border, #E6E7E8);
    }
    .gp-lr-nav.gp-lr-collapsible li:last-child { border-bottom: 0; }
    /* Full-width rows give a comfortable tap target (at least 44px tall). */
    .gp-lr-nav.gp-lr-collapsible li a,
    .gp-lr-nav.gp-lr-collapsible li > span {
        display: block;
        padding: 0.7rem 0;
    }
}

/* ===================================================================
   Sustainable Construction - LEED
   Uses the shared Literature page styles (.gp-docs-*, .gp-lit-help);
   these rules add the key-facts strip, product cards and commitment block.
   =================================================================== */
.gp-page-body .gp-leed-facts {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 1rem;
    list-style: none;
    margin: 0 0 2.5rem;
    padding: 0;
}
.gp-leed-facts li {
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
    margin: 0;
    padding: 1.1rem 1.25rem;
    background: #f7f7f7;
    border-left: 4px solid var(--gp-red, #BB0027);
}
.gp-leed-fact-num {
    font-family: "URWDINStdBold", Arial, Helvetica, sans-serif;
    font-weight: 700;
    font-size: 1.5rem;
    line-height: 1.1;
    color: var(--gp-dark, #212121);
}
.gp-leed-fact-text { font-size: 0.9rem; line-height: 1.45; }

.gp-leed-products {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 1.25rem;
    margin: 0 0 2.5rem;
}
.gp-leed-product {
    display: flex;
    gap: 1.25rem;
    align-items: flex-start;
    padding: 1.25rem;
    background: #fff;
    border: 1px solid var(--gp-border, #E6E7E8);
    border-top: 3px solid var(--gp-red, #BB0027);
}
.gp-leed-product-img { flex: 0 0 34%; }
.gp-leed-product-img img { display: block; width: 100%; height: auto; }
.gp-leed-product-body { min-width: 0; }
.gp-page-body .gp-leed-product h3 { font-size: 1.05rem; line-height: 1.3; margin: 0 0 0.5rem; }
.gp-leed-code { font-size: 0.8rem; color: var(--gp-grey, #666); white-space: nowrap; }
.gp-leed-product p { font-size: 0.92rem; }
.gp-leed-product-links {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.75rem 1.25rem;
    margin: 0.75rem 0 0;
}

.gp-leed-commit {
    display: grid;
    grid-template-columns: 1fr 320px;
    gap: 2rem;
    align-items: start;
    margin: 0 0 2.5rem;
}
.gp-leed-commit-text { max-width: 75ch; }
.gp-leed-commit ul { margin: 0 0 0 1.25rem; padding: 0; }
.gp-leed-commit li { margin: 0 0 0.4rem; }
.gp-leed-commit-img img { display: block; width: 100%; height: auto; }

/* WordPress auto-formatting can add <br> tags; they carry no content here */
.gp-leed-facts br, .gp-leed-products br, .gp-leed-commit br { display: none; }

@media (max-width: 900px) {
    .gp-leed-products { grid-template-columns: 1fr; }
    .gp-leed-commit { grid-template-columns: 1fr; }
    .gp-leed-commit-img { display: none; }   /* decorative; keeps the page short on phones */
}
@media (max-width: 700px) {
    .gp-page-body .gp-leed-facts { grid-template-columns: 1fr; gap: 0.6rem; }
    .gp-leed-facts li { flex-direction: row; align-items: baseline; gap: 0.75rem; padding: 0.85rem 1rem; }
    .gp-leed-fact-num { font-size: 1.15rem; flex: 0 0 auto; }
}
@media (max-width: 480px) {
    .gp-leed-product { flex-direction: column; }
    .gp-leed-product-img { flex: none; width: 60%; }
}

/* Homepage hero on phones: copy above the photo, not on top of it.
   Overlaid on the portrait image, the copy only fit in the black area at
   the top while the headline stayed on two lines; on narrow phones (or with
   larger text settings) it wrapped and the button landed on the worker's
   face. Stacked, the two can never collide. The photo below is cropped to
   its lower part, since its black top area is no longer needed behind the text. */
@media (max-width: 767px) {
    .gp-hero { display: flex; flex-direction: column; }
    .gp-hero-caption {
        position: static;
        order: -1;
        max-width: none;
        transform: none;
        padding: 1.5rem 1rem 1.75rem;
    }
    .gp-hero .gp-hero-image {
        aspect-ratio: 7 / 5;
        height: auto;
        object-fit: cover;
        object-position: center bottom;
    }
}
/* Tablets: the wide banner is only ~240-340px tall here, so centre the copy
   vertically instead of placing it at 40%, which pushed the headline up
   against the top edge. */
@media (min-width: 768px) and (max-width: 1100px) {
    .gp-hero-caption { top: 50%; }
}
//* TrueShear product page. Scoped to .gp-ts-* so other products are unaffected. */
.gp-product-description .gp-ts-lead { font-size: 1.05rem; max-width: 70ch; }
.gp-product-description .gp-ts-actions { display: flex; flex-wrap: wrap; gap: 0.75rem; margin: 1.25rem 0 2rem; }
.gp-product-description h2 { font-size: 1.25rem; margin: 2rem 0 0.75rem; }
.gp-ts-benefits { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1rem; margin: 0 0 1.25rem; }
.gp-ts-benefits > div { padding: 1rem 1.15rem; background: #f7f7f7; border-top: 3px solid var(--gp-red, #BB0027); }
.gp-product-description .gp-ts-benefits h3 { font-size: 1rem; margin: 0 0 0.5rem; }
.gp-ts-benefits ul { margin: 0 0 0 1.1rem; padding: 0; font-size: 0.92rem; }
.gp-ts-benefits li { margin: 0 0 0.35rem; }
.gp-ts-table-wrap { overflow-x: auto; margin: 0 0 1rem; }
.gp-ts-table { width: 100%; border-collapse: collapse; font-size: 0.92rem; }
.gp-ts-table th, .gp-ts-table td { padding: 0.6rem 0.8rem; text-align: left; border-bottom: 1px solid var(--gp-border, #E6E7E8); vertical-align: top; }
.gp-ts-table thead th { background: #555; color: #fff; font-weight: 700; }
.gp-ts-table tbody th { font-weight: 700; width: 32%; background: #f7f7f7; }
.gp-product-description .gp-ts-note { font-size: 0.88rem; color: var(--gp-grey, #666); }
.gp-ts-notes { margin: 0 0 1rem 1.1rem; padding: 0; font-size: 0.92rem; }
.gp-product-description .gp-ts-warning { padding: 0.85rem 1.1rem; background: #fff7e0; border-left: 4px solid #e0a800; font-size: 0.92rem; }
.gp-ts-safety { padding: 1rem 1.25rem; background: #f7f7f7; border-left: 4px solid var(--gp-red, #BB0027); font-size: 0.92rem; }
.gp-ts-safety ul { margin: 0.5rem 0 0 1.1rem; padding: 0; }
.gp-ts-safety li { margin: 0 0 0.3rem; }
.gp-product-description .gp-lit-help { margin: 2rem 0 0; }
.gp-product-description br { display: none; }
@media (max-width: 900px) { .gp-ts-benefits { grid-template-columns: 1fr; } }
@media (max-width: 600px) {
    .gp-product-description .gp-ts-actions .gp-btn { width: 100%; text-align: center; }
    .gp-ts-table th, .gp-ts-table td { padding: 0.5rem 0.6rem; }
    .gp-ts-table tbody th { width: auto; }
}

/* Buttons: the site's .gp-btn colours are scoped to .gp-page-body, which the
   product template doesn't use, so buttons here would show as plain links. */
.gp-product-description a.gp-btn {
    display: inline-block;
    padding: 0.75rem 1.5rem;
    border: 2px solid var(--gp-red, #BB0027);
    border-radius: 2px;
    font-family: "URWDINStdBold", Arial, Helvetica, sans-serif;
    font-size: 0.85rem;
    font-weight: 700;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    text-decoration: none;
    text-align: center;
}
.gp-product-description a.gp-btn-primary { background: var(--gp-red, #BB0027); color: #fff; }
.gp-product-description a.gp-btn-primary:hover,
.gp-product-description a.gp-btn-primary:focus-visible { background: var(--gp-red-dark, #95001F); border-color: var(--gp-red-dark, #95001F); color: #fff; }
.gp-product-description a.gp-btn-outline { background: transparent; color: var(--gp-grey, #444); border-color: var(--gp-grey, #444); }
.gp-product-description a.gp-btn-outline:hover,
.gp-product-description a.gp-btn-outline:focus-visible { background: var(--gp-grey, #444); color: #fff; }
.gp-product-description .gp-lit-help-actions { display: flex; flex-wrap: wrap; gap: 0.75rem; }

/* Demo request form: the Request a demo buttons jump here. The scroll margin
   keeps the heading clear of the sticky header. The form's reserved height
   (so the page doesn't jump while HubSpot loads) comes from the existing
   .gp-hubspot-form rules. */
.gp-product-description #request-demo { scroll-margin-top: 7rem; }
.gp-ts-form { max-width: 720px; margin: 0 0 1rem; }

/* Part-number and connection lists (used on the TrueFramer page too) */
.gp-product-description .gp-ts-parts {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(11rem, 1fr));
    gap: 0.5rem 0.75rem;
    list-style: none;
    margin: 0 0 1rem;
    padding: 0;
}
.gp-product-description .gp-ts-parts-wide { grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr)); }
.gp-ts-parts li {
    margin: 0;
    padding: 0.5rem 0.75rem;
    background: #f7f7f7;
    border-left: 3px solid var(--gp-red, #BB0027);
    font-size: 0.92rem;
}
.gp-product-description h3 { font-size: 1rem; margin: 1.25rem 0 0.5rem; }

