diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
new file mode 100644
index 0000000..47fc431
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -0,0 +1,98 @@
+name: "π Frontend Bug Report"
+description: νλ©΄, μ¬μ©μ νλ‘μ°, λΈλΌμ°μ λμ, API μ°λ λ¬Έμ λ₯Ό μ 보ν©λλ€.
+title: "[Bug] "
+labels: ["bug", "triage"]
+body:
+ - type: markdown
+ attributes:
+ value: |
+ νλ‘ νΈμλ λ²κ·Έλ "μ΄λ νλ©΄μμ μ΄λ€ νλμ νμ λ 무μμ΄ λ³΄μλμ§"κ° ν΅μ¬μ
λλ€.
+ κ°λ₯νλ©΄ μ€ν¬λ¦°μ·, μμ, μ½μ μλ¬, μ€ν¨ν λ€νΈμν¬ μμ²μ ν¨κ» λ¨κ²¨ μ£ΌμΈμ.
+
+ - type: textarea
+ id: problem
+ attributes:
+ label: λ¬Έμ μμ½
+ placeholder: μ¬μ©μ νλ‘ν νμ΄μ§μμ λ°°μ§ μΉ΄λκ° κ°νμ μΌλ‘ λΉμ΄ 보μ
λλ€.
+ validations:
+ required: true
+
+ - type: input
+ id: route
+ attributes:
+ label: λ°μ μμΉ
+ description: λΌμ°νΈ, νλ©΄, μ»΄ν¬λνΈ μ΄λ¦μ μ μ΄ μ£ΌμΈμ.
+ placeholder: "/users/[username], UserBadgeSection"
+ validations:
+ required: true
+
+ - type: textarea
+ id: reproduction
+ attributes:
+ label: μ¬ν μ μ°¨
+ placeholder: |
+ 1. `/users/alexization` λ°©λ¬Έ
+ 2. μλ‘κ³ μΉ¨
+ 3. λ°°μ§ μμμ΄ skeleton μ΄ν λΉμ΄ μμ
+ validations:
+ required: true
+
+ - type: textarea
+ id: expected_behavior
+ attributes:
+ label: κΈ°λ λμ
+ placeholder: λ°°μ§ μΉ΄λκ° μ¬μ©μ λ°μ΄ν°μ ν¨κ» νμλμ΄μΌ ν©λλ€.
+ validations:
+ required: true
+
+ - type: textarea
+ id: actual_behavior
+ attributes:
+ label: μ€μ λμ
+ placeholder: μΉ΄λ 컨ν
μ΄λλ λ λλ§λμ§λ§ λ΄λΆ λ°μ΄ν°κ° λΉμ΄ μμ΅λλ€.
+ validations:
+ required: true
+
+ - type: textarea
+ id: evidence
+ attributes:
+ label: μ€ν¬λ¦°μ· / μμ / μ½μ / λ€νΈμν¬ μ¦κ±°
+ placeholder: |
+ - screenshot:
+ - console error:
+ - failed request:
+ - response payload:
+ validations:
+ required: false
+
+ - type: textarea
+ id: environment
+ attributes:
+ label: λΈλΌμ°μ λ° νκ²½
+ placeholder: |
+ - Browser:
+ - Device/Viewport:
+ - Environment:
+ - Branch or commit:
+ validations:
+ required: false
+
+ - type: textarea
+ id: acceptance
+ attributes:
+ label: μμ ν νμΈν΄μΌ ν 쑰건
+ placeholder: |
+ - [ ] λμΌ κ²½λ‘μμ μ μ λ λλ§λλ€.
+ - [ ] μ½μ μλ¬κ° λ°μνμ§ μλλ€.
+ - [ ] μ€ν¨ν λ€νΈμν¬ μμ²μ΄ μλ€.
+ validations:
+ required: true
+
+ - type: input
+ id: related_backend_issue
+ attributes:
+ label: μ°κ΄λ λ°±μλ μ΄μ λλ PR (μ ν)
+ placeholder: "alexization/git-ranker#123"
+ validations:
+ required: false
+
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 0000000..8398027
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1,6 @@
+blank_issues_enabled: false
+contact_links:
+ - name: π 보μ μ·¨μ½μ μ 보
+ url: mailto:alexizationy@gmail.com
+ about: μΈμ¦, ν ν°, μΏ ν€, νλ‘ νΈμλ 보μ μ΄μλ κ³΅κ° μ΄μ λμ μ΄λ©μΌλ‘ μ λ³΄ν΄ μ£ΌμΈμ.
+
diff --git a/.github/ISSUE_TEMPLATE/engineering_task.yml b/.github/ISSUE_TEMPLATE/engineering_task.yml
new file mode 100644
index 0000000..b30db0c
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/engineering_task.yml
@@ -0,0 +1,71 @@
+name: "π οΈ Frontend Engineering Task"
+description: 리ν©ν°λ§, μ±λ₯, μ κ·Όμ±, ν
μ€νΈ νλμ€, DX κ°μ μμ
μ κΈ°λ‘ν©λλ€.
+title: "[Task] "
+labels: ["task", "triage"]
+body:
+ - type: dropdown
+ id: task_type
+ attributes:
+ label: μμ
μ ν
+ options:
+ - ui-refactor
+ - performance
+ - accessibility
+ - testing
+ - developer-experience
+ - dependency-upgrade
+ - documentation
+ validations:
+ required: true
+
+ - type: textarea
+ id: reason
+ attributes:
+ label: μ νμνκ°μ?
+ validations:
+ required: true
+
+ - type: textarea
+ id: scope
+ attributes:
+ label: μμ
λ²μ
+ placeholder: |
+ - route:
+ - component:
+ - hook/store:
+ - test/harness:
+ validations:
+ required: true
+
+ - type: textarea
+ id: done
+ attributes:
+ label: μλ£ μ‘°κ±΄
+ placeholder: |
+ - [ ] ...
+ - [ ] ...
+ validations:
+ required: true
+
+ - type: textarea
+ id: validation
+ attributes:
+ label: κ²μ¦ λ°©λ²
+ placeholder: |
+ - `npm run lint`
+ - `npm run build`
+ - μ€ν¬λ¦°μ· / λΈλΌμ°μ QA / Playwright
+ validations:
+ required: true
+
+ - type: textarea
+ id: risks
+ attributes:
+ label: 리μ€ν¬ λ° μμ‘΄μ±
+ placeholder: |
+ - 리μ€ν¬:
+ - λ°±μλ μμ‘΄μ±:
+ - νμ μμ
:
+ validations:
+ required: false
+
diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml
new file mode 100644
index 0000000..f51bb61
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.yml
@@ -0,0 +1,88 @@
+name: "β¨ Frontend Feature Request"
+description: μ UI, μ¬μ©μ νλ‘μ°, μΈν°λμ
, νλ‘ νΈμλ QA κ°μ μ μ μν©λλ€.
+title: "[Feature] "
+labels: ["enhancement", "feature"]
+body:
+ - type: markdown
+ attributes:
+ value: |
+ νλ‘ νΈμλ κΈ°λ₯ μμ²μ "μ»΄ν¬λνΈ μΆκ°"λ³΄λ€ "μ¬μ©μ κ²½νμ΄ μ΄λ»κ² λ¬λΌμ§λμ§"κ° λ¨Όμ μ
λλ€.
+
+ - type: textarea
+ id: problem
+ attributes:
+ label: ν΄κ²°νλ €λ λ¬Έμ
+ placeholder: μ¬μ©μκ° νμ¬ λνΉ λ³ν μ΄μ λ₯Ό μ΄ν΄νκΈ° μ΄λ €μ μ΄νμ΄ λ°μν©λλ€.
+ validations:
+ required: true
+
+ - type: textarea
+ id: outcome
+ attributes:
+ label: μνλ μ¬μ©μ κ²°κ³Ό
+ placeholder: μ¬μ©μκ° λνΉ μμΈ νλ©΄μμ μ μ μ¦κ° μμΈμ λ°λ‘ μ΄ν΄ν μ μμ΄μΌ ν©λλ€.
+ validations:
+ required: true
+
+ - type: input
+ id: route
+ attributes:
+ label: λμ νλ©΄ λλ λΌμ°νΈ
+ placeholder: "/ranking, /users/[username]"
+ validations:
+ required: true
+
+ - type: textarea
+ id: desired_behavior
+ attributes:
+ label: μνλ UI / μΈν°λμ
+ placeholder: |
+ - μ¬μ©μκ° μ΄λ€ νλμ νλμ§
+ - μ΄λ€ μνκ° λ³΄μ¬μΌ νλμ§
+ - μ€ν¨/λΉ μνλ μ΄λ»κ² 보μ¬μΌ νλμ§
+ validations:
+ required: true
+
+ - type: textarea
+ id: acceptance
+ attributes:
+ label: μμ© κΈ°μ€
+ placeholder: |
+ - [ ] ...
+ - [ ] ...
+ validations:
+ required: true
+
+ - type: textarea
+ id: contract_dependency
+ attributes:
+ label: λ°±μλ / API μμ‘΄μ±
+ placeholder: |
+ - νμν API:
+ - κ³μ½ λ³κ²½ μ¬λΆ:
+ - μ°κ΄ backend μ΄μ/PR:
+ validations:
+ required: false
+
+ - type: textarea
+ id: qa_evidence
+ attributes:
+ label: νμν QA μ¦κ±°
+ placeholder: |
+ - μ€ν¬λ¦°μ·:
+ - Playwright:
+ - λΈλΌμ°μ μ½μ/λ€νΈμν¬ νμΈ:
+ - λ°μν νμΈ:
+ validations:
+ required: true
+
+ - type: textarea
+ id: non_goals_and_risks
+ attributes:
+ label: λΉλͺ©νμ 리μ€ν¬
+ placeholder: |
+ λΉλͺ©ν:
+ 리μ€ν¬:
+ validations:
+ required: false
+
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000..88b079a
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,48 @@
+## 1) μμ½
+- 무μμ΄ λ³κ²½λμλμ?
+- μ μ§κΈ νμνκ°μ?
+
+## 2) μ°κ΄ μ΄μ
+- Closes #
+- κ΄λ ¨ backend μ΄μ/PR:
+
+## 3) μ¬μ©μ κ΄μ κ²°κ³Ό
+- ν΄κ²°νλ €λ λ¬Έμ :
+- μ¬μ©μμκ² λ¬λΌμ§λ μ :
+- λΉλͺ©ν:
+
+## 4) μν₯ λ²μ
+- λ³κ²½λ route / page / component:
+- μν κ΄λ¦¬ / λ°μ΄ν° λ‘λ© μν₯:
+- API κ³μ½ μν₯:
+- μ κ·Όμ± / λ°μν μν₯:
+
+## 5) μ€ν¬λ¦°μ· λλ μμ
+- before:
+- after:
+
+## 6) κ²μ¦ μ¦κ±°
+
+| μ ν | λͺ
λ Ήμ΄ / μ¦κ±° | κ²°κ³Ό |
+| --- | --- | --- |
+| Lint | `npm run lint` | |
+| Build | `npm run build` | |
+| Automated Test | `미ꡬμΆ` λλ μ€νν ν
μ€νΈ λͺ
λ Ή | |
+| Playwright | μ€νν μλλ¦¬μ€ λλ `미ꡬμΆ(<μ¬μ >)` | |
+| Browser QA | μ½μ / λ€νΈμν¬ / λ°μν νμΈ λ΄μ© | |
+
+## 7) API / λ°±μλ μ°λ νμΈ
+- νμν API μλ΅:
+- Mock μ¬λΆ:
+- κ΄λ ¨ backend λ³κ²½:
+
+## 8) 리μ€ν¬ λ° λ‘€λ°±
+- 리μ€ν¬:
+- λ‘€λ°± κ³ν:
+
+## 9) 체ν¬λ¦¬μ€νΈ
+- [ ] μ°κ΄ μ΄μκ° μ°κ²°λμ΄ μμ
+- [ ] μ€ν¬λ¦°μ· λλ μμμ΄ ν¬ν¨λμκ±°λ λΆνμ μ¬μ λ₯Ό μ μ
+- [ ] Lint / Build κ²°κ³Όκ° κΈ°μ
λμ΄ μμ
+- [ ] λΈλΌμ°μ QA λλ Playwright κ²°κ³Όκ° κΈ°μ
λμ΄ μμ
+- [ ] API κ³μ½ μν₯μ΄ λ°μλμκ±°λ μμμ λͺ
μν¨
diff --git a/.gitignore b/.gitignore
index 7b8da95..e601a6b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -23,6 +23,7 @@
# misc
.DS_Store
*.pem
+.idea/
# debug
npm-debug.log*
diff --git a/.idea/.gitignore b/.idea/.gitignore
deleted file mode 100644
index 13566b8..0000000
--- a/.idea/.gitignore
+++ /dev/null
@@ -1,8 +0,0 @@
-# Default ignored files
-/shelf/
-/workspace.xml
-# Editor-based HTTP Client requests
-/httpRequests/
-# Datasource local storage ignored files
-/dataSources/
-/dataSources.local.xml
diff --git a/.idea/discord.xml b/.idea/discord.xml
deleted file mode 100644
index 104c42f..0000000
--- a/.idea/discord.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/git-ranker-client.iml b/.idea/git-ranker-client.iml
deleted file mode 100644
index 24643cc..0000000
--- a/.idea/git-ranker-client.iml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
deleted file mode 100644
index 32d45d2..0000000
--- a/.idea/modules.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
deleted file mode 100644
index 94a25f7..0000000
--- a/.idea/vcs.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file