From 661c78805650e5c2a4e977afca4d6cdb8832f40b Mon Sep 17 00:00:00 2001 From: Yujong Lee Date: Mon, 6 Oct 2025 15:31:34 +0900 Subject: [PATCH 1/4] done --- .../src/components/main/left-sidebar.tsx | 46 +++++++++++++++---- .../src/routes/app/main/_layout.index.tsx | 43 +++++++++-------- apps/desktop2/src/styles/globals.css | 1 + 3 files changed, 63 insertions(+), 27 deletions(-) diff --git a/apps/desktop2/src/components/main/left-sidebar.tsx b/apps/desktop2/src/components/main/left-sidebar.tsx index 89b5e5844..79abe307a 100644 --- a/apps/desktop2/src/components/main/left-sidebar.tsx +++ b/apps/desktop2/src/components/main/left-sidebar.tsx @@ -1,6 +1,6 @@ import { Link } from "@tanstack/react-router"; import { clsx } from "clsx"; -import { ChartNoAxesGantt, FolderOpenIcon } from "lucide-react"; +import { ChartNoAxesGantt, FolderOpenIcon, SearchIcon } from "lucide-react"; import { useState } from "react"; import { useCell, useRowIds, useSliceRowIds } from "tinybase/ui-react"; @@ -14,12 +14,12 @@ import { InteractiveButton } from "../interactive-button"; export function LeftSidebar() { return ( -
- +
+ + + + - - + +
+ +
+
+ + +
+ +
- - + +
+ +
@@ -55,6 +68,23 @@ function TimelineView() { ); } +function SearchView() { + return ( + <> +
+ +
+
+ {/* Search results will go here */} +
+ + ); +} + function FolderView() { const rootFolderIds = useSliceRowIds(persisted.INDEXES.foldersByParent, "", persisted.STORE_ID); const rootSessionIds = useSliceRowIds(persisted.INDEXES.sessionsByFolder, "", persisted.STORE_ID); diff --git a/apps/desktop2/src/routes/app/main/_layout.index.tsx b/apps/desktop2/src/routes/app/main/_layout.index.tsx index 905f19469..2d306ce23 100644 --- a/apps/desktop2/src/routes/app/main/_layout.index.tsx +++ b/apps/desktop2/src/routes/app/main/_layout.index.tsx @@ -77,24 +77,29 @@ function Component() { const { isExpanded } = useRightPanel(); return ( -
- -
- - {isExpanded - ? ( - - - - - - - - - - ) - : } -
-
+ + + + + + +
+ + {isExpanded + ? ( + + + + + + + + + + ) + : } +
+
+
); } diff --git a/apps/desktop2/src/styles/globals.css b/apps/desktop2/src/styles/globals.css index 406de8a81..802298d8e 100644 --- a/apps/desktop2/src/styles/globals.css +++ b/apps/desktop2/src/styles/globals.css @@ -62,6 +62,7 @@ h6 { #root, #__next { isolation: isolate; + height: 100%; } /* https://github.com/gitbutlerapp/gitbutler/blob/master/apps/desktop/src/styles/styles.css */ From 099f004b76cafb9416acc38242767feda9b9581a Mon Sep 17 00:00:00 2001 From: Yujong Lee Date: Mon, 6 Oct 2025 15:44:37 +0900 Subject: [PATCH 2/4] chat button --- .../components/toolbar/bars/main-toolbar.tsx | 9 ++-- .../toolbar/buttons/chat-panel-button.tsx | 53 ------------------- .../src/components/main/main-area.tsx | 7 +++ .../components/block/chat-panel-button.tsx | 37 +++++++++++++ 4 files changed, 49 insertions(+), 57 deletions(-) delete mode 100644 apps/desktop/src/components/toolbar/buttons/chat-panel-button.tsx create mode 100644 packages/ui/src/components/block/chat-panel-button.tsx diff --git a/apps/desktop/src/components/toolbar/bars/main-toolbar.tsx b/apps/desktop/src/components/toolbar/bars/main-toolbar.tsx index 4f1d682fb..b9bfae5dc 100644 --- a/apps/desktop/src/components/toolbar/bars/main-toolbar.tsx +++ b/apps/desktop/src/components/toolbar/bars/main-toolbar.tsx @@ -3,12 +3,11 @@ import { useMatch } from "@tanstack/react-router"; import { DeleteNoteButton } from "@/components/toolbar/buttons/delete-note-button"; import { NewNoteButton } from "@/components/toolbar/buttons/new-note-button"; import { NewWindowButton } from "@/components/toolbar/buttons/new-window-button"; -// import { ShareButton } from "@/components/toolbar/buttons/share-button"; import { getCurrentWebviewWindowLabel } from "@hypr/plugin-windows"; +import { ChatPanelButton } from "@hypr/ui/components/block/chat-panel-button"; import { cn } from "@hypr/ui/lib/utils"; -import { useLeftSidebar } from "@hypr/utils/contexts"; +import { useLeftSidebar, useRightPanel } from "@hypr/utils/contexts"; import { SearchBar } from "../../search-bar"; -import { ChatPanelButton } from "../buttons/chat-panel-button"; import { LeftSidebarButton } from "../buttons/left-sidebar-button"; import { ShareButton } from "../buttons/share-button"; @@ -24,6 +23,8 @@ export function MainToolbar() { const isNote = !!noteMatch; const isMain = getCurrentWebviewWindowLabel() === "main"; + const { isExpanded: isChatPanelExpanded, togglePanel: toggleChatPanel } = useRightPanel(); + return (
{(organizationMatch || humanMatch) && } {isNote && } - + )}
diff --git a/apps/desktop/src/components/toolbar/buttons/chat-panel-button.tsx b/apps/desktop/src/components/toolbar/buttons/chat-panel-button.tsx deleted file mode 100644 index a8903bfbd..000000000 --- a/apps/desktop/src/components/toolbar/buttons/chat-panel-button.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { MessageCircleMore } from "lucide-react"; -import { memo, useEffect } from "react"; - -import { Button } from "@hypr/ui/components/ui/button"; -import { Tooltip, TooltipContent, TooltipTrigger } from "@hypr/ui/components/ui/tooltip"; -import { cn } from "@hypr/ui/lib/utils"; -import { useRightPanel } from "@hypr/utils/contexts"; -import Shortcut from "../../shortcut"; - -function ChatPanelButtonBase() { - const { isExpanded, togglePanel } = useRightPanel(); - - useEffect(() => { - const handleKeyDown = (event: KeyboardEvent) => { - if (event.key === "j" && (event.metaKey || event.ctrlKey)) { - event.preventDefault(); - togglePanel(); - } - }; - - document.addEventListener("keydown", handleKeyDown); - - return () => { - document.removeEventListener("keydown", handleKeyDown); - }; - }, [togglePanel]); - - const handleClick = () => { - togglePanel(); - }; - - return ( - - - - - -

- Toggle chat panel -

-
-
- ); -} - -export const ChatPanelButton = memo(ChatPanelButtonBase); diff --git a/apps/desktop2/src/components/main/main-area.tsx b/apps/desktop2/src/components/main/main-area.tsx index 87f49d3af..58e1e158a 100644 --- a/apps/desktop2/src/components/main/main-area.tsx +++ b/apps/desktop2/src/components/main/main-area.tsx @@ -3,7 +3,9 @@ import { useNavigate, useSearch } from "@tanstack/react-router"; import { clsx } from "clsx"; import NoteEditor from "@hypr/tiptap/editor"; +import { ChatPanelButton } from "@hypr/ui/components/block/chat-panel-button"; import TitleInput from "@hypr/ui/components/block/title-input"; +import { useRightPanel } from "@hypr/utils/contexts"; import { useTabs } from "../../hooks/useTabs"; import * as persisted from "../../tinybase/store/persisted"; import { Tab } from "../../types"; @@ -22,6 +24,7 @@ export function MainContent({ tabs }: { tabs: Tab[] }) { export function MainHeader() { const search = useSearch({ strict: false }); const navigate = useNavigate(); + const { isExpanded, togglePanel } = useRightPanel(); const handleClickSettings = () => { windowsCommands.windowShow({ type: "settings" }); @@ -57,6 +60,10 @@ export function MainHeader() { New note + ); } diff --git a/packages/ui/src/components/block/chat-panel-button.tsx b/packages/ui/src/components/block/chat-panel-button.tsx new file mode 100644 index 000000000..c8190585b --- /dev/null +++ b/packages/ui/src/components/block/chat-panel-button.tsx @@ -0,0 +1,37 @@ +import { MessageCircleMore } from "lucide-react"; +import { useEffect } from "react"; + +import { Button } from "@hypr/ui/components/ui/button"; +import { cn } from "@hypr/ui/lib/utils"; + +export function ChatPanelButton({ isExpanded, togglePanel }: { isExpanded: boolean; togglePanel: () => void }) { + useEffect(() => { + const handleKeyDown = (event: KeyboardEvent) => { + if (event.key === "j" && (event.metaKey || event.ctrlKey)) { + event.preventDefault(); + togglePanel(); + } + }; + + document.addEventListener("keydown", handleKeyDown); + + return () => { + document.removeEventListener("keydown", handleKeyDown); + }; + }, [togglePanel]); + + const handleClick = () => { + togglePanel(); + }; + + return ( + + ); +} From 593446c50e9e9f174b8f5dfbc9e04641a1e82b0c Mon Sep 17 00:00:00 2001 From: Yujong Lee Date: Mon, 6 Oct 2025 16:49:55 +0900 Subject: [PATCH 3/4] more ui work --- .../src/components/main/left-sidebar.tsx | 10 ++- .../src/components/main/main-area.tsx | 68 ++++++++++------ .../src/routes/app/main/_layout.index.tsx | 27 ++++--- packages/ui/src/components/ui/scroll-area.tsx | 48 +++++++++++ pnpm-lock.yaml | 80 +++++++++---------- 5 files changed, 156 insertions(+), 77 deletions(-) create mode 100644 packages/ui/src/components/ui/scroll-area.tsx diff --git a/apps/desktop2/src/components/main/left-sidebar.tsx b/apps/desktop2/src/components/main/left-sidebar.tsx index 79abe307a..693cc2621 100644 --- a/apps/desktop2/src/components/main/left-sidebar.tsx +++ b/apps/desktop2/src/components/main/left-sidebar.tsx @@ -1,6 +1,6 @@ import { Link } from "@tanstack/react-router"; import { clsx } from "clsx"; -import { ChartNoAxesGantt, FolderOpenIcon, SearchIcon } from "lucide-react"; +import { ChartNoAxesGantt, FolderOpenIcon, PanelLeftCloseIcon, SearchIcon } from "lucide-react"; import { useState } from "react"; import { useCell, useRowIds, useSliceRowIds } from "tinybase/ui-react"; @@ -8,11 +8,14 @@ import * as persisted from "../../tinybase/store/persisted"; import { ContextMenuItem } from "@hypr/ui/components/ui/context-menu"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@hypr/ui/components/ui/tabs"; +import { useLeftSidebar } from "@hypr/utils/contexts"; import { useTabs } from "../../hooks/useTabs"; import { Tab } from "../../types"; import { InteractiveButton } from "../interactive-button"; export function LeftSidebar() { + const { togglePanel: toggleLeftPanel } = useLeftSidebar(); + return (
@@ -34,6 +37,11 @@ export function LeftSidebar() { + + diff --git a/apps/desktop2/src/components/main/main-area.tsx b/apps/desktop2/src/components/main/main-area.tsx index 58e1e158a..87d043c3b 100644 --- a/apps/desktop2/src/components/main/main-area.tsx +++ b/apps/desktop2/src/components/main/main-area.tsx @@ -1,11 +1,13 @@ import { commands as windowsCommands } from "@hypr/plugin-windows"; import { useNavigate, useSearch } from "@tanstack/react-router"; import { clsx } from "clsx"; +import { PanelLeftOpenIcon } from "lucide-react"; import NoteEditor from "@hypr/tiptap/editor"; import { ChatPanelButton } from "@hypr/ui/components/block/chat-panel-button"; import TitleInput from "@hypr/ui/components/block/title-input"; -import { useRightPanel } from "@hypr/utils/contexts"; +import { ScrollArea, ScrollBar } from "@hypr/ui/components/ui/scroll-area"; +import { useLeftSidebar, useRightPanel } from "@hypr/utils/contexts"; import { useTabs } from "../../hooks/useTabs"; import * as persisted from "../../tinybase/store/persisted"; import { Tab } from "../../types"; @@ -14,8 +16,8 @@ export function MainContent({ tabs }: { tabs: Tab[] }) { const activeTab = tabs.find((t) => t.active)!; return ( -
- +
+
); @@ -24,7 +26,8 @@ export function MainContent({ tabs }: { tabs: Tab[] }) { export function MainHeader() { const search = useSearch({ strict: false }); const navigate = useNavigate(); - const { isExpanded, togglePanel } = useRightPanel(); + const { isExpanded: isRightPanelExpanded, togglePanel: toggleRightPanel } = useRightPanel(); + const { isExpanded: isLeftPanelExpanded, togglePanel: toggleLeftPanel } = useLeftSidebar(); const handleClickSettings = () => { windowsCommands.windowShow({ type: "settings" }); @@ -43,8 +46,17 @@ export function MainHeader() { className={clsx([ "flex w-full items-center justify-between min-h-11 py-1 px-2 border-b", "border-border bg-neutral-50", + "pl-[82px]", ])} > + {!isLeftPanelExpanded + && ( + + )} +
+ ); } -function Tabs({ tabs }: { tabs: Tab[] }) { +function TabsHeader({ tabs }: { tabs: Tab[] }) { const { select, close } = useTabs(); return ( -
- {tabs.map((tab) => ( - - ))} -
+ +
+ {tabs.map((tab) => ( + + ))} +
+ +
); } -function TabHeader( +function TabItem( { tab, active, handleSelect, handleClose }: { tab: Tab; active: boolean; @@ -99,21 +115,23 @@ function TabHeader( return (
{active && ( @@ -142,7 +160,7 @@ function TabContent({ tab }: { tab: Tab }) { ); return ( -
+
- - - - - -
+ {isLeftPanelExpanded && ( + <> + + + + + + )} + +
- {isExpanded + {isRightPanelExpanded ? ( - + - + diff --git a/packages/ui/src/components/ui/scroll-area.tsx b/packages/ui/src/components/ui/scroll-area.tsx new file mode 100644 index 000000000..561174261 --- /dev/null +++ b/packages/ui/src/components/ui/scroll-area.tsx @@ -0,0 +1,48 @@ +"use client"; + +import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area"; +import * as React from "react"; + +import { cn } from "@hypr/ui/lib/utils"; + +const ScrollArea = React.forwardRef< + React.ComponentRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + {children} + + + + +)); +ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName; + +const ScrollBar = React.forwardRef< + React.ComponentRef, + React.ComponentPropsWithoutRef +>(({ className, orientation = "vertical", ...props }, ref) => ( + + + +)); +ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName; + +export { ScrollArea, ScrollBar }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bceaaf93b..d6472f8d3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -180,7 +180,7 @@ importers: version: 1.132.37(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@tanstack/react-router-devtools': specifier: ^1.132.37 - version: 1.132.37(@tanstack/react-router@1.132.37(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.132.37)(@types/node@22.18.8)(csstype@3.1.3)(jiti@1.21.7)(lightningcss@1.30.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.7)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) + version: 1.132.37(@tanstack/react-router@1.132.37(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.132.37)(@types/node@22.18.8)(csstype@3.1.3)(jiti@2.6.1)(lightningcss@1.30.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.7)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) '@tauri-apps/api': specifier: ^2.8.0 version: 2.8.0 @@ -376,13 +376,13 @@ importers: version: 10.4.21(postcss@8.5.6) eslint: specifier: ^9.37.0 - version: 9.37.0(jiti@1.21.7) + version: 9.37.0(jiti@2.6.1) eslint-plugin-lingui: specifier: ^0.9.0 - version: 0.9.0(eslint@9.37.0(jiti@1.21.7))(typescript@5.9.3) + version: 0.9.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@9.37.0(jiti@1.21.7)) + version: 7.37.5(eslint@9.37.0(jiti@2.6.1)) globals: specifier: ^15.15.0 version: 15.15.0 @@ -397,7 +397,7 @@ importers: version: 5.9.3 typescript-eslint: specifier: ^8.45.0 - version: 8.45.0(eslint@9.37.0(jiti@1.21.7))(typescript@5.9.3) + version: 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) vite: specifier: ^5.4.20 version: 5.4.20(@types/node@22.18.8)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0) @@ -10939,9 +10939,9 @@ snapshots: '@esbuild/win32-x64@0.25.10': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@9.37.0(jiti@1.21.7))': + '@eslint-community/eslint-utils@4.9.0(eslint@9.37.0(jiti@2.6.1))': dependencies: - eslint: 9.37.0(jiti@1.21.7) + eslint: 9.37.0(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -12848,13 +12848,13 @@ snapshots: '@tanstack/query-core': 5.90.2 react: 19.2.0 - '@tanstack/react-router-devtools@1.132.37(@tanstack/react-router@1.132.37(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.132.37)(@types/node@22.18.8)(csstype@3.1.3)(jiti@1.21.7)(lightningcss@1.30.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.7)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': + '@tanstack/react-router-devtools@1.132.37(@tanstack/react-router@1.132.37(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.132.37)(@types/node@22.18.8)(csstype@3.1.3)(jiti@2.6.1)(lightningcss@1.30.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.7)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': dependencies: '@tanstack/react-router': 1.132.37(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@tanstack/router-devtools-core': 1.132.37(@tanstack/router-core@1.132.37)(@types/node@22.18.8)(csstype@3.1.3)(jiti@1.21.7)(lightningcss@1.30.1)(solid-js@1.9.7)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) + '@tanstack/router-devtools-core': 1.132.37(@tanstack/router-core@1.132.37)(@types/node@22.18.8)(csstype@3.1.3)(jiti@2.6.1)(lightningcss@1.30.1)(solid-js@1.9.7)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - vite: 7.1.9(@types/node@22.18.8)(jiti@1.21.7)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@tanstack/router-core' - '@types/node' @@ -12930,14 +12930,14 @@ snapshots: tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/router-devtools-core@1.132.37(@tanstack/router-core@1.132.37)(@types/node@22.18.8)(csstype@3.1.3)(jiti@1.21.7)(lightningcss@1.30.1)(solid-js@1.9.7)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': + '@tanstack/router-devtools-core@1.132.37(@tanstack/router-core@1.132.37)(@types/node@22.18.8)(csstype@3.1.3)(jiti@2.6.1)(lightningcss@1.30.1)(solid-js@1.9.7)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': dependencies: '@tanstack/router-core': 1.132.37 clsx: 2.1.1 goober: 2.1.18(csstype@3.1.3) solid-js: 1.9.7 tiny-invariant: 1.3.3 - vite: 7.1.9(@types/node@22.18.8)(jiti@1.21.7)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) optionalDependencies: csstype: 3.1.3 transitivePeerDependencies: @@ -13655,15 +13655,15 @@ snapshots: '@types/node': 22.18.8 optional: true - '@typescript-eslint/eslint-plugin@8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.37.0(jiti@1.21.7))(typescript@5.9.3))(eslint@9.37.0(jiti@1.21.7))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.45.0(eslint@9.37.0(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/parser': 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.45.0 - '@typescript-eslint/type-utils': 8.45.0(eslint@9.37.0(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/utils': 8.45.0(eslint@9.37.0(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.45.0 - eslint: 9.37.0(jiti@1.21.7) + eslint: 9.37.0(jiti@2.6.1) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -13672,14 +13672,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.45.0(eslint@9.37.0(jiti@1.21.7))(typescript@5.9.3)': + '@typescript-eslint/parser@8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.45.0 '@typescript-eslint/types': 8.45.0 '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.45.0 debug: 4.4.3(supports-color@8.1.1) - eslint: 9.37.0(jiti@1.21.7) + eslint: 9.37.0(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -13702,13 +13702,13 @@ snapshots: dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.45.0(eslint@9.37.0(jiti@1.21.7))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.45.0 '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.45.0(eslint@9.37.0(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/utils': 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) debug: 4.4.3(supports-color@8.1.1) - eslint: 9.37.0(jiti@1.21.7) + eslint: 9.37.0(jiti@2.6.1) ts-api-utils: 2.1.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: @@ -13732,13 +13732,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.45.0(eslint@9.37.0(jiti@1.21.7))(typescript@5.9.3)': + '@typescript-eslint/utils@8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0(jiti@1.21.7)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.45.0 '@typescript-eslint/types': 8.45.0 '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.3) - eslint: 9.37.0(jiti@1.21.7) + eslint: 9.37.0(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -15629,16 +15629,16 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-plugin-lingui@0.9.0(eslint@9.37.0(jiti@1.21.7))(typescript@5.9.3): + eslint-plugin-lingui@0.9.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/utils': 8.45.0(eslint@9.37.0(jiti@1.21.7))(typescript@5.9.3) - eslint: 9.37.0(jiti@1.21.7) + '@typescript-eslint/utils': 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.37.0(jiti@2.6.1) micromatch: 4.0.8 transitivePeerDependencies: - supports-color - typescript - eslint-plugin-react@7.37.5(eslint@9.37.0(jiti@1.21.7)): + eslint-plugin-react@7.37.5(eslint@9.37.0(jiti@2.6.1)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -15646,7 +15646,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.37.0(jiti@1.21.7) + eslint: 9.37.0(jiti@2.6.1) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -15669,9 +15669,9 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.37.0(jiti@1.21.7): + eslint@9.37.0(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0(jiti@1.21.7)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.0 '@eslint/config-helpers': 0.4.0 @@ -15707,7 +15707,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 1.21.7 + jiti: 2.6.1 transitivePeerDependencies: - supports-color @@ -20509,13 +20509,13 @@ snapshots: typedarray@0.0.6: optional: true - typescript-eslint@8.45.0(eslint@9.37.0(jiti@1.21.7))(typescript@5.9.3): + typescript-eslint@8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.37.0(jiti@1.21.7))(typescript@5.9.3))(eslint@9.37.0(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/parser': 8.45.0(eslint@9.37.0(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.45.0(eslint@9.37.0(jiti@1.21.7))(typescript@5.9.3) - eslint: 9.37.0(jiti@1.21.7) + '@typescript-eslint/utils': 8.45.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.37.0(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -20807,7 +20807,7 @@ snapshots: sugarss: 5.0.1(postcss@8.5.6) terser: 5.44.0 - vite@7.1.9(@types/node@22.18.8)(jiti@1.21.7)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): + vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: esbuild: 0.25.10 fdir: 6.5.0(picomatch@4.0.3) @@ -20818,7 +20818,7 @@ snapshots: optionalDependencies: '@types/node': 22.18.8 fsevents: 2.3.3 - jiti: 1.21.7 + jiti: 2.6.1 lightningcss: 1.30.1 sugarss: 5.0.1(postcss@8.5.6) terser: 5.44.0 From 9dd5b5d92eb86aa36db174e1886f8e4a038efc57 Mon Sep 17 00:00:00 2001 From: Yujong Lee Date: Mon, 6 Oct 2025 16:57:50 +0900 Subject: [PATCH 4/4] more ui progress --- apps/desktop2/src/components/chat.tsx | 70 +++++++++++++------ .../src/components/main/left-sidebar.tsx | 20 ++++-- apps/desktop2/src/hooks/useTabs.ts | 1 + 3 files changed, 64 insertions(+), 27 deletions(-) diff --git a/apps/desktop2/src/components/chat.tsx b/apps/desktop2/src/components/chat.tsx index 8645302e1..b7f74902f 100644 --- a/apps/desktop2/src/components/chat.tsx +++ b/apps/desktop2/src/components/chat.tsx @@ -53,40 +53,64 @@ export function Chat() { if (!currentChatGroupId || !messageIds?.length) { return ( -
-
Select or create a chat group
- -
- {chatGroupIds?.map((chatGroupId) => ( - setCurrentChatGroupId(chatGroupId)} +
+
+
+ {chatGroupIds?.map((chatGroupId) => ( + setCurrentChatGroupId(chatGroupId)} + /> + ))} +
+
+ +
+
+