<!DOCTYPE html><html lang="en" data-theme="tastyhandbook"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width"><link rel="icon" type="image/x-icon" href="/favicon.ico"><meta name="generator" content="Astro v5.14.1"><title>TastyHandbook - Cook Through It, Together</title><!-- SEO Meta Tags --><meta name="description"><!-- Open Graph --><meta property="og:title" content="TastyHandbook - Cook Through It, Together"><meta property="og:description"><meta property="og:image" content="/default-og-image.png"><meta property="og:url" content="https://tastyhandbook.com/"><meta property="og:type" content="website"><!-- Add Google Analytics component here --><!-- Google tag (gtag.js) --><script async src="https://www.googletagmanager.com/gtag/js?id=G-E2WZLYHGJ4"></script> <script>
  window.dataLayer = window.dataLayer || [];
  function gtag() {
    dataLayer.push(arguments);
  }
  gtag("js", new Date());

  gtag("config", "G-EGN5NHC9NB");
</script><!-- Silktide Cookie Consent Banner --><link rel="stylesheet" id="silktide-consent-manager-css" href="/cookie-banner/silktide-consent-manager.css"><link rel="stylesheet" href="/_astro/about-us.Dk_n7O9D.css">
<style>@keyframes fadeInUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.animate-fade-in-up:where(.astro-ggpbunjz){animation:fadeInUp .6s ease-out forwards}.btn:where(.astro-ggpbunjz):hover{transform:translateY(-1px)}.btn:where(.astro-ggpbunjz):active{transform:translateY(0)}.btn:where(.astro-ggpbunjz):focus{outline:2px solid hsl(var(--p));outline-offset:2px}@media (max-width: 640px){#get-started-heading:where(.astro-ggpbunjz){font-size:2.5rem;line-height:1.1}}@media (max-width: 480px){#get-started-heading:where(.astro-ggpbunjz){font-size:2rem;line-height:1.2}}
</style><script type="module" src="/_astro/page.7qqag-5g.js"></script></head> <body class="bg-base-200 flex flex-col min-h-screen"> <!-- <HelloBar /> --> <!-- Welcome Modal - appears on all pages unless dismissed --> <style>astro-island,astro-slot,astro-static-slot{display:contents}</style><script>(()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).only=e;window.dispatchEvent(new Event("astro:only"));})();</script><script>(()=>{var A=Object.defineProperty;var g=(i,o,a)=>o in i?A(i,o,{enumerable:!0,configurable:!0,writable:!0,value:a}):i[o]=a;var d=(i,o,a)=>g(i,typeof o!="symbol"?o+"":o,a);{let i={0:t=>m(t),1:t=>a(t),2:t=>new RegExp(t),3:t=>new Date(t),4:t=>new Map(a(t)),5:t=>new Set(a(t)),6:t=>BigInt(t),7:t=>new URL(t),8:t=>new Uint8Array(t),9:t=>new Uint16Array(t),10:t=>new Uint32Array(t),11:t=>1/0*t},o=t=>{let[l,e]=t;return l in i?i[l](e):void 0},a=t=>t.map(o),m=t=>typeof t!="object"||t===null?t:Object.fromEntries(Object.entries(t).map(([l,e])=>[l,o(e)]));class y extends HTMLElement{constructor(){super(...arguments);d(this,"Component");d(this,"hydrator");d(this,"hydrate",async()=>{var b;if(!this.hydrator||!this.isConnected)return;let e=(b=this.parentElement)==null?void 0:b.closest("astro-island[ssr]");if(e){e.addEventListener("astro:hydrate",this.hydrate,{once:!0});return}let c=this.querySelectorAll("astro-slot"),n={},h=this.querySelectorAll("template[data-astro-template]");for(let r of h){let s=r.closest(this.tagName);s!=null&&s.isSameNode(this)&&(n[r.getAttribute("data-astro-template")||"default"]=r.innerHTML,r.remove())}for(let r of c){let s=r.closest(this.tagName);s!=null&&s.isSameNode(this)&&(n[r.getAttribute("name")||"default"]=r.innerHTML)}let p;try{p=this.hasAttribute("props")?m(JSON.parse(this.getAttribute("props"))):{}}catch(r){let s=this.getAttribute("component-url")||"<unknown>",v=this.getAttribute("component-export");throw v&&(s+=` (export ${v})`),console.error(`[hydrate] Error parsing props for component ${s}`,this.getAttribute("props"),r),r}let u;await this.hydrator(this)(this.Component,p,n,{client:this.getAttribute("client")}),this.removeAttribute("ssr"),this.dispatchEvent(new CustomEvent("astro:hydrate"))});d(this,"unmount",()=>{this.isConnected||this.dispatchEvent(new CustomEvent("astro:unmount"))})}disconnectedCallback(){document.removeEventListener("astro:after-swap",this.unmount),document.addEventListener("astro:after-swap",this.unmount,{once:!0})}connectedCallback(){if(!this.hasAttribute("await-children")||document.readyState==="interactive"||document.readyState==="complete")this.childrenConnectedCallback();else{let e=()=>{document.removeEventListener("DOMContentLoaded",e),c.disconnect(),this.childrenConnectedCallback()},c=new MutationObserver(()=>{var n;((n=this.lastChild)==null?void 0:n.nodeType)===Node.COMMENT_NODE&&this.lastChild.nodeValue==="astro:end"&&(this.lastChild.remove(),e())});c.observe(this,{childList:!0}),document.addEventListener("DOMContentLoaded",e)}}async childrenConnectedCallback(){let e=this.getAttribute("before-hydration-url");e&&await import(e),this.start()}async start(){let e=JSON.parse(this.getAttribute("opts")),c=this.getAttribute("client");if(Astro[c]===void 0){window.addEventListener(`astro:${c}`,()=>this.start(),{once:!0});return}try{await Astro[c](async()=>{let n=this.getAttribute("renderer-url"),[h,{default:p}]=await Promise.all([import(this.getAttribute("component-url")),n?import(n):()=>()=>{}]),u=this.getAttribute("component-export")||"default";if(!u.includes("."))this.Component=h[u];else{this.Component=h;for(let f of u.split("."))this.Component=this.Component[f]}return this.hydrator=p,this.hydrate},e,this)}catch(n){console.error(`[astro-island] Error hydrating ${this.getAttribute("component-url")}`,n)}}attributeChangedCallback(){this.hydrate()}}d(y,"observedAttributes",["props"]),customElements.get("astro-island")||customElements.define("astro-island",y)}})();</script><astro-island uid="2oCo6o" component-url="/_astro/WelcomeModal.LkUUDjLC.js" component-export="default" renderer-url="/_astro/client.Dnh0jofZ.js" props="{}" ssr client="only" opts="{&quot;name&quot;:&quot;WelcomeModal&quot;,&quot;value&quot;:&quot;react&quot;}"></astro-island> <header class="bg-base-100/80 sticky top-0 z-49 w-full backdrop-blur-sm border-b border-base-300"> <div class="navbar mx-auto max-w-7xl px-4 sm:px-6 lg:px-8"> <div class="navbar-start"> <nav role="navigation" aria-label="Mobile navigation"> <div class="dropdown"> <label tabindex="0" class="btn btn-ghost md:hidden focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2 transition-transform hover:scale-105" aria-label="Open navigation menu" aria-expanded="false" id="mobile-menu-button"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" class="lucide lucide-menu h-6 w-6"> <path d="M4 12h16"></path><path d="M4 18h16"></path><path d="M4 6h16"></path>  </svg> </label> <ul tabindex="0" class="menu menu-sm dropdown-content bg-base-100 rounded-box z-[1] mt-3 w-52 p-2 shadow focus:outline-none" role="menu" aria-labelledby="mobile-menu-button"> <li role="none"> <a href="/submissions" class="focus:bg-primary/10 focus:text-primary" role="menuitem">
Explore
</a> </li> <li role="none"> <a href="/clubs/list" class="focus:bg-primary/10 focus:text-primary" role="menuitem">
Join a Club
</a> </li> <li role="none"> <a href="/#how-it-works" class="focus:bg-primary/10 focus:text-primary" role="menuitem">
How It Works
</a> </li> <li role="none"> <a href="/blog" class="focus:bg-primary/10 focus:text-primary" role="menuitem">
Blog
</a> </li> </ul> </div> </nav> <a href="/" class="text-2xl font-bold tracking-tight lg:text-3xl text-base-content font-botera">Tasty<span class="text-primary">Handbook</span></a> <script>(()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).load=e;window.dispatchEvent(new Event("astro:load"));})();</script><astro-island uid="ZlQGhr" prefix="r1" component-url="/_astro/BetaTooltip.ClXAwwhD.js" component-export="default" renderer-url="/_astro/client.Dnh0jofZ.js" props="{}" ssr client="load" opts="{&quot;name&quot;:&quot;BetaTooltip&quot;,&quot;value&quot;:true}" await-children><div class="relative inline-block"><button class="inline-flex items-center gap-1 px-2 py-1 text-xs sm:text-sm font-medium text-gray-500 hover:text-gray-700 focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2 rounded-md transition-colors duration-200 touch-manipulation " aria-label="Beta status tooltip" aria-expanded="false"><span class="hidden sm:inline">In Beta</span><span class="sm:hidden">Beta</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-info h-3 w-3 flex-shrink-0" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="M12 16v-4"></path><path d="M12 8h.01"></path></svg></button></div><!--astro:end--></astro-island> </div> <div class="navbar-center hidden md:flex"> <nav role="navigation" aria-label="Main navigation"> <ul class="menu menu-horizontal menu-lg px-1" role="menubar"> <!-- <li role="none">
            <a
              href="/submissions"
              class={`nav-link relative transition-all duration-300 ease-in-out focus:bg-primary/10 focus:text-primary ${
                Astro.url.pathname === '/submissions' ? 'nav-link-active' : ''
              }`}
              role="menuitem"
            >
              <span class="nav-text">Explore,</span>
            </a>
          </li> --> <li role="none"> <a href="/clubs/list" class="nav-link relative transition-all duration-300 ease-in-out focus:bg-primary/10 focus:text-primary " role="menuitem"> <span class="nav-text">Join a Club,</span> </a> </li> <li role="none"> <a href="/#how-it-works" class="nav-link relative transition-all duration-300 ease-in-out focus:bg-primary/10 focus:text-primary " role="menuitem"> <span class="nav-text">How It Works,</span> </a> </li> <li role="none"> <a href="/blog" class="nav-link relative transition-all duration-300 ease-in-out focus:bg-primary/10 focus:text-primary " role="menuitem"> <span class="nav-text">Blog.</span> </a> </li> </ul> </nav> </div> <!-- NavBar End - Hidden on mobile and tablet, visible on desktop --> <div class="navbar-end gap-2 hidden lg:flex">  <a href="/signin" class="btn btn-ghost">
