PageSourceSearch

https://www.cafegoldegg.at/unsere-karte

html cafegoldegg.at collected 2026-09-24 22:29:38 UTC 14,444 bytes, 393 lines download raw bytes

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&hellip;</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>&copy; 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.