1<!DOCTYPE html> 2<html lang="de"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <title>Unsere Karte | Cafe Goldegg</title> 7 <meta name="description" content="Aktuelle Speisekarte des Cafe Goldegg."> 8 <link rel="canonical" href="https://www.cafegoldegg.at/unsere-karte"> 9 <meta property="og:title" content="Unsere Karte | Cafe Goldegg"> 10 <meta property="og:description" content="Aktuelle Speisekarte des Cafe Goldegg."> 11 <meta property="og:type" content="website"> 12 <meta property="og:url" content="https://www.cafegoldegg.at/unsere-karte"> 13 <link rel="icon" type="image/png" href="/images/favicon.png"> 14 <link rel="preload" href="/css/style.css" as="style"> 15 <style> 16 html { opacity: 1; background-color: #000; overflow: hidden; } 17 body { opacity: 0; } 18 </style> 19</head> 20<body> 21 <header class="site-header"> 22 <div class="container header-inner"> 23 <a href="/" class="logo"> 24 <img src="/images/svg-18636x54.svg" width="63" height="54" alt="Cafe Goldegg"> 25 </a> 26 <nav class="main-nav" aria-label="Hauptnavigation"> 27 <ul> 28 <li><a href="/#das-cafe">Das Café</a></li> 29 <li><a href="/#galerie">Galerie</a></li> 30 <li><a href="/#karte">Karte</a></li> 31 <li><a href="/#oeffnungszeiten">Ãffnungszeiten</a></li> 32 <li><a href="/#reservierung">Reservierung</a></li> 33 <li><a href="/#kontakt">Kontakt</a></li> 34 </ul> 35 </nav> 36 <button class="menu-toggle" aria-label="Menü" aria-expanded="false" aria-controls="mobile-menu"> 37 <span></span> 38 <span></span> 39 <span></span> 40 </button> 41 </div> 42 </header> 43 <div class="mobile-menu" id="mobile-menu" aria-hidden="true" inert> 44 <button class="mobile-menu-close" aria-label="Menü schlieÃen"> 45 <span></span>
46 <span></span> 47 </button> 48 <nav aria-label="Mobile Navigation"> 49 <ul> 50 <li><a href="/#das-cafe">Das Café</a></li> 51 <li><a href="/#galerie">Galerie</a></li> 52 <li><a href="/#karte">Karte</a></li> 53 <li><a href="/#oeffnungszeiten">Ãffnungszeiten</a></li> 54 <li><a href="/#reservierung">Reservierung</a></li> 55 <li><a href="/#kontakt">Kontakt</a></li> 56 </ul> 57 </nav> 58 </div> 59 <main> 60<section class="section section-dark menu-page"> 61 <div class="container"> 62 <h1 class="section-title"><span class="small-title">Unsere</span><br> Karte</h1> 63 <div class="pdf-wrapper"> 64 <div id="pdf-viewer"> 65 <div id="pdf-loading">Speisekarte wird geladen…</div> 66 <div id="pdf-pages"></div> 67 </div> 68 <p class="pdf-download"><a href="/images/Speisekarte-Goldegg_05-25_print.pdf" target="_blank" rel="noopener" download>Speisekarte als PDF herunterladen</a></p> 69 <noscript> 70 <p><a href="/images/Speisekarte-Goldegg_05-25_print.pdf" target="_blank" rel="noopener">Speisekarte als PDF herunterladen</a></p> 71 </noscript> 72 </div> 73 </div> 74</section> 75
76<script type="module"> 77 import * as pdfjsLib from '/js/pdfjs/pdf.min.js'; 78 pdfjsLib.GlobalWorkerOptions.workerSrc = '/js/pdfjs/pdf.worker.min.js'; 79 80 const pdfUrl = '/images/Speisekarte-Goldegg_05-25_print.pdf'; 81 const container = document.getElementById('pdf-pages'); 82 const loading = document.getElementById('pdf-loading'); 83 84 function isPageBlank(canvas) { 85 const ctx = canvas.getContext('2d'); 86 const data = ctx.getImageData(0, 0, canvas.width, canvas.height).data; 87 for (let i = 0; i < data.length; i += 4) { 88 if (data[i] < 250 || data[i + 1] < 250 || data[i + 2] < 250) return false; 89 } 90 return true; 91 } 92 93 async function renderPdf() { 94 try { 95 const pdf = await pdfjsLib.getDocument(pdfUrl).promise; 96 loading.style.display = 'none'; 97 98 for (let i = 1; i <= pdf.numPages; i++) { 99 const page = await pdf.getPage(i); 100 const isMobile = window.innerWidth < 768; 101 const scale = isMobile ? 1.5 : 2; 102 const viewport = page.getViewport({ scale: scale }); 103 104 const canvas = document.createElement('canvas'); 105 canvas.width = viewport.width; 106 canvas.height = viewport.height; 107 108 const ctx = canvas.getContext('2d'); 109 await page.render({ canvasContext: ctx, viewport: viewport }).promise; 110 111 if (isPageBlank(canvas)) continue; 112 113 const wrapper = document.createElement('div'); 114 wrapper.className = 'pdf-page-wrapper'; 115 wrapper.style.position = 'relative'; 116 wrapper.style.width = '100%'; 117 wrapper.style.aspectRatio = viewport.width + ' / ' + viewport.height; 118 canvas.className = 'pdf-page'; 119 wrapper.appendChild(canvas); 120 121 wrapper.dataset.pdfWidth = viewport.width; 122 container.appendChild(wrapper); 123 124 const textLayerDiv = document.createElement('div'); 125 textLayerDiv.className = 'pdf-text-layer'; 126 textLayerDiv.style.setProperty('--scale-factor', scale); 127 wrapper.appendChild(textLayerDiv); 128 129 const textContent = await page.getTextContent(); 130 const textLayer = new pdfjsLib.TextLayer({ 131 textContentSource: textContent, 132 container: textLayerDiv, 133 viewport: viewport 134 }); 135 await textLayer.render(); 136 137 var spans = Array.from(textLayerDiv.querySelectorAll('span')); 138 spans.sort(function (a, b) { 139 return (a.offsetTop - b.offsetTop) || (a.offsetLeft - b.offsetLeft); 140 }); 141 spans.forEach(function (s) { textLayerDiv.appendChild(s); }); 142 } 143 144 updateTextLayerScales(); 145 } catch (err) { 146 loading.innerHTML = '<p>Die Speisekarte konnte nicht geladen werden.</p>' + 147 '<p><a href="' + pdfUrl + '" target="_blank" rel="noopener" style="color:#c0a062;">Speisekarte als PDF herunterladen</a></p>'; 148 } 149 } 150 151 function updateTextLayerScales() { 152 document.querySelectorAll('.pdf-page-wrapper').forEach(function (wrapper) { 153 var pdfWidth = parseFloat(wrapper.dataset.pdfWidth); 154 var textLayer = wrapper.querySelector('.pdf-text-layer'); 155 if (textLayer && pdfWidth) { 156 textLayer.style.transform = 'scale(' + (wrapper.clientWidth / pdfWidth) + ')'; 157 } 158 }); 159 } 160 161 var resizeObserver = new ResizeObserver(updateTextLayerScales); 162 resizeObserver.observe(container); 163 164 renderPdf(); 165</script>
165 166 </main> 167 168 <footer class="site-footer"> 169 <div class="container"> 170 <p>© 2026 Cafe Goldegg | <a href="/impressum">Impressum</a> | Website by Richard Schmögner - <a href="https://www.schmoegner.com" target="_blank" rel="noopener">Art in new Media</a></p> 171 </div> 172 </footer> 173 174 <a href="#" class="scroll-top" aria-label="Nach oben"><i class="fa fa-angle-up"></i></a> 175 176
176<script> 177 (function () { 178 const menuToggle = document.querySelector('.menu-toggle'); 179 const mobileMenu = document.getElementById('mobile-menu'); 180 const mobileClose = document.querySelector('.mobile-menu-close'); 181 182 function toggleMenu(force) { 183 const open = typeof force === 'boolean' ? force : !mobileMenu.classList.contains('is-open'); 184 185 if (open) { 186 mobileMenu.removeAttribute('inert'); 187 mobileMenu.setAttribute('aria-hidden', 'false'); 188 mobileMenu.classList.add('is-open'); 189 menuToggle.setAttribute('aria-expanded', 'true'); 190 mobileClose.focus(); 191 return; 192 } 193 194 if (mobileMenu.contains(document.activeElement)) { 195 menuToggle.focus(); 196 } 197 mobileMenu.classList.remove('is-open'); 198 menuToggle.setAttribute('aria-expanded', 'false'); 199 mobileMenu.setAttribute('aria-hidden', 'true'); 200 mobileMenu.setAttribute('inert', ''); 201 } 202 203 if (menuToggle) menuToggle.addEventListener('click', () => toggleMenu()); 204 if (mobileClose) mobileClose.addEventListener('click', () => toggleMenu(false)); 205 mobileMenu.querySelectorAll('a').forEach((link) => { 206 link.addEventListener('click', () => toggleMenu(false)); 207 }); 208 document.addEventListener('keydown', (event) => { 209 if (event.key === 'Escape' && mobileMenu.classList.contains('is-open')) { 210 event.preventDefault(); 211 toggleMenu(false); 212 } 213 }); 214 215 // document.querySelectorAll('a[href^="#"], a[href*="/#"]').forEach(function (a) { 216 // a.addEventListener('click', function (e) { 217 // const href = a.getAttribute('href'); 218 // let hash = ''; 219 // if (href.indexOf('/#') !== -1) { 220 // hash = href.split('/#')[1]; 221 // } else if (href.charAt(0) === '#') { 222 // hash = href.slice(1); 223 // } 224 // if (!hash) return; 225 // const target = document.getElementById(hash); 226 // if (target) { 227 // e.preventDefault(); 228 // target.scrollIntoView({ behavior: 'smooth' }); 229 // toggleMenu(false); 230 // } 231 // }); 232 // }); 233 234 const scrollTop = document.querySelector('.scroll-top'); 235 if (scrollTop) { 236 window.addEventListener('scroll', function () { 237 scrollTop.classList.toggle('is-visible', window.scrollY > 300); 238 }); 239 scrollTop.addEventListener('click', function (e) { 240 e.preventDefault(); 241 window.scrollTo({ top: 0, behavior: 'smooth' }); 242 }); 243 } 244 })(); 245 document.addEventListener("DOMContentLoaded", function() { 246 setTimeout(() => { 247 document.documentElement.style.setProperty("--nav-slide-speed", ".3s"); 248 }, 100); 249 }); 250 </script>
250 251 252 <link rel="stylesheet" href="/css/style.css"> 253 254
254<script> 255 document.addEventListener('DOMContentLoaded', function () { 256 if (typeof GLightbox === 'function' && document.querySelector('.glightbox')) { 257 const galleryHistoryKey = 'cafeGoldeggGallery'; 258 const galleryHistoryIndexKey = 'cafeGoldeggGalleryIndex'; 259 let openingFromHistory = false; 260 let closingFromHistory = false; 261 const gallery = GLightbox({ 262 selector: '.glightbox', 263 touchNavigation: true, 264 loop: true 265 }); 266 267 function createGalleryHistoryState(index) { 268 const currentState = history.state && typeof history.state === 'object' ? history.state : {}; 269 return Object.assign({}, currentState, { 270 [galleryHistoryKey]: true, 271 [galleryHistoryIndexKey]: index 272 }); 273 } 274 275 gallery.on('open', function () { 276 if (openingFromHistory) { 277 openingFromHistory = false; 278 return; 279 } 280 history.pushState(createGalleryHistoryState(gallery.getActiveSlideIndex()), '', window.location.href); 281 }); 282 283 gallery.on('slide_changed', function () { 284 if (history.state && history.state[galleryHistoryKey]) { 285 history.replaceState(createGalleryHistoryState(gallery.getActiveSlideIndex()), '', window.location.href); 286 } 287 }); 288 289 gallery.on('close', function () { 290 if (closingFromHistory) { 291 closingFromHistory = false; 292 return; 293 } 294 if (history.state && history.state[galleryHistoryKey]) { 295 history.back(); 296 } 297 }); 298 299 window.addEventListener('popstate', function (event) { 300 const state = event.state; 301 if (state && state[galleryHistoryKey]) { 302 const index = Number.isInteger(state[galleryHistoryIndexKey]) ? state[galleryHistoryIndexKey] : 0; 303 if (gallery.lightboxOpen) { 304 gallery.goToSlide(index); 305 } else { 306 openingFromHistory = true; 307 gallery.openAt(index); 308 } 309 return; 310 } 311 if (gallery.lightboxOpen) { 312 closingFromHistory = true; 313 gallery.close(); 314 } 315 }); 316 317 if (history.state && history.state[galleryHistoryKey]) { 318 const index = Number.isInteger(history.state[galleryHistoryIndexKey]) ? history.state[galleryHistoryIndexKey] : 0; 319 openingFromHistory = true; 320 gallery.openAt(index); 321 } 322 } 323 324 if (!('IntersectionObserver' in window)) { 325 loadAllLazyElements(); 326 return; 327 } 328 329 var lazyObserver = new IntersectionObserver(function (entries, observer) { 330 entries.forEach(function (entry) { 331 if (entry.isIntersecting) { 332 loadElement(entry.target); 333 observer.unobserve(entry.target); 334 } 335 }); 336 }, { 337 rootMargin: '200px 0px' 338 }); 339 340 document.querySelectorAll('img[data-src], iframe[data-src]').forEach(function (el) { 341 lazyObserver.observe(el); 342 }); 343 344 function loadElement(el) { 345 var src = el.getAttribute('data-src'); 346 if (!src) return; 347 348 if (el.tagName === 'IMG') { 349 el.addEventListener('load', function () { 350 el.classList.add('is-loaded'); 351 }); 352 el.src = src; 353 if (el.complete) { 354 el.classList.add('is-loaded'); 355 } 356 } else if (el.id === 'reservationWidget') { 357 el.src = src; 358 loadReservationWidget(); 359 } else { 360 el.src = src; 361 } 362 } 363 364 function loadAllLazyElements() { 365 document.querySelectorAll('img[data-src], iframe[data-src]').forEach(function (el) { 366 loadElement(el); 367 }); 368 } 369 370 function loadReservationWidget() { 371 window._hors = [ 372 ['eid','hydra-0011i000002kSQ2AAM'], 373 ['tagid','hors-hydra-0011i000002kSQ2AAM'], 374 ['width','100%'], 375 ['height',''], 376 ['foregroundColor',''], 377 ['backgroundColor',''], 378 ['linkColor','#c0a062'], 379 ['errorColor',''], 380 ['primaryButtonForegroundColor','#1a1a1a'],
381 ['primaryButtonBackgroundColor','#c0a062'], 382 ['secondaryButtonForegroundColor','#1a1a1a'], 383 ['secondaryButtonBackgroundColor','#c0a062'] 384 ]; 385 var s = document.createElement('script'); 386 s.src = 'https://reservation.dish.co/widget.js'; 387 s.async = true; 388 document.body.appendChild(s); 389 } 390 }); 391 </script>
391 392</body> 393</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.