╭──────────╮ │← previous│ ╰──────────╯ ╭ changed ───────────╮ │src/ui/Repo/Undo.zig│ ╰────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │614 return; │ │615 } │ │616 } │ │625 - if (key == .arrow_left) root_focus.setFocus(self.listScroll().getFocus().id) else if (inp.rowDelta(key, @intCast(details.children.count()))) |delta| ui.widget.moveRowFocus(details, self.detailScroll(), root_focus, delta);│ │617 + if (inp.rowDelta(key, @intCast(details.children.count()))) |delta| { │ │618 + ui.widget.moveRowFocus(details, self.detailScroll(), root_focus, delta); │ │619 + } else if (key == .arrow_left) { │ │620 + root_focus.setFocus(self.listScroll().getFocus().id); │ │621 + } │ │622 } else if (inp.rowDelta(key, @intCast(self.listScroll().child.box.children.count()))) |delta| { │ │623 ui.widget.moveRowFocus(&self.listScroll().child.box, self.listScroll(), root_focus, delta); │ │624 } else switch (key) { │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ───────────────╮ │src/ui/widget/thread.zig│ ╰────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │926 var author = try ui.authorBox(allocator, self.session.page_arena, entry.author); │ │927 errdefer author.deinit(allocator); │ │928 try row.children.put(allocator, author.getFocus().id, .{ .widget = .{ .text_box = author }, .rect = null, .min_size = null }); │ │929 - const timestamp = try ui.Repo.Undo.formatTimestamp(self.session.page_arena.allocator(), std.math.cast(i64, entry.record.created_timestamp) orelse -1); │ │930 - var time = try wgt.TextBox.init(allocator, timestamp, .{ .border = .single, .round_corners = true, .wrap_kind = .none }); │ │929 + const timestamp = try ui.timestamp.format(self.session.page_arena.allocator(), std.math.cast(i64, entry.record.created_timestamp) orelse -1, try self.session.nowSeconds()); │ │930 + var time = try wgt.TextBox.init(allocator, timestamp.relative, .{ .border = .single, .round_corners = true, .wrap_kind = .none, .bottom_label = .{ .text = timestamp.exact } });│ │931 errdefer time.deinit(allocator); │ │932 time.getFocus().mode = .all; │ │933 try row.children.put(allocator, time.getFocus().id, .{ .widget = .{ .text_box = time }, .rect = null, .min_size = null }); │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ added ─────────────╮ │src/ui/timestamp.zig│ ╰────────────────────╯ ╭ changed ──╮ │src/web.zig│ ╰───────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │2187 }, │ │2188 }; │ │2189 session.io = io; │ │2190 + session.data.now = std.math.cast(i64, std.Io.Timestamp.now(io, .real).toSeconds()) orelse return error.TimestampOutOfRange;│ │2191 │ │2192 var page = try ui.Page.init(session.page_arena, &session, session.data.current_page); │ │2193 var root = try ui.initRoot(allocator, &page, &session); │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