// 웹 스크린 D — 회원가입 · 학교 인증 (이메일/서류)
const NICKNAME_RE = /^[가-힣a-zA-Z0-9 ]+$/;
function WScrRegister({S, set, go}) {
  const {useState} = React;
  const [errs, setErrs] = useState({});
  const [submitting, setSubmitting] = useState(false);
  const [confirmPw, setConfirmPw] = useState(''); // 보안상 서션에 저장되지 않는 로컬 state — 새로고침 시 복원되지 않음(의도된 동작)
  const isKakao = S.authMethod==='kakao';
  const nameOk = S.regName.trim() && NICKNAME_RE.test(S.regName);
  const valid = nameOk && (isKakao || (S.signupEmail.includes('@') && S.signupPassword.length>=8 && confirmPw===S.signupPassword));
  const dirty = !!(S.regName.trim() || S.signupEmail.trim() || S.signupPassword.trim());
  const backToLogin = () => {
    const cancel = () => { setConfirmPw(''); set({screen:'signup', authMethod:null, regName:'', signupEmail:'', signupPassword:'', pendingRegistration:false, cancelRegisterConfirm:false}); };
    if (dirty) set({cancelRegisterConfirm:true}); else cancel();
  };
  const focusFirstError = (e) => { const id = e.regName?'w-reg-name':e.email?'w-reg-email':e.password?'w-reg-pw':e.confirmPw?'w-reg-pw2':null; if (id) setTimeout(()=>{ const el=document.getElementById(id); el&&el.focus(); }, 30); };
  const submit = () => {
    if (submitting) return;
    const e = {};
    if (!S.regName.trim()) e.regName = '닉네임을 입력해 주세요.';
    else if (!NICKNAME_RE.test(S.regName)) e.regName = '한글, 영문, 숫자, 띄어쓰기만 사용할 수 있어요.';
    if (!isKakao) {
      if (!S.signupEmail.trim()) e.email = '이메일을 입력해 주세요.';
      else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(S.signupEmail)) e.email = '올바른 이메일 형식을 입력해 주세요.';
      if (!S.signupPassword) e.password = '비밀번호를 입력해 주세요.';
      else if (S.signupPassword.length<8) e.password = '비밀번호는 8자 이상이어야 해요.';
      if (!e.password) { if (!confirmPw) e.confirmPw = '비밀번호를 한 번 더 입력해 주세요.'; else if (confirmPw!==S.signupPassword) e.confirmPw = '비밀번호가 일치하지 않아요.'; }
    }
    if (Object.keys(e).length) { setErrs(e); focusFirstError(e); return; }
    if (Object.keys(e).length) { setErrs(e); focusFirstError(e); return; }
    setErrs({}); setSubmitting(true);
    if (isKakao) {
      // 카카오는 실제 OAuth 연동 전까지 데모로 유지 (카카오 API 키 발급 후 교체 예정)
      setTimeout(()=>{
        setSubmitting(false); setConfirmPw('');
        set({profile:{...S.profile, nickname:S.regName}});
        go('consent');
      }, 500);
      return;
    }
    authSignUp(S.signupEmail.trim(), S.signupPassword).then(res=>{
      setSubmitting(false);
      if (res.skipped) { setErrs({general:'서버 연동이 안 돼 있어서 지금은 가입할 수 없어요.'}); return; }
      if (res.error) { setErrs({general:res.error}); return; }
      setConfirmPw('');
      set({profile:{...S.profile, nickname:S.regName}, acctEmail:S.signupEmail.trim()});
      go('emailverify');
    });
  };
  return <div className="wapp auth-page">
    <AuthDecor/>
    <div className="wmain" style={{maxWidth:520}} onKeyDown={e=>{ if(e.key==='Enter'){ e.preventDefault(); submit(); } }}>
      <button className="wback" onClick={backToLogin}><Ic n="IconNormalChevronLeftNameChevronLeftTightFalseThick" s={14}/>로그인으로 돌아가기</button>
      <div className="wbrand" style={{fontSize:20,margin:'16px 0 20px'}}><img src={asset('assets/modumoyeo-icon.png')} alt="" style={{width:22,height:22,borderRadius:6,verticalAlign:'-5px',marginRight:8,objectFit:'cover'}} onError={e=>{e.target.style.display='none';}}/>modu<b>moyeo</b></div>
      <h2 style={{fontSize:22,fontWeight:800,margin:'0 0 14px'}}>회원가입</h2>
      {errs.general&&<div role="alert" aria-live="assertive" style={{background:'var(--c-red-bg,#fdeaea)', color:'var(--c-red)', border:'1px solid var(--c-red)', borderRadius:8, padding:'10px 12px', marginBottom:14, fontSize:13, fontWeight:600}}>{errs.general}</div>}
      {isKakao?<Chip icon="IconNormalLogoKakaoNameLogoKakao" label="카카오 인증 완료" tone="green" style={{marginBottom:16}}/>:<Chip label="이메일 가입" tone="primary" style={{marginBottom:16}}/>}
      <div style={{marginBottom:14}}>
        <div className="meta" style={{marginBottom:6}}>닉네임</div>
        <input id="w-reg-name" value={S.regName} onChange={e=>{set({regName:e.target.value}); if(errs.regName) setErrs(x=>({...x,regName:null}));}} placeholder="다른 사람에게 보이는 이름이에요" aria-invalid={!!errs.regName||undefined} aria-describedby={errs.regName?'w-reg-name-err':undefined} style={{width:'100%', border:'1px solid '+(errs.regName?'var(--c-red)':'var(--c-line)'), borderRadius:8, padding:'10px 14px', fontFamily:'inherit', fontSize:14, outline:'none'}}/>
        {errs.regName&&<div id="w-reg-name-err" className="meta" style={{color:'var(--c-red)', marginTop:5, fontSize:12}}>{errs.regName}</div>}
      </div>
      {!isKakao&&<>
        <div style={{marginBottom:14}}>
          <div className="meta" style={{marginBottom:6}}>이메일</div>
          <EmailField id="w-reg-email" value={S.signupEmail} onChange={v=>{set({signupEmail:v}); if(errs.email) setErrs(x=>({...x,email:null}));}} externalError={errs.email}/>
        </div>
        <div style={{marginBottom:14}}>
          <div className="meta" style={{marginBottom:6}}>비밀번호</div>
          <PasswordField id="w-reg-pw" autoComplete="new-password" value={S.signupPassword} onChange={v=>{set({signupPassword:v}); if(errs.password) setErrs(x=>({...x,password:null})); if(errs.confirmPw && v===confirmPw) setErrs(x=>({...x,confirmPw:null}));}} externalError={errs.password} showRequirements/>
        </div>
        <div style={{marginBottom:14}}>
          <div className="meta" style={{marginBottom:6}}>비밀번호 확인</div>
          <PasswordField id="w-reg-pw2" autoComplete="new-password" value={confirmPw} placeholder="비밀번호를 한 번 더 입력해 주세요" onChange={v=>{setConfirmPw(v); if(errs.confirmPw && (v===S.signupPassword)) setErrs(x=>({...x,confirmPw:null}));}} externalError={errs.confirmPw}/>
        </div>
      </>}
      <div className="notice" style={{margin:'16px 0'}}><Ic n="IconNormalCircleInfo2NameCircleInfoFillFalse" s={16}/><span>학교, 학교 인증, 자기소개는 가입 후 프로필 완성하기에서 선택적으로 채울 수 있어요.</span></div>
      <DSBtn label={submitting?'가입 처리 중…':'다음'} disable={submitting} onClick={submit}/>
      <p className="meta" style={{margin:'18px 2px 0', textAlign:'center'}}>이미 계정이 있으신가요? <button onClick={backToLogin} style={{background:'none',border:'none',color:'var(--c-primary)',fontFamily:'inherit',fontSize:13.5,fontWeight:700,cursor:'pointer',padding:0}}>로그인</button></p>
    </div>
    {S.cancelRegisterConfirm&&<CancelRegisterModal onClose={()=>set({cancelRegisterConfirm:false})} onConfirm={()=>{ setConfirmPw(''); set({screen:'signup', authMethod:null, regName:'', signupEmail:'', signupPassword:'', pendingRegistration:false, cancelRegisterConfirm:false}); }}/>}
  </div>;
}
function CancelRegisterModal({onClose, onConfirm}) {
  const dialogRef = useModalA11y(true, onClose);
  return <div style={{position:'fixed',inset:0,background:'rgba(0,0,0,.4)',display:'flex',alignItems:'center',justifyContent:'center',zIndex:100}} onClick={onClose}>
    <div className="card" role="dialog" aria-modal="true" aria-labelledby="cancel-reg-title" ref={dialogRef} onClick={e=>e.stopPropagation()} style={{maxWidth:340,padding:24,background:'var(--c-bg)'}}>
      <p id="cancel-reg-title" style={{margin:'0 0 18px',fontSize:14.5,lineHeight:1.6}}>입력 중인 회원가입 정보를 취소하고 로그인 화면으로 이동할까요?</p>
      <div style={{display:'flex',gap:8}}>
        <button onClick={onClose} style={{flex:1,padding:'10px 0',borderRadius:8,border:'1px solid var(--c-line)',background:'none',fontFamily:'inherit',fontSize:13.5,fontWeight:600,cursor:'pointer'}}>계속 작성</button>
        <button onClick={onConfirm} style={{flex:1,padding:'10px 0',borderRadius:8,border:'none',background:'var(--c-red)',color:'#fff',fontFamily:'inherit',fontSize:13.5,fontWeight:700,cursor:'pointer'}}>회원가입 취소하고 로그인</button>
      </div>
    </div>
  </div>;
}
function WScrSchoolEmail({S, set, go}) {
  const {useState, useEffect, useRef} = React;
  const step = S.schoolEmailStep;
  const [sending, setSending] = useState(false);
  const [codeErr, setCodeErr] = useState('');
  const [attempts, setAttempts] = useState(0);
  const [checking, setChecking] = useState(false);
  const [secondsLeft, setSecondsLeft] = useState(0);
  const [resendCooldown, setResendCooldown] = useState(0);
  const timerRef = useRef(null);
  useEffect(()=>{
    if (step!==1) return;
    setSecondsLeft(60); setResendCooldown(30);
    const t = setInterval(()=>{
      setSecondsLeft(s=>Math.max(0,s-1));
      setResendCooldown(s=>Math.max(0,s-1));
    }, 1000);
    return ()=>clearInterval(t);
  }, [step]);
  const send = () => {
    if (sending) return;
    if (!DEMO_MODE) { set({toast:'인증 메일 발송 기능을 준비하고 있어요. 현재 공개 버전에서는 이용할 수 없습니다.'}); return; }
    setSending(true);
    setTimeout(()=>{ setSending(false); setAttempts(0); setCodeErr(''); set({schoolEmailStep:1, schoolCode:'', toast:'인증번호를 발송했어요'}); }, 600);
  };
  const resend = () => {
    if (resendCooldown>0 || sending) return;
    setSending(true);
    setTimeout(()=>{ setSending(false); setSecondsLeft(60); setResendCooldown(30); set({schoolCode:'', toast:'인증번호를 다시 보냈어요.'}); }, 600);
  };
  const confirm = () => {
    if (checking) return;
    if (!(S.schoolCode||'').trim()) return;
    if (attempts>=5) { setCodeErr('인증 시도가 너무 많아요. 잠시 후 다시 시도해 주세요.'); return; }
    if (secondsLeft<=0) { setCodeErr('인증번호가 만료됐어요. 새 인증번호를 받아주세요.'); return; }
    setChecking(true);
    setTimeout(()=>{
      setChecking(false);
      if ((S.schoolCode||'').trim()!=='123456') { setAttempts(a=>a+1); setCodeErr('인증번호가 올바르지 않아요. 다시 확인해 주세요.'); return; }
      setCodeErr('');
      set({schoolEmailStep:2, schoolBadges:[...new Set([...S.schoolBadges,'학교 이메일 인증'])], toast:'학교 이메일이 확인됐어요'});
    }, 500);
  };
  return <div className="wapp auth-page">
    <AuthDecor/>
    <div className="wmain" style={{maxWidth:480}}>
      <button className="wback" onClick={()=>go('profile')}><Ic n="IconNormalChevronLeftNameChevronLeftTightFalseThick" s={14}/>프로필로</button>
      <h2 style={{fontSize:20,fontWeight:800,margin:'8px 0 20px'}}>학교 이메일 인증</h2>
      {DEMO_MODE&&step===1&&<div className="meta" style={{background:'var(--c-fill-a)', borderRadius:8, padding:'8px 12px', marginBottom:16, lineHeight:1.6}}>실패 상태 테스트: 정답 인증번호는 <code>123456</code>. 다른 값은 오류, 60초 후 만료.</div>}
      <div style={{display:'flex', gap:8, marginBottom:22}}>
        {['이메일 입력','인증번호 전송','확인 완료'].map((t,i)=><div key={t} style={{flex:1, textAlign:'center'}}>
          <div style={{width:28, height:28, borderRadius:'50%', margin:'0 auto 6px', display:'flex', alignItems:'center', justifyContent:'center', fontSize:13, fontWeight:700, background:step>=i?'var(--c-primary)':'var(--c-fill)', color:step>=i?'#fff':'var(--c-faint)'}}>{i+1}</div>
          <div style={{fontSize:11.5, color:'var(--c-faint)'}}>{t}</div>
        </div>)}
      </div>
      {step===0&&<>
        <div className="meta" style={{marginBottom:6}}>학교 이메일</div>
        <input type="email" value={S.schoolEmail} onChange={e=>set({schoolEmail:e.target.value})} placeholder="name@university.ac.kr" style={{width:'100%', border:'1px solid var(--c-line)', borderRadius:8, padding:'10px 14px', fontFamily:'inherit', fontSize:14, outline:'none', marginBottom:16}}/>
        <DSBtn label={sending?'인증번호 보내는 중…':'인증번호 보내기'} disable={!S.schoolEmail.includes('@')||sending} onClick={send}/>
        <p className="meta" style={{margin:'20px 2px', lineHeight:1.6}}>학교 이메일을 사용할 수 없는 졸업생을 위한 보조 방식이 있어요.</p>
        <button style={{background:'none', border:'none', color:'var(--c-primary)', fontFamily:'inherit', fontSize:13.5, fontWeight:600, cursor:'pointer', padding:0}} onClick={()=>go('schooldocs')}>서류로 인증할래요</button>
      </>}
      {step===1&&<>
        <div className="meta" style={{marginBottom:6}}>인증번호 6자리 · {secondsLeft>0?`${secondsLeft}초 후 만료`:'만료됨'}</div>
        <input id="w-school-code" value={S.schoolCode||''} onChange={e=>{set({schoolCode:e.target.value}); if(codeErr) setCodeErr('');}} placeholder="000000" aria-invalid={!!codeErr||undefined} aria-describedby={codeErr?'w-school-code-err':undefined} style={{width:'100%', border:'1px solid '+(codeErr?'var(--c-red)':'var(--c-line)'), borderRadius:8, padding:'10px 14px', fontFamily:'inherit', fontSize:14, outline:'none', marginBottom:6, letterSpacing:4}}/>
        {codeErr&&<div id="w-school-code-err" role="alert" aria-live="assertive" className="meta" style={{color:'var(--c-red)', marginBottom:10, fontSize:12}}>{codeErr}</div>}
        <div style={{marginBottom:16}}><DSBtn label={checking?'확인 중…':'확인하기'} disable={!(S.schoolCode||'').trim()||checking} onClick={confirm}/></div>
        <button style={{background:'none', border:'none', color:resendCooldown>0?'var(--c-faint)':'var(--c-primary)', fontFamily:'inherit', fontSize:13, fontWeight:600, cursor:resendCooldown>0?'default':'pointer', padding:0, minHeight:44}} disabled={resendCooldown>0||sending} onClick={resend}>{resendCooldown>0?`인증번호 재전송 (${resendCooldown}초 후 가능)`:'인증번호 재전송'}</button>
      </>}
      {step===2&&<div style={{textAlign:'center', padding:'24px 0'}}>
        <Ic n="IconNormalVerifiedCheck2NameVerifiedCheckFillFillTrue" s={44} c="var(--c-green)"/>
        <h2 style={{fontSize:19, margin:'16px 0 8px'}}>학교 이메일 인증 완료</h2>
        <p style={{fontSize:14, color:'var(--c-sub)', margin:'0 0 22px'}}>프로필에 &ldquo;학교 이메일 인증&rdquo; 배지가 추가됐어요.</p>
        <DSBtn label="프로필로 돌아가기" variant="outlined" onClick={()=>go('profile')}/>
      </div>}
    </div>
  </div>;
}
// 학생증(서류) 인증은 아직 실제로 제출·검토되는 경로가 없어(파일이 저장되지 않음) 정직하게 '준비 중'으로 안내하고, 지금 되는 학교 이메일 인증으로 안내한다.
function WScrSchoolDocs({S, set, go}) {
  return <div className="wapp auth-page">
    <AuthDecor/>
    <div className="wmain" style={{maxWidth:480, textAlign:'center'}}>
      <Ic n="IconNormalClockNameClockFillFalse" s={44} c="var(--c-faint)"/>
      <h2 style={{fontSize:19, margin:'16px 0 8px'}}>학생증 인증은 준비 중이에요</h2>
      <p style={{fontSize:14, color:'var(--c-sub)', lineHeight:1.6, margin:'0 0 22px'}}>서류로 인증하는 방법은 아직 만들고 있어요. 지금은 학교 이메일 인증을 이용해주세요.</p>
      <div style={{display:'flex', flexDirection:'column', gap:8}}>
        <DSBtn label="학교 이메일로 인증하기" onClick={()=>go('schoolemail')}/>
        <DSBtn label="프로필로 돌아가기" variant="outlined" onClick={()=>go('profile')}/>
      </div>
    </div>
  </div>;
}
function WScrEmailVerify({S,set,go}){
  const {useEffect, useState} = React;
  const verified = S.emailVerified;
  const [checking, setChecking] = useState(false);
  const [resent, setResent] = useState(false);
  const checkNow = () => {
    if (checking) return;
    setChecking(true);
    authGetSession().then(session=>{
      setChecking(false);
      if (session && session.user && session.user.email_confirmed_at) {
        set({emailVerified:true, toast:'이메일 인증 완료!'});
      } else if (DEMO_MODE) {
        // 서버 미연동(로컬 데모)일 때만 즉시 통과 처리
        set({emailVerified:true, toast:'데모: 이메일 인증을 완료 처리했어요'});
      } else {
        set({toast:'아직 인증이 확인되지 않았어요 — 메일함(스팸함 포함)에서 링크를 눌러주세요.'});
      }
    });
  };
  useEffect(()=>{
    if (verified) return;
    const t = setInterval(()=>{
      authGetSession().then(session=>{
        if (session && session.user && session.user.email_confirmed_at) set({emailVerified:true, toast:'이메일 인증 완료!'});
      });
    }, 4000);
    return ()=>clearInterval(t);
  }, [verified]);
  const resend = () => {
    authResendConfirmation(S.signupEmail).then(res=>{
      if (res.error) { set({toast:res.error}); return; }
      setResent(true);
      set({toast:'인증 메일을 다시 보냈어요'});
    });
  };
  const steps = ['이메일 확인 필요','인증 완료'];
  const stepIdx = !verified?0:1;
  return <div className="wapp auth-page">
    <AuthDecor/>
    <div className="wmain" style={{maxWidth:480, textAlign:'center'}}>
      <div style={{display:'flex', gap:6, marginBottom:26}}>
        {steps.map((t,i)=><div key={t} style={{flex:1, textAlign:'center'}}>
          <div style={{width:26, height:26, borderRadius:'50%', margin:'0 auto 6px', display:'flex', alignItems:'center', justifyContent:'center', fontSize:12, fontWeight:700, background:stepIdx>=i?'var(--c-primary)':'var(--c-fill)', color:stepIdx>=i?'#fff':'var(--c-faint)'}}>{i+1}</div>
          <div style={{fontSize:10.5, color:stepIdx>=i?'var(--c-text)':'var(--c-faint)', lineHeight:1.3}}>{t}</div>
        </div>)}
      </div>
      {!verified?<>
        <Ic n="IconNormalBell2NameBellFillFillTrue" s={44} c="var(--c-primary)"/>
        <h2 style={{fontSize:19, margin:'18px 0 8px'}}>인증 메일을 보냈어요</h2>
        <p style={{margin:'0 0 4px', fontSize:14, color:'var(--c-sub)', lineHeight:1.7}}><b>{S.signupEmail||'you@example.com'}</b>로 인증 메일을 보냈어요.</p>
        <p style={{margin:'0 0 22px', fontSize:14, color:'var(--c-sub)', lineHeight:1.7}}>메일함(스팸함도 확인해주세요)에서 인증 링크를 눌러주세요. 누르시면 이 화면이 자동으로 다음 단계로 넘어가요.</p>
        <DSBtn label={checking?'확인 중…':'인증 확인했어요'} size="md" onClick={checkNow} disable={checking} style={{marginBottom:10}}/>
        <button style={{background:'none', border:'none', color:'var(--c-primary)', fontFamily:'inherit', fontSize:13.5, fontWeight:700, cursor:'pointer', padding:0, marginBottom:16}} onClick={resend} disabled={resent}>{resent?'다시 보냈어요':'인증 메일 다시 보내기'}</button>
        <div className="row" style={{gap:8, justifyContent:'center'}}><span className="spinner"></span><span className="meta">자동으로 확인 중이에요…</span></div>
      </>:<>
        <Ic n="IconNormalCircleCheck2NameCircleCheckFillFillTrue" s={44} c="var(--c-green)"/>
        <h2 style={{fontSize:19, margin:'18px 0 8px'}}>인증 완료</h2>
        <p style={{margin:'0 0 22px', fontSize:14, color:'var(--c-sub)', lineHeight:1.7}}>이메일 인증이 끝났어요. 학교 인증은 선택사항이고, 프로필에서 언제든 진행할 수 있어요.</p>
        <DSBtn label="계속하기" onClick={()=>go('consent')}/>
      </>}
    </div>
  </div>;
}
// 비밀번호 재설정 메일의 링크를 눌러 돌아왔을 때 보여주는 새 비밀번호 입력 화면.
// 이 화면에 도착했다는 것 자체가 Supabase의 임시 복구 세션이 이미 열려 있다는 뜻이라, 현재 비밀번호 확인 없이 바로 새 비밀번호를 설정할 수 있다.
function WScrResetPassword({S, set, go}){
  const {useState} = React;
  const [pw, setPw] = useState('');
  const [pw2, setPw2] = useState('');
  const [err, setErr] = useState('');
  const [busy, setBusy] = useState(false);
  const submit = () => {
    if (busy) return;
    if (pw.length<8) { setErr('비밀번호는 8자 이상이어야 해요.'); return; }
    if (pw!==pw2) { setErr('비밀번호가 일치하지 않아요.'); return; }
    setErr(''); setBusy(true);
    authChangePassword(pw).then(res=>{
      if (res.skipped) { setBusy(false); setErr('서버 연동이 안 돼 있어서 지금은 변경할 수 없어요.'); return; }
      if (res.error) { setBusy(false); setErr(res.error); return; }
      authSignOut().then(()=>{
        setBusy(false);
        set({...logoutAccount(BASE), toast:'비밀번호가 변경됐어요 — 새 비밀번호로 다시 로그인해주세요'});
        go('signup');
      });
    });
  };
  return <div className="wapp auth-page">
    <AuthDecor/>
    <div className="wmain" style={{maxWidth:420}} onKeyDown={e=>{ if(e.key==='Enter'){ e.preventDefault(); submit(); } }}>
      <div className="wbrand" style={{fontSize:20,marginBottom:24}}><img src={asset('assets/modumoyeo-icon.png')} alt="" style={{width:22,height:22,borderRadius:6,verticalAlign:'-5px',marginRight:8,objectFit:'cover'}} onError={e=>{e.target.style.display='none';}}/>modu<b>moyeo</b></div>
      <h2 style={{fontSize:22,fontWeight:800,margin:'0 0 16px'}}>새 비밀번호 설정</h2>
      {err&&<div role="alert" aria-live="assertive" style={{background:'var(--c-red-bg,#fdeaea)', color:'var(--c-red)', border:'1px solid var(--c-red)', borderRadius:8, padding:'10px 12px', marginBottom:16, fontSize:13, fontWeight:600}}>{err}</div>}
      <div style={{marginBottom:14}}>
        <div className="meta" style={{marginBottom:6}}>새 비밀번호</div>
        <PasswordField value={pw} onChange={setPw} placeholder="8자 이상" showRequirements autoComplete="new-password"/>
      </div>
      <div style={{marginBottom:20}}>
        <div className="meta" style={{marginBottom:6}}>새 비밀번호 확인</div>
        <PasswordField value={pw2} onChange={setPw2} placeholder="한 번 더 입력해주세요" autoComplete="new-password"/>
      </div>
      <DSBtn label={busy?'변경 중…':'비밀번호 변경'} disable={busy} onClick={submit}/>
    </div>
  </div>;
}
Object.assign(window, {WScrRegister, WScrSchoolEmail, WScrSchoolDocs, WScrResetPassword});
