diff --git a/viewer/src/components/LanguageSelectBox.js b/viewer/components/LanguageSelectBox.js
similarity index 100%
rename from viewer/src/components/LanguageSelectBox.js
rename to viewer/components/LanguageSelectBox.js
diff --git a/viewer/src/components/DynamicForm.js b/viewer/effort_js/src/components/DynamicForm.js
similarity index 100%
rename from viewer/src/components/DynamicForm.js
rename to viewer/effort_js/src/components/DynamicForm.js
diff --git a/viewer/src/components/DynamicTable.js b/viewer/effort_js/src/components/DynamicTable.js
similarity index 100%
rename from viewer/src/components/DynamicTable.js
rename to viewer/effort_js/src/components/DynamicTable.js
diff --git a/viewer/src/components/ErrorDisplay.js b/viewer/effort_js/src/components/ErrorDisplay.js
similarity index 100%
rename from viewer/src/components/ErrorDisplay.js
rename to viewer/effort_js/src/components/ErrorDisplay.js
diff --git a/viewer/src/components/Header.js b/viewer/effort_js/src/components/Header.js
similarity index 100%
rename from viewer/src/components/Header.js
rename to viewer/effort_js/src/components/Header.js
diff --git a/viewer/src/components/MainLayout.js b/viewer/effort_js/src/components/MainLayout.js
similarity index 100%
rename from viewer/src/components/MainLayout.js
rename to viewer/effort_js/src/components/MainLayout.js
diff --git a/viewer/src/components/ProjectSelectBox.js b/viewer/effort_js/src/components/ProjectSelectBox.js
similarity index 100%
rename from viewer/src/components/ProjectSelectBox.js
rename to viewer/effort_js/src/components/ProjectSelectBox.js
diff --git a/viewer/src/components/ThemeSelectBox.js b/viewer/effort_js/src/components/ThemeSelectBox.js
similarity index 100%
rename from viewer/src/components/ThemeSelectBox.js
rename to viewer/effort_js/src/components/ThemeSelectBox.js
diff --git a/viewer/src/components/UserProfileBox.js b/viewer/effort_js/src/components/UserProfileBox.js
similarity index 100%
rename from viewer/src/components/UserProfileBox.js
rename to viewer/effort_js/src/components/UserProfileBox.js
diff --git a/viewer/src/components/providers/ThemeProvider.js b/viewer/effort_js/src/components/providers/ThemeProvider.js
similarity index 100%
rename from viewer/src/components/providers/ThemeProvider.js
rename to viewer/effort_js/src/components/providers/ThemeProvider.js
diff --git a/viewer/src/components/ui/button.js b/viewer/effort_js/src/components/ui/button.js
similarity index 100%
rename from viewer/src/components/ui/button.js
rename to viewer/effort_js/src/components/ui/button.js
diff --git a/viewer/src/components/ui/calendar.js b/viewer/effort_js/src/components/ui/calendar.js
similarity index 100%
rename from viewer/src/components/ui/calendar.js
rename to viewer/effort_js/src/components/ui/calendar.js
diff --git a/viewer/src/components/ui/card.js b/viewer/effort_js/src/components/ui/card.js
similarity index 100%
rename from viewer/src/components/ui/card.js
rename to viewer/effort_js/src/components/ui/card.js
diff --git a/viewer/src/components/ui/dropdown-menu.js b/viewer/effort_js/src/components/ui/dropdown-menu.js
similarity index 100%
rename from viewer/src/components/ui/dropdown-menu.js
rename to viewer/effort_js/src/components/ui/dropdown-menu.js
diff --git a/viewer/src/components/ui/input.js b/viewer/effort_js/src/components/ui/input.js
similarity index 100%
rename from viewer/src/components/ui/input.js
rename to viewer/effort_js/src/components/ui/input.js
diff --git a/viewer/src/components/ui/label.js b/viewer/effort_js/src/components/ui/label.js
similarity index 100%
rename from viewer/src/components/ui/label.js
rename to viewer/effort_js/src/components/ui/label.js
diff --git a/viewer/src/components/ui/popover.js b/viewer/effort_js/src/components/ui/popover.js
similarity index 100%
rename from viewer/src/components/ui/popover.js
rename to viewer/effort_js/src/components/ui/popover.js
diff --git a/viewer/src/components/ui/select.js b/viewer/effort_js/src/components/ui/select.js
similarity index 100%
rename from viewer/src/components/ui/select.js
rename to viewer/effort_js/src/components/ui/select.js
diff --git a/viewer/src/components/ui/separator.js b/viewer/effort_js/src/components/ui/separator.js
similarity index 100%
rename from viewer/src/components/ui/separator.js
rename to viewer/effort_js/src/components/ui/separator.js
diff --git a/viewer/src/components/ui/table.js b/viewer/effort_js/src/components/ui/table.js
similarity index 100%
rename from viewer/src/components/ui/table.js
rename to viewer/effort_js/src/components/ui/table.js
diff --git a/viewer/src/components/ui/textarea.js b/viewer/effort_js/src/components/ui/textarea.js
similarity index 100%
rename from viewer/src/components/ui/textarea.js
rename to viewer/effort_js/src/components/ui/textarea.js
diff --git a/viewer/src/lib/utils.js b/viewer/effort_js/src/lib/utils.js
similarity index 100%
rename from viewer/src/lib/utils.js
rename to viewer/effort_js/src/lib/utils.js
diff --git a/viewer/src/pages/FeedbackCreatePage.js b/viewer/effort_js/src/pages/FeedbackCreatePage.js
similarity index 100%
rename from viewer/src/pages/FeedbackCreatePage.js
rename to viewer/effort_js/src/pages/FeedbackCreatePage.js
diff --git a/viewer/src/pages/FeedbackDetailPage.js b/viewer/effort_js/src/pages/FeedbackDetailPage.js
similarity index 100%
rename from viewer/src/pages/FeedbackDetailPage.js
rename to viewer/effort_js/src/pages/FeedbackDetailPage.js
diff --git a/viewer/src/pages/FeedbackListPage.js b/viewer/effort_js/src/pages/FeedbackListPage.js
similarity index 100%
rename from viewer/src/pages/FeedbackListPage.js
rename to viewer/effort_js/src/pages/FeedbackListPage.js
diff --git a/viewer/src/pages/IssueViewerPage.js b/viewer/effort_js/src/pages/IssueViewerPage.js
similarity index 100%
rename from viewer/src/pages/IssueViewerPage.js
rename to viewer/effort_js/src/pages/IssueViewerPage.js
diff --git a/viewer/src/services/error.js b/viewer/effort_js/src/services/error.js
similarity index 100%
rename from viewer/src/services/error.js
rename to viewer/effort_js/src/services/error.js
diff --git a/viewer/src/services/feedback.js b/viewer/effort_js/src/services/feedback.js
similarity index 98%
rename from viewer/src/services/feedback.js
rename to viewer/effort_js/src/services/feedback.js
index 5996da9..0c52058 100644
--- a/viewer/src/services/feedback.js
+++ b/viewer/effort_js/src/services/feedback.js
@@ -1,5 +1,5 @@
// src/services/feedback.ts
-import { handleApiError } from "./error";
+import { handleApiError } from "../../../src/services/error";
// --- API 함수 ---
const getFeedbacksSearchApiUrl = (projectId, channelId) =>
`/api/v2/projects/${projectId}/channels/${channelId}/feedbacks/search`;
diff --git a/viewer/src/services/issue.js b/viewer/effort_js/src/services/issue.js
similarity index 92%
rename from viewer/src/services/issue.js
rename to viewer/effort_js/src/services/issue.js
index eaa253b..0ac14e7 100644
--- a/viewer/src/services/issue.js
+++ b/viewer/effort_js/src/services/issue.js
@@ -1,5 +1,5 @@
// src/services/issue.ts
-import { handleApiError } from "./error";
+import { handleApiError } from "../../../src/services/error";
/**
* 특정 프로젝트의 모든 이슈를 검색합니다.
* @param projectId 프로젝트 ID
diff --git a/viewer/src/services/project.js b/viewer/effort_js/src/services/project.js
similarity index 100%
rename from viewer/src/services/project.js
rename to viewer/effort_js/src/services/project.js
diff --git a/viewer/vite.config.js b/viewer/effort_js/src/vite.config.js
similarity index 100%
rename from viewer/vite.config.js
rename to viewer/effort_js/src/vite.config.js
diff --git a/viewer/src/components/Header.tsx b/viewer/src/components/Header.tsx
index 21ac292..0124925 100644
--- a/viewer/src/components/Header.tsx
+++ b/viewer/src/components/Header.tsx
@@ -1,3 +1,4 @@
+import { cn } from "@/lib/utils";
import { NavLink } from "react-router-dom";
import { ProjectSelectBox } from "./ProjectSelectBox";
import { ThemeSelectBox } from "./ThemeSelectBox";
@@ -10,7 +11,11 @@ const menuItems = [
{ name: "Issue", path: "/issues", type: "issue" },
];
-export function Header() {
+interface HeaderProps {
+ className?: string;
+}
+
+export function Header({ className }: HeaderProps) {
const { projectId, channelId } = useSettingsStore();
const getPath = (type: string, basePath: string) => {
@@ -23,7 +28,12 @@ export function Header() {
const homePath = `/projects/${projectId}`;
return (
-