1<!DOCTYPE html> 2<html lang="en"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <title>Free CAD & PDF File Viewer | AirShop</title> 7 <meta name="description" content="Preview STEP, DXF, PDF, and image files in your browser. Free, no signup. Files stay on your device. Built for manufacturers who quote fast."> 8 <meta property="og:title" content="Free CAD & PDF File Viewer | AirShop"> 9 <meta property="og:description" content="Preview STEP, DXF, PDF, and image files in your browser. Free, no signup. Files stay on your device."> 10 <meta property="og:image" content="https://airshopapp.com/dash.png"> 11 <meta property="og:url" content="https://airshopapp.com/viewer/"> 12 <meta property="og:type" content="website"> 13 <meta name="twitter:card" content="summary_large_image"> 14 <meta name="twitter:title" content="Free CAD & PDF File Viewer | AirShop"> 15 <meta name="twitter:description" content="Preview STEP, DXF, PDF, and image files in your browser. Free, no signup."> 16 <meta name="twitter:image" content="https://airshopapp.com/dash.png"> 17 <link rel="canonical" href="https://airshopapp.com/viewer/"> 18
18<script src="/js/ga.js"></script>
18 19 <link rel="icon" type="image/x-icon" href="/favicon.ico"> 20 <link rel="preconnect" href="https://fonts.googleapis.com"> 21 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 22 <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap" rel="stylesheet"> 23 <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@100;300;500;700&display=swap" rel="stylesheet"> 24 <link href="https://fonts.googleapis.com/icon?family=Material+Icons&display=swap" rel="stylesheet"> 25 <link rel="stylesheet" href="/airshop-landing-shared.css?v=20260913a"> 26 <link rel="stylesheet" href="/footer.css?v=20260311"> 27 <link rel="stylesheet" href="/viewer/viewer.css?v=20260927u"> 28
28<script type="application/ld+json"> 29 { 30 "@context": "https://schema.org", 31 "@type": "WebPage", 32 "name": "Free CAD and PDF File Viewer", 33 "url": "https://airshopapp.com/viewer/", 34 "description": "Preview STEP, DXF, PDF, and image files in your browser without uploading.", 35 "publisher": { 36 "@type": "Organization", 37 "name": "AirShop", 38 "logo": "https://airshopapp.com/AirShop-OPG.png" 39 } 40 } 41 </script>
41 42</head> 43<body class="vw-page"> 44 <header class="header"> 45 <nav class="nav container" aria-label="File viewer"> 46 <a href="/" class="logo"><img src="/AirShop_Dark.svg" alt="AirShop"></a> 47 <div class="nav-links"> 48 <a href="/#pricing">SEE PLANS</a> 49 <a href="https://airshop.work/onboarding">START TRIAL</a> 50 <a href="https://airshop.work" target="_blank" rel="noopener noreferrer">LOGIN</a> 51 </div> 52 </nav> 53 </header> 54 55 <main class="vw-stage container"> 56 <section class="vw-band" aria-label="Viewer intro"> 57 <div class="vw-copy"> 58 <h1 class="vw-headline">View STEP, DXF, and PDF in the browser.</h1> 59 <p class="vw-subline">Files stay on your device. Same viewer as AirShop inquiries.</p> 60 </div> 61 <div class="vw-actions"> 62 <a href="https://cal.com/airshop/demo" class="vw-demo cal-demo-trigger" data-cal-namespace="demo" data-cal-link="airshop/demo">Book a demo</a> 63 <a href="https://airshop.work/onboarding" class="btn btn-primary vw-trial">Start free trial</a> 64 </div> 65 </section> 66 <iframe 67 id="vw-frame" 68 class="vw-iframe" 69 src="https://airshop.work/embed/viewer" 70 title="AirShop file viewer" 71 allow="fullscreen" 72 ></iframe> 73 <div class="vw-below"> 74 <p class="vw-hints">Drag to orbit. Scroll to zoom. Right-click and drag to pan.</p> 75 <div 76 class="vw-cue" 77 role="button" 78 tabindex="0" 79 aria-label="Open file. Or drag and drop a file" 80 > 81 <div class="vw-cue-copy"> 82 <p class="vw-cue-title"><span class="vw-cue-lead">Try it!</span> Drag and drop a file</p> 83 <p class="vw-cue-line">Inspect your file in real time in our viewer</p> 84 <p class="vw-cue-formats">STEP, DXF, PDF, PNG, JPG</p> 85 </div> 86 <div class="vw-cue-arrows" aria-hidden="true"> 87 <svg class="vw-cue-chevron vw-cue-chevron-1" width="20" height="12" viewBox="0 0 20 12" fill="none" xmlns="http://www.w3.org/2000/svg"> 88 <path d="M2 10L10 2L18 10" stroke="#FF5918" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> 89 </svg> 90 <svg class="vw-cue-chevron vw-cue-chevron-2" width="20" height="12" viewBox="0 0 20 12" fill="none" xmlns="http://www.w3.org/2000/svg"> 91 <path d="M2 10L10 2L18 10" stroke="#FF5918" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> 92 </svg> 93 <svg class="vw-cue-chevron vw-cue-chevron-3" width="20" height="12" viewBox="0 0 20 12" fill="none" xmlns="http://www.w3.org/2000/svg"> 94 <path d="M2 10L10 2L18 10" stroke="#FF5918" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> 95 </svg> 96 </div> 97 </div> 98 </div> 99 </main> 100 101 <div id="footer-placeholder"></div> 102
102<script> 103 (function () { 104 var host = window.location.hostname 105 var frame = document.getElementById('vw-frame') 106 var cue = document.querySelector('.vw-cue') 107 var cueDone = false 108 109 if (frame && (host === 'localhost' || host === '127.0.0.1')) { 110 frame.src = 'http://localhost:3000/embed/viewer' 111 } 112 113 function stopCue() { 114 if (cueDone || !cue) return 115 cueDone = true 116 cue.classList.add('vw-cue-done') 117 } 118 119 function frameTargetOrigin() { 120 if (!frame || !frame.src) { 121 return host === 'localhost' || host === '127.0.0.1' 122 ? 'http://localhost:3000' 123 : 'https://airshop.work' 124 } 125 try { 126 return new URL(frame.src).origin 127 } catch (err) { 128 return 'https://airshop.work' 129 } 130 } 131 132 // Cue click â iframe opens file dialog (sync in iframe message handler). 133 // Do not mark done here; wait for airshop-viewer-file-tried after a file is chosen. 134 function requestOpenFile() { 135 if (!frame || !frame.contentWindow) return 136 frame.contentWindow.postMessage( 137 { type: 'airshop-viewer-open-file' }, 138 frameTargetOrigin() 139 ) 140 } 141 142 if (cue) { 143 cue.addEventListener('click', function (event) { 144 event.preventDefault() 145 requestOpenFile() 146 }) 147 cue.addEventListener('keydown', function (event) { 148 if (event.key !== 'Enter' && event.key !== ' ') return 149 event.preventDefault() 150 requestOpenFile() 151 }) 152 } 153 154 // Iframe posts { type: 'airshop-viewer-file-tried' } on drop / Open file. 155 // Accept only embed origins (not *). 156 window.addEventListener('message', function (event) { 157 if ( 158 event.origin !== 'http://localhost:3000' && 159 event.origin !== 'https://airshop.work' 160 ) { 161 return 162 } 163 var data = event.data 164 if (!data || typeof data !== 'object') return 165 if (data.type !== 'airshop-viewer-file-tried') return 166 stopCue() 167 }) 168 })() 169 </script>
169 170
170<script src="/js/load-footer.js?v=20260913c"></script>
170 171
171<script src="/js/cal-embed.js" data-cal-variant="demo-only"></script>
171 172</body> 173</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.