PageSourceSearch

https://solidbuildwood.com/cart.php

html solidbuildwood.com collected 2026-09-29 02:45:22 UTC 89,409 bytes, 1,511 lines download raw bytes

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 &mdash; 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">&#9660;</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 &amp; 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&ndash;100 sq ft</a>
349            <a href="/shed-area-101-sq-ft-120-sq-ft/">101&ndash;120 sq ft</a>
350            <a href="/shed-area-121-sq-ft-220-sq-ft/">121&ndash;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">&#9660;</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 &amp; 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 &amp; Reviews <span class="main-nav__chev">&#9660;</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 &amp;&amp; h.widget &amp;&amp; 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">&#215;</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>&reg;</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 &amp; delivery</a></li>
605          <li><a href="/solid-build-refund-policy/">Returns &amp; 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>&copy; 2026 SolidBuild &middot; 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.