diff --git a/README.md b/README.md new file mode 100644 index 00000000..df14cfd4 --- /dev/null +++ b/README.md @@ -0,0 +1,45 @@ +# sprint 1 미션 +## 내용 +랜딩 페이지 구현 +[Sprint 1 미션 PR](https://github.com/codeit-bootcamp-frontend/13-Sprint-Mission/pull/23) + +## 요구사항 +### 기본 +- 랜딩 페이지의 url path는 루트('/')로 설정합니다. +- title은 “판다마켓”으로 설정해 주세요. +- 화면의 너비가 1920px 이상이면 하늘색 배경색은 너비를 꽉 채우도록 채워지고, 내부 요소들의 위치는 고정되고, 여백만 커지도록 해주세요. +- 화면의 너비가 1920px 보다 작아질 때, “판다마켓” 로고의 왼쪽 여백 200px“로그인" 버튼의 오른쪽 여백 200px이 유지되고, 화면의 너비가 작아질수록 두 요소간 거리가 가까워지도록 해주세요. +- 클릭으로 기능이 동작해야 하는 경우, 사용자가 클릭할 수 있는 요소임을 알 수 있도록 cursor: pointer를 설정해 주세요. +- "판다마켓" 클릭 시 루트 페이지(‘/’)로 이동시켜주세요. +- "구경하러 가기" 클릭 시 (“/items”)페이지로 이동시켜주세요.(빈 페이지) +- "Privacy Policy", "FAQ"는 클릭 시 각각 Privacy 페이지('/privacy'), FAQ 페이지('/faq')로 이동합니다.(모두 빈 페이지) +- 페이스북, 트위터, 유튜브, 인스타그램 아이콘을 클릭 시 각각의 홈페이지로 새로운 창이 열리면서 이동합니다. + +### 심화 +- [ ] 사용자의 브라우저가 크고 작아짐에 따라 페이지의 요소간 간격, 요소의 크기, font-size 등 모든 크기와 관련된 값이 크고 작아지도록 설정해 보세요.(설정값은 자유입니다) + +## 구현 내용 +https://github.com/user-attachments/assets/d220c08b-83d8-4d2e-a589-b85a3a8590fc + +화면 녹화 특성 상 cursor: pointer;는 안 보임! + +# sprint 2 미션 +## 내용 +로그인 및 회원가입 페이지 구현 +[Sprint 2 미션 PR](https://github.com/codeit-bootcamp-frontend/13-Sprint-Mission/pull/38) + +### 요구사항 +### 기본 +- "판다마켓" 로고 클릭 시 루트 페이지(“/”)로 이동합니다. +- 로그인 페이지, 회원가입 페이지 모두 로고 위 상단 여백이 동일합니다. +- input 요소에 focus in 일 때, 테두리 색상은 #3692FF입니다. +- input 요소에 focus out 일 때, 테두리는 없습니다. +- SNS 아이콘들은 클릭시 각각 실제 서비스 홈페이지로 이동합니다. +- "회원가입”버튼 클릭 시 “/signup” 페이지로 이동합니다. +- 로그인”버튼 클릭 시 “/login” 페이지로 이동합니다. + +### 심화 +- 비밀번호 input 요소 위에 비밀번호를 확인할 수 있는 아이콘을 추가해 주세요. + +### 구현 내용 +https://github.com/user-attachments/assets/7027bb8a-4f37-4a0d-af8a-0e532979d1fb diff --git a/index.html b/index.html index f964a822..0ce30ebb 100644 --- a/index.html +++ b/index.html @@ -47,10 +47,10 @@

Hot item

-

+

인기 상품을
확인해 보세요 -

+

가장 HOT한 중고거래 물품을
판다 마켓에서 확인해 보세요 @@ -64,10 +64,10 @@

Search

-

+

구매를 원하는
상품을 검색하세요 -

+

구매하고 싶은 물품은 검색해서
쉽게 찾아보세요 @@ -87,10 +87,10 @@

Register

-

+

판매를 원하는
상품을 등록하세요 -

+

어떤 물건이든 판매하고 싶은 상품을
쉽게 등록하세요 diff --git a/src/assets/icons/google_icon.png b/src/assets/icons/google_icon.png deleted file mode 100644 index 63a81231..00000000 Binary files a/src/assets/icons/google_icon.png and /dev/null differ diff --git a/src/assets/icons/google_icon.svg b/src/assets/icons/google_icon.svg new file mode 100644 index 00000000..337f73e4 --- /dev/null +++ b/src/assets/icons/google_icon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/icons/kakaotalk_icon.png b/src/assets/icons/kakaotalk_icon.png deleted file mode 100644 index 8c25d9f9..00000000 Binary files a/src/assets/icons/kakaotalk_icon.png and /dev/null differ diff --git a/src/assets/icons/kakaotalk_icon.svg b/src/assets/icons/kakaotalk_icon.svg new file mode 100644 index 00000000..46853fcf --- /dev/null +++ b/src/assets/icons/kakaotalk_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/temp b/src/assets/icons/temp deleted file mode 100644 index e69de29b..00000000 diff --git a/src/pages/login.html b/src/pages/login.html index 7dbaf68f..9d658c7e 100644 --- a/src/pages/login.html +++ b/src/pages/login.html @@ -32,10 +32,10 @@

