PageSourceSearch

https://airshopapp.com/viewer/

html airshopapp.com collected 2026-10-05 19:23:41 UTC 7,440 bytes, 173 lines download raw bytes

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 &amp; 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 &amp; 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 &amp; 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.