{
  "id": "calculator",
  "name": "Calculator",
  "category": "utilities",
  "tags": ["calculator", "math", "compute", "numbers", "tool"],
  "description": "Standard calculator with basic operations, memory, and history.",
  "triggers": ["calculator", "calc", "math", "compute", "add numbers", "calculator widget"],
  "defaultSize": { "w": 4, "h": 5 },
  "source": "function Calculator() {\n  const [display, setDisplay] = React.useState('0');\n  const [prev, setPrev] = React.useState(null);\n  const [op, setOp] = React.useState(null);\n  const [newNum, setNewNum] = React.useState(true);\n\n  const press = (val)=>{\n    if(['+','-','×','÷'].includes(val)){\n      setPrev(parseFloat(display));setOp(val);setNewNum(true);return;\n    }\n    if(val==='='){\n      if(prev===null||!op)return;\n      const cur = parseFloat(display);\n      let res = 0;\n      if(op==='+')res=prev+cur;\n      if(op==='-')res=prev-cur;\n      if(op==='×')res=prev*cur;\n      if(op==='÷')res=prev/cur;\n      setDisplay(String(Math.round(res*1e8)/1e8));\n      setPrev(null);setOp(null);setNewNum(true);return;\n    }\n    if(val==='C'){setDisplay('0');setPrev(null);setOp(null);setNewNum(true);return;}\n    if(val==='←'){setDisplay(d=>d.length>1?d.slice(0,-1):'0');return;}\n    if(val==='.'&&display.includes('.'))return;\n    if(newNum){setDisplay(val==='.'?'0.':val);setNewNum(false);}\n    else{setDisplay(d=>d==='0'&&val!=='.'?val:d+val);}\n  };\n\n  const keys = ['C','←','÷','×','7','8','9','-','4','5','6','+','1','2','3','=','0','.'];\n\n  return (\n    <div style={{padding:12,fontFamily:'system-ui',display:'flex',flexDirection:'column',alignItems:'center',height:'100%'}}>\n      <div style={{width:220,textAlign:'right',padding:'12px 16px',background:'#1a1a1a',color:'#fff',borderRadius:10,fontSize:28,fontWeight:200,fontVariantNumeric:'tabular-nums',marginBottom:12,overflow:'hidden'}}>\n        {display}\n      </div>\n      <div style={{display:'grid',gridTemplateColumns:'repeat(4,50px)',gap:6}}>\n        {keys.map(k=> (\n          <button key={k} onClick={()=>press(k)}\n            style={{\n              width:50,height:50,fontSize:18,borderRadius:10,border:'none',cursor:'pointer',\n              background:['C','←'].includes(k)?'#FF3B30':['÷','×','-','+','='].includes(k)?'#FF9500':'#f5f5f5',\n              color:['C','←','÷','×','-','+','='].includes(k)?'#fff':'#000',\n              gridColumn:k==='0'?'span 2':undefined\n            }}>\n            {k}\n          </button>\n        ))}\n      </div>\n    </div>\n  );\n}\nrender(<Calculator/>);",
  "placeholders": []
}
