1<!DOCTYPE html> 2<html lang="en" dir="ltr"> 3<head> 4 <meta charset="UTF-8"> 5<meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 7 8 9<title>About Us | Zucchini Bread Recipes</title> 10 11 12 13 14 15 16 17 18 19 20 21 22<meta name="description" content="Learn about our mission, team, and passion for cooking."> 23 24 25<!-- Favicon - Dynamic from admin --> 26 27<link rel="icon" type="image/svg+xml" href="/public/images/favicon.svg"> 28<link rel="apple-touch-icon" href="/public/images/apple-touch-icon.png"> 29 30 31<!-- Open Graph --> 32<meta property="og:title" content="About Us | Zucchini Bread Recipes"> 33<meta property="og:description" content="Learn about our mission, team, and passion for cooking."> 34<meta property="og:type" content="website"> 35<meta property="og:site_name" content="Zucchini Bread Recipes"> 36<meta property="og:locale" content="en_US"> 37 38 39<meta property="og:url" content="https://zucchinibreadrecipes.org/about"> 40 41<!-- Twitter Card --> 42<meta name="twitter:card" content="summary_large_image"> 43<meta name="twitter:title" content="About Us | Zucchini Bread Recipes"> 44<meta name="twitter:description" content="Learn about our mission, team, and passion for cooking."> 45 46 47<!-- Canonical URL --> 48<link rel="canonical" href="https://zucchinibreadrecipes.org/about"> 49 50<!-- Pagination: rel next/prev --> 51 52 53<!-- Tailwind CSS (compiled) --> 54<link rel="stylesheet" href="/public/css/styles.css"> 55 56<!-- Ad Container Styles (rendered once per page) --> 57<style> 58 .ad-container { 59 overflow: visible; 60 box-sizing: border-box; 61 display: block; 62 width: 100%; 63 text-align: center; 64 } 65 .ad-container > * { 66 max-width: 100%; 67 } 68 .ad-container ins, 69 .ad-container iframe, 70 .ad-container img { 71 max-width: 100%; 72 height: auto; 73 } 74 .ad-container ins.adsbygoogle { 75 display: block !important; 76 min-width: 300px; 77 margin: 0 auto; 78 } 79 /* Reserve vertical space to reduce CLS while AdSense loads */ 80 .ad-container[data-lazy-load="true"] { 81 min-height: 250px; 82 } 83 .ad-home-hero { 84 min-height: 250px !important; 85 background: linear-gradient(to right, #f8f9fa, #e9ecef); 86 border-radius: 8px; 87 padding: 16px; 88 } 89 .ad-home-hero ins.adsbygoogle { 90 min-height: 200px; 91 } 92 .ad-home-before-categories { 93 min-height: 150px !important; 94 } 95 @media (max-width: 640px) { 96 .ad-container ins.adsbygoogle { 97 min-width: 250px; 98 } 99 .ad-container[data-lazy-load="true"] { 100 min-height: 200px; 101 } 102 } 103</style> 104 105<!-- Google Fonts --> 106<link rel="preconnect" href="https://fonts.googleapis.com"> 107<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 108<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Poppins:wght@600;700&display=swap&subset=latin" rel="stylesheet"> 109 110<!-- HTMX -->
111<script src="https://unpkg.com/[email protected]" defer></script>
111 112 113<!-- Alpine.js -->
114<script defer src="https://cdn.jsdelivr.net/npm/[email protected]/dist/cdn.min.js"></script>
114 115 116 117 118 119 120 121 122<!-- Custom Header Code -->
123<script src="https://d3u598arehftfk.cloudfront.net/prebid_hb_15746_32638.js" async> </script>
123 124<meta name="p:domain_verify" content="b3b0adba95a06be8e940edd656ed2fca"/> 125<!-- Google tag (gtag.js) -->
vendor: 64 bytes, lines 125-126
125 126<script async src="https://www.googletagmanager.com/gtag/js?id=
126G-37Y5JGV2BW
vendor: 12 bytes, line 126
126"></script>
127<script> 128
vendor: 134 bytes, lines 128-132
128window.dataLayer = window.dataLayer || []; 129 function gtag(){dataLayer.push(arguments);} 130 gtag('js', new Date()); 131 132 gtag('config', '
132G-37Y5JGV2BW
vendor: 4 bytes, line 132
132');
133</script>
133 134 135 136 137<!-- RSS/Atom Feed Discovery --> 138<link rel="alternate" type="application/rss+xml" title="Zucchini Bread Recipes - Recipes" href="https://zucchinibreadrecipes.org/rss.xml"> 139<link rel="alternate" type="application/rss+xml" title="Zucchini Bread Recipes - Articles" href="https://zucchinibreadrecipes.org/feed.xml"> 140<link rel="alternate" type="application/atom+xml" title="Zucchini Bread Recipes - Atom" href="https://zucchinibreadrecipes.org/atom.xml"> 141 142<!-- Organization JSON-LD (site-wide identity) -->
143<script type="application/ld+json"> 144{"@context":"https://schema.org","@type":"Organization","name":"Zucchini Bread Recipes","url":"https://zucchinibreadrecipes.org","description":"Discover irresistible zucchini bread recipes with step-by-step guides. From classic loaves to creative twists, satisfy your cravings and bake moist, perfect bread every time.","contactPoint":{"@type":"ContactPoint","email":"[email protected]","contactType":"customer service"},"sameAs":["https://www.pinterest.com/loulitafranjer/"]} 145</script>
145 146 147<!-- WebSite JSON-LD with SearchAction -->
148<script type="application/ld+json"> 149{"@context":"https://schema.org","@type":"WebSite","name":"Zucchini Bread Recipes","url":"https://zucchinibreadrecipes.org","potentialAction":{"@type":"SearchAction","target":"https://zucchinibreadrecipes.org/search?q={search_term_string}","query-input":"required name=search_term_string"}} 150</script>
150 151 152 153 154 <style> 155 .breadcrumb__item:not(:last-child)::after { 156 content: '>>'; 157 padding: 0 0.5rem; 158 } 159 .line-clamp-3 { 160 display: -webkit-box; 161 -webkit-line-clamp: 3; 162 line-clamp: 3; 163 -webkit-box-orient: vertical; 164 overflow: hidden; 165 } 166</style> 167
167<script type="application/ld+json"> 168{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://zucchinibreadrecipes.org/"},{"@type":"ListItem","position":2,"name":"About Us"}]} 169</script>
169 170 171</head> 172<body class="min-h-screen bg-white text-gray-900 flex flex-col"> 173 174 175 176 177 178 <!-- Giveaway Marquee --> 179 180 181 <!-- Header --> 182 <!-- Body Scripts (GTM noscript + custom body code) --> 183 184 185 186 187 188<!-- Header matching original Next.js design --> 189<style>[x-cloak] { display: none !important; }</style> 190<header x-data="{ mobileMenuOpen: false }" class="relative bg-white border-b border-gray-200 box-border w-full"> 191 <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> 192 <nav class="flex items-center justify-between py-4"> 193 194 <!-- Desktop Navigation - Left side --> 195 <ul class="items-center hidden lg:flex gap-x-8 ml-4"> 196 197 198 199 <li> 200 <a href="/" title="Home" class="relative text-gray-700 font-bold text-sm uppercase tracking-wide transition-all duration-300 hover:text-orange-700 hover:scale-105" > 201 HOME 202 </a> 203 </li> 204 205 <li> 206 <a href="/recipes" title="Recipes" class="relative text-gray-700 font-bold text-sm uppercase tracking-wide transition-all duration-300 hover:text-orange-700 hover:scale-105" > 207 RECIPES 208 </a> 209 </li> 210 211 <li> 212 <a href="/categories" title="Categories" class="relative text-gray-700 font-bold text-sm uppercase tracking-wide transition-all duration-300 hover:text-orange-700 hover:scale-105" > 213 CATEGORIES 214 </a> 215 </li> 216 217 <li> 218 <a href="/articles" title="Articles" class="relative text-gray-700 font-bold text-sm uppercase tracking-wide transition-all duration-300 hover:text-orange-700 hover:scale-105" > 219 ARTICLES 220 </a> 221 </li> 222 223 <li> 224 <a href="/about" title="About" class="relative text-gray-700 font-bold text-sm uppercase tracking-wide transition-all duration-300 hover:text-orange-700 hover:scale-105" > 225 ABOUT 226 </a> 227 </li> 228 229 <li> 230 <a href="/contact" title="Contact" class="relative text-gray-700 font-bold text-sm uppercase tracking-wide transition-all duration-300 hover:text-orange-700 hover:scale-105" > 231 CONTACT 232 </a> 233 </li> 234 235 236 </ul> 237 238 <!-- Logo - Dynamic from admin settings --> 239 <a href="/" title="Zucchini Bread Recipes" class="flex items-center flex-shrink-0 mr-4 gap-3"> 240 241 <div class="flex flex-col items-start"> 242 <span class="font-serif text-xl sm:text-2xl lg:text-3xl font-bold text-gray-900 leading-none"> 243 Bread & Zest 244 </span> 245 246 <span class="text-xs text-gray-500 mt-0.5">Where Every Zucchini Gets Its Zest</span> 247 248 </div> 249 </a> 250 251 <!-- Mobile Navigation Button --> 252 <button 253 @click="mobileMenuOpen = !mobileMenuOpen" 254 class="lg:hidden p-2 rounded-lg hover:bg-gray-100 transition-colors" 255 aria-label="Toggle menu" 256 > 257 <svg class="h-6 w-6 text-gray-700" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"> 258 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" /> 259 </svg> 260 </button> 261 </nav> 262 </div> 263 264 <!-- Mobile Navigation Menu --> 265 <div 266 x-cloak 267 x-show="mobileMenuOpen" 268 @click.away="mobileMenuOpen = false" 269 x-transition:enter="transition ease-out duration-200" 270 x-transition:enter-start="opacity-0 -translate-y-1" 271 x-transition:enter-end="opacity-100 translate-y-0" 272 x-transition:leave="transition ease-in duration-150" 273 x-transition:leave-start="opacity-100 translate-y-0" 274 x-transition:leave-end="opacity-0 -translate-y-1" 275 class="lg:hidden border-t border-gray-200 bg-white" 276 > 277 <div class="px-4 py-4 space-y-3"> 278 279 280 <a href="/" class="block text-gray-700 font-bold text-sm uppercase tracking-wide hover:text-orange-700 py-2" >Home</a> 281 282 <a href="/recipes" class="block text-gray-700 font-bold text-sm uppercase tracking-wide hover:text-orange-700 py-2" >Recipes</a> 283 284 <a href="/categories" class="block text-gray-700 font-bold text-sm uppercase tracking-wide hover:text-orange-700 py-2" >Categories</a> 285 286 <a href="/articles" class="block text-gray-700 font-bold text-sm uppercase tracking-wide hover:text-orange-700 py-2" >Articles</a> 287 288 <a href="/about" class="block text-gray-700 font-bold text-sm uppercase tracking-wide hover:text-orange-700 py-2" >About</a> 289 290 <a href="/contact" class="block text-gray-700 font-bold text-sm uppercase tracking-wide hover:text-orange-700 py-2" >Contact</a> 291 292 293 </div> 294 </div> 295</header> 296 297 298 <!-- Main Content --> 299 <main class="flex-grow"> 300 <!-- Page Header - Matching RecipeHero.tsx about style --> 301 <section class="bg-stone-100 py-8 px-4 md:px-6"> 302 <div class="container mx-auto max-w-7xl"> 303 <div class="flex flex-col md:flex-row md:justify-between"> 304 <div class="flex-1 space-y-6"> 305 <!-- Breadcrumbs --> 306 <nav> 307 <ol class="breadcrumb flex flex-wrap items-center text-[19.2px] font-normal"> 308 <li class="breadcrumb__item"> 309 <a href="/" class="text-[#c64118] font-bold no-underline hover:underline">Home</a> 310 </li> 311 <li class="breadcrumb__item"><span class="font-bold">About</span></li> 312 </ol> 313 </nav> 314 315 <h1 class="text-4xl md:text-5xl font-bold text-gray-900 leading-tight">About</h1> 316 317 </div> 318 319 <!-- Icon --> 320 <div class="hidden md:block md:flex-shrink-0"> 321 <svg class="w-40 h-40 text-blue-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"> 322 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" /> 323 </svg> 324 </div> 325 </div> 326 </div> 327 </section> 328 329 <!-- About Cards Section (from CMS) --> 330 331 332 333 <!-- About Content --> 334 <section class="py-12 px-4 md:px-6"> 335 <div class="container mx-auto max-w-4xl"> 336 <div class="prose prose-lg max-w-none"> 337 338 <h2 class="text-3xl font-bold text-gray-900 mb-6">Welcome to Zucchini Bread Recipes</h2> 339 340 <p class="text-gray-700 text-[1.2rem] leading-relaxed mb-6"> 341 We're passionate about bringing you the best recipes from around the world. Our mission is to make cooking accessible, enjoyable, and delicious for everyoneâfrom beginners to experienced home chefs. 342 </p> 343 344 <h3 class="text-2xl font-bold text-gray-900 mt-10 mb-4">Our Story</h3> 345 <p class="text-gray-700 text-[1.2rem] leading-relaxed mb-6"> 346 What started as a simple passion for cooking has grown into a community of food lovers sharing recipes, tips, and culinary adventures. Every recipe on our site is carefully tested and crafted to ensure you get the best results in your kitchen. 347 </p> 348 349 <h3 class="text-2xl font-bold text-gray-900 mt-10 mb-4">What We Offer</h3> 350 <ul class="text-gray-700 text-[1.2rem] leading-relaxed space-y-3 mb-6"> 351 <li><strong>Easy-to-Follow Recipes:</strong> Step-by-step instructions that anyone can follow</li> 352 <li><strong>Diverse Cuisines:</strong> From comfort food to exotic dishes from around the world</li> 353 <li><strong>Helpful Tips:</strong> Expert advice to improve your cooking skills</li> 354 <li><strong>Community:</strong> A place where food lovers come together</li> 355 </ul> 356 357 <h3 class="text-2xl font-bold text-gray-900 mt-10 mb-4">Get in Touch</h3> 358 <p class="text-gray-700 text-[1.2rem] leading-relaxed"> 359 We'd love to hear from you! Whether you have a question, suggestion, or just want to say hello, feel free to <a href="/contact" class="text-[#c64118] hover:underline">contact us</a>. 360 </p> 361 362 </div> 363 </div> 364 </section> 365 366 <!-- Team Section (if authors exist) --> 367 368 369 <!-- Newsletter --> 370 371 372<!-- Newsletter Subscription Card - Single Responsive Design --> 373<div class="rounded-2xl overflow-hidden shadow-md" style="background: #faf9f7; border: 1px solid #e8e4dc;"> 374 <div class="p-5 sm:p-6 lg:p-8"> 375 <!-- Header --> 376 <div class="text-center mb-5"> 377 <div class="inline-flex items-center justify-center w-12 h-12 rounded-xl mb-4" style="background: #eef5f0;"> 378 379 <!-- Default: mail icon --> 380 <svg class="w-5 h-5" style="color: #2d6a4f;
380" fill="none" stroke="currentColor" stroke-width="1.5" viewBox="0 0 24 24"> 381 <path stroke-linecap="round" stroke-linejoin="round" d="M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75"/> 382 </svg> 383 384 </div> 385 <h3 class="text-lg sm:text-xl font-bold mb-2" style="color: #1a1a1a;">Get Delicious Recipes Weekly</h3> 386 <p class="text-sm sm:text-base leading-relaxed" style="color: #666;">Join 25,000+ home cooks getting our best recipes straight to their inbox.</p> 387 </div> 388 389 <!-- Form --> 390 <form 391 id="newsletter-m4rc3wmfo" 392 hx-post="/api/subscribe" 393 hx-swap="outerHTML" 394 hx-indicator="#newsletter-m4rc3wmfo-indicator" 395 class="space-y-3 max-w-sm mx-auto" 396 > 397 <input type="hidden" name="source" value="homepage"> 398 <input 399 type="text" 400 name="name" 401 placeholder="Your name" 402 required 403 class="w-full px-4 py-3 sm:py-3.5 rounded-xl text-sm focus:outline-none focus:ring-2 transition-shadow" 404 style="background: #fff; border: 1px solid #e0dcd4; color: #333; --tw-ring-color: #2d6a4f;" 405 > 406 <input 407 type="email" 408 name="email" 409 placeholder="[email protected]" 410 required 411 class="w-full px-4 py-3 sm:py-3.5 rounded-xl text-sm focus:outline-none focus:ring-2 transition-shadow" 412 style="background: #fff; border: 1px solid #e0dcd4; color: #333; --tw-ring-color: #2d6a4f;" 413 > 414 <button 415 type="submit" 416 class="newsletter-submit-btn group py-3 sm:py-3.5 font-semibold rounded-xl shadow-sm gap-2 text-sm mx-auto" 417 style="cursor: pointer; display: flex; width: 60%; align-items: center; justify-content: center; background: #2d6a4f; color: white;" 418 onmouseover="this.style.background='#e07b4c'; this.style.transform='translateY(-2px)'; this.style.boxShadow='0 4px 12px rgba(224, 123, 76, 0.4)';" 419 onmouseout="this.style.background='#2d6a4f'; this.style.transform='translateY(0)'; this.style.boxShadow='none';" 420 > 421 <span>Subscribe Free</span> 422 <span id="newsletter-m4rc3wmfo-indicator" class="htmx-indicator"> 423 <svg class="animate-spin h-4 w-4" fill="none" viewBox="0 0 24 24"> 424 <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle> 425 <path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"></path> 426 </svg> 427 </span> 428 <svg class="w-4 h-4 transition-transform group-hover:translate-x-1" fill="none" stroke="currentColor" viewBox="0 0 24 24"> 429 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 5l7 7m0 0l-7 7m7-7H3"/> 430 </svg> 431 </button> 432 </form> 433 434 <!-- Trust --> 435 <p class="text-center text-xs mt-4" style="color: #999;"> 436 Free forever ⢠No spam ⢠Unsubscribe anytime 437 </p> 438 </div> 439</div> 440 441 </main> 442 443 <!-- Footer --> 444 <!-- Ad Slot: Footer â controlled by ad-before-footer toggle in Homepage Layout Manager --> 445 446 447 448<!-- Footer matching website orange/amber theme --> 449<footer class="text-white mt-16" style="background: linear-gradient(135deg, #2D5A42 0%, #1A3A2E 100%);"> 450 <div class="max-w-6xl mx-auto px-4 py-12"> 451 452 <!-- Social Media Icons - Dynamic from Admin --> 453 454 <div class="flex justify-center space-x-6 mb-8"> 455 456 457 <a href="https://www.pinterest.com/loulitafranjer/" class="text-white/80 hover:text-orange-500 transition-colors" aria-label="Pinterest" target="_blank" rel="noopener noreferrer"> 458 459 <svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24"> 460 <path d="M12.017 0C5.396 0 .029 5.367.029 11.987c0 5.079 3.158 9.417 7.618 11.174-.105-.949-.199-2.403.041-3.439.219-.937 1.406-5.957 1.406-5.957s-.359-.72-.359-1.781c0-1.663.967-2.911 2.168-2.911 1.024 0 1.518.769 1.518 1.688 0 1.029-.653 2.567-.992 3.992-.285 1.193.6 2.165 1.775 2.165 2.128 0 3.768-2.245 3.768-5.487 0-2.861-2.063-4.869-5.008-4.869-3.41 0-5.409 2.562-5.409 5.199 0 1.033.394 2.143.889 2.741.265.32.305.449.207.728-.075.2-.24.9-.31 1.15-.09.32-.297.39-.686.235-1.29-.6-2.1-2.48-2.1-4.001 0-3.26 2.37-6.26 6.84-6.26 3.59 0 6.38 2.56 6.38 5.98 0 3.57-2.25 6.44-5.38 6.44-1.05 0-2.04-.55-2.38-1.28 0 0-.52 1.98-.65 2.47-.23.9-.86 2.03-1.28 2.72A12.018 12.018 0 0 0 12.017 24c6.624 0 11.99-5.367 11.99-11.987C24.007 5.367 18.641.001 12.017.001z"/> 461 </svg> 462 463 </a> 464 465 466 </div> 467 468 469 <!-- Navigation Links - Single Row Centered --> 470 <div class="flex flex-wrap justify-center gap-x-6 gap-y-3 mb-10"> 471 472 473 474 <a href="/" class="text-white/80 hover:text-orange-500 transition-colors text-sm flex items-center gap-1.5" > 475 476 477 <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
477<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6"/></svg> 478 479 480 <span>Home</span> 481 </a> 482 483 <a href="/recipes" class="text-white/80 hover:text-orange-500 transition-colors text-sm flex items-center gap-1.5" > 484 485 486 <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 10.172V5L8 4z"/></svg> 487 488 489 <span>Recipes</span> 490 </a> 491 492 <a href="/categories" class="text-white/80 hover:text-orange-500 transition-colors text-sm flex items-center gap-1.5" > 493 494 495 <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z"/></svg> 496 497 498 <span>Categories</span> 499 </a> 500 501 <a href="/articles" class="text-white/80 hover:text-orange-500 transition-colors text-sm flex items-center gap-1.5" > 502 503 504 <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg> 505 506 507 <span>Articles</span> 508 </a> 509 510 <a href="/explore" class="text-white/80 hover:text-orange-500 transition-colors text-sm flex items-center gap-1.5" > 511 512 513 <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 17l-5 2 2-5 7-7 3 3-7 7zM14 6l3 3"/></svg> 514 515 516 <span>Explore</span> 517 </a> 518 519 <a href="/authors" class="text-white/80 hover:text-orange-500 transition-colors text-sm flex items-center gap-1.5" > 520 521 522 <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20h5V9H2v11h5m10 0v-2a4 4 0 00-8 0v2m8 0H7m5-8a4 4 0 100-8 4 4 0 000 8zm6 0a3 3 0 100-6 3 3 0 000 6zM6 12a3 3 0 100-6 3 3 0 000 6z"/></svg> 523 524 525 <span>Authors</span> 526 </a> 527 528 <a href="/about" class="text-white/80 hover:text-orange-500 transition-colors text-sm flex items-center gap-1.5" > 529 530 531 <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> 532 533 534 <span>About</span> 535 </a> 536 537 <a href="/contact" class="text-white/80 hover:text-orange-500 transition-colors text-sm flex items-center gap-1.5" > 538 539 540 <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"/></svg> 541 542 543 <span>Contact</span> 544 </a> 545 546 <a href="/faq" class="text-white/80 hover:text-orange-500 transition-colors text-sm flex items-center gap-1.5" > 547 548 549 <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
549<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8.228 9c.55-1.165 1.745-2 3.272-2 1.933 0 3.5 1.343 3.5 3 0 1.093-.682 2.05-1.699 2.575-.762.393-1.301.98-1.301 1.675V15m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg> 550 551 552 <span>FAQ</span> 553 </a> 554 555 <a href="/search" class="text-white/80 hover:text-orange-500 transition-colors text-sm flex items-center gap-1.5" > 556 557 558 <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-4.35-4.35m1.85-5.15a7 7 0 11-14 0 7 7 0 0114 0z"/></svg> 559 560 561 <span>Search</span> 562 </a> 563 564 <a href="/privacy" class="text-white/80 hover:text-orange-500 transition-colors text-sm flex items-center gap-1.5" > 565 566 567 <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"/></svg> 568 569 570 <span>Privacy Policy</span> 571 </a> 572 573 <a href="/terms" class="text-white/80 hover:text-orange-500 transition-colors text-sm flex items-center gap-1.5" > 574 575 576 <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg> 577 578 579 <span>Terms of Service</span> 580 </a> 581 582 <a href="/cookies" class="text-white/80 hover:text-orange-500 transition-colors text-sm flex items-center gap-1.5" > 583 584 585 <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4l3 3M7 4h10a3 3 0 013 3v4a9 9 0 11-9-9h4a3 3 0 013 3"/></svg> 586 587 588 <span>Cookie Policy</span> 589 </a> 590 591 <a href="/disclaimer" class="text-white/80 hover:text-orange-500 transition-colors text-sm flex items-center gap-1.5" > 592 593 594 <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-7.938 4h15.876c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L2.33 16c-.77 1.333.192 3 1.732 3z"/></svg> 595 596 597 <span>Disclaimer</span> 598 </a> 599 600 601 </div> 602 603 <!-- Copyright --> 604 <div class="text-center pt-8 border-t border-white/20"> 605 <p class="text-white/60 text-sm"> 606 © 2025 Zucchini Bread Recipes. All rights reserved. 607 </p> 608 </div> 609 </div> 610</footer> 611 612<!-- Back to Top Button - Global --> 613<button id="back-to-top" type="button" class="fixed right-8 p-3 bg-amber-600 text-white rounded-full shadow-lg transition-all duration-300 hover:bg-amber-700" style="z-index: 99999; bottom: 100px; opacity: 0; pointer-events: none; cursor: pointer;" aria-label="Back to top"> 614 <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 10l7-7m0 0l7 7m-7-7v18" /></svg> 615</button> 616
617<script> 618 (function() { 619 const btn = document.getElementById('back-to-top'); 620 if (btn) { 621 btn.addEventListener('click', function(e) { 622 e.preventDefault(); 623 e.stopPropagation(); 624 window.scrollTo({top: 0, behavior: 'smooth'}); 625 }); 626 window.addEventListener('scroll', function() { 627 if (window.scrollY > 5000) { 628 btn.style.opacity = '1'; 629 btn.style.pointerEvents = 'auto'; 630 } else { 631 btn.style.opacity = '0'; 632 btn.style.pointerEvents = 'none'; 633 } 634 }); 635 } 636 })(); 637</script>
637 638 639 640 641 642 643 644<!-- Ad lazy-load helper: observes ad containers with data-lazy-load and triggers ad rendering -->
645<script> 646 (function(){ 647 if (!('IntersectionObserver' in window)) return; 648 649 try { 650 const adEls = document.querySelectorAll('.ad-container[data-lazy-load="true"]'); 651 if (!adEls || adEls.length === 0) return; 652 653 const observer = new IntersectionObserver((entries, obs) => { 654 entries.forEach(entry => { 655 if (!entry.isIntersecting) return; 656 const el = entry.target; 657 658 // 1) If AdSense ins exists, attempt to push to render 659 try { 660 const ins = el.querySelector('ins.adsbygoogle'); 661 if (ins && window.adsbygoogle) { 662 try { (adsbygoogle = window.adsbygoogle || []).push({}); } catch(e) { console.warn('adsbygoogle push error', e); } 663 } 664 } catch (e) { console.warn('adsensor check failed', e); } 665 666 // 2) If Prebid is present, attempt a lightweight call to request bids for this ad id 667 try { 668 if (window.pbjs && typeof pbjs.requestBids === 'function') { 669 try { pbjs.requestBids({ adUnitCodes: [el.dataset.adId], bidsBackHandler: function(){} }); } catch(e){ console.warn('pbjs requestBids failed', e); } 670 } 671 } catch (e) { /* ignore */ } 672 673 // 3) mark as loaded and stop observing 674 el.dataset.loaded = '1'; 675 obs.unobserve(el); 676 }); 677 }, { rootMargin: (document.documentElement.clientHeight || 800) + 'px' }); 678 679 adEls.forEach(a => observer.observe(a)); 680 } catch (err) { 681 console.error('Ad lazy-load helper error', err); 682 } 683 })(); 684</script>
684 685 686 <!-- Visitor Analytics Tracker -->
687<script> 688(function() { 689 var path = window.location.pathname; 690 691 // Skip admin/login pages 692 if (path.startsWith('/admin') || path.startsWith('/login')) return; 693 694 // Skip if admin 695 if (localStorage.getItem('admin_token')) return; 696 697 // Deduplicate: don't re-track same page in same session 698 var trackKey = 'tracked_' + path; 699 if (sessionStorage.getItem(trackKey)) return; 700 701 var visitId = null; 702 var maxScroll = 0; 703 var startTime = Date.now(); 704 var heartbeatInterval = null; 705 706 // Track scroll depth (passive, lightweight) 707 function handleScroll() { 708 var scrollTop = window.scrollY; 709 var docHeight = document.documentElement.scrollHeight - window.innerHeight; 710 if (docHeight > 0) { 711 var pct = Math.round((scrollTop / docHeight) * 100); 712 if (pct > maxScroll) maxScroll = pct; 713 } 714 } 715 window.addEventListener('scroll', handleScroll, { passive: true }); 716 717 // Session ID 718 function getSessionId() { 719 var sid = sessionStorage.getItem('analytics_session_id'); 720 if (!sid) { 721 sid = Math.random().toString(36).substring(2) + Date.now().toString(36); 722 sessionStorage.setItem('analytics_session_id', sid); 723 } 724 return sid; 725 } 726 727 // Track visitor 728 function trackVisitor() { 729 fetch('/api/admin/visitors', { 730 method: 'POST', 731 headers: { 'Content-Type': 'application/json' }, 732 body: JSON.stringify({ 733 page: path, 734 userAgent: navigator.userAgent, 735 referrer: document.referrer || '', 736 sessionId: getSessionId() 737 }) 738 }) 739 .then(function(r) { return r.ok ? r.json() : null; }) 740 .then(function(data) { 741 if (data && data.id) { 742 visitId = data.id; 743 sessionStorage.setItem(trackKey, '1'); 744 745 // Heartbeat every 60s (lightweight duration/scroll updates) 746 heartbeatInterval = setInterval(function() { 747 if (!visitId) return; 748 fetch('/api/admin/visitors', { 749 method: 'PUT', 750 headers: { 'Content-Type': 'application/json' }, 751 body: JSON.stringify({ 752 id: visitId, 753 duration: Math.round((Date.now() - startTime) / 1000), 754 scrollDepth: maxScroll 755 }), 756 keepalive: true 757 }).catch(function() {}); 758 }, 60000); 759 } 760 }) 761 .catch(function() {}); 762 } 763 764 // Final data on page leave 765 function sendFinalData() { 766 if (!visitId) return; 767 var payload = JSON.stringify({ 768 id: visitId, 769 duration: Math.round((Date.now() - startTime) / 1000), 770 scrollDepth: maxScroll, 771 _method: 'PUT' 772 }); 773 if (navigator.sendBeacon) { 774 navigator.sendBeacon('/api/admin/visitors', new Blob([payload], { type: 'application/json' })); 775 } else { 776 fetch('/api/admin/visitors', { 777 method: 'PUT', 778 headers: { 'Content-Type': 'application/json' }, 779 body: payload, 780 keepalive: true 781 }).catch(function() {}); 782 } 783 } 784 785 window.addEventListener('beforeunload', sendFinalData); 786 window.addEventListener('pagehide', sendFinalData); 787 window.addEventListener('unload', function() { 788 if (heartbeatInterval) clearInterval(heartbeatInterval); 789 window.removeEventListener('scroll', handleScroll); 790 }); 791 792 // Start after 3s delay to not block page load 793 setTimeout(trackVisitor, 3000); 794})(); 795</script>
795 796 797 798
798<script> 799(function() { 800 const GIVEAWAY_GUARD_KEY = 'hide_giveaway_popup'; 801 const DWELL_SECONDS = 45; 802 803 let latestGiveaway = null; 804 let giveawayInteracted = false; 805 let giveawayAutoTimer = null; 806 807 // Read popup settings from DOM 808 function getPopupSettings() { 809 var modal = document.querySelector('[data-lead-gen="giveaway"]'); 810 if (!modal) return { delay: 0, dismissDays: 7, showMobile: true, freq: 'session' }; 811 return { 812 delay: parseInt(modal.getAttribute('data-delay') || '0', 10), 813 dismissDays: parseInt(modal.getAttribute('data-dismiss') || '7', 10), 814 showMobile: modal.getAttribute('data-mobile') !== '0', 815 freq: modal.getAttribute('data-freq') || 'session', 816 }; 817 } 818 819 function isMobile() { 820 return window.innerWidth <= 640; 821 } 822 823 function getGiveawayGuardState() { 824 try { 825 var settings = getPopupSettings(); 826 var store = settings.freq === 'session' ? sessionStorage : localStorage; 827 var raw = store.getItem(GIVEAWAY_GUARD_KEY); 828 if (!raw) return null; 829 var parsed = JSON.parse(raw); 830 if (parsed && typeof parsed.hiddenUntil === 'number') { 831 if (Date.now() < parsed.hiddenUntil) return parsed; 832 } 833 } catch (e) {} 834 return null; 835 } 836 837 function setGiveawayGuard() { 838 try { 839 var settings = getPopupSettings(); 840 var store = settings.freq === 'session' ? sessionStorage : localStorage; 841 var ttlHours = settings.dismissDays * 24; 842 var hiddenUntil = Date.now() + (ttlHours * 60 * 60 * 1000); 843 store.setItem(GIVEAWAY_GUARD_KEY, JSON.stringify({ hiddenUntil })); 844 } catch (e) {} 845 } 846 847 function clearGiveawayGuard() { 848 try { 849 localStorage.removeItem(GIVEAWAY_GUARD_KEY); 850 sessionStorage.removeItem(GIVEAWAY_GUARD_KEY); 851 } catch (e) {} 852 } 853 854 function shouldShowGiveaway() { 855 var settings = getPopupSettings(); 856 if (settings.freq === 'always') return true; 857 return !getGiveawayGuardState(); 858 } 859 860 function fetchLatestGiveaway() { 861 return fetch('/api/giveaways?limit=1') 862 .then(function(r) { return r.ok ? r.json() : null; }) 863 .then(function(data) { 864 if (data && data.giveaways && data.giveaways.length > 0) { 865 latestGiveaway = data.giveaways[0]; 866 return latestGiveaway; 867 } 868 return null; 869 }) 870 .catch(function() { return null; }); 871 } 872 873 function populateGiveawayPopup() { 874 if (!latestGiveaway) return; 875 var form = document.getElementById('giveaway-popup-form'); 876 if (form && latestGiveaway.slug) { 877 form.action = '/api/giveaways/' + latestGiveaway.slug + '/signup'; 878 } 879 } 880 881 function showGiveawayModal() { 882 var modal = document.querySelector('[data-lead-gen="giveaway"]'); 883 if (!modal) return; 884 giveawayInteracted = true; 885 modal.setAttribute('aria-hidden', 'false'); 886 modal.classList.add('is-visible'); 887 document.body.style.overflow = 'hidden'; 888 } 889 890 function hideGiveawayModal() { 891 var modal = document.querySelector('[data-lead-gen="giveaway"]'); 892 if (!modal) return; 893 modal.classList.remove('is-visible'); 894 modal.setAttribute('aria-hidden', 'true'); 895 document.body.style.overflow = ''; 896 setGiveawayGuard(); 897 } 898 899 function cancelGiveawayAutoTimer() { 900 if (giveawayAutoTimer) { 901 clearTimeout(giveawayAutoTimer); 902 giveawayAutoTimer = null; 903 } 904 } 905 906 function startGiveawayAutoTimer() { 907 if (!shouldShowGiveaway()) return; 908 if (giveawayInteracted) return; 909 var settings = getPopupSettings(); 910 if (!settings.showMobile && isMobile()) return; 911 if (settings.delay <= 0) return; 912 cancelGiveawayAutoTimer(); 913 giveawayAutoTimer = setTimeout(function() { 914 if (!giveawayInteracted && latestGiveaway) { 915 showGiveawayModal(); 916 } 917 }, settings.delay * 1000); 918 } 919 920 function handleMarqueeClick() { 921 var marquee = document.getElementById('giveaway-marquee'); 922 var linkMode = marquee ? marquee.getAttribute('data-link-mode') : 'auto'; 923 var customLink = marquee ? marquee.getAttribute('data-custom-link') : ''; 924 if (linkMode === 'custom' && customLink) { 925 window.location.href = customLink; 926 return; 927 } 928 if (latestGiveaway) { 929 showGiveawayModal(); 930 } else { 931 fetchLatestGiveaway().then(function(gw) { 932 if (gw) populateGiveawayPopup(); 933 showGiveawayModal(); 934 }); 935 } 936 } 937 938 function handleHeroCardClick() { 939 var card = document.querySelector('.hero-giveaway-card');
940 var linkMode = card ? card.getAttribute('data-link-mode') : 'auto'; 941 var customLink = card ? card.getAttribute('data-custom-link') : ''; 942 if (linkMode === 'custom' && customLink) { 943 window.location.href = customLink; 944 return; 945 } 946 if (latestGiveaway) { 947 showGiveawayModal(); 948 } else { 949 fetchLatestGiveaway().then(function(gw) { 950 if (gw) populateGiveawayPopup(); 951 showGiveawayModal(); 952 }); 953 } 954 } 955 956 function handleGiveawayFormSubmit(e) { 957 e.preventDefault(); 958 var form = e.target; 959 var resultEl = document.getElementById('giveaway-popup-result'); 960 var loadingEl = document.getElementById('giveaway-popup-loading'); 961 var submitBtn = document.getElementById('giveaway-popup-submit'); 962 var modal = document.querySelector('[data-lead-gen="giveaway"]'); 963 var successMsg = modal ? (modal.getAttribute('data-success') || 'Success! Check your email.') : 'Success! Check your email.'; 964 var errorMsg = modal ? (modal.getAttribute('data-error') || 'Something went wrong. Please try again.') : 'Something went wrong. Please try again.'; 965 966 var actionAttr = form.getAttribute('action'); 967 if (!actionAttr || !actionAttr.includes('/api/giveaways/')) { 968 // Try a last-ditch fetch before giving up 969 fetchLatestGiveaway().then(function(gw) { 970 if (gw && gw.slug) { 971 form.action = '/api/giveaways/' + gw.slug + '/signup'; 972 doSubmit(); 973 } else { 974 if (resultEl) resultEl.innerHTML = '<p style="color:#c64118;font-size:0.875rem;">Giveaway not available right now. Please try again later.</p>'; 975 } 976 }); 977 return; 978 } 979 doSubmit(); 980 981 function doSubmit() { 982 983 if (loadingEl) loadingEl.classList.remove('hidden'); 984 if (submitBtn) submitBtn.disabled = true; 985 986 var formData = new FormData(form); 987 var payload = {}; 988 if (formData.get('firstName')) payload.firstName = formData.get('firstName'); 989 if (formData.get('lastName')) payload.lastName = formData.get('lastName') || null; 990 if (formData.get('email')) payload.email = formData.get('email'); 991 992 fetch(form.action, { 993 method: 'POST', 994 headers: { 'Content-Type': 'application/json' }, 995 body: JSON.stringify(payload) 996 }) 997 .then(function(r) { return r.json(); }) 998 .then(function(data) { 999 if (data && data.success) { 1000 if (resultEl) { 1001 resultEl.innerHTML = '<div class="bg-green-50 border border-green-200 rounded-lg p-4 text-sm text-green-800">' + 1002 '<p class="font-medium">' + (data.message || successMsg) + '</p>' + 1003 '<p class="text-green-700 text-xs mt-1">Check your inbox (and spam folder) for the download link.</p>' + 1004 '</div>'; 1005 } 1006 setGiveawayGuard(); 1007 setTimeout(function() { hideGiveawayModal(); }, 2500); 1008 } else { 1009 if (resultEl) { 1010 resultEl.innerHTML = '<div class="bg-red-50 border border-red-200 rounded-lg p-4 text-sm text-red-800">' + 1011 '<p class="font-medium">' + (data.error || errorMsg) + '</p>' + 1012 '</div>'; 1013 } 1014 if (submitBtn) submitBtn.disabled = false; 1015 } 1016 }) 1017 .catch(function() { 1018 if (resultEl) { 1019 resultEl.innerHTML = '<div class="bg-red-50 border border-red-200 rounded-lg p-4 text-sm text-red-800">' + 1020 '<p class="font-medium">' + errorMsg + '</p>' + 1021 '</div>'; 1022 } 1023 if (submitBtn) submitBtn.disabled = false; 1024 }) 1025 .finally(function() { 1026 if (loadingEl) loadingEl.classList.add('hidden'); 1027 }); 1028 } // end doSubmit 1029 } // end handleGiveawayFormSubmit 1030 1031 function init() { 1032 // Always fetch giveaway data and attach handlers â do NOT bail out when the 1033 // popup guard is active. The guard should only gate auto-popups, not the 1034 // entire lead-gen system (marquee clicks, hero card clicks, form submission). 1035 fetchLatestGiveaway().then(function(gw) { 1036 if (gw) { 1037 populateGiveawayPopup(); 1038 } 1039 1040 // Marquee click handler â always attach if marquee exists 1041 var marquee = document.getElementById('giveaway-marquee'); 1042 if (marquee) { 1043 marquee.addEventListener('click', function(e) { 1044 if (e.target.closest('.gm-close')) return; 1045 handleMarqueeClick(); 1046 }); 1047 } 1048 1049 // Giveaway form submission 1050 var form = document.getElementById('giveaway-popup-form'); 1051 if (form) form.addEventListener('submit', handleGiveawayFormSubmit); 1052 1053 // Giveaway modal backdrop close 1054 var modal = document.querySelector('[data-lead-gen="giveaway"]'); 1055 if (modal) { 1056 var backdrop = modal.querySelector('.giveaway-modal-backdrop'); 1057 if (backdrop) backdrop.addEventListener('click', hideGiveawayModal); 1058 } 1059 1060 // Escape key handler 1061 document.addEventListener('keydown', function(e) { 1062 if (e.key === 'Escape') { 1063 var gwVisible = document.querySelector('.giveaway-modal.is-visible'); 1064 if (gwVisible) hideGiveawayModal(); 1065 } 1066 }); 1067 1068 // Only auto-show popups if the guard allows 1069 if (shouldShowGiveaway()) { 1070 startGiveawayAutoTimer(); 1071 } 1072 }); 1073 } 1074 1075 window.GuelmaLeadGen = { 1076 showGiveaway: showGiveawayModal, 1077 closeGiveaway: hideGiveawayModal, 1078 handleMarqueeClick: handleMarqueeClick, 1079 handleHeroCardClick: handleHeroCardClick, 1080 dismissMarquee: function() { 1081 var marquee = document.getElementById('giveaway-marquee'); 1082 if (marquee) marquee.style.display = 'none'; 1083 // Respect configured dismiss duration for marquee
1084 try { 1085 var dismissHours = parseInt(marquee.getAttribute('data-dismiss') || '24', 10); 1086 var hiddenUntil = Date.now() + (dismissHours * 60 * 60 * 1000); 1087 localStorage.setItem('gm_marquee_dismissed', JSON.stringify({ hiddenUntil })); 1088 } catch (e) {} 1089 }, 1090 resetGuard: clearGiveawayGuard, 1091 setGuard: setGiveawayGuard, 1092 }; 1093 1094 if (document.readyState === 'loading') { 1095 document.addEventListener('DOMContentLoaded', init); 1096 } else { 1097 init(); 1098 } 1099})(); 1100</script>
1100 1101
1102<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":"61dfad1e995b41e89c893c4354c23825","r":1,"spa":2}' crossorigin="anonymous"></script>
1102 1103</body> 1104</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.