Sign In
</a> <a href="/register" class="btn btn-primary focus:outline-none focus:ring-2 focus:ring-primary-focus focus:ring-offset-2 transition-all duration-200 hover:scale-105">
Join the Community
</a>  </div> </div> </header> <!-- Mobile and Tablet Portrait Bottom Navigation --> <div class="fixed bottom-0 left-0 right-0 z-49 xl:hidden bg-base-100/95 backdrop-blur-sm border-t border-base-300"> <div class="flex items-center justify-center px-4 py-3 gap-4"> <div class="flex gap-3 w-full max-w-sm mx-auto"> <a href="/signin" class="btn btn-ghost flex-1">
Sign In
</a> <a href="/register" class="btn btn-primary flex-1 focus:outline-none focus:ring-2 focus:ring-primary-focus focus:ring-offset-2 transition-all duration-200 hover:scale-105">
Join the Community
</a> </div> </div> </div> <!-- Spacer for mobile and tablet portrait bottom nav --> <div class="h-20 xl:hidden"></div> <script type="module">document.addEventListener("DOMContentLoaded",()=>{const r=document.getElementById("mobile-menu-button");r&&(r.addEventListener("click",n=>{const a=r.getAttribute("aria-expanded")==="true";r.setAttribute("aria-expanded",(!a).toString())}),r.addEventListener("keydown",n=>{n.key==="Escape"&&r.setAttribute("aria-expanded","false")})),document.addEventListener("user:avatar-updated",async n=>{const a=n,{newAvatarUrl:s}=a.detail;if(console.log("Avatar update event received:",s),s){const t=document.querySelectorAll(".header-avatar-container");t.forEach(c=>{const e=c.querySelector("img");if(e){console.log("Updating HeaderAvatar src to:",s),e.src=s,e.style.display="block";const o=c.querySelector(".avatar-fallback");o&&(o.style.display="none")}}),console.log(`Updated ${t.length} HeaderAvatar instances`)}}),(()=>{const n=document.getElementById("enhanced-user-menu-button"),a=document.getElementById("mobile-user-menu-button");if(n){const s=n.closest(".dropdown"),t=s?.querySelector(".dropdown-content");if(!t)return;n.addEventListener("click",e=>{e.stopPropagation();const o=t.style.display==="block";t.style.display=o?"none":"block",n.setAttribute("aria-expanded",(!o).toString())}),document.addEventListener("click",e=>{s?.contains(e.target)||(t.style.display="none",n.setAttribute("aria-expanded","false"))}),n.addEventListener("keydown",e=>{switch(e.key){case"Enter":case" ":e.preventDefault(),n.click();break;case"Escape":e.preventDefault(),t.style.display="none",n.setAttribute("aria-expanded","false"),n.focus();break;case"ArrowDown":e.preventDefault(),t.style.display!=="block"&&(t.style.display="block",n.setAttribute("aria-expanded","true")),t.querySelector('[role="menuitem"]')?.focus();break}}),t.querySelectorAll('[role="menuitem"]').forEach(e=>{e.addEventListener("keydown",o=>{o.key==="Escape"&&(t.style.display="none",n.setAttribute("aria-expanded","false"),n.focus())}),e.closest('a[href="/signout"]')&&e.addEventListener("click",async o=>{if(o.preventDefault(),confirm("Are you sure you want to sign out?"))try{(await fetch("/api/auth/signout",{method:"GET",headers:{Accept:"application/json"}})).ok?window.location.href="/":window.location.href="/signout"}catch(i){console.error("Error during signout:",i),window.location.href="/signout"}})})}if(a){const s=a.closest(".dropdown"),t=s?.querySelector(".dropdown-content");if(!t)return;a.addEventListener("click",e=>{e.stopPropagation();const o=t.style.display==="block";t.style.display=o?"none":"block",a.setAttribute("aria-expanded",(!o).toString())}),document.addEventListener("click",e=>{s?.contains(e.target)||(t.style.display="none",a.setAttribute("aria-expanded","false"))}),a.addEventListener("keydown",e=>{switch(e.key){case"Enter":case" ":e.preventDefault(),a.click();break;case"Escape":e.preventDefault(),t.style.display="none",a.setAttribute("aria-expanded","false"),a.focus();break}}),t.querySelectorAll('[role="menuitem"]').forEach(e=>{e.addEventListener("keydown",o=>{o.key==="Escape"&&(t.style.display="none",a.setAttribute("aria-expanded","false"),a.focus())}),e.closest('a[href="/signout"]')&&e.addEventListener("click",async o=>{if(o.preventDefault(),confirm("Are you sure you want to sign out?"))try{(await fetch("/api/auth/signout",{method:"GET",headers:{Accept:"application/json"}})).ok?window.location.href="/":window.location.href="/signout"}catch(i){console.error("Error during signout:",i),window.location.href="/signout"}})})}})(),document.addEventListener("click",n=>{n.target.closest(".dropdown")||r?.setAttribute("aria-expanded","false")})});</script> <main class="flex-grow">  <section class="hero min-h-[60vh] bg-base-200 py-6" role="banner" aria-labelledby="hero-heading"> <div class="hero-content text-center"> <div class="max-w-6xl"> <h1 id="hero-heading" class="text-6xl font-bold tracking-tight sm:text-8xl lg:text-10xl flex flex-wrap items-center justify-center gap-4 mb-6 font-botera"> <span>Cook</span> <img src="/hero-baking-together-min.png" class="w-32 h-32 sm:w-40 sm:h-40 lg:w-48 lg:h-48 object-cover rounded-lg border-4 border-base-100 shadow-2xl rotate-2" alt="A vibrant platter of fresh seafood featuring assorted shellfish and crustaceans on ice" loading="eager"> <span>Through It,</span> <img src="/hero-drinking-together-min.png" class="w-32 h-32 sm:w-40 sm:h-40 lg:w-48 lg:h-48 object-cover rounded-lg border-4 border-base-100 shadow-2xl -rotate-2" alt="Overhead shot of a person preparing fresh dough on a wooden surface with rolling pin" loading="eager"> <span>Together</span> </h1> <p class="py-6 text-lg text-base-content/60 sm:text-xl max-w-2xl mx-auto">
Join a cookbook club and turn inspiration into your next favorite meal.
        Discover new flavors, master new skills, and connect with fellow cooks.
