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

Popular posts from this blog

Articles for Calculator.ist

Calc.ist: List of all Calculators: Total of 592.

HP-65 Calculator Simulator (1974)