11import { useState , DragEvent } from 'react' ;
2- import { Button } from '@headlessui/react' ;
2+ import { Button , Transition } from '@headlessui/react' ;
33import { DocumentListItem } from './DocumentListItem' ;
44import { Folder , DocumentListDocument } from '@/types/documents' ;
55
@@ -62,56 +62,77 @@ export function DocumentFolder({
6262 if ( ! draggedDoc || draggedDoc . folderId ) return ;
6363 onDrop ( e , folder . id ) ;
6464 } }
65- className = { `rounded-lg p-2 transition-all bg-offbase shadow hover:shadow-md ${
66- isDropTarget ? 'ring-2 ring-accent bg-primary/10' : ''
67- } `}
65+ className = { `overflow-hidden rounded-lg transition-all bg-offbase shadow hover:shadow-md ${ isDropTarget ? 'ring-2 ring-accent' : '' } ` }
6866 >
69- < div className = { `flex items-center justify-between ${ isCollapsed ? 'mb-0' : 'mb-2' } ` } >
70- < div className = "flex items-center" >
71- < h3 className = "text-lg px-1 font-semibold" > { folder . name } </ h3 >
72- < Button
73- onClick = { onDelete }
74- className = "p-1 text-muted hover:text-red-500 hover:bg-red-50 rounded-lg transition-colors"
75- aria-label = "Delete folder"
76- >
77- < svg className = "w-4 h-4" fill = "none" stroke = "currentColor" viewBox = "0 0 24 24" >
78- < path strokeLinecap = "round" strokeLinejoin = "round" strokeWidth = "2" d = "M6 18L18 6M6 6l12 12" />
79- </ svg >
80- </ Button >
67+ < div className = 'flex flex-row justify-between p-2' >
68+ < div className = "w-full" >
69+ < div className = { `flex items-center justify-between ${ isCollapsed ? 'mb-0' : 'mb-2' } transition-all duration-200` } >
70+ < div className = "flex items-center" >
71+ < h3 className = "text-lg px-1 font-semibold" > { folder . name } </ h3 >
72+ < Button
73+ onClick = { ( ) => onToggleCollapse ( folder . id ) }
74+ className = "transform transition-transform duration-200 ease-in-out hover:scale-[1.09] hover:font-semibold hover:text-accent"
75+ aria-label = { isCollapsed ? "Expand folder" : "Collapse folder" }
76+ >
77+ < ChevronIcon
78+ className = { `w-5 h-5 transform transition-transform duration-300 ease-in-out ${ isCollapsed ? '-rotate-180' : '' } ` }
79+ />
80+ </ Button >
81+ </ div >
82+ < Button
83+ onClick = { onDelete }
84+ className = "p-1 text-muted hover:text-red-500 hover:bg-red-50 rounded-lg transition-colors"
85+ aria-label = "Delete folder"
86+ >
87+ < svg className = "w-4 h-4"
88+ fill = "none" stroke = "currentColor" viewBox = "0 0 24 24" >
89+ < path strokeLinecap = "round" strokeLinejoin = "round" strokeWidth = "2" d = "M6 18L18 6M6 6l12 12" />
90+ </ svg >
91+ </ Button >
92+ </ div >
93+
94+ < div className = "relative" >
95+ < Transition
96+ show = { ! isCollapsed }
97+ enter = "transition-all duration-300 ease-out"
98+ enterFrom = "transform scale-y-0 opacity-0 max-h-0"
99+ enterTo = "transform scale-y-100 opacity-100 max-h-[1000px]"
100+ leave = "transition-all duration-200 ease-in"
101+ leaveFrom = "transform scale-y-100 opacity-100 max-h-[1000px]"
102+ leaveTo = "transform scale-y-0 opacity-0 max-h-0"
103+ >
104+ < div className = "space-y-2 origin-top" >
105+ { sortedDocuments . map ( doc => (
106+ < DocumentListItem
107+ key = { `${ doc . type } -${ doc . id } ` }
108+ doc = { doc }
109+ onDelete = { onDocumentDelete }
110+ dragEnabled = { false } // Documents in folders can't be dragged to other documents
111+ onDragStart = { onDragStart }
112+ onDragEnd = { onDragEnd }
113+ isDropTarget = { false }
114+ />
115+ ) ) }
116+ </ div >
117+ </ Transition >
118+
119+ < Transition
120+ show = { isCollapsed }
121+ enter = "transition-all duration-200"
122+ enterFrom = "max-h-0 opacity-0"
123+ enterTo = "max-h-[50px] opacity-100"
124+ leave = "transition-all duration-100"
125+ leaveFrom = "max-h-[50px] opacity-100"
126+ leaveTo = "max-h-0 opacity-0"
127+ >
128+ < p className = "text-xs px-1 text-left text-muted" >
129+ { ( calculateFolderSize ( sortedDocuments ) / 1024 / 1024 ) . toFixed ( 2 ) } MB
130+ { ` • ${ sortedDocuments . length } ${ sortedDocuments . length === 1 ? 'file' : 'files' } ` }
131+ </ p >
132+ </ Transition >
133+ </ div >
81134 </ div >
82- < Button
83- onClick = { ( ) => onToggleCollapse ( folder . id ) }
84- className = "p-1 hover:bg-offbase rounded-lg transition-colors"
85- aria-label = { isCollapsed ? "Expand folder" : "Collapse folder" }
86- >
87- < ChevronIcon
88- className = { `w-5 h-5 transform transition-transform ${ isCollapsed ? 'rotate-180' : '' } ` }
89- />
90- </ Button >
91135 </ div >
92-
93- { ! isCollapsed && (
94- < div className = "space-y-2" >
95- { sortedDocuments . map ( doc => (
96- < DocumentListItem
97- key = { `${ doc . type } -${ doc . id } ` }
98- doc = { doc }
99- onDelete = { onDocumentDelete }
100- dragEnabled = { false } // Documents in folders can't be dragged to other documents
101- onDragStart = { onDragStart }
102- onDragEnd = { onDragEnd }
103- isDropTarget = { false }
104- />
105- ) ) }
106- </ div >
107- ) }
108-
109- { isCollapsed && (
110- < p className = "text-xs px-1 text-left text-muted" >
111- { ( calculateFolderSize ( sortedDocuments ) / 1024 / 1024 ) . toFixed ( 2 ) } MB
112- { ` • ${ sortedDocuments . length } ${ sortedDocuments . length === 1 ? 'file' : 'files' } ` }
113- </ p >
114- ) }
115136 </ div >
116137 ) ;
117138}
0 commit comments