</p> <div class="flex flex-col sm:flex-row gap-4 justify-center" role="group" aria-label="Get started actions"> <!-- <div class="text-center">
          <span class="text-xl font-bold mb-4 block">Join the Waitlist</span>
          <NewsletterForm />
        </div> --> <a href="/clubs/list" class="btn btn-outline btn-lg transition-all duration-200 hover:scale-105 focus:scale-105 focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2" aria-describedby="explore-clubs-desc">
Explore Clubs
</a> <div id="explore-clubs-desc" class="sr-only">
Browse available cooking clubs to find one that interests you
</div> <a href="/register" class="btn btn-primary btn-lg transition-all duration-200 hover:scale-105 focus:scale-105 focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2" aria-describedby="get-started-desc">
Get Started
</a> <div id="get-started-desc" class="sr-only">
Create your account and start your cooking journey
</div> </div> </div> <!-- <div
      class="mb-8 flex flex-col items-center justify-center gap-4 lg:mb-0 lg:flex-row"
    >
      <img
        src="https://plus.unsplash.com/premium_photo-1661717201171-54fb066c6c3f?q=80&w=1472&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
        class="w-60 rounded-lg border-4 border-base-100 shadow-2xl"
        alt="A vibrant platter of fresh seafood"
      />
      <img
        src="https://images.unsplash.com/photo-1606851182342-20036a8b64f2?q=80&w=1470&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
        class="w-60 rounded-lg border-4 border-base-100 shadow-2xl"
        alt="Overhead shot of a person preparing dough on a wooden surface"
      />
    </div> --> </div> </section>  <span id="how-it-works"><div class="bg-base-100 py-12"> <div class="mx-auto max-w-7xl px-6 lg:px-8"> <div class="mx-auto max-w-2xl lg:text-center"> <h2 class="text-base font-semibold leading-7 text-primary badge badge-lg badge-outline">
How It Works
</h2> <p class="mt-2 text-3xl font-bold tracking-tight text-base-content sm:text-4xl font-botera">
Your next culinary adventure starts here
</p> <p class="mt-6 text-lg leading-8 text-base-content/60">
Follow three simple steps to explore, cook, and connect with a vibrant community of food lovers.
</p> </div> <div class="mx-auto mt-16 max-w-2xl sm:mt-20 lg:mt-24 lg:max-w-none"> <dl class="grid max-w-none grid-cols-1 gap-x-8 gap-y-16 md:grid-cols-3"> <div class="flex flex-col"> <dt class="flex items-center gap-x-3 text-base font-semibold leading-7 text-base-content"> <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-search"> <path d="m21 21-4.34-4.34"></path><circle cx="11" cy="11" r="8"></circle>  </svg> Choose Your Journey. </dt> <dd class="mt-4 flex flex-auto flex-col text-base leading-7 text-base-content/70"> <p class="flex-auto">Host a club built around curated cookbooks, trending recipes, or ingredient-driven challenges — or join one that sparks your curiosity.</p> </dd> </div><div class="flex flex-col"> <dt class="flex items-center gap-x-3 text-base font-semibold leading-7 text-base-content"> <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-users"> <path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"></path><path d="M16 3.128a4 4 0 0 1 0 7.744"></path><path d="M22 21v-2a4 4 0 0 0-3-3.87"></path><circle cx="9" cy="7" r="4"></circle>  </svg> Share the Experience. </dt> <dd class="mt-4 flex flex-auto flex-col text-base leading-7 text-base-content/70"> <p class="flex-auto">Cook alongside your club, swap photos and tips, join in challenges, and get support from your dedicated host and fellow members.</p> </dd> </div><div class="flex flex-col"> <dt class="flex items-center gap-x-3 text-base font-semibold leading-7 text-base-content"> <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-award"> <path d="m15.477 12.89 1.515 8.526a.5.5 0 0 1-.81.47l-3.58-2.687a1 1 0 0 0-1.197 0l-3.586 2.686a.5.5 0 0 1-.81-.469l1.514-8.526"></path><circle cx="12" cy="8" r="6"></circle>  </svg> Master the Dish. </dt> <dd class="mt-4 flex flex-auto flex-col text-base leading-7 text-base-content/70"> <p class="flex-auto">Expand your skills, explore new cuisines, and discover cookbooks while making lasting connections with food enthusiasts worldwide.</p> </dd> </div> </dl> </div> </div> </div></span> <section class="bg-base-100 py-24 sm:py-32" role="region" aria-labelledby="featured-clubs-heading"> <div class="mx-auto max-w-7xl px-6 lg:px-8"> <div class="mx-auto max-w-2xl text-center"> <h2 id="featured-clubs-heading" class="text-3xl font-bold tracking-tight text-base-content sm:text-4xl font-botera"> Now Cooking: Find Your Table </h2> <p class="mt-6 text-lg leading-8 text-base-content/80"> Browse our newest public clubs and join the one that sparks your interest. </p> </div> <div class="mx-auto mt-16 grid max-w-2xl grid-cols-1 gap-6 lg:mx-0 lg:max-w-none lg:grid-cols-4 lg:gap-8" role="list"> <!-- Real clubs --> <div role="listitem"> <a href="/club/breaking-bread" class="group relative bg-base-100 rounded-3xl shadow-xl hover:shadow-2xl transition-all duration-500 overflow-hidden border border-base-300/50 hover:scale-105 focus:scale-105 focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2" role="article" aria-label="View details for Breaking Bread cooking club"> <!-- Decorative background effect --> <div class="absolute inset-0 bg-gradient-to-br from-primary/5 via-transparent to-secondary/5 opacity-0 group-hover:opacity-100 transition-opacity duration-500"></div> <!-- Image container --> <figure class="aspect-video relative overflow-hidden"> <img src="https://storage.googleapis.com/tasty-adel-jyr8w0.firebasestorage.app/clubs/UhK2ytUBE3kVckXw5DHg/1762121361530_t2ks7a_1024x1024.webp?GoogleAccessId=firebase-adminsdk-fbsvc%40tasty-adel-jyr8w0.iam.gserviceaccount.com&Expires=16725225600&Signature=CoDixxBT5OEB3lNWlWbyoq3ElAqEV2WfLLzo0KHxrGHhFcukMYOQ7%2F2vIc9ViD9uvcaXYhn7fb2IC2Zg9gGydb0I4X5Q3hzziEJ3Erzc6pDnFalV%2FmIMjdngDpvHoNk40hUBVx5x2MMUu%2FlN1s3IWMCbl1lzzlmXF1atpJhj6wzp00F%2BdcUnDxYsdTZIbZhPeuuUBciAZNXVrCCOL9vMcpR8L3FUK%2BwomrUGnHPJ15QqXAADRnhodpSW%2FEQ4jBCnjxedQJxH8eQFTxLJhuhThNspYzFNlFIX1Iu9xA5ZdYzkObLTvYCtK9aRWv6oqjsFvwlqirgGx22N3qCgzvwIEg%3D%3D" alt="Cover image for Breaking Bread" class="w-full h-full object-cover transition-transform duration-500 group-hover:scale-110" loading="lazy" onerror="this.src='/mock-club-placeholder.jpg'"> <!-- Overlay gradient --> <div class="absolute inset-0 bg-gradient-to-t from-black/20 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300"></div> <!-- Private badge -->  </figure> <!-- Card content --> <div class="relative p-6"> <h3 class="card-title text-xl font-bold text-base-content group-hover:text-primary transition-colors duration-300 mb-3"> Breaking Bread </h3> <!-- Host information with enhanced styling --> <div class="flex flex-col text-sm text-base-content/70 mb-4"> <div class="flex items-center mb-1"> <!-- <div class="w-4 h-4 rounded-full bg-primary/10 flex items-center justify-center mr-2">
          <svg class="w-2.5 h-2.5 text-primary" fill="currentColor" viewBox="0 0 20 20" aria-hidden="true">
            <path fill-rule="evenodd" d="M10 9a3 3 0 100-6 3 3 0 000 6zm-7 9a7 7 0 1114 0H3z" clip-rule="evenodd"></path>
          </svg>
        </div> --> <span class="font-medium">Hosted by</span> </div> <div> <div class="flex items-center space-x-3"> <div class="avatar"> <div class="w-8 h-8 rounded-full bg-primary/10 flex items-center justify-center border-2 border-primary/20"> <img src="https://storage.googleapis.com/tasty-adel-jyr8w0.firebasestorage.app/avatars/UR7FHm8Hh7bZUaYK5V4TFgmN2qE2/profile%20pic_200x200.png?GoogleAccessId=firebase-adminsdk-fbsvc%40tasty-adel-jyr8w0.iam.gserviceaccount.com&Expires=16725225600&Signature=JpR8wGLZDcAmVmWD2VUhbU7RzxEB6PWSLG3mTXQ6J4Kamj%2BcqT8msffAQ1GMS%2FqL9VxhLXybPZCw6HCnEr5QwqQfYR2FrhtlH9gTFCGhKleEIgNk%2FS0nklmGLMFCRk39f54s3%2BaRuICSjX%2FA3zgiMR5EUGZnREv0gWEClaU%2BaGU7HkUn8IOqh%2BEEhqCTvL7GQhwelBXqYIPk3%2BmZfxZhkFh5WuHBbq%2BaIEjYII0Vtmzz1e%2BGZ8ZYvy%2FfKF7R9PIZolJjA5GmEppCcifaWrpGLLbinRWgiQpjot73%2BWvi8eHehMS9agghqRk2bqDNGSH%2F60sk2l071qOZ3Z7r2K29%2BQ%3D%3D" alt="monocat's avatar" class="w-full h-full rounded-full object-cover"> </div> </div> <div class="flex flex-col"> <span class="font-semibold text-base-content">Mosses A.</span> <span class="text-sm text-base-content/50">@monocat</span> </div> </div> </div> </div> <!-- Enhanced action button --> <div class="card-actions justify-start"> <span class="btn btn-primary btn-sm transition-all duration-200 hover:scale-105 focus:scale-105 focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2"> <svg class="w-4 h-4 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"></path> </svg>
