Season 2 ka pehla project: ek working calculator — add, minus, multiply, divide, clear aur backspace. Isme tum seekhoge ki ek state (cur, prev, op) se poora app kaise chalta hai, aur ek hi click listener 18 buttons kaise sambhalta hai.
display: grid + repeat(4, 1fr) — keypad ka layoutgrid-column: span 2 — C aur 0 key ko double chaudaicur, prev, op — calculator ki memorycalc['+'](a, b)e.targetHar step me "Editor me daalo" dabao — ya best: khud type karo, haath se likha code yaad rehta hai. ✍️
#screen div (jahan number dikhega) aur ek .keys div jisme saare 18 buttons hain.op, C par clr, = par eq, aur 0 / C par wide — inhi se CSS rang aur size dega.textContent padhega. <div class="calc">
<div id="screen">0</div>
<div class="keys">
<button class="clr wide">C</button>
<button class="op">⌫</button>
<button class="op">÷</button>
<button>7</button><button>8</button><button>9</button>
<button class="op">×</button>
<button>4</button><button>5</button><button>6</button>
<button class="op">−</button>
<button>1</button><button>2</button><button>3</button>
<button class="op">+</button>
<button class="wide">0</button><button>.</button>
<button class="eq">=</button>
</div>
</div>
display: grid + place-items: center se card beech me.width: 300px ka — phone par bhi fit.body {
margin: 0;
min-height: 100vh;
display: grid;
place-items: center;
background: #0f172a;
font-family: sans-serif;
}
.calc {
width: 300px;
padding: 20px;
background: #1e293b;
border-radius: 24px;
}
text-align: right — calculator me number hamesha right se.grid-template-columns: repeat(4, 1fr) — 4 barabar columns, ek line me.gap: 10px — keys ke beech ki jagah.#screen {
padding: 16px 12px;
color: #fff;
font-size: 36px;
text-align: right;
overflow: hidden;
}
.keys {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 10px;
}
.op, .clr, .eq se rang badle..wide { grid-column: span 2 } — ye key do column leti hai, isliye 0 aur C chaude hain.button {
padding: 14px 0;
border: 0;
border-radius: 14px;
background: #334155;
color: #fff;
font-size: 20px;
cursor: pointer;
}
.op { background: #6366f1; }
.clr { background: #ef4444; }
.eq { background: #ec4899; }
.wide { grid-column: span 2; }
cur = jo number abhi type ho raha hai (text), prev = pehla number, op = chuna hua operator.fresh = true matlab "agla digit naya number shuru karega".calc object: har operator ke saath ek chhota function. calc['×'](3, 4) → 12. Isse lambe if/else se bachte hain.const screen = document.querySelector('#screen');
let cur = '0';
let prev = null;
let op = null;
let fresh = false;
const calc = {
'+': (a, b) => a + b,
'−': (a, b) => a - b,
'×': (a, b) => a * b,
'÷': (a, b) => a / b,
};
show() screen par dikhata hai: operator ho to 12 + 9, nahi to sirf number.compute() sahi function dhundta hai aur prev aur cur par chalata hai.toFixed(8) se 0.1 + 0.2 jaise lambe decimals kat jaate hain.isFinite — 0 se divide par Infinity aata hai, use screen par nahi dikhana.function show() {
screen.textContent =
op ? `${prev} ${op} ${fresh ? '' : cur}` : cur;
}
function compute() {
const r = calc[op](prev, Number(cur));
cur = isFinite(r) ? String(+r.toFixed(8)) : '0';
prev = null;
op = null;
}
cur me jodo (ya agar sirf "0" ya fresh ho to replace karo)..: sirf ek baar. C: sab reset. ⌫: aakhri character hatao.=: calculate karo. Operator: pehle chal rahe calculation ko pura karo (isliye 12 + 9 × 2 chain hota hai), phir naya operator yaad rakho.show() — rule: state badlo → show().function press(k) {
if ('0123456789'.includes(k)) {
cur = cur === '0' || fresh ? k : cur + k;
fresh = false;
} else if (k === '.') {
if (fresh) { cur = '0'; fresh = false; }
if (!cur.includes('.')) cur += '.';
} else if (k === 'C') {
cur = '0'; prev = null; op = null; fresh = false;
} else if (k === '⌫') {
if (!fresh) cur = cur.length > 1 ? cur.slice(0, -1) : '0';
} else if (k === '=') {
if (op && !fresh) compute();
fresh = true;
} else {
if (op && !fresh) compute();
prev = Number(cur);
op = k;
fresh = true;
}
show();
}
.keys par.e.target wahi button hai. tagName check karke gap par click ignore.const keys = document.querySelector('.keys');
keys.addEventListener('click', (e) => {
if (e.target.tagName === 'BUTTON') {
press(e.target.textContent);
}
});
Naya day aate hi reel aayegi — @codeyantra follow karo 🔔