Rose Cleaning Service logo on white background
Rose Cleaning Service logo on white background
#rcc-root{--rcc-blue:#EFEAE2;--rcc-blue-dark:#173C78;--rcc-light:#E8EFF9;--rcc-text:#123047;--rcc-muted:#5C6B7A;--rcc-border:#D3DEEA;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;color:var(--rcc-text);line-height:1.4}
#rcc-root{--rcc-blue:#1F4E9C;--rcc-blue-dark:#173C78;--rcc-light:#E8EFF9;--rcc-text:#1B2A3A;--rcc-muted:#5C6B7A;--rcc-border:#D3DEEA;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;color:var(--rcc-text);line-height:1.4} #rcc-root *{box-sizing:border-box} #rcc-root button,#rcc-root select,#rcc-root input{font-family:inherit} #rcc-root .rcc-open{background:var(--rcc-blue);color:#fff;border:0;border-radius:999px;padding:14px 28px;font-size:17px;font-weight:600;cursor:pointer;box-shadow:0 4px 14px rgba(31,78,156,.3);transition:background .15s,transform .15s} #rcc-root .rcc-open:hover{background:var(--rcc-blue-dark);transform:translateY(-1px)} #rcc-root .rcc-overlay{position:fixed;inset:0;background:rgba(15,30,50,.55);display:none;align-items:center;justify-content:center;padding:16px;z-index:999999} #rcc-root .rcc-overlay.show{display:flex} #rcc-root .rcc-modal{background:#fff;border-radius:16px;max-width:480px;width:100%;max-height:92vh;overflow-y:auto;padding:28px 24px 22px;position:relative;box-shadow:0 20px 50px rgba(0,0,0,.25)} #rcc-root .rcc-close{position:absolute;top:10px;right:14px;background:none;border:0;font-size:28px;color:var(--rcc-muted);cursor:pointer;line-height:1;padding:4px} #rcc-root h2{margin:0 0 2px;font-size:23px;color:var(--rcc-blue);font-weight:700} #rcc-root .rcc-sub{margin:0 0 20px;color:var(--rcc-muted);font-size:14px} #rcc-root .rcc-field{display:block;margin-bottom:16px} #rcc-root .rcc-label{display:block;font-size:14px;font-weight:600;margin-bottom:6px} #rcc-root select{width:100%;padding:11px 12px;border:1px solid var(--rcc-border);border-radius:10px;font-size:15px;background:#fff;color:var(--rcc-text)} #rcc-root select:focus,#rcc-root input:focus{outline:2px solid var(--rcc-blue);outline-offset:1px} #rcc-root .rcc-seg{display:flex;background:var(--rcc-light);border-radius:10px;padding:4px} #rcc-root .rcc-seg button{flex:1;border:0;background:none;padding:10px;border-radius:8px;font-size:15px;font-weight:600;color:var(--rcc-muted);cursor:pointer} #rcc-root .rcc-seg button.on{background:var(--rcc-blue);color:#fff} #rcc-root .rcc-extras{display:grid;grid-template-columns:1fr 1fr;gap:8px} #rcc-root .rcc-extras label,#rcc-root .rcc-win{display:flex;align-items:center;gap:8px;border:1px solid var(--rcc-border);border-radius:10px;padding:9px 10px;font-size:14px;cursor:pointer} #rcc-root .rcc-extras input{accent-color:var(--rcc-blue);width:16px;height:16px;margin:0;flex:none} #rcc-root .rcc-extras small,#rcc-root .rcc-win small{color:var(--rcc-muted)} #rcc-root .rcc-extras small{margin-left:auto;white-space:nowrap} #rcc-root .rcc-win{margin-top:8px;justify-content:space-between} #rcc-root .rcc-win input{width:70px;padding:7px 8px;border:1px solid var(--rcc-border);border-radius:8px;font-size:15px;text-align:center} #rcc-root .rcc-result{background:var(--rcc-light);border-radius:12px;padding:16px;text-align:center;margin:6px 0 14px} #rcc-root .rcc-result-label{display:block;font-size:13px;color:var(--rcc-muted);text-transform:uppercase;letter-spacing:.04em} #rcc-root .rcc-price{display:block;font-size:32px;font-weight:800;color:var(--rcc-blue);margin:4px 0} #rcc-root .rcc-note{display:block;font-size:13px;color:var(--rcc-muted);min-height:1em} #rcc-root .rcc-cta{display:block;text-align:center;background:var(--rcc-blue);color:#fff!important;text-decoration:none!important;padding:14px;border-radius:10px;font-weight:700;font-size:16px} #rcc-root .rcc-cta:hover{background:var(--rcc-blue-dark)} #rcc-root .rcc-disclaimer{font-size:12px;color:var(--rcc-muted);text-align:center;margin:10px 0 0} @media (max-width:420px){#rcc-root .rcc-extras{grid-template-columns:1fr}#rcc-root .rcc-modal{padding:24px 16px 18px}} (function(){ /* ======================= PRICES – EDIT HERE ======================= Each price is [without bed change, with bed change]. If both numbers are the same, the price is fixed. */ var MINIMUM = 160; var SIZES = [ { id: "s1", name: "1–2 bedrooms / 1 bathroom" }, { id: "s2", name: "3 bedrooms / 2 bathrooms" }, { id: "s3", name: "4 bedrooms / 2–3 bathrooms" }, { id: "s4", name: "5+ bedrooms", startingAt: true } ]; var SERVICES = [ { id: "weekly", name: "Weekly", label: "per visit", prices: { s1:[160,175], s2:[185,205], s3:[235,270], s4:[275,295] } }, { id: "biweekly", name: "Every 2 weeks", label: "per visit", prices: { s1:[180,195], s2:[205,230], s3:[260,300], s4:[305,330] } }, { id: "monthly", name: "Monthly", label: "per visit", prices: { s1:[200,200], s2:[250,250], s3:[320,320], s4:[395,395] } }, { id: "deep", name: "Deep Cleaning", label: "one-time", prices: { s1:[300,320], s2:[390,410], s3:[500,700], s4:[700,920] } }, { id: "move", name: "Move-in / Move-out", label: "one-time", prices: { s1:[600,640], s2:[780,820], s3:[1000,1400], s4:[1400,1840] } } ]; var EXTRAS = [ { id: "fridge", name: "Inside fridge", price: [50,50] }, { id: "oven", name: "Inside oven", price: [50,50] }, { id: "basement", name: "Basement", price: [50,75] }, { id: "organize", name: "Decluttering before cleaning", price: [30,30] } ]; var PRICE_PER_WINDOW = 10; var BOOKING_LINK = "https://rosecleaningservicepro.com/contact/"// put your booking page, contact form or WhatsApp link here /* ================================================================== */ var root = document.getElementById("rcc-root"); var $ = function(s){ return root.querySelector(s); }; var overlay = $("#rcc-overlay"); var bedChange = "no"; SERVICES.forEach(function(s, i){ var o = document.createElement("option"); o.value = s.id; o.textContent = s.name; if (s.id === "biweekly") o.selected = true; $("#rcc-service").appendChild(o); }); SIZES.forEach(function(s){ var o = document.createElement("option"); o.value = s.id; o.textContent = s.name; $("#rcc-size").appendChild(o); }); EXTRAS.forEach(function(e){ var l = document.createElement("label"); var tag = e.price[0] === e.price[1] ? "+$"+e.price[0] : "+$"+e.price[0]+"–"+e.price[1]; l.innerHTML = ' '+e.name+' '+tag+''; $("#rcc-extras").appendChild(l); }); $("#rcc-cta").href = BOOKING_LINK; function money(n){ return "$" + Math.round(n).toLocaleString("en-US"); } function calc(){ var svc = SERVICES.filter(function(s){ return s.id === $("#rcc-service").value; })[0]; var size = SIZES.filter(function(s){ return s.id === $("#rcc-size").value; })[0]; var base = svc.prices[size.id]; var b = bedChange === "yes" ? base[1] : base[0]; var lo = b, hi = b; root.querySelectorAll("#rcc-extras input:checked").forEach(function(c){ EXTRAS.forEach(function(e){ if (e.id === c.value){ lo += e.price[0]; hi += e.price[1]; } }); }); var win = Math.max(0, parseInt($("#rcc-win").value, 10) || 0); lo += win * PRICE_PER_WINDOW; hi += win * PRICE_PER_WINDOW; lo = Math.max(lo, MINIMUM); hi = Math.max(hi, MINIMUM); var txt = lo === hi ? money(lo) : money(lo) + " – " + money(hi); if (size.startingAt) txt = "From " + money(lo); $("#rcc-price").textContent = txt; $("#rcc-result-label").textContent = svc.label === "one-time" ? "Your estimate" : "Your estimate per cleaning"; $("#rcc-note").textContent = size.startingAt ? "Larger homes are quoted after a quick conversation." : ""; } root.querySelectorAll("#rcc-beds button").forEach(function(btn){ btn.addEventListener("click", function(){ root.querySelectorAll("#rcc-beds button").forEach(function(x){ x.classList.remove("on"); }); btn.classList.add("on"); bedChange = btn.getAttribute("data-v"); calc(); }); }); root.addEventListener("change", calc); $("#rcc-win").addEventListener("input", calc); function open(){ overlay.classList.add("show"); overlay.setAttribute("aria-hidden","false"); calc(); } function close(){ overlay.classList.remove("show"); overlay.setAttribute("aria-hidden","true"); } $("#rcc-open").addEventListener("click", open); $("#rcc-close").addEventListener("click", close); overlay.addEventListener("click", function(e){ if (e.target === overlay) close(); }); document.addEventListener("keydown", function(e){ if (e.key === "Escape") close(); }); calc(); })();