/* ---- Scoped to .tco-widget so it won't clash with your theme ---- */
.tco-widget{--tco-accent:#0a7d3c;--tco-accent-dark:#075e2d;--tco-lose:#b3401f;--tco-ink:#1c2530;--tco-muted:#6b7785;--tco-line:#e3e8ee;--tco-bg:#f6f9fc;
max-width:820px;margin:0 auto;padding:clamp(18px,4vw,34px);
font-family:inherit;color:var(--tco-ink);background:#fff;border-radius:18px;
box-shadow:0 10px 40px rgba(20,40,60,.10);box-sizing:border-box;}
.tco-widget *,.tco-widget *::before,.tco-widget *::after{box-sizing:border-box;}
.tco-hero{text-align:center;margin-bottom:14px;}
.tco-badge{display:inline-block;background:#fdece7;color:var(--tco-lose);font-weight:700;
font-size:13px;letter-spacing:.02em;padding:6px 14px;border-radius:999px;margin-bottom:12px;}
.tco-h2{font-size:clamp(22px,4vw,30px);line-height:1.15;margin:0 0 8px;font-weight:800;}
.tco-sub{color:var(--tco-muted);font-size:15px;margin:0 auto;max-width:560px;line-height:1.5;}
.tco-counter-wrap{background:linear-gradient(135deg,var(--tco-accent),var(--tco-accent-dark));
color:#fff;text-align:center;border-radius:14px;padding:22px 16px;margin:22px 0;}
.tco-counter-label{font-size:13px;text-transform:uppercase;letter-spacing:.08em;opacity:.9;}
.tco-counter{font-size:clamp(40px,9vw,64px);font-weight:800;line-height:1;margin:6px 0;letter-spacing:-.02em;}
.tco-counter-sub{font-size:13px;opacity:.9;}
.tco-controls{display:grid;grid-template-columns:1fr 1fr;gap:18px;margin-bottom:22px;}
@media(max-width:600px){.tco-controls{grid-template-columns:1fr;}}
.tco-control label{display:block;font-weight:700;font-size:14px;margin-bottom:8px;}
.tco-stepper{display:flex;align-items:stretch;border:1.5px solid var(--tco-line);border-radius:10px;overflow:hidden;width:170px;}
.tco-step{width:46px;border:0;background:var(--tco-bg);font-size:22px;font-weight:700;color:var(--tco-accent);cursor:pointer;line-height:1;}
.tco-step:hover{background:#eef4f0;}
.tco-stepper input{flex:1;border:0;text-align:center;font-size:18px;font-weight:700;width:100%;min-width:0;-moz-appearance:textfield;}
.tco-stepper input::-webkit-outer-spin-button,.tco-stepper input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0;}
.tco-slider-row{display:flex;align-items:center;gap:12px;}
.tco-slider-row input[type=range]{flex:1;accent-color:var(--tco-accent);height:6px;}
.tco-slider-row output{font-weight:800;font-size:16px;min-width:64px;text-align:right;color:var(--tco-accent-dark);}
.tco-hint{display:block;color:var(--tco-muted);font-size:12px;margin-top:6px;}
.tco-cards{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-bottom:22px;}
@media(max-width:600px){.tco-cards{grid-template-columns:1fr;}}
.tco-card{position:relative;border:1.5px solid var(--tco-line);border-radius:14px;padding:20px;text-align:center;}
.tco-card--win{border-color:var(--tco-accent);background:#f2faf5;}
.tco-card--lose{background:#fbf5f3;}
.tco-card-tag{position:absolute;top:-11px;left:50%;transform:translateX(-50%);background:var(--tco-accent);
color:#fff;font-size:11px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;padding:4px 12px;border-radius:999px;}
.tco-card h3{font-size:16px;margin:4px 0 12px;font-weight:700;}
.tco-card-total{font-size:clamp(28px,6vw,38px);font-weight:800;letter-spacing:-.02em;}
.tco-card--win .tco-card-total{color:var(--tco-accent-dark);}
.tco-card--lose .tco-card-total{color: #F58220;}
.tco-card-note{font-size:12px;color:var(--tco-muted);margin-top:4px;}
.tco-table-wrap{overflow-x:auto;margin-bottom:16px;}
.tco-table{width:100%;border-collapse:collapse;font-size:15px;}
.tco-table th,.tco-table td{padding:12px 14px;text-align:right;border-bottom:1px solid var(--tco-line);}
.tco-table th:first-child,.tco-table td:first-child{text-align:left;}
/*.tco-table thead th{font-size:12px;text-transform:uppercase;letter-spacing:.05em;color:var(--tco-muted);}*/
.tco-table thead th {
background: #D7172F;
color: #FFFFFF;
font-size: 12px;
text-transform: uppercase;
letter-spacing: .05em;
font-weight: 700;
border-bottom: 2px solid #A61124;
}
/*.tco-table tfoot th{font-size:16px;border-top:2px solid var(--tco-ink);border-bottom:0;}*/
.tco-table tfoot th {
background: #A61124;
color: #FFFFFF;
font-size: 16px;
font-weight: 700;
border-top: 2px solid #860E1D;
border-bottom: 0;
}
.tco-save-cell,.tco-table td.tco-save-cell{color:var(--tco-accent-dark);font-weight:800;}
.tco-breakeven{background:var(--tco-bg);border-left:4px solid var(--tco-accent);border-radius:8px;
padding:14px 16px;font-size:14px;line-height:1.5;margin-bottom:22px;}
.tco-cta{text-align:center;}
/*.tco-btn{display:inline-block;background:var(--tco-accent);color:#fff;font-weight:800;font-size:17px;
text-decoration:none;padding:15px 34px;border-radius:12px;transition:background .15s,transform .15s;}
.tco-btn:hover{background:var(--tco-accent-dark);transform:translateY(-1px);color:#fff;}*/
.tco-btn {
display: inline-block;
background: #D7172F; /* Datacolor Red */
color: #fff;
font-weight: 800;
font-size: 17px;
text-decoration: none;
padding: 15px 34px;
border-radius: 12px;
transition: background .15s, transform .15s;
}
.tco-btn:hover {
background: #A61124; /* Darker Datacolor Red */
color: #fff;
transform: translateY(-1px);
}
.tco-disclaimer{color:var(--tco-muted);font-size:11.5px;max-width:560px;margin:14px auto 0;line-height:1.5;}
/* ---- Additions: editable year cells + reset link ---- */
.tco-table td input.tco-year-input{
width:110px;padding:6px 8px;text-align:right;font:inherit;color:inherit;
border:1.5px solid var(--tco-line);border-radius:8px;background:#fff;
-moz-appearance:textfield;
}
.tco-table td input.tco-year-input:focus{
outline:none;border-color:var(--tco-accent);
box-shadow:0 0 0 3px rgba(10,125,60,.15);
}
.tco-table td input.tco-year-input::-webkit-outer-spin-button,
.tco-table td input.tco-year-input::-webkit-inner-spin-button{
-webkit-appearance:none;margin:0;
}
.tco-table-actions{text-align:right;margin-top:6px;}
.tco-reset-link{
background:none;border:0;padding:2px 4px;cursor:pointer;
font:inherit;font-size:12.5px;color:var(--tco-muted);
text-decoration:underline;text-underline-offset:2px;
}
.tco-reset-link:hover{color:var(--tco-accent-dark);}
(function(){
/* =====================================================================
CONFIG — all figures come straight from the Excel workbook.
Per-device annual costs (worksheet!H11:H15 and H37:H41).
Edit here if pricing changes; everything else recalculates.
===================================================================== */
var CONFIG = {
techkon: { name:"Techkon SpectroDens 4 Advanced", years:[11250, 0, 0, 0, 900] },
xrite: { name:"Xrite eXact 2 XP", years:[14260, 0, 4185, 2480, 4185] }
};
/* Snapshot of the original CONFIG values so "Reset year values" works
even after the user has edited any of the ten year inputs. */
var DEFAULTS = {
techkon: CONFIG.techkon.years.slice(),
xrite: CONFIG.xrite.years.slice()
};
var w = document.getElementById('tcoWidget');
if(!w) return;
var qtyEl = w.querySelector('#tcoQty');
var tradeEl = w.querySelector('#tcoTrade');
var tradeOut= w.querySelector('#tcoTradeOut');
var sum = function(a){ return a.reduce(function(s,v){return s+v;},0); };
var fmt = function(n){ return '$' + Math.round(n).toLocaleString('en-US'); };
var techPer = sum(CONFIG.techkon.years); // 12,150
var xritePer = sum(CONFIG.xrite.years); // 25,110
var animId=null;
function animateTo(el, target){
if(animId) cancelAnimationFrame(animId);
var start=parseFloat(el.getAttribute('data-val'))||0, t0=null, dur=550;
function step(ts){
if(!t0) t0=ts;
var p=Math.min((ts-t0)/dur,1), e=1-Math.pow(1-p,3);
var val=start+(target-start)*e;
el.textContent=fmt(val);
if(p<1){ animId=requestAnimationFrame(step); }
else { el.setAttribute('data-val', target); }
}
animId=requestAnimationFrame(step);
}
function render(){
var qty = Math.max(1, Math.min(100, parseInt(qtyEl.value,10)||1));
var trade = parseInt(tradeEl.value,10)||0;
tradeOut.textContent = fmt(trade);
// Fleet totals; trade-in reduces the effective Techkon cost (reward for switching)
var techFleet = techPer*qty - trade*qty;
if(techFleet1 ? 'across '+qty+' devices ' : '') + 'over 5 years'
+ (xriteFleet>0 ? ' — '+Math.round(savings/xriteFleet*100)+'% less than Xrite' : '');
// Cards
w.querySelector('#tcoTechTotal').textContent = fmt(techFleet);
w.querySelector('#tcoXriteTotal').textContent = fmt(xriteFleet);
// Year table — inputs are built once; here we only refresh the "You save" cell
var tbody = w.querySelector('#tcoTableBody');
for(var i=0;i<5;i++){
var t=CONFIG.techkon.years[i]*qty - (i===0?trade*qty:0);
if(t0){
be.innerHTML='
You\u2019re ahead from day one. Techkon costs less up front and the gap widens every year Xrite bills you for service-care plans and re-certifications. Over 5 years you keep
'+fmt(savings)+''+(qty>1?' across your fleet':'')+'.';
be.style.display='';
} else {
be.style.display='none';
}
}
qtyEl.addEventListener('input', render);
tradeEl.addEventListener('input', render);
w.querySelectorAll('.tco-step').forEach(function(btn){
btn.addEventListener('click', function(){
var v=parseInt(qtyEl.value,10)||1;
v += (btn.getAttribute('data-act')==='inc'?1:-1);
v=Math.max(1,Math.min(100,v));
qtyEl.value=v; render();
});
});
/* --- Editable Techkon / Xrite year cells (built once) --- */
(function initEditableYears(){
var labels = ['Year 1','Year 2','Year 3','Year 4','Year 5'];
var tbody = w.querySelector('#tcoTableBody');
var html = '';
for(var i=0;i<5;i++){
html +=
'
'+
'| '+labels[i]+' | '+
' | '+
' | '+
'$0 | '+
'
';
}
tbody.innerHTML = html;
tbody.addEventListener('input', function(e){
var el = e.target;
if(!el.classList || !el.classList.contains('tco-year-input')) return;
var v = Math.max(0, parseInt(el.value,10) || 0);
CONFIG[el.dataset.brand].years[+el.dataset.year] = v;
techPer = sum(CONFIG.techkon.years);
xritePer = sum(CONFIG.xrite.years);
render();
});
})();
/* --- Reset year values link --- */
w.querySelector('#tcoResetYears').addEventListener('click', function(){
CONFIG.techkon.years = DEFAULTS.techkon.slice();
CONFIG.xrite.years = DEFAULTS.xrite.slice();
techPer = sum(CONFIG.techkon.years);
xritePer = sum(CONFIG.xrite.years);
w.querySelectorAll('.tco-year-input').forEach(function(inp){
inp.value = CONFIG[inp.dataset.brand].years[+inp.dataset.year];
});
render();
});
render();
})();