1import{j as e}from"./vendor-motion-BCy7ab5t.js";import{r as o}from"./vendor-embla-BJRVZsV6.js";import{l as b,ay as R,az as A,m as g}from"./index-BLj6R6_t.js";import{l as G,h as X,i as z,m as J,C as Q,M as T,j as d,f as s,k as Z,T as ee,n as ae,o as S,L as te,d as se,S as w}from"./CalculatorShell-D2LR2OdE.js";import{N as h}from"./InputField-qASat2DZ.js";import{C}from"./ChoiceField-KFqN5kwa.js";import{S as M}from"./StatTile-Iq_isGWn.js";import{D as O}from"./DataTable-Czwd39cd.js";import{T as F}from"./TextCard-Dlu0vXBN.js";import{S as oe}from"./SourcesCard-91fKMp92.js";import{L as B}from"./LinkListCard-DC5Wv1-I.js";import{R as re,B as ne,b as le,X as ie,Y as he,T as me,L as de,e as L}from"./vendor-recharts-BEBuK3UL.js";import"./vendor-react-CluDhzVS.js";import"./vendor-radix-De_UMYkd.js";import"./vendor-query-BuvZ5km2.js";import"./vendor-supabase-BbzSFA1B.js";import"./comparison-cross-links-BriBPwnO.js";import"./comparisons-CkPcBcww.js";import"./mas-rates.generated-1OTcZy-3.js";import"./calculators-BcjQIGsW.js";import"./heart-pulse-B43vo90D.js";import"./chart-line-CZa8viTY.js";import"./coins-DWzP_BQE.js";import"./sparkles-CHsJwS56.js";import"./hammer-Q1ewDLyQ.js";import"./list-checks-BJWBXC7x.js";import"./input-DXC_NzSH.js";import"./checkbox-CBfFGTE-.js";import"./check-CQWr8TPG.js";import"./label-DEoOTcpb.js";import"./TurnstileField-DYm0PUbC.js";import"./circle-check-D_WjAOXx.js";import"./CalculatorBreadcrumb-D7A7BLCm.js";import"./calculator-schema-BVJpytCy.js";import"./Byline-DvdgSx0P.js";import"./mas-rates-format-BFA_ICCg.js";import"./calculator-embed-context-DhYaAhoM.js";import"./chevron-left-pHM4LD5q.js";import"./circle-help-DaRSDG8n.js";import"./select-C2kQd2r2.js";const ce=[{question:"How is my monthly mortgage instalment worked out?",answer:"Banks use the standard amortisation formula. Each month you pay interest on the balance still owed plus some principal, set so the loan is cleared at the end of the tenure. A S$1,125,000 loan over 30 years at 1.73% a year costs about S$4,010 a month."},{question:"How much can I borrow from a bank for a home?",answer:"Up to 75% of the price or valuation, whichever is lower, if you have no other housing loan. It drops to 55% if the tenure runs past 30 years (25 for HDB flats) or past age 65. The loan must also pass TDSR, and MSR for HDB flats and ECs, worked out at a 4% stress rate."},{question:"How much cash do I need for the downpayment?",answer:"With a 75% loan and no other housing loan, at least 5% of the price must be cash and the other 20% can come from cash or CPF. With a 55% loan the cash minimum is 10%. If you already have a housing loan, the loan limit drops to 45% or 25% and the cash minimum is 25%."},{question:"What is TDSR and MSR?",answer:"TDSR caps all your monthly debt repayments at 55% of gross monthly income. MSR caps the home loan instalment at 30% of income, and applies to HDB flats and to ECs still within their minimum occupation period. Banks test both at 4% a year or your actual rate, whichever is higher."},{question:"What is the current SORA rate?",answer:"MAS published the 3-month compounded SORA at 1.2332% on 5 Oct 2026. A floating home loan charges SORA plus the bank's spread, so with a 0.5% spread the rate would be about 1.73% a year until SORA moves."},{question:"How long can my home loan be?",answer:"Up to 30 years for an HDB flat and 35 years for other property, under MAS rules. A longer tenure lowers the monthly instalment but raises the total interest, and past 30 years (25 for HDB) it also cuts the loan limit to 55%."},{question:"How much income do I need for a S$1 million loan?",answer:"At the 4% stress rate over 30 years, a S$1,000,000 loan has an instalment of about S$4,774. To keep that within the 55% TDSR with no other debts you need about S$8,680 a month in gross income. For an HDB flat or EC, the 30% MSR needs about S$15,900."},{question:"Should I choose a fixed or floating rate?",answer:"A fixed rate keeps your instalment the same for the lock-in period. A floating rate follows SORA, so it falls when SORA falls and rises when it rises. Use the rate table on this page to see how much your instalment would change if the rate moved by up to 2 points."}],Ze=()=>{const[c,N]=o.useState(15e5),[r,P]=o.useState("private"),[x,H]=o.use
1State(0),[y,I]=o.useState(35),[k,E]=o.useState(30),[j,q]=o.useState(75),[v,W]=o.useState("sora"),[$,Y]=o.useState(.5),[D,_]=o.useState(2.5),[u,K]=o.useState(15e3),[p,U]=o.useState(0),n=Math.min(Math.max(1,Math.round(k)),T[r]),l=v==="sora"?d.rate+$:D,a=o.useMemo(()=>{const t=G(r,x,n,y+n),m=Math.min(Math.max(j,0),t.ltv),i=c*m/100,f=X({loanAmount:i,annualRatePct:l,years:n});return{lim:t,pct:m,loan:i,schedule:f,monthly:f.monthlyPayment,cashMin:c*t.minCash/100,downpayment:c-i,afford:z(r,i,l,n,u,p),maxLoan:J(r,l,n,u,p)}},[r,x,n,y,j,c,l,u,p]);return e.jsx(Q,{title:"Mortgage calculator for bank home loans",description:"Work out the monthly instalment on a Singapore bank home loan at today's 3-month SORA or a fixed rate. The calculator applies MAS's loan-to-value limits, tells you the cash you must put down, and checks the loan against TDSR and MSR at the 4% stress rate banks use.",metaDescription:"Bank mortgage calculator for Singapore: monthly instalment at today's 3M SORA or a fixed rate, LTV and cash downpayment, and a TDSR and MSR check at 4%.",canonical:"https://themoneybees.co/calculators/mortgage",calculatorSlug:"mortgage",getLeadSnapshot:()=>({inputs:{price:c,type:r,loans:x,age:y,tenure:n,loanPct:a.pct,rate:l,income:u,debts:p},results:{loan:a.loan,monthly:a.monthly,tdsr:a.afford.tdsr}}),faqs:ce,inputs:e.jsxs(e.Fragment,{children:[e.jsxs(b,{children:[e.jsx(R,{children:e.jsx(A,{className:"text-lg",children:"The loan"})}),e.jsxs(g,{className:"space-y-5",children:[e.jsx(h,{id:"m-price",label:"Property price or valuation, whichever is lower",prefix:"S$",value:c,onChange:N,min:5e4,max:5e6,step:1e4,withSlider:!0}),e.jsx(C,{id:"m-type",label:"Property",value:r,onChange:P,options:[{value:"private",label:"Private property"},{value:"ec",label:"EC bought from the developer"},{value:"hdb",label:"HDB flat, bank loan"}]}),e.jsx(C,{id:"m-loans",label:"Housing loans you still owe",value:String(x),onChange:t=>H(Number(t)),options:[{value:"0",label:"None"},{value:"1",label:"One"},{value:"2",label:"Two or more"}]}),e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[e.jsx(h,{id:"m-age",label:"Borrower age",suffix:"yrs",value:y,onChange:I,min:21,max:75,hint:"Income-weighted for joint loans"}),e.jsx(h,{id:"m-tenure",label:"Tenure",suffix:"yrs",value:k,onChange:E,min:5,max:T[r],hint:`Up to ${T[r]} years`})]}),e.jsx(h,{id:"m-ltv",label:"Loan as a share of price",suffix:"%",value:j,onChange:q,min:0,max:a.lim.ltv,withSlider:!0,hint:`Your limit is ${a.lim.ltv}% of the price.`}),e.jsx(C,{id:"m-mode",label:"Interest rate",value:v,onChange:W,options:[{value:"sora",label:`3M SORA (${d.rate.toFixed(4)}%) plus a spread`},{value:"fixed",label:"Fixed rate"}]}),v==="sora"?e.jsx(h,{id:"m-spread",label:"Bank spread over SORA",suffix:"%",value:$,onChange:Y,min:0,max:3,step:.05,hint:"Take the spread from your bank's offer."}):e.jsx(h,{id:"m-fixed",label:"Fixed rate",suffix:"% a year",value:D,onChange:_,min:0,max:10,step:.05,hint:"Take the rate from your bank's offer."})]})]}),e.jsxs(b,{children:[e.jsx(R,{children:e.jsx(A,{className:"text-lg",children:"Your income"})}),e.jsxs(g,{className:"space-y-5",children:[e.jsx(h,{id:"m-income",label:"Gross monthly income",prefix:"S$",value:u,onChange:K,step:500,hint:"Combined, for joint borrowers."}),e.jsx(h,{id:"m-debts",label:"Other monthly debt repayments",prefix:"S$",value:p,onChange:U,step:100,hint:"Car loans, other property loans, card minimums."})]})]})]}),results:e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-4",children:[e.jsx(M,{label:"Monthly instalment",value:s(a.monthly),accent:"blue",helper:`${s(a.loan)} at ${l.toFixed(2)}% over ${n} years`}),e.jsx(M,{label:"Total interest",value:s(a.schedule.totalInterest),accent:"gold",helper:"if the rate never changes"}),e.jsx(M,{label:"Downpayment",value:s(a.downpayment),helper:`at least ${s(a.cashMin)} in cash`})]}),e.jsx(b,{className:a.afford.passes?"border-emerald-200 bg-emerald-50/50":"border-rose-200 bg-rose-50/50",children:e.jsxs(g,{className:"p-5 text-sm space-y-1",children:[e.jsx("p",{className:"font-semibold text-slate-900",children:a.afford.passes?"Within the MAS limits":"Over the MAS limits"}),e.jsxs("p",{children:["At the ",Z,"% stress rate the instalment is ",s(a.afford.stressInstalment),". That puts your TDSR at ",a.afford.tdsr.toFixed(1),"% (cap ",ee,"%)",a.afford.msr!==null?` and your MSR at ${a.afford.msr.toFixed(1)}% (cap ${ae}%)`:"","."]}),e.jsxs("p",{children:["On this income the largest loan that fits is about ",s(a.maxLoan),"."]})]})}),a.lim.lower&&e.jsxs("p",{className:"text-sm text-amber-800",children:["The lower LTV limit applies because the loan runs past ",r==="hdb"?25:30," years or past age 65."]}),e.jsx(O,{title:"If the rate moves",headers:["Rate","Monthly instalment","Change"],rows:[-.5,0,.5,1,2].map(t=>{const m=S(a.loan,Math.max(0,l+t),n);return[`${Math.max(0,l+t).toFixed(2)}%`,s(m),t===0?"-":s(m-a.monthly)]}),highlight:1}),e.jsxs(b,{children:[e.jsx(R,{children:e.jsx(A,{className:"text-lg",children:"Interest and principal each year"})}),e.jsx(g,{children:e.jsx("div",{className:"h-64",children:e.jsx(re,{width:"100%",height:"100%",children:e.jsxs(ne,{data:a.schedule.schedule,children:[e.jsx(le,{strokeDasharray:"3 3",stroke:"#e2e8f0"}),e.jsx(ie,{dataKey:"year",stroke:"#64748b"}
1),e.jsx(he,{tickFormatter:t=>t>=1e3?`${(t/1e3).toFixed(0)}K`:String(t),stroke:"#64748b"}),e.jsx(me,{formatter:t=>s(t),labelFormatter:t=>`Year ${t}`}),e.jsx(de,{}),e.jsx(L,{dataKey:"principalPaid",name:"Principal",stackId:"a",fill:"#3b82f6"}),e.jsx(L,{dataKey:"interestPaid",name:"Interest",stackId:"a",fill:"#f59e0b"})]})})})})]})]}),footer:e.jsxs("div",{className:"space-y-6",children:[e.jsx(O,{title:"MAS loan-to-value limits for bank loans",headers:["Housing loans you owe","LTV","Minimum cash"],rows:te.map(([t,m,i,f],V)=>[["None","One","Two or more"][V],`${t}% or ${m}%`,i===f?`${i}%`:`${i}% or ${f}%`]),note:"The lower figure applies if the tenure runs past 30 years (25 for HDB flats) or past the borrower's 65th birthday. The rest of the downpayment can come from CPF."}),e.jsx(F,{title:"Worked example",tone:"blue",children:e.jsxs("p",{children:["A S$1,500,000 condo with a 75% loan of S$1,125,000 over 30 years. At 3M SORA of ",d.rate.toFixed(4),"% plus a 0.5% spread, the rate is ",(d.rate+.5).toFixed(2),"% and the instalment is about ",s(S(1125e3,d.rate+.5,30))," a month. The downpayment is S$375,000, of which at least S$75,000 must be cash. At the 4% stress rate the instalment is ",s(S(1125e3,4,30)),", so the borrower needs about ",s(S(1125e3,4,30)/.55)," a month in income to stay within the 55% TDSR."]})}),e.jsx(F,{title:"How SORA loans are priced",children:e.jsxs("ul",{children:[e.jsx("li",{children:"Floating packages charge compounded SORA plus a fixed spread. Your rate moves up and down with SORA."}),e.jsxs("li",{children:["The 3-month compounded SORA published by MAS on ",d.published," was ",d.rate.toFixed(4),"%."]}),e.jsx("li",{children:"Banks test whether you can afford the loan at 4% or the actual rate, whichever is higher, even when you pay less."})]})}),e.jsx(oe,{checked:se,sources:[w.masSora,w.masLoanRules,w.masMsrTdsr,w.masFloor2022]}),e.jsxs("div",{className:"grid gap-6 sm:grid-cols-2",children:[e.jsx(B,{title:"Related calculators",links:[{to:"/calculators/hdb-loan",label:"HDB loan calculator"},{to:"/calculators/stamp-duty",label:"Stamp duty calculator (BSD + ABSD)"},{to:"/calculators/bto-affordability",label:"BTO affordability calculator"},{to:"/calculators/rent-vs-buy",label:"Rent vs buy calculator"}]}),e.jsx(B,{title:"Related guides",links:[{to:"/blog/3m-sora",label:"3M SORA explained"},{to:"/blog/sora-trend-ms",label:"SORA trend"},{to:"/blog/should-you-pay-off-your-mortgage-or-invest-first",label:"Pay off the mortgage or invest first?"}]})]})]})})};export{Ze 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.