{"project":{"id":"uDF7Y9D","userId":"davidyarham@gmail.com","username":null,"userPicture":null,"name":"iOS Calculator","thumbnail":"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","visible":true,"contributors":"","githubRepo":null,"forkedFrom":null,"tags":"","files":{"folder":"","files":[{"name":"index.html","content":"<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>Untitled</title>\n  <link rel=\"stylesheet\" href=\"style.css\">\n</head>\n<body>\n<div class=\"calc\">\n\t<div class=\"calc__display\">\n\t\t<span class=\"calc__display-text\" id=\"display\">0</span>\n\t</div>\n\t<div class=\"calc__grid\">\n\t\t<button class=\"calc__btn calc__btn--util\" data-action=\"clear\">AC</button>\n\t\t<button class=\"calc__btn calc__btn--util\" data-action=\"toggle\">+/−</button>\n\t\t<button class=\"calc__btn calc__btn--util\" data-action=\"percent\">%</button>\n\t\t<button class=\"calc__btn calc__btn--op\" data-action=\"op\" data-op=\"/\">÷</button>\n\n\t\t<button class=\"calc__btn calc__btn--num\" data-action=\"num\" data-val=\"7\">7</button>\n\t\t<button class=\"calc__btn calc__btn--num\" data-action=\"num\" data-val=\"8\">8</button>\n\t\t<button class=\"calc__btn calc__btn--num\" data-action=\"num\" data-val=\"9\">9</button>\n\t\t<button class=\"calc__btn calc__btn--op\" data-action=\"op\" data-op=\"*\">×</button>\n\n\t\t<button class=\"calc__btn calc__btn--num\" data-action=\"num\" data-val=\"4\">4</button>\n\t\t<button class=\"calc__btn calc__btn--num\" data-action=\"num\" data-val=\"5\">5</button>\n\t\t<button class=\"calc__btn calc__btn--num\" data-action=\"num\" data-val=\"6\">6</button>\n\t\t<button class=\"calc__btn calc__btn--op\" data-action=\"op\" data-op=\"-\">−</button>\n\n\t\t<button class=\"calc__btn calc__btn--num\" data-action=\"num\" data-val=\"1\">1</button>\n\t\t<button class=\"calc__btn calc__btn--num\" data-action=\"num\" data-val=\"2\">2</button>\n\t\t<button class=\"calc__btn calc__btn--num\" data-action=\"num\" data-val=\"3\">3</button>\n\t\t<button class=\"calc__btn calc__btn--op\" data-action=\"op\" data-op=\"+\">+</button>\n\n\t\t<button class=\"calc__btn calc__btn--num calc__btn--zero\" data-action=\"num\" data-val=\"0\">0</button>\n\t\t<button class=\"calc__btn calc__btn--num\" data-action=\"decimal\">.</button>\n\t\t<button class=\"calc__btn calc__btn--op\" data-action=\"equals\">=</button>\n\t</div>\n</div>\n  <script type=\"module\" src=\"main.js\"></script>\n</body>\n</html>"},{"name":"main.js","content":"(function() {\n\tconst display = document.getElementById('display');\n\tconst grid = document.querySelector('.calc__grid');\n\tconst clearBtn = grid.querySelector('[data-action=\"clear\"]');\n\n\tlet currentVal = '0';\n\tlet previousVal = '';\n\tlet operator = null;\n\tlet shouldResetDisplay = false;\n\tlet lastEquals = false;\n\tlet lastOp = null;\n\tlet lastNum = null;\n\n\tfunction formatDisplay(val) {\n\t\tif (val === 'Error') return 'Error';\n\t\tconst num = parseFloat(val);\n\t\tif (isNaN(num)) return '0';\n\n\t\t// If it's being typed and has a trailing decimal or trailing zeros after decimal\n\t\tif (val.includes('.') && (val.endsWith('.') || /\\.\\d*0+$/.test(val))) {\n\t\t\tconst parts = val.split('.');\n\t\t\tconst intPart = parseInt(parts[0]);\n\t\t\tconst formatted = Math.abs(intPart) >= 1000 ?\n\t\t\t\tintPart.toLocaleString('en-US') :\n\t\t\t\tintPart.toString();\n\t\t\treturn (num < 0 && intPart === 0 ? '-' : '') + formatted + '.' + parts[1];\n\t\t}\n\n\t\tif (Number.isInteger(num) && Math.abs(num) < 1e16) {\n\t\t\treturn num.toLocaleString('en-US');\n\t\t}\n\n\t\tif (Math.abs(num) < 1e-7 && num !== 0) {\n\t\t\treturn num.toExponential(5);\n\t\t}\n\n\t\tif (Math.abs(num) >= 1e16) {\n\t\t\treturn num.toExponential(5);\n\t\t}\n\n\t\tconst str = num.toLocaleString('en-US', {\n\t\t\tmaximumFractionDigits: 9\n\t\t});\n\t\treturn str;\n\t}\n\n\tfunction updateDisplay() {\n\t\tconst formatted = formatDisplay(currentVal);\n\t\tdisplay.textContent = formatted;\n\n\t\t// Adjust font size based on length\n\t\tconst len = formatted.length;\n\t\tdisplay.className = 'calc__display-text';\n\t\tif (len > 11) display.classList.add('calc__display-text--xxs');\n\t\telse if (len > 9) display.classList.add('calc__display-text--xs');\n\t\telse if (len > 6) display.classList.add('calc__display-text--sm');\n\n\t\t// Update AC / C\n\t\tclearBtn.textContent = currentVal === '0' && !operator ? 'AC' : 'C';\n\t}\n\n\tfunction highlightOp(op) {\n\t\tgrid.querySelectorAll('.calc__btn--op').forEach(btn => {\n\t\t\tbtn.classList.toggle('is-active', btn.dataset.op === op && !shouldResetDisplay === false || btn.dataset.op === op && shouldResetDisplay);\n\t\t});\n\t}\n\n\tfunction clearHighlights() {\n\t\tgrid.querySelectorAll('.calc__btn--op').forEach(btn => btn.classList.remove('is-active'));\n\t}\n\n\tfunction calculate(a, b, op) {\n\t\tconst numA = parseFloat(a);\n\t\tconst numB = parseFloat(b);\n\t\tswitch (op) {\n\t\t\tcase '+':\n\t\t\t\treturn numA + numB;\n\t\t\tcase '-':\n\t\t\t\treturn numA - numB;\n\t\t\tcase '*':\n\t\t\t\treturn numA * numB;\n\t\t\tcase '/':\n\t\t\t\treturn numB === 0 ? 'Error' : numA / numB;\n\t\t\tdefault:\n\t\t\t\treturn numB;\n\t\t}\n\t}\n\n\tfunction handleNumber(val) {\n\t\tlastEquals = false;\n\t\tif (shouldResetDisplay || currentVal === '0') {\n\t\t\tif (shouldResetDisplay) {\n\t\t\t\tcurrentVal = val;\n\t\t\t\tshouldResetDisplay = false;\n\t\t\t} else {\n\t\t\t\tcurrentVal = val;\n\t\t\t}\n\t\t} else {\n\t\t\t// Limit to 9 digits\n\t\t\tconst rawDigits = currentVal.replace(/[^0-9]/g, '');\n\t\t\tif (rawDigits.length >= 9) return;\n\t\t\tcurrentVal += val;\n\t\t}\n\t\tupdateDisplay();\n\t\tif (operator) highlightOp(operator);\n\t\telse clearHighlights();\n\t}\n\n\tfunction handleDecimal() {\n\t\tlastEquals = false;\n\t\tif (shouldResetDisplay) {\n\t\t\tcurrentVal = '0.';\n\t\t\tshouldResetDisplay = false;\n\t\t} else if (!currentVal.includes('.')) {\n\t\t\tcurrentVal += '.';\n\t\t}\n\t\tupdateDisplay();\n\t}\n\n\tfunction handleOperator(op) {\n\t\tlastEquals = false;\n\t\tif (operator && !shouldResetDisplay) {\n\t\t\tconst result = calculate(previousVal, currentVal, operator);\n\t\t\tcurrentVal = result === 'Error' ? 'Error' : String(result);\n\t\t\tpreviousVal = currentVal;\n\t\t} else {\n\t\t\tpreviousVal = currentVal;\n\t\t}\n\t\toperator = op;\n\t\tshouldResetDisplay = true;\n\t\tupdateDisplay();\n\t\thighlightOp(op);\n\t}\n\n\tfunction handleEquals() {\n\t\tif (lastEquals && lastOp && lastNum !== null) {\n\t\t\tconst result = calculate(currentVal, lastNum, lastOp);\n\t\t\tcurrentVal = result === 'Error' ? 'Error' : String(result);\n\t\t\tupdateDisplay();\n\t\t\tclearHighlights();\n\t\t\treturn;\n\t\t}\n\n\t\tif (operator) {\n\t\t\tlastOp = operator;\n\t\t\tlastNum = currentVal;\n\t\t\tconst result = calculate(previousVal, currentVal, operator);\n\t\t\tcurrentVal = result === 'Error' ? 'Error' : String(result);\n\t\t\tpreviousVal = '';\n\t\t\toperator = null;\n\t\t\tshouldResetDisplay = true;\n\t\t\tlastEquals = true;\n\t\t}\n\t\tupdateDisplay();\n\t\tclearHighlights();\n\t}\n\n\tfunction handleClear() {\n\t\tif (clearBtn.textContent === 'AC') {\n\t\t\tcurrentVal = '0';\n\t\t\tpreviousVal = '';\n\t\t\toperator = null;\n\t\t\tshouldResetDisplay = false;\n\t\t\tlastEquals = false;\n\t\t\tlastOp = null;\n\t\t\tlastNum = null;\n\t\t} else {\n\t\t\tcurrentVal = '0';\n\t\t\tshouldResetDisplay = false;\n\t\t}\n\t\tupdateDisplay();\n\t\tif (operator) highlightOp(operator);\n\t\telse clearHighlights();\n\t}\n\n\tfunction handleToggle() {\n\t\tif (currentVal === '0' || currentVal === 'Error') return;\n\t\tif (currentVal.startsWith('-')) {\n\t\t\tcurrentVal = currentVal.slice(1);\n\t\t} else {\n\t\t\tcurrentVal = '-' + currentVal;\n\t\t}\n\t\tupdateDisplay();\n\t}\n\n\tfunction handlePercent() {\n\t\tconst num = parseFloat(currentVal);\n\t\tif (isNaN(num)) return;\n\t\tcurrentVal = String(num / 100);\n\t\tupdateDisplay();\n\t}\n\n\t// Event delegation\n\tgrid.addEventListener('click', (e) => {\n\t\tconst btn = e.target.closest('.calc__btn');\n\t\tif (!btn) return;\n\n\t\tconst action = btn.dataset.action;\n\n\t\tswitch (action) {\n\t\t\tcase 'num':\n\t\t\t\thandleNumber(btn.dataset.val);\n\t\t\t\tbreak;\n\t\t\tcase 'decimal':\n\t\t\t\thandleDecimal();\n\t\t\t\tbreak;\n\t\t\tcase 'op':\n\t\t\t\thandleOperator(btn.dataset.op);\n\t\t\t\tbreak;\n\t\t\tcase 'equals':\n\t\t\t\thandleEquals();\n\t\t\t\tbreak;\n\t\t\tcase 'clear':\n\t\t\t\thandleClear();\n\t\t\t\tbreak;\n\t\t\tcase 'toggle':\n\t\t\t\thandleToggle();\n\t\t\t\tbreak;\n\t\t\tcase 'percent':\n\t\t\t\thandlePercent();\n\t\t\t\tbreak;\n\t\t}\n\t});\n\n\t// Keyboard support\n\tdocument.addEventListener('keydown', (e) => {\n\t\tif (e.key >= '0' && e.key <= '9') handleNumber(e.key);\n\t\telse if (e.key === '.') handleDecimal();\n\t\telse if (e.key === '+') handleOperator('+');\n\t\telse if (e.key === '-') handleOperator('-');\n\t\telse if (e.key === '*') handleOperator('*');\n\t\telse if (e.key === '/') {\n\t\t\te.preventDefault();\n\t\t\thandleOperator('/');\n\t\t} else if (e.key === 'Enter' || e.key === '=') handleEquals();\n\t\telse if (e.key === 'Escape' || e.key === 'c' || e.key === 'C') handleClear();\n\t\telse if (e.key === '%') handlePercent();\n\t\telse if (e.key === 'Backspace') {\n\t\t\tif (currentVal.length > 1) {\n\t\t\t\tcurrentVal = currentVal.slice(0, -1);\n\t\t\t} else {\n\t\t\t\tcurrentVal = '0';\n\t\t\t}\n\t\t\tupdateDisplay();\n\t\t}\n\t});\n\n\tupdateDisplay();\n})();"},{"name":"style.css","content":":root {\n\tcolor-scheme: dark;\n\tfont-family: -apple-system, 'Helvetica Neue', 'SF Pro Display', system-ui, sans-serif;\n}\n\n* {\n\tbox-sizing: border-box;\n\tmargin: 0;\n\tpadding: 0;\n}\n\nbody {\n\tbackground: #000;\n\tmin-height: 100dvh;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\t-webkit-user-select: none;\n\tuser-select: none;\n}\n\n.calc {\n\twidth: 100%;\n\tmax-width: 360px;\n\tpadding: 0 12px 20px;\n}\n\n/* Display */\n.calc__display {\n\twidth: 100%;\n\tpadding: 20px 8px 16px;\n\tdisplay: flex;\n\talign-items: flex-end;\n\tjustify-content: flex-end;\n\tmin-height: 120px;\n}\n\n.calc__display-text {\n\tcolor: #fff;\n\tfont-size: 88px;\n\tfont-weight: 200;\n\tline-height: 1;\n\tletter-spacing: -1.5px;\n\ttext-align: right;\n\ttransition: font-size 0.15s ease;\n}\n\n.calc__display-text--sm {\n\tfont-size: 64px;\n}\n\n.calc__display-text--xs {\n\tfont-size: 48px;\n}\n\n.calc__display-text--xxs {\n\tfont-size: 36px;\n}\n\n/* Button Grid */\n.calc__grid {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(4, 1fr);\n\tgap: 14px;\n}\n\n/* Buttons */\n.calc__btn {\n\taspect-ratio: 1;\n\tborder-radius: 50%;\n\tborder: none;\n\tfont-size: 34px;\n\tfont-weight: 400;\n\tcursor: pointer;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\ttransition: filter 0.1s ease;\n\t-webkit-tap-highlight-color: transparent;\n\tfont-family: inherit;\n\tline-height: 1;\n}\n\n.calc__btn:active {\n\tfilter: brightness(1.4);\n}\n\n/* Number buttons */\n.calc__btn--num {\n\tbackground: #333;\n\tcolor: #fff;\n}\n\n.calc__btn--num:active {\n\tbackground: #737373;\n}\n\n/* Zero button */\n.calc__btn--zero {\n\tgrid-column: span 2;\n\tborder-radius: 999px;\n\taspect-ratio: auto;\n\tjustify-content: flex-start;\n\tpadding-left: 30px;\n}\n\n/* Utility buttons (AC, +/-, %) */\n.calc__btn--util {\n\tbackground: #a5a5a5;\n\tcolor: #000;\n\tfont-size: 28px;\n\tfont-weight: 500;\n}\n\n.calc__btn--util:active {\n\tbackground: #d9d9d9;\n}\n\n/* Operator buttons */\n.calc__btn--op {\n\tbackground: #ff9f0a;\n\tcolor: #fff;\n\tfont-size: 40px;\n\tfont-weight: 400;\n}\n\n.calc__btn--op:active {\n\tbackground: #fcc580;\n}\n\n/* Active operator state */\n.calc__btn--op.is-active {\n\tbackground: #fff;\n\tcolor: #ff9f0a;\n}\n\n.calc__btn--op.is-active:active {\n\tbackground: #fcc580;\n\tcolor: #fff;\n}\n\n/* Responsive */\n@media (max-height: 600px) {\n\t.calc__display {\n\t\tmin-height: 80px;\n\t\tpadding: 10px 8px 10px;\n\t}\n\n\t.calc__display-text {\n\t\tfont-size: 56px;\n\t}\n\n\t.calc__grid {\n\t\tgap: 10px;\n\t}\n\n\t.calc__btn {\n\t\tfont-size: 28px;\n\t}\n\n\t.calc__btn--op {\n\t\tfont-size: 32px;\n\t}\n}"}],"folders":[]},"variants":null,"createdAt":"2026-03-02T01:51:59.114Z","updatedAt":"2026-03-02T01:52:04.343Z"}}