Skip to content

Commit 127185c

Browse files
fix(drive): nav docs link, spaces right-click, empty-area menu, focus ring
- Documentation is back in the vertical nav bar. - Right-click now works on the "Mes Espaces" list: empty area → New space, a space card → open / delete. - The empty area BELOW a short file list is now right-clickable (the list/ grid fills a min-height), so the background menu opens instead of the browser's default one; the empty-folder state is covered too. - Removed the stray white focus outline on file/space name buttons (kept a subtle accent ring for keyboard-only focus).
1 parent c993f7c commit 127185c

2 files changed

Lines changed: 24 additions & 7 deletions

File tree

apps/web/src/app/(app)/drive/page.tsx

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1560,8 +1560,12 @@ export default function EspacesPage() {
15601560
}
15611561

15621562
if (!activeSpaceId) {
1563+
const spaceBgMenu: MenuItem[] = [{ label: t('drive.newSpace'), icon: Plus, onClick: () => void createSpace() }];
15631564
return (
1564-
<div className="space-y-6">
1565+
<div
1566+
className="min-h-[70vh] space-y-6"
1567+
onContextMenu={(ev) => openCtx(ev, spaceBgMenu)}
1568+
>
15651569
<Header title={t('drive.title')} subtitle={t('drive.subtitle')}>
15661570
<button className="btn-primary" onClick={createSpace}>
15671571
<Plus size={16} /> {t('drive.newSpace')}
@@ -1576,8 +1580,14 @@ export default function EspacesPage() {
15761580
<div
15771581
key={s.id}
15781582
className="card group relative flex items-center gap-4 text-left transition hover:border-accent/40 hover:bg-white/[0.04]"
1583+
onContextMenu={(ev) =>
1584+
openCtx(ev, [
1585+
{ label: t('drive.open'), icon: Folder, onClick: () => void enterSpace(s) },
1586+
{ label: t('drive.deleteSpaceAction'), icon: Trash2, danger: true, onClick: () => deleteSpace(s) },
1587+
])
1588+
}
15791589
>
1580-
<button onClick={() => enterSpace(s)} className="flex min-w-0 flex-1 items-center gap-4 text-left">
1590+
<button onClick={() => enterSpace(s)} className="flex min-w-0 flex-1 items-center gap-4 rounded-lg text-left focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-accent/50">
15811591
<span
15821592
className={`grid h-12 w-12 shrink-0 place-items-center rounded-xl ${
15831593
s.isZeroKnowledge
@@ -1606,6 +1616,7 @@ export default function EspacesPage() {
16061616
{paletteOpen && <CommandPalette items={paletteItems} onSearch={searchFiles} onClose={() => setPaletteOpen(false)} />}
16071617
{helpOpen && <ShortcutsHelp onClose={() => setHelpOpen(false)} />}
16081618
{viewing && <FileViewer source={viewing} onClose={() => setViewing(null)} />}
1619+
{ctxMenu && <ContextMenu x={ctxMenu.x} y={ctxMenu.y} items={ctxMenu.items} onClose={() => setCtxMenu(null)} />}
16091620
</div>
16101621
);
16111622
}
@@ -1699,10 +1710,12 @@ export default function EspacesPage() {
16991710
</button>
17001711
</Empty>
17011712
) : entries.length === 0 ? (
1702-
<Empty icon={Upload} title={t('drive.emptyFolderTitle')} hint={t('drive.emptyFolderHint')} />
1713+
<div className="min-h-[55vh]" onContextMenu={(ev) => !needPass && openCtx(ev, backgroundMenuItems())}>
1714+
<Empty icon={Upload} title={t('drive.emptyFolderTitle')} hint={t('drive.emptyFolderHint')} />
1715+
</div>
17031716
) : view === 'grid' ? (
17041717
<div
1705-
className="grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-4"
1718+
className="grid min-h-[55vh] grid-cols-2 content-start gap-3 sm:grid-cols-3 lg:grid-cols-4"
17061719
onContextMenu={(ev) => !needPass && openCtx(ev, backgroundMenuItems())}
17071720
>
17081721
{entries.map((e) => (
@@ -1720,7 +1733,7 @@ export default function EspacesPage() {
17201733
))}
17211734
</div>
17221735
) : (
1723-
<div className="space-y-2" onContextMenu={(ev) => !needPass && openCtx(ev, backgroundMenuItems())}>
1736+
<div className="min-h-[55vh] space-y-2" onContextMenu={(ev) => !needPass && openCtx(ev, backgroundMenuItems())}>
17241737
{/* column headers */}
17251738
<div className="flex items-center gap-3 px-3 text-xs text-zinc-500">
17261739
<button className="flex items-center gap-1 hover:text-zinc-300" onClick={() => toggleSort('name')}>
@@ -1745,7 +1758,10 @@ export default function EspacesPage() {
17451758
{...pressProps(e)}
17461759
className={`row cursor-default ${selected.has(e.key) ? 'bg-accent/[0.08] ring-1 ring-inset ring-accent/40' : ''}`}
17471760
>
1748-
<button className="flex min-w-0 flex-1 items-center gap-3 text-left" onClick={(ev) => onNameClick(ev, e)}>
1761+
<button
1762+
className="flex min-w-0 flex-1 items-center gap-3 rounded-md text-left focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-accent/50"
1763+
onClick={(ev) => onNameClick(ev, e)}
1764+
>
17491765
{rowIcon(e, isZk)}
17501766
<span className="truncate font-medium text-zinc-100">{e.name}</span>
17511767
</button>

apps/web/src/app/(app)/layout.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import Link from 'next/link';
44
import { usePathname, useRouter } from 'next/navigation';
55
import { useEffect, useState } from 'react';
6-
import { FolderLock, Users, Share2, Globe, Settings, ShieldCheck, LogOut, Menu, X, Trash2 } from 'lucide-react';
6+
import { FolderLock, Users, Share2, Globe, Settings, ShieldCheck, LogOut, Menu, X, Trash2, BookOpen } from 'lucide-react';
77
import { useAuth } from '@/lib/auth';
88
import { useT } from '@/lib/i18n';
99
import { Wordmark } from '@/components/Wordmark';
@@ -21,6 +21,7 @@ const NAV = [
2121
{ href: '/shares', labelKey: 'nav.shares', icon: Share2 },
2222
{ href: '/remote', labelKey: 'nav.remote', icon: Globe },
2323
{ href: '/trash', labelKey: 'nav.trash', icon: Trash2 },
24+
{ href: '/docs', labelKey: 'nav.docs', icon: BookOpen },
2425
];
2526

2627
export default function AppLayout({ children }: { children: React.ReactNode }) {

0 commit comments

Comments
 (0)