PageSourceSearch

https://www.hubli.net/assets/model-CXbcYrOF.js

js hubli.net collected 2026-10-03 02:54:09 UTC 68,934 bytes, 2 lines download raw bytes

1const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/listing-taxonomy-BASjNtE3.js","assets/jsx-runtime-DUAcabCT.js","assets/client-BCR07eWm.js","assets/preload-helper-zJ_50EbN.js","assets/tslib.es6-Tae09705.js"])))=>i.map(i=>d[i]);
2import{i as e,t}from"./jsx-runtime-DUAcabCT.js";import{t as n}from"./react-6OGjdfot.js";import{n as r,t as i}from"./createServerFn-BiK2PT72.js";import{t as a}from"./link-BmMKtLWv.js";import{n as o}from"./useNavigate-BD7aQ6ji.js";import{t as s}from"./useRouterState-B8NpiMj4.js";import{n as c}from"./client-BCR07eWm.js";import{t as l}from"./preload-helper-zJ_50EbN.js";import{_ as u,g as d,i as f,n as p,x as m}from"./listings-CehrnwZa.js";import{f as h,u as g}from"./popular-searches-DFPYzRdd.js";import{S as _}from"./primitives-qD8AIcoj.js";import{a as v}from"./listing-taxonomy-BASjNtE3.js";import{C as y,_ as b,b as x,h as S,p as C,t as ee,w,y as T}from"./SiteShell-RbgyAiC6.js";import{t as E}from"./google-business-validator-DGNU7J79.js";import{t as D}from"./ownership-C4xtW0Ky.js";import{t as O}from"./resolver-Dx9cMZI-.js";import{t as k}from"./createLucideIcon-CLQ5Hlf7.js";import{t as A}from"./badge-check-CoogTGAf.js";import{t as j}from"./chevron-down-C-_8mnXs.js";import{t as M}from"./crown-D2xWJ3VF.js";import{a as te,c as ne,d as N,f as re,i as ie,l as P,n as F,o as ae,r as oe,s as se,u as ce}from"./facets-uSLcZurD.js";import{t as le}from"./images-Dzv-PhvR.js";import{t as ue}from"./map-pin-B3FjmQRq.js";import{t as I}from"./StudioCard-CZMXL7rl.js";import{t as de}from"./Breadcrumbs-BfmZZk5v.js";import{t as fe}from"./CategoryCard-DPOKnY5K.js";import{n as pe}from"./brand-CCCbvMMh.js";import{r as me}from"./breadcrumbs-B84z8XVa.js";function L(){return(e,t)=>e.title.localeCompare(t.title)}function he(){return(e,t)=>(t.rating??0)-(e.rating??0)||e.title.localeCompare(t.title)}function ge(){return(e,t)=>{let n=e.activated_at?Date.parse(e.activated_at):0,r=t.activated_at?Date.parse(t.activated_at):0;return r===n?e.title.localeCompare(t.title):r-n}}function _e(e){switch(e){case`rating`:return he();case`recent`:return ge();case`alpha`:return L();default:return L()}}function R(e,t){return[...e].sort(_e(t))}function ve(e,{sort:t,isOfficial:n}){let{official:r,featured:i,standard:a}=d(e,n);return{official:R(r,t),featured:R(i,t),standard:R(a,t)}}var ye=i({method:`POST`}).handler(r(`ba696c9db6a426f17d838ba435e95d1148ff588629865d7e91bb73d0ce9eafbf`)),z={videos:[],before_after:[],owner_message:null,team:[],certificates:[],design_philosophy:null,process_steps:[],pricing_items:[],faqs:[],social_links:null,highlights:[],brands:[]};async function be(e){let[t,n,r,i,a,o,s,l,u,d,f,p]=await Promise.all([c.from(`listing_videos`).select(`id,kind,title,youtube_id,sort_order`).eq(`listing_id`,e).order(`sort_order`,{ascending:!0}),c.from(`listing_before_after`).select(`id,title,before_asset_id,after_asset_id,sort_order`).eq(`listing_id`,e).order(`sort_order`,{ascending:!0}),c.from(`listing_owner_message`).select(`body,owner_name,owner_photo_asset_id`).eq(`listing_id`,e).maybeSingle(),c.from(`listing_team_members`).select(`id,name,job_title,bio,photo_asset_id,sort_order`).eq(`listing_id`,e).order(`sort_order`,{ascending:!0}),c.from(`listing_certificates`).select(`id,name,issuer,year,image_asset_id`).eq(`listing_id`,e).order(`sort_order`,{ascending:!0}),c.from(`listing_design_philosophy`).select(`body`).eq(`listing_id`,e).maybeSingle(),c.from(`listing_process_steps`).select(`step_number,title,description,icon`).eq(`listing_id`,e).order(`step_number`,{ascending:!0}),c.from(`listing_pricing_items`).select(`id,service,starting_price_inr,price_max_inr,unit,description,sort_order`).eq(`listing_id`,e).order(`sort_order`,{ascending:!0}),c.from(`listing_faqs`).select(`id,question,answer,sort_order`).eq(`listing_id`,e).order(`sort_order`,{ascending:!0}),c.from(`listing_social_links`).select(`instagram,facebook,linkedin,youtube,pinterest,x_twitter`).eq(`listing_id`,e).maybeSingle(),c.from(`listing_highlights`).select(`sort_order, is_featured, highlight:business_highlight_library!inner(id,name,slug,icon,category)`).eq(`listing_id`,e).order(`sort_order`,{ascending:!0}),c.from(`listing_brands`).select(`sort_order, brand:brand_library!inner(id,name,slug,logo_url,logo_storage_path,website)`).eq(`listing_id`,e).order(`sort_order`,{ascending:!0})]),m=f.data??[],h=p.data??[],g=h.map(e=>e.brand?.id).filter(e=>!!e),_=g.length?await ye({data:{brandIds:g}}).catch(()=>({})):{};return{videos:t.data??[],before_after:n.data??[],owner_message:r.data??null,team
2:i.data??[],certificates:a.data??[],design_philosophy:o.data?.body??null,process_steps:s.data??[],pricing_items:l.data??[],faqs:u.data??[],social_links:d.data??null,highlights:m.filter(e=>e.highlight).map(e=>({...e.highlight,sort_order:e.sort_order,is_featured:e.is_featured===!0})),brands:h.filter(e=>e.brand).map(e=>{let t=e.brand,n=_[t.id]??t.logo_url??null;return{id:t.id,name:t.name,slug:t.slug,website:t.website,logo_url:n,sort_order:e.sort_order}})}}function xe(e){let t=null,n=e.established_year;if(typeof n==`number`&&n>1900){let e=new Date().getUTCFullYear()-n;e>=1&&(t=e)}let r=null,i=e.projects_completed;return typeof i==`number`&&i>0&&(r=i),{yearsInBusiness:t,projectsCompleted:r}}function Se(e){let t=e.next_available_slot_kind;if(!t)return null;switch(t){case`immediately`:return`Immediately`;case`within_1_week`:return`Within 1 week`;case`within_2_weeks`:return`Within 2 weeks`;case`within_1_month`:return`Within 1 month`;case`month`:{let t=e.next_available_slot_month;return t?new Date(t).toLocaleString(void 0,{month:`long`,year:`numeric`}):null}case`specific_date`:{let t=e.next_available_slot_date;return t?new Date(t).toLocaleDateString(void 0,{day:`numeric`,month:`short`,year:`numeric`}):null}default:return null}}function Ce(e,t){let n=e.google_maps_url?.trim();if(n&&E(n))return n;let r=e.google_place_id?.trim();if(r)return`https://www.google.com/maps/place/?q=place_id:${encodeURIComponent(r)}`;let i=[e.title,e.address,t].filter(Boolean).join(` `);return`https://www.google.com/maps/search/?api=1&query=${encodeURIComponent(i)}`}var we={certification:0,craftsmanship:1,promise:1,specialty:2,capabilities:3,services:3,offer:5};function Te(e){let t=e??[],n=t.filter(e=>e.is_featured).slice(0,4);n.length===0&&(n=[...t].sort((e,t)=>(we[(e.category??``).trim().toLowerCase()]??4)-(we[(t.category??``).trim().toLowerCase()]??4)||e.sort_order-t.sort_order).slice(0,4));let r=new Set(n.map(e=>e.id));return{featured:n,grouped:t.filter(e=>!r.has(e.id))}}var Ee=i({method:`GET`}).handler(r(`2e5737e5ea44b161f8504d18eaa11f461b04b27aac30a97de7267d19f3a38d55`));async function De(e,t){let n=await p(e,t);if(!n)return null;let r=D(n.listing),[i,a,o,s]=await Promise.all([f(n.city.id,n.listing.id,6),r?be(n.listing.id):Promise.resolve(z),v(n.listing.id),Ee({data:{listingId:n.listing.id}})]);return{city:n.city,listing:n.listing,similar:i,official:a,taxonomy:o,faqs:s}}var B=e(n(),1),V=t();function Oe(e){return Array.isArray(e)?e.map(e=>typeof e==`string`?e.trim():``).filter(e=>e.length>0):[]}function ke(e){return Array.isArray(e)?e.map(e=>{if(!e||typeof e!=`object`)return null;let t=e,n=typeof t.title==`string`?t.title.trim():``,r=typeof t.body==`string`?t.body.trim():``;return!n&&!r?null:{title:n,body:r}}).filter(e=>e!==null):[]}function Ae(e){let t=e.about_json??{},n=e.great_category_json??{},r=e.buying_guide_json??{};return{category_id:e.category_id,about:{paragraphs:Oe(t.paragraphs)},great_category:{pillars:ke(n.pillars)},buying_guide:{checklist:ke(r.checklist)},stats_min_listings:Number(e.stats_min_listings??10),editorial_status:e.editorial_status??`draft`,published_at:e.published_at??null}}async function je(e){let{data:t,error:n}=await c.from(`category_editorial`).select(`category_id,about_json,great_category_json,buying_guide_json,stats_min_listings,editorial_status,published_at`).eq(`category_id`,e).eq(`editorial_status`,`published`).maybeSingle();return n||!t?null:Ae(t)}var Me={pillars:[{title:`Real, checked details`,body:`Address, area, timings and contact details reviewed against public sources — not scraped once and forgotten.`},{title:`Verified identity`,body:`Editor-checked business identity and contact channels before a business is listed as Official.`},{title:`Useful discovery`,body:`Filters built from evidence the listing actually publishes, so a shortlist reflects reality rather than marketing.`}]},Ne={checklist:[{title:`Start with what you actually need`,body:`Narrow by area and the options that matter to you, then compare a short list rather than scrolling everything.`},{title:`Confirm the details before you go`,body:`Timings, location and offerings change. Use the contact details on the listing to confirm anything time-sensitive.`},{title:`Read recent feedback`,body:`Recent reviews tell you more than an overall rating. Check what people say about the things you care about.`}]};function Pe(e,t){if(e&&e.about.paragraphs.length>0)return e.about;let n=t.body?.trim();if(n){let e=n.split(/\n\s*\n/).map(e=>
2e.trim()).filter(Boolean);if(e.length>0)return{paragraphs:e}}return{paragraphs:[]}}function Fe(e){let t=e.length,n=0,r=[],i=new Map,a=new Date().getFullYear();for(let t of e){(t.tier!==`free`||t.claim_status===`claimed`)&&(n+=1);let e=t.established_year;typeof e==`number`&&e>1900&&e<=a&&r.push(a-e);let o=t.design_styles;if(Array.isArray(o))for(let e of o){if(typeof e!=`string`)continue;let t=e.trim();t&&i.set(t,(i.get(t)??0)+1)}}let o=r.length>0?Math.round(r.reduce((e,t)=>e+t,0)/r.length):null,s=Array.from(i.entries()).sort((e,t)=>t[1]-e[1]).slice(0,4).map(([e])=>e);return{totalListings:t,officialListings:n,averageYears:o,topStyles:s}}function Ie(e){let{category:t,editorial:n,listings:r}=e,i=Pe(n,t),a=n&&n.great_category.pillars.length>0?n.great_category:Me,o=n&&n.buying_guide.checklist.length>0?n.buying_guide:Ne,s=Fe(r),c=n?.stats_min_listings??10;return{about:i,greatCategory:a,buyingGuide:o,stats:s,statsMinListings:c,showStats:s.totalListings>=c,hasEditorial:n!==null}}var Le=k(`phone-call`,[[`path`,{d:`M13 2a9 9 0 0 1 9 9`,key:`1itnx2`}],[`path`,{d:`M13 6a5 5 0 0 1 5 5`,key:`11nki7`}],[`path`,{d:`M13.832 16.568a1 1 0 0 0 1.213-.303l.355-.465A2 2 0 0 1 17 15h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2A18 18 0 0 1 2 4a2 2 0 0 1 2-2h3a2 2 0 0 1 2 2v3a2 2 0 0 1-.8 1.6l-.468.351a1 1 0 0 0-.292 1.233 14 14 0 0 0 6.392 6.384`,key:`9njp5v`}]]);function Re({city:e,category:t,area:n,coverUrl:r,breadcrumbs:i,resultCount:a}){let o=t.name,s=t.intro?.trim()||`Discover ${t.name.toLowerCase()} in ${e.name}, ${e.state} — with photos, ratings, timings, location and direct contact details.`;return(0,V.jsxs)(`section`,{className:`relative overflow-hidden border-b border-border bg-[color:var(--color-sand)]`,children:[r&&(0,V.jsx)(`div`,{className:`pointer-events-none absolute inset-y-0 right-0 hidden w-1/2 md:block`,"aria-hidden":!0,children:(0,V.jsx)(`div`,{className:`h-full w-full`,style:{backgroundImage:`linear-gradient(to right, var(--color-sand) 0%, transparent 60%), url(${r})`,backgroundSize:`cover`,backgroundPosition:`center right`,opacity:.16}})}),(0,V.jsxs)(`div`,{className:`container-luxe relative pt-5 pb-7 md:pt-6 md:pb-9`,children:[(0,V.jsx)(de,{items:i}),(0,V.jsxs)(`p`,{className:`mt-4 eyebrow flex items-center gap-2`,children:[(0,V.jsx)(ze,{icon:t.icon}),(0,V.jsxs)(`span`,{children:[e.name,n?` · ${n.name}`:``,` · `,t.name]})]}),(0,V.jsx)(`h1`,{className:`mt-2 font-serif text-3xl leading-[1.05] md:text-5xl`,children:n?(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(`span`,{className:`gold-text`,children:o}),` in `,n.name,`, `,e.name]}):(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(`span`,{className:`gold-text`,children:o}),` in `,e.name]})}),(0,V.jsx)(`p`,{className:`mt-3 max-w-3xl text-[0.95rem] leading-relaxed text-foreground/75`,children:s}),(0,V.jsxs)(`p`,{className:`mt-4 text-[0.65rem] uppercase tracking-[0.28em] text-muted-foreground`,children:[a,` `,a===1?`place`:`places`]})]})]})}function ze({icon:e}){let t=(e??``).trim();return t?(0,V.jsx)(`span`,{"aria-hidden":!0,className:`text-[color:var(--color-gold-deep)]`,children:t.length<=4?t:`◆`}):(0,V.jsx)(`span`,{"aria-hidden":!0,className:`inline-block h-2 w-2 rotate-45 border border-[color:var(--color-gold-deep)]`})}var H={recommended:`Recommended`,rating:`Rating`,recent:`Recently added`,alpha:`Alphabetical`};function Be({citySlug:e,categorySlug:t,currentAreaSlug:n,areaOptions:r,currentSort:i,onSortChange:a,onClear:c,filterSlot:l}){let u=o(),d=s({select:e=>e.location.pathname}),[f,p]=(0,B.useState)(!1),[m,h]=(0,B.useState)(!1),v=(0,B.useRef)(null),y=(0,B.useRef)(null);(0,B.useEffect)(()=>{function e(e){v.current&&!v.current.contains(e.target)&&p(!1),y.current&&!y.current.contains(e.target)&&h(!1)}return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[]);let b=i!==`recommended`||!!n,x=n&&r.find(e=>e.slug===n)?.name||`All areas`;function S(n){h(!1),u(n?g({citySlug:e,areaSlug:n,categorySlug:t}):_({citySlug:e,categorySlug:t}))}return(0,V.jsx)(`div`,{className:`sticky top-0 z-20 border-b border-border bg-white/95 backdrop-blur supports-[backdrop-filter]:bg-white/75`,"data-current-path":d,children:(0,V.jsxs)(`div`,{className:`container-luxe flex flex-wrap items-center gap-2 py-2.5 md:py-3`,children:[(0,V.jsxs)(`div`,{ref:y,className:`relative`,children:[(0,V.jsxs)(`button`,{type:`button`,onClick:()=>h(e=>!e),className:`press-control inline-flex items-center gap-1.5 rounded-full border border-border bg-white px-3 py-1.5 text-xs uppercase tracking-[0.18em] hover:border-[color:var(--color-gold-soft)]`,children:[(0,V.jsx)(ue,{className:`h-3.5 w-3.5 text-[color:var(--color-gold-deep)]`,"aria-hidden":!0}),(0,V.jsx)(`span`,{children:x}),(0,V.jsx)(j,{className:`h-3.5 w-3.5 opacity-60`,"aria-hidden":!0})]}),m&&(0,V.jsxs)(`div`,{className:`absolute left-0 top-full z-30 mt-1 w-64 overflow-hidden rounded-md border border-border bg-white shadow-lg`,children:[(0,V.jsxs)(`button`,{onClick:()=>S(null),className:`press-control block w-full px-3 py-2 text-left text-sm hover:bg-[color:var(--color-sand)]/60 ${n?``:`font-semibold`}`,children:[`All areas in `,e.replace(/-/g,` `)]}),(0,V.jsx)(`div`,{className:`max-h-64 overflow-y-auto border-t border-border`,children:r.length===0?(0,V.jsx)(`p`,{className:`px-3 py-3 text-xs text-muted-foreground`,children:`No neighborhood pages published yet.`}):r.map(e=>(0,V.jsx)(`button`,{onClick:()=>S(e.slug),className:`press-control block w-full px-3 py-2 text-left text-sm hover:bg-[color:var(--color-sand)]/60 ${e.slug===n?`font-semibold`:``}`,children:e.name},e.slug))})]})]}),(0,V.jsxs)(`div`,{ref:v,className:`relative`,children:[(0,V.jsxs)(`button`,{type:`button`,onClick:()=>p(e=>!e),className:`press-control inline-flex items-center gap-1.5 rounded-full border border-border bg-white px-3 py-1.5 text-xs uppercase tracking-[0.18em] hover:border-[color:var(--color-gold-soft)]`,children:[(0,V.jsxs)(`span`,{children:[`Sort: `,H[i]]}),(0,V.jsx)(j,{className:`h-3.5 w-3.5 opacity-60`,"aria-hidden":!0})]}),f&&(0,V.jsx)(`div`,{className:`absolute left-0 top-full z-30 mt-1 w-52 overflow-hidden rounded-md border border-border bg-white shadow-lg`,children:Object.keys(H).map(e=>(0,V.jsx)(`button`,{onClick:()=>{a(e),p(!1)},className:`press-control block w-full px-3 py-2 text-left text-sm hover:bg-[color:var(--color-sand)]/60 ${e===i?`font-semibold`:``}`,children:H[e]},e))})]}),l,b&&(0,V.jsx)(`button`,{type:`button`,onClick:c,className:`press-control ml-auto text-[0.68rem] uppercase tracking-[0.24em] text-[color:var(--color-gold-deep)] underline underline-offset-4`,children:`Clear`})]})})}var Ve=[{icon:A,label:`Verified business identity`},{icon:le,label:`Rich photo gallery`},{icon:Le,label:`Direct owner contact`},{icon:M,label:`Priority placement`}];function He(){return(0,V.jsx)(`section`,{className:`border-y border-border bg-[color:var(--color-sand)]/40`,children:(0,V.jsxs)(`div`,{className:`container-luxe py-6 md:py-8`,children:[(0,V.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-6`,children:[(0,V.jsxs)(`div`,{className:`max-w-md`,children:[(0,V.jsx)(`p`,{className:`eyebrow`,children:`Why Official Profiles`}),(0,V.jsx)(`h2`,{className:`mt-2 font-serif text-2xl md:text-[1.75rem] leading-[1.1]`,children:`A curated tier for verified businesses.`})]}),(0,V.jsx)(`ul`,{className:`grid flex-1 min-w-[260px] grid-cols-1 gap-3 sm:grid-cols-2`,children:Ve.map(({icon:e,label:t})=>(0,V.jsxs)(`li`,{className:`flex items-start gap-2.5 text-sm text-foreground
2/85`,children:[(0,V.jsx)(e,{className:`mt-0.5 h-4 w-4 shrink-0 text-[color:var(--color-gold-deep)]`,"aria-hidden":!0}),(0,V.jsx)(`span`,{children:t})]},t))})]}),(0,V.jsx)(a,{to:`/official-profile`,className:`mt-5 inline-block text-[0.68rem] uppercase tracking-[0.28em] text-[color:var(--color-gold-deep)] underline underline-offset-4`,children:`Learn about Official Profiles →`})]})})}var Ue=10;function We({city:e,listings:t,sort:n,heading:r,bare:i=!1}){let a=(0,B.useMemo)(()=>ve(t,{sort:n,isOfficial:e=>D(e)}),[t,n]),[o,s]=(0,B.useState)(Ue),c=a.standard.slice(0,o),l=a.standard.length>o;return(0,V.jsxs)(V.Fragment,{children:[a.official.length>0&&(0,V.jsx)(U,{heading:`Official Profiles`,count:a.official.length,bare:i,children:a.official.map(t=>(0,V.jsx)(I,{listing:t,city:e},t.id))}),(a.official.length>0||a.featured.length>0)&&(0,V.jsx)(He,{}),a.featured.length>0&&(0,V.jsx)(U,{heading:`Featured`,count:a.featured.length,bare:i,children:a.featured.map(t=>(0,V.jsx)(I,{listing:t,city:e},t.id))}),a.standard.length>0&&(0,V.jsx)(U,{heading:r?`Browse all ${r}`:`Browse all places in ${e.name}`,count:a.standard.length,bare:i,footer:l?(0,V.jsx)(`button`,{type:`button`,onClick:()=>s(e=>e+Ue),className:`press-control text-[0.7rem] uppercase tracking-[0.28em] text-[color:var(--color-gold-deep)] underline underline-offset-4`,children:`Load more`}):null,children:c.map(t=>(0,V.jsx)(I,{listing:t,city:e},t.id))}),t.length===0&&(0,V.jsx)(Ge,{bare:i})]})}function U({heading:e,count:t,children:n,footer:r,bare:i=!1}){return(0,V.jsxs)(`section`,{className:i?`py-5 md:py-6`:`container-luxe py-5 md:py-6`,children:[(0,V.jsxs)(`div`,{className:`mb-3 flex items-baseline justify-between`,children:[(0,V.jsx)(`h2`,{className:`font-serif text-xl md:text-2xl`,children:e}),(0,V.jsxs)(`p`,{className:`text-[0.62rem] uppercase tracking-[0.28em] text-muted-foreground`,children:[t,` `,t===1?`place`:`places`]})]}),(0,V.jsx)(`div`,{className:`grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4`,children:n}),r&&(0,V.jsx)(`div`,{className:`mt-6 text-center`,children:r})]})}function Ge({bare:e=!1}){return(0,V.jsx)(`section`,{className:e?`py-5 md:py-6`:`container-luxe py-5 md:py-6`,children:(0,V.jsxs)(`div`,{className:`border border-border bg-white px-8 py-14 text-center`,children:[(0,V.jsx)(`p`,{className:`eyebrow`,children:`No matches yet`}),(0,V.jsx)(`h2`,{className:`mt-3 font-serif text-2xl md:text-3xl leading-tight`,children:`We're still curating this list.`}),(0,V.jsx)(`p`,{className:`mt-3 max-w-xl mx-auto text-sm text-foreground/70`,children:`Nothing matches your current filters. Try clearing filters, exploring nearby areas or related categories below, or browsing all categories.`}),(0,V.jsx)(`div`,{className:`mt-6 flex flex-wrap justify-center gap-2`,children:(0,V.jsx)(a,{to:`/categories`,className:`rounded-full border border-border bg-white px-4 py-2 text-sm hover:border-[color:var(--color-gold-soft)]`,children:`All categories`})})]})})}function Ke(e){return null}function qe({city:e,items:t}){return t.length===0?null:(0,V.jsx)(`section`,{className:`border-y border-border bg-[color:var(--color-sand)]/40`,children:(0,V.jsxs)(`div`,{className:`container-luxe py-7 md:py-9`,children:[(0,V.jsxs)(`p`,{className:`eyebrow`,children:[`Related in `,e.name]}),(0,V.jsxs)(`h2`,{className:`mt-2 font-serif text-2xl md:text-3xl`,children:[`Explore more categories in `,e.name]}),(0,V.jsx)(`ul`,{className:`mt-5 grid gap-2 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4`,children:t.map(t=>(0,V.jsx)(`li`,{children:(0,V.jsxs)(a,{..._({citySlug:e.slug,categorySlug:t.slug}),className:`group flex items-center justify-between rounded-md border border-border bg-white px-4 py-3 transition hover:border-[color:var(--color-gold-soft)]`,children:[(0,V.jsxs)(`span`,{className:`font-serif text-base`,children:[t.name,` `,(0,V.jsxs)(`span`,{className:`text-muted-foreground`,children:[`in `,e.name]})]}),(0,V.jsx)(`span`,{className:`text-[0.65rem] uppercase tracking-[0.24em] text-muted-foreground`,children:t.resultCount})]})},t.id))})]})})}function Je({city:e,categorySlug:t,categoryName:n,heading:r,items:i}){if(i.length===0)return null;let o=r??`Popular areas in ${e.name}`;return(0,V.jsxs)(`section`,{className:`container-luxe py-7 md:py-9`,children:[(0,V.jsx)(`p`,{className:`eyebrow`,children:`By neighborhood`}),(0,V.jsx)(`h2`,{className:`mt-2 font-serif text-2xl md:text-3xl`,children:o}),(0,V.jsx)(`ul`,{className:`mt-5 flex flex-wrap gap-2`,children:i.map(r=>(0,V.jsx)(`li`,{children:(0,V.jsxs)(a,{...g({citySlug:e.slug,areaSlug:r.slug,categorySlug:t}),className:`inline-flex items-center gap-2 rounded-full border border-border bg-white px-4 py-2 text-sm transition hover:border-[color:var(--color-gold-soft)]`,children:[(0,V.jsxs)(`span`,{children:[n,` in `,r.name]}),(0,V.jsx)(`span`,{className:`text-[0.65rem] uppercase tracking-[0.24em] text-muted-foreground`,children:r.resultCount})]})},r.id))})]})}function Ye({items:e,heading:t=`Related categories`,citySlug:n}){return e.length===0?null:(0,V.jsxs)(`section`,{className:`container-luxe py-8 md:py-10`,children:[(0,V.jsx)(`p`,{className:`eyebrow`,children:`Explore adjacent`}),(0,V.jsx)(`h2`,{className:`mt-2 font-serif text-2xl md:text-3xl`,children:t}),(0,V.jsx)(`ul`,{className:`mt-6 grid gap-4 sm:grid-cols-2 lg:grid-cols-3`,children:e.map(e=>(0,V.jsx)(`li`,{className:`h-full`,children:(0,V.jsx)(fe,{category:e,citySlug:n})},e.id))})]})}function W({eyebrow:e,heading:t,intro:n,tone:r=`plain`,children:i,ariaLabel:a}){return(0,V.jsx)(`section`,{className:r===`muted`?`border-t border-border/60 bg-muted/20`:``,"aria-label":a,children:(0,V.jsxs)(`div`,{className:`container-luxe py-7 md:py-10`,children:[e?(0,V.jsx)(`p`,{className:`eyebrow`,children:e}):null,t?(0,V.jsx)(`h2`,{className:`mt-2 font-serif text-2xl md:text-3xl leading-tight`,children:t}):null,n?(0,V.jsx)(`p`,{className:`mt-2 max-w-2xl text-sm text-foreground
2/70`,children:n}):null,(0,V.jsx)(`div`,{className:t||e||n?`mt-5`:``,children:i})]})})}function Xe({blocks:e}){return e.length===0?null:(0,V.jsx)(V.Fragment,{children:e.map((e,t)=>(0,V.jsx)(Ze,{block:e,muted:t%2==1},`${e.kind}-${t}`))})}function Ze({block:e,muted:t}){let n=t?`muted`:`plain`;return e.kind===`about`||e.kind===`why-hire`||e.kind===`common-mistakes`?e.paragraphs.length===0?null:(0,V.jsx)(W,{heading:e.heading,tone:n,children:(0,V.jsx)(`div`,{className:`max-w-3xl space-y-4 text-[0.95rem] leading-relaxed text-foreground/85`,children:e.paragraphs.map((e,t)=>(0,V.jsx)(`p`,{children:e},t))})}):e.kind===`services-included`||e.kind===`how-to-choose`||e.kind===`process-overview`?e.items.length===0?null:(0,V.jsx)(W,{heading:e.heading,tone:n,children:(0,V.jsx)(`div`,{className:`grid gap-4 md:grid-cols-3`,children:e.items.map((t,n)=>(0,V.jsxs)(`article`,{className:`rounded-md border border-border bg-white p-4`,children:[e.kind===`how-to-choose`?(0,V.jsxs)(`div`,{className:`text-[0.65rem] uppercase tracking-[0.24em] text-muted-foreground`,children:[`Step `,n+1]}):null,(0,V.jsx)(`h3`,{className:`mt-1 font-serif text-lg leading-tight`,children:t.title}),t.body?(0,V.jsx)(`p`,{className:`mt-2 text-sm text-foreground/75 leading-relaxed`,children:t.body}):null]},n))})}):e.kind===`average-budget`?e.ranges.length===0?null:(0,V.jsxs)(W,{heading:e.heading,tone:n,children:[(0,V.jsx)(`dl`,{className:`grid gap-4 sm:grid-cols-2 md:grid-cols-3`,children:e.ranges.map((t,n)=>(0,V.jsxs)(`div`,{className:`rounded-md border border-border bg-white p-4`,children:[(0,V.jsx)(`dt`,{className:`text-[0.65rem] uppercase tracking-[0.24em] text-muted-foreground`,children:t.tier}),(0,V.jsx)(`dd`,{className:`mt-1 font-serif text-xl leading-tight`,children:t.from!=null&&t.to!=null?`${e.currency}${t.from.toLocaleString()} – ${e.currency}${t.to.toLocaleString()}`:t.from==null?t.to==null?`—`:`Up to ${e.currency}${t.to.toLocaleString()}`:`From ${e.currency}${t.from.toLocaleString()}`}),t.note?(0,V.jsx)(`p`,{className:`mt-2 text-xs text-foreground/70 leading-relaxed`,children:t.note}):null]},n))}),e.note?(0,V.jsx)(`p`,{className:`mt-3 text-xs text-foreground/60 leading-relaxed`,children:e.note}):null]}):null}function Qe({items:e,eyebrow:t=`Questions`,heading:n=`Frequently asked questions`}){return e.length===0?null:(0,V.jsx)(W,{eyebrow:t,heading:n,children:(0,V.jsx)(`div`,{className:`divide-y divide-border border border-border bg-white`,children:e.map((e,t)=>(0,V.jsxs)(`details`,{className:`group px-5 py-4 [&_summary::-webkit-details-marker]:hidden`,open:t===0,children:[(0,V.jsxs)(`summary`,{className:`flex cursor-pointer items-start justify-between gap-4 text-left font-serif text-base leading-snug md:text-lg`,children:[(0,V.jsx)(`span`,{children:e.q}),(0,V.jsx)(`span`,{"aria-hidden":!0,className:`mt-1 shrink-0 text-[color:var(--color-gold-deep)] transition group-open:rotate-45`,children:`+`})]}),(0,V.jsx)(`p`,{className:`mt-3 max-w-3xl text-sm leading-relaxed text-foreground/80`,children:e.a})]},t))})})}function $e({cards:e,eyebrow:t,heading:n,tone:r=`muted`}){return e.length===0?null:(0,V.jsx)(W,{eyebrow:t,heading:n,tone:r,children:(0,V.jsx)(`div`,{className:`grid gap-4 md:grid-cols-3`,children:e.map((e,t)=>(0,V.jsxs)(`article`,{className:`rounded-md border border-border bg-white p-4`,children:[(0,V.jsx)(`h3`,{className:`font-serif text-lg leading-tight`,children:e.title}),e.body?(0,V.jsx)(`p`,{className:`mt-2 text-sm text-foreground/75 leading-relaxed`,children:e.body}):null]},t))})})}function et({items:e,citySlug:t,cityName:n,heading:r}){return e.length===0?null:(0,V.jsx)(W,{eyebrow:`Popular searches`,heading:r??`Popular searches in ${n}`,children:(0,V.jsx)(`ul`,{className:`flex flex-wrap gap-2`,children:e.map(e=>(0,V.jsx)(`li`,{children:(0,V.jsxs)(a,{..._({citySlug:t,categorySlug:e.slug}),className:`inline-flex items-center gap-2 rounded-full border border-border bg-white px-4 py-2 text-sm transition hover:border-[color:var(--color-gold-soft)]`,children:[(0,V.jsxs)(`span`,{children:[e.label,` in `,n]}),e.count==null?null:(0,V.jsx)(`span`,{className:`text-[0.65rem] uppercase tracking-[0.24em] text-muted-foreground`,children:e.count})]})},e.id))})})}function tt({items:e,citySlug:t,cityName:n,heading:r}){return e.length===0?null:(0,V.jsx)(W,{eyebrow:`Nearby areas`,heading:r??`Nearby areas in ${n}`,tone:`muted`,children:(0,V.jsx)(`ul`,{className:`flex flex-wrap gap-2`,children:e.map(e=>(0,V.jsx)(`li`,{children:(0,V.jsx)(a,{...h({citySlug:t,areaSlug:e.slug}),className:`inline-flex items-center rounded-full border border-border bg-white px-4 py-2 text-sm transition hover:border-[color:var(--color-gold-soft)]`,children:e.name})},e.slug))})})}var nt={restaurants:{vocabulary:{identity_terms:[`restaurant`,`dining`,`menu`]},entity_kind:`food_drink`,schema:{primary_type:`Restaurant`}},cafes:{vocabulary:{identity_terms:[`cafe`,`coffee shop`,`coffee`]},entity_kind:`food_drink`,schema:{primary_type:`CafeOrCoffeeShop`},editorial:{sections:[{key:`about`,title:`About`,intent:`What this cafe is and what it serves.`,target_words:200},{key:`coffee_food`,title:`Coffee & Food`,intent:`Drinks and food focu
2s, from evidence only.`,requires:[`discovery`,`services`],target_words:120},{key:`atmosphere`,title:`Atmosphere`,intent:`Seating, ambience and the kind of visit it suits.`,requires:[`amenities`,`attributes`,`reviews`],target_words:110},{key:`good_to_know`,title:`Good to Know`,intent:`Hours, contact and access facts.`,requires:[`hours`,`attributes`,`location`],target_words:90}]}},bars:{vocabulary:{identity_terms:[`bar`,`pub`,`cocktails`]},entity_kind:`food_drink`,schema:{primary_type:`BarOrPub`},editorial:{sections:[{key:`about`,title:`About`,intent:`What this bar is and who it serves.`,target_words:200},{key:`experience`,title:`Experience`,intent:`Ambience, seating and entertainment where evidenced.`,requires:[`amenities`,`attributes`,`reviews`],target_words:120},{key:`food_drinks`,title:`Food & Drinks`,intent:`Drink and food focus, from evidence only.`,requires:[`discovery`,`services`],target_words:110},{key:`good_to_know`,title:`Good to Know`,intent:`Hours, contact and access facts.`,requires:[`hours`,`attributes`,`location`],target_words:90}]}}
2,hotels:{entity_kind:`hospitality`,schema:{primary_type:`Hotel`},vocabulary:{identity_terms:[`hotel`,`rooms`,`stay`]}},resorts:{entity_kind:`hospitality`,schema:{primary_type:`Resort`},vocabulary:{identity_terms:[`resort`]}},lodges:{entity_kind:`hospitality`,schema:{primary_type:`LodgingBusiness`},vocabulary:{identity_terms:[`lodge`,`guest house`]}},schools:{entity_kind:`institution`,schema:{primary_type:`School`},vocabulary:{identity_terms:[`school`,`students`,`classrooms`]}},colleges:{entity_kind:`institution`,schema:{primary_type:`CollegeOrUniversity`},vocabulary:{identity_terms:[`college`,`campus`,`courses`]}},universities:{entity_kind:`institution`,schema:{primary_type:`CollegeOrUniversity`},vocabulary:{identity_terms:[`university`,`campus`]}},"coaching-centres":{entity_kind:`institution`,schema:{primary_type:`EducationalOrganization`},vocabulary:{identity_terms:[`coaching centre`,`batches`,`students`]}},"interior-designers":{vocabulary:{identity_terms:[`interior design studio`,`interior designer`,`interiors`,`turnkey interiors`]},entity_kind:`professional_service`,schema:{primary_type:`ProfessionalService`,additional_types:[`HomeAndConstructionBusiness`]},quality:{dimensions:[{key:`projects`,label:`Projects`,weight:14,fields:[`official.projects`],official_only:!0},{key:`services`,label:`Design services`,weight:12,fields:[`intel.business.services`]},{key:`team`,label:`Team`,weight:8,fields:[`official.team`],official_only:!0}]},modules:{services:`emphasised`,amenities:`deemphasised`,hours:`deemphasised`}},architects:{vocabulary:{identity_terms:[`architecture practice`,`architect`,`architectural`]},entity_kind:`professional_service`,schema:{primary_type:`Architect`},quality:{dimensions:[{key:`projects`,label:`Projects`,weight:14,fields:[`official.projects`],official_only:!0},{key:`services`,label:`Services`,weight:12,fields:[`intel.business.services`]}]},modules:{services:`emphasised`,amenities:`deemphasised`,hours:`deemphasised`}},"web-design-companies":{vocabulary:{identity_terms:[`web design company`,`web development agency`,`websites`]},entity_kind:`professional_service`,schema:{primary_type:`ProfessionalService`,additional_types:[`Organization`]},editorial:{sections:[{key:`about`,title:`About`,intent:`What this company builds and who it builds for.`,target_words:200},{key:`services`,title:`Services`,intent:`Web design, development and related services from the resolved taxonomy.`,requires:[`services`],target_words:130},{key:`specializations`,title:`Specializations`,intent:`Platforms, stacks or industries the evidence supports.`,requires:[`discovery`,`website`],target_words:110},{key:`engagement`,title:`Working Together`,intent:`How an engagement starts, only where evidenced.`,requires:[`website`],target_words:100}]},faq:{themes:[{key:`services`,intent:`Which web services are offered.`,requires:[`services`],priority:5},{key:`specialization`,intent:`Which platforms or technologies are evidenced.`,requires:[`discovery`,`website`],priority:8},{key:`industries`,intent:`Which client types or industries are served.`,requires:[`discovery`,`website`],priority:12},{key:`coverage`,intent:`Which locations or markets are served.`,requires:[`location`],priority:16},{key:`engagement`,intent:`How to start an enquiry or project.`,priority:20},{key:`what_is_it`,intent:`What kind of company this is.`,priority:30},{key:`where`,intent:`Where the company is based.`,requires:[`location`],priority:50},{key:`ratings`,intent:`How it is rated by clients.`,requires:[`reviews`],priority:70},{key:`contact`,intent:`How to get in touch.`,requires:[`identity`],priority:80}],target_with_website:10,target_without_website:5},quality:{dimensions:[{key:`services`,label:`Services`,weight:14,fields:[`intel.business.services`]},{key:`projects`,label:`Projects`,weight:12,fields:[`official.projects`],official_only:!0},{key:`case_studies`,label:`Case studies`,weight:8,fields:[`official.case_studies`],official_only:!0},{key:`team`,label:`Team`,weight:6,fields:[`official.team`],official_only:!0},{key:`tech_stack`,label:`Technology stack`,weight:6,fields:[`official.tech_stack`],official_only:!0}]},official:{capabilities:[`case_studies`,`tech_stack`]},facts:{official:[`intel.business.story`,`intel.business.team_size`]},attributes:{groups:[`Service options`,`Project Types`,`Client Types`,`Technologies`,`Payments`],show_unlisted:!0},modules:{services:`emphasised`,amenities:`hidden`,hours:`deemphasised`}},"professional-services":{entity_kind:`professional_service`},"home-services":{entity_kind:`professional_service`,schema:{primary_type:`HomeAndConstructionBusiness`},vocabulary:{identity_terms:[`home services`,`technicians`]}},hospitals:{entity_kind:`health`,schema:{primary_type:`Hospital`},vocabulary:{identity_terms:[`hospital`,`patients`,`inpatient`]}},clinics:{entity_kind:`health`,schema:{primary_type:`MedicalClinic`},vocabulary:{identity_terms:[`clinic`,`consultations`,`patients`]}},dentists:{entity_kind:`health`,schema:{primary_type:`Dentist`},vocabulary:{identity_terms:[`dental clinic`,`dentist`]}},pharmacies:{entity_kind:`health`,schema:{primary_type:`Pharmacy`},vocabulary:{identity_terms:[`pharmacy`,`medicines`]}},malls:{vocabulary:{identity_terms:[`shopping mall`,`shopping centre`,`stores`]},entity_kind:`retail`,schema:{primary_type:`ShoppingCenter`},editorial:{sections:[{key:`about`,title:`About`,intent:`What this shopping centre is.`,target_words:200},{key:`shopping`,title:`Shopping & Experiences`,intent:`Stores, dining and entertainment from evidence only.`,requires:[`discovery`,`services`],target_words:130},{key:`facilities`,title:`Facilities`,intent:`Parking, accessibility and visitor facilities.`,requires:[`amenities`,`attributes`],target_words:110},{key:`good_to_know`,title:`Good to Know`,intent:`Hours, contact and access facts.`,requires:[`hours`,`location`],target_words:90}]}},"shopping-centres":{entity_kind:`retail`,schema:{primary_type:`ShoppingCenter`},vocabulary:{identity_terms:[`shopping centre`,`stores`]}},retail:{entity_kind:`retail`,vocabulary:{identity_terms:[`store`,`shop`]}},shops:{entity_kind:`retail`,vocabulary:{identity_terms:[`shop`,`store`]}},attractions:{entity_kind:`attraction`,vocabulary:{identity_terms:[`attraction`,`visitors`]}},"tourist-places":{entity_kind:`attraction`,vocabulary:{identity_terms:[`tourist attraction`,`sightseeing`]}},"entertainment-venues":{entity_kind:`attraction`,schema:{primary_type:`EntertainmentBusiness`},vocabulary:{identity_terms:[`entertainment venue`]}},gyms:{vocabulary:{identity_terms:[`gym`,`fitness centre`,`workouts`]},entity_kind:`fitness_beauty`,schema:{primary_type:`ExerciseGym`},editorial:{sections:[{key:`about`,title:`About`,intent:`What this gym is and who it serves.`,target_words:200},{key:`training`,title:`Training & Facilities`,intent:`Training types and equipment from evidence only.`,requires:[`services`,`discovery`,`amenities`],target_words:130},{key:`membership`,title:`Membership & Services`,intent:`Membership or service information, only where evidenced.`,requires:[`services`,`website`],target_words:100},{key:`good_to_know`,title:`Good to Know`,intent:`Hours, contact and access facts.`,requires:[`hours`,`location`],target_words:90}]}},salons:{vocabulary:{identity_terms:[`salon`,`haircut`,`grooming`]},entity_kind:`fitness_beauty`,schema:{primary_type:`BeautySalon`},editorial:{sections:[{key:`about`,title:`About`,intent:`What this salon is and who it serves.`,target_words:200},{key:`services`,title:`Services`,intent:`Treatments and services listed for this salon.`,requires:[`services`,`discovery`],target_words:130},{key:`experience`,title:`Experience`,intent:`Ambience and visit expectations, from evidence only.`,requires:[`amenities`,`attributes`,`reviews`],target_words:100},{key:`good_to_know`,title:`Good to Know`,intent:`Hours, contact and access facts.`,requires:[`hours`,`location`],target_words:90}]}},spas:{entity_kind:`fitness_beauty`,schema:{primary_type:`DaySpa`},vocabulary:{identity_terms:[`spa`,`massage`,`treatments`]}},"makeup-artists":{entity_kind:`fitness_beauty`,schema:{primary_type:`BeautySalon`,additional_types:[`LocalBusiness`]},vocabulary:{identity_terms:[`makeup artist`,`bridal makeup`,`makeup studio`]},editorial:{sections:[{key:`about`,title:`About`,intent:`Who this artist works with and the kind of looks they do.`,target_words:190},{key:`services`,title:`Services`,intent:`Makeup and allied services from the resolved taxonomy.`,requires:[`services`],target_words:130},{key:`engagement`,title:`Booking & On-Location`,intent:`How bookings work and whether they travel, where evidenced.`,requires:[`attributes`,`website`],target_words:100},{key:`good_to_know`,title:`Good to Know`,intent:`Hours, contact and access facts.`,requires:[`hours`,`location`],target_words:90}]},faq:{themes:[{key:`services`,intent:`Which makeup services are offered.`,requires:[`services`],priority:5},{key:`occasions`,intent:`Which occasions are covered (bridal, party, editorial).`,requires:[`services`,`discovery`],priority:10},{key:`on_location`,intent:`Whether the artist travels to the client.`,requires:[`attributes`],priority:14},{key:`booking`,intent:`How to book an appointment.`,priority:20},{key:`where`,intent:`Where the studio is located.`,requires:[`location`],priority:50},{key:`ratings`,intent:`How clients rate them.`,requires:[`reviews`],priority:70}]},modules:{services:`emphasised`,amenities:`deemphasised`},attributes:{groups:[`Service options`,`Planning`,`Payments`,`Acce
2ssibility`],show_unlisted:!0}},opticians:{entity_kind:`retail`,schema:{primary_type:`Optician`,additional_types:[`Store`]},vocabulary:{identity_terms:[`optician`,`eyewear store`,`optical store`]},editorial:{sections:[{key:`about`,title:`About`,intent:`What this store sells and which eye-care services it runs.`,target_words:190},{key:`services`,title:`Products & Services`,intent:`Eyewear ranges and eye-care services from the resolved taxonomy.`,requires:[`services`],target_words:130},{key:`visit`,title:`Visiting`,intent:`Fulfilment, appointments and in-store experience, from evidence only.`,requires:[`attributes`,`amenities`],target_words:100},{key:`good_to_know`,title:`Good to Know`,intent:`Hours, contact and access facts.`,requires:[`hours`,`location`],target_words:90}]},faq:{themes:[{key:`services`,intent:`Which eyewear and eye-care services are available.`,requires:[`services`],priority:5},{key:`eye_test`,intent:`Whether eye testing is available in store.`,requires:[`services`,`discovery`],priority:10},{key:`brands`,intent:`Which eyewear brands are stocked.`,requires:[`discovery`,`website`],priority:14},{key:`visit`,intent:`Fulfilment options such as pickup or delivery.`,requires:[`attributes`],priority:18},{key:`where`,intent:`Where the store is located.`,requires:[`location`],priority:50},{key:`ratings`,intent:`How customers rate the store.`,requires:[`reviews`],priority:70}]},modules:{services:`emphasised`,hours:`emphasised`},attributes:{groups:[`Service options`,`Planning`,`Accessibility`,`Payments`,`Amenities`],show_unlisted:!0}},"places-to-visit":{entity_kind:`attraction`,schema:{primary_type:`TouristAttraction`,additional_types:[`Place`]},vocabulary:{identity_terms:[`place to visit`,`attraction`,`visitors`]},editorial:{sections:[{key:`about`,title:`About`,intent:`What this place is and why people go there.`,target_words:200},{key:`experience`,title:`What to Expect`,intent:`The visit itself — setting, scale and activities, from evidence only.`,requires:[`attributes`,`amenities`,`reviews`],target_words:130},{key:`planning`,title:`Planning Your Visit`,intent:`Timing, tickets, facilities and accessibility, where evidenced.`,requires:[`hours`,`attributes`,`amenities`],target_words:120},{key:`good_to_know`,title:`Good to Know`,intent:`Location, access and contact facts.`,requires:[`location`],target_words:90}]},faq:{themes:[{key:`what_is_it`,intent:`What kind of place this is.`,priority:5},{key:`timings`,intent:`When it is open and best visited.`,requires:[`hours`],priority:8},{key:`tickets`,intent:`Whether entry or tickets are required.`,requires:[`attributes`],priority:12},{key:`facilities`,intent:`Which visitor facilities exist.`,requires:[`amenities`,`attributes`],priority:16},{key:`family`,intent:`Whether it suits families and children.`,requires:[`attributes`],priority:20},{key:`getting_there`,intent:`Where it is and how to reach it.`,requires:[`location`],priority:50},{key:`ratings`,intent:`How visitors rate it.`,requires:[`reviews`],priority:70}]},modules:{services:`deemphasised`,amenities:`emphasised`,hours:`emphasised`},attributes:{groups:[`Amenities`,`Children`,`Highlights`,`Planning`,`Accessibility`,`Parking`],show_unlisted:!0}}},rt={restaurant:`restaurants`,cafe:`cafes`,"coffee-shops":`cafes`,bar:`bars`,pubs:`bars`,hotel:`hotels`,resort:`resorts`,school:`schools`,college:`colleges`,university:`universities`,gym:`gyms`,"fitness-centres":`gyms`,salon:`salons`,"beauty-salons":`salons`,hospital:`hospitals`,clinic:`clinics`,mall:`malls`,"shopping-malls":`malls`,attraction:`attractions`,"tourist-attractions":`attractions`,"interior-designer":`interior-designers`,architect:`architects`,"web-design-company":`web-design-companies`,"web-design-development-companies":`web-design-companies`,"web-design-and-development-companies":`web-design-companies`,"web-development-companies":`web-design-companies`,"web-designers":`web-design-companies`,"website-designers":`web-design-companies`,"makeup-artist":`makeup-artists`,"bridal-makeup-artists":`makeup-artists`,optician:`opticians`,"optical-stores":`opticians`,opticals:`opticians`,"eyewear-stores":`opticians`,"places-to-visit-in-hubli":`places-to-visit`,"tourist-places-to-visit":`places-to-visit`,"sightseeing-places":`places-to-visit`};function it(e){if(!e)return null;let t=e.trim().toLowerCase();return nt[t]??nt[rt[t]??``]??null}var at={noun:`business`,nounPlural:`businesses`,audience:`customers`,categoryFallback:`Local Business`},ot={generic:at,food_drink:{noun:`restaurant`,nounPlural:`restaurants`,audience:`diners`,categoryFallback:`Restaurant`}
2,hospitality:{noun:`property`,nounPlural:`properties`,audience:`guests`,categoryFallback:`Stay`},institution:{noun:`institution`,nounPlural:`institutions`,audience:`families`,categoryFallback:`Institution`},professional_service:{noun:`business`,nounPlural:`businesses`,audience:`clients`,categoryFallback:`Professional Service`},health:{noun:`practice`,nounPlural:`practices`,audience:`patients`,categoryFallback:`Healthcare`},retail:{noun:`store`,nounPlural:`stores`,audience:`shoppers`,categoryFallback:`Store`},attraction:{noun:`place`,nounPlural:`places`,audience:`visitors`,categoryFallback:`Place`},fitness_beauty:{noun:`studio`,nounPlural:`studios`,audience:`clients`,categoryFallback:`Fitness & Beauty`}},st={"interior-designers":{noun:`studio`,nounPlural:`studios`,audience:`homeowners`,categoryFallback:`Interior Design Studio`},"interior-designer":{noun:`studio`,nounPlural:`studios`,audience:`homeowners`,categoryFallback:`Interior Design Studio`}};function ct(e){return e.split(/[\s_-]+/).filter(Boolean).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `)}function lt(e={}){let t=ot[e.entityKind??`generic`]??at,n=(e.categorySlug??``).trim().toLowerCase(),r={...t,...st[n]??{}},i=e.categoryName&&e.categoryName.trim()||(n?ct(n):``)||r.categoryFallback,a=e.brand?.trim()||`this ${r.noun}`,o=e.location?`${i} · ${e.location}`:i;return{...r,categoryLabel:i,categoryLine:o,confirmationLine:`You're activating the Official Profile for`,reviewHeading:`Confirm the ${r.noun} you're activating.`,whyListedLines:[`This profile has been created using publicly available business information to help ${r.audience} discover ${r.nounPlural} across Hubli and Dharwad.`,`By activating your Official Profile, you can manage and enhance ${a}'s presence on Hubli.net.`]}}function ut(e){return it((e??``).trim().toLowerCase())?.entity_kind??`generic`}function dt(e){let t=(e.categorySlug??``).trim().toLowerCase(),n=(e.categoryName??``).trim(),r=lt({entityKind:ut(t),categorySlug:t,categoryName:n||null}),i=(n||r.categoryLabel).toLowerCase();return{...r,categoryLower:i,categorySingular:ft(i),subjectPlural:i.endsWith(`s`)?i:`${i} ${r.nounPlural}`}}function ft(e){let t=e.trim().split(/\s+/);if(t.length===0)return e;let n=t.findIndex(e=>e===`to`||e===`for`||e===`in`),r=n>0?n-1:t.length-1;return t[r]=mt(t[r]),t.join(` `)}var pt=new Set([`fitness`,`news`,`wellness`,`business`,`services`,`logistics`,`electronics`,`sports`,`glass`,`class`]);function mt(e){let t=e.toLowerCase();return t.length<4||pt.has(t)?e:/(ies)$/.test(t)?e.slice(0,-3)+`y`:/(ches|shes|sses|xes|zes)$/.test(t)?e.slice(0,-2):/[^s]s$/.test(t)?e.slice(0,-1):e}function G(e,t){return e.replaceAll(`{city}`,t.city).replaceAll(`{category}`,t.category).replaceAll(`{area}`,t.area??t.city)}function ht(e,t){let{noun:n,nounPlural:r,categoryLower:i,audience:a}=e;return[{q:`How do I choose the right ${i} in ${t}?`,a:`Compare a shortlist on the things that actually differ — location, what they offer, timings and recent reviews — then contact one or two directly to confirm the details that matter to you.`},{q:`What should I check before visiting a ${n} in ${t}?`,a:`Check current timings, the address and area, and whether the ${n} offers what you need. Listings here show contact details so you can confirm before you travel.`},{q:`How are ${r} listed on ${pe}?`,a:`Standard listings are curated from public sources and reviewed by our editorial team. An Official Profile is owner-managed, so the business itself keeps its details, photos and offerings up to date for ${a}.`}]}function gt(e){let{category:t,bundle:n,taxonomyRelated:r,areaOptions:i,cityName:a,areaName:o}=e,s=dt({categorySlug:t.slug,categoryName:t.name}),c=s.categoryLower,l={city:a,category:c,area:o},u=[];n.about.paragraphs.length>0&&u.push({kind:`about`,heading:o?`About ${c} in ${o}, ${a}`:`About ${c} in ${a}`,paragraphs:n.about.paragraphs.map(e=>G(e,l))}),n.buyingGuide.checklist.length>0&&u.push({kind:`how-to-choose`,heading:`How to choose the right ${c}`,items:n.buyingGuide.checklist.map(e=>({title:G(e.title,l),body:e.body?G(e.body,l):void 0}))});let d=t.faq.length>0,f=d?t.faq.map(e=>({q:e.q,a:e.a})):ht(s,a),p=n.greatCategory.pillars.length>0?n.greatCategory.pillars.map(e=>
2({title:G(e.title,l),body:e.body?G(e.body,l):void 0})):[],m=r.filter(e=>e.slug!==t.slug).slice(0,8).map(e=>({id:e.id,slug:e.slug,label:e.name,count:e.listingCount>0?e.listingCount:void 0})),h=o?i.find(e=>e.name===o)?.slug:void 0;return{blocks:u,faq:f,faqAuthored:d,buyingGuide:p,popularSearches:m,nearbyAreas:i.filter(e=>e.slug!==h).slice(0,12).map(e=>({slug:e.slug,name:e.name}))}}var _t=[`service options`,`dining options`,`popular for`,`offerings`,`atmosphere`,`crowd`,`children`,`accessibility`,`amenities`,`parking`,`payments`],vt=[[/restaurant|cafe|caf|dhaba|bakery|food|dining|mess|khanavali|bar\b|pub\b/i,`Dining & Restaurant Details`],[/hotel|resort|lodge|stay|guest\s?house|homestay/i,`Stay & Hotel Details`],[/salon|spa|barber|parlour|parlor|beauty/i,`Salon & Service Details`],[/optic|eyewear|sunglass/i,`Services & Store Details`],[/makeup|photograph|event|planner/i,`Services & Booking Details`],[/clinic|hospital|dental|doctor|diagnostic|pharmac/i,`Clinic & Visit Details`],[/gym|fitness|yoga|studio/i,`Facility & Class Details`],[/school|college|academy|institute|coaching|classes/i,`Admissions & Campus Details`],[/store|shop|mart|showroom|boutique|retail/i,`Store & Shopping Details`],[/service|repair|contractor|consultan|agency|designer/i,`Services & Visit Details`]];function yt(e){let t=(e??``).trim();if(t){for(let[e,n]of vt)if(e.test(t))return n}return`Business Details`}function K(e){return e.trim().replace(/[_-]+/g,` `).replace(/\s+/g,` `).toLowerCase()}function bt(e){return K(e).replace(/[^a-z0-9]+/g,`-`).replace(/(^-|-$)/g,``)}function xt(e){if(!Array.isArray(e))return[];let t=[],n=new Set;for(let r of e){if(typeof r!=`string`)continue;let e=r.trim().replace(/\s+/g,` `);if(!e)continue;let i=e.toLowerCase();n.has(i)||(n.add(i),t.push(e))}return t}function St(e){if(!e||typeof e!=`object`||Array.isArray(e))return[];let t=[];for(let[n,r]of Object.entries(e)){let e=xt(r);if(e.length===0)continue;let i=n.trim().replace(/[_-]+/g,` `).replace(/\s+/g,` `);i&&t.push({key:bt(i),label:i,items:e})}return t.sort((e,t)=>{let n=_t.indexOf(K(e.label)),r=_t.indexOf(K(t.label));if(n!==-1||r!==-1){if(n===-1)return 1;if(r===-1)return-1;if(n!==r)return n-r}return e.label.localeCompare(t.label)})}function Ct(e){let t=(()=>{if(Array.isArray(e))return e;if(e&&typeof e==`object`){let t=e.sections;if(Array.isArray(t))return t}return[]})(),n=[],r=new Set,i=new Set;for(let e of t){if(!e||typeof e!=`object`)continue;let t=e,a=typeof t.body==`string`?t.body.trim():``;if(!a)continue;let o=typeof t.key==`string`?t.key.trim():``,s=typeof t.title==`string`&&t.title.trim()?t.title.trim():o;if(!s)continue;let c=bt(o||s),l=a.toLowerCase();r.has(c)||i.has(l)||(r.add(c),i.add(l),n.push({key:c,title:s,body:a}))}return n}var wt=[`service options`,`dining options`,`popular for`,`offerings`,`highlights`];function Tt(e){return wt.includes(K(e))}function Et(e){return(e??``).toLowerCase().normalize(`NFKD`).replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``)}var q=[`food_drink`,`hospitality`],Dt=[{id:`area`,label:`Area`,group:`location`,order:10,source:{kind:`areas`},support:{minOptionCount:1,minOptions:1}},{id:`services`,label:`Services & specialities`,labelByEntityKind:{food_drink:`Cuisine & specialities`,hospitality:`Cuisine & specialities`,attraction:`What's here`,retail:`Products & services`},group:`availability`,order:10,source:{kind:`services`},support:{minOptionCount:1,minOptions:1},hint:`From canonical structured evidence only.`},{id:`diet`,label:`Dietary preference`,group:`practice`,order:10,entityKinds:q,source:{kind:`attributes`,groups:[`Offerings`]},support:{minOptionCount:1,minOptions:1},hint:`From structured listing evidence only.`,values:[{value:`pure-veg`,label:`Pure veg`,aliases:[`vegetarian-options-only`,`pure-vegetarian`]},{value:`vegetarian`,label:`Vegetarian options`,aliases:[`vegetarian-options`,`vegetarian-options-only`,`pure-vegetarian`]},{value:`vegan`,label:`Vegan options`,aliases:[`vegan-options`]}]},{id:`service`,label:`Service options`,group:`availability`,order:20,entityKinds:q,source:{kind:`attributes`,groups:[`Service options`,`Service Options`]},support:{minOptionCount:1,minOptions:2},values:[{value:`dine-in`,label:`Dine-in`,aliases:[`dine-in`]},{value:`takeaway`,label:`Takeaway`,aliases:[`takeout`,`takeaway`]},{value:`delivery`,label:`Delivery`,aliases:[`delivery`,`no-contact-delivery`]},{value:`pickup`,label:`Pickup`,aliases:[`curbside-pickup`,`drive-through`]},{value:`outdoor-seating`,label:`Outdoor seating`,aliases:[`outdoor-seating`]}]},{id:`dining`,label:`Dining options`,group:`practice`,order:20,entityKinds:q,source:{kind:`attributes`,groups:[`Dining options`]},support:{minOptionCount:2,minOptions:2},values:[{value:`breakfast`,label:`Breakfast`,aliases:[`breakfast`]},{value:`brunch`,label:`Brunch`,aliases:[`brunch`]},{value:`lunch`,label:`Lunch`,aliases:[`lunch`]},{value:`dinner`,label:`Dinner`,aliases:[`dinner`]},{value:`dessert`,label:`Dessert`,aliases:[`dessert`]},{value:`catering`,label:`Catering`,aliases:[`catering`]},{value:`table-service`,label:`Table service`,aliases:[`table-service`]}]},{id:`atmosphere`,label:`Atmosphere`,group:`practice`,order:30,entityKinds:q,source:{kind:`attributes`,groups:[`Atmosphere`]},support:{minOptionCount:2,minOptions:2},values:[{value:`casual`,label:`Casual`,aliases:[`casual`]},{value:`cozy`,label:`Cozy`,aliases:[`cozy`]},{value:`quiet`,label:`Quiet`,aliases:[`quiet`]},{value:`lively`,label:`Lively`,aliases:[`lively`,`trendy`]},{value:`upscale`,label:`Upscale`,aliases:[`upscale`]}]},{id:`family`,label:`Families & groups`,group:`practice`,order:40,entityKinds:[`food_drink`,`hospital
2ity`,`attraction`],source:{kind:`attributes`,groups:[`Children`,`Crowd`]},support:{minOptionCount:2,minOptions:1},values:[{value:`good-for-kids`,label:`Good for kids`,aliases:[`good-for-kids`,`kid-friendly`,`family-friendly`]},{value:`kids-menu`,label:`Kids' menu`,aliases:[`kids-menu`,`high-chairs`]},{value:`groups`,label:`Good for groups`,aliases:[`groups`]}]},{id:`amenities`,label:`Amenities`,group:`practice`,order:50,entityKinds:[`food_drink`,`hospitality`,`retail`],source:{kind:`attributes`,groups:[`Amenities`]},support:{minOptionCount:2,minOptions:1},values:[{value:`wifi`,label:`Wi-Fi`,aliases:[`wi-fi`,`free-wi-fi`,`wifi`]},{value:`bar`,label:`Bar onsite`,aliases:[`bar-onsite`]},{value:`air-conditioned`,label:`Air-conditioned`,aliases:[`air-conditioned`]},{value:`restroom`,label:`Restroom`,aliases:[`restroom`]}]},{id:`engagement`,label:`How they work`,group:`availability`,order:25,entityKinds:[`professional_service`,`fitness_beauty`,`health`],source:{kind:`attributes`,groups:[`Service options`,`Planning`]},support:{minOptionCount:1,minOptions:2},hint:`From structured listing evidence only.`,values:[{value:`online-appointments`,label:`Online appointments`,aliases:[`online-appointments`]},{value:`appointment-required`,label:`Appointment required`,aliases:[`appointment-required`]},{value:`onsite-services`,label:`Onsite services`,aliases:[`onsite-services`]},{value:`outdoor-services`,label:`On-location / outdoor services`,aliases:[`outdoor-services`]},{value:`online-estimates`,label:`Online estimates`,aliases:[`online-estimates`]}]},{id:`fulfilment`,label:`Shopping & fulfilment`,group:`availability`,order:22,entityKinds:[`retail`],source:{kind:`attributes`,groups:[`Service options`,`Planning`]},support:{minOptionCount:1,minOptions:2},values:[{value:`in-store`,label:`In-store shopping`,aliases:[`in-store-shopping`]},{value:`pickup`,label:`In-store pickup`,aliases:[`in-store-pickup`,`curbside-pickup`]},{value:`delivery`,label:`Delivery`,aliases:[`delivery`]},{value:`onsite-services`,label:`Onsite services`,aliases:[`onsite-services`]},{value:`quick-visit`,label:`Quick visit`,aliases:[`quick-visit`]}]},{id:`facilities`,label:`Facilities`,group:`practice`,order:45,entityKinds:[`attraction`],source:{kind:`attributes`,groups:[`Amenities`,`Children`,`Highlights`,`Planning`]},support:{minOptionCount:1,minOptions:2},hint:`From structured listing evidence only.`,values:[{value:`playground`,label:`Playground`,aliases:[`playground`,`slides`,`swings`]},{value:`picnic`,label:`Picnic friendly`,aliases:[`picnics`,`picnic-tables`]},{value:`restroom`,label:`Restroom`,aliases:[`restroom`,`public-restroom`]},{value:`food-onsite`,label:`Food onsite`,aliases:[`restaurant`]},{value:`tickets`,label:`Tickets recommended`,aliases:[`getting-tickets-in-advance-recommended`]}]},{id:`parking`,label:`Parking`,group:`practice`,order:60,source:{kind:`attributes`,groups:[`Parking`]},support:{minOptionCount:2,minOptions:1},values:[{value:`free-parking`,label:`Free parking`,aliases:[`free-street-parking`,`free-parking-lot`,`free-parking-garage`]},{value:`paid-parking`,label:`Paid parking`,aliases:[`paid-parking-lot`,`paid-parking-garage`,`paid-street-parking`]},{value:`on-site-parking`,label:`On-site parking`,aliases:[`on-site-parking`,`free-parking-lot`,`paid-parking-lot`]}]},{id:`accessibility`,label:`Accessibility`,group:`trust`,order:70,source:{kind:`attributes`,groups:[`Accessibility`]},support:{minOptionCount:2,minOptions:1},values:[{value:`wheelchair-entrance`,label:`Wheelchair accessible entrance`,aliases:[`wheelchair-accessible-entrance`]},{value:`wheelchair-seating`,label:`Wheelchair accessible seating`,aliases:[`wheelchair-accessible-seating`]},{value:`wheelchair-restroom`,label:`Wheelchair accessible restroom`,aliases:[`wheelchair-accessible-restroom`]},{value:`wheelchair-parking`,label:`Wheelchair accessible parking`,aliases:[`wheelchair-accessible-parking-lot`]}]},{id:`service-location`,label:`Where they serve you`,group:`availability`,order:28,source:{kind:`attributes`,groups:[`Service options`,`Service Options`]},support:{minOptionCount:3,minOptions:1},hint:`From structured listing evidence only.`,values:[{value:`onsite`,label:`At their place`,aliases:[`onsite-services`,`in-store-shopping`]},{value:`at-your-location`,label:`At your location`,aliases:[`outdoor-services`,`on-site-services-at-your-location`]},{value:`online`,label:`Online`,aliases:[`online-appointments`,`online-estimates`,`online-classes`]}]},{id:`stay`,label:`Stay facilities`,group:`practice`,order:55,entityKinds:[`hospital
2ity`],source:{kind:`attributes`,groups:[`Amenities`]},support:{minOptionCount:1,minOptions:2},values:[{value:`room-service`,label:`Room service`,aliases:[`room-service`]},{value:`breakfast`,label:`Breakfast`,aliases:[`breakfast`]},{value:`laundry`,label:`Laundry service`,aliases:[`laundry-service`]},{value:`airport-shuttle`,label:`Airport shuttle`,aliases:[`airport-shuttle`]}]}];function Ot(e){return Dt.filter(t=>!t.entityKinds||t.entityKinds.includes(e)).slice().sort((e,t)=>e.order-t.order)}function kt(e,t){let n=(t??``).trim().toLowerCase();return Ot(e).filter(e=>!e.categorySlugs||n!==``&&e.categorySlugs.includes(n))}function At(e,t){return e.labelByEntityKind?.[t]??e.label}function J(e,t){let n=new Set(t.map(e=>e.toLowerCase().trim())),r=new Set;for(let t of St(e.attributes))if(n.has(t.label.toLowerCase().trim()))for(let e of t.items??[]){let t=Et(e);t&&r.add(t)}return r}function Y(e,t){let n=t.filter(t=>(t.count??0)>=e.support.minOptionCount);return n.length<e.support.minOptions?null:n}function X(e,t,n){return{id:e.id,label:n??e.label,group:e.group,type:`multi`,enabled:!0,order:e.order,options:t,hint:e.hint,apply:()=>!0}}function jt(e,t){if(e.source.kind!==`attributes`||!e.values)return null;let n=e.source.groups,r=t.map(e=>J(e,n)),i=(t,n)=>{let r=e.values.find(e=>e.value===n);return r?r.aliases.some(e=>t.has(e)):!1},a=Y(e,e.values.map(e=>({value:e.value,label:e.label,count:r.filter(t=>e.aliases.some(e=>t.has(e))).length})));if(!a)return null;let o=X(e,a);return o.apply=(e,t)=>{if(!t||t.length===0)return!0;let r=J(e,n);return t.some(e=>i(r,e))},o}function Mt(e){return e.primary_area_id??null}function Nt(e,t,n){let r=new Map;for(let e of n)e.id&&r.set(e.slug,e.id);if(r.size===0)return null;let i=Y(e,n.filter(e=>e.id).map(e=>({value:e.slug,label:e.name,count:t.filter(t=>Mt(t)===e.id).length})));if(!i)return null;let a=X(e,i);return a.apply=(e,t)=>!t||t.length===0?!0:t.some(t=>r.get(t)===Mt(e)),a}function Pt(e,t,n,r,i){if(n.length===0)return null;let a=Y(e,n.map(e=>({value:e.slug,label:e.name,count:t.filter(t=>(r[t.id]??[]).includes(e.slug)).length})));if(!a)return null;let o=X(e,a,i);return o.apply=(e,t)=>{if(!t||t.length===0)return!0;let n=r[e.id]??[];return t.some(e=>n.includes(e))},o}function Ft(e,t,n,r){let i=e.options.map(e=>({value:e.slug,label:e.name,count:t.filter(t=>(n[t.id]??[]).includes(e.slug)).length})).filter(e=>e.count>0);return i.length<2?null:{id:e.slug,label:e.name,group:`practice`,type:`multi`,enabled:!0,order:r,options:i,apply:(e,t)=>{if(!t||t.length===0)return!0;let r=n[e.id]??[];return t.some(e=>r.includes(e))}}}function It({listings:e,areaOptions:t=[],serviceOptions:n=[],serviceSlugsByListing:r={},discoveryGroups:i=[],discoveryValueSlugsByListing:a={},categorySlug:o=null}){let s=[...F],c=ut(o);for(let i of kt(c,o)){let a=null;a=i.source.kind===`areas`?Nt(i,e,t):i.source.kind===`services`?Pt(i,e,n,r,At(i,c)):jt(i,e),a&&s.push(a)}let l=new Set(s.map(e=>e.id)),u=15;for(let t of i){if(l.has(t.slug))continue;let n=Ft(t,e,a,t.order??u);u+=1,n&&(l.add(n.id),s.push(n))}return ie(s)}function Lt({facets:e,values:t,optionsById:n,setFacet:r,clearAll:i,activeCount:a,resultCount:o}){if(e.length===0)return null;let s=new Map;for(let t of e){let e=s.get(t.group)??[];e.push(t),s.set(t.group,e)}return(0,V.jsx)(`aside`,{"aria-label":`Filters`,className:`hidden lg:block w-[236px] shrink-0 self-start lg:sticky lg:top-24`,children:(0,V.jsxs)(`div`,{className:`border border-border bg-white`,children:[(0,V.jsxs)(`div`,{className:`flex items-baseline justify-between border-b border-border px-3.5 py-2.5`,children:[(0,V.jsx)(`span`,{className:`text-[0.68rem] uppercase tracking-[0.2em] text-muted-foreground`,children:`Filters`}),(0,V.jsx)(`button`,{type:`button`,onClick:i,disabled:a===0,className:`press-control text-[0.68rem] text-[color:var(--color-gold-deep)] underline underline-offset-4 disabled:opacity-40 disabled:no-underline`,children:`Clear`})]}),(0,V.jsxs)(`div`,{className:`max-h-[calc(100vh-11rem)] overflow-y-auto px-3.5 py-3`,children:[(0,V.jsxs)(`p`,{className:`mb-3 text-[0.68rem] text-muted-foreground`,children:[o,` `,o===1?`place`:`places`,` shown`]}),(0,V.jsx)(`div`,{className:`space-y-5`,children:P.map(e=>{let i=s.get(e);return!i||i.length===0?null:(0,V.jsxs)(`section`,{children:[(0,V.jsx)(`h3`,{className:`mb-2 text-[0.62rem] uppercase tracking-[0.22em] text-muted-foreground`,children:ne[e]}),(0,V.jsx)(`div`,{className:`space-y-4`,children:i.map(e=>(0,V.jsx)(N,{facet:e,value:t[e.id],options:n[e.id]??[],onChange:t=>r(e.id,t)}
2,e.id))})]},e)})})]})]})})}var Rt=[`recommended`,`rating`,`recent`,`alpha`];function zt(e){let t=(e??``).toLowerCase();return Rt.includes(t)?t:`recommended`}function Bt({city:e,category:t,area:n,listings:r,coverUrl:i,relatedCategories:a,popularAreas:c,areaOptions:l,editorialBundle:u,taxonomyRelated:d=[],serviceFilterOptions:f=[],serviceSlugsByListing:p={},discoveryGroups:m=[],discoveryValueSlugsByListing:h={}}){let g=o(),v=zt(s({select:e=>e.location.search})?.sort),y=e=>{g({search:(t=>{let n={...t};return e===`recommended`?delete n.sort:n.sort=e,n})})},b=(0,B.useMemo)(()=>({surface:`category`,items:r,scope:{cityId:e.id,categoryId:t.id,areaId:n?.id}}),[r,e.id,t.id,n?.id]),x=(0,B.useMemo)(()=>It({listings:r,areaOptions:l,serviceOptions:f,serviceSlugsByListing:p,discoveryGroups:m,discoveryValueSlugsByListing:h,categorySlug:t.slug}),[r,l,f,p,m,h,t.slug]),S=(0,B.useMemo)(()=>oe(x,b),[x,b]),C=(0,B.useMemo)(()=>{let e={};for(let t of S)e[t.id]=ce(t,b);return e},[S,b]),{values:w,activeCount:T,setFacet:E,clearFacet:D,clearAll:O,predicate:k}=te(S,C),A=(0,B.useMemo)(()=>r.filter(e=>k(e)),[r,k]),[j,M]=(0,B.useState)(!1),ne=()=>{O(),g(n?_({citySlug:e.slug,categorySlug:t.slug}):{search:(()=>({}))})},N=n?`Other areas in ${e.name} for ${t.name}`:`Popular areas in ${e.name}`,ie=me(e,t,n?{name:n.name,slug:n.slug}:void 0),P=(0,B.useMemo)(()=>dt({categorySlug:t.slug,categoryName:t.name}),[t.slug,t.name]),F=(0,B.useMemo)(()=>gt({category:t,bundle:u,taxonomyRelated:d,areaOptions:l,cityName:e.name,areaName:n?.name}),[t,u,d,l,e.name,n?.name]);return(0,V.jsxs)(ee,{children:[(0,V.jsx)(Re,{city:e,category:t,area:n?{name:n.name,slug:n.slug}:void 0,coverUrl:i,breadcrumbs:ie,resultCount:A.length}),(0,V.jsx)(Be,{citySlug:e.slug,categorySlug:t.slug,currentAreaSlug:n?.slug,areaOptions:l,currentSort:v,onSortChange:y,onClear:ne,filterSlot:S.length>0?(0,V.jsx)(`span`,{className:`lg:hidden`,children:(0,V.jsx)(re,{activeCount:T,onClick:()=>M(!0)})}):null}),(0,V.jsx)(ae,{facets:S,values:w,onRemove:D,onClearAll:O,optionsById:C}),(0,V.jsx)(se,{open:j,onOpenChange:M,facets:S,values:w,setFacet:E,clearAll:O,activeCount:T,ctx:b,optionsById:C}),(0,V.jsxs)(`div`,{className:`container-luxe flex items-start gap-6`,children:[(0,V.jsx)(Lt,{facets:S,values:w,optionsById:C,setFacet:E,clearAll:O,activeCount:T,resultCount:A.length}),(0,V.jsx)(`div`,{className:`min-w-0 flex-1`,children:(0,V.jsx)(We,{city:e,listings:A,sort:v,heading:`${P.categoryLower} in ${n?.name??e.name}`,bare:!0})})]}),(0,V.jsx)(Ke,{cityId:e.id,categoryId:t.id,areaId:n?.id}),(0,V.jsx)(Xe,{blocks:F.blocks}),(0,V.jsx)($e,{eyebrow:`Buying guide`,heading:`What makes a great ${P.categorySingular}`,cards:F.buyingGuide}),(0,V.jsx)(qe,{city:e,items:a}),(0,V.jsx)(Ye,{items:d,citySlug:e.slug,heading:`Related to ${t.name}`}),(0,V.jsx)(Qe,{items:F.faq}),(0,V.jsx)(tt,{items:F.nearbyAreas,citySlug:e.slug,cityName:e.name}),(0,V.jsx)(Je,{city:e,categorySlug:t.slug,categoryName:t.name,heading:N,items:c}),(0,V.jsx)(et,{items:F.popularSearches,citySlug:e.slug,cityName:e.name})]})}var Vt=`id,listing_code,city_id,tier,claim_status,activated_at,title,slug,description,phone,website,email,address,lat,lng,hours,profile_image,gallery,accessibility,amenities,parking,service_options,has_website,rating,user_ratings_total,media_assets,portfolio,established_year,projects_completed,projects_completed_source,accepting_projects,next_available_slot_kind,next_available_slot_month,next_available_slot_date,google_place_id,google_maps_url,owner_profile`;async function Z(e,t){let{data:n,error:r}=await c.from(`cities`).select(`id,slug,name,state,hero_description`).eq(`slug`,e).maybeSingle();if(r)throw r;if(!n)return null;let i=n,{data:a,error:o}=await c.from(`areas`).select(`id,city_id,name,slug,intro,listing_count_cached,lifecycle`).eq(`city_id`,i.id).eq(`slug`,t).eq(`lifecycle`,`published`).maybeSingle();if(o)throw o;return a?{city:i,area:{id:a.id,city_id:a.city_id,name:a.name,slug:a.slug,intro:a.intro??null,listing_count_cached:a.listing_count_cached??null}}:null}async function Ht(e){let t=m(c,Vt);t=w(t,e);let{data:n,error:r}=await t;if(r)throw r;let{attachPrimaryCategories:i}=await l(async()=>{let{attachPrimaryCategories:e}=await import(`./listing-taxonomy-BASjNtE3.js`).then(e=>e.o);return{attachPrimaryCategories:e}},__vite__mapDeps([0,1,2,3,4]));return u(await i(n??[]))}async function Ut(e,t){let{data:n}=await c.from(`areas`).select(`id,slug,name,sort_order`).eq(`city_id`,e).eq(`lifecycle`,`published`).order(`sort_order`).order(`name`);return(n??[]).filter(e=>e.id!==t)}async function Wt(e,t){let n=await Z(e,t);if(!n)return null;let{city:r,area:i}=n,a=await Ht(i.id),[o,s]=await Promise.all([C(),Ut(r.id,i.id)]),c=[];for(let e of o){let t=await O(a,e.slug);t.length!==0&&c.push({category:e,listings:t,count:t.length})}return c.sort((e,t)=>
2t.count-e.count||e.category.name.localeCompare(t.category.name)),{kind:`area`,city:r,area:i,listings:a,liveCount:a.length,sections:c,siblingAreas:s}}async function Gt(e,t,n){let r=await Z(e,t);if(!r)return null;let i=await S(n);if(!i)return null;let{city:a,area:o}=r,s=await b(o.id,i.slug),[l,u,d,f,p]=await Promise.all([T(a,i,8),x(a,o.id,i.slug,8),y(i.cover_image_path),c.from(`areas`).select(`slug,name,sort_order`).eq(`city_id`,a.id).eq(`lifecycle`,`published`).order(`sort_order`).order(`name`),je(i.id)]),m=(f.data??[]).map(e=>({slug:e.slug,name:e.name}));return{kind:`area-category`,city:a,area:o,category:i,listings:s,coverUrl:d.variants?.large??d.url,relatedCategories:l,popularAreas:u,areaOptions:m,editorialBundle:Ie({category:i,editorial:p,listings:s})}}function Q(e){if(!e)return null;let t=String(e).trim();return t.length>0?t:null}function $(e){return e.split(/\n\s*\n/).map(e=>e.trim()).filter(e=>e.length>0)}function Kt(e,t){let n=e.replace(/\s+/g,` `).trim();return n.length<=t?n:n.slice(0,Math.max(0,t-1)).trimEnd()+`…`}function qt(e){let t=[e.projectLocality,e.projectCity].map(e=>Q(e)).filter(e=>e!==null).join(`, `)||null,n=Q(e.shortDescription)??(Q(e.editorialOverview)?Kt(e.editorialOverview,160):Q(e.description)?Kt(e.description,160):null);return{id:e.id,slug:e.slug,title:e.title,spaceName:Q(e.spaceName),styleNames:Array.isArray(e.styleNames)?e.styleNames.filter(e=>Q(e)!==null).slice(0,3):[],budgetName:Q(e.budgetName),location:t,completionYear:e.completionYear??null,shortDescription:n,coverSrc:e.cover?.src??null,coverSrcSet:e.cover?.srcSet??null,coverAlt:e.cover?.alt||e.title}}function Jt(e){let t=[];if(!e||typeof e!=`object`)return t;let n=Q(e.overview);n&&t.push({kind:`overview`,heading:`Overview`,paragraphs:$(n)});let r=(e.services??[]).map(e=>Q(e)).filter(e=>e!==null);r.length>0&&t.push({kind:`services`,heading:`Services Provided`,items:r});let i=(e.scope??[]).map(e=>Q(e)).filter(e=>e!==null);i.length>0&&t.push({kind:`scope`,heading:`Scope of Work`,items:i});let a=Q(e.challenges);a&&t.push({kind:`challenges`,heading:`Challenges`,paragraphs:$(a)});let o=Q(e.solutions);o&&t.push({kind:`solutions`,heading:`Solutions`,paragraphs:$(o)});let s=(e.timeline??[]).map(e=>{let t=Q(e?.label);if(!t)return null;let n=Q(e?.note??null);return n?{label:t,note:n}:{label:t}}).filter(e=>e!==null);return s.length>0&&t.push({kind:`timeline`,heading:`Timeline`,entries:s}),t}export{xe as _,Z as a,Tt as c,Ie as d,je as f,Ce as g,Se as h,Wt as i,St as l,z as m,qt as n,Bt as o,De as p,Gt as r,yt as s,Jt as t,Ct as u,Te as v};

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.