diff --git a/packages/blocks/src/blocks/chats/chat-drawer-handle.tsx b/packages/blocks/src/blocks/chats/chat-drawer-handle.tsx new file mode 100644 index 0000000..e12a8c3 --- /dev/null +++ b/packages/blocks/src/blocks/chats/chat-drawer-handle.tsx @@ -0,0 +1,3 @@ +import { createDrawerHandle } from "@workspace/ui/components/drawer" + +export const chatDrawerHandle = createDrawerHandle() diff --git a/packages/blocks/src/blocks/chats/chat-drawer-trigger.tsx b/packages/blocks/src/blocks/chats/chat-drawer-trigger.tsx new file mode 100644 index 0000000..9b9a508 --- /dev/null +++ b/packages/blocks/src/blocks/chats/chat-drawer-trigger.tsx @@ -0,0 +1,12 @@ +import { DrawerTrigger } from "@workspace/ui/components/drawer" +import React from "react" +import { chatDrawerHandle } from "./chat-drawer-handle" + +type ChatDrawerTriggerProps = Omit< + React.ComponentProps, + "handle" +> + +export function ChatDrawerTrigger(props: ChatDrawerTriggerProps) { + return +} diff --git a/packages/blocks/src/blocks/chats/chat-drawer.tsx b/packages/blocks/src/blocks/chats/chat-drawer.tsx new file mode 100644 index 0000000..d3c2f5b --- /dev/null +++ b/packages/blocks/src/blocks/chats/chat-drawer.tsx @@ -0,0 +1,39 @@ +import { useMessage } from "@workspace/i18n" +import { + Drawer, + DrawerContent, + DrawerDescription, + DrawerHeader, + DrawerTitle, +} from "@workspace/ui/components/drawer" +import { ChatPopoverProps } from "./chat-popover" +import { chatMessages } from "./messages" +import { ItemGroup } from "@workspace/ui/components/item" +import { ChatThreadItem } from "./chat-thread-item" +import { chatDrawerHandle } from "./chat-drawer-handle" + +export function ChatDrawer({ threads, title }: ChatPopoverProps) { + const defaultTitle = useMessage(chatMessages.title) + + return ( + + + + + {title ?? defaultTitle}({threads.length}) + + + + + {threads.map((thread) => ( + chatDrawerHandle.close()} + /> + ))} + + + + ) +} diff --git a/packages/blocks/src/blocks/chats/chat-popover.tsx b/packages/blocks/src/blocks/chats/chat-popover.tsx index 54a0e28..b45c379 100644 --- a/packages/blocks/src/blocks/chats/chat-popover.tsx +++ b/packages/blocks/src/blocks/chats/chat-popover.tsx @@ -34,11 +34,15 @@ export function ChatPopover({ threads, title }: ChatPopoverProps) { {title ?? defaultTitle}({threads.length}) - + {threads.map((thread) => ( - + chatPopoverHandle.close()} + /> ))} diff --git a/packages/blocks/src/blocks/chats/chat-thread-trigger.tsx b/packages/blocks/src/blocks/chats/chat-thread-trigger.tsx new file mode 100644 index 0000000..81d42ee --- /dev/null +++ b/packages/blocks/src/blocks/chats/chat-thread-trigger.tsx @@ -0,0 +1,25 @@ +import { useIsMobile } from "@workspace/ui/hooks/use-breakpoint" +import { ChatDrawerTrigger } from "./chat-drawer-trigger" +import { ChatPopoverTrigger } from "./chat-popover-trigger" +import { ComponentRenderFn, HTMLProps } from "@base-ui/react" + +type State = { + disabled: boolean + open: boolean +} + +type ChatThreadTriggerProps = { + className?: string + render?: React.ReactElement | ComponentRenderFn | undefined +} + +export function ChatThreadTrigger({ + className, + render, +}: ChatThreadTriggerProps) { + return useIsMobile() ? ( + + ) : ( + + ) +} diff --git a/packages/blocks/src/blocks/chats/chat-threads.tsx b/packages/blocks/src/blocks/chats/chat-threads.tsx new file mode 100644 index 0000000..b27f417 --- /dev/null +++ b/packages/blocks/src/blocks/chats/chat-threads.tsx @@ -0,0 +1,13 @@ +import { useIsMobile } from "@workspace/ui/hooks/use-breakpoint" +import { ChatThread } from "./types" +import { ChatDrawer } from "./chat-drawer" +import { ChatPopover } from "./chat-popover" + +export interface ChatThreadsProps { + threads: readonly ChatThread[] + title?: string +} + +export function ChatThreads(props: ChatThreadsProps) { + return useIsMobile() ? : +} diff --git a/packages/blocks/src/blocks/layout/app-layout.tsx b/packages/blocks/src/blocks/layout/app-layout.tsx index 75ab56a..e0ddc3c 100644 --- a/packages/blocks/src/blocks/layout/app-layout.tsx +++ b/packages/blocks/src/blocks/layout/app-layout.tsx @@ -1,4 +1,5 @@ import * as React from "react" +import { ChevronLeftIcon, ChevronRightIcon, SearchIcon } from "lucide-react" import { BellIcon, Icon, @@ -9,9 +10,9 @@ import { Button } from "@workspace/ui/components/button" import { Kbd } from "@workspace/ui/components/kbd" import { useIsTablet } from "@workspace/ui/hooks/use-breakpoint" import { cn } from "@workspace/ui/lib/utils" -import { ChevronLeftIcon, ChevronRightIcon, SearchIcon } from "lucide-react" +import { Separator } from "@workspace/ui/components/separator" -import { ChatPopover, ChatPopoverTrigger, type ChatThread } from "../chats" +import { type ChatThread } from "../chats" import { MobileNavigationSheet, MobileNavigationSheetTrigger, @@ -31,8 +32,9 @@ import { import { useSidebarState } from "./sidebar-state" import { UserMenu, UserMenuTrigger } from "./user-menu" import { AppBreadcrumb } from "./app-breadcrumb" -import { Separator } from "@workspace/ui/components/separator" import { AppQueryIndicator } from "./app-query-indicator" +import { ChatThreadTrigger } from "../chats/chat-thread-trigger" +import { ChatThreads } from "../chats/chat-threads" export interface AppLayoutProps { chatThreads: readonly ChatThread[] @@ -54,7 +56,7 @@ export function AppLayout({ - +
@@ -90,10 +92,7 @@ function AppHeader({ actions }: { actions?: React.ReactNode }) { gradientUnits="userSpaceOnUse" > - + - - + + - + + /> + /> + />
@@ -148,8 +141,8 @@ function AppHeader({ actions }: { actions?: React.ReactNode }) {
-
- +
+ } /> - @@ -218,9 +211,7 @@ function GlobalSearchTrigger() { className="text-muted-foreground mobile:hidden" strokeWidth={2.5} /> - - ⌘K - + ⌘K ) } diff --git a/packages/blocks/src/blocks/layout/app-query-indicator.tsx b/packages/blocks/src/blocks/layout/app-query-indicator.tsx index 14afa01..1191508 100644 --- a/packages/blocks/src/blocks/layout/app-query-indicator.tsx +++ b/packages/blocks/src/blocks/layout/app-query-indicator.tsx @@ -34,7 +34,7 @@ export function AppQueryIndicator({ className }: { className?: string }) { render={ {icon ? ( - + ) : ( children )} diff --git a/packages/blocks/src/blocks/navigation/mobile-navigation.tsx b/packages/blocks/src/blocks/navigation/mobile-navigation.tsx index 4aba304..0eb6ac8 100644 --- a/packages/blocks/src/blocks/navigation/mobile-navigation.tsx +++ b/packages/blocks/src/blocks/navigation/mobile-navigation.tsx @@ -52,7 +52,7 @@ export function MobileNavigationSheetTrigger({ ) diff --git a/packages/blocks/src/blocks/navigation/nested-navigation.tsx b/packages/blocks/src/blocks/navigation/nested-navigation.tsx index 258c4d5..5dd7c0f 100644 --- a/packages/blocks/src/blocks/navigation/nested-navigation.tsx +++ b/packages/blocks/src/blocks/navigation/nested-navigation.tsx @@ -25,10 +25,10 @@ export function InlineNestedNavigationList({ const hasNestedItems = items.some((item) => !!item.items?.length) const listElement = ( -
+
-
+
{group.items.map((item) => (