View Club
</span> </div> </div> </a> </div><div role="listitem"> <a href="/club/the-sourdough-starters" class="group relative bg-base-100 rounded-3xl shadow-xl hover:shadow-2xl transition-all duration-500 overflow-hidden border border-base-300/50 hover:scale-105 focus:scale-105 focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2" role="article" aria-label="View details for The Sourdough Starters cooking club"> <!-- Decorative background effect --> <div class="absolute inset-0 bg-gradient-to-br from-primary/5 via-transparent to-secondary/5 opacity-0 group-hover:opacity-100 transition-opacity duration-500"></div> <!-- Image container --> <figure class="aspect-video relative overflow-hidden"> <img src="https://storage.googleapis.com/tasty-adel-jyr8w0.firebasestorage.app/clubs/zlWNZKtcMvAdiPFG7tCv/1760140185951_4s7grd_1024x1024.webp?GoogleAccessId=firebase-adminsdk-fbsvc%40tasty-adel-jyr8w0.iam.gserviceaccount.com&Expires=16725225600&Signature=aerQYlhhNZsbSRnNqCg9YmSzMLNALWQM3H%2F6UmWjTlo3Xd27OWLld5nPBTXSdeGL6BvmiWpXsh8j6a5umnnTv3yeEvYYoxdSsQ8bX%2BwY1b2wG44G%2Be5frO%2Fbi5ZkwhbMGV6ky4P3Q3pcktihcG7tlshbrIhZPp64ooLBgQwrfHLdlyGdhNWwQFIweSFUWJYDwPcZNTo4ZfZGKt5jxH0DTy%2FppohZzBcuWwLLe0uNSxOxJW22gxhhXwrIsSV6bq4kkRkc4gnXrrxnwo52ozE4ut3Cos7qIqvjPKqYQELqeFBQxt8mD8X4V7sR09xDPO%2Bwjo7qdMBCGGXrGJRQf%2BiuFw%3D%3D" alt="Cover image for The Sourdough Starters" class="w-full h-full object-cover transition-transform duration-500 group-hover:scale-110" loading="lazy" onerror="this.src='/mock-club-placeholder.jpg'"> <!-- Overlay gradient --> <div class="absolute inset-0 bg-gradient-to-t from-black/20 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300"></div> <!-- Private badge -->  </figure> <!-- Card content --> <div class="relative p-6"> <h3 class="card-title text-xl font-bold text-base-content group-hover:text-primary transition-colors duration-300 mb-3"> The Sourdough Starters </h3> <!-- Host information with enhanced styling --> <div class="flex flex-col text-sm text-base-content/70 mb-4"> <div class="flex items-center mb-1"> <!-- <div class="w-4 h-4 rounded-full bg-primary/10 flex items-center justify-center mr-2">
          <svg class="w-2.5 h-2.5 text-primary" fill="currentColor" viewBox="0 0 20 20" aria-hidden="true">
            <path fill-rule="evenodd" d="M10 9a3 3 0 100-6 3 3 0 000 6zm-7 9a7 7 0 1114 0H3z" clip-rule="evenodd"></path>
          </svg>
        </div> --> <span class="font-medium">Hosted by</span> </div> <div> <div class="flex items-center space-x-3"> <div class="avatar"> <div class="w-8 h-8 rounded-full bg-primary/10 flex items-center justify-center border-2 border-primary/20"> <img src="https://storage.googleapis.com/tasty-adel-jyr8w0.firebasestorage.app/avatars/DRlPhY61WVPJOhBbcNNQyU05xU13/adelina-profile-pic.jpg?GoogleAccessId=firebase-adminsdk-fbsvc%40tasty-adel-jyr8w0.iam.gserviceaccount.com&Expires=16725225600&Signature=i74gBIoZ9pOs5QFmKTGpjGfr7zvfhznPVDBVIX4i37Xq6PezuAquX8VggXT8e5bIkh92KKLh8dBobD6qzfVfnmTx7Zzo0roIYt6VfpMVLpVy5WkMO3WQbXxjrNh%2BUGU2aloXxssHM88okuYhdx%2BZOte%2B5FtwO0PBVStzflCCChFSuXay61jHQCqGogx9fchXvH6wZ4yozd7qd0Spp5mblUkF%2F7CBoyu0tY1P0knB3nygd8k6wBK10VniVYIDY9BUqQc8C8dd9u01NU6xcN8T6DVxKXT%2FWo%2BO59JviY4nvX9VWD9r6YsNQoUSf3xnb0PUqlQQwBCeMYlvhd5iOnFeHw%3D%3D" alt="mytastyhandbook's avatar" class="w-full h-full rounded-full object-cover"> </div> </div> <div class="flex flex-col"> <span class="font-semibold text-base-content">Adelina Badalyan</span> <span class="text-sm text-base-content/50">@mytastyhandbook</span> </div> </div> </div> </div> <!-- Enhanced action button --> <div class="card-actions justify-start"> <span class="btn btn-primary btn-sm transition-all duration-200 hover:scale-105 focus:scale-105 focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2"> <svg class="w-4 h-4 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"></path> </svg>
