PageSourceSearch

https://home.co.uk/build/assets/Show-Ip_DvhSe.js

js home.co.uk collected 2026-09-24 18:56:16 UTC 86,168 bytes, 3 lines download raw bytes

1import{c as a,r as U,o as n,f as o,b as e,d as _,u as y,h as B,t as l,H as ve,M as be,g as w,F as z,B as Se,s as pe,v as fe,i as me,n as ne,q as et,C as Be,X as tt,j as re,k as We,S as Ke,a as X,V as je,A as xe,e as st,R as nt,L as Ce,_ as ot,l as at,Z as lt,w as he,T as Ee,E as rt,Q as _e,z as it,p as ut,x as Ie,aM as Ye}from"./LoginModal-v__rASBc.js";import{_ as dt}from"./ConsumerLayout-BPOXeIqe.js";import{o as Pe}from"./useMortgageBooking-DrRw6rAH.js";import{C as ct}from"./circle-check-PnBBxvqL.js";import{L as Je,k as ze,I as He,p as mt}from"./app-in6zgkpf.js";import{C as pt}from"./chevron-right-B8FiHy9A.js";import{C as Te}from"./calendar-check-BgsdCuL_.js";import{S as ft}from"./scan-search-CoVUrCc7.js";import{S as Ae}from"./shield-check-CFd5CxF0.js";import{R as gt}from"./ruler-BbJAs2MT.js";import{P as xt}from"./pencil-CPo-ACtq.js";import{R as ht}from"./rotate-ccw-CMXFa-Cn.js";import{B as Ne}from"./badge-check-DOlAnesB.js";import{A as vt}from"./arrow-down-CNsI5C-J.js";import{L as bt}from"./index-D4wOayOf.js";import{C as yt,c as wt,d as kt,P as _t,a as $t,p as St,i as jt}from"./chart-Cv9xaQMa.js";import{T as Qe}from"./trending-down-D4uWJ1CG.js";import{M as Xe}from"./minus-Bn3ML5P6.js";import{I as Bt}from"./info-B75zB_Np.js";import{H as Ct}from"./history-D5Z1ly_v.js";import{B as Nt}from"./bed-double-BZ3h-67K.js";import{A as Pt}from"./arrow-up-right-EvgryhQV.js";import{A as Tt}from"./arrow-down-right-CauWwTj1.js";import{C as At}from"./calendar-clock-BLDAA8z4.js";import{A as Mt}from"./award-Bk46IKUp.js";import{C as qt}from"./calculator--WnvHNGG.js";import{C as Rt}from"./clipboard-check-n91rIOkt.js";import{S as Lt}from"./send-CTLrmgRn.js";import{A as Gt}from"./arrow-left-BemsaVrn.js";import{C as Ft}from"./chart-line-Dlbus_wl.js";import"./_commonjsHelpers-D6-XlEtG.js";import"./AnimatedLogoMini-DZn7kfml.js";/* empty css                                                                         */import"./house-heart-BrGKS1y4.js";import"./arrow-left-right-BtnEndCR.js";import"./bell-QWpbCkhl.js";import"./file-key-B17JaJ5S.js";import"./menu-db6Mjw9T.js";import"./settings-DV5FRVHl.js";import"./credit-card-B1Wt0z13.js";import"./log-out-BgFW5TTa.js";import"./ellipsis-C27HxRzs.js";/* empty css            */import"./echo-fvvHJG-1.js";import"./listingImageRemint-DdzXd0Qc.js";const Ot={class:"relative"},Dt={class:"relative bg-white rounded-3xl border border-stone-200/70 shadow-sm overflow-hidden"},Et={class:"p-6 sm:p-8"},It={class:"flex flex-wrap items-center gap-2 mb-4"},Yt={class:"inline-flex items-center gap-1.5 px-3 py-1 rounded-full bg-emerald-50 text-emerald-700 text-xs font-semibold"},zt={class:"inline-flex items-center gap-1.5 px-3 py-1 rounded-full bg-stone-100 text-stone-600 text-xs font-medium"},Ht={key:0,class:"text-sm text-stone-500 mb-3 flex items-center gap-1.5"},Ut={class:"truncate"},Vt={class:"mt-1 text-5xl font-light tracking-tight text-stone-900 sm:text-6xl"},Wt={key:0,class:"text-3xl font-light text-stone-400 sm:text-4xl"},Kt={key:0,class:"mt-3 text-sm text-stone-600"},Jt={class:"font-semibold text-stone-900"},Qt={key:1,class:"mt-5 text-xs text-stone-400"},Xt={key:2,class:"mt-6 border-t border-stone-100 pt-5"},Zt={key:1},es={class:"block"},ts={class:"mt-1.5 flex max-w-xs items-center rounded-2xl border border-stone-200 bg-stone-50 px-3 focus-within:border-pink-300 focus-within:bg-white"},ss={key:0,class:"mt-4"},ns={class:"text-sm text-stone-600"},os={class:"font-semibold text-emerald-600"},as={class:"text-stone-400"},ls={class:"mt-2 flex h-2.5 overflow-hidden rounded-full bg-stone-100"},rs={class:"mt-1.5 flex items-center justify-between text-[11px] text-stone-400"},is={class:"mt-3 text-sm text-stone-600 leading-relaxed"},us={__name:"EstimateHeroCard",props:{estimate:{type:Object,default:null},subject:{type:Object,default:null},message:{type:String,default:""},formatGBP:{type:Function,required:!0},enableEquity:{type:Boolean,default:!1},mortgageBalance:{type:[Number,String],default:null},bookingPrefill:{type:Object,default:()=>({})}},emits:["update:mortgageBalance"],setup(s,{emit:t}){const m=s,q=t;function k(){var u,r;Pe({...m.bookingPrefill,source:"equity-hero",estimate:((u=m.estimate)==null?void 0:u.mid)??null,equity:((r=D.value)==null?void 0:r.eq)??null})}const x=a(()=>m.estimate&&m.estimate.mid),T=a(()=>m.estimate&&m.estimate.transaction_type==="rent"),g=a(()=>T.value?" pcm":""),p=a(()=>m.estimate&&m.estimate.low!=null&&m.estimate.high!=null&&m.estimate.high>m.estimate.low),S=a(()=>m.enableEquity&&!T.value&&x.value),L=U(m.mortgageBalance!=null),R=a({get:()=>m.mortgageBalance==null||m.mortgageBalance===""?"":Number(m.mortgageBalance).toLocaleStr
1ing("en-GB"),set:u=>{const r=String(u).replace(/\D/g,""),h=r===""?null:Number(r);q("update:mortgageBalance",Number.isFinite(h)&&h>=0?h:null)}}),D=a(()=>{if(!S.value||m.mortgageBalance==null)return null;const u=Number(m.estimate.mid),r=Number(m.mortgageBalance);if(!Number.isFinite(u)||u<=0||!Number.isFinite(r))return null;const h=Math.min(Math.max(0,r),u),M=Math.max(0,u-r),E=u>0?Math.round(M/u*100):0;return{eq:M,owed:h,pct:E}});return(u,r)=>{var h;return n(),o("div",Ot,[r[14]||(r[14]=e("div",{class:"absolute -inset-6 -z-10 rounded-[2.5rem] bg-gradient-to-br from-pink-100/50 via-orange-50/40 to-transparent blur-2xl pointer-events-none"},null,-1)),e("div",Dt,[r[13]||(r[13]=e("div",{class:"h-1.5 w-full bg-gradient-to-r from-rose-500 via-pink-500 to-orange-500"},null,-1)),e("div",Et,[e("div",It,[e("span",Yt,[_(y(ct),{class:"w-3.5 h-3.5"}),B(" "+l(T.value?"Estimated monthly rent":"Estimated value"),1)]),e("span",zt,[_(y(ve),{class:"w-3.5 h-3.5"}),B(" "+l(T.value?"Lettings":"Sale"),1)])]),s.subject&&s.subject.address?(n(),o("p",Ht,[_(y(be),{class:"w-4 h-4 text-stone-400 flex-shrink-0"}),e("span",Ut,l(s.subject.address),1)])):w("",!0),x.value?(n(),o(z,{key:1},[r[10]||(r[10]=e("p",{class:"text-[11px] font-semibold uppercase tracking-[0.18em] text-stone-400"},"Most likely worth",-1)),e("p",Vt,[B(l(s.formatGBP(s.estimate.mid)),1),g.value?(n(),o("span",Wt,l(g.value),1)):w("",!0)]),p.value?(n(),o("p",Kt,[r[2]||(r[2]=B(" Likely range ",-1)),e("span",Jt,l(s.formatGBP(s.estimate.low))+" – "+l(s.formatGBP(s.estimate.high)),1),B(l(g.value),1)])):w("",!0),r[11]||(r[11]=Se('<div class="mt-5"><div class="relative h-2 rounded-full bg-stone-100 overflow-hidden"><div class="absolute inset-y-0 rounded-full bg-gradient-to-r from-rose-400 via-pink-500 to-orange-400" style="left:14%;right:14%;"></div><div class="absolute top-1/2 -translate-y-1/2 w-3 h-3 rounded-full bg-white border-2 border-pink-500 shadow" style="left:50%;transform:translate(-50%, -50%);"></div></div><div class="mt-2 flex items-center justify-between text-[11px] text-stone-400"><span>Lower</span><span class="text-stone-500 font-medium">Most likely</span><span>Upper</span></div></div>',1)),s.estimate.sample_size?(n(),o("p",Qt," Based on "+l(s.estimate.sample_size)+" comparable "+l(s.estimate.sample_size===1?"property":"properties")+" near "+l(((h=s.subject)==null?void 0:h.postcode)||"your postcode")+". ",1)):w("",!0),S.value?(n(),o("div",Xt,[L.value?(n(),o("div",Zt,[e("label",es,[r[5]||(r[5]=e("span",{class:"text-[11px] font-semibold uppercase tracking-wide text-stone-400"},"Mortgage remaining",-1)),e("div",ts,[r[4]||(r[4]=e("span",{class:"text-stone-400"},"£",-1)),pe(e("input",{"onUpdate:modelValue":r[1]||(r[1]=M=>R.value=M),type:"text",inputmode:"numeric",placeholder:"e.g. 180,000",class:"w-full border-0 bg-transparent px-2 py-2.5 text-sm font-medium text-stone-900 placeholder:font-normal placeholder:text-stone-400 focus:outline-none focus:ring-0"},null,512),[[fe,R.value]])])]),D.value?(n(),o("div",ss,[e("p",ns,[r[6]||(r[6]=B(" You own an estimated ",-1)),e("span",os,l(s.formatGBP(D.value.eq)),1),r[7]||(r[7]=B(" of equity ",-1)),e("span",as,"("+l(D.value.pct)+"% of value)",1)]),e("div",ls,[e("div",{class:"bg-gradient-to-r from-emerald-400 to-emerald-500",style:me({width:D.value.pct+"%"})},null,4),e("div",{class:"bg-stone-300",style:me({width:100-D.value.pct+"%"})},null,4)]),e("div",rs,[r[8]||(r[8]=e("span",null,"Your equity",-1)),e("span",null,"Outstanding "+l(s.formatGBP(D.value.owed)),1)]),e("button",{type:"button",onClick:k,class:"mt-4 inline-flex items-center gap-2 rounded-full bg-gradient-to-r from-pink-500 to-orange-500 px-4 py-2.5 text-sm font-semibold text-white shadow-sm transition-all hover:shadow-lg hover:shadow-pink-500/25"},[_(y(Te),{class:"h-4 w-4"}),r[9]||(r[9]=B(" Speak to a mortgage broker ",-1))])])):w("",!0)])):(n(),o("button",{key:0,type:"button",onClick:r[0]||(r[0]=M=>L.value=!0),class:"group inline-flex items-center gap-2 rounded-full bg-stone-100 px-4 py-2 text-sm font-medium text-stone-700 transition-colors hover:bg-stone-200"},[_(y(Je),{class:"h-4 w-4 text-stone-500"}),r[3]||(r[3]=B(" Add your mortgage balance to see your equity ",-1)),_(y(pt),{class:"h-4 w-4 text-stone-400 transition-transform group-hover:translate-x-0.5"})]))])):w("",!0)],64)):(n(),o(z,{key:2},[r[12]||(r[12]=e("p",{class:"text-2xl sm:text-3xl font-light text-stone-900"},"Your valuation is on its way",-1)),e("p",is,l(s.message||"A local expert agent will be in touch shortly to confirm your valuation with a free, no-obligation visit."),1)],64))])])])}}},ds={class:"relative overflow-hidden rounded-3xl border border-stone-200/70 bg-white shadow-sm"},cs={class:"p-6 sm:p-7"},ms={class:"flex flex-wrap items-start justify-between gap-3"},ps={class:"flex items-center gap-2"},fs={class:"grid h-9 w-9 flex-shrink-0 place-items-center rounded-xl bg-pink-50"},gs={class:"mt-4 text-sm leading-relaxed text-stone-600"},xs={class:"mt-4 rounded-2xl border border-stone-200/80 bg-stone-50/60 p-4"},hs={class:"flex flex-wrap items-center justify-between gap-x-3 gap-y-2"},vs={class:"flex items-center gap-2 text-sm text-stone-700"},bs={key:0},ys={class:"font-semibold text-stone-900"},ws={class:"text-stone-400"},ks={key:1,class:"text-stone-500"},_s={key:0,class:"mt-2 text-xs leading-relaxed text-stone-400"},$s={class:"block"},Ss={class:"mt-1.5 flex max-w-xs items-center rounded-2xl border border-stone-200 bg-white px-3 focus-within:border-pink-300"},js={key:0,class:"mt-1.5 text-xs text-rose-600"},Bs={class:"mt-3 flex flex-wrap items-center gap-2"},Cs=["disabled"],Ns=["disabled"],Ps=["disabled"],Ts={class:"mt-5 grid grid-cols-2 gap-3 sm:grid-cols-3"},As={class:"text-[11px] uppercase tracking-wide text-stone-400"},Ms={class:"mt-0.5 text-base font-semibold text-stone-900 sm:text-lg"},qs={class:"mt-4 flex items-start gap-1.5 text-[11px] leading-relaxed text-stone-400"},Rs=10.764,Ls={__name:"MethodologyCard",props:{estimate:{type:Object,default:null},stats:{type:Object,default:null},floorArea:{type:Object,default:null},valuationId:{type:[Number,String],default:null},comparablesCount:{type:Object,default:()=>({sold:0,live:0})},valuation:{type:Object,default:null},postcode:{type:String,default:""},isRent:{type:Boolean,default:!1},formatGBP:{type:Function,required:!0}},setup(s){const t=s,m=a(()=>{var d;return Number((d=t.estimate)==null?void 0:d.sample_size)||0}),q=a(()=>m.value>=8?{label:"Good",tone:"emerald"}:m.value>=3?{label:"Fair",tone:"amber"}:null),k=a(()=>{var d;return((d=t.stats)==null?void 0:d.median_price)??null}),x=a(()=>{var d,j;return((j=(d=t.stats)==null?void 0:d.price_range)==null?void 0:j.min)??null}),T=a(()=>{var d,j;return((j=(d=t.stats)==null?void 0:d.price_range)==null?void 0:j.max)??null}),g=a(()=>{var d;return((d=t.stats)==null?void 0:d.avg_price_per_sqft)??null}),p=a(()=>{var d;return Number((d=t.comparablesCount)==null?void 0:d.sold)||0}),S=a(()=>{var d;return Number((d=t.comparablesCount)==null?void 0:d.live)||0}),L=a(()=>t.floorArea||null),R=a(()=>{var d;return((d=L.value)==null?void 0:d.sqft)!=null?Number(L.value.sqft):null}),D=a(()=>{var d;return((d=L.value)==null?void 0:d.source)??null}),u=a(()=>{var d;return!!((d=L.value)!=null&&d.applied)}),r=a(()=>{var d;return((d=L.value)==null?void 0:d.median_comp_sqft)!=null?Number(L.value.median_comp_sqft):null});a(()=>{var d;return((d=L.value)==null?void 0:d.base_mid)!=null?Number(L.value.base_mid):null});const h=a(()=>{var d;return((d=L.value)==null?void 0:d.epc_sqm)!=null?Math.round(Number(L.value.epc_sqm)*Rs):null}),M=a(()=>D.value==="user"&&h.value!=null),E=d=>
1d==null?"":Number(d).toLocaleString("en-GB")+" sq ft",F=a(()=>{if(R.value==null||r.value==null)return null;const d=R.value/r.value;return d>=1.08?"larger":d<=.92?"smaller":"similar"}),J=a(()=>D.value==="user"?"the size you gave us":"the EPC register");function W(d){return d?{semi:"semi-detached","semi-detached":"semi-detached",detached:"detached",terraced:"terraced","end-terrace":"terraced",flat:"flat",maisonette:"flat",bungalow:"bungalow"}[String(d).toLowerCase()]||String(d).replace(/[_-]+/g," "):"home"}const Q=a(()=>{var ae,le,V,se,ie,ye,c;const d=(ae=t.valuation)==null?void 0:ae.bedrooms,j=W((le=t.valuation)==null?void 0:le.property_type),O=(d?`${d}-bed `:"")+j,H=t.isRent?"lettings":"sales",Z=[];if(p.value&&S.value?Z.push(`We compared ${p.value} recent ${O} ${H} and ${S.value} live listing${S.value===1?"":"s"} nearby.`):p.value?Z.push(`We compared ${p.value} recent ${O} ${H} nearby.`):S.value?Z.push(`We looked at ${S.value} live ${O} listing${S.value===1?"":"s"} nearby.`):Z.push(`We analysed comparable ${O} ${H} nearby.`),u.value&&k.value&&((V=t.estimate)==null?void 0:V.mid)!=null){let b=`The local ${t.isRent?"median rent":"median"} is ${t.formatGBP(k.value)}`;R.value!=null&&(b+=`. Your home is around ${E(R.value)} (from ${J.value})`,F.value&&r.value!=null&&F.value!=="similar"&&(b+=` — ${F.value} than the typical home nearby (~${E(r.value)})`),b+=`, so we've ${F.value==="smaller"?"trimmed":"lifted"} your estimate to ${t.formatGBP(t.estimate.mid)}`,((se=t.estimate)==null?void 0:se.low)!=null&&((ie=t.estimate)==null?void 0:ie.high)!=null&&(b+=` (${t.formatGBP(t.estimate.low)}–${t.formatGBP(t.estimate.high)})`)),Z.push(b+".")}else if(k.value){let b=`The local ${t.isRent?"median rent":"median"} is ${t.formatGBP(k.value)}`;((ye=t.estimate)==null?void 0:ye.low)!=null&&((c=t.estimate)==null?void 0:c.high)!=null&&(b+=`, so your likely range is ${t.formatGBP(t.estimate.low)}–${t.formatGBP(t.estimate.high)}`),x.value!=null&&T.value!=null&&T.value>x.value&&(b+=` — within the ${t.formatGBP(x.value)}–${t.formatGBP(T.value)} seen locally`),Z.push(b+".")}return Z.join(" ")}),A=a(()=>{const d=[{label:"Comparables analysed",value:String(m.value||p.value+S.value)}];return k.value&&d.push({label:t.isRent?"Local median rent":"Local median",value:t.formatGBP(k.value)}),R.value!=null?d.push({label:"Your floor area",value:E(R.value)}):g.value&&d.push({label:"Avg £/sqft",value:"£"+Number(g.value).toLocaleString("en-GB")}),d}),P=U(!1),I=U(!1),Y=U(""),K=U(null),f=a({get:()=>K.value==null||K.value===""?"":Number(K.value).toLocaleString("en-GB"),set:d=>{const j=String(d).replace(/\D/g,"");K.value=j===""?null:Number(j)}});function $(){K.value=R.value,Y.value="",P.value=!0}function i(){P.value=!1,Y.value=""}function v(d){!t.valuationId||I.value||We.patch(`/account/valuations/${t.valuationId}/floor-area`,{floor_area_sqft:d},{preserveScroll:!0,onStart:()=>{I.value=!0,Y.value=""},onError:j=>{Y.value=(j==null?void 0:j.floor_area_sqft)||"That size doesn't look right — please check and try again."},onSuccess:()=>{P.value=!1},onFinish:()=>{I.value=!1}})}function N(){v(K.value??"")}function G(){v("")}return(d,j)=>(n(),o("div",ds,[j[8]||(j[8]=e("div",{class:"h-1.5 w-full bg-gradient-to-r from-rose-500 via-pink-500 to-orange-500"},null,-1)),e("div",cs,[e("div",ms,[e("div",ps,[e("div",fs,[_(y(ft),{class:"h-4.5 w-4.5 text-pink-500"})]),j[1]||(j[1]=e("div",null,[e("h3",{class:"text-base font-semibold text-stone-900"},"How we reached this figure"),e("p",{class:"text-xs text-stone-500"},"The comparable evidence behind your estimate")],-1))]),q.value?(n(),o("span",{key:0,class:ne(["inline-flex items-center gap-1.5 rounded-full px-3 py-1.5 text-xs font-semibold",q.value.tone==="emerald"?"bg-emerald-50 text-emerald-700":"bg-amber-50 text-amber-700"])},[_(y(Ae),{class:"h-3.5 w-3.5"}),B(" Confidence: "+l(q.value.label),1)],2)):w("",!0)]),e("p",gs,l(Q.value),1),e("div",xs,[P.value?(n(),o("form",{key:1,onSubmit:et(N,["prevent"])},[e("label",$s,[j[4]||(j[4]=e("span",{class:"text-[11px] font-semibold uppercase tracking-wide text-stone-400"},"Your home's floor area",-1)),e("div",Ss,[pe(e("input",{"onUpdate:modelValue":j[0]||(j[0]=O=>f.value=O),type:"text",inputmode:"numeric",placeholder:"e.g. 1,100",class:"w-full border-0 bg-transparent px-1 py-2.5 text-sm font-medium text-stone-900 placeholder:font-normal placeholder:text-stone-400 focus:outline-none focus:ring-0"},null,512),[[fe,f.value]]),j[3]||(j[3]=e("span",{class:"flex-shrink-0 text-sm text-stone-400"},"sq ft",-1))])]),Y.value?(n(),o("p",js,l(Y.value),1)):w("",!0),e("div",Bs,[e("button",{type:"submit",disabled:I.value,class:"inline-flex items-center gap-1.5 rounded-full bg-gradient-to-r from-pink-500 to-orange-500 px-4 py-2 text-xs font-semibold text-white shadow-sm transition-all hover:shadow-md hover:shadow-
1pink-500/25 disabled:opacity-60"},[_(y(Be),{class:"h-3.5 w-3.5"}),B(" "+l(I.value?"Saving…":"Save & recalculate"),1)],8,Cs),e("button",{type:"button",onClick:i,disabled:I.value,class:"inline-flex items-center gap-1.5 rounded-full px-3 py-2 text-xs font-medium text-stone-500 transition-colors hover:text-stone-700 disabled:opacity-60"},[_(y(tt),{class:"h-3.5 w-3.5"}),j[5]||(j[5]=B(" Cancel ",-1))],8,Ns),M.value?(n(),o("button",{key:0,type:"button",onClick:G,disabled:I.value,class:"inline-flex items-center gap-1.5 rounded-full px-3 py-2 text-xs font-medium text-stone-400 transition-colors hover:text-stone-600 disabled:opacity-60"},[_(y(ht),{class:"h-3.5 w-3.5"}),B(" Reset to EPC ("+l(E(h.value))+") ",1)],8,Ps)):w("",!0)]),j[6]||(j[6]=e("p",{class:"mt-2 text-[11px] leading-relaxed text-stone-400"}," We store this as your correction — it never overwrites the official EPC record. ",-1))],32)):(n(),o(z,{key:0},[e("div",hs,[e("div",vs,[_(y(gt),{class:"h-4 w-4 flex-shrink-0 text-stone-400"}),R.value!=null?(n(),o("span",bs,[j[2]||(j[2]=B(" Floor area ",-1)),e("span",ys,l(E(R.value)),1),e("span",ws,"· from "+l(J.value),1)])):(n(),o("span",ks,"We don't have a floor area on file for this home."))]),e("button",{type:"button",onClick:$,class:"inline-flex items-center gap-1.5 rounded-full bg-white px-3 py-1.5 text-xs font-semibold text-stone-700 ring-1 ring-stone-200 transition-colors hover:bg-stone-100"},[_(y(xt),{class:"h-3.5 w-3.5 text-stone-400"}),B(" "+l(R.value!=null?"Not right? Update":"Add your floor area"),1)])]),R.value!=null&&!u.value?(n(),o("p",_s," Your home is a typical size for the area, so this hasn't changed the figure — but correct it if it's wrong. ")):w("",!0)],64))]),e("div",Ts,[(n(!0),o(z,null,re(A.value,O=>(n(),o("div",{key:O.label,class:"rounded-2xl bg-stone-50 p-3.5"},[e("p",As,l(O.label),1),e("p",Ms,l(O.value),1)]))),128))]),e("p",qs,[_(y(Ne),{class:"mt-0.5 h-3.5 w-3.5 flex-shrink-0 text-emerald-500"}),j[7]||(j[7]=B(" Your range is centred on the local median, adjusted for your home's size and clamped to the prices actually achieved nearby — a real local agent confirms the exact figure in person. ",-1))])])]))}},Gs={key:0,class:"rounded-3xl border border-stone-200/70 bg-white p-6 shadow-sm sm:p-7"},Fs={class:"flex items-center gap-2"},Os={class:"grid h-9 w-9 flex-shrink-0 place-items-center rounded-xl bg-pink-50"},Ds={class:"text-xs text-stone-500"},Es={class:"mt-8 px-1"},Is={class:"relative h-2 rounded-full bg-stone-100"},Ys={class:"relative mt-2 h-9"},zs={class:"mt-1 flex items-center justify-between text-[11px] text-stone-400"},Hs={key:0,class:"text-stone-500"},Us=["href"],Vs={__name:"PositionOnStreetCard",props:{estimate:{type:Object,default:null},stats:{type:Object,default:null},comparables:{type:Object,default:()=>({sold:[],listings:[]})},postcode:{type:String,default:""},anchor:{type:String,default:"val-comparables"},formatGBP:{type:Function,required:!0}},setup(s){const t=s,m=a(()=>{var r,h;return[...((r=t.comparables)==null?void 0:r.sold)||[],...((h=t.comparables)==null?void 0:h.listings)||[]].map(M=>Number(M.price)).filter(M=>Number.isFinite(M)&&M>0)}),q=a(()=>{var W,Q,A,P,I,Y;const u=[],r=(Q=(W=t.stats)==null?void 0:W.price_range)==null?void 0:Q.min,h=(P=(A=t.stats)==null?void 0:A.price_range)==null?void 0:P.max;Number.isFinite(Number(r))&&u.push(Number(r)),Number.isFinite(Number(h))&&u.push(Number(h)),((I=t.estimate)==null?void 0:I.low)!=null&&u.push(Number(t.estimate.low)),((Y=t.estimate)==null?void 0:Y.high)!=null&&u.push(Number(t.estimate.high)),u.push(...m.value);const M=u.filter(K=>Number.isFinite(K)&&K>0);if(M.length<2)return null;const E=Math.min(...M),F=Math.max(...M);if(F<=E)return null;const J=(F-E)*.04;return{min:E-J,max:F+J}}),k=a(()=>{var u;return!!q.value&&((u=t.estimate)==null?void 0:u.mid)!=null});function x(u){const r=q.value;return r?Math.min(100,Math.max(0,(Number(u)-r.min)/(r.max-r.min)*100)):0}const T=a(()=>{var u,r;return x(((u=t.estimate)==null?void 0:u.low)??((r=t.estimate)==null?void 0:r.mid))}),g=a(()=>{var u,r;return x(((u=t.estimate)==null?void 0:u.high)??((r=t.estimate)==null?void 0:r.mid))}),p=a(()=>{var u;return x((u=t.estimate)==null?void 0:u.mid)}),S=a(()=>{var u;return((u=t.stats)==null?void 0:u.median_price)!=null?x(t.stats.median_price):null}),L=a(()=>m.value.slice(0,40).map(u=>x(u))),R=a(()=>m.value.length),D=a(()=>{var r;const u=t.postcode||"your area";return(r=t.stats)!=null&&r.median_price?`Your home sits around the ${u} median — here's how its likely range compares with the local spread.`:`Your likely range against homes selling in ${u}.`});return(u,r)=>{var h,M,E,F,J;return k.value?(n(),o("div",Gs,[e("div",Fs,[e("div",Os,[_(y(be),{class:"h-4.5 w-4.5 text-pink-500"})]),e("div",null,[r[0]||(r[0]=e("h3",{class:"text-base font-semibold text-stone-900"},"Where your home sits locally",-1)),e("p",Ds,l(D.value),1)])]),e("div",Es,[e("div",Is,[(n(!0),o(z,null,re(L.value,(W,Q)=>(n(),o("span",{key:Q,class:"absolute top-1/2 h-1.5 w-1.5 -translate-x-1/2 -translate-y-1/2 roun
1ded-full bg-stone-300",style:me({left:W+"%"})},null,4))),128)),e("span",{class:"absolute inset-y-0 rounded-full bg-gradient-to-r from-pink-400/80 to-rose-500/80",style:me({left:T.value+"%",width:Math.max(2,g.value-T.value)+"%"})},null,4),S.value!=null?(n(),o("span",{key:0,class:"absolute -top-1 h-4 w-0.5 -translate-x-1/2 rounded bg-stone-400",style:me({left:S.value+"%"})},null,4)):w("",!0),e("span",{class:"absolute top-1/2 h-4 w-4 -translate-x-1/2 -translate-y-1/2 rounded-full border-2 border-white bg-rose-500 shadow",style:me({left:p.value+"%"})},null,4)]),e("div",Ys,[e("div",{class:"absolute -translate-x-1/2 whitespace-nowrap text-center",style:me({left:Math.min(88,Math.max(12,p.value))+"%"})},[_(y(vt),{class:"mx-auto h-3 w-3 text-rose-500"}),r[1]||(r[1]=e("p",{class:"text-[11px] font-semibold text-stone-900"},"Your home",-1))],4)]),e("div",zs,[e("span",null,l(s.formatGBP((M=(h=s.stats)==null?void 0:h.price_range)==null?void 0:M.min)),1),(E=s.stats)!=null&&E.median_price?(n(),o("span",Hs,"Local median "+l(s.formatGBP(s.stats.median_price)),1)):w("",!0),e("span",null,l(s.formatGBP((J=(F=s.stats)==null?void 0:F.price_range)==null?void 0:J.max)),1)])]),R.value?(n(),o("a",{key:0,href:`#${s.anchor}`,class:"mt-5 inline-flex items-center gap-1.5 rounded-full bg-stone-100 px-3 py-1.5 text-xs font-medium text-stone-600 transition-colors hover:bg-stone-200"}," See the "+l(R.value)+" comparable "+l(R.value===1?"home":"homes"),9,Us)):w("",!0)])):w("",!0)}}},Ws={class:"relative overflow-hidden rounded-3xl border border-stone-200/70 bg-white shadow-sm"},Ks={class:"p-6 sm:p-7"},Js={class:"flex flex-wrap items-start justify-between gap-3"},Qs={class:"flex items-center gap-2"},Xs={class:"grid h-9 w-9 flex-shrink-0 place-items-center rounded-xl bg-pink-50"},Zs={class:"text-xs text-stone-500"},en={key:0,class:"mt-4 text-sm leading-relaxed text-stone-600"},tn={class:"mt-5 flex items-center justify-between gap-3"},sn={class:"inline-flex rounded-full bg-stone-100 p-0.5"},nn=["onClick"],on={class:"relative mt-4 h-72 sm:h-80"},an={class:"mt-5 grid grid-cols-2 gap-3 sm:grid-cols-4"},ln={class:"rounded-2xl bg-stone-50 p-3.5"},rn={class:"text-[11px] uppercase tracking-wide text-stone-400"},un={key:0,class:"text-[11px] text-stone-400"},dn={class:"rounded-2xl bg-stone-50 p-3.5"},cn={class:"rounded-2xl bg-stone-50 p-3.5"},mn={class:"text-lg font-semibold text-stone-900"},pn={class:"rounded-2xl bg-stone-50 p-3.5"},fn={class:"text-lg font-semibold text-stone-900"},gn={class:"mt-4 flex items-start gap-1.5 text-[11px] leading-relaxed text-stone-400"},$e="#ec4899",Ue="rgba(236, 72, 153, 0.10)",Ve="#10b981",xn={__name:"PriceTrajectoryChart",props:{trajectory:{type:Object,required:!0},formatGBP:{type:Function,required:!0},estimateMid:{type:Number,default:null}},setup(s){yt.register(wt,kt,_t,$t,St,jt);const t=s,m=a(()=>{var i;return((i=t.trajectory)==null?void 0:i.series)||[]}),q=a(()=>{var i;return((i=t.trajectory)==null?void 0:i.forecast)||[]}),k=a(()=>{var i;return((i=t.trajectory)==null?void 0:i.summary)||{}}),x=a(()=>{var i;return((i=t.trajectory)==null?void 0:i.subject)||{}}),T=[{key:"1Y",years:1},{key:"3Y",years:3},{key:"5Y",years:5},{key:"10Y",years:10},{key:"Max",years:99}],g=a(()=>(m.value.length||0)/4),p=a(()=>T.filter(i=>i.key==="Max"||i.years<=Math.ceil(g.value)+.5)),S=U("5Y"),L=a(()=>p.value.find(v=>v.key===S.value)||p.value[p.value.length-1]||T[4]),R=a(()=>{const i=m.value;if(L.value.key==="Max")return i;const v=Math.round(L.value.years*4);return i.length>v?i.slice(i.length-v):i}),D=a(()=>Math.max(0,R.value.length-1)),u=a(()=>R.value.map(i=>i.sample)),r=a(()=>{const i=R.value,v=q.value,N=i.length,G=N?i[N-1].trend:null,d=[...i.map(V=>V.period),...v.map(V=>V.period)],j=[...i.map(V=>V.trend),...v.map(()=>null)],O=N>0?new Array(N-1).fill(null):[],H=[...O,G,...v.map(V=>V.value)],Z=[...O,G,...v.map(V=>V.high)],ae=[...O,G,...v.map(V=>V.low)],le=d.map((V,se)=>{var ie;return se===N-1?((ie=x.value)==null?void 0:ie.value)??null:null});return{labels:d,datasets:[{label:"Area sold price",data:j,borderColor:$e,backgroundColor:$e,borderWidth:2.5,pointRadius:0,pointHoverRadius:4,tension:.35,spanGaps:!1,order:3},{label:"__band_high",data:Z,borderColor:"transparent",backgroundColor:Ue,pointRadius:0,pointHoverRadius:0,tension:.35,fill:!1,order:5},{label:"__band_low",data:ae,borderColor:"transparent",backgroundColor:Ue,pointRadius:0,pointHoverRadius:0,tension:.35,fill:"-1",order:5},{label:"Projection",data:H,borderColor:$e,backgroundColor:$e,borderWidth:2,borderDash:[6,5],pointRadius:0,pointHoverRadius:4,tension:.35,order:2},{label:"Your home",data:le,borderColor:"#ffffff",backgroundColor:Ve,pointBackgroun
1dColor:Ve,pointBorderColor:"#ffffff",pointBorderWidth:3,pointRadius:7,pointHoverRadius:8,showLine:!1,order:0}]}}),h=i=>i==null?"":Math.abs(i)>=1e6?"£"+(i/1e6).toFixed(1).replace(/\.0$/,"")+"m":"£"+Math.round(i/1e3)+"k",M={id:"nowLine",beforeDatasetsDraw(i){var j,O,H;const v=(H=(O=(j=i.options)==null?void 0:j.plugins)==null?void 0:O.nowLine)==null?void 0:H.index;if(v==null)return;const{ctx:N,chartArea:G}=i,d=i.scales.x.getPixelForValue(v);Number.isFinite(d)&&(N.save(),N.fillStyle="rgba(245, 245, 244, 0.55)",N.fillRect(d,G.top,G.right-d,G.bottom-G.top),N.restore())},afterDatasetsDraw(i){var j,O,H;const v=(H=(O=(j=i.options)==null?void 0:j.plugins)==null?void 0:O.nowLine)==null?void 0:H.index;if(v==null)return;const{ctx:N,chartArea:G}=i,d=i.scales.x.getPixelForValue(v);Number.isFinite(d)&&(N.save(),N.beginPath(),N.setLineDash([4,4]),N.moveTo(d,G.top),N.lineTo(d,G.bottom),N.strokeStyle="rgba(120, 113, 108, 0.5)",N.lineWidth=1,N.stroke(),N.setLineDash([]),N.font='600 10px "Plus Jakarta Sans", sans-serif',N.fillStyle="rgba(120, 113, 108, 0.85)",N.textAlign="center",N.fillText("Now",d,G.top-4),N.restore())}},E=a(()=>({responsive:!0,maintainAspectRatio:!1,layout:{padding:{top:14}},interaction:{mode:"index",intersect:!1},scales:{x:{grid:{display:!1},ticks:{maxRotation:0,autoSkip:!0,maxTicksLimit:7,color:"#a8a29e",font:{size:11},callback(i){const v=this.getLabelForValue(i);return v&&v.startsWith("Q1")?v.slice(3):""}}},y:{position:"right",grid:{color:"rgba(0,0,0,0.05)"},border:{display:!1},ticks:{color:"#a8a29e",font:{size:11},maxTicksLimit:5,callback:i=>h(i)}}},plugins:{nowLine:{index:D.value},legend:{display:!1},tooltip:{backgroundColor:"rgba(28, 25, 23, 0.92)",padding:12,cornerRadius:12,titleFont:{size:12,weight:"600"}
1,bodyFont:{size:12},displayColors:!0,filter:i=>!String(i.dataset.label).startsWith("__band"),callbacks:{label:i=>{var G,d;const v=i.parsed.y;if(v==null)return null;const N=t.formatGBP(v);if(i.dataset.label==="Area sold price"){const j=u.value[i.dataIndex];return`  Area median: ${N}${j?` · ${j} sales`:""}`}if(i.dataset.label==="Projection")return`  Projected: ${N}`;if(i.dataset.label==="Your home"){const j=(G=x.value)==null?void 0:G.low,O=(d=x.value)==null?void 0:d.high,H=j&&O?` (${t.formatGBP(j)}–${t.formatGBP(O)})`:"";return`  Your home: ${N}${H}`}return`  ${N}`},afterBody:i=>{var G;const v=R.value.length,N=(G=i[0])==null?void 0:G.dataIndex;if(N!=null&&N>=v){const d=q.value[N-v];if(d)return`Range: ${t.formatGBP(d.low)} – ${t.formatGBP(d.high)}`}return""}}}}})),F=a(()=>Number(k.value.cagr??0)),J=a(()=>F.value>.2),W=a(()=>F.value<-.2),Q=a(()=>(F.value>0?"+":"")+F.value.toFixed(1)+"%"),A=a(()=>Number(k.value.change_total_pct??0)),P=a(()=>(A.value>0?"+":"")+A.value.toFixed(1)+"%"),I=a(()=>{var i;return(i=t.trajectory)!=null&&i.property_type_filtered?"homes like yours":"all property types"}),Y=a(()=>Number(t.estimateMid)||0),K=a(()=>{const i=Number(k.value.change_total_pct);if(!Y.value||!Number.isFinite(i)||i===0)return null;const v=1+i/100;return v<=0?null:Math.round((Y.value-Y.value/v)/1e3)*1e3}),f=a(()=>{const i=Number(k.value.latest_value),v=Number(k.value.projected_3y);return!Y.value||!i||i<=0||!v?null:Math.round(Y.value*(v/i)/1e3)*1e3}),$=a(()=>{var N;const v=[`Homes like yours in ${((N=t.trajectory)==null?void 0:N.area_name)||"your area"} have ${F.value>=0?"grown":"changed"} about ${Math.abs(F.value).toFixed(1)}% a year.`];return f.value&&v.push(`On this trend, yours could be worth around ${t.formatGBP(f.value)} in three years.`),v.join(" ")});return(i,v)=>(n(),o("div",Ws,[v[5]||(v[5]=e("div",{class:"h-1.5 w-full bg-gradient-to-r from-rose-500 via-pink-500 to-orange-500"},null,-1)),e("div",Ks,[e("div",Js,[e("div",null,[e("div",Qs,[e("div",Xs,[_(y(Ke),{class:"h-4.5 w-4.5 text-pink-500"})]),e("div",null,[v[0]||(v[0]=e("h3",{class:"text-base font-semibold text-stone-900"},"Your home's value over time",-1)),e("p",Zs,l(s.trajectory.area_name)+" · sold prices for "+l(I.value),1)])])]),e("div",{class:ne(["inline-flex items-center gap-1.5 rounded-full px-3 py-1.5 text-sm font-semibold",J.value?"bg-emerald-50 text-emerald-700":W.value?"bg-rose-50 text-rose-700":"bg-stone-100 text-stone-600"])},[J.value?(n(),X(y(je),{key:0,class:"h-4 w-4"})):W.value?(n(),X(y(Qe),{key:1,class:"h-4 w-4"})):(n(),X(y(Xe),{key:2,class:"h-4 w-4"})),B(" "+l(Q.value)+" / yr ",1)],2)]),s.estimateMid?(n(),o("p",en,l($.value),1)):w("",!0),e("div",tn,[e("div",sn,[(n(!0),o(z,null,re(p.value,N=>(n(),o("button",{key:N.key,type:"button",onClick:G=>S.value=N.key,class:ne(["rounded-full px-3 py-1.5 text-xs font-semibold transition-all",L.value.key===N.key?"bg-white text-stone-900 shadow-sm":"text-stone-500 hover:text-stone-700"])},l(N.key),11,nn))),128))])]),e("div",on,[_(y(bt),{data:r.value,options:E.value,plugins:[M]},null,8,["data","options","plugins"])]),v[4]||(v[4]=Se('<div class="mt-3 flex flex-wrap items-center gap-x-5 gap-y-1.5 text-xs text-stone-500"><span class="inline-flex items-center gap-1.5"><span class="h-0.5 w-4 rounded-full bg-pink-500"></span> Area history </span><span class="inline-flex items-center gap-1.5"><span class="h-0.5 w-4 rounded-full border-t-2 border-dashed border-pink-500"></span> 3-yr projection </span><span class="inline-flex items-center gap-1.5"><span class="inline-block h-2.5 w-2.5 rounded-full bg-emerald-500 ring-2 ring-emerald-100"></span> Your home </span></div>',1)),e("div",an,[e("div",ln,[e("p",rn,"Since "+l(k.value.earliest_year),1),e("p",{class:ne(["text-lg font-semibold",A.value>=0?"text-emerald-600":"text-rose-600"])},l(P.value),3),K.value?(n(),o("p",un,l(K.value>=0?"+":"−")+l(s.formatGBP(Math.abs(K.value)))+" for a home like yours ",1)):w("",!0)]),e("div",dn,[v[1]||(v[1]=e("p",{class:"text-[11px] uppercase tracking-wide text-stone-400"},"Avg / year",-1)),e("p",{class:ne(["text-lg font-semibold",F.value>=0?"text-emerald-600":"text-rose-600"])},l(Q.value),3)]),e("div",cn,[v[2]||(v[2]=e("p",{class:"text-[11px] uppercase tracking-wide text-stone-400"},"Projected 1yr",-1)),e("p",mn,l(s.formatGBP(k.value.projected_1y)),1)]),e("div",pn,[v[3]||(v[3]=e("p",{class:"text-[11px] uppercase tracking-wide text-stone-400"},"Projected 3yr",-1)),e("p",fn,l(s.formatGBP(k.value.projected_3y)),1)])]),e("p",g
1n,[_(y(Bt),{class:"mt-0.5 h-3.5 w-3.5 flex-shrink-0"}),B(" Based on "+l(k.value.data_points)+" quarters of Land Registry sold prices over the last "+l(Math.round(k.value.window_years))+" years. Projection is an indicative trend, not a guarantee — the future band widens with uncertainty. ",1)])])]))}},hn={key:0,class:"rounded-3xl border border-stone-200/70 bg-white p-6 shadow-sm sm:p-7"},vn={class:"flex items-center gap-2"},bn={class:"grid h-9 w-9 flex-shrink-0 place-items-center rounded-xl bg-stone-100"},yn={class:"mt-5 flex flex-wrap items-center gap-x-6 gap-y-4"},wn={class:"text-[11px] uppercase tracking-wide text-stone-400"},kn={key:0},_n={class:"text-xl font-semibold text-stone-900"},$n={class:"text-xl font-semibold text-stone-900"},Sn={class:"font-medium opacity-80"},jn={key:0,class:"mt-4 text-sm text-stone-500"},Bn={__name:"OwnSaleHistoryCard",props:{ownHistory:{type:Object,default:null},estimateMid:{type:Number,default:null},formatGBP:{type:Function,required:!0}},setup(s){const t=s,m=a(()=>{var p;const g=Number((p=t.ownHistory)==null?void 0:p.last_sold_price);return Number.isFinite(g)&&g>0?g:null}),q=a(()=>{var S;const g=(S=t.ownHistory)==null?void 0:S.last_sold_date;if(!g)return null;const p=String(g).slice(0,4);return/^\d{4}$/.test(p)?p:null}),k=a(()=>m.value!=null&&Number(t.estimateMid)>0),x=a(()=>{if(!k.value)return null;const g=Number(t.estimateMid)-m.value,p=m.value>0?g/m.value*100:0;return{delta:g,pct:p,up:g>=0}}),T=a(()=>{const g=q.value?Number(q.value):null;if(!g)return null;const p=new Date().getFullYear();return Math.max(0,p-g)});return(g,p)=>k.value?(n(),o("div",hn,[e("div",vn,[e("div",bn,[_(y(Ct),{class:"h-4.5 w-4.5 text-stone-500"})]),p[0]||(p[0]=e("h3",{class:"text-base font-semibold text-stone-900"},"This home's history",-1))]),e("div",yn,[e("div",null,[e("p",wn,[p[1]||(p[1]=B(" Last sold",-1)),q.value?(n(),o("span",kn," · "+l(q.value),1)):w("",!0)]),e("p",_n,l(s.formatGBP(m.value)),1)]),_(y(xe),{class:"h-5 w-5 flex-shrink-0 text-stone-300"}),e("div",null,[p[2]||(p[2]=e("p",{class:"text-[11px] uppercase tracking-wide text-stone-400"},"Estimated now",-1)),e("p",$n,l(s.formatGBP(s.estimateMid)),1)]),x.value?(n(),o("div",{key:0,class:ne(["ml-auto inline-flex items-center gap-1.5 rounded-full px-3 py-1.5 text-sm font-semibold",x.value.up?"bg-emerald-50 text-emerald-700":"bg-rose-50 text-rose-700"])},[(n(),X(st(x.value.up?y(je):y(Qe)),{class:"h-4 w-4"})),B(" "+l(x.value.up?"+":"−")+l(s.formatGBP(Math.abs(x.value.delta)))+" ",1),e("span",Sn,"("+l(x.value.up?"+":"−")+l(Math.abs(x.value.pct).toFixed(0))+"%)",1)],2)):w("",!0)]),x.value&&T.value?(n(),o("p",jn,l(x.value.up?"Up":"Down")+" "+l(s.formatGBP(Math.abs(x.value.delta)))+" over the "+l(T.value)+" "+l(T.value===1?"year":"years")+" since it last changed hands — an indicative change based on the local market, not a confirmed sale. ",1)):w("",!0)])):w("",!0)}},Cn={id:"val-comparables",class:"scroll-mt-6"},Nn={class:"flex flex-wrap items-end justify-between gap-4 mb-5"},Pn={key:0,class:"inline-flex rounded-full bg-stone-100 p-0.5 flex-shrink-0"},Tn=["onClick"],An={key:1,class:"hidden sm:inline-flex items-center gap-1.5 px-3 py-1 rounded-full bg-stone-100 text-stone-600 text-xs font-medium flex-shrink-0"},Mn={key:0,class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4"},qn={class:"relative h-36 bg-stone-100 overflow-hidden"},Rn=["src","alt"],Ln=["src","alt"],Gn={class:"absolute bottom-2.5 right-2.5 inline-flex items-center gap-1 rounded-full bg-white/85 px-2 py-0.5 text-[10px] font-medium text-stone-600 backdrop-blur"},Fn={key:2,class:"w-full h-full flex items-center justify-center bg-gradient-to-br from-stone-100 to-stone-200"},On={class:"p-4"},Dn={class:"text-base font-semibold text-stone-900"},En=["title"],In={class:"mt-3 flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-stone-500"},Yn={key:0,class:"inline-flex items-center gap-1"},zn={key:1,class:"capitalize"},Hn={key:2,class:"inline-flex items-center gap-1"},Un={class:"mt-3 pt-3 border-t border-stone-100 flex items-center justify-between gap-2 text-[11px] text-stone-400"},Vn={key:0,class:"inline-flex items-center gap-1.5"},Wn={class:"font-medium text-stone-500"},Kn={key:1,class:"bg-white rounded-2xl border border-stone-200/70 shadow-sm p-8 text-center"},Jn={__name:"ComparablesGrid",props:{sold:{type:Array,default:()=>[]},listings:{type:Array,default:()=>[]},formatGBP:{type:Function,required:!0},mapboxToken:{type:String,default:""},areaPricePerSqft:{type:Number,default:null}},setup(s){const t=s,m=U("all");function q(u){if(!t.mapboxToken||u.latitude==null||u.longitude==null)return null;const r=Number(u.longitude),h=Number(u.latitude);return!Number.isFinite(r)||!Number.isFinite(h)?null:`https://api.mapbox.com/styles/v1/mapbox/streets-v12/static/${`pin-s+${u._sold?"10b981":"ec4899"}(${r.toFixed(5)},${h.toFixed(5)})`}/${r.toFixed(5)},${h.toFixed(5)},14,0/400x288@2x?access_token=${t.mapboxToken}`}const k=a(()=>{const u=(M,E)=>{const F={...M,_sold:E};return F._mapUrl=F.image_url?null:q(F),F},r=(t.sold||[]).map(M=>u(M,!0)),h=(t.listings||[]).map(M=>u(M,!1));return[...r,...h]}),x=a(()=>k.value.length),T=a(()=>(t.sold||[]).length),g=a(()=>(t.listings||[]).length),p=a(()=>m.value==="sold"?k.value.filter(u=>u._sold):m.value==="live"?k.value.filter(u=>!u._sold):k.value);function S(u){const r=Number(t.areaPricePerSqft),h=Number(u.price_per_sqft);return!Number.isFinite(r)||r<=0||!Number.isFinite(h)||h<=0?null:Math.round((h-r)/r*100)}function L(u){return u?String(u).replace(/[_-]+/g," "):""}function R(u){return u._sold?u.sold_date?`Sold ${D(u.sold_date)}`:"Sold recently":u.added_date?`Listed ${D(u.added_date)}`:u.agent_name||"On the market"}function D(u){try{const r=new Date(u);return isNaN(r.getTime())?String(u):r.toLocaleDateString("en-GB",{month:"short",year:"numeric"})}catch{return String(u)}}return(u,r)=>(n(),o("section",Cn,[e("div",Nn,[r[0]||(r[0]=e("div",null,[e("h3",{class:"text-xl sm:text-2xl font-light tracking-tight text-stone-900"},[B(" The comparables that "),e("span",{class:"font-semibold bg-gradient-to-r from-pink-500 to-orange-500 bg-clip-text text-transparent"},"built your estimate")]),e("p",{class:"text-sm text-stone-500 mt-1"}," Recent local sales and live listings matched to your home. ")],-1)),T.value&&g.value?(n(),o("div",Pn,[(n(!0),o(z,null,re([{k:"all",label:`All ${x.value}`},{k:"sold",label:`Sold ${T.value}`},{k:"live",label:`Live ${g.value}`}],h=>(n(),o("button",{key:h.k,type:"button",onClick:M=>m.value=h.k,class:ne(["rounded-full px-3 py-1.5 text-xs font-semibold transition-all",m.value===h.k?"bg-white text-stone-900 shadow-sm":"text-stone-500 hover:text-stone-700"])}
1,l(h.label),11,Tn))),128))])):x.value?(n(),o("span",An,l(x.value)+" matched ",1)):w("",!0)]),x.value?(n(),o("div",Mn,[(n(!0),o(z,null,re(p.value,(h,M)=>(n(),o("article",{key:M,class:"group bg-white rounded-2xl border border-stone-200/70 shadow-sm overflow-hidden hover:-translate-y-1 hover:shadow-lg transition-all duration-300"},[e("div",qn,[h.image_url?(n(),o("img",{key:0,src:h.image_url,alt:h.address,loading:"lazy",class:"w-full h-full object-cover group-hover:scale-105 transition-transform duration-500"},null,8,Rn)):h._mapUrl?(n(),o(z,{key:1},[e("img",{src:h._mapUrl,alt:`Map of ${h.address}`,loading:"lazy",class:"w-full h-full object-cover"},null,8,Ln),e("span",Gn,[_(y(be),{class:"h-3 w-3"}),r[1]||(r[1]=B("Location ",-1))])],64)):(n(),o("div",Fn,[_(y(ve),{class:"w-8 h-8 text-stone-300"})])),e("span",{class:ne(["absolute top-2.5 left-2.5 px-2.5 py-1 rounded-full text-[11px] font-semibold backdrop-blur",h._sold?"bg-emerald-500/90 text-white":"bg-pink-500/90 text-white"])},l(h._sold?"Sold":"Live"),3)]),e("div",On,[e("p",Dn,l(s.formatGBP(h.price)),1),e("p",{class:"text-sm text-stone-600 truncate mt-0.5",title:h.address},l(h.address),9,En),e("div",In,[h.bedrooms!=null?(n(),o("span",Yn,[_(y(Nt),{class:"w-3.5 h-3.5"}),B(l(h.bedrooms),1)])):w("",!0),h.property_type?(n(),o("span",zn,l(L(h.property_type)),1)):w("",!0),h.distance_miles!=null?(n(),o("span",Hn,[_(y(be),{class:"w-3.5 h-3.5"}),B(l(Number(h.distance_miles).toFixed(1))+" mi ",1)])):w("",!0)]),e("div",Un,[e("span",null,l(R(h)),1),h.price_per_sqft?(n(),o("span",Vn,[e("span",Wn,l(s.formatGBP(h.price_per_sqft))+"/ft²",1),S(h)!==null?(n(),o("span",{key:0,class:ne(["rounded-full px-1.5 py-0.5 font-semibold",S(h)>0?"bg-emerald-50 text-emerald-600":(S(h)<0,"bg-stone-100 text-stone-500")]),title:"vs area average £/sqft"},l(S(h)>0?"+":"")+l(S(h))+"% ",3)):w("",!0)])):w("",!0)])])]))),128))])):(n(),o("div",Kn,[_(y(ve),{class:"w-8 h-8 text-stone-300 mx-auto mb-3"}),r[2]||(r[2]=e("p",{class:"text-sm text-stone-500"}," We couldn’t surface enough close comparables here yet — a local agent will confirm the figure in person. ",-1))]))]))}},Qn={class:"bg-white rounded-3xl border border-stone-200/70 shadow-sm p-6 hover:-translate-y-1 hover:shadow-lg transition-all duration-300"},Xn={class:"flex items-center gap-2 mb-4"},Zn={class:"w-9 h-9 rounded-xl bg-pink-50 flex items-center justify-center flex-shrink-0"},eo={key:0,class:"space-y-3 animate-pulse"},to={key:0,class:"text-sm text-stone-600 mb-4"},so={key:0,class:"text-stone-400"},no={class:"grid grid-cols-2 gap-3 mb-4"},oo={class:"rounded-xl bg-stone-50 p-3"},ao={class:"text-lg font-semibold text-stone-900"},lo={class:"rounded-xl bg-stone-50 p-3"},ro={class:"text-lg font-semibold text-stone-900"},io={class:"rounded-xl bg-gradient-to-br from-stone-50 to-white border border-stone-100 p-3.5"},uo={class:"flex items-center justify-between mb-2"},co={key:0,viewBox:"0 0 100 32",preserveAspectRatio:"none",class:"w-full h-8"},mo=["points","stroke"],po={key:1,class:"text-xs text-stone-400"},fo={key:1,class:"mt-4 flex flex-wrap gap-2"},go={key:0,class:"px-2.5 py-1 rounded-full bg-pink-50 text-pink-600 text-xs font-medium"},xo={key:1,class:"px-2.5 py-1 rounded-full bg-stone-100 text-stone-600 text-xs font-medium"},ho={key:2,class:"text-sm text-stone-400"},vo={__name:"AreaInsightsCard",props:{area:{type:Object,default:null},loading:{type:Boolean,default:!1},formatGBP:{type:Function,required:!0}},setup(s){const t=s,m=a(()=>t.area&&(t.area.trend_direction==="up"||Number(t.area.year_on_year_change)>0)),q=a(()=>t.area&&(t.area.trend_direction==="down"||Number(t.area.year_on_year_change)<0)),k=a(()=>{const p=t.area&&t.area.year_on_year_change;if(p==null)return"—";const S=Number(p);return(S>0?"+":"")+S.toFixed(1)+"%"}),x=a(()=>{const p=t.area&&t.area.market_type;return p?String(p).replace(/[_-]+/g," "):""}),T=a(()=>{const p=t.area&&t.area.demand_level;if(!p)return"";const S=String(p);return S.charAt(0).toUpperCase()+S.slice(1)}),g=a(()=>{const p=t.area&&t.area.price_history;if(!Array.isArray(p)||p.length<2)return null;const S=p.map(r=>Number(r.average)).filter(r=>!isNaN(r));if(S.length<2)return null;const L=Math.min(...S),D=Math.max(...S)-L||1,u=100/(S.length-1);return S.map((r,h)=>{const M=(h*u).toFixed(2),E=(29-(r-L)/D*26).toFixed(2);return`${M},${E}`}).join(" ")});return(p,S)=>(n(),o("div",Qn,[e("div",Xn,[e("div",Zn,[_(y(je),{class:"w-4.5 h-4.5 text-pink-500"})]),S[0]||(S[0]=e("h4",{class:"text-base font-semibold text-stone-900"},"Local market",-1))]),s.loading?(n(),o("div",eo,[...S[1]||(S[1]=[Se('<div class="h-4 w-2/3 rounded bg-stone-100"></div><div class="grid grid-cols-2 gap-3"><div class="h-12 rounded-xl bg-stone-100"></div><div class="h-12 rounded-xl bg-stone-100"></div></div><div class="h-16 rounded-xl bg-stone-100"></div>',3)])])):s.area?(n(),o(z,{key:1},[s.area.area_name?(n(),o("p",to,[B(l(s.area.area_name)+" ",1),s.area.market_type?(n(),o("span",so,"· "+l(x.value),1)):w("",!0)])):w("",!0),e("div",no,[e("div",oo,[S[2]||(S[2]=e("p",{class:"text-[11px] uppercase tracking-wide text-stone-400"}
1,"Avg asking",-1)),e("p",ao,l(s.formatGBP(s.area.avg_asking)),1)]),e("div",lo,[S[3]||(S[3]=e("p",{class:"text-[11px] uppercase tracking-wide text-stone-400"},"Stock",-1)),e("p",ro,l(s.area.stock_total!=null?s.area.stock_total.toLocaleString("en-GB"):"—"),1)])]),e("div",io,[e("div",uo,[S[4]||(S[4]=e("span",{class:"text-xs text-stone-500"},"Year-on-year",-1)),s.area.year_on_year_change!=null?(n(),o("span",{key:0,class:ne(["inline-flex items-center gap-1 text-sm font-semibold",m.value?"text-emerald-600":q.value?"text-rose-600":"text-stone-600"])},[m.value?(n(),X(y(Pt),{key:0,class:"w-3.5 h-3.5"})):q.value?(n(),X(y(Tt),{key:1,class:"w-3.5 h-3.5"})):(n(),X(y(Xe),{key:2,class:"w-3.5 h-3.5"})),B(" "+l(k.value),1)],2)):w("",!0)]),g.value?(n(),o("svg",co,[e("polyline",{points:g.value,fill:"none",stroke:q.value?"#f43f5e":"#ec4899","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round","vector-effect":"non-scaling-stroke"},null,8,mo)])):(n(),o("p",po,"Trend data unavailable"))]),T.value||s.area.days_on_market?(n(),o("div",fo,[T.value?(n(),o("span",go,l(T.value)+" demand ",1)):w("",!0),s.area.days_on_market?(n(),o("span",xo,l(s.area.days_on_market)+" days on market ",1)):w("",!0)])):w("",!0)],64)):(n(),o("p",ho,"Local market data isn’t available for this area right now."))]))}},bo={class:"bg-white rounded-3xl border border-stone-200/70 shadow-sm p-6 hover:-translate-y-1 hover:shadow-lg transition-all duration-300"},yo={class:"flex items-center gap-2 mb-4"},wo={class:"w-9 h-9 rounded-xl bg-orange-50 flex items-center justify-center flex-shrink-0"},ko={key:0,class:"space-y-3 animate-pulse"},_o={class:"grid grid-cols-2 gap-3 mb-4"},$o={class:"rounded-xl bg-stone-50 p-3"},So={class:"text-lg font-semibold text-stone-900"},jo={class:"rounded-xl bg-stone-50 p-3"},Bo={class:"text-lg font-semibold text-stone-900"},Co={key:0,class:"flex items-center gap-2 text-sm text-stone-600 mb-3"},No={class:"font-semibold text-stone-900"},Po={key:1,class:"rounded-xl bg-gradient-to-br from-emerald-50 to-teal-50 border border-emerald-100/70 p-3.5 mb-3"},To={class:"text-sm text-stone-700 leading-snug"},Ao={key:2,class:"space-y-2"},Mo={key:2,class:"text-sm text-stone-400"},qo={__name:"MarketTimingCard",props:{timing:{type:Object,default:null},loading:{type:Boolean,default:!1}},setup(s){const t=s,m=a(()=>{const k=t.timing&&t.timing.reduction_rate;if(k==null)return"—";const x=Number(k);return(x<=1?x*100:x).toFixed(0)+"%"}),q=a(()=>{const k=t.timing&&t.timing.insights;return Array.isArray(k)?k.filter(x=>x&&x.message):[]});return(k,x)=>(n(),o("div",bo,[e("div",yo,[e("div",wo,[_(y(At),{class:"w-4.5 h-4.5 text-orange-500"})]),x[0]||(x[0]=e("h4",{class:"text-base font-semibold text-stone-900"},"Market timing",-1))]),s.loading?(n(),o("div",ko,[...x[1]||(x[1]=[Se('<div class="grid grid-cols-2 gap-3"><div class="h-12 rounded-xl bg-stone-100"></div><div class="h-12 rounded-xl bg-stone-100"></div></div><div class="h-10 rounded-xl bg-stone-100"></div><div class="h-10 rounded-xl bg-stone-100"></div>',3)])])):s.timing?(n(),o(z,{key:1},[e("div",_o,[e("div",$o,[x[2]||(x[2]=e("p",{class:"text-[11px] uppercase tracking-wide text-stone-400"},"Avg days to sell",-1)),e("p",So,l(s.timing.average_days_on_market!=null?s.timing.average_days_on_market:"—"),1)]),e("div",jo,[x[3]||(x[3]=e("p",{class:"text-[11px] uppercase tracking-wide text-stone-400"},"Reduction rate",-1)),e("p",Bo,l(m.value),1)])]),s.timing.peak_month?(n(),o("div",Co,[_(y(je),{class:"w-4 h-4 text-emerald-500 flex-shrink-0"}),x[4]||(x[4]=B(" Best month to list: ",-1)),e("span",No,l(s.timing.peak_month),1)])):w("",!0),s.timing.current_season_outlook?(n(),o("div",Po,[x[5]||(x[5]=e("p",{class:"text-xs font-semibold text-emerald-700 mb-1"},"Current outlook",-1)),e("p",To,l(s.timing.current_season_outlook),1)])):w("",!0),q.value.length?(n(),o("ul",Ao,[(n(!0),o(z,null,re(q.value,(T,g)=>(n(),o("li",{key:g,class:"flex items-start gap-2 text-sm text-stone-600"},[_(y(Ke),{class:"w-4 h-4 text-pink-400 flex-shrink-0 mt-0.5"}),e("span",null,l(T.message),1)]))),128))])):w("",!0)],64)):(n(),o("p",Mo,"Timing insight isn’t available for this area right now."))]))}},Ro={id:"val-agents"},Lo={key:0,class:"flex items-start gap-3 rounded-3xl border border-emerald-200 bg-emerald-50/70 p-6 sm:p-7"},Go={class:"flex h-10 w-10 flex-shrink-0 items-center justify-center rounded-full bg-emerald-100 text-emerald-600"},Fo={class:"min-w-0"},Oo={class:"text-sm font-semibold text-stone-900"},Do={key:0},Eo={class:"mt-1 text-sm leading-relaxed text-stone-600"},Io=["href"],Yo={key:1,class:"overflow-hidden rounded-3xl border border-stone-200/70 bg-white shadow-sm"},zo={class:"border-b border-stone-100 p-6 sm:p-7"},Ho={class:"flex items-center gap-2"},Uo={class:"grid h-9 w-9 flex-shrink-0 place-items-center rounded-xl bg-pink-50"},Vo={class:"mt-2 max-w-2xl text-sm leading-relaxed text-stone-600"},Wo={key:0,class:"divide-y divide-stone-100"},Ko={class:"flex flex-col gap-4 p-4 sm:flex-row sm:items-center sm:px-7"},Jo={class:"relative flex-shrink-0"},Qo={class:"grid h-12 w-12 place-items-center overflow-hidden rounded-2xl bg-stone-100 ring-1 ring-stone-200/70"},Xo=["src","alt"],Zo={class:"absolute -left-1.5 -top-1.5 grid h-5 w-5 place-items-center rounded-full bg-stone-900 text-[10px] font-bold text-white"},ea={class:"min-w-0 flex-1"},ta={class:"flex flex-wrap items-center gap-x-2 gap-y-1"},sa={class:"truncate text-sm font-semibold text-stone-900"},na={key:0,class:"inline-flex items-center gap-1 rounded-full bg-amber-50 px-2 py-0.5 text-[10px] font-semibold text-amber-700"},oa={key:1,class:"inline-flex items-center gap-1 rounded-full bg-pink-50 px-2 py-0.5 text-[10px] font-semibold text-pink-600"},aa={key:0,class:"mt-0.5 flex items-center gap-1 truncate text-xs text-stone-400"},la={class:"mt-1.5 flex flex-wrap items-center gap-x-3 gap-y-0.5 text-[11px] text-stone-500"},ra={key:0,class:"font-semibold text-emerald-600"},ia={key:1,class:"inline-flex items-center gap-1"},ua={key:2},da=["disabled","onClick"],ca=["href"],ma={class:"flex flex-wrap items-center gap-x-4 gap-y-1.5 text-xs text-stone-500"},pa={class:"inline-flex items-center gap-1.5"},fa={class:"inline-flex items-center gap-1.5"},ga={class:"inline-flex items-center gap-1.5"},xa=["href"],ha={__name:"TopAgentsCard",props:{agents:{type:Array,default:()=>[]},href:{type:String,default:"/find-my-agent"},postcode:{type:String,default:""},address:{type:String,default:""},confirmed:{type:Object,default:null},requesting:{type:Boolean,default:!1},pendingAgentId:{type:[Number,String],default:null}},emits:["select"],setup(s,{emit:t}){const m=s,q=t,k=a(()=>Array.isArray(m.agents)&&m.agents.length>0),x=a(()=>{var g;const T=(g=m.confirmed)==null?void 0:g.status;return T==="booked"?"Your in-person valuation is booked — the agent will be in touch with the details.":T==="contacted"?"The agent has y
1our details and will be in touch to arrange a free, no-obligation visit.":T==="completed"?"Your in-person valuation is complete.":"A local agent will be in touch shortly to arrange a free, no-obligation in-person valuation."});return(T,g)=>(n(),o("section",Ro,[s.confirmed?(n(),o("div",Lo,[e("span",Go,[_(y(Be),{class:"h-5 w-5"})]),e("div",Fo,[e("p",Oo,[g[0]||(g[0]=B(" Your free valuation is requested",-1)),s.confirmed.name?(n(),o("span",Do," with "+l(s.confirmed.name),1)):w("",!0),g[1]||(g[1]=B(". ",-1))]),e("p",Eo,l(x.value),1),s.confirmed.id&&!s.confirmed.self?(n(),o("a",{key:0,href:`/account/valuations/${s.confirmed.id}`,class:"mt-2 inline-flex items-center gap-1.5 text-sm font-medium text-pink-600 hover:text-pink-700"},[g[2]||(g[2]=B(" View your valuation request ",-1)),_(y(xe),{class:"h-4 w-4"})],8,Io)):w("",!0)])])):(n(),o("div",Yo,[g[12]||(g[12]=e("div",{class:"h-1.5 w-full bg-gradient-to-r from-rose-500 via-pink-500 to-orange-500"},null,-1)),e("div",zo,[e("div",Ho,[e("div",Uo,[_(y(Mt),{class:"h-4.5 w-4.5 text-pink-500"})]),g[3]||(g[3]=e("h3",{class:"text-base font-semibold text-stone-900"},"Confirm your value with a local expert",-1))]),e("p",Vo,[g[4]||(g[4]=B(" An instant estimate is a confident start. The next step is a free, in-person valuation — ",-1)),k.value?(n(),o(z,{key:0},[B(l(s.agents.length===1?"here is the best agent":`here are the ${s.agents.length} best agents`)+" covering "+l(s.postcode)+", ranked by recent sales. Pick who confirms what "+l(s.address||"your home")+" is really worth.",1)],64)):(n(),o(z,{key:1},[B("a top local agent will confirm what "+l(s.address||"your home")+" is really worth.",1)],64))])]),k.value?(n(),o("ul",Wo,[(n(!0),o(z,null,re(s.agents,(p,S)=>(n(),o("li",{key:p.id??S},[e("div",Ko,[e("div",Jo,[e("div",Qo,[p.logo_url?(n(),o("img",{key:0,src:p.logo_url,alt:p.name,class:"h-full w-full object-contain p-1",loading:"lazy"},null,8,Xo)):(n(),X(y(nt),{key:1,class:"h-5 w-5 text-stone-400"}))]),e("span",Zo,l(S+1),1)]),e("div",ea,[e("div",ta,[e("p",sa,l(p.name),1),p.is_founder_250?(n(),o("span",na,[_(y(Ne),{class:"h-3 w-3"}),g[5]||(g[5]=B("Featured ",-1))])):p.is_local_expert?(n(),o("span",oa," Local expert ")):w("",!0)]),p.branch_location?(n(),o("p",aa,[_(y(be),{class:"h-3 w-3 flex-shrink-0"}),B(l(p.branch_location),1)])):w("",!0),e("div",la,[p.avg_price_achieved_pct!=null?(n(),o("span",ra,l(p.avg_price_achieved_pct)+"% of asking achieved ",1)):w("",!0),p.properties_sold!=null?(n(),o("span",ia,[_(y(ve),{class:"h-3 w-3"}),B(l(p.properties_sold.toLocaleString("en-GB"))+" sold ",1)])):w("",!0),p.avg_days_to_sell!=null?(n(),o("span",ua,l(p.avg_days_to_sell)+" days to sell",1)):w("",!0)])]),e("button",{type:"button",disabled:s.requesting,onClick:L=>q("select",p.id),class:"inline-flex flex-shrink-0 items-center justify-center gap-2 rounded-full bg-gradient-to-r from-pink-500 to-rose-500 px-5 py-2.5 text-sm font-semibold text-white shadow-lg shadow-pink-500/20 transition-all hover:-translate-y-0.5 hover:shadow-xl disabled:cursor-not-allowed disabled:opacity-60 disabled:hover:translate-y-0"},[s.requesting&&String(s.pendingAgentId)===String(p.id)?(n(),X(y(Ce),{key:0,class:"h-4 w-4 animate-spin"})):(n(),o(z,{key:1},[g[6]||(g[6]=B("Book free valuation ",-1)),_(y(xe),{class:"h-4 w-4"})],64))],8,da)])]))),128))])):w("",!0),e("div",{class:ne(["p-4 sm:px-7 sm:pb-7",k.value?"border-t border-stone-100":""])},[k.value?w("",!0):(n(),o("a",{key:0,href:s.href,class:"inline-flex w-full items-center justify-center gap-2 rounded-full bg-gradient-to-r from-pink-500 to-rose-500 px-6 py-3.5 text-sm font-semibold text-white shadow-lg shadow-pink-500/20 transition-all hover:-translate-y-0.5 hover:shadow-xl"},[g[7]||(g[7]=B(" Find my agent ",-1)),_(y(xe),{class:"h-4.5 w-4.5"})],8,ca)),e("div",{class:ne(["flex flex-wrap items-center justify-between gap-x-4 gap-y-2",k.value?"":"mt-4"])},[e("div",ma,[e("span",pa,[_(y(Ne),{class:"h-3.5 w-3.5 text-emerald-500"}),g[8]||(g[8]=B(" Free",-1))]),e("span",fa,[_(y(Ae),{class:"h-3.5 w-3.5 text-emerald-500"}),g[9]||(g[9]=B(" In person",-1))]),e("span",ga,[_(y(Be),{class:"h-3.5 w-3.5 text-emerald-500"}),g[10]||(g[10]=B(" No obligation",-1))])]),k.value?(n(),o("a",{key:0,href:s.href,class:"inline-flex items-center gap-1 text-xs font-medium text-stone-500 hover:text-stone-700"}
1,[g[11]||(g[11]=B(" Compare all local agents ",-1)),_(y(xe),{class:"h-3.5 w-3.5"})],8,xa)):w("",!0)],2)],2)]))]))}},va={class:"rounded-3xl border border-stone-200/70 bg-white p-6 shadow-sm sm:p-7"},ba={class:"flex items-center gap-2"},ya={class:"grid h-9 w-9 flex-shrink-0 place-items-center rounded-xl bg-emerald-50"},wa={class:"mt-5 block"},ka={class:"mt-1.5 flex max-w-xs items-center rounded-2xl border border-stone-200 bg-stone-50 px-3 focus-within:border-pink-300 focus-within:bg-white"},_a={class:"mt-5 grid gap-3 sm:grid-cols-2"},$a={class:"rounded-2xl bg-gradient-to-br from-emerald-50 to-teal-50/60 p-4 ring-1 ring-emerald-100/70"},Sa={class:"mt-0.5 text-2xl font-semibold text-stone-900"},ja={class:"mt-0.5 text-xs text-stone-500"},Ba={class:"rounded-2xl bg-stone-50 p-4"},Ca={class:"mt-0.5 text-2xl font-semibold text-stone-900"},Na={class:"mt-0.5 text-xs text-stone-500"},Pa={key:0,class:"mt-3 flex items-center justify-between rounded-2xl border border-stone-100 bg-white p-4"},Ta={class:"mt-0.5 text-xl font-semibold text-stone-900"},Aa={key:0,class:"inline-flex items-center gap-1 rounded-full bg-emerald-50 px-2.5 py-1 text-sm font-semibold text-emerald-700"},Ma={class:"mt-5 flex flex-wrap items-center gap-x-4 gap-y-2 border-t border-stone-100 pt-4 text-xs text-stone-500"},qa={class:"inline-flex items-center gap-1.5"},Ra={class:"inline-flex items-center gap-1"},La={class:"inline-flex items-center gap-1"},Ga={key:1,class:"mt-3 text-xs text-stone-400"},Fa={class:"mt-5 flex flex-col gap-2 border-t border-stone-100 pt-5 sm:flex-row sm:items-center sm:justify-between"},Oa={__name:"ProceedsCalculatorCard",props:{estimate:{type:Object,default:null},projected3y:{type:Number,default:null},mortgageBalance:{type:[Number,String],default:null},formatGBP:{type:Function,required:!0},bookingPrefill:{type:Object,default:()=>({})}},emits:["update:mortgageBalance"],setup(s,{emit:t}){const m=s,q=t;function k(){var A;Pe({...m.bookingPrefill,source:"equity-calculator",estimate:((A=m.estimate)==null?void 0:A.mid)??null,equity:S.value?r.value:null})}const x=U(1.25),T=U(1500),g=a({get:()=>m.mortgageBalance==null||m.mortgageBalance===""?"":Number(m.mortgageBalance).toLocaleString("en-GB"),set:A=>{const P=String(A).replace(/\D/g,""),I=P===""?null:Number(P);q("update:mortgageBalance",Number.isFinite(I)&&I>=0?I:null)}}),p=a(()=>{const A=Number(m.mortgageBalance);return Number.isFinite(A)&&A>=0?A:0}),S=a(()=>{const A=Number(m.mortgageBalance);return Number.isFinite(A)&&A>0}),L=a(()=>{var A;return Number((A=m.estimate)==null?void 0:A.mid)||0}),R=a(()=>{var A;return Number((A=m.estimate)==null?void 0:A.low)||L.value}),D=a(()=>{var A;return Number((A=m.estimate)==null?void 0:A.high)||L.value});function u(A){const P=(Number(x.value)||0)/100;return A*P+(Number(T.value)||0)}const r=a(()=>Math.max(0,L.value-p.value)),h=a(()=>Math.max(0,R.value-p.value)),M=a(()=>Math.max(0,D.value-p.value)),E=a(()=>Math.max(0,L.value-p.value-u(L.value))),F=a(()=>Math.max(0,R.value-p.value-u(R.value))),J=a(()=>Math.max(0,D.value-p.value-u(D.value))),W=a(()=>{const A=Number(m.projected3y);return!Number.isFinite(A)||A<=0?null:Math.max(0,A-p.value)}),Q=a(()=>W.value==null?null:W.value-r.value);return(A,P)=>(n(),o("div",va,[e("div",ba,[e("div",ya,[_(y(qt),{class:"h-4.5 w-4.5 text-emerald-600"})]),P[3]||(P[3]=e("div",null,[e("h3",{class:"text-base font-semibold text-stone-900"},"What it's worth to you"),e("p",{class:"text-xs text-stone-500"},"Your equity and indicative proceeds")],-1))]),e("label",wa,[P[5]||(P[5]=e("span",{class:"text-[11px] font-semibold uppercase tracking-wide text-stone-400"},"Mortgage remaining",-1)),e("div",ka,[P[4]||(P[4]=e("span",{class:"text-stone-400"},"£",-1)),pe(e("input",{"onUpdate:modelValue":P[0]||(P[0]=I=>g.value=I),type:"text",inputmode:"numeric",placeholder:"e.g. 180,000",class:"w-full border-0 bg-transparent px-2 py-2.5 text-sm font-medium text-stone-900 placeholder:font-normal placeholder:text-stone-400 focus:outline-none focus:ring-0"},null,512),[[fe,g.value]])])]),e("div",_a,[e("div",$a,[P[6]||(P[6]=e("p",{class:"text-[11px] uppercase tracking-wide text-emerald-700/80"},"Your equity",-1)),e("p",Sa,l(s.formatGBP(r.value)),1),e("p",ja,l(s.formatGBP(h.value))+" – "+l(s.formatGBP(M.value)),1)]),e("div",Ba,[P[7]||(P[7]=e("p",{class:"text-[11px] uppercase tracking-wide text-stone-400"},"Net proceeds if you sold today",-1)),e("p",Ca,l(s.formatGBP(E.value)),1),e("p",Na,l(s.formatGBP(F.value))+" – "+l(s.formatGBP(J.value)),1)])]),W.value!=null?(n(),o("div",Pa,[e("div",null,[P[8]||(P[8]=e("p",{class:"text-[11px] uppercase tracking-wide text-stone-400"},"Projected equity in 3 years",-1)),e("p",Ta,l(s.formatGBP(W.value)),1)]),Q.value!=null&&Q.value>0?(n(),o("span",Aa," +"+l(s.formatGBP(Q.value)),1)):w("",!0)])):w("",!0),e("div",Ma,[e("span",qa,[_(y(Je),{class:"h-3.5 w-3.5 text-stone-400"}),P[9]||(P[9]=B(" Assumes",-1))]),e("label",Ra,[pe(e("input",{"onUpdate:modelValue":P[1]||(P[1]=I=>x.value=I),type:"number",min:"0",step:"0.25",class:"w-12 appearance-none rounded-md border-0 bg-stone-100 px-1.5 py-0.5 text-right font-medium text-stone-700 focus:bg-white focus:outline-none focus:ring-0 [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none"},null,512),[[fe,x.value,void 0,{number:!0}]]),P[10]||(P[10]=B(" % agent fee ",-1))]),e("label",La,[P[11]||(P[11]=B(" + £",-1)),pe(e("input",{"onUpdate:modelValue":P[2]||(P[2]=I=>T.value=I),type:"number",min:"0",step:"100",class:"w-16 appearance-none rounded-md border-0 bg-stone-100 px-1.5 py-0.5 text-right font-medium text-stone-700 focus:bg-white focus:outline-none focus:ring-0 [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none"},null,512),[[fe,T.value,void 0,{number:!0}]]),P[12]||(P[12]=B(" legal & other ",-1))])]),S.value?w("",!0):(n(),o("p",Ga," Add your mortgage balance for a personalised equity figure. Estimates are indicative and saved only on this device. ")),e("div",Fa,[P[14]||(P[14]=e("p",{class:"text-sm text-stone-600"}," Thinking about your next move? Talk through your equity and borrowing with a fee-free mortgage broker. ",-1)),e("button",{type:"button",onClick:k,class:"inline-flex flex-shrink-0 items-center justify-center gap-2 rounded-full bg-gradient-to-r from-pink-500 to-orange-500 px-4 py-2.5 text-sm font-semibold text-white shadow-sm transition-all hover:shadow-lg hover:shadow-
1pink-500/25"},[_(y(Te),{class:"h-4 w-4"}),P[13]||(P[13]=B(" Book a free mortgage appointment ",-1))])])]))}},Da={key:0,class:"absolute -right-0.5 -top-0.5 inline-flex h-3 w-3 rounded-full bg-orange-400 ring-2 ring-white"},Ea={key:0,class:"fixed bottom-5 right-5 z-[9998] flex w-[min(92vw,24rem)] flex-col overflow-hidden rounded-3xl border border-stone-200/70 bg-white shadow-2xl shadow-stone-900/10",style:{height:"min(78vh, 34rem)"},role:"dialog","aria-label":"Inigo property valuation assistant"},Ia={class:"relative flex-shrink-0 overflow-hidden bg-gradient-to-r from-pink-500 to-rose-500 px-4 py-3"},Ya={class:"relative z-10 flex items-center justify-between"},za={class:"flex items-center gap-2.5"},Ha={class:"grid h-9 w-9 place-items-center rounded-2xl bg-white/20 ring-1 ring-white/40 backdrop-blur"},Ua={key:0,class:"flex justify-end"},Va={class:"max-w-[85%] rounded-2xl rounded-br-md bg-gradient-to-r from-pink-500 to-rose-500 px-3.5 py-2 text-sm text-white shadow-sm"},Wa={key:1,class:"flex justify-start"},Ka={class:"max-w-[88%] rounded-2xl rounded-bl-md border border-stone-200/70 bg-white px-3.5 py-2.5 text-sm text-stone-700 shadow-sm"},Ja=["innerHTML"],Qa={key:1,class:"flex items-center gap-1.5 text-pink-400"},Xa={key:2,class:"ml-0.5 inline-block h-4 w-1.5 animate-pulse rounded-full bg-pink-500 align-middle"},Za={key:0,class:"flex flex-wrap gap-1.5 pt-1"},el=["disabled","onClick"],tl={class:"flex-shrink-0 border-t border-stone-200/70 bg-white p-3"},sl={class:"flex items-end gap-2"},nl=["disabled"],ol=["disabled"],al={__name:"ValuationChatBox",props:{property:{type:Object,default:()=>({})},endpoints:{type:Object,default:()=>({})},csrf:{type:String,default:""},autoOpenDelay:{type:Number,default:1200}},emits:["open","close"],setup(s,{emit:t}){ze.setOptions({breaks:!0,gfm:!0});const m=s,q=t,k=U(!1),x=U(!0),T=U(""),g=U(!1),p=U([]),S=U(null),L=U(Q()),R=U(!1),D=U(null),u=U(null);let r=null,h=null,M=null;a(()=>{var c;return((c=m.endpoints)==null?void 0:c.aiSession)||"/api/public/ai/session"});const E=a(()=>{var c;return((c=m.endpoints)==null?void 0:c.aiStream)||"/api/public/ai/chat/stream"}),F=a(()=>!g.value&&T.value.trim().length>0),J=a(()=>p.value.length===1&&p.value[0].role==="assistant"&&!g.value&&!R.value),W=["How was this valuation calculated?","Show me the comparable sales","How can I increase the value?","Is now a good time to sell?","Help me find the right agent"];function Q(){var c;try{if((c=window.crypto)!=null&&c.randomUUID)return window.crypto.randomUUID().replace(/-/g,"").slice(0,32)}catch{}return Math.random().toString(36).slice(2)+Date.now().toString(36)}function A(c){const b=Number(c);return Number.isFinite(b)?"£"+Math.round(b).toLocaleString("en-GB"):null}function P(){const c=m.property||{},b=(c.address||"").split(",")[0],C=c.estimate||{},ee=A(C.low),oe=A(C.high),ue=A(C.mid),de=(C.transaction_type||c.valuationType)==="rent"||c.valuationType==="lettings",we=de?" pcm":"";let ce="";ee&&oe?ce=` of **${ee} – ${oe}${we}**`:ue&&(ce=` of around **${ue}${we}**`);const ge=b?` for **${b}**`:c.postcode?` in **${c.postcode}**`:"";return`Hi — I'm **Inigo**. I've just put together a${de?" rental":""} valuation${ge}${ce}.
2
3Ask me anything about it: how the figure was worked out, the comparable ${de?"lettings":"sales"} behind it, how to push the ${de?"rent":"price"} up, the best time to ${de?"let":"sell"}, or finding the right local agent.`}function I(){try{return window.matchMedia("(prefers-reduced-motion: reduce)").matches}catch{return!1}}function Y(){p.value.length||p.value.push({id:"greeting",role:"assistant",content:P(),typed:I()?null:0,streaming:!1})}function K(){const c=p.value.find(b=>b.id==="greeting");!c||c.typed==null||c.typed>=c.content.length||R.value||(R.value=!0,h=setInterval(()=>{c.typed=Math.min(c.content.length,c.typed+3),H(),c.typed>=c.content.length&&(clearInterval(h),h=null,c.typed=null,R.value=!1)},16))}function f(c){return(c.match(/\*\*/g)||[]).length%2===1?c+"**":c}function $(c){return c.typed!=null&&c.typed<(c.content?c.content.length:0)}function i(c){return c.typed!=null&&c.content&&c.typed<c.content.length?f(c.content.slice(0,c.typed)):c.content}function v(c){return String(c).replace(/\[SCHEDULE_CTA:\s*"[^"]*"\s*\|\s*"[^"]*"\s*\]/g,"").replace(/\[BROKER_CTA:\s*"[^"]*"\s*\]/g,"").replace(/\[SURVEYOR_CTA:\s*"[^"]*"\s*\]/g,"").replace(/\[(SCHEDULE_CTA|BROKER_CTA|SURVEYOR_CTA)\b[^\]]*$/g,"").replace(/\{\{(?:stat|property)\b[^}
3]*$/g,"").trim()}function N(c){if(!c)return"";let b=v(c);b=b.replace(/\{\{property:([^|]+)\|[^}]+\}\}/g,(ee,oe)=>oe.replace(/</g,"&lt;").replace(/>/g,"&gt;")),b=b.replace(/\{\{stat:([^|}]+)(?:\|[^}]+)?\}\}/g,(ee,oe)=>`<span class="vcb-stat">${String(oe).replace(/</g,"&lt;").replace(/>/g,"&gt;")}</span>`);const C=ze.parse(b);return mt.sanitize(C,{ALLOWED_TAGS:["p","br","strong","em","b","i","u","a","ul","ol","li","code","pre","blockquote","h1","h2","h3","h4","h5","h6","hr","table","thead","tbody","tr","th","td","span"],ALLOWED_ATTR:["href","target","rel","class"],ALLOW_DATA_ATTR:!1})}function G(c){var C;if((C=c.brokerCta)!=null&&C.button_text)return c.brokerCta;const b=String(c.content||"").match(/\[BROKER_CTA:\s*"([^"]+)"\s*\]/);return b?{button_text:b[1]}:null}function d(){var c,b,C;Pe({postcode:((c=m.property)==null?void 0:c.postcode)||"",source:"inigo-valuation-chat",estimate:((C=(b=m.property)==null?void 0:b.estimate)==null?void 0:C.mid)??null})}function j(c){var C;if((C=c.surveyorCta)!=null&&C.button_text)return c.surveyorCta;const b=String(c.content||"").match(/\[SURVEYOR_CTA:\s*"([^"]+)"\s*\]/);return b?{button_text:b[1]}:null}function O(){window.open("/compare-surveyors","_blank","noopener")}function H(){_e(()=>{const c=D.value;c&&(c.scrollTop=c.scrollHeight)})}function Z(){const c=u.value;c&&(c.style.height="auto",c.style.height=Math.min(c.scrollHeight,112)+"px")}function ae(){k.value=!0,x.value=!1,q("open"),Y(),H(),K(),_e(()=>{var c;return(c=u.value)==null?void 0:c.focus()})}function le(){k.value=!1,q("close")}function V(c){c.key==="Enter"&&!c.shiftKey&&(c.preventDefault(),se())}async function se(c){const b=(c??T.value).trim();if(!b||g.value)return;c||(T.value=""),_e(()=>Z()),p.value.push({id:"u-"+Date.now(),role:"user",content:b,streaming:!1});const C={id:"a-"+Date.now(),role:"assistant",content:"",streaming:!0};p.value.push(C),g.value=!0,H();try{await ie(b,C)}catch(ee){(ee==null?void 0:ee.name)!=="AbortError"&&(C.content||(C.content="Sorry — I had trouble responding just then. Please try again in a moment."))}finally{C.streaming=!1,g.value=!1,H(),_e(()=>{var ee;return(ee=u.value)==null?void 0:ee.focus()})}}async function ie(c,b){var Me,qe,Re,Le,Ge,Fe;M=new AbortController;const C={"Content-Type":"application/json",Accept:"text/event-stream"},ee=m.csrf||((Me=document.querySelector('meta[name="csrf-token"]'))==null?void 0:Me.content)||"";ee&&(C["X-CSRF-TOKEN"]=ee);const oe={message:c,fingerprint:L.value,user_type:"homeseller"};if(S.value&&(oe.conversation_id=S.value),(qe=m.property)!=null&&qe.postcode&&(oe.location=String(m.property.postcode).slice(0,100)),(Re=m.property)!=null&&Re.address){const te=m.property;oe.valuation_context={address:String(te.address).slice(0,255),postcode:te.postcode?String(te.postcode).slice(0,20):"",bedrooms:te.bedrooms??null,propertyType:te.propertyType?String(te.propertyType).slice(0,60):"",valuationType:te.valuationType?String(te.valuationType).slice(0,30):"",estimate:{low:((Le=te.estimate)==null?void 0:Le.low)??null,mid:((Ge=te.estimate)==null?void 0:Ge.mid)??null,high:((Fe=te.estimate)==null?void 0:Fe.high)??null}}}const ue=await fetch(E.value,{method:"POST",headers:C,body:JSON.stringify(oe),credentials:"same-origin",signal:M.signal});if(!ue.ok||!ue.body)throw new Error("stream failed: "+ue.status);const de=ue.body.getReader(),we=new TextDecoder;let ce="",ge="";for(;;){const{done:te,value:Ze}=await de.read();if(te)break;ce+=we.decode(Ze,{stream:!0});const Oe=ce.split(/\r?\n/);ce=Oe.pop()||"";for(const ke of Oe){if(ke.startsWith("event:")){ge=ke.slice(6).trim();continue}if(ke.startsWith("data:")){let De;try{De=JSON.parse(ke.slice(5).trim())}catch{continue}ye(ge,De,b),ge=""}}}}function ye(c,b,C){switch(c){case"session":b.conversation_id&&(S.value=b.conversation_id);return;case"text_delta":b.content&&(C.content+=b.content,H());return;case"pro_fallback":return;case"done":b.conversation_id&&(S.value=b.conversation_id),b.broker_cta&&(C.brokerCta=b.broker_cta),b.surveyor_cta&&(C.surveyorCta=b.surveyor_cta),C.streaming=!1;return;case"error":C.content||(C.content=b.rate_limited?b.message||"You have reached the chat limit for now. Please try again shortly.":b.message||"Sorry — something went wrong. Please try again in a moment."),C.streaming=!1;return;default:b.content&&(C.content+=b.content,H()),b.conversation_id&&(S.value=b.conversation_id)}}return at(()=>{Y(),r=setTimeout(()=>{k.value||ae()},Math.max(0,m.autoOpenDelay))}),lt(()=>{if(r&&clearTimeout(r),h&&clearInterval(h),M)try{M.abort()}catch{}}),(c,b)=>(n(),o(z,null,[_(Ee,{name:"vcb-launcher"},{default:he(()=>
3[k.value?w("",!0):(n(),o("button",{key:0,type:"button",class:"fixed bottom-5 right-5 z-[9998] flex items-center gap-2 rounded-full bg-gradient-to-r from-pink-500 to-rose-500 px-4 py-3 text-sm font-semibold text-white shadow-lg shadow-pink-500/30 transition-all duration-300 hover:-translate-y-0.5 hover:shadow-xl","aria-label":"Open Inigo chat about your valuation",onClick:ae},[_(He,{"on-color":"",size:20,state:"resting"}),b[2]||(b[2]=e("span",{class:"hidden sm:inline"},"Ask Inigo",-1)),x.value?(n(),o("span",Da)):w("",!0)]))]),_:1}),_(Ee,{name:"vcb-panel"},{default:he(()=>[k.value?(n(),o("div",Ea,[e("div",Ia,[b[4]||(b[4]=e("div",{class:"absolute inset-0 -z-0 opacity-40","aria-hidden":"true"},[e("div",{class:"absolute -right-6 -top-8 h-24 w-24 rounded-full bg-orange-300/40 blur-2xl"}),e("div",{class:"absolute -bottom-10 left-4 h-24 w-24 rounded-full bg-pink-200/40 blur-2xl"})],-1)),e("div",Ya,[e("div",za,[e("div",Ha,[_(He,{"on-color":"",size:24,state:g.value?"solving":"resting",animate:g.value},null,8,["state","animate"])]),b[3]||(b[3]=e("div",{class:"leading-tight"},[e("p",{class:"text-sm font-semibold text-white"},"Inigo"),e("p",{class:"text-[11px] text-white/80"},"Your property assistant")],-1))]),e("button",{type:"button",class:"rounded-xl p-1.5 text-white/80 transition-colors hover:bg-white/15 hover:text-white","aria-label":"Minimise chat",onClick:le},[_(y(rt),{class:"h-5 w-5"})])])]),e("div",{ref_key:"scrollRef",ref:D,class:"flex-1 space-y-3 overflow-y-auto bg-stone-50/60 px-4 py-4"},[(n(!0),o(z,null,re(p.value,C=>(n(),o(z,{key:C.id},[C.role==="user"?(n(),o("div",Ua,[e("div",Va,l(C.content),1)])):(n(),o("div",Wa,[e("div",Ka,[i(C)?(n(),o("div",{key:0,class:"vcb-prose",innerHTML:N(i(C))},null,8,Ja)):C.streaming?(n(),o("span",Qa,[_(y(Ce),{class:"h-3.5 w-3.5 animate-spin"}),b[5]||(b[5]=B(" Thinking… ",-1))])):w("",!0),(C.streaming||$(C))&&i(C)?(n(),o("span",Xa)):w("",!0),!C.streaming&&G(C)?(n(),o("button",{key:3,type:"button",class:"mt-2.5 inline-flex items-center gap-1.5 rounded-full bg-gradient-to-r from-pink-500 to-orange-500 px-3.5 py-2 text-xs font-semibold text-white shadow-sm transition-all hover:shadow-md hover:shadow-pink-500/25",onClick:d},[_(y(Te),{class:"h-3.5 w-3.5"}),B(" "+l(G(C).button_text),1)])):w("",!0),!C.streaming&&j(C)?(n(),o("button",{key:4,type:"button",class:"mt-2.5 inline-flex items-center gap-1.5 rounded-full bg-gradient-to-r from-pink-500 to-orange-500 px-3.5 py-2 text-xs font-semibold text-white shadow-sm transition-all hover:shadow-md hover:shadow-pink-500/25",onClick:O},[_(y(Rt),{class:"h-3.5 w-3.5"}),B(" "+l(j(C).button_text),1)])):w("",!0)])]))],64))),128)),J.value?(n(),o("div",Za,[(n(),o(z,null,re(W,C=>e("button",{key:C,type:"button",disabled:g.value,class:"rounded-full border border-pink-200 bg-white px-3 py-1.5 text-left text-xs font-medium text-stone-600 transition-colors hover:border-pink-300 hover:bg-pink-50 hover:text-pink-700 disabled:opacity-50",onClick:ee=>se(C)},l(C),9,el)),64))])):w("",!0)],512),e("div",tl,[e("div",sl,[pe(e("textarea",{ref_key:"inputRef",ref:u,"onUpdate:modelValue":b[0]||(b[0]=C=>T.value=C),rows:"1",disabled:g.value,placeholder:"Ask about your valuation…",class:"max-h-28 flex-1 resize-none rounded-2xl border border-stone-200 bg-stone-50 px-3.5 py-2.5 text-sm text-stone-800 placeholder-stone-400 transition-colors focus:border-pink-300 focus:bg-white focus:outline-none focus:ring-2 focus:ring-pink-400/40 disabled:opacity-60",onKeydown:V,onInput:Z},null,40,nl),[[fe,T.value]]),e("button",{type:"button",disabled:!F.value,class:"grid h-10 w-10 flex-shrink-0 place-items-center rounded-2xl bg-gradient-to-r from-pink-500 to-rose-500 text-white shadow-sm transition-all hover:shadow-md disabled:cursor-not-allowed disabled:from-stone-300 disabled:to-stone-300 disabled:shadow-none","aria-label":"Send message",onClick:b[1]||(b[1]=C=>se())},[g.value?(n(),X(y(Ce),{key:0,class:"h-4.5 w-4.5 animate-spin"})):(n(),X(y(Lt),{key:1,class:"h-4.5 w-4.5"}))],8,ol)]),b[6]||(b[6]=e("p",{class:"mt-1.5 px-1 text-center text-[10px] text-stone-400"}," Inigo can make mistakes. Check key figures with your agent. ",-1))])])):w("",!0)]),_:1})],64))}},ll=ot(al,[["__scopeId","data-v-07d3fe95"]]);function rl(s){const t=`val_mortgage_${s}`;let m=null;try{const k=localStorage.getItem(t);if(k!=null&&k!==""){const x=Number(k);m=Number.isFinite(x)&&x>=0?x:null}}catch{}const q=U(m);return it(q,k=>{try{const x=Number(k);k==null||k===""||!Number.isFinite(x)||x<0?localStorage.removeItem(t):localStorage.setItem(t,String(x))}catch{}}),{balance:q}}const il={class:"mx-auto w-full max-w-4xl px-4 py-6 sm:px-6 sm:py-8"},ul={class:"mb-6"},dl={class:"mt-4"},cl={class:"text-[11px] font-semibold uppercase tracking-[0.18em] text-transparent bg-gradient-to-r from-pink-500 to-orange-500 bg-clip-text"},ml={class:"mt-1 text-2xl font-light tracking-tight text-stone-900 sm:text-3xl"},pl={class:"mt-1 flex flex-wrap items-center gap-x-2 gap-y-0.5 text-sm text-stone-500"},fl={key:0},gl={key:1,class:"text-stone-300"},xl={key:2},hl={class:"mt-3 flex flex-wrap items-center gap-x-4 gap-y-1.5"},vl={key:0,href:"#val-trajectory",class:"inline-flex items-center gap-1.5 text-sm font-medium text-stone-500 transition-colors hover:text-stone-700"},bl={class:"flex flex-col space-y-6"},yl={id:"val-trajectory",class:"scroll-mt-6"},wl={class:"mb-4"},kl={key:0,class:"mt-1 text-sm text-stone-500"},_l={class:"grid grid-cols-1 gap-4 sm:gap-5 lg:grid-cols-2"},$l={class:"mx-auto max-w-xl text-center text-xs text-stone-400"},Sl={class:"inline-flex items-center gap-1.5"},jl={key:0,class:"mt-1.5 leading-relaxed"},br={__name:"Show",props:{valuation:{type:Object,required:!0},estimate:{type:Object,default:null},subject:{type:Object,default:null},comparables:{type:Object,default:()=>({sold:[],listings:[]})},stats:{type:Object,default:null},floorArea:{type:Object,default:null},trajectory:{type:Object,default:null},insights:{type:Object,default:()=>({})},topAgents:{type:Array,default:()=>[]},professionalRequest:{type:Object,default:null},ownHistory:{type:Object,default:null},chat:{type:Object,default:()=>({})},mapboxToken:{type:String,default:""},user:{type:Object,default:null}},setup(s){const t=s;function m(f){const $=Number(f);
3return Number.isFinite($)?"£"+Math.round($).toLocaleString("en-GB"):"—"}const q=a(()=>{var $,i;const f=(($=t.estimate)==null?void 0:$.transaction_type)||((i=t.valuation)==null?void 0:i.valuation_type);return f==="rent"||f==="lettings"}),k=a(()=>{var $,i;const f=(($=t.subject)==null?void 0:$.address)||((i=t.valuation)==null?void 0:i.property_address)||"";return f.split(",")[0]||f}),x=a(()=>{var f;if(!((f=t.valuation)!=null&&f.created_at))return"";try{return new Date(t.valuation.created_at).toLocaleDateString("en-GB",{day:"numeric",month:"long",year:"numeric"})}catch{return""}}),T=a(()=>{var f;return!!((f=t.estimate)!=null&&f.mid)}),g=a(()=>{var f;return((f=t.comparables)==null?void 0:f.sold)||[]}),p=a(()=>{var f;return((f=t.comparables)==null?void 0:f.listings)||[]}),S=a(()=>({sold:g.value.length,live:p.value.length})),L=a(()=>{var f,$,i,v;return(($=(f=t.stats)==null?void 0:f.price_range)==null?void 0:$.min)!=null&&((v=(i=t.stats)==null?void 0:i.price_range)==null?void 0:v.max)!=null}),R=a(()=>{var $,i;const f=Number((i=($=t.trajectory)==null?void 0:$.summary)==null?void 0:i.projected_3y);return Number.isFinite(f)?f:null}),D=a(()=>{var f;return((f=t.insights)==null?void 0:f.area)||null}),u=a(()=>{var f;return((f=t.insights)==null?void 0:f.timing)||null}),r=a(()=>!t.insights||Object.keys(t.insights).length===0),h=a(()=>{const f=D.value,$=u.value;if(!f&&!$)return"";const i=[],v=f!=null&&f.market_type?String(f.market_type).replace(/[_-]+/g," "):null,N=f!=null&&f.demand_level?String(f.demand_level):null;v&&N?i.push(`This is currently a ${v} with ${N} demand.`):v&&i.push(`This is currently a ${v}.`);const G=($==null?void 0:$.average_days_on_market)??(f==null?void 0:f.days_on_market);if(G){let d=`Homes here take about ${G} days to sell`;const j=$==null?void 0:$.reduction_rate;if(j!=null){const O=Number(j)<=1?Number(j)*100:Number(j);d+=`, and ${O.toFixed(0)}% see a price cut`}i.push(d+".")}return i.join(" ")});function M(f){const $=String(f||"").toLowerCase();return $==="semi"?"semi-detached":$==="end-terrace"?"terraced":$}const E=a(()=>{const f=t.valuation||{},$=new URLSearchParams({fresh:"1"});return f.property_postcode&&$.set("postcode",f.property_postcode),f.property_address&&$.set("address",f.property_address),f.property_type&&$.set("property_type",M(f.property_type)),f.bedrooms!=null&&$.set("bedrooms",String(f.bedrooms)),f.property_token&&$.set("property_token",f.property_token),`/find-my-agent?${$.toString()}`}),F=a(()=>{var f,$,i,v,N,G,d,j;return(f=t.chat)!=null&&f.property?t.chat.property:{address:(($=t.subject)==null?void 0:$.address)||((i=t.valuation)==null?void 0:i.property_address)||"",postcode:((v=t.subject)==null?void 0:v.postcode)||((N=t.valuation)==null?void 0:N.property_postcode)||"",bedrooms:(G=t.valuation)==null?void 0:G.bedrooms,propertyType:(d=t.valuation)==null?void 0:d.property_type,valuationType:(j=t.valuation)==null?void 0:j.valuation_type,estimate:t.estimate}}),J=a(()=>{var f,$,i,v;return{aiSession:(($=(f=t.chat)==null?void 0:f.endpoints)==null?void 0:$.aiSession)||"/api/public/ai/session",aiStream:((v=(i=t.chat)==null?void 0:i.endpoints)==null?void 0:v.aiStream)||"/api/public/ai/chat/stream"}}),W=a(()=>{var f;return((f=t.chat)==null?void 0:f.csrf)||""}),Q=a(()=>{var f;return(f=t.valuation)!=null&&f.agent_requested?{name:t.valuation.agent_name,status:t.valuation.status,self:!0}:t.professionalRequest?{name:t.professionalRequest.agent_name,status:t.professionalRequest.status,id:t.professionalRequest.id,self:!1}:null}),A=U(!1),P=U(null);function I(f){A.value||(P.value=f,We.post(`/account/valuations/${t.valuation.id}/request-agent`,{agent_id:f},{onStart:()=>{A.value=!0},onFinish:()=>{A.value=!1,P.value=null}}))}const{balance:Y}=rl(t.valuation.id),K=a(()=>{var f,$,i,v;return{name:((f=t.user)==null?void 0:f.name)||"",email:(($=t.user)==null?void 0:$.email)||"",postcode:((i=t.valuation)==null?void 0:i.property_postcode)||((v=t.subject)==null?void 0:v.postcode)||""}});return(f,$)=>(n(),o(z,null,[_(y(ut),{title:`Valuation${k.value?" · "+k.value:""}`},null,8,["title"]),_(dt,null,{default:he(()=>{var i,v,N,G,d,j,O,H,Z,ae,le,V;return[e("div",il,[e("div",ul,[_(y(Ie),{href:"/account/valuations",class:"inline-flex items-center gap-1.5 text-sm font-medium text-stone-500 transition-colors hover:text-stone-700"},{default:he(()=>[_(y(Gt),{class:"h-4 w-4"}),$[2]||($[2]=B(" Back to my valuations ",-1))]),_:1}),e("div",dl,[e("p",cl,l(q.value?"Rental report":"Home report"),1),e("h1",ml,l(k.value||"Your valuation"),1),e("p",pl,[s.valuation.property_postcode?(n(),o("span",fl,l(s.valuation.property_postcode),1)):w("",!0),s.valuation.property_postcode&&x.value?(n(),o("span",gl,"·")):w("",!0),x.value?(n(),o("span",xl,"Valued "+l(x.value),1)):w("",!0)]),e("div",hl,[_(y(Ie),{href:"/account/my-homes",class:"inline-flex items-center gap-1.5 text-sm font-medium text-pink-600 transition-colors hover:text-pink-700"},{default:he(()=>[_(y(ve),{class:"h-4 w-4"}),$[3]||($[3]=B(" View this home in My Home ",-1))]),_:1}),s.trajectory&&s.trajectory.series&&s.trajectory.series.length?(n(),o("a",vl,[_(y(Ft),{class:"h-4 w-4"}),$[4]||($[4]=B(" Track this home's value ",-1))])):w("",!0)])])]),e("div",bl,[_(us,{estimate:s.estimate,subject:s.subject,"format-g-b-p":m,"enable-equity":!q.value,"booking-prefill":K.value,mortgageBalance:y(Y),"onUpdate:mortgageBalance":$[0]||($[0]=se=>Ye(Y)?Y.value=se:null)},null,8,["estimate","subject","enable-equity","booking-prefill","mortgageBalance"]),T.value?(n(),X(Ls,{key:0,estimate:s.estimate,stats:s.stats,"floor-area":s.floorArea,"valuation-id":s.valuation.id,"comparables-count":S.value,valuation:s.valuation,postcode:s.valuation.property_postcode,"is-rent":q.value,"format-g-b-p":m},null,8,["estimate","stats","floor-area","valuation-id","comparables-count","valuation","postcode","is-rent"])):w("",!0),T.value&&L.value?(n(),X(Vs,{key:1,estimate:s.estimate,stats:s.stats,comparables:s.comparables,postcode:s.valuation.property_postcode,anchor:"val-comparables","format-g-b-p":m},null,8,["estimate","stats","comparables","postcode"])):w("",!0),e("div",yl,[s.trajectory&&s.trajectory.series&&s.trajectory.series.length?(n(),X(xn,{key:0,trajectory:s.trajectory,"estimate-mid":((i=s.estimate)==null?void 0:i.mid)??null,"format-g-b-p":m},null,8,["trajectory","estimate-mid"])):w("",!0)]),s.ownHistory&&T.value&&!q.value?(n(),X(Bn,{key:2,"own-history":s.ownHistory,"estimate-mid":((v=s.estimate)==null?void 0:v.mid)??null,"format-g-b-p":m},null,8,["own-history","estimate-mid"])):w("",!0),_(Jn,{sold:g.value,listings:p.value,"area-price-per-sqft":((N=s.stats)==null?void 0:N.avg_price_per_sqft)??null,"format-g-b-p":m,"mapbox-token":s.mapboxToken},null,8,["sold","listings","area-price-per-sqft","mapbox-token"]),e("section",null,[e("div",wl,[$[5]||($[5]=e("h3",{class:"text-xl font-light tracking-tight text-stone-900 sm:text-2xl"}
3,"The market right now",-1)),h.value?(n(),o("p",kl,l(h.value),1)):w("",!0)]),e("div",_l,[_(vo,{area:D.value,loading:r.value,"format-g-b-p":m},null,8,["area","loading"]),_(qo,{timing:u.value,loading:r.value},null,8,["timing","loading"])])]),T.value&&!q.value?(n(),X(Oa,{key:3,estimate:s.estimate,projected3y:R.value,mortgageBalance:y(Y),"onUpdate:mortgageBalance":$[1]||($[1]=se=>Ye(Y)?Y.value=se:null),"booking-prefill":K.value,"format-g-b-p":m},null,8,["estimate","projected3y","mortgageBalance","booking-prefill"])):w("",!0),_(ha,{agents:s.topAgents,postcode:s.valuation.property_postcode,address:k.value,href:E.value,confirmed:Q.value,requesting:A.value,"pending-agent-id":P.value,onSelect:I},null,8,["agents","postcode","address","href","confirmed","requesting","pending-agent-id"]),e("div",$l,[e("p",Sl,[_(y(Ae),{class:"h-3.5 w-3.5 text-emerald-500"}),$[6]||($[6]=B(" Instant estimates are indicative · a local agent confirms the figure in person ",-1))]),(G=s.estimate)!=null&&G.sample_size||(j=(d=s.trajectory)==null?void 0:d.summary)!=null&&j.data_points?(n(),o("p",jl,[$[7]||($[7]=B(" Based on ",-1)),(O=s.estimate)!=null&&O.sample_size?(n(),o(z,{key:0},[B(l(s.estimate.sample_size)+" comparable "+l(s.estimate.sample_size===1?"property":"properties"),1)],64)):w("",!0),(H=s.estimate)!=null&&H.sample_size&&((ae=(Z=s.trajectory)==null?void 0:Z.summary)!=null&&ae.data_points)?(n(),o(z,{key:1},[B(" and ")],64)):w("",!0),(V=(le=s.trajectory)==null?void 0:le.summary)!=null&&V.data_points?(n(),o(z,{key:2},[B(l(s.trajectory.summary.data_points)+" quarters of Land Registry data",1)],64)):w("",!0),B(". We'll refresh this report as new sales complete — check back any time to track "+l(k.value||"your home")+". ",1)])):w("",!0)])])]),_(ll,{property:F.value,endpoints:J.value,csrf:W.value,"auto-open-delay":3e4},null,8,["property","endpoints","csrf"])]}),_:1})],64))}};export{br 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.