From f913bb19b1aaee83f06ff286c1056a737ac12e5b Mon Sep 17 00:00:00 2001 From: Chamsol Kim Date: Sun, 10 Aug 2025 09:26:16 +0900 Subject: [PATCH 01/16] =?UTF-8?q?refactor(Sprint7):=20`OrderBySelect`=20->?= =?UTF-8?q?=20`ProductSortSelect`=20=EC=9D=B4=EB=A6=84=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD,=20=EB=AA=A8=EB=93=88=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `OrderBySelect`를 공통 component에서 `product` feature 하위 component로 이동 - `ORDER_BY_DEFAULT`와 `ORDER_BY_VALUES`를 별도의 모듈로 분리해서 `product.js`와 `product-sort-select.jsx`에서 재사용 --- .../src/features/product/apis/products.js | 3 ++- .../product/components/product-sort-select.jsx} | 15 +++++++-------- .../src/features/product/utils/order-by-values.js | 8 ++++++++ vite-project/src/pages/items/items-page.jsx | 7 +++---- 4 files changed, 20 insertions(+), 13 deletions(-) rename vite-project/src/{components/select/order-by-select.jsx => features/product/components/product-sort-select.jsx} (85%) create mode 100644 vite-project/src/features/product/utils/order-by-values.js diff --git a/vite-project/src/features/product/apis/products.js b/vite-project/src/features/product/apis/products.js index 1d4c132e..7c4ce38b 100644 --- a/vite-project/src/features/product/apis/products.js +++ b/vite-project/src/features/product/apis/products.js @@ -1,10 +1,11 @@ import { client } from "../../../api/HttpClient"; +import { ORDER_BY_DEFAULT } from "../utils/order-by-values"; async function fetchProducts({ keyword = "", page = 1, pageSize = 10, - orderBy = "recent", + orderBy = ORDER_BY_DEFAULT, } = {}) { const params = { page, diff --git a/vite-project/src/components/select/order-by-select.jsx b/vite-project/src/features/product/components/product-sort-select.jsx similarity index 85% rename from vite-project/src/components/select/order-by-select.jsx rename to vite-project/src/features/product/components/product-sort-select.jsx index dff465fa..e2cce160 100644 --- a/vite-project/src/components/select/order-by-select.jsx +++ b/vite-project/src/features/product/components/product-sort-select.jsx @@ -1,13 +1,12 @@ import styled, { css } from "styled-components"; import selectDownImgMobile from "../../assets/ic-arrow-down-list.svg"; import selectDownImg from "../../assets/ic-triangle-down.svg"; +import { ORDER_BY_DEFAULT, ORDER_BY_VALUES } from "../utils/order-by-values"; const ORDER_BY_TITLE = { recent: "최신순", favorite: "좋아요순", }; -const ORDER_BY_VALUES = Array.from(Object.keys(ORDER_BY_TITLE)); -export const ORDER_BY_DEFAULT = "recent"; const baseStyle = css` /* typography */ @@ -21,7 +20,7 @@ const baseStyle = css` border-radius: 12px; `; -const StyledOrderBySelect = styled.button` +const StyledProductSortSelect = styled.button` ${baseStyle} background-color: white; padding: 8px 20px; @@ -61,7 +60,7 @@ const StyledSelectDropdown = styled.div` function SelectDropdown({ options, onOptionClick }) { return ( - {options.map((option, index) => { + {options.map((option) => { return ( onOptionClick(option)}> {ORDER_BY_TITLE[option]} @@ -72,7 +71,7 @@ function SelectDropdown({ options, onOptionClick }) { ); } -function OrderBySelect({ +function ProductSortSelect({ value, isOpen = false, isMobile, @@ -83,7 +82,7 @@ function OrderBySelect({ const selectImage = isMobile ? selectDownImgMobile : selectDownImg; return ( - + {isMobile || {ORDER_BY_TITLE[currentOption]}} 정렬 선택 {isOpen && ( @@ -92,8 +91,8 @@ function OrderBySelect({ onOptionClick={onOptionClick} /> )} - + ); } -export default OrderBySelect; +export default ProductSortSelect; diff --git a/vite-project/src/features/product/utils/order-by-values.js b/vite-project/src/features/product/utils/order-by-values.js new file mode 100644 index 00000000..0a07cbea --- /dev/null +++ b/vite-project/src/features/product/utils/order-by-values.js @@ -0,0 +1,8 @@ +const ORDER_BY_DEFAULT = "recent"; + +const ORDER_BY_VALUES = { + recent: "recent", + favorite: "favorite", +}; + +export default { ORDER_BY_DEFAULT, ORDER_BY_VALUES }; diff --git a/vite-project/src/pages/items/items-page.jsx b/vite-project/src/pages/items/items-page.jsx index 0170d330..aade5df0 100644 --- a/vite-project/src/pages/items/items-page.jsx +++ b/vite-project/src/pages/items/items-page.jsx @@ -6,11 +6,10 @@ import PageControl from "../../components/page-control/page-control"; import Section from "../../components/section/section"; import SectionHeader from "../../components/section/section-header"; import SectionHeaderAction from "../../components/section/section-header-action"; -import OrderBySelect, { - ORDER_BY_DEFAULT, -} from "../../components/select/order-by-select"; import { fetchProducts } from "../../features/product/apis/products"; +import ProductSortSelect from "../../features/product/components/product-sort-select"; import ProductsGrid from "../../features/product/components/products-grid"; +import { ORDER_BY_DEFAULT } from "../../features/product/utils/order-by-values"; import { useDevice } from "../../hooks/useDevice"; function getNumberOfColumns(deviceInfo) { @@ -98,7 +97,7 @@ function ItemsPage() { 상품 등록하기 - Date: Wed, 3 Sep 2025 21:25:42 +0900 Subject: [PATCH 02/16] =?UTF-8?q?chore(Sprint8):=20TypeScript=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vite-project/package-lock.json | 612 ++++++++++++++++++++++++++++++++ vite-project/package.json | 6 +- vite-project/src/vite-env.d.ts | 1 + vite-project/tsconfig.app.json | 27 ++ vite-project/tsconfig.json | 7 + vite-project/tsconfig.node.json | 25 ++ vite-project/vite.config.js | 7 - vite-project/vite.config.ts | 7 + 8 files changed, 684 insertions(+), 8 deletions(-) create mode 100644 vite-project/src/vite-env.d.ts create mode 100644 vite-project/tsconfig.app.json create mode 100644 vite-project/tsconfig.json create mode 100644 vite-project/tsconfig.node.json delete mode 100644 vite-project/vite.config.js create mode 100644 vite-project/vite.config.ts diff --git a/vite-project/package-lock.json b/vite-project/package-lock.json index 2d849630..265724f9 100644 --- a/vite-project/package-lock.json +++ b/vite-project/package-lock.json @@ -15,13 +15,17 @@ }, "devDependencies": { "@eslint/js": "^9.25.0", + "@types/node": "^24.3.0", "@types/react": "^19.1.2", "@types/react-dom": "^19.1.2", + "@types/styled-components": "^5.1.34", "@vitejs/plugin-react": "^4.4.1", "eslint": "^9.25.0", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.19", "globals": "^16.0.0", + "typescript": "^5.9.2", + "typescript-eslint": "^8.42.0", "vite": "^6.3.5" } }, @@ -1043,6 +1047,44 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-beta.27", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", @@ -1382,6 +1424,19 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.7.tgz", + "integrity": "sha512-PQTyIulDkIDro8P+IHbKCsw7U2xxBYflVzW/FgWdCAePD9xGSidgA76/GeJ6lBKoblyhf9pBY763gbrN+1dI8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "hoist-non-react-statics": "^3.3.0" + }, + "peerDependencies": { + "@types/react": "*" + } + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -1389,6 +1444,16 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/node": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", + "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.10.0" + } + }, "node_modules/@types/react": { "version": "19.1.8", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.8.tgz", @@ -1409,12 +1474,295 @@ "@types/react": "^19.0.0" } }, + "node_modules/@types/styled-components": { + "version": "5.1.34", + "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.34.tgz", + "integrity": "sha512-mmiVvwpYklFIv9E8qfxuPyIt/OuyIrn6gMOAMOFUO3WJfSrSE+sGUoa4PiZj77Ut7bKZpaa6o1fBKS/4TOEvnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hoist-non-react-statics": "*", + "@types/react": "*", + "csstype": "^3.0.2" + } + }, "node_modules/@types/stylis": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz", "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==", "license": "MIT" }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.42.0.tgz", + "integrity": "sha512-Aq2dPqsQkxHOLfb2OPv43RnIvfj05nw8v/6n3B2NABIPpHnjQnaLo9QGMTvml+tv4korl/Cjfrb/BYhoL8UUTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.42.0", + "@typescript-eslint/type-utils": "8.42.0", + "@typescript-eslint/utils": "8.42.0", + "@typescript-eslint/visitor-keys": "8.42.0", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.42.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.42.0.tgz", + "integrity": "sha512-r1XG74QgShUgXph1BYseJ+KZd17bKQib/yF3SR+demvytiRXrwd12Blnz5eYGm8tXaeRdd4x88MlfwldHoudGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.42.0", + "@typescript-eslint/types": "8.42.0", + "@typescript-eslint/typescript-estree": "8.42.0", + "@typescript-eslint/visitor-keys": "8.42.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.42.0.tgz", + "integrity": "sha512-vfVpLHAhbPjilrabtOSNcUDmBboQNrJUiNAGoImkZKnMjs2TIcWG33s4Ds0wY3/50aZmTMqJa6PiwkwezaAklg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.42.0", + "@typescript-eslint/types": "^8.42.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.42.0.tgz", + "integrity": "sha512-51+x9o78NBAVgQzOPd17DkNTnIzJ8T/O2dmMBLoK9qbY0Gm52XJcdJcCl18ExBMiHo6jPMErUQWUv5RLE51zJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.42.0", + "@typescript-eslint/visitor-keys": "8.42.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.42.0.tgz", + "integrity": "sha512-kHeFUOdwAJfUmYKjR3CLgZSglGHjbNTi1H8sTYRYV2xX6eNz4RyJ2LIgsDLKf8Yi0/GL1WZAC/DgZBeBft8QAQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.42.0.tgz", + "integrity": "sha512-9KChw92sbPTYVFw3JLRH1ockhyR3zqqn9lQXol3/YbI6jVxzWoGcT3AsAW0mu1MY0gYtsXnUGV/AKpkAj5tVlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.42.0", + "@typescript-eslint/typescript-estree": "8.42.0", + "@typescript-eslint/utils": "8.42.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.42.0.tgz", + "integrity": "sha512-LdtAWMiFmbRLNP7JNeY0SqEtJvGMYSzfiWBSmx+VSZ1CH+1zyl8Mmw1TT39OrtsRvIYShjJWzTDMPWZJCpwBlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.42.0.tgz", + "integrity": "sha512-ku/uYtT4QXY8sl9EDJETD27o3Ewdi72hcXg1ah/kkUgBvAYHLwj2ofswFFNXS+FL5G+AGkxBtvGt8pFBHKlHsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.42.0", + "@typescript-eslint/tsconfig-utils": "8.42.0", + "@typescript-eslint/types": "8.42.0", + "@typescript-eslint/visitor-keys": "8.42.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.42.0.tgz", + "integrity": "sha512-JnIzu7H3RH5BrKC4NoZqRfmjqCIS1u3hGZltDYJgkVdqAezl4L9d1ZLw+36huCujtSBSAirGINF/S4UxOcR+/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.42.0", + "@typescript-eslint/types": "8.42.0", + "@typescript-eslint/typescript-estree": "8.42.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.42.0.tgz", + "integrity": "sha512-3WbiuzoEowaEn8RSnhJBrxSwX8ULYE9CXaPepS2C2W3NSA5NNIvBaslpBSBElPq0UGr0xVJlXFWOAKIkyylydQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.42.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@vitejs/plugin-react": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", @@ -1517,6 +1865,19 @@ "concat-map": "0.0.1" } }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/browserslist": { "version": "4.25.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", @@ -1973,6 +2334,36 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -1987,6 +2378,16 @@ "dev": true, "license": "MIT" }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/fdir": { "version": "6.4.6", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", @@ -2015,6 +2416,19 @@ "node": ">=16.0.0" } }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -2104,6 +2518,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -2114,6 +2535,16 @@ "node": ">=8" } }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -2174,6 +2605,16 @@ "node": ">=0.10.0" } }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2305,6 +2746,43 @@ "yallist": "^3.0.2" } }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -2514,6 +2992,27 @@ "node": ">=6" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/react": { "version": "19.1.0", "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", @@ -2535,6 +3034,13 @@ "react": "^19.1.0" } }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, "node_modules/react-refresh": { "version": "0.17.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", @@ -2593,6 +3099,17 @@ "node": ">=4" } }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/rollup": { "version": "4.45.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.45.1.tgz", @@ -2633,6 +3150,30 @@ "fsevents": "~2.3.2" } }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/scheduler": { "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", @@ -2798,6 +3339,32 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", @@ -2817,6 +3384,51 @@ "node": ">= 0.8.0" } }, + "node_modules/typescript": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.42.0.tgz", + "integrity": "sha512-ozR/rQn+aQXQxh1YgbCzQWDFrsi9mcg+1PM3l/z5o1+20P7suOIaNg515bpr/OYt6FObz/NHcBstydDLHWeEKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.42.0", + "@typescript-eslint/parser": "8.42.0", + "@typescript-eslint/typescript-estree": "8.42.0", + "@typescript-eslint/utils": "8.42.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/undici-types": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", + "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", + "dev": true, + "license": "MIT" + }, "node_modules/update-browserslist-db": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", diff --git a/vite-project/package.json b/vite-project/package.json index 85b90b29..a69dc0c3 100644 --- a/vite-project/package.json +++ b/vite-project/package.json @@ -5,7 +5,7 @@ "type": "module", "scripts": { "dev": "vite", - "build": "vite build", + "build": "tsc -b && vite build", "lint": "eslint .", "preview": "vite preview" }, @@ -17,13 +17,17 @@ }, "devDependencies": { "@eslint/js": "^9.25.0", + "@types/node": "^24.3.0", "@types/react": "^19.1.2", "@types/react-dom": "^19.1.2", + "@types/styled-components": "^5.1.34", "@vitejs/plugin-react": "^4.4.1", "eslint": "^9.25.0", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.19", "globals": "^16.0.0", + "typescript": "^5.9.2", + "typescript-eslint": "^8.42.0", "vite": "^6.3.5" } } diff --git a/vite-project/src/vite-env.d.ts b/vite-project/src/vite-env.d.ts new file mode 100644 index 00000000..11f02fe2 --- /dev/null +++ b/vite-project/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/vite-project/tsconfig.app.json b/vite-project/tsconfig.app.json new file mode 100644 index 00000000..6b0b9ee8 --- /dev/null +++ b/vite-project/tsconfig.app.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "es6", + "useDefineForClassFields": true, + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "esnext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["./src"] +} diff --git a/vite-project/tsconfig.json b/vite-project/tsconfig.json new file mode 100644 index 00000000..1ffef600 --- /dev/null +++ b/vite-project/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/vite-project/tsconfig.node.json b/vite-project/tsconfig.node.json new file mode 100644 index 00000000..f85a3990 --- /dev/null +++ b/vite-project/tsconfig.node.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2023", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/vite-project/vite.config.js b/vite-project/vite.config.js deleted file mode 100644 index 8b0f57b9..00000000 --- a/vite-project/vite.config.js +++ /dev/null @@ -1,7 +0,0 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' - -// https://vite.dev/config/ -export default defineConfig({ - plugins: [react()], -}) diff --git a/vite-project/vite.config.ts b/vite-project/vite.config.ts new file mode 100644 index 00000000..f16e2be3 --- /dev/null +++ b/vite-project/vite.config.ts @@ -0,0 +1,7 @@ +import react from "@vitejs/plugin-react"; +import { defineConfig } from "vite"; + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], +}); From c65abe046a122701db876ecdfc412210c62e2ed5 Mon Sep 17 00:00:00 2001 From: Chamsol Kim Date: Thu, 4 Sep 2025 12:12:18 +0900 Subject: [PATCH 03/16] =?UTF-8?q?fix(Sprint7):=20Export=20error=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vite-project/src/features/product/utils/order-by-values.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vite-project/src/features/product/utils/order-by-values.js b/vite-project/src/features/product/utils/order-by-values.js index 0a07cbea..8170b359 100644 --- a/vite-project/src/features/product/utils/order-by-values.js +++ b/vite-project/src/features/product/utils/order-by-values.js @@ -5,4 +5,4 @@ const ORDER_BY_VALUES = { favorite: "favorite", }; -export default { ORDER_BY_DEFAULT, ORDER_BY_VALUES }; +export { ORDER_BY_DEFAULT, ORDER_BY_VALUES }; From e4a24526a2cf694902932e4025a9eb95825ff289 Mon Sep 17 00:00:00 2001 From: Chamsol Kim Date: Thu, 4 Sep 2025 13:12:42 +0900 Subject: [PATCH 04/16] =?UTF-8?q?feat(Sprint8):=20HomeLayout=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=20=EC=84=B8=EB=B6=84=ED=99=94=20=EB=B0=8F=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=ED=8C=8C=EC=9D=BC=20TypeScript=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vite-project/src/app.jsx | 36 ++++-- .../avatar/{avatar.jsx => avatar.tsx} | 10 +- .../src/components/link/link-list.tsx | 35 ++++++ .../src/components/link/styled-nav-link.tsx | 29 +++++ vite-project/src/components/logo/nav-logo.tsx | 28 +++++ .../src/components/nav/home-nav-bar.tsx | 29 +++++ vite-project/src/components/nav/nav-bar.tsx | 37 ++++++ .../src/components/nav/onboarding-nav-bar.tsx | 9 ++ .../components/product-sort-select.jsx | 4 +- .../src/layouts/home-layout/home-layout.jsx | 28 ----- .../src/layouts/home-layout/home-layout.tsx | 33 ++++++ .../src/layouts/home-layout/home-nav.jsx | 108 ------------------ vite-project/src/pages/not-found-page.tsx | 19 +++ vite-project/src/utils/breakpoint.ts | 14 +++ 14 files changed, 271 insertions(+), 148 deletions(-) rename vite-project/src/components/avatar/{avatar.jsx => avatar.tsx} (67%) create mode 100644 vite-project/src/components/link/link-list.tsx create mode 100644 vite-project/src/components/link/styled-nav-link.tsx create mode 100644 vite-project/src/components/logo/nav-logo.tsx create mode 100644 vite-project/src/components/nav/home-nav-bar.tsx create mode 100644 vite-project/src/components/nav/nav-bar.tsx create mode 100644 vite-project/src/components/nav/onboarding-nav-bar.tsx delete mode 100644 vite-project/src/layouts/home-layout/home-layout.jsx create mode 100644 vite-project/src/layouts/home-layout/home-layout.tsx delete mode 100644 vite-project/src/layouts/home-layout/home-nav.jsx create mode 100644 vite-project/src/pages/not-found-page.tsx create mode 100644 vite-project/src/utils/breakpoint.ts diff --git a/vite-project/src/app.jsx b/vite-project/src/app.jsx index 39842696..027d4a21 100644 --- a/vite-project/src/app.jsx +++ b/vite-project/src/app.jsx @@ -3,20 +3,40 @@ import HomeLayout from "./layouts/home-layout/home-layout"; import AddItemPage from "./pages/add-item/add-item-page"; import ItemDetailPage from "./pages/items/item-detail-page"; import ItemsPage from "./pages/items/items-page"; +import NotFoundPage from "./pages/not-found-page"; import "./styles/global.css"; import "./styles/palette.css"; function App() { return ( - - - } /> - } /> - } /> - NOT IMPLEMENTED} /> - - + + + + + } + /> + + + + } + /> + + + + } + /> + } /> + ); } diff --git a/vite-project/src/components/avatar/avatar.jsx b/vite-project/src/components/avatar/avatar.tsx similarity index 67% rename from vite-project/src/components/avatar/avatar.jsx rename to vite-project/src/components/avatar/avatar.tsx index 4751b651..92f47395 100644 --- a/vite-project/src/components/avatar/avatar.jsx +++ b/vite-project/src/components/avatar/avatar.tsx @@ -1,7 +1,8 @@ +import type { JSX } from "react"; import styled from "styled-components"; import defaultImg from "../../assets/profile-default.svg"; -const StyledAvatar = styled.div` +const StyledAvatar = styled.div<{ $size: number }>` width: ${({ $size }) => $size}px; height: ${({ $size }) => $size}px; @@ -15,7 +16,12 @@ const StyledAvatar = styled.div` const DEFAULT_SIZE = 40; -function Avatar({ imageUrl, size = DEFAULT_SIZE }) { +interface Props { + imageUrl?: string; + size?: number; +} + +function Avatar({ imageUrl, size = DEFAULT_SIZE }: Props): JSX.Element { return ( 프로필 사진 diff --git a/vite-project/src/components/link/link-list.tsx b/vite-project/src/components/link/link-list.tsx new file mode 100644 index 00000000..7a2cba69 --- /dev/null +++ b/vite-project/src/components/link/link-list.tsx @@ -0,0 +1,35 @@ +import type { JSX } from "react"; +import styled from "styled-components"; + +const LinkListItem = styled.li` + padding: 21px 15px; + font-size: 18px; + font-weight: 700; + line-height: 26px; + + @media (max-width: 767px) { + padding: 21px 0; + font-size: 16px; + } +`; + +const StyledLinkList = styled.ul` + display: flex; + align-items: center; + margin: 0; + padding: 0; + list-style: none; /* Tablet */ + + @media (max-width: 767px) { + gap: 8px; + } +`; + +interface Props { + children: React.ReactNode; +} +function LinkList({ children }: Props): JSX.Element { + return {children}; +} + +export { LinkList, LinkListItem }; diff --git a/vite-project/src/components/link/styled-nav-link.tsx b/vite-project/src/components/link/styled-nav-link.tsx new file mode 100644 index 00000000..501fbf27 --- /dev/null +++ b/vite-project/src/components/link/styled-nav-link.tsx @@ -0,0 +1,29 @@ +import type { JSX } from "react"; +import { NavLink, useLocation } from "react-router-dom"; + +interface Props { + to: string; + activePaths?: string[]; + children: React.ReactNode; +} + +type NavLinkRenderCallback = (isActive: boolean) => React.CSSProperties; + +function StyledNavLink({ to, activePaths = [], children }: Props): JSX.Element { + const location = useLocation(); + + const linkStyle: NavLinkRenderCallback = (isActive) => ({ + color: `var(--color-${isActive ? "primary-100" : "secondary-600"})`, + textDecoration: "none", + }); + + const active = activePaths.includes(location.pathname); + + return ( + linkStyle(isActive || active)}> + {children} + + ); +} + +export default StyledNavLink; diff --git a/vite-project/src/components/logo/nav-logo.tsx b/vite-project/src/components/logo/nav-logo.tsx new file mode 100644 index 00000000..48f1dd52 --- /dev/null +++ b/vite-project/src/components/logo/nav-logo.tsx @@ -0,0 +1,28 @@ +import type { JSX } from "react"; +import styled from "styled-components"; +import largeLogo from "../../assets/logo-large.svg"; +import smallLogo from "../../assets/logo-small.svg"; +import { MediaQueryBreakpoint } from "../../utils/breakpoint"; + +const StyledNavLogo = styled.picture` + margin-right: 32px; + + @media (max-width: 1199px) { + margin-right: 20px; + } + + @media (max-width: 767px) { + margin-right: 0px; + } +`; + +function NavLogo(): JSX.Element { + return ( + + + + + ); +} + +export default NavLogo; diff --git a/vite-project/src/components/nav/home-nav-bar.tsx b/vite-project/src/components/nav/home-nav-bar.tsx new file mode 100644 index 00000000..4e055879 --- /dev/null +++ b/vite-project/src/components/nav/home-nav-bar.tsx @@ -0,0 +1,29 @@ +import type { JSX } from "react"; +import Avatar from "../avatar/avatar"; +import { LinkList, LinkListItem } from "../link/link-list"; +import StyledNavLink from "../link/styled-nav-link"; +import NavLogo from "../logo/nav-logo"; +import NavBar from "./nav-bar"; + +function HomeNavBar(): JSX.Element { + return ( + + + + + + + 자유게시판 + + + + 중고마켓 + + + + + + ); +} + +export default HomeNavBar; diff --git a/vite-project/src/components/nav/nav-bar.tsx b/vite-project/src/components/nav/nav-bar.tsx new file mode 100644 index 00000000..0691c588 --- /dev/null +++ b/vite-project/src/components/nav/nav-bar.tsx @@ -0,0 +1,37 @@ +import type { JSX } from "react"; +import styled from "styled-components"; + +const Content = styled.div` + width: 100%; + height: 70px; + display: flex; + justify-content: space-between; + align-items: center; +`; + +const StyledNavBar = styled.nav` + padding: 0 200px; + border-bottom: 1px solid #dfdfdf; + background-color: white; + + @media (max-width: 1199px) { + padding: 0 24px; + } + + @media (max-width: 767px) { + padding: 0 16px; + } +`; + +interface Props { + children: React.ReactNode; +} +function NavBar({ children }: Props): JSX.Element { + return ( + + {children} + + ); +} + +export default NavBar; diff --git a/vite-project/src/components/nav/onboarding-nav-bar.tsx b/vite-project/src/components/nav/onboarding-nav-bar.tsx new file mode 100644 index 00000000..eb078b60 --- /dev/null +++ b/vite-project/src/components/nav/onboarding-nav-bar.tsx @@ -0,0 +1,9 @@ +import NavBar from "./nav-bar"; + +function OnboardingNavBar() { + return +
Onboarding
+
+} + +export default OnboardingNavBar; \ No newline at end of file diff --git a/vite-project/src/features/product/components/product-sort-select.jsx b/vite-project/src/features/product/components/product-sort-select.jsx index e2cce160..9868ce00 100644 --- a/vite-project/src/features/product/components/product-sort-select.jsx +++ b/vite-project/src/features/product/components/product-sort-select.jsx @@ -1,6 +1,6 @@ import styled, { css } from "styled-components"; -import selectDownImgMobile from "../../assets/ic-arrow-down-list.svg"; -import selectDownImg from "../../assets/ic-triangle-down.svg"; +import selectDownImgMobile from "../../../assets/ic-arrow-down-list.svg"; +import selectDownImg from "../../../assets/ic-triangle-down.svg"; import { ORDER_BY_DEFAULT, ORDER_BY_VALUES } from "../utils/order-by-values"; const ORDER_BY_TITLE = { diff --git a/vite-project/src/layouts/home-layout/home-layout.jsx b/vite-project/src/layouts/home-layout/home-layout.jsx deleted file mode 100644 index a4d43689..00000000 --- a/vite-project/src/layouts/home-layout/home-layout.jsx +++ /dev/null @@ -1,28 +0,0 @@ -import styled from "styled-components"; -import HomeNav from "./home-nav"; - -const Content = styled.div` - max-width: 1200px; - margin: 24px auto 0px; - - @media (max-width: 1199px) { - max-width: none; - margin: 24px 24px 0px; - } - - @media (max-width: 767px) { - max-width: none; - margin: 16px 16px 0px; - } -`; - -function HomeLayout({ children }) { - return ( - <> - - {children} - - ); -} - -export default HomeLayout; diff --git a/vite-project/src/layouts/home-layout/home-layout.tsx b/vite-project/src/layouts/home-layout/home-layout.tsx new file mode 100644 index 00000000..719c9e2e --- /dev/null +++ b/vite-project/src/layouts/home-layout/home-layout.tsx @@ -0,0 +1,33 @@ +import type { JSX } from "react"; +import styled from "styled-components"; +import HomeNavBar from "../../components/nav/home-nav-bar"; +import { MediaQueryBreakpoint } from "../../utils/breakpoint"; + +const Content = styled.div` + max-width: 1200px; + margin: 24px auto 0px; + + @media ${MediaQueryBreakpoint.tablet} { + max-width: none; + margin: 24px 24px 0px; + } + + @media ${MediaQueryBreakpoint.mobile} { + max-width: none; + margin: 16px 16px 0px; + } +`; + +interface Props { + children: React.ReactNode; +} +function HomeLayout({ children }: Props): JSX.Element { + return ( + <> + + {children} + + ); +} + +export default HomeLayout; diff --git a/vite-project/src/layouts/home-layout/home-nav.jsx b/vite-project/src/layouts/home-layout/home-nav.jsx deleted file mode 100644 index 6af155aa..00000000 --- a/vite-project/src/layouts/home-layout/home-nav.jsx +++ /dev/null @@ -1,108 +0,0 @@ -import { NavLink, useLocation } from "react-router-dom"; -import styled from "styled-components"; -import largeLogo from "../../assets/logo-large.svg"; -import smallLogo from "../../assets/logo-small.svg"; -import Avatar from "../../components/avatar/avatar"; - -const StyledHomeNav = styled.nav` - padding: 0 200px; - border-bottom: 1px solid #dfdfdf; - background-color: white; - - @media (max-width: 1199px) { - padding: 0 24px; - } - - @media (max-width: 767px) { - padding: 0 16px; - } -`; - -const Content = styled.div` - width: 100%; - height: 70px; - display: flex; - justify-content: space-between; - align-items: center; -`; - -const LinkList = styled.ul` - display: flex; - align-items: center; - margin: 0; - padding: 0; - list-style: none; /* Tablet */ - - @media (max-width: 767px) { - gap: 8px; - } -`; - -const LinkListItem = styled.li` - padding: 21px 15px; - font-size: 18px; - font-weight: 700; - line-height: 26px; - - @media (max-width: 767px) { - padding: 21px 0; - font-size: 16px; - } -`; - -const Logo = styled.picture` - margin-right: 32px; - - @media (max-width: 1199px) { - margin-right: 20px; - } - - @media (max-width: 767px) { - margin-right: 0px; - } -`; - -function NavigationLink({ to, activePaths = [], children }) { - const location = useLocation(); - - const linkStyle = (isActive) => ({ - color: `var(--color-${isActive ? "primary-100" : "secondary-600"})`, - textDecoration: "none", - }); - - const active = activePaths.includes(location.pathname); - - return ( - linkStyle(isActive || active)}> - {children} - - ); -} - -function HomeNav() { - return ( - - - - - - - - - - - 자유게시판 - - - - 중고마켓 - - - - - - - ); -} - -export default HomeNav; diff --git a/vite-project/src/pages/not-found-page.tsx b/vite-project/src/pages/not-found-page.tsx new file mode 100644 index 00000000..cb6949dc --- /dev/null +++ b/vite-project/src/pages/not-found-page.tsx @@ -0,0 +1,19 @@ +import type { JSX } from "react"; +import styled from "styled-components"; + +const StyledNotFoundPage = styled.div` + display: flex; + justify-content: center; + align-items: center; + height: 100vh; +`; + +function NotFoundPage(): JSX.Element { + return ( + +

404 Not Found

+
+ ); +} + +export default NotFoundPage; diff --git a/vite-project/src/utils/breakpoint.ts b/vite-project/src/utils/breakpoint.ts new file mode 100644 index 00000000..f237c1be --- /dev/null +++ b/vite-project/src/utils/breakpoint.ts @@ -0,0 +1,14 @@ +const Breakpoint = { + tablet: 1199, + mobile: 767, +} as const; + +const MediaQueryBreakpoint = { + tablet: `(max-width: ${Breakpoint.tablet}px)`, + mobile: `(max-width: ${Breakpoint.mobile}px)`, +} as const; + +type MediaQueryBreakpoint = + (typeof MediaQueryBreakpoint)[keyof typeof MediaQueryBreakpoint]; + +export { MediaQueryBreakpoint }; From e576a8feee480c2bf2c10261c6455063a7c1ce1e Mon Sep 17 00:00:00 2001 From: Chamsol Kim Date: Thu, 4 Sep 2025 13:24:56 +0900 Subject: [PATCH 05/16] =?UTF-8?q?refactor(Sprint8):=20Page=20=EB=B0=8F=20l?= =?UTF-8?q?ayout=20=ED=8C=8C=EC=9D=BC=20=EA=B2=BD=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vite-project/src/app.jsx | 8 ++++---- .../layouts/{home-layout => }/home-layout.tsx | 4 ++-- .../pages/{add-item => }/add-item-page.jsx | 16 +++++++-------- .../pages/{items => }/item-detail-page.jsx | 13 +++++------- .../src/pages/{items => }/items-page.jsx | 20 +++++++++---------- 5 files changed, 29 insertions(+), 32 deletions(-) rename vite-project/src/layouts/{home-layout => }/home-layout.tsx (82%) rename vite-project/src/pages/{add-item => }/add-item-page.jsx (87%) rename vite-project/src/pages/{items => }/item-detail-page.jsx (76%) rename vite-project/src/pages/{items => }/items-page.jsx (80%) diff --git a/vite-project/src/app.jsx b/vite-project/src/app.jsx index 027d4a21..10c99eb3 100644 --- a/vite-project/src/app.jsx +++ b/vite-project/src/app.jsx @@ -1,8 +1,8 @@ import { BrowserRouter, Route, Routes } from "react-router-dom"; -import HomeLayout from "./layouts/home-layout/home-layout"; -import AddItemPage from "./pages/add-item/add-item-page"; -import ItemDetailPage from "./pages/items/item-detail-page"; -import ItemsPage from "./pages/items/items-page"; +import HomeLayout from "./layouts/home-layout"; +import AddItemPage from "./pages/add-item-page"; +import ItemDetailPage from "./pages/item-detail-page"; +import ItemsPage from "./pages/items-page"; import NotFoundPage from "./pages/not-found-page"; import "./styles/global.css"; import "./styles/palette.css"; diff --git a/vite-project/src/layouts/home-layout/home-layout.tsx b/vite-project/src/layouts/home-layout.tsx similarity index 82% rename from vite-project/src/layouts/home-layout/home-layout.tsx rename to vite-project/src/layouts/home-layout.tsx index 719c9e2e..aa4dd585 100644 --- a/vite-project/src/layouts/home-layout/home-layout.tsx +++ b/vite-project/src/layouts/home-layout.tsx @@ -1,7 +1,7 @@ import type { JSX } from "react"; import styled from "styled-components"; -import HomeNavBar from "../../components/nav/home-nav-bar"; -import { MediaQueryBreakpoint } from "../../utils/breakpoint"; +import HomeNavBar from "../components/nav/home-nav-bar"; +import { MediaQueryBreakpoint } from "../utils/breakpoint"; const Content = styled.div` max-width: 1200px; diff --git a/vite-project/src/pages/add-item/add-item-page.jsx b/vite-project/src/pages/add-item-page.jsx similarity index 87% rename from vite-project/src/pages/add-item/add-item-page.jsx rename to vite-project/src/pages/add-item-page.jsx index db93836e..341267dc 100644 --- a/vite-project/src/pages/add-item/add-item-page.jsx +++ b/vite-project/src/pages/add-item-page.jsx @@ -1,13 +1,13 @@ import { useState } from "react"; import styled from "styled-components"; -import TextInput from "../../components/input/text-input"; -import Section from "../../components/section/section"; -import SectionHeader from "../../components/section/section-header"; -import SectionHeaderAction from "../../components/section/section-header-action"; -import SECTION_HEADER_SIZE from "../../components/section/section-header-size"; -import TagList from "../../components/tag/tag-list"; -import AddingProductImageContainer from "../../features/product/components/adding-product-image-container"; -import { formatPrice } from "../../utils/formatter"; +import TextInput from "../components/input/text-input"; +import Section from "../components/section/section"; +import SectionHeader from "../components/section/section-header"; +import SectionHeaderAction from "../components/section/section-header-action"; +import SECTION_HEADER_SIZE from "../components/section/section-header-size"; +import TagList from "../components/tag/tag-list"; +import AddingProductImageContainer from "../features/product/components/adding-product-image-container"; +import { formatPrice } from "../utils/formatter"; const INITIAL_INPUT_VALUES = { title: "", diff --git a/vite-project/src/pages/items/item-detail-page.jsx b/vite-project/src/pages/item-detail-page.jsx similarity index 76% rename from vite-project/src/pages/items/item-detail-page.jsx rename to vite-project/src/pages/item-detail-page.jsx index 51595e90..93913110 100644 --- a/vite-project/src/pages/items/item-detail-page.jsx +++ b/vite-project/src/pages/item-detail-page.jsx @@ -1,13 +1,10 @@ import { Link } from "react-router-dom"; import styled from "styled-components"; -import backImg from "../../assets/ic-arrow-back.svg"; -import Button from "../../components/button/button"; -import { - BUTTON_SIZE, - BUTTON_TYPE, -} from "../../components/button/button-styles"; -import ProductDetailComment from "../../features/product/components/product-detail-comment"; -import ProductDetailInfo from "../../features/product/components/product-detail-info"; +import backImg from "../assets/ic-arrow-back.svg"; +import Button from "../components/button/button"; +import { BUTTON_SIZE, BUTTON_TYPE } from "../components/button/button-styles"; +import ProductDetailComment from "../features/product/components/product-detail-comment"; +import ProductDetailInfo from "../features/product/components/product-detail-info"; const StyledItemDetailPage = styled.div` display: flex; diff --git a/vite-project/src/pages/items/items-page.jsx b/vite-project/src/pages/items-page.jsx similarity index 80% rename from vite-project/src/pages/items/items-page.jsx rename to vite-project/src/pages/items-page.jsx index aade5df0..26433dfe 100644 --- a/vite-project/src/pages/items/items-page.jsx +++ b/vite-project/src/pages/items-page.jsx @@ -1,16 +1,16 @@ import { useEffect, useMemo, useState } from "react"; import { useNavigate } from "react-router-dom"; import styled from "styled-components"; -import SearchInput from "../../components/input/search-input"; -import PageControl from "../../components/page-control/page-control"; -import Section from "../../components/section/section"; -import SectionHeader from "../../components/section/section-header"; -import SectionHeaderAction from "../../components/section/section-header-action"; -import { fetchProducts } from "../../features/product/apis/products"; -import ProductSortSelect from "../../features/product/components/product-sort-select"; -import ProductsGrid from "../../features/product/components/products-grid"; -import { ORDER_BY_DEFAULT } from "../../features/product/utils/order-by-values"; -import { useDevice } from "../../hooks/useDevice"; +import SearchInput from "../components/input/search-input"; +import PageControl from "../components/page-control/page-control"; +import Section from "../components/section/section"; +import SectionHeader from "../components/section/section-header"; +import SectionHeaderAction from "../components/section/section-header-action"; +import { fetchProducts } from "../features/product/apis/products"; +import ProductSortSelect from "../features/product/components/product-sort-select"; +import ProductsGrid from "../features/product/components/products-grid"; +import { ORDER_BY_DEFAULT } from "../features/product/utils/order-by-values"; +import { useDevice } from "../hooks/useDevice"; function getNumberOfColumns(deviceInfo) { let bestProductsColumns = 4; From 49b68ae6b66bafb2beaf88a0e2ea4f8abd6508bc Mon Sep 17 00:00:00 2001 From: Chamsol Kim Date: Thu, 4 Sep 2025 15:22:53 +0900 Subject: [PATCH 06/16] =?UTF-8?q?feat(Sprint8):=20OnboardingPage=EC=97=90?= =?UTF-8?q?=EC=84=9C=20header,=20footer=20=EC=98=81=EC=97=AD=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vite-project/src/app.jsx | 10 +++ .../src/assets/landing-image-bottom.png | Bin 0 -> 56714 bytes vite-project/src/assets/landing-image_top.png | Bin 0 -> 49285 bytes .../src/components/button/button-styles.js | 11 --- .../src/components/button/button-styles.ts | 15 ++++ .../button/{button.jsx => button.tsx} | 30 +++++--- .../src/components/link/link-list.tsx | 1 + vite-project/src/components/nav/nav-bar.tsx | 4 +- .../src/components/nav/onboarding-nav-bar.tsx | 14 ++-- .../onboarding/components/footer-section.tsx | 53 +++++++++++++++ .../components/header-footer-section.tsx | 39 +++++++++++ .../onboarding/components/header-section.tsx | 64 ++++++++++++++++++ .../components/onboarding-title.tsx | 21 ++++++ vite-project/src/layouts/home-layout.tsx | 1 + .../src/layouts/onboarding-layout.tsx | 17 +++++ vite-project/src/pages/item-detail-page.jsx | 4 +- vite-project/src/pages/onboarding-page.tsx | 18 +++++ 17 files changed, 273 insertions(+), 29 deletions(-) create mode 100644 vite-project/src/assets/landing-image-bottom.png create mode 100644 vite-project/src/assets/landing-image_top.png delete mode 100644 vite-project/src/components/button/button-styles.js create mode 100644 vite-project/src/components/button/button-styles.ts rename vite-project/src/components/button/{button.jsx => button.tsx} (54%) create mode 100644 vite-project/src/features/onboarding/components/footer-section.tsx create mode 100644 vite-project/src/features/onboarding/components/header-footer-section.tsx create mode 100644 vite-project/src/features/onboarding/components/header-section.tsx create mode 100644 vite-project/src/features/onboarding/components/onboarding-title.tsx create mode 100644 vite-project/src/layouts/onboarding-layout.tsx create mode 100644 vite-project/src/pages/onboarding-page.tsx diff --git a/vite-project/src/app.jsx b/vite-project/src/app.jsx index 10c99eb3..bd43e78c 100644 --- a/vite-project/src/app.jsx +++ b/vite-project/src/app.jsx @@ -1,9 +1,11 @@ import { BrowserRouter, Route, Routes } from "react-router-dom"; import HomeLayout from "./layouts/home-layout"; +import OnboardingLayout from "./layouts/onboarding-layout"; import AddItemPage from "./pages/add-item-page"; import ItemDetailPage from "./pages/item-detail-page"; import ItemsPage from "./pages/items-page"; import NotFoundPage from "./pages/not-found-page"; +import OnboardingPage from "./pages/onboarding-page"; import "./styles/global.css"; import "./styles/palette.css"; @@ -11,6 +13,14 @@ function App() { return ( + + + + } + /> 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 J$Y-zK|3AV~B8UJ0 literal 0 HcmV?d00001 diff --git a/vite-project/src/components/button/button-styles.js b/vite-project/src/components/button/button-styles.js deleted file mode 100644 index b97948b3..00000000 --- a/vite-project/src/components/button/button-styles.js +++ /dev/null @@ -1,11 +0,0 @@ -const BUTTON_SIZE = Object.freeze({ - medium: "medium", - small: "small", -}); - -const BUTTON_TYPE = Object.freeze({ - round: "round", - pill: "pill", -}); - -export { BUTTON_SIZE, BUTTON_TYPE }; diff --git a/vite-project/src/components/button/button-styles.ts b/vite-project/src/components/button/button-styles.ts new file mode 100644 index 00000000..db267f90 --- /dev/null +++ b/vite-project/src/components/button/button-styles.ts @@ -0,0 +1,15 @@ +const ButtonSize = { + medium: "medium", + small: "small", +} as const; + +type ButtonSize = (typeof ButtonSize)[keyof typeof ButtonSize]; + +const ButtonShape = { + round: "round", + pill: "pill", +} as const; + +type ButtonShape = (typeof ButtonShape)[keyof typeof ButtonShape]; + +export { ButtonShape, ButtonSize }; diff --git a/vite-project/src/components/button/button.jsx b/vite-project/src/components/button/button.tsx similarity index 54% rename from vite-project/src/components/button/button.jsx rename to vite-project/src/components/button/button.tsx index 979be3c0..7f52009b 100644 --- a/vite-project/src/components/button/button.jsx +++ b/vite-project/src/components/button/button.tsx @@ -1,25 +1,27 @@ +import type { ButtonHTMLAttributes } from "react"; import styled from "styled-components"; -import { BUTTON_SIZE, BUTTON_TYPE } from "./button-styles"; +import { ButtonShape, ButtonSize } from "./button-styles"; const BUTTON_STYLE = { - [BUTTON_SIZE.medium]: { + [ButtonSize.medium]: { padding: "11px 40px", fontSize: 18, }, - [BUTTON_SIZE.small]: { + [ButtonSize.small]: { padding: "8px 23px", fontSize: 16, }, - [BUTTON_TYPE.round]: { + [ButtonShape.round]: { borderRadius: 8, }, - [BUTTON_TYPE.pill]: { + [ButtonShape.pill]: { borderRadius: 24, }, }; -const StyledButton = styled.button` +const StyledButton = styled.button<{ $size: ButtonSize; $shape: ButtonShape }>` display: flex; + justify-content: center; gap: 8px; background-color: var(--color-primary-100); padding: ${({ $size }) => BUTTON_STYLE[$size].padding}; @@ -27,7 +29,7 @@ const StyledButton = styled.button` font-size: ${({ $size }) => BUTTON_STYLE[$size].fontSize}px; font-weight: 600; line-height: 26px; - border-radius: ${({ $type }) => BUTTON_STYLE[$type].borderRadius}px; + border-radius: ${({ $shape }) => BUTTON_STYLE[$shape].borderRadius}px; border: none; cursor: pointer; @@ -41,14 +43,20 @@ const StyledButton = styled.button` } `; +interface Props extends ButtonHTMLAttributes { + size?: ButtonSize; + shape?: ButtonShape; + children: React.ReactNode; +} + function Button({ children, - size = BUTTON_SIZE.small, - type = BUTTON_TYPE.round, + size = ButtonSize.small, + shape = ButtonShape.round, ...props -}) { +}: Props) { return ( - + {children} ); diff --git a/vite-project/src/components/link/link-list.tsx b/vite-project/src/components/link/link-list.tsx index 7a2cba69..ac54400b 100644 --- a/vite-project/src/components/link/link-list.tsx +++ b/vite-project/src/components/link/link-list.tsx @@ -28,6 +28,7 @@ const StyledLinkList = styled.ul` interface Props { children: React.ReactNode; } + function LinkList({ children }: Props): JSX.Element { return {children}; } diff --git a/vite-project/src/components/nav/nav-bar.tsx b/vite-project/src/components/nav/nav-bar.tsx index 0691c588..43150666 100644 --- a/vite-project/src/components/nav/nav-bar.tsx +++ b/vite-project/src/components/nav/nav-bar.tsx @@ -2,6 +2,8 @@ import type { JSX } from "react"; import styled from "styled-components"; const Content = styled.div` + max-width: 1200px; + margin: 0 auto; width: 100%; height: 70px; display: flex; @@ -10,7 +12,6 @@ const Content = styled.div` `; const StyledNavBar = styled.nav` - padding: 0 200px; border-bottom: 1px solid #dfdfdf; background-color: white; @@ -26,6 +27,7 @@ const StyledNavBar = styled.nav` interface Props { children: React.ReactNode; } + function NavBar({ children }: Props): JSX.Element { return ( diff --git a/vite-project/src/components/nav/onboarding-nav-bar.tsx b/vite-project/src/components/nav/onboarding-nav-bar.tsx index eb078b60..cc10aca3 100644 --- a/vite-project/src/components/nav/onboarding-nav-bar.tsx +++ b/vite-project/src/components/nav/onboarding-nav-bar.tsx @@ -1,9 +1,15 @@ +import Button from "../button/button"; +import { ButtonSize } from "../button/button-styles"; +import NavLogo from "../logo/nav-logo"; import NavBar from "./nav-bar"; function OnboardingNavBar() { - return -
Onboarding
-
+ return ( + + + + + ); } -export default OnboardingNavBar; \ No newline at end of file +export default OnboardingNavBar; diff --git a/vite-project/src/features/onboarding/components/footer-section.tsx b/vite-project/src/features/onboarding/components/footer-section.tsx new file mode 100644 index 00000000..7bd0d41b --- /dev/null +++ b/vite-project/src/features/onboarding/components/footer-section.tsx @@ -0,0 +1,53 @@ +import type { JSX } from "react"; +import styled from "styled-components"; +import landingImageBottom from "../../../assets/landing-image-bottom.png"; +import { MediaQueryBreakpoint } from "../../../utils/breakpoint"; +import HeaderFooterSection from "./header-footer-section"; +import OnboardingTitle from "./onboarding-title"; + +const TitleContainer = styled.div` + padding-bottom: 30px; + flex-grow: 1; +`; + +const StyledFooterSection = styled.div` + display: flex; + align-items: center; + gap: 8px; + + img { + height: 397px; + } + + @media ${MediaQueryBreakpoint.tablet} { + height: 100%; + flex-direction: column; + justify-content: space-between; + gap: 0px; + } + + @media ${MediaQueryBreakpoint.mobile} { + img { + height: 198px; + } + } +`; + +function FooterSection(): JSX.Element { + return ( + + + + + 믿을 수 있는 +
+ 판다마켓 중고 거래 +
+
+ +
+
+ ); +} + +export default FooterSection; diff --git a/vite-project/src/features/onboarding/components/header-footer-section.tsx b/vite-project/src/features/onboarding/components/header-footer-section.tsx new file mode 100644 index 00000000..003a59cf --- /dev/null +++ b/vite-project/src/features/onboarding/components/header-footer-section.tsx @@ -0,0 +1,39 @@ +import type { JSX } from "react"; +import styled from "styled-components"; +import { MediaQueryBreakpoint } from "../../../utils/breakpoint"; + +const Content = styled.div` + width: 100%; + max-width: 1200px; + margin: 0px auto; +`; + +const StyledHeaderFooterSection = styled.section` + background-color: #cfe5ff; + height: 540px; + display: flex; + align-items: flex-end; + + @media ${MediaQueryBreakpoint.tablet} { + height: 771px; + align-items: stretch; + } + + @media ${MediaQueryBreakpoint.mobile} { + height: 540px; + } +`; + +interface Props { + children: React.ReactNode; +} + +function HeaderFooterSection({ children }: Props): JSX.Element { + return ( + + {children} + + ); +} + +export default HeaderFooterSection; diff --git a/vite-project/src/features/onboarding/components/header-section.tsx b/vite-project/src/features/onboarding/components/header-section.tsx new file mode 100644 index 00000000..ca130435 --- /dev/null +++ b/vite-project/src/features/onboarding/components/header-section.tsx @@ -0,0 +1,64 @@ +import type { JSX } from "react"; +import styled from "styled-components"; +import landingImageTop from "../../../assets/landing-image_top.png"; +import Button from "../../../components/button/button"; +import { + ButtonShape, + ButtonSize, +} from "../../../components/button/button-styles"; +import { MediaQueryBreakpoint } from "../../../utils/breakpoint"; +import HeaderFooterSection from "./header-footer-section"; +import OnboardingTitle from "./onboarding-title"; + +const TitleContainer = styled.div` + display: flex; + flex-direction: column; + gap: 32px; + flex-grow: 1; + padding-bottom: 60px; +`; + +const StyledHeaderSection = styled.div` + display: flex; + align-items: center; + gap: 8px; + + img { + height: 340px; + } + + @media ${MediaQueryBreakpoint.tablet} { + height: 100%; + flex-direction: column; + justify-content: space-between; + gap: 0px; + } + + @media ${MediaQueryBreakpoint.mobile} { + img { + height: 204px; + } + } +`; + +function HeaderSection(): JSX.Element { + return ( + + + + + 일상의 모든 물건을 +
+ 거래해 보세요 +
+ +
+ +
+
+ ); +} + +export default HeaderSection; diff --git a/vite-project/src/features/onboarding/components/onboarding-title.tsx b/vite-project/src/features/onboarding/components/onboarding-title.tsx new file mode 100644 index 00000000..64ceb725 --- /dev/null +++ b/vite-project/src/features/onboarding/components/onboarding-title.tsx @@ -0,0 +1,21 @@ +import styled from "styled-components"; +import { MediaQueryBreakpoint } from "../../../utils/breakpoint"; + +const OnboardingTitle = styled.h2` + margin: 0; + font-size: 40px; + font-weight: 700; + line-height: 1.4; + + @media ${MediaQueryBreakpoint.tablet} { + text-align: center; + margin-top: 84px; + } + + @media ${MediaQueryBreakpoint.mobile} { + font-size: 32px; + margin-top: 60px; + } +`; + +export default OnboardingTitle; diff --git a/vite-project/src/layouts/home-layout.tsx b/vite-project/src/layouts/home-layout.tsx index aa4dd585..77cc005c 100644 --- a/vite-project/src/layouts/home-layout.tsx +++ b/vite-project/src/layouts/home-layout.tsx @@ -21,6 +21,7 @@ const Content = styled.div` interface Props { children: React.ReactNode; } + function HomeLayout({ children }: Props): JSX.Element { return ( <> diff --git a/vite-project/src/layouts/onboarding-layout.tsx b/vite-project/src/layouts/onboarding-layout.tsx new file mode 100644 index 00000000..46a42c37 --- /dev/null +++ b/vite-project/src/layouts/onboarding-layout.tsx @@ -0,0 +1,17 @@ +import type { JSX } from "react"; +import OnboardingNavBar from "../components/nav/onboarding-nav-bar"; + +interface Props { + children: React.ReactNode; +} + +function OnboardingLayout({ children }: Props): JSX.Element { + return ( + <> + + {children} + + ); +} + +export default OnboardingLayout; diff --git a/vite-project/src/pages/item-detail-page.jsx b/vite-project/src/pages/item-detail-page.jsx index 93913110..8ce29f8f 100644 --- a/vite-project/src/pages/item-detail-page.jsx +++ b/vite-project/src/pages/item-detail-page.jsx @@ -2,7 +2,7 @@ import { Link } from "react-router-dom"; import styled from "styled-components"; import backImg from "../assets/ic-arrow-back.svg"; import Button from "../components/button/button"; -import { BUTTON_SIZE, BUTTON_TYPE } from "../components/button/button-styles"; +import { ButtonShape, ButtonSize } from "../components/button/button-styles"; import ProductDetailComment from "../features/product/components/product-detail-comment"; import ProductDetailInfo from "../features/product/components/product-detail-info"; @@ -48,7 +48,7 @@ const StyledBackButton = styled(Link)` function BackButton({ children }) { return ( - diff --git a/vite-project/src/pages/onboarding-page.tsx b/vite-project/src/pages/onboarding-page.tsx new file mode 100644 index 00000000..eb9af174 --- /dev/null +++ b/vite-project/src/pages/onboarding-page.tsx @@ -0,0 +1,18 @@ +import type { JSX } from "react"; +import styled from "styled-components"; +import FooterSection from "../features/onboarding/components/footer-section"; +import HeaderSection from "../features/onboarding/components/header-section"; + +const StyledOnboardingPage = styled.div``; + +function OnboardingPage(): JSX.Element { + return ( + + +
+ + + ); +} + +export default OnboardingPage; From 5ff6af62a8ba1cb5ce69c1e1f2816b0c292f89c8 Mon Sep 17 00:00:00 2001 From: Chamsol Kim Date: Thu, 4 Sep 2025 15:57:09 +0900 Subject: [PATCH 07/16] =?UTF-8?q?feat(Sprint8):=20Page=20footer=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vite-project/src/assets/ic-facebook.svg | 3 + vite-project/src/assets/ic-instagram.svg | 3 + vite-project/src/assets/ic-twitter.svg | 3 + vite-project/src/assets/ic-youtube.svg | 10 +++ .../src/components/link/social-link.tsx | 12 +++ vite-project/src/components/social/social.ts | 27 ++++++ .../components/onboarding-page-footer.tsx | 86 +++++++++++++++++++ vite-project/src/pages/onboarding-page.tsx | 9 +- 8 files changed, 148 insertions(+), 5 deletions(-) create mode 100644 vite-project/src/assets/ic-facebook.svg create mode 100644 vite-project/src/assets/ic-instagram.svg create mode 100644 vite-project/src/assets/ic-twitter.svg create mode 100644 vite-project/src/assets/ic-youtube.svg create mode 100644 vite-project/src/components/link/social-link.tsx create mode 100644 vite-project/src/components/social/social.ts create mode 100644 vite-project/src/features/onboarding/components/onboarding-page-footer.tsx diff --git a/vite-project/src/assets/ic-facebook.svg b/vite-project/src/assets/ic-facebook.svg new file mode 100644 index 00000000..b9c9d493 --- /dev/null +++ b/vite-project/src/assets/ic-facebook.svg @@ -0,0 +1,3 @@ + + + diff --git a/vite-project/src/assets/ic-instagram.svg b/vite-project/src/assets/ic-instagram.svg new file mode 100644 index 00000000..0b9337b0 --- /dev/null +++ b/vite-project/src/assets/ic-instagram.svg @@ -0,0 +1,3 @@ + + + diff --git a/vite-project/src/assets/ic-twitter.svg b/vite-project/src/assets/ic-twitter.svg new file mode 100644 index 00000000..14a6069a --- /dev/null +++ b/vite-project/src/assets/ic-twitter.svg @@ -0,0 +1,3 @@ + + + diff --git a/vite-project/src/assets/ic-youtube.svg b/vite-project/src/assets/ic-youtube.svg new file mode 100644 index 00000000..ad8b97ba --- /dev/null +++ b/vite-project/src/assets/ic-youtube.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/vite-project/src/components/link/social-link.tsx b/vite-project/src/components/link/social-link.tsx new file mode 100644 index 00000000..9458de92 --- /dev/null +++ b/vite-project/src/components/link/social-link.tsx @@ -0,0 +1,12 @@ +import type { JSX } from "react"; +import { type SocialType } from "../social/social"; + +function SocialLink({ social }: { social: SocialType }): JSX.Element { + return ( + + {social.link} + + ); +} + +export default SocialLink; diff --git a/vite-project/src/components/social/social.ts b/vite-project/src/components/social/social.ts new file mode 100644 index 00000000..68901733 --- /dev/null +++ b/vite-project/src/components/social/social.ts @@ -0,0 +1,27 @@ +import facebookIcon from "../../assets/ic-facebook.svg"; +import instagramIcon from "../../assets/ic-instagram.svg"; +import twitterIcon from "../../assets/ic-twitter.svg"; +import youtubeIcon from "../../assets/ic-youtube.svg"; + +const Social = { + facebook: { + icon: facebookIcon, + link: "https://www.facebook.com", + }, + twitter: { + icon: twitterIcon, + link: "https://www.twitter.com/", + }, + youtube: { + icon: youtubeIcon, + link: "https://www.youtube.com/", + }, + instagram: { + icon: instagramIcon, + link: "https://www.instagram.com/", + }, +} as const; + +export type SocialType = (typeof Social)[keyof typeof Social]; + +export { Social }; diff --git a/vite-project/src/features/onboarding/components/onboarding-page-footer.tsx b/vite-project/src/features/onboarding/components/onboarding-page-footer.tsx new file mode 100644 index 00000000..bf0eb84c --- /dev/null +++ b/vite-project/src/features/onboarding/components/onboarding-page-footer.tsx @@ -0,0 +1,86 @@ +import type { JSX } from "react"; +import { styled } from "styled-components"; +import SocialLink from "../../../components/link/social-link"; +import { Social } from "../../../components/social/social"; +import { MediaQueryBreakpoint } from "../../../utils/breakpoint"; + +const Copyright = styled.div` + color: var(--color-secondary-400); + + @media ${MediaQueryBreakpoint.mobile} { + position: absolute; + left: 0; + bottom: 0; + } +`; + +const CustomerService = styled.div` + color: var(--color-secondary-200); + display: flex; + gap: 30px; +`; + +const SocialList = styled.ul` + display: flex; + gap: 12px; + margin: 0; + padding: 0; + list-style: none; +`; + +const SocialListItem = styled.li``; + +const Content = styled.div` + max-width: 1200px; + margin: 0 auto; + width: 100%; + display: flex; + justify-content: space-between; + position: relative; + + @media ${MediaQueryBreakpoint.mobile} { + height: 63px; + } +`; + +const StyledOnboardingPageFooter = styled.footer` + background-color: var(--color-secondary-900); + height: 160px; + padding-top: 32px; + + @media ${MediaQueryBreakpoint.tablet} { + padding: 32px 24px 0; + } +`; + +function OnboardingPageFooter(): JSX.Element { + return ( + + + + ©codeit - 2024 + + + Privacy Policy + FAQ + + + + + + + + + + + + + + + + + + ); +} + +export default OnboardingPageFooter; diff --git a/vite-project/src/pages/onboarding-page.tsx b/vite-project/src/pages/onboarding-page.tsx index eb9af174..8a550d68 100644 --- a/vite-project/src/pages/onboarding-page.tsx +++ b/vite-project/src/pages/onboarding-page.tsx @@ -1,17 +1,16 @@ import type { JSX } from "react"; -import styled from "styled-components"; import FooterSection from "../features/onboarding/components/footer-section"; import HeaderSection from "../features/onboarding/components/header-section"; - -const StyledOnboardingPage = styled.div``; +import OnboardingPageFooter from "../features/onboarding/components/onboarding-page-footer"; function OnboardingPage(): JSX.Element { return ( - + <>
- + + ); } From 1f46aa917bfb3d9b491f2810452264c8c9e22e05 Mon Sep 17 00:00:00 2001 From: Chamsol Kim Date: Thu, 4 Sep 2025 17:24:57 +0900 Subject: [PATCH 08/16] =?UTF-8?q?feat(Sprint8):=20Onboarding=20page=20sect?= =?UTF-8?q?ion=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/assets/onboarding-hot-item.png | Bin 0 -> 13380 bytes .../src/assets/onboarding-register.png | Bin 0 -> 9842 bytes vite-project/src/assets/onboarding-search.png | Bin 0 -> 16473 bytes .../onboarding/components/content-section.tsx | 141 ++++++++++++++++++ .../onboarding/models/onboarding-content.ts | 29 ++++ .../hooks/{useDevice.jsx => useDevice.tsx} | 12 +- vite-project/src/pages/onboarding-page.tsx | 6 +- 7 files changed, 181 insertions(+), 7 deletions(-) create mode 100644 vite-project/src/assets/onboarding-hot-item.png create mode 100644 vite-project/src/assets/onboarding-register.png create mode 100644 vite-project/src/assets/onboarding-search.png create mode 100644 vite-project/src/features/onboarding/components/content-section.tsx create mode 100644 vite-project/src/features/onboarding/models/onboarding-content.ts rename vite-project/src/hooks/{useDevice.jsx => useDevice.tsx} (83%) diff --git a/vite-project/src/assets/onboarding-hot-item.png b/vite-project/src/assets/onboarding-hot-item.png new file mode 100644 index 0000000000000000000000000000000000000000..01e055e0a0a8738f7bb7bb225c3f8d2c84fccb88 GIT binary patch literal 13380 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 LR)LmFngsq|D8y)Z literal 0 HcmV?d00001 diff --git a/vite-project/src/assets/onboarding-register.png b/vite-project/src/assets/onboarding-register.png new file mode 100644 index 0000000000000000000000000000000000000000..42ca86365edcf263c0d4220ef06422df02d3fc15 GIT binary patch literal 9842 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 literal 0 HcmV?d00001 diff --git a/vite-project/src/assets/onboarding-search.png b/vite-project/src/assets/onboarding-search.png new file mode 100644 index 0000000000000000000000000000000000000000..ad93c905777fbb5c349f221c52070fdd430113a5 GIT binary patch literal 16473 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
{value}
); + return <>{elements}; +} + +function Title({ children }: { children: string }): JSX.Element { + const { isDesktop } = useDevice(); + const title = isDesktop ? breakText(children) : children; + return {title}; +} + +const TextContainer = styled.div<{ $reverse: boolean }>` + display: flex; + flex-direction: column; + text-align: ${({ $reverse }) => ($reverse ? "right" : "left")}; + + & > span { + font-size: 18px; + font-weight: 800; + line-height: 26px; + color: var(--color-primary-100); + } + + h2 { + margin-top: 12px; + margin-bottom: 24px; + } + + p { + margin: 0; + font-size: 24px; + font-weight: 500; + line-height: 32px; + } + + @media ${MediaQueryBreakpoint.tablet} { + span { + font-weight: 700; + } + + h2 { + margin-top: 16px; + } + + p { + font-size: 18px; + line-height: 26px; + } + } + + @media ${MediaQueryBreakpoint.mobile} { + span { + font-size: 16px; + font-weight: 700; + } + + h2 { + margin-top: 8px; + margin-bottom: 16px; + } + + p { + font-size: 16px; + } + } +`; + +const Content = styled.div<{ $reverse: boolean }>` + width: 988px; + height: 444px; + margin: 0 auto; + background-color: #f9f9f9; + display: flex; + gap: 64px; + flex-direction: ${({ $reverse }) => ($reverse ? "row-reverse" : "row")}; + justify-content: center; + align-items: center; + border-radius: 12px; + overflow: hidden; + + @media ${MediaQueryBreakpoint.tablet} { + width: auto; + height: auto; + gap: 24px; + flex-direction: column; + align-items: ${({ $reverse }) => ($reverse ? "flex-end" : "flex-start")}; + background-color: transparent; + + img { + width: 100%; + border-radius: 12px; + } + } +`; + +const Container = styled.div` + width: 100%; + max-width: 1200px; + margin: 0 auto; + padding: 138px 0; + + @media ${MediaQueryBreakpoint.tablet} { + margin: 0; + padding: 24px; + } +`; + +const StyledContentSection = styled.section``; + +function ContentSection({ content, reverse = false }: Props): JSX.Element { + return ( + + + + {content.label} + + {content.label} + {content.title} +

{breakText(content.description)}

+
+
+
+
+ ); +} + +export default ContentSection; diff --git a/vite-project/src/features/onboarding/models/onboarding-content.ts b/vite-project/src/features/onboarding/models/onboarding-content.ts new file mode 100644 index 00000000..b70e60bc --- /dev/null +++ b/vite-project/src/features/onboarding/models/onboarding-content.ts @@ -0,0 +1,29 @@ +import hotItemImage from "../../../assets/onboarding-hot-item.png"; +import registerImage from "../../../assets/onboarding-register.png"; +import searchImage from "../../../assets/onboarding-search.png"; + +const OnboardingContent = { + hotItem: { + image: hotItemImage, + label: "Hot Item", + title: "인기 상품을\n확인해 보세요", + description: "가장 HOT한 중고거래 물품을\n판다 마켓에서 확인해 보세요", + }, + search: { + image: searchImage, + label: "Search", + title: "구매를 원하는\n상품을 검색하세요", + description: "구매하고 싶은 물품은 검색해서\n쉽게 찾아보세요", + }, + register: { + image: registerImage, + label: "Register", + title: "판매를 원하는\n상품을 등록하세요", + description: "어떤 물건이든 판매하고 싶은 상품을\n쉽게 등록하세요", + }, +}; + +export type OnboardingContentType = + (typeof OnboardingContent)[keyof typeof OnboardingContent]; + +export { OnboardingContent }; diff --git a/vite-project/src/hooks/useDevice.jsx b/vite-project/src/hooks/useDevice.tsx similarity index 83% rename from vite-project/src/hooks/useDevice.jsx rename to vite-project/src/hooks/useDevice.tsx index 05156a0e..46138e41 100644 --- a/vite-project/src/hooks/useDevice.jsx +++ b/vite-project/src/hooks/useDevice.tsx @@ -1,8 +1,8 @@ import { useEffect, useState } from "react"; -let _matchesDesktop; -let _matchesTablet; -let _matchesMobile; +let _matchesDesktop: MediaQueryList | null; +let _matchesTablet: MediaQueryList | null; +let _matchesMobile: MediaQueryList | null; function useDevice() { const matchesDesktop = _matchesDesktop ?? matchMedia("(min-width: 1200px)"); @@ -17,7 +17,7 @@ function useDevice() { }); useEffect(() => { - const handleDesktopMatchesChange = (e) => { + const handleDesktopMatchesChange = (e: MediaQueryListEvent) => { if (!e.matches) return; setDeviceInfo({ isDesktop: true, @@ -35,7 +35,7 @@ function useDevice() { }, [matchesDesktop]); useEffect(() => { - const handleTabletMatchesChange = (e) => { + const handleTabletMatchesChange = (e: MediaQueryListEvent) => { if (!e.matches) return; setDeviceInfo({ isDesktop: false, @@ -51,7 +51,7 @@ function useDevice() { }, [matchesTablet]); useEffect(() => { - const handleMobileMatchesChange = (e) => { + const handleMobileMatchesChange = (e: MediaQueryListEvent) => { if (!e.matches) return; setDeviceInfo({ isDesktop: false, diff --git a/vite-project/src/pages/onboarding-page.tsx b/vite-project/src/pages/onboarding-page.tsx index 8a550d68..cf791f3e 100644 --- a/vite-project/src/pages/onboarding-page.tsx +++ b/vite-project/src/pages/onboarding-page.tsx @@ -1,13 +1,17 @@ import type { JSX } from "react"; +import ContentSection from "../features/onboarding/components/content-section"; import FooterSection from "../features/onboarding/components/footer-section"; import HeaderSection from "../features/onboarding/components/header-section"; import OnboardingPageFooter from "../features/onboarding/components/onboarding-page-footer"; +import { OnboardingContent } from "../features/onboarding/models/onboarding-content"; function OnboardingPage(): JSX.Element { return ( <> -
+ + + From f799b6616c1517f403f1b01724124b57c911c7e5 Mon Sep 17 00:00:00 2001 From: Chamsol Kim Date: Thu, 4 Sep 2025 17:28:43 +0900 Subject: [PATCH 09/16] =?UTF-8?q?feat(Sprint8):=20Onboarding=20page=20foot?= =?UTF-8?q?er=20=EC=83=81=EB=8B=A8=20=EA=B0=84=EA=B2=A9=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../onboarding/components/content-section.tsx | 4 +++ vite-project/src/pages/onboarding-page.tsx | 32 +++++++++++++++---- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/vite-project/src/features/onboarding/components/content-section.tsx b/vite-project/src/features/onboarding/components/content-section.tsx index c4913926..6b38aab0 100644 --- a/vite-project/src/features/onboarding/components/content-section.tsx +++ b/vite-project/src/features/onboarding/components/content-section.tsx @@ -117,6 +117,10 @@ const Container = styled.div` margin: 0; padding: 24px; } + + @media ${MediaQueryBreakpoint.mobile} { + padding: 16px; + } `; const StyledContentSection = styled.section``; diff --git a/vite-project/src/pages/onboarding-page.tsx b/vite-project/src/pages/onboarding-page.tsx index cf791f3e..41b00ee1 100644 --- a/vite-project/src/pages/onboarding-page.tsx +++ b/vite-project/src/pages/onboarding-page.tsx @@ -1,20 +1,38 @@ import type { JSX } from "react"; +import styled from "styled-components"; import ContentSection from "../features/onboarding/components/content-section"; import FooterSection from "../features/onboarding/components/footer-section"; import HeaderSection from "../features/onboarding/components/header-section"; import OnboardingPageFooter from "../features/onboarding/components/onboarding-page-footer"; import { OnboardingContent } from "../features/onboarding/models/onboarding-content"; +import { MediaQueryBreakpoint } from "../utils/breakpoint"; + +const StyledOnboardingPage = styled.div` + display: flex; + flex-direction: column; + gap: 138px; + + @media ${MediaQueryBreakpoint.tablet} { + gap: 56px; + } + + @media (${MediaQueryBreakpoint.mobile}) { + gap: 83px; + } +`; function OnboardingPage(): JSX.Element { return ( - <> - - - - - + +
+ + + + + +
- +
); } From d17977a6e2d3e49207eb1eb03e2f315c8a7ad53d Mon Sep 17 00:00:00 2001 From: Chamsol Kim Date: Thu, 4 Sep 2025 20:39:52 +0900 Subject: [PATCH 10/16] =?UTF-8?q?feat(Sprint8):=20large,=20medium=20logo?= =?UTF-8?q?=20image=20=EC=B6=94=EA=B0=80,=20=EA=B8=B0=EC=A1=B4=20logo=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vite-project/src/assets/logo-large.svg | 28 +++++++++---------- vite-project/src/assets/logo-medium.svg | 15 ++++++++++ vite-project/src/assets/logo-small.svg | 16 +++++++++-- vite-project/src/assets/logo-text-xsmall.svg | 3 ++ .../src/components/logo/form-logo.tsx | 0 vite-project/src/components/logo/nav-logo.tsx | 6 ++-- 6 files changed, 49 insertions(+), 19 deletions(-) create mode 100644 vite-project/src/assets/logo-medium.svg create mode 100644 vite-project/src/assets/logo-text-xsmall.svg create mode 100644 vite-project/src/components/logo/form-logo.tsx diff --git a/vite-project/src/assets/logo-large.svg b/vite-project/src/assets/logo-large.svg index ceaa7bf0..4373386b 100644 --- a/vite-project/src/assets/logo-large.svg +++ b/vite-project/src/assets/logo-large.svg @@ -1,15 +1,15 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + diff --git a/vite-project/src/assets/logo-medium.svg b/vite-project/src/assets/logo-medium.svg new file mode 100644 index 00000000..47b920af --- /dev/null +++ b/vite-project/src/assets/logo-medium.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/vite-project/src/assets/logo-small.svg b/vite-project/src/assets/logo-small.svg index dfab2145..ceaa7bf0 100644 --- a/vite-project/src/assets/logo-small.svg +++ b/vite-project/src/assets/logo-small.svg @@ -1,3 +1,15 @@ - - + + + + + + + + + + + + + + diff --git a/vite-project/src/assets/logo-text-xsmall.svg b/vite-project/src/assets/logo-text-xsmall.svg new file mode 100644 index 00000000..dfab2145 --- /dev/null +++ b/vite-project/src/assets/logo-text-xsmall.svg @@ -0,0 +1,3 @@ + + + diff --git a/vite-project/src/components/logo/form-logo.tsx b/vite-project/src/components/logo/form-logo.tsx new file mode 100644 index 00000000..e69de29b diff --git a/vite-project/src/components/logo/nav-logo.tsx b/vite-project/src/components/logo/nav-logo.tsx index 48f1dd52..c845e65f 100644 --- a/vite-project/src/components/logo/nav-logo.tsx +++ b/vite-project/src/components/logo/nav-logo.tsx @@ -1,7 +1,7 @@ import type { JSX } from "react"; import styled from "styled-components"; -import largeLogo from "../../assets/logo-large.svg"; import smallLogo from "../../assets/logo-small.svg"; +import textLogo from "../../assets/logo-text-xsmall.svg"; import { MediaQueryBreakpoint } from "../../utils/breakpoint"; const StyledNavLogo = styled.picture` @@ -19,8 +19,8 @@ const StyledNavLogo = styled.picture` function NavLogo(): JSX.Element { return ( - - + + ); } From 402e7f9f86353a7f8231d4b0715e2baae12d9d1d Mon Sep 17 00:00:00 2001 From: Chamsol Kim Date: Thu, 4 Sep 2025 21:58:10 +0900 Subject: [PATCH 11/16] =?UTF-8?q?feat(Sprint8):=20Login=20page=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vite-project/src/app.jsx | 2 + vite-project/src/assets/ic-google.svg | 10 ++ vite-project/src/assets/ic-kakaotalk.svg | 12 ++ .../components/button/social-login-button.tsx | 24 ++++ .../src/components/input/form-input.tsx | 31 +++++ .../src/components/input/input-styles.ts | 29 +++++ .../src/components/input/text-area-input.tsx | 31 +++++ .../src/components/input/text-input.jsx | 59 ---------- .../src/components/input/text-input.tsx | 33 ++++++ .../src/components/logo/form-logo.tsx | 14 +++ .../src/components/nav/onboarding-nav-bar.tsx | 11 +- .../components/social/form-social-login.tsx | 45 ++++++++ .../src/components/social/social-login.ts | 17 +++ .../comment/components/comment-form.jsx | 5 +- vite-project/src/pages/add-item-page.jsx | 4 +- vite-project/src/pages/login-page.tsx | 109 ++++++++++++++++++ 16 files changed, 371 insertions(+), 65 deletions(-) create mode 100644 vite-project/src/assets/ic-google.svg create mode 100644 vite-project/src/assets/ic-kakaotalk.svg create mode 100644 vite-project/src/components/button/social-login-button.tsx create mode 100644 vite-project/src/components/input/form-input.tsx create mode 100644 vite-project/src/components/input/input-styles.ts create mode 100644 vite-project/src/components/input/text-area-input.tsx delete mode 100644 vite-project/src/components/input/text-input.jsx create mode 100644 vite-project/src/components/input/text-input.tsx create mode 100644 vite-project/src/components/social/form-social-login.tsx create mode 100644 vite-project/src/components/social/social-login.ts create mode 100644 vite-project/src/pages/login-page.tsx diff --git a/vite-project/src/app.jsx b/vite-project/src/app.jsx index bd43e78c..5bb7909b 100644 --- a/vite-project/src/app.jsx +++ b/vite-project/src/app.jsx @@ -4,6 +4,7 @@ import OnboardingLayout from "./layouts/onboarding-layout"; import AddItemPage from "./pages/add-item-page"; import ItemDetailPage from "./pages/item-detail-page"; import ItemsPage from "./pages/items-page"; +import LoginPage from "./pages/login-page"; import NotFoundPage from "./pages/not-found-page"; import OnboardingPage from "./pages/onboarding-page"; import "./styles/global.css"; @@ -21,6 +22,7 @@ function App() { } /> + } /> + + + + + + + + + diff --git a/vite-project/src/assets/ic-kakaotalk.svg b/vite-project/src/assets/ic-kakaotalk.svg new file mode 100644 index 00000000..a7990c3e --- /dev/null +++ b/vite-project/src/assets/ic-kakaotalk.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/vite-project/src/components/button/social-login-button.tsx b/vite-project/src/components/button/social-login-button.tsx new file mode 100644 index 00000000..eb0c2ee2 --- /dev/null +++ b/vite-project/src/components/button/social-login-button.tsx @@ -0,0 +1,24 @@ +import type { JSX } from "react/jsx-dev-runtime"; +import { styled } from "styled-components"; +import type { SocialLoginType } from "../social/social-login"; + +const StyledSocialLoginButton = styled.button` + background: none; + border: none; + cursor: pointer; + padding: 0; +`; + +interface Props { + socialLogin: SocialLoginType; +} + +function SocialLoginButton({ socialLogin }: Props): JSX.Element { + return ( + + {socialLogin.name} + + ); +} + +export default SocialLoginButton; diff --git a/vite-project/src/components/input/form-input.tsx b/vite-project/src/components/input/form-input.tsx new file mode 100644 index 00000000..775ade57 --- /dev/null +++ b/vite-project/src/components/input/form-input.tsx @@ -0,0 +1,31 @@ +import type { InputHTMLAttributes, JSX } from "react"; +import styled from "styled-components"; +import TextInput from "./text-input"; + +const StyledFormInput = styled.div` + width: 100%; + display: flex; + flex-direction: column; + gap: 16px; + + label { + font-size: 18px; + font-weight: 700; + line-height: 26px; + } +`; + +interface Props extends InputHTMLAttributes { + labelText: string; +} + +function FormInput({ labelText, id, ...props }: Props): JSX.Element { + return ( + + + + + ); +} + +export default FormInput; diff --git a/vite-project/src/components/input/input-styles.ts b/vite-project/src/components/input/input-styles.ts new file mode 100644 index 00000000..4b94a7f1 --- /dev/null +++ b/vite-project/src/components/input/input-styles.ts @@ -0,0 +1,29 @@ +import { css } from "styled-components"; + +const fontStyle = css` + font-size: 16px; + font-weight: 400; + line-height: 26px; +`; + +const inputStyle = css` + background-color: var(--color-secondary-100); + padding: 16px 24px; + border-radius: 12px; +`; + +const inputTextStyle = css` + ${fontStyle} + width: 100%; + border: none; + background: none; + padding: 0; + color: var(--color-secondary-800); +`; + +const inputPlaceholderStyle = css` + color: var(--color-secondary-400); + ${fontStyle} +`; + +export { inputPlaceholderStyle, inputStyle, inputTextStyle }; diff --git a/vite-project/src/components/input/text-area-input.tsx b/vite-project/src/components/input/text-area-input.tsx new file mode 100644 index 00000000..7d3fcd90 --- /dev/null +++ b/vite-project/src/components/input/text-area-input.tsx @@ -0,0 +1,31 @@ +import type { JSX, TextareaHTMLAttributes } from "react"; +import styled from "styled-components"; +import { inputPlaceholderStyle, inputStyle } from "./input-styles"; + +const StyledTextAreaInput = styled.div` + ${inputStyle} + + textarea { + ${inputStyle} + height: 100%; + resize: none; + } + textarea:focus { + outline: none; + } + textarea::placeholder { + ${inputPlaceholderStyle} + } +`; + +interface Props extends TextareaHTMLAttributes {} + +function TextAreaInput({ ...props }: Props): JSX.Element { + return ( + +