(function(){
var html = `
Free Property Valuation — Caucasus Elite Estate
:root{
--ink:#012B53; --ink-2:#0A3563; --panel:#06305A; --line:#17497B;
--brass:#D9B85C; --brass-soft:#E7C766; --cream:#F1EAD8;
--stone:#A6B6C9; --stone-dim:#6E829B;
--shadow:0 24px 60px -30px rgba(0,0,0,.8); --r:14px;
}
*{box-sizing:border-box;margin:0;padding:0}
html{-webkit-text-size-adjust:100%}
body{
background:
radial-gradient(120% 90% at 82% -8%, rgba(198,161,91,.10), transparent 55%),
radial-gradient(90% 70% at 0% 110%, rgba(198,161,91,.05), transparent 60%),
var(--ink);
color:var(--cream);
font-family:"Manrope",system-ui,sans-serif;
line-height:1.5; padding:clamp(16px,3vw,44px); min-height:100vh;
}
.shell{max-width:1120px;margin:0 auto}
.masthead{margin-bottom:clamp(20px,3vw,34px)}
.brand{display:flex;align-items:center;gap:12px;letter-spacing:.22em;font-size:11px;text-transform:uppercase;color:var(--brass-soft);font-weight:600}
.brand .dot{width:5px;height:5px;border-radius:50%;background:var(--brass)}
.lede{margin-top:14px;max-width:660px}
.lede h1{font-family:"Cormorant Garamond",serif;font-weight:500;font-size:clamp(31px,5vw,54px);line-height:1.02;color:var(--cream)}
.lede h1 em{font-style:italic;color:var(--brass-soft)}
.lede p{margin-top:14px;color:var(--stone);font-size:15px;max-width:560px}
.grid{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.02fr);gap:clamp(16px,2vw,26px);margin-top:clamp(22px,3vw,34px);align-items:start}
@media(max-width:860px){.grid{grid-template-columns:1fr}}
.card{background:linear-gradient(180deg,var(--ink-2),var(--panel));border:1px solid var(--line);border-radius:var(--r);box-shadow:var(--shadow)}
.card-pad{padding:clamp(20px,2.4vw,30px)}
.eyebrow{font-size:10.5px;letter-spacing:.24em;text-transform:uppercase;color:var(--stone-dim);font-weight:600;margin-bottom:20px;display:flex;align-items:center;gap:10px}
.eyebrow::after{content:"";flex:1;height:1px;background:var(--line)}
.field{margin-bottom:22px}
.field:last-child{margin-bottom:0}
label.lbl{display:flex;justify-content:space-between;align-items:baseline;font-size:13px;color:var(--cream);font-weight:600;margin-bottom:9px;gap:12px}
label.lbl .val{font-family:"Cormorant Garamond",serif;font-size:20px;color:var(--brass-soft);font-weight:600;font-style:italic;white-space:nowrap}
label.lbl .opt{font-size:11px;font-weight:500;color:var(--stone-dim);text-transform:none;letter-spacing:0}
select,input[type=text]{width:100%;background:var(--ink);border:1px solid var(--line);border-radius:10px;color:var(--cream);font-family:"Manrope",sans-serif;font-size:14px;font-weight:500;padding:13px 14px;outline:none}
select{appearance:none;font-weight:600;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='7'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%23c6a15b' stroke-width='1.5' fill='none'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 14px center;cursor:pointer}
select:focus,input[type=text]:focus{border-color:var(--brass);box-shadow:0 0 0 3px rgba(198,161,91,.14)}
input::placeholder{color:var(--stone-dim)}
input[type=range]{-webkit-appearance:none;appearance:none;width:100%;height:2px;background:var(--line);border-radius:2px;outline:none}
input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:18px;height:18px;border-radius:50%;background:var(--brass);border:3px solid var(--ink-2);cursor:pointer;box-shadow:0 0 0 1px var(--brass)}
input[type=range]::-moz-range-thumb{width:15px;height:15px;border-radius:50%;background:var(--brass);border:3px solid var(--ink-2);cursor:pointer}
.seg{display:grid;grid-auto-flow:row;grid-template-columns:1fr 1fr;gap:6px;background:var(--ink);border:1px solid var(--line);border-radius:10px;padding:5px}
@media(max-width:420px){.seg{grid-template-columns:1fr}}
.seg button{font-family:inherit;font-size:12px;font-weight:600;color:var(--stone);background:transparent;border:0;border-radius:7px;padding:11px 6px;cursor:pointer;transition:.18s}
.seg button[aria-pressed=true]{background:linear-gradient(180deg,#0E4076,#0A3563);color:var(--brass-soft);box-shadow:inset 0 0 0 1px var(--line)}
.seg button:hover{color:var(--cream)}
.hint{font-size:11.5px;color:var(--stone-dim);margin-top:7px}
.contact-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px}
@media(max-width:520px){.contact-grid{grid-template-columns:1fr}}
/* Result */
.est{position:relative;overflow:hidden}
.est::before{content:"";position:absolute;inset:0;background:radial-gradient(80% 60% at 90% 0%,rgba(198,161,91,.10),transparent 60%);pointer-events:none}
.prop-line{font-family:"Cormorant Garamond",serif;font-size:19px;font-style:italic;color:var(--brass-soft);margin-bottom:20px;border-bottom:1px solid var(--line);padding-bottom:16px}
.est-cap{font-size:11px;letter-spacing:.2em;text-transform:uppercase;color:var(--stone-dim);font-weight:600}
.est-range{font-family:"Cormorant Garamond",serif;font-weight:600;font-size:clamp(34px,6vw,52px);line-height:1.05;color:var(--cream);margin-top:8px}
.est-range .dash{color:var(--brass);font-style:italic;padding:0 4px}
.est-mid{margin-top:10px;font-size:13.5px;color:var(--stone)}
.est-mid b{color:var(--brass-soft);font-weight:600}
.house-title{font-family:"Cormorant Garamond",serif;font-weight:600;font-size:clamp(26px,4.5vw,38px);line-height:1.1;color:var(--cream);margin-top:8px}
.house-desc{font-size:13.5px;color:var(--stone);margin-top:12px;line-height:1.6}
.bonus{margin-top:20px;display:flex;justify-content:space-between;align-items:baseline;background:var(--ink);border:1px solid var(--line);border-radius:10px;padding:13px 16px}
.bonus .bk{font-size:12.5px;color:var(--stone)}
.bonus .bv{font-family:"Cormorant Garamond",serif;font-size:20px;color:var(--brass-soft);font-weight:600}
.loc-warn{margin-top:22px;display:flex;gap:14px;align-items:flex-start;background:var(--ink);border:1px solid var(--line);border-left:2px solid var(--brass);border-radius:12px;padding:14px 18px}
.loc-warn .lw-icon{flex:0 0 auto;color:var(--brass);font-size:16px;line-height:1.6}
.loc-warn .lw-t{font-size:12.5px;font-weight:600;color:var(--cream)}
.loc-warn .lw-d{font-size:12px;color:var(--stone);margin-top:5px;line-height:1.55}
.cta{margin-top:24px}
a.btn{display:flex;align-items:center;justify-content:center;gap:10px;width:100%;text-decoration:none;font-weight:700;font-size:15px;padding:16px;border-radius:12px;transition:.18s}
a.wa{background:linear-gradient(180deg,#E4C45F,#C79A3A);color:#04213E;box-shadow:0 12px 30px -12px rgba(198,161,91,.6)}
a.wa:hover{filter:brightness(1.06);transform:translateY(-1px)}
a.email{margin-top:11px;background:transparent;border:1px solid var(--line);color:var(--brass-soft)}
a.email:hover{border-color:var(--brass)}
a.btn:focus-visible{outline:3px solid rgba(198,161,91,.5);outline-offset:2px}
.cta .note{margin-top:12px;text-align:center;font-size:12px;color:var(--stone-dim)}
.sources{margin-top:22px;font-size:11px;line-height:1.65;color:var(--stone-dim);border-top:1px solid var(--line);padding-top:14px}
.sources .src-t{font-size:10px;letter-spacing:.2em;text-transform:uppercase;color:var(--stone);font-weight:600;margin-bottom:5px}
.sources .src-d{font-style:italic}
.disclaimer{margin-top:16px;font-size:11.5px;line-height:1.6;color:var(--stone-dim);border-top:1px solid var(--line);padding-top:16px}
.footer{margin-top:30px;text-align:center;font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--stone-dim)}
@media (prefers-reduced-motion:reduce){*{transition:none!important}}
(function(){
/* Proprietary — © 2026 Caucasus Elite Estate LLC. */
var __CEE_OWNER__ = "© 2026 Caucasus Elite Estate LLC — caucasusestate.ge — all rights reserved";
try { console.info("%c Caucasus Elite Estate — © 2026 — caucasusestate.ge ", "color:#D9B85C"); } catch(e){}
var WHATSAPP = "995577940068";
var EMAIL = "contact@cel.estate";
var LANG = "en"; // "ru" / "ka" once dictionaries are added
/* SAME MARKET MATRIX as the investment simulator — keep the two files in sync.
psqm = sale price $/m² by condition · rent = long-term rent $/m²/month. */
var MARKET = {
mtatsminda: { rent: 12.0, psqm: { new: 2500, white: 2100, black: 1900, old: 2200 } },
sololaki: { rent: 11.5, psqm: { new: 2400, white: 2000, black: 1850, old: 2100 } },
vera: { rent: 12.0, psqm: { new: 2300, white: 1950, black: 1750, old: 2000 } },
vake: { rent: 13.5, psqm: { new: 2350, white: 2000, black: 1800, old: 2250 } },
saburtalo: { rent: 11.5, psqm: { new: 1700, white: 1450, black: 1300, old: 1500 } },
lisi: { rent: 8.0, psqm: { new: 1600, white: 1400, black: 1250, old: 1300 } },
chugureti: { rent: 10.5, psqm: { new: 2200, white: 1700, black: 1500, old: 1450 } },
ortachala: { rent: 9.5, psqm: { new: 1750, white: 1500, black: 1350, old: 1350 } },
isani: { rent: 9.5, psqm: { new: 1400, white: 1200, black: 1100, old: 1200 } },
dighomi: { rent: 8.5, psqm: { new: 1200, white: 1050, black: 950, old: 1000 } }
};
// Floor / position modifier on value
var FLOOR_MOD = { ground: 0.95, mid: 1.00, top: 1.04 };
// Balcony/terrace valued at a fraction of the interior rate (common market practice)
var BALCONY_FRACTION = 0.50;
// Range width around the point estimate (district spread is wide)
var RANGE_LOW = 0.90, RANGE_HIGH = 1.12;
var RENT_MULT = { new: 1.10, white: 1.05, black: 1.05, old: 0.90 };
var I18N = {
en: {
brand: "Caucasus Elite Estate — Tbilisi",
headline: 'What is your Tbilisi property worth today?',
intro: "Get an instant indicative range based on current district market data — then a precise, obligation-free valuation from our team.",
inputsEyebrow: "Your property",
modeQ: "What would you like to estimate?",
modeSale: "Sale value", modeRent: "Rental amount",
roleQ: "You are",
roleOwner: "An owner (renting out)", roleTenant: "Looking to rent",
headlineSale: 'What is your Tbilisi property worth today?',
introSale: "Get an instant indicative range based on current district market data — then a precise, obligation-free valuation from our team.",
headlineRent: 'What does a Tbilisi property like this rent for?',
introRentOwner: "See the going monthly rent for your property by district and type — then let us find you a reliable tenant, fast.",
introRentTenant: "See realistic monthly rents by district before you search — then let us send you the listings that match your budget.",
rentCap: "Estimated monthly rent",
rentMidLbl: "typical", perMo: "/month", perYr: "per year",
warnTitleRent: "Rents vary with the specifics",
warnDescRent: "Figures are a long-term, unfurnished baseline. A furnished, move-in-ready apartment typically adds 10–20%; floor, view, renovation quality and exact street also move the number. We confirm the realistic rent for your case, usually within 24 hours.",
district: "District",
districts: {
mtatsminda: "Mtatsminda · Old Town", sololaki: "Sololaki", vera: "Vera",
vake: "Vake", saburtalo: "Saburtalo", lisi: "Lisi · Lisi Lake", chugureti: "Chugureti · Marjanishvili",
ortachala: "Ortachala · Krtsanisi", isani: "Isani · Avlabari", dighomi: "Dighomi · Didi Dighomi"
},
condition: "Condition",
condNew: "New · turnkey", condWhite: "White frame", condBlack: "Black frame", condOld: "Existing · resale",
propertyType: "Property type",
typeApartment: "Apartment", typeHouse: "House / Villa",
area: "Interior area",
balcony: "Balcony / terrace", balconyNote: "Counted at ~50% of the interior rate — the realistic market practice, not full interior price.",
houseTitle: "Houses are valued individually",
houseDesc: "A house or villa depends on the plot, land value, construction and layout — a simple per-m² figure would mislead you. Send us the details below and we'll prepare a precise, obligation-free valuation, usually within 24 hours.",
floor: "Floor / position",
floorGround: "Ground / low", floorMid: "Mid floor", floorTop: "Top / penthouse",
address: "Address / building", addressPh: "Street, building, floor, apt — as precise as you like",
contactEyebrow: "So we can send your valuation",
name: "Name", namePh: "Your name",
phone: "Phone", optional: "(optional)", phonePh: "+995 …",
resultEyebrow: "Indicative estimate",
propLine: "{area} m² · {cond} · {district}",
estCap: "Estimated market value",
estMid: "mid-point",
rentBonusK: "Potential long-term rent",
warnTitle: "This is a starting range, not a valuation",
warnDesc: "The final figure depends on floor, view, natural light, exact street, renovation quality, building condition, layout and current demand. Our team confirms it precisely — usually within 24 hours.",
ctaWa: "Get my precise valuation on WhatsApp",
ctaEmail: "Or request it by email",
ctaNote: "Free and with no obligation.",
sourcesTitle: "Sources",
sourcesList: "District price levels: TBC Capital (Oct. 2025), Galt & Taggart, Colliers Georgia, Global Property Guide. Official registry: National Agency of Public Registry (NAPR). Market data as of July 2026.",
condNames: { new: "new turnkey", white: "white frame", black: "black frame", old: "existing resale" },
floorNames: { ground: "ground / low floor", mid: "mid floor", top: "top floor / penthouse" },
waMsg: {
greeting: "Hello, I would like a precise valuation of my property.",
greetingRentOwner: "Hello, I would like to rent out my property.",
greetingRentTenant: "Hello, I am looking to rent a property in Tbilisi.",
property: "Property", lookingFor: "Looking for", district: "District", floor: "Floor", addressLbl: "Address",
typeLbl: "Type", balconyLbl: "Balcony/terrace",
indicative: "Indicative range from your site", rentGuide: "Rent guide from your site", name: "Name",
closing: "Could you confirm the exact value and let me know the next steps? Thank you.",
closingRentOwner: "Could you find me a reliable tenant and let me know your terms? Thank you.",
closingRentTenant: "Could you send me the available rentals that match? Thank you."
},
emailSubject: "Property valuation request — {district}",
disclaimer: "This indicative range is generated from published district-level market data and does not constitute a formal appraisal, an offer, or a commitment on value. Actual sale prices vary significantly within each district. A precise valuation requires an inspection of the property. Figures shown as of July 2026."
}
// ru: { ... } ka: { ... }
};
var T = I18N[LANG];
var fmt = function(n){ return "$" + Math.round(n).toLocaleString("en-US"); };
var fmtK = function(n){ // round to nearest 1,000 for a cleaner range
return "$" + (Math.round(n/1000)*1000).toLocaleString("en-US");
};
var state = { mode: (window.CEE_INITIAL_MODE === "rent" ? "rent" : "sale"), role: "owner", district: "vera", cond: "new", type: "apartment", area: 80, balcony: 0, floor: "mid", name: "", phone: "", address: "" };
var RENT_LOW = 0.88, RENT_HIGH = 1.15; // monthly rent spread
function $(id){ return document.getElementById(id); }
function tpl(s, vars){ return s.replace(/\\{(\\w+)\\}/g, function(_,k){ return vars[k]; }); }
// static i18n (headline + intro are set by render() per mode)
document.querySelectorAll("[data-i18n]").forEach(function(el){
var k = el.getAttribute("data-i18n"); if(typeof T[k] === "string") el.textContent = T[k];
});
document.querySelectorAll("[data-i18n-ph]").forEach(function(el){
var k = el.getAttribute("data-i18n-ph"); if(typeof T[k] === "string") el.setAttribute("placeholder", T[k]);
});
Object.keys(MARKET).forEach(function(key){
var o = document.createElement("option"); o.value = key; o.textContent = T.districts[key];
$("district").appendChild(o);
});
$("district").value = state.district;
function compute(){
var m = MARKET[state.district];
var psqm = m.psqm[state.cond] * FLOOR_MOD[state.floor];
var interiorVal = psqm * state.area;
var balconyVal = psqm * BALCONY_FRACTION * state.balcony;
var mid = interiorVal + balconyVal;
var low = mid * RANGE_LOW, high = mid * RANGE_HIGH;
var rent = m.rent * RENT_MULT[state.cond] * state.area * FLOOR_MOD[state.floor];
var rentLow = rent * RENT_LOW, rentHigh = rent * RENT_HIGH;
return { psqm:psqm, mid:mid, low:low, high:high, rent:rent, rentLow:rentLow, rentHigh:rentHigh, balconyVal:balconyVal };
}
function render(){
var r = compute();
var isRent = (state.mode === "rent");
var isHouse = (state.type === "house");
// In rent mode we never show the house "valued individually" notice (rent per m² is defensible)
var showHouseNotice = isHouse && !isRent;
// Headline + intro adapt to mode/role
if(isRent){
$("headline").innerHTML = T.headlineRent;
$("introText").textContent = (state.role === "tenant") ? T.introRentTenant : T.introRentOwner;
} else {
$("headline").innerHTML = T.headlineSale;
$("introText").textContent = T.introSale;
}
// Show/hide controls
$("roleWrap").hidden = !isRent;
$("balconyWrap").style.display = (isRent || isHouse) ? "none" : "";
// Result blocks
$("numResult").hidden = isRent || showHouseNotice;
$("houseNotice").hidden = !showHouseNotice;
$("rentResult").hidden = !isRent;
// Warning box adapts
$("warnTitle").textContent = isRent ? T.warnTitleRent : T.warnTitle;
$("warnDesc").textContent = isRent ? T.warnDescRent : T.warnDesc;
$("balconyVal").textContent = state.balcony + " m²";
$("areaVal").textContent = state.area + " m²";
$("propLine").textContent = tpl(T.propLine, {
area: state.area, cond: T.condNames[state.cond], district: T.districts[state.district]
});
if(isRent){
$("rentLow").textContent = fmt(r.rentLow);
$("rentHigh").textContent = fmt(r.rentHigh);
$("rentMid").textContent = fmt(r.rent) + "/mo";
$("rentYear").textContent = fmt(r.rent * 12);
} else if(!showHouseNotice){
$("estLow").textContent = fmtK(r.low);
$("estHigh").textContent = fmtK(r.high);
$("estMid").textContent = fmt(r.mid);
$("psqmShown").textContent = fmt(r.psqm) + "/m²";
$("rentBonus").textContent = fmt(r.rent) + "/mo";
}
// ---- Build the lead message ----
var M = T.waMsg, greeting, closing, lines;
var propBits = "• " + M.typeLbl + ": " + (isHouse ? T.typeHouse : T.typeApartment) + "\\n" +
"• " + (isRent && state.role === "tenant" ? M.lookingFor : M.property) + ": " + state.area + " m², " + T.condNames[state.cond] +
(!isRent && !isHouse && state.balcony ? " + " + state.balcony + " m² " + M.balconyLbl : "") + "\\n" +
"• " + M.district + ": " + T.districts[state.district] + "\\n" +
(state.address && !(isRent && state.role === "tenant") ? "• " + M.addressLbl + ": " + state.address + "\\n" : "") +
"• " + M.floor + ": " + T.floorNames[state.floor];
if(isRent){
greeting = (state.role === "tenant") ? M.greetingRentTenant : M.greetingRentOwner;
closing = (state.role === "tenant") ? M.closingRentTenant : M.closingRentOwner;
lines = greeting + "\\n\\n" + propBits + "\\n" +
"• " + M.rentGuide + ": " + fmt(r.rentLow) + " – " + fmt(r.rentHigh) + " " + T.perMo;
} else {
greeting = M.greeting;
closing = M.closing;
lines = greeting + "\\n\\n" + (state.name ? "• " + M.name + ": " + state.name + "\\n" : "") + propBits +
(isHouse ? "" : "\\n• " + M.indicative + ": " + fmtK(r.low) + " – " + fmtK(r.high));
}
if(state.name && isRent){ lines = greeting + "\\n\\n" + "• " + M.name + ": " + state.name + "\\n" + lines.slice(greeting.length + 2); }
$("waLink").href = "https://wa.me/" + WHATSAPP + "?text=" + encodeURIComponent(lines + "\\n\\n" + closing);
var subject = tpl(T.emailSubject, { district: T.districts[state.district] });
var body = lines + (state.phone ? "\\n• Phone: " + state.phone : "") + "\\n\\n" + closing;
$("emailLink").href = "mailto:" + EMAIL +
"?subject=" + encodeURIComponent(subject) + "&body=" + encodeURIComponent(body);
}
$("district").addEventListener("change", function(e){ state.district = e.target.value; render(); });
function bindSeg(id, key){
var g = $(id);
g.querySelectorAll("button").forEach(function(btn){
btn.addEventListener("click", function(){
g.querySelectorAll("button").forEach(function(b){ b.setAttribute("aria-pressed","false"); });
btn.setAttribute("aria-pressed","true");
state[key] = btn.dataset[key];
render();
});
});
}
bindSeg("mode","mode");
bindSeg("role","role");
bindSeg("condition","cond");
bindSeg("floor","floor");
bindSeg("ptype","type");
$("area").addEventListener("input", function(){ state.area = parseFloat(this.value); render(); });
$("balcony").addEventListener("input", function(){ state.balcony = parseFloat(this.value); render(); });
$("cname").addEventListener("input", function(){ state.name = this.value.trim(); render(); });
$("cphone").addEventListener("input", function(){ state.phone = this.value.trim(); render(); });
$("caddr").addEventListener("input", function(){ state.address = this.value.trim(); render(); });
// reflect the initial mode on the toggle buttons
$("mode").querySelectorAll("button").forEach(function(b){
b.setAttribute("aria-pressed", b.dataset.mode === state.mode ? "true" : "false");
});
render();
})();
`;
var wrap = document.getElementById('cee-value');
var f = document.createElement('iframe');
f.setAttribute('title','Free Tbilisi Property Valuation'); f.setAttribute('loading','lazy'); f.setAttribute('scrolling','no');
f.style.cssText='width:100%;border:0;display:block;min-height:600px;overflow:hidden;';
f.srcdoc = html; wrap.appendChild(f);
var lastH=0, raf=0;
function apply(){
raf=0;
try{
var h=f.contentWindow.document.documentElement.scrollHeight;
/* grow immediately; only shrink on a BIG drop (mode/section change), never on tiny reflows */
if(h>lastH+2 || h<lastH-80){ lastH=h; f.style.height=h+'px'; }
}catch(e){}
}
function fit(){ if(!raf){ raf=requestAnimationFrame(apply); } }
f.addEventListener('load',function(){
fit();
try{
var w=f.contentWindow, d=w.document;
if(w.ResizeObserver){ new w.ResizeObserver(fit).observe(d.body); }
if(d.fonts&&d.fonts.ready){ d.fonts.ready.then(fit); }
/* NOTE: no window 'resize' listener — that misfired on mobile scroll and caused the jump */
}catch(e){}
});
})();