View Club
</span> </div> </div> </a> </div> <!-- Promotional cards to fill remaining slots --> <div role="listitem"> <a href="/club/create" class="group relative bg-base-100 rounded-3xl shadow-lg hover:shadow-xl transition-all duration-500 overflow-hidden border border-base-300/30 block" role="article" aria-labelledby="promo-club-title-2"> <!-- Decorative background effect with muted tones --> <div class="absolute inset-0 bg-gradient-to-br from-base-200/30 via-transparent to-base-300/20 opacity-0 group-hover:opacity-100 transition-opacity duration-500"></div> <figure class="aspect-video relative"> <img src="/mock-club-theme.jpg" alt="Promotional image for Food &#38; Theme Nights" class="w-full h-full object-cover transition-transform duration-500 group-hover:scale-105" loading="lazy"> <div class="absolute top-3 left-3 badge badge-neutral font-medium text-neutral-content">Theme-based</div> <!-- Create Club badge --> <div class="absolute top-3 right-3 badge badge-outline gap-1 border-base-300 text-base-content/70"> <svg class="w-3 h-3" fill="currentColor" viewBox="0 0 20 20" aria-hidden="true"> <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"></path> </svg>
Create
</div> </figure> <div class="relative p-6"> <h3 id="promo-club-title-2" class="card-title text-lg font-semibold mb-2 group-hover:text-base-content transition-colors duration-200"> Food &amp; Theme Nights </h3> <p class="text-sm text-base-content/70 mb-4 leading-relaxed">by YOU</p> <div class="flex items-center justify-between gap-2"> <span class="btn btn-neutral btn-sm font-medium transition-all duration-200 hover:scale-105 flex-1 text-center"> Be creative! </span> <div class="opacity-0 group-hover:opacity-100 transition-opacity duration-200 flex-shrink-0"> <span class="text-base-content font-medium text-sm whitespace-nowrap">Create Club →</span> </div> </div> </div> </a> </div><div role="listitem"> <a href="/club/create" class="group relative bg-base-100 rounded-3xl shadow-lg hover:shadow-xl transition-all duration-500 overflow-hidden border border-base-300/30 block" role="article" aria-labelledby="promo-club-title-3"> <!-- Decorative background effect with muted tones --> <div class="absolute inset-0 bg-gradient-to-br from-base-200/30 via-transparent to-base-300/20 opacity-0 group-hover:opacity-100 transition-opacity duration-500"></div> <figure class="aspect-video relative"> <img src="/mock-club-book1.jpg" alt="Promotional image for Modern Mexican Fiesta" class="w-full h-full object-cover transition-transform duration-500 group-hover:scale-105" loading="lazy"> <div class="absolute top-3 left-3 badge badge-neutral font-medium text-neutral-content">Mexican</div> <!-- Create Club badge --> <div class="absolute top-3 right-3 badge badge-outline gap-1 border-base-300 text-base-content/70"> <svg class="w-3 h-3" fill="currentColor" viewBox="0 0 20 20" aria-hidden="true"> <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"></path> </svg>
Create
</div> </figure> <div class="relative p-6"> <h3 id="promo-club-title-3" class="card-title text-lg font-semibold mb-2 group-hover:text-base-content transition-colors duration-200"> Modern Mexican Fiesta </h3> <p class="text-sm text-base-content/70 mb-4 leading-relaxed">by YOU</p> <div class="flex items-center justify-between gap-2"> <span class="btn btn-neutral btn-sm font-medium transition-all duration-200 hover:scale-105 flex-1 text-center"> Join the fun! </span> <div class="opacity-0 group-hover:opacity-100 transition-opacity duration-200 flex-shrink-0"> <span class="text-base-content font-medium text-sm whitespace-nowrap">Create Club →</span> </div> </div> </div> </a> </div> </div> <div class="mx-auto max-w-2xl text-center mt-16"> <div class="bg-base-200/50 rounded-2xl p-6 border border-base-300/30"> <p class="text-base leading-7 text-base-content/70">
Want to see your club featured here? <a href="/club/create" class="link link-primary underline decoration-primary/50 underline-offset-2 hover:decoration-primary transition-all duration-200">
Create your own club
</a> and start cooking with friends!
</p> </div> </div>  </div> </section> <section class="bg-base-200 py-24 sm:py-32" role="region" aria-labelledby="showcase-heading"> <div class="mx-auto max-w-7xl px-6 lg:px-8"> <div class="mx-auto max-w-2xl text-center"> <h2 id="showcase-heading" class="text-3xl font-bold tracking-tight text-base-content sm:text-4xl font-botera">
From Our Members' Kitchens
</h2> <p class="mt-6 text-lg leading-8 text-base-content/80">
See what our community is cooking up.
</p> </div> <div class="mx-auto mt-16 max-w-none"> <div class="columns-1 gap-8 sm:columns-2 lg:columns-3" role="list" aria-label="Community testimonials and showcases"> <div role="listitem" class="break-inside-avoid mb-8"> <div class="card  bg-base-100 shadow-xl break-inside-avoid mb-4"> <figure class="px-8 pt-8"> <img src="testimonial-the-sourdough-starters-2.png" alt="A dish from the The Sourdough Starters club." class="rounded-xl aspect-[1/1] object-cover"> </figure> <div class="card-body items-center text-center"> <blockquote class="text-base-content/80 italic"> <p>"Great experience learning about bread, I no longer feel intimidated by the process. Also, great opportunity to spend time with your friends and family,  Lots of laughs, joy and great food!"</p> </blockquote> <figcaption class="mt-2 text-sm  text-primary text-right">
- Mary A., 'The Sourdough Starters' Club
</figcaption> </div> </div> </div><div role="listitem" class="break-inside-avoid mb-8"> <div class="card  bg-base-100 shadow-xl break-inside-avoid mb-4"> <figure class="px-8 pt-8"> <img src="testimonial-the-sourdough-starters-3.png" alt="A dish from the The Sourdough Starters club." class="rounded-xl aspect-[1/1] object-cover"> </figure> <div class="card-body items-center text-center"> <blockquote class="text-base-content/80 italic"> <p>"This class challenged me to learn something completely new as I’ve never baked before. I had a great time laughing and breaking bread with an intimate group of great people."</p> </blockquote> <figcaption class="mt-2 text-sm  text-primary text-right">
- Suza R., 'The Sourdough Starters' Club
</figcaption> </div> </div> </div><div role="listitem" class="break-inside-avoid mb-8"> <div class="card  bg-base-100 shadow-xl break-inside-avoid mb-4"> <figure class="px-8 pt-8"> <img src="testimonial-the-sourdough-starters-1.png" alt="A dish from the The Sourdough Starters club." class="rounded-xl aspect-[1/1] object-cover"> </figure> <div class="card-body items-center text-center"> <blockquote class="text-base-content/80 italic"> <p>"The in-person bake-along was amazing. I learned so much from the host and my fellow club members."</p> </blockquote> <figcaption class="mt-2 text-sm  text-primary text-right">
- Veronica S., 'The Sourdough Starters' Club
</figcaption> </div> </div> </div> </div> </div> </div> </section> <div class="bg-base-200 py-24 sm:py-32"> <div class="mx-auto max-w-7xl px-6 lg:px-8"> <div class="mx-auto grid max-w-2xl grid-cols-1 items-center gap-x-8 gap-y-16 sm:gap-y-20 lg:mx-0 lg:max-w-none lg:grid-cols-2"> <div class="lg:pr-8 lg:pt-4"> <div class="lg:max-w-lg"> <h2 class="text-base font-semibold leading-7 text-primary">
More Than a Recipe
</h2> <p class="mt-2 text-3xl font-bold tracking-tight text-base-content sm:text-4xl font-botera">
Welcome to TastyHandbook
</p> <p class="mt-6 text-lg leading-8 text-base-content/80">
Cook. Share. Connect. A community celebrating real food, cookbooks, and the stories behind every meal.
</p> <div class="mt-8"> <a href="/blog" class="btn btn-primary">Read Our Stories</a> </div> </div> </div> <img src="https://storage.googleapis.com/tasty-adel-jyr8w0.firebasestorage.app/posts/N2mi0FHmc8RcFjrYdv6x/1759989058024_utdwhd_1024x1024.webp?GoogleAccessId=firebase-adminsdk-fbsvc%40tasty-adel-jyr8w0.iam.gserviceaccount.com&Expires=16725225600&Signature=QSnZmYCK6PK%2BsUR%2FZ09wv1esHi%2B6ZcqxX2uLfY3s3hhe6Pad0QkgsWc7vZG9%2FmWyxJEpeVHoChtcWRyulig1sQgOITUCx4%2FPe87SYRtr8IugoCYX9A2TeFa3Thj%2BEcPP0jtMlR%2B4KFFQ%2FitYtvOhEsOHlZKVmjNjvL151%2FZAvgsIlcHQCCNqsaQ%2FYTSd%2Fc%2FjfkhWvzV1fmm90olrdqZAeDnYO4VkY4IEDp6fsgHkHGcinePuEOP1T8IDi%2FNRauPcOGBVcRD%2BhIXO612t%2FNLTbBeRPecA6m9LByTz%2FxXIrK9wACLyWTN5FKFHgyXLwEB84RCyobmVmzJMYf89JyFDvQ%3D%3D" alt="Cook. Share. Connect. A community celebrating real food, cookbooks, and the stories behind every meal." class="w-full max-w-none rounded-xl shadow-xl ring-1 ring-base-content/10 lg:w-[32rem]"> </div> <!-- <h1 class="text-4xl font-bold mb-8 text-center">From the Blog</h1> --> <!-- <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
      {posts.map(post => <BlogPostCard post={post} />)}
    </div> --> </div> </div>  <div id="get-started-section" class="py-24 sm:py-32 bg-gradient-to-br from-base-100 via-base-50 to-base-100 relative overflow-hidden astro-ggpbunjz" role="region" aria-labelledby="get-started-heading"> <!-- Background decoration --> <div class="absolute inset-0 opacity-5 astro-ggpbunjz"> <div class="absolute top-1/4 left-1/4 w-64 h-64 bg-primary rounded-full blur-3xl astro-ggpbunjz"></div> <div class="absolute bottom-1/4 right-1/4 w-96 h-96 bg-secondary rounded-full blur-3xl astro-ggpbunjz"></div> </div> <div class="mx-auto max-w-4xl px-6 lg:px-8 relative astro-ggpbunjz"> <div class="mx-auto max-w-2xl text-center astro-ggpbunjz"> <!-- Main content with animation containers --> <div id="get-started-content" class="opacity-0 translate-y-8 transition-all duration-700 ease-out astro-ggpbunjz"> <div class="mb-8 astro-ggpbunjz"> <span class="inline-flex items-center px-4 py-2 rounded-full text-sm font-medium bg-primary/10 text-primary border border-primary/20 mb-6 astro-ggpbunjz">
