Programmable Calculator
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>NEO-CALC 2077</title>
<style>
@import url('https://fonts.googleapis.com/css2?family=Share+Tech+Mono&display=swap');
body {
margin: 0;
padding: 0;
background-color: #0b0b14;
color: #c2fbff;
font-family: 'Share Tech Mono', monospace;
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
}
.calculator {
width: 320px;
border: 2px solid #00f3ff;
border-radius: 8px;
box-shadow: 0 0 15px rgba(0, 243, 255, 0.5);
background-color: rgba(11, 11, 20, 0.9);
overflow: hidden;
}
.header {
padding: 12px;
background-color: rgba(0, 0, 0, 0.4);
border-bottom: 1px solid #00f3ff;
text-align: center;
}
.title {
margin: 0;
color: #00f3ff;
text-shadow: 0 0 5px #00f3ff;
font-size: 24px;
letter-spacing: 2px;
}
.display {
padding: 15px;
background-color: rgba(0, 0, 0, 0.5);
border-bottom: 1px solid #00f3ff;
}
.input-display {
height: 24px;
margin-bottom: 8px;
text-align: right;
color: #c2fbff;
font-size: 16px;
overflow: hidden;
}
.result-display {
height: 40px;
text-align: right;
color: #00f3ff;
font-size: 32px;
text-shadow: 0 0 5px #00f3ff;
overflow: hidden;
}
.keypad {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(5, 60px);
gap: 1px;
background-color: #000;
}
.key {
display: flex;
justify-content: center;
align-items: center;
background-color: rgba(20, 20, 35, 0.9);
cursor: pointer;
user-select: none;
transition: all 0.2s;
}
.key:hover {
background-color: rgba(40, 40, 60, 0.9);
}
.key:active {
background-color: #00f3ff;
color: #0b0b14;
}
.key.operation {
background-color: rgba(132, 0, 255, 0.2);
color: #8400ff;
}
.key.clear {
background-color: rgba(255, 50, 68, 0.2);
color: #ff3244;
}
.key.equals {
background-color: rgba(0, 255, 170, 0.2);
color: #00ffaa;
}
.key.function {
background-color: rgba(0, 243, 255, 0.15);
color: #00f3ff;
}
.footer {
padding: 8px;
text-align: center;
font-size: 12px;
color: #c2fbff;
background-color: rgba(0, 0, 0, 0.4);
border-top: 1px solid #00f3ff;
}
</style>
</head>
<body>
<div class="calculator">
<div class="header">
<h1 class="title">NEO-CALC 2077</h1>
</div>
<div class="display">
<div class="input-display" id="input-display">0</div>
<div class="result-display" id="result-display">0</div>
</div>
<div class="keypad">
<div class="key clear" onclick="clearAll()">AC</div>
<div class="key clear" onclick="clearEntry()">CE</div>
<div class="key function" onclick="calculate('sqrt')">√</div>
<div class="key operation" onclick="setOperation('/')">/</div>
<div class="key" onclick="appendNumber(7)">7</div>
<div class="key" onclick="appendNumber(8)">8</div>
<div class="key" onclick="appendNumber(9)">9</div>
<div class="key operation" onclick="setOperation('*')">×</div>
<div class="key" onclick="appendNumber(4)">4</div>
<div class="key" onclick="appendNumber(5)">5</div>
<div class="key" onclick="appendNumber(6)">6</div>
<div class="key operation" onclick="setOperation('-')">-</div>
<div class="key" onclick="appendNumber(1)">1</div>
<div class="key" onclick="appendNumber(2)">2</div>
<div class="key" onclick="appendNumber(3)">3</div>
<div class="key operation" onclick="setOperation('+')">+</div>
<div class="key function" onclick="toggleSign()">+/-</div>
<div class="key" onclick="appendNumber(0)">0</div>
<div class="key" onclick="appendDecimal()">.</div>
<div class="key equals" onclick="performCalculation()">=</div>
</div>
<div class="footer">
CYBERPUNK EDITION • 2077
</div>
</div>
<script>
let currentInput = '0';
let currentResult = '0';
let currentOperation = null;
let resetInput = false;
const inputDisplay = document.getElementById('input-display');
const resultDisplay = document.getElementById('result-display');
function updateDisplay() {
inputDisplay.textContent = currentInput;
resultDisplay.textContent = currentResult;
// Add glitch effect
resultDisplay.style.textShadow = "0 0 10px #00f3ff, 0 0 20px #00f3ff";
setTimeout(() => {
resultDisplay.style.textShadow = "0 0 5px #00f3ff";
}, 300);
}
function appendNumber(number) {
if (currentInput === '0' || resetInput) {
currentInput = number.toString();
resetInput = false;
} else {
currentInput += number;
}
updateDisplay();
}
function appendDecimal() {
if (resetInput) {
currentInput = '0.';
resetInput = false;
} else if (!currentInput.includes('.')) {
currentInput += '.';
}
updateDisplay();
}
function clearAll() {
currentInput = '0';
currentResult = '0';
currentOperation = null;
updateDisplay();
}
function clearEntry() {
currentInput = '0';
updateDisplay();
}
function toggleSign() {
currentInput = (parseFloat(currentInput) * -1).toString();
updateDisplay();
}
function setOperation(operation) {
if (currentOperation !== null) {
performCalculation();
}
currentOperation = operation;
currentResult = currentInput;
resetInput = true;
updateDisplay();
}
function performCalculation() {
if (currentOperation === null) return;
const prev = parseFloat(currentResult);
const current = parseFloat(currentInput);
let result;
switch(currentOperation) {
case '+':
result = prev + current;
break;
case '-':
result = prev - current;
break;
case '*':
result = prev * current;
break;
case '/':
result = prev / current;
break;
default:
return;
}
currentResult = formatResult(result);
currentInput = currentResult;
currentOperation = null;
resetInput = true;
updateDisplay();
}
function calculate(func) {
const value = parseFloat(currentInput);
let result;
switch(func) {
case 'sqrt':
result = Math.sqrt(value);
break;
default:
return;
}
currentInput = formatResult(result);
updateDisplay();
}
function formatResult(value) {
// Handle potential floating point precision issues
return parseFloat(value.toFixed(10)).toString();
}
// Keyboard support
document.addEventListener('keydown', (event) => {
if (event.key >= '0' && event.key <= '9') {
appendNumber(parseInt(event.key));
} else if (event.key === '.') {
appendDecimal();
} else if (event.key === '+' || event.key === '-' || event.key === '*' || event.key === '/') {
setOperation(event.key);
} else if (event.key === 'Enter' || event.key === '=') {
performCalculation();
} else if (event.key === 'Escape') {
clearAll();
} else if (event.key === 'Backspace') {
if (currentInput.length > 1) {
currentInput = currentInput.slice(0, -1);
} else {
currentInput = '0';
}
updateDisplay();
}
});
// Initialize display
updateDisplay();
</script>
</body>
</html>
Comments
Post a Comment