diff --git a/.husky/pre-commit b/.husky/pre-commit
index 61c8331..2312dc5 100755
--- a/.husky/pre-commit
+++ b/.husky/pre-commit
@@ -1,2 +1 @@
npx lint-staged
-npx lint-staged
diff --git a/README.md b/README.md
index 786927a..459c645 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,4 @@
-# Team18_FE
-18조 프론트엔드
+# 🍪 내가 먹은 쿠키 - 18조 FE
-### 코드리뷰 질문
-**Week3**
-- 현재 vite로 프로젝트 세팅을 마쳤는데, 더 추천해주실 라이브러리나 프레임워크 등 이 있을까요?
-- 협업을 하면서 알면 좋은 사소한 팁이 있을까요?
-- 현재 팀원들간 설정한 프로젝트 세팅은 아래 노션과 같습니다. 조언해주실 부분이 있나요?
- https://kibong.notion.site/11100da872ea4854bf0f91908f029037?pvs=4
+## 🙋♂️ 4주차 코드리뷰 질문
+- `Modal` 컴포넌트를 구현하면서 텍스트 부분과 버튼 부분에 들어갈 내용은 개발할 때 코드를 작성하는 사람이 자유롭게 작성하여 구성할 수 있도록 `textChildren`과 `buttonChildren`만으로 구성하였는데, 더 적합하거나 지향하는 방식이 있을까요?
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 410442f..a5c7824 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -12,6 +12,7 @@
"@emotion/react": "^11.13.3",
"@emotion/styled": "^11.13.0",
"@tanstack/react-query": "^5.56.2",
+ "csstype": "^3.1.3",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"zustand": "^4.5.5"
@@ -2753,7 +2754,7 @@
"version": "15.7.12",
"resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz",
"integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==",
- "devOptional": true
+ "dev": true
},
"node_modules/@types/qs": {
"version": "6.9.16",
@@ -2771,7 +2772,7 @@
"version": "18.3.5",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.5.tgz",
"integrity": "sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA==",
- "devOptional": true,
+ "dev": true,
"dependencies": {
"@types/prop-types": "*",
"csstype": "^3.0.2"
diff --git a/package.json b/package.json
index bc6f6bf..b48b6c0 100644
--- a/package.json
+++ b/package.json
@@ -7,6 +7,7 @@
"dev": "vite",
"build": "tsc -b && vite build",
"lint": "eslint --cache 'src/**/*.{ts,tsx}'",
+ "tsc": "tsc --noEmit",
"format": "prettier --write --cache 'src/**/*.{ts,tsx}'",
"lint-staged": "lint-staged",
"preview": "vite preview",
@@ -18,23 +19,22 @@
"lint-staged": {
"**/*.{tsx,ts,jsx,js}": [
"eslint --fix --cache",
- "prettier --write --cache"
- ],
- "*.js": "eslint --cache --fix",
- "*.{ts,tsx}": "prettier --write"
+ "prettier --write --cache"
+ ]
},
"dependencies": {
"@emotion/babel-plugin": "^11.12.0",
"@emotion/react": "^11.13.3",
"@emotion/styled": "^11.13.0",
+ "@emotion/css": "^11.13.0",
"@tanstack/react-query": "^5.56.2",
+ "csstype": "^3.1.3",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"zustand": "^4.5.5"
},
"devDependencies": {
"@chromatic-com/storybook": "^2.0.2",
- "@emotion/css": "^11.13.0",
"@eslint/js": "^9.9.0",
"@storybook/addon-essentials": "^8.3.0",
"@storybook/addon-interactions": "^8.3.0",
diff --git a/src/App.tsx b/src/App.tsx
index 6ed5121..f85be72 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -1,12 +1,5 @@
-import GlobalStyles from './assets/styles';
-
function App() {
- return (
- <>
-
-
hello world!
- >
- );
+ return helloWorld!
;
}
export default App;
diff --git a/src/assets/images/hirehigher-logo.svg b/src/assets/images/hirehigher-logo.svg
new file mode 100644
index 0000000..80c4bf4
--- /dev/null
+++ b/src/assets/images/hirehigher-logo.svg
@@ -0,0 +1,9 @@
+
diff --git a/src/assets/styles/emotion.d.ts b/src/assets/styles/emotion.d.ts
new file mode 100644
index 0000000..0685ded
--- /dev/null
+++ b/src/assets/styles/emotion.d.ts
@@ -0,0 +1,8 @@
+import '@emotion/react';
+import { PalettesTypes } from './global/palettes';
+
+declare module '@emotion/react' {
+ export interface Theme {
+ palettes: PalettesTypes;
+ }
+}
diff --git a/src/assets/styles/global/palettes.ts b/src/assets/styles/global/palettes.ts
new file mode 100644
index 0000000..f001c5e
--- /dev/null
+++ b/src/assets/styles/global/palettes.ts
@@ -0,0 +1,6 @@
+export const palettes = {
+ white: '#fff',
+ borderGray: '#e4e5e8',
+};
+
+export type PalettesTypes = typeof palettes;
diff --git a/src/assets/styles/images/features/layout/footer/facebook_Icon.svg b/src/assets/styles/images/features/layout/footer/facebook_Icon.svg
new file mode 100644
index 0000000..cd3d1e2
--- /dev/null
+++ b/src/assets/styles/images/features/layout/footer/facebook_Icon.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/styles/images/features/layout/footer/hire_higher_Icon.svg b/src/assets/styles/images/features/layout/footer/hire_higher_Icon.svg
new file mode 100644
index 0000000..80c4bf4
--- /dev/null
+++ b/src/assets/styles/images/features/layout/footer/hire_higher_Icon.svg
@@ -0,0 +1,9 @@
+
diff --git a/src/assets/styles/images/features/layout/footer/instagram_Icon.svg b/src/assets/styles/images/features/layout/footer/instagram_Icon.svg
new file mode 100644
index 0000000..d2eb91c
--- /dev/null
+++ b/src/assets/styles/images/features/layout/footer/instagram_Icon.svg
@@ -0,0 +1,12 @@
+
diff --git a/src/assets/styles/images/features/layout/footer/twitter_Icon.svg b/src/assets/styles/images/features/layout/footer/twitter_Icon.svg
new file mode 100644
index 0000000..0dc2e48
--- /dev/null
+++ b/src/assets/styles/images/features/layout/footer/twitter_Icon.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/assets/styles/images/features/layout/footer/youtube_Icon.svg b/src/assets/styles/images/features/layout/footer/youtube_Icon.svg
new file mode 100644
index 0000000..5a2a447
--- /dev/null
+++ b/src/assets/styles/images/features/layout/footer/youtube_Icon.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/assets/styles/theme.ts b/src/assets/styles/theme.ts
new file mode 100644
index 0000000..e02dbfa
--- /dev/null
+++ b/src/assets/styles/theme.ts
@@ -0,0 +1,8 @@
+import { Theme } from '@emotion/react';
+import { palettes } from './global/palettes';
+
+const theme: Theme = {
+ palettes,
+};
+
+export default theme;
diff --git a/src/components/common/Button/index.stories.tsx b/src/components/common/Button/index.stories.tsx
index 28e8305..e908acd 100644
--- a/src/components/common/Button/index.stories.tsx
+++ b/src/components/common/Button/index.stories.tsx
@@ -1,14 +1,20 @@
-import { Meta, StoryObj } from '@storybook/react';
-import Button from '.';
+import type { Meta, StoryObj } from '@storybook/react';
-const meta: Meta = {
+import Button from './index';
+
+const meta = {
title: 'common/Button',
- component: Button,
tags: ['autodocs'],
-};
+ args: {
+ children: '버튼',
+ theme: 'default',
+ },
+ render: (props) => ,
+} satisfies Meta;
export default meta;
+type Story = StoryObj;
-type Story = StoryObj;
-
-export const Primary: Story = {};
+export const Default: Story = {};
+export const Outlined: Story = { args: { theme: 'outlined' } };
+export const TextButton: Story = { args: { theme: 'textbutton' } };
diff --git a/src/components/common/Button/index.tsx b/src/components/common/Button/index.tsx
index a10da89..7fe747d 100644
--- a/src/components/common/Button/index.tsx
+++ b/src/components/common/Button/index.tsx
@@ -1,11 +1,48 @@
import styled from '@emotion/styled';
-export default function Button() {
- return example;
+interface Props extends React.ButtonHTMLAttributes {
+ theme?: 'default' | 'outlined' | 'textbutton';
}
-const Container = styled.button`
- border: 1px solid #393939;
- border-radius: 4px;
- padding: 4px 12px;
-`;
+export default function Button({ children, ...props }: Props) {
+ return {children};
+}
+
+const Wrapper = styled.button(
+ {
+ padding: '10px 40px',
+ fontSize: '16px',
+ fontWeight: 'bold',
+ border: 'none',
+ justifyContent: 'center',
+ alignItems: 'center',
+ cursor: 'pointer',
+ transition: 'background-color 200ms',
+ },
+ ({ theme = 'default' }) => {
+ if (theme === 'outlined') {
+ return {
+ backgroundColor: '#fff',
+ color: '#0A65CC',
+ border: '2px solid #0A65CC',
+
+ '&:hover': {
+ backgroundColor: '#6992C0',
+ color: '#fff',
+ },
+ };
+ }
+
+ if (theme === 'textbutton') {
+ return {
+ color: '#0A65CC',
+ backgroundColor: '#fff',
+ };
+ }
+
+ return {
+ color: '#0A65CC',
+ backgroundColor: '#E7F0FA',
+ };
+ },
+);
diff --git a/src/components/common/Card/index.stories.tsx b/src/components/common/Card/index.stories.tsx
new file mode 100644
index 0000000..5971e06
--- /dev/null
+++ b/src/components/common/Card/index.stories.tsx
@@ -0,0 +1,24 @@
+import { Meta, StoryObj } from '@storybook/react';
+import Card from '.';
+
+const meta: Meta = {
+ title: 'common/Card',
+ component: Card,
+ tags: ['autodocs'],
+};
+
+export default meta;
+
+type Story = StoryObj;
+
+export const Default: Story = {
+ args: {
+ borderRadius: '12px',
+ children: Hello World!
,
+ },
+ render: (args) => (
+
+ Hello World!
+
+ ),
+};
diff --git a/src/components/common/Card/index.tsx b/src/components/common/Card/index.tsx
new file mode 100644
index 0000000..0ad9c17
--- /dev/null
+++ b/src/components/common/Card/index.tsx
@@ -0,0 +1,22 @@
+import styled from '@emotion/styled';
+import { HTMLAttributes, ReactNode } from 'react';
+
+interface Props extends HTMLAttributes {
+ borderRadius?: string;
+ children: ReactNode;
+}
+
+export default function Card({ borderRadius = '12px', children, ...rest }: Props) {
+ return (
+
+ {children}
+
+ );
+}
+
+const CardContainer = styled.div<{ borderRadius: string }>`
+ display: inline-block;
+ border: 1px solid ${({ theme }) => theme.palettes.white};
+ box-shadow: 0px 12px 32px 0px rgba(24, 25, 28, 0.08);
+ border-radius: ${({ borderRadius }) => borderRadius};
+`;
diff --git a/src/components/common/Flex/index.stories.tsx b/src/components/common/Flex/index.stories.tsx
new file mode 100644
index 0000000..9d89843
--- /dev/null
+++ b/src/components/common/Flex/index.stories.tsx
@@ -0,0 +1,40 @@
+import { Meta, StoryObj } from '@storybook/react';
+import Flex from '.';
+
+const meta: Meta = {
+ title: 'common/Flex',
+ component: Flex,
+ tags: ['autodocs'],
+};
+
+export default meta;
+
+type Story = StoryObj;
+
+export const Default: Story = {
+ args: {
+ direction: 'row',
+ justifyContent: 'center',
+ alignItems: 'center',
+ gap: {
+ x: '10px',
+ y: '10px',
+ },
+ },
+ render: (args) => (
+
+ Box 1
+ Box 2
+ Box 3
+
+ ),
+};
+
+const boxStyle = {
+ width: '100px',
+ height: '100px',
+ backgroundColor: 'lightblue',
+ display: 'flex',
+ alignItems: 'center',
+ justifyContent: 'center',
+};
diff --git a/src/components/common/Flex/index.tsx b/src/components/common/Flex/index.tsx
new file mode 100644
index 0000000..bba89d1
--- /dev/null
+++ b/src/components/common/Flex/index.tsx
@@ -0,0 +1,42 @@
+import styled from '@emotion/styled';
+import type * as CSS from 'csstype';
+import { HTMLAttributes } from 'react';
+
+type FlexGap = {
+ x: string;
+ y: string;
+};
+
+interface FlexProps {
+ direction?: 'column' | 'row';
+ gap?: FlexGap;
+ justifyContent?: CSS.Properties['justifyContent'];
+ alignItems?: CSS.Properties['alignItems'];
+}
+
+type Props = HTMLAttributes & FlexProps;
+
+export default function Flex({
+ direction = 'row',
+ gap,
+ justifyContent = 'start',
+ alignItems = 'start',
+ children,
+ ...rest
+}: Props) {
+ return (
+
+ {children}
+
+ );
+}
+
+const Container = styled.div`
+ width: 100%;
+ display: flex;
+ flex-direction: ${(p) => p.direction};
+ justify-content: ${(p) => p.justifyContent};
+ align-items: ${(p) => p.alignItems};
+ column-gap: ${(p) => p.gap?.x};
+ row-gap: ${(p) => p.gap?.y};
+`;
diff --git a/src/components/common/Input/index.stories.tsx b/src/components/common/Input/index.stories.tsx
new file mode 100644
index 0000000..2ef2831
--- /dev/null
+++ b/src/components/common/Input/index.stories.tsx
@@ -0,0 +1,20 @@
+import { Meta, StoryObj } from '@storybook/react';
+import Input from '.';
+
+const meta: Meta = {
+ title: 'common/Input',
+ component: Input,
+ tags: ['autodocs'],
+};
+
+export default meta;
+
+type Story = StoryObj;
+
+export const Default: Story = {
+ args: {
+ label: '아이디',
+ placeholder: '아이디를 입력해주세요.',
+ },
+ render: (args) => ,
+};
diff --git a/src/components/common/Input/index.tsx b/src/components/common/Input/index.tsx
new file mode 100644
index 0000000..c1742ed
--- /dev/null
+++ b/src/components/common/Input/index.tsx
@@ -0,0 +1,21 @@
+import { InputHTMLAttributes } from 'react';
+import styled from '@emotion/styled';
+
+interface Props extends InputHTMLAttributes {
+ label?: string;
+}
+
+export default function Input({ label, ...rest }: Props) {
+ return (
+ <>
+ {label && }
+
+ >
+ );
+}
+
+const InputContainer = styled.input`
+ background-color: ${({ theme }) => theme.palettes.white};
+ border: 1px solid ${({ theme }) => theme.palettes.borderGray};
+ border-radius: 5px;
+`;
diff --git a/src/components/common/Modal/index.stories.tsx b/src/components/common/Modal/index.stories.tsx
new file mode 100644
index 0000000..720f4d9
--- /dev/null
+++ b/src/components/common/Modal/index.stories.tsx
@@ -0,0 +1,19 @@
+import type { Meta, StoryObj } from '@storybook/react';
+
+import { Modal } from './index';
+import Button from '../Button';
+
+const meta = {
+ title: 'common/Modal',
+ tags: ['autodocs'],
+ args: {
+ textChildren: 정보를 입력해주세요.
,
+ buttonChildren: ,
+ },
+ render: (props) => ,
+} satisfies Meta;
+
+export default meta;
+type Story = StoryObj;
+
+export const Default: Story = {};
diff --git a/src/components/common/Modal/index.tsx b/src/components/common/Modal/index.tsx
new file mode 100644
index 0000000..cdee1b1
--- /dev/null
+++ b/src/components/common/Modal/index.tsx
@@ -0,0 +1,53 @@
+import styled from '@emotion/styled';
+import { ReactNode } from 'react';
+
+export type Props = {
+ textChildren: ReactNode;
+ buttonChildren: ReactNode;
+ borderRadius?: string;
+} & React.HTMLAttributes;
+
+export const Modal = ({ textChildren, buttonChildren, borderRadius = '12px', ...props }: Props) => {
+ return (
+
+
+ {textChildren}
+ {buttonChildren}
+
+
+ );
+};
+
+const Card = styled.div<{ borderRadius: string }>`
+ width: 100%;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ backgroundcolor: #fff;
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
+`;
+
+const Wrapper = styled.div`
+ width: 100%;
+ padding: 20px;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+`;
+
+const TextWrapper = styled.p`
+ width: 100%;
+ font-size: 16px;
+ font-weight: bold;
+ margin-bottom: 20px;
+`;
+
+const ButtonWrapper = styled.div`
+ width: 100%;
+ margin: 0 auto;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+`;
diff --git a/src/assets/styles/index.tsx b/src/components/providers/GlobalStylesProvider/GlobalStyles.tsx
similarity index 100%
rename from src/assets/styles/index.tsx
rename to src/components/providers/GlobalStylesProvider/GlobalStyles.tsx
diff --git a/src/components/providers/GlobalStylesProvider/index.provider.tsx b/src/components/providers/GlobalStylesProvider/index.provider.tsx
new file mode 100644
index 0000000..9422bfe
--- /dev/null
+++ b/src/components/providers/GlobalStylesProvider/index.provider.tsx
@@ -0,0 +1,19 @@
+import { ReactNode } from 'react';
+import { ThemeProvider } from '@emotion/react';
+import GlobalStyles from './GlobalStyles';
+import theme from '@assets/styles/theme';
+
+interface Props {
+ children: ReactNode;
+}
+
+const GlobalStylesProvider = ({ children }: Props) => {
+ return (
+
+
+ {children}
+
+ );
+};
+
+export default GlobalStylesProvider;
diff --git a/src/components/providers/index.tsx b/src/components/providers/index.tsx
new file mode 100644
index 0000000..4b12809
--- /dev/null
+++ b/src/components/providers/index.tsx
@@ -0,0 +1,6 @@
+import { ReactNode } from 'react';
+import GlobalStylesProvider from './GlobalStylesProvider/index.provider';
+
+export default function AppProviders({ children }: { children: ReactNode }) {
+ return {children};
+}
diff --git a/src/features/layout/Header/index.stories.tsx b/src/features/layout/Header/index.stories.tsx
new file mode 100644
index 0000000..82fd609
--- /dev/null
+++ b/src/features/layout/Header/index.stories.tsx
@@ -0,0 +1,16 @@
+import { Meta, StoryObj } from '@storybook/react';
+import Header from '.';
+
+const meta: Meta = {
+ title: 'features/layout/Header',
+ component: Header,
+ tags: ['autodocs'],
+};
+
+export default meta;
+
+type Story = StoryObj;
+
+export const Default: Story = {
+ render: () => ,
+};
diff --git a/src/features/layout/Header/index.tsx b/src/features/layout/Header/index.tsx
new file mode 100644
index 0000000..63e2cf6
--- /dev/null
+++ b/src/features/layout/Header/index.tsx
@@ -0,0 +1,131 @@
+import styled from '@emotion/styled';
+import LogoImg from '@/assets/images/hirehigher-logo.svg';
+
+const Header = () => {
+ return (
+
+
+
+
+ );
+};
+
+const HeaderContainer = styled.header`
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 0 20px;
+ background-color: #fff;
+ height: 88px;
+
+ @media (max-width: 1200px) {
+ padding: 0 15px;
+ }
+
+ @media (max-width: 768px) {
+ flex-direction: column;
+ height: auto;
+ padding: 10px;
+ }
+
+ @media (max-width: 480px) {
+ flex-direction: column;
+ padding: 5px;
+ }
+`;
+
+const Logo = styled.img`
+ height: 70px;
+ width: auto;
+
+ @media (max-width: 768px) {
+ height: 60px;
+ }
+
+ @media (max-width: 480px) {
+ height: 50px;
+ }
+`;
+
+const Nav = styled.nav`
+ display: flex;
+ align-items: center;
+ gap: 15px;
+
+ @media (max-width: 768px) {
+ width: 100%;
+ justify-content: center;
+ margin-top: 10px;
+ }
+
+ @media (max-width: 480px) {
+ flex-direction: column;
+ width: 100%;
+ align-items: stretch;
+ }
+`;
+
+const ButtonStyle = styled.button`
+ padding: 10px 20px;
+ width: 100%;
+ background-color: #fff;
+ color: #0a65cc;
+ border: 1px solid #cee0f5;
+ border-radius: 3px;
+ cursor: pointer;
+ text-align: center;
+ white-space: nowrap;
+ font-size: 16px;
+
+ @media (max-width: 768px) {
+ font-size: 15px;
+ }
+
+ @media (max-width: 480px) {
+ padding: 8px 10px;
+ font-size: 14px;
+ }
+`;
+
+const PrimaryButton = styled(ButtonStyle)`
+ background-color: #0a65cc;
+ color: #fff;
+ border: none;
+`;
+
+const OutlinedButton = styled(ButtonStyle)``;
+
+const TextButton = styled(ButtonStyle)`
+ background-color: none;
+ border: none;
+`;
+
+const Dropdown = styled.select`
+ padding: 10px 20px;
+ width: 100%;
+ color: #0a65cc;
+ cursor: pointer;
+ text-align: center;
+ font-size: 16px;
+ border: none;
+
+ @media (max-width: 768px) {
+ padding: 8px 10px;
+ font-size: 15px;
+ }
+
+ @media (max-width: 480px) {
+ margin-top: 10px;
+ font-size: 14px;
+ }
+`;
+
+export default Header;
diff --git a/src/features/layout/footer/Footer.stories.tsx b/src/features/layout/footer/Footer.stories.tsx
new file mode 100644
index 0000000..3c2126f
--- /dev/null
+++ b/src/features/layout/footer/Footer.stories.tsx
@@ -0,0 +1,25 @@
+import { Meta, StoryObj } from '@storybook/react';
+import Footer from '.';
+import GlobalStyles from '@/assets/styles/index';
+
+const meta: Meta = {
+ title: 'features/layout/Footer',
+ decorators: [
+ (Story) => (
+ <>
+
+
+ >
+ ),
+ ],
+ component: Footer,
+ tags: ['autodocs'],
+};
+
+export default meta;
+
+type Story = StoryObj;
+
+export const Default: Story = {
+ render: () => ,
+};
diff --git a/src/features/layout/footer/index.tsx b/src/features/layout/footer/index.tsx
new file mode 100644
index 0000000..4972839
--- /dev/null
+++ b/src/features/layout/footer/index.tsx
@@ -0,0 +1,105 @@
+import styled from '@emotion/styled';
+import facebookIcon from '@/assets/styles/images/features/layout/footer/facebook_Icon.svg';
+import instagramIcon from '@/assets/styles/images/features/layout/footer/instagram_Icon.svg';
+import twitterIcon from '@/assets/styles/images/features/layout/footer/twitter_Icon.svg';
+import youtubeIcon from '@/assets/styles/images/features/layout/footer/youtube_Icon.svg';
+import mainIcon from '@/assets/styles/images/features/layout/footer/hire_higher_Icon.svg';
+
+const Footer = () => {
+ return (
+
+
+
+
+
+ (주)Hire Higher 임OO
+ 대전광역시 유성구 궁동
+ 전화번호: 042-821-5114
+
+ 사업자등록번호: 111-11-00000
+ 통신판매번호: 2024-대전유성-3147
+ 유료직업소개사업등록번호: (국내) 제2024-1111111-11-1-00011호
+
+
+
+
+
+ @ 2024 Hire Higher. All rights Rserved
+
+
+
+
+
+
+
+
+
+ );
+};
+const Container = styled.div`
+ width: 100%;
+
+ background-color: #18191c;
+ font-size: 12px;
+ color: #767f8c;
+ line-height: 20px;
+`;
+
+const Wrapper = styled.div`
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ padding: 0 300px;
+
+ @media (max-width: 1024px) {
+ padding: 0 150px;
+ }
+ @media (max-width: 768px) {
+ padding: 0 50px;
+ }
+ @media (max-width: 480px) {
+ padding: 0;
+ }
+`;
+
+const Content = styled.div`
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ padding: 100px 0 43px 0;
+
+ @media (max-width: 480px) {
+ align-items: center;
+ }
+`;
+
+const Copyright = styled.div`
+ width: 100%;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 24px 0;
+
+ @media (max-width: 480px) {
+ flex-direction: column;
+ gap: 20px;
+ }
+`;
+
+const Gap = styled.div<{ height?: string; border?: string }>`
+ width: 100%;
+ height: ${(props) => props.height || '0'};
+ border: ${(props) => props.border || 'none'};
+`;
+
+const IconContainer = styled.div`
+ display: flex;
+ gap: 20px;
+`;
+const Icon = styled.img`
+ width: ${(props) => props.width || '20px'};
+ height: ${(props) => props.height || '20px'};
+`;
+
+export default Footer;
diff --git a/src/main.tsx b/src/main.tsx
index e17d50b..796f90e 100644
--- a/src/main.tsx
+++ b/src/main.tsx
@@ -1,9 +1,9 @@
-import { StrictMode } from 'react';
import { createRoot } from 'react-dom/client';
import App from './App.tsx';
+import AppProviders from '@components/providers/index.tsx';
createRoot(document.getElementById('root')!).render(
-
+
- ,
+ ,
);
diff --git a/tsconfig.json b/tsconfig.json
index a6d9dec..0d59e98 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -35,7 +35,8 @@
"@routes/*": ["src/routes/*"],
"@utils/*": ["src/utils/*"],
"@types/*": ["src/types/*"]
- }
+ },
+ "jsxImportSource": "@emotion/react"
},
"include": [
"src",
diff --git a/vite.config.ts b/vite.config.ts
index 4853ec3..f445b6c 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -4,7 +4,7 @@ import react from '@vitejs/plugin-react';
// https://vitejs.dev/config/
export default defineConfig({
- plugins: [react()],
+ plugins: [react({ jsxImportSource: '@emotion/react' })],
resolve: {
alias: [
{ find: '@', replacement: resolve(__dirname, 'src') },