@@ -4,14 +4,10 @@ import { useState } from 'react'
44import { File , Folder , Plus } from 'lucide-react'
55import { Button } from '@/components/ui/button'
66import { Dialog , DialogContent , DialogHeader , DialogTitle } from '@/components/ui/dialog'
7- import {
8- DropdownMenu ,
9- DropdownMenuContent ,
10- DropdownMenuItem ,
11- DropdownMenuTrigger ,
12- } from '@/components/ui/dropdown-menu'
137import { Input } from '@/components/ui/input'
148import { Label } from '@/components/ui/label'
9+ import { Popover , PopoverContent , PopoverTrigger } from '@/components/ui/popover'
10+ import { cn } from '@/lib/utils'
1511import { useFolderStore } from '@/stores/folders/store'
1612import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
1713
@@ -24,15 +20,18 @@ export function CreateMenu({ onCreateWorkflow, isCollapsed }: CreateMenuProps) {
2420 const [ showFolderDialog , setShowFolderDialog ] = useState ( false )
2521 const [ folderName , setFolderName ] = useState ( '' )
2622 const [ isCreating , setIsCreating ] = useState ( false )
23+ const [ isHoverOpen , setIsHoverOpen ] = useState ( false )
2724
2825 const { activeWorkspaceId } = useWorkflowRegistry ( )
2926 const { createFolder } = useFolderStore ( )
3027
3128 const handleCreateWorkflow = ( ) => {
29+ setIsHoverOpen ( false )
3230 onCreateWorkflow ( )
3331 }
3432
3533 const handleCreateFolder = ( ) => {
34+ setIsHoverOpen ( false )
3635 setShowFolderDialog ( true )
3736 }
3837
@@ -50,7 +49,6 @@ export function CreateMenu({ onCreateWorkflow, isCollapsed }: CreateMenuProps) {
5049 setShowFolderDialog ( false )
5150 } catch ( error ) {
5251 console . error ( 'Failed to create folder:' , error )
53- // You could add toast notification here
5452 } finally {
5553 setIsCreating ( false )
5654 }
@@ -61,81 +59,61 @@ export function CreateMenu({ onCreateWorkflow, isCollapsed }: CreateMenuProps) {
6159 setShowFolderDialog ( false )
6260 }
6361
64- if ( isCollapsed ) {
65- return (
66- < >
67- < DropdownMenu >
68- < DropdownMenuTrigger asChild >
69- < Button variant = 'ghost' size = 'icon' className = 'h-6 w-6 shrink-0 p-0' title = 'Create' >
70- < Plus className = 'h-[18px] w-[18px] stroke-[2px]' />
71- < span className = 'sr-only' > Create</ span >
72- </ Button >
73- </ DropdownMenuTrigger >
74- < DropdownMenuContent align = 'center' side = 'right' >
75- < DropdownMenuItem onClick = { handleCreateWorkflow } >
76- < File className = 'mr-2 h-4 w-4' />
77- New Workflow
78- </ DropdownMenuItem >
79- < DropdownMenuItem onClick = { handleCreateFolder } >
80- < Folder className = 'mr-2 h-4 w-4' />
81- New Folder
82- </ DropdownMenuItem >
83- </ DropdownMenuContent >
84- </ DropdownMenu >
85-
86- { /* Folder creation dialog */ }
87- < Dialog open = { showFolderDialog } onOpenChange = { setShowFolderDialog } >
88- < DialogContent className = 'sm:max-w-[425px]' >
89- < DialogHeader >
90- < DialogTitle > Create New Folder</ DialogTitle >
91- </ DialogHeader >
92- < form onSubmit = { handleFolderSubmit } className = 'space-y-4' >
93- < div className = 'space-y-2' >
94- < Label htmlFor = 'folder-name' > Folder Name</ Label >
95- < Input
96- id = 'folder-name'
97- value = { folderName }
98- onChange = { ( e ) => setFolderName ( e . target . value ) }
99- placeholder = 'Enter folder name...'
100- autoFocus
101- required
102- />
103- </ div >
104- < div className = 'flex justify-end space-x-2' >
105- < Button type = 'button' variant = 'outline' onClick = { handleCancel } >
106- Cancel
107- </ Button >
108- < Button type = 'submit' disabled = { ! folderName . trim ( ) || isCreating } >
109- { isCreating ? 'Creating...' : 'Create Folder' }
110- </ Button >
111- </ div >
112- </ form >
113- </ DialogContent >
114- </ Dialog >
115- </ >
116- )
117- }
118-
11962 return (
12063 < >
121- < DropdownMenu >
122- < DropdownMenuTrigger asChild >
123- < Button variant = 'ghost' size = 'icon' className = 'h-6 w-6 shrink-0 p-0' title = 'Create' >
124- < Plus className = 'h-[16px] w-[16px] stroke-[2px]' />
64+ < Popover open = { isHoverOpen } >
65+ < PopoverTrigger asChild >
66+ < Button
67+ variant = 'ghost'
68+ size = 'icon'
69+ className = 'h-6 w-6 shrink-0 p-0 focus:outline-none focus-visible:ring-0 focus-visible:ring-offset-0'
70+ title = 'Create'
71+ onClick = { handleCreateWorkflow }
72+ onMouseEnter = { ( ) => setIsHoverOpen ( true ) }
73+ onMouseLeave = { ( ) => setIsHoverOpen ( false ) }
74+ >
75+ < Plus
76+ className = { cn (
77+ 'stroke-[2px]' ,
78+ isCollapsed ? 'h-[18px] w-[18px]' : 'h-[16px] w-[16px]'
79+ ) }
80+ />
12581 < span className = 'sr-only' > Create</ span >
12682 </ Button >
127- </ DropdownMenuTrigger >
128- < DropdownMenuContent align = 'end' >
129- < DropdownMenuItem onClick = { handleCreateWorkflow } >
130- < File className = 'mr-2 h-4 w-4' />
83+ </ PopoverTrigger >
84+ < PopoverContent
85+ align = { isCollapsed ? 'center' : 'end' }
86+ side = { isCollapsed ? 'right' : undefined }
87+ sideOffset = { 0 }
88+ className = { cn (
89+ 'fade-in-0 zoom-in-95 data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95' ,
90+ 'data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2' ,
91+ 'data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2' ,
92+ 'z-50 animate-in overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md' ,
93+ 'data-[state=closed]:animate-out' ,
94+ 'w-40'
95+ ) }
96+ onMouseEnter = { ( ) => setIsHoverOpen ( true ) }
97+ onMouseLeave = { ( ) => setIsHoverOpen ( false ) }
98+ onOpenAutoFocus = { ( e ) => e . preventDefault ( ) }
99+ onCloseAutoFocus = { ( e ) => e . preventDefault ( ) }
100+ >
101+ < button
102+ className = 'flex w-full cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground'
103+ onClick = { handleCreateWorkflow }
104+ >
105+ < File className = 'h-4 w-4' />
131106 New Workflow
132- </ DropdownMenuItem >
133- < DropdownMenuItem onClick = { handleCreateFolder } >
134- < Folder className = 'mr-2 h-4 w-4' />
107+ </ button >
108+ < button
109+ className = 'flex w-full cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground'
110+ onClick = { handleCreateFolder }
111+ >
112+ < Folder className = 'h-4 w-4' />
135113 New Folder
136- </ DropdownMenuItem >
137- </ DropdownMenuContent >
138- </ DropdownMenu >
114+ </ button >
115+ </ PopoverContent >
116+ </ Popover >
139117
140118 { /* Folder creation dialog */ }
141119 < Dialog open = { showFolderDialog } onOpenChange = { setShowFolderDialog } >
0 commit comments