Local-first remote sync and cross-platform UI parity #2

Merged
joejulian merged 53 commits from feature/local-first-remote-sync into main 2026-04-11 06:15:47 +00:00
3 changed files with 22 additions and 8 deletions
Showing only changes of commit 56a0711860 - Show all commits
+2 -2
View File
@@ -489,10 +489,10 @@ type ui struct {
deleteGroupPath []string deleteGroupPath []string
apiPolicyGroupScope bool apiPolicyGroupScope bool
apiTokenSecret string apiTokenSecret string
phoneSyncMenuAnchor image.Point
phoneMainMenuAnchor image.Point
phoneSyncMenuOrigin image.Point phoneSyncMenuOrigin image.Point
phoneMainMenuOrigin image.Point phoneMainMenuOrigin image.Point
phoneSyncMenuSize image.Point
phoneMainMenuSize image.Point
phoneSyncMenuCall op.CallOp phoneSyncMenuCall op.CallOp
phoneMainMenuCall op.CallOp phoneMainMenuCall op.CallOp
phoneSyncMenuVisible bool phoneSyncMenuVisible bool
+2
View File
@@ -593,6 +593,8 @@ func (u *ui) layout(gtx layout.Context) layout.Dimensions {
u.phoneMainMenuVisible = false u.phoneMainMenuVisible = false
u.phoneSyncMenuOrigin = image.Point{} u.phoneSyncMenuOrigin = image.Point{}
u.phoneMainMenuOrigin = image.Point{} u.phoneMainMenuOrigin = image.Point{}
u.phoneSyncMenuSize = image.Point{}
u.phoneMainMenuSize = image.Point{}
u.phoneSyncMenuCall = op.CallOp{} u.phoneSyncMenuCall = op.CallOp{}
u.phoneMainMenuCall = op.CallOp{} u.phoneMainMenuCall = op.CallOp{}
u.syncHostedAPI() u.syncHostedAPI()
+16 -4
View File
@@ -55,19 +55,19 @@ func (u *ui) headerActions(gtx layout.Context) layout.Dimensions {
} }
if u.syncMenuOpen { if u.syncMenuOpen {
u.phoneSyncMenuVisible = true u.phoneSyncMenuVisible = true
u.phoneSyncMenuAnchor = cluster.Metrics.SyncAnchor().Point()
u.maybeLogHeaderMenuToggle("sync-visible", true) u.maybeLogHeaderMenuToggle("sync-visible", true)
placement, menuCall := compactSurface.Place(gtx, cluster.Metrics.SyncAnchor(), u.syncMenu) placement, menuCall := compactSurface.Place(gtx, cluster.Metrics.SyncAnchor(), u.syncMenu)
u.phoneSyncMenuOrigin = placement.Origin u.phoneSyncMenuOrigin = placement.Origin
u.phoneSyncMenuSize = placement.Size
u.phoneSyncMenuCall = menuCall u.phoneSyncMenuCall = menuCall
u.maybeLogHeaderMenuPlacement("sync-phone", compactSurface, placement) u.maybeLogHeaderMenuPlacement("sync-phone", compactSurface, placement)
} }
if u.mainMenuOpen { if u.mainMenuOpen {
u.phoneMainMenuVisible = true u.phoneMainMenuVisible = true
u.phoneMainMenuAnchor = cluster.Metrics.MainAnchor().Point()
u.maybeLogHeaderMenuToggle("main-visible", true) u.maybeLogHeaderMenuToggle("main-visible", true)
placement, menuCall := compactSurface.Place(gtx, cluster.Metrics.MainAnchor(), u.mainMenu) placement, menuCall := compactSurface.Place(gtx, cluster.Metrics.MainAnchor(), u.mainMenu)
u.phoneMainMenuOrigin = placement.Origin u.phoneMainMenuOrigin = placement.Origin
u.phoneMainMenuSize = placement.Size
u.phoneMainMenuCall = menuCall u.phoneMainMenuCall = menuCall
u.maybeLogHeaderMenuPlacement("main-phone", compactSurface, placement) u.maybeLogHeaderMenuPlacement("main-phone", compactSurface, placement)
} }
@@ -204,13 +204,25 @@ func (u *ui) phoneHeaderMenus(gtx layout.Context) layout.Dimensions {
} }
if u.syncMenuVisibleOnPhone() { if u.syncMenuVisibleOnPhone() {
stack := op.Offset(u.phoneSyncMenuOrigin).Push(gtx.Ops) stack := op.Offset(image.Pt(u.frameInsetPx, u.phoneSyncMenuOrigin.Y)).Push(gtx.Ops)
menuGTX := gtx
menuGTX.Constraints.Min = image.Point{}
menuGTX.Constraints.Max.X = max(0, gtx.Constraints.Max.X-(u.frameInsetPx*2))
layout.E.Layout(menuGTX, func(gtx layout.Context) layout.Dimensions {
u.phoneSyncMenuCall.Add(gtx.Ops) u.phoneSyncMenuCall.Add(gtx.Ops)
return layout.Dimensions{Size: u.phoneSyncMenuSize}
})
stack.Pop() stack.Pop()
} }
if u.mainMenuVisibleOnPhone() { if u.mainMenuVisibleOnPhone() {
stack := op.Offset(u.phoneMainMenuOrigin).Push(gtx.Ops) stack := op.Offset(image.Pt(u.frameInsetPx, u.phoneMainMenuOrigin.Y)).Push(gtx.Ops)
menuGTX := gtx
menuGTX.Constraints.Min = image.Point{}
menuGTX.Constraints.Max.X = max(0, gtx.Constraints.Max.X-(u.frameInsetPx*2))
layout.E.Layout(menuGTX, func(gtx layout.Context) layout.Dimensions {
u.phoneMainMenuCall.Add(gtx.Ops) u.phoneMainMenuCall.Add(gtx.Ops)
return layout.Dimensions{Size: u.phoneMainMenuSize}
})
stack.Pop() stack.Pop()
} }
return layout.Dimensions{Size: gtx.Constraints.Max} return layout.Dimensions{Size: gtx.Constraints.Max}