Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,16 @@ Format: weekly entries grouped by feature area.

---

## 2026-04-11 — Settings Modal Scroll Fix and Sidebar Action Reorder

### Changed
- Move search and new-note actions to the top of the sidebar for faster access

### Fixed
- Restore scrolling inside the Settings modal so long sections (Shortcuts, Account, etc.) are fully reachable when the window is short — the Radix `DialogContent` grid layout was preventing nested `ScrollArea` from computing a bounded height

---

## 2026-04-09 — Sync Adapter Registry and Architecture Reset

### Added
Expand Down
52 changes: 24 additions & 28 deletions apps/desktop/src/renderer/src/components/app-sidebar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -284,34 +284,6 @@ function AppSidebarInner({ currentPage, viewCounts, ...props }: AppSidebarProps)
// Main sidebar content (shown when not drilling down)
const mainContent = (
<>
{/* FIXED SECTION - Quick Actions (doesn't scroll) */}
<div className="flex-shrink-0">
{/* Quick Actions: Search & New (side by side) */}
<div className="flex items-center gap-1.5 px-3 pt-1 pb-0 group-data-[collapsible=icon]:px-1.5 group-data-[collapsible=icon]:justify-center">
<button
type="button"
onClick={() => window.dispatchEvent(new CustomEvent('memry:open-search'))}
className="flex flex-1 items-center gap-2 rounded-[5px] bg-sidebar-surface py-[6px] px-2.5 cursor-pointer hover:bg-black/[0.06] dark:hover:bg-white/[0.06] transition-colors group-data-[collapsible=icon]:flex-none group-data-[collapsible=icon]:size-8 group-data-[collapsible=icon]:justify-center group-data-[collapsible=icon]:p-0"
>
<Search className="size-[14px] text-muted-foreground/70 shrink-0" />
<span className="text-[13px] text-muted-foreground/70 font-normal group-data-[collapsible=icon]:hidden">
Search
</span>
<span className="ml-auto font-mono text-[9px] text-sidebar-muted/50 bg-sidebar-border rounded-[3px] px-1 py-0.5 group-data-[collapsible=icon]:hidden">
⌘K
</span>
</button>
<button
type="button"
onClick={handleNewNote}
className="flex items-center justify-center size-[30px] rounded-[5px] bg-sidebar-surface hover:bg-black/[0.06] dark:hover:bg-white/[0.06] transition-colors cursor-pointer shrink-0 group-data-[collapsible=icon]:hidden"
title="New note (⌘N)"
>
<Plus className="size-[15px] text-muted-foreground/70" />
</button>
</div>
</div>

{/* Separator between nav and collections */}
<div className="h-px bg-sidebar-border shrink-0 mx-3 my-2 group-data-[collapsible=icon]:mx-1.5" />

Expand Down Expand Up @@ -438,6 +410,30 @@ function AppSidebarInner({ currentPage, viewCounts, ...props }: AppSidebarProps)
<Sidebar collapsible="icon" {...props}>
<SidebarHeaderContent />
<SidebarContent className="flex flex-col overflow-hidden gap-0">
{/* Quick Actions: Search & New — persistent, stays visible during drill-down */}
<div className="shrink-0 flex items-center gap-1.5 px-3 pt-2 pb-0 group-data-[collapsible=icon]:px-1.5 group-data-[collapsible=icon]:justify-center">
<button
type="button"
onClick={() => window.dispatchEvent(new CustomEvent('memry:open-search'))}
className="flex flex-1 items-center gap-2 rounded-[5px] bg-sidebar-surface py-[6px] px-2.5 cursor-pointer hover:bg-black/[0.06] dark:hover:bg-white/[0.06] transition-colors group-data-[collapsible=icon]:flex-none group-data-[collapsible=icon]:size-8 group-data-[collapsible=icon]:justify-center group-data-[collapsible=icon]:p-0"
>
<Search className="size-[14px] text-muted-foreground/70 shrink-0" />
<span className="text-[13px] text-muted-foreground/70 font-normal group-data-[collapsible=icon]:hidden">
Search
</span>
<span className="ml-auto font-mono text-[9px] text-sidebar-muted/50 bg-sidebar-border rounded-[3px] px-1 py-0.5 group-data-[collapsible=icon]:hidden">
⌘K
</span>
</button>
<button
type="button"
onClick={handleNewNote}
className="flex items-center justify-center size-[30px] rounded-[5px] bg-sidebar-surface hover:bg-black/[0.06] dark:hover:bg-white/[0.06] transition-colors cursor-pointer shrink-0 group-data-[collapsible=icon]:hidden"
title="New note (⌘N)"
>
<Plus className="size-[15px] text-muted-foreground/70" />
</button>
</div>
<SidebarNav
items={mainNav}
isActive={isActiveItem}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ export function SettingsModal() {

return (
<Dialog open={isOpen} onOpenChange={(open) => !open && close()}>
<DialogContent className="max-w-[76rem] h-[80vh] p-0 gap-0 overflow-hidden">
<DialogContent className="max-w-[76rem] h-[80vh] p-0 gap-0 overflow-hidden flex flex-col">
<DialogTitle className="sr-only">Settings</DialogTitle>
<SettingsPage />
</DialogContent>
Expand Down
6 changes: 3 additions & 3 deletions apps/desktop/src/renderer/src/pages/settings.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,8 @@ export function SettingsPage() {
}, [])

return (
<div className="h-full flex">
<div className="w-60 shrink-0 pt-5 pb-4 bg-sidebar border-r border-border text-xs/4 font-[family-name:var(--font-sans)]">
<div className="flex-1 min-h-0 flex">
<div className="w-60 shrink-0 pt-5 pb-4 overflow-y-auto min-h-0 bg-sidebar border-r border-border text-xs/4 font-[family-name:var(--font-sans)]">
<div className="flex items-center pb-4 px-5">
<span className="text-sm/4.5 font-semibold text-foreground tracking-[-0.01em]">
Settings
Expand Down Expand Up @@ -165,7 +165,7 @@ export function SettingsPage() {
</SettingsNavGroup>
</div>

<div className="flex-1 overflow-hidden">
<div className="flex-1 min-h-0 overflow-hidden">
<ScrollArea className="h-full">
<div className="p-6 max-w-3xl mx-auto">
{activeSection === 'general' && <GeneralSettings />}
Expand Down
7 changes: 4 additions & 3 deletions apps/sync-server/src/services/sync-telemetry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ type SyncDomain =
| 'filters'
| 'attachments'
| 'tags'
| 'folders'

const logger = createLogger('SyncTelemetry')

Expand Down Expand Up @@ -43,6 +44,8 @@ const toSyncDomain = (itemType: SyncItemType): SyncDomain => {
return 'attachments'
case 'tag_definition':
return 'tags'
case 'folder_config':
return 'folders'
}
}

Expand All @@ -65,9 +68,7 @@ const summarizeItemTypes = (itemTypes: SyncItemType[]): Partial<Record<SyncDomai
return summary
}

const summarizeDomainTypes = (
itemTypes: SyncItemType[]
): Partial<Record<SyncItemType, number>> => {
const summarizeDomainTypes = (itemTypes: SyncItemType[]): Partial<Record<SyncItemType, number>> => {
const summary: Partial<Record<SyncItemType, number>> = {}
for (const itemType of itemTypes) {
summary[itemType] = (summary[itemType] ?? 0) + 1
Expand Down
Loading