Ready to Cook Together?
</span> </div> <h2 id="get-started-heading" class="text-4xl font-bold tracking-tight text-base-content sm:text-5xl lg:text-6xl mb-6 font-botera astro-ggpbunjz">
Start Your Culinary
<span class="text-primary astro-ggpbunjz">Journey</span> </h2> <p class="text-lg leading-8 text-base-content/70 mb-8 max-w-xl mx-auto astro-ggpbunjz">
Join thousands of food enthusiasts who've discovered the joy of cooking together.
          Create clubs, share recipes, and build lasting friendships around the table.
</p> <div class="flex flex-col sm:flex-row gap-4 justify-center items-center astro-ggpbunjz"> <a href="/register" class="btn btn-primary btn-lg px-8 py-4 text-lg font-semibold shadow-lg hover:shadow-xl transition-all duration-200 hover:scale-105 focus:scale-105 astro-ggpbunjz" role="button" aria-describedby="get-started-description"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-plus astro-ggpbunjz"> <path d="M5 12h14"></path><path d="M12 5v14"></path>  </svg>
Get Started Free
</a> <!-- <a
            href="/clubs"
            class="btn btn-outline btn-lg px-8 py-4 text-lg"
            role="button"
            aria-describedby="get-started-description"
          >
            Explore Clubs
          </a> --> </div> <!-- 
        <p
          id="get-started-description"
          class="text-sm text-base-content/60 mt-4"
          role="note"
        >
          No credit card required • Free forever • Join in seconds
        </p> --> </div> </div> </div> </div> <script type="module">class o{section;content;constructor(){if(this.section=document.getElementById("get-started-section"),this.content=document.getElementById("get-started-content"),!this.section||!this.content){console.warn("GetStarted animation elements not found");return}this.initObserver()}initObserver(){if(!this.section)return;const e={root:null,rootMargin:"-10% 0px -10% 0px",threshold:.1},t=new IntersectionObserver(n=>{n.forEach(s=>{s.isIntersecting&&(this.animateIn(),t.unobserve(s.target))})},e);t.observe(this.section)}animateIn(){if(!this.content)return;this.content.classList.remove("opacity-0","translate-y-8"),this.content.classList.add("opacity-100","translate-y-0");const e=this.content.children;Array.from(e).forEach((t,n)=>{setTimeout(()=>{t.classList.add("animate-fade-in-up")},n*150)})}}document.addEventListener("DOMContentLoaded",()=>{new o});document.addEventListener("astro:page-load",()=>{new o});</script>     </main> <footer class="bg-base-100" role="contentinfo"> <div class="container mx-auto px-4 py-12 sm:px-6 sm:py-16 lg:px-8 lg:py-20"> <!-- Flexible Bento Grid Layout --> <div class="grid grid-cols-1 lg:grid-cols-12 gap-6 lg:gap-8"> <!-- Newsletter Section - Left Side --> <div class="lg:col-span-5"> <div class="bg-base-200/30 rounded-2xl p-6 sm:p-8 border border-base-300/20 h-full"> <div class="text-center sm:text-left"> <h2 class="text-xl sm:text-2xl font-semibold text-base-content mb-3 font-botera">
