PageSourceSearch

http://www.clickthecity.com/assets/food-drink-BTswXW6O.js

js clickthecity.com collected 2026-10-01 10:24:38 UTC 44,713 bytes, 1 lines download raw bytes

1import{r as d,j as e}from"./vendor-BrGQ9Xpj.js";import{r as W,s as Y,B as S,t as X,v as Z,w as T,x as E,y as ee,z as ae,F as te,G as I,H as se,J as ie,K as re,L as ne,M as oe,I as me,N as ge,O as he,P as xe,a as pe,b as fe,A as ye,C as je,S as be,c as U,Q as ve,R as we,p as Ne,U as ke,d as _e}from"./index-CV7o-OX-.js";import{u as q}from"./vendor-query-DTD5oGKG.js";import{L as $}from"./vendor-router-CaznPqhZ.js";import{ah as z,V as Q,f as O,X as Ce,a0 as B,b as Se,S as Fe,m as le,e as Me}from"./vendor-icons-B1IAwVBM.js";import"./vendor-ui-DF9RWY8g.js";function Le(s){const{location:u,loading:p,error:w,requestLocation:g}=W(),[k,l]=d.useState(s?.page||1),F={latitude:14.5995,longitude:120.9842},[t,b]=d.useState({latitude:u?.lat||s?.initialLat||F.latitude,longitude:u?.lng||s?.initialLng||F.longitude}),y=(s?.radius||1)*1e3,x=k;return d.useEffect(()=>{if(!u&&!p&&!w){try{const h=localStorage.getItem("userLocation");if(h){const r=JSON.parse(h);if(r.lat&&r.lng){console.log("Food-drink: Using cached location from localStorage:",r),b({latitude:r.lat,longitude:r.lng});return}}}catch(h){console.warn("Food-drink: Failed to parse cached location:",h)}console.log("Food-drink: No cached location found, requesting new location"),g()}},[u,p,w,g]),d.useEffect(()=>{u&&b({latitude:u.lat,longitude:u.lng})},[u]),d.useEffect(()=>{w&&!u&&(console.log("Food-drink: Location access denied, setting Manila fallback"),b({latitude:14.5995,longitude:120.9842}))},[w,u]),{...q({queryKey:["/api/food-drink/nearby",t.latitude,t.longitude,y,x],queryFn:async()=>{if(t.latitude===null||t.longitude===null)return console.log("Food-drink: No coordinates yet, returning empty data"),{data:[],message:"Getting location...",status:!0,paging:{offset:0,row_count:0,previous:0,page:1,next:0},radius:y/1e3};console.log("Food-drink: Fetching restaurants with coordinates",{lat:t.latitude,lng:t.longitude,radius:y});try{const h=`/api/food-drink/nearby?latitude=${t.latitude}&longitude=${t.longitude}&radius=${y}&page=${x}`;console.log("Food-drink: Sending request to",h);const r=await fetch(h);if(console.log("Food-drink: API response status:",r.status),!r.ok){const v=await r.text();return console.error("Food-drink: ClickTheCity API error:",v),{data:[],message:`API Error: ${r.status} ${r.statusText}`,status:!1,paging:{offset:0,row_count:0,previous:0,page:1,next:0},radius:y/1e3}}const c=await r.json();if(console.log("Food-drink: ClickTheCity API response status:",c.status,"Results count:",c.data?.length||0),!c.status||!c.data)return console.error("Food-drink: ClickTheCity API returned error:",c.message),{data:[],message:c.message||"Failed to get restaurant data",status:!1,paging:{offset:0,row_count:0,previous:0,page:1,next:0},radius:y/1e3,show_alternative_content:!0};if(c.data.length>0){const v=c.data.map(o=>{const m=typeof o.primary_type=="string"?[o.primary_type]:Array.isArray(o.primary_type)?o.primary_type:["restaurant"];let j=o.distance||"";return!j&&o.distance_km?j=`${o.distance_km.toFixed(1)} km`:!j&&o.distance_m&&(j=o.distance_m>1e3?`${(o.distance_m/1e3).toFixed(1)} km`:`${o.distance_m.toFixed(0)} m`),{id:o.id,primary_type:m,primary_type_name:o.primary_type_name||"Restaurant",branch_name:o.branch_name,address:o.address,address_components:o.address_components||{city:"Manila",province:"Metro Manila"},logo:o.logo,distance:j||"Unknown distance",rating:o.rating}});return{data:v,message:"Success",status:!0,paging:c.paging||{offset:0,row_count:v.length,previous:0,page:1,next:0},radius:y/1e3}}return{data:[],message:"No restaurants found in this area",status:!0,paging:{offset:0,row_count:0,previous:0,page:1,next:0},radius:y/1e3}}catch(h){return console.error("Error fetching restaurants:",h),{data:[],message:h.message||"Failed to fetch restaurant data",status:!1,paging:{offset:0,row_count:0,previous:0,page:1,next:0},radius:y/1e3}}},enabled:t.latitude!==null&&t.longitude!==null}),coordinates:t,setCoordinates:b,page:x,currentPage:x,setPage:l,refreshLocation:()=>{console.log("Refreshing location for nearby restaurants...");try{const h=localStorage.getItem("userLocation");if(h){const r=JSON.parse(h);if(r.lat&&r.lng){console.log("Successfully got user location for nearby restaurants:",r),b({latitude:r.lat,longitude:r.lng});return}}}catch(h){console.warn("Food-drink: Failed to parse cached location during refresh:",h)}
1console.log("Food-drink: No cached location found during refresh, using Manila fallback"),b({latitude:14.5995,longitude:120.9842})}}}function Pe({title:s="Nearby Restaurants",subtitle:u="Discover great food around you",maxItems:p=6,initialLat:w,initialLng:g,radius:k=1,initialPage:l=1,showPagination:F=!1}){const{data:t,isLoading:b,isError:y,coordinates:x,setCoordinates:P,setPage:R}=Le({initialLat:w,initialLng:g,radius:k,page:l}),[h,r]=d.useState([]),[c,v]=d.useState("all");d.useEffect(()=>{r([])},[x.latitude,x.longitude]),d.useEffect(()=>{t?.data&&t.data.length>0&&r(a=>{const n=new Set(a.map(C=>C.id)),_=t.data.filter(C=>!n.has(C.id));return[...a,..._]})},[t?.data]);const{toast:o}=Y(),m=()=>{console.log("Refreshing location for nearby restaurants..."),r([]),R(1),navigator.geolocation?(o({title:"Getting your location",description:"Please allow location access if prompted"}),navigator.geolocation.getCurrentPosition(a=>{const n={latitude:a.coords.latitude,longitude:a.coords.longitude};console.log("Successfully got user location for nearby restaurants:",{lat:n.latitude,lng:n.longitude}),localStorage.setItem("userLocation",JSON.stringify({...n,timestamp:Date.now()})),P(n),o({title:"Location updated",description:"Finding restaurants near your current location"})},a=>{a.code!==2&&console.error("Error getting location for nearby restaurants:",a.code,a.message);let n="Could not get your location.",_="destructive";a.code===1?n="Location access was denied. Please enable location services in your browser settings.":a.code===2?n="Your location cannot be determined. Try a different device or browser.":a.code===3&&(n="Location request timed out. Please try again."),o({title:"Location error",description:n,variant:_}),P({latitude:14.5995,longitude:120.9842})},{enableHighAccuracy:!0,timeout:15e3,maximumAge:6e4})):(console.log("Geolocation not supported by browser for restaurant search"),o({title:"Not supported",description:"Geolocation is not supported by your browser. Using default location instead.",variant:"destructive"}),P({latitude:14.5995,longitude:120.9842}))},j=a=>{const n=encodeURIComponent(`${a.branch_name}, ${a.address}`);window.open(`https://maps.google.com/maps?q=${n}`,"_blank")},M=()=>h.length?c==="all"?h:h.filter(a=>typeof a.primary_type=="string"?a.primary_type.toLowerCase().includes(c):a.primary_type_name?.toLowerCase().includes(c)):[],i=()=>{t?.paging&&t.paging.next>0&&R(t.paging.next)};return e.jsxs("div",{className:"w-full space-y-4 py-6",children:[e.jsxs("div",{className:"flex flex-col md:flex-row md:items-center md:justify-between",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-3xl font-bold tracking-tight",children:s}),e.jsx("p",{className:"text-muted-foreground",children:u})]}),e.jsx("div",{className:"mt-2 md:mt-0",children:e.jsxs(S,{variant:"outline",onClick:m,className:"flex items-center space-x-2",children:[e.jsx(z,{className:"h-4 w-4"}),e.jsx("span",{children:"Current Location"})]})})]}),b?e.jsxs("div",{className:"flex flex-col items-center justify-center py-12",children:[e.jsx(Q,{className:"h-8 w-8 animate-spin text-muted-foreground"}),e.jsx("p",{className:"mt-4 text-muted-foreground",children:"Finding nearby restaurants..."}),x.latitude&&x.longitude&&e.jsxs("p",{className:"text-xs text-muted-foreground mt-2",children:["Searching at coordinates: ",x.latitude.toFixed(4),", ",x.longitude.toFixed(4)]})]}):t?.show_alternative_content||t?.is_referer_restricted||t?.message&&(t?.message?.includes("Google Places API")||t?.message?.includes("API key")||t?.message?.includes("referer"))?e.jsxs("div",{children:[e.jsxs("div",{className:"mb-6 rounded-lg bg-amber-50 p-4 text-amber-800",children:[e.jsxs("h3",{className:"flex items-center text-lg font-medium",children:[e.jsx(O,{className:"mr-2 h-5 w-5"}),t?.referer_message||"Google Places API is currently unavailable"]}),e.jsx("p",{className:"mt-2",children:t?.is_referer_restricted?"We're showing popular restaurants in Manila based on local recommendations. Your location is still being used for distance calculations.":"We're showing you popular restaurants in Manila instead. You can try again later or search for specific restaurants."})]}),e.jsx("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-2 md:grid-cols-3",children:[{id:"jollibee-manila",branch_name:"Jollibee",primary_type_name:"Fast Food Restaurant",address:"Multiple locations in Manila",distance:"Popular"},{id:"sm-megamall-food-court",branch_name:"SM Megamall Food Court",primary_type_name:"Food Court",address:"SM Megamall, Mandaluyong, Metro Manila",distance:"Popular"},{id:"maxs-restaurant-manila",branch_name:"Max's Restaurant",primary_type_name:"Filipino Restaurant",address:"Multiple locations in Manila",distance:"Popular"},{id:"mang-inasal-manila",branch_name:"Mang Inasal",primary_type_name:"Filipino Restaurant",address:"Multiple locations in Manila",distance:"Popular"},{id:"tokyo-tokyo-manila",branch_name:"Tokyo Tokyo",primary_type_name:"Japanese Restaurant",address:"Multiple locations in Manila",distance:"Popular"},{id:"mcdonalds-manila",branch_name:"McDonald's",primary_type_name:"Fast Food Restaurant",address:"Multiple locations in Manila",distance:"Popular"}].slice(0,p).map(a=>e.jsx(G,{restaurant:a,onDirections:()=>j(a)},a.id))}),e.jsx("div",{className:"mt-6 text-center",children:e.jsxs(S,{onClick:m,variant:"outline",children:[e.jsx(z,{className:"mr-2 h-4 w-4"}),"Try Again with Current Location"]})})]}):y?e.jsxs("div",{className:"rounded-lg bg-red-50 p-8 text-center",children:[e.jsx("p",{className:"text-red-600 text-lg font-bold",children:"Sorry, we couldn't load nearby restaurants."}),e.jsx("p",{className:"text-red-500 mt-2",children:"This may be due to:"}),e.jsxs("ul",{className:"text-red-500 mt-1 list-disc list-inside text-left max-w-md mx-auto",children:[e.jsx("li",{children:"Location services being disabled in your browser"}),e.jsx("li",{children:"The Google Places API service being temporarily unavailable"}),e.jsx("li",{children:"Network connectivity issues"})]}),e.jsxs("div",{className:"flex flex-col sm:flex-row gap-3 justify-center mt-6",children:[e.jsxs(S,{onClick:m,variant:"outline",children:[e.jsx(z,{className:"mr-2 h-4 w-4"}),"Try Again with Current Location"]}),e.jsxs(S,{onClick:()=>{P({latitude:14.5995,longitude:120.9842}),o({title:"Using Manila location",description:"Searching for restaurants in Manila"})},variant:"default",children:[e.jsx(O,{className:"mr-2 h-4 w-4"}),"Use Manila Location"]})]}),e.jsxs("div",{className:"mt-6 text-xs text-red-500/70 border-t border-red-200 pt-4",children:[e.jsx("p",{children:"If you've already allowed location access and still see this error, try:"}),e.jsxs("ul",{className:"list-disc list-inside text-left max-w-md mx-auto mt-2",children:[e.jsx("li",{children:"Refreshing the page"}),e.jsx("li",{children:"Checking your browser's location settings"}),e.jsx("li",{children:"Using a different browser"})]})]})]}):h.length>0?e.jsxs(X,{defaultValue:"all",className:"w-full",onValueChange:v,children:[e.jsxs(Z,{className:"mb-4",children:[e.jsx(T,{value:"all",children:"All"}),e.jsx(T,{value:"restaurant",children:"Restaurants"}),e.jsx(T,{value:"cafe",children:"Cafés"}),e.jsx(T,{value:"bar",children:"Bars"})]}),e.jsxs(E,{value:"all",className:"mt-0",children:[e.jsx("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-2 md:grid-cols-3",children:M().map(a=>e.jsx(G,{restaurant:a,onDirections:()=>j(a)},`${a.id}-${a.branch_name}`))}),t?.paging&&t.paging.next>0&&e.jsx("div",{className:"mt-8 text-center",children:e.jsx(S,{variant:"outline",size:"lg",className:"px-8",onClick:i,children:"Load More Restaurants"})})]}),e.jsxs(E,{value:"restaurant",className:"mt-0",children:[e.jsx("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-2 md:grid-cols-3",children:M().map(a=>e.jsx(G,{restaurant:a,onDirections:()=>j(a)},`${a.id}-${a.branch_name}`))}),t?.paging&&t.paging.next>0&&e.jsx("div",{className:"mt-8 text-center",children:e.jsx(S,{variant:"outline",size:"lg",className:"px-8",onClick:i,children:"Load More Restaurants"})})]}),e.jsxs(E,{value:"cafe",className:"mt-0",children:[e.jsx("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-2 md:grid-cols-3",children:M().map(a=>e.jsx(G,{restaurant:a,onDirections:()=>j(a)},`${a.id}-${a.branch_name}`))}),t?.paging&&t.paging.next>0&&e.jsx("div",{className:"mt-8 text-center",children:e.jsx(S,{variant:"outline",size:"lg",className:"px-8",onClick:i,children:"Load More Cafés"})})]}),e.jsxs(E,{value:"bar",className:"mt-0",children:[e.jsx("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-2 md:grid-cols-3",children:M().map(a=>e.jsx(G,{restaurant:a,onDirections:()=>j(a)},`${a.id}-${a.branch_name}`))}),t?.paging&&t.paging.next>0&&e.jsx("div",{className:"mt-8 text-center",children:e.jsx(S,{variant:"outline",size:"lg",className:"px-8",onClick:i,children:"Load More Bars"})})]})]}):e.jsxs("div",{className:"rounded-lg bg-muted p-8 text-center",children:[e.jsx("p",{className:"text-lg font-medium",children:"No restaurants found near this location"}),e.jsx("p",{className:"text-muted-foreground mt-2",children:"Try searching in a different area"}),e.jsx("div",{className:"flex justify-center mt-4",children:e.jsxs(S,{onClick:m,variant:"outline",children:[e.jsx(z,{className:"mr-2 h-4 w-4"}),"Try Current Location"]})})]})]})}function G({restaurant:s,onDirections:u}){const p=ee(s.branch_name),w=l=>{if(!l)return"";if(l.includes("km")||isNaN(parseFloat(l)))return l;const F=l.replace(/[^\d.]/g,""),t=parseFloat(F);return t>=1e3?`${(t/1e3).toFixed(1)} km`:`${Math.round(t)} m`};s.id?.toString();const g=s.rating||null,k=s.total_reviews||0;return e.jsxs(ae,{className:"overflow-hidden hover:shadow-md transition-shadow flex flex-col h-full",children:[e.jsxs(te,{className:"p-4 pb-2 relative",children:[s.distance&&e.jsx(I,{variant:"outline",className:"border-muted-foreground
1/30 text-muted-foreground absolute top-4 right-4",children:w(s.distance)}),e.jsx(se,{className:"text-lg pr-20",children:e.jsx($,{href:`/food-drink/${s.id}/${p}`,className:"hover:text-primary",children:s.branch_name})}),e.jsx(ie,{className:"flex items-center",children:s.primary_type_name||"Restaurant"})]}),e.jsxs(re,{className:"p-4 pt-0 flex-grow",children:[e.jsx("p",{className:"text-muted-foreground text-sm mb-2",children:s.address}),e.jsxs("div",{className:"flex flex-wrap gap-1",children:[g&&e.jsxs(I,{variant:"secondary",className:"bg-emerald-50 text-emerald-700 hover:bg-emerald-100",children:["★ ",g," ",e.jsxs("span",{className:"text-xs ml-1",children:["(",k," ",k===1?"review":"reviews",")"]})]}),s.rating&&!g&&e.jsxs(I,{variant:"secondary",className:"bg-amber-50 text-amber-700 hover:bg-amber-100",children:["★ ",s.rating]}),s.rating&&g&&e.jsxs(I,{variant:"secondary",className:"bg-amber-50 text-amber-700 hover:bg-amber-100",children:["★ ",s.rating," ",e.jsx("span",{className:"text-xs ml-1",children:"(API)"})]})]})]}),e.jsxs(ne,{className:"p-4 pt-0 flex justify-between mt-auto",children:[e.jsxs(S,{variant:"outline",size:"sm",onClick:u,children:[e.jsx(O,{className:"h-4 w-4 mr-1"}),e.jsx("span",{children:"Directions"})]}),e.jsx(oe,{url:`${window.location.origin}/food-drink/${s.id}/${p}`,title:`Check out ${s.branch_name} on ClickTheCity`,size:"sm",iconSize:16,variant:"review"})]})]})}function Re(s={}){const{location:u,loading:p,error:w,requestLocation:g}=W(),k={latitude:14.5547,longitude:121.0244},[l,F]=d.useState({latitude:s.initialLat||k.latitude,longitude:s.initialLng||k.longitude}),[t,b]=d.useState({query:s.query||"",category:s.category||"",radius:s.radius||10,page:s.page||1});d.useEffect(()=>{s.query!==void 0&&s.query!==t.query&&b(r=>({...r,query:s.query||"",page:1}))},[s.query,t.query]),d.useEffect(()=>
1{!u&&!p&&!w&&g()},[u,p,w,g]),d.useEffect(()=>{u&&F({latitude:u.lat,longitude:u.lng})},[u]);const y=()=>l.latitude!==null&&l.longitude!==null?l:u?{latitude:u.lat,longitude:u.lng}:MANILA_FALLBACK,[x,P]=d.useState(t.query);return d.useEffect(()=>{const r=setTimeout(()=>{P(t.query)},300);return()=>clearTimeout(r)},[t.query]),{...q({queryKey:["/api/food-drink/search",l.latitude,l.longitude,t.radius,t.query,t.category,t.page],enabled:!!(l.latitude&&l.longitude),queryFn:async()=>{const r=y();if(!r||!r.latitude||!r.longitude)return{data:[],message:"Getting your location...",status:!1,paging:{offset:0,row_count:0,previous:0,page:1,next:0},radius:t.radius};console.log("Restaurant search: Fetching data with coordinates",{latitude:r.latitude,longitude:r.longitude,radius:t.radius,query:t.query,category:t.category,page:t.page});const c=new URL("/api/food-drink/search",window.location.origin);c.searchParams.append("latitude",r.latitude.toString()),c.searchParams.append("longitude",r.longitude.toString()),c.searchParams.append("radius",(t.radius*1e3).toString()),c.searchParams.append("page",t.page.toString()),c.searchParams.append("q",t.query||""),t.query&&console.log(`Restaurant search: Searching for "${t.query}" restaurants near [${l.latitude}, ${l.longitude}]`),t.category&&c.searchParams.append("category",t.category),console.log("Restaurant search: Final search URL params:",Object.fromEntries(c.searchParams)),console.log("Restaurant search: Sending request to",c.toString());const v=await fetch(c.toString());if(console.log("Restaurant search: API response status:",v.status),!v.ok){const o=await v.text();throw console.error("Restaurant search API error:",o),new Error(`Failed to search restaurants: ${v.status} ${v.statusText}`)}try{const o=await v.text();console.log("Restaurant search: Raw response text:",o.substring(0,500));const m=JSON.parse(o);if(console.log("Restaurant search: ClickTheCity API response:","status:",m.status,"count:",m.data?.length||0,"search term:",t.query),!m.status||!Array.isArray(m.data))return console.warn("Invalid restaurant search data format received:",m),{data:[],message:m.message||"Failed to get restaurant data",status:!1,paging:{offset:0,row_count:0,previous:0,page:1,next:0},radius:t.radius};if(m.data.length===0)return console.log("No restaurants found for search term:",t.query),{data:[],message:`No restaurants found for "${t.query}"`,status:!0,paging:{offset:0,row_count:0,previous:0,page:1,next:0},radius:t.radius};let j=m.data;if(x&&m.data.length===0){console.log(`No results for "${x}" from API, trying without search term for client-side filtering`);const i=new URL("/api/food-drink/search",window.location.origin);i.searchParams.append("latitude",r.latitude.toString()),i.searchParams.append("longitude",r.longitude.toString()),i.searchParams.append("radius",(t.radius*1e3).toString()),i.searchParams.append("page",t.page.toString());try{const a=await fetch(i.toString());if(a.ok){const n=await a.json();n.status&&Array.isArray(n.data)&&(j=n.data.filter(_=>_.branch_name?.toLowerCase().includes(x.toLowerCase())||_.primary_type_name?.toLowerCase().includes(x.toLowerCase())),console.log(`Client-side filtering found ${j.length} matches for "${x}"`))}}catch{console.log("Fallback search failed, using original empty results")}}const M=j.map(i=>{let a=i.distance||"";return!a&&i.distance_km?a=`${i.distance_km.toFixed(1)} km`:!a&&i.distance_m&&(a=i.distance_m>1e3?`${(i.distance_m/1e3).toFixed(1)} km`:`${i.distance_m.toFixed(0)} m`),{id:i.id,name:i.branch_name,slug:i.branch_name?i.branch_name.normalize("NFD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""):String(i.id),address:i.address||"",category:i.primary_type_name||"Restaurant",distance:a||"Unknown distance",lat:i.lat||i.latitude||l.latitude,lng:i.lng||i.longitude||l.longitude,logo:Array.isArray(i.logo)&&i.logo.length>0?i.logo[0]:void 0,rating:i.rating,total_reviews:i.total_reviews,cuisines:i.cuisines||[],price_range:i.price_range,open_hours:i.open_hours,phone:i.phone,website:i.website}});return{data:M,message:"Success",status:!0,paging:m.paging||{offset:0,row_count:M.length,previous:0,page:1,next:0},radius:t.radius}}catch(o){throw console.error("Error parsing restaurant search JSON:",o),new Error("Failed to parse restaurant search data")}}}),coordinates:l,searchParams:t,setCoordinates:F,updateSearch:r=>{b(c=>({...c,...r}))}}}const Ae=[{value:"",label:"All Categories"},{value:"restaurant",label:"Restaurant"},{value:"fast_food",label:"Fast Food"},{value:"cafe",label:"Cafe"},{value:"bar",label:"Bar & Pub"},{value:"food_court",label:"Food Court"},{value:"bakery",label:"Bakery"}];function $e({restaurant:s,onDirections:u}){const p=s.slug||ee(s.name),w=g=>{if(!g)return"";if(g.includes("km")||isNaN(parseFloat(g)))return g;const k=g.replace(/[^\d.]/g,""),l=parseFloat(k);return l>=1e3?`${(l/1e3).toFixed(1)} km`:`${Math.round(l)} m`};return e.jsxs(ae,{className:"overflow-hidden hover:shadow-md transition-shadow flex flex-col h-full",children:[e.jsxs(te,{className:"p-4 pb-2 relative",children:[s.distance&&e.jsx(I,{variant:"outline",className:"border-muted-foreground
1/30 text-muted-foreground absolute top-4 right-4",children:w(s.distance)}),e.jsx(se,{className:"text-lg pr-20",children:e.jsx($,{href:`/food-drink/${s.id}/${p}`,className:"hover:text-primary",children:s.name})}),e.jsxs(ie,{className:"flex items-center",children:[s.category||"Restaurant",s.rating&&e.jsxs("span",{className:"flex items-center ml-2",children:[e.jsx(Fe,{className:"h-3 w-3 fill-yellow-400 text-yellow-400 mr-1"}),s.rating]})]})]}),e.jsxs(re,{className:"p-4 pt-0 flex-1",children:[e.jsx("div",{className:"text-sm text-muted-foreground",children:e.jsx("span",{className:"line-clamp-2",children:s.address})}),s.cuisines&&s.cuisines.length>0&&e.jsxs("div",{className:"mt-2 flex flex-wrap gap-1",children:[s.cuisines.slice(0,3).map((g,k)=>e.jsx(I,{variant:"outline",className:"text-xs",children:g},k)),s.cuisines.length>3&&e.jsxs(I,{variant:"outline",className:"text-xs",children:["+",s.cuisines.length-3," more"]})]}),s.open_hours&&e.jsxs("div",{className:"mt-2 flex items-center text-xs text-muted-foreground",children:[e.jsx(le,{className:"mr-1 h-3 w-3"}),e.jsx("span",{children:s.open_hours})]})]}),e.jsxs(ne,{className:"p-4 pt-0 flex justify-between mt-auto",children:[e.jsxs(S,{variant:"outline",size:"sm",onClick:()=>u(s),children:[e.jsx(O,{className:"h-4 w-4 mr-1"}),e.jsx("span",{children:"Directions"})]}),e.jsx(oe,{url:`${window.location.origin}/food-drink/${s.id}/${p}`,title:`Check out ${s.name} on ClickTheCity`,size:"sm",iconSize:16,variant:"review"})]})]},s.id)}function De({title:s="Search Restaurants",subtitle:u="Find restaurants by name, category or cuisine",initialQuery:p="",initialCategory:w="",maxItems:g=12,showPagination:k=!1,initialPage:l=1,onQueryChange:F}){const{toast:t}=Y(),[b,y]=d.useState(p),[x,P]=d.useState(w),[R,h]=d.useState(p),[r,c]=d.useState(l),[v,o]=d.useState([]);d.useEffect(()=>{p!==b&&(y(p),h(p))},[p,b]);const{data:m,isLoading:j,isError:M,error:i,coordinates:a,setCoordinates:n,updateSearch:_,refetch:C}=Re({query:b,category:x,radius:10,page:r});d.useEffect(()=>{o([])},[b,x,a.latitude,a.longitude]),d.useEffect(()=>{if(m?.data&&Array.isArray(m.data)&&m.data.length>0){const f=m.data.map(N=>({id:N.id.toString(),name:N.branch_name||N.name||"Unknown Restaurant",category:N.primary_type_name||"Restaurant",address:N.address||"",distance:N.distance||"",lat:parseFloat(N.geocode?.latitude||"0"),lng:parseFloat(N.geocode?.longitude||"0"),slug:N.slug||N.id.toString()}));o(r===1?f:N=>{const de=new Set(N.map(H=>H.id)),ue=f.filter(H=>!de.has(H.id));return[...N,...ue]})}},[m?.data,r]);const A=()=>{c(1),(!a.latitude||!a.longitude)&&(console.log("No coordinates available, getting location..."),n({latitude:14.5995,longitude:121.0842}),navigator.geolocation&&navigator.geolocation.getCurrentPosition(N=>{n({latitude:N.coords.latitude,longitude:N.coords.longitude})},N=>{console.log("Location access denied, using Manila fallback")})),console.log("Search clicked with params:",{searchTerm:b,selectedCategory:x,coordinates:a.latitude?a:{latitude:14.5995,longitude:121.0842}}),_({query:b,category:x,page:1}),C()},K=f=>{f.key==="Enter"&&A()},L=()=>{y(""),h(""),c(1),_({query:"",page:1}),C()},V=()=>{navigator.geolocation?navigator.geolocation.getCurrentPosition(f=>{c(1),n({latitude:f.coords.latitude,longitude:f.coords.longitude}),_({page:1}),t({title:"Location refreshed",description:"Finding restaurants near your current location"}),C()},f=>{console.error("Error getting location:",f),t({title:"Location error",description:"Could not get your location. Please allow location access.",variant:"destructive"})}):t({title:"Not supported",description:"Geolocation is not supported by your browser",variant:"destructive"})},D=f=>{const N=encodeURIComponent(`${f.name}, ${f.address}`);window.open(`https://maps.google.com/maps?q=${N}`,"_blank")},J=()=>{m?.paging&&m.paging.next>0&&(c(m.paging.next),_({page:m.paging.next}))},ce=v&&v.length>0;return Ae.find(f=>f.value===x)?.label,e.jsxs("div",{className:"w-full space-y-6",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-3xl font-bold tracking-tight",children:s}),e.jsx("p",{className:"text-muted-foreground",children:u})]}),e.jsxs("div",{className:"flex flex-col gap-4 sm:flex-row",children:[e.jsxs("div",{className:"relative flex-1",children:[e.jsx(me,{placeholder:"Type restaurant name and press Enter or click Search",value:R,onChange:f=>{h(f.target.value),y(f.target.value),F?.(f.target.value)},onKeyDown:K,className:"pr-10"}),R&&e.jsx("button",{className:"absolute right-10 top-0 h-full px-2 text-muted-foreground hover:text-foreground",onClick:L,"aria-label":"Clear search",title:"Clear search",children:e.jsx(Ce,{className:"h-4 w-4"})}),e.jsx("button",{className:"absolute right-0 top-0 h-full px-3 text-muted-foreground hover:text-foreground",onClick:A,"aria-label":"Search",title:"Click to search",children:e.jsx(B,{className:"h-4 w-4"})})]}),e.jsxs("div",{className:"flex gap-2 sm:flex-shrink-0",children:[e.jsxs(S,{variant:"secondary",onClick:V,title:"Update your location",className:"flex items-center flex-1 sm:flex-initial",children:[e.jsx(z,{className:"mr-2 h-4 w-4"}),e.jsx("span",{className:"sm:hidden md:inline",children:"Near Me"})]}),e.jsxs(S,{onClick:A,className:"flex items-center flex-1 sm:flex-initial",title:"Click to search for restaurants",children:[e.jsx(B,{className:"mr-2 h-4 w-4"}),e.jsx("span",{children:"Search"})]})]})]}),j?e.jsxs("div",{className:"flex flex-col items-center justify-center py-12",children:[e.jsx(Q,{className:"h-8 w-8 animate-spin text-muted-foreground"}),e.jsx("p",{className:"mt-4 text-muted-foreground",children:"Searching restaurants..."})]}):M?e.jsx("div",{children:i instanceof Error&&i.message.includes("API keys with referer restrictions")?e.jsxs(ge,{variant:"destructive",className:"mb-6",children:[e.jsx(Se,{className:"h-4 w-4"}),e.jsx(he,{children:"Google Places API Configuration Issue"}),e.jsxs(xe,{children:["The Google Maps API key has referer restrictions that prevent it from being used with the Places API.",e.jsxs("div",{className:"mt-2",children:[e.jsx("p",{className:"text-sm",children:"In the meantime, you can:"}),e.jsxs("ul",{className:"list-disc list-inside text-sm mt-1",children:[e.jsx("li",{children:"Try searching for a specific restaurant name"}),e.jsx("li",{children:"Select a cuisine from the Featured Cuisines section below"}),e.jsx("li",{children:"Browse our restaurant articles for recommendations"})]})]})]})]}):e.jsxs("div",{className:"rounded-lg bg-red-50 p-8 text-center",children:[e.jsx("p",{className:"text-red-600 text-lg font-medium",children:"Sorry, we couldn't search for restaurants at this time."}),e.jsxs("p",{className:"text-red-500 mt-2",children:["Error: ",i instanceof Error?i.message:"Unknown error"]}),e.jsxs("div",{className:"flex flex-col sm:flex-row gap-3 justify-center mt-4",children:[e.jsxs(S,{onClick:V,variant:"outline",children:[e.jsx(z,{className:"mr-2 h-4 w-4"}
1),"Update Location"]}),e.jsxs(S,{onClick:A,variant:"default",children:[e.jsx(B,{className:"mr-2 h-4 w-4"}),"Try Again"]})]})]})}):ce?e.jsxs("div",{children:[e.jsx("div",{className:"flex items-center justify-between mb-4",children:e.jsxs("p",{className:"text-sm text-muted-foreground",children:["Found ",v.length," restaurants",a.latitude&&a.longitude&&` near ${a.latitude.toFixed(4)}, ${a.longitude.toFixed(4)}`]})}),e.jsx("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-2 md:grid-cols-3",children:v.map(f=>e.jsx($e,{restaurant:f,onDirections:D},f.id))}),m?.paging&&m.paging.next>0&&e.jsx("div",{className:"mt-8 text-center",children:e.jsx(S,{variant:"outline",size:"lg",className:"px-8",onClick:J,disabled:j,children:j?e.jsxs(e.Fragment,{children:[e.jsx(Q,{className:"mr-2 h-4 w-4 animate-spin"}),"Loading..."]}):"Load More Restaurants"})})]}):e.jsxs("div",{className:"py-12 text-center border rounded-lg",children:[e.jsx("p",{className:"text-muted-foreground",children:"No restaurants found."}),e.jsx("p",{className:"text-muted-foreground text-sm mt-2",children:"Try a different search term or update your location."})]})]})}function Ge(){Y();const[s,u]=d.useState("nearby"),[p,w]=d.useState(""),[g,k]=d.useState(""),[l,F]=d.useState(null),[t,b]=d.useState(!0);pe(),fe();const{data:y=[]}=q({queryKey:["/api/restaurants",{limit:10}],staleTime:1800*1e3,gcTime:3600*1e3}),{data:x}=q({queryKey:["/api/events",{category:"fooddrink"}],queryFn:()=>fetch("/api/events?category=fooddrink&limit=6&active=true&upcoming=true").then(a=>a.json())}),{data:P}=q({queryKey:["/api/events",{category:"dining"}],queryFn:()=>fetch("/api/events?category=dining&limit=6&active=true&upcoming=true").then(a=>a.json())}),{data:R}=q({queryKey:["/api/events",{category:"nightlife"}],queryFn:()=>fetch("/api/events?category=nightlife&limit=6&active=true&upcoming=true").then(a=>a.json())}),h=[...x?.data||[],...P?.data||[],...R?.data||[]].slice(0,6);d.useEffect(()=>{const a=new URLSearchParams(window.location.search),n=a.get("tab"),_=a.get("q");if(n==="search"&&u("search"),_){const C=decodeURIComponent(_);w(C),k(C)}},[]);const r=async a=>{try{await _e("POST","/api/track-search",{query:a})}catch(n){console.log("Search tracking failed:",n)}};d.useEffect(()=>{(async()=>{try{const n=await fetch("/api/articles?categories=9&per_page=4");if(n.ok){const _=await n.json();F(_)}else F([])}catch(n){console.log("Failed to load food articles:",n),F([])}finally{b(!1)}})()},[]);const c=async()=>{g.trim()&&(ke(g.trim()),await r(g.trim()),w(g.trim()),u("search"),document.getElementById("restaurant-section")?.scrollIntoView({behavior:"smooth"}))};d.useEffect(()=>{k(p)},[p]),d.useEffect(()=>{let a=null;const n=()=>{const L=window.innerWidth<768?"clickthecity_clickthecity_mobile":"clickthecity_clickthecity_desktop";if(a===L)return;console.log(`🎬 Food & Drink: Loading GliaCloud player for ${L}`),document.querySelectorAll('script[src*="gliacloud.com/player"]').forEach(J=>{J.remove()});const D=document.createElement("script");D.src=`https://player.gliacloud.com/player/${L}`,D.async=!0,D.setAttribute("data-glia-slot",L),D.onload=()=>{console.log(`✅ Food & Drink: GliaCloud script loaded: ${L}`)},D.onerror=()=>{console.error(`❌ Food & Drink: Failed to load GliaCloud script: ${L}`)},document.head.appendChild(D),a=L},_=setTimeout(()=>{n()},1e3);let C=null;const A=()=>{C&&clearTimeout(C),C=setTimeout(()=>{n()},300)};return window.addEventListener("resize",A),window.addEventListener("orientationchange",A),()=>{clearTimeout(_),C&&clearTimeout(C),window.removeEventListener("resize",A),window.removeEventListener("orientationchange",A),document.querySelectorAll('script[src*="gliacloud.com/player"]').forEach(L=>L.remove())}},[]);const v="Food & Drink in the Philippines | Restaurants, Cafes and Dining Guide | ClickTheCity",o="Find the best restaurants, cafes, milk tea shops, buffets, and bars in Metro Manila and across the Philippines. Browse by cuisine — Filipino, Japanese, Korean, Chinese, Italian — or explore top spots in Makati, BGC, Quezon City, Ortigas, Pasig, and Manila.",m=["Manila restaurants","Makati restaurants","BGC restaurants","Quezon City restaurants","Ortigas restaurants","Manila cafes","Manila bars","fine dining Manila","casual dining Manila","food delivery Manila","restaurant reviews Manila","best restaurants Manila","Manila food guide","dining Manila","restaurants near me Manila","Manila nightlife","rooftop bars Manila","seafood restaurants Manila","Italian restaurants Manila","Japanese restaurants Manila","Korean restaurants Manila","Filipino restaurants Manila"],j="https://cdn1.clickthecity.com/wp-content/uploads/2025/05/18102221/clickthecity_capture_the_whole_buffet_setup_of_the_hotel.jpg",M="https://www.clickthecity.com",i={section:"food_drink",content_type:"restaurants_listing",category:"food_drink",page_type:"restaurants_listing",user_intent:"discover",content_vertical:"food"};return e.jsx(ye,{children:e.jsx(je,{params:i,children:e.jsxs("div",{className:"min-h-screen bg-white",children:[e.jsx(be,{title:v,description:o,keywords:m,canonical:`${M}/food-drink`,ogImage:j,ogImageWidth:"1200",ogImageHeight:"630",breadcrumbs:[{name:"Home",url:"https://www.clickthecity.com"},{name:"Food & Drink",url:"https://www.clickthecity.com/food-drink"}],children:y.length>0&&e.jsx("script",{type:"application/ld+json",dangerouslySetInnerHTML:{__html:JSON.stringify({"@context":"https://schema.org","@type":"CollectionPage",name:"Restaurants, Cafes & Bars - Best Food & Dining Guide Philippines",description:o,url:"https://www.clickthecity.com/food-drink",mainEntity:{"@type":"ItemList",name:"Top Restaurants in Manila",numberOfItems:Math.min(y.length,10),itemListElement:y.slice(0,10).map((a,n)=>({"@type":"ListItem",position:n+1,item:{"@type":"Restaurant",name:a.restaurant_name||a.name,url:`https://www.clickthecity.com/food-drink/${a.id}/${a.slug||a.restaurant_name?.toLowerCase().replace(/\s+/g,"-")}`,image:a.image_url||a.imageUrl,address:{"@type":"PostalAddress",addressLocality:a.city||"Manila",addressRegion:"Metro Manila",addressCountry:"PH"},...a.cuisine_type&&{servesCuisine:a.cuisine_type},...a.price_range&&{priceRange:a.price_range}}}))}})}})}),e.jsxs("div",{className:"relative h-96 bg-gray-900",children:[e.jsx("div",{className:"absolute inset-0",children:e.jsx("img",{src:"https://cdn1.clickthecity.com/wp-content/uploads/2025/05/18102221/clickthecity_capture_the_whole_buffet_setup_of_the_hotel.jpg",alt:"Food & Drink in Manila",className:"h-full w-full object-cover object-center opacity-60",width:1024,height:1024,fetchpriority:"high",loading:"eager",decoding:"sync"})}),e.jsxs("div",{className:"relative mx-auto max-w-7xl px-4 py-24 sm:px-6 lg:px-8",children:[e.jsx("h1",{className:"text-4xl font-bold tracking-tight text-white sm:text-5xl lg:text-6xl",children:"Food & Drink"}),e.jsx("div",{className:"mt-6 max-w-lg text-xl text-gray-300",children:"Restaurants, c
1afes, buffets, milk tea shops, and bars in Manila, Makati, BGC, Quezon City, and beyond."}),e.jsxs("div",{className:"mt-8 flex max-w-2xl items-center rounded-lg bg-white p-2 shadow-lg",children:[e.jsx(B,{className:"mx-2 h-5 w-5 text-gray-400"}),e.jsx("input",{type:"text",placeholder:"Search restaurants, cafes, bars...",value:g,onChange:a=>k(a.target.value),className:"w-full border-0 bg-transparent p-2 placeholder-gray-500 focus:outline-none focus:ring-0 text-gray-900",onKeyDown:a=>{a.key==="Enter"&&c()}}),e.jsxs("button",{className:"flex items-center rounded-md bg-blue-600 px-4 py-2 text-white hover:bg-blue-700",onClick:c,children:[e.jsx(B,{className:"mr-2 h-4 w-4"}),"Search"]})]})]})]}),e.jsx("section",{id:"restaurant-section",className:"py-12",children:e.jsxs("div",{className:"mx-auto max-w-7xl px-4 sm:px-6 lg:px-8",children:[e.jsx("div",{className:"mb-8 flex justify-center",children:e.jsx(U,{slotId:"leaderboard-ad",className:"py-4"})}),e.jsx("div",{className:"mb-8 block md:hidden",children:e.jsx(U,{slotId:"mobile-inside-popup",className:"flex justify-center"})}),e.jsxs(X,{defaultValue:"nearby",value:s,onValueChange:a=>{ve(a),u(a)},children:[e.jsxs(Z,{className:"mb-6",children:[e.jsx(T,{value:"nearby",children:"Nearby Restaurants"}),e.jsx(T,{value:"search",children:"Search Restaurants"}),e.jsx(T,{value:"articles",asChild:!0,children:e.jsx($,{href:"/food-drink/articles",children:"Latest in Food"})})]}),e.jsx(E,{value:"nearby",className:"mt-0",children:e.jsx(Pe,{title:"Restaurants Near You",subtitle:"Discover local dining options in your vicinity",maxItems:30,radius:5,initialPage:1,showPagination:!0})}),e.jsx(E,{value:"search",className:"mt-0",children:e.jsx(De,{title:"Search Restaurants",subtitle:"Find restaurants by name, cuisine, or category",maxItems:12,showPagination:!0,initialPage:1,initialQuery:p,onQueryChange:w})})]})]})}),e.jsx("div",{className:"my-8",children:e.jsxs("div",{className:"mx-auto max-w-7xl px-4 sm:px-6 lg:px-8",children:[e.jsx("div",{className:"hidden md:block max-w-2xl mx-auto",children:e.jsx("div",{className:"gliaplayer-container","data-slot":"clickthecity_clickthecity_desktop"})}),e.jsx("div",{className:"block md:hidden",children:e.jsx("div",{className:"gliaplayer-container","data-slot":"clickthecity_clickthecity_mobile"})})]})}),e.jsx("section",{className:"py-12 bg-white",children:e.jsxs("div",{className:"mx-auto max-w-7xl px-4 sm:px-6 lg:px-8",children:[e.jsxs("div",{className:"flex items-center justify-between mb-8",children:[e.jsx("h2",{className:"text-3xl font-bold text-gray-900",children:"Latest in Food"}),e.jsx($,{href:"/food-drink/articles",className:"text-blue-600 hover:text-blue-700 font-medium text-lg",children:"View all →"})]}),t?e.jsx("div",{className:"text-center py-12",children:e.jsx("p",{className:"text-gray-500",children:"Loading latest food articles..."})}):l&&l.length>0?e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6",children:l.slice(0,4).map((a,n)=>e.jsx(we,{article:a,className:"h-full"},a.id))}):e.jsx("div",{className:"text-center py-12",children:e.jsx("p",{className:"text-gray-500",children:"No food articles available at the moment."})})]})}),h.length>0&&e.jsx("section",{className:"py-12 bg-gray-50",children:e.jsxs("div",{className:"mx-auto max-w-7xl px-4 sm:px-6 lg:px-8",children:[e.jsxs("div",{className:"flex items-center justify-between mb-6",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-3xl font-bold text-gray-900",children:"Food & Drink Events"}),e.jsx("span",{className:"block text-sm text-gray-500 mt-0.5",children:"Food festivals, dining events, and nightlife in Manila"})]}),e.jsx($,{href:"/events?category=fooddrink",className:"text-blue-600 hover:text-blue-700 font-medium text-lg",children:"View all →"})]}),e.jsx("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-5",children:h.map(a=>{const n=a.eventDates?.[0]?.startDate?new Date(a.eventDates[0].startDate):a.startDate?new Date(a.startDate):null;return e.jsx($,{href:`/events/${a.slug||a.id}`,children:e.jsxs("div",{className:"group bg-white border border-gray-100 rounded-xl overflow-hidden shadow-sm hover:shadow-md transition-all duration-200 h-full flex flex-col",children:[a.imageUrl?e.jsxs("div",{className:"relative h-40 overflow-hidden bg-orange-50",children:[e.jsx("img",{src:Ne(a.imageUrl,400),alt:a.title,className:"w-full h-full object-cover group-hover:scale-105 transition-transform duration-300",loading:"lazy"}),e.jsx("div",{className:"absolute top-3 left-3",children:e.jsx("span",{className:"bg-orange-600 text-white text-xs font-semibold px-2.5 py-1 rounded-full capitalize",children:a.category})})]}):e.jsxs("div",{className:"h-40 bg-gradient-to-br from-orange-500 to-orange-700 flex items-center justify-center relative",children:[e.jsx(Me,{className:"h-12 w-12 text-white/60"}),e.jsx("div",{className:"absolute top-3 left-3",children:e.jsx("span",{className:"bg-white/20 backdrop-blur-sm text-white text-xs font-semibold px-2.5 py-1 rounded-full capitalize",children:a.category})})]}),e.jsxs("div",{className:"p-4 flex flex-col flex-1",children:[e.jsx("h3",{className:"font-semibold text-gray-900 line-clamp-2 group-hover:text-orange-600 transition-colors mb-2 leading-snug",children:a.title}),a.venue&&e.jsxs("div",{className:"flex items-start gap-1.5 text-xs text-gray-500 mb-1",children:[e.jsx(O,{className:"h-3.5 w-3.5 mt-0.5 shrink-0 text-gray-400"}),e.jsx("span",{className:"line-clamp-1",children:a.venue})]}),n&&e.jsxs("div",{className:"flex items-center gap-1.5 text-xs text-gray-500 mt-auto pt-3 border-t border-gray-50",children:[e.jsx(le,{className:"h-3.5 w-3.5 shrink-0 text-gray-400"}),e.jsx("span",{children:n.toLocaleDateString("en-PH",{month:"short",day:"numeric",year:"numeric"})})]})]})]})},a.id)})})]})}),e.jsx("section",{className:"py-12 bg-gray-50",children:e.jsxs("div",{className:"mx-auto max-w-7xl px-4 sm:px-6 lg:px-8",children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("h2",{className:"text-3xl font-bold tracking-tight",children:"Featured Cuisines"}),e.jsx($,{href:"/food-drink/cuisines",className:"text-blue-600 hover:text-blue-700 font-medium text-lg","data-testid":"link-view-all-cuisines",children:"View all cuisines →"})]}),e.jsx("p",{className:"text-muted-foreground mb-8",children:"Explore restaurants by your favorite cuisine types"}),e.jsx("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4",children:[{name:"Filipino",image:"https://cdn1.clickthecity.com/wp-content/uploads/2025/06/19074657/Adobo-300x300.png",href:"/food-drink/cuisine/filipino"},{name:"Japanese",image:"https://cdn1.clickthecity.com/wp-content/uploads/2025/05/09094159/japanese-sushi-sashimi-300x300.png",href:"/food-drink/cuisine/japanese"},{name:"Italian",image:"https://cdn1.clickthecity.com/wp-content/uploads/2025/05/09094156/italian-pizza-300x300.png",href:"/food-drink/cuisine/italian"},{name:"Chinese",image:"https://cdn1.clickthecity.com/wp-content/uploads/2025/05/09094205/chinese-hakaw-300x300.png",href:"/food-drink/cuisine/chinese"}].map((a,n)=>e.jsx("a",{href:a.href,className:"overflow-hidden rounded-xl group block relative",children:e.jsxs("div",{className:"h-48 overflow-hidden",children:[e.jsx("img",{src:a.image,alt:a.name,className:"w-full h-full object-cover group-hover:scale-110 transition duration-300",width:300,height:300}),e.jsx("div",{className:"absolute inset-0 bg-gradient-to-t from-black/70 to-transparent"}),e.jsxs("div",{className:"absolute bottom-0 left-0 right-0 p-4",children:[e.jsx("h3",{className:"text-xl font-bold text-white",children:a.name}),e.jsx("p",{className:"text-sm text-gray-200",children:"Explore restaurants"})]})]})}
1,n))}),e.jsxs("div",{className:"mt-10",children:[e.jsx("h3",{className:"text-xl font-semibold tracking-tight mb-4",children:"Browse by Food Type"}),e.jsx("div",{className:"flex flex-wrap gap-2",children:[{name:"Burgers",slug:"burgers"},{name:"Pizza",slug:"pizza"},{name:"Chicken",slug:"chicken"},{name:"Fast Food",slug:"fast-food"},{name:"Coffee",slug:"coffee"},{name:"Cakes & Pastries",slug:"cakes-pastries"},{name:"Ice Cream & Yogurt",slug:"ice-cream"},{name:"Seafood",slug:"seafood"},{name:"Steaks",slug:"steaks"},{name:"Bar",slug:"bar"},{name:"Karaoke Bar",slug:"karaoke-bar"},{name:"Vegetarian",slug:"vegetarian"}].map(a=>e.jsx($,{href:`/food-drink/category/${a.slug}`,className:"inline-flex items-center px-4 py-2 rounded-full bg-white border border-gray-200 hover:border-orange-400 hover:bg-orange-50 hover:text-orange-700 text-sm font-medium text-gray-700 transition-colors shadow-sm",children:a.name},a.slug))})]}),e.jsxs("div",{className:"mt-10",children:[e.jsx("h3",{className:"text-xl font-semibold tracking-tight mb-4",children:"Dining by Location"}),e.jsx("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-3",children:[{name:"BGC",slug:"bgc"},{name:"Makati",slug:"makati"},{name:"Quezon City",slug:"quezon-city"},{name:"Ortigas",slug:"ortigas"},{name:"Pasig",slug:"pasig"},{name:"Manila",slug:"manila"},{name:"Cebu",slug:"cebu"},{name:"Davao",slug:"davao"}].map(a=>e.jsxs($,{href:`/food-drink/restaurants-in-${a.slug}`,className:"flex items-center justify-center px-4 py-3 rounded-xl border border-gray-200 bg-white hover:border-orange-400 hover:bg-orange-50 hover:text-orange-700 text-sm font-medium text-gray-700 transition-colors shadow-sm text-center",children:["Restaurants in ",a.name]},a.slug))})]}),e.jsx("div",{className:"mt-8 flex justify-center",children:e.jsx(U,{slotId:"inread",className:"w-full max-w-2xl"})}),e.jsx("div",{className:"mt-8 flex justify-center",children:e.jsx(U,{slotId:"mrec1",className:"py-4"})}),e.jsx("div",{className:"mt-8 w-full flex justify-center",children:e.jsx(U,{slotId:"sponsoredpost",className:"w-full"})})]})})]})})})}export{Ge as default};

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.