feat: active heap card in left sidebar with subtle toasts
- New ActiveHeapCard pinned just below the Library header in the left sidebar. Renders null when no heap is active. When one is, shows the heap name + member count + a fan of the last 5 member thumbnails (newest front-and-center, older members rotated ±6°/±18px outward). Clicking the header navigates to the heap via the same navigateToSection pattern HeapsPanel uses. - Stack animates with framer-motion (previously pinned in package.json but unused). New picks spring-slide into the front of the stack by subscribing to the ['heap-photo-ids', heapId] cache that the existing pick mutation already updates optimistically — no new event wiring. Unpicks run the exit transition and the remaining cards re-fan. - Toasts are now subtle: glassy bg-surface/80 + backdrop-blur, thin 2px left accent bar in the type color instead of a full tinted fill, smaller icons and text, tighter padding, truncation on overflow so they stay a single compact row. The colored alert block that was competing with the rest of the UI is gone. - Card lives at the top of the sidebar specifically so the bottom-left toast stack can never occlude it. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -22,6 +22,7 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'
|
||||
import { toast } from '../ToastContainer'
|
||||
import { useFilterStore } from '../../store/filterStore'
|
||||
import { HeapsPanel } from '../heaps/HeapsPanel'
|
||||
import { ActiveHeapCard } from '../heaps/ActiveHeapCard'
|
||||
import { PHOTO_DRAG_MIME } from '../timeline/PhotoThumbnail'
|
||||
import { useFolderTreeQuery } from '../../hooks/useFolderTreeQuery'
|
||||
import { useTagsQuery } from '../../hooks/useTagsQuery'
|
||||
@@ -668,6 +669,11 @@ export function LeftSidebar({ onCollapse, onOpenSettings }: LeftSidebarProps) {
|
||||
<PanelLeftClose className="h-4 w-4" />
|
||||
</button>
|
||||
</div>
|
||||
{/* Active heap card — pinned just below the Library header so
|
||||
* toasts (bottom-left fixed) can't cover it. Returns null when
|
||||
* no heap is active, so the layout collapses cleanly. */}
|
||||
<ActiveHeapCard />
|
||||
|
||||
{/* Tree View */}
|
||||
<div className="flex-1 overflow-y-auto py-2">
|
||||
{libraryTree.map((item) => renderTreeItem(item))}
|
||||
|
||||
Reference in New Issue
Block a user