Where Recipes Come Alive <span class="text-xs font-normal">™</span> </h2> <p class="text-base-content/70 mb-6 text-sm sm:text-base leading-relaxed">
Discover, cook, and connect with food lovers around the world.
</p> <div class="flex justify-center sm:justify-start"> <div id="newsletter-form-container" class="w-full max-w-md mx-auto"> <form id="newsletter-form" class="space-y-4" role="form" aria-label="Newsletter subscription form" novalidate> <!-- Email Input with Design System Styling --> <div class="form-control"> <label for="email" class="label"> <span class="label-text text-base-content font-medium">Email Address</span> </label> <div class="join w-full"> <input id="email" type="email" placeholder="your.email@example.com" class="input input-bordered join-item flex-1 focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2 transition-all duration-200" required aria-describedby="newsletter-help email-error" aria-invalid="false" autocomplete="email"> <button id="submit-btn" type="submit" class="btn btn-primary join-item px-6 transition-all duration-200 hover:scale-105 focus:scale-105 focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2" aria-label="Subscribe to newsletter" disabled> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" class="lucide lucide-mail w-4 h-4"> <path d="m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7"></path><rect x="2" y="4" width="20" height="16" rx="2"></rect>  </svg> <span class="hidden sm:inline ml-2">Join the Table</span> </button> </div> <!-- Error Message --> <div id="email-error" class="label" role="alert" aria-live="polite"> <span class="label-text-alt text-error hidden"></span> </div> <!-- Help Text --> <div id="newsletter-help" class="label"> <span class="label-text-alt text-base-content/60 break-words whitespace-normal leading-relaxed">
Pull up a seat — recipes, club updates, and culinary stories delivered to you.
</span> </div> </div> <!-- Loading State --> <div id="loading-state" class="hidden items-center justify-center py-2"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" class="lucide lucide-loader w-4 h-4 animate-spin text-primary mr-2"> <path d="M12 2v4"></path><path d="m16.2 7.8 2.9-2.9"></path><path d="M18 12h4"></path><path d="m16.2 16.2 2.9 2.9"></path><path d="M12 18v4"></path><path d="m4.9 19.1 2.9-2.9"></path><path d="M2 12h4"></path><path d="m4.9 4.9 2.9 2.9"></path>  </svg> <span class="text-sm text-base-content/70">Processing...</span> </div> <!-- Success/Error Messages --> <div id="newsletter-message" class="text-sm min-h-[1.25rem] flex items-center justify-center" role="status" aria-live="polite" aria-atomic="true"></div> </form> </div> <script type="module">const f=document.getElementById("newsletter-form"),i=document.getElementById("email"),u=document.getElementById("submit-btn"),s=document.getElementById("newsletter-message"),l=document.getElementById("email-error"),o=document.getElementById("loading-state");function g(e){return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e)}function n(e,t=!1){i.setAttribute("aria-invalid",e?"false":"true"),u.disabled=!e||t,t?(o.classList.remove("hidden"),o.classList.add("flex"),u.innerHTML='<Loader class="w-4 h-4 animate-spin" aria-hidden="true" />'):(o.classList.add("hidden"),o.classList.remove("flex"))}function d(e){const t=l.querySelector("span");t.textContent=e,t.classList.remove("hidden"),l.classList.remove("hidden")}function c(){l.querySelector("span").classList.add("hidden"),l.classList.add("hidden")}i.addEventListener("input",e=>{const t=e.target.value,a=g(t);t.length===0?(c(),n(!1)):a?(c(),n(!0)):(d("Please enter a valid email address"),n(!1))});f.addEventListener("submit",async e=>{e.preventDefault();const t=i.value.trim();s.textContent="",c(),n(!1,!0);try{const a=await fetch("/api/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:t})}),r=await a.json();if(a.ok)s.textContent=r.message||"Successfully joined the table!",s.className="text-success",i.value="",n(!1);else{const m=r.message||"Failed to join the table. Please try again.";s.textContent=m,s.className="text-error",d(m),n(!1)}}catch(a){console.error("Submission error:",a);const r="Network error. Please check your connection and try again.";s.textContent=r,s.className="text-error",d(r),n(!1)}});</script> </div> </div> </div> </div> <!-- Navigation Links Grid - Right Side --> <div class="lg:col-span-7"> <div class="grid grid-cols-2 gap-4 lg:gap-6 h-full"> <!-- About Links --> <div class="bg-base-200/30 rounded-xl p-5 border border-base-300/20"> <nav aria-labelledby="footer-about-heading"> <h3 id="footer-about-heading" class="font-medium text-base-content mb-3 text-sm">
About
</h3> <ul class="space-y-2"> <li> <a href="/about-us" class="text-base-content/70 hover:text-base-content transition-colors duration-200 text-sm leading-relaxed block"> Our Story </a> </li><li> <span class="text-base-content/40 cursor-not-allowed text-sm leading-relaxed block" aria-disabled="true"> Press <span class="text-xs text-primary"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" class="lucide lucide-party-popper inline w-4 h-4 ml-1 mb-0.5"> <path d="M5.8 11.3 2 22l10.7-3.79"></path><path d="M4 3h.01"></path><path d="M22 8h.01"></path><path d="M15 2h.01"></path><path d="M22 20h.01"></path><path d="m22 2-2.24.75a2.9 2.9 0 0 0-1.96 3.12c.1.86-.57 1.63-1.45 1.63h-.38c-.86 0-1.6.6-1.76 1.44L14 10"></path><path d="m22 13-.82-.33c-.86-.34-1.82.2-1.98 1.11c-.11.7-.72 1.22-1.43 1.22H17"></path><path d="m11 2 .33.82c.34.86-.2 1.82-1.11 1.98C9.52 4.9 9 5.52 9 6.23V7"></path><path d="M11 13c1.93 1.93 2.83 4.17 2 5-.83.83-3.07-.07-5-2-1.93-1.93-2.83-4.17-2-5 .83-.83 3.07.07 5 2Z"></path>  </svg> 
Soon!
</span> </span> </li> </ul> </nav> </div> <!-- Clubs Links --> <div class="bg-base-200/30 rounded-xl p-5 border border-base-300/20"> <nav aria-labelledby="footer-clubs-heading"> <h3 id="footer-clubs-heading" class="font-medium text-base-content mb-3 text-sm">
Clubs
</h3> <ul class="space-y-2"> <li> <a href="/clubs/list" class="text-base-content/70 hover:text-base-content transition-colors duration-200 text-sm leading-relaxed block"> Find A Club </a> </li><li> <a href="/how-it-works" class="text-base-content/70 hover:text-base-content transition-colors duration-200 text-sm leading-relaxed block"> How It Works </a> </li><li> <a href="/club/create" class="text-base-content/70 hover:text-base-content transition-colors duration-200 text-sm leading-relaxed block"> Host A Club </a> </li><li> <a href="/club/create" class="text-base-content/70 hover:text-base-content transition-colors duration-200 text-sm leading-relaxed block"> Create An Event </a> </li> </ul> </nav> </div> <!-- Community Links --> <div class="bg-base-200/30 rounded-xl p-5 border border-base-300/20"> <nav aria-labelledby="footer-community-heading"> <h3 id="footer-community-heading" class="font-medium text-base-content mb-3 text-sm">
Community
</h3> <ul class="space-y-2"> <li> <span class="text-base-content/40 cursor-not-allowed text-sm leading-relaxed block" aria-disabled="true"> Events <span class="text-xs text-primary"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" class="lucide lucide-party-popper inline w-4 h-4 ml-1 mb-0.5"> <path d="M5.8 11.3 2 22l10.7-3.79"></path><path d="M4 3h.01"></path><path d="M22 8h.01"></path><path d="M15 2h.01"></path><path d="M22 20h.01"></path><path d="m22 2-2.24.75a2.9 2.9 0 0 0-1.96 3.12c.1.86-.57 1.63-1.45 1.63h-.38c-.86 0-1.6.6-1.76 1.44L14 10"></path><path d="m22 13-.82-.33c-.86-.34-1.82.2-1.98 1.11c-.11.7-.72 1.22-1.43 1.22H17"></path><path d="m11 2 .33.82c.34.86-.2 1.82-1.11 1.98C9.52 4.9 9 5.52 9 6.23V7"></path><path d="M11 13c1.93 1.93 2.83 4.17 2 5-.83.83-3.07-.07-5-2-1.93-1.93-2.83-4.17-2-5 .83-.83 3.07.07 5 2Z"></path>  </svg> 
Soon!
</span> </span> </li><li> <span class="text-base-content/40 cursor-not-allowed text-sm leading-relaxed block" aria-disabled="true"> Community Guidelines <span class="text-xs text-primary"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" class="lucide lucide-party-popper inline w-4 h-4 ml-1 mb-0.5"> <path d="M5.8 11.3 2 22l10.7-3.79"></path><path d="M4 3h.01"></path><path d="M22 8h.01"></path><path d="M15 2h.01"></path><path d="M22 20h.01"></path><path d="m22 2-2.24.75a2.9 2.9 0 0 0-1.96 3.12c.1.86-.57 1.63-1.45 1.63h-.38c-.86 0-1.6.6-1.76 1.44L14 10"></path><path d="m22 13-.82-.33c-.86-.34-1.82.2-1.98 1.11c-.11.7-.72 1.22-1.43 1.22H17"></path><path d="m11 2 .33.82c.34.86-.2 1.82-1.11 1.98C9.52 4.9 9 5.52 9 6.23V7"></path><path d="M11 13c1.93 1.93 2.83 4.17 2 5-.83.83-3.07-.07-5-2-1.93-1.93-2.83-4.17-2-5 .83-.83 3.07.07 5 2Z"></path>  </svg> 
Soon!
</span> </span> </li> </ul> </nav> </div> <!-- Resources Links --> <div class="bg-base-200/30 rounded-xl p-5 border border-base-300/20"> <nav aria-labelledby="footer-resources-heading"> <h3 id="footer-resources-heading" class="font-medium text-base-content mb-3 text-sm">
Resources
</h3> <ul class="space-y-2"> <li> <a href="/blog" class="text-base-content/70 hover:text-base-content transition-colors duration-200 text-sm leading-relaxed block"> Blog </a> </li><li> <span class="text-base-content/40 cursor-not-allowed text-sm leading-relaxed block" aria-disabled="true"> FAQs <span class="text-xs text-primary"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" class="lucide lucide-party-popper inline w-4 h-4 ml-1 mb-0.5"> <path d="M5.8 11.3 2 22l10.7-3.79"></path><path d="M4 3h.01"></path><path d="M22 8h.01"></path><path d="M15 2h.01"></path><path d="M22 20h.01"></path><path d="m22 2-2.24.75a2.9 2.9 0 0 0-1.96 3.12c.1.86-.57 1.63-1.45 1.63h-.38c-.86 0-1.6.6-1.76 1.44L14 10"></path><path d="m22 13-.82-.33c-.86-.34-1.82.2-1.98 1.11c-.11.7-.72 1.22-1.43 1.22H17"></path><path d="m11 2 .33.82c.34.86-.2 1.82-1.11 1.98C9.52 4.9 9 5.52 9 6.23V7"></path><path d="M11 13c1.93 1.93 2.83 4.17 2 5-.83.83-3.07-.07-5-2-1.93-1.93-2.83-4.17-2-5 .83-.83 3.07.07 5 2Z"></path>  </svg> 
Soon!
</span> </span> </li> </ul> </nav> </div> </div> </div> </div> <!-- Enhanced Social Links & Copyright --> <div class="mt-12 pt-6 border-t border-base-300/20"> <div class="flex flex-col items-center gap-8 lg:flex-row lg:justify-between"> <!-- Enhanced Social Links --> <div class="w-full lg:w-auto"> <div class="grid grid-cols-1 sm:grid-cols-2 gap-4 max-w-md mx-auto lg:max-w-none lg:mx-0"> <!-- TastyHandbook Social Links --> <div class="bg-base-200/30 rounded-xl p-5 border border-base-300/20"> <h3 class="font-medium text-base-content mb-3 text-sm text-center">
Follow TastyHandbook
</h3> <nav aria-label="TastyHandbook social media links"> <ul class="flex justify-center gap-3"> <li> <a href="https://instagram.com/tastyhandbook" aria-label="Follow TastyHandbook on Instagram" class="w-10 h-10 rounded-lg bg-base-200/50 hover:bg-base-200 flex items-center justify-center text-base-content/60 hover:text-base-content transition-all duration-200 hover:scale-105 focus:scale-105 focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2" target="_blank" rel="noopener noreferrer"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" class="lucide lucide-instagram w-4 h-4"> <rect width="20" height="20" x="2" y="2" rx="5" ry="5"></rect><path d="M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z"></path><line x1="17.5" x2="17.51" y1="6.5" y2="6.5"></line>  </svg> </a> </li><li> <a href="https://youtube.com/@tastyhandbook" aria-label="Subscribe to TastyHandbook on YouTube" class="w-10 h-10 rounded-lg bg-base-200/50 hover:bg-base-200 flex items-center justify-center text-base-content/60 hover:text-base-content transition-all duration-200 hover:scale-105 focus:scale-105 focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2" target="_blank" rel="noopener noreferrer"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" class="lucide lucide-youtube w-4 h-4"> <path d="M2.5 17a24.12 24.12 0 0 1 0-10 2 2 0 0 1 1.4-1.4 49.56 49.56 0 0 1 16.2 0A2 2 0 0 1 21.5 7a24.12 24.12 0 0 1 0 10 2 2 0 0 1-1.4 1.4 49.55 49.55 0 0 1-16.2 0A2 2 0 0 1 2.5 17"></path><path d="m10 15 5-3-5-3z"></path>  </svg> </a> </li> </ul> </nav> </div> <!-- Adelina Social Links --> <div class="bg-base-200/30 rounded-xl p-5 border border-base-300/20"> <h3 class="font-medium text-base-content mb-3 text-sm text-center">
Follow Adelina
</h3> <nav aria-label="Adelina social media links"> <ul class="flex justify-center gap-3"> <li> <a href="https://instagram.com/mytastyhandbook" aria-label="Follow Adelina on Instagram" class="w-10 h-10 rounded-lg bg-base-200/50 hover:bg-base-200 flex items-center justify-center text-base-content/60 hover:text-base-content transition-all duration-200 hover:scale-105 focus:scale-105 focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2" target="_blank" rel="noopener noreferrer"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" class="lucide lucide-instagram w-4 h-4"> <rect width="20" height="20" x="2" y="2" rx="5" ry="5"></rect><path d="M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z"></path><line x1="17.5" x2="17.51" y1="6.5" y2="6.5"></line>  </svg> </a> </li><li> <a href="https://youtube.com/@mytastyhandbook" aria-label="Subscribe to Adelina on YouTube" class="w-10 h-10 rounded-lg bg-base-200/50 hover:bg-base-200 flex items-center justify-center text-base-content/60 hover:text-base-content transition-all duration-200 hover:scale-105 focus:scale-105 focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2" target="_blank" rel="noopener noreferrer"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" class="lucide lucide-youtube w-4 h-4"> <path d="M2.5 17a24.12 24.12 0 0 1 0-10 2 2 0 0 1 1.4-1.4 49.56 49.56 0 0 1 16.2 0A2 2 0 0 1 21.5 7a24.12 24.12 0 0 1 0 10 2 2 0 0 1-1.4 1.4 49.55 49.55 0 0 1-16.2 0A2 2 0 0 1 2.5 17"></path><path d="m10 15 5-3-5-3z"></path>  </svg> </a> </li> </ul> </nav> </div> </div> </div> <!-- Copyright --> <div class="lg:text-right"> <p class="text-base-content/50 text-sm">
© 2026 Practical Pixel Studio LLC. All rights
            reserved.