간편 로그인하기

diff --git a/src/pages/signup.html b/src/pages/signup.html index 289c1d37..77933252 100644 --- a/src/pages/signup.html +++ b/src/pages/signup.html @@ -43,10 +43,10 @@

간편 로그인하기

diff --git a/src/scripts/formUtils.js b/src/scripts/formUtils.js new file mode 100644 index 00000000..24f2ba24 --- /dev/null +++ b/src/scripts/formUtils.js @@ -0,0 +1,56 @@ +const visibilityConfig = { + password: { + type: "text", + src: "/src/assets/icons/visibility_off_btn.svg", + alt: "비밀번호 숨기기", + }, + text: { + type: "password", + src: "/src/assets/icons/visibility_on_btn.svg", + alt: "비밀번호 보기", + }, +}; + +export function setVisibilityToggle(inputWrapperSelector) { + const inputWrappers = document.querySelectorAll(inputWrapperSelector); + + inputWrappers.forEach((wrapper) => { + wrapper.addEventListener("click", (event) => { + const clickedElement = event.target; + + if (clickedElement.classList.contains("input-icon")) { + const passwordInput = wrapper.querySelector("input"); + const toggleButton = clickedElement; + + const nextState = passwordInput.type === "password" ? visibilityConfig["password"] : visibilityConfig["text"]; + + passwordInput.type = nextState.type; + toggleButton.src = nextState.src; + toggleButton.alt = nextState.alt; + } + }); + }); +} + +export function setButtonDisable(parent, buttonClass) { + const button = parent.querySelector(buttonClass); + + // 초기 상태 및 입력값 검증 함수 + function validateInputs() { + const inputs = parent.querySelectorAll("input"); + const allFilled = Array.from(inputs).every(input => input.value.trim() !== ""); + button.disabled = !allFilled; + } + + /* + 초기 상태에 button을 disabled로 설정하였으나 + 안전성과 일관성을 위해 호출 + */ + validateInputs(); + + parent.addEventListener("input", (event) => { + if (event.target.tagName === "INPUT") { + validateInputs(); + } + }); + } \ No newline at end of file diff --git a/src/scripts/global.js b/src/scripts/global.js deleted file mode 100644 index 4c2c195d..00000000 --- a/src/scripts/global.js +++ /dev/null @@ -1,49 +0,0 @@ -export function setVisibilityToggle(inputWrapperSelector) { - const inputWrapperList = document.querySelectorAll(inputWrapperSelector); - - inputWrapperList.forEach((wrapper) => { - wrapper.addEventListener("click", event => { - const target = event.target; - if(target.classList.contains("input-icon")) { - const input = wrapper.querySelector("input"); - const icon = target; - - if (input.type === "password") - { - input.type = "text"; - icon.src = "/src/assets/icons/visibility_off_btn.svg"; - icon.alt = "비밀번호 숨기기"; - } - else - { - input.type = "password"; - icon.src = "/src/assets/icons/visibility_on_btn.svg"; - icon.alt = "비밀번호 보기"; - } - } - }) - }) -} - -export function setButtonDisable(parent, buttonClass) { - const button = parent.querySelector(buttonClass); - - // 초기 상태 및 입력값 검증 함수 - function validateInputs() { - const inputs = parent.querySelectorAll("input"); - const allFilled = Array.from(inputs).every(input => input.value.trim() !== ""); - button.disabled = !allFilled; - } - - /* - 초기 상태에 button을 disabled로 설정하였으나 - 안전성과 일관성을 위해 호출 - */ - validateInputs(); - - parent.addEventListener("input", (event) => { - if (event.target.tagName === "INPUT") { - validateInputs(); - } - }); - } \ No newline at end of file diff --git a/src/scripts/pages/login.js b/src/scripts/pages/login.js index c66515e7..c8d99cfc 100644 --- a/src/scripts/pages/login.js +++ b/src/scripts/pages/login.js @@ -1,4 +1,4 @@ -import { setVisibilityToggle, setButtonDisable } from "/src/scripts/global.js"; +import { setVisibilityToggle, setButtonDisable } from "/src/scripts/formUtils.js"; setVisibilityToggle(".input-wrapper"); diff --git a/src/scripts/pages/signup.js b/src/scripts/pages/signup.js index c66515e7..c8d99cfc 100644 --- a/src/scripts/pages/signup.js +++ b/src/scripts/pages/signup.js @@ -1,4 +1,4 @@ -import { setVisibilityToggle, setButtonDisable } from "/src/scripts/global.js"; +import { setVisibilityToggle, setButtonDisable } from "/src/scripts/formUtils.js"; setVisibilityToggle(".input-wrapper"); diff --git a/src/styles/index.css b/src/styles/index.css index c679753d..34efeb3f 100644 --- a/src/styles/index.css +++ b/src/styles/index.css @@ -41,7 +41,6 @@ header { display: flex; flex-direction: column; gap: 32px; - width: 357px; height: 260px; } @@ -76,7 +75,6 @@ header { align-items: center; padding: 0 24px; gap: 64px; - height: 444px; border-radius: 12px; background-color: #FCFCFC; } @@ -92,19 +90,19 @@ header { .main-content-right-text { display: flex; flex-direction: column; - width: 350px; gap: 12px; align-items: flex-start; text-align: left; + padding-right: 72px; } .main-content-left-text { display: flex; flex-direction: column; - width: 350px; gap: 12px; align-items: flex-end; text-align: right; + padding-left: 72px; } .main-content-text-header { @@ -166,7 +164,9 @@ footer { .footer-content { display: flex; align-items: center; + flex-wrap: wrap-reverse; width: 1120px; + gap: 60px; justify-content: space-between; } @@ -193,7 +193,207 @@ footer { gap: 12px; } -.social-network-icons li { +.social-network-icons img { width: 20px; - height: 20px; +} + +@media (max-width: 1199px) { + .header-content { + margin: 0 24px; + } + + .main-title { + height: auto; + padding-top: 84px; + } + + .main-title-content { + display: flex; + flex-direction: column; + gap: 8px; + align-items: center; + } + + .main-title-content-left { + align-items: center; + gap: 24px; + } + + .main-title-h1 { + text-align: center; + width: auto; + } + + .main-title-h1 br { + display: none; + } + + .main-block { + display: flex; + align-items: center; + justify-content: center; + height: auto; + padding: 24px 24px; + } + + .main-block:nth-of-type(2n) .main-content { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 24px; + height: auto; + padding: 0px 0px; + background-color: white; + } + + .main-block:nth-of-type(2n + 1) .main-content { + display: flex; + flex-direction: column-reverse; + align-items: flex-end; + gap: 24px; + height: auto; + padding: 0px 0px; + background-color: white; + } + + .main-content-picture { + width: auto; + height: auto; + } + + .main-content-picture img { + border-radius: 14px; + } + + .main-content-text-title { + font-size: 32px; + font-weight: 700; + line-height: 42px; + } + + .main-content-text-title br { + display: none; + } + + .main-bottom { + height: auto; + padding-top: 200px; + } + + .main-bottom-content { + display: flex; + flex-direction: column; + gap: 200px; + align-items: center; + } + + .main-bottom-content-left { + text-align: center; + } + + .main-bottom-content-right { + width: auto; + height: auto; + } + + .footer-content { + width: 536px; + } +} + +@media (max-width: 767px) { + .header-content { + margin: 0 16px; + } + + .main-title { + height: auto; + padding-top: 48px; + } + + .main-title-content { + display: flex; + gap: 8px; + align-items: center; + } + + .main-title-content-left { + gap: 18px; + } + + .main-title-h1 { + font-size: 32px; + line-height: 44px; + } + + .main-title-h1 br { + display: block; + } + + .visit-button { + padding: 12px 72px; + font-size: 18px; + line-height: 26px; + } + + .main-block { + display: flex; + align-items: center; + justify-content: center; + padding: 20px 15px; + height: auto; + } + + .main-block:nth-of-type(2n) .main-content { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 24px; + height: auto; + padding: 0px 0px; + background-color: white; + } + + .main-block:nth-of-type(2n + 1) .main-content { + display: flex; + flex-direction: column-reverse; + align-items: flex-end; + gap: 24px; + height: auto; + padding: 0px 0px; + background-color: white; + } + + .main-content-picture { + width: auto; + height: auto; + } + + .main-content-picture img { + border-radius: 7px; + } + + .main-content-text-title { + font-size: 24px; + font-weight: 700; + line-height: 32px; + } + + .main-content-text-title br { + display: none; + } + + .main-bottom-content { + gap: 100px; + } + + .main-bottom-content-left { + font-size: 32px; + font-weight: 700; + line-height: 44px; + } + + .codeit-logo { + flex: 1 1 100%; + } } \ No newline at end of file diff --git a/src/styles/pages/login.css b/src/styles/pages/login.css index c84569d5..25b85820 100644 --- a/src/styles/pages/login.css +++ b/src/styles/pages/login.css @@ -133,4 +133,10 @@ main { line-height: 17px; text-decoration: underline; color: #3692FF; +} + +@media (max-width: 767px) { + body { + padding: 16px; + } } \ No newline at end of file diff --git a/src/styles/pages/signup.css b/src/styles/pages/signup.css index a0ddd46a..c8824938 100644 --- a/src/styles/pages/signup.css +++ b/src/styles/pages/signup.css @@ -2,7 +2,8 @@ body { display: flex; align-items: center; justify-content: center; - height: 100vh; + min-height: 100vh; + padding: 40px; } main { @@ -133,4 +134,10 @@ main { line-height: 17px; text-decoration: underline; color: #3692FF; +} + +@media (max-width: 767px) { + body { + padding: 40px 16px; + } } \ No newline at end of file