{
  "id": "password-gen",
  "name": "Password Generator",
  "category": "utilities",
  "tags": ["password", "security", "generator", "random", "tool"],
  "description": "Generate secure passwords with customizable length and character sets.",
  "triggers": ["password generator", "generate password", "secure password", "random password", "password"],
  "defaultSize": { "w": 4, "h": 4 },
  "source": "function PasswordGen() {\n  const [len, setLen] = React.useState(16);\n  const [upper, setUpper] = React.useState(true);\n  const [lower, setLower] = React.useState(true);\n  const [nums, setNums] = React.useState(true);\n  const [sym, setSym] = React.useState(true);\n  const [pwd, setPwd] = React.useState('');\n\n  const generate = ()=>{\n    let chars='';\n    if(upper)chars+='ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n    if(lower)chars+='abcdefghijklmnopqrstuvwxyz';\n    if(nums)chars+='0123456789';\n    if(sym)chars+='!@#$%^&*()_+-=[]{}|;:,.<>?';\n    if(!chars)return setPwd('');\n    let p='';\n    for(let i=0;i<len;i++)p+=chars[Math.floor(Math.random()*chars.length)];\n    setPwd(p);\n  };\n\n  React.useEffect(()=>generate(),[]);\n\n  const copy = ()=>{navigator.clipboard?.writeText(pwd);alert('Copied!');};\n\n  const strength = (()=>{\n    if(!pwd)return 0;\n    let s=0;\n    if(pwd.length>=12)s++;if(pwd.length>=16)s++;\n    if(/[A-Z]/.test(pwd))s++;if(/[a-z]/.test(pwd))s++;if(/\\d/.test(pwd))s++;if(/[^A-Za-z0-9]/.test(pwd))s++;\n    return s;\n  })();\n\n  const strengthLabel = ['Very Weak','Weak','Fair','Good','Strong','Very Strong'];\n  const strengthColor = ['#FF3B30','#FF3B30','#FF9500','#FFCC00','#34C759','#34C759'];\n\n  return (\n    <div style={{padding:16,fontFamily:'system-ui',height:'100%',display:'flex',flexDirection:'column'}}>\n      <div style={{fontSize:18,fontWeight:700,marginBottom:12}}>Password Generator</div>\n      <div style={{display:'flex',gap:8,marginBottom:12}}>\n        <div style={{flex:1,padding:'10px 12px',background:'#f5f5f5',borderRadius:8,fontFamily:'monospace',fontSize:14,wordBreak:'break-all'}}>\n          {pwd}\n        </div>\n        <button onClick={copy} style={{padding:'10px 14px',borderRadius:8,background:'#007AFF',color:'#fff',border:'none',cursor:'pointer'}}>Copy</button>\n      </div>\n      <div style={{marginBottom:8}}>\n        <div style={{height:6,background:'#eee',borderRadius:3}}>\n          <div style={{width:`${(strength/6)*100}%`,height:'100%',background:strengthColor[strength],borderRadius:3,transition:'all 0.3s'}}/>\n        </div>\n        <div style={{fontSize:12,color:'#888',marginTop:4}}>{strengthLabel[strength]}</div>\n      </div>\n      <div style={{marginBottom:8}}>\n        <div style={{fontSize:12,color:'#888',marginBottom:4}}>Length: {len}</div>\n        <input type=\"range\" min=\"8\" max=\"64\" value={len} onChange={e=>setLen(Number(e.target.value))}\n          style={{width:'100%'}}/>\n      </div>\n      <div style={{display:'grid',gridTemplateColumns:'1fr 1fr',gap:8,marginBottom:12}}>\n        <label style={{display:'flex',alignItems:'center',gap:6,fontSize:13,cursor:'pointer'}}>\n          <input type=\"checkbox\" checked={upper} onChange={e=>setUpper(e.target.checked)}/> ABC\n        </label>\n        <label style={{display:'flex',alignItems:'center',gap:6,fontSize:13,cursor:'pointer'}}>\n          <input type=\"checkbox\" checked={lower} onChange={e=>setLower(e.target.checked)}/> abc\n        </label>\n        <label style={{display:'flex',alignItems:'center',gap:6,fontSize:13,cursor:'pointer'}}>\n          <input type=\"checkbox\" checked={nums} onChange={e=>setNums(e.target.checked)}/> 123\n        </label>\n        <label style={{display:'flex',alignItems:'center',gap:6,fontSize:13,cursor:'pointer'}}>\n          <input type=\"checkbox\" checked={sym} onChange={e=>setSym(e.target.checked)}/> !@#\n        </label>\n      </div>\n      <button onClick={generate} style={{padding:'10px',borderRadius:8,background:'#34C759',color:'#fff',border:'none',cursor:'pointer',fontSize:14,fontWeight:600}}>\n        Generate New\n      </button>\n    </div>\n  );\n}\nrender(<PasswordGen/>);",
  "placeholders": []
}
