<div class="calculator"> <input type="text" id="display" disabled placeholder="0"> <div class="buttons"> <!-- الصف العلمي --> <button onclick="appendValue('sin(')">sin</button> <button onclick="appendValue('cos(')">cos</button> <button onclick="appendValue('tan(')">tan</button> <button onclick="appendValue('sqrt(')">√</button> <button onclick="appendValue('log(')">log</button> <button onclick="appendValue('ln(')">ln</button> <button onclick="appendValue('π')">π</button> <button onclick="appendValue('^')">^</button> <!-- التحكم --> <button class="danger" onclick="clearDisplay()">C</button> <button class="danger" onclick="delValue()">⌫</button> <button onclick="appendValue('%')">%</button> <button onclick="appendValue('/')">÷</button> <!-- الأرقام --> <button onclick="appendValue('7')">7</button> <button onclick="appendValue('8')">8</button> <button onclick="appendValue('9')">9</button> <button onclick="appendValue('*')">×</button> <button onclick="appendValue('4')">4</button> <button onclick="appendValue('5')">5</button> <button onclick="appendValue('6')">6</button> <button onclick="appendValue('-')">−</button> <button onclick="appendValue('1')">1</button> <button onclick="appendValue('2')">2</button> <button onclick="appendValue('3')">3</button> <button onclick="appendValue('+')">+</button> <button onclick="appendValue('0')">0</button> <button onclick="appendValue('.')">.</button> <button onclick="appendValue('(')">(</button> <button onclick="appendValue(')')">)</button> <!-- يساوي --> <button class="equal" onclick="calculate()">=</button> </div> </div> <style> /* 🔥 تم إزالة أي ظل ثقيل + تحسين الشكل */ .calculator{ width:100%; max-width:360px; background: rgba(255,255,255,0.06); backdrop-filter: blur(10px); border-radius:18px; padding:15px; box-shadow: none; /* ❌ شيلت الظل بالكامل */ border: 1px solid rgba(255,255,255,0.08); } /* شاشة العرض */ #display{ width:100%; height:60px; border:none; border-radius:12px; margin-bottom:12px; font-size:22px; padding:10px; text-align:right; color:#fff; background:#111827; outline:none; box-sizing:border-box; } /* الأزرار */ .buttons{ display:grid; grid-template-columns: repeat(4, 1fr); gap:8px; } button{ padding:14px; font-size:15px; border:none; border-radius:12px; cursor:pointer; background:#1f2937; color:#fff; transition:0.2s; } /* تحسين hover بدون مبالغة */ button:hover{ background:#374151; } button:active{ transform: scale(0.97); } /* يساوي */ .equal{ grid-column: span 4; background: linear-gradient(45deg,#22c55e,#16a34a); font-size:18px; } /* خطر */ .danger{ background:#dc2626; } /* 📱 Responsive للأجهزة الصغيرة */ @media (max-width: 420px){ .calculator{ max-width:100%; padding:12px; border-radius:14px; } button{ padding:12px; font-size:14px; } #display{ font-size:20px; height:55px; } } /* 📱 شاشات صغيرة جدًا */ @media (max-width: 320px){ button{ padding:10px; font-size:13px; } .buttons{ gap:6px; } }</style> <script> const display = document.getElementById("display"); function appendValue(v){ display.value += v; } function clearDisplay(){ display.value = ""; } function delValue(){ display.value = display.value.slice(0,-1); } /* ================================ NUCLEAR ENGINE START ================================ */ // أولوية العمليات const precedence = { "+":1, "-":1, "*":2, "/":2, "^":3 }; // تحويل إلى tokens function tokenize(expr){ let tokens = []; let num = ""; for(let i=0;i<expr.length;i++){ let c = expr[i]; if((c >= "0" && c <= "9") || c === "."){ num += c; } else{ if(num){ tokens.push(num); num = ""; } if(c !== " "){ tokens.push(c); } } } if(num) tokens.push(num); return tokens; } // تحويل إلى RPN (Shunting Yard) function toRPN(tokens){ let output = []; let ops = []; for(let t of tokens){ if(!isNaN(t)){ output.push(t); } else if(t === "π"){ output.push(Math.PI); } else if("+-*/^".includes(t)){ while( ops.length && precedence[ops[ops.length-1]] >= precedence[t] ){ output.push(ops.pop()); } ops.push(t); } else if(t === "("){ ops.push(t); } else if(t === ")"){ while(ops.length && ops[ops.length-1] !== "("){ output.push(ops.pop()); } ops.pop(); } else if(t === "%"){ output.push("/100"); } else{ output.push(t); } } while(ops.length){ output.push(ops.pop()); } return output; } // تقييم RPN function evalRPN(rpn){ let stack = []; for(let t of rpn){ if(!isNaN(t)){ stack.push(parseFloat(t)); } else if(t === "+"){ let b = stack.pop(); let a = stack.pop(); stack.push(a + b); } else if(t === "-"){ let b = stack.pop(); let a = stack.pop(); stack.push(a - b); } else if(t === "*"){ let b = stack.pop(); let a = stack.pop(); stack.push(a * b); } else if(t === "/"){ let b = stack.pop(); let a = stack.pop(); stack.push(a / b); } else if(t === "^"){ let b = stack.pop(); let a = stack.pop(); stack.push(Math.pow(a,b)); } else if(t === "/100"){ let a = stack.pop(); stack.push(a / 100); } else if(t === "sin"){ stack.push(Math.sin(stack.pop())); } else if(t === "cos"){ stack.push(Math.cos(stack.pop())); } else if(t === "tan"){ stack.push(Math.tan(stack.pop())); } else if(t === "log"){ stack.push(Math.log10(stack.pop())); } else if(t === "ln"){ stack.push(Math.log(stack.pop())); } else if(t === "sqrt"){ stack.push(Math.sqrt(stack.pop())); } } return stack[0]; } /* ================================ NORMALIZATION (VERY IMPORTANT) ================================ */ function normalize(expr){ expr = expr.replace(/π/g, "π"); // الدوال expr = expr.replace(/sin\(/g, "sin("); expr = expr.replace(/cos\(/g, "cos("); expr = expr.replace(/tan\(/g, "tan("); expr = expr.replace(/log\(/g, "log("); expr = expr.replace(/ln\(/g, "ln("); expr = expr.replace(/sqrt\(/g, "sqrt("); // الضرب الضمني (NUCLEAR FIX) expr = expr .replace(/(\d)\(/g, "$1*(") .replace(/\)(\d)/g, ")*$1") .replace(/\)\(/g, ")*(") .replace(/π(\d)/g, "π*$1") .replace(/(\d)π/g, "$1*π"); return expr; } /* ================================ MAIN CALCULATE ================================ */ function calculate(){ try{ let expr = display.value; expr = normalize(expr); let tokens = tokenize(expr); let rpn = toRPN(tokens); let result = evalRPN(rpn); if(result === Infinity || isNaN(result)){ display.value = "خطأ"; return; } display.value = result; }catch(e){ display.value = "خطأ"; } } /* Keyboard */ document.addEventListener("keydown", e => { if(/[\d+\-*/().%^]/.test(e.key)){ appendValue(e.key); } if(e.key === "Enter") calculate(); if(e.key === "Backspace") delValue(); if(e.key === "Escape") clearDisplay(); }); </script>