╭──────────╮ │← previous│ ╰──────────╯ ╭ changed ─────────────╮ │src/ui/User/Header.zig│ ╰──────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────╮ │263 for (tabs_box.children.keys(), tabs_box.children.values()) |id, *child| { │ │264 const tb: ?*wgt.TextBox = switch (child.widget) { │ │265 .text_box => |*x| x, │ │267 - .auth_tab => |*at| blk: { │ │268 - // the label tracks login state per frame, so the width must too│ │269 - child.min_size = .{ .width = at.minWidth(), .height = null }; │ │270 - break :blk &at.text_box; │ │271 - }, │ │266 else => null, │ │267 }; │ │268 if (tb) |t| ui.widget.markSelected(t, selected_tab == id); │ ╰─────────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ────────╮ │src/ui/widget.zig│ ╰─────────────────╯ ╭─────────────────────────────────────────────────────────────────────────╮ │68 patch_source: ui.Repo.Patches.Source, │ │69 home_about: ui.Home.About.View, │ │70 home_users: ui.Home.Users.View, │ │71 - auth_tab: ui.Home.Header.AuthTab.View, │ │71 new_repo: ui.NewRepo.View, │ │72 new_user: ui.NewUser.View, │ │74 - home_auth: ui.Home.Auth.View, │ │75 - auth_login: ui.Home.Auth.Login.View, │ │76 - auth_logout: ui.Home.Auth.Logout.View, │ │73 + user_login: ui.UserLogin.View, │ │74 + user_logout: ui.UserLogout.View, │ │75 footer: Footer, │ │76 │ │77 pub fn deinit(self: *Widget, allocator: std.mem.Allocator) void {│ ╰─────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │113 // whether moving up should return to the page header │ │114 pub fn atTop(self: *Widget, root_focus: *Focus) bool { │ │115 return switch (self.*) { │ │118 - inline .home_about, .home_users, .user_repos, .flow_box_scroll, .new_repo, .new_user, .auth_login, .auth_logout, .quit, .repo_files, .repo_commits, .diff_view, .repo_refs, .repo_issues, .repo_patches, .repo_discussions, .repo_events, .repo_undo => |*view| view.atTop(),│ │119 - inline .home_auth, .repo_patch_detail => |*view| view.atTop(root_focus), │ │116 + inline .home_about, .home_users, .user_repos, .flow_box_scroll, .new_repo, .new_user, .user_login, .user_logout, .quit, .repo_files, .repo_commits, .diff_view, .repo_refs, .repo_issues, .repo_patches, .repo_discussions, .repo_events, .repo_undo => |*view| view.atTop(),│ │117 + inline .repo_patch_detail => |*view| view.atTop(root_focus), │ │118 else => false, │ │119 }; │ │120 } │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ added ─────────────╮ │src/ui/UserLogin.zig│ ╰────────────────────╯ ╭ added ──────────────╮ │src/ui/UserLogout.zig│ ╰─────────────────────╯ ╭ changed ──╮ │src/web.zig│ ╰───────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │363 const result = try evt.User.verifyCredentials(evt.AdminDB, evt.admin_repo_opts.hash, haxy_moment, &arena, username, password);│ │364 │ │365 // on success, return to the page the login came from (base, or "/" at the │ │366 - // root); on failure, stay on its auth tab to surface the error. │ │366 + // root); on failure, stay on its user tab to surface the error. │ │367 const success_location: []const u8 = if (base.len == 0) "/" else base; │ │368 - const failure_location = try std.fmt.allocPrint(arena.allocator(), "{s}/auth", .{base}); │ │368 + const failure_location = try std.fmt.allocPrint(arena.allocator(), "{s}/user", .{base}); │ │369 │ │370 switch (result) { │ │371 .success => |user_id| { │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