1<!DOCTYPE html> 2<html lang="pl"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <title>Galeria â Pod Nożyczkami Salon Fryzjerski MÄski - ÅaÅcut</title> 7 <meta name="description" content="Galeria zdjÄÄ salonu fryzjerskiego mÄskiego Pod Nożyczkami w ÅaÅcucie â wnÄtrze, stanowiska i atmosfera salonu."> 8 <meta name="robots" content="index, follow"> 9 <link rel="canonical" href="https://podnozyczkami.pl/galeria.html"> 10 <meta property="og:title" content="Galeria â Pod Nożyczkami Salon Fryzjerski MÄski - ÅaÅcut"> 11 <meta property="og:description" content="Zobacz wnÄtrze salonu fryzjerskiego mÄskiego Pod Nożyczkami w ÅaÅcucie."> 12 <meta property="og:type" content="website"> 13 <meta property="og:url" content="https://podnozyczkami.pl/galeria.html"> 14 <meta property="og:site_name" content="Pod Nożyczkami"> 15 <meta property="og:image" content="https://podnozyczkami.pl/assets/og-image.jpg"> 16 <meta property="og:locale" content="pl_PL"> 17 <link rel="icon" href="/favicon.ico" sizes="any"> 18 <link rel="icon" type="image/png" sizes="96x96" href="/favicon.png?v=3"> 19 <link rel="apple-touch-icon" href="/apple-touch-icon.png"> 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=Montserrat:wght@400;500;600;700;800&family=Inter:wght@300;400;500;600&family=Dancing+Script:wght@600;700&family=Cormorant+Garamond:ital,wght@0,500;0,600;1,500&display=swap" rel="stylesheet"> 23 <link rel="stylesheet" href="style.css?v=14"> 24
24<script src="config.js?v=12"></script>
24 25</head> 26<body> 27 28 <!-- NAGÅÃWEK --> 29 <header class="header scrolled"> 30 <div class="container header-inner"> 31 <a aria-label='Pod Nożyczkami â strona gÅówna' class='brand' href='/'> 32 <img class="brand-mark" src="assets/logo-header.png" alt="Pod Nożyczkami" width="202" height="200"> 33 <span class="brand-tagline"><strong>Salon Fryzjerski MÄski</strong><small>ÅaÅcut</small></span> 34 </a> 35 <nav class="nav-links" aria-label="Nawigacja"> 36 <a class='nav-back' href='/'>â Strona gÅówna</a> 37 </nav> 38 </div> 39 </header> 40 41 <main> 42 <section class="section gallery-page-section"> 43 <div class="container"> 44 <span class="eyebrow">Zajrzyj do nas</span> 45 <h1 class="section-title">Galeria</h1> 46 <div class="title-rule"></div> 47 <div id="galleryGrid" class="gallery-grid"> 48 <p class="gallery-loading">Wczytywanie zdjÄÄâ¦</p> 49 </div> 50 </div> 51 </section> 52 </main> 53 54 <!-- LIGHTBOX --> 55 <div id="lightbox" class="lightbox hidden" role="dialog" aria-modal="true" aria-label="PowiÄkszone zdjÄcie"> 56 <button class="lb-close" onclick="closeLightbox()" aria-label="Zamknij">â</button> 57 <button class="lb-prev" onclick="lbMove(-1)" aria-label="Poprzednie">‹</button> 58 <img id="lbImg" class="lb-img" alt=""> 59 <button class="lb-next" onclick="lbMove(1)" aria-label="NastÄpne">›</button> 60 </div> 61 62 <!-- STOPKA --> 63 <footer class="footer"> 64 <div class="container footer-bottom"> 65 <p>© <span id="yr"></span> Pod Nożyczkami · Justyna Drozd · ÅaÅcut</p> 66 </div> 67 </footer> 68 69
69<script> 70 document.getElementById("yr").textContent = new Date().getFullYear(); 71 72 let _items = [], _lbIdx = 0; 73 74 async function loadGallery() { 75 const grid = document.getElementById("galleryGrid"); 76 try { 77 const res = await fetch("/.netlify/functions/gallery"); 78 if (!res.ok) throw new Error(); 79 const files = await res.json(); 80 _items = files.map(f => ({ 81 file: f, 82 alt: decodeURIComponent(f.split("/").pop().replace(/\.[^.]+$/, "").replace(/[-_]/g, " ")) 83 })); 84 } catch { 85 _items = (typeof CONFIG !== "undefined" && Array.isArray(CONFIG.gallery)) ? CONFIG.gallery : []; 86 } 87 88 if (_items.length === 0) { 89 grid.innerHTML = '<p class="gallery-empty">ZdjÄcia wkrótce â obserwuj nas na Facebook.</p>'; 90 return; 91 } 92 93 grid.innerHTML = _items.map((item, i) => 94 `<button class="gallery-item" onclick="openLightbox(${i})" aria-label="${escH(item.alt || 'ZdjÄcie ' + (i + 1))}"> 95 <img class="gallery-img" src="${escH(item.file)}" alt="${escH(item.alt || '')}" loading="lazy"> 96 </button>` 97 ).join(""); 98 } 99 100 function openLightbox(idx) { 101 _lbIdx = idx; 102 const img = document.getElementById("lbImg"); 103 if (img) { img.src = _items[idx].file; img.alt = _items[idx].alt || ""; } 104 document.getElementById("lightbox").classList.remove("hidden"); 105 document.body.style.overflow = "hidden"; 106 } 107 108 function closeLightbox() { 109 document.getElementById("lightbox").classList.add("hidden"); 110 document.body.style.overflow = ""; 111 } 112 113 function lbMove(dir) { 114 _lbIdx = (_lbIdx + dir + _items.length) % _items.length; 115 openLightbox(_lbIdx); 116 } 117 118 function escH(s) { 119 return String(s).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,"""); 120 } 121 122 document.addEventListener("keydown", (e) => { 123 const lb = document.getElementById("lightbox"); 124 if (!lb || lb.classList.contains("hidden")) return; 125 if (e.key === "ArrowLeft") lbMove(-1); 126 if (e.key === "ArrowRight") lbMove(1); 127 if (e.key === "Escape") closeLightbox(); 128 }); 129 130 document.addEventListener("DOMContentLoaded", loadGallery); 131 </script>
131 132</body> 133</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.