{"ast":null,"code":"var _jsxFileName = \"D:\\\\LDT\\\\000 Project\\\\LDT\\\\Client\\\\src\\\\pages\\\\Login.js\",\n  _s = $RefreshSig$();\nimport React, { useState } from 'react';\nimport { login } from '../api';\nimport { setToken, setRole } from '../utils/auth';\nimport { jsxDEV as _jsxDEV } from \"react/jsx-dev-runtime\";\nfunction Login({\n  onLogin\n}) {\n  _s();\n  const [form, setForm] = useState({\n    username: '',\n    password: ''\n  });\n  const [msg, setMsg] = useState('');\n  const [loading, setLoading] = useState(false);\n  const handleChange = e => setForm({\n    ...form,\n    [e.target.name]: e.target.value\n  });\n  const handleSubmit = async e => {\n    e.preventDefault();\n    setLoading(true);\n    setMsg('');\n    const res = await login(form);\n    setLoading(false);\n    if (res.token) {\n      setToken(res.token);\n      setRole(res.role);\n      onLogin();\n    } else {\n      setMsg(res.msg || '로그인 실패');\n    }\n  };\n  return /*#__PURE__*/_jsxDEV(\"form\", {\n    onSubmit: handleSubmit,\n    className: \"form-massively-login\",\n    children: [/*#__PURE__*/_jsxDEV(\"style\", {\n      children: `\n        .form-massively-login {\n          display: flex;\n          flex-direction: column;\n          gap: 1.2em;\n          min-width: 260px;\n        }\n        .login-input {\n          border: 1.5px solid #d4d7ef;\n          border-radius: 0.6em;\n          font-size: 1.1em;\n          padding: 0.95em 1.1em;\n          background: #f8fafd;\n          outline: none;\n          transition: border .16s;\n        }\n        .login-input:focus {\n          border-color: #4361ee;\n          background: #fff;\n        }\n        .login-btn {\n          width: 100%;\n          background: linear-gradient(90deg,#4361ee 0%,#4895ef 100%);\n          color: #fff; font-weight: 700;\n          font-size: 1.11em;\n          padding: 0.95em 0;\n          border-radius: 0.8em;\n          border: none;\n          box-shadow: 0 4px 16px 0 rgba(60,60,130,0.09);\n          cursor: pointer;\n          transition: background .17s, box-shadow .17s;\n        }\n        .login-btn:hover, .login-btn:focus {\n          background: linear-gradient(90deg,#4361ee 12%,#4895ef 100%);\n          box-shadow: 0 6px 18px 0 rgba(60,60,130,0.11);\n        }\n        .login-error-msg {\n          color: #e32636;\n          margin-top: 0.3em;\n          text-align: center;\n          font-size: 0.98em;\n        }\n        .login-label {\n          font-size: 1.04em;\n          margin-bottom: 0.15em;\n          color: #4361ee;\n          font-weight: 600;\n        }\n        @media (max-width: 500px) {\n          .form-massively-login { min-width: 95vw; }\n        }\n      `\n    }, void 0, false, {\n      fileName: _jsxFileName,\n      lineNumber: 27,\n      columnNumber: 7\n    }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n      children: [/*#__PURE__*/_jsxDEV(\"label\", {\n        htmlFor: \"username\",\n        className: \"login-label\",\n        children: \"\\uC544\\uC774\\uB514\"\n      }, void 0, false, {\n        fileName: _jsxFileName,\n        lineNumber: 80,\n        columnNumber: 9\n      }, this), /*#__PURE__*/_jsxDEV(\"input\", {\n        className: \"login-input\",\n        id: \"username\",\n        name: \"username\",\n        autoComplete: \"username\",\n        onChange: handleChange,\n        placeholder: \"ID\",\n        required: true,\n        value: form.username\n      }, void 0, false, {\n        fileName: _jsxFileName,\n        lineNumber: 81,\n        columnNumber: 9\n      }, this)]\n    }, void 0, true, {\n      fileName: _jsxFileName,\n      lineNumber: 79,\n      columnNumber: 7\n    }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n      children: [/*#__PURE__*/_jsxDEV(\"label\", {\n        htmlFor: \"password\",\n        className: \"login-label\",\n        children: \"\\uBE44\\uBC00\\uBC88\\uD638\"\n      }, void 0, false, {\n        fileName: _jsxFileName,\n        lineNumber: 93,\n        columnNumber: 9\n      }, this), /*#__PURE__*/_jsxDEV(\"input\", {\n        className: \"login-input\",\n        id: \"password\",\n        name: \"password\",\n        type: \"password\",\n        autoComplete: \"current-password\",\n        onChange: handleChange,\n        placeholder: \"\\uBE44\\uBC00\\uBC88\\uD638\",\n        required: true,\n        value: form.password\n      }, void 0, false, {\n        fileName: _jsxFileName,\n        lineNumber: 94,\n        columnNumber: 9\n      }, this)]\n    }, void 0, true, {\n      fileName: _jsxFileName,\n      lineNumber: 92,\n      columnNumber: 7\n    }, this), /*#__PURE__*/_jsxDEV(\"button\", {\n      className: \"login-btn\",\n      type: \"submit\",\n      disabled: loading,\n      children: loading ? \"로그인 중...\" : \"로그인\"\n    }, void 0, false, {\n      fileName: _jsxFileName,\n      lineNumber: 106,\n      columnNumber: 7\n    }, this), msg && /*#__PURE__*/_jsxDEV(\"div\", {\n      className: \"login-error-msg\",\n      children: msg\n    }, void 0, false, {\n      fileName: _jsxFileName,\n      lineNumber: 109,\n      columnNumber: 15\n    }, this)]\n  }, void 0, true, {\n    fileName: _jsxFileName,\n    lineNumber: 26,\n    columnNumber: 5\n  }, this);\n}\n_s(Login, \"SwYiy0TXT/4/0H6WfmfmpAT3pas=\");\n_c = Login;\nexport default Login;\nvar _c;\n$RefreshReg$(_c, \"Login\");","map":{"version":3,"names":["React","useState","login","setToken","setRole","jsxDEV","_jsxDEV","Login","onLogin","_s","form","setForm","username","password","msg","setMsg","loading","setLoading","handleChange","e","target","name","value","handleSubmit","preventDefault","res","token","role","onSubmit","className","children","fileName","_jsxFileName","lineNumber","columnNumber","htmlFor","id","autoComplete","onChange","placeholder","required","type","disabled","_c","$RefreshReg$"],"sources":["D:/LDT/000 Project/LDT/Client/src/pages/Login.js"],"sourcesContent":["import React, { useState } from 'react';\r\nimport { login } from '../api';\r\nimport { setToken, setRole } from '../utils/auth';\r\n\r\nfunction Login({ onLogin }) {\r\n  const [form, setForm] = useState({ username: '', password: '' });\r\n  const [msg, setMsg] = useState('');\r\n  const [loading, setLoading] = useState(false);\r\n\r\n  const handleChange = e => setForm({ ...form, [e.target.name]: e.target.value });\r\n\r\n  const handleSubmit = async e => {\r\n    e.preventDefault();\r\n    setLoading(true);\r\n    setMsg('');\r\n    const res = await login(form);\r\n    setLoading(false);\r\n    if (res.token) {\r\n      setToken(res.token); setRole(res.role); onLogin();\r\n    } else {\r\n      setMsg(res.msg || '로그인 실패');\r\n    }\r\n  };\r\n\r\n  return (\r\n    <form onSubmit={handleSubmit} className=\"form-massively-login\">\r\n      <style>{`\r\n        .form-massively-login {\r\n          display: flex;\r\n          flex-direction: column;\r\n          gap: 1.2em;\r\n          min-width: 260px;\r\n        }\r\n        .login-input {\r\n          border: 1.5px solid #d4d7ef;\r\n          border-radius: 0.6em;\r\n          font-size: 1.1em;\r\n          padding: 0.95em 1.1em;\r\n          background: #f8fafd;\r\n          outline: none;\r\n          transition: border .16s;\r\n        }\r\n        .login-input:focus {\r\n          border-color: #4361ee;\r\n          background: #fff;\r\n        }\r\n        .login-btn {\r\n          width: 100%;\r\n          background: linear-gradient(90deg,#4361ee 0%,#4895ef 100%);\r\n          color: #fff; font-weight: 700;\r\n          font-size: 1.11em;\r\n          padding: 0.95em 0;\r\n          border-radius: 0.8em;\r\n          border: none;\r\n          box-shadow: 0 4px 16px 0 rgba(60,60,130,0.09);\r\n          cursor: pointer;\r\n          transition: background .17s, box-shadow .17s;\r\n        }\r\n        .login-btn:hover, .login-btn:focus {\r\n          background: linear-gradient(90deg,#4361ee 12%,#4895ef 100%);\r\n          box-shadow: 0 6px 18px 0 rgba(60,60,130,0.11);\r\n        }\r\n        .login-error-msg {\r\n          color: #e32636;\r\n          margin-top: 0.3em;\r\n          text-align: center;\r\n          font-size: 0.98em;\r\n        }\r\n        .login-label {\r\n          font-size: 1.04em;\r\n          margin-bottom: 0.15em;\r\n          color: #4361ee;\r\n          font-weight: 600;\r\n        }\r\n        @media (max-width: 500px) {\r\n          .form-massively-login { min-width: 95vw; }\r\n        }\r\n      `}</style>\r\n      <div>\r\n        <label htmlFor=\"username\" className=\"login-label\">아이디</label>\r\n        <input\r\n          className=\"login-input\"\r\n          id=\"username\"\r\n          name=\"username\"\r\n          autoComplete=\"username\"\r\n          onChange={handleChange}\r\n          placeholder=\"ID\"\r\n          required\r\n          value={form.username}\r\n        />\r\n      </div>\r\n      <div>\r\n        <label htmlFor=\"password\" className=\"login-label\">비밀번호</label>\r\n        <input\r\n          className=\"login-input\"\r\n          id=\"password\"\r\n          name=\"password\"\r\n          type=\"password\"\r\n          autoComplete=\"current-password\"\r\n          onChange={handleChange}\r\n          placeholder=\"비밀번호\"\r\n          required\r\n          value={form.password}\r\n        />\r\n      </div>\r\n      <button className=\"login-btn\" type=\"submit\" disabled={loading}>\r\n        {loading ? \"로그인 중...\" : \"로그인\"}\r\n      </button>\r\n      {msg && <div className=\"login-error-msg\">{msg}</div>}\r\n    </form>\r\n  );\r\n}\r\nexport default Login;\r\n"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}