diff --git a/apps/desktop/components.json b/apps/desktop/components.json new file mode 100644 index 0000000000..73dfc91aca --- /dev/null +++ b/apps/desktop/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "tailwind.config.js", + "css": "src/styles/global.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "src/components", + "utils": "src/lib/utils", + "ui": "src/components/ui", + "lib": "src/lib", + "hooks": "src/hooks" + }, + "iconLibrary": "lucide" +} diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 66543c8371..a0a61fc244 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -21,17 +21,20 @@ "@radix-ui/react-select": "^2.1.3", "@radix-ui/react-switch": "^1.1.2", "@radix-ui/react-tabs": "^1.1.2", + "@remixicon/react": "^4.5.0", "@tauri-apps/api": "^2", "@tauri-apps/plugin-dialog": "^2.2.0", "@tauri-apps/plugin-fs": "^2.0.3", "@tauri-apps/plugin-log": "^2.2.0", "@tauri-apps/plugin-updater": "^2.0.0", "@tiptap/extension-highlight": "^2.10.3", + "@tiptap/extension-placeholder": "^2.10.3", "@tiptap/extension-typography": "^2.10.3", "@tiptap/pm": "^2.10.3", "@tiptap/react": "^2.10.3", "@tiptap/starter-kit": "^2.10.3", - "clsx": "^2.0.0", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", "cmdk": "^1.0.4", "date-fns": "^4.1.0", "embla-carousel": "^8.5.1", @@ -41,7 +44,8 @@ "react-dom": "^18.2.0", "react-resizable-panels": "^2.1.7", "react-router": "^7.0.2", - "tailwind-merge": "^2.1.0", + "tailwind-merge": "^2.5.5", + "tailwindcss-animate": "^1.0.7", "zustand": "^5.0.2" }, "devDependencies": { diff --git a/apps/desktop/public/bgm.mp3 b/apps/desktop/public/bgm.mp3 new file mode 100644 index 0000000000..dd84562515 Binary files /dev/null and b/apps/desktop/public/bgm.mp3 differ diff --git a/apps/desktop/public/tauri.svg b/apps/desktop/public/tauri.svg deleted file mode 100644 index 31b62c9280..0000000000 --- a/apps/desktop/public/tauri.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/desktop/public/vite.svg b/apps/desktop/public/vite.svg deleted file mode 100644 index e7b8dfb1b2..0000000000 --- a/apps/desktop/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/desktop/src-tauri/icons/128.png b/apps/desktop/src-tauri/icons/128.png index 499e874cad..f91c085707 100644 Binary files a/apps/desktop/src-tauri/icons/128.png and b/apps/desktop/src-tauri/icons/128.png differ diff --git a/apps/desktop/src-tauri/icons/256.png b/apps/desktop/src-tauri/icons/256.png index 9b5c905881..37788cd039 100644 Binary files a/apps/desktop/src-tauri/icons/256.png and b/apps/desktop/src-tauri/icons/256.png differ diff --git a/apps/desktop/src-tauri/icons/32.png b/apps/desktop/src-tauri/icons/32.png index 3a03921746..daf6bc1566 100644 Binary files a/apps/desktop/src-tauri/icons/32.png and b/apps/desktop/src-tauri/icons/32.png differ diff --git a/apps/desktop/src-tauri/icons/Square107x107Logo.png b/apps/desktop/src-tauri/icons/Square107x107Logo.png index f91daf3328..c6fdabd883 100644 Binary files a/apps/desktop/src-tauri/icons/Square107x107Logo.png and b/apps/desktop/src-tauri/icons/Square107x107Logo.png differ diff --git a/apps/desktop/src-tauri/icons/Square142x142Logo.png b/apps/desktop/src-tauri/icons/Square142x142Logo.png index 4d8cbd01a8..46a8ad8e29 100644 Binary files a/apps/desktop/src-tauri/icons/Square142x142Logo.png and b/apps/desktop/src-tauri/icons/Square142x142Logo.png differ diff --git a/apps/desktop/src-tauri/icons/Square150x150Logo.png b/apps/desktop/src-tauri/icons/Square150x150Logo.png index 1803bc7aef..3662c9056c 100644 Binary files a/apps/desktop/src-tauri/icons/Square150x150Logo.png and b/apps/desktop/src-tauri/icons/Square150x150Logo.png differ diff --git a/apps/desktop/src-tauri/icons/Square284x284Logo.png b/apps/desktop/src-tauri/icons/Square284x284Logo.png index 741029ec41..72ff79c7e4 100644 Binary files a/apps/desktop/src-tauri/icons/Square284x284Logo.png and b/apps/desktop/src-tauri/icons/Square284x284Logo.png differ diff --git a/apps/desktop/src-tauri/icons/Square30x30Logo.png b/apps/desktop/src-tauri/icons/Square30x30Logo.png index 066de71dba..c92986bb3f 100644 Binary files a/apps/desktop/src-tauri/icons/Square30x30Logo.png and b/apps/desktop/src-tauri/icons/Square30x30Logo.png differ diff --git a/apps/desktop/src-tauri/icons/Square310x310Logo.png b/apps/desktop/src-tauri/icons/Square310x310Logo.png index f58082cb3c..f5b5a4b62d 100644 Binary files a/apps/desktop/src-tauri/icons/Square310x310Logo.png and b/apps/desktop/src-tauri/icons/Square310x310Logo.png differ diff --git a/apps/desktop/src-tauri/icons/Square44x44Logo.png b/apps/desktop/src-tauri/icons/Square44x44Logo.png index 52d6783139..7dfa589a21 100644 Binary files a/apps/desktop/src-tauri/icons/Square44x44Logo.png and b/apps/desktop/src-tauri/icons/Square44x44Logo.png differ diff --git a/apps/desktop/src-tauri/icons/Square71x71Logo.png b/apps/desktop/src-tauri/icons/Square71x71Logo.png index 77853eb955..aedeeb0891 100644 Binary files a/apps/desktop/src-tauri/icons/Square71x71Logo.png and b/apps/desktop/src-tauri/icons/Square71x71Logo.png differ diff --git a/apps/desktop/src-tauri/icons/Square89x89Logo.png b/apps/desktop/src-tauri/icons/Square89x89Logo.png index 5934049418..9ef1211d00 100644 Binary files a/apps/desktop/src-tauri/icons/Square89x89Logo.png and b/apps/desktop/src-tauri/icons/Square89x89Logo.png differ diff --git a/apps/desktop/src-tauri/icons/StoreLogo.png b/apps/desktop/src-tauri/icons/StoreLogo.png index 69b14f718c..3e320c7481 100644 Binary files a/apps/desktop/src-tauri/icons/StoreLogo.png and b/apps/desktop/src-tauri/icons/StoreLogo.png differ diff --git a/apps/desktop/src-tauri/icons/icon.icns b/apps/desktop/src-tauri/icons/icon.icns index 1b047e8034..59ffeb81cc 100644 Binary files a/apps/desktop/src-tauri/icons/icon.icns and b/apps/desktop/src-tauri/icons/icon.icns differ diff --git a/apps/desktop/src-tauri/icons/icon.ico b/apps/desktop/src-tauri/icons/icon.ico index e02c4a3837..68197c7f3a 100644 Binary files a/apps/desktop/src-tauri/icons/icon.ico and b/apps/desktop/src-tauri/icons/icon.ico differ diff --git a/apps/desktop/src-tauri/icons/icon.png b/apps/desktop/src-tauri/icons/icon.png index e8a64945ad..68197c7f3a 100644 Binary files a/apps/desktop/src-tauri/icons/icon.png and b/apps/desktop/src-tauri/icons/icon.png differ diff --git a/apps/desktop/src/App.tsx b/apps/desktop/src/App.tsx index 28d934c3f4..3788e620fe 100644 --- a/apps/desktop/src/App.tsx +++ b/apps/desktop/src/App.tsx @@ -1,11 +1,20 @@ import { useEffect } from "react"; -import { BrowserRouter, Routes, Route } from "react-router"; - +import { BrowserRouter, Routes, Route, Navigate } from "react-router"; import { UIProvider } from "./contexts/UIContext"; - import NavBar from "./components/layout/NavBar"; import Home from "./pages/Home"; import Note from "./pages/Note"; +import Login from "./pages/Login"; + +interface ProtectedRouteProps { + children: React.ReactNode; +} + +const ProtectedRoute = ({ children }: ProtectedRouteProps) => { + // Replace this with your actual authentication check + const isAuthenticated = localStorage.getItem("isAuthenticated") === "true"; + return isAuthenticated ? <>{children} : ; +}; function App() { useEffect(() => { @@ -28,13 +37,35 @@ function App() {
- -
- - } /> - } /> - -
+ + } /> + + <> + +
+ +
+ + + } + /> + + <> + +
+ +
+ + + } + /> +
diff --git a/apps/desktop/src/components/home/NewUserBanner.tsx b/apps/desktop/src/components/home/NewUserBanner.tsx index e48b0a0e3c..fba1c67f59 100644 --- a/apps/desktop/src/components/home/NewUserBanner.tsx +++ b/apps/desktop/src/components/home/NewUserBanner.tsx @@ -1,4 +1,4 @@ -import { ArrowRight } from "lucide-react"; +import { RiArrowRightLine } from "@remixicon/react"; interface NewUserBannerProps { onDemoClick: () => void; @@ -14,7 +14,7 @@ export const NewUserBanner = ({ onDemoClick }: NewUserBannerProps) => { className="flex items-center gap-2 rounded-full bg-white px-4 py-2 text-blue-600 transition-colors hover:bg-blue-50" > 데모 체험 - + diff --git a/apps/desktop/src/components/home/UpcomingEvents.tsx b/apps/desktop/src/components/home/UpcomingEvents.tsx index 7b62c7e962..e90a985829 100644 --- a/apps/desktop/src/components/home/UpcomingEvents.tsx +++ b/apps/desktop/src/components/home/UpcomingEvents.tsx @@ -1,7 +1,7 @@ import useEmblaCarousel from "embla-carousel-react"; import { Note } from "../../types"; import { EventCard } from "./EventCard"; -import { ChevronLeft, ChevronRight } from "lucide-react"; +import { RiArrowLeftSLine, RiArrowRightSLine } from "@remixicon/react"; import { useCallback } from "react"; interface UpcomingEventsProps { @@ -50,13 +50,13 @@ export const UpcomingEvents = ({ onClick={scrollPrev} className="absolute -left-4 top-1/2 -translate-y-1/2 rounded-full bg-white p-2 shadow-lg hover:bg-gray-50" > - + )} diff --git a/apps/desktop/src/components/layout/ExportMenu.tsx b/apps/desktop/src/components/layout/ExportMenu.tsx index 0db6ac5593..86467c818e 100644 --- a/apps/desktop/src/components/layout/ExportMenu.tsx +++ b/apps/desktop/src/components/layout/ExportMenu.tsx @@ -1,5 +1,10 @@ import { useRef, useState } from "react"; -import { Share, Copy, File, FileText } from "lucide-react"; +import { + RiShareLine, + RiFileCopyLine, + RiFileTextLine, + RiFileTextFill, +} from "@remixicon/react"; import { useClickOutside } from "../../hooks/useClickOutside"; @@ -20,7 +25,7 @@ export default function ExportMenu() { className="rounded-md p-2 text-gray-700 hover:bg-gray-100" aria-label={isOpen ? "Close export menu" : "Open export menu"} > - + {isOpen && (
@@ -32,7 +37,7 @@ export default function ExportMenu() { }} className="flex w-full items-center gap-2 px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-100" > - + 클립보드에 복사
diff --git a/apps/desktop/src/components/layout/NavBar.tsx b/apps/desktop/src/components/layout/NavBar.tsx index e81c053491..a40b42efba 100644 --- a/apps/desktop/src/components/layout/NavBar.tsx +++ b/apps/desktop/src/components/layout/NavBar.tsx @@ -1,6 +1,10 @@ import { useCallback } from "react"; import { useNavigate, useLocation } from "react-router"; -import { PanelRightClose, PanelRightOpen, Menu } from "lucide-react"; +import { + RiMenuLine, + RiSidebarUnfoldLine, + RiSidebarFoldLine, +} from "@remixicon/react"; import SearchModal from "../modals/search/SearchModal"; import SettingsModal from "../modals/settings/SettingsModal"; @@ -51,7 +55,7 @@ export default function NavBar() { onClick={handleSettingsClick} className="flex items-center rounded p-2 hover:bg-gray-100" > - + )} @@ -70,9 +74,9 @@ export default function NavBar() { aria-label={isPanelOpen ? "Close panel" : "Open panel"} > {isPanelOpen ? ( - + ) : ( - + )} ) : ( diff --git a/apps/desktop/src/components/layout/NavigationButtons.tsx b/apps/desktop/src/components/layout/NavigationButtons.tsx index 298655725c..e5c251f807 100644 --- a/apps/desktop/src/components/layout/NavigationButtons.tsx +++ b/apps/desktop/src/components/layout/NavigationButtons.tsx @@ -1,4 +1,4 @@ -import { Home, ChevronLeft } from "lucide-react"; +import { RiHome2Line, RiArrowLeftSLine } from "@remixicon/react"; interface NavigationButtonsProps { onHomeClick: () => void; @@ -12,10 +12,10 @@ export default function NavigationButtons({ return ( <> ); diff --git a/apps/desktop/src/components/modals/settings/SettingsTabs.tsx b/apps/desktop/src/components/modals/settings/SettingsTabs.tsx index 69995ee0c7..61a8cfbd81 100644 --- a/apps/desktop/src/components/modals/settings/SettingsTabs.tsx +++ b/apps/desktop/src/components/modals/settings/SettingsTabs.tsx @@ -1,13 +1,13 @@ import * as Tabs from "@radix-ui/react-tabs"; import { - Settings, - MessageSquare, - CreditCard, - Calendar, - Bell, - UserCircle, - Cable, -} from "lucide-react"; + RiSettings4Line, + RiMessage2Line, + RiBankCardLine, + RiCalendarLine, + RiNotification3Line, + RiUser3Line, + RiPlugLine, +} from "@remixicon/react"; interface TabItem { value: string; @@ -17,13 +17,13 @@ interface TabItem { export function SettingsTabs() { const mainTabs: TabItem[] = [ - { value: "profile", label: "프로필", icon: UserCircle }, - { value: "general", label: "일반", icon: Settings }, - { value: "feedback", label: "피드백", icon: MessageSquare }, - { value: "billing", label: "결제", icon: CreditCard }, - { value: "calendar", label: "캘린더", icon: Calendar }, - { value: "notification", label: "알림", icon: Bell }, - { value: "integrations", label: "연동", icon: Cable }, + { value: "profile", label: "프로필", icon: RiUser3Line }, + { value: "general", label: "일반", icon: RiSettings4Line }, + { value: "feedback", label: "피드백", icon: RiMessage2Line }, + { value: "billing", label: "결제", icon: RiBankCardLine }, + { value: "calendar", label: "캘린더", icon: RiCalendarLine }, + { value: "notification", label: "알림", icon: RiNotification3Line }, + { value: "integrations", label: "연동", icon: RiPlugLine }, ]; const TabButton = ({ tab }: { tab: TabItem }) => ( @@ -32,7 +32,7 @@ export function SettingsTabs() { value={tab.value} className="flex w-full items-center gap-2 rounded-md px-3 py-2 text-sm text-gray-600 hover:bg-gray-100 focus:outline-none data-[state=active]:bg-white data-[state=active]:text-blue-600" > - + {tab.label} ); diff --git a/apps/desktop/src/components/modals/settings/tabs/Integrations.tsx b/apps/desktop/src/components/modals/settings/tabs/Integrations.tsx index 77acfcfb62..2c04ecc6ec 100644 --- a/apps/desktop/src/components/modals/settings/tabs/Integrations.tsx +++ b/apps/desktop/src/components/modals/settings/tabs/Integrations.tsx @@ -1,6 +1,8 @@ -import SlackIcon from "../../../../constants/icons/SlackIcon"; -import NotionIcon from "../../../../constants/icons/NotionIcon"; -import { ExternalLink } from "lucide-react"; +import { + RiSlackFill, + RiNotionFill, + RiExternalLinkLine, +} from "@remixicon/react"; interface IntegrationCardProps { title: string; @@ -28,7 +30,7 @@ function IntegrationCard({ onClick={onClick} className="inline-flex items-center gap-2 rounded-md border border-transparent bg-blue-600 px-4 py-2 text-sm font-medium text-white shadow-sm hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2" > - + 연결하기 @@ -40,7 +42,7 @@ export function Integrations() { { title: "Slack 연동하기", description: "Slack에서 미팅 알림을 받고 상태를 자동으로 업데이트하세요", - icon: , + icon: , onClick: () => { /* TODO: Implement Slack connection */ }, @@ -48,8 +50,7 @@ export function Integrations() { { title: "Notion 연동하기", description: "미팅 노트를 Notion에 자동으로 동기화하세요", - icon: , - + icon: , onClick: () => { /* TODO: Implement Notion connection */ }, diff --git a/apps/desktop/src/components/modals/settings/tabs/Profile.tsx b/apps/desktop/src/components/modals/settings/tabs/Profile.tsx index b80d2de788..d223bcf76f 100644 --- a/apps/desktop/src/components/modals/settings/tabs/Profile.tsx +++ b/apps/desktop/src/components/modals/settings/tabs/Profile.tsx @@ -1,5 +1,5 @@ import { useState, useRef } from "react"; -import { UserCircle } from "lucide-react"; +import { RiUser3Line } from "@remixicon/react"; export function Profile() { const [fullName, setFullName] = useState(""); @@ -46,7 +46,7 @@ export function Profile() { className="h-full w-full object-cover" /> ) : ( - + )} + ))} + + + )} + + {messages.length > 0 && ( +
+ {messages.map((msg, index) => ( +
+ {msg.text} +
+ ))} +
+ )} + +
+