Sheds (NI) - Garden Leisure (NI) - Greenhouses (NI)
  • Home
  • Storm Shed
  • Greenhouses
  • Summer Houses
  • BBQ Huts
  • Picture Gallery
  • Contact
  • Terms and Conditions

​<!-- =========================
     FULL-WIDTH OVERRIDE (DROP-IN)
     Put at TOP of page
     Purpose: remove left/right buffers (padding/margins)
     Does NOT require any changes to other blocks
========================= -->
<style>
/* Prevent accidental sideways scroll */
html, body { max-width:100%; overflow-x:hidden; }

/* Most Weebly themes add side padding via these wrappers */
#wsite-content,
.wsite-content,
.page-content,
.main-wrap,
.content-wrap,
.container,
#wsite-content-wrapper,
#wsite-wrapper,
.wrapper,
.wsite-section-content,
.wsite-section-elements,
.wsite-section,
.wsite-section-bg,
.wsite-section-bg-image,
.wsite-section-bg-color{
  padding-left: 0 !important;
  padding-right: 0 !important;
  margin-left: 0 !important;
  margin-right: 0 !important;
  max-width: 100% !important;
}

/* Some themes use a centered inner container */
.wsite-section-content > .container,
.wsite-section-content > .wsite-section-elements{
  padding-left: 0 !important;
  padding-right: 0 !important;
  margin-left: 0 !important;
  margin-right: 0 !important;
  max-width: 100% !important;
}

/* If your theme applies padding to rows/columns */
.wsite-multicol,
.wsite-multicol-table,
.wsite-multicol-col,
.wsite-multicol-col > div{
  padding-left: 0 !important;
  padding-right: 0 !important;
  margin-left: 0 !important;
  margin-right: 0 !important;
}

/* Your price list wrapper currently has side padding (0 12px) in Block 1.
   This overrides it WITHOUT editing Block 1. */
.ghPL-wrap{
  padding-left: 0 !important;
  padding-right: 0 !important;
  max-width: 100% !important;
}

/* Optional: if any sections still “center” content with auto margins */
.wsite-section-content{
  width: 100% !important;
}
</style>


​<!-- =========================================================
     DOUBLE VERTICAL SCROLLBAR NUKER (Weebly-safe)
     Drop into ANY page with the issue.
     - Forces the page to scroll normally (body)
     - Prevents common Weebly wrappers from creating inner scrollbars
     - JS failsafe removes inline overflow:auto/scroll on wrappers
========================================================== -->

<style id="ghScrollNukerCSS">
/* 1) Normalise root scrolling */
html{
  height: auto !important;
  min-height: 100% !important;
  overflow-y: auto !important;   /* only one scrollbar */
  overflow-x: hidden !important;
}

body{
  height: auto !important;
  min-height: 100% !important;
  overflow-y: auto !important;   /* ensure body owns scrolling */
  overflow-x: hidden !important;
  -webkit-overflow-scrolling: touch;
}

/* 2) Kill inner scrolling on common Weebly/theme wrappers */
#wsite-content,
.wsite-content,
.page-content,
.main-wrap,
.content-wrap,
.container,
#wsite-content-wrapper,
#wsite-wrapper,
.wrapper,
.wsite-section-content,
.wsite-section-elements,
.wsite-multicol,
.wsite-multicol-table,
.wsite-section,
.wsite-section-bg,
#content,
#main,
#main-wrap,
#main-wrapper,
#page,
#page-wrap{
  overflow: visible !important;
  height: auto !important;
  max-height: none !important;
}

/* 3) If the theme uses fixed heights on a main area, neutralise */
#wsite-content,
#wsite-content-wrapper,
#wsite-wrapper{
  position: relative !important;
}

/* 4) Avoid “phantom” scrollbars caused by transforms on wrappers */
#wsite-content-wrapper,
#wsite-content,
#wsite-wrapper,
.wrapper,
#main,
#page{
  transform: none !important;
}

/* 5) Belt + braces: stop sideways scroll which can trigger odd y-scroll behaviour */
html,body{max-width:100% !important;}
</style>

<script id="ghScrollNukerJS">
(function(){
  "use strict";

  // Elements that often cause the “second scrollbar”
  var selectors = [
    "#wsite-content",
    "#wsite-content-wrapper",
    "#wsite-wrapper",
    ".wsite-content",
    ".page-content",
    ".main-wrap",
    ".content-wrap",
    ".container",
    ".wrapper",
    ".wsite-section-content",
    ".wsite-section-elements",
    "#main",
    "#page"
  ];

  function cleanOverflow(el){
    if(!el || !el.style) return;

    // If theme set inline overflow/height, remove it
    var ov = (el.style.overflow || "").toLowerCase();
    var ovy = (el.style.overflowY || "").toLowerCase();

    if(ov === "auto" || ov === "scroll") el.style.overflow = "";
    if(ovy === "auto" || ovy === "scroll") el.style.overflowY = "";

    // Remove inline height/max-height that traps scrolling inside wrappers
    if(el.style.height && el.style.height !== "auto") el.style.height = "";
    if(el.style.maxHeight && el.style.maxHeight !== "none") el.style.maxHeight = "";
  }

  function run(){
    try{
      selectors.forEach(function(sel){
        var nodes = document.querySelectorAll(sel);
        for(var i=0;i<nodes.length;i++) cleanOverflow(nodes[i]);
      });
    }catch(e){}
  }

  // Run now + after layout settles (themes often apply styles late)
  run();
  setTimeout(run, 50);
  setTimeout(run, 250);
  setTimeout(run, 800);
})();
</script>


​<style>
/* =========================
   GLOBAL WEELY HEADER ABOVE EVERYTHING
   (Fixes price pills appearing over burger/menu)
========================= */

/* The header/nav containers must be positioned for z-index to apply */
header,
#header,
.wsite-header,
.wsite-header-section,
.wsite-nav-wrap,
.wsite-mobile-nav,
.wsite-menu-default,
.wsite-mobile-menu,
.wsite-nav-mobile,
.wsite-navwrap {
  position: relative !important;
  z-index: 999999 !important;
}

/* Some themes put the mobile menu panel in its own wrapper */
.wsite-mobile-nav,
.wsite-mobile-menu,
.wsite-menu-default {
  z-index: 999999 !important;
}

/* =========================
   SHOWROOM LAYER BELOW HEADER
========================= */
#gallery,
.gallery-grid,
.gh-item,
.gh-item * {
  z-index: 1 !important;
}

/* If your price pill is absolutely positioned, this keeps it sane */
.gh-item .price,
.gh-item .gh-price,
.gh-item .ghPrice,
.gh-item .gh-price-pill,
.gh-item .ghPricePill,
.gh-item [data-price],
.gh-item [class*="price"],
.gh-item [id*="price"] {
  z-index: 2 !important;
}

/* Keep your dims bubble still above the tile (but still below header) */
.icon-link.is-dims::before{
  z-index: 3 !important;
}
</style>


​<!-- ===== SHOWROOM TOUR VIDEO THUMB ===== -->
<div class="ghThumbWrap gh-hidden" id="ghThumbWrapShowroom">
  <div class="ghThumbCard" id="ghThumbCardShowroom" role="button" tabindex="0" aria-label="Play showroom tour video">
    <video
      id="ghVideoShowroom"
      class="ghThumbVideo"
      preload="metadata"
      playsinline
      muted
      controlslist="nodownload noplaybackrate"
    >
      <source src="https://www.weebly.com/uploads/b/10130609-898722761638373973/garden_leisure_ni_-_greenhouses_ni_-_quick_buying_guide_453.mp4" type="video/mp4">
    </video>

    <div class="ghPlayBtn" aria-hidden="true">
      <svg viewBox="0 0 80 80" class="ghPlayIcon">
        <circle cx="40" cy="40" r="34"></circle>
        <polygon points="34,28 58,40 34,52"></polygon>
      </svg>
    </div>
  </div>
</div>

<!-- ===== LIGHTBOX ===== -->
<div class="ghLightbox" id="ghLightboxShowroom" aria-hidden="true">
  <div class="ghLightboxInner" role="dialog" aria-modal="true">
    <button class="ghCloseBtn" id="ghCloseShowroom" aria-label="Close video">×</button>

    <div class="ghLightboxStage" id="ghLightboxStageShowroom">

      <!-- ticker -->
      <div class="ghTicker" aria-hidden="true">
        <div class="ghTickerTrack" id="ghTickerTrackShowroom">
          <div class="ghTickerText">
            Take a quick showroom tour — see real sheds, summerhouses and greenhouses on display, with friendly advice and no-pressure quotes.
          </div>
        </div>
      </div>

      <!-- ✅ WHATSAPP BUTTON (OVER THE VIDEO FRAME INSIDE POPUP) -->
      <a
        class="ghWaOverlayBtn"
        href="https://wa.me/447720377778?text=Hi%20Chris%2C%20I%20was%20watching%20your%20greenhouse%20summary%20video%20and%20would%20like%20to%20ask%2C%20"
        target="_blank"
        rel="noopener"
        aria-label="Chat with us on WhatsApp"
      >
        <svg class="ghWaOverlayIco" viewBox="0 0 32 32" aria-hidden="true">
          <path d="M19.11 17.53c-.27-.14-1.6-.79-1.84-.88-.25-.09-.43-.14-.61.14-.18.27-.7.88-.86 1.06-.16.18-.31.2-.58.07-.27-.14-1.14-.42-2.17-1.33-.8-.71-1.34-1.59-1.5-1.86-.16-.27-.02-.42.12-.56.12-.12.27-.31.41-.46.14-.16.18-.27.27-.45.09-.18.05-.34-.02-.48-.07-.14-.61-1.47-.84-2.01-.22-.53-.45-.46-.61-.46h-.52c-.18 0-.48.07-.73.34-.25.27-.95.93-.95 2.26 0 1.33.97 2.62 1.11 2.8.14.18 1.92 2.93 4.66 4.11.65.28 1.15.45 1.54.58.65.21 1.24.18 1.7.11.52-.08 1.6-.65 1.82-1.28.22-.63.22-1.17.16-1.28-.07-.11-.25-.18-.52-.32z"/>
          <path d="M26.62 5.38C23.74 2.5 19.92.92 15.86.92 7.47.92.66 7.73.66 16.12c0 2.68.7 5.3 2.03 7.62L.5 31.08l7.52-2.15c2.27 1.24 4.82 1.89 7.84 1.89 8.39 0 15.2-6.81 15.2-15.2 0-4.06-1.58-7.88-4.44-10.24zm-10.76 23.1c-2.52 0-4.84-.68-6.84-1.97l-.49-.31-4.46 1.28 1.24-4.34-.32-.52c-1.28-2.01-1.96-4.34-1.96-6.84 0-6.96 5.66-12.62 12.62-12.62 3.37 0 6.54 1.31 8.92 3.7 2.39 2.39 3.7 5.55 3.7 8.92 0 6.96-5.66 12.62-12.62 12.62z"/>
        </svg>
        <span class="ghWaOverlayTxt">WhatsApp Chris</span>
      </a>

    </div>
  </div>
</div>

<style>
/* ================================
   GLOBAL SAFETY
   ================================ */
html, body{ overflow-x:hidden; }

/* hide until JS reveals */
.gh-hidden{ display:none !important; }

/* ===== THUMB WRAPPER ===== */
.ghThumbWrap{
  width:100%;
  margin:32px 0 20px;   /* gap above */
  box-sizing:border-box;
}

/* desktop: centred + 1/3 width */
@media (min-width:1024px){
  .ghThumbWrap{
    width:33.333%;
    margin-left:auto;
    margin-right:auto;
  }
}

/* ===== THUMB CARD ===== */
.ghThumbCard{
  position:relative;
  width:100%;
  border:7px solid #2aa6a1;
  border-radius:18px;
  overflow:hidden;
  background:#000;
  cursor:pointer;
  box-sizing:border-box;
}

.ghThumbVideo{
  width:100%;
  height:auto;
  aspect-ratio:16/9;
  object-fit:cover;
  display:block;
}

/* play overlay */
.ghPlayBtn{
  position:absolute;
  inset:0;
  display:grid;
  place-items:center;
  pointer-events:none;
}
.ghPlayIcon{
  width:72px;
  height:72px;
  filter:drop-shadow(0 10px 18px rgba(0,0,0,.35));
}
.ghPlayIcon circle{
  fill:rgba(0,0,0,.45);
  stroke:rgba(255,255,255,.9);
  stroke-width:3;
}
.ghPlayIcon polygon{ fill:#fff; }

/* ===== LIGHTBOX ===== */
.ghLightbox{
  position:fixed;
  inset:0;
  z-index:2147483647;
  display:none;
  place-items:center;
  background:rgba(0,0,0,.55);
}
.ghLightbox.is-on{ display:grid; }

.ghLightboxInner{
  width:min(92vw,720px);
  max-height:92vh; /* prevent overflow */
  transform:scale(0);
  opacity:0;
  transition:transform .25s cubic-bezier(.2,.9,.2,1), opacity .25s;
  box-sizing:border-box;
}
.ghLightbox.is-on .ghLightboxInner{
  transform:scale(1);
  opacity:1;
}

.ghLightboxStage{
  position:relative;
  border:7px solid #2aa6a1;
  border-radius:18px;
  overflow:hidden;
  background:#000;
  aspect-ratio:9/16;
  max-height:92vh;
  box-sizing:border-box;
}

/* ✅ Desktop: show FULL video (no crop) */
.ghLightboxStage video{
  width:100%;
  height:100%;
  object-fit:contain;
  background:#000;
}

/* ✅ Mobile: fill frame (punchy) */
@media (max-width:768px){
  .ghLightboxStage video{ object-fit:cover; }
}

/* close */
.ghCloseBtn{
  position:absolute;
  top:-14px;
  right:-14px;
  width:40px;
  height:40px;
  border-radius:999px;
  background:#000;
  color:#fff;
  font-size:28px;
  border:none;
  cursor:pointer;
  z-index:60;
}

/* ===== TICKER ===== */
.ghTicker{
  position:absolute;
  left:0;
  right:0;
  bottom:8px;
  overflow:hidden;
  pointer-events:none;
  background:linear-gradient(to top, rgba(0,0,0,.45), transparent);
  z-index:20;
}

.ghTickerTrack{
  white-space:nowrap;
  transform:translateX(100%);
  will-change:transform;
}

.ghTickerText{
  font:700 13px Arial,sans-serif;
  color:#fff;
  padding:0 14px;
}

@media (prefers-reduced-motion: reduce){
  .ghTickerTrack{
    transform:translateX(0) !important;
    transition:none !important;
  }
}

/* =========================================================
   ✅ WHATSAPP OVERLAY BUTTON (INSIDE VIDEO POPUP FRAME)
   ========================================================= */
.ghWaOverlayBtn{
  position:absolute;
  right:14px;
  bottom:28px;
  z-index:55; /* above video + ticker */
  display:flex;
  align-items:center;
  gap:10px;
  padding:12px 14px;
  border-radius:999px;
  background:#25D366;
  color:#fff;
  text-decoration:none;
  font-weight:900;
  font-family:Arial, sans-serif;
  box-shadow:0 12px 26px rgba(0,0,0,.35);
  transition:transform .18s ease, filter .18s ease;
}

.ghWaOverlayBtn:hover{
  transform:translateY(-2px);
  filter:brightness(1.05);
}

.ghWaOverlayIco{
  width:24px;
  height:24px;
  fill:#fff;
  flex:0 0 auto;
}

.ghWaOverlayTxt{
  font-size:14px;
  letter-spacing:.2px;
  white-space:nowrap;
}

/* Optional: smaller on tiny mobiles */
@media (max-width:380px){
  .ghWaOverlayBtn{ padding:10px 12px; }
  .ghWaOverlayTxt{ font-size:13px; }
}
</style>

<script>
(function(){
  var wrap  = document.getElementById("ghThumbWrapShowroom");
  var card  = document.getElementById("ghThumbCardShowroom");
  var video = document.getElementById("ghVideoShowroom");

  var lightbox = document.getElementById("ghLightboxShowroom");
  var stage    = document.getElementById("ghLightboxStageShowroom");
  var closeBtn = document.getElementById("ghCloseShowroom");
  var ticker   = document.getElementById("ghTickerTrackShowroom");

  if(!wrap||!card||!video||!lightbox||!stage||!closeBtn||!ticker) return;

  /* show immediately */
  wrap.classList.remove("gh-hidden");

  /* force lightbox to body (Weebly stacking fix) */
  document.body.appendChild(lightbox);

  /* move video */
  var home = video.parentNode;
  function toStage(){ stage.insertBefore(video, stage.firstChild); }
  function toHome(){ home.appendChild(video); }

  /* ticker – half speed */
  function runTicker(){
    var distance = ticker.scrollWidth + stage.clientWidth;
    ticker.style.transition="none";
    ticker.style.transform="translateX(100%)";
    void ticker.offsetWidth;
    ticker.style.transition="transform 18s linear";
    ticker.style.transform="translateX(-"+distance+"px)";
  }

  function open(){
    toStage();
    lightbox.classList.add("is-on");
    video.muted=false;
    video.play().catch(function(){});
    setTimeout(runTicker,500);
  }

  function close(){
    lightbox.classList.remove("is-on");
    video.pause();
    try{ video.currentTime = 0; }catch(e){}
    video.muted=true;
    toHome();
  }

  card.addEventListener("click", open);
  card.addEventListener("keydown", function(e){
    if(e.key==="Enter" || e.key===" "){ e.preventDefault(); open(); }
  });

  closeBtn.addEventListener("click", close);
  lightbox.addEventListener("click", function(e){
    if(e.target===lightbox) close();
  });
  document.addEventListener("keydown", function(e){
    if(e.key==="Escape" && lightbox.classList.contains("is-on")) close();
  });
})();
</script>


​<!-- =========================
     BLOCK A: PRICE DATA ONLY
     Update ONLY this block in future
========================= -->

<script type="application/json" id="ghPriceData">
[
  {"model":"POPULAR 6X4 Silver 3mm Glass","price":467.20,"install":315.00},
  {"model":"POPULAR 6X4 Silver Toughened Glass","price":587.20,"install":315.00},
  {"model":"POPULAR 6X4 Silver Polycarbonate","price":627.20,"install":315.00},
  {"model":"POPULAR 6X4 Green 3mm Glass","price":507.20,"install":315.00},
  {"model":"POPULAR 6X4 Green Toughened Glass","price":627.20,"install":315.00},
  {"model":"POPULAR 6X4 Green Polycarbonate","price":667.20,"install":315.00},

  {"model":"POPULAR 6X6 Silver 3mm Glass","price":507.20,"install":345.00},
  {"model":"POPULAR 6X6 Silver Toughened Glass","price":627.20,"install":345.00},
  {"model":"POPULAR 6X6 Silver Polycarbonate","price":667.20,"install":345.00},
  {"model":"POPULAR 6X6 Green 3mm Glass","price":547.20,"install":345.00},
  {"model":"POPULAR 6X6 Green Toughened Glass","price":667.20,"install":345.00},
  {"model":"POPULAR 6X6 Green Polycarbonate","price":707.20,"install":345.00},
  {"model":"POPULAR 6X6 Black 3mm Glass","price":547.20,"install":345.00},
  {"model":"POPULAR 6X6 Black Toughened Glass","price":667.20,"install":345.00},
  {"model":"POPULAR 6X6 Black Polycarbonate","price":707.20,"install":345.00},

  {"model":"POPULAR 6X8 Silver 3mm Glass","price":547.20,"install":375.00},
  {"model":"POPULAR 6X8 Silver Toughened Glass","price":667.20,"install":375.00},
  {"model":"POPULAR 6X8 Silver Polycarbonate","price":707.20,"install":375.00},
  {"model":"POPULAR 6X8 Green 3mm Glass","price":587.20,"install":375.00},
  {"model":"POPULAR 6X8 Green Toughened Glass","price":707.20,"install":375.00},
  {"model":"POPULAR 6X8 Green Polycarbonate","price":747.20,"install":375.00},
  {"model":"POPULAR 6X8 Black 3mm Glass","price":587.20,"install":375.00},
  {"model":"POPULAR 6X8 Black Toughened Glass","price":707.20,"install":375.00},
  {"model":"POPULAR 6X8 Black Polycarbonate","price":747.20,"install":375.00},

  {"model":"POPULAR 6X10 Silver 3mm Glass","price":587.20,"install":450.00},
  {"model":"POPULAR 6X10 Silver Toughened Glass","price":707.20,"install":450.00},
  {"model":"POPULAR 6X10 Silver Polycarbonate","price":747.20,"install":450.00},
  {"model":"POPULAR 6X10 Green 3mm Glass","price":627.20,"install":450.00},
  {"model":"POPULAR 6X10 Green Toughened Glass","price":747.20,"install":450.00},
  {"model":"POPULAR 6X10 Green Polycarbonate","price":787.20,"install":450.00},
  {"model":"POPULAR 6X10 Black 3mm Glass","price":627.20,"install":450.00},
  {"model":"POPULAR 6X10 Black Toughened Glass","price":747.20,"install":450.00},
  {"model":"POPULAR 6X10 Black Polycarbonate","price":787.20,"install":450.00},

  {"model":"MAGNUM 8X10 Silver Toughened Glass","price":1194.25,"install":530.00},
  {"model":"MAGNUM 8X10 Silver Polycarbonate","price":1269.25,"install":530.00},

  {"model":"MAGNUM 8X12 Silver Toughened Glass","price":1269.25,"install":550.00},
  {"model":"MAGNUM 8X12 Silver Polycarbonate","price":1344.25,"install":550.00},

  {"model":"MAGNUM 8X14 Silver Toughened Glass","price":1344.25,"install":570.00},
  {"model":"MAGNUM 8X14 Silver Polycarbonate","price":1419.25,"install":570.00},

  {"model":"QUBE 6X6 Black Toughened Glass","price":1088.50,"install":375.00},
  {"model":"QUBE 6X8 Black Toughened Glass","price":1143.50,"install":415.00},
  {"model":"QUBE 6X10 Black Toughened Glass","price":1198.50,"install":460.00},
  {"model":"QUBE 8X8 Black Toughened Glass","price":1513.50,"install":460.00},
  {"model":"QUBE 8X12 Black Toughened Glass","price":1718.50,"install":545.00},
  {"model":"QUBE 8X16 Black Toughened Glass","price":1923.50,"install":610.00},
  {"model":"QUBE-SQ 8X8 Black Toughened Glass","price":2423.50,"install":545.00},

  {"model":"ICON 6X4 Silver 3mm Glass","price":753.00,"install":325.00},
  {"model":"ICON 6X4 Silver Toughened Glass","price":903.00,"install":325.00},
  {"model":"ICON 6X4 Silver Polycarbonate","price":953.00,"install":325.00},
  {"model":"ICON 6X4 Green 3mm Glass","price":803.00,"install":325.00},
  {"model":"ICON 6X4 Green Toughened Glass","price":953.00,"install":325.00},
  {"model":"ICON 6X4 Green Polycarbonate","price":1003.00,"install":325.00},
  {"model":"ICON 6X4 Black 3mm Glass","price":803.00,"install":325.00},
  {"model":"ICON 6X4 Black Toughened Glass","price":953.00,"install":325.00},
  {"model":"ICON 6X4 Black Polycarbonate","price":1003.00,"install":325.00},

  {"model":"ICON 6X6 Silver 3mm Glass","price":813.00,"install":375.00},
  {"model":"ICON 6X6 Silver Toughened Glass","price":963.00,"install":375.00},
  {"model":"ICON 6X6 Silver Polycarbonate","price":1013.00,"install":375.00},
  {"model":"ICON 6X6 Green 3mm Glass","price":863.00,"install":375.00},
  {"model":"ICON 6X6 Green Toughened Glass","price":1013.00,"install":375.00},
  {"model":"ICON 6X6 Green Polycarbonate","price":1063.00,"install":375.00},
  {"model":"ICON 6X6 Black 3mm Glass","price":863.00,"install":375.00},
  {"model":"ICON 6X6 Black Toughened Glass","price":1013.00,"install":375.00},
  {"model":"ICON 6X6 Black Polycarbonate","price":1063.00,"install":375.00},

  {"model":"ICON 6X8 Silver 3mm Glass","price":873.00,"install":415.00},
  {"model":"ICON 6X8 Silver Toughened Glass","price":1023.00,"install":415.00},
  {"model":"ICON 6X8 Silver Polycarbonate","price":1073.00,"install":415.00},
  {"model":"ICON 6X8 Green 3mm Glass","price":923.00,"install":415.00},
  {"model":"ICON 6X8 Green Toughened Glass","price":1073.00,"install":415.00},
  {"model":"ICON 6X8 Green Polycarbonate","price":1123.00,"install":415.00},
  {"model":"ICON 6X8 Black 3mm Glass","price":923.00,"install":415.00},
  {"model":"ICON 6X8 Black Toughened Glass","price":1073.00,"install":415.00},
  {"model":"ICON 6X8 Black Polycarbonate","price":1123.00,"install":415.00},

  {"model":"ICON 6X10 Silver 3mm Glass","price":933.00,"install":465.00},
  {"model":"ICON 6X10 Silver Toughened Glass","price":1083.00,"install":465.00},
  {"model":"ICON 6X10 Silver Polycarbonate","price":1133.00,"install":465.00},
  {"model":"ICON 6X10 Green 3mm Glass","price":983.00,"install":465.00},
  {"model":"ICON 6X10 Green Toughened Glass","price":1133.00,"install":465.00},
  {"model":"ICON 6X10 Green Polycarbonate","price":1183.00,"install":465.00},
  {"model":"ICON 6X10 Black 3mm Glass","price":983.00,"install":465.00},
  {"model":"ICON 6X10 Black Toughened Glass","price":1133.00,"install":465.00},
  {"model":"ICON 6X10 Black Polycarbonate","price":1183.00,"install":465.00},

  {"model":"ICON 6 6X10 Green Toughened Glass","price":1599.00,"install":495.00},
  {"model":"ICON 6 6X10 Black Toughened Glass","price":1599.00,"install":495.00},
  {"model":"ICON 6 6X12 Green Toughened Glass","price":2799.00,"install":535.00},
  {"model":"ICON 6 6X12 Black Toughened Glass","price":2799.00,"install":535.00},

  {"model":"ICON 8X10 Silver 3mm Glass","price":1478.00,"install":495.00},
  {"model":"ICON 8X10 Silver Toughened Glass","price":1778.00,"install":495.00},
  {"model":"ICON 8X10 Green 3mm Glass","price":1578.00,"install":495.00},
  {"model":"ICON 8X10 Green Toughened Glass","price":1878.00,"install":495.00},
  {"model":"ICON 8X10 Black 3mm Glass","price":1578.00,"install":495.00},
  {"model":"ICON 8X10 Black Toughened Glass","price":1878.00,"install":495.00},

  {"model":"ICON 8X12 Silver 3mm Glass","price":1598.00,"install":525.00},
  {"model":"ICON 8X12 Silver Toughened Glass","price":1898.00,"install":525.00},
  {"model":"ICON 8X12 Green 3mm Glass","price":1698.00,"install":525.00},
  {"model":"ICON 8X12 Green Toughened Glass","price":1998.00,"install":525.00},
  {"model":"ICON 8X12 Black 3mm Glass","price":1698.00,"install":525.00},
  {"model":"ICON 8X12 Black Toughened Glass","price":1998.00,"install":525.00},

  {"model":"ICON 8X14 Silver 3mm Glass","price":1718.00,"install":565.00},
  {"model":"ICON 8X14 Silver Toughened Glass","price":2018.00,"install":565.00},
  {"model":"ICON 8X14 Green 3mm Glass","price":1818.00,"install":565.00},
  {"model":"ICON 8X14 Green Toughened Glass","price":2118.00,"install":565.00},
  {"model":"ICON 8X14 Black 3mm Glass","price":1818.00,"install":565.00},
  {"model":"ICON 8X14 Black Toughened Glass","price":2118.00,"install":565.00}
]
</script>


​<script id="ghRawFileList" type="application/json">
[
 "POPULAR_6X10_GREEN_HORT_SO8131_PIC1.png",
"POPULAR_6X4_GREEN_HORT_SO8121_PIC1.png",
"POPULAR_6X4_GREEN_POLY_SO8123_PIC1.png",
"POPULAR_6X4_GREEN_TOUGH_SO8122_PIC1.png",
"POPULAR_6X4_SILVER_HORT_SO0200_PIC1.png",
"POPULAR_6X4_SILVER_HORT_SO0200_PIC4.png",
"POPULAR_6X4_SILVER_POLY_70172_PIC1.png",
"POPULAR_6X4_SILVER_TOUGH_70954_PIC1.png",
"POPULAR_6X6_BLACK_HORT_F09938_PIC1.png",
"POPULAR_6X6_BLACK_POLY_F09939_PIC1.png",
"POPULAR_6X6_BLACK_TOUGH_F09940_PIC1.png",
"POPULAR_6X6_GREEN_HORT_SO8111_PIC1.png",
"POPULAR_6X6_GREEN_POLY_SO8113_PIC1.png",
"POPULAR_6X6_GREEN_TOUGH_SO8112_PIC1.png",
"POPULAR_6X6_GREEN_TOUGH_SO8112_PIC2.png",
"POPULAR_6X6_SILVER_HORT_SO0170_PIC1.png",
"POPULAR_6X6_SILVER_POLY_SO0206_PIC1.png",
"POPULAR_6X6_SILVER_TOUGH_70936_PIC1.png",
"POPULAR_6X8_BLACK_HORT_F09708_PIC1.png",
"POPULAR_6X8_BLACK_POLY_F09709_PIC1.png",
"POPULAR_6X8_BLACK_TOUGH_F09894_PIC1.png",
"POPULAR_6X8_GREEN_HORT_SO8101_PIC1.png",
"POPULAR_6X8_GREEN_POLY_SO8103_PIC1.png",
"POPULAR_6X8_GREEN_TOUGH_F09895_PIC1.png",
"POPULAR_6X8_SILVER_HORT_SO0172_PIC1.png",
"POPULAR_6X8_SILVER_HORT_SO0172_PIC2.png",
"POPULAR_6X8_SILVER_POLY_SO0207_PIC1.png",
"POPULAR_6X8_SILVER_POLY_SO0207_PIC2.png",
"POPULAR_6X8_SILVER_TOUGH_70928_PIC1.png",
"POPULAR_6X8_SILVER_TOUGH_70928_PIC3.png",
"POPULAR_6X8_SILVER_TOUGH_70928-PIC2.png",
"POPULAR_6X10_BLACK_HORT_F09579_PIC1.png",
"POPULAR_6X10_BLACK_POLY_F09710_PIC1.png",
"POPULAR_6X10_BLACK_TOUGH_F09897_PIC1.png",
"POPULAR_6X10_GREEN_POLY_SO8133_PIC1.png",
"POPULAR_6X10_SILVER_HORT_SO0201_PIC1.png",
"POPULAR_6X10_SILVER_POLY_SO0208_PIC1.png",
"POPULAR_6X10_SILVER_TOUGH_F09896_PIC1.png",
"POPULAR_6X10_GREEN_TOUGH_SO8132_PIC1.png",

    "ICON_GARDENHOUSE_8X12_DIMS.png",
    "ICON_6X4_BLACK_HORT_HR01008_PIC1.png",
    "ICON_6X4_BLACK_HORT_HR01008_PIC2.png",
    "ICON_6X4_BLACK_HORT_HR01008_PIC3.png",
    "ICON_6X4_BLACK_HORT_HR01008_PIC4.png",
    "ICON_6X4_BLACK_HORT_HR01008_PIC5.png",
    "ICON_6X4_BLACK_POLY_HR01010_PIC1.png",
    "ICON_6X4_BLACK_POLY_HR01010_PIC2.png",
    "ICON_6X4_BLACK_POLY_HR01010_PIC3.png",
    "ICON_6X4_BLACK_TOUGH_HR01009_PIC1.png",
    "ICON_6X4_BLACK_TOUGH_HR01009_PIC2.png",
    "ICON_6X4_BLACK_TOUGH_HR01009_PIC3.png",
    "ICON_6X4_BLACK_TOUGH_HR01009_PIC4.png",
    "ICON_6X4_BLACK_TOUGH_HR01009_PIC5.png",
    "ICON_6X4_DIMS.png",
    "ICON_6X4_GREEN_HORT_HR01011_PIC1.png",
    "ICON_6X4_GREEN_HORT_HR01011_PIC2.png",
    "ICON_6X4_GREEN_HORT_HR01011_PIC3.png",
    "ICON_6X4_GREEN_HORT_HR01011_PIC4.png",
    "ICON_6X4_GREEN_HORT_HR01011_PIC5.png",
    "ICON_6X4_GREEN_POLY_HR01013_PIC1.png",
    "ICON_6X4_GREEN_POLY_HR01013_PIC2.png",
    "ICON_6X4_GREEN_POLY_HR01013_PIC3.png",
    "ICON_6X4_GREEN_POLY_HR01013_PIC4.png",
    "ICON_6X4_GREEN_TOUGH_HR01012_PIC1.png",
    "ICON_6X4_GREEN_TOUGH_HR01012_PIC2.png",
    "ICON_6X4_GREEN_TOUGH_HR01012_PIC3.png",
    "ICON_6X4_GREEN_TOUGH_HR01012_PIC4.png",
    "ICON_6X4_GREEN_TOUGH_HR01012_PIC5.png",
    "ICON_6X4_GREEN_TOUGH_HR01012_PIC6.png",
    "ICON_6X4_SILVER_HORT_HR01005_PIC2.png",
    "ICON_6X4_SILVER_HORT_HR01005_PIC3.png",
    "ICON_6X4_SILVER_HORT_HR01005_PIC4.png",
    "ICON_6X4_SILVER_HORT_HR01005_PIC5.png",
    "ICON_6X4_SILVER_POLY_HR01007_PIC1.png",
    "ICON_6X4_SILVER_POLY_HR01007_PIC2.png",
    "ICON_6X4_SILVER_POLY_HR01007_PIC3.png",
    "ICON_6X4_SILVER_TOUGH_HR01006_PIC1.png",
    "ICON_6X4_SILVER_TOUGH_HR01006_PIC2.png",
    "ICON_6X4_SILVER_TOUGH_HR01006_PIC3.png",
    "ICON_6X4_SILVER_TOUGH_HR01006_PIC4.png",
    "ICON_6X4_SILVER_TOUGH_HR01006_PIC5.png",
    "ICON_6X4_SILVER_TOUGH_HR01006_PIC6.png",
    "ICON_6X4_SILVER_TOUGH_HR01006_PIC7.png",
    "ICON_6X6_BLACK_HORT_HR01049_PIC1.png",
    "ICON_6X6_BLACK_HORT_HR01049_PIC2.png",
    "ICON_6X6_BLACK_HORT_HR01049_PIC3.png",
    "ICON_6X6_BLACK_HORT_HR01049_PIC4.png",
    "ICON_6X6_BLACK_HORT_HR01049_PIC5.png",
    "ICON_6X6_BLACK_POLY_HR01051_PIC1.png",
    "ICON_6X6_BLACK_POLY_HR01051_PIC2.png",
    "ICON_6X6_BLACK_POLY_HR01051_PIC3.png",
    "ICON_6X6_BLACK_POLY_HR01051_PIC4.png",
    "ICON_6X6_BLACK_TOUGH_HR01050_PIC1.png",
    "ICON_6X6_BLACK_TOUGH_HR01050_PIC2.png",
    "ICON_6X6_BLACK_TOUGH_HR01050_PIC3.png",
    "ICON_6X6_BLACK_TOUGH_HR01050_PIC4.png",
    "ICON_6X6_GREEN_HORT_HR01052_PIC1.png",
    "ICON_6X6_GREEN_HORT_HR01052_PIC2.png",
    "ICON_6X6_GREEN_HORT_HR01052_PIC3.png",
    "ICON_6X6_GREEN_HORT_HR01052_PIC4.png",
    "ICON_6X6_GREEN_HORT_HR01052_PIC5.png",
    "ICON_6X6_GREEN_HORT_HR01052_PIC6.png",
    "ICON_6X6_GREEN_POLY_HR01054_PIC1.png",
    "ICON_6X6_GREEN_POLY_HR01054_PIC2.png",
    "ICON_6X6_GREEN_POLY_HR01054_PIC3.png",
    "ICON_6X6_GREEN_POLY_HR01054_PIC4.png",
    "ICON_6X6_GREEN_TOUGH_HR01053_PIC1.png",
    "ICON_6X6_GREEN_TOUGH_HR01053_PIC2.png",
    "ICON_6X6_GREEN_TOUGH_HR01053_PIC3.png",
    "ICON_6X6_GREEN_TOUGH_HR01053_PIC4.png",
    "ICON_6X6_GREEN_TOUGH_HR01053_PIC5.png",
    "ICON_6X6_GREEN_TOUGH_HR01053_PIC6.png",
    "ICON_6X6_GREEN_TOUGH_HR01053_PIC7.png",
    "ICON_6X6_GREEN_TOUGH_HR01053_PIC8.png",
    "ICON_6X6_GREEN_TOUGH_HR01053_PIC9.png",
    "ICON_6X6_GREEN_TOUGH_HR01053_PIC10.png",
    "ICON_6X6_SILVER_HORT_HR01046_PIC1.png",
    "ICON_6X6_SILVER_HORT_HR01046_PIC2.png",
    "ICON_6X6_SILVER_HORT_HR01046_PIC3.png",
    "ICON_6X6_SILVER_HORT_HR01046_PIC4.png",
    "ICON_6X6_SILVER_HORT_HR01046_PIC5.png",
    "ICON_6X6_SILVER_POLY_HR01048_PIC1.png",
    "ICON_6X6_SILVER_POLY_HR01048_PIC2.png",
    "ICON_6X6_SILVER_POLY_HR01048_PIC3.png",
    "ICON_6X6_SILVER_TOUGH_HR01047_PIC1.png",
    "ICON_6X6_SILVER_TOUGH_HR01047_PIC2.png",
    "ICON_6X6_SILVER_TOUGH_HR01047_PIC3.png",
    "ICON_6X6_SILVER_TOUGH_HR01047_PIC4.png",
    "ICON_6X6_SILVER_TOUGH_HR01047_PIC5.png",
    "ICON_6X8_BLACK_HORT_HR01090_PIC1.png",
    "ICON_6X8_BLACK_HORT_HR01090_PIC2.png",
    "ICON_6X8_BLACK_HORT_HR01090_PIC3.png",
    "ICON_6X8_BLACK_HORT_HR01090_PIC4.png",
    "ICON_6X8_BLACK_HORT_HR01090_PIC5.png",
    "ICON_6X8_BLACK_POLY_HR01092_PIC1.png",
    "ICON_6X8_BLACK_POLY_HR01092_PIC2.png",
    "ICON_6X8_BLACK_POLY_HR01092_PIC3.png",
    "ICON_6X8_BLACK_POLY_HR01092_PIC4.png",
    "ICON_6X8_BLACK_POLY_HR01092_PIC5.png",
    "ICON_6X8_BLACK_POLY_HR01092_PIC6.png",
    "ICON_6X8_BLACK_POLY_HR01092_PIC7.png",
    "ICON_6X8_BLACK_TOUGH_HR01091_PIC1.png",
    "ICON_6X8_BLACK_TOUGH_HR01091_PIC2.png",
    "ICON_6X8_BLACK_TOUGH_HR01091_PIC3.png",
    "ICON_6X8_BLACK_TOUGH_HR01091_PIC4.png",
    "ICON_6X8_BLACK_TOUGH_HR01091_PIC5.png",
    "ICON_6X8_DIMS.png",
    "ICON_6X8_GREEN_HORT_HR01093_PIC1.png",
    "ICON_6X8_GREEN_HORT_HR01093_PIC2.png",
    "ICON_6X8_GREEN_HORT_HR01093_PIC3.png",
    "ICON_6X8_GREEN_HORT_HR01093_PIC4.png",
    "ICON_6X8_GREEN_HORT_HR01093_PIC5.png",
    "ICON_6X8_GREEN_HORT_HR01093_PIC6.png",
    "ICON_6X8_GREEN_POLY_HR01095_PIC1.png",
    "ICON_6X8_GREEN_POLY_HR01095_PIC2.png",
    "ICON_6X8_GREEN_POLY_HR01095_PIC3.png",
    "ICON_6X8_GREEN_POLY_HR01095_PIC4.png",
    "ICON_6X8_GREEN_TOUGH_HR01094_PIC1.png",
    "ICON_6X8_GREEN_TOUGH_HR01094_PIC2.png",
    "ICON_6X8_GREEN_TOUGH_HR01094_PIC3.png",
    "ICON_6X8_GREEN_TOUGH_HR01094_PIC4.png",
    "ICON_6X8_GREEN_TOUGH_HR01094_PIC5.png",
    "ICON_6X8_GREEN_TOUGH_HR01094_PIC6.png",
    "ICON_6X8_SILVER_HORT_HR01087_PIC2.png",
    "ICON_6X8_SILVER_HORT_HR01087_PIC3.png",
    "ICON_6X8_SILVER_HORT_HR01087_PIC4.png",
    "ICON_6X8_SILVER_HORT_HR01087_PIC5.png",
    "ICON_6X8_SILVER_HORT_HR01087_PIC6.png",
    "ICON_6X8_SILVER_POLY_HR01089_PIC1.png",
    "ICON_6X8_SILVER_POLY_HR01089_PIC2.png",
    "ICON_6X8_SILVER_POLY_HR01089_PIC3.png",
    "ICON_6X8_SILVER_TOUGH_HR01088_PIC1.png",
    "ICON_6X8_SILVER_TOUGH_HR01088_PIC2.png",
    "ICON_6X8_SILVER_TOUGH_HR01088_PIC3.png",
    "ICON_6X8_SILVER_TOUGH_HR01088_PIC4.png",
    "ICON_6X8_SILVER_TOUGH_HR01088_PIC5.png",
    "ICON_6X8_SILVER_TOUGH_HR01088_PIC6.png",
    "ICON_6X10_BLACK_HORT_HR01131_PIC1.png",
    "ICON_6X10_BLACK_HORT_HR01131_PIC2.png",
    "ICON_6X10_BLACK_HORT_HR01131_PIC3.png",
    "ICON_6X10_BLACK_HORT_HR01131_PIC4.png",
    "ICON_6X10_BLACK_HORT_HR01131_PIC5.png",
    "ICON_6X10_BLACK_HORT_HR01131_PIC6.png",
    "ICON_6X10_BLACK_POLY_HR01133_PIC1.png",
    "ICON_6X10_BLACK_POLY_HR01133_PIC2.png",
    "ICON_6X10_BLACK_POLY_HR01133_PIC3.png",
    "ICON_6X10_BLACK_POLY_HR01133_PIC4.png",
    "ICON_6X10_BLACK_POLY_HR01133_PIC5.png",
    "ICON_6X10_BLACK_TOUGH_HR01132_PIC1.png",
    "ICON_6X10_BLACK_TOUGH_HR01132_PIC2.png",
    "ICON_6X10_BLACK_TOUGH_HR01132_PIC3.png",
    "ICON_6X10_BLACK_TOUGH_HR01132_PIC4.png",
    "ICON_6X10_BLACK_TOUGH_HR01132_PIC5.png",
    "ICON_6X10_BLACK_TOUGH_HR01132_PIC6.png",
    "ICON_6X10_BLACK_TOUGH_HR01193_PIC2.png",
    "ICON_6X10_BLACK_TOUGH_HR01193_PIC3.png",
    "ICON_6X10_BLACK_TOUGH_HR01193_PIC4.png",
    "ICON_6X10_BLACK_TOUGH_HR01193_PIC5.png",
    "ICON_6X10_BLACK_TOUGH_HR01193_PIC6.png",
    "ICON_6X10_BLACK_TOUGH_HR01193_PIC7.png",
    "ICON_6X10_BLACK_TOUGH_HR01193_PIC8.png",
    "ICON_6X10_BLACK_TOUGH_HR01193_PIC9.png",
    "ICON_6X10_BLACK_TOUGH_HR01193_PIC10.png",
    "ICON_6X10_BLACK_TOUGH_HR01193_PIC11.png",
    "ICON_6X10_BLACK_TOUGH_HR01193_PIC12.png",
    "ICON_6X10_DIMS.png",
    "ICON_6X10_GREEN_HORT_HR01134_PIC1.png",
    "ICON_6X10_GREEN_HORT_HR01134_PIC2.png",
    "ICON_6X10_GREEN_HORT_HR01134_PIC3.png",
    "ICON_6X10_GREEN_HORT_HR01134_PIC4.png",
    "ICON_6X10_GREEN_HORT_HR01134_PIC5.png",
    "ICON_6X10_GREEN_HORT_HR01134_PIC6.png",
    "ICON_6X10_GREEN_POLY_HR01136_PIC1.png",
    "ICON_6X10_GREEN_POLY_HR01136_PIC2.png",
    "ICON_6X10_GREEN_POLY_HR01136_PIC3.png",
    "ICON_6X10_GREEN_POLY_HR01136_PIC4.png",
    "ICON_6X10_GREEN_TOUGH_HR01135_PIC1.png",
    "ICON_6X10_GREEN_TOUGH_HR01135_PIC2.png",
    "ICON_6X10_GREEN_TOUGH_HR01135_PIC3.png",
    "ICON_6X10_GREEN_TOUGH_HR01135_PIC4.png",
    "ICON_6X10_GREEN_TOUGH_HR01135_PIC5.png",
    "ICON_6X10_GREEN_TOUGH_HR01135_PIC6.png",
    "ICON_6X10_GREEN_TOUGH_HR01135_PIC7.png",
    "ICON_6X10_GREEN_TOUGH_HR01194_PIC2.png",
    "ICON_6X10_GREEN_TOUGH_HR01194_PIC3.png",
    "ICON_6X10_GREEN_TOUGH_HR01194_PIC4.png",
    "ICON_6X10_SILVER_HORT_HR01128_PIC2.png",
    "ICON_6X10_SILVER_HORT_HR01128_PIC3.png",
    "ICON_6X10_SILVER_HORT_HR01128_PIC4.png",
    "ICON_6X10_SILVER_HORT_HR01128_PIC5.png",
    "ICON_6X10_SILVER_HORT_HR01128_PIC6.png",
    "ICON_6X10_SILVER_HORT_HR01128_PIC7.png",
    "ICON_6X10_SILVER_HORT_HR01128_PIC8.png",
    "ICON_6X10_SILVER_POLY_HR01130_PIC1.png",
    "ICON_6X10_SILVER_POLY_HR01130_PIC2.png",
    "ICON_6X10_SILVER_POLY_HR01130_PIC3.png",
    "ICON_6X10_SILVER_POLY_HR01130_PIC4.png",
    "ICON_6X10_SILVER_TOUGH_HR01129_PIC1.png",
    "ICON_6X10_SILVER_TOUGH_HR01129_PIC2.png",
    "ICON_6X10_SILVER_TOUGH_HR01129_PIC3.png",
    "ICON_6X10_SILVER_TOUGH_HR01129_PIC4.png",
    "ICON_6X10_SILVER_TOUGH_HR01129_PIC5.png",
    "ICON_6X10_SILVER_TOUGH_HR01129_PIC6.png",
    "ICON_6X10_SILVER_TOUGH_HR01129_PIC7.png",
    "ICON_8X10_BLACK_HORT_HR01290_PIC2.png",
    "ICON_8X10_BLACK_HORT_HR01290_PIC3.png",
    "ICON_8X10_BLACK_HORT_HR01290_PIC4.png",
    "ICON_8X10_BLACK_HORT_HR01290_PIC5.png",
    "ICON_8X10_BLACK_HORT_HR01290_PIC6.png",
    "ICON_8X10_BLACK_HORT_HR01290_PIC7.png",
    "ICON_8X10_BLACK_HORT_HR01290_PIC8.png",
    "ICON_8X10_BLACK_HORT_HR01290_PIC9.png",
    "ICON_8X10_BLACK_TOUGH_HR01291_PIC2.png",
    "ICON_8X10_BLACK_TOUGH_HR01291_PIC3.png",
    "ICON_8X10_BLACK_TOUGH_HR01291_PIC4.png",
    "ICON_8X10_BLACK_TOUGH_HR01291_PIC5.png",
    "ICON_8X10_BLACK_TOUGH_HR01291_PIC6.png",
    "ICON_8X10_BLACK_TOUGH_HR01291_PIC7.png",
    "ICON_8X10_BLACK_TOUGH_HR01291_PIC8.png",
    "ICON_8X10_DIMS.png",
    "ICON_8X10_GREEN_HORT_HR01293_PIC2.png",
    "ICON_8X10_GREEN_HORT_HR01293_PIC3.png",
    "ICON_8X10_GREEN_HORT_HR01293_PIC4.png",
    "ICON_8X10_GREEN_HORT_HR01293_PIC5.png",
    "ICON_8X10_GREEN_HORT_HR01293_PIC6.png",
    "ICON_8X10_GREEN_HORT_HR01293_PIC7.png",
    "ICON_8X10_GREEN_TOUGH_HR01294_PIC2.png",
    "ICON_8X10_GREEN_TOUGH_HR01294_PIC3.png",
    "ICON_8X10_GREEN_TOUGH_HR01294_PIC4.png",
    "ICON_8X10_GREEN_TOUGH_HR01294_PIC5.png",
    "ICON_8X10_GREEN_TOUGH_HR01294_PIC6.png",
    "ICON_8X10_GREEN_TOUGH_HR01294_PIC7.png",
    "ICON_8X10_SILVER_HORT_HR01287_PIC1.png",
    "ICON_8X10_SILVER_HORT_HR01287_PIC2.png",
    "ICON_8X10_SILVER_HORT_HR01287_PIC3.png",
    "ICON_8X10_SILVER_HORT_HR01287_PIC4.png",
    "ICON_8X10_SILVER_HORT_HR01287_PIC5.png",
    "ICON_8X10_SILVER_TOUGH_HR01288_PIC2.png",
    "ICON_8X10_SILVER_TOUGH_HR01288_PIC3.png",
    "ICON_8X10_SILVER_TOUGH_HR01288_PIC4.png",
    "ICON_8X10_SILVER_TOUGH_HR01288_PIC5.png",
    "ICON_8X10_SILVER_TOUGH_HR01288_PIC6.png",
    "ICON_8X10_SILVER_TOUGH_HR01288_PIC7.png",
    "ICON_8X12_BLACK_HORT_HR01331_PIC2.png",
    "ICON_8X12_BLACK_HORT_HR01331_PIC3.png",
    "ICON_8X12_BLACK_HORT_HR01331_PIC4.png",
    "ICON_8X12_BLACK_HORT_HR01331_PIC5.png",
    "ICON_8X12_BLACK_HORT_HR01331_PIC6.png",
    "ICON_8X12_BLACK_HORT_HR01331_PIC7.png",
    "ICON_8X12_BLACK_TOUGH_HR01332_PIC2.png",
    "ICON_8X12_BLACK_TOUGH_HR01332_PIC3.png",
    "ICON_8X12_BLACK_TOUGH_HR01332_PIC4.png",
    "ICON_8X12_BLACK_TOUGH_HR01332_PIC5.png",
    "ICON_8X12_BLACK_TOUGH_HR01332_PIC6.png",
    "ICON_8X12_BLACK_TOUGH_HR01332_PIC7.png",
    "ICON_8X12_BLACK_TOUGH_HR01332_PIC8.png",
    "ICON_8X12_BLACK_TOUGH_HR01332_PIC9.png",
    "ICON_8X12_BLACK_TOUGH_HR01332_PIC10.png",
    "ICON_8X12_BLACK_TOUGH_HR01332_PIC11.png",
    "ICON_8X12_BLACK_TOUGH_HR01332_PIC12.png",
    "ICON_8X12_BLACK_TOUGH_HR01434_PIC1.png",
    "ICON_8X12_BLACK_TOUGH_HR01434_PIC2.png",
    "ICON_8X12_BLACK_TOUGH_HR01434_PIC3.png",
    "ICON_8X12_BLACK_TOUGH_HR01434_PIC4.png",
    "ICON_8X12_DIMS.png",
    "ICON_8X12_GREEN_HORT_HR01334_PIC2.png",
    "ICON_8X12_GREEN_HORT_HR01334_PIC3.png",
    "ICON_8X12_GREEN_HORT_HR01334_PIC4.png",
    "ICON_8X12_GREEN_HORT_HR01334_PIC5.png",
    "ICON_8X12_GREEN_HORT_HR01334_PIC6.png",
    "ICON_8X12_GREEN_HORT_HR01334_PIC7.png",
    "ICON_8X12_GREEN_TOUGH_HR01335_PIC2.png",
    "ICON_8X12_GREEN_TOUGH_HR01335_PIC3.png",
    "ICON_8X12_GREEN_TOUGH_HR01335_PIC4.png",
    "ICON_8X12_GREEN_TOUGH_HR01335_PIC5.png",
    "ICON_8X12_GREEN_TOUGH_HR01335_PIC6.png",
    "ICON_8X12_GREEN_TOUGH_HR01335_PIC7.png",
    "ICON_8X12_GREEN_TOUGH_HR01435_PIC2.png",
    "ICON_8X12_GREEN_TOUGH_HR01435_PIC3.png",
    "ICON_8X12_GREEN_TOUGH_HR01435_PIC4.png",
    "ICON_8X12_GREEN_TOUGH_HR01435_PIC5.png",
    "ICON_8X12_GREEN_TOUGH_HR01435_PIC6.png",
    "ICON_8X12_GREEN_TOUGH_HR01435_PIC7.png",
    "ICON_8X12_GREEN_TOUGH_HR01435_PIC8.png",
    "ICON_8X12_GREEN_TOUGH_HR01435_PIC9.png",
    "ICON_8X12_GREEN_TOUGH_HR01435_PIC10.png",
    "ICON_8X12_GREEN_TOUGH_HR01435_PIC11.png",
    "ICON_8X12_GREEN_TOUGH_HR01435_PIC12.png",
    "ICON_8X12_GREEN_TOUGH_HR01435_PIC13.png",
    "ICON_8X12_GREEN_TOUGH_HR01435_PIC14.png",
    "ICON_8X12_GREEN_TOUGH_HR01435_PIC15.png",
    "ICON_8X12_SILVER_HORT_HR01328_PIC2.png",
    "ICON_8X12_SILVER_HORT_HR01328_PIC3.png",
    "ICON_8X12_SILVER_HORT_HR01328_PIC4.png",
    "ICON_8X12_SILVER_HORT_HR01328_PIC5.png",
    "ICON_8X12_SILVER_HORT_HR01328_PIC6.png",
    "ICON_8X12_SILVER_HORT_HR01328_PIC7.png",
    "ICON_8X12_SILVER_TOUGH_HR01329_PIC2.png",
    "ICON_8X12_SILVER_TOUGH_HR01329_PIC3.png",
    "ICON_8X12_SILVER_TOUGH_HR01329_PIC4.png",
    "ICON_8X12_SILVER_TOUGH_HR01329_PIC5.png",
    "ICON_8X12_SILVER_TOUGH_HR01329_PIC6.png",
    "ICON_8X12_SILVER_TOUGH_HR01329_PIC7.png",
    "ICON_8X14_BLACK_HORT_HR01372_PIC2.png",
    "ICON_8X14_BLACK_HORT_HR01372_PIC3.png",
    "ICON_8X14_BLACK_HORT_HR01372_PIC4.png",
    "ICON_8X14_BLACK_HORT_HR01372_PIC5.png",
    "ICON_8X14_BLACK_HORT_HR01372_PIC6.png",
    "ICON_8X14_BLACK_HORT_HR01372_PIC7.png",
    "ICON_8X14_BLACK_TOUGH_HR01373_PIC2.png",
    "ICON_8X14_BLACK_TOUGH_HR01373_PIC3.png",
    "ICON_8X14_BLACK_TOUGH_HR01373_PIC4.png",
    "ICON_8X14_BLACK_TOUGH_HR01373_PIC5.png",
    "ICON_8X14_BLACK_TOUGH_HR01373_PIC6.png",
    "ICON_8X14_BLACK_TOUGH_HR01373_PIC7.png",
    "ICON_8X14_BLACK_TOUGH_HR01373_PIC8.png",
    "ICON_8X14_DIMS.png",
    "ICON_8X14_GREEN_HORT_HR01375_PIC2.png",
    "ICON_8X14_GREEN_HORT_HR01375_PIC3.png",
    "ICON_8X14_GREEN_HORT_HR01375_PIC4.png",
    "ICON_8X14_GREEN_HORT_HR01375_PIC5.png",
    "ICON_8X14_GREEN_HORT_HR01375_PIC6.png",
    "ICON_8X14_GREEN_HORT_HR01375_PIC7.png",
    "ICON_8X14_GREEN_TOUGH_HR01376_PIC2.png",
    "ICON_8X14_GREEN_TOUGH_HR01376_PIC3.png",
    "ICON_8X14_GREEN_TOUGH_HR01376_PIC4.png",
    "ICON_8X14_GREEN_TOUGH_HR01376_PIC5.png",
    "ICON_8X14_GREEN_TOUGH_HR01376_PIC6.png",
    "ICON_8X14_GREEN_TOUGH_HR01376_PIC7.png",
    "ICON_8X14_SILVER_HORT_HR01369_PIC1.png",
    "ICON_8X14_SILVER_HORT_HR01369_PIC2.png",
    "ICON_8X14_SILVER_HORT_HR01369_PIC3.png",
    "ICON_8X14_SILVER_HORT_HR01369_PIC4.png",
    "ICON_8X14_SILVER_HORT_HR01369_PIC5.png",
    "ICON_8X14_SILVER_HORT_HR01369_PIC6.png",
    "ICON_8X14_SILVER_TOUGH_HR01370_PIC2.png",
    "ICON_8X14_SILVER_TOUGH_HR01370_PIC3.png",
    "ICON_8X14_SILVER_TOUGH_HR01370_PIC4.png",
    "ICON_8X14_SILVER_TOUGH_HR01370_PIC5.png",
    "ICON_8X14_SILVER_TOUGH_HR01370_PIC6.png",
    "ICON_8X14_SILVER_TOUGH_HR01370_PIC7.png",
    "ICON_GARDENHOUSE_6X10_DIMS.png"

]
</script>


​<!-- =========================================================
     SHOWROOM (FULL MASSIVE DROP-IN) — FIXED FILTERING + NO “INITIALIZING FOREVER”
     ✅ Reads RAW FILE LIST from <script id="ghRawFileList" type="text/plain"> (one filename per line)
        - If not present, uses a fallback array (you can paste filenames there too).
     ✅ Renders tiles ONCE, then filters ONLY by hiding/showing (no duplicates, no “extra” images)
     ✅ Hides EMPTY banners automatically (size + colour banners disappear when no visible tiles under them)
     ✅ Bulletproof PIC carousel grouping (does NOT rely on data-g): scans __rawFileList by RANGE+SIZE+COLOR+GLAZE+REF
     ✅ Supports DIMS files like:
        - ICON_GARDENHOUSE_8X12_DIMS.png
        - ICON_6X4_DIMS.png
     ✅ Toughened label fix (won’t show “3mm Glass” for toughened)
     ✅ Optional tile price badge + popup price reads #ghPriceData (JSON array mapping)
     ========================================================= -->

<!-- ===== Top-centre floating button (mobile only) ===== -->
<button id="ghTopFab" class="gh-topfab" type="button" aria-label="Open filters">FILTERS</button>

<!-- Backdrop for mobile drawer -->
<div id="ghBackdrop" class="gh-backdrop" style="display:none;" aria-hidden="true"></div>

<!-- ===== Controls (desktop floating panel / mobile bottom drawer) ===== -->
<div id="ghControls" class="gh-controls" aria-label="Showroom Filters">
  <div class="gh-controls-head">
    <div class="gh-controls-title">Showroom Filters</div>
    <div class="gh-controls-actions">
      <button id="ghResetFilters" class="gh-headBtn" type="button" aria-label="Reset filters">Reset</button>
      <button id="ghShowResults" class="gh-headBtn" type="button">Show Results</button>
      <button id="ghControlsClose" class="gh-controls-close" type="button" aria-label="Close filters">✕</button>
    </div>
  </div>

  <div class="gh-controls-body">
    <div class="gh-filterCount" id="filterCount">Initializing Showroom...</div>

    <div class="gh-section">
      <div class="gh-section-title">MODEL</div>
      <div class="gh-grid" id="model-btns"></div>
    </div>

    <div class="gh-section">
      <div class="gh-section-title">SIZE</div>
      <div class="gh-grid" id="size-btns"></div>
    </div>

    <div class="gh-section">
      <div class="gh-section-title">GLAZING</div>
      <div class="gh-grid" id="glaze-btns"></div>
    </div>

    <div class="gh-section">
      <div class="gh-section-title">COLOUR</div>
      <div class="gh-grid" id="colour-btns"></div>
    </div>
  </div>
</div>

<!-- ===== Gallery ===== -->
<div id="gallery" class="gallery-grid"></div>

<!-- =========================
     SELECT POPUP
========================= -->
<div id="selectOverlay" class="select-overlay" aria-hidden="true" style="display:none;">
  <div class="select-card" role="dialog" aria-modal="true" aria-label="Selected greenhouse">
    <button class="select-x" type="button" aria-label="Close" onclick="closeSelectPopup()">×</button>

    <div class="select-imgwrap">
      <div class="ghPicShell" aria-label="Greenhouse photos">
        <button class="ghPicNav ghPicPrev" type="button" aria-label="Previous photo">‹</button>

        <div id="ghPicTrack" class="ghPicTrack" tabindex="0" aria-label="Swipe photos"></div>

        <button class="ghPicNav ghPicNext" type="button" aria-label="Next photo">›</button>
      </div>
    </div>

    <div class="select-meta">
      <div id="selectTitle" class="select-title"></div>

      <!-- Popup price -->
      <div id="selectPrice" class="select-price" style="display:none;"></div>

      <div id="selectSub" class="select-sub"></div>
      <div id="ghBottomBar" class="ghBottomBar" style="display:none;"></div>
    </div>

    <div class="select-actions">
      <button id="selectOrderBtn" class="select-btn primary" type="button" onclick="selectOrderNow()">
        Order Now (base & delivey included)
      </button>
      <button id="selectAccBtn" class="select-btn" type="button" onclick="openAccessoriesPopup()">
        View Accessories
      </button>
    </div>

    <div class="select-actions2" style="display:flex; gap:10px; flex-wrap:wrap;">
      <a id="selectWhatsApp" class="select-whatsapp" href="#" target="_blank" rel="noopener">Ask question on WhatsApp (Click Here)</a>
      <span id="selectShareBtn" class="select-share-link" role="button" tabindex="0" aria-label="Share link">Share</span>
    </div>
  </div>
</div>

<!-- =========================
     ACCESSORIES POPUP
========================= -->
<div id="accOverlay" class="acc-overlay" aria-hidden="true" style="display:none;">
  <div class="acc-card" role="dialog" aria-modal="true" aria-label="Accessories">
    <button class="acc-x" type="button" aria-label="Close" onclick="closeAccessoriesPopup()">×</button>

    <div class="acc-title">Accessories</div>
    <div class="acc-body">
      <p>After you have placed your main order we will send you details of model/size spacific accessories you may wish to add.</p>
    </div>

    <div class="acc-actions">
      <a id="accWhatsApp" class="acc-whatsapp" href="#" target="_blank" rel="noopener">WhatsApp</a>
    </div>
  </div>
</div>

<!-- =========================
     NO MATCH OVERLAY
========================= -->
<div id="noMatchOverlay" class="uni-overlay" style="display:none;" aria-hidden="true">
  <div class="uni-card" role="dialog" aria-modal="true" aria-label="No exact match">
    <div class="uni-head">
      <div class="uni-title">No exact match</div>
      <button class="uni-close" type="button" onclick="closeNoMatch()" aria-label="Close">✕</button>
    </div>

    <div class="uni-body">
      <div class="uni-text" id="noMatchText" style="margin-bottom:15px; font-weight:600; color:#444;">
        We couldn’t find that exact combination.
      </div>

      <div id="noMatchSuggest" style="display:none; background:#f0fffe; padding:15px; border-radius:10px; border:1px solid #1fc8b8;">
        <div style="font-weight:800; color:#0e746d; margin-bottom:5px; font-size:12px;">SUGGESTED OPTION:</div>
        <div id="noMatchSuggestLine" style="font-weight:600; font-size:14px; margin-bottom:15px; color:#333; line-height:1.4;"></div>
        <button class="uni-btn uni-btnTeal" id="noMatchApplyBtn" type="button" style="width:100%">SHOW THIS OPTION</button>
      </div>
    </div>
  </div>
</div>

<!-- =========================
     DIMS OVERLAY
========================= -->
<div id="dimsOverlay" class="uni-overlay" style="display:none;" aria-hidden="true">
  <div class="uni-card uni-card-wide" role="dialog" aria-modal="true" aria-label="Dimensions">
    <div class="uni-head">
      <div class="uni-title" id="dimsTitle">Dimensions</div>
      <button class="uni-close" type="button" onclick="closeDims()" aria-label="Close">✕</button>
    </div>

    <div class="uni-body">
      <div class="dims-imgWrap"><img id="dimsImg" src="" alt=""></div>

      <div class="dims-note">
        <div class="dims-noteTitle">Please note:</div>
        <div class="dims-noteText">
          These accurate dimensions are bigger than advertised greenhouse size (as the advertised size is an approximate).
          Also, please allow a little ‘wiggle-room’ around the greenhouse as during installation there needs to be room to fit the glass safely.
        </div>
      </div>
    </div>

    <div class="uni-foot">
      <button class="uni-btn uni-btnTeal" type="button" onclick="closeDims()">Back to showroom</button>
    </div>
  </div>
</div>

<!-- =========================
     ORDER POPUP (IFRAME)
========================= -->
<div id="cogOverlay" class="cog-overlay" aria-hidden="true" style="display:none;">
  <div class="cog-card" role="dialog" aria-modal="true" aria-label="Order form">
    <button class="cog-close" type="button" onclick="closeOrderPopup()" aria-label="Close">✕</button>
    <iframe id="orderIframe" src="" loading="lazy" allow="payment *" referrerpolicy="no-referrer"></iframe>
  </div>
</div>

<style>
:root{
  --teal-grad: linear-gradient(180deg,#1fc8b8 0%, #139b8f 45%, #0e746d 100%);
  --nav-shimmer:
    linear-gradient(110deg, transparent 30%, rgba(255,255,255,0.60) 50%, transparent 70%),
    linear-gradient(180deg, rgba(31,200,184,0.22) 0%, rgba(19,155,143,0.30) 45%, rgba(14,116,109,0.25) 100%);

  --grey-btn:
    linear-gradient(180deg,#f7f7f7 0%, #e5e7eb 45%, #cbd5e1 100%);
  --grey-btn-hi:
    linear-gradient(110deg, transparent 30%, rgba(255,255,255,0.65) 50%, transparent 70%),
    linear-gradient(180deg,#f7f7f7 0%, #e5e7eb 45%, #cbd5e1 100%);

  --alu-grad: linear-gradient(180deg,#f7f7f7 0%, #d9dde3 45%, #b9c0c9 100%);
  --shadow: 0 12px 32px rgba(0,0,0,0.18);

  --panelW: 320px;
  --siteHeaderH: 70px;
  --tileBarH: 52px;
}

*{ box-sizing:border-box; }
body{
  font-family:'Segoe UI',sans-serif;
  margin:0;
  background:#fdfdfd;
  scroll-padding-top: 110px;
}

@media (min-width: 901px){
  :root{ --panelW: 420px; }
  .gh-topfab { display: none !important; }
}

/* Fix double scrollbars (Weebly themes) */
html, body{ height:auto !important; overflow-y:auto !important; }
#wsite-content, .wsite-content, .page-content, .main-wrap, .content-wrap, .container,
#wsite-content-wrapper, #wsite-wrapper, .wrapper, .wsite-section-content{
  overflow: visible !important;
  height: auto !important;
  max-height: none !important;
}

/* Top FAB */
.gh-topfab{
  position: fixed;
  left: 50%;
  top: calc(var(--siteHeaderH) + 10px);
  transform: translateX(-50%);
  z-index: 9998;
  padding: 12px 18px;
  border-radius: 999px;
  border: 2px solid rgba(14,116,109,0.85);
  background: #fff;
  font-weight: 900;
  letter-spacing: .4px;
  cursor:pointer;
  box-shadow: 0 14px 40px rgba(0,0,0,0.22);
  user-select:none;
  animation: fabBreath 2.2s infinite ease-in-out, fabWobble 5.5s infinite ease-in-out;
}
@keyframes fabBreath{ 0%,100%{ transform: translateX(-50%) scale(1); } 50%{ transform: translateX(-50%) scale(1.06); } }
@keyframes fabWobble{ 0%,100%{ rotate: 0deg; } 20%{ rotate: .6deg; } 40%{ rotate: -0.6deg; } 60%{ rotate: .4deg; } 80%{ rotate: -0.4deg; } }
.gh-topfab::after{
  content:"";
  position:absolute;
  inset:-8px;
  border-radius: 999px;
  background: radial-gradient(circle at center, rgba(31,200,184,.25), transparent 60%);
  filter: blur(2px);
  z-index:-1;
  animation: fabGlow 2.2s infinite ease-in-out;
}
@keyframes fabGlow{ 0%,100%{ opacity:.35; } 50%{ opacity:1; } }

/* Backdrop */
.gh-backdrop{
  position: fixed;
  inset: 0;
  z-index: 8999;
  background: rgba(0,0,0,0.55);
}

/* Controls panel */
.gh-controls{
  position: fixed;
  left: 12px;
  top: calc(var(--siteHeaderH) + 70px);
  z-index: 60;
  width: var(--panelW);
  max-height: calc(100vh - (var(--siteHeaderH) + 90px));
  overflow: auto;
  overflow-x: hidden;
  background-color: #fff;
  background-image: var(--nav-shimmer);
  background-size: 220% 100%, 100% 100%;
  animation: panelShimmer 7s infinite linear;
  border: 2px solid rgba(14,116,109,0.25);
  border-radius: 18px;
  box-shadow: var(--shadow);
}
@keyframes panelShimmer{ 0%{ background-position: -220% 0, 0 0; } 100%{ background-position: 220% 0, 0 0; } }

.gh-controls-head{
  position: sticky;
  top: 0;
  background: var(--teal-grad);
  color: #fff;
  padding: 12px 14px;
  border-top-left-radius: 16px;
  border-top-right-radius: 16px;
  display:flex;
  align-items:center;
  justify-content: space-between;
  z-index: 9999;
}
.gh-controls-title{ font-weight: 900; letter-spacing:.3px; }
.gh-controls-actions{ display:flex; gap:8px; align-items:center; }
.gh-headBtn{
  height: 34px;
  padding: 0 12px;
  border-radius: 12px;
  border: 1px solid rgba(255,255,255,0.55);
  background: rgba(255,255,255,0.15);
  color:#fff;
  font-weight: 900;
  cursor:pointer;
}
.gh-controls-close{
  display:none;
  border:none;
  background: rgba(0,0,0,.20);
  color:#fff;
  width:34px;height:34px;
  border-radius: 50%;
  font-weight: 900;
  cursor:pointer;
}
.gh-controls-body{ padding: 12px 14px 16px; overflow-x: hidden; }
.gh-filterCount{
  text-align:center;
  font-weight: 900;
  color:#0e746d;
  font-size: 11px;
  margin: 2px 0 12px;
  text-transform: uppercase;
}

.gh-section{ margin-bottom: 14px; }
.gh-section-title{ font-size: 11px; font-weight: 900; color:#0e746d; margin-bottom: 8px; }

.gh-grid{
  display:grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 8px;
  min-width: 0;
}
.gh-grid > *{ min-width: 0; }

@media (min-width: 901px){
  .gh-grid{ grid-template-columns: repeat(4, 1fr); }
  .size-btn, .glz-filter-btn, .col-filter-btn{
    white-space: nowrap;
    font-size: 11px;
    padding-left: 6px;
    padding-right: 6px;
  }
}

.size-btn, .glz-filter-btn, .col-filter-btn{
  height: 38px;
  border-radius: 12px;
  border: 1px solid rgba(0,0,0,0.12);
  font-weight: 900;
  font-size: 11px;
  cursor:pointer;
  background-image: var(--grey-btn-hi);
  background-size: 220% 100%, 100% 100%;
  animation: btnShimmer 9s infinite linear;
  box-shadow: 0 2px 6px rgba(0,0,0,0.08);
  width: 100%;
  max-width: 100%;
  min-width: 0;
}
@keyframes btnShimmer{ 0%{ background-position: -220% 0, 0 0; } 100%{ background-position: 220% 0, 0 0; } }

.size-btn.active, .glz-filter-btn.active, .col-filter-btn.active{
  background: var(--teal-grad) !important;
  color:#fff !important;
  border:none !important;
  transform: translateY(-1px);
  animation: none !important;
}

/* Colour buttons */
.btn-all-neutral{ border: 2px solid #1fc8b8 !important; color:#0e746d !important; background:#fff !important; animation:none !important; }
.btn-alu{ background: var(--alu-grad) !important; color:#1b1f2a !important; animation:none !important; }
.btn-green{ background: linear-gradient(180deg,#1b6a4d 0%, #0f3d2e 55%, #0a261d 100%) !important; color:#fff !important; animation:none !important; }
.btn-black{ background: linear-gradient(180deg,#2a2f3a 0%, #111827 55%, #060a12 100%) !important; color:#fff !important; animation:none !important; }

/* “Any” unselected */
#model-btns button[data-val="all"]:not(.active),
#size-btns  button[data-val="all"]:not(.active),
#glaze-btns button[data-val="all"]:not(.active){
  border: 2px solid #1fc8b8 !important;
  color: #0e746d !important;
  background: #fff !important;
  background-image: none !important;
  animation: none !important;
}
/* “Any” selected */
#model-btns button[data-val="all"].active,
#size-btns  button[data-val="all"].active,
#glaze-btns button[data-val="all"].active{
  background: var(--teal-grad) !important;
  color: #fff !important;
  border: none !important;
}

/* Show results standout */
#ghShowResults{
  background: linear-gradient(180deg,#ffe08a 0%, #ffb84d 55%, #ff8a2a 100%) !important;
  color:#1b1f2a !important;
  border: 1px solid rgba(255,255,255,0.55) !important;
  animation: showResultsPulse 1.25s ease-in-out infinite !important;
}
@keyframes showResultsPulse{
  0%,100%{ filter: brightness(1); transform: translateY(0); }
  50%{ filter: brightness(1.15); transform: translateY(-1px); }
}

/* Gallery */
.gallery-grid{
  display:grid;
  grid-template-columns: repeat(2,1fr);
  gap: 10px;
  padding: 14px;
  padding-top: calc(var(--siteHeaderH) + 74px);
  margin-left: calc(var(--panelW) + 28px);
  width: calc(100% - (var(--panelW) + 28px));
}
@media (min-width: 992px){
  .gallery-grid{ grid-template-columns: repeat(3,1fr); padding: 18px; padding-top: calc(var(--siteHeaderH) + 74px); }
}
@media (min-width: 1400px){
  .gallery-grid{ grid-template-columns: repeat(4,1fr); }
}

.hidden-item{ display:none !important; }

/* Banners */
@keyframes highContrastShimmer{ 0%{ background-position: -150% 0; } 100%{ background-position: 150% 0; } }
.size-banner, .colour-banner{
  grid-column:1/-1;
  position:relative;
  overflow:hidden;
  border:1px solid rgba(0,0,0,0.15);
  background-size: 250% 100%, 100% 100%;
  animation: highContrastShimmer 8s infinite linear;
  border-radius: 12px;
  font-weight: 900;
  text-align:center;
}
.size-banner{
  padding: 12px;
  color:#fff;
  background-image:
    linear-gradient(110deg, transparent 35%, rgba(255,255,255,0.30) 50%, transparent 65%),
    var(--teal-grad);
}
.colour-banner{
  padding: 10px;
  margin-top: 6px;
  font-size: 13px;
}
.banner-silver{
  color:#1b1f2a;
  background-image:
    linear-gradient(110deg, transparent 35%, rgba(255,255,255,0.50) 50%, transparent 65%),
    var(--alu-grad);
}
.banner-green{
  color:#fff;
  background-image:
    linear-gradient(110deg, transparent 35%, rgba(255,255,255,0.20) 50%, transparent 65%),
    linear-gradient(180deg,#1b6a4d 0%, #0f3d2e 55%, #0a261d 100%);
}
.banner-black{
  color:#fff;
  background-image:
    linear-gradient(110deg, transparent 35%, rgba(255,255,255,0.20) 50%, transparent 65%),
    linear-gradient(180deg,#2a2f3a 0%, #111827 55%, #060a12 100%);
}

/* Overlays */
.uni-overlay{
  position: fixed !important;
  inset: 0 !important;
  z-index: 10000 !important;
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(0,0,0,0.7);
  padding: 15px;
}
.uni-card{
  width: min(450px, 100%);
  background:#fff;
  border-radius:18px;
  border: 2px solid #0e746d;
  display:flex;
  flex-direction: column;
  overflow:hidden;
  box-shadow: 0 20px 50px rgba(0,0,0,0.40);
}
.uni-card-wide{ width: min(800px, 100%); }
.uni-head{
  display:flex;
  align-items:center;
  justify-content: space-between;
  padding: 15px 20px;
  background: var(--teal-grad);
  color:#fff;
}
.uni-title{ font-weight: 900; font-size: 16px; letter-spacing: .5px; }
.uni-close{
  background: rgba(0,0,0,0.2);
  color:#fff;
  border:none;
  width:30px;
  height:30px;
  border-radius: 50%;
  cursor:pointer;
  font-weight: 900;
}
.uni-body{ padding: 25px; text-align:center; }
.uni-foot{ padding: 0 25px 20px; }
.uni-btn{
  padding: 12px 25px;
  border-radius: 10px;
  border:none;
  font-weight: 900;
  cursor:pointer;
  transition: transform .2s;
}
.uni-btn:hover{ transform: translateY(-1px); }
.uni-btnTeal{ background: var(--teal-grad); color:#fff; }

.dims-imgWrap{
  display:flex;
  align-items:center;
  justify-content:center;
  background:#fff;
  border-radius: 12px;
  border: 1px solid #e5e7eb;
  padding: 10px;
}
.dims-imgWrap img{
  max-width: 100%;
  max-height: 55vh;
  object-fit: contain;
}
.dims-note{
  margin-top: 14px;
  border: 1px solid #c7fff8;
  background: #f0fffe;
  border-radius: 12px;
  padding: 14px;
  text-align:left;
}
.dims-noteTitle{ font-weight: 900; color:#0e746d; margin-bottom: 6px; }
.dims-noteText{ color:#374151; font-weight: 650; line-height: 1.4; }

/* Popups */
.select-overlay, .acc-overlay{
  position: fixed;
  inset: 0;
  z-index: 20000;
  display: none;
  align-items: center;
  justify-content: center;
  padding: 18px;
  background: rgba(0,0,0,0.72);
  backdrop-filter: blur(4px);
}
.select-card, .acc-card{
  width: min(820px, 96vw);
  border-radius: 22px;
  position: relative;
  overflow: hidden;
  box-shadow: 0 30px 90px rgba(0,0,0,0.55);
  background: rgba(18,18,18,0.92);
  border: 2px solid #0e746d;
}
.select-x, .acc-x, .cog-close{
  position: absolute;
  top: 10px;
  right: 12px;
  width: 44px;
  height: 44px;
  border-radius: 999px;
  border: 0;
  cursor: pointer;
  font-weight: 900;
  display:flex;
  align-items:center;
  justify-content:center;
  color: #fff;
  background: var(--teal-grad);
  box-shadow: 0 10px 22px rgba(0,0,0,.35), 0 0 0 2px rgba(255,255,255,.25) inset;
  z-index: 5;
}
.select-x, .acc-x{ font-size: 26px; line-height: 1; }
.cog-close{ font-size: 18px; line-height: 1; }

.select-imgwrap{
  width: 100%;
  height: min(42vh, 420px);
  background: rgba(0,0,0,0.45);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 12px;
}
.ghPicShell{
  position: relative;
  width: 100%;
  height: 100%;
  border-radius: 16px;
  overflow: hidden;
  background: rgba(0,0,0,0.35);
  border: 1px solid rgba(255,255,255,0.10);
}
.ghPicTrack{
  height: 100%;
  width: 100%;
  overflow: hidden;
  touch-action: none;
  display: flex;
  scroll-snap-type: none;
  scroll-behavior: auto;
  -webkit-overflow-scrolling: auto;
}
.ghPicCard{
  flex: 0 0 100%;
  height: 100%;
  position: relative;
  display:flex;
  align-items:center;
  justify-content:center;
  background: rgba(0,0,0,0.30);
}
.ghPicCard img{
  width: 100%;
  height: 100%;
  object-fit: contain;
  display:block;
  background: transparent;
}
.ghPicNav{
  position:absolute;
  top: 50%;
  transform: translateY(-50%);
  width: 44px;
  height: 44px;
  border-radius: 999px;
  border: 0;
  cursor: pointer;
  font-size: 28px;
  font-weight: 900;
  color:#fff;
  background: rgba(0,0,0,0.45);
  box-shadow: 0 10px 20px rgba(0,0,0,.35);
  z-index: 4;
}
.ghPicPrev{ left: 10px; }
.ghPicNext{ right: 10px; }
.ghPicNav:hover{ filter: brightness(1.12); }
.ghPicNav:active{ transform: translateY(-50%) scale(0.98); }

.select-meta{ padding: 14px 16px 8px; }
.select-title{ font-size: 18px; font-weight: 900; color: #fff; }
.select-price{ margin-top: 10px; }
.select-sub{ margin-top: 6px; font-size: 13px; opacity: 0.85; color: #e8e8e8; }

.select-actions{
  display: flex;
  gap: 10px;
  padding: 10px 16px 6px;
  flex-wrap: wrap;
}
.select-btn{
  flex: 1 1 220px;
  padding: 12px 14px;
  border-radius: 14px;
  border: 0;
  cursor: pointer;
  font-weight: 800;
  background-image: var(--grey-btn-hi);
  background-size: 220% 100%, 100% 100%;
  animation: btnShimmer 9s infinite linear;
}
.select-btn.primary{ background: var(--teal-grad); color:#fff; animation: none; }
.select-actions2{ padding: 8px 16px 16px; display:flex; flex-direction:column; gap:10px; }
.select-whatsapp, .acc-whatsapp{
  display: inline-block;
  padding: 11px 14px;
  border-radius: 14px;
  text-decoration: none;
  font-weight: 900;
  background: rgba(255,255,255,0.10);
  color: #fff;
}
.select-share-link{
  display:inline-block;
  padding: 2px 4px;
  font-size: 11px;
  font-weight: 800;
  letter-spacing: .2px;
  color: rgba(31,200,184,0.85);
  cursor: pointer;
  user-select: none;
  opacity: .55;
  align-self:flex-start;
}
.select-share-link:hover{ opacity: .95; text-decoration: underline; }

/* Order iframe */
.cog-overlay{
  position: fixed;
  inset: 0;
  z-index: 30000;
  display: none;
  align-items: center;
  justify-content: center;
  background: rgba(0,0,0,0.75);
  backdrop-filter: blur(4px);
  padding: 16px;
}
.cog-card{
  position: relative;
  width: min(980px, 96vw);
  height: min(92vh, 820px);
  background: #fff;
  border-radius: 22px;
  overflow: hidden;
  box-shadow: 0 40px 120px rgba(0,0,0,0.55);
  border: 2px solid #0e746d;
}
.cog-card iframe{ width: 100%; height: 100%; border: 0; }

/* Mobile drawer */
@media (max-width: 900px){
  .gallery-grid{
    margin-left: 0;
    width: 100%;
    padding-top: calc(var(--siteHeaderH) + 5px);
  }
  .gh-controls{
    left: 0;
    right: 0;
    bottom: 0;
    top: auto;
    z-index: 9000;
    width: auto;
    max-height: 80vh;
    transform: translateY(110%);
    transition: transform .25s ease;
    border-radius: 18px 18px 0 0;
    overflow-x: hidden !important;
  }
  .gh-controls.is-open{ transform: translateY(0%); }
  .gh-controls-close{ display:inline-flex; align-items:center; justify-content:center; }
  .gh-grid{ grid-template-columns: repeat(4, 1fr); }
  .size-btn, .glz-filter-btn, .col-filter-btn{ white-space: normal; }
  .gh-controls *{ max-width: 100%; }
}

/* Tiles */
.gh-item.icon-link{
  position: relative !important;
  background:#fff !important;
  overflow:hidden !important;
  border-radius: 16px;
  border: 2px solid rgba(31,200,184,0.95);
  box-shadow: 0 8px 18px rgba(0,0,0,.10);
  cursor: pointer;
  aspect-ratio: 1 / 1.30 !important;
  display:flex !important;
  flex-direction: column !important;
}
@media (min-width: 992px){
  .gh-item.icon-link{ aspect-ratio: 1 / 1.22 !important; }
}
.gh-item.icon-link img{
  flex: 1 1 auto !important;
  min-height: 0 !important;
  width: 100% !important;
  height: 100% !important;
  display:block !important;
  background:#fff !important;
  object-fit: fill !important;
  object-position: center center !important;
  margin:0 !important;
  padding:0 !important;
}
.gh-item.icon-link::after{
  content: attr(data-desc);
  flex: 0 0 auto !important;
  min-height: var(--tileBarH) !important;
  display:flex !important;
  align-items:center !important;
  justify-content:center !important;
  padding: 6px 10px 8px !important;
  font-size: 16px !important;
  line-height: 1.15 !important;
  font-weight: 900 !important;
  text-align:center !important;
  background: var(--teal-grad) !important;
  color:#fff !important;
  border-top: 1px solid rgba(255,255,255,0.25);
  border-bottom: 6px solid rgba(14,116,109,1);
  text-shadow: 0 1px 2px rgba(0,0,0,0.25);
}

/* DIMS icon bubble */
.icon-link.is-dims::before{
  content:"?";
  position:absolute;
  top:10px;
  right:10px;
  width:28px;height:28px;
  display:flex;
  align-items:center;
  justify-content:center;
  border-radius:999px;
  color:#fff;
  font-weight:900;
  font-size:16px;
  background: linear-gradient(180deg, #22d3c5 0%, #18a89a 55%, #0f7f74 100%);
  box-shadow: 0 0 0 2px rgba(255,255,255,.85), 0 0 18px rgba(24,168,154,.65);
  z-index: 3;
  pointer-events: none;
}

/* Tile price badge (only if price exists) */
.ghTilePrice{
  position:absolute;
  top:10px;
  left:10px;
  z-index: 3;
  padding: 7px 10px;
  border-radius: 12px;
  font-weight: 1000;
  font-size: 13px;
  color:#fff;
  background: rgba(0,0,0,0.60);
  border: 1px solid rgba(255,255,255,0.18);
  backdrop-filter: blur(3px);
  display:none;
}

/* Hide JSON price data block if it exists */
#ghPriceData{ display:none !important; }

/* Force Weebly header/burger above tiles */
header,
#header,
.wsite-header,
.wsite-header-section,
.wsite-nav-wrap,
.wsite-mobile-nav,
.wsite-menu-default {
  position: relative !important;
  z-index: 8000 !important;
}
</style>

<script>
(function(){
  "use strict";

  /* =========================================================
     CORE SHOWROOM (render + filtering)
     ========================================================= */

  const gallery = document.getElementById("gallery");
  const filterCountEl = document.getElementById("filterCount");
  const controls = document.getElementById("ghControls");
  const topFab = document.getElementById("ghTopFab");
  const backdrop = document.getElementById("ghBackdrop");
  const closeBtn = document.getElementById("ghControlsClose");
  const showBtn = document.getElementById("ghShowResults");
  const resetBtn = document.getElementById("ghResetFilters");

// Don't exit here — Weebly may inject later. init() will wait.


  /* ---------------------------
     Header height -> CSS var
  --------------------------- */
  function setSiteHeaderOffset(){
    const hdr =
      document.querySelector("header") ||
      document.querySelector("#header") ||
      document.querySelector(".wsite-header") ||
      document.querySelector(".site-header") ||
      document.querySelector(".wsite-nav-wrap");
    const h = hdr ? hdr.offsetHeight : 70;
    document.documentElement.style.setProperty("--siteHeaderH", h + "px");
  }

  /* ---------------------------
     Drawer open/close (mobile)
  --------------------------- */
  function openDrawer(){
    if(!controls) return;
    controls.classList.add("is-open");
    if(topFab) topFab.style.display = "none";
    if(backdrop){
      backdrop.style.display = "block";
      backdrop.setAttribute("aria-hidden","false");
    }
  }
  function closeDrawer(){
    if(!controls) return;
    controls.classList.remove("is-open");
    if(topFab) topFab.style.display = "";
    if(backdrop){
      backdrop.style.display = "none";
      backdrop.setAttribute("aria-hidden","true");
    }
  }

  function scrollToFirstVisibleTile(){
    setTimeout(() => {
      let target =
        document.querySelector('.gh-item.size-banner:not(.hidden-item)') ||
        document.querySelector('.gh-item.colour-banner:not(.hidden-item)');

      if(!target){
        target = document.querySelector('.gh-item.icon-link:not(.hidden-item):not(.is-dims)');
      }
      if(!target) return;

      const topFabEl = document.getElementById("ghTopFab");
      let desiredTopInViewport = 10;

      if(topFabEl){
        const fabStyle = getComputedStyle(topFabEl);
        const fabVisible =
          fabStyle.display !== "none" &&
          fabStyle.visibility !== "hidden" &&
          fabStyle.opacity !== "0";

        if(fabVisible){
          const r = topFabEl.getBoundingClientRect();
          if(r.bottom > 0 && r.bottom < window.innerHeight){
            desiredTopInViewport = r.bottom + 10;
          }
        }
      }

      const y = target.getBoundingClientRect().top + window.scrollY;
      window.scrollTo({ top: Math.max(0, y - desiredTopInViewport), behavior: "smooth" });
    }, 60);
  }

  if(topFab){
    topFab.addEventListener("click", () => {
      if(window.matchMedia("(max-width: 900px)").matches) openDrawer();
      else scrollToFirstVisibleTile();
    });
  }
  if(closeBtn) closeBtn.addEventListener("click", closeDrawer);
  if(backdrop) backdrop.addEventListener("click", closeDrawer);
  if(showBtn) showBtn.addEventListener("click", () => { closeDrawer(); scrollToFirstVisibleTile(); });

  /* ---------------------------
     Burger menu -> hide FAB (mobile)
  --------------------------- */
  (function burgerFabSync(){
    if(!topFab) return;

    function isMobile(){
      return window.matchMedia && window.matchMedia("(max-width: 900px)").matches;
    }
    function showFab(){
      if(!isMobile()) return;
      topFab.style.visibility = "visible";
      topFab.style.opacity = "1";
      topFab.style.pointerEvents = "auto";
    }
    function hideFab(){
      topFab.style.visibility = "hidden";
      topFab.style.opacity = "0";
      topFab.style.pointerEvents = "none";
    }
    topFab.style.transition = "opacity .18s ease";

    function menuLooksOpen(){
      const b = document.body;

      const openByClass =
        b.classList.contains("nav-open") ||
        b.classList.contains("menu-open") ||
        b.classList.contains("mobile-menu-open") ||
        b.classList.contains("wsite-menu-open") ||
        document.documentElement.classList.contains("nav-open") ||
        document.documentElement.classList.contains("menu-open");

      const openPanel =
        document.querySelector(".wsite-mobile-menu-open") ||
        document.querySelector(".wsite-mobile-nav.open") ||
        document.querySelector(".mobile-nav.open") ||
        document.querySelector(".nav-open .mobile-nav") ||
        document.querySelector(".mobile-menu.open") ||
        document.querySelector(".nav-panel.open");

      const expandedToggle =
        document.querySelector('[aria-expanded="true"].hamburger, [aria-expanded="true"].nav-toggle, [aria-expanded="true"].wsite-menu-toggle') ||
        document.querySelector('.hamburger[aria-expanded="true"], .nav-toggle[aria-expanded="true"], .wsite-menu-toggle[aria-expanded="true"]');

      return !!(openByClass || openPanel || expandedToggle);
    }

    function sync(){
      if(!isMobile()){
        topFab.style.visibility = "";
        topFab.style.opacity = "";
        topFab.style.pointerEvents = "";
        return;
      }
      if(menuLooksOpen()) hideFab();
      else showFab();
    }

    const burgerSelectors = [
      ".hamburger",".nav-toggle",".menu-toggle",".wsite-menu-toggle",
      ".wsite-nav-toggle",".mobile-nav-toggle",".navbar-toggle"
    ];

    burgerSelectors.forEach(sel => {
      document.querySelectorAll(sel).forEach(btn => {
        btn.addEventListener("click", () => setTimeout(sync, 50), true);
        btn.addEventListener("touchend", () => setTimeout(sync, 50), true);
      });
    });

    const mo = new MutationObserver(() => sync());
    mo.observe(document.documentElement, { attributes:true, childList:true, subtree:true });
    mo.observe(document.body, { attributes:true, childList:true, subtree:true });

    window.addEventListener("resize", sync);
    setTimeout(sync, 120);
  })();

  /* ---------------------------
     Image path handling + fallback
  --------------------------- */
  const basePathPublic = "https://www.shedsni.com/uploads/1/0/1/3/10130609/";
  const basePathEditor = "https://www.weebly.com/editor/uploads/1/0/1/3/10130609/";

  function fileVariants(file){
  const clean = String(file || "").trim();
  if(!clean) return [];

  // ✅ BEST FIRST: lowercase + hyphens (this is what your server actually has)
  const hyphenLower = clean.toLowerCase().replace(/_/g, "-");

  // fallbacks
  const original = clean;
  const underscoreLower = clean.toLowerCase().replace(/-/g, "_");
  const underscoreUpper = clean.toUpperCase().replace(/-/g, "_");
  const hyphenUpper = clean.toUpperCase().replace(/_/g, "-");

  // ✅ order matters: try hyphenLower first, then original, then other variants
  const v = [];
  [hyphenLower, original, underscoreLower, underscoreUpper, hyphenUpper].forEach(x => {
    if(x && !v.includes(x)) v.push(x);
  });

  return v;
}


  function makeImgTag(file){
    const img = document.createElement("img");
    img.loading = "lazy";
    img.decoding = "async";

    const tries = [];
    const vars = fileVariants(file);
    vars.forEach(fn => tries.push(basePathPublic + fn));
    vars.forEach(fn => tries.push(basePathEditor + fn));

    let i = 0;
    function tryNext(){
      if(i >= tries.length) return;
      img.src = tries[i++];
    }
    img.onerror = function(){ tryNext(); };
    tryNext();
    return img;
  }

  /* ---------------------------
     RAW FILE LIST loader
  --------------------------- */
function readRawFileList(){
  const el = document.getElementById("ghRawFileList");
  if(el && el.textContent){
    let txt = el.textContent.trim();

    // 1) If it's JSON (or looks like it), parse it
    if(txt.startsWith("[")){
      try{
        const arr = JSON.parse(txt);
        if(Array.isArray(arr)){
          return arr
            .map(s => String(s || "").trim())
            .filter(Boolean);
        }
      }catch(e){
        // fall through to cleanup mode
      }
    }

    // 2) Otherwise treat as one-per-line, but CLEAN junk like:
    //    [, ], quotes, trailing commas
    const cleaned = txt
      .split(/\r?\n/)
      .map(s => s.trim())
      .filter(s => s && !s.startsWith("<!--") && !s.startsWith("//"))
      .map(s => s.replace(/^[\[\],]+|[\[\],]+$/g, ""))     // strip stray [ ] ,
      .map(s => s.replace(/^"+|"+$/g, ""))                // strip wrapping quotes
      .map(s => s.replace(/,+$/g, ""))                    // strip trailing comma
      .map(s => s.trim())
      .filter(Boolean);

    // If someone pasted JSON but it failed parse, the cleanup still works.
    // Also remove a lone "[" or "]" if present.
    return cleaned.filter(s => s !== "[" && s !== "]");

  }

  // Fallback: paste filenames here if you want
  return [
    /* "POPULAR_6X4_SILVER_HORT_SO0200_PIC1.png", */
  ];
}


  const rawFileList = readRawFileList();
  window.__rawFileList = rawFileList;

  /* ---------------------------
     Price map (tile + popup)
     #ghPriceData must be a JSON array like:
     [
       {"model":"POPULAR 6X4 SILVER 3MM GLASS","price":467.2,"install":315},
       ...
     ]
  --------------------------- */
  let GH_PRICE_MAP = null;

  function readPriceMap(){
    if(GH_PRICE_MAP) return GH_PRICE_MAP;
    GH_PRICE_MAP = {};

    const el = document.getElementById("ghPriceData");
    if(!el) return GH_PRICE_MAP;

    try{
      const arr = JSON.parse(el.textContent || "[]");
      if(Array.isArray(arr)){
        arr.forEach(r => {
          if(!r || !r.model) return;

          const base =
            (r.price != null ? r.price :
            (r.base != null ? r.base :
            (r.basePrice != null ? r.basePrice :
            (r.base_price != null ? r.base_price : null))));

          const inst =
            (r.install != null ? r.install :
            (r.installation != null ? r.installation :
            (r.installPrice != null ? r.installPrice :
            (r.install_price != null ? r.install_price :
            (r.inst != null ? r.inst :
            (r.fit != null ? r.fit : null))))));

          GH_PRICE_MAP[String(r.model).trim()] = { base: base, install: inst };
        });
      }
    }catch(e){}

    return GH_PRICE_MAP;
  }

  function gbp(n){
    const num = Number(n);
    if(!isFinite(num)) return "";
    return "£" + num.toLocaleString("en-GB",{minimumFractionDigits:2,maximumFractionDigits:2});
  }

  /* ---------------------------
     Parse filename -> metadata (PICn + DIMS)
  --------------------------- */
  function normaliseGlazeToken(tok){
    const t = String(tok||"").toUpperCase();
    if(/POLY/.test(t)) return "poly";
    if(/HORT|HRT|HORG|HORTI/.test(t)) return "glass";
    if(/TOUGH|TGH|SAFE|SAFETY/.test(t)) return "toughened";
    // If unknown, treat as toughened only if it clearly implies it; else "any"
    return "any";
  }

  function parseFile(f){
    const fn = String(f || "").trim();
const norm = fn.replace(/_/g, "-"); // Option B+: normalise to hyphens for parsing

    if(!fn) return null;

const base = norm.replace(/\.(png|jpg|jpeg|webp)$/i, "");
const parts = base.split(/[-]/).filter(Boolean);


    if(parts.length < 2) return null;

    let range = (parts[0] || "").toUpperCase();
    const upper = base.toUpperCase();
    const isDims = upper.includes("_DIMS");

    // Size rules incl ICON_GARDENHOUSE_8X12_DIMS
    let rawSize = (parts[1] || "").toUpperCase();
    if(rawSize === "GARDENHOUSE") rawSize = (parts[2] || "").toUpperCase();

    let size = rawSize.replace(/[^0-9X]/g,"").replace(/x/g,"X");
    if(!size) return null;

    let color = (parts[2] || "").toUpperCase();
    if(rawSize === "GARDENHOUSE") color = (parts[3] || "").toUpperCase(); // not usually used for dims, but safe
    if(color === "MILL") color = "SILVER";

    let glaze = "any";
    let ref = "";
    let pic = 0;

    if(!isDims){
      const glazeToken = (parts[3] || "");
      glaze = normaliseGlazeToken(glazeToken);
      ref = (parts[4] || "").toUpperCase();

      const picPart = parts.find(p => /PIC\d+/i.test(p)) || (parts[5] || "");
      const m = String(picPart).match(/PIC(\d+)/i);
      pic = m ? parseInt(m[1], 10) : 0;
    }

    // Group key for thumbs only (popup will NOT rely on it)
    const groupKey = isDims
      ? (range + "_" + size + "_DIMS")
      : (range + "_" + size + "_" + color + "_" + (parts[3] || "").toUpperCase() + "_" + ref);

    return { f: fn, range, size, color, glaze, isDims, ref, pic, groupKey };
  }

  /* ---------------------------
     State (persist filters)
  --------------------------- */
  let currentSize   = sessionStorage.getItem("gh_size")  || "all";
  let currentCol    = sessionStorage.getItem("gh_col")   || "all";
  let currentGlz    = sessionStorage.getItem("gh_glz")   || "all";
  let currentModel  = sessionStorage.getItem("gh_model") || "all";
  let searchTerms   = "";
  let availableSizesList = [];
  let suppressPopup = false;

  let lastGoodState = { size: currentSize, col: currentCol, glz: currentGlz, model: currentModel, search: searchTerms };

  /* ---------------------------
     Active button highlighting
  --------------------------- */
  function updateNavActiveStates(){
    document.querySelectorAll("#model-btns button").forEach(b => b.classList.toggle("active", (b.getAttribute("data-val")||"") === currentModel));
    document.querySelectorAll("#size-btns button").forEach(b => b.classList.toggle("active", (b.getAttribute("data-val")||"") === currentSize));
    document.querySelectorAll("#glaze-btns button").forEach(b => b.classList.toggle("active", (b.getAttribute("data-val")||"") === currentGlz));
    document.querySelectorAll("#colour-btns button").forEach(b => b.classList.toggle("active", (b.getAttribute("data-val")||"") === currentCol));
  }

  /* ---------------------------
     Build nav buttons
  --------------------------- */
  function buildNav(sizes){
    const mBox = document.getElementById("model-btns");
    if(mBox){
      mBox.innerHTML = "";
      const models = [
        { label:"Any",     val:"all" },
        { label:"Popular", val:"popular" },
        { label:"Icon",    val:"icon" },
        { label:"Qube",    val:"qube" },
        { label:"Qube-SQ", val:"qubesq" }
      ];
      models.forEach(it => {
        const b = document.createElement("button");
        b.className = "glz-filter-btn";
        b.textContent = it.label;
        b.setAttribute("data-val", it.val);
        b.onclick = () => {
          currentModel = it.val;
          sessionStorage.setItem("gh_model", currentModel);
          updateNavActiveStates();
          applyFilters(true);
        };
        mBox.appendChild(b);
      });
    }

    const sBox = document.getElementById("size-btns");
    if(sBox){
      sBox.innerHTML = "";
      const sizeVals = ["all", ...sizes];
      sizeVals.forEach(val => {
        const b = document.createElement("button");
        b.className = "size-btn";
        b.textContent = (val === "all") ? "Any" : val;
        b.setAttribute("data-val", val);
        b.onclick = () => {
          currentSize = val;
          sessionStorage.setItem("gh_size", currentSize);
          updateNavActiveStates();
          applyFilters(true);
        };
        sBox.appendChild(b);
      });
    }

    const gBox = document.getElementById("glaze-btns");
    if(gBox){
      gBox.innerHTML = "";
      const glzItems = [
        { label:"Any",       val:"all" },
        { label:"3mm Glass", val:"glass" },
        { label:"Toughened", val:"toughened" },
        { label:"Polycarb",  val:"poly" }
      ];
      glzItems.forEach(it => {
        const b = document.createElement("button");
        b.className = "glz-filter-btn";
        b.textContent = it.label;
        b.setAttribute("data-val", it.val);
        b.onclick = () => {
          currentGlz = it.val;
          sessionStorage.setItem("gh_glz", currentGlz);
          updateNavActiveStates();
          applyFilters(true);
        };
        gBox.appendChild(b);
      });
    }

    const cBox = document.getElementById("colour-btns");
    if(cBox){
      cBox.innerHTML = "";
      const colItems = [
        { label:"Any",        val:"all",   cls:"btn-all-neutral" },
        { label:"Alu/Silver", val:"alu",   cls:"btn-alu" },
        { label:"Green",      val:"green", cls:"btn-green" },
        { label:"Black",      val:"black", cls:"btn-black" }
      ];
      colItems.forEach(it => {
        const b = document.createElement("button");
        b.className = `col-filter-btn ${it.cls || ""}`.trim();
        b.textContent = it.label;
        b.setAttribute("data-val", it.val);
        b.onclick = () => {
          currentCol = it.val;
          sessionStorage.setItem("gh_col", currentCol);
          updateNavActiveStates();
          applyFilters(true);
        };
        cBox.appendChild(b);
      });
    }

    updateNavActiveStates();
  }

  /* ---------------------------
     DIMS overlay
  --------------------------- */
  function openDims(imgUrl, title){
    const img = document.getElementById("dimsImg");
    const t = document.getElementById("dimsTitle");
    if(img) img.src = imgUrl || "";
    if(t) t.textContent = title || "Dimensions";
    const o = document.getElementById("dimsOverlay");
    if(!o) return;
    o.style.display = "flex";
    o.setAttribute("aria-hidden","false");
    closeDrawer();
  }
  function closeDims(){
    const o = document.getElementById("dimsOverlay");
    if(!o) return;
    o.style.display = "none";
    o.setAttribute("aria-hidden","true");
  }

  /* ---------------------------
     No-match overlay helpers
  --------------------------- */
  function openNoMatchOverlay(){
    const o = document.getElementById("noMatchOverlay");
    if(!o) return;
    o.style.display = "flex";
    o.setAttribute("aria-hidden","false");
  }

  function closeNoMatch(){
    currentSize  = lastGoodState.size;
    currentCol   = lastGoodState.col;
    currentGlz   = lastGoodState.glz;
    currentModel = lastGoodState.model || "all";
    searchTerms  = lastGoodState.search || "";

    sessionStorage.setItem("gh_size", currentSize);
    sessionStorage.setItem("gh_col", currentCol);
    sessionStorage.setItem("gh_glz", currentGlz);
    sessionStorage.setItem("gh_model", currentModel);

    updateNavActiveStates();
    suppressPopup = true;

    const o = document.getElementById("noMatchOverlay");
    if(o){
      o.style.display = "none";
      o.setAttribute("aria-hidden","true");
    }

    applyFilters(false);
  }

  window.openDims = openDims;
  window.closeDims = closeDims;
  window.closeNoMatch = closeNoMatch;

  /* ---------------------------
     Hide buttons that have zero possible results
  --------------------------- */
  function updateAvailableButtons(){
    const tiles = Array.from(document.querySelectorAll(".gh-item.icon-link:not(.is-dims)"));

    function tileMatches(tile, wantModel, wantSize, wantCol, wantGlz){
      const mM = (wantModel === "all") || tile.classList.contains(`rng-${wantModel}`);
      const mS = (wantSize === "all") || tile.classList.contains(`sz-${wantSize}`);
      const mC = (wantCol === "all") || tile.classList.contains(`col-${wantCol}`) || tile.classList.contains("col-any");
      const mG = (wantGlz === "all") || tile.classList.contains(`glz-${wantGlz}`) || tile.classList.contains("glz-any");

      // Qube rules
      let mQ = true;
      const isQubeTile = tile.classList.contains("rng-qube") || tile.classList.contains("rng-qubesq");
      if(isQubeTile){
        mQ = (wantGlz === "all" || wantGlz === "toughened") && (wantCol === "all" || wantCol === "black");
      }
      return mM && mS && mC && mG && mQ;
    }

    function anyExists(testModel, testSize, testCol, testGlz){
      const keywords = (searchTerms || "")
        .split(" ")
        .map(k => k.trim())
        .filter(k => k.length > 0);

      return tiles.some(tile => {
        const fName = (tile.getAttribute("data-f") || "").toLowerCase();
        const matchesSearch = (keywords.length === 0) || keywords.every(kw => fName.includes(kw));
        if(!matchesSearch) return false;
        return tileMatches(tile, testModel, testSize, testCol, testGlz);
      });
    }

    function toggleBtns(containerSel, computeTest){
      const box = document.querySelector(containerSel);
      if(!box) return;
      box.querySelectorAll("button").forEach(btn => {
        const v = (btn.getAttribute("data-val") || "").toLowerCase();
        if(v === "all"){ btn.style.display = ""; return; }
        btn.style.display = computeTest(v) ? "" : "none";
      });
    }

    toggleBtns("#model-btns", (mVal) => anyExists(mVal, currentSize, currentCol, currentGlz));
    toggleBtns("#size-btns",  (sVal) => anyExists(currentModel, sVal.toUpperCase(), currentCol, currentGlz));
    toggleBtns("#glaze-btns", (gVal) => anyExists(currentModel, currentSize, currentCol, gVal));
    toggleBtns("#colour-btns",(cVal) => anyExists(currentModel, currentSize, cVal, currentGlz));
  }

  /* ---------------------------
     Banner visibility logic:
     - Size banner hidden if no visible product tiles for that size
     - Colour banner hidden if no visible product tiles matching its size+range+colour
  --------------------------- */
  function syncBannerVisibility(){
    const visibleProductTiles = Array.from(document.querySelectorAll(".gh-item.icon-link:not(.is-dims):not(.hidden-item)"));

    const sizeHas = new Set();
    const colourHas = new Set(); // key: sz|rng|col

    visibleProductTiles.forEach(t => {
      const sz = t.getAttribute("data-sz") || "";
      const rng = t.getAttribute("data-rng") || "";
      const col = t.getAttribute("data-col") || "";
      if(sz) sizeHas.add(sz);
      if(sz && rng && col) colourHas.add(sz + "|" + rng + "|" + col);
    });

    document.querySelectorAll(".gh-item.size-banner").forEach(b => {
      const sz = b.getAttribute("data-sz") || "";
      b.classList.toggle("hidden-item", !!sz && !sizeHas.has(sz));
    });

    document.querySelectorAll(".gh-item.colour-banner").forEach(b => {
      const sz = b.getAttribute("data-sz") || "";
      const rng = b.getAttribute("data-rng") || "";
      const col = b.getAttribute("data-col") || "";
      const key = sz + "|" + rng + "|" + col;
      b.classList.toggle("hidden-item", !!sz && !!rng && !!col && !colourHas.has(key));
    });
  }

  /* ---------------------------
     APPLY FILTERS (ONLY hides/shows existing tiles/banners)
  --------------------------- */
  function applyFilters(allowPopup = true){
    let count = 0;
    if(allowPopup) suppressPopup = false;

    const keywords = (searchTerms || "")
      .split(" ")
      .map(k => k.trim())
      .filter(k => k.length > 0);

    const allItems = Array.from(document.querySelectorAll(".gh-item"));
function isProductTile(el){
  return el.classList.contains("icon-link") &&
         !el.classList.contains("is-dims") &&
         !el.classList.contains("size-banner") &&
         !el.classList.contains("colour-banner");
}
function isBanner(el){
  return el.classList.contains("size-banner") || el.classList.contains("colour-banner");
}


    allItems.forEach(item => {
      // banners handled later by syncBannerVisibility (but we still hide them initially based on their classes)
const fName = (item.getAttribute("data-f") || "").toLowerCase();
const matchesSearch = (!isProductTile(item))
  ? true
  : ((keywords.length === 0) || keywords.every(kw => fName.includes(kw)));


      const mS = (currentSize === "all") || item.classList.contains(`sz-${currentSize}`);
      const mC = (currentCol   === "all") || item.classList.contains(`col-${currentCol}`) || item.classList.contains("col-any");
      const mG = (currentGlz   === "all") || item.classList.contains(`glz-${currentGlz}`) || item.classList.contains("glz-any");
const itemRng = (item.getAttribute("data-rng") || "").toLowerCase();

// ✅ Product tiles + DIMS tiles MUST match model (unless model=all)
// ✅ Banners will be handled later by syncBannerVisibility()
let mM = true;
if(currentModel !== "all"){
  if(isBanner(item)){
    mM = true; // banner visibility handled by syncBannerVisibility()
  }else{
    mM = (itemRng === currentModel) || item.classList.contains("rng-" + currentModel);
  }
}


      let mQ = true;
      const isQubeItem = item.classList.contains("rng-qube") || item.classList.contains("rng-qubesq");
      if(isQubeItem){
        mQ = (currentGlz === "all" || currentGlz === "toughened") &&
             (currentCol === "all" || currentCol === "black");
      }

      const isVisible = mS && mC && mG && mM && mQ && matchesSearch;
      item.classList.toggle("hidden-item", !isVisible);

      if(isVisible && isProductTile(item)){
        count++;
      }
    });

    // Now hide banners that have no visible product tiles beneath them
    syncBannerVisibility();

    // Update counter text (no more “Initializing…”)
    filterCountEl.textContent = `Showing ${count} result${count===1?"":"s"}`;
    if(showBtn) showBtn.textContent = `Show (${count}) Results`;

    if(count > 0){
      lastGoodState = { size: currentSize, col: currentCol, glz: currentGlz, model: currentModel, search: searchTerms };
      updateAvailableButtons();
      return;
    }

    updateAvailableButtons();
    if(!allowPopup || suppressPopup) return;
    openNoMatchOverlay();
  }

  /* ---------------------------
     RESET FILTERS
  --------------------------- */
  function resetFilters(){
    currentSize  = "all";
    currentCol   = "all";
    currentGlz   = "all";
    currentModel = "all";
    searchTerms  = "";

    sessionStorage.setItem("gh_size", currentSize);
    sessionStorage.setItem("gh_col", currentCol);
    sessionStorage.setItem("gh_glz", currentGlz);
    sessionStorage.setItem("gh_model", currentModel);

    suppressPopup = true;
    updateNavActiveStates();

    const noMatch = document.getElementById("noMatchOverlay");
    const dims = document.getElementById("dimsOverlay");
    if(noMatch){ noMatch.style.display = "none"; noMatch.setAttribute("aria-hidden","true"); }
    if(dims){ dims.style.display = "none"; dims.setAttribute("aria-hidden","true"); }

    applyFilters(false);

    const isMobile = window.matchMedia && window.matchMedia("(max-width: 900px)").matches;
    if(!isMobile){
      closeDrawer();
      setTimeout(scrollToFirstVisibleTile, 80);
    }
  }
  if(resetBtn) resetBtn.addEventListener("click", resetFilters);

  /* ---------------------------
     Render showroom (banners + tiles + dims per range+size)
  --------------------------- */
  function glazingLabelFromKey(glz){
    if(glz === "glass") return "3mm Glass";
    if(glz === "toughened") return "Toughened Glass";
    if(glz === "poly") return "Polycarbonate";
    return "";
  }

  function colourKeyFromName(col){
    if(col === "SILVER") return "alu";
    if(col === "GREEN") return "green";
    if(col === "BLACK") return "black";
    return "any";
  }

  function rangeSafe(rng){
    return String(rng||"").toLowerCase().replace(/-/g,"");
  }

  function makeChoiceText(rng, sz, colName, glzKey){
    const c = (colName === "SILVER") ? "Silver" : (colName.charAt(0) + colName.slice(1).toLowerCase());
    const g = glazingLabelFromKey(glzKey);
    // This must match your ghPriceData "model" keys exactly if you want pricing to appear
    return `${rng.replace(/-/g," ")} ${sz} ${c} ${g}`.trim();
  }

  function attachTilePriceBadge(tile, choiceText){
    const map = readPriceMap();
    const row = map ? map[String(choiceText||"").trim()] : null;
    const base = row ? row.base : null;
    const baseNum = Number(base);

    const badge = document.createElement("div");
    badge.className = "ghTilePrice";

    if(base !== null && base !== undefined && base !== "" && isFinite(baseNum)){
      badge.textContent = gbp(baseNum);
      badge.style.display = "block";
    }

    tile.appendChild(badge);
  }

  function renderShowroom(){
    try{
      const parsed = rawFileList.map(parseFile).filter(Boolean);

      availableSizesList = [...new Set(parsed.map(d => d.size))].sort((a,b) => {
        const pa = a.split("X"), pb = b.split("X");
        const va = (parseInt(pa[0],10)||0) * 100 + (parseInt(pa[1],10)||0);
        const vb = (parseInt(pb[0],10)||0) * 100 + (parseInt(pb[1],10)||0);
        return va - vb;
      });

      gallery.innerHTML = "";

      availableSizesList.forEach(sz => {
        // Size banner
        const sb = document.createElement("div");
        sb.className = `size-banner gh-item sz-${sz} col-any glz-any rng-popular rng-icon rng-qube rng-qubesq`;
        sb.setAttribute("data-banner","size");
        sb.setAttribute("data-sz", sz);
        sb.textContent = `${sz} SHOWROOM`;
        gallery.appendChild(sb);

        ["POPULAR","ICON","QUBE","QUBE-SQ"].forEach(rng => {
          const allPics = parsed.filter(d => d.range === rng && d.size === sz && !d.isDims);
          if(allPics.length === 0) return;

          // One thumb per product group (use lowest PIC)
          const thumbsByGroup = {};
          allPics.forEach(d => {
            const key = d.groupKey || d.f;
            if(!thumbsByGroup[key] || (d.pic || 999) < (thumbsByGroup[key].pic || 999)){
              thumbsByGroup[key] = d;
            }
          });
          const items = Object.keys(thumbsByGroup).map(k => thumbsByGroup[k]);

          const rSafe = rangeSafe(rng);

          ["SILVER","GREEN","BLACK"].filter(c => items.some(d => d.color === c)).forEach(colName => {
            const cKey = colourKeyFromName(colName);

            // Colour banner
            const cb = document.createElement("div");
            cb.className = `colour-banner gh-item sz-${sz} col-${cKey} rng-${rSafe} banner-${colName.toLowerCase()}`;
            cb.setAttribute("data-banner","colour");
            cb.setAttribute("data-sz", sz);
            cb.setAttribute("data-rng", rSafe);
            cb.setAttribute("data-col", cKey);
            cb.textContent = `${sz} ${rng.replace(/-/g," ")} – ${colName}`;
            gallery.appendChild(cb);

            const GLZ_SORT = { glass: 0, toughened: 1, poly: 2, any: 9 };

            items
              .filter(d => d.color === colName)
              .slice()
              .sort((a,b) => (GLZ_SORT[a.glaze] ?? 9) - (GLZ_SORT[b.glaze] ?? 9))
              .forEach(item => {
                const tile = document.createElement("div");
                tile.className = `icon-link gh-item sz-${sz} col-${cKey} glz-${item.glaze} rng-${rSafe}`;
                tile.setAttribute("data-f", item.f);

                // For banner sync
                tile.setAttribute("data-sz", sz);
                tile.setAttribute("data-rng", rSafe);
                tile.setAttribute("data-col", cKey);

                const choiceText = makeChoiceText(rng, sz, colName, item.glaze);
                tile.setAttribute("data-choice", choiceText);

                const glzLabel = glazingLabelFromKey(item.glaze);
                tile.setAttribute("data-desc", `${rng.replace(/-/g," ")} ${sz} · ${colName} · ${glzLabel}`.trim());

                tile.appendChild(makeImgTag(item.f));
                attachTilePriceBadge(tile, choiceText);

                gallery.appendChild(tile);
              });

            // DIMS file per range+size
            const dimsFile = rawFileList.find(fn => {
              const p = parseFile(fn);
              return p && p.isDims && p.range === rng && p.size === sz;
            });

            if(dimsFile){
              const dt = document.createElement("div");
              dt.className = `icon-link gh-item is-dims sz-${sz} col-${cKey} rng-${rSafe} glz-any`;
              dt.setAttribute("data-f", dimsFile);
              dt.setAttribute("data-sz", sz);
              dt.setAttribute("data-rng", rSafe);
              dt.setAttribute("data-col", cKey);
              dt.setAttribute("data-desc", `${rng.replace(/-/g," ")} ${sz} · Dimensions`);

              dt.addEventListener("click", () => {
                const im = dt.querySelector("img");
                const src = im ? (im.currentSrc || im.src) : "";
                const fallback = basePathPublic + dimsFile;
                openDims(src || fallback, `${rng.replace(/-/g," ")} ${sz} – Dimensions`);
              });

              dt.appendChild(makeImgTag(dimsFile));
              gallery.appendChild(dt);
            }
          });
        });
      });

      buildNav(availableSizesList);

      // IMPORTANT: apply filters AFTER render, and update text
      applyFilters(false);

      window.__SHOWROOM_READY__ = true;
      document.dispatchEvent(new Event("showroom:ready"));


    }catch(err){
      filterCountEl.textContent = "Showroom error (check console)";
      console.error("Showroom render error:", err);
    }
  }
window.__ghRenderShowroom = renderShowroom; // ✅ MUST be here, outside
  /* ---------------------------
     DOM ready (safe)
  --------------------------- */
function init(){
  setSiteHeaderOffset();
  window.addEventListener("resize", setSiteHeaderOffset);

  // ✅ Weebly-safe: wait until required nodes exist
  let tries = 0;
  const boot = () => {
    tries++;

    const g = document.getElementById("gallery");
    const fc = document.getElementById("filterCount");

    // still not ready? try again
    if(!g || !fc){
      if(tries < 80) return setTimeout(boot, 80);
      console.warn("Showroom: required nodes not found (#gallery / #filterCount)");
      return;
    }

    // run initial render
    renderShowroom();

    // ✅ Self-heal watchdog: if anything wipes gallery after render, bring it back
    let guard = 0;
    const watchdog = setInterval(() => {
      guard++;
      const tilesNow = document.querySelectorAll("#gallery .gh-item.icon-link").length;
      const rawCount = (window.__rawFileList && window.__rawFileList.length) || 0;

      if(rawCount > 0 && tilesNow === 0){
        console.warn("Showroom watchdog: gallery empty -> re-rendering");
        try{ renderShowroom(); }catch(e){}
      }

      // don't run forever
      if(guard > 60) clearInterval(watchdog); // ~60 seconds
    }, 1000);
  };

  boot();
}


  if(document.readyState === "loading"){
    document.addEventListener("DOMContentLoaded", init);
  }else{
    // Weebly sometimes injects blocks after DOMContentLoaded
    setTimeout(init, 0);
  }

})();
</script>

<script>
(function(){
  "use strict";

  /* =========================================================
     SELECT / ACCESSORIES / ORDER POPUPS + DEEP LINK SHARE
     ✅ Bulletproof PIC grouping by scanning __rawFileList
     ========================================================= */

  function buildWhatsAppLink(message){
    var phone = "447720377778";
    var prefix = "Hi Chris, i was on your website and have a question. ";
    return "https://wa.me/" + phone + "?text=" + encodeURIComponent(prefix + (message || ""));
  }

  function openOverlay(el){
    if(!el) return;
    el.style.display = "flex";
    el.setAttribute("aria-hidden","false");
    document.body.style.overflow = "hidden";
  }

  function closeOverlay(el){
    if(!el) return;
    el.style.display = "none";
    el.setAttribute("aria-hidden","true");
    document.body.style.overflow = "";

    var back = document.getElementById("ghBackdrop");
    if(back){
      back.style.display = "none";
      back.setAttribute("aria-hidden","true");
    }
  }

  var GH_SELECTED = null;

  var BASE_PUBLIC = "https://www.shedsni.com/uploads/1/0/1/3/10130609/";
  var BASE_EDITOR = "https://www.weebly.com/editor/uploads/1/0/1/3/10130609/";

function fileVariants(file){
  var clean = String(file || "").trim();
  if(!clean) return [];

  // ✅ BEST FIRST: lowercase + hyphens
  var hyphenLower = clean.toLowerCase().replace(/_/g, "-");

  // fallbacks
  var original = clean;
  var underscoreLower = clean.toLowerCase().replace(/-/g, "_");
  var underscoreUpper = clean.toUpperCase().replace(/-/g, "_");
  var hyphenUpper = clean.toUpperCase().replace(/_/g, "-");

  var v = [];
  [hyphenLower, original, underscoreLower, underscoreUpper, hyphenUpper].forEach(function(x){
    if(x && v.indexOf(x) === -1) v.push(x);
  });

  return v;
}


  function setImgWithFallback(img, file){
    var vars = fileVariants(file);
    var tries = [];
    vars.forEach(function(fn){ tries.push(BASE_PUBLIC + fn); });
    vars.forEach(function(fn){ tries.push(BASE_EDITOR + fn); });

    var i = 0;
    function next(){
      if(i >= tries.length) return;
      img.src = tries[i++];
    }
    img.onerror = function(){ next(); };
    next();
  }

  function parsePicMeta(file){
    var f = String(file || "").trim();
var norm = f.replace(/_/g, "-");

    if(!f) return null;

    var upper = norm.toUpperCase();
    if(upper.indexOf("_DIMS") !== -1) return null;

var base = norm.replace(/\.(png|jpg|jpeg|webp)$/i, "");
var parts = base.split(/[-]/).filter(Boolean);
    if(parts.length < 5) return null;

    var range = (parts[0] || "").toUpperCase();

    // size supports ICON_GARDENHOUSE_8X12_xxx
    var sizeTok = (parts[1] || "").toUpperCase();
    if(sizeTok === "GARDENHOUSE") sizeTok = (parts[2] || "").toUpperCase();
    var size  = sizeTok.replace(/[^0-9X]/g,"").replace(/x/g,"X");

    var colorIdx = (parts[1] || "").toUpperCase() === "GARDENHOUSE" ? 3 : 2;
    var glazeIdx = colorIdx + 1;
    var refIdx   = colorIdx + 2;

    var color = (parts[colorIdx] || "").toUpperCase();
    if(color === "MILL") color = "SILVER";

    var glaze = (parts[glazeIdx] || "").toUpperCase();
    var ref   = (parts[refIdx] || "").toUpperCase();

    var picPart = parts.find(function(p){ return /PIC\d+/i.test(p); }) || "";
    var m = String(picPart).match(/PIC(\d+)/i);
    var pic = m ? parseInt(m[1],10) : 0;

    return { file:f, range:range, size:size, color:color, glaze:glaze, ref:ref, pic:pic };
  }

  function getRawList(){
    return (window.__rawFileList || window.rawFileList || []);
  }

  function getPicsForFile(file){
    var meta = parsePicMeta(file);
    if(!meta) return [{ file: String(file||""), pic:1, ref:"" }];

    var list = getRawList();
    var out = [];

    for(var i=0;i<list.length;i++){
      var m = parsePicMeta(list[i]);
      if(!m) continue;

      if(
        m.range === meta.range &&
        m.size  === meta.size &&
        m.color === meta.color &&
        m.glaze === meta.glaze &&
        m.ref   === meta.ref
      ){
        out.push(m);
      }
    }

    if(!out.length){
      out = [{ file: String(file||""), pic:1, ref:meta.ref || "" }];
    }

    out.sort(function(a,b){ return (a.pic||0) - (b.pic||0); });
    return out;
  }

  function getShowroomBaseUrl(){
    return window.location.origin + window.location.pathname;
  }
  function buildDeepLinkForFile(fileName){
    if(!fileName) return getShowroomBaseUrl();
    return getShowroomBaseUrl() + "?gh=" + encodeURIComponent(fileName);
  }

  function sharePopupLink(url){
    var msg = "More Info Here\n" + url;

    try{
      if(navigator.share){
        navigator.share({ text: msg }).catch(function(){});
        return;
      }
    }catch(e){}

    try{
      if(navigator.clipboard && navigator.clipboard.writeText){
        navigator.clipboard.writeText(msg).then(function(){
          alert("Copied — paste into WhatsApp.");
        }).catch(function(){
          prompt("Copy this:", msg);
        });
        return;
      }
    }catch(e){}

    prompt("Copy this:", msg);
  }

  function glazeLabelFromFilenameToken(tok){
    var t = String(tok||"").toUpperCase();
    if(t.indexOf("POLY") !== -1) return "Polycarbonate";
    if(t.indexOf("HORT") !== -1) return "3mm Glass";
    if(t.indexOf("TOUGH") !== -1 || t.indexOf("TGH") !== -1 || t.indexOf("SAFE") !== -1) return "Toughened Glass";
    return "";
  }

  function getChoiceTextFromTile(tile){
    // Use data-choice if present (most accurate / consistent with price map)
    var c = (tile.getAttribute("data-choice") || "").trim();
    if(c) return c;

    // Fallback: parse from filename
    var f = (tile.getAttribute("data-f") || "").trim();
    if(!f) return "";

    var base = f.replace(/\.(png|jpg|jpeg|webp)$/i,"");
    var parts = base.split(/[_-]/).filter(Boolean);

    var range = (parts[0] || "").toUpperCase();
    var sizeTok = (parts[1] || "").toUpperCase();
    if(sizeTok === "GARDENHOUSE") sizeTok = (parts[2] || "").toUpperCase();

    var size = sizeTok.replace(/[^0-9X]/g,"").replace(/x/g,"X");
    var isDims = base.toUpperCase().indexOf("_DIMS") !== -1;

    var colorIdx = (parts[1] || "").toUpperCase() === "GARDENHOUSE" ? 3 : 2;
    var glazeIdx = colorIdx + 1;

    var color = (parts[colorIdx] || "").toUpperCase();
    if(color === "MILL") color = "SILVER";

    var glazeLbl = "";
    if(!isDims){
      glazeLbl = glazeLabelFromFilenameToken(parts[glazeIdx] || "");
    }

    function colourLabel(c2){
      if(c2 === "SILVER") return "Silver";
      return c2.charAt(0) + c2.slice(1).toLowerCase();
    }

    return (range + " " + size + " " + colourLabel(color) + " " + glazeLbl).trim();
  }

  /* Price reading (same logic as core) */
  var GH_PRICE_MAP = null;
  function readPriceMap(){
    if(GH_PRICE_MAP) return GH_PRICE_MAP;
    GH_PRICE_MAP = {};

    var el = document.getElementById("ghPriceData");
    if(!el) return GH_PRICE_MAP;

    try{
      var arr = JSON.parse(el.textContent || "[]");
      if(Array.isArray(arr)){
        arr.forEach(function(r){
          if(!r || !r.model) return;

          var base =
            (r.price != null ? r.price :
            (r.base != null ? r.base :
            (r.basePrice != null ? r.basePrice :
            (r.base_price != null ? r.base_price : null))));

          var inst =
            (r.install != null ? r.install :
            (r.installation != null ? r.installation :
            (r.installPrice != null ? r.installPrice :
            (r.install_price != null ? r.install_price :
            (r.inst != null ? r.inst :
            (r.fit != null ? r.fit : null))))));

          GH_PRICE_MAP[String(r.model).trim()] = { base: base, install: inst };
        });
      }
    }catch(e){}

    return GH_PRICE_MAP;
  }

  function gbp(n){
    var num = Number(n);
    if(!isFinite(num)) return "";
    return "£" + num.toLocaleString("en-GB",{minimumFractionDigits:2,maximumFractionDigits:2});
  }

  function openSelectPopup(sel){
    GH_SELECTED = sel || null;

    var overlay = document.getElementById("selectOverlay");
    var title = document.getElementById("selectTitle");
    var priceEl = document.getElementById("selectPrice");
    var sub = document.getElementById("selectSub");
    var wa = document.getElementById("selectWhatsApp");
    var shareBtn = document.getElementById("selectShareBtn");

    var track = document.getElementById("ghPicTrack");
    var prevBtn = overlay ? overlay.querySelector(".ghPicPrev") : null;
    var nextBtn = overlay ? overlay.querySelector(".ghPicNext") : null;

    if(title) title.textContent = (sel && sel.choiceText) ? sel.choiceText : "Selected greenhouse";

    // Popup price: base + (installation £X - £X+100)
    if(priceEl){
      var map = readPriceMap();
      var key = (sel && sel.choiceText) ? String(sel.choiceText).trim() : "";
      var row = key && map ? map[key] : null;

      var base = row ? row.base : null;
      var inst = row ? row.install : null;

      var baseNum = Number(base);
      var instNum = Number(inst);

      var baseTxt = (base !== null && base !== undefined && base !== "" && isFinite(baseNum)) ? gbp(baseNum) : "";
      var instTxt = "";
      if(inst !== null && inst !== undefined && inst !== "" && isFinite(instNum)){
        var hi = instNum + 100;
        instTxt = gbp(instNum) + " - " + gbp(hi);
      }

      if(!baseTxt && !instTxt){
        priceEl.style.display = "none";
        priceEl.innerHTML = "";
      }else{
        priceEl.style.display = "block";
        var instLine = instTxt ? (' <span style="opacity:.92; font-weight:800;">(Installation ' + instTxt + ')</span>') : "";
        priceEl.innerHTML =
          (baseTxt ? ('<span style="color:#1fc8b8; font-size:20px; font-weight:1100; letter-spacing:.2px;">' + baseTxt + '</span>') : "") +
          instLine;

        // keep simple look
        priceEl.style.background = "transparent";
        priceEl.style.backgroundImage = "none";
        priceEl.style.animation = "none";
        priceEl.style.boxShadow = "none";
        priceEl.style.border = "0";
        priceEl.style.padding = "0";
        priceEl.style.marginTop = "10px";
        priceEl.style.letterSpacing = ".2px";
      }
    }

    if(sub) sub.textContent = "COMING SOON: Product Video";

    if(wa){
      var msg = "I'm interested in " + ((sel && sel.choiceText) ? sel.choiceText : "a greenhouse") + " and my question is, ";
      wa.href = buildWhatsAppLink(msg);
      wa.textContent = "Question? (Click Here)";
    }

    if(shareBtn){
      shareBtn.onclick = function(){
        var file = (sel && sel.file) ? String(sel.file) : "";
        var url = buildDeepLinkForFile(file);
        sharePopupLink(url);
      };
    }

    // Build carousel
    if(track){
      track.innerHTML = "";
      var file = (sel && sel.file) ? String(sel.file).trim() : "";
      var pics = getPicsForFile(file);

      pics.forEach(function(p){
        var card = document.createElement("div");
        card.className = "ghPicCard";

        var img = document.createElement("img");
        img.loading = "lazy";
        img.decoding = "async";
        img.alt = (sel && sel.choiceText) ? sel.choiceText : "Greenhouse photo";
        setImgWithFallback(img, p.file);

        card.appendChild(img);
        track.appendChild(card);
      });

      setTimeout(function(){ try{ track.scrollLeft = 0; }catch(e){} }, 10);

      function scrollByCard(dir){
        var w = track.clientWidth || 1;
        var idx = Math.round((track.scrollLeft || 0) / w);
        var next = idx + dir;
        if(next < 0) next = 0;
        if(next > (track.children.length - 1)) next = (track.children.length - 1);
        track.scrollLeft = next * w;
      }
      if(prevBtn) prevBtn.onclick = function(){ scrollByCard(-1); };
      if(nextBtn) nextBtn.onclick = function(){ scrollByCard(1); };

      // Block user wheel/swipe so only arrows control
      (function disableUserScrollOnTrack(){
        track.addEventListener("wheel", function(e){ e.preventDefault(); e.stopPropagation(); }, { passive:false });
        track.addEventListener("touchstart", function(e){ e.preventDefault(); }, { passive:false });
        track.addEventListener("touchmove", function(e){ e.preventDefault(); }, { passive:false });
        track.addEventListener("pointerdown", function(e){ try{ track.setPointerCapture(e.pointerId); }catch(_){ } e.preventDefault(); }, { passive:false });
        track.addEventListener("pointermove", function(e){ e.preventDefault(); }, { passive:false });

        function clampToPage(){
          var w = track.clientWidth || 1;
          var idx = Math.round((track.scrollLeft || 0) / w);
          track.scrollLeft = idx * w;
        }
        track.addEventListener("scroll", function(){ clampToPage(); }, { passive:true });
      })();
    }

    openOverlay(overlay);
  }

  window.closeSelectPopup = function(){
    closeOverlay(document.getElementById("selectOverlay"));
  };

  window.openAccessoriesPopup = function(){
    var overlay = document.getElementById("accOverlay");
    var wa = document.getElementById("accWhatsApp");
    if(wa){
      var msg = "Hi! Can you advise on accessories for: " + ((GH_SELECTED && GH_SELECTED.choiceText) ? GH_SELECTED.choiceText : "my greenhouse") + "?";
      wa.href = buildWhatsAppLink(msg);
    }
    closeOverlay(document.getElementById("selectOverlay"));
    openOverlay(overlay);
  };

  window.closeAccessoriesPopup = function(){
    closeOverlay(document.getElementById("accOverlay"));
    openOverlay(document.getElementById("selectOverlay"));
  };

  (function bindPopupBackdropClose(){
    var selectOverlay = document.getElementById("selectOverlay");
    var accOverlay = document.getElementById("accOverlay");

    if(selectOverlay){
      selectOverlay.addEventListener("click", function(e){
        if(e.target === selectOverlay) window.closeSelectPopup();
      });
    }
    if(accOverlay){
      accOverlay.addEventListener("click", function(e){
        if(e.target === accOverlay){
          closeOverlay(accOverlay);
          openOverlay(document.getElementById("selectOverlay"));
        }
      });
    }
  })();

  function getQueryParam(name){
    try{
      var p = new URLSearchParams(window.location.search);
      return p.get(name);
    }catch(e){ return null; }
  }

  function findTileByFile(file){
    var tiles = document.querySelectorAll(".gh-item.icon-link[data-f]");
    for(var i=0;i<tiles.length;i++){
      if((tiles[i].getAttribute("data-f") || "") === file) return tiles[i];
    }
    return null;
  }

  function tryOpenFromDeepLink(){
    var file = getQueryParam("gh");
    if(!file) return;

    var attempts = 0;
    var maxAttempts = 40;
    var delay = 120;

    (function poll(){
      attempts++;
      var tile = findTileByFile(file);

      if(tile){
        if(tile.classList.contains("is-dims")) return;
        var choiceText = getChoiceTextFromTile(tile);
        openSelectPopup({ choiceText: choiceText, file: file });
        return;
      }

      if(attempts < maxAttempts){
        setTimeout(poll, delay);
      }
    })();
  }

  (function bindDeepLinkOpen(){
    if(window.__SHOWROOM_READY__){
      tryOpenFromDeepLink();
      return;
    }
    document.addEventListener("showroom:ready", function(){
      tryOpenFromDeepLink();
    });
  })();

  // ORDER popup
  var ORDER_PAGE_URL = "https://www.shedsni.com/OrderPage.html";
  var COGNITO_FIELDS = ["Greenhouse", "Greenhouse2", "Greenhouse3"];

  function setUiHidden(isHidden){
    var controls = document.getElementById("ghControls");
    var topFab = document.getElementById("ghTopFab");
    var back = document.getElementById("ghBackdrop");
    if(controls) controls.style.display = isHidden ? "none" : "";
    if(topFab) topFab.style.display = isHidden ? "none" : "";
    if(back) back.style.display = isHidden ? "none" : "";
  }

  function openOrderPopup(url){
    var ov = document.getElementById("cogOverlay");
    var fr = document.getElementById("orderIframe");
    if(fr) fr.src = url;
    setUiHidden(true);
    openOverlay(ov);
  }

  window.closeOrderPopup = function(){
    var ov = document.getElementById("cogOverlay");
    var fr = document.getElementById("orderIframe");
    if(fr) fr.src = "";
    closeOverlay(ov);
    setUiHidden(false);
    openOverlay(document.getElementById("selectOverlay"));
  };

  (function bindOrderBackdropClose(){
    var ov = document.getElementById("cogOverlay");
    if(!ov) return;
    ov.addEventListener("click", function(e){
      if(e.target === ov) window.closeOrderPopup();
    });
  })();

  document.addEventListener("keydown", function(e){
    if(e.key !== "Escape") return;

    var orderOv = document.getElementById("cogOverlay");
    if(orderOv && orderOv.style.display === "flex"){ window.closeOrderPopup(); return; }

    var accOverlay = document.getElementById("accOverlay");
    var selectOverlay = document.getElementById("selectOverlay");
    var noMatch = document.getElementById("noMatchOverlay");
    var dims = document.getElementById("dimsOverlay");

    if(accOverlay && accOverlay.style.display === "flex"){ window.closeAccessoriesPopup(); return; }
    if(selectOverlay && selectOverlay.style.display === "flex"){ window.closeSelectPopup(); return; }
    if(noMatch && noMatch.style.display === "flex"){ window.closeNoMatch(); return; }
    if(dims && dims.style.display === "flex"){ window.closeDims(); return; }
  });

  window.selectOrderNow = function(){
    if(!GH_SELECTED || !GH_SELECTED.choiceText) return;

    var val = String(GH_SELECTED.choiceText || "").trim();
    var entryObj = {};
    for(var i=0;i<COGNITO_FIELDS.length;i++){
      entryObj[COGNITO_FIELDS[i]] = val;
    }

    var entryParam = encodeURIComponent(JSON.stringify(entryObj));
    var url = ORDER_PAGE_URL + "?entry=" + entryParam + "&_ts=" + Date.now();

    window.closeSelectPopup();
    openOrderPopup(url);
  };

  function bindGalleryClick(){
    var g = document.getElementById("gallery");
    if(!g) return;

    g.addEventListener("click", function(e){
      var tile = e.target && e.target.closest ? e.target.closest(".icon-link.gh-item") : null;
      if(!tile) return;
      if(tile.classList.contains("is-dims")) return;

      e.preventDefault();
      e.stopPropagation();

      var choiceText = getChoiceTextFromTile(tile);
      var file = (tile.getAttribute("data-f") || "").trim();

      openSelectPopup({ choiceText: choiceText, file: file });
    }, true);
  }

  bindGalleryClick();

})();
</script>


​<!-- =========================================================
     PRICE BADGE RIBBON FOR SHOWROOM TILES (RADICAL FIX v2 STYLE)
     - Reads #ghPriceData (placed ABOVE showroom)
     - Adds a top-right price badge on each tile
     - Shimmer: ONE sweep then quiet 5s (no glitch)
========================================================= -->

<style>
/* fallback theme vars if not already on page */
:root{
  --teal-grad: linear-gradient(180deg,#1fc8b8 0%, #139b8f 45%, #0e746d 100%);
  --shadow: 0 14px 40px rgba(0,0,0,0.14);
}

/* ensure badge positions correctly inside tiles */
[data-g],[data-groupkey],[data-groupKey]{
  position:relative;
}

/* price badge */
.ghPriceBadge{
  position:absolute;
  top:10px;
  right:10px;
  z-index:80;
  pointer-events:none;

  display:inline-flex;
  align-items:center;
  justify-content:center;

  padding:8px 12px;
  border-radius:999px;

  color:#fff;
  font-family:Segoe UI,system-ui,-apple-system,Arial,sans-serif;
  font-weight:1100;
  font-size:13px;
  letter-spacing:.2px;

  /* Base teal */
  background: var(--teal-grad);

  border:2px solid rgba(255,255,255,0.22);
  box-shadow:0 16px 34px rgba(0,0,0,0.28);
  text-shadow:0 2px 10px rgba(0,0,0,0.45);

  overflow:hidden; /* ✅ contain shimmer overlay */
}

/* ✅ The shimmer overlay does the sweep (not the background) */
.ghPriceBadge::before{
  content:"";
  position:absolute;
  inset:0;
  pointer-events:none;
  z-index:0;

  /* single bright band */
  background:
    linear-gradient(
      110deg,
      transparent 35%,
      rgba(255,255,255,.65) 50%,
      transparent 65%
    );

  /* start fully off left */
  transform: translateX(-140%);
  opacity: 0; /* hidden during the quiet time */

  /* ✅ 12s cycle = 7s sweep + 5s quiet */
  animation: ghPriceOneSweepThenPause 12s linear infinite;
}

/* keep text above overlay */
.ghPriceBadge{
  position:absolute;
}
.ghPriceBadge > *{
  position:relative;
  z-index:1;
}

/* If we set textContent directly (no inner spans), ensure it stays above */
.ghPriceBadge{
  z-index:80;
}
.ghPriceBadge{
  /* text sits naturally above ::before if ::before is z-index:0 */
}

/* ✅ ONE sweep (0–7s) then quiet (7–12s) */
@keyframes ghPriceOneSweepThenPause{
  /* quiet at start */
  0%   { transform: translateX(-140%); opacity:0; }

  /* turn shimmer on immediately and begin sweep */
  1%   { opacity:1; transform: translateX(-140%); }

  /* end of sweep at 7s (7/12 = 58.33%) */
  58.33% { opacity:1; transform: translateX(140%); }

  /* instantly hide after sweep finishes */
  58.34% { opacity:0; transform: translateX(140%); }

  /* stay quiet for remaining 5s */
  100% { opacity:0; transform: translateX(140%); }
}

/* optional: slightly smaller on tiny mobiles */
@media (max-width:380px){
  .ghPriceBadge{ top:8px; right:8px; padding:7px 10px; font-size:12.5px; }
}
</style>

<script>
(function(){
  "use strict";

  // ---------------------------
  // Read price JSON
  // ---------------------------
  const dataEl = document.getElementById("ghPriceData");
  if(!dataEl){
    console.warn("[PriceRibbon] #ghPriceData not found");
    return;
  }

  let priceData = [];
  try{
    priceData = JSON.parse(dataEl.textContent || "[]");
  }catch(e){
    console.warn("[PriceRibbon] JSON parse failed", e);
    return;
  }
  if(!Array.isArray(priceData) || !priceData.length){
    console.warn("[PriceRibbon] price data empty");
    return;
  }

  function upper(s){ return String(s||"").toUpperCase(); }
  function gbp(n){
    const num = Number(n);
    if(!isFinite(num)) return "";
    return "£" + num.toLocaleString("en-GB",{minimumFractionDigits:2,maximumFractionDigits:2});
  }

  // ---------------------------
  // Model string -> canonical key
  // e.g. "ICON 6X4 Silver 3mm Glass" => "ICON_6X4_SILVER_HORT"
  // ---------------------------
  function modelToBaseKey(model){
    const s = upper(model);

    let range = "";
    if(s.startsWith("POPULAR")) range = "POPULAR";
    else if(s.startsWith("ICON")) range = "ICON";
    else if(s.startsWith("MAGNUM")) range = "MAGNUM";
    else if(s.startsWith("QUBE-SQ")) range = "QUBE-SQ";
    else if(s.startsWith("QUBE")) range = "QUBE";

    const sizeM = s.match(/\b(\d{1,2}X\d{1,2})\b/);
    const size = sizeM ? sizeM[1] : "";

    let col = "";
    if(s.includes("SILVER")) col = "SILVER";
    else if(s.includes("GREEN")) col = "GREEN";
    else if(s.includes("BLACK")) col = "BLACK";

    let glz = "";
    if(s.includes("POLY")) glz = "POLY";
    else if(s.includes("3MM") || s.includes("HORT")) glz = "HORT";
    else if(s.includes("TOUGH")) glz = "TOUGH";

    if(!range || !size || !col || !glz) return "";
    return range + "_" + size + "_" + col + "_" + glz;
  }

  // ---------------------------
  // Tile key -> canonical base key
  // e.g. "ICON_6X4_SILVER_HORT_HR01005" => "ICON_6X4_SILVER_HORT"
  // ---------------------------
  function tileToBaseKey(rawKey){
    const k = upper(rawKey).replace(/\.PNG$/,"").trim();
    const p = k.split("_");
    if(p.length < 4) return "";
    return p[0] + "_" + p[1] + "_" + p[2] + "_" + p[3];
  }

  // ---------------------------
  // Build lookup map: baseKey -> price
  // ---------------------------
  const priceMap = Object.create(null);
  for(const row of priceData){
    if(!row || !row.model) continue;
    const key = modelToBaseKey(row.model);
    if(!key) continue;
    if(priceMap[key] == null) priceMap[key] = row.price;
  }

  // ---------------------------
  // Find correct tile elements (unique keys)
  // ---------------------------
  function getTileNodes(){
    const all = Array.from(document.querySelectorAll("[data-g],[data-groupkey],[data-groupKey]"));
    return all.filter(el => !el.parentElement || !el.parentElement.closest("[data-g],[data-groupkey],[data-groupKey]"));
  }

  // ---------------------------
  // Apply badges
  // ---------------------------
  function applyBadges(){
    const tiles = getTileNodes();
    tiles.forEach(tile=>{
      if(tile.querySelector(":scope > .ghPriceBadge")) return;

      const rawKey =
        tile.getAttribute("data-g") ||
        tile.getAttribute("data-groupkey") ||
        tile.getAttribute("data-groupKey") || "";

      const baseKey = tileToBaseKey(rawKey);
      const price = priceMap[baseKey];
      if(price == null) return;

      const badge = document.createElement("div");
      badge.className = "ghPriceBadge";
      badge.textContent = gbp(price);

      tile.appendChild(badge);
    });
  }

  // initial
  applyBadges();

  // ---------------------------
  // Re-apply when showroom redraws/filters (debounced)
  // ---------------------------
  const root =
    document.querySelector("#gallery") ||
    document.querySelector(".gallery-grid") ||
    document.body;

  let debounceTimer = null;
  const obs = new MutationObserver(()=>{
    clearTimeout(debounceTimer);
    debounceTimer = setTimeout(applyBadges, 180);
  });

  obs.observe(root, { childList:true, subtree:true });

})();
</script>

CONTACT / ENQUIRE – CLICK HERE
Garden Leisure NI Ltd
2 Hogstown Road
Donaghadee
​BT21 0NL
​​Google Map (click here)
PH: 02891 240140
Mob: 07720377778
email: [email protected]

OPENING HOURS
​Monday - Saturday  10.30am - 4.30pm
​Closed Sunday

  • Home
  • Storm Shed
  • Greenhouses
  • Summer Houses
  • BBQ Huts
  • Picture Gallery
  • Contact
  • Terms and Conditions