Skip to content

Commit ebff52d

Browse files
committed
Better Folder UI
1 parent d773f82 commit ebff52d

File tree

1 file changed

+69
-48
lines changed

1 file changed

+69
-48
lines changed

src/components/doclist/DocumentFolder.tsx

Lines changed: 69 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { useState, DragEvent } from 'react';
2-
import { Button } from '@headlessui/react';
2+
import { Button, Transition } from '@headlessui/react';
33
import { DocumentListItem } from './DocumentListItem';
44
import { 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

Comments
 (0)