feat(web): replace the sidebar with a full-width top bar

- One top bar for every screen size: feeds as chips with unread counts,
  Focus mode, theme, add feed, and a menu for managing feeds, OPML export
  and logout. The article grid now uses the full page width.
- New "Mes flux" dialog to rename or delete feeds (was hidden behind
  hover actions in the sidebar); feeds that fail to update are flagged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Antigravity AgentandClaude Opus 5.5 committed 2026-10-09 08:29:38 +02:00
1 parent 8277c28f68
commit 8bc74b4f52
6 files changed
+300 -316

No files matched your search

+6 -17
View File
@@ -1,7 +1,6 @@
import { Suspense, useState } from 'react';
import { lazyNamed } from '../lib/lazy';
import { Sidebar } from '../components/Sidebar';
import { MobileTopBar } from '../components/MobileTopBar';
import { TopBar } from '../components/TopBar';
import { DashboardPage } from '../pages/DashboardPage';
import { useWebsocket } from '../hooks/useWebsocket';
@@ -16,25 +15,15 @@ export function RootLayout() {
useWebsocket();
return (
<div className="flex h-dvh bg-carbon overflow-hidden">
<div className="flex flex-col h-dvh bg-carbon overflow-hidden">
<a href="#main-content" className="sr-only focus:not-sr-only focus:fixed focus:top-2 focus:left-2 focus:z-[80] btn-primary">
Aller au contenu
</a>
<Sidebar
onSelectFeed={setSelectedFeedId}
selectedFeedId={selectedFeedId}
onEnterFocus={() => setIsFocusMode(true)}
isFocusMode={isFocusMode}
/>
{!isFocusMode && (
<TopBar selectedFeedId={selectedFeedId} onSelectFeed={setSelectedFeedId} onEnterFocus={() => setIsFocusMode(true)} />
)}
<div id="main-content" className="flex-1 flex flex-col min-w-0">
{!isFocusMode && (
<MobileTopBar
onSelectFeed={setSelectedFeedId}
selectedFeedId={selectedFeedId}
onEnterFocus={() => setIsFocusMode(true)}
/>
)}
<div id="main-content" className="flex-1 flex flex-col min-h-0">
{/* Kept mounted in focus mode so the list keeps its scroll position. */}
<DashboardPage selectedFeedId={selectedFeedId} hidden={isFocusMode} />
</div>