1<!doctype html> 2<html lang="en"> 3 <head>
3<script>(function(w,i,g){w[g]=w[g]||[];if(typeof w[g].push=='function')w[g].push(i)}) 4(window,'AW-980483674','google_tags_first_party');</script>
4<script async src="/w7be/"></script>
4 5
5<script> 6 window.dataLayer = window.dataLayer || []; 7 function gtag(){dataLayer.push(arguments);} 8 gtag('js', new Date()); 9 gtag('set', 'developer_id.dYzg1YT', true); 10 gtag('config', 'AW-980483674'); 11 </script>
11 12 13
13<script type="text/javascript"> 14 if (!window._fs_host) { 15 Object.defineProperties(window, { 16 _fs_host: { 17 get: function() { 18 return 'insights.goodshuffle.com'; 19 }, 20 set: function(val) { 21 // console.log('thank you, but no'); 22 } 23 } 24 }); 25 } 26 27 if (!window._fs_script) { 28 Object.defineProperties(window, { 29 _fs_script: { 30 get: function() { 31 return 'insights.goodshuffle.com/s/fs.js'; 32 }, 33 set: function(val) { 34 // console.log('thank you, but no'); 35 } 36 } 37 }); 38 } 39 40 if (!window._fs_app_host) { 41 Object.defineProperties(window, { 42 _fs_app_host: { 43 get: function() { 44 return 'app.fullstory.com'; 45 }, 46 set: function(val) { 47 // console.log('thank you, but no'); 48 } 49 } 50 }); 51 } 52 53 // console.log('Altered FS Path'); 54 </script>
54 55 <meta charset="UTF-8" /> 56 <link rel="icon" type="image/webp" href="https://ai-to-wp.tempurl.host/wp-content/uploads/2025/10/goodshuffle_fav-150x150.webp" /> 57 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 58 <title>Goodshuffle Marketplace</title> 59 <meta name="description" content="GoodShuffle Marketplace - Find and rent equipment" /> 60 <!-- 61 GSPRO-27642 â Boot skeleton for client-view / portal-detail pages. 62 Inlined here (not in a JS bundle) so it paints the instant the HTML document 63 arrives, BEFORE index.js / React / the data fetch. React clears #root on mount 64 and renders its own PortalDetailLoading skeleton, so the swap is seamless. 65 Neutral hardcoded colors are used deliberately: the design-system CSS (--color-* 66 tokens) and the vendor theme aren't loaded yet at first paint. 67 --> 68 <style> 69 #portal-boot-skeleton { min-height: 100vh; background: #ffffff; } 70 #portal-boot-skeleton .pbs-bar { 71 position: fixed; top: 0; left: 0; right: 0; height: 2px; 72 background: #2563eb; animation: pbs-pulse 1.2s ease-in-out infinite; 73 } 74 #portal-boot-skeleton .pbs-navbar { 75 height: 56px; border-bottom: 1px solid #e5e7eb; 76 display: flex; align-items: center; justify-content: space-between; 77 padding: 0 16px; 78 } 79 #portal-boot-skeleton .pbs-wrap { max-width: 768px; margin: 0 auto; padding: 0 16px; } 80 #portal-boot-skeleton .pbs-header { border-bottom: 1px solid #e5e7eb; padding: 24px 0; } 81 #portal-boot-skeleton .pbs-main { padding: 32px 16px; max-width: 768px; margin: 0 auto; } 82 #portal-boot-skeleton .blk { 83 background: #e5e7eb; border-radius: 8px; 84 animation: pbs-pulse 1.5s ease-in-out infinite; 85 } 86 #portal-boot-skeleton .blk + .blk { margin-top: 16px; } 87 #portal-boot-skeleton .h1 { height: 24px; width: 66%; } 88 #portal-boot-skeleton .h2 { height: 16px; width: 33%; margin-top: 12px; } 89 #portal-boot-skeleton .nav-l { height: 20px; width: 120px; } 90 #portal-boot-skeleton .nav-r { height: 28px; width: 28px; border-radius: 9999px; } 91 #portal-boot-skeleton .card-sm { height: 96px; } 92 #portal-boot-skeleton .card-lg { height: 160px; } 93 @keyframes pbs-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } } 94 @media (prefers-reduced-motion: reduce) { 95 #portal-boot-skeleton .pbs-bar, 96 #portal-boot-skeleton .blk { animation: none; } 97 } 98 @media (prefers-color-scheme: dark) { 99 #portal-boot-skeleton { background: #0b0f14; } 100 #portal-boot-skeleton .pbs-navbar, 101 #portal-boot-skeleton .pbs-header { border-bottom-color: #1f2937; } 102 #portal-boot-skeleton .blk { background: #1f2937; } 103 } 104 </style> 105
105<script type="module" crossorigin src="/react-ui/assets/index-BeVg8Waw.js"></script>
105 106 <link rel="stylesheet" crossorigin href="/react-ui/assets/index-CTpaKttL.css"> 107
107<script>!function(){var analytics=window.analytics=window.analytics||[];if(!analytics.initialize)if(analytics.invoked)window.console&&console.error&&console.error("Segment snippet included twice.");else{analytics.invoked=!0;analytics.methods=["trackSubmit","trackClick","trackLink","trackForm","pageview","identify","reset","group","track","ready","alias","debug","page","once","off","on","addSourceMiddleware","addIntegrationMiddleware","setAnonymousId","addDestinationMiddleware"];analytics.factory=function(e){return function(){if(window.analytics.initialized)return window.analytics[e].apply(window.analytics,arguments);var i=Array.prototype.slice.call(arguments);i.unshift(e);analytics.push(i);return analytics}};for(var i=0;i<analytics.methods.length;i++){var key=analytics.methods[i];analytics[key]=analytics.factory(key)}analytics.load=function(key,i){var t=document.createElement("script");t.type="text/javascript";t.async=!0;t.src="https://www.goodshuffle.com/app/seg/ajs/40ee864c-28c0-422c-86c3-6c253ad26d4a";var n=document.getElementsByTagName("script")[0];n.parentNode.insertBefore(t,n);analytics._loadOptions=i};analytics._writeKey="REDACTED";analytics._cdn = "https://www.goodshuffle.com/app/seg";analytics.SNIPPET_VERSION="4.16.1"; 108analytics.load("REDACTED"); 109 110}}();</script>
110</head> 111 <body> 112 <div id="root"></div> 113
113<script> 114 /* Inject the boot skeleton synchronously (before the deferred module script 115 below) â but only for the heavy client-view / portal-detail routes, so other 116 pages (home, search, project list) don't flash a detail-shaped placeholder. 117 React replaces #root's contents on mount. */ 118 (function () { 119 var p = location.pathname; 120 var isDetail = 121 /^\/c\/[^/]+/.test(p) || 122 /^\/portal\/projects\/[^/]+/.test(p) || 123 /^\/preview\/[^/]+/.test(p) || 124 /^\/portal\/admin\/skinwalk\/[^/]+/.test(p); 125 if (!isDetail) { return; } 126 var root = document.getElementById("root"); 127 if (!root) { return; } 128 root.innerHTML = 129 '<div id="portal-boot-skeleton" data-testid="portal-loading-skeleton" role="status" aria-label="Loading project">' + 130 '<div class="pbs-bar"></div>' + 131 '<div class="pbs-navbar"><div class="blk nav-l"></div><div class="blk nav-r"></div></div>' + 132 '<div class="pbs-header"><div class="pbs-wrap"><div class="blk h1"></div><div class="blk h2"></div></div></div>' + 133 '<div class="pbs-main">' + 134 '<div class="blk card-sm"></div>' + 135 '<div class="blk card-lg"></div>' + 136 '<div class="blk card-lg"></div>' + 137 '</div>' + 138 '</div>'; 139 })(); 140 </script>
140 141
141<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"75e4812d24bf455fbd80bc011f2a2061","spa":2}' crossorigin="anonymous"></script>
vendor: 1 bytes, line 141
141
142<script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a40cc0c60b16fe89',t:'MTc5MDM2Nzg3Mg=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
142</body> 143</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.