@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@400;500;600;700&display=swap');
/* IMSI Design overrides — loaded by Helix3 after template.css */

/* The logo is sized in ONE place - search "THE logo size" below. Three separate
   caps used to live in this file (30px here, 26px in the header block, 22px in
   the responsive block) and which one won depended on source order, so the
   rendered size kept coming out wrong. */
#sp-header .logo a { display: inline-flex; align-items: center; }

/* ==========================================================================
   Footer — one module per column (bottom1..bottom4) + legal bar (footer1)
   ========================================================================== */
#sp-bottom { background: #081115; padding: 62px 0 34px; }
#sp-bottom .sp-module { margin-bottom: 0; }

.imsi-fbrand .imsi-flogo { max-width: 200px; height: auto; margin-bottom: 18px; }
.imsi-fbrand p { font-size: 13.5px; line-height: 1.65; color: #7E939E; margin: 0; }

.imsi-fcol h4 {
  font-family: IBM Plex Mono, SFMono-Regular, Consolas, monospace;
  font-size: 11.5px; letter-spacing: 0.16em; text-transform: uppercase;
  color: #FFFFFF; margin: 0 0 14px; font-weight: 500;
}
ul.imsi-flinks { list-style: none; margin: 0; padding: 0; }
ul.imsi-flinks li { margin: 0; }
ul.imsi-flinks a { color: #93A6B0; font-size: 13.5px; line-height: 2.05; text-decoration: none; }
ul.imsi-flinks a:hover { color: #22A9E1; }

#sp-footer { background: #081115; padding: 0 0 40px; }
#sp-footer .container-inner { border-top: 1px solid rgba(255,255,255,0.08); padding-top: 24px; }
.imsi-flegal { display: flex; align-items: center; justify-content: space-between;
  gap: 24px; flex-wrap: nowrap; }       /* one row: copyright left, legal links right */
.imsi-flegal-links { flex-shrink: 0; white-space: nowrap; }
.imsi-flegal span { font-size: 12.5px; color: #5C7480; }
.imsi-flegal-links a { color: #8FA3AD; font-size: 12px; margin-left: 24px; text-decoration: none; }
.imsi-flegal-links a:first-child { margin-left: 0; }
.imsi-flegal-links a:hover { color: #22A9E1; }

/* Flex ships its own copyright line; the Legal module replaces it */
#sp-footer .sp-copyright, #sp-footer .footer1 .sp-module + .sp-copyright { display: none; }

@media (max-width: 768px) {
  #sp-bottom { padding: 44px 0 24px; }
  #sp-bottom .sp-module { margin-bottom: 28px; }
  .imsi-flegal { flex-direction: column; align-items: flex-start; gap: 12px; flex-wrap: wrap; }
  .imsi-flegal-links { white-space: normal; }
  .imsi-flegal-links a { margin: 0 18px 0 0; }
}

/* Flex renders its own copyright line; the Footer - Legal module replaces it */
.sp-copyright { display: none !important; }

/* ==========================================================================

/* ==========================================================================
   Header — transparent, overlaid on the hero
   The hero is dark on every page, so the header sits on top of it rather than
   forming a separate grey band above it.

   TWO THINGS FIGHT US HERE, and the earlier version of this file lost to both:

   1. The logo lives in #sp-logo, NOT in "#sp-header .logo". template.css ships
      `#sp-logo .sp-default-logo { max-height: 100% }` at specificity (1,1,0),
      which beat every `.sp-default-logo` rule written here. The logo rendered
      at its natural 2x size - 500x56 - overflowed its 190px column by 310px
      and covered the first menu item.
   2. Helix3 writes `#sp-header, .transparent-wrapper { height: 90px }` into an
      inline <style> in <head>, after this file. Same specificity, later in the
      cascade, so it wins without !important.

   Hence: target #sp-logo, and mark !important where an inline rule is the
   opponent. Do not "simplify" these selectors.
   ========================================================================== */
#sp-header,
.transparent-wrapper {
  height: 78px !important;
}
#sp-header {
  position: absolute !important;
  top: 0; left: 0; right: 0;
  width: 100%;
  background: transparent !important;
  box-shadow: none !important;
  border-bottom: 0 !important;
  z-index: 99;
}

/* --- logo ---------------------------------------------------------------
   The asset is 1250x140 (a 2x export). At 26px tall it lays out 232px wide,
   so the logo column is widened to 250px to hold it without overlapping the
   nav. Both numbers move together - change one, check the other. */
/* ---- THE logo size. One rule, deliberately. ----------------------------
   The asset is a 2x export at 500x56. At 20px tall it lays out ~179px wide,
   comfortably inside the 250px logo column set below. Nothing else in this
   file may set max-height on the logo - three competing caps is what made the
   size unpredictable. */
#sp-logo .sp-default-logo,
#sp-logo .sp-sticky-logo,
#sp-logo .sp-retina-logo,
#sp-logo .logo a img,
#sp-header .sp-default-logo,
#sp-header .sp-sticky-logo,
#sp-header .sp-retina-logo,
#sp-header .logo a img {
  max-height: 20px !important;
  max-width: 100% !important;
  height: auto !important;
  width: auto !important;
}
#sp-logo,
#sp-header .logo {
  height: 78px !important;
  display: flex !important;
  align-items: center;
}
#sp-header .row > [class*="col-lg-2"] {
  flex: 0 0 250px !important;
  max-width: 250px !important;
  width: 250px !important;
}
#sp-header .row > [class*="col-lg-10"] {
  flex: 0 0 calc(100% - 250px) !important;
  max-width: calc(100% - 250px) !important;
  width: calc(100% - 250px) !important;
}

/* --- nav ---------------------------------------------------------------- */
/* Height comes from a flex box, not from line-height.
   These links used to carry line-height:78px to fill the header. An
   inline-block sized that way is 78px only when it contains nothing but text -
   the dropdown caret adds a second inline box, so the link measured 90px, the
   menu column hung 12px below the 78px header, and the wordmark looked 6px
   high beside it. A flex box with an explicit height centres its content and
   cannot be stretched by a child. */
#sp-header .sp-megamenu-parent > li > a,
#sp-header .sp-megamenu-parent > li > span {
  color: #DCE6EB !important;
  font-family: 'IBM Plex Sans', system-ui, sans-serif;
  font-size: 14.5px; font-weight: 500;
  display: inline-flex !important; align-items: center;
  height: 78px; line-height: 1.2 !important;
}
#sp-header .sp-megamenu-parent > li {
  line-height: 1.2 !important; display: flex; align-items: center;
}
#sp-header .sp-megamenu-parent > li > a:hover,
#sp-header .sp-megamenu-parent > li.active > a {
  color: #22A9E1 !important;
}
#sp-header .sp-megamenu-parent .sp-dropdown li.sp-menu-item > a { color: #31424C; }
#sp-header .sp-megamenu-parent .sp-dropdown li.sp-menu-item > a:hover { color: #095377; }

/* the sticky clone needs a real ground once it leaves the hero */
.sticky-header #sp-header.menu-fixed,
#sp-header.header-sticky,
#sp-header.sticky {
  position: fixed !important;
  background: rgba(12, 20, 24, 0.94) !important;
  backdrop-filter: saturate(140%) blur(10px);
  -webkit-backdrop-filter: saturate(140%) blur(10px);
  border-bottom: 1px solid rgba(255,255,255,0.08) !important;
}

/* the hero now sits under the header, so it carries the offset */
.sppb-section.imsi-hero { padding-top: 150px !important; }

@media (max-width: 991.98px) {
  #sp-header, .transparent-wrapper { height: 68px !important; }
  #sp-logo, #sp-header .logo { height: 68px !important; }
  #sp-header .sp-megamenu-parent > li > a,
  #sp-header .sp-megamenu-parent > li > span { height: 68px; }
  .sppb-section.imsi-hero { padding-top: 112px !important; }
  #sp-header .row > [class*="col-lg-2"],
  #sp-header .row > [class*="col-lg-10"] {
    flex: 0 0 auto !important; max-width: none !important; width: auto !important;
  }
}

/* ==========================================================================
   VirtueMart views
   The header is positioned absolutely so it can sit on top of a dark hero.
   Store pages have no hero, so on those the header must become a solid bar in
   normal flow again - otherwise it floats over the first rows of the product
   grid. Joomla stamps the component on <body>, which is what we key off.
   ========================================================================== */
/* The header is absolutely positioned so it can sit on top of a dark hero, and
   every SP Page Builder page pays for that with `padding-top: 150px` on its
   hero. Pages that are NOT page-builder pages have no hero to carry the offset,
   so the header simply covered their first 78px: on /blog the <h1> started at
   y=59 and its top third was hidden behind the menu bar.
   The store was already handled; com_content - the blog list, every article,
   search results - was not. */
body.com-virtuemart #sp-header,
body.com-content #sp-header {
  position: relative !important;
  background: #0C1418 !important;
}
/* Same problem, third case: the per-edition product detail pages ARE page
   builder pages, but they open on a light breadcrumb band instead of a dark
   hero. The overlaying header then put a WHITE wordmark and cyan nav links on
   a #F6F5F2 band - the logo read as a faint smudge. They are the only pages
   whose first row is .imsi-crumb-row, so that is the selector; :has() is
   already relied on for the Products panel width below. */
body:has(.imsi-crumb-row) #sp-header,
body:has(.imsi-lic-panel) #sp-header {
  position: relative !important;
  background: #0C1418 !important;
}
/* The licences panel renders in above-component, so it IS the first thing on
   the account page - there is no hero under the overlaying header, and the
   heading landed behind the menu bar. Same treatment, same reason. */
body:has(.imsi-lic-panel) #sp-main-body { padding-top: 0; }
body.com-virtuemart #sp-main-body,
body.com-content #sp-main-body { padding-top: 42px; }
body.com-virtuemart .sppb-section.imsi-hero,
body.com-content .sppb-section.imsi-hero { padding-top: 0 !important; }

/* --- store chrome -------------------------------------------------------- */
body.com-virtuemart #sp-main-body {
  background: #F6F5F2;
  padding-bottom: 72px;
}
body.com-virtuemart .category-view h1,
body.com-virtuemart .productdetails-view h1 {
  font-family: 'Archivo', 'Helvetica Neue', Helvetica, Arial, sans-serif;
  font-size: clamp(26px, 2.6vw, 36px); font-weight: 700; color: #14212A;
  letter-spacing: -0.02em; margin: 0 0 14px;
}
body.com-virtuemart .category_description,
body.com-virtuemart .vm-category-description {
  max-width: 760px; font-size: 15.5px; line-height: 1.62; color: #5C6E79;
  margin-bottom: 30px;
}

/* product cards in a browse grid */
body.com-virtuemart .vm-product-container,
body.com-virtuemart .product {
  background: #FFFFFF; border: 1px solid #E2E1DC; border-radius: 4px;
  padding: 18px; height: 100%;
}
body.com-virtuemart .vm-product-media-container img,
body.com-virtuemart .browseProductImage {
  width: 100%; height: auto; border-radius: 3px;
}
body.com-virtuemart .vm-product-descr-container-1 h2,
body.com-virtuemart .vm-product-descr-container-1 a {
  font-size: 16px; font-weight: 600; color: #14212A; line-height: 1.35;
  text-decoration: none;
}
body.com-virtuemart .vm-product-descr-container-1 a:hover { color: #095377; }
body.com-virtuemart .product-price,
body.com-virtuemart .PricesalesPrice {
  font-family: 'IBM Plex Mono', SFMono-Regular, Consolas, monospace;
  font-size: 17px; font-weight: 600; color: #14212A;
}
body.com-virtuemart .product-short-description {
  font-size: 13.5px; line-height: 1.55; color: #5C6E79;
}

/* buttons */
body.com-virtuemart .addtocart-button,
body.com-virtuemart input.addtocart-button,
body.com-virtuemart .vm-btn,
body.com-virtuemart .product-details {
  background: #22A9E1; border: 0; color: #FFFFFF;
  font-family: 'IBM Plex Sans', system-ui, sans-serif;
  font-size: 14px; font-weight: 600; padding: 10px 18px; border-radius: 3px;
  cursor: pointer; text-decoration: none; display: inline-block;
}
body.com-virtuemart .addtocart-button:hover,
body.com-virtuemart input.addtocart-button:hover { background: #1B8FC0; }

/* the "What's included" list on a product page */
.imsi-pd-includes { list-style: none; margin: 8px 0 18px; padding: 0; }
.imsi-pd-includes li {
  position: relative; padding-left: 22px; margin-bottom: 7px;
  font-size: 14.5px; line-height: 1.5; color: #31424C;
}
.imsi-pd-includes li:before {
  content: "\f00c"; font-family: "Font Awesome 6 Free"; font-weight: 900;
  position: absolute; left: 0; top: 1px; font-size: 11px; color: #22A9E1;
}
.imsi-pd-meta {
  font-family: 'IBM Plex Mono', SFMono-Regular, Consolas, monospace;
  font-size: 11.5px; letter-spacing: 0.04em; color: #7E939E;
  border-top: 1px solid #E2E1DC; padding-top: 12px; margin-top: 18px;
}
body.com-virtuemart .productdetails-view h4 {
  font-family: 'Archivo', sans-serif; font-size: 15px; font-weight: 700;
  color: #14212A; margin: 22px 0 8px;
}

/* --- footer links ---------------------------------------------------------
   Helix3 styles #sp-bottom list items with its own colour and a bottom border.
   Ours lost the cascade, so the links rendered near-black on near-black with a
   rule under each one - they read as a column of blank lines, which is exactly
   what they looked like in the screenshot.                                  */
#sp-bottom ul.imsi-flinks li,
#sp-bottom ul.imsi-flinks {
  border: 0 !important;
  list-style: none !important;
  margin: 0 !important;
  padding: 0 !important;
  background: none !important;
}
#sp-bottom ul.imsi-flinks li a,
#sp-bottom .imsi-fcol ul li a {
  color: #A8BAC4 !important;
  font-size: 13.5px !important;
  line-height: 2.05 !important;
  text-decoration: none !important;
  border: 0 !important;
  display: inline-block;
  padding: 0 !important;
}
#sp-bottom ul.imsi-flinks li a:hover,
#sp-bottom .imsi-fcol ul li a:hover { color: #22A9E1 !important; }
#sp-bottom .imsi-fbrand p { color: #93A6B0 !important; }
#sp-bottom .imsi-fcol h4 { color: #FFFFFF !important; }
/* ==========================================================================
   VirtueMart product page
   ========================================================================== */
