/* ========================= Decoramic — Tile Calculator UX polish Purpose: improve scannability + quick access ========================= */ /* Top skip link */ .dc-skip-wrap{display:flex; justify-content:flex-end; margin:.25rem 0 0} .dc-skip{ display:inline-flex; align-items:center; gap:.5rem; padding:.4rem .8rem; border-radius:999px; border:1px solid rgba(0,0,0,.08); background:#fff; text-decoration:none; font-weight:600; } .dc-skip:hover{box-shadow:0 2px 6px rgba(0,0,0,.06)} /* Headings & lists readability (uses your theme typography) */ .entry-content h2{margin-top:1.75rem} .entry-content h3{margin-top:1.25rem} .entry-content ol{padding-left:1.2rem; line-height:1.6} .entry-content ul{padding-left:1.2rem; line-height:1.6} /* Calculator card (light touch) */ .decocalc{border-radius:14px; border:1px solid #e9e9e9; box-shadow:0 1px 2px rgba(0,0,0,.03)} .decocalc .kpi{background:#fff} /* Sticky mobile pill */ .dc-sticky-open{ position:fixed; inset:auto 1rem 1rem auto; z-index:1000; display:none; padding:.7rem 1rem; border-radius:999px; border:1px solid rgba(0,0,0,.08); background:var(--mfn-btn-bg, #111); color:#fff; font-weight:700; box-shadow:0 6px 16px rgba(0,0,0,.15); } @media (max-width: 900px){ .dc-sticky-open{display:inline-flex} } /* Respect motion preferences */ @media (prefers-reduced-motion:no-preference){ html{scroll-behavior:smooth} }

Online Tile Calculator

Planning a wall or floor? Use our free Online Tile Calculator to estimate tiles, boxes and materials in a few clicks. Add rooms, choose your layout (straight, brick or herringbone), and include wastage. We’ll also estimate adhesive and grout per m² and help you jump straight to the right tiles, samples or expert advice.


How to measure your room

  1. Floors: measure the length and width, then multiply (L × W). If the space has sections or alcoves, measure each part and add the totals.
  2. Walls: measure width × height per wall. Subtract doors, windows and large openings.
  3. Add wastage: allow at least 10% for cuts and breakages. For patterns like herringbone or diagonal, add a little more.

Tip: our calculator supports multiple areas and lets you choose the layout so it can add an extra allowance for trickier patterns.

Doors, windows and boxed-in areas

Subtract the area of big openings. Small outlets usually get covered by cuts, but anything sizeable is best removed from your measurements. Steps, ledges and niches should be added as separate areas.


Tile sizes, layouts and extra wastage

Different patterns can increase offcuts:

  • Straight/Grid: usually fine with 10% wastage.
  • Brick/Staggered: plan a little extra.
  • Diagonal & Herringbone: expect more cuts around edges; allow several percent extra.

Joint width: a tighter joint uses less grout, a wider joint uses more. Our results include a typical grout allowance, but always double-check with your tiler on the day.


Boxes, grout and adhesive — what to order

Tiles are often sold by the box. You can enter tiles per box or m² per box and we’ll round up, so you can order complete boxes without running short.

  • Adhesive: coverage varies with substrate and trowel size. Our calculator uses a sensible per-m² guide to get you close.
  • Grout: depends on joint width and tile thickness; our estimate is a practical starting point.

Once you’ve calculated, use the links below to find matching products or request help.


Choose your tiles

Prefer help? Send us your room sizes and a photo — we’ll double-check your estimate and suggest the best options.


FAQs

How accurate is the Tile Calculator?

It’s a planning guide. Real rooms vary, and patterns or tricky edges can change the final quantity. Please confirm with your tiler before ordering.

Do I always need 10% wastage?

10% is a good starting point for straight layouts. Add more for herringbone, diagonal or very cut-heavy rooms.

Can I use feet and inches?

Yes. Switch to imperial in the calculator and we’ll convert everything into m² for you.

What about stairs, alcoves and niches?

Add them as separate areas. For stairs, measure each tread and riser size, then multiply by the number of steps.

How many boxes should I order?

Enter tiles per box or m² per box and we’ll round up to whole boxes. This avoids colour batch differences from topping up later.

How much adhesive and grout do I need?

Our calculator estimates per m² based on typical coverage. Adhesive depends on trowel size and substrate; grout depends on joint width and tile thickness.

Is marble suitable for bathrooms and kitchens?

Yes, with the right care. Polished marble looks stunning but may need sealing and cautious cleaning. If you want lower maintenance, consider marble-effect porcelain.

Do you offer samples and advice?

Of course. Order samples or message us with your plan and we’ll help you choose.

/* Keep styling light; inherit theme look & feel */ .decocalc{--gap:1rem; --radius:12px; --border:#e6e6e6; --muted:#6b7280} .decocalc{font:inherit; color:inherit; background:#fff; border:1px solid var(--border); border-radius:var(--radius); padding:clamp(1rem,2vw,1.25rem); box-shadow:0 1px 2px rgba(0,0,0,.03); max-width:980px; margin:1rem auto} .decocalc h3{margin:.25rem 0 1rem; font-size:1.25rem} .decocalc .row{display:grid; gap:var(--gap)} .decocalc .grid-2{grid-template-columns:repeat(2, minmax(0,1fr))} .decocalc .grid-3{grid-template-columns:repeat(3, minmax(0,1fr))} .decocalc label{display:block; font-weight:600; margin-bottom:.35rem} .decocalc .muted{color:var(--muted); font-weight:400} .decocalc input, .decocalc select{width:100%; padding:.6rem .7rem; border:1px solid var(--border); border-radius:10px; background:#fff; font:inherit} .decocalc .inline{display:flex; gap:.5rem; align-items:center} .decocalc .badge{font-size:.85rem; padding:.2rem .5rem; border:1px solid var(--border); border-radius:999px} .decocalc .areas{display:flex; flex-direction:column; gap:.75rem} .decocalc .area-card{border:1px dashed var(--border); border-radius:12px; padding:.75rem} .decocalc .controls{display:flex; gap:.5rem; flex-wrap:wrap} .decocalc .button, .decocalc button{cursor:pointer; border:1px solid var(--border); background:#f8f8f8; padding:.6rem .9rem; border-radius:999px} .decocalc .button.primary{background:var(--mfn-btn-bg, #111); color:#fff; border-color:var(--mfn-btn-bg, #111)} .decocalc details{border:1px solid var(--border); border-radius:12px; padding:.75rem} .decocalc summary{cursor:pointer; font-weight:600} .decocalc .results{margin-top:1rem; border-top:1px solid var(--border); padding-top:1rem} .decocalc .kpis{display:grid; gap:var(--gap); grid-template-columns:repeat(2, minmax(0,1fr))} .decocalc .kpi{border:1px solid var(--border); border-radius:12px; padding:1rem} .decocalc .kpi h4{margin:0 0 .25rem; font-size:1.1rem} .decocalc .small{font-size:.9rem} .decocalc .right{justify-content:flex-end} @media (max-width:720px){ .decocalc .grid-2,.decocalc .grid-3,.decocalc .kpis{grid-template-columns:1fr} .decocalc .right{justify-content:flex-start} }

Tile Calculator

Metric (m / mm) Imperial (ft / in)
Straight / Grid Brick / Staggered Diagonal Herringbone / Parquet
We’ll bump wastage slightly for trickier layouts.
Areas to cover (add rooms/walls)
Enter length × width (or type an area directly).
mm
mm
mm
Used only for coverage guidance (not for tile count).
If both are filled, we’ll use m² per box.
Adhesive kg/m² (default 3.7)
Grout kg/m² (default 0.571)
Results include wastage and are a guide only. Please confirm quantities with your tiler before ordering.
(function(){ const $ = (sel,ctx=document)=>ctx.querySelector(sel); const $$ = (sel,ctx=document)=>Array.from(ctx.querySelectorAll(sel)); const el = $('#decoramic-tile-calculator'); // Prefill from data-attributes if present const prefill = { tileWmm: parseFloat(el.dataset.tileWidthMm||''), tileHmm: parseFloat(el.dataset.tileLengthMm||''), tilesPerBox: parseFloat(el.dataset.tilesPerBox||''), sqmPerBox: parseFloat(el.dataset.sqmPerBox||'') }; const areasWrap = $('#dc-areas'); const addBtn = $('#dc-add-area'); const unitSel = $('#dc-unit'); const wastageInp = $('#dc-wastage'); const layoutSel = $('#dc-layout'); const tileW = $('#dc-tile-w'), tileH = $('#dc-tile-h'), gap = $('#dc-gap'); const tilesPerBox = $('#dc-tiles-per-box'), sqmPerBox = $('#dc-sqm-per-box'); const adh = $('#dc-adh-kg'), grout = $('#dc-grout-kg'); const calcBtn = $('#dc-calc'), resetBtn = $('#dc-reset'); const kpis = $('#dc-kpis'); const foot = $('#dc-footnote'); // Area row template function areaRow(i){ const row = document.createElement('div'); row.className = 'area-card'; row.innerHTML = `
Enter one row as L×W or an Area.
m / m²
`; // remove $('.dc-remove',row).addEventListener('click',()=>{ row.remove(); announce('Area removed'); }); return row; } // Add first row on init function addArea(){ areasWrap.appendChild(areaRow($$('.area-card',areasWrap).length+1)); } addBtn.addEventListener('click', addArea); addArea(); // Unit switching function updateUnitBadges(){ const metric = unitSel.value === 'metric'; $('#dc-tile-w-unit').textContent = metric ? 'mm' : 'in'; $('#dc-tile-h-unit').textContent = metric ? 'mm' : 'in'; $('#dc-gap-unit').textContent = metric ? 'mm' : 'in'; $$('.area-card').forEach(card=>{ $('#unit-badge',card).textContent = metric ? 'm / m²' : 'ft / ft²'; $$('input',card).forEach(inp=>{ inp.placeholder = metric ? inp.placeholder : inp.placeholder; }); }); } unitSel.addEventListener('change', updateUnitBadges); updateUnitBadges(); // Prefill if provided if(!Number.isNaN(prefill.tileWmm)) tileW.value = prefill.tileWmm; if(!Number.isNaN(prefill.tileHmm)) tileH.value = prefill.tileHmm; if(!Number.isNaN(prefill.tilesPerBox)) tilesPerBox.value = prefill.tilesPerBox; if(!Number.isNaN(prefill.sqmPerBox)) sqmPerBox.value = prefill.sqmPerBox; // Helpers: unit conversions const toM = (val, metric)=> metric ? parseFloat(val||0) : parseFloat(val||0) * 0.3048; const toMM = (val, metric)=> metric ? parseFloat(val||0) : parseFloat(val||0) * 25.4; const toM2FromLW = (L,W,metric)=>{ const l = toM(L,metric), w = toM(W,metric); return (l>0 && w>0) ? l*w : 0; }; const toM2 = (area, metric)=> metric ? parseFloat(area||0) : parseFloat(area||0) * 0.09290304; // Layout wastage bump (in %) function layoutBump(layout){ switch(layout){ case 'staggered': return 2; case 'diagonal' : return 3; case 'herringbone': return 5; default: return 0; } } function sumAreas(){ const metric = unitSel.value==='metric'; let total = 0; $$('.area-card',areasWrap).forEach(card=>{ const [L,W,A] = $$('input',card); const aLW = toM2FromLW(L.value, W.value, metric); const a = parseFloat(A.value||0); const aDirect = a>0 ? toM2(a, metric) : 0; total += (aDirect>0 ? aDirect : aLW); }); return total; } function tileAreaM2(){ const metric = unitSel.value==='metric'; const w = toMM(tileW.value, metric); const h = toMM(tileH.value, metric); if(w>0 && h>0){ return (w/1000)*(h/1000); // mm -> m } return 0; } function announce(msg){ // Assistive announcement; could be expanded foot.setAttribute('data-msg', msg); } function pushGA4(name, params){ try{ window.dataLayer = window.dataLayer || []; window.dataLayer.push({event: name, ...params}); }catch(e){} } function format(n, dp=2){ if(!Number.isFinite(n)) return '0'; return new Intl.NumberFormat(undefined,{minimumFractionDigits:dp, maximumFractionDigits:dp}).format(n); } function calc(){ const metric = unitSel.value==='metric'; const layout = layoutSel.value; const baseWaste = Math.max(0, Math.min(25, parseFloat(wastageInp.value||0))); const totalWaste = baseWaste + layoutBump(layout); let areaNet = sumAreas(); // m² if(areaNet<=0){ kpis.innerHTML = `
Please add at least one area.
`; return; } // Apply wastage const areaWithWaste = areaNet * (1 + totalWaste/100); // Tiles + Boxes const tArea = tileAreaM2(); let tilesNeeded = tArea>0 ? Math.ceil(areaWithWaste / tArea) : 0; let boxesNeeded = 0; const sqmBox = parseFloat(sqmPerBox.value||0); const tPerBox = parseFloat(tilesPerBox.value||0); if(sqmBox>0){ boxesNeeded = Math.ceil(areaWithWaste / sqmBox); }else if(tPerBox>0 && tilesNeeded>0){ boxesNeeded = Math.ceil(tilesNeeded / tPerBox); } // Materials const adhKg = Math.max(0, parseFloat(adh.value||0)); const groutKg = Math.max(0, parseFloat(grout.value||0)); const adhTotal = areaWithWaste * adhKg; const groutTotal = areaWithWaste * groutKg; // Joint hint (purely informational) const joint = toMM(gap.value||0, metric); // KPIs render kpis.innerHTML = `

Total area (net)

${format(areaNet,2)} m²
Before wastage

Area incl. wastage

${format(areaWithWaste,2)} m²
Wastage = ${totalWaste}% (${layoutBump(layout)}% layout bump)

Tiles needed

${tilesNeeded>0? tilesNeeded : '—'}
${tArea>0? `Tile size: ${tileW.value||'?'}×${tileH.value||'?'} ${metric?'mm':'in'}` : 'Enter tile size for tile count'}

Boxes to order

${boxesNeeded>0? boxesNeeded : '—'}
${sqmBox>0? `${format(sqmBox,2)} m²/box` : (tPerBox>0? `${tPerBox} tiles/box`:'Fill box info for box count')}

Adhesive

${format(adhTotal,1)} kg
${adhKg} kg/m²

Grout

${format(groutTotal,1)} kg
${groutKg} kg/m²${joint? ` • Joint ~ ${format(joint,1)} mm`:''}
`; announce('Calculation complete'); pushGA4('tile_calc_submit',{ calc_areas: $$('.area-card').length, area_net_m2: +areaNet.toFixed(2), area_inc_waste_m2: +areaWithWaste.toFixed(2), wastage_percent: totalWaste, unit_system: metric ? 'metric' : 'imperial', tile_area_m2: tArea>0? +tArea.toFixed(4) : 0, tiles_needed: tilesNeeded||0, boxes_needed: boxesNeeded||0 }); } // Events calcBtn.addEventListener('click', calc); resetBtn.addEventListener('click', ()=>{ $$('.area-card').forEach(a=>a.remove()); addArea(); [tileW,tileH,gap,tilesPerBox,sqmPerBox].forEach(i=>i.value=''); wastageInp.value=10; layoutSel.value='straight'; kpis.innerHTML=''; announce('Calculator reset'); }); // Enter-to-calc on inputs $$('#decoramic-tile-calculator input').forEach(inp=>{ inp.addEventListener('keydown', e=>{ if(e.key==='Enter'){ e.preventDefault(); calc(); } }); }); })();
/* ========================================== Decoramic — Scroll helpers for Calculator - Smooth-scroll to the calculator - Sticky "Open Tile Calculator" pill hides when calc is on screen - No dependencies ========================================== */ (function(){ const calc = document.getElementById('decoramic-tile-calculator'); const stickyBtn = document.getElementById('dc-sticky-open'); if(!calc || !stickyBtn) return; // Click → scroll to calculator function goToCalc(e){ e.preventDefault(); calc.scrollIntoView({behavior:'smooth', block:'start'}); } stickyBtn.addEventListener('click', goToCalc); // Hide sticky pill when calculator is visible const io = new IntersectionObserver((entries)=>{ entries.forEach(entry=>{ if(entry.target !== calc) return; if(entry.isIntersecting){ stickyBtn.style.opacity='0'; stickyBtn.style.pointerEvents='none'; } else { stickyBtn.style.opacity='1'; stickyBtn.style.pointerEvents='auto'; } }); }, {root:null, threshold:0.2}); io.observe(calc); // Also hide after a calculation event (from the calculator script) window.addEventListener('tile_calc_submit', ()=>{ stickyBtn.style.opacity='0'; stickyBtn.style.pointerEvents='none'; }, {once:true}); })();