diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml
new file mode 100644
index 0000000..9ec6fd3
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug.yml
@@ -0,0 +1,35 @@
+name: "버그 수정"
+description: 버그 수정 사항을 작성해주세요.
+title: "[ Bug ] "
+body:
+ - type: markdown
+ attributes:
+ value: |
+ 작성 예시 : "[ Bug ] 로그인 기능 버그 수정"
+ - type: textarea
+ id: bug-description
+ attributes:
+ label: 🐛 Issue
+ description: 버그가 발생한 이슈 이름과 번호를 작성해주세요.
+ placeholder: "[ Feat ] 로그인 기능 구현 <#1>"
+ validations:
+ required: true
+ - type: textarea
+ id: textarea_description
+ attributes:
+ label: 🐝 버그 발생 부분
+ description: 버그가 발생한 부분을 작성해주세요.
+ placeholder: |
+ 1. <버그 설명 1>
+ 2. <버그 설명 2>
+ render: ""
+ validations:
+ required: true
+ - type: textarea
+ id: fix-list
+ attributes:
+ label: 📝 To-do
+ description: 작업에 필요한 목록을 작성해주세요.
+ placeholder: 목록을 작성해주세요.
+ validations:
+ required: true
diff --git a/.github/ISSUE_TEMPLATE/feature.yml b/.github/ISSUE_TEMPLATE/feature.yml
new file mode 100644
index 0000000..533d1c5
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature.yml
@@ -0,0 +1,32 @@
+name: "기능 추가"
+description: 기능 추가 작업 사항을 작성해주세요.
+title: "[ Feat ] "
+body:
+ - type: markdown
+ attributes:
+ value: |
+ 작성 예시 : "[ Feat ] 로그인 기능 구현"
+ - type: textarea
+ id: feat-description
+ attributes:
+ label: 🛠 Issue
+ description: 어떠한 기능을 추가하시는 건지 작성해주세요.
+ placeholder: 설명을 작성해주세요.
+ validations:
+ required: true
+ - type: textarea
+ id: feat-list
+ attributes:
+ label: 📝 To-do
+ description: 작업에 필요한 목록을 작성해주세요.
+ placeholder: 목록을 작성해주세요.
+ validations:
+ required: true
+ - type: textarea
+ id: reproduction
+ attributes:
+ label: 🔍 접근 방법
+ description: 고려하신 방법이나, 접근에 대해서 설명해주세요.
+ placeholder: 설명을 작성해주세요.
+ validations:
+ required: true
diff --git a/.github/ISSUE_TEMPLATE/refactoring.yml b/.github/ISSUE_TEMPLATE/refactoring.yml
new file mode 100644
index 0000000..c4eac51
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/refactoring.yml
@@ -0,0 +1,32 @@
+name: "리팩토링"
+description: 리팩토링 작업 사항을 작성해주세요.
+title: "[ Refactor ] "
+body:
+ - type: markdown
+ attributes:
+ value: |
+ 작성 예시 : "[ Refactor ] 로그인 기능 리팩토링"
+ - type: textarea
+ id: refactor-description
+ attributes:
+ label: ♻️ Issue
+ description: 어떠한 기능을 리팩토링하시는 건지 작성해주세요.
+ placeholder: 설명을 작성해주세요.
+ validations:
+ required: true
+ - type: input
+ id: input_parent
+ attributes:
+ label: 🔢 리팩토링하는 이슈를 기입해주세요.
+ description: 리팩토링을 진행하는 이전 이슈를 작성해주세요.
+ placeholder: "#이슈번호"
+ validations:
+ required: true
+ - type: textarea
+ id: refactor-list
+ attributes:
+ label: 📝 To-do
+ description: 작업에 필요한 목록을 작성해주세요.
+ placeholder: 목록을 작성해주세요.
+ validations:
+ required: true
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
new file mode 100644
index 0000000..73b1a93
--- /dev/null
+++ b/.github/pull_request_template.md
@@ -0,0 +1,34 @@
+
+
+## 📌 관련 이슈번호
+
+
+
+- Closes #
+
+## 🎟️ PR 유형
+
+어떤 변경 사항이 있나요?
+
+- [ ] 새 기능 추가
+- [ ] 버그 수정
+- [ ] CSS 등 사용자 UI 디자인 변경
+- [ ] 리팩토링
+
+## ✅ Key Changes
+
+> 이번 PR에서 작업한 내용을 간략히 설명해주세요
+
+1. 작업 내용
+
+## 📢 To Reviewers
+
+-
+
+## 📸 스크린샷
+
+
+
+## 🔗 참고 자료
+
+
diff --git a/.gitignore b/.gitignore
index a547bf3..f940a99 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,3 +22,5 @@ dist-ssr
*.njsproj
*.sln
*.sw?
+
+*storybook.log
diff --git a/.husky/pre-commit b/.husky/pre-commit
new file mode 100644
index 0000000..0b9dfd9
--- /dev/null
+++ b/.husky/pre-commit
@@ -0,0 +1,4 @@
+#!/usr/bin/env sh
+. "$(dirname -- "$0")/_/husky.sh"
+
+yarn lint-front
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 0000000..f62b16e
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,9 @@
+{
+ "singleQuote": true,
+ "trailingComma": "all",
+ "printWidth": 80,
+ "semi": true,
+ "bracketSpacing": true,
+ "tabWidth": 2,
+ "endOfLine": "lf"
+}
\ No newline at end of file
diff --git a/.storybook/main.ts b/.storybook/main.ts
new file mode 100644
index 0000000..568ce2f
--- /dev/null
+++ b/.storybook/main.ts
@@ -0,0 +1,16 @@
+import type { StorybookConfig } from '@storybook/react-vite';
+
+const config: StorybookConfig = {
+ stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|jsx|mjs|ts|tsx)'],
+ addons: [
+ '@storybook/addon-onboarding',
+ '@storybook/addon-essentials',
+ '@chromatic-com/storybook',
+ '@storybook/addon-interactions',
+ ],
+ framework: {
+ name: '@storybook/react-vite',
+ options: {},
+ },
+};
+export default config;
diff --git a/.storybook/preview-head.html b/.storybook/preview-head.html
new file mode 100644
index 0000000..bf554ed
--- /dev/null
+++ b/.storybook/preview-head.html
@@ -0,0 +1 @@
+
diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx
new file mode 100644
index 0000000..29fc89f
--- /dev/null
+++ b/.storybook/preview.tsx
@@ -0,0 +1,26 @@
+import type { Preview } from '@storybook/react';
+import React from 'react';
+import { ThemeProvider, Global } from '@emotion/react';
+import GlobalStyle from '../src/styles/global';
+import theme from '../src/styles/theme';
+
+const preview: Preview = {
+ parameters: {
+ controls: {
+ matchers: {
+ color: /(background|color)$/i,
+ date: /Date$/i,
+ },
+ },
+ },
+ decorators: [
+ (Story) => (
+
+
+
+
+ ),
+ ],
+};
+
+export default preview;
diff --git a/custom.d.ts b/custom.d.ts
new file mode 100644
index 0000000..f9a7114
--- /dev/null
+++ b/custom.d.ts
@@ -0,0 +1,6 @@
+declare module "*.svg" {
+ import React from "react";
+ export const ReactComponent: React.FC>;
+ const src: string;
+ export default src;
+}
\ No newline at end of file
diff --git a/eslint.config.js b/eslint.config.js
index 092408a..f6b6c9c 100644
--- a/eslint.config.js
+++ b/eslint.config.js
@@ -1,8 +1,8 @@
-import js from '@eslint/js'
-import globals from 'globals'
-import reactHooks from 'eslint-plugin-react-hooks'
-import reactRefresh from 'eslint-plugin-react-refresh'
-import tseslint from 'typescript-eslint'
+import js from '@eslint/js';
+import globals from 'globals';
+import reactHooks from 'eslint-plugin-react-hooks';
+import reactRefresh from 'eslint-plugin-react-refresh';
+import tseslint from 'typescript-eslint';
export default tseslint.config(
{ ignores: ['dist'] },
@@ -23,6 +23,23 @@ export default tseslint.config(
'warn',
{ allowConstantExport: true },
],
+ 'no-var': 'error', // var 금지
+ '@typescript-eslint/no-unused-vars': 'warn',
+ 'prefer-const': 'error', // const 사용을 권장하고, let은 const로 바꿀 수 있으면 바꾸도록
+ 'prefer-template': 'warn', // 문자열 결합시 템플릿 리터럴 사용 강제
+ 'capitalized-comments': [
+ 'warn',
+ 'always',
+ {
+ ignoreConsecutiveComments: true,
+ ignorePattern: '^[A-Z_]+$', // 대문자 스네이크 케이스 상수 이름 규칙 추가
+ },
+ ],
+ // 함수명 네이밍 규칙
+ camelcase: ['error', { properties: 'always' }], // 카멜 케이스 사용을 강제
+ // 화살표 함수 사용을 권장하는 규칙
+ 'prefer-arrow-callback': 'warn', // 가능하면 화살표 함수 사용
+ 'arrow-body-style': ['warn', 'as-needed'], // 화살표 함수 본문을 간소화 필요없는 중괄호 제거
},
},
-)
+);
diff --git a/index.html b/index.html
index 75c8da0..9ed6239 100644
--- a/index.html
+++ b/index.html
@@ -3,6 +3,7 @@
+
맥도날드
@@ -11,3 +12,4 @@