body.com-virtuemart .productdetails-view { max-width: 1140px; margin: 0 auto; }
body.com-virtuemart .product-price {
  text-align: left !important;
}
body.com-virtuemart .productdetails .vm-product-media-container img,
body.com-virtuemart .productdetails-view .additional-images img {
  background: #FFFFFF; border: 1px solid #E2E1DC; border-radius: 4px;
  padding: 10px;
}
/* the quantity control shipped as three stacked unstyled boxes */
body.com-virtuemart .quantity-box input.quantity-input {
  width: 56px; height: 40px; text-align: center; font-size: 14px;
  border: 1px solid #D8D6D0; border-radius: 3px; background: #FFFFFF;
}
body.com-virtuemart .quantity-controls.vm2-add,
body.com-virtuemart .quantity-controls.vm2-minus { display: none; }
body.com-virtuemart .addtocart-area,
body.com-virtuemart .addtocart-bar {
  display: flex; align-items: center; gap: 12px;
  border: 0 !important; padding: 0 !important; margin: 18px 0 0 !important;
}
body.com-virtuemart .product-fields,
body.com-virtuemart .vm-customfields-wrap { margin-top: 14px; }
/* the previous/next arrows rendered as two grey blocks */
body.com-virtuemart .product-neighbours { display: none; }
body.com-virtuemart .back-to-category a {
  color: #0A5C82 !important; font-size: 13.5px; text-decoration: none;
}
body.com-virtuemart .back-to-category a:hover { color: #22A9E1 !important; }
body.com-virtuemart .product-short-description {
  font-size: 15.5px; line-height: 1.6; color: #31424C; margin: 10px 0 0;
}
/* the option table inside a product description */
table.imsi-pd-options { width: 100%; border-collapse: collapse; margin: 8px 0 18px; max-width: 520px; }
table.imsi-pd-options td { padding: 9px 0; font-size: 14px; border-bottom: 1px solid #EDEBE6; }
table.imsi-pd-options td:last-child {
  text-align: right; white-space: nowrap;
  font-family: 'IBM Plex Mono', monospace; color: #14212A;
}
table.imsi-pd-options td a { color: #0A5C82; text-decoration: none; }
table.imsi-pd-options td a:hover { color: #22A9E1; text-decoration: underline; }
table.imsi-pd-options tr:last-child td { border-bottom: 0; }

/* ==========================================================================
   Footer on light-background pages
   The footer rules assumed #sp-bottom paints dark. On the VirtueMart views the
   band came through light, so pale-grey link text sat on a pale ground and was
   unreadable. Paint the ground on the wrapper too.
   ========================================================================== */
#sp-bottom,
#sp-bottom-wrapper,
.sp-bottom,
body.com-virtuemart #sp-bottom { background-color: #081115 !important; }
#sp-footer, body.com-virtuemart #sp-footer { background-color: #081115 !important; }
#sp-bottom .imsi-fcol h4 { color: #FFFFFF !important; }

/* --- VirtueMart buy area, measured against the real markup ----------------
   The buy block is .spacer-buy-area > .addtocart-area > .product >
   .addtocart-bar.mx-auto. Bootstrap's mx-auto centres it under a left-aligned
   heading and price, and VirtueMart's hidden form fields render as a stack of
   small empty boxes beside the quantity input because nothing declares them
   hidden.                                                                   */
body.com-virtuemart .product-price,
body.com-virtuemart .PricesalesPrice { text-align: left !important; }
body.com-virtuemart .product-price {
  font-family: 'Archivo', 'Helvetica Neue', Helvetica, Arial, sans-serif;
  font-size: 30px !important; font-weight: 700; color: #14212A;
  margin: 4px 0 0 !important;
}
body.com-virtuemart .addtocart-bar.mx-auto,
body.com-virtuemart .addtocart-bar {
  margin-left: 0 !important; margin-right: 0 !important;
  display: flex !important; align-items: center; gap: 12px;
  border: 0 !important; padding: 0 !important;
}
body.com-virtuemart .addtocart-area {
  border: 1px solid #E2E1DC; border-radius: 4px; background: #FFFFFF;
  padding: 18px !important; margin-top: 18px !important;
}
/* every input in the buy area that is not the visible quantity field */
body.com-virtuemart .addtocart-area input[type="hidden"],
body.com-virtuemart .addtocart-area > input,
body.com-virtuemart .product.js-recalculate > input:not(.quantity-input) {
  display: none !important;
}
body.com-virtuemart input.quantity-input {
  width: 58px !important; height: 42px !important; text-align: center;
  border: 1px solid #D8D6D0 !important; border-radius: 3px; background: #FFF;
  font-size: 14px;
}
body.com-virtuemart .addtocart-button,
body.com-virtuemart input.addtocart-button {
  height: 42px; padding: 0 24px !important; font-size: 14.5px;
}
/* prev/next arrows rendered as two empty grey blocks */
body.com-virtuemart .product-neighbours,
body.com-virtuemart .previous-page,
body.com-virtuemart .next-page { display: none !important; }

body.com-virtuemart .productdetails-view h1,
body.com-virtuemart .product-title {
  font-family: 'Archivo', 'Helvetica Neue', Helvetica, Arial, sans-serif;
  font-size: clamp(24px, 2.4vw, 32px) !important; font-weight: 700;
  color: #14212A; letter-spacing: -0.02em; margin: 0 0 6px !important;
}
body.com-virtuemart .vm-product-details-container { padding-left: 26px; }
@media (max-width: 768px) {
  body.com-virtuemart .vm-product-details-container { padding-left: 0; }
}

/* --- buy area, corrected against the measured DOM -------------------------
   Two things the first pass guessed wrong:
   * the quantity steppers are .quantity-plus / .quantity-minus, not the
     .vm2-add / .vm2-minus I assumed. They render as two 20x16 unstyled boxes
     stacked UNDER the quantity field, which is what made the bar 80px tall.
     Licence quantities are practically always 1, so the steppers go and the
     number field stays.
   * the price span is centred by its wrapper (a div that also carries
     .PricesalesPrice), not by text-align on the span, so the alignment has to
     be reset on the wrapper chain.                                          */
body.com-virtuemart .product-price,
body.com-virtuemart .product-price *,
body.com-virtuemart .vm-price-value,
body.com-virtuemart div.PricesalesPrice {
  text-align: left !important;
  margin-left: 0 !important;
  margin-right: 0 !important;
  float: none !important;
}
body.com-virtuemart span.PricesalesPrice {
  display: inline-block;
  font-family: 'Archivo', 'Helvetica Neue', Helvetica, Arial, sans-serif;
  font-size: 30px; font-weight: 700; color: #14212A; letter-spacing: -0.01em;
}
body.com-virtuemart .quantity-controls,
body.com-virtuemart input.quantity-plus,
body.com-virtuemart input.quantity-minus,
body.com-virtuemart .quantity-controls.js-recalculate { display: none !important; }
body.com-virtuemart span.calculate,
body.com-virtuemart span.quantity-box { display: inline-flex !important; align-items: center; }
body.com-virtuemart .addtocart-bar { align-items: center !important; }

/* --- footer legal line --------------------------------------------------- */
.imsi-flegal span { color: #8FA3AD !important; }           /* 7.27 on #081115 */
.imsi-flegal-links a { color: #A8BAC4 !important; }        /* 9.52 */
.imsi-flegal-links a:hover { color: #22A9E1 !important; }


/* ==========================================================================
   Dropdown menu
   Helix3's dropdown ships with generous padding on each row, so a five-item
   Products menu ran taller than it needed to. Tightened, given a real surface,
   and the panel carries a small promo banner at the foot.
   ========================================================================== */
#sp-header .sp-megamenu-parent .sp-dropdown {
  padding-top: 0 !important;
}
#sp-header .sp-megamenu-parent .sp-dropdown .sp-dropdown-inner {
  background: #FFFFFF !important;
  border: 1px solid #E2E1DC !important;
  border-radius: 4px !important;
  box-shadow: 0 14px 40px rgba(8,17,21,0.18) !important;
  padding: 8px !important;
  min-width: 232px;
}
#sp-header .sp-megamenu-parent .sp-dropdown li.sp-menu-item {
  margin: 0 !important;
  border: 0 !important;
}
#sp-header .sp-megamenu-parent .sp-dropdown li.sp-menu-item > a {
  display: block;
  padding: 8px 12px !important;
  line-height: 1.35 !important;
  height: auto !important;
  font-size: 14px !important;
  font-family: 'IBM Plex Sans', system-ui, sans-serif;
  color: #31424C !important;
  border-radius: 3px;
  white-space: nowrap;
}
#sp-header .sp-megamenu-parent .sp-dropdown li.sp-menu-item > a:hover {
  background: #F2FAFE !important;
  color: #095377 !important;
}
#sp-header .sp-megamenu-parent .sp-dropdown li.sp-menu-item.active > a {
  color: #0A5C82 !important;
  font-weight: 600;
}


/* Top-level items. There are nine of them; at 13px a side the row measured
   848px and finished flush with the container's right edge, with no slack at
   all - which is what read as "too far apart" and what would have wrapped at
   the next size down. 10px a side gives back 54px. */
#sp-header .sp-megamenu-parent > li > a {
  padding: 0 10px !important;
}
@media (max-width: 1200px) {
  #sp-header .sp-megamenu-parent > li > a { padding: 0 7px !important; font-size: 13.5px; }
}


/* ==========================================================================
   Typeface
   The Flex template ships Open Sans, which is soft next to Archivo's headings
   and thin at small sizes on the dark bands. Body copy was moved to Inter, and
   is now IBM Plex Sans.

   Why Plex rather than Inter: the site already uses IBM Plex Mono for every
   label, SKU and figure, and Plex Sans is the same family - the same skeleton,
   the same numerals, drawn to sit together. Inter is an excellent UI face but
   it is a stranger to the mono next to it, and on a page that alternates prose
   with part numbers and prices that mismatch shows. Plex Sans also reads as
   engineered rather than as app chrome, which suits a CAD company better.

   Archivo stays for display; IBM Plex Mono stays for labels and figures.

   Loaded with display=swap so text renders in the fallback immediately rather
   than blocking on the web font.
   ========================================================================== */

:root {
  --imsi-sans: 'IBM Plex Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
  --imsi-display: 'Archivo', 'Helvetica Neue', Helvetica, Arial, sans-serif;
  --imsi-mono: 'IBM Plex Mono', SFMono-Regular, Consolas, 'Liberation Mono', monospace;
}

body,
body.site,
#sp-main-body,
.sppb-section,
.sppb-addon-text,
.sppb-addon-text-block,
p, li, td, th, label, input, select, textarea, button, figcaption, blockquote {
  font-family: var(--imsi-sans);
}

/* Plex Sans, like Inter before it, sets a touch loose at display sizes -
   tighten the big text and leave body copy alone. */
.imsi-h1 .sppb-addon-title,
.imsi-h2 .sppb-addon-title,
.imsi-cmp-head h3,
.imsi-upgblock-copy h3,
article.imsi-featcard h4,
.imsi-post-title,
.imsi-ed-name .sppb-addon-title,
.imsi-lic-title .sppb-addon-title,
.imsi-uf-price,
.imsi-uf-cardprice,
.imsi-cmp-ed,
.imsi-cmp-price {
  font-family: var(--imsi-display);
  font-feature-settings: "kern" 1, "liga" 1;
}

.imsi-eyebrow .sppb-addon-title,
.imsi-stat-label,
.imsi-post-meta,
.imsi-featcard-scope,
.imsi-uf-tier,
.imsi-uf-sku,
.imsi-pd-meta,
.imsi-shot-tag,
table.imsi-ptable th,
table.imsi-optmatrix th,
table.imsi-cmptable thead th .imsi-cmp-sub {
  font-family: var(--imsi-mono);
}

/* numerals in tables should line up column to column */
table.imsi-ptable td, table.imsi-optmatrix td,
table.imsi-cmptable .imsi-cmp-price,
.imsi-ed-price, .imsi-addon-price, .imsi-uf-price, .imsi-uf-cardprice {
  font-variant-numeric: tabular-nums;
}

/* body copy reads a touch tighter in Plex Sans */
body { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }
.imsi-lede .sppb-addon-text { letter-spacing: -0.003em; }

/* ==========================================================================
   Products mega menu
   Four link columns grouped by family plus a promo column, the way
   turbocadpro.com does it. The promo is a real Custom HTML module rendered by
   Helix3 into its own mega column - not a generated pseudo-element.
   ========================================================================== */
/* Two things leak out of the header bar and into the panel, because the panel
   is a descendant of the <li> that opens it:

   1. line-height. The bar sets 78px on the top-level <li> so the labels centre
      vertically, and that INHERITS into every element in the mega panel - the
      promo button rendered 150x96 for one line of 13px text, the eyebrow span
      claimed 78px of height, and the panel came out 476px tall, mostly air.
   2. colour. Helix3 writes `#sp-header a { color: #EDEDED }` into an inline
      <style> in <head> - after this file, and at (1,0,1) it outranks
      `.imsi-mega-col a`. The panel has a white ground, so every product link in
      it was near-white on white, about 1.1:1. Unreadable, and it looked like
      the links were missing rather than unstyled.

   Both are reset at the panel root: line-height once, so children with their own
   line-height still win, and colour with the specificity the inline rule forces. */
#sp-header .sp-dropdown { line-height: 1.5; }
#sp-header .sp-dropdown-mega .imsi-mega-col a,
#sp-header .sp-dropdown-mega .imsi-menu-promo p,
#sp-header .sp-dropdown-mega .imsi-menu-promo h6 { color: #26333B !important; }
#sp-header .sp-dropdown-mega .imsi-mega-col a:hover { color: #095377 !important; }
#sp-header .sp-dropdown-mega .imsi-menu-promo-btn { color: #FFFFFF !important; }

#sp-header .sp-dropdown.sp-dropdown-mega .sp-dropdown-inner {
  padding: 26px 28px !important;
  background: #FFFFFF !important;
  border: 1px solid #E2E1DC !important;
  border-radius: 4px !important;
  box-shadow: 0 18px 48px rgba(8,17,21,0.20) !important;
}
/* The panel is one HTML block: a row of link columns plus the promo, the way
   turbocadpro.com builds it. Menu groups were tried first and rejected -
   Joomla derives a page's path from its menu ancestry, so grouping the items
   moved /products/turbocad to /products/g-turbocad/turbocad and 404'd every
   internal link. */
