diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
deleted file mode 100644
index a85814779..000000000
--- a/.github/pull_request_template.md
+++ /dev/null
@@ -1,27 +0,0 @@
-## 요구사항
-
-### 기본
-
-- [x]
-- []
-- []
-
-### 심화
-
-- [x]
-- []
-
-## 주요 변경사항
-
--
--
-
-## 스크린샷
-
-![image](이미지url)
-
-## 멘토에게
-
--
--
-- 셀프 코드 리뷰를 통해 질문 이어가겠습니다.
diff --git a/1-weekly-mission-week1-main/.gitignore b/1-weekly-mission-week1-main/.gitignore
deleted file mode 100644
index 722d5e71d..000000000
--- a/1-weekly-mission-week1-main/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-.vscode
diff --git a/1-weekly-mission-week1-main/faq.html b/1-weekly-mission-week1-main/faq.html
deleted file mode 100644
index 6612ae103..000000000
--- a/1-weekly-mission-week1-main/faq.html
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
- FAQ
-
-
diff --git a/1-weekly-mission-week1-main/images/facebook.svg b/1-weekly-mission-week1-main/images/facebook.svg
deleted file mode 100644
index b9c9d4939..000000000
--- a/1-weekly-mission-week1-main/images/facebook.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
diff --git a/1-weekly-mission-week1-main/images/hero.png b/1-weekly-mission-week1-main/images/hero.png
deleted file mode 100644
index 11dc528fb..000000000
Binary files a/1-weekly-mission-week1-main/images/hero.png and /dev/null differ
diff --git a/1-weekly-mission-week1-main/images/image1.png b/1-weekly-mission-week1-main/images/image1.png
deleted file mode 100644
index f6355852b..000000000
Binary files a/1-weekly-mission-week1-main/images/image1.png and /dev/null differ
diff --git a/1-weekly-mission-week1-main/images/image2.png b/1-weekly-mission-week1-main/images/image2.png
deleted file mode 100644
index b9a3c674a..000000000
Binary files a/1-weekly-mission-week1-main/images/image2.png and /dev/null differ
diff --git a/1-weekly-mission-week1-main/images/image3.png b/1-weekly-mission-week1-main/images/image3.png
deleted file mode 100644
index 986a39679..000000000
Binary files a/1-weekly-mission-week1-main/images/image3.png and /dev/null differ
diff --git a/1-weekly-mission-week1-main/images/image4.png b/1-weekly-mission-week1-main/images/image4.png
deleted file mode 100644
index 762bdc960..000000000
Binary files a/1-weekly-mission-week1-main/images/image4.png and /dev/null differ
diff --git a/1-weekly-mission-week1-main/images/instagram.svg b/1-weekly-mission-week1-main/images/instagram.svg
deleted file mode 100644
index 0b9337b07..000000000
--- a/1-weekly-mission-week1-main/images/instagram.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
diff --git a/1-weekly-mission-week1-main/images/logo.svg b/1-weekly-mission-week1-main/images/logo.svg
deleted file mode 100644
index 282022090..000000000
--- a/1-weekly-mission-week1-main/images/logo.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-
diff --git a/1-weekly-mission-week1-main/images/twitter.svg b/1-weekly-mission-week1-main/images/twitter.svg
deleted file mode 100644
index 14a6069a1..000000000
--- a/1-weekly-mission-week1-main/images/twitter.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
diff --git a/1-weekly-mission-week1-main/images/youtube.svg b/1-weekly-mission-week1-main/images/youtube.svg
deleted file mode 100644
index 28ed0e8ba..000000000
--- a/1-weekly-mission-week1-main/images/youtube.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-
diff --git a/1-weekly-mission-week1-main/index.html b/1-weekly-mission-week1-main/index.html
deleted file mode 100644
index ead157b64..000000000
--- a/1-weekly-mission-week1-main/index.html
+++ /dev/null
@@ -1,114 +0,0 @@
-
-
-
-
- Linkbrary
-
-
-
-
-
-
-
-
-
- 원하는 링크를
-
- 저장하세요
-
-
- 나중에 읽고 싶은 글, 다시 보고 싶은 영상,
-
- 사고 싶은 옷, 기억하고 싶은 모든 것을
-
- 한 공간에 저장하세요.
-
-
-
-
-
- 링크를 폴더로
-
- 관리하세요
-
-
- 나만의 폴더를 무제한으로 만들고
-
- 다양하게 활용할 수 있습니다.
-
-
-
-
-
- 저장한 링크를
-
- 공유해 보세요
-
-
- 여러 링크를 폴더에 담고 공유할 수 있습니다.
-
- 가족, 친구, 동료들에게 쉽고 빠르게 링크를
-
- 공유해 보세요.
-
-
-
-
-
- 저장한 링크를
-
- 검색해 보세요
-
- 중요한 정보들을 검색으로 쉽게 찾아보세요.
-
-
-
-
-
-
diff --git a/1-weekly-mission-week1-main/privacy.html b/1-weekly-mission-week1-main/privacy.html
deleted file mode 100644
index abf71aaaf..000000000
--- a/1-weekly-mission-week1-main/privacy.html
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
- Privacy
-
-
diff --git a/1-weekly-mission-week1-main/signin.html b/1-weekly-mission-week1-main/signin.html
deleted file mode 100644
index 5dcac9576..000000000
--- a/1-weekly-mission-week1-main/signin.html
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
- 로그인
-
-
diff --git a/1-weekly-mission-week1-main/signup.html b/1-weekly-mission-week1-main/signup.html
deleted file mode 100644
index e7f60c281..000000000
--- a/1-weekly-mission-week1-main/signup.html
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
- 회원가입
-
-
diff --git a/1-weekly-mission-week1-main/src/reset.css b/1-weekly-mission-week1-main/src/reset.css
deleted file mode 100644
index ec6265ebe..000000000
--- a/1-weekly-mission-week1-main/src/reset.css
+++ /dev/null
@@ -1,17 +0,0 @@
-/* user agent stylesheet 초기화 */
-
-* {
- box-sizing: border-box;
- margin: 0;
- font-family: "Pretendard";
-}
-
-html,
-body {
- font-size: 62.5%;
-}
-
-a {
- color: inherit;
- text-decoration: none;
-}
diff --git a/1-weekly-mission-week1-main/src/style.css b/1-weekly-mission-week1-main/src/style.css
deleted file mode 100644
index 8591c47ac..000000000
--- a/1-weekly-mission-week1-main/src/style.css
+++ /dev/null
@@ -1,180 +0,0 @@
-header {
- display: flex;
- flex-direction: column;
- align-items: center;
- width: 100%;
- background-color: #edf7ff;
-}
-
-nav {
- display: flex;
- justify-content: space-between;
- align-items: center;
- position: fixed;
- top: 0;
- width: 100%;
- max-width: 192rem;
- height: 9.4rem;
- padding: 0 20rem;
-}
-
-.hero-header {
- display: flex;
- flex-direction: column;
- align-items: center;
- row-gap: 4rem;
- padding-top: 14rem;
-}
-
-.cta {
- display: flex;
- justify-content: center;
- align-items: center;
- height: 5.4rem;
- cursor: pointer;
- background-image: linear-gradient(135deg, #6d6afe 0%, #6ae3fe 100%);
- border-radius: 0.8rem;
- color: #f5f5f5;
- font-size: 1.8rem;
- font-weight: 600;
-}
-
-.cta-short {
- width: 12.8rem;
-}
-
-.cta-long {
- width: 35rem;
-}
-
-.slogan {
- text-align: center;
- font-size: 6.4rem;
- font-weight: 700;
- line-height: 8rem;
-}
-
-.slogan-gradient {
- background-image: linear-gradient(119deg, #6d6afe 0%, #ff9f9f 100%);
-}
-
-.background-clip-text {
- background-clip: text;
- -webkit-background-clip: text;
- color: transparent;
-}
-
-.hero-image {
- width: 120rem;
- height: 59rem;
-}
-
-article {
- padding-top: 7rem;
- padding-bottom: 12rem;
-}
-
-section {
- display: grid;
- justify-content: center;
- column-gap: 15.7rem;
- row-gap: 1rem;
- width: 100%;
- height: 55rem;
- padding: 50px 0;
-}
-
-section:nth-of-type(odd) {
- grid-template:
- ". image"
- "title image"
- "description image"
- ". image"
- /291px 55rem;
-}
-
-section:nth-of-type(even) {
- grid-template:
- "image ."
- "image title"
- "image description"
- "image ."
- /550px 29.1rem;
-}
-
-.title {
- grid-area: title;
- font-size: 4.8rem;
- font-weight: 700;
- line-height: 5.8rem;
- letter-spacing: -0.03rem;
-}
-
-.title-1-gradient {
- background-image: linear-gradient(117deg, #fe8a8a 2.29%, #a4ceff 100%);
-}
-.title-2-gradient {
- background-image: linear-gradient(304deg, #6fbaff 0%, #ffd88b 100%);
-}
-.title-3-gradient {
- background-image: linear-gradient(133deg, #2945c7 0%, #dbe1f8 100%);
-}
-.title-4-gradient {
- background-image: linear-gradient(310deg, #fe578f 0%, #68e8f9 100%);
-}
-
-.description {
- grid-area: description;
- font-size: 1.6rem;
- font-weight: 500;
- color: #6b6b6b;
- line-height: 150%;
-}
-
-.content-image {
- grid-area: image;
- width: 55rem;
- height: 45rem;
-}
-
-footer {
- display: flex;
- justify-content: center;
- width: 100%;
- height: 16rem;
- padding-top: 3.2rem;
- background-color: #111322;
-}
-
-.footer-box {
- display: flex;
- justify-content: space-between;
- width: 100%;
- max-width: 192rem;
- height: fit-content;
- padding: 0 10.4rem;
-}
-
-.copyright {
- color: #676767;
- font-family: Arial;
- font-size: 1.6rem;
-}
-
-.footer-links {
- display: flex;
- column-gap: 3rem;
- padding-right: 1.8rem;
-}
-
-.footer-link {
- color: #cfcfcf;
- font-family: Arial;
- font-size: 1.6rem;
-}
-
-.sns {
- display: flex;
- column-gap: 1.2rem;
- height: 2rem;
-}
diff --git a/week2/css/reset.css b/css/reset.css
similarity index 100%
rename from week2/css/reset.css
rename to css/reset.css
diff --git a/week3/signin/css/style.css b/css/style.css
similarity index 94%
rename from week3/signin/css/style.css
rename to css/style.css
index 175472e69..3721dd739 100644
--- a/week3/signin/css/style.css
+++ b/css/style.css
@@ -83,6 +83,18 @@ body {
border: 1px solid var(--primary-color);
}
+.form-box.active input {
+ border: 1px solid #ff5b56;
+}
+
+.form-box.active .messeage {
+ display: block;
+ margin: 6px 0 0;
+ color: #ff5b56;
+ font-size: 14px;
+ line-height: 16px;
+}
+
.form-box + .form-box {
margin: 24px 0 0;
}
@@ -168,11 +180,4 @@ body {
.sns-login ul li .kakao {
background: url('../images/ico-kakao.png') no-repeat;
background-size: 100% 42px;
-}
-
-@media screen and (max-width:400px) {
- .inner-wrap {
- width: 100%;
- padding: 0 32px;
- }
}
\ No newline at end of file
diff --git a/folder.html b/folder.html
new file mode 100644
index 000000000..0cc50450c
--- /dev/null
+++ b/folder.html
@@ -0,0 +1,8 @@
+
+
+
+
+
+ folder
+
+
\ No newline at end of file
diff --git a/week2/images/ico-eye-off.svg b/images/ico-eye-off.svg
similarity index 100%
rename from week2/images/ico-eye-off.svg
rename to images/ico-eye-off.svg
diff --git a/week2/images/ico-eye-on.svg b/images/ico-eye-on.svg
similarity index 100%
rename from week2/images/ico-eye-on.svg
rename to images/ico-eye-on.svg
diff --git a/week2/images/ico-google.png b/images/ico-google.png
similarity index 100%
rename from week2/images/ico-google.png
rename to images/ico-google.png
diff --git a/week2/images/ico-kakao.png b/images/ico-kakao.png
similarity index 100%
rename from week2/images/ico-kakao.png
rename to images/ico-kakao.png
diff --git a/week2/images/logo.svg b/images/logo.svg
similarity index 100%
rename from week2/images/logo.svg
rename to images/logo.svg
diff --git a/js/signin.js b/js/signin.js
new file mode 100644
index 000000000..0886818f3
--- /dev/null
+++ b/js/signin.js
@@ -0,0 +1,92 @@
+const form = document.querySelector('form');
+const formBox = document.querySelectorAll('.form-box');
+const emailPattern = /^[A-Za-z0-9.\-_]+@([A-Za-z0-9-]+\.)+[A-Za-z]{2,6}$/;
+const pwPattern = /^(?=.*[a-zA-Z])(?=.*[0-9]).{8,25}$/;
+const userEmail = 'test@codeit.com';
+const emailInput = document.getElementById('signin-email');
+const pwInput = document.getElementById('signin-password');
+const userPw = 'codeit101';
+const btnLogin = document.querySelector('.btn-box .btn-login');
+const eyeOff = document.querySelector('.eye-off');
+
+// 이메일, 비밀번호 유효성 검사
+formBox.forEach((el) => {
+ el.addEventListener('focusout', (e)=> {
+ if(e.target.value === ''){
+ e.currentTarget.classList.add('active');
+
+ el.classList.contains('email') ? e.currentTarget.lastElementChild.textContent = '이메일을 입력하세요' : e.currentTarget.lastElementChild.textContent = '비밀번호를 입력하세요';
+ }else{
+ e.currentTarget.classList.remove('active');
+ e.currentTarget.lastElementChild.textContent = '';
+ validate(emailPattern, pwPattern);
+ }
+
+ function validate(emailPattern, pwPattern){
+ if(el.classList.contains('email')){
+ if(emailPattern.test(e.target.value) === false){
+ e.currentTarget.classList.add('active');
+ e.currentTarget.lastElementChild.textContent = '올바른 이메일 주소가 아닙니다.';
+ }
+ }else{
+ if(pwPattern.test(e.target.value) === false){
+ e.currentTarget.classList.add('active');
+ e.currentTarget.lastElementChild.textContent = '비밀번호는 영문, 숫자 조합 8자 이상 입력해 주세요.';
+ }
+ }
+ }
+ });
+});
+
+// 로그인 버튼 클릭 시 이메일, 비밀번호 일치여부 확인 후 페이지 이동
+function login(e){
+ e.preventDefault();
+
+ formBox.forEach((el) => {
+ if(!el.classList.contains('active')){
+ if(emailInput.value === userEmail && pwInput.value === userPw){
+ form.submit();
+ }else{
+ formBox.forEach((el) => {
+ el.classList.add('active');
+ el.classList.contains('email') ? el.lastElementChild.textContent = '이메일을 확인해주세요.' : el.lastElementChild.textContent = '비밀번호를 확인해주세요.';
+ })
+ }
+ }
+ })
+}
+btnLogin.addEventListener('click', login);
+
+form.addEventListener('keydown', (e) => {
+ if(e.key === 'Enter'){
+ e.preventDefault();
+ }
+})
+
+// 눈 아이콘 클릭 시 비밀번호 안보이게 하기
+function eyeOn(e){
+ e.preventDefault();
+
+ e.target.parentElement.classList.toggle('active');
+ if(e.target.parentElement.classList.contains('active')){
+ e.target.previousElementSibling.setAttribute('type', 'text');
+ e.target.setAttribute('src', './images/ico-eye-on.svg');
+ }else{
+ e.target.previousElementSibling.setAttribute('type', 'password');
+ e.target.setAttribute('src', './images/ico-eye-off.svg');
+ }
+}
+eyeOff.addEventListener('click', eyeOn);
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/js/signup.js b/js/signup.js
new file mode 100644
index 000000000..8ec218d38
--- /dev/null
+++ b/js/signup.js
@@ -0,0 +1,104 @@
+const form = document.querySelector('form');
+const formBox = document.querySelectorAll('.form-box');
+const emailPattern = /^[A-Za-z0-9.\-_]+@([A-Za-z0-9-]+\.)+[A-Za-z]{2,6}$/;
+const pwPattern = /^(?=.*[a-zA-Z])(?=.*[0-9]).{8,25}$/;
+const userEmail = 'test@codeit.com';
+const emailInput = document.getElementById('signin-email');
+const pwInput = document.getElementById('signin-password');
+const userPw = 'codeit101';
+const emailInputUp = document.getElementById('signup-email');
+const pwInputUp = document.getElementById('signup-password');
+const userPwCheck = document.getElementById('signup-check-password');
+const btnJoin = document.querySelector('.btn-box .btn-join');
+const eyeOn = document.querySelectorAll('.eye-on');
+
+// 이메일, 비밀번호 유효성 검사
+formBox.forEach((el) => {
+ el.addEventListener('focusout', (e)=> {
+ if(e.target.value === ''){
+ e.currentTarget.classList.add('active');
+
+ el.classList.contains('email') ? e.currentTarget.lastElementChild.textContent = '이메일을 입력하세요' : e.currentTarget.lastElementChild.textContent = '비밀번호를 입력하세요';
+ }else{
+ if(el.classList.contains('pw')){
+ e.currentTarget.classList.remove('active');
+ e.currentTarget.lastElementChild.textContent = '';
+
+ validate(emailPattern, pwPattern);
+ }
+
+ function validate(emailPattern, pwPattern){
+ if(el.classList.contains('email')){
+ if(emailPattern.test(e.target.value) === false){
+ e.currentTarget.classList.add('active');
+ e.currentTarget.lastElementChild.textContent = '올바른 이메일 주소가 아닙니다.';
+ }
+ }else{
+ if(pwPattern.test(e.target.value) === false){
+ e.currentTarget.classList.add('active');
+ e.currentTarget.lastElementChild.textContent = '비밀번호는 영문, 숫자 조합 8자 이상 입력해 주세요.';
+ }
+ }
+ }
+ }
+ });
+});
+
+// 회원가입 버튼 클릭 시 가입된 이메일 존재 여부 확인 후 페이지 이동
+function join(e){
+ e.preventDefault();
+
+ formBox.forEach((el) => {
+ if(!el.classList.contains('active')){
+ if(emailInputUp.value === userEmail){
+ if(el.classList.contains('email')){
+ el.classList.add('active');
+ el.lastElementChild.textContent = '이미 사용 중인 이메일입니다.';
+ }else{
+ el.classList.remove('active');
+ el.lastElementChild.textContent = '';
+ }
+ }else{
+ form.submit();
+ }
+ }
+ })
+}
+btnJoin.addEventListener('click', join);
+
+// 비밀번호 input과 비밀번호 확인 input의 값이 다른 경우
+function pwCheck(e){
+ if(pwInputUp.value !== userPwCheck.value){
+ e.target.parentElement.parentElement.classList.add('active');
+ e.target.parentElement.parentElement.lastElementChild.textContent = '비밀번호가 일치하지 않아요.';
+ }
+}
+userPwCheck.addEventListener('focusout', pwCheck);
+
+// 눈 아이콘 클릭 시 비밀번호 보이게 하기
+function eyeOff(e){
+ e.preventDefault();
+
+ e.target.parentElement.classList.toggle('active');
+ if(e.target.parentElement.classList.contains('active')){
+ e.target.previousElementSibling.setAttribute('type', 'password');
+ e.target.setAttribute('src', './images/ico-eye-off.svg');
+ }else{
+ e.target.previousElementSibling.setAttribute('type', 'text');
+ e.target.setAttribute('src', './images/ico-eye-on.svg');
+ }
+}
+eyeOn.forEach((eye) => {eye.addEventListener('click', eyeOff)})
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/week3/signin/signin.html b/signin.html
similarity index 85%
rename from week3/signin/signin.html
rename to signin.html
index 9fe1f6b5c..dbd7af9f7 100644
--- a/week3/signin/signin.html
+++ b/signin.html
@@ -26,19 +26,21 @@