<a href="#" class="text-base-content/50 hover:text-base-content transition-colors duration-200 text-sm ml-1">
Terms.
</a> <a href="#" class="text-base-content/50 hover:text-base-content transition-colors duration-200 text-sm ml-1">
Privacy.
</a> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" class="lucide lucide-scroll-text inline w-4 h-4 ml-1 mb-0.5 text-base-content/50"> <path d="M15 12h-5"></path><path d="M15 8h-5"></path><path d="M19 17V5a2 2 0 0 0-2-2H4"></path><path d="M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3"></path>  </svg> </p> </div> </div> </div> </div> </footer> <!-- Mobile Orientation Feedback Component --> <astro-island uid="wxd8W" component-url="/_astro/OrientationFeedback.DhyEuas9.js" component-export="default" renderer-url="/_astro/client.Dnh0jofZ.js" props="{}" ssr client="only" opts="{&quot;name&quot;:&quot;OrientationFeedback&quot;,&quot;value&quot;:&quot;react&quot;}"></astro-island> <!-- Mobile Orientation Lock Script --> <script type="module">document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{if(window.silktideCookieBannerManager)try{window.silktideCookieBannerManager.updateCookieBannerConfig({background:{showBackground:!0},cookieIcon:{position:"bottomLeft"},cookieTypes:[{id:"necessary",name:"Necessary",description:"<p>These cookies are necessary for the website to function properly and cannot be switched off. They help with things like logging in and setting your privacy preferences.</p>",required:!0,onAccept:function(){console.log("Necessary cookies enabled")}},{id:"analytics",name:"Analytics",description:"<p>These cookies help us improve the site by tracking which pages are most popular and how visitors move around the site.</p>",defaultValue:!0,onAccept:function(){window.gtag&&window.dataLayer&&(window.gtag("consent","update",{analytics_storage:"granted"}),window.dataLayer.push({event:"consent_accepted_analytics"}))},onReject:function(){window.gtag&&window.gtag("consent","update",{analytics_storage:"denied"})}},{id:"advertising",name:"Advertising",description:"<p>These cookies provide extra features and personalization to improve your experience. They may be set by us or by partners whose services we use.</p>",onAccept:function(){window.gtag&&window.dataLayer&&(window.gtag("consent","update",{ad_storage:"granted",ad_user_data:"granted",ad_personalization:"granted"}),window.dataLayer.push({event:"consent_accepted_advertising"}))},onReject:function(){window.gtag&&window.gtag("consent","update",{ad_storage:"denied",ad_user_data:"denied",ad_personalization:"denied"})}}],text:{banner:{description:'<p>We use cookies on our site to enhance your user experience, provide personalized content, and analyze our traffic. <a href="https://tastyhandbook.com/cookie-policy" target="_blank">Cookie Policy.</a></p>',acceptAllButtonText:"Accept all",acceptAllButtonAccessibleLabel:"Accept all cookies",rejectNonEssentialButtonText:"Reject non-essential",rejectNonEssentialButtonAccessibleLabel:"Reject non-essential"}},position:{banner:"bottomLeft"}})}catch(e){console.error("Failed to initialize Silktide Cookie Banner:",e)}else console.warn("Silktide Cookie Banner Manager not available")},100)});</script> <!-- Silktide Cookie Consent Banner Script --> <script src="/cookie-banner/silktide-consent-manager.js"></script> <!-- Error handling and fallbacks for cookie banner --> <script type="module">window.addEventListener("error",r=>{const e=r.target;if(e&&e.src&&e.src.includes("silktide-consent-manager")){console.error("Silktide Cookie Banner failed to load:",r.error);const o=document.createElement("div");o.style.cssText=`
            position: fixed; bottom: 20px; left: 20px; z-index: 99999;
            background: #f3f4f6; border: 1px solid #d1d5db; border-radius: 8px;
            padding: 16px; color: #374151; font-family: system-ui;
            max-width: 320px; box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
          `,o.innerHTML=`
            <p><strong>Cookie Notice:</strong> We use cookies to enhance your experience. 
            <a href="#" onclick="this.closest('div').remove(); return false;">Continue</a></p>
          `,document.body.appendChild(o)}});</script> <!-- Initialize Cookie Banner with Error Handling --> <script type="module" src="/_astro/BaseLayout.astro_astro_type_script_index_2_lang.DVwTp37x.js"></script> </body> </html>