1 2 3<!DOCTYPE html> 4<html class="no-js" lang="en"> 5 <head> 6 <title>SolidBuild® - Shopping Cart</title> 7 <link rel="dns-prefetch preconnect" href="https://cdn11.bigcommerce.com/s-9vcrg0" crossorigin><link rel="dns-prefetch preconnect" href="https://fonts.googleapis.com/" crossorigin><link rel="dns-prefetch preconnect" href="https://fonts.gstatic.com/" crossorigin> 8 <meta name="keywords" content="garden shed kits, storage shed kits, she shed, she shed kits, garden shed, storage shed, prefab sheds, finished interior sheds, solidbuildwood, solid build wood, solidbuild shed, shed builders near me, wood sheds near me, pre built sheds near me, tiny house builders near me, custom sheds illinois, backyard sheds near me, suncast corporation, shed installers near me, shed companies near me, outdoor sheds near me , quality sheds, sheds builders near me, wood storage sheds near me, storage shed near me, tiny home builders near me, shed manufacturers near me, rent to own sheds near me, shed sale near me, tool sheds near me, log home kits near me, storage shed builders, wood shed near me, cabin sheds near me, shed builders chicago , finish shed interior, shed builder near me, tuff shed, amish sheds near me, amish built sheds illinois, solidbuild sheds , solid build inc, finished shed interior, finished shed, log home builders, custom sheds, finished interior sheds, solid build shed, log cabin builders, solid build wood sheds , storage buildings, solid build sheds, solidbuild, cabin builder, solid built sheds, green structures, finished sheds, shed building company , tiny house near me, how to finish a shed interior, finished inside, shed contractors, brighton sheds for sale, solid build, solid builder, shed construction, wood shed builders, custom shed, soild build , amish sheds, natural sheds, bristhol, sheds, 20x28 cabin, shed builder, double garden shed, cabin builders, finished sheds for sale, amish built sheds, the shed, finished storage sheds, build solid, solid built, bristol shed, sheds near me, easy to assemble shed, amish storage sheds, storage building, built sheds, 20 x 16 cabin, easy assemble sheds , easy to assemble sheds, shed, natural wood sheds, sheds in brighton sheds first, best sheds, a shed, brighton garden shed, 10x10shed, easy assembly shed, brighton shed company, backyard home, solid garden, shed., finished storage building homes, solid wood shed, amish sheds built on site, brighton shed, natural wood shed, finished storage buildings, easy to assemble storage sheds , utility shed, backyard green, easy assemble shed, green home building, log builder, backyard sheds, easy to assemble garden sheds, out door sheds, buildwood, shed brighton, log home, wood cabin, osb garden storage made in china, green shed, wood shed, log house, prefab sheds, brighton sheds, solid wood storage project, backyard garden, natural shed, 13 x 10 shed , backyard structures, shed bristol, shed in backyard, 250 sq ft shed, how to build a really solid shed, back yard shed, 150 sq ft shed, shed backyard, all wood sheds, back yard sheds, outdoor sheds, optima 8, havenloft, backyard shed house , modern wood shed, shed builders, solid shed, storage shed, finishing a shed interior, sheds for the backyard, easy to assemble storage shed, she shed, wooden garden building, solid building, modern wooden shed, shed house, wood shed natural, the shed bristol, wood shed cabin, solid, tiny home , brighton storage sheds , loft haven, 12x12 cabin interior, well made sheds, buy shed, small cabin sheds, modern pool shed, tiny house, modern wood sheds, all wood cabins, kit garden sheds, log cabin kits, yard sheds , shed home, glass sheds for sale, sheds bristol, sheds modern, customized wooden garden house, 100 sq ft shed, 20 x 16 cabin plans, sheds for backyard, modern garden cabins, tuff shed, finished interiors, shed cabin interior, shed office"><meta name="description" content="Handcrafted solid wood shed kits from FSC-certified Norway Spruce. Finished interior included. Free shipping to 48 states. From $3,995."><meta name='platform' content='bigcommerce.stencil' /> 9 10 11 12 13 <!-- BEGIN Preloading first images --> 14 15 16 17 18 19 20 21 22 23 <!-- END Preloading first images --> 24 25 <link href="https://cdn11.bigcommerce.com/s-9vcrg0/product_images/favicon.png" rel="shortcut icon"> 26 <meta name="viewport" content="width=device-width, initial-scale=1 , maximum-scale=1"> 27 28
28<script> 29 document.documentElement.className = document.documentElement.className.replace('no-js', 'js'); 30 </script>
30 31 32
32<script> 33 function browserSupportsAllFeatures() { 34 return window.Promise 35 && window.fetch 36 && window.URL 37 && window.URLSearchParams 38 && window.WeakMap 39 // object-fit support 40 && ('objectFit' in document.documentElement.style); 41 } 42 43 function loadScript(src) { 44 var js = document.createElement('script'); 45 js.src = src; 46 js.onerror = function () { 47 console.error('Failed to load polyfill script ' + src); 48 }; 49 document.head.appendChild(js); 50 } 51 52 if (!browserSupportsAllFeatures()) { 53 loadScript('https://cdn11.bigcommerce.com/s-9vcrg0/stencil/6da2bff0-9dd6-013f-fe0f-4201d46ef01e/e/644ce700-943f-013f-ccec-561d5e2793e8/dist/theme-bundle.polyfills.js'); 54 } 55</script>
55 56
56<script>window.consentManagerTranslations = `{"locale":"en","locales":{"consent_manager.data_collection_warning":"en","consent_manager.accept_all_cookies":"en","consent_manager.gdpr_settings":"en","consent_manager.data_collection_preferences":"en","consent_manager.manage_data_collection_preferences":"en","consent_manager.use_data_by_cookies":"en","consent_manager.data_categories_table":"en","consent_manager.allow":"en","consent_manager.accept":"en","consent_manager.deny":"en","consent_manager.dismiss":"en","consent_manager.reject_all":"en","consent_manager.category":"en","consent_manager.purpose":"en","consent_manager.functional_category":"en","consent_manager.functional_purpose":"en","consent_manager.analytics_category":"en","consent_manager.analytics_purpose":"en","consent_manager.targeting_category":"en","consent_manager.advertising_category":"en","consent_manager.advertising_purpose":"en","consent_manager.essential_category":"en","consent_manager.esential_purpose":"en","consent_manager.yes":"en","consent_manager.no":"en","consent_manager.not_available":"en","consent_manager.cancel":"en","consent_manager.save":"en","consent_manager.back_to_preferences":"en","consent_manager.close_without_changes":"en","consent_manager.unsaved_changes":"en","consent_manager.by_using":"en","consent_manager.agree_on_data_collection":"en","consent_manager.change_preferences":"en","consent_manager.cancel_dialog_title":"en","consent_manager.privacy_policy":"en","consent_manager.allow_category_tracking":"en","consent_manager.disallow_category_tracking":"en"},"translations":{"consent_manager.data_collection_warning":"We use cookies (and other similar technologies) to collect data to improve your shopping experience.","consent_manager.accept_all_cookies":"Accept All Cookies","consent_manager.gdpr_settings":"Settings","consent_manager.data_collection_preferences":"Website Data Collection Preferences","consent_manager.manage_data_collection_preferences":"Manage Website Data Collection Preferences","consent_manager.use_data_by_cookies":" uses data collected by cookies and JavaScript libraries to improve your shopping experience.","consent_manager.data_categories_table":"The table below outlines how we use this data by category. To opt out of a category of data collection, select 'No' and save your preferences.","consent_manager.allow":"Allow","consent_manager.accept":"Accept","consent_manager.deny":"Deny","consent_manager.dismiss":"Dismiss","consent_manager.reject_all":"Reject all","consent_manager.category":"Category","consent_manager.purpose":"Purpose","consent_manager.functional_category":"Functional","consent_manager.functional_purpose":"Enables enhanced functionality, such as videos and live chat. If you do not allow these, then some or all of these functions may not work properly.","consent_manager.analytics_category":"Analytics","consent_manager.analytics_purpose":"Provide statistical information on site usage, e.g., web analytics so we can improve this website over time.","consent_manager.targeting_category":"Targeting","consent_manager.advertising_category":"Advertising","consent_manager.advertising_purpose":"Used to create profiles or personalize content to enhance your shopping experience.","consent_manager.essential_category":"Essential","consent_manager.esential_purpose":"Essential for the site and any requested services to work, but do not perform any additional or secondary function.","consent_manager.yes":"Yes","consent_manager.no":"No","consent_manager.not_available":"N/A","consent_manager.cancel":"Cancel","consent_manager.save":"Save","consent_manager.back_to_preferences":"Back to Preferences","consent_manager.close_without_changes":"You have unsaved changes to your data collection preferences. Are you sure you want to close without saving?","consent_manager.unsaved_changes":"You have unsaved changes","consent_manager.by_using":"By using our website, you're agreeing to our","consent_manager.agree_on_data_collection":"By using our website, you're agreeing to the collection of data as described in our ","consent_manager.change_preferences":"You can change your preferences at any time","consent_manager.cancel_dialog_title":"Are you sure you want to cancel?","consent_manager.privacy_policy":"Privacy Policy","consent_manager.allow_category_tracking":"Allow [CATEGORY_NAME] tracking","consent_manager.disallow_category_tracking":"Disallow [CATEGORY_NAME] tracking"}}`;</script>
56 57 58
58<script> 59 window.lazySizesConfig = window.lazySizesConfig || {}; 60 window.lazySizesConfig.loadMode = 1; 61 </script>
61 62
62<script async src="https://cdn11.bigcommerce.com/s-9vcrg0/stencil/6da2bff0-9dd6-013f-fe0f-4201d46ef01e/e/644ce700-943f-013f-ccec-561d5e2793e8/dist/theme-bundle.head_async.js"></script>
62 63 64 <link href="https://fonts.googleapis.com/css?family=Roboto+Slab:700%7CRoboto:700,500,400%7CPoppins:400,700&display=swap" rel="stylesheet"> 65 66
66<script async src="https://cdn11.bigcommerce.com/s-9vcrg0/stencil/6da2bff0-9dd6-013f-fe0f-4201d46ef01e/e/644ce700-943f-013f-ccec-561d5e2793e8/dist/theme-bundle.font.js"></script>
66 67 68 69 <link data-stencil-stylesheet href="https://cdn11.bigcommerce.com/s-9vcrg0/stencil/6da2bff0-9dd6-013f-fe0f-4201d46ef01e/e/644ce700-943f-013f-ccec-561d5e2793e8/css/theme-6bbbcde0-9dd7-013f-8457-063022e2374f.css" rel="stylesheet"> 70 71 <!-- Start Tracking Code for analytics_facebook --> 72
73<script> 74!function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod?n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0;t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window,document,'script','https://connect.facebook.net/en_US/fbevents.js'); 75 76fbq('set', 'autoConfig', 'false', '173894989827938'); 77fbq('dataProcessingOptions', ['LDU'], 0, 0); 78fbq('init', '173894989827938', {"external_id":"281f9f03-2c12-45e5-9d18-e3c0c472417b"}); 79fbq('set', 'agent', 'bigcommerce', '173894989827938'); 80 81function trackEvents() { 82 var pathName = window.location.pathname; 83 84 85 86 // Search events start -- only fire if the shopper lands on the /search.php page 87 if (pathName.indexOf('/search.php') === 0 && getUrlParameter('search_query')) { 88 fbq('trackSingle', '173894989827938', 'Search', { 89 content_type: 'product_group', 90 content_ids: [], 91 search_string: getUrlParameter('search_query') 92 }); 93 } 94 // Search events end 95 96 // Wishlist events start -- only fire if the shopper attempts to add an item to their wishlist 97 if (pathName.indexOf('/wishlist.php') === 0 && getUrlParameter('added_product_id')) { 98 fbq('trackSingle', '173894989827938', 'AddToWishlist', { 99 content_type: 'product_group', 100 content_ids: [] 101 }); 102 } 103 // Wishlist events end 104 105 // Lead events start -- only fire if the shopper subscribes to newsletter 106 if (pathName.indexOf('/subscribe.php') === 0 && getUrlParameter('result') === 'success') { 107 fbq('trackSingle', '173894989827938', 'Lead', {}); 108 } 109 // Lead events end 110 111 // Registration events start -- only fire if the shopper registers an account 112 if (pathName.indexOf('/login.php') === 0 && getUrlParameter('action') === 'account_created') { 113 fbq('trackSingle', '173894989827938', 'CompleteRegistration', {}, ""); 114 } 115 // Registration events end 116 117 118 119 function getUrlParameter(name) { 120 var cleanName = name.replace(/[\[]/, '\[').replace(/[\]]/, '\]'); 121 var regex = new RegExp('[\?&]' + cleanName + '=([^&#]*)'); 122 var results = regex.exec(window.location.search); 123 return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' ')); 124 } 125} 126 127if (window.addEventListener) { 128 window.addEventListener("load", trackEvents, false) 129} 130</script>
130 131<noscript><img height="1" width="1" style="display:none" alt="null" src="https://www.facebook.com/tr?id=173894989827938&ev=PageView&noscript=1&a=plbigcommerce1.2&eid="/></noscript> 132 133<!-- End Tracking Code for analytics_facebook --> 134 135<!-- Start Tracking Code for analytics_googleanalytics4 --> 136
137<script data-cfasync="false" src="https://cdn11.bigcommerce.com/shared/js/google_analytics4_bodl_subscribers-358423becf5d870b8b603a81de597c10f6bc7699.js" integrity="sha256-gtOfJ3Avc1pEE/hx6SKj/96cca7JvfqllWA9FTQJyfI=" crossorigin="anonymous"></script>
vendor: 1 bytes, line 137
137
138<script data-cfasync="false"> 139 (function () { 140 window.dataLayer = window.dataLayer || []; 141 142 function gtag(){ 143 dataLayer.push(arguments); 144 } 145 146 function initGA4(event) { 147 function setupGtag() { 148 function configureGtag() { 149 gtag('js', new Date()); 150 gtag('set', 'developer_id.dMjk3Nj', true); 151 gtag('config', 'G-1G0EB5XWP6'); 152 } 153 154 var script = document.createElement('script'); 155 156 script.src = 'https://www.googletagmanager.com/gtag/js?id=G-1G0EB5XWP6'; 157 script.async = true; 158 script.onload = configureGtag; 159 160 document.head.appendChild(script); 161 } 162 163 setupGtag(); 164 165 if (typeof subscribeOnBodlEvents === 'function') { 166 subscribeOnBodlEvents('G-1G0EB5XWP6', false); 167 } 168 169 window.removeEventListener(event.type, initGA4); 170 } 171 172 173 174 var eventName = document.readyState === 'complete' ? 'consentScriptsLoaded' : 'DOMContentLoaded'; 175 window.addEventListener(eventName, initGA4, false); 176 })() 177</script>
177 178 179<!-- End Tracking Code for analytics_googleanalytics4 --> 180 181<!-- Start Tracking Code for analytics_siteverification --> 182 183<meta name="google-site-verification" content="xfBNCuw-V_tuIRDDGSZ4wCoy7QQPkeAwQyQ5L0ztSeM" /> 184 185<!-- End Tracking Code for analytics_siteverification --> 186 187
188<script type="text/javascript" src="https://checkout-sdk.bigcommerce.com/v1/loader.js" defer ></script>
188 189<!-- Start of HubSpot Embed Code --> 190
190<script type="text/javascript" id="hs-script-loader" async defer src="//js.hs-scripts.com/5664453.js"></script>
190 191<!-- End of HubSpot Embed Code -->
192<script type="text/javascript"> 193var BCData = {}; 194</script>
vendor: 1 bytes, line 194
194
195<script src='https://ecommplugins-trustboxsettings.trustpilot.com/stores/9vcrg0.js?settings=1730757270798' async ></script>
195<script src='https://widget.trustpilot.com/bootstrap/v5/tp.widget.bootstrap.min.js' async ></script>
195 196
196<script type="text/javascript"> 197 const trustpilot_settings = { 198 page: "cart" === "default" ? "landing" : "cart", 199 sku: "", 200 name: "", 201 key: "Qifu2O9hexlnPWDT", 202 product_id: "", // Needed for TrustBoxPreview 203 }; 204 const createTrustBoxScript = function() { 205 const trustBoxScript = document.createElement('script'); 206 trustBoxScript.async = true; 207 trustBoxScript.src = "https://ecommplugins-scripts.trustpilot.com/v2.1/js/header_bigcommerce.min.js"; 208 document.head.appendChild(trustBoxScript); 209 }; 210 if (BCData.product_attributes && !BCData.product_attributes.base && "sku" !== 'id') { 211 addEventListener('DOMContentLoaded', () => { 212 const endpoint = "/remote/v1/product-attributes/"; 213 try { 214 stencilUtils.api.productAttributes.makeRequest(endpoint, "GET", {}, {}, function(err, res) { 215 trustpilot_settings.sku = res.data["sku"]; 216 createTrustBoxScript(); 217 }) 218 } catch { 219 fetch(endpoint).then(function(res) { 220 res.json().then(function(jsonRes) { 221 trustpilot_settings.sku = jsonRes.data["sku"]; 222 createTrustBoxScript(); 223 }); 224 }); 225 } 226 }); 227 } else { 228 createTrustBoxScript(); 229 } 230 </script>
230 231
231<script 232 async 233 src="https://na-library.klarnaservices.com/lib.js" 234 data-client-id="b7705a76-3193-5e24-9dbe-8cbf14bb0234" 235></script>
235<script> 236 gtag('event', 'page_view', { 237 'send_to': 'AW-1030350139', 238 'value': 'price', 239 'items': [{ 240 'id': 'sku', 241 'google_business_vertical': 'retail' 242 }] 243 }); 244</script>
244<script type="text/javascript"> 245 246</script>
246<!-- TrustBox script -->
247<script type="text/javascript" src="//widget.trustpilot.com/bootstrap/v5/tp.widget.bootstrap.min.js" async></script>
247 248<!-- End TrustBox script -->
248<script type="text/javascript"> 249 (function(c,l,a,r,i,t,y){ 250 c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)}; 251 t=l.createElement(r);t.async=1;t.src="https://www.clarity.ms/tag/"+i; 252 y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y); 253 })(window, document, "clarity", "script", "g9nggce6x7"); 254</script>
254<!-- TrustBox script -->
255<script type="text/javascript" src="//widget.trustpilot.com/bootstrap/v5/tp.widget.bootstrap.min.js" async></script>
255 256<!-- End TrustBox script -->
256<script src="https://analytics.ahrefs.com/analytics.js" data-key="RotXCkjllzGtOhi+c9XfDA" async></script>
vendor: 63 bytes, line 256
256<script async src="https://www.googletagmanager.com/gtag/js?id=
256AW-1030350139
vendor: 12 bytes, line 256
256"></script>
257<script> 258 window.addEventListener("load", (event) => { 259
vendor: 151 bytes, lines 259-262
259window.dataLayer = window.dataLayer || []; 260 function gtag(){dataLayer.push(arguments);} 261 gtag('js', new Date()); 262 gtag('config', '
262AW-1030350139
vendor: 8 bytes, lines 262-263
262'); 263
263}); 264</script>
264<script nonce=""> 265if(typeof fbq === 'function') { 266 fbq('trackSingle', '173894989827938', 'PageView', {}, {"eventID":"cd9d3ef4-8940-4f4c-8995-dacb3a6164be"}); 267} else if (typeof window.addEventListener === 'function') { 268 window.addEventListener("load", function() { fbq('trackSingle', '173894989827938', 'PageView', {}, {"eventID":"cd9d3ef4-8940-4f4c-8995-dacb3a6164be"}); }, false) 269} 270</script>
270 271
271<script data-cfasync="false" src="https://microapps.bigcommerce.com/bodl-events/1.9.4/index.js" integrity="sha256-Y0tDj1qsyiKBRibKllwV0ZJ1aFlGYaHHGl/oUFoXJ7Y=" nonce="" crossorigin="anonymous"></script>
271 272
272<script data-cfasync="false" nonce=""> 273 274 (function() { 275 function decodeBase64(base64) { 276 const text = atob(base64); 277 const length = text.length; 278 const bytes = new Uint8Array(length); 279 for (let i = 0; i < length; i++) { 280 bytes[i] = text.charCodeAt(i); 281 } 282 const decoder = new TextDecoder(); 283 return decoder.decode(bytes); 284 } 285 window.bodl = JSON.parse(decodeBase64("eyJzZXNzaW9uIjp7ImlkIjoiMTI0YTAyYzgtMjdmMS00MDRmLTliYWYtNTcyNGZiMTc4ZDhiIiwiZmlyc3RfdG91Y2hfdGltZXN0YW1wIjoiMjAyNi0wOS0yOVQwMjo0NToyMiIsImZpcnN0X3RvdWNoX3JlZmVycmFsX3VybCI6IiIsImZpcnN0X3RvdWNoX3JlcXVlc3RfdXJsIjoiaHR0cHM6Ly9zb2xpZGJ1aWxkd29vZC5jb20vY2FydC5waHAifSwic2hvcHBlciI6eyJ2aXNpdG9yX2lkIjoiIiwiY3VzdG9tZXJfaWQiOm51bGwsImVtYWlsIjpudWxsLCJmaXJzdF9uYW1lIjpudWxsLCJsYXN0X25hbWUiOm51bGx9LCJkYXRhX2NvbnNlbnQiOnsiZnVuY3Rpb25hbCI6dHJ1ZSwiYW5hbHl0aWNzIjp0cnVlLCJhZHZlcnRpc2luZyI6dHJ1ZX0sImV2ZW50cyI6W3siYm9kbF92MV9jYXJ0X3ZpZXdlZCI6eyJldmVudF9pZCI6IjhiNzRmMDdhLWNlZmEtNDMzOC04MWQ1LTZlYWRhNDE1MGViOCIsImNoYW5uZWxfaWQiOjEsImN1cnJlbmN5IjpudWxsLCJjYXJ0X3ZhbHVlIjowLjAsImxpbmVfaXRlbXMiOltdfX1dfQ==")); 286 })() 287 288 </script>
288 289
290<script nonce=""> 291(function () { 292 var xmlHttp = new XMLHttpRequest(); 293 294 xmlHttp.open('POST', 'https://bes.gcp.data.bigcommerce.com/nobot'); 295 xmlHttp.setRequestHeader('Content-Type', 'application/json'); 296 xmlHttp.send('{"store_id":"632533","timezone_offset":"-5.0","timestamp":"2026-09-29T02:45:22.39891900Z","visit_id":"7ac4539a-d46d-44d7-b322-9efcdde09466","channel_id":1}'); 297})(); 298</script>
298 299 300 </head> 301 <body class="cart-page cosmetics gridview"> 302 <svg data-src="https://cdn11.bigcommerce.com/s-9vcrg0/stencil/6da2bff0-9dd6-013f-fe0f-4201d46ef01e/e/644ce700-943f-013f-ccec-561d5e2793e8/img/icon-sprite.svg" class="icons-svg-sprite"></svg> 303 304 305 306 307<div class="announce">Free shipping to the lower 48 states — no promo code needed</div> 308 309<header class="site-header"> 310 <div class="site-header__inner"> 311 <div class="brand"> 312 <a href="https://solidbuildwood.com/" class="header-logo__link" data-header-logo-link> 313 <div class="header-logo-image-container"> 314 <img class="header-logo-image" 315 src="https://cdn11.bigcommerce.com/s-9vcrg0/images/stencil/145x100/solid-build-logo-web_1610481696__70483.original.png" 316 srcset="https://cdn11.bigcommerce.com/s-9vcrg0/images/stencil/250x100/solid-build-logo-web_1610481696__70483.original.png" 317 alt="SolidBuild®" 318 title="SolidBuild®"> 319 </div> 320</a> 321 </div> 322 323 <nav class="header-nav" aria-label="Primary"> 324 <div class="nav-item"> 325 <a href="/all-shed-kits/" aria-haspopup="true">Shop Sheds <span class="main-nav__chev">▼</span></a> 326 <div class="nav-panel nav-panel--mega" role="menu" aria-label="Shop Sheds"> 327 <div class="mega__col"> 328 <span class="mega__head">By Use</span> 329 <a href="/wood-she-shed-kit/">She Shed</a> 330 <a href="/home-office-shed/">Home Office Shed</a> 331 <a href="/art-studio-shed/">Art Studio Shed</a> 332 <a href="/wooden-playhouse-shed/">Playhouse Shed</a> 333 <a href="/guest-bedroom-shed">Guest Bedroom Shed</a> 334 <a href="/pool-house-shed/">Pool House</a> 335 <a href="/storage-shed-kits/">Storage Shed</a> 336 <a href="/man-cave-workshop-studio-shed/">Man Cave & Workshop Shed</a> 337 </div> 338 <div class="mega__col"> 339 <a class="mega__head" href="/choose-your-shed-design/">By Style</a> 340 <a href="/cottage-sheds/">Cottage Sheds</a> 341 <a href="/classic-sheds/">Classic Sheds</a> 342 <a href="/modern-sheds/">Modern Sheds</a> 343 <a href="/all-shed-kits/">Browse All Sheds</a> 344 <a href="/shed-accessories/">Accessories</a> 345 </div> 346 <div class="mega__col"> 347 <a class="mega__head" href="/all-shed-sizes/">By Size</a> 348 <a href="/shed-area-50-sq-ft-100-sq-ft/">50–100 sq ft</a> 349 <a href="/shed-area-101-sq-ft-120-sq-ft/">101–120 sq ft</a> 350 <a href="/shed-area-121-sq-ft-220-sq-ft/">121–220 sq ft</a> 351 <a href="/all-shed-sizes/">All Sizes</a> 352 </div> 353 </div> 354 </div> 355 356 <a href="/sheds-on-sale/" class="header-nav__sale">On Sale</a> 357 358 <div class="nav-item"> 359 <a href="/shed-kit-tips-videos/" aria-haspopup="true">Resources <span class="main-nav__chev">▼</span></a> 360 <div class="nav-panel" role="menu" aria-label="Resources"> 361 <a href="/content/shed-studio/index.html?src=header">Shed Studio</a> 362 <a href="/shed-kit-faq/">Detailed FAQ</a> 363 <a href="/how-to-build-a-shed-foundation/">Foundation Guide</a> 364 <a href="/content/tools/foundation-calculator.html">Foundation Calculator <span class="nav-beta">Beta</span></a> 365 <a href="/garden-shed-kit-assembly-video-library/">Assembly Video Library</a> 366 <a href="/can-you-insulate-your-garden-shed-kit/">Shed Insulation Guide</a> 367 <a href="/how-to-run-electrical-installation-in-your-wooden-shed/">Electrical Installation</a> 368 <a href="/roofing-options-for-gabled-flat-low-slope-sheds/">Roofing Options</a> 369 <a href="/how-to-protect-your-shed-from-termites/">Termite Protection</a> 370 <a href="/paint-and-stain-guide/">
370Paint and Stain Guide</a> 371 <a href="/shed-look-catalog-stain-paint-roofing-ideas/">Shed Look Ideas</a> 372 <a href="/free-shed-shipping/">Shipping & Delivery</a> 373 <a href="/solidbuild-shed-project-cost-calculator/">Ballpark Whole-Project Estimate</a> 374 <a href="/schedule-an-in-depth-phone-consultation/">Book an Expert Consult</a> 375 </div> 376 </div> 377 378 <div class="nav-item"> 379 <a href="/shed-kit-gallery/" aria-haspopup="true">Gallery & Reviews <span class="main-nav__chev">▼</span></a> 380 <div class="nav-panel" role="menu" aria-label="Gallery and Reviews"> 381 <a href="/shed-kit-gallery/">Photo Gallery</a> 382 <a href="/customer-testimonials/">Customer Video Stories</a> 383 <a href="/customer-testimonials/">Written Reviews</a> 384 </div> 385 </div> 386 387 <a href="/contact-us/">Contact</a> 388 </nav> 389 390 <div class="header-icons"> 391 <a href="https://solidbuildwood.com/search.php" class="sb-search-toggle" id="sbSearchToggle" aria-label="Search"> 392 <svg viewBox="0 0 24 24" aria-hidden="true"><circle cx="11" cy="11" r="7"/><line x1="21" y1="21" x2="16.5" y2="16.5"/></svg> 393 </a> 394 <a href="https://solidbuildwood.com/account.php" aria-label="Account"> 395 <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></svg> 396 </a> 397 <span id="compare-link" class="header-icons__compare" style="display:none"> 398 <a id="compareurl" href="https://solidbuildwood.com/compare" title="Compare">Compare <span class="countPill countPill--positive" id="compare-item"></span></a> 399 </span> 400 <span hidden><span id="compare-link-nav" style="display:none"><a id="compareurl-nav" href="https://solidbuildwood.com/compare">Compare <span id="compare-item-nav"></span></a></span></span> 401 <a href="https://solidbuildwood.com/cart.php" class="header-icons__cart" aria-label="Cart"> 402 <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M6 2 3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4zM3 6h18M16 10a4 4 0 0 1-8 0"/></svg> 403 <span class="countPill cart-quantity"></span> 404 </a> 405 <button type="button" class="nav-burger" id="sbBurger" aria-controls="sbDrawer" aria-expanded="false" aria-label="Open menu"> 406 <svg viewBox="0 0 24 24" aria-hidden="true"><line x1="3" y1="6" x2="21" y2="6"/><line x1="3" y1="12" x2="21" y2="12"/><line x1="3" y1="18" x2="21" y2="18"/></svg> 407 <span>Menu</span> 408 </button> 409 </div> 410 </div> 411 <div class="sb-search-panel" id="sbSearchPanel" hidden> 412 <div class="sb-search-panel__inner"> 413 <form class="sb-search" role="search" action="https://solidbuildwood.com/search.php" method="get"> 414 <label class="sb-search__label" for="sbSearchInput">Search the store</label> 415 <input id="sbSearchInput" type="search" name="search_query" placeholder="Search sheds and guides" autocomplete="off"> 416 <button type="submit" class="btn btn--primary sb-search__submit">Search</button> 417 </form> 418 </div> 419 </div> 420</header> 421 422<div class="sb-drawer" id="sbDrawer" hidden> 423 <div class="sb-drawer__backdrop"></div> 424 <div class="sb-drawer__panel" role="dialog" aria-modal="true" aria-label="Menu"> 425 <div class="sb-drawer__head"> 426 <span class="sb-drawer__title">Menu</span> 427 <button type="button" class="sb-drawer__close" aria-label="Close menu"> 428 <svg viewBox="0 0 24 24" aria-hidden="true"><line x1="5" y1="5" x2="19" y2="19"/><line x1="19" y1="5" x2="5" y2="19"/></svg> 429 </button> 430 </div> 431 <form class="sb-search sb-drawer__search" role="search" action="https://solidbuildwood.com/search.php" method="get"> 432 <label class="sb-search__label" for="sbDrawerSearchInput">Search the store</label> 433 <input id="sbDrawerSearchInput" type="search" name="search_query" placeholder="Search sheds and guides" autocomplete="off"> 434 <button type="submit" class="btn btn--primary sb-search__submit">Search</button> 435 </form> 436 <nav class="sb-drawer__nav" aria-label="Mobile"></nav> 437 </div> 438</div> 439 440<div class="util-strip"> 441 <div class="util-strip__inner"> 442 <div class="util-strip__tp util-strip__tp--wide trustpilot-widget" data-locale="en-US" data-template-id="5419b6ffb0d04a076446a9af" data-businessunit-id="5e54b98565fc2a000124808d" data-style-height="24px" data-style-width="440px" data-theme="light" data-style-alignment="left"> 443 <a href="https://www.trustpilot.com/review/solidbuildwood.com" target="_blank" rel="noopener">Trustpilot</a> 444 </div> 445 <div class="util-strip__tp util-strip__tp--narrow trustpilot-widget" data-locale="en-US" data-template-id="5419b6ffb0d04a076446a9af" data-businessunit-id="5e54b98565fc2a000124808d" data-style-height="52px" data-style-width="100%" data-theme="light" data-style-alignment="center"> 446 <a href="https://www.trustpilot.com/review/solidbuildwood.com" target="_blank" rel="noopener">Trustpilot</a> 447 </div> 448 <div class="util-strip__right"> 449 <a href="tel:+18005902508" aria-label="Call or text us at 1-800-590-2508"> 450 <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"/></svg> 451 1-800-590-2508 452 </a> 453 <a href="/contact-us/" class="util-chat" aria-label="Open live chat" 454 onclick="var h = window.HubSpotConversations, ok = false; try { ok = !!(h && h.widget && h.widget.status().loaded); } catch (e) {} if (ok) { h.widget.open(); return false; }"> 455 <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/></svg>
456 <span>Live chat</span> 457 </a> 458 </div> 459 </div> 460</div> 461<div data-content-region="header_bottom--global"></div> 462<div data-content-region="header_bottom"></div> 463 <main class="body cart-page" id="main-content" role="main" data-currency-code="USD"> 464 465 <section class="header-section "> 466 <div class="header-content-box"> 467 <div class="container"> 468 <nav aria-label="Breadcrumb"> 469 <ol class="breadcrumbs"> 470 <li class="breadcrumb "> 471 <a class="breadcrumb-label" 472 href="https://solidbuildwood.com/" 473 474 > 475 <span>Home</span> 476 </a> 477 </li> 478 <li class="breadcrumb is-active"> 479 <a class="breadcrumb-label" 480 href="/cart.php" 481 aria-current="page" 482 > 483 <span>Your Cart</span> 484 </a> 485 </li> 486 </ol> 487</nav> 488
489<script type="application/ld+json"> 490{ 491 "@context": "https://schema.org", 492 "@type": "BreadcrumbList", 493 "itemListElement": 494 [ 495 { 496 "@type": "ListItem", 497 "position": 1, 498 "item": { 499 "@id": "https:\u002f\u002fsolidbuildwood.com\u002f", 500 "name": "Home" 501 } 502 }, 503 { 504 "@type": "ListItem", 505 "position": 2, 506 "item": { 507 "@id": "\u002fcart.php", 508 "name": "Your Cart" 509 } 510 } 511 ] 512} 513</script>
513 514 <div class="brand-head"> 515 <h1 class="page-heading">Your Cart</h1> 516 </div> 517 <p class="cart-label" data-cart-page-title> 518 0 items 519</p> 520 </div> 521 </div> 522</section> 523<div data-cart-status> 524 </div> 525 526 527 <div class="container"> 528 <div class="page"> 529 <div class="page-content" data-cart> 530 <h3 class="cart-empty" tabindex="0">Your cart is empty</h3> 531 </div> 532</div> 533 534 </div> 535 536 <div id="modal" class="modal" data-reveal data-options='{"animation_speed": 0}' data-prevent-quick-search-close> 537 <button class="modal-close" 538 type="button" 539 title="Close" 540 541> 542 <span class="aria-description--hidden">Close</span> 543 <span aria-hidden="true">×</span> 544</button> 545 <div class="modal-content"></div> 546 <div class="loadingOverlay"></div> 547</div> 548 <div id="alert-modal" class="modal modal--alert modal--small" data-reveal data-options='{"animation_speed": 0}' data-prevent-quick-search-close> 549 <div class="alert-icon error-icon"> 550 <span class="icon-content"> 551 <span class="line line-left"></span> 552 <span class="line line-right"></span> 553 </span> 554 </div> 555 556 <div class="alert-icon warning-icon"> 557 <div class="icon-content">!</div> 558 </div> 559 560 <div class="modal-content"></div> 561 562 <div class="button-container"> 563 <button type="button" class="confirm button" data-reveal-close data-options='{"animation_speed": 0}'>OK</button> 564 <button type="button" class="cancel button" data-reveal-close data-options='{"animation_speed": 0}'>Cancel</button> 565 </div> 566</div> 567</main> 568 <div data-content-region="footer_above_footer--global"></div> 569<footer class="site-footer" data-build="v7-2026-09-28c"> 570 <div class="container"> 571 <div class="foot__top"> 572 <div class="foot__brand"> 573 <a href="https://solidbuildwood.com/" class="brand-text">SolidBuild <sup>®</sup></a> 574 <p>Solid wood sheds, cabins, and backyard buildings. Designed in Lithuania, built for the long haul. Serving the US since 2009.</p> 575 <div class="foot__tp trustpilot-widget" data-locale="en-US" data-template-id="5419b637fa0340045cd0c936" data-businessunit-id="5e54b98565fc2a000124808d" data-style-height="24px" data-style-width="100%" data-theme="dark" data-style-alignment="left"> 576 <a href="https://www.trustpilot.com/review/solidbuildwood.com" target="_blank" rel="noopener">Trustpilot</a> 577 </div> 578 </div> 579 <div class="foot__col"> 580 <h4>Shop</h4> 581 <ul> 582 <li><a href="/cottage-sheds/">Cottage sheds</a></li> 583 <li><a href="/classic-sheds/">Classic sheds</a></li> 584 <li><a href="/modern-sheds/">Modern sheds</a></li> 585 <li><a href="/sheds-on-sale/">On sale</a></li> 586 <li><a href="/shed-accessories/">Accessories</a></li> 587 </ul> 588 </div> 589 <div class="foot__col"> 590 <h4>Why us</h4> 591 <ul> 592 <li><a href="/wooden-finished-interior-shed-kits/">Finished interior</a></li> 593 <li><a href="/easy-to-assemble-shed-kits/">Easy to assemble</a></li> 594 <li><a href="/free-shed-shipping/">Free shipping</a></li> 595 <li><a href="/what-are-the-benefits-of-wood/">Solid wood, no MDF</a></li> 596 </ul> 597 </div> 598 <div class="foot__col"> 599 <h4>Help</h4> 600 <ul> 601 <li><a href="/contact-us/">Contact us</a></li> 602 <li><a href="/roofing-options-for-gabled-flat-low-slope-sheds/">Roofing options</a></li> 603 <li><a href="/paint-and-stain-guide/">
603Paint and Stain Guide</a></li> 604 <li><a href="/free-shed-shipping/">Shipping & delivery</a></li> 605 <li><a href="/solid-build-refund-policy/">Returns & refunds</a></li> 606 <li><a href="/shed-kit-faq/">FAQ</a></li> 607 </ul> 608 </div> 609 <div class="foot__col"> 610 <h4>Stories</h4> 611 <ul> 612 <li><a href="/customer-testimonials/">Customer reviews</a></li> 613 <li><a href="/shed-kit-gallery/">Gallery</a></li> 614 <li><a href="/#trees">Trees-for-a-cause</a></li> 615 <li><a href="/shed-building-advice/">Journal</a></li> 616 </ul> 617 </div> 618 </div> 619 <div class="foot__bottom"> 620 <div>© 2026 SolidBuild · solidbuildwood.com</div> 621 <div class="foot__legal"> 622 <a href="/solid-build-privacy-policy">Privacy</a> 623 <a href="/terms-of-service/">Terms</a> 624 <a href="/accessibility/">Accessibility</a> 625 </div> 626 </div> 627 </div> 628</footer> 629<button class="to-top" id="toTop" type="button" aria-label="Back to top" hidden> 630 <svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"> 631 <polyline points="6 14 12 8 18 14"/> 632 </svg> 633 <span>Top</span> 634</button>
635<script> 636(function () { 637 var btn = document.getElementById('toTop'); 638 if (!btn) return; 639 var shown = null; 640 function sync() { 641 var y = window.pageYOffset || document.documentElement.scrollTop || 0; 642 var want = y > 300; 643 if (want === shown) return; 644 shown = want; 645 if (want) { 646 btn.hidden = false; 647 requestAnimationFrame(function () { btn.classList.add('is-in'); }); 648 } else { 649 btn.classList.remove('is-in'); 650 setTimeout(function () { if (!shown) btn.hidden = true; }, 240); 651 } 652 } 653 window.addEventListener('scroll', sync, { passive: true }); 654 btn.addEventListener('click', function () { 655 var rm = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches; 656 window.scrollTo({ top: 0, behavior: rm ? 'auto' : 'smooth' }); 657 }); 658 sync(); 659})(); 660</script>
vendor: 1 bytes, line 660
660
661<script> 662/* Phone/tablet menu (<=1100px), 2026-09-10. Builds #sbDrawer from the header's 663 own .header-nav on first open (one IA, no duplicate markup), then hides the 664 horizontal strip by flagging .site-header.has-drawer. Groups are accordions; 665 the phone + live-chat links come from the utility strip. Escape, the X and 666 the backdrop close it; body scroll is locked while open. */ 667(function () { 668 var hdr = document.querySelector('.site-header'); 669 var nav = hdr && hdr.querySelector('.header-nav'); 670 var burger = document.getElementById('sbBurger'); 671 var drawer = document.getElementById('sbDrawer'); 672 if (!hdr || !nav || !burger || !drawer) return; 673 var host = drawer.querySelector('.sb-drawer__nav'); 674 var closeBtn = drawer.querySelector('.sb-drawer__close'); 675 var built = false; 676 hdr.classList.add('has-drawer'); 677 678 function label(a) { return a.textContent.replace('\u25BC', '').replace(/\s+/g, ' ').trim(); } 679 680 function build() { 681 if (built) return; built = true; 682 Array.prototype.forEach.call(nav.children, function (ch) { 683 if (ch.classList.contains('nav-item')) { 684 var a = ch.firstElementChild, p = ch.querySelector('.nav-panel'); 685 if (!a || !p) return; 686 var g = document.createElement('div'); g.className = 'sb-drawer__group'; 687 var t = document.createElement('button'); t.type = 'button'; t.className = 'sb-drawer__toggle'; 688 t.setAttribute('aria-expanded', 'false'); t.textContent = label(a); 689 var list = document.createElement('div'); list.className = 'sb-drawer__list'; 690 var clone = p.cloneNode(true); 691 while (clone.firstChild) list.appendChild(clone.firstChild); 692 // the top-level link's own target, unless the panel already lists it 693 var href = a.getAttribute('href'); 694 if (href && !list.querySelector('a[href="' + href + '"]')) { 695 var all = document.createElement('a'); all.href = href; all.textContent = 'All ' + label(a); 696 list.insertBefore(all, list.firstChild); 697 } 698 t.addEventListener('click', function () { 699 var open = g.classList.toggle('is-open'); 700 t.setAttribute('aria-expanded', open ? 'true' : 'false'); 701 }); 702 g.appendChild(t); g.appendChild(list); host.appendChild(g); 703 } else if (ch.tagName === 'A') { 704 var l = ch.cloneNode(true); 705 l.className = 'sb-drawer__link' + (ch.classList.contains('header-nav__sale') ? ' sb-drawer__link--sale' : ''); 706 host.appendChild(l); 707 } 708 }); 709 var util = document.querySelector('.util-strip__right'); 710 if (util) { 711 var u = document.createElement('div'); u.className = 'sb-drawer__util'; 712 Array.prototype.forEach.call(util.querySelectorAll('a'), function (a) { 713 var c = a.cloneNode(true); c.removeAttribute('class'); 714 var span = c.querySelector('span'); if (span) span.removeAttribute('style'); 715 u.appendChild(c); 716 }); 717 host.appendChild(u); 718 } 719 } 720 function isOpen() { return drawer.classList.contains('is-open'); } 721 function open() { 722 build(); 723 drawer.hidden = false; 724 requestAnimationFrame(function () { drawer.classList.add('is-open'); }); 725 document.body.classList.add('sb-drawer-open'); 726 burger.setAttribute('aria-expanded', 'true'); 727 if (closeBtn) closeBtn.focus(); 728 } 729 function close(refocus) { 730 if (!isOpen()) return; 731 drawer.classList.remove('is-open'); 732 document.body.classList.remove('sb-drawer-open'); 733 burger.setAttribute('aria-expanded', 'false'); 734 setTimeout(function () { if (!isOpen()) drawer.hidden = true; }, 260); 735 if (refocus !== false) burger.focus(); 736 } 737 burger.addEventListener('click', function () { isOpen() ? close() : open(); }); 738 drawer.addEventListener('click', function (e) { 739 var t = e.target; 740 while (t && t !== drawer) { 741 if (t.classList && (t.classList.contains('sb-drawer__close') || t.classList.contains('sb-drawer__backdrop'))) { close(); return; } 742 t = t.parentNode; 743 } 744 }); 745 document.addEventListener('keydown', function (e) { if (e.key === 'Escape') close(); }); 746 var wide = window.matchMedia('(min-width: 1101px)'); 747 (wide.addEventListener ? wide.addEventListener('change', function (m) { if (m.matches) close(false); }) 748 : wide.addListener(function (m) { if (m.matches) close(false); })); 749})(); 750</script>
750 751
752<script> 753/* Project cost calculator hooks. The calculator's engine is inline page 754 content (top-level `sheds` / `accessories` + selectShed()) that paints at 755 parse time, before this script runs; nothing to do on any other page. 756 (1) Deep link (2026-09-11): the product pages link 757 /solidbuild-shed-project-cost-calculator/#shed=<model>; pre-select it. 758 (2) Live prices (SB-01B, 2026-09-13): the page body's price table is 759 static and goes stale. Fetch the catalog prices through the Storefront 760 GraphQL API (same origin, bearer = window.SB_SF_TOKEN above), patch the 761 engine's own objects and re-render. Any failure â no token, no fetch, 762 network, non-200, 4 s timeout â keeps the static figures silently. The 763 static numbers are never hidden while the request runs. 764 (3) Keyboard shim (SB-26, 2026-09-13): the cards and progress steps are 765 bare DIVs with onclick. Decorate them as buttons (role, tabindex, 766 aria-pressed / aria-current), route Enter and Space to click(), and 767 restore focus after the engine replaces a grid's innerHTML. Niche's 768 [tabindex]:focus-visible ring paints on them by itself. */ 769(function () { 770 if (typeof sheds === 'undefined' || typeof selectShed !== 'function' || !sheds.length) return; 771 772 /* (1) deep link */ 773 function pick() { 774 var m = /[#&]shed=([a-z]+)/.exec(window.location.hash || ''); 775 if (!m) return; 776 for (var i = 0; i < sheds.length; i++) { 777 if (sheds[i].id === m[1]) { selectShed(sheds[i]); return; } 778 } 779 } 780 pick(); 781 window.addEventListener('hashchange', pick); // back/forward between deep links re-runs it 782 783 /* (2) live prices */ 784 var SHED_IDS = { 81: 'shiba', 83: 'gardener', 84: 'optima', 77: 'myrtle', 76: 'whales', 78: 'aspen', 80: 'bristhol', 785 93: 'dakota', 85: 'moderna', 86: 'solana', 123: 'california', 127: 'astoria', 132: 'washington' }; 786 var ACC_IDS = { 90: 'dbl_window', 126: 'tall_window', 89: 'veranda', 92: 'flower_box', 91: 'shutters', 130: 'mini_split', 131: 'line_cover' }; 787 var PRODUCT_IDS = [81, 83, 84, 77, 76, 78, 80, 93, 85, 86, 123, 127, 132, 90, 126, 89, 92, 91, 130, 131]; 788 function activeCat() { 789 var b = document.querySelector('.cat-tab.active'); 790 return (b && b.getAttribute('data-cat')) || 'all'; 791 } 792 function rerender() { 793 try { 794 if (typeof renderSheds === 'function') renderSheds(activeCat()); 795 if (typeof renderAccessories === 'function') renderAccessories(); 796 if (typeof selectedShed !== 'undefined' && selectedShed) { 797 if (typeof renderFloorOptions === 'function') renderFloorOptions(); 798 if (typeof updateAll === 'function') updateAll(); 799 } 800 } catch (e) {} 801 } 802 function patchPrices() { 803 var token = window.SB_SF_TOKEN; 804 if (!token || typeof fetch !== 'function' || typeof AbortController !== 'function') return; 805 var ac = new AbortController(); 806 var timer = setTimeout(function () { ac.abort(); }, 4000); 807 fetch('/graphql', { 808 method: 'POST', 809 headers: { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json' }, 810 body: JSON.stringify({ 811 query: 'query($ids:[Int!]){site{products(entityIds:$ids,first:25){edges{node{entityId prices{price{value} basePrice{value} salePrice{value}}}}}}}', 812 variables: { ids: PRODUCT_IDS } 813 }), 814 signal: ac.signal 815 }).then(function (r) { 816 if (!r.ok) throw new Error('status ' + r.status); 817 return r.json(); 818 }).then(function (j) { 819 var edges = j && j.data && j.data.site && j.data.site.products && j.data.site.products.edges; 820 if (!edges || !edges.length) return; 821 var hits = 0;
822 edges.forEach(function (e) { 823 var n = e && e.node; 824 if (!n || !n.prices || !n.prices.price) return; 825 var v = Number(n.prices.price.value); 826 if (!(v > 0)) return; 827 var id = SHED_IDS[n.entityId], list = sheds; 828 if (!id && typeof accessories !== 'undefined') { id = ACC_IDS[n.entityId]; list = accessories; } 829 if (!id || !list) return; 830 for (var i = 0; i < list.length; i++) { 831 if (list[i].id === id) { list[i].price = Math.round(v); hits++; break; } 832 } 833 }); 834 if (hits) rerender(); 835 }).catch(function () {}).then(function () { clearTimeout(timer); }); 836 } 837 patchPrices(); 838 839 /* (3) keyboard shim */ 840 var CARD = '.shed-card, .option-card, .toggle-card'; 841 var GRIDS = ['shedGrid', 'foundationGrid', 'floorContent', 'roofingGrid', 'roofingExtras', 'stainContent', 'accGrid', 'insulContent']; 842 var pending = null, pendingTimer = 0; 843 function decorate() { 844 Array.prototype.forEach.call(document.querySelectorAll(CARD), function (el) { 845 var off = el.style.pointerEvents === 'none'; 846 if (!el.hasAttribute('role')) el.setAttribute('role', 'button'); 847 el.setAttribute('tabindex', off ? '-1' : '0'); 848 if (off) el.setAttribute('aria-disabled', 'true'); else el.removeAttribute('aria-disabled'); 849 el.setAttribute('aria-pressed', el.classList.contains('selected') ? 'true' : 'false'); 850 }); 851 Array.prototype.forEach.call(document.querySelectorAll('.progress-step'), function (el) { 852 if (!el.hasAttribute('role')) el.setAttribute('role', 'button'); 853 if (!el.hasAttribute('tabindex')) el.setAttribute('tabindex', '0'); 854 if (el.classList.contains('active')) el.setAttribute('aria-current', 'step'); else el.removeAttribute('aria-current'); 855 }); 856 } 857 function restoreFocus(records) { 858 if (!pending) return; 859 var grid = document.getElementById(pending.grid); 860 if (!grid) { pending = null; return; } 861 var touched = false; 862 for (var i = 0; i < records.length; i++) { 863 if (records[i].target === grid || grid.contains(records[i].target)) { touched = true; break; } 864 } 865 if (!touched) return; // another grid re-rendered first; keep waiting 866 var cards = grid.querySelectorAll(CARD); 867 var t = cards[pending.index] || cards[cards.length - 1]; 868 pending = null; clearTimeout(pendingTimer); 869 if (t) { try { t.focus({ preventScroll: true }); } catch (e) { t.focus(); } } 870 } 871 var mo = new MutationObserver(function (records) { decorate(); restoreFocus(records); }); 872 GRIDS.forEach(function (id) { 873 var g = document.getElementById(id); 874 if (g) mo.observe(g, { childList: true, subtree: true }); 875 }); 876 var pw = document.getElementById('progressWrap'); 877 if (pw) mo.observe(pw, { attributes: true, attributeFilter: ['class'], subtree: true }); // .active moves by class, no re-render 878 document.addEventListener('keydown', function (e) { 879 if (e.key !== 'Enter' && e.key !== ' ' && e.key !== 'Spacebar') return; 880 if (e.altKey || e.ctrlKey || e.metaKey) return; 881 var t = e.target; 882 if (!t || !t.closest) return; 883 var el = t.closest(CARD + ', .progress-step'); 884 if (!el || el.getAttribute('aria-disabled') === 'true') return; 885 e.preventDefault(); 886 var grid = el.closest('#' + GRIDS.join(', #')); 887 if (grid) { 888 pending = { grid: grid.id, index: Array.prototype.indexOf.call(grid.querySelectorAll(CARD), el) }; 889 clearTimeout(pendingTimer); 890 pendingTimer = setTimeout(function () { pending = null; }, 600); // the click re-rendered nothing 891 } 892 el.click(); 893 }); 894 decorate(); 895 var total = document.getElementById('stickyTotal'); 896 if (total && !total.hasAttribute('aria-live')) total.setAttribute('aria-live', 'polite'); 897})(); 898</script>
vendor: 1 bytes, line 898
898
899<script> 900/* The search page (SB-30 shim 2026-09-13; D17 rework 2026-09-17). Niche's 901 pages/search.html is a vendor template, so everything here is runtime: 902 (1) a plain search form under the heading on EVERY search page â prefilled 903 with the current query, focused only when there is no query (that page 904 otherwise shows two empty tabs and a collapsed "advanced search" and 905 no field at all). Same .sb-search look as the header panel. 906 (2) tabs that count 0 are hidden; the collapsible toggle's aria-label is 907 kept in step with its visible text (Niche's collapsible.js copies the 908 hidden "Hide Search Form" span). 909 (3) Niche's products-per-page <select> renders its first option twice (a 910 malformed closing tag in the vendor partial): duplicates removed, and 911 the select shows the ?limit= the page was loaded with (Niche syncs it 912 on category pages only). 913 (4) content results: excerpts that are raw JSON-LD (pages whose body opens 914 with a schema block) are dropped, the "(Page)" type gets a span to 915 style; a "Did you mean" line is hidden while the search HAS results. */ 916(function () { 917 if (!document.body || !document.body.classList.contains('search-page')) return; 918 var each = function (list, fn) { Array.prototype.forEach.call(list, fn); }; 919 var query = ''; 920 try { query = (new URLSearchParams(window.location.search).get('search_query') || '').replace(/\s+/g, ' ').trim(); } catch (e) {} 921 922 /* (2) toggle label */ 923 var toggle = document.querySelector('[data-collapsible="advanced-search-content"]'); 924 function syncLabel() { 925 if (!toggle) return; 926 var spans = toggle.querySelectorAll('.toggleLink-text'), text = ''; 927 for (var i = 0; i < spans.length; i++) { 928 if (window.getComputedStyle(spans[i]).display !== 'none') { text = spans[i].textContent.replace(/\s+/g, ' ').trim(); break; } 929 } 930 if (text && toggle.getAttribute('aria-label') !== text) toggle.setAttribute('aria-label', text); 931 } 932 if (toggle) { 933 syncLabel(); 934 toggle.addEventListener('click', function () { setTimeout(syncLabel, 0); }); 935 window.addEventListener('load', function () { setTimeout(syncLabel, 100); }); 936 new MutationObserver(syncLabel).observe(toggle, { attributes: true, attributeFilter: ['aria-label', 'aria-expanded', 'class'] }); 937 } 938 939 /* (3) + (4): repairs to vendor markup. Niche swaps tabs, sorts and pages by 940 AJAX (history.pushState + re-rendered listing / content results), so the 941 repairs are one idempotent pass, re-run whenever <main> changes. */ 942 function tidy() { 943 /* (3) the per-page select */ 944 var limit = ''; 945 try { limit = new URLSearchParams(window.location.search).get('limit') || ''; } catch (e) {} 946 each(document.querySelectorAll('select[name="limit"]'), function (sel) { 947 var seen = {}; 948 each(Array.prototype.slice.call(sel.options), function (o) { 949 if (seen[o.value]) { sel.removeChild(o); return; } 950 seen[o.value] = true; 951 }); 952 if (limit && seen[limit] && sel.value !== limit) sel.value = limit; 953 }); 954 /* (3b) a card whose "Was" equals its "MSRP" prints the figure once */ 955 each(document.querySelectorAll('.card, .listItem'), function (card) { 956 var rrp = card.querySelector('.price--rrp'), was = card.querySelector('.price--non-sale'); 957 if (!rrp || !was) return; 958 var a = rrp.textContent.replace(/\s+/g, ''), b = was.textContent.replace(/\s+/g, ''); 959 var box = was.closest ? was.closest('.price-section') : null; 960 if (a && a === b && box && box.style.display !== 'none') box.style.display = 'none'; 961 }); 962 /* (4) content results + the suggestion line */ 963 each(document.querySelectorAll('#search-results-content > ul > p'), function (p) { 964 if (/^\s*\{\s*"@context"/.test(p.textContent)) p.parentNode.removeChild(p); 965 }); 966 each(document.querySelectorAll('#search-results-content > ul'), function (ul) { 967 each(Array.prototype.slice.call(ul.childNodes), function (n) { 968 var m = n.nodeType === 3 && /^\s*\(([^)]+)\)\s*$/.exec(n.nodeValue); 969 if (!m) return; 970 var s = document.createElement('span'); s.className = 'sb-result-type'; s.textContent = m[1]; 971 ul.replaceChild(s, n); 972 }); 973 }); 974 var total = 0; 975 each(document.querySelectorAll('[data-search-page-tabs] [data-count]'), function (el) { total += parseInt(el.getAttribute('data-count'), 10) || 0; }); 976 each(document.querySelectorAll('[data-search-page-tabs] > li'), function (li) { 977 if (li.querySelector('[data-count="0"]') && li.style.display !== 'none') li.style.display = 'none'; 978 }); 979 if (total > 0) { 980 each(document.querySelectorAll('.search-suggestion'), function (el) { 981 if (el.querySelector('.search-refine') && el.style.display !== 'none') el.style.display = 'none'; 982 }); 983 } 984 } 985 tidy(); 986 var main = document.querySelector('main') || document.body, pendingTidy = 0; 987 if (typeof MutationObserver === 'function') { 988 new MutationObserver(function () { 989 if (pendingTidy) return; 990 pendingTidy = setTimeout(function () { pendingTidy = 0; tidy(); }, 60); 991 }).observe(main, { childList: true, subtree: true }); 992 } 993 994 /* (1) the form */ 995 var nav = document.querySelector('nav.search-nav'); 996 var anchor = nav || document.getElementById('product-listing-container'); 997 if (!anchor || !anchor.parentNode || document.querySelector('.sb-search-fallback')) return; 998 var form = document.createElement('form'); 999 form.className = 'sb-search sb-search-fallback' + (query ? '' : ' sb-search-fallback--empty'); 1000 form.setAttribute('role', 'search'); 1001 form.setAttribute('action', '/search.php'); 1002 form.setAttribute('method', 'get'); 1003 form.innerHTML = '<label class="sb-search__label" for="sb-q">Search the store</label>' + 1004 '<input id="sb-q" type="search" name="search_query" placeholder="Search sheds and guides" autocomplete="off">' + 1005 '<button type="submit" class="btn btn--primary sb-search__submit">Search</button>'; 1006 anchor.parentNode.insertBefore(form, anchor); 1007 var input = form.querySelector('input'); 1008 if (query) { input.value = query; return; } 1009 try { input.focus(); } catch (e) {} 1010 // Niche's search.js prepends a hidden <p role="status"> results-count 1011 // announcement and focuses it 100 ms after its own init, which takes the 1012 // focus back off the field; hand it back once, then stop listening. 1013 function stolen(e) { 1014 var t = e.target; 1015 if (!t || t === input || t.tagName !== 'P' || t.getAttribute('role') !== 'status') return; 1016 document.removeEventListener('focusin', stolen, true); 1017 setTimeout(function () { try { input.focus(); } catch (err) {} }, 0); 1018 } 1019 document.addEventListener('focusin', stolen, true); 1020 setTimeout(function () { document.removeEventListener('focusin', stolen, true); }, 5000); 1021 function reclaim() { 1022 var a = document.activeElement; 1023 if (!a || a === document.body || (a.tagName === 'P' && a.getAttribute('role') === 'status')) { try { input.focus(); } catch (err) {} } 1024 } 1025 window.addEventListener('load', function () { setTimeout(reclaim, 400); }); 1026 setTimeout(reclaim, 1500); 1027})(); 1028</script>
vendor: 1 bytes, line 1028
1028
1029<script> 1030/* Header search panel + the shared .sb-search behaviour (D17 / SB-30, 1031 2026-09-17). The magnifier in chrome/header.html is a real link to the 1032 search page; here it becomes a toggle button for #sbSearchPanel: open -> 1033 focus the field; Escape, an outside click, focus leaving the panel or the 1034 burger close it (Escape / outside click hand focus back to the toggle). 1035 Modified clicks (new tab) keep the link behaviour. Every .sb-search form - 1036 header panel, phone drawer, the search page's own - refuses an empty query 1037 (focuses the field instead) and is prefilled on the search page. */ 1038(function () { 1039 var each = function (list, fn) { Array.prototype.forEach.call(list, fn); }; 1040 document.addEventListener('submit', function (e) { 1041 var f = e.target; 1042 if (!f || !f.classList || !f.classList.contains('sb-search')) return; 1043 var i = f.querySelector('input[name="search_query"]'); 1044 if (!i) return; 1045 var v = i.value.replace(/\s+/g, ' ').trim(); 1046 if (!v) { e.preventDefault(); i.value = ''; try { i.focus(); } catch (err) {} return; } 1047 i.value = v; 1048 }); 1049 if (document.body && document.body.classList.contains('search-page')) { 1050 var q = ''; 1051 try { q = (new URLSearchParams(window.location.search).get('search_query') || '').replace(/\s+/g, ' ').trim(); } catch (e) {} 1052 if (q) each(document.querySelectorAll('.sb-search input[name="search_query"]'), function (i) { if (!i.value) i.value = q; }); 1053 } 1054 1055 var toggle = document.getElementById('sbSearchToggle'); 1056 var panel = document.getElementById('sbSearchPanel'); 1057 var input = panel && panel.querySelector('input[name="search_query"]'); 1058 if (!toggle || !panel || !input) return; 1059 toggle.setAttribute('role', 'button'); 1060 toggle.setAttribute('aria-expanded', 'false'); 1061 toggle.setAttribute('aria-controls', 'sbSearchPanel'); 1062 function isOpen() { return !panel.hidden; } 1063 function open() { 1064 panel.hidden = false; 1065 toggle.setAttribute('aria-expanded', 'true'); 1066 try { input.focus(); input.select(); } catch (e) {} 1067 } 1068 function close(refocus) { 1069 if (!isOpen()) return; 1070 panel.hidden = true; 1071 toggle.setAttribute('aria-expanded', 'false'); 1072 if (refocus) { try { toggle.focus(); } catch (e) {} } 1073 } 1074 toggle.addEventListener('click', function (e) { 1075 if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey || e.button) return; 1076 e.preventDefault(); 1077 isOpen() ? close(true) : open(); 1078 }); 1079 toggle.addEventListener('keydown', function (e) { // a button also answers Space 1080 if (e.key === ' ' || e.key === 'Spacebar') { e.preventDefault(); isOpen() ? close(true) : open(); } 1081 }); 1082 document.addEventListener('keydown', function (e) { if (e.key === 'Escape' && isOpen()) close(true); }); 1083 document.addEventListener('click', function (e) { 1084 if (!isOpen()) return; 1085 var t = e.target; 1086 if (panel.contains(t) || toggle.contains(t)) return; 1087 var a = document.activeElement; 1088 close(!a || a === document.body || panel.contains(a)); // a click on another control keeps its own focus 1089 }); 1090 document.addEventListener('focusin', function (e) { // Tab carried the focus out of the panel 1091 if (isOpen() && !panel.contains(e.target) && !toggle.contains(e.target)) close(false); 1092 }); 1093 window.addEventListener('blur', function () { // ...or into an iframe (the Trustpilot badge is next in the tab order) 1094 setTimeout(function () { var a = document.activeElement; if (isOpen() && a && a.tagName === 'IFRAME') close(false); }, 0); 1095 }); 1096 var burger = document.getElementById('sbBurger'); 1097 if (burger) burger.addEventListener('click', function () { close(false); }); 1098 // A primary-nav dropdown (z-index 70) opened OVER the open search form 1099 // (z 65) on hover; one panel at a time - the typed query stays in the field. 1100 each(document.querySelectorAll('.header-nav .nav-item'), function (n) { 1101 n.addEventListener('mouseenter', function () { close(false); }); 1102 }); 1103})(); 1104</script>
vendor: 1 bytes, line 1104
1104
1105<script> 1106/* --chrome-h (D12 / SB-35, 2026-09-17): the height of everything the chrome 1107 puts above the page content at scroll 0 - store banner + announcement + 1108 header + utility strip (+ a widget dropped in a header_bottom region) - in 1109 document coordinates, so the landing hero can fill exactly the rest of the 1110 first screen: min-height: calc(100vh - var(--chrome-h, 190px)) in 1111 solidbuild-landing.scss (190px = the no-JS fallback). The utility strip is 1112 not sticky, so its bottom edge + the scroll offset is stable at any scroll 1113 position; the sticky header is only the fallback when the strip is 1114 missing. Re-measured on load, resize, fonts ready and when a chrome row 1115 changes size (the Trustpilot iframe landing). 1116 NOTE: the --panel-top publisher that once lived in this file went with the 1117 drawer rebuild (ee057fc); the scss rules that read it use their fallback. */ 1118(function () { 1119 var root = document.documentElement, last = -1; 1120 function bottom(el) { 1121 if (!el) return 0; 1122 var r = el.getBoundingClientRect(); 1123 return r.height ? r.bottom + (window.pageYOffset || root.scrollTop || 0) : 0; 1124 } 1125 function measure() { 1126 var h = bottom(document.querySelector('.util-strip')); 1127 if (!h) { 1128 var hdr = document.querySelector('.site-header'); 1129 h = (hdr ? hdr.offsetHeight : 0) + bottom(document.querySelector('.announce')); 1130 } 1131 Array.prototype.forEach.call(document.querySelectorAll('[data-content-region^="header_bottom"]'), function (el) { 1132 h = Math.max(h, bottom(el)); 1133 }); 1134 h = Math.round(h); 1135 if (h > 0 && h !== last) { last = h; root.style.setProperty('--chrome-h', h + 'px'); } 1136 } 1137 measure(); 1138 window.addEventListener('load', measure); 1139 window.addEventListener('resize', measure); 1140 if (document.fonts && document.fonts.ready && document.fonts.ready.then) document.fonts.ready.then(measure); 1141 if (typeof ResizeObserver === 'function') { 1142 var ro = new ResizeObserver(measure); 1143 Array.prototype.forEach.call(document.querySelectorAll('.sb-banner, .announce, .site-header, .util-strip'), function (el) { ro.observe(el); }); 1144 } 1145})(); 1146</script>
vendor: 1 bytes, line 1146
1146
1147<script> 1148/* Trustpilot loader safeguard (2026-09-11). The Trustpilot BigCommerce app 1149 injects tp.widget.bootstrap store-side, which is why the TrustBoxes never 1150 rendered on the dev server (only the plain "Trustpilot" fallback links). 1151 If no bootstrap tag is on the page â the dev server, or the app ever 1152 disabled â load Trustpilot's own script once; on the live store this is a 1153 no-op. */ 1154(function () { 1155 if (document.querySelector('script[src*="tp.widget.bootstrap"]')) return; 1156 if (!document.querySelector('.trustpilot-widget')) return; 1157 var s = document.createElement('script'); 1158 s.src = 'https://widget.trustpilot.com/bootstrap/v5/tp.widget.bootstrap.min.js'; 1159 s.async = true; 1160 document.head.appendChild(s); 1161})(); 1162</script>
vendor: 1 bytes, line 1162
1162
1163<script src="https://cdn11.bigcommerce.com/s-9vcrg0/stencil/6da2bff0-9dd6-013f-fe0f-4201d46ef01e/e/644ce700-943f-013f-ccec-561d5e2793e8/js/solidbuild-cart.js" defer></script>
1163 1164 1165 <!-- Product added to comparison --> 1166<div id="product-add-popup" class="product-add-popup compare-popup" style="display:none;"> 1167 <div class="popup-section"> 1168 <a href="javascript:void(0)" class="close-btn" role="button">x</a> 1169 <h5>Compare</h5> 1170 <p>Item successfully added to comparison list.</p> 1171 </div> 1172</div> 1173 1174<!-- Product removed to comparison --> 1175<div id="product-remove-popup" class="product-remove-popup compare-popup" style="display:none;"> 1176 <div class="popup-section"> 1177 <a href="javascript:void(0)" class="close-btn" role="button">x</a> 1178 <h5>Compare</h5> 1179 <p>Item successfully removed from comparison list.</p> 1180 </div> 1181</div> 1182 1183<!-- Add more products to comparison --> 1184<div id="add-more-product-popup" class="add-more-product-popup compare-popup" style="display:none;"> 1185 <div class="popup-section"> 1186 <a href="javascript:void(0)" class="close-btn" role="button">x</a> 1187 <h5>Compare</h5> 1188 <p>Minimum 2 products are needed to make a valid comparison.</p> 1189 </div> 1190</div> 1191<!-- No products added to comparison --> 1192<div id="no-product-popup" class="no-product-popup compare-popup" style="display:none;"> 1193 <div class="popup-section"> 1194 <a href="javascript:void(0)" class="close-btn" role="button">x</a> 1195 <h5>Compare</h5> 1196 <p>There is no item to compare. Please select at least 2 products.</p> 1197 </div> 1198</div> 1199 1200
1200<script>window.__webpack_public_path__ = "https://cdn11.bigcommerce.com/s-9vcrg0/stencil/6da2bff0-9dd6-013f-fe0f-4201d46ef01e/e/644ce700-943f-013f-ccec-561d5e2793e8/dist/";</script>
1200 1201
1201<script> 1202 function onThemeBundleMain() { 1203 window.stencilBootstrap("cart", "{\"cancelButtonText\":\"Cancel\",\"invalidEntryMessage\":\"[ENTRY] is not a valid entry\",\"zoomSize\":\"1280x1280\",\"productSize\":\"500x659\",\"genericError\":\"Oops! Something went wrong.\",\"urls\":{\"home\":\"https://solidbuildwood.com/\",\"brands\":\"https://solidbuildwood.com/brands/\",\"search\":\"https://solidbuildwood.com/search.php\",\"compare\":\"https://solidbuildwood.com/compare\",\"sitemap\":\"https://solidbuildwood.com/sitemap.php\",\"contact_us_submit\":\"https://solidbuildwood.com/pages.php?action=sendContactForm\",\"subscribe\":{\"action\":\"https://solidbuildwood.com/subscribe.php\"},\"checkout\":{\"single_address\":\"https://solidbuildwood.com/checkout\",\"multiple_address\":\"https://solidbuildwood.com/checkout.php?action=multiple\"},\"account\":{\"orders\":{\"all\":\"https://solidbuildwood.com/account.php?action=order_status\",\"completed\":\"https://solidbuildwood.com/account.php?action=view_orders\",\"save_new_return\":\"https://solidbuildwood.com/account.php?action=save_new_return\"},\"returns\":\"https://solidbuildwood.com/account.php?action=view_returns\",\"addresses\":\"https://solidbuildwood.com/account.php?action=address_book\",\"inbox\":\"https://solidbuildwood.com/account.php?action=inbox\",\"send_message\":\"https://solidbuildwood.com/account.php?action=send_message\",\"add_address\":\"https://solidbuildwood.com/account.php?action=add_shipping_address\",\"update_action\":\"https://solidbuildwood.com/account.php?action=update_account\",\"details\":\"https://solidbuildwood.com/account.php?action=account_details\",\"recent_items\":\"https://solidbuildwood.com/account.php?action=recent_items\",\"index\":\"https://solidbuildwood.com/account.php\",\"wishlists\":{\"all\":\"https://solidbuildwood.com/wishlist.php\",\"add\":\"https://solidbuildwood.com/wishlist.php?action=addwishlist\",\"edit\":\"https://solidbuildwood.com/wishlist.php?action=editwishlist\",\"delete\":\"https://solidbuildwood.com/wishlist.php?action=deletewishlist\"}},\"auth\":{\"login\":\"https://solidbuildwood.com/login.php\",\"check_login\":\"https://solidbuildwood.com/login.php?action=check_login\",\"create_account\":\"https://solidbuildwood.com/login.php?action=create_account\",\"save_new_account\":\"https://solidbuildwood.com/login.php?action=save_new_account\",\"forgot_password\":\"https://solidbuildwood.com/login.php?action=reset_password\",\"send_password_email\":\"https://solidbuildwood.com/login.php?action=send_password_email\",\"save_new_password\":\"https://solidbuildwood.com/login.php?action=save_new_password\",\"logout\":\"https://solidbuildwood.com/login.php?action=logout\"},\"cart\":\"https://solidbuildwood.com/cart.php\",\"product\":{\"post_review\":\"https://solidbuildwood.com/postreview.php\"},\"gift_certificate\":{\"purchase\":\"https://solidbuildwood.com/giftcertificates.php\",\"redeem\":\"https://solidbuildwood.com/giftcertificates.php?action=redeem\",\"balance\":\"https://solidbuildwood.com/giftcertificates.php?action=balance\"},\"rss\":{\"products\":{\"new\":\"https://solidbuildwood.com/rss.php?type=rss\",\"new_atom\":\"https://solidbuildwood.com/rss.php?type=atom\",\"popular\":\"https://solidbuildwood.com/rss.php?action=popularproducts&type=rss\",\"popular_atom\":\"https://solidbuildwood.com/rss.php?action=popularproducts&type=atom\",\"featured\":\"https://solidbuildwood.com/rss.php?action=featuredproducts&type=rss\",\"featured_atom\":\"https://solidbuildwood.com/rss.php?action=featuredproducts&type=atom\",\"search\":\"https://solidbuildwood.com/rss.php?action=searchproducts&type=rss\",\"search_atom\":\"https://solidbuildwood.com/rss.php?action=searchproducts&type=atom\"},\"blog\":\"https://solidbuildwood.com/rss.php?action=newblogs&type=rss\",\"blog_atom\":\"https://solidbuildwood.com/rss.php?action=newblogs&type=atom\"}},\"secureBaseUrl\":\"https://solidbuildwood.com\",\"cartId\":null,\"template\":\"pages/cart\",\"validationDictionaryJSON\":\"{\\\"locale\\\":\\\"en\\\",\\\"locales\\\":{\\\"validation_messages.val
1203id_email\\\":\\\"en\\\",\\\"validation_messages.password\\\":\\\"en\\\",\\\"validation_messages.password_match\\\":\\\"en\\\",\\\"validation_messages.invalid_password\\\":\\\"en\\\",\\\"validation_messages.field_not_blank\\\":\\\"en\\\",\\\"validation_messages.certificate_amount\\\":\\\"en\\\",\\\"validation_messages.certificate_amount_range\\\":\\\"en\\\",\\\"validation_messages.price_min_evaluation\\\":\\\"en\\\",\\\"validation_messages.price_max_evaluation\\\":\\\"en\\\",\\\"validation_messages.price_min_not_entered\\\":\\\"en\\\",\\\"validation_messages.price_max_not_entered\\\":\\\"en\\\",\\\"validation_messages.price_invalid_value\\\":\\\"en\\\",\\\"validation_messages.invalid_gift_certificate\\\":\\\"en\\\"},\\\"translations\\\":{\\\"validation_messages.valid_email\\\":\\\"You must enter a valid email.\\\",\\\"validation_messages.password\\\":\\\"You must enter a password.\\\",\\\"validation_messages.password_match\\\":\\\"Your passwords do not match.\\\",\\\"validation_messages.invalid_password\\\":\\\"Passwords must be at least 7 characters and contain both alphabetic and numeric characters.\\\",\\\"validation_messages.field_not_blank\\\":\\\" field cannot be blank.\\\",\\\"validation_messages.certificate_amount\\\":\\\"You must enter a gift certificate amount.\\\",\\\"validation_messages.certificate_amount_range\\\":\\\"You must enter a certificate amount between [MIN] and [MAX]\\\",\\\"validation_messages.price_min_evaluation\\\":\\\"Min. price must be less than max. price.\\\",\\\"validation_messages.price_max_evaluation\\\":\\\"Min. price must be less than max. price.\\\",\\\"validation_messages.price_min_not_entered\\\":\\\"Min. price is required.\\\",\\\"validation_messages.price_max_not_entered\\\":\\\"Max. price is required.\\\",\\\"validation_messages.price_invalid_value\\\":\\\"Input must be greater than 0.\\\",\\\"validation_messages.invalid_gift_certificate\\\":\\\"Please enter your valid certificate code.\\\"}}\",\"validationFallbackDictionaryJSON\":\"{\\\"locale\\\":\\\"en\\\",\\\"locales\\\":{\\\"validation_fallback_messages.valid_email\\\":\\\"en\\\",\\\"validation_fallback_messages.password\\\":\\\"en\\\",\\\"validation_fallback_messages.password_match\\\":\\\"en\\\",\\\"validation_fallback_messages.invalid_password\\\":\\\"en\\\",\\\"validation_fallback_messages.field_not_blank\\\":\\\"en\\\",\\\"validation_fallback_messages.certificate_amount\\\":\\\"en\\\",\\\"validation_fallback_messages.certificate_amount_range\\\":\\\"en\\\",\\\"validation_fallback_messages.price_min_evaluation\\\":\\\"en\\\",\\\"validation_fallback_messages.price_max_evaluation\\\":\\\"en\\\",\\\"validation_fallback_messages.price_min_not_entered\\\":\\\"en\\\",\\\"validation_fallback_messages.price_max_not_entered\\\":\\\"en\\\",\\\"validation_fallback_messages.price_invalid_value\\\":\\\"en\\\",\\\"validation_fallback_messages.invalid_gift_certificate\\\":\\\"en\\\"},\\\"translations\\\":{\\\"validation_fallback_messages.valid_email\\\":\\\"You must enter a valid email.\\\",\\\"validation_fallback_messages.password\\\":\\\"You must enter a password.\\\",\\\"validation_fallback_messages.password_match\\\":\\\"Your passwords do not match.\\\",\\\"validation_fallback_messages.invalid_password\\\":\\\"Passwords must be at least 7 characters and contain both alphabetic and numeric characters.\\\",\\\"validation_fallback_messages.field_not_blank\\\":\\\" field cannot be blank.\\\",\\\"validation_fallback_messages.certificate_amount\\\":\\\"You must enter a gift certificate amount.\\\",\\\"validation_fallback_messages.certificate_amount_range\\\":\\\"You must enter a certificate amount between [MIN] and [MAX]\\\",\\\"validation_fallback_messages.price_min_evaluation\\\":\\\"Min. price must be less than max. price.\\\",\\\"validation_fallback_messages.price_max_evaluation\\\":\\\"Min. price must be less than max. price.\\\",\\\"validation_fallback_messages.price_min_not_entered\\\":\\\"Min. price is required.\\\",\\\"validation_fallback_messages.price_max_not_entered\\\":\\\"Max. price is required.\\\",\\\"validation_fallback_messages.price_invalid_value\\\":\\\"Input must be greater than 0.\\\",\\\"validation_fallback_messages.invalid_gift_certificate\\\":\\\"Please enter your valid certificate code.\\\"}}\",\"validationDefaultDictionaryJSON\":\"{\\\"locale\\\":\\\"en\\\",\\\"locales\\\":{\\\"validation_default_messages.val
1203id_email\\\":\\\"en\\\",\\\"validation_default_messages.password\\\":\\\"en\\\",\\\"validation_default_messages.password_match\\\":\\\"en\\\",\\\"validation_default_messages.invalid_password\\\":\\\"en\\\",\\\"validation_default_messages.field_not_blank\\\":\\\"en\\\",\\\"validation_default_messages.certificate_amount\\\":\\\"en\\\",\\\"validation_default_messages.certificate_amount_range\\\":\\\"en\\\",\\\"validation_default_messages.price_min_evaluation\\\":\\\"en\\\",\\\"validation_default_messages.price_max_evaluation\\\":\\\"en\\\",\\\"validation_default_messages.price_min_not_entered\\\":\\\"en\\\",\\\"validation_default_messages.price_max_not_entered\\\":\\\"en\\\",\\\"validation_default_messages.price_invalid_value\\\":\\\"en\\\",\\\"validation_default_messages.invalid_gift_certificate\\\":\\\"en\\\"},\\\"translations\\\":{\\\"validation_default_messages.valid_email\\\":\\\"You must enter a valid email.\\\",\\\"validation_default_messages.password\\\":\\\"You must enter a password.\\\",\\\"validation_default_messages.password_match\\\":\\\"Your passwords do not match.\\\",\\\"validation_default_messages.invalid_password\\\":\\\"Passwords must be at least 7 characters and contain both alphabetic and numeric characters.\\\",\\\"validation_default_messages.field_not_blank\\\":\\\"The field cannot be blank.\\\",\\\"validation_default_messages.certificate_amount\\\":\\\"You must enter a gift certificate amount.\\\",\\\"validation_default_messages.certificate_amount_range\\\":\\\"You must enter a certificate amount between [MIN] and [MAX]\\\",\\\"validation_default_messages.price_min_evaluation\\\":\\\"Min. price must be less than max. price.\\\",\\\"validation_default_messages.price_max_evaluation\\\":\\\"Min. price must be less than max. price.\\\",\\\"validation_default_messages.price_min_not_entered\\\":\\\"Min. price is required.\\\",\\\"validation_default_messages.price_max_not_entered\\\":\\\"Max. price is required.\\\",\\\"validation_default_messages.price_invalid_value\\\":\\\"Input must be greater than 0.\\\",\\\"validation_default_messages.invalid_gift_certificate\\\":\\\"Please enter your valid certificate code.\\\"}}\",\"carouselArrowAndDotAriaLabel\":\"Go to slide [SLIDE_NUMBER] of [SLIDES_QUANTITY]\",\"carouselActiveDotAriaLabel\":\"active\",\"carouselContentAnnounceMessage\":\"You are currently on slide [SLIDE_NUMBER] of [SLIDES_QUANTITY]\"}").load(); 1204 } 1205 </script>
1205 1206
1206<script async defer src="https://cdn11.bigcommerce.com/s-9vcrg0/stencil/6da2bff0-9dd6-013f-fe0f-4201d46ef01e/e/644ce700-943f-013f-ccec-561d5e2793e8/dist/theme-bundle.main.js" onload="onThemeBundleMain()"></script>
1206 1207
1207<script defer src="https://cdn11.bigcommerce.com/s-9vcrg0/stencil/6da2bff0-9dd6-013f-fe0f-4201d46ef01e/e/644ce700-943f-013f-ccec-561d5e2793e8/js/theme/common/axios.min.js"></script>
1207 1208
1208<script type="text/javascript" src="https://cdn11.bigcommerce.com/shared/js/csrf-protection-header-5eeddd5de78d98d146ef4fd71b2aedce4161903e.js"></script>
vendor: 1 bytes, line 1208
1208
1209<script src="https://apis.google.com/js/platform.js?onload=renderBadge" async defer ></script>
1209 1210 1211
1212<script src='https://chimpstatic.com/mcjs-connected/js/users/f0cc35f21f5e5dbd3c801df6e/ad6486fb5e62cbd9cc705ab9d.js' defer ></script>
1212<script src="https://conduit.mailchimpapp.com/js/stores/store_edp63d8687mmqsaag7ba/conduit.js" defer></script>
1212<script>(function(w,d,t,r,u){var f,n,i;w[u]=w[u]||[],f=function(){var o={ti:"32593428", enableAutoSpaTracking: true};o.q=w[u],w[u]=new UET(o),w[u].push("pageLoad")},n=d.createElement(t),n.src=r,n.async=1,n.onload=n.onreadystatechange=function(){var s=this.readyState;s&&s!=="loaded"&&s!=="complete"||(f(),n.onload=n.onreadystatechange=null)},i=d.getElementsByTagName(t)[0],i.parentNode.insertBefore(n,i)})(window,document,"script","//bat.bing.com/bat.js","uetq");</script>
1212 1213
1214<script> 1215 window.uetq = window.uetq || []; 1216 window.uetq.push('event', '', {"revenue_value":%%ORDER_AMOUNT%%,"currency":"USD"}); 1217</script>
1217
1217<script src="https://solidbuildwood.services.answerbase.com/javascript/widget/cta-widget.js" 1218 data-insert-after=".productView-rating"> 1219 </script>
1219<script src="https://solidbuildwood.services.answerbase.com/javascript/widget/full-featured-widget.min.js" type="text/javascript" 1220data-platform="bigcommerce" 1221data-page-type="cart" 1222data-product-external-id="" 1223data-product-sku="" 1224data-product-title="" 1225data-product-price="" 1226data-product-url="" 1227data-product-description="" 1228data-product-image-url="[object Object]" 1229data-text-list-popular="Most Popular Questions" 1230data-open-links="popup" 1231data-display-count="3" 1232data-show-answers="false" 1233data-show-comments="true" 1234data-max-answer-height="50" 1235data-insert-after=".measurement-reviews" 1236 defer></script>
1236<script> 1237</script>
vendor: 1 bytes, line 1237
1237
1238<script> 1239document.querySelectorAll('[data-cart-item-add]').forEach(form => form.addEventListener('submit', (event) => { 1240 event.preventDefault(); 1241 const formData = new FormData(event.target); 1242 let productId, productQty; 1243 for (const pair of formData.entries()) { 1244 if (pair[0] === 'product_id') { 1245 productId = pair[1]; 1246 } else if (pair[0] === 'qty[]') { 1247 productQty = parseInt(pair[1]); 1248 } 1249 } 1250 const product = { 1251 id: '', 1252 name: '', 1253 quantity: productQty, 1254 google_business_vertical: 'retail', 1255 } 1256 1257 gtag('event', 'add_to_cart', { 1258 send_to: 'AW-1030350139', 1259 ecomm_pagetype: 'cart', 1260 currency: product.currency, 1261 items: [product], 1262 value: product.price 1263 }); 1264})); 1265</script>
vendor: 1 bytes, line 1265
1265
1266<script> 1267(function () { 1268 var box = document.getElementById('consultTooltipBox'); 1269 if (!box) return; 1270 var container = box.querySelector('.tooltip-container'); 1271 var trigger = box.querySelector('a.cta'); 1272 var closeBtn = box.querySelector('.close-tooltip'); 1273 1274 // Tap to open on touch devices (desktop already gets hover from CSS) 1275 trigger.addEventListener('click', function (e) { 1276 if (window.matchMedia('(hover: none)').matches) { 1277 e.preventDefault(); 1278 container.classList.toggle('active'); 1279 } 1280 }); 1281 closeBtn.addEventListener('click', function (e) { 1282 e.stopPropagation(); 1283 container.classList.remove('active'); 1284 }); 1285 document.addEventListener('click', function (e) { 1286 if (!box.contains(e.target)) container.classList.remove('active'); 1287 }); 1288})(); 1289</script>
1289<script> 1290 1291 1292function redirectLink(badgeval,el) { 1293if(badgeval != ''){ 1294 1295 // console.log('clicke'); 1296 var badgelink = badgeval; 1297 1298 window.location.href = badgelink; 1299 1300 } 1301 1302} 1303var existingScript = document.getElementById('primebPopper'); 1304 1305if (!existingScript) { 1306 var country = 'suprbadgecountry'; 1307const scriptpopperb = document.createElement('script'); 1308scriptpopperb.src = 'https://unpkg.com/@popperjs/core@2/dist/umd/popper.min.js'; 1309scriptpopperb.id = 'primebPopper'; 1310document.getElementsByTagName('head')[0].appendChild(scriptpopperb); 1311 1312const scripttippyb = document.createElement('script'); 1313scripttippyb.src = 'https://unpkg.com/tippy.js@6/dist/tippy-bundle.umd.js'; 1314scripttippyb.id = 'primebTippy'; 1315document.getElementsByTagName('head')[0].appendChild(scripttippyb); 1316 // $.getScript("https://unpkg.com/tippy.js@6/dist/tippy-bundle.umd.js", function(){ 1317 1318 // }); 1319} 1320 1321document.addEventListener('DOMContentLoaded', (event) => { 1322 1323 1324 1325 // const primeinstances2 = tippy('[data-tippy-content]'); 1326 // instances2.destroy(); 1327 1328 $(document).on("click",".suprbadge-single",function() { 1329 if($(this).attr('productlink') == 1 && $(this).attr('data-productlink') != "productlinkholder"){ 1330 console.log($(this).attr('data-productlink')); 1331 window.location.href = $(this).attr('data-productlink'); 1332 return 1; 1333 } 1334 1335 1336 }); 1337 1338 setTimeout(function(){ 1339 if (typeof tippy !== "undefined") { 1340 var primeinstances2 = tippy('[data-tippy-content]'); 1341 } 1342 1343 }, 2000); 1344 1345 //code logic for thaliacustomercountry 1346 1347 function thaliaSetCookie(cname, cvalue, exdays) { 1348 console.log('in set cookie') 1349 const d = new Date(); 1350 d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000)); 1351 let expires = "expires="+d.toUTCString(); 1352 document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/"; 1353 } 1354 1355 function thaliaGetCookie(cname) { 1356 let name = cname + "="; 1357 let ca = document.cookie.split(';'); 1358 for(let i = 0; i < ca.length; i++) { 1359 let c = ca[i]; 1360 while (c.charAt(0) == ' ') { 1361 c = c.substring(1); 1362 } 1363 if (c.indexOf(name) == 0) { 1364 return c.substring(name.length, c.length); 1365 } 1366 } 1367 return ""; 1368 } 1369 1370 1371 1372 1373 document.addEventListener("DOMContentLoaded", function(event) { 1374 thaliaCustomerCookie(); 1375 }); 1376 1377 var thaliacustomercountry = ''; 1378 function thaliaCustomerCookie() { 1379 thaliacustomercountry = thaliaGetCookie("thaliacustomercountry"); 1380 1381 if (thaliacustomercountry != "") { 1382 1383 } else { 1384 1385 var xhttp = new XMLHttpRequest(); 1386 xhttp.onreadystatechange = function () { 1387 if (xhttp.readyState == 4 && xhttp.status == 200) { 1388 var countryData = JSON.parse(xhttp.responseText); 1389 thaliacustomercountry = countryData.country 1390 thaliaSetCookie("thaliacustomercountry", countryData.country, 2); 1391 1392 1393 } 1394 }; 1395 xhttp.open("GET", "https://geoloc2.thalia-apps.com/", true); 1396 xhttp.send(); 1397 } 1398 } 1399 1400 //end code logic for thaliacustomercountry 1401 1402 1403 if(country == 'suprbadgecountry'){ 1404 country = 'newsuprbadgecountry'; 1405 if (thaliacustomercountry == '') { 1406 thaliaCustomerCookie(); 1407 thaliacustomercountry = thaliaGetCookie("thaliacustomercountry"); 1408 var mycountry = thaliacustomercountry; 1409 } else { 1410 var mycountry = thaliacustomercountry; 1411 } 1412 // var xhttp = new XMLHttpRequest(); 1413 // xhttp.onreadystatechange = function() { 1414 1415 // if (this.readyState == 4 && this.status == 200) { 1416 // countryjson =JSON.parse(this.responseText) 1417 // var mycountry = countryjson.country; 1418 1419 var countryclass = document.getElementsByClassName('starbCountry'); 1420 for (var i = 0; i < countryclass.length; i++) { 1421 var counrtylist = countryclass[i].getAttribute('data-countryselected'); 1422 var position = counrtylist.search(mycountry); 1423 1424 if(position < 0){ 1425 countryclass[i].style.cssText = 'display:none !important'; 1426 1427 } 1428 } 1429 // } 1430 // }; 1431 // xhttp.open("GET", "https://geoloc2.thapi.workers.dev/", true); 1432 // xhttp.send(); 1433 1434 } 1435 1436 }) 1437 var supruser = ''; 1438function customerJWT() { 1439 supruser = 'notlogged'; 1440} 1441 1442function parseJwt (token) { 1443 console.log(token) 1444 if(token == null){ 1445 return false;
1446 } 1447 var base64Url = token.split('.')[1]; 1448 var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/'); 1449 var jsonPayload = decodeURIComponent(atob(base64).split('').map(function(c) { 1450 return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); 1451 }).join('')); 1452 1453 return JSON.parse(jsonPayload); 1454}; 1455 1456customerJWT(); 1457//console.log('supruser',supruser); 1458 1459//console.log('hjkhjk'); 1460</script>
vendor: 1 bytes, line 1460
1460
1461<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
1461 1462
1463<script src="https://suprbadges.thalia-apps.com/401.js?v=1790285584"></script>
vendor: 1 bytes, line 1463
1463
1464<script> 1465 $( "<style>.badgetitle{cursor:pointer}.suprBigClose{color:#000;position:absolute;right:-15px;bottom:0}.starb-inline{display:block}.starb-center{text-align:center}.starb-sm{margin:5px}.starb-md{margin:10px}.starb-lg{margin:20px}.starb-tb-sm{margin-top:5px;margin-bottom:5px}.starb-tb-md{margin-top:10px;margin-bottom:10px}.starb-tb-lg{margin-top:20px;margin-bottom:20px}.starb-lr-sm{margin-left:10px;margin-right:10px}.starb-lr-md{margin-left:10px;margin-right:10px}.starb-lr-lg{margin-left:20px;margin-right:20px}.starb-t-sm{margin-top:5px}.starb-t-md{margin-top:10px}.starb-t-lg{margin-top:20px}.starb-b-sm{margin-bottom:5px}.starb-b-md{margin-bottom:10px}.starb-b-lg{margin-bottom:20px}.starb-l-sm{margin-left:5px}.starb-l-md{margin-left:10px}.starb-l-lg{margin-left:20px}.starb-r-sm{margin-right:5px}.starb-r-md{margin-right:10px}.starb-r-lg{margin-right:20px}@media only screen and (min-width:480px){.starb-full{visibility:visible;height:auto;width:auto}.starb-mobile{visibility:hidden!important;height:0;width:0}}
1465@media only screen and (max-width:480px){.starb-full{visibility:visible;height:auto;width:auto}.starb-mobile{visibility:hidden!important;height:0;width:0}}</style>" ).appendTo( "head" ); 1466 $( "<style></style>" ).appendTo( "head" ); 1467 $( "<style></style>" ).appendTo( "head" ); 1468 $( "<style></style>" ).appendTo( "head" ); 1469 $( "<style></style>" ).appendTo( "head" ); 1470 $( "<style></style>" ).appendTo( "head" ); 1471 $( "<style></style>" ).appendTo( "head" ); 1472 1473 1474 $( document ).ready(function() { 1475 1476 $('.pagination-link').removeAttr('data-faceted-search-facet'); 1477}); 1478 1479var mypagetype = 'cart'; 1480 1481var customid = ''; 1482 1483var customname = ''; 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 // start of top_sellers 1494 1495 1496 // End of top_sellers 1497 1498 // start of similar_by_views 1499 // end of similar_by_views 1500 1501 1502 1503 1504 1505// End of suprscript 1506</script>
1506 1507 1508 1509 1510
1510<script>window.__CF$cv$params={r:'a427a6beb83c0aad',t:'MTc5MDY0OTkyMg==',u:'01a0eb0d750c720a965bf3f09241292e',ut:'gbNLqE44couCyak5FZ3YXfsRseULiRTzCmLzNf0uMQc-1790649922-1.2.1.1-wWXgjac0tNkhcwrhD1vLVz9LzTCZS5zBiS3I3rKn15zZCvvMJnzms35e6dUFKYwBsExcS6miPaUHN0X53eIDUqinRuDyGcGDcE5PhNtAKPo',i:60};(function(){if(!document.body)return;var s=document.createElement('script');s.src='/cdn-cgi/challenge-platform/scripts/precursor/main.js';document.head.appendChild(s);})();</script>
1510</body> 1511</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.