diff --git a/src/renderer/src/App.tsx b/src/renderer/src/App.tsx
index 151090e..29b507b 100644
--- a/src/renderer/src/App.tsx
+++ b/src/renderer/src/App.tsx
@@ -1,6 +1,7 @@
import { HashRouter, Route, Routes } from 'react-router-dom'
import { MainPage } from '@/components/workspace/main-page'
import { ConnectionWizard } from '@/components/connection-wizard/wizard-modal'
+import SettingModal from './components/setting/setting-modal'
function App(): React.JSX.Element {
return (
@@ -8,6 +9,7 @@ function App(): React.JSX.Element {
}>
}>
+ } />
)
diff --git a/src/renderer/src/components/connection-wizard/confirm-settings.tsx b/src/renderer/src/components/connection-wizard/confirm-settings.tsx
index 47f7fe7..61c6fdd 100644
--- a/src/renderer/src/components/connection-wizard/confirm-settings.tsx
+++ b/src/renderer/src/components/connection-wizard/confirm-settings.tsx
@@ -1,4 +1,4 @@
-import { DATABASES, ConnectionDeatil } from './type'
+import { DATABASES, ConnectionDeatil } from './wizard.type'
interface ConfirmSettingsProp {
connectionDetail: ConnectionDeatil
diff --git a/src/renderer/src/components/connection-wizard/database-button.tsx b/src/renderer/src/components/connection-wizard/database-button.tsx
index a460f2d..37790e1 100644
--- a/src/renderer/src/components/connection-wizard/database-button.tsx
+++ b/src/renderer/src/components/connection-wizard/database-button.tsx
@@ -1,4 +1,4 @@
-import { DatabaseInfo } from './type'
+import { DatabaseInfo } from './wizard.type'
interface DatabaseButtonProps {
databaseInfo: DatabaseInfo
diff --git a/src/renderer/src/components/connection-wizard/enter-connection-details.tsx b/src/renderer/src/components/connection-wizard/enter-connection-details.tsx
index 7e92b51..02e7f6f 100644
--- a/src/renderer/src/components/connection-wizard/enter-connection-details.tsx
+++ b/src/renderer/src/components/connection-wizard/enter-connection-details.tsx
@@ -1,5 +1,5 @@
import { X } from 'lucide-react'
-import { ConnectionDeatil } from './type'
+import { ConnectionDeatil } from './wizard.type'
import { Button } from '../ui/button'
import { Input } from '../ui/input'
import { cn } from '@/lib/utils'
diff --git a/src/renderer/src/components/connection-wizard/footer-buttons.tsx b/src/renderer/src/components/connection-wizard/footer-buttons.tsx
index 2f93b7c..f5f7b9c 100644
--- a/src/renderer/src/components/connection-wizard/footer-buttons.tsx
+++ b/src/renderer/src/components/connection-wizard/footer-buttons.tsx
@@ -1,6 +1,6 @@
import { ChevronLeft, ChevronRight } from 'lucide-react'
import { Button } from '../ui/button'
-import { DB_SETUP_STEPS, DBSetupStep } from './type'
+import { DB_SETUP_STEPS, DBSetupStep } from './wizard.type'
interface FooterButtonsProp {
activeTab: DBSetupStep
diff --git a/src/renderer/src/components/connection-wizard/install-driver.tsx b/src/renderer/src/components/connection-wizard/install-driver.tsx
index 76cd8b5..d3732e9 100644
--- a/src/renderer/src/components/connection-wizard/install-driver.tsx
+++ b/src/renderer/src/components/connection-wizard/install-driver.tsx
@@ -1,5 +1,5 @@
import { AlertCircle, CheckCircle2, FolderOpen } from 'lucide-react'
-import { DatabaseInfo } from './type'
+import { DatabaseInfo } from './wizard.type'
import { Button } from '../ui/button'
import { useEffect, useState } from 'react'
diff --git a/src/renderer/src/components/connection-wizard/select-database.tsx b/src/renderer/src/components/connection-wizard/select-database.tsx
index 960c2be..d423c28 100644
--- a/src/renderer/src/components/connection-wizard/select-database.tsx
+++ b/src/renderer/src/components/connection-wizard/select-database.tsx
@@ -1,6 +1,6 @@
import { Search, X } from 'lucide-react'
import { Button } from '@/components/ui/button'
-import { DATABASES, DatabaseInfo } from './type'
+import { DATABASES, DatabaseInfo } from './wizard.type'
import { Input } from '@/components/ui/input'
import { useState } from 'react'
import { DatabaseButton } from './database-button'
diff --git a/src/renderer/src/components/connection-wizard/sidebar.tsx b/src/renderer/src/components/connection-wizard/sidebar.tsx
index 2621fc6..8ecb73b 100644
--- a/src/renderer/src/components/connection-wizard/sidebar.tsx
+++ b/src/renderer/src/components/connection-wizard/sidebar.tsx
@@ -1,4 +1,4 @@
-import { DB_SETUP_STEPS, DBSetupStep } from './type'
+import { DB_SETUP_STEPS, DBSetupStep } from './wizard.type'
interface SidebarProp {
activeTab: DBSetupStep
diff --git a/src/renderer/src/components/connection-wizard/wizard-modal.tsx b/src/renderer/src/components/connection-wizard/wizard-modal.tsx
index 85dceb6..dd61865 100644
--- a/src/renderer/src/components/connection-wizard/wizard-modal.tsx
+++ b/src/renderer/src/components/connection-wizard/wizard-modal.tsx
@@ -2,7 +2,7 @@ import { JSX, useEffect, useState } from 'react'
import { toast } from 'sonner'
import { FooterButtons } from './footer-buttons'
import { SelectDatabase } from './select-database'
-import { ConnectionDeatil, DatabaseInfo, DBSetupStep } from './type'
+import { ConnectionDeatil, DatabaseInfo, DBSetupStep } from './wizard.type'
import Sidebar from './sidebar'
import InstallDriver from './install-driver'
import EnterConnectionDetails from './enter-connection-details'
diff --git a/src/renderer/src/components/connection-wizard/type.ts b/src/renderer/src/components/connection-wizard/wizard.type.ts
similarity index 100%
rename from src/renderer/src/components/connection-wizard/type.ts
rename to src/renderer/src/components/connection-wizard/wizard.type.ts
diff --git a/src/renderer/src/components/layout/side-bar.tsx b/src/renderer/src/components/layout/side-bar.tsx
index 73d1b9d..09a0641 100644
--- a/src/renderer/src/components/layout/side-bar.tsx
+++ b/src/renderer/src/components/layout/side-bar.tsx
@@ -10,8 +10,28 @@ const topNavItems: NavItem[] = [
]
const bottomNavItems: NavItem[] = [
- { id: 'settings', icon: Settings },
- { id: 'add', icon: Plus }
+ {
+ id: 'settings',
+ icon: Settings,
+ onClick: () => {
+ window.api.send('open-sub-window', {
+ width: 840,
+ height: 576,
+ route: '/setting'
+ })
+ }
+ },
+ {
+ id: 'add',
+ icon: Plus,
+ onClick: () => {
+ window.api.send('open-sub-window', {
+ width: 800,
+ height: 610,
+ route: '/connection-wizard'
+ })
+ }
+ }
]
function NavButton({ item }: { item: NavItem }): React.JSX.Element {
diff --git a/src/renderer/src/components/setting/key-management.tsx b/src/renderer/src/components/setting/key-management.tsx
new file mode 100644
index 0000000..d5216f6
--- /dev/null
+++ b/src/renderer/src/components/setting/key-management.tsx
@@ -0,0 +1,45 @@
+import { useState } from 'react'
+import { X } from 'lucide-react'
+import { Button } from '../ui/button'
+import { Input } from '../ui/input'
+
+/**
+ * API 설정 화면
+ *
+ * @author 6-keem
+ *
+ * @returns JSX.Element
+ */
+export default function KeyManagement(): React.JSX.Element {
+ const [apiKey, setApiKey] = useState('')
+
+ return (
+
+
+
+
+ setApiKey(e.target.value)}
+ spellCheck={false}
+ className={`w-full pr-8 text-xs text-white font-medium font-['Pretendard'] leading-[18px]
+ bg-gradient-to-b from-[#1d1d1d] to-neutral-800 rounded-lg border border-[#383838] transition duration-150
+ focus:outline-none focus:ring-0 focus:ring-transparent focus:ring-offset-0 focus:border-[#9F73FF]`}
+ />
+ {apiKey && (
+
+ )}
+
+
+
+ )
+}
diff --git a/src/renderer/src/components/setting/setting-modal.tsx b/src/renderer/src/components/setting/setting-modal.tsx
new file mode 100644
index 0000000..6bead57
--- /dev/null
+++ b/src/renderer/src/components/setting/setting-modal.tsx
@@ -0,0 +1,23 @@
+import { useState } from 'react'
+import KeyManagement from './key-management'
+import SettingSideBar from './setting-side-bar'
+import { SettingSection } from './settings.types'
+
+/**
+ * 설정 모달 화면
+ *
+ * @author 6-keem
+ *
+ * @returns JSX.Element
+ */
+export default function SettingModal(): React.JSX.Element {
+ const [activeTab, setActiveTab] = useState(SettingSection.KeyManagement)
+ return (
+
+ )
+}
diff --git a/src/renderer/src/components/setting/setting-side-bar.tsx b/src/renderer/src/components/setting/setting-side-bar.tsx
new file mode 100644
index 0000000..f0ec9e4
--- /dev/null
+++ b/src/renderer/src/components/setting/setting-side-bar.tsx
@@ -0,0 +1,58 @@
+import { CircleQuestionMarkIcon, Code2, KeyRound } from 'lucide-react'
+import { SettingSection, SettingItem } from './settings.types'
+
+const SETTING_ITEMS: SettingItem[] = [
+ {
+ icon: ,
+ label: 'API 키 관리',
+ key: SettingSection.KeyManagement
+ },
+ {
+ icon: ,
+ label: '코드 에디터 설정',
+ key: SettingSection.StylingCodeEditor
+ },
+ {
+ icon: ,
+ label: '도움말',
+ key: SettingSection.Info
+ }
+]
+
+interface SettingSideBarProp {
+ activeTab: SettingSection
+ setActiveTab: (activeTab: SettingSection) => void
+}
+
+/**
+ * 설정 모달의 사이드바
+ *
+ * @author 6-keem
+ *
+ * @param activeTab 현재 활성화 탭 (상태)
+ * @param setActiveTab 활성화 탭 변경 함수
+ * @returns JSX.Element
+ */
+export default function SettingSideBar({
+ activeTab,
+ setActiveTab
+}: SettingSideBarProp): React.JSX.Element {
+ return (
+
+ {SETTING_ITEMS.map((settingItem) => {
+ return (
+
setActiveTab(settingItem.key)}
+ >
+ {settingItem.icon}
+
+ {settingItem.label}
+
+
+ )
+ })}
+
+ )
+}
diff --git a/src/renderer/src/components/setting/settings.types.ts b/src/renderer/src/components/setting/settings.types.ts
new file mode 100644
index 0000000..f5481a7
--- /dev/null
+++ b/src/renderer/src/components/setting/settings.types.ts
@@ -0,0 +1,11 @@
+export enum SettingSection {
+ KeyManagement = 'KeyManagement',
+ StylingCodeEditor = 'StylingCodeEditor',
+ Info = 'Info'
+}
+
+export interface SettingItem {
+ icon: React.ReactNode
+ label: string
+ key: SettingSection
+}