feat: small improvements

This commit is contained in:
2026-03-16 22:49:29 +01:00
parent 96cb3701ba
commit bc67d01bc2
3 changed files with 25 additions and 20 deletions

View File

@@ -98,7 +98,7 @@ export function KosmosSidebar() {
) : ( ) : (
<SidebarMenuButton asChild size="lg" tooltip="Zoë" className="font-semibold font-serif"> <SidebarMenuButton asChild size="lg" tooltip="Zoë" className="font-semibold font-serif">
<Link to="/recollections"> <Link to="/recollections">
<span className="flex size-8 min-w-8 items-center justify-center rounded-lg bg-sidebar-primary text-sidebar-primary-foreground dark:bg-white dark:text-black"> <span className="flex size-8 min-w-8 items-center justify-center rounded-lg dark:bg-white dark:text-black">
<span <span
className="size-6 shrink-0 rounded-[2px] opacity-90" className="size-6 shrink-0 rounded-[2px] opacity-90"
style={{ style={{

View File

@@ -222,22 +222,21 @@ export function RecollectionSidebar() {
className="flex h-full w-[var(--sidebar-width)] shrink-0 flex-col border-r border-sidebar-border bg-sidebar text-sidebar-foreground" className="flex h-full w-[var(--sidebar-width)] shrink-0 flex-col border-r border-sidebar-border bg-sidebar text-sidebar-foreground"
style={{ '--sidebar-width': '16rem' } as React.CSSProperties} style={{ '--sidebar-width': '16rem' } as React.CSSProperties}
> >
<div className="flex shrink-0 items-center justify-between border-b border-sidebar-border px-2 py-2"> <SidebarContent className="flex-1 overflow-y-auto border-0 bg-transparent">
<span className="text-xs font-medium text-sidebar-foreground/70">Pages</span> <SidebarGroup>
<div className="flex items-center justify-between gap-2 px-2 py-1.5">
<SidebarGroupLabel className="py-0">Logos</SidebarGroupLabel>
<Button <Button
type="button" type="button"
variant="ghost" variant="ghost"
size="sm" size="sm"
className="h-7 gap-1 px-2 text-xs text-sidebar-foreground hover:bg-sidebar-accent hover:text-sidebar-accent-foreground" className="h-6 gap-1 px-1.5 text-xs text-sidebar-foreground hover:bg-sidebar-accent hover:text-sidebar-accent-foreground"
onClick={addPage} onClick={addPage}
> >
<Plus className="size-3.5" /> <Plus className="size-3.5" />
New page New page
</Button> </Button>
</div> </div>
<SidebarContent className="flex-1 overflow-y-auto border-0 bg-transparent">
<SidebarGroup>
<SidebarGroupLabel>Logos</SidebarGroupLabel>
<SidebarGroupContent> <SidebarGroupContent>
<SidebarMenu> <SidebarMenu>
{pages.length === 0 ? ( {pages.length === 0 ? (

View File

@@ -63,7 +63,8 @@ export function RecollectionSidebarProvider({ children }: { children: React.Reac
[recollectionId] [recollectionId]
) )
// Load page tree and run migration when empty (treat existing single doc as "Main" page). // Load page tree from storage only when recollection changes (not on every searchParams change).
// Otherwise adding a new page would trigger searchParams change and this would overwrite tree before persist.
useEffect(() => { useEffect(() => {
if (!recollectionId) return if (!recollectionId) return
let t = getLogosPageTree(recollectionId) let t = getLogosPageTree(recollectionId)
@@ -75,15 +76,20 @@ export function RecollectionSidebarProvider({ children }: { children: React.Reac
t = [main] t = [main]
} }
setTree(t) setTree(t)
}, [recollectionId])
// Sync activePageId from URL when searchParams or tree changes (e.g. after adding a page).
useEffect(() => {
if (!recollectionId) return
const pageFromUrl = searchParams.get('page') const pageFromUrl = searchParams.get('page')
const validIdFromUrl = pageFromUrl && t.some((p) => p.id === pageFromUrl) ? pageFromUrl : null
setActivePageId((prev) => { setActivePageId((prev) => {
const validIdFromUrl = pageFromUrl && tree.some((p) => p.id === pageFromUrl) ? pageFromUrl : null
if (validIdFromUrl) return validIdFromUrl if (validIdFromUrl) return validIdFromUrl
const firstId = t[0]?.id ?? null const firstId = tree[0]?.id ?? null
if (prev != null && t.some((p) => p.id === prev)) return prev if (prev != null && tree.some((p) => p.id === prev)) return prev
return firstId return firstId
}) })
}, [recollectionId, searchParams]) }, [recollectionId, searchParams, tree])
// Persist tree when sidebar changes it. // Persist tree when sidebar changes it.
useEffect(() => { useEffect(() => {