╭──────────╮ │← previous│ ╰──────────╯ ╭ changed ───────────────╮ │src/ui/widget/thread.zig│ ╰────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │2107 } │ │2108 │ │2109 // a multiline input keeps enter and any up/down that has a row to move to │ │2110 - fn multilineKeepsKey(text_input: *wgt.TextInput(Widget), allocator: std.mem.Allocator, key: Key) !bool {│ │2110 + fn multilineKeepsKey(text_input: *wgt.TextInput, allocator: std.mem.Allocator, key: Key) !bool { │ │2111 return switch (key) { │ │2112 .enter => true, │ │2113 .arrow_up => !try text_input.cursorOnFirstRow(allocator), │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ──╮ │src/web.zig│ ╰───────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────╮ │1674 var open_tag: ?CellTag = null; │ │1675 var first = true; │ │1676 for (0..grid.size.width) |x| { │ │1677 - const cell = grid.cells.items[try grid.cells.at(.{ y, x })]; │ │1677 + const cell = (try grid.cell(x, y)).*; │ │1678 // a cell covered by a child scroll's viewport is drawn by that scroll's│ │1679 // own div, so blank its glyph and make it non-clickable here — but keep│ │1680 // its background, so the backdrop still shows through the scroll's │ ╰──────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1736 } else if (cell.continuation) { │ │1737 // the wide rune to the left was emitted 2ch wide, covering this column │ │1738 } else if (cell.rune) |rune| { │ │1739 + var encoded: [4]u8 = undefined; │ │1740 + const encoded_len = try std.unicode.utf8Encode(rune, &encoded); │ │1741 + const rune_text = encoded[0..encoded_len]; │ │1742 // a double-width rune is pinned inside a 2ch span so the │ │1743 // fallback glyph's advance width can't shift the rest of the row │ │1741 - const wide = x + 1 < grid.size.width and grid.cells.items[try grid.cells.at(.{ y, x + 1 })].continuation;│ │1744 + const wide = x + 1 < grid.size.width and (try grid.cell(x + 1, y)).continuation; │ │1745 if (wide) { │ │1746 try output.appendSlice(allocator, "<span class=\"w2\">"); │ │1744 - try appendEscapedHtml(allocator, output, rune); │ │1747 + try appendEscapedHtml(allocator, output, rune_text); │ │1748 try output.appendSlice(allocator, "</span>"); │ │1749 } else { │ │1747 - try appendEscapedHtml(allocator, output, rune); │ │1750 + try appendEscapedHtml(allocator, output, rune_text); │ │1751 } │ │1752 } else { │ │1753 try appendEscapedHtml(allocator, output, " "); │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