╭ changed ────────────╮ │src/ui/Home/Repos.zig│ ╰─────────────────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ 89 // a leading "previous" row off the first window, one row per repo, then │ │ 90 // a trailing "next" row when more remain. each window row navigates to the │ │ 91 // adjacent window (full reload on web, Nav rebuild on the TUI). │ │ 92 - const lead: usize = if (data.after > 0) 1 else 0; │ │ 93 - const trail: usize = if (data.next_after != null) 1 else 0; │ │ 94 - const lines = try aa.alloc([]const u8, lead + data.repos.len + trail); │ │ 95 - const links = try aa.alloc([]const u8, lead + data.repos.len + trail); │ │ 96 - if (data.after > 0) { │ │ 97 - lines[0] = "← previous"; │ │ 98 - links[0] = try std.fmt.allocPrint(aa, "a:/repos?after={d}", .{data.after -| page_size}); │ │ 99 - } │ │ 92 + var items: std.ArrayList(ui.FlowBox.Item) = .empty; │ │ 93 + if (data.after > 0) │ │ 94 + try items.append(aa, .{ .text = "← previous", .link = try std.fmt.allocPrint(aa, "a:/repos?after={d}", .{data.after -| page_size}) });│ │ 95 for (data.repos, 0..) |repo, i| { │ │101 - lines[lead + i] = try std.fmt.allocPrint(aa, "{s} - {s}", .{ repo.name, repo.description }); │ │ 96 // clicking a repo opens its page; the "a:" prefix makes the web │ │ 97 // renderer emit an <a href="/repo/alice/foo"> anchor. skip the link │ │ 98 // when the owner is unknown so it isn't a dead route. │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ 99 const owner = data.owner_names[i]; │ │106 - links[lead + i] = if (owner.len > 0) try std.fmt.allocPrint(aa, "a:/repo/{s}/{s}", .{ owner, repo.name }) else ""; │ │107 - } │ │108 - if (data.next_after) |next_after| { │ │109 - lines[lead + data.repos.len] = "next →"; │ │110 - links[lead + data.repos.len] = try std.fmt.allocPrint(aa, "a:/repos?after={d}", .{next_after}); │ │100 + try items.append(aa, .{ │ │101 + .text = try std.fmt.allocPrint(aa, "{s} - {s}", .{ repo.name, repo.description }), │ │102 + .link = if (owner.len > 0) try std.fmt.allocPrint(aa, "a:/repo/{s}/{s}", .{ owner, repo.name }) else "", │ │103 + }); │ │104 } │ │112 - try self.list.setItems(allocator, lines, links); │ │105 + if (data.next_after) |next_after| │ │106 + try items.append(aa, .{ .text = "next →", .link = try std.fmt.allocPrint(aa, "a:/repos?after={d}", .{next_after}) });│ │107 + try self.list.setItems(allocator, items.items); │ │108 │ │109 return self; │ │110 } │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