.imsi-mega { display: flex; gap: 26px; align-items: flex-start; }
.imsi-mega-cols {
  display: grid; grid-template-columns: repeat(4, minmax(120px, 1fr));
  gap: 22px; flex: 1 1 auto;
}
.imsi-mega-col h6 {
  margin: 0 0 10px; padding-bottom: 8px;
  border-bottom: 1px solid #EDEBE6;
  font-family: 'Archivo', 'Helvetica Neue', Helvetica, Arial, sans-serif;
  font-size: 13px; font-weight: 700; color: #14212A; letter-spacing: 0.01em;
}
.imsi-mega-col h6 sup { font-size: 8px; top: -0.6em; }
.imsi-mega-col ul { list-style: none; margin: 0; padding: 0; }
.imsi-mega-col li { margin: 0; }
.imsi-mega-col a {
  display: block; padding: 6px 0; line-height: 1.4;
  font-family: var(--imsi-sans, 'IBM Plex Sans', sans-serif);
  font-size: 13.5px; color: #31424C; text-decoration: none; white-space: normal;
}
.imsi-mega-col a:hover { color: #0A5C82; }

/* --- the promo column ---------------------------------------------------- */
.imsi-menu-promo { padding-left: 22px; border-left: 1px solid #EDEBE6; }
.imsi-menu-promo-eyebrow {
  display: block; margin-bottom: 6px;
  font-family: 'IBM Plex Mono', SFMono-Regular, Consolas, monospace;
  font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; color: #0A5C82;
}
.imsi-menu-promo h6 {
  margin: 0 0 12px;
  font-family: 'Archivo', 'Helvetica Neue', Helvetica, Arial, sans-serif;
  font-size: 16px; font-weight: 700; line-height: 1.28; color: #14212A;
}
.imsi-menu-promo-media { display: block; border-radius: 3px; overflow: hidden; }
.imsi-menu-promo-media img {
  display: block; width: 100%; height: 132px; object-fit: cover;
  border: 1px solid #E2E1DC; border-radius: 3px;
}
.imsi-menu-promo p {
  margin: 12px 0 14px; font-size: 12.5px; line-height: 1.55; color: #5C6E79;
}
a.imsi-menu-promo-btn {
  display: inline-block; padding: 9px 16px; border-radius: 3px;
  background: #0A5C82; color: #FFFFFF !important;
  font-family: var(--imsi-sans, 'IBM Plex Sans', sans-serif);
  font-size: 13px; font-weight: 600; text-decoration: none;
}
a.imsi-menu-promo-btn:hover { background: #095377; color: #FFFFFF !important; }

@media (max-width: 991.98px) {
  .imsi-menu-promo { padding-left: 0; border-left: 0; margin-top: 16px; }
}

/* the promo sits as the last column of the flex row */
.imsi-mega .imsi-menu-promo { flex: 0 0 250px; max-width: 250px; }
#sp-header .sp-dropdown-mega .sp-module,
#sp-header .sp-dropdown-mega .sp-module-content { margin: 0 !important; padding: 0 !important; }
@media (max-width: 991.98px) {
  .imsi-mega { flex-direction: column; }
  .imsi-mega-cols { grid-template-columns: repeat(2, 1fr); }
  .imsi-mega .imsi-menu-promo { flex: 1 1 auto; max-width: none; }
}

/* ==========================================================================
   Button fixes
   Helix3 sets white-space: pre-line on .sppb-btn, so "Add to cart" broke over
   three lines inside a 58px box on the add-on cards - it read as a missing
   button rather than a wrapped one.
   ========================================================================== */
#sp-main-body a.sppb-btn,
.sppb-section a.sppb-btn,
a.imsi-btn,
a.imsi-cmp-buy,
a.imsi-uf-buy,
a.imsi-menu-promo-btn {
  white-space: nowrap !important;
  text-align: center;
}
/* the featured column's button was picking up the generic link colour, which
   put #095377 text on a #0A5C82 ground - 1.05:1, effectively invisible */
a.imsi-cmp-buy.imsi-cmp-buy-primary,
.imsi-cmp a.imsi-cmp-buy-primary,
body a.imsi-cmp-buy-primary {
  color: #FFFFFF !important;
  background: #0A5C82 !important;
  border-color: #0A5C82 !important;
}
a.imsi-cmp-buy.imsi-cmp-buy-primary:hover,
body a.imsi-cmp-buy-primary:hover {
  color: #FFFFFF !important;
  background: #095377 !important;
}
body a.imsi-cmp-buy:not(.imsi-cmp-buy-primary) { color: #0A5C82 !important; }

/* --- header logo, a size down ------------------------------------------- */
/* the mobile step-down; the base size is set once, further up */
@media (max-width: 991.98px) {
  #sp-logo .sp-default-logo,
  #sp-logo .sp-sticky-logo,
  #sp-header .sp-default-logo,
  #sp-header .sp-sticky-logo,
  #sp-header .logo a img { max-height: 18px !important; }
}

/* ==========================================================================
   Mega panel position and density
   Helix3 anchors the panel from the menu item, and at 880px wide under a
   right-hand nav item that pushed it off the left edge of the window. Pin it
   to the header's own container instead and cap it to the viewport.
   ========================================================================== */
/* Anchor the mega panel to the HEADER CONTAINER, not to the menu item.
   `position: relative` on the <li> was the bug: `right: 0` then meant "the
   right edge of the Products item", which sits at x=604 in a 1440 window, so
   an 880px panel started at -276 and ran off the left of the screen. Only the
   Products item carries a mega panel, so only that one goes static - the other
   dropdowns are narrow and still want to hang off their own item. */
#sp-header .sp-megamenu-parent > li.sp-has-child { position: relative; }
#sp-header .sp-megamenu-parent > li:has(> .sp-dropdown-mega) { position: static; }
#sp-header .container { position: relative; }
#sp-header .sp-dropdown.sp-dropdown-mega {
  left: auto !important;
  right: 0 !important;
  width: 880px !important;
  max-width: calc(100vw - 32px) !important;
}
@media (max-width: 940px) {
  #sp-header .sp-dropdown.sp-dropdown-mega { width: calc(100vw - 32px) !important; }
}

/* tighter link rhythm - the columns read as a list, not a stack of buttons */
.imsi-mega { gap: 22px; }
.imsi-mega-cols { gap: 18px; }
.imsi-mega-col h6 { margin-bottom: 8px; padding-bottom: 7px; font-size: 12.5px; }
.imsi-mega-col a { padding: 3px 0 !important; font-size: 13px !important; }
.imsi-mega .imsi-menu-promo { flex: 0 0 208px; max-width: 208px; padding-left: 20px; }
.imsi-menu-promo h6 { font-size: 15px; margin-bottom: 10px; }
.imsi-menu-promo p { margin: 10px 0 12px; font-size: 12px; }
/* The promo image is a 16:10 render from the User Gallery, not a boxshot, so it
   fills the column edge to edge and is cropped to a band rather than letterboxed
   inside a fixed max-height. */
.imsi-menu-promo-media {
  display: block; border-radius: 3px; overflow: hidden;
  background: #0C1418; aspect-ratio: 16 / 10;
}
.imsi-menu-promo-media img {
  display: block; width: 100% !important; height: 100% !important;
  max-width: none !important; max-height: none !important;
  object-fit: cover !important; border: 0 !important;
}

/* ==========================================================================
   Blog listing and articles
   The list previously rendered every article in full - the importer left all
   the body text in `introtext` - so /blog was thirteen complete articles on one
   page. The split is fixed in the data (fix-blog-layout.php); this is the
   presentation of what is left.
   ========================================================================== */
body.com-content #sp-main-body { background: #F6F5F2; padding-bottom: 76px; }
body.com-content #sp-component { max-width: 1180px; margin: 0 auto; }

.blog .page-header, .blog-featured .page-header, .item-page .page-header { margin: 0 0 30px; }
.blog .page-header h1, .item-page .page-header h1 {
  font-family: 'Archivo', 'Helvetica Neue', Helvetica, Arial, sans-serif;
  font-size: clamp(30px, 3.4vw, 44px); font-weight: 700; color: #14212A;
  letter-spacing: -0.025em; margin: 0;
}

/* one card per post */
.blog .items-row > [class*="col-"] { margin-bottom: 26px; display: flex; }
.blog .items-row article.item,
.blog .items-leading article.item {
  background: #FFFFFF; border: 1px solid #E2E1DC; border-radius: 4px;
  overflow: hidden; display: flex; flex-direction: column; width: 100%;
}
/* The lead image is a banner at its natural size - 1140x600 on some posts.
   Cropped to a consistent band so the cards line up and no single post takes
   over the page. */
.blog article.item .entry-image {
  margin: 0 !important; width: 100%; aspect-ratio: 16 / 9;
  overflow: hidden; background: #0C1418;
}
.blog article.item .entry-image img {
  width: 100% !important; height: 100% !important; max-width: none !important;
  max-height: none !important; object-fit: cover !important;
  margin: 0 !important; float: none !important;
}
.blog article.item .post_intro,
.blog article.item .post-content { padding: 20px 22px 22px; flex: 1 1 auto;
  display: flex; flex-direction: column; }
.blog article.item h2, .blog article.item .entry-title {
  font-size: 18px; line-height: 1.34; font-weight: 700; margin: 0 0 10px;
}
.blog article.item h2 a, .blog article.item .entry-title a { color: #14212A; }
.blog article.item h2 a:hover { color: #0A5C82; }
.blog article.item p { font-size: 13.8px; line-height: 1.62; color: #5C6E79; }
.blog article.item .readmore { margin-top: auto; padding-top: 12px; }
.blog article.item .readmore a {
  font-size: 13px; font-weight: 600; color: #0A5C82; text-decoration: none;
}
.blog article.item .readmore a:hover { text-decoration: underline; }
/* body images inside a card would blow the card open */
.blog article.item .post_intro img { max-width: 100%; height: auto; }

/* the article itself */
.item-page { background: #FFFFFF; border: 1px solid #E2E1DC; border-radius: 4px;
  padding: 34px 38px 40px; max-width: 900px; margin: 0 auto; }
.item-page .entry-image img { max-width: 100%; height: auto; border-radius: 3px; }
.item-page p { font-size: 15px; line-height: 1.72; color: #3A4B55; }
.item-page h2 { font-size: 21px; font-weight: 700; color: #14212A; margin: 30px 0 12px; }
@media (max-width: 768px) {
  .item-page { padding: 24px 20px 28px; }
}

/* --- inside a blog card ---------------------------------------------------
   The card body is article markup: it can contain its own h1..h4, and one of
   them rendered at 40px inside a 354px card. Body headings are capped so no
   post can blow its own card open. */
.blog article.item .post_intro h1,
.blog article.item .post_intro h2,
.blog article.item .post_intro h3,
.blog article.item .post_intro h4 {
  font-size: 15px !important; line-height: 1.4; font-weight: 700;
  color: #14212A; margin: 0 0 8px;
}
.blog article.item .entry-header h2,
.blog article.item .entry-header .entry-title {
  font-size: 17px !important; line-height: 1.34; margin: 0 0 8px;
}

/* The template's preset paints article meta and the read-more control in its
   own red (#F14833). Nothing else on this site is red - the accent is the
   brand blue - so the cards read as if something had gone wrong. */
.blog article.item .article-info,
.blog article.item .article-info a,
.blog article.item .category-name,
.blog article.item .published,
.blog article.item time {
  font-family: 'IBM Plex Mono', SFMono-Regular, Consolas, monospace;
  font-size: 11px !important; letter-spacing: 0.06em;
  color: #7A8B95 !important; text-transform: none;
}
.blog article.item .article-info a:hover { color: #0A5C82 !important; }
.blog article.item .article-info { margin: 0 0 10px; }
.blog article.item .article-info dd { margin: 0 12px 0 0; display: inline-block; }

.blog article.item .readmore { margin-top: auto; padding-top: 14px; }
.blog article.item .readmore a,
.blog article.item a.readmore {
  display: inline-block; background: none !important; border: 0 !important;
  padding: 0 !important; font-size: 13px !important; font-weight: 600;
  color: #0A5C82 !important; text-decoration: none; box-shadow: none !important;
}
.blog article.item .readmore a:hover { text-decoration: underline; }
.blog article.item .readmore .icon-chevron-right,
.blog article.item .readmore [class^="fa-"] { display: none; }

/* the post-format badge is a decorative overlay on the thumbnail */
.blog article.item .has-post-format-masonry { display: none !important; }

/* social sharing buttons repeated on every card are noise in a listing */
.blog article.item .sp-social-share,
.blog article.item .social-share,
.blog article.item .sharethis-inline-share-buttons { display: none !important; }

/* the meta icons carry the preset's red; the share row is not wanted per card */
.blog article.item .article-info i,
.blog article.item .article-info .fa,
.blog article.item .article-info [class*="fa-"] { color: #9AA9B2 !important; }
.blog article.item .helix-social-share { display: none !important; }

/* Flex draws a coloured rule under headings. In a card it lands between the
   title and the meta and reads as an error state. */
.blog article.item h2::after,
.blog article.item .entry-header h2::after,
.blog article.item .entry-title::after { display: none !important; }

/* Cards sit in a grid, so an intro that runs long makes one card twice the
   height of its neighbours. Four lines, then the Read more link. */
.blog article.item .post_intro > p {
  display: -webkit-box; -webkit-line-clamp: 4; -webkit-box-orient: vertical;
  overflow: hidden; margin-bottom: 0;
}
.blog article.item .post_intro > p ~ p { display: none; }

/* ==========================================================================
   System messages
   Joomla 5 renders these as <joomla-alert>, and the template styles the custom
   element itself with `padding: 24px 30px` and 17.6px centred text, giving a
   1116x212 banner for two short lines. On the cart, "Product successfully
   added" occupied more of the page than the cart did.

   The real class names inside the element are .alert-heading, .alert-wrapper
   and .alert-message - NOT the BEM-style .joomla-alert__* spellings - and the
   outer padding needs !important to beat the template's own rule.
   ========================================================================== */
joomla-alert {
  display: block !important;
  max-width: 1140px; margin: 0 auto 10px !important;
  padding: 0 !important;
  border-radius: 3px;
  border: 1px solid #CFE3EC !important;
  background: #F2F8FB !important;
  font-size: 13.5px !important; line-height: 1.5; color: #26333B !important;
  text-align: left !important;
  position: relative;
}
joomla-alert .alert-wrapper { padding: 9px 34px 9px 14px !important; }
joomla-alert .alert-message,
joomla-alert .alert-wrapper > div {
  margin: 0 !important; padding: 0 !important;
  font-size: 13.5px !important; text-align: left !important;
}
joomla-alert .alert-message + .alert-message { margin-top: 4px !important; }
/* VirtueMart puts the literal word "info" in the heading slot */
joomla-alert .alert-heading { display: none !important; }
joomla-alert button.joomla-alert--close {
  position: absolute; top: 6px; right: 8px;
  padding: 0 6px !important; font-size: 15px !important; line-height: 1.2;
  opacity: 0.45; background: none; border: 0;
}
joomla-alert button.joomla-alert--close:hover { opacity: 0.8; }
joomla-alert[type="warning"], joomla-alert[type="danger"] {
  border-color: #E9D8B4 !important; background: #FDF8EC !important;
}

/* the template prints this on the front end when the offcanvas position is
   empty - it is a note to the builder, not to a shopper */
body p.alert.alert-warning:only-child { display: none; }

/* --- Solutions and Features panels ----------------------------------------
   Products lists four families, so it reads as columns of names. Solutions and
   Features are five and six individual pages whose names alone say very little
   ("Graphic on Path", "Conceptual design"), so each line carries the page's own
   one-sentence summary and the whole row is the click target. */
.imsi-mega-list {
  flex: 1 1 auto;
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 2px 14px; align-content: start;
}
a.imsi-mega-item {
  display: block; padding: 9px 11px; border-radius: 3px; text-decoration: none;
  transition: background 0.12s ease;
}
a.imsi-mega-item:hover { background: #F2F6F8; }
.imsi-mega-item-t {
  display: block; font-size: 13.5px; font-weight: 650; color: #14212A;
  line-height: 1.35; margin-bottom: 2px;
}
a.imsi-mega-item:hover .imsi-mega-item-t { color: #0A5C82; }
.imsi-mega-item-d {
  display: block; font-size: 12px; line-height: 1.45; color: #6B7F8A;
}
/* the header's inline #sp-header a colour rule reaches in here too */
#sp-header .sp-dropdown-mega a.imsi-mega-item .imsi-mega-item-t { color: #14212A !important; }
#sp-header .sp-dropdown-mega a.imsi-mega-item .imsi-mega-item-d { color: #6B7F8A !important; }
#sp-header .sp-dropdown-mega a.imsi-mega-item:hover .imsi-mega-item-t { color: #0A5C82 !important; }

@media (max-width: 860px) {
  .imsi-mega-list { grid-template-columns: 1fr; }
}

/* a promo with numbers instead of a picture */
.imsi-menu-promo-plain .imsi-menu-stats {
  list-style: none; margin: 12px 0 10px; padding: 0;
  border-top: 1px solid #EDEBE6;
}
.imsi-menu-promo-plain .imsi-menu-stats li {
  display: flex; align-items: baseline; justify-content: space-between;
  padding: 6px 0; border-bottom: 1px solid #EDEBE6;
}
.imsi-menu-promo-plain .imsi-menu-stats span { font-size: 12.5px; color: #5C6E79; }
.imsi-menu-promo-plain .imsi-menu-stats b {
  font-family: 'IBM Plex Mono', SFMono-Regular, Consolas, monospace;
  font-size: 14px; font-weight: 600; color: #14212A;
}
#sp-header .sp-dropdown-mega .imsi-menu-stats span { color: #5C6E79 !important; }
#sp-header .sp-dropdown-mega .imsi-menu-stats b { color: #14212A !important; }

/* Items hidden from the nav with menu_show=0 - Home, Contact Us, Privacy Policy
   - still emit an empty <li>. They are zero-width so they do not shift the row,
   but an empty list item is not something to leave in the markup. */
#sp-header .sp-megamenu-parent > li:empty { display: none !important; }

/* ==========================================================================
   Dropdown panels — Products matched to Solutions
   The Products panel drew a rule under every column heading; the Solutions and
   Features panels do not, and side by side the ruled one looked like a
   different component. The heading carries enough weight on its own.
   ========================================================================== */
.imsi-mega-col h6 {
  border-bottom: 0 !important;
  padding-bottom: 0 !important;
  margin-bottom: 8px !important;
}

/* The promo picture was cropped to fill a 16:10 box, so a 3:2 source lost its
   top and bottom - the motorcycle came out beheaded. Contain fits the whole
   frame inside the box whatever its ratio, and the box is a little shorter so
   the panel does not grow to accommodate it. */
.imsi-menu-promo-media {
  aspect-ratio: auto !important;
  height: 118px;
  display: flex !important; align-items: center; justify-content: center;
  background: #0C1418;
}
.imsi-menu-promo-media img {
  width: 100% !important; height: 100% !important;
  object-fit: contain !important;
}

/* The promo pictures sat in a bordered, filled box. Several of the source
   images are transparent PNGs or sit on white, and the frame made them look
   like pasted-in screenshots rather than part of the panel. No border, no
   ground - a transparent image simply shows the panel behind it. */
.imsi-menu-promo-media {
  background: transparent !important;
  border: 0 !important;
  border-radius: 0 !important;
}
.imsi-menu-promo-media img {
  border: 0 !important;
  border-radius: 0 !important;
  background: transparent !important;
}

/* ==========================================================================
   Blog sidebar and article links
   ========================================================================== */
/* The template preset paints every content link in its own red (#F14833).
   Inside article bodies that meant fourteen orange links at the foot of the
   blog page - inline links in the copy plus the related-post list - against a
   site whose only accent is the brand blue. */
body.com-content #sp-component a:not(.sppb-btn):not(.imsi-btn):not(.imsi-bs-btn),
body.com-content .item-page a:not(.sppb-btn):not(.imsi-btn),
body.com-content .blog a:not(.sppb-btn):not(.imsi-btn) {
  color: #0A5C82;
}
body.com-content #sp-component a:not(.sppb-btn):not(.imsi-btn):hover {
  color: #14212A; text-decoration: underline;
}

/* Helix3 renders `right` only when a module is published there; the component
   column narrows on its own to make room. */
body.com-content #sp-right { padding-top: 42px; }
.imsi-blogside { position: sticky; top: 96px; }
.imsi-bs-block {
  background: #FFFFFF; border: 1px solid #E2E1DC; border-radius: 4px;
  padding: 17px 19px 18px; margin-bottom: 16px;
}
.imsi-bs-block h4 {
  margin: 0 0 12px; font-family: 'IBM Plex Mono', SFMono-Regular, Consolas, monospace;
  font-size: 11px; letter-spacing: 0.14em; text-transform: uppercase; color: #5C6E79;
  font-weight: 500;
}
.imsi-blogside ul { list-style: none; margin: 0; padding: 0; }
.imsi-blogside li { margin: 0; }
.imsi-blogside a { text-decoration: none; }

.imsi-bs-cats a {
  display: flex; align-items: baseline; justify-content: space-between; gap: 10px;
  padding: 6px 0; font-size: 13.5px; color: #26333B !important;
  border-bottom: 1px solid #F1F0EC;
}
.imsi-bs-cats li:last-child a { border-bottom: 0; }
.imsi-bs-cats a:hover { color: #0A5C82 !important; }
.imsi-bs-cats b {
  font-family: 'IBM Plex Mono', SFMono-Regular, Consolas, monospace;
  font-size: 11px; font-weight: 600; color: #7A8B95;
}

.imsi-bs-recent a {
  display: block; padding: 7px 0; font-size: 13px; line-height: 1.42;
  color: #26333B !important; border-bottom: 1px solid #F1F0EC;
}
.imsi-bs-recent li:last-child a { border-bottom: 0; }
.imsi-bs-recent a:hover { color: #0A5C82 !important; }

.imsi-bs-links a {
  display: block; padding: 5px 0; font-size: 13.5px; color: #0A5C82 !important;
}
.imsi-bs-links a:hover { text-decoration: underline; }

.imsi-bs-cta { background: #0C1418; border-color: #0C1418; }
.imsi-bs-cta h4 { color: #22A9E1; }
.imsi-bs-cta p { font-size: 13px; line-height: 1.55; color: #A8BCC5; margin: 0 0 13px; }
a.imsi-bs-btn {
  display: inline-block; padding: 9px 16px; border-radius: 3px;
  background: #22A9E1; color: #08161D !important;
  font-size: 13px; font-weight: 600;
}
a.imsi-bs-btn:hover { background: #38B6E8; }
.imsi-bs-note {
  font-family: 'IBM Plex Mono', SFMono-Regular, Consolas, monospace;
  font-size: 10.5px; color: #8FA3AD; margin: 0; text-align: center;
}
@media (max-width: 991.98px) {
  .imsi-blogside { position: static; }
  body.com-content #sp-right { padding-top: 8px; }
}

/* The Products panel is a mod_custom module, so the template's
   `.sp-module ul > li { border-bottom: 1px solid #E8E8E8 }` drew a rule between
   every product. Solutions and Features build their rows from <a> blocks rather
   than a <ul>, which is why only this one panel had lines. */
#sp-header .sp-dropdown .imsi-mega-col ul > li,
.imsi-mega-col ul > li,
.imsi-mega-list > a {
  border-bottom: 0 !important;
  border-top: 0 !important;
}

/* Footer link columns now come from one module rather than three, so the
   number of columns is a property of this grid instead of the template's
   bottom1..bottom4 positions - there was no fifth position for Resources. */
#sp-bottom .imsi-fgrid {
  display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 30px;
}
#sp-bottom [class*="col-"]:has(.imsi-fgrid) { flex: 1 1 auto; max-width: none; }
@media (max-width: 900px) {
  #sp-bottom .imsi-fgrid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 26px; }
}
@media (max-width: 520px) {
  #sp-bottom .imsi-fgrid { grid-template-columns: 1fr; }
}

/* Products carried five link columns for a while (Features moved in when it
   left the header) and this set the grid to five. It has been four columns
   plus a promo since; the five-column template stayed behind, and because it
   carries #sp-header it outranked the four-column rule further down - the
   grid laid out FIVE tracks for four children, so each column was 156px and
   every edition name wrapped onto a second line. Only the column count is
   removed; the tighter gap is still right. */
#sp-header .sp-dropdown-mega .imsi-mega-cols { gap: 18px; }

/* ==========================================================================
   CART AND CHECKOUT
   ==========================================================================
   The cart was stock VirtueMart in the Flex template's default palette: a
   tomato-red header bar, tomato buttons, 6pt table borders and Bootstrap's
   default type. It is the one page on the site a customer HAS to get through,
   and it looked like a different company's site.

   Everything here is CSS on VirtueMart's own class names, not new markup. That
   matters because the checkout itself is due to be replaced by the VP checkout
   module: a one-page checkout renders its own DOM, but it renders it inside
   this component area, with the same VirtueMart price/button/field classes and
   Bootstrap 5 form controls. So the rules are written against
     #cart-view, .vm-*, .Price*, table.cart-summary, .btn/.form-control
   rather than against the Flex cart template's own wrappers, and a new
   checkout module inherits the brand instead of starting over.

   Anything Flex-template-specific is marked FLEX-ONLY below and is safe to
   lose.
   ========================================================================== */

/* --- page frame ---------------------------------------------------------- */
body.com-virtuemart #cart-view,
body.com-virtuemart .vm-checkout,
body.com-virtuemart #checkoutForm {
  font-family: 'IBM Plex Sans', system-ui, -apple-system, 'Segoe UI', sans-serif;
  color: #14212A;
}
body.com-virtuemart #cart-view { max-width: 1040px; margin: 0 auto; }

body.com-virtuemart .vm-cart-header-container {
  display: flex; align-items: flex-end; justify-content: space-between;
  gap: 24px; flex-wrap: wrap; padding-bottom: 18px; margin-bottom: 26px;
  border-bottom: 1px solid #E2E1DC;
}
body.com-virtuemart .vm-cart-header { width: auto !important; float: none !important; }
body.com-virtuemart .vm-cart-header h1 {
  font-family: 'Archivo', 'Helvetica Neue', Helvetica, Arial, sans-serif;
  font-size: clamp(30px, 3.4vw, 40px); font-weight: 700; letter-spacing: -0.02em;
  margin: 0; color: #14212A;
}
body.com-virtuemart .vm-continue-shopping {
  width: auto !important; float: none !important; text-align: right;
}
body.com-virtuemart .btn-continue { display: inline-flex; align-items: center; gap: 8px; }
body.com-virtuemart .btn-continue a,
body.com-virtuemart a.continue_link {
  font-size: 14px; font-weight: 600; color: #0A5C82 !important; text-decoration: none;
}
body.com-virtuemart .btn-continue a:hover { color: #22A9E1 !important; }

/* the stray full-width <hr>s the Flex template scatters between blocks */
body.com-virtuemart #cart-view > hr,
body.com-virtuemart #checkoutForm hr { display: none !important; }

/* --- cards --------------------------------------------------------------- */
/* FLEX-ONLY wrappers, restyled as the mockup's white cards */
body.com-virtuemart .vm-login,
body.com-virtuemart #cart-view .jumbotron,
body.com-virtuemart .vm-fieldset-pricelist,
body.com-virtuemart .vm-fieldset-customer-note,
body.com-virtuemart .vm-fieldset-tos,
body.com-virtuemart .billto-shipto {
  background: #FFFFFF !important; border: 1px solid #E2E1DC; border-radius: 4px;
  padding: 24px 26px !important; margin: 0 0 18px !important;
}
body.com-virtuemart .vm-fieldset-pricelist { padding: 0 !important; overflow: hidden; }
body.com-virtuemart #cart-view .jumbotron {
  display: flex; align-items: center; gap: 16px; flex-wrap: wrap;
}
body.com-virtuemart #cart-view .jumbotron h5 {
  margin: 0 !important; padding: 0 !important;
  font-family: 'Archivo', sans-serif; font-size: 17px !important; font-weight: 700;
}
body.com-virtuemart .vm-login .lead {
  font-size: 16px; font-weight: 600; color: #14212A;
  border-bottom: 1px solid #EDECE8; padding-bottom: 12px; margin-bottom: 16px;
}

/* --- addresses ----------------------------------------------------------- */
body.com-virtuemart .billto-shipto { padding: 24px 26px !important; }
body.com-virtuemart .billto-shipto h6 {
  display: flex; align-items: center; gap: 9px; margin: 0 0 12px;
  font-family: 'IBM Plex Mono', SFMono-Regular, Consolas, monospace;
  font-size: 11.5px; letter-spacing: 0.14em; text-transform: uppercase;
  color: #7A8B95; font-weight: 500;
}
body.com-virtuemart .billto-shipto h6 i { color: #0A5C82; font-size: 13px; }
body.com-virtuemart .output-billto,
body.com-virtuemart .output-shipto { font-size: 14.5px; line-height: 1.6; color: #31424C; }

/* --- the price table ----------------------------------------------------- */
body.com-virtuemart table.cart-summary { width: 100%; margin: 0; border-collapse: collapse; }
body.com-virtuemart table.cart-summary th,
body.com-virtuemart table.cart-summary td {
  border: 0; border-bottom: 1px solid #EDECE8; padding: 16px 14px; vertical-align: middle;
}
body.com-virtuemart table.cart-summary tr th {
  background: #FBFAF8 !important; color: #5C6E79 !important;
  font-family: 'IBM Plex Mono', SFMono-Regular, Consolas, monospace;
  font-size: 11px; font-weight: 500; letter-spacing: 0.12em; text-transform: uppercase;
  text-align: left; padding: 12px 14px;
  border-bottom: 1px solid #E2E1DC;
}
body.com-virtuemart table.cart-summary tr:last-child td { border-bottom: 0; }
body.com-virtuemart table.cart-summary .vm-cart-item-sku {
  font-family: 'IBM Plex Mono', SFMono-Regular, Consolas, monospace;
  font-size: 13px; color: #5C6E79;
}
body.com-virtuemart .cart-images img {
  width: 56px !important; height: auto !important; border-radius: 3px; margin-right: 14px;
}
body.com-virtuemart table.cart-summary td:first-child .align-items-center {
  display: flex; align-items: center; gap: 4px; text-align: left;
}
body.com-virtuemart .cart-images { justify-content: flex-start !important; flex: 0 0 auto; }
body.com-virtuemart table.cart-summary td a {
  font-size: 15px; font-weight: 600; color: #14212A !important; text-decoration: none;
}
body.com-virtuemart table.cart-summary td a:hover { color: #0A5C82 !important; }

/* prices: the mono face everywhere a figure appears, so columns line up */
body.com-virtuemart .vm-price-value,
body.com-virtuemart .PricesalesPrice,
body.com-virtuemart .PricebillTotal,
body.com-virtuemart .PricediscountedPriceWithoutTax,
body.com-virtuemart .PricebasePriceVariant,
body.com-virtuemart .PricetaxAmount {
  font-family: 'IBM Plex Mono', SFMono-Regular, Consolas, monospace;
  color: #14212A;
}
body.com-virtuemart table.cart-summary .vm-cart-item-total .vm-price-value,
body.com-virtuemart .PricebillTotal { font-size: 16px; font-weight: 600; }
body.com-virtuemart table.cart-summary .vm-cart-item-total,
body.com-virtuemart table.cart-summary td[align="right"] { text-align: right; }

/* the last row is the bill total - give it weight rather than a grey block */
body.com-virtuemart table.cart-summary tr.sectiontableentry2:last-child td {
  background: #FBFAF8; padding-top: 20px; padding-bottom: 20px;
  font-size: 15px; font-weight: 600; color: #14212A;
}
body.com-virtuemart table.cart-summary tr.sectiontableentry2:last-child .PricebillTotal {
  font-size: 22px; font-weight: 700;
}

/* quantity stepper */
body.com-virtuemart .vm-cart-item-quantity .input-append {
  display: inline-flex !important; align-items: stretch;
  border: 1px solid #D6D4CE; border-radius: 3px; overflow: hidden; background: #FFFFFF;
}
body.com-virtuemart input.quantity-input {
  width: 46px; height: 38px; border: 0 !important; text-align: center;
  font-size: 14px; font-weight: 600; background: transparent; box-shadow: none !important;
}
body.com-virtuemart .vm-cart-item-quantity .btn.vmicon {
  width: 38px; height: 38px; padding: 0; border: 0; border-left: 1px solid #EDECE8;
  border-radius: 0; background: #FBFAF8 !important; color: #5C6E79 !important;
  display: inline-flex; align-items: center; justify-content: center;
}
body.com-virtuemart .vm-cart-item-quantity .btn.vmicon:hover {
  background: #F2FAFE !important; color: #0A5C82 !important;
}
body.com-virtuemart .vm-cart-item-quantity .vm2-remove_from_cart:hover {
  background: #FDF1EE !important; color: #B3401F !important;
}

/* coupon row */
body.com-virtuemart input.coupon {
  height: 44px; padding: 0 14px; border: 1px solid #C7D3D9; border-radius: 3px;
  font-size: 14px; max-width: 280px; background: #FFFFFF;
}
body.com-virtuemart input.coupon:focus { outline: 2px solid #22A9E1; outline-offset: -2px; }
body.com-virtuemart input.details-button,
body.com-virtuemart .details-button input {
  height: 44px; padding: 0 22px; border: 1px solid #C7D3D9; border-radius: 3px;
  background: #FFFFFF !important; color: #0A5C82 !important;
  font-size: 14px; font-weight: 600; margin-left: 8px;
}
body.com-virtuemart input.details-button:hover { border-color: #0A5C82; }

/* --- shipment and payment blocks ----------------------------------------- */
body.com-virtuemart .selected_shipment,
body.com-virtuemart .selected_payment {
  display: block !important; padding: 12px 14px; border: 1px solid #E2E1DC;
  border-radius: 3px; background: #FBFAF8; font-size: 14px; color: #5C6E79;
}
body.com-virtuemart table.cart-summary h4 {
  font-family: 'Archivo', sans-serif; font-size: 16px; font-weight: 700;
  margin: 0 0 10px; text-align: left; color: #14212A;
}
/* VirtueMart shouts these in <h3>. They are status lines, not headings. */
body.com-virtuemart .vm-shipment-header-select,
body.com-virtuemart .vm-payment-header-select,
body.com-virtuemart table.cart-summary h3 {
  font-family: 'IBM Plex Sans', system-ui, sans-serif !important;
  font-size: 14px !important; font-weight: 400 !important; line-height: 1.55;
  text-align: left !important; color: #5C6E79 !important; margin: 10px 0 0;
}
body.com-virtuemart .vm-payment-header-select { color: #B3401F !important; font-weight: 600 !important; }

/* --- notes and terms ----------------------------------------------------- */
body.com-virtuemart .cart.customer-note > span,
body.com-virtuemart .cart.tos > span.tos,
body.com-virtuemart span.cart.customer-note {
  display: block; margin-bottom: 8px;
  font-family: 'IBM Plex Mono', SFMono-Regular, Consolas, monospace;
  font-size: 11.5px; letter-spacing: 0.14em; text-transform: uppercase; color: #7A8B95;
}
body.com-virtuemart #customer_note_field {
  min-height: 84px; border: 1px solid #C7D3D9; border-radius: 3px; padding: 12px 14px;
  font-size: 14.5px; line-height: 1.55; resize: vertical;
}
body.com-virtuemart .vm-fieldset-tos .terms-of-service label {
  display: flex; align-items: flex-start; gap: 10px; font-size: 14px; color: #31424C;
}
body.com-virtuemart a.terms-of-service { color: #0A5C82 !important; }
body.com-virtuemart input#tos { width: 18px; height: 18px; margin: 1px 0 0; accent-color: #0A5C82; }
body.com-virtuemart .vm-fieldset-tos #full-tos { display: none !important; }

/* --- buttons ------------------------------------------------------------- */
/* one primary in the whole flow: Check Out Now */
body.com-virtuemart .checkout-button-top { text-align: right; margin: 8px 0 0 !important; }
body.com-virtuemart button#checkoutFormSubmit,
body.com-virtuemart .vm-button-correct,
body.com-virtuemart input.vm-button-correct {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 260px; height: 54px; padding: 0 34px;
  background: #0A5C82 !important; border: 0 !important; border-radius: 3px;
  color: #FFFFFF !important; font-family: 'IBM Plex Sans', system-ui, sans-serif;
  font-size: 16px; font-weight: 700; letter-spacing: 0; cursor: pointer;
  box-shadow: none; text-shadow: none;
}
body.com-virtuemart button#checkoutFormSubmit:hover,
body.com-virtuemart .vm-button-correct:hover { background: #095377 !important; }
body.com-virtuemart button#checkoutFormSubmit:disabled { opacity: 0.55; cursor: default; }

/* every other button in the store area is secondary */
body.com-virtuemart #cart-view .btn,
body.com-virtuemart #checkoutForm .btn,
body.com-virtuemart .vm-checkout .btn {
  border-radius: 3px; font-family: 'IBM Plex Sans', system-ui, sans-serif;
  font-size: 14px; font-weight: 600; text-shadow: none; box-shadow: none;
}
body.com-virtuemart #cart-view .btn-primary,
body.com-virtuemart #checkoutForm .btn-primary {
  background: #0A5C82 !important; border-color: #0A5C82 !important; color: #FFFFFF !important;
}
body.com-virtuemart #cart-view .btn-primary:hover,
body.com-virtuemart #checkoutForm .btn-primary:hover {
  background: #095377 !important; border-color: #095377 !important;
}
body.com-virtuemart #cart-view .sppb-btn-default,
body.com-virtuemart #checkoutForm .sppb-btn-default,
body.com-virtuemart #cart-view .btn-secondary {
  background: #FFFFFF !important; border: 1px solid #C7D3D9 !important;
  color: #0A5C82 !important;
}
body.com-virtuemart #cart-view .sppb-btn-default:hover,
body.com-virtuemart #checkoutForm .sppb-btn-default:hover { border-color: #0A5C82 !important; }
/* the address buttons carry .required.invalid, which Flex paints red */
body.com-virtuemart #checkoutForm a.btn.invalid {
  border-color: #C9A24A !important; background: #FFF8EE !important; color: #7A5314 !important;
}

/* --- form controls (shared with whatever checkout module renders) --------- */
body.com-virtuemart #cart-view .form-control,
body.com-virtuemart #checkoutForm .form-control,
body.com-virtuemart .vm-checkout .form-control,
body.com-virtuemart #cart-view select,
body.com-virtuemart #checkoutForm select {
  height: 46px; border: 1px solid #C7D3D9; border-radius: 3px; padding: 0 14px;
  font-size: 14.5px; color: #14212A; background-color: #FFFFFF; box-shadow: none;
}
body.com-virtuemart #cart-view .form-control:focus,
body.com-virtuemart #checkoutForm .form-control:focus {
  border-color: #0A5C82; outline: 2px solid rgba(34,169,225,0.35); outline-offset: -1px;
  box-shadow: none;
}
body.com-virtuemart #cart-view label,
body.com-virtuemart #checkoutForm label { font-size: 13.5px; color: #5C6E79; }

/* --- messages ------------------------------------------------------------ */
/* The "no payment method configured" warning is REAL on staging - payment is
   genuinely not set up yet - so it is styled to be readable, never hidden. */
body.com-virtuemart #system-message-container .alert,
body.com-virtuemart #system-message-container .joomla-alert {
  border-radius: 3px; border: 1px solid #C6E4F4; background: #F2FAFE;
  color: #095377; font-size: 14px; padding: 14px 18px;
}
body.com-virtuemart #system-message-container .alert-warning,
body.com-virtuemart #system-message-container .joomla-alert--warning {
  border-color: #EDD9BC; background: #FFF8EE; color: #7A5314;
}

/* --- order confirmation -------------------------------------------------- */
body.com-virtuemart .vm-order-done,
body.com-virtuemart #com-form-login { max-width: 1040px; margin: 0 auto; }

/* --- responsive ---------------------------------------------------------- */
@media (max-width: 767px) {
  body.com-virtuemart .vm-cart-header-container { align-items: flex-start; }
  body.com-virtuemart .vm-continue-shopping { text-align: left; }
  body.com-virtuemart .vm-fieldset-pricelist { overflow-x: auto; }
  body.com-virtuemart table.cart-summary { min-width: 560px; }
  body.com-virtuemart .checkout-button-top { text-align: stretch; }
  body.com-virtuemart button#checkoutFormSubmit { width: 100%; min-width: 0; }
  body.com-virtuemart .vm-login,
  body.com-virtuemart #cart-view .jumbotron,
  body.com-virtuemart .vm-fieldset-customer-note,
  body.com-virtuemart .vm-fieldset-tos,
  body.com-virtuemart .billto-shipto { padding: 18px 16px !important; }
}

/* --- cart, second pass --------------------------------------------------- */
/* The Flex template paints the cart table's cell borders in its accent red.
   They survive a `border: 0` because template.css sets them per-side with a
   higher-specificity selector, so they are cleared per side here. */
body.com-virtuemart table.cart-summary,
body.com-virtuemart table.cart-summary tr,
body.com-virtuemart table.cart-summary th,
body.com-virtuemart table.cart-summary td {
  border-left: 0 !important; border-right: 0 !important; border-top: 0 !important;
}
body.com-virtuemart table.cart-summary th,
body.com-virtuemart table.cart-summary td { border-bottom: 1px solid #EDECE8 !important; }
body.com-virtuemart table.cart-summary thead th,
body.com-virtuemart table.cart-summary tr:first-child th {
  border-bottom: 1px solid #E2E1DC !important;
}
body.com-virtuemart table.cart-summary tr:last-child td { border-bottom: 0 !important; }

/* the product cell: thumbnail beside the name, not stacked above it */
body.com-virtuemart table.cart-summary td .align-items-center {
  display: flex !important; align-items: center !important;
  justify-content: flex-start !important; gap: 14px; text-align: left !important;
}
body.com-virtuemart table.cart-summary .cart-images {
  display: block !important; flex: 0 0 auto; margin: 0 !important;
}
body.com-virtuemart .cart-images img { margin: 0 !important; }
body.com-virtuemart table.cart-summary td .clearfix.centered { display: none; }

/* stepper icons were invisible - the glyph kept the button's default colour */
body.com-virtuemart .vm-cart-item-quantity .btn.vmicon i { color: inherit !important; }

/* the coupon row sat on the template's grey; the card is white */
body.com-virtuemart table.cart-summary tr.sectiontableentry2 td { background: #FFFFFF; }
body.com-virtuemart table.cart-summary tr.sectiontableentry2:last-child td { background: #FBFAF8; }

/* selected shipment / payment: name on its own line, description under it */
body.com-virtuemart .vmshipment_name,
body.com-virtuemart .vmpayment_name {
  display: block; font-size: 15px; font-weight: 600; color: #14212A;
}
body.com-virtuemart .vmshipment_description,
body.com-virtuemart .vmpayment_description {
  display: block; margin-top: 3px; font-size: 13.5px; line-height: 1.55; color: #5C6E79;
}
/* it is a status line, not a centred banner */
body.com-virtuemart table.cart-summary td > h4 + span,
body.com-virtuemart table.cart-summary .floatright:empty { display: inline; }
body.com-virtuemart table.cart-summary td[colspan] { text-align: left; }
body.com-virtuemart table.cart-summary td[colspan][align="right"] { text-align: right; }

/* links inside the store area follow the brand, not Joomla's default red */
body.com-virtuemart #cart-view a:not(.btn):not(.vm-button-correct),
body.com-virtuemart #checkoutForm a:not(.btn) { color: #0A5C82; }
body.com-virtuemart #cart-view a:not(.btn):hover { color: #22A9E1; }

/* the checkout button sits at the end of the flow, right-aligned on desktop */
body.com-virtuemart .checkout-button-top {
  display: flex !important; justify-content: flex-end; margin: 10px 0 0 !important;
}
@media (max-width: 767px) {
  body.com-virtuemart .checkout-button-top { justify-content: stretch; }
}

/* --- cart, third pass ---------------------------------------------------- */
body.com-virtuemart .checkout-button-top {
  justify-content: flex-end !important; align-items: center;
}
@media (max-width: 767px) {
  body.com-virtuemart .checkout-button-top { justify-content: stretch !important; }
}

/* the subtotal line is a label for the figure on its right, not a centred
   caption floating in the middle of the table */
body.com-virtuemart table.cart-summary td[colspan="4"][align="center"] {
  text-align: right !important; font-size: 14px; color: #5C6E79;
}

/* Terms of Service: the checkbox is a sibling of its label in VirtueMart's
   markup, so the row has to be laid out from the fieldset down */
body.com-virtuemart .vm-fieldset-tos .cart.tos {
  display: flex; flex-wrap: wrap; align-items: center; gap: 10px;
}
body.com-virtuemart .vm-fieldset-tos span.cart.tos { flex: 0 0 100%; margin-bottom: 2px; }
body.com-virtuemart .vm-fieldset-tos .terms-of-service { margin: 0; }
body.com-virtuemart .vm-fieldset-tos .terms-of-service label { margin: 0; align-items: center; }
body.com-virtuemart .vm-fieldset-tos a.terms-of-service i { margin-right: 6px; }

/* --- header logo alignment ----------------------------------------------- */
/* The logo column is 78px tall and the menu column is 91px, and the header row
   leaves align-items at its default (stretch). Each column then centres its
   own content inside its own height, so the wordmark sat ~6px above the centre
   line of the nav links - visible as the logo riding high next to "Products".
   Centring the row's columns puts both on the same axis. */
/* The real cause: the nav links carry line-height:78px as inline-blocks, and
   the caret inside pushes the line box to 90px - so the menu column is 13px
   taller than the 78px header and hangs below it, putting its optical centre
   6-7px under the logo's. Laying the link out as a flex box with its own
   padding gives it a predictable height (and keeps a ~44px hit area), and
   centring the header row puts both columns on one axis.
   The wrapper is .sticky__wrapper > .container > .row, so the row is matched
   by descendant rather than by child. */
#sp-header .row { align-items: center; }
#sp-header .logo { display: flex; align-items: center; }


/* --- mega panels, second pass -------------------------------------------- */
/* The Products panel is now four family columns plus the promo, with the 2026
   feature links moved out of the columns into a footer strip. They were a
   fifth column of six links, which squeezed the four product columns to
   104px and put feature pages at the same level as product families. */
/* The promo is a COLUMN on the right, not a strip across the bottom. It was
   wrapping because .imsi-mega-products allowed wrapping and the four-column
   grid takes its full intrinsic width first, leaving the promo nothing to sit
   beside. Holding the row on one line and letting the grid shrink (min-width:0
   - a grid's default min-width is auto, which is what stops it shrinking) puts
   it back beside the columns. */
.imsi-mega-products { flex-wrap: nowrap; align-items: stretch; }
/* FIVE columns since TurboCAD Mac stopped being a footnote in the TurboCAD
   column. The promo gives back 30px and the gap tightens by 4 to pay for it;
   below 1200 the panel is narrower than five readable columns, so it goes to
   three and the promo drops under them. */
.imsi-mega-products .imsi-mega-cols {
  grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 18px;
  flex: 1 1 auto; min-width: 0;
}
.imsi-mega-products .imsi-menu-promo { flex: 0 0 220px; max-width: 220px;
  padding-left: 18px; }
@media (max-width: 1199px) {
  .imsi-mega-products { flex-wrap: wrap; }
  .imsi-mega-products .imsi-mega-cols {
    grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .imsi-mega-products .imsi-menu-promo { flex: 1 1 100%; max-width: none;
    padding-left: 0; border-left: 0; margin-top: 14px;
    border-top: 1px solid #EDEBE6; padding-top: 14px; }
}
@media (max-width: 991.98px) {
  .imsi-mega-products .imsi-mega-cols {
    grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* A column heading is the family page. It was plain text sitting above four
   links, which reads as a label and is the first thing a pointer lands on. */
#sp-header .sp-dropdown-mega .imsi-mega-col h6 a {
  display: block; padding: 0; color: inherit !important; text-decoration: none;
}
#sp-header .sp-dropdown-mega .imsi-mega-col h6 a:hover { color: #0A5C82 !important; }
.imsi-mega-col-d { display: block; margin: -4px 0 10px; font-size: 12px;
  line-height: 1.5; color: #7A8B95; }
.imsi-mega-col-p { display: block; margin-top: 10px; padding-top: 9px;
  border-top: 1px solid #EDEBE6;
  font-family: 'IBM Plex Mono', SFMono-Regular, Consolas, monospace;
  font-size: 11.5px; color: #5C6E79; }
.imsi-mega-col-p b { color: #14212A; font-weight: 600; }
#sp-header .sp-dropdown-mega .imsi-mega-col-p a { color: #0A5C82 !important;
  font-weight: 600; padding: 0; display: inline; }

/* The 2026 feature links live in the right-hand column with the picture, not
   in a strip across the bottom: one column on the right carrying the list and
   the image under it. */
.imsi-menu-promo-news .imsi-menu-news { list-style: none; margin: 0 0 16px; padding: 0; }
.imsi-menu-promo-news .imsi-menu-news li { margin: 0; }
#sp-header .sp-dropdown-mega .imsi-menu-news a {
  display: block; padding: 6px 0; font-size: 13.5px; line-height: 1.4;
  color: #31424C !important; text-decoration: none;
}
#sp-header .sp-dropdown-mega .imsi-menu-news a:hover { color: #0A5C82 !important; }
/* The promo media box was laid out as a centred FLEX ROW (for a single logo),
   so once a caption was added beside the image the two shared the 118px box
   and the caption wrapped to three words a line. It is a picture with a line
   under it: stack them and let the box size itself. */
.imsi-menu-promo-news .imsi-menu-promo-media {
  display: block !important; height: auto !important;
}
.imsi-menu-promo-news .imsi-menu-promo-media img {
  height: 108px; width: 100%; object-fit: cover; border-radius: 3px;
}
.imsi-menu-promo-cap { display: block; margin-top: 8px;
  font-family: 'IBM Plex Mono', SFMono-Regular, Consolas, monospace;
  font-size: 11px; color: #7A8B95; }
#sp-header .sp-dropdown-mega a.imsi-menu-promo-media:hover .imsi-menu-promo-cap {
  color: #0A5C82;
}

/* the Support panel's promo is a renewal CTA rather than a picture */
.imsi-menu-promo-cta { background: #FBFAF8; border-radius: 4px; padding: 20px 20px 22px;
  border-left: 1px solid #EDEBE6; }
.imsi-menu-promo-cta .imsi-menu-promo-eyebrow { color: #B8751F; }
.imsi-menu-promo-cta p { margin: 0 0 12px; }
.imsi-menu-promo-cta .imsi-menu-stats { list-style: none; margin: 0 0 14px; padding: 0;
  display: flex; flex-direction: column; gap: 2px; }
#sp-header .sp-dropdown-mega .imsi-menu-promo-cta .imsi-menu-stats a {
  display: block; padding: 5px 0; font-size: 13px; color: #0A5C82 !important;
  font-weight: 600; text-decoration: none;
}
#sp-header .sp-dropdown-mega .imsi-menu-promo-cta .imsi-menu-stats a:hover {
  color: #22A9E1 !important;
}
a.imsi-menu-promo-btn-solid { width: 100%; text-align: center; }

@media (max-width: 991.98px) {
  .imsi-mega-products .imsi-mega-cols { grid-template-columns: repeat(2, 1fr); }
  .imsi-mega-foot { margin-top: 16px; }
}

/* The Products panel carries four product columns, the promo and a footer
   strip; 880px squeezes the columns to ~150px. The other panels are lists and
   stay at 880. (The menu item's own width param is overridden by the 880px
   rule above, so the widening has to happen here too.) */
/* min() so the panel never runs wider than the window on a 1024 or 1280
   laptop - the mega panel is positioned against the header, not the column,
   so an over-wide panel would simply hang off the right edge. */
#sp-header .sp-dropdown.sp-dropdown-mega:has(.imsi-mega-products) {
  width: min(1140px, calc(100vw - 48px)) !important;
}
@media (max-width: 1180px) {
  .imsi-mega-products .imsi-mega-cols { gap: 14px; }
  .imsi-mega-products .imsi-menu-promo { flex: 0 0 190px; max-width: 190px; }
}

/* --- Products panel: the editions, with their prices --------------------- */
/* The columns listed the family page four times over ("TurboCAD for Windows",
   "Compare the four editions"); what a buyer is looking for in a product menu
   is the edition and what it costs. Each row is now a link to that edition's
   own detail page with its perpetual price set right, so the price column
   lines up down the menu. */
.imsi-mega-eds li { margin: 0; }
#sp-header .sp-dropdown-mega .imsi-mega-eds a {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: 10px; padding: 6px 0 !important;
}
#sp-header .sp-dropdown-mega .imsi-mega-eds a em {
  flex: 0 0 auto; font-family: 'IBM Plex Mono', SFMono-Regular, Consolas, monospace;
  font-size: 11.5px; font-style: normal; color: #7A8B95;
}
#sp-header .sp-dropdown-mega .imsi-mega-eds a:hover em { color: #0A5C82; }
/* the footer line under each column is three small links, not a price line */
.imsi-mega-col-p { white-space: normal; }
/* DesignCAD has two editions where the others have four, so its footer line
   floated up mid-panel. Push every column's footer to the bottom of the row
   so the four of them sit on one line. */
.imsi-mega-products .imsi-mega-col { display: flex; flex-direction: column; }
.imsi-mega-products .imsi-mega-col .imsi-mega-col-p { margin-top: auto; }

/* ==========================================================================
   DROPDOWN TYPOGRAPHY
   The panels were set in one weight of IBM Plex Sans at one size, so a column
   heading, a product link and a description all carried the same voice. The
   site's display face is Archivo; using it for the headings and item titles is
   what separates the three levels without adding rules or colour.
   ========================================================================== */
#sp-header .sp-dropdown-mega .imsi-mega-col h6 {
  font-family: 'Archivo', 'Helvetica Neue', Helvetica, Arial, sans-serif;
  font-size: 12px; font-weight: 700; letter-spacing: 0.06em;
  text-transform: uppercase; color: #7A8B95;
  padding-bottom: 10px; margin-bottom: 12px;
}
#sp-header .sp-dropdown-mega .imsi-mega-col h6 sup { letter-spacing: 0; }
#sp-header .sp-dropdown-mega .imsi-mega-col a {
  font-family: 'Archivo', 'Helvetica Neue', Helvetica, Arial, sans-serif;
  font-size: 14px; font-weight: 500; letter-spacing: -0.005em;
  line-height: 1.45; padding: 7px 0;
}
#sp-header .sp-dropdown-mega .imsi-mega-item-t {
  font-family: 'Archivo', 'Helvetica Neue', Helvetica, Arial, sans-serif;
  font-size: 14.5px; font-weight: 600; letter-spacing: -0.01em;
}
#sp-header .sp-dropdown-mega .imsi-mega-item-d {
  font-size: 12.5px; line-height: 1.5; color: #7A8B95;
}
#sp-header .sp-dropdown-mega .imsi-menu-promo h6 {
  letter-spacing: -0.02em;
}
#sp-header .sp-dropdown-mega .imsi-menu-news a,
#sp-header .sp-dropdown-mega .imsi-menu-stats a {
  font-family: 'Archivo', 'Helvetica Neue', Helvetica, Arial, sans-serif;
  font-weight: 500; letter-spacing: -0.005em;
}
/* the panel is a light surface; its links should not inherit the dark-header
   letter-spacing that the nav bar itself uses */
#sp-header .sp-dropdown-mega { letter-spacing: normal; }

/* --- pagination on template-drawn pages ---------------------------------- */
/* Joomla's pagination markup here is <li class="active"><a class="page-link">
   with NO href and no .page-item, so Bootstrap's own "white text on the
   active page" rule never matches and Flex's preset only sets the background.
   Stock Flex therefore painted a dark-blue "1" on an orange chip; once the
   preset became blue that turned into blue on blue. Set the text explicitly
   and give the whole control the site's square, quiet chrome. */
.pagination { gap: 6px; }
.pagination > li > a,
.pagination > li > span {
  border: 1px solid #E2E1DC !important;
  border-radius: 3px !important;
  background: #FFFFFF;
  font-family: 'Archivo', 'Helvetica Neue', Helvetica, Arial, sans-serif;
  font-size: 14px; font-weight: 600; color: #14212A !important;
  min-width: 40px; text-align: center;
}
.pagination > li > a:hover,
.pagination > li > a:focus {
  border-color: #0A5C82 !important; color: #0A5C82 !important;
}
.pagination > .active > a,
.pagination > .active > span,
.pagination > .active > a:hover,
.pagination > .active > a:focus {
  background: #0A5C82 !important; border-color: #0A5C82 !important;
  color: #FFFFFF !important;
}
.pagination > .disabled > a,
.pagination > .disabled > span { color: #A9B4BB !important; }
.pagination-wrapper .counter,
.pagination-wrapper p.counter { color: #7A8B95; font-size: 13px; }

/* --- cart: no customer-note field ---------------------------------------- */
/* "Notes and special requests" is a free-text box on an all-digital order that
   nobody reads before fulfilment - the ESD pipeline never sees it. Removed
   from the layout rather than the database, so the field is still there if the
   store ever needs it back. */
body.com-virtuemart .vm-fieldset-customer-note { display: none !important; }

/* ==========================================================================
   SUB-PAGES: the Joomla components that are not SP Page Builder
   ==========================================================================
   /component/users/*, the search results and the plain-article views render
   from Joomla's own layouts in the Flex template's palette - tomato buttons,
   a tomato line-drawing watermark, Bootstrap's default type. A visitor hits
   these at the worst possible moment (they cannot sign in, or cannot find
   something), so they should look like the rest of the site.

   Scoped by the body class Joomla already sets, so nothing here can reach the
   SPPB pages or the store.
   ========================================================================== */
body.com-users #sp-main-body,
body.com-finder #sp-main-body {
  background: #F6F5F2;
  padding-top: 56px; padding-bottom: 80px;
}
body.com-users #sp-header,
body.com-finder #sp-header { position: relative !important; background: #0C1418 !important; }

/* the panel these forms sit in */
body.com-users .com-users-login__form,
body.com-users .com-users-remind__form,
body.com-users .com-users-reset__form,
body.com-users .com-users-registration__form,
body.com-users .com-users-profile,
body.com-finder #search-form {
  max-width: 560px; margin: 0 auto; padding: 34px 36px !important;
  background: #FFFFFF; border: 1px solid #E2E1DC; border-radius: 4px;
  box-shadow: none;
}
/* Flex's .well adds its own inset shadow and grey */
body.com-users .well { background: #FFFFFF !important; border: 0 !important;
  box-shadow: none !important; }

body.com-users h1, body.com-users h2, body.com-users legend,
body.com-finder h1, body.com-finder h2 {
  font-family: 'Archivo', 'Helvetica Neue', Helvetica, Arial, sans-serif;
  font-weight: 700; letter-spacing: -0.02em; color: #14212A; border: 0;
}
body.com-users legend { font-size: 20px; margin-bottom: 18px; }
body.com-users p, body.com-finder p { font-size: 15px; line-height: 1.6; color: #4B5D68; }

body.com-users label, body.com-finder label {
  font-size: 13.5px; font-weight: 600; color: #31424C; margin-bottom: 6px;
}
body.com-users .form-control, body.com-users input[type="text"],
body.com-users input[type="email"], body.com-users input[type="password"],
body.com-finder .form-control, body.com-finder input[type="text"] {
  height: 46px; border: 1px solid #C7D3D9; border-radius: 3px; padding: 0 14px;
  font-size: 14.5px; color: #14212A; background: #FFFFFF; box-shadow: none;
}
body.com-users .form-control:focus, body.com-finder .form-control:focus {
  border-color: #0A5C82; outline: 2px solid rgba(34,169,225,0.35); outline-offset: -1px;
  box-shadow: none;
}

/* one primary button, in the brand blue - never the template's tomato */
body.com-users .btn-primary, body.com-users button[type="submit"],
body.com-finder .btn-primary, body.com-finder button[type="submit"] {
  background: #0A5C82 !important; border: 0 !important; border-radius: 3px;
  color: #FFFFFF !important;
  font-family: 'IBM Plex Sans', system-ui, sans-serif;
  font-size: 15px; font-weight: 600; padding: 13px 26px;
  text-shadow: none !important; box-shadow: none !important;
}
body.com-users .btn-primary:hover, body.com-finder .btn-primary:hover {
  background: #095377 !important;
}
body.com-users .btn-secondary, body.com-users .btn-default {
  background: #FFFFFF !important; border: 1px solid #C7D3D9 !important;
  color: #0A5C82 !important; box-shadow: none !important; text-shadow: none !important;
}
/* Flex's 3D button treatment is a gradient plus two shadows */
body.com-users .btn-3d, body.com-finder .btn-3d,
body.com-users .sppb-btn-3d { background-image: none !important; }

body.com-users a:not(.btn), body.com-finder a:not(.btn) { color: #0A5C82; }
body.com-users a:not(.btn):hover, body.com-finder a:not(.btn):hover { color: #22A9E1; }

/* the tomato line-art watermark beside the remind/reset forms */
body.com-users .pe-7s-mail-open-file,
body.com-users .pe-7s-key,
body.com-users .pe-7s-user[class*="d-none"] { display: none !important; }

/* Joomla's own messages */
body.com-users .alert, body.com-finder .alert {
  max-width: 560px; margin: 0 auto 18px; border-radius: 3px;
  border: 1px solid #C6E4F4; background: #F2FAFE; color: #095377; font-size: 14px;
}
body.com-users .alert-danger, body.com-finder .alert-danger {
  border-color: #EDD9BC; background: #FFF8EE; color: #7A5314;
}

/* search results read as a list of pages, not as a dump */
body.com-finder .result__title a {
  font-family: 'Archivo', sans-serif; font-size: 17px; font-weight: 600; color: #14212A;
}
body.com-finder .result__title a:hover { color: #0A5C82; }
body.com-finder .search-results > li,
body.com-finder .result { padding: 18px 0; border-bottom: 1px solid #E2E1DC; }

/* ==========================================================================
   MY LICENCES  (mod_imsi_licences, above-component on /my-account)
   The panel is rendered by a module rather than the page, because its content
   is per-customer and comes from the ESD licence endpoint. It therefore
   cannot use imsi-page.css - that file is embedded in page specs - so its
   chrome lives here with the rest of the site-wide styling.
   ========================================================================== */
.imsi-lic-panel { max-width: 1140px; margin: 0 auto; padding: 44px 15px 8px; }
.imsi-lic-h { margin: 0 0 18px; font-family: 'Archivo', 'Helvetica Neue', Helvetica,
  Arial, sans-serif; font-size: clamp(22px, 2.2vw, 28px); font-weight: 700;
  letter-spacing: -0.02em; color: #14212A; }
.imsi-lic-note { max-width: 62ch; margin: 0 0 16px; font-size: 14.5px;
  line-height: 1.65; color: #5C6E79; }
.imsi-lic-note a { color: #0A5C82 !important; }

.imsi-lic-list { list-style: none; margin: 0; padding: 0; display: grid;
  gap: 14px; grid-template-columns: repeat(3, minmax(0, 1fr)); }
.imsi-lic-card { display: flex; flex-direction: column; gap: 7px;
  padding: 20px 22px; background: #FFFFFF; border: 1px solid #E2E1DC;
  border-radius: 4px; }
.imsi-lic-top { display: flex; align-items: center; justify-content: space-between;
  gap: 12px; }
.imsi-lic-name { font-family: 'Archivo', sans-serif; font-size: 15.5px;
  font-weight: 700; color: #14212A; letter-spacing: -0.01em; }

/* the status chip: the mockup's three states, on a light card */
.imsi-lic-badge { flex: 0 0 auto; padding: 3px 7px; border-radius: 2px;
  font-family: 'IBM Plex Mono', SFMono-Regular, Consolas, monospace;
  font-size: 10px; font-weight: 600; letter-spacing: 0.08em; line-height: 1.5;
  white-space: nowrap; }
.imsi-lic-badge.is-ok   { background: #E3F3FB; color: #0A5C82; }
.imsi-lic-badge.is-warn { background: #FBF0DF; color: #8A5A16; }
.imsi-lic-badge.is-off  { background: #F0EEE9; color: #6B7A83; }

/* the key is deliberately MASKED - the endpoint never sends a full one, and
   the way to get the real key stays the flow that mails it to the address on
   the order */
.imsi-lic-key { font-family: 'IBM Plex Mono', SFMono-Regular, Consolas, monospace;
  font-size: 12px; color: #7A8B95; letter-spacing: 0.02em; }
.imsi-lic-meta { font-size: 12.5px; line-height: 1.55; color: #5C6E79; }
.imsi-lic-dates { color: #7A8B95; }

.imsi-lic-dl { display: flex; flex-direction: column; gap: 3px;
  margin-top: 6px; padding-top: 10px; border-top: 1px solid #EDEBE6; }
.imsi-lic-link { font-family: 'Archivo', sans-serif; font-size: 13px;
  font-weight: 600; color: #0A5C82 !important; text-decoration: none; }
.imsi-lic-link:hover { text-decoration: underline; }
.imsi-lic-dl-until, .imsi-lic-dl-off { font-size: 12px; color: #7A8B95; }

/* the buttons are the card's last row, so they line up across the three
   cards even when one carries an extra line of dates */
.imsi-lic-acts { display: flex; flex-wrap: wrap; gap: 8px;
  margin-top: auto; padding-top: 12px; }
a.imsi-lic-btn { display: inline-flex; align-items: center; justify-content: center;
  min-height: 38px; padding: 0 16px; border: 1px solid #C9D3D9; border-radius: 3px;
  background: #FFFFFF; font-family: 'Archivo', sans-serif; font-size: 13.5px;
  font-weight: 600; color: #14212A !important; text-decoration: none; }
a.imsi-lic-btn:hover { border-color: #0A5C82; color: #0A5C82 !important; }
a.imsi-lic-btn-primary { background: #0A5C82; border-color: #0A5C82;
  color: #FFFFFF !important; }
a.imsi-lic-btn-primary:hover { background: #084A69; color: #FFFFFF !important; }
a.imsi-lic-btn-wide { margin-top: 14px; width: 100%; }

@media (max-width: 991px) {
  .imsi-lic-list { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 575px) {
  .imsi-lic-list { grid-template-columns: 1fr; }
}

/* the one line that answers "renew or upgrade?" - the reason the panel shows
   orders at all. Quiet by default; amber where something has lapsed or is
   about to. */
.imsi-lic-advice { margin: 8px 0 0; padding: 9px 11px; border-radius: 3px;
  background: #F4F8FA; border-left: 2px solid #C7DCE7;
  font-size: 12.5px; line-height: 1.55; color: #3F525C; }
.imsi-lic-advice.is-warn { background: #FCF6EC; border-left-color: #E0B878;
  color: #6B5220; }
.imsi-lic-btn-p { margin-left: 7px;
  font-family: 'IBM Plex Mono', SFMono-Regular, Consolas, monospace;
  font-size: 11.5px; font-weight: 400; opacity: 0.85; }

/* demo mode: the panel is rendering invented orders so the page can be
   reviewed before the licence service exists. Unmissable on purpose. */
.imsi-lic-demo { display: inline-block; margin-left: 10px; padding: 3px 8px;
  border-radius: 2px; background: #FBF0DF; color: #8A5A16;
  font-family: 'IBM Plex Mono', SFMono-Regular, Consolas, monospace;
  font-size: 11px; font-weight: 600; letter-spacing: 0.06em;
  text-transform: uppercase; vertical-align: middle; }
.imsi-lic-demo-note { max-width: 78ch; margin-top: -6px; }

/* "New computer?" - the transfer line. Active M&S is what gates it, which
   makes this the most concrete reason to renew anywhere on the page. */
.imsi-lic-transfer { margin: 8px 0 0; font-size: 12.5px; line-height: 1.5;
  color: #5C6E79; }
.imsi-lic-transfer a { color: #0A5C82 !important; font-weight: 600;
  text-decoration: none; }
.imsi-lic-transfer a:hover { text-decoration: underline; }
.imsi-lic-transfer.is-off { color: #8A6A2F; }
.imsi-lic-badge.is-off { background: #F0EEE9; color: #6B7A83; }

/* ==========================================================================
   ONE GUTTER FOR THE WHOLE PAGE
   Three container widths were in play at the same viewport, so nothing lined
   up vertically: Bootstrap's `.container` gave the header 1140px, Flex's
   template.css gives every SP Page Builder row 1170px, and the home hero had
   been released from that to take SPPB's own 1320px max-width. At 1900px the
   logo started at x=384, the body rows at x=372 and the hero headline at
   x=297 - an 87px stagger between the logo and the sentence directly under it.

   The body rows are the majority and they are what a visitor reads down, so
   the header is moved onto THEIR grid rather than the other way round: the
   same widths template.css uses for .sppb-row-container, and the same 15px
   padding, so the logo's left edge is the page's left edge.
   ========================================================================== */
/* The header's .container is not a child of #sp-header - Helix3 wraps it in
   .sticky__wrapper - and its columns sit on Bootstrap 5's 24px gutter, half
   of SP Page Builder's 30px. Both have to move or the logo lands 4px off a
   container that is otherwise the right width: the gutter variable does it in
   one place, for the container, its row and every column inside. */
#sp-header .container,
#sp-header .container > .row { --bs-gutter-x: 30px; }
@media (min-width: 768px) {
  #sp-header .container { width: 750px; max-width: 750px; }
}
@media (min-width: 992px) {
  #sp-header .container { width: 970px; max-width: 970px; }
}
@media (min-width: 1200px) {
  #sp-header .container { width: 1170px; max-width: 1170px; }
}

/* A section we deep-link to must not land under the sticky header. SP Page
   Builder names its own sections "section-id-row-N"; anything else is an
   anchor we put there on purpose (#editions, #licence-options, #macos). */
.sppb-section[id]:not([id^="section-id-"]) { scroll-margin-top: 96px; }

/* Add-on card: the CADsymbols Web line under CADsymbols (build_more.py
   CADSYMBOLS_WEB). Matches the card's blurb, not body text. */
.imsi-addon-card .imsi-addon-also { font-size: 13.5px; line-height: 1.55; color: #5C6E79; margin: 10px 0 0; }

/* ---------------------------------------------------------------------------
   MOBILE MENU (build-mobile-menu.php). Below 992px the mega menu is hidden and
   the hamburger opens .offcanvas-menu; this is what it holds. One <details>
   per top-level item, built from the same panels as the desktop menu.
   Touch targets are 44px, per WCAG 2.5.5. */
.offcanvas-menu .offcanvas-inner { padding: 8px 22px 32px; }
.imsi-mnav { font-size: 15px; }
.imsi-mnav-sec { border-bottom: 1px solid #E3E7EA; }
.imsi-mnav-sec > summary {
  list-style: none; cursor: pointer; min-height: 52px; padding: 0 2px;
  display: flex; align-items: center; justify-content: space-between;
  font-size: 16.5px; font-weight: 650; color: #14212A;
}
.imsi-mnav-sec > summary::-webkit-details-marker { display: none; }
.imsi-mnav-sec > summary::after {
  content: "+"; font-size: 22px; font-weight: 400; line-height: 1; color: #0A5C82;
}
.imsi-mnav-sec[open] > summary::after { content: "\2212"; }
.imsi-mnav-sec > summary:focus-visible,
.imsi-mnav a:focus-visible { outline: 2px solid #0A5C82; outline-offset: 2px; }
.imsi-mnav-links { display: flex; flex-direction: column; padding: 0 2px 14px; }
.imsi-mnav-links a {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  min-height: 44px; padding: 0 0 0 14px; color: #2C3A43; text-decoration: none;
  font-size: 15px; line-height: 1.3;
}
.imsi-mnav-links a.imsi-mnav-h {
  padding-left: 0; margin-top: 4px; font-weight: 650; color: #0A5C82;
}
.imsi-mnav-links a em {
  font-style: normal; font-family: 'IBM Plex Mono', SFMono-Regular, Consolas, monospace;
  font-size: 13px; color: #5C6E79; white-space: nowrap;
}
.imsi-mnav-extras { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-top: 22px; }
.imsi-mnav-extras a {
  display: flex; align-items: center; gap: 9px; min-height: 48px; padding: 0 12px;
  border: 1px solid #D6DDE2; border-radius: 6px; background: #fff;
  font-size: 14px; font-weight: 600; color: #0A5C82; text-decoration: none;
}
.imsi-mnav-extras a i { width: 16px; text-align: center; }

/* Small-screen header: logo left, hamburger right.
   At <=992px the two header columns go `width: auto` (above), and the logo
   image is `max-width: 100%` - of a column whose width is set by that same
   image. The column collapsed to 30px, the 161px wordmark spilled out of it,
   and the hamburger column started at x=30, right on top of the logo. */
@media (max-width: 991.98px) {
  #sp-header .row {
    display: flex !important; flex-wrap: nowrap !important;
    align-items: center; justify-content: space-between;
  }
  #sp-header .row > #sp-logo { flex: 1 1 auto !important; min-width: 0; }
  #sp-header .row > #sp-menu { flex: 0 0 auto !important; }
  #sp-logo .logo img { max-width: none !important; }
  #offcanvas-toggler { height: 68px !important; width: 56px; margin-right: 4px !important; }
}

/* Sticky header on small screens. When the header sticks, Flex hides the
   default logo and shows .sp-sticky-logo - which on a phone rendered squeezed
   to 71x18 and pinned to the top edge of the bar. Keep the same mobile logo,
   which is already centred, in both states. */
@media (max-width: 991.98px) {
  #sp-header.sticky .sp-sticky-logo,
  #sp-header.menu-fixed .sp-sticky-logo { display: none !important; }
  #sp-header.sticky .sp-default-logo.d-block,
  #sp-header.menu-fixed .sp-default-logo.d-block { display: block !important; }
  #sp-logo .logo { align-items: center; }
}
/* ...and at desktop widths. The sticky logo there came out 0px wide and was
   positioned above the bar (template.css makes it absolute; the logo caps
   above leave it no width), so the header lost its logo on scroll - visible
   on every checkout page. Keep the default logo in both states. */
@media (min-width: 992px) {
  #sp-header.sticky .sp-sticky-logo,
  #sp-header.menu-fixed .sp-sticky-logo { display: none !important; }
  #sp-header.sticky .sp-default-logo.d-md-block,
  #sp-header.menu-fixed .sp-default-logo.d-md-block { display: block !important; }
}

/* VP One Page Checkout login box: Joomla's passkey button ("Sign in without
   a password", plg_system_webauthn) carries an unsized SVG, which VP OPC's
   .proopc-btn styles let fill the column - a 300px person-and-key icon. */
.proopc-btn.plg_system_webauthn_login_button {
  display: inline-flex !important; align-items: center; justify-content: center;
  gap: 8px; width: auto !important; height: auto !important; padding: 7px 14px !important;
}
.proopc-btn.plg_system_webauthn_login_button svg { width: 18px !important; height: 18px !important; flex: 0 0 18px; }

/* ==========================================================================
   VP One Page Checkout - cart lines (2026-09-22, Syed: "fix bold product names")
   VP OPC sets product names in Verdana, uppercase, weight 600, and lines with
   no image (the EDS/USB add-ons until they got images) sat flush left.
   ========================================================================== */
#proopc-pricelist .cart-product-description,
#ProOPC .cart-product-description {
  display: flex !important; align-items: center; gap: 14px; min-height: 64px;
}
#proopc-pricelist .cart-product-description .cart-images,
#ProOPC .cart-product-description .cart-images {
  flex: 0 0 56px; width: 56px !important; margin: 0 !important; float: none !important;
}
#proopc-pricelist .cart-product-description .cart-images img,
#ProOPC .cart-product-description .cart-images img {
  width: 56px !important; height: auto !important; border-radius: 3px;
}
/* a line without an image keeps the same indent as the ones with one */
/* VP OPC pads the cell 70px for its floated image and sets the name to
   display:table, which centred it - both undone now the image is a flex item */
#proopc-pricelist .cart-product-description,
#ProOPC .cart-product-description { margin: 0 !important; padding: 0 !important; }
#proopc-pricelist .cart-product-description:not(:has(.cart-images)),
#ProOPC .cart-product-description:not(:has(.cart-images)) { padding-left: 70px !important; }
#proopc-pricelist .cart-product-description > a,
#ProOPC .cart-product-description > a { display: block !important; margin: 0 !important; text-align: left !important; }
#proopc-pricelist table.cart-summary th.col-name,
#proopc-pricelist table.cart-summary td.col-name { width: 40%; padding-left: 14px !important; }
#proopc-pricelist table.cart-summary td.col-price,
#proopc-pricelist table.cart-summary td.col-total { font-variant-numeric: tabular-nums; }
#proopc-pricelist .cart-product-description > a,
#ProOPC .cart-product-description > a,
#ProOPC .proopc-product-name, #ProOPC .proopc-product-name a {
  text-transform: none !important; letter-spacing: 0 !important;
  font-family: 'IBM Plex Sans', system-ui, sans-serif !important;
  font-size: 15px !important; font-weight: 600 !important; line-height: 1.35 !important;
  color: #14212A !important; text-decoration: none;
}
#proopc-pricelist .cart-product-description > a:hover,
#ProOPC .cart-product-description > a:hover { color: #0A5C82 !important; }
#proopc-pricelist table.cart-summary td,
#proopc-pricelist table.cart-summary th { font-family: 'IBM Plex Sans', system-ui, sans-serif; vertical-align: middle; }
#proopc-pricelist table.cart-summary td { font-size: 14.5px; }
/* frame the cart like VP OPC's Guest / Login blocks below it (1px #ddd, square) */
#proopc-pricelist { border: 1px solid #DDDDDD; background: #FFFFFF; margin-bottom: 24px !important; }
#proopc-pricelist table.cart-summary { margin: 0 !important; border: 0 !important; }

/* ==========================================================================
   Customer account profile (com_users profile override, 2026-09-22)
   ========================================================================== */
body.com-users .com-users-profile.imsi-acct {
  max-width: 1040px; padding: 0 !important; background: transparent; border: 0; }
.imsi-acct-head { display: flex; justify-content: space-between; align-items: flex-end; gap: 24px; flex-wrap: wrap;
  background: #0C1418; color: #fff; border-radius: 4px; padding: 30px 34px; margin-bottom: 22px;
  background-image: linear-gradient(rgba(34,169,225,0.07) 1px, transparent 1px),
                    linear-gradient(90deg, rgba(34,169,225,0.07) 1px, transparent 1px); background-size: 32px 32px; }
.imsi-acct-eyebrow { font-family: 'IBM Plex Mono', monospace; font-size: 11.5px; letter-spacing: .16em;
  text-transform: uppercase; color: #22A9E1; }
body.com-users .imsi-acct-head h1 { color: #fff !important; font-size: 32px; margin: 6px 0 6px; }
body.com-users .imsi-acct-head p { color: #A8BCC5 !important; margin: 0; font-size: 14.5px; }
body.com-users .imsi-acct-head p strong { color: #fff; font-weight: 600; }
.imsi-acct-actions { display: flex; gap: 12px; flex-wrap: wrap; }
a.imsi-acct-btn { display: inline-block; background: #22A9E1; color: #08161D !important; font-weight: 700; font-size: 14.5px;
  padding: 12px 20px; border-radius: 3px; text-decoration: none; }
a.imsi-acct-btn:hover { background: #3CB8EA; }
a.imsi-acct-btn.imsi-acct-btn-ghost { background: transparent; color: #fff !important; border: 1px solid rgba(255,255,255,.3); }
a.imsi-acct-btn.imsi-acct-btn-ghost:hover { border-color: #22A9E1; color: #22A9E1 !important; }
.imsi-acct-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px; }
.imsi-acct-card { background: #fff; border: 1px solid #E2E1DC; border-radius: 4px; padding: 24px 26px; }
body.com-users .imsi-acct-card h2 { font-size: 18px; margin: 0 0 14px; }
dl.imsi-acct-dl { display: grid; grid-template-columns: 140px minmax(0, 1fr); gap: 10px 16px; margin: 0 0 16px; }
dl.imsi-acct-dl dt { font-size: 13px; font-weight: 600; color: #5C6E79; }
dl.imsi-acct-dl dd { margin: 0; font-size: 14.5px; color: #14212A; overflow-wrap: anywhere; }
a.imsi-acct-link { display: block; font-size: 14px; font-weight: 600; color: #0A5C82; text-decoration: none; margin-top: 8px; }
a.imsi-acct-link:hover { text-decoration: underline; }
ul.imsi-acct-links { list-style: none; margin: 0; padding: 0; }
ul.imsi-acct-links li + li { border-top: 1px solid #EDEBE6; }
ul.imsi-acct-links a { display: block; padding: 11px 0; text-decoration: none; }
ul.imsi-acct-links b { display: block; font-size: 14.5px; color: #0A5C82; }
ul.imsi-acct-links span { display: block; font-size: 13px; color: #5C6E79; margin-top: 2px; }
ul.imsi-acct-links a:hover b { text-decoration: underline; }
/* plugin fieldsets (passkeys) inside the security card */
.imsi-acct-security fieldset { border: 0; padding: 0; margin: 0 0 8px; }
.imsi-acct-security legend { font-size: 14px !important; font-weight: 700; margin: 0 0 6px !important; padding: 0; border: 0 !important; }
.imsi-acct-security legend svg { display: none; }
.imsi-acct-security dl { margin: 0; }
.imsi-acct-security dt { font-size: 13px; font-weight: 600; color: #5C6E79; }
.imsi-acct-security dd { margin: 0 0 8px; font-size: 14px; color: #14212A; }
.imsi-acct-help p { margin: 0 0 6px; }
@media (max-width: 800px) {
  .imsi-acct-grid { grid-template-columns: 1fr; }
  .imsi-acct-head { padding: 24px 20px; }
  dl.imsi-acct-dl { grid-template-columns: 1fr; gap: 2px; }
  dl.imsi-acct-dl dd { margin-bottom: 8px; }
}

/* password reset: the confirm and complete steps had no panel */
body.com-users .com-users-reset-confirm,
body.com-users .com-users-reset-complete,
body.com-users .com-users-remind,
body.com-users .com-users-reset {
  max-width: 560px; margin: 0 auto; }
body.com-users .com-users-reset-confirm__form,
body.com-users .com-users-reset-complete__form {
  max-width: 560px; margin: 0 auto; padding: 34px 36px !important;
  background: #FFFFFF; border: 1px solid #E2E1DC; border-radius: 4px; }
body.com-users .com-users-reset-confirm__form p,
body.com-users .com-users-reset-complete__form p { margin-top: 0; }

/* ==========================================================================
   Announcement bar (module "Announcement bar" in position top1) and header
   account/cart icons (injected by plg_system_imsivmroute), 2026-09-22
   ========================================================================== */
#sp-top-bar { background: #0A5C82 !important; padding: 0 !important; }
#sp-top-bar #sp-top1 { flex: 0 0 100%; max-width: 100%; width: 100% !important; }
#sp-top-bar #sp-top2 { display: none !important; }
#sp-top-bar .sp-column { float: none !important; }
.imsi-announce { text-align: center; padding: 9px 12px; font-family: 'IBM Plex Sans', system-ui, sans-serif;
  font-size: 13.5px; line-height: 1.4; color: #FFFFFF; }
.imsi-announce b { font-weight: 700; }
.imsi-announce .imsi-announce-tag { display: inline-block; font-family: 'IBM Plex Mono', monospace; font-size: 10.5px;
  letter-spacing: .14em; text-transform: uppercase; background: #22A9E1; color: #08161D; border-radius: 2px;
  padding: 2px 7px; margin-right: 10px; vertical-align: 1px; }
#sp-top-bar .imsi-announce a { color: #FFFFFF !important; font-weight: 700; text-decoration: underline;
  text-underline-offset: 3px; margin-left: 8px; }
#sp-top-bar .imsi-announce a:hover { color: #BFE8F8 !important; }
@media (max-width: 575.98px) { .imsi-announce { font-size: 12.5px; } .imsi-announce .imsi-announce-tag { display: none; } }

.sp-megamenu-wrapper { display: flex !important; align-items: center; justify-content: flex-end; }
.imsi-hdr-tools { display: flex; align-items: center; gap: 4px; margin-left: 18px; }
#sp-header .imsi-hdr-tools a { display: inline-flex; align-items: center; gap: 7px; height: 40px; line-height: 1;
  padding: 0 10px; border-radius: 3px; color: #EDEDED; font-size: 14px; font-weight: 600; text-decoration: none; position: relative; }
#sp-header .imsi-hdr-tools a:hover { color: #FFFFFF; background: rgba(255,255,255,.08); }
#sp-header .imsi-hdr-tools a.imsi-hdr-acct { border: 1px solid rgba(255,255,255,.22); }
.imsi-hdr-count { position: absolute; top: 3px; right: 1px; min-width: 17px; height: 17px; padding: 0 4px; border-radius: 9px;
  background: #22A9E1; color: #08161D; font-size: 11px; font-weight: 700; line-height: 17px; text-align: center; }
@media (max-width: 1199.98px) { .imsi-hdr-label { display: none; } #sp-header .imsi-hdr-tools a.imsi-hdr-acct { border: 0; } }
@media (max-width: 991.98px) { .imsi-hdr-tools { margin-left: 0; margin-right: 4px; } }
#sp-top-bar #sp-top1 .sp-column, #sp-top-bar .imsi-announce { width: 100%; }
/* login: heading and first-order note (template override, 2026-09-22) */
.imsi-login-head { margin-bottom: 22px; }
body.com-users .imsi-login-head h1 { font-size: 26px; margin: 0 0 6px; }
body.com-users .imsi-login-head p { margin: 0; font-size: 14.5px; }
body.com-users p.imsi-login-new { margin: 22px 0 0; padding-top: 18px; border-top: 1px solid #EDEBE6; font-size: 13.5px; }
body.com-users p.imsi-login-new a { color: #0A5C82; font-weight: 600; }
#sp-top-bar #sp-top1 .sp-module { display: block !important; width: 100%; }
/* account: sign-out form sits inline with the header buttons */
form.imsi-acct-signout { display: inline; margin: 0; }
form.imsi-acct-signout button.imsi-acct-btn { cursor: pointer; font-family: inherit; line-height: inherit; }
body.com-users form.imsi-acct-signout button.imsi-acct-btn-ghost { background: transparent !important; color: #fff !important;
  border: 1px solid rgba(255,255,255,.3) !important; padding: 12px 20px !important; font-size: 14.5px !important; font-weight: 700; }
body.com-users form.imsi-acct-signout button.imsi-acct-btn-ghost:hover { border-color: #22A9E1 !important; color: #22A9E1 !important; }

/* profile edit: a wider, sectioned form; MFA methods as a compact list */
body.com-users .com-users-profile__edit-form { max-width: 820px !important; }
body.com-users .com-users-profile__edit-form > fieldset,
body.com-users .com-users-profile__multifactor { border: 0; border-top: 1px solid #EDEBE6; padding: 22px 0 6px; margin: 0; }
body.com-users .com-users-profile__edit-form > fieldset:first-of-type { border-top: 0; padding-top: 0; }
body.com-users .com-users-profile__edit-form legend svg { display: none; }
body.com-users .com-users-profile__multifactor .card,
body.com-users .com-users-profile__multifactor [class*="method"] { border-radius: 4px; }
body.com-users .com-users-profile__multifactor img { max-height: 30px; width: auto; }
body.com-users .com-users-profile__multifactor h2,
body.com-users .com-users-profile__multifactor h3,
body.com-users .com-users-profile__multifactor h4 { font-size: 16px !important; margin: 0 !important; }

/* ==========================================================================
   Category pages (Blog, Case Studies, Press Releases): title band injected by
   plg_system_imsivmroute into Flex's empty #sp-page-title (2026-09-22)
   ========================================================================== */
#sp-page-title:has(.imsi-cat-hero) { background: #0C1418;
  background-image: linear-gradient(rgba(34,169,225,0.07) 1px, transparent 1px),
                    linear-gradient(90deg, rgba(34,169,225,0.07) 1px, transparent 1px);
  background-size: 32px 32px; margin: 0; }
#sp-page-title:has(.imsi-cat-hero) > .row { margin: 0; }
.imsi-cat-hero { max-width: 1140px; margin: 0 auto; padding: 56px 15px 52px; }
.imsi-cat-eyebrow { display: block; font-family: 'IBM Plex Mono', monospace; font-size: 11.5px; letter-spacing: .16em;
  text-transform: uppercase; color: #22A9E1; margin-bottom: 10px; }
#sp-page-title .imsi-cat-hero h1 { font-family: 'Archivo', 'Helvetica Neue', Arial, sans-serif; font-weight: 800;
  font-size: clamp(34px, 4vw, 52px); line-height: 1.08; letter-spacing: -0.02em; color: #FFFFFF; margin: 0 0 12px; }
#sp-page-title .imsi-cat-hero h1::after { display: none !important; }
.imsi-cat-hero p { font-size: 17px; line-height: 1.6; color: #A8BCC5; max-width: 640px; margin: 0; }
body.com-content.view-category #sp-main-body { padding-top: 44px; }

/* blog cards: titles aligned, no theme rule under them, intro clamped */
.blog article.item .entry-header { border: 0 !important; }
.blog article.item .entry-header h2 { border: 0 !important; padding-bottom: 0 !important; box-shadow: none !important;
  display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;
  min-height: calc(1.34em * 3); }
.blog article.item .entry-header h2 a { border: 0 !important; background: none !important; text-decoration: none; }
.blog article.item .a3d-post__body > * { margin-bottom: 0; }
.blog article.item .a3d-post__body > p:first-child {
  display: -webkit-box; -webkit-line-clamp: 4; -webkit-box-orient: vertical; overflow: hidden; }
.blog article.item .a3d-post__body > :not(:first-child) { display: none !important; }

/* sidebar: counts as small badges, recent posts at a readable line height */
.imsi-blogside .imsi-bs-cats a { display: flex !important; justify-content: space-between; align-items: center; gap: 10px; }
.imsi-blogside .imsi-bs-cats b { font-family: 'IBM Plex Mono', monospace; font-size: 11.5px !important; font-weight: 500;
  color: #5C6E79; background: #F1F0EC; border-radius: 10px; padding: 1px 8px; line-height: 1.6; }
.imsi-blogside .imsi-bs-recent a { line-height: 1.45 !important; padding: 10px 0 !important; display: block; }
/* the (hidden) share row's wrapper still drew a rule at the foot of each card */
.blog article.item .readmore ~ div { display: none !important; }

/* ------------------------------------------------------------------
   Custom-order product page (VirtueMart productdetails).

   The only products that reach this view are the one-off quotes in the
   "Custom orders" category - every other product page is redirected by
   plg_imsivmroute. So this styles VirtueMart's stock template into a
   quote page: what it is, what it costs, and a buy button. The parts of
   the template that make no sense for a quote (stock badge, star rating,
   the no-image placeholder, back-to-category, prev/next, print and PDF
   icons, the reviews tab) are hidden rather than deleted, so a Flex
   template update cannot half-remove them.
   ------------------------------------------------------------------ */
.productdetails-view .product-in-stock,
.productdetails-view .ratingbox,
.productdetails-view .back-to-category,
.productdetails-view .product-neighbours,
.productdetails-view .vm-icons,
.productdetails-view .products-desc-tab .nav-tabs,
.productdetails-view .customer-reviews,
.productdetails-view .vm-product-media-img:has(img[src*="noimage"]) { display: none !important; }

.productdetails-view { max-width: 960px; margin: 0 auto; padding: 8px 0 24px; }
.productdetails-view, .productdetails-view * { min-width: 0; }
/* grid, not Bootstrap's row: the theme overrides .row's display, which left
   the picture stacked above the copy instead of beside it */
.productdetails-view .vm-product-wrap { display: grid !important; grid-template-columns: 210px 1fr;
  gap: 38px; align-items: start; margin: 0; }
.productdetails-view .vm-product-media-img,
.productdetails-view .vm-product-details-inner { max-width: none; width: auto; padding: 0; margin: 0;
  flex: none; }
.productdetails-view .vm-product-media-img img { width: 100%; height: auto; border-radius: 10px; display: block; }
.productdetails-view .vm-img-desc { display: none; }
.productdetails-view .vm-product-wrap > .clear { display: none; }
@media (max-width: 782px) {
  /* one column on a phone: 150px + text is narrower than the words in it, and
     the overflow scrolled the whole page sideways */
  .productdetails-view .vm-product-wrap { grid-template-columns: minmax(0, 1fr); gap: 20px; }
  .productdetails-view .vm-product-media-img { max-width: 170px; }
}
.productdetails-view .vm-product-title { display: block; margin-bottom: 6px; }
.productdetails-view .vm-product-title .pull-left { float: none !important; }
.productdetails-view .vm-product-title h2 {
  font-family: 'Archivo', 'Helvetica Neue', Arial, sans-serif; font-weight: 800;
  font-size: clamp(28px, 3.4vw, 40px); line-height: 1.12; letter-spacing: -0.02em;
  color: #16242B; margin: 0; }
.productdetails-view .vm-product-title::before {
  content: 'Custom order'; display: block; font-family: 'IBM Plex Mono', monospace;
  font-size: 11.5px; letter-spacing: .16em; text-transform: uppercase;
  color: #1782AE; margin-bottom: 10px; }

.productdetails-view .product-price { margin: 18px 0 4px !important; }
.productdetails-view .PricesalesPrice { font-family: 'Archivo', sans-serif; font-weight: 800;
  font-size: 30px; color: #16242B; }
.productdetails-view .product-short-description { border-top: 1px solid #E4E2DC;
  border-bottom: 1px solid #E4E2DC; padding: 20px 0; margin: 22px 0; color: #40525C;
  font-size: 16px; line-height: 1.65; }
.productdetails-view .product-short-description h4 { font-family: 'IBM Plex Mono', monospace;
  font-size: 11.5px; letter-spacing: .16em; text-transform: uppercase; color: #5C6E79;
  margin: 0 0 8px; font-weight: 500; }
.productdetails-view .product-short-description h4 i { display: none; }

.productdetails-view .addtocart-button,
.productdetails-view input.addtocart-button {
  background: #22A9E1 !important; border: 0 !important; color: #fff !important;
  font-family: 'Archivo', sans-serif; font-weight: 700; font-size: 15px;
  letter-spacing: .01em; padding: 13px 30px !important; border-radius: 4px;
  text-transform: none; box-shadow: none; }
.productdetails-view .addtocart-button:hover { background: #1782AE !important; }
.productdetails-view .quantity-box { margin-right: 10px; }

.productdetails-view .products-desc-tab { margin-top: 26px; }
.productdetails-view .product-description { color: #40525C; font-size: 16px; line-height: 1.7; }
.productdetails-view .tab-pane.review { display: none !important; }
/* flatten the doubled white panels VirtueMart nests around the buy button
   and the description, so the quote page reads as one column */
.productdetails-view .addtocart-area,
.productdetails-view form.product,
.productdetails-view .products-desc-tab,
.productdetails-view .tab-content {
  background: none !important; border: 0 !important; padding: 0 !important;
  box-shadow: none !important; }
.productdetails-view .spacer-buy-area { margin: 4px 0 8px; }
.productdetails-view .products-desc-tab { margin-top: 24px; }

/* the two standing blocks on a quote page: whose price this is, and what
   happens after they press the button */
.imsi-quote-note { margin: 14px 0 0; font-size: 14.5px; line-height: 1.6; color: #5C6E79;
  border-left: 3px solid #22A9E1; padding-left: 14px; }
.imsi-quote-next { border-top: 1px solid #E4E2DC; margin-top: 26px; padding-top: 22px; }
.imsi-quote-next h3 { font-family: 'IBM Plex Mono', monospace; font-size: 11.5px;
  letter-spacing: .16em; text-transform: uppercase; color: #5C6E79; font-weight: 500; margin: 0 0 14px; }
.imsi-quote-next ol { margin: 0 0 16px; padding-left: 20px; color: #40525C; font-size: 15.5px;
  line-height: 1.65; }
.imsi-quote-next ol li { margin-bottom: 9px; }
.imsi-quote-next ol li strong { color: #16242B; }
.imsi-quote-next > p { margin: 0; font-size: 14.5px; line-height: 1.6; color: #5C6E79; }

/* the print/PDF icons sat in a floated wrapper that left a tall gap between
   the buy area and the full description */
.productdetails-view + .row > .float-end,
.productdetails-view ~ .row > .float-end { display: none !important; }
.productdetails-view ~ .row { margin: 0; }
/* the long description sits in its own row below the grid; line it up with the
   copy column rather than with the page edge, and close the gap the hidden
   print icons left behind */
.productdetails-view > .row { margin: 0; }
.productdetails-view .products-desc-tab { padding-left: 248px !important; margin-top: 0; }
@media (max-width: 782px) {
  .productdetails-view .products-desc-tab { padding-left: 0 !important; }
}

/* ------------------------------------------------------------------
   Footer: the social row.

   First cut put each glyph in a filled circle, and on the dark footer
   they read as dark marks on pale discs - the opposite of the intent,
   because the theme's own footer link colour won over the rule. No
   disc now: the glyph IS the control, sized so it is legible, in a
   colour set specifically enough to win, with a generous hit area.
   Inline SVG in currentColor, so no icon font and no third-party
   request from the foot of every page.
   ------------------------------------------------------------------ */
.imsi-fbrand .imsi-fsocial { list-style: none; display: flex; flex-wrap: wrap;
  gap: 6px; margin: 22px 0 0; padding: 0; }
.imsi-fbrand .imsi-fsocial li { margin: 0; padding: 0; border: 0; }
.imsi-fbrand .imsi-fsocial a { display: inline-flex; align-items: center;
  justify-content: center; width: 38px; height: 38px; border-radius: 6px;
  color: #B9C9D1 !important; background: transparent !important; border: 0 !important;
  box-shadow: none !important; text-decoration: none !important;
  transition: color .15s ease, background-color .15s ease; }
.imsi-fbrand .imsi-fsocial a:hover,
.imsi-fbrand .imsi-fsocial a:focus-visible {
  color: #FFFFFF !important; background: rgba(34,169,225,.22) !important; }
.imsi-fbrand .imsi-fsocial a:focus-visible { outline: 2px solid #22A9E1; outline-offset: 1px; }
.imsi-fbrand .imsi-fsocial svg { display: block; width: 21px; height: 21px; }

/* ------------------------------------------------------------------
   Announcement bar height (2026-09-24).

   The header is absolutely positioned and sits below this bar, so the
   bar's height decides where the header lands. Left to wrap, it grew
   to three lines on a narrow window and pushed the header down onto
   the hero, over the sub-heading and both buttons. Keep it compact:
   smaller type before it wraps, and the trailing sentence goes before
   the link does, so "New · TurboCAD 2026.1 · See what's new" always
   fits on one or two lines.
   ------------------------------------------------------------------ */
#sp-top-bar .imsi-announce { display: flex; flex-wrap: wrap; align-items: center;
  justify-content: center; gap: 6px 8px; line-height: 1.35; }
@media (max-width: 991px) {
  #sp-top-bar .imsi-announce { font-size: 12.5px; }
}
@media (max-width: 767px) {
  #sp-top-bar .imsi-announce { font-size: 11.5px; gap: 4px 6px; }
  /* the explanatory clause is the first thing to go - the release name
     and the link are what the bar is for */
  #sp-top-bar .imsi-announce .imsi-announce-sub { display: none; }
}
