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 7 <title>Kelowna Cake Shop | O-Lake Cafe & Bistro | Mille Crepe Cakes</title> 8 <meta name="description" content="O-Lake Cafe & Bistro in Kelowna. Handcrafted mille crepe cakes, artisan coffee, high tea and private dining. The best cake shop in Kelowna for artisan desserts."> 9 <meta name="keywords" content="crepe cake, cake shop Kelowna, bakery, private dining, O-Lake, kelowna cake shop, high tea, bistro Kelowna"> 10 <link rel="canonical" href="https://www.olakecafe.com/"> 11 12
12<script type="application/ld+json"> 13 { 14 "@context": "https://schema.org", 15 "@type": "Bakery", 16 "name": "O-Lake Cafe & Bistro", 17 "image": "https://www.olakecafe.com/pic/top-front-pg.png", 18 "address": { 19 "@type": "PostalAddress", 20 "streetAddress": "375 Lawrence Ave", 21 "addressLocality": "Kelowna", 22 "addressRegion": "BC", 23 "postalCode": "V1Y 9W5", 24 "addressCountry": "CA" 25 }, 26 "geo": { 27 "@type": "GeoCoordinates", 28 "latitude": 49.8863, 29 "longitude": -119.4966 30 }, 31 "url": "https://www.olakecafe.com", 32 "telephone": "+12505026666", 33 "priceRange": "$$" 34 } 35 </script>
35 36 37 <link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:wght@500;600&family=Inter:wght@300;400&display=swap" rel="stylesheet"> 38 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css"> 39 40 <style> 41 :root { 42 --bg-color: #f7f4fb; 43 --text-main: #2c2c2c; 44 --accent-soft: #e8e8e8; 45 --serif: 'Cormorant Garamond', serif; 46 --sans: 'Inter', sans-serif; 47 } 48 49 * { margin:0; padding:0; box-sizing:border-box; } 50 51 body { 52 font-family: var(--sans); 53 background: var(--bg-color); 54 color: var(--text-main); 55 line-height:1.6; 56 overflow-x:hidden; 57 } 58 59 /* HEADER */ 60 header { 61 position: fixed; 62 top: 0; 63 width: 100%; 64 background: rgba(255, 255, 255, 0.95); 65 backdrop-filter: blur(8px); 66 display: flex; 67 justify-content: space-between; 68 align-items: center; 69 padding: 15px 20px; 70 z-index: 1000; 71 box-shadow: 0 2px 10px rgba(0,0,0,0.05); 72 } 73 74 .logo { 75 font-family: var(--serif); 76 font-size: 1.2rem; 77 font-weight: 600; 78 color: var(--text-main); 79 text-decoration: none; 80 z-index: 1001; 81 } 82 83 /* MOBILE MENU TOGGLE */ 84 .menu-toggle { 85 display: none; 86 font-size: 1.5rem; 87 cursor: pointer; 88 color: var(--text-main); 89 z-index: 1001; 90 } 91 92 nav a { 93 margin-left: 12px; 94 text-transform: uppercase; 95 font-size: 0.7rem; 96 font-weight: 600; 97 letter-spacing: 1px; 98 text-decoration: none; 99 color: inherit; 100 transition: 0.3s; 101 } 102 103 nav a:hover { color: #888; } 104 105 @media (min-width: 769px) { 106 header { padding: 20px 50px; } 107 .logo { font-size: 1.6rem; } 108 nav a { font-size: 0.75rem; margin-left: 30px; } 109 } 110 111 @media (max-width: 768px) { 112 .menu-toggle { display: block; } 113 nav { 114 display: none; 115 position: absolute; 116 top: 0; 117 left: 0; 118 width: 100%; 119 height: 100vh; 120 background: white; 121 flex-direction: column; 122 justify-content: center; 123 align-items: center; 124 z-index: 1000; 125 } 126 nav.active { display: flex; } 127 nav a { margin: 20px 0; font-size: 1.2rem; margin-left: 0; } 128 } 129 130 /* HERO */ 131 #hero { 132 width:100%; 133 min-height:80vh; 134 display:flex; 135 align-items:center; 136 justify-content:center; 137 text-align:center; 138 padding: 120px 20px 60px; 139 background: linear-gradient(rgba(255,255,255,0.35), rgba(255,255,255,0.35)), url("./pic/top-front-pg.png"); 140 background-size:cover; 141 background-position:center; 142 } 143 144 .hero-content h1 { font-family:var(--serif); font-size: 2.5rem; line-height: 1.1; margin-bottom:15px; } 145 .btn { display:block; margin: 15px auto 0; width: 100%; max-width: 250px; padding:16px 35px; background:#2c2c2c; color:#fff; text-decoration:none; font-size:0.9rem; transition: 0.3s; border-radius: 4px; } 146 .btn:hover { background: #000; } 147 .btn-outline { background:transparent; border:1px solid #2c2c2c; color:#2c2c2c; } 148 .btn-outline:hover { background: #2c2c2c; color: #fff; } 149 150 /* CATEGORY MENU */ 151 .category-menu { 152 display: flex; 153 justify-content: center; 154 gap: 20px; 155 margin-bottom: 30px; 156 border-bottom: 1px solid var(--accent-soft); 157 padding-bottom: 15px; 158 flex-wrap: wrap; 159 } 160 161 .category-btn { 162 background: none; 163 border: none; 164 font-family: var(--sans); 165 font-size: 0.75rem; 166 font-weight: 400; 167 text-transform: uppercase; 168 letter-spacing: 2px; 169 cursor: pointer; 170 color: #888; 171 padding: 10px 5px; 172 position: relative; 173 transition: 0.3s;
174 } 175 176 .category-btn:hover { color: var(--text-main); } 177 .category-btn.active { color: var(--text-main); font-weight: 600; } 178 .category-btn.active::after { 179 content: ''; 180 position: absolute; 181 bottom: -16px; 182 left: 0; 183 width: 100%; 184 height: 2px; 185 background: var(--text-main); 186 } 187 188 /* SLIDER CONTAINER */ 189 .slider-wrapper { 190 position: relative; 191 max-width: 1550px; 192 margin: 0 auto; 193 overflow: hidden; 194 padding: 20px 70px; 195 } 196 197 .slider-container { 198 display: flex; 199 transition: transform 0.5s ease-in-out; 200 gap: 18px; 201 } 202 203 .slider-item { 204 flex: 0 0 calc(20% - 15px); 205 aspect-ratio: 1 / 1; 206 overflow: hidden; 207 cursor: pointer; 208 border-radius: 6px; 209 background: #eee; 210 box-shadow: 0 4px 15px rgba(0,0,0,0.05); 211 } 212 213 .slider-item img { 214 width: 100%; 215 height: 100%; 216 object-fit: cover; 217 display: block; 218 transition: transform 0.4s ease; 219 } 220 221 .slider-item:hover img { transform: scale(1.08); } 222 223 .slider-nav { 224 position: absolute; 225 top: 50%; 226 left: 0; 227 width: 100%; 228 display: flex; 229 justify-content: space-between; 230 transform: translateY(-50%); 231 pointer-events: none; 232 z-index: 10; 233 } 234 235 .nav-btn { 236 width: 45px; 237 height: 45px; 238 background: #fff; 239 border: 1px solid #eee; 240 border-radius: 50%; 241 cursor: pointer; 242 pointer-events: auto; 243 display: flex; 244 align-items: center; 245 justify-content: center; 246 box-shadow: 0 4px 10px rgba(0,0,0,0.1); 247 transition: 0.3s; 248 margin: 0 15px; 249 } 250 251 .nav-btn:hover { 252 background: var(--text-main); 253 color: #fff; 254 transform: scale(1.1); 255 } 256 257 /* LIGHTBOX */ 258 #lightbox { display: none; position: fixed; z-index: 2000; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.92); justify-content: center; align-items: center; cursor: zoom-out; } 259 #lightbox img { max-width: 90%; max-height: 85vh; border-radius: 4px; animation: zoomIn 0.3s ease; } 260 @keyframes zoomIn { from { transform: scale(0.9); opacity: 0; } to { transform: scale(1); opacity: 1; } } 261 .close-btn { position: absolute; top: 20px; right: 30px; color: white; font-size: 40px; cursor: pointer; } 262 263 /* SECTIONS */ 264 section { padding: 80px 0; } 265 .container-85 { width: 95%; max-width: 1700px; margin: 0 auto; } 266 .container { max-width:1100px; margin:0 auto; padding: 0 20px; } 267 .section-title { text-align:center; font-family:var(--serif); font-size: 2.2rem; margin-bottom: 30px; } 268 269 /* CONTACT */ 270 #contact { background: #f4fbfe; } 271 .contact-container { display:flex; flex-direction: row; gap:60px; align-items: flex-start; } 272 .contact-info { flex: 1; } 273 .contact-form { flex: 1.5; } 274 .info-group { margin-bottom: 30px; } 275 .info-group h4 { font-family: var(--serif); font-size: 1.4rem; margin-bottom: 12px; border-bottom: 1px solid #ddd; display: inline-block; } 276 .hours-list { list-style: none; margin-top: 5px; } 277 .hours-list li { display: flex; justify-content: space-between; max-width: 300px; margin-bottom: 8px; font-size: 1rem; } 278 .social-links { margin-top: 25px; display: flex; gap: 25px; } 279 .social-links a { font-size: 1.8rem; color: var(--text-main); transition: 0.3s; } 280 .form-row { display: flex; gap: 15px; margin-bottom: 5px; } 281 input, textarea { width:100%; padding:16px; margin-bottom:15px; border:1px solid #e8e8e8; border-radius: 4px; font-family: var(--sans); } 282 .submit-btn { width:100%; padding:16px; background:#2c2c2c; color:#fff; border:none; border-radius: 4px; cursor:pointer; font-weight: 600; transition: 0.3s; } 283 .submit-btn:hover { background: #000; } 284 #result { display: none; margin-top: 20px; padding: 15px; background: #e3f3f9; border-radius: 4px; text-align: center; } 285 286 footer { text-align:center; padding:60px 20px; border-top:1px solid #e8e8e8; } 287 .footer-logo { font-family:var(--serif); font-size:1.8rem; margin-bottom:10px; } 288 289 @media (max-width: 992px) { 290 .contact-container { flex-direction: column; gap: 40px; } 291 .form-row { flex-direction: column; gap: 0; } 292 } 293 294 @media (max-width: 768px) { 295 .slider-wrapper { padding: 0 40px; }
296 .slider-item { flex: 0 0 calc(50% - 10px); } 297 .category-menu { gap: 10px; } 298 } 299 </style> 300</head> 301 302<body> 303 304<header> 305 <a href="index.html" class="logo">O-Lake Cafe & Bistro</a> 306 307 <div class="menu-toggle" id="mobile-menu-btn"> 308 <i class="fas fa-bars"></i> 309 </div> 310 311 <nav id="nav-menu"> 312 <a href="story.html">Our Story</a> 313 <a href="#gallery">Gallery</a> 314 <a href="private.html">Reservation</a> 315 <a href="https://www.clover.com/online-ordering/olake-cafebistro-kelowna/" target="_blank">Online Ordering</a> 316 <a href="https://o-lake-cafe-bistro.myshopify.com/" target="_blank">Online Shop</a> 317 <a href="#contact">Contact</a> 318 </nav> 319</header> 320 321<main> 322 <section id="hero"> 323 <div class="hero-content"> 324 <h1>Elegant High Tea & Handcrafted Cakes at O-Lake Kelowna</h1> 325 <p>Indulge in handcrafted desserts, fine teas, and unforgettable moments.</p> 326 <div class="hero-btns"> 327 <a href="https://shop.olakecafe.com" class="btn" target="_blank">Online Shop</a> 328 <a href="private.html" class="btn btn-outline">Reservation</a> 329 </div> 330 </div> 331 </section> 332 333 <section id="gallery" style="background: #e2eff7;"> 334 <div class="container-85"> 335 <h2 class="section-title">Our Kelowna Cake Collection</h2> 336 337 <div class="category-menu"> 338 <button class="category-btn active" onclick="filterGallery('Special', this)">Special</button> 339 <button class="category-btn" onclick="filterGallery('Festival', this)">Festival</button> 340 <button class="category-btn" onclick="filterGallery('Fruit', this)">Fruit</button> 341 <button class="category-btn" onclick="filterGallery('Chinese', this)">Chinese</button> 342 </div> 343 344 <div class="slider-wrapper"> 345 <div class="slider-container" id="gallery-container"></div> 346 <div class="slider-nav"> 347 <button class="nav-btn" onclick="moveSlider(-1)"><i class="fas fa-chevron-left"></i></button> 348 <button class="nav-btn" onclick="moveSlider(1)"><i class="fas fa-chevron-right"></i></button> 349 </div> 350 </div> 351 </div> 352 </section> 353 354 <section id="contact"> 355 <div class="container"> 356 <h2 class="section-title">Visit Us in Kelowna</h2> 357 <div class="contact-container"> 358 <div class="contact-info"> 359 <div class="info-group"> 360 <h4>Location</h4> 361 <address style="font-style: normal; margin-top: 10px;"> 362 <p>375 Lawrence Ave, Kelowna, BC V1Y 9W5</p> 363 <p><strong>Tel:</strong> <a href="tel:+12505026666" style="text-decoration: none; color: inherit;">+1 250-502-6666</a></p> 364 </address> 365 </div> 366 367 <div class="info-group"> 368 <h4>Opening Hours</h4> 369 <ul class="hours-list"> 370 <li><span>Mon - Sat:</span> <span>10:00 AM â 5:00 PM</span></li> 371 <li><span>Sun:</span> <span>11:00 AM â 4:00 PM</span></li> 372 </ul> 373 </div> 374 375 <div class="social-links"> 376 <a href="https://www.facebook.com/p/O-Lake-Cafe-and-Bistro-61550093820668/" target="_blank"><i class="fab fa-facebook-f"></i></a> 377 <a href="https://www.instagram.com/o_lakecafe/" target="_blank"><i class="fab fa-instagram"></i></a> 378 </div> 379 </div> 380 381 <div class="contact-form"> 382 <form id="contact-form"> 383 <input type="hidden" name="access_key" value="2026487c-20ed-4622-9523-ab0aff874ca5"> 384 <input type="hidden" name="from_name" value="O-lake inquiry"> 385 <input type="hidden" name="subject" value="General inquiry - O-Lake Bistro"> 386 <div class="form-row"> 387 <input type="text" name="name" placeholder="Your Name" required> 388 <input type="email" name="email" placeholder="Your Email" required> 389 </div> 390 <textarea name="message" rows="5" placeholder="Message" required></textarea> 391 <button type="submit" class="submit-btn">Send Message</button> 392 </form> 393 <div id="result"></div> 394 </div> 395 </div> 396 </div> 397 </section> 398</main> 399 400<div id="lightbox" onclick="closeLightbox()" aria-hidden="true"> 401 <span class="close-btn">×</span> 402 <img id="lightbox-img" src="" alt="Enlarged Cake View"> 403</div> 404 405<footer> 406 <div class="footer-logo">O-Lake Cafe & Bistro</div> 407 <p>© 2026 All rights reserved.</p> 408</footer> 409
410<script> 411 // --- NAVIGATION LOGIC --- 412 const menuBtn = document.getElementById('mobile-menu-btn'); 413 const navMenu = document.getElementById('nav-menu'); 414 415 menuBtn.addEventListener('click', () => { 416 navMenu.classList.toggle('active'); 417 const icon = menuBtn.querySelector('i'); 418 icon.classList.toggle('fa-bars'); 419 icon.classList.toggle('fa-times'); 420 }); 421 422 document.querySelectorAll('#nav-menu a').forEach(link => { 423 link.addEventListener('click', () => { 424 navMenu.classList.remove('active'); 425 const icon = menuBtn.querySelector('i'); 426 icon.classList.add('fa-bars'); 427 icon.classList.remove('fa-times'); 428 }); 429 }); 430 431 // --- GALLERY LOGIC --- 432 let currentSlide = 0; 433 const cakeData = { 434 "Special": ["./cakepic/Special/cake1.png", "./cakepic/Special/cake2.png", "./cakepic/Special/cake3.png", "./cakepic/Special/cake4.png", "./cakepic/Special/cake5.png", "./cakepic/Special/cake6.png", "./cakepic/Special/cake7.png", "./cakepic/Special/cake8.png", "./cakepic/Special/cake9.png", "./cakepic/Special/cake10.png", "./cakepic/Special/cake11.png", "./cakepic/Special/cake12.png", "./cakepic/Special/cake13.png", "./cakepic/Special/cake14.png", "./cakepic/Special/cake15.png", "./cakepic/Special/cake16.png"], 435 "Festival": ["./cakepic/Festival/cake1.png", "./cakepic/Festival/cake2.png", "./cakepic/Festival/cake3.png", "./cakepic/Festival/cake4.png", "./cakepic/Festival/cake5.png", "./cakepic/Festival/cake6.png"], 436 "Fruit": ["./cakepic/Fruit/cake1.png", "./cakepic/Fruit/cake2.png", "./cakepic/Fruit/cake3.png", "./cakepic/Fruit/cake4.png"], 437 "Chinese": ["./cakepic/Chinese/cake1.png", "./cakepic/Chinese/cake2.png", "./cakepic/Chinese/cake3.png"] 438 }; 439 440 const galleryContainer = document.getElementById('gallery-container'); 441 442 function filterGallery(category, btnElement) { 443 document.querySelectorAll('.category-btn').forEach(btn => btn.classList.remove('active')); 444 if (btnElement) btnElement.classList.add('active'); 445 446 galleryContainer.innerHTML = ''; 447 currentSlide = 0; 448 galleryContainer.style.transform = `translateX(0)`; 449 450 const photos = cakeData[category] || []; 451 photos.forEach(path => { 452 const item = document.createElement('div'); 453 item.className = 'slider-item'; 454 item.onclick = function() { openLightbox(path); }; 455 const img = document.createElement('img'); 456 img.src = path; 457 // Added Kelowna to image alt text for better SEO context 458 img.alt = "Kelowna " + category + " Cake"; 459 item.appendChild(img); 460 galleryContainer.appendChild(item); 461 }); 462 } 463 464 function moveSlider(direction) { 465 const items = document.querySelectorAll('.slider-item'); 466 if (items.length === 0) return; 467 const itemsToShow = window.innerWidth > 768 ? 5 : 2; 468 const maxSlides = Math.max(0, items.length - itemsToShow); 469 470 currentSlide += direction; 471 if (currentSlide < 0) currentSlide = 0; 472 if (currentSlide > maxSlides) currentSlide = maxSlides; 473 474 const gap = 18; 475 const itemWidth = items[0].offsetWidth; 476 galleryContainer.style.transform = `translateX(-${currentSlide * (itemWidth + gap)}px)`; 477 } 478 479 window.onload = () => filterGallery('Special', document.querySelector('.category-btn')); 480 481 const lightbox = document.getElementById('lightbox'); 482 const lightboxImg = document.getElementById('lightbox-img'); 483 function openLightbox(src) { lightboxImg.src = src; lightbox.style.display = 'flex'; document.body.style.overflow = 'hidden'; } 484 function closeLightbox() { lightbox.style.display = 'none'; document.body.style.overflow = 'auto'; } 485 486 // FORM SUBMISSION 487 const form = document.getElementById('contact-form'); 488 const result = document.getElementById('result'); 489 490 form.addEventListener('submit', function(e) { 491 e.preventDefault(); 492 const formData = new FormData(form); 493 const object = Object.fromEntries(formData); 494 const json = JSON.stringify(object); 495 496 result.innerHTML = "Sending..."; 497 result.style.display = "block"; 498 499 fetch('https://api.web3forms.com/submit', { 500 method: 'POST', 501 headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' }, 502 body: json 503 }) 504 .then(async (response) => { 505 let json = await response.json(); 506 if (response.status == 200) { 507 result.innerHTML = "Message sent successfully!"; 508 form.reset(); 509 } else { 510 result.innerHTML = json.message || "Something went wrong."; 511 } 512 }) 513 .catch(error =>
513 { result.innerHTML = "Error connecting to service."; }) 514 .then(function() { 515 setTimeout(() => { result.style.display = "none"; }, 5000); 516 }); 517 }); 518</script>
518 519
520<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"4b19e64b548b44b287498a3ddfd66d00","r":1,"spa":2}' crossorigin="anonymous"></script>
520 521</body> 522</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.