╭──────────╮ │← previous│ ╰──────────╯ ╭ changed ─╮ │src/ui.zig│ ╰──────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────╮ │1006 // port the web UI is served on, for the TUI/SSH footer's "http://localhost:<port>..."│ │1007 // url. null on the web itself (no footer there). │ │1008 web_port: ?u16 = null, │ │ 971 - // a host operation requested by a widget. terminals present copyable text on │ │ 972 - // their restored screen; wasm asks the browser to copy them. │ │1009 + // a host operation requested by a widget │ │1010 host_request: ?HostRequest = null, │ │1011 quit_requested: bool = false, │ │1012 │ ╰────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────╮ │1013 pub const HostRequest = union(enum) {│ │1014 show_copyable_text: []const u8, │ │1015 + sync_events, │ │1016 }; │ │1017 │ │1018 const Self = @This(); │ ╰───────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────╮ │1024 user_name: ?[]const u8 = null, │ │1025 // a transient outcome to surface from the last /login POST attempt│ │1026 login_failure: ?Home.Auth.Login.Failure = null, │ │1027 + // a transient local event-sync error │ │1028 + sync_failure: ?[]const u8 = null, │ │1029 current_page: RoutablePage = .default, │ │1030 // whether to render the ANSI art backdrop │ │1031 enable_ansi: bool = true, │ ╰─────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1199 term.setActive(&terminal); │ │1200 last_size = .{ .width = 0, .height = 0 }; │ │1201 }, │ │1202 + .sync_events => { │ │1203 + try nav.root.build(allocator, .{ │ │1204 + .min_size = .{ .width = null, .height = null }, │ │1205 + .max_size = .{ .width = last_size.width, .height = last_size.height },│ │1206 + }, nav.root.getFocus()); │ │1207 + _ = try terminal.render(&nav.root, &last_grid, &last_size); │ │1208 + try Repo.Events.performSync(allocator, session); │ │1209 + }, │ │1210 } │ │1211 } │ │1212 │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────╮ │1460 │ │1461 session.page_arena = arena; │ │1462 │ │1463 + const route = session.data.current_page; │ │1464 const page = try arena.allocator().create(Page); │ │1416 - page.* = try Page.init(arena, session, self.route); │ │1465 + page.* = try Page.init(arena, session, route); │ │1466 const new_root = try initRoot(allocator, page, session);│ │1467 │ │1468 self.root.deinit(allocator); │ ╰──────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────╮ │1469 freeArena(allocator, self.arena);│ │1470 self.root = new_root; │ │1471 + self.route = route; │ │1472 self.arena = arena; │ │1473 } │ │1474 return; │ ╰───────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────╮ │1618 repo_commits: Repo.Commits.View, │ │1619 repo_refs: Repo.Refs.View, │ │1620 repo_issues: Repo.Issues.View, │ │1621 + repo_events_header: Repo.Events.Header.View,│ │1622 + repo_events: Repo.Events.View, │ │1623 repo_comment: Repo.Comment.Item, │ │1624 clone_url: CloneUrl.View, │ │1625 home_users: Home.Users.View, │ ╰──────────────────────────────────────────────────────╯ ╭ changed ──────╮ │src/ui/Repo.zig│ ╰───────────────╯ ╭──────────────────────────────────────────────────────╮ │17 pub const Refs = @import("./Repo/Refs.zig"); │ │18 pub const Issues = @import("./Repo/Issues.zig"); │ │19 pub const Comment = @import("./Repo/Comment.zig");│ │20 +pub const Events = @import("./Repo/Events.zig"); │ │21 pub const Settings = @import("./Settings.zig"); │ │22 pub const Auth = @import("./Auth.zig"); │ │23 pub const Quit = @import("./Quit.zig"); │ ╰──────────────────────────────────────────────────────╯ ╭───────────────────────╮ │30 commits: Commits, │ │31 refs: Refs, │ │32 issues: Issues, │ │33 +events: Events, │ │34 settings: Settings,│ │35 auth: Auth, │ │36 quit: Quit, │ ╰───────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────╮ │126 const issues_comments_start: usize = switch (route) { │ │127 .repo_issues => |i| i.comments_start, │ │128 else => 0, │ │129 + }; │ │130 + const events_kind: ?evt.EventKind = switch (route) { │ │131 + .repo_events => |e| e.kind, │ │132 + else => null, │ │133 + }; │ │134 + const events_selected: []const u8 = switch (route) { │ │135 + .repo_events => |*e| e.selected.slice(), │ │136 + else => "", │ │137 }; │ │138 │ │139 // where the on-disk repo lives (null keeps the views' empty fallback), plus│ ╰─────────────────────────────────────────────────────────────────────────────────────╯ ╭──────╮ │next →│ ╰──────╯