diff --git a/.github/delete-merged-branch-config.yml b/week4/.github/delete-merged-branch-config.yml
similarity index 100%
rename from .github/delete-merged-branch-config.yml
rename to week4/.github/delete-merged-branch-config.yml
diff --git a/.github/pull_request_template.md b/week4/.github/pull_request_template.md
similarity index 100%
rename from .github/pull_request_template.md
rename to week4/.github/pull_request_template.md
diff --git a/.gitignore b/week4/.gitignore
similarity index 100%
rename from .gitignore
rename to week4/.gitignore
diff --git a/faq.html b/week4/faq.html
similarity index 100%
rename from faq.html
rename to week4/faq.html
diff --git a/week4/folder.html b/week4/folder.html
new file mode 100644
index 000000000..8a8b016e4
--- /dev/null
+++ b/week4/folder.html
@@ -0,0 +1,7 @@
+
+
+
+
+ folder
+
+
diff --git a/images/facebook.svg b/week4/images/facebook.svg
similarity index 100%
rename from images/facebook.svg
rename to week4/images/facebook.svg
diff --git a/images/hero.png b/week4/images/hero.png
similarity index 100%
rename from images/hero.png
rename to week4/images/hero.png
diff --git a/images/image1.png b/week4/images/image1.png
similarity index 100%
rename from images/image1.png
rename to week4/images/image1.png
diff --git a/images/image2.png b/week4/images/image2.png
similarity index 100%
rename from images/image2.png
rename to week4/images/image2.png
diff --git a/images/image3.png b/week4/images/image3.png
similarity index 100%
rename from images/image3.png
rename to week4/images/image3.png
diff --git a/images/image4.png b/week4/images/image4.png
similarity index 100%
rename from images/image4.png
rename to week4/images/image4.png
diff --git a/images/instagram.svg b/week4/images/instagram.svg
similarity index 100%
rename from images/instagram.svg
rename to week4/images/instagram.svg
diff --git a/images/logo.svg b/week4/images/logo.svg
similarity index 100%
rename from images/logo.svg
rename to week4/images/logo.svg
diff --git a/images/meta_image.png b/week4/images/meta_image.png
similarity index 100%
rename from images/meta_image.png
rename to week4/images/meta_image.png
diff --git a/images/sign/eye-off.svg b/week4/images/sign/eye-off.svg
similarity index 100%
rename from images/sign/eye-off.svg
rename to week4/images/sign/eye-off.svg
diff --git a/week4/images/sign/eye-on.svg b/week4/images/sign/eye-on.svg
new file mode 100644
index 000000000..61afee898
--- /dev/null
+++ b/week4/images/sign/eye-on.svg
@@ -0,0 +1,6 @@
+
diff --git a/images/sign/google.png b/week4/images/sign/google.png
similarity index 100%
rename from images/sign/google.png
rename to week4/images/sign/google.png
diff --git a/images/sign/icgoogle.png b/week4/images/sign/icgoogle.png
similarity index 100%
rename from images/sign/icgoogle.png
rename to week4/images/sign/icgoogle.png
diff --git a/images/sign/ickakao.png b/week4/images/sign/ickakao.png
similarity index 100%
rename from images/sign/ickakao.png
rename to week4/images/sign/ickakao.png
diff --git a/images/sign/kakao.png b/week4/images/sign/kakao.png
similarity index 100%
rename from images/sign/kakao.png
rename to week4/images/sign/kakao.png
diff --git a/images/twitter.svg b/week4/images/twitter.svg
similarity index 100%
rename from images/twitter.svg
rename to week4/images/twitter.svg
diff --git a/images/youtube.svg b/week4/images/youtube.svg
similarity index 100%
rename from images/youtube.svg
rename to week4/images/youtube.svg
diff --git a/index.html b/week4/index.html
similarity index 100%
rename from index.html
rename to week4/index.html
diff --git a/week4/js/signModule/email_validation.js b/week4/js/signModule/email_validation.js
new file mode 100644
index 000000000..8544c0980
--- /dev/null
+++ b/week4/js/signModule/email_validation.js
@@ -0,0 +1,55 @@
+import { printError } from "./print_error.js";
+
+const emailInput = document.querySelector('#sign-email');
+const emailForm = emailInput.parentElement;
+
+const emailValidation = /^[A-Za-z0-9_\.\-]+@[A-Za-z0-9\.\-]{1,10}\.[A-za-z0-9\-]{2,3}$/;
+
+// 비어있는지 체크
+function emailEmptyCheck(e) {
+ if(!emailInput.value) {
+ emailInput.classList.add('error');
+ printError(emailInput, '이메일을 입력해주세요.');
+ } else {
+ if(emailForm.querySelector('.error-message')) {
+ emailForm.lastElementChild.remove();
+ }
+ emailValidationCheck(e);
+ }
+}
+
+// 올바른 이메일인지 체크
+function emailValidationCheck(e) {
+ if(emailValidation.test(emailInput.value)) {
+ emailInput.classList.remove('error');
+ if(emailForm.querySelector('.error-message')) {
+ emailForm.lastElementChild.remove();
+ }
+ if(document.querySelector('title').text === '회원가입') {
+ usingEmail(e);
+ }
+ } else {
+ emailInput.classList.add('error');
+ printError(emailInput, '올바른 이메일 주소가 아닙니다.');
+ }
+}
+
+// 사용중인 이메일인지 체크
+function usingEmail(e) {
+ if(emailInput.value === 'test@codeit.com') {
+ emailInput.classList.add('error');
+ printError(emailInput, '이미 사용 중인 이메일입니다.');
+ } else {
+ if(emailInput.parentElement.querySelector('.error')) {
+ emailInput.classList.remove('error');
+ emailInput.parentElement.lastElementChild.remove();
+ }
+ }
+}
+
+// 이벤트 등록
+function emailCheck(em) {
+ em.addEventListener('focusout', emailEmptyCheck, usingEmail);
+}
+
+export { emailInput, emailCheck, emailEmptyCheck, emailValidation };
\ No newline at end of file
diff --git a/week4/js/signModule/eye.js b/week4/js/signModule/eye.js
new file mode 100644
index 000000000..1e360c892
--- /dev/null
+++ b/week4/js/signModule/eye.js
@@ -0,0 +1,26 @@
+const eyes = document.querySelectorAll('.eye');
+
+function eyeBlink (e) {
+ const eyeClass = e.target.parentElement.classList;
+ const pwdText = e.target.parentElement.parentElement.firstElementChild;
+ console.log('o');
+ if(eyeClass.contains('off')) {
+ e.target.src = '../../images/sign/eye-on.svg';
+ eyeClass.remove('off');
+ eyeClass.add('on');
+ pwdText.type = 'text';
+ } else {
+ e.target.src = '../../images/sign/eye-off.svg';
+ eyeClass.remove('on');
+ eyeClass.add('off');
+ pwdText.type = 'password';
+ }
+}
+
+const eyeEvent = function (eyes) {
+ for(let eye of eyes) {
+ eye.addEventListener('click', eyeBlink);
+ }
+}
+
+export { eyes, eyeEvent };
\ No newline at end of file
diff --git a/week4/js/signModule/print_error.js b/week4/js/signModule/print_error.js
new file mode 100644
index 000000000..ca9b3498f
--- /dev/null
+++ b/week4/js/signModule/print_error.js
@@ -0,0 +1,13 @@
+function printError(input, message) {
+ if(input.parentElement.querySelector('.error-message')) {
+ input.parentElement.lastElementChild.remove();
+ }
+ if(!input.parentElement.querySelector('.error-message')) {
+ const emailError = document.createElement('p');
+ emailError.classList.add('error-message');
+ emailError.textContent = message;
+ input.parentElement.append(emailError);
+ }
+}
+
+export { printError };
\ No newline at end of file
diff --git a/week4/js/signModule/pwd_confirm.js b/week4/js/signModule/pwd_confirm.js
new file mode 100644
index 000000000..1c69f76b4
--- /dev/null
+++ b/week4/js/signModule/pwd_confirm.js
@@ -0,0 +1,29 @@
+import { printError } from "./print_error.js";
+import { pwdInput } from "./pwd_validation.js";
+
+const pwdConfirmInput = document.querySelector('#sign-password-confirm');
+const pwdConfirmForm = pwdConfirmInput.parentElement;
+
+// 비밀번호 확인
+function pwdConfirm(e) {
+ if(!pwdConfirmInput.value) {
+ pwdConfirmInput.classList.add('error');
+ printError(pwdConfirmInput, '비밀번호를 확인해주세요.');
+ } else {
+ if(pwdConfirmInput.value !== pwdInput.value) {
+ pwdConfirmInput.classList.add('error');
+ printError(pwdConfirmInput, '비밀번호가 일치하지 않아요.');
+ } else {
+ pwdConfirmInput.classList.remove('error');
+ if(pwdConfirmForm.querySelector('.error-message')) {
+ pwdConfirmForm.lastElementChild.remove();
+ }
+ }
+ }
+};
+
+function pwdConfirmCheck(e) {
+ pwdConfirmInput.addEventListener('focusout', pwdConfirm);
+};
+
+export { pwdConfirmInput, pwdConfirm, pwdConfirmCheck };
\ No newline at end of file
diff --git a/week4/js/signModule/pwd_validation.js b/week4/js/signModule/pwd_validation.js
new file mode 100644
index 000000000..e1e13ac0d
--- /dev/null
+++ b/week4/js/signModule/pwd_validation.js
@@ -0,0 +1,39 @@
+import { printError } from "./print_error.js";
+
+const pwdInput = document.querySelector('#sign-password');
+const pwdForm = pwdInput.parentElement;
+
+const pwdValidation = /^(?=.*\d)(?=^.{8,15}$)(?=.*[a-zA-Z]).*$/;
+
+// 비어있는지 체크
+function pwdEmptyCheck(e) {
+ if(!pwdInput.value) {
+ pwdInput.classList.add('error');
+ printError(pwdInput, '비밀번호를 입력해주세요.');
+ } else if(pwdInput.value) {
+ if(pwdForm.querySelector('.error-message')) {
+ pwdForm.lastElementChild.remove();
+ }
+ pwdValidationCheck(e);
+ }
+}
+
+// 올바른 형식인지 체크
+function pwdValidationCheck(e) {
+ if(pwdValidation.test(pwdInput.value)) {
+ pwdInput.classList.remove('error');
+ if(pwdForm.querySelector('.error-message')) {
+ pwdForm.lastElementChild.remove();
+ }
+ } else {
+ printError(pwdInput, '비밀번호는 영문, 숫자 조합 8자 이상 입력해 주세요.');
+ pwdInput.classList.add('error');
+ }
+}
+
+// 이벤트 등록
+function pwdCheck(pw) {
+ pw.addEventListener('focusout', pwdEmptyCheck);
+}
+
+export { pwdInput, pwdCheck, pwdEmptyCheck, pwdValidation };
\ No newline at end of file
diff --git a/week4/js/signin.js b/week4/js/signin.js
new file mode 100644
index 000000000..becfbd4a7
--- /dev/null
+++ b/week4/js/signin.js
@@ -0,0 +1,11 @@
+import { eyes, eyeEvent } from './signModule/eye.js';
+import { emailInput, emailCheck } from './signModule/email_validation.js';
+import { pwdInput, pwdCheck } from './signModule/pwd_validation.js';
+import { btn, btnCheck } from './signin_btn.js';
+
+
+
+eyeEvent(eyes);
+emailCheck(emailInput);
+pwdCheck(pwdInput);
+btnCheck(btn);
\ No newline at end of file
diff --git a/week4/js/signin_btn.js b/week4/js/signin_btn.js
new file mode 100644
index 000000000..0af280faa
--- /dev/null
+++ b/week4/js/signin_btn.js
@@ -0,0 +1,24 @@
+import { printError } from "./signModule/print_error.js";
+import { emailInput } from "./signModule/email_validation.js";
+import { pwdInput } from "./signModule/pwd_validation.js";
+
+const btn = document.querySelector('.sign-button');
+
+function btnEmptyCheck(e) {
+ e.preventDefault();
+ if(emailInput.value === 'test@codeit.com' && pwdInput.value === 'codeit101') {
+ location.href = "./folder.html";
+ }
+ else {
+ emailInput.classList.add('error');
+ printError(emailInput, '이메일을 확인해주세요.');
+ pwdInput.classList.add('error');
+ printError(pwdInput, '비밀번호를 확인해주세요.');
+ }
+}
+
+function btnCheck(btn) {
+ btn.addEventListener('click', btnEmptyCheck);
+}
+
+export { btn, btnCheck };
\ No newline at end of file
diff --git a/week4/js/signup.js b/week4/js/signup.js
new file mode 100644
index 000000000..5a8c7ef3f
--- /dev/null
+++ b/week4/js/signup.js
@@ -0,0 +1,12 @@
+import { eyes, eyeEvent } from './signModule/eye.js';
+import { emailInput, emailCheck } from './signModule/email_validation.js';
+import { pwdInput, pwdCheck } from './signModule/pwd_validation.js';
+import { pwdConfirmInput, pwdConfirmCheck } from './signModule/pwd_confirm.js';
+import { btn, btnCheck } from './signup_btn.js';
+
+
+emailCheck(emailInput);
+pwdCheck(pwdInput);
+pwdConfirmCheck(pwdConfirmInput);
+eyeEvent(eyes);
+btnCheck(btn);
\ No newline at end of file
diff --git a/week4/js/signup_btn.js b/week4/js/signup_btn.js
new file mode 100644
index 000000000..6adcda5f8
--- /dev/null
+++ b/week4/js/signup_btn.js
@@ -0,0 +1,25 @@
+import { emailInput, emailEmptyCheck, emailValidation } from "./signModule/email_validation.js";
+import { pwdInput, pwdEmptyCheck, pwdValidation } from "./signModule/pwd_validation.js";
+import { pwdConfirmInput, pwdConfirm } from "./signModule/pwd_confirm.js";
+
+const btn = document.querySelector('.sign-button');
+
+let userEmail = 'test@codeit.com'
+
+function btnSignupCheck(e) {
+ e.preventDefault();
+ if(emailInput.value && emailInput.value !== userEmail && emailValidation.test(emailInput.value)) {
+ if(pwdInput.value && pwdConfirmInput.value === pwdInput.value && pwdValidation.test(pwdInput.value)) {
+ location.href = './folder.html';
+ }
+ }
+}
+
+function btnCheck(btn) {
+ btn.addEventListener('click', btnSignupCheck);
+ btn.addEventListener('click', emailEmptyCheck);
+ btn.addEventListener('click', pwdEmptyCheck);
+ btn.addEventListener('click', pwdConfirm);
+}
+
+export { btn, btnCheck };
\ No newline at end of file
diff --git a/privacy.html b/week4/privacy.html
similarity index 100%
rename from privacy.html
rename to week4/privacy.html
diff --git a/signin.html b/week4/signin.html
similarity index 84%
rename from signin.html
rename to week4/signin.html
index d81529b3a..4b5d1c031 100644
--- a/signin.html
+++ b/week4/signin.html
@@ -28,20 +28,20 @@