My blog
<?php


/*
Plugin Name: SIP & Lumpsum Calculator PRO (Final Tabs + Graph Tabs)
Description: SIP, Lumpsum & Combo Calculator with Line & Donut inside Tabs
Version: 2.1
*/

if (!defined('ABSPATH')) exit;

add_shortcode('sip_lumpsum_calculator_pro', function () {
ob_start(); ?>

<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>

<style>
.sippro-wrap{
    max-width:440px;margin:30px auto;padding:22px;border-radius:22px;
    background:linear-gradient(180deg,#0f2d36,#143a44);
    color:#fff;font-family:system-ui;box-shadow:0 20px 45px rgba(0,0,0,.35)
}
.main-tabs,.graph-tabs{
    display:flex;background:#1b3f48;padding:6px;border-radius:16px;margin-bottom:14px
}
.main-tabs button,.graph-tabs button{
    flex:1;padding:10px;font-weight:700;border:none;border-radius:12px;
    background:transparent;color:#cfdfe4;cursor:pointer
}
.main-tabs button.active,.graph-tabs button.active{
    background:linear-gradient(135deg,#ff9800,#ff5722);color:#fff
}
label{font-size:13px;font-weight:600;color:#cfe6ec;margin:6px 0;display:block}
input{
    width:100%;padding:13px;border-radius:14px;border:none;
    font-size:15px;font-weight:600;margin-bottom:10px
}
.result{
    background:#163e47;padding:14px;border-radius:14px;margin:10px 0
}
.result strong{font-size:20px;display:block}
.tab{display:none}
.tab.active{display:block}
.graph-wrap{display:none}
.graph-wrap.active{display:block}
.chart-box{background:#fff;padding:10px;border-radius:16px;margin-top:10px}
.donut-box{position:relative}
.donut-center{
    position:absolute;top:50%;left:0;width:100%;
    transform:translateY(-50%);
    text-align:center;font-weight:800;font-size:16px;color:#111
}
canvas{max-width:100%}
</style>

<div class="sippro-wrap">

<!-- MAIN TABS -->
<div class="main-tabs">
    <button class="active" onclick="switchMain(event,'sip')">SIP</button>
    <button onclick="switchMain(event,'lump')">Lumpsum</button>
    <button onclick="switchMain(event,'combo')">SIP + Lumpsum</button>
</div>

<!-- ================= SIP ================= -->
<div id="sip" class="tab active">

<label>Monthly SIP (₹)</label><input id="sip_amt" value="5000">
<label>Return (%)</label><input id="sip_rate" value="12">
<label>Years</label><input id="sip_years" value="20">
<label>Annual Step-Up (%) (Optional)</label><input id="sip_step">

<div class="result"><strong id="sip_val">₹0</strong></div>

<div class="graph-tabs">
    <button class="active" onclick="switchGraph(event,'sipLineWrap')">Growth</button>
    <button onclick="switchGraph(event,'sipDonutWrap')">Distribution</button>
</div>

<div id="sipLineWrap" class="graph-wrap active chart-box">
    <canvas id="sipLine" height="260"></canvas>
</div>

<div id="sipDonutWrap" class="graph-wrap chart-box donut-box">
    <canvas id="sipDonut"></canvas>
    <div class="donut-center" id="sipDonutCenter"></div>
</div>

</div>

<!-- ================= LUMPSUM ================= -->
<div id="lump" class="tab">

<label>Lumpsum Amount (₹)</label><input id="lump_amt" value="100000">
<label>Return (%)</label><input id="lump_rate" value="12">
<label>Years</label><input id="lump_years" value="20">

<div class="result"><strong id="lump_val">₹0</strong></div>

<div class="graph-tabs">
    <button class="active" onclick="switchGraph(event,'lumpLineWrap')">Growth</button>
    <button onclick="switchGraph(event,'lumpDonutWrap')">Distribution</button>
</div>

<div id="lumpLineWrap" class="graph-wrap active chart-box">
    <canvas id="lumpLine" height="260"></canvas>
</div>

<div id="lumpDonutWrap" class="graph-wrap chart-box donut-box">
    <canvas id="lumpDonut"></canvas>
    <div class="donut-center" id="lumpDonutCenter"></div>
</div>

</div>

<!-- ================= COMBO ================= -->
<div id="combo" class="tab">

<label>SIP / Month (₹)</label><input id="c_sip" value="5000">
<label>Lumpsum (₹)</label><input id="c_lump" value="100000">
<label>Return (%)</label><input id="c_rate" value="12">
<label>Years</label><input id="c_years" value="20">

<div class="result"><strong id="combo_val">₹0</strong></div>

<div class="graph-tabs">
    <button class="active" onclick="switchGraph(event,'comboLineWrap')">Growth</button>
    <button onclick="switchGraph(event,'comboDonutWrap')">Distribution</button>
</div>

<div id="comboLineWrap" class="graph-wrap active chart-box">
  <canvas id="comboLine" height="260"></canvas>
</div>

<div id="comboDonutWrap" class="graph-wrap chart-box donut-box">
    <canvas id="comboDonut"></canvas>
    <div class="donut-center" id="comboDonutCenter"></div>
</div>

</div>

</div>

<script>
let charts={};

const rupee=v=>"₹"+Math.round(v).toLocaleString('en-IN');

function switchMain(e,id){
    document.querySelectorAll('.main-tabs button').forEach(b=>b.classList.remove('active'));
    e.target.classList.add('active');
    document.querySelectorAll('.tab').forEach(t=>t.classList.remove('active'));
    document.getElementById(id).classList.add('active');
    setTimeout(calculate,50);
}

function switchGraph(e,id){
    const tab=e.target.closest('.tab');
    tab.querySelectorAll('.graph-tabs button').forEach(b=>b.classList.remove('active'));
    tab.querySelectorAll('.graph-wrap').forEach(w=>w.classList.remove('active'));
    e.target.classList.add('active');
    tab.querySelector('#'+id).classList.add('active');
    setTimeout(()=>{Object.values(charts).forEach(c=>c&&c.resize())},50);
}

function sipCalc(m,r,y,step){
    let inv=0,val=0,arr=[];
    r=r/100/12; step=step||0;
    for(let yr=1;yr<=y;yr++){
        for(let i=0;i<12;i++){ val=(val+m)*(1+r); inv+=m; }
        arr.push(val); m+=m*(step/100);
    }
    return {inv,val,arr};
}

function lumpArr(p,r,y){
    let a=[];
    for(let i=1;i<=y;i++) a.push(p*Math.pow(1+r/100,i));
    return a;
}

function drawLine(id,data){
    if(charts[id]) charts[id].destroy();
    charts[id]=new Chart(document.getElementById(id),{
        type:'line',
        data:{labels:data.map((_,i)=>"Year "+(i+1)),datasets:[{data:data,fill:true}]},
        options:{plugins:{legend:{display:false}}}
    });
}

function drawDonut(id,inv,ret,centerId){
    if(charts[id]) charts[id].destroy();
    charts[id]=new Chart(document.getElementById(id),{
        type:'doughnut',
        data:{labels:['Invested','Returns'],
        datasets:[{data:[inv,ret],backgroundColor:['#4dd0e1','#ff9800'],borderWidth:0}]},
        options:{cutout:'70%',plugins:{legend:{display:false}}}
    });
    document.getElementById(centerId).innerText=rupee(inv+ret);
}

function calculate(){

    let step=sip_step.value===''?0:+sip_step.value;

    // SIP
    let s=sipCalc(+sip_amt.value,+sip_rate.value,+sip_years.value,step);
    sip_val.innerText=rupee(s.val);
    drawLine('sipLine',s.arr);
    drawDonut('sipDonut',s.inv,s.val-s.inv,'sipDonutCenter');

    // LUMPSUM
    let la=lumpArr(+lump_amt.value,+lump_rate.value,+lump_years.value);
    let lv=la.at(-1);
    lump_val.innerText=rupee(lv);
    drawLine('lumpLine',la);
    drawDonut('lumpDonut',+lump_amt.value,lv-+lump_amt.value,'lumpDonutCenter');

    // COMBO
    let cs=sipCalc(+c_sip.value,+c_rate.value,+c_years.value,0);
    let cl=lumpArr(+c_lump.value,+c_rate.value,+c_years.value);
    let ca=cs.arr.map((v,i)=>v+(cl[i]||0));
    let cv=ca.at(-1);
    combo_val.innerText=rupee(cv);
    drawLine('comboLine',ca);
    drawDonut('comboDonut',cs.inv+ +c_lump.value,cv-(cs.inv+ +c_lump.value),'comboDonutCenter');
}

document.querySelectorAll('.sippro-wrap input').forEach(i=>i.addEventListener('input',calculate));
calculate();
</script>

<?php
return ob_get_clean();
});

Leave a Reply

Leave a Reply

Your email address will not be published. Required fields are marked *