Tables: the right-click menu offers the table's commands (#694)

* Tables: select, insert and move with the mouse; double-click a border to AutoFit

Like Word, on top of the border resizing:

- Selection areas: just above a column the pointer becomes a down arrow,
  left of a row the row arrow, along a cell's left edge (inside it) the
  cell arrow. A click selects the column, row or cell; a drag selects every
  one up to the pointer. Selected cells are shaded as cells, empty ones too.
- Insert buttons: left of a row border and above a column border a "+"
  shows with the border marked; a click adds a row or column there and puts
  the caret in it.
- Move handle past the table's top-left corner: a click selects the table;
  a drag shows a dashed outline and, on release, the table floats where it
  is dropped with the text wrapping around it (Word's behaviour). One undo
  step. Nested tables and tables outside the main text are only selected.
- A double-click on a column border fits the column left of it to its
  contents (the right neighbour gives or takes the room; on the right edge
  the table's width changes, up to the right margin).
- Table Layout > Select > Select Column (catalog 418/449).

Whole-cell selection: a column (or a rectangle of cells over several rows)
is not one run of the text, so selecting it makes a block of its cells'
paragraphs (`CellRange` on the existing `ColumnBlock`). Bold, alignment,
Delete, typing, copy and numbering act on those cells only (a numbered
column is one list); table commands (shading, merge, delete columns) take
the rectangle; Tab moves on without clearing it; Undo brings the selection
back. Cells of one row, or whole rows, stay an ordinary stream selection.
The format painter no longer clears a block's text (edit.pasteFormat was
handled like a paste). The mini toolbar stays hidden over whole-cell
selections and during these drags: pinned above the selection it covered
the column areas, the "+" buttons and the move handle.

Engine: crates/engine/src/cmd/table_mouse.rs - table.selectAt,
table.insertAt, table.moveDrag, table.fitColumn (page coordinates, so
agents and the control channel can do the same) and table.selectColumn;
hit testing reuses table_resize's drawn geometry, and borders keep priority
for resizing. 10 engine tests (areas, a column edited cell by cell,
numbering, rows/cells/drags, insert buttons, move, fit, format painter,
hostile params).
UI: crates/ui-egui/src/table_mouse.rs, wired into the existing canvas mouse
handler (no extra ui.interact areas, so clicks in a cell's text still place
the caret); kittest tests with real pointer events: column click, row drag,
"+" button, move-handle drag in one undo step, double-click fit.
New labels translated in all eleven catalogs. Progress docs updated: gaps,
ui-parity, target-app-parity, ROADMAP, parity checklist.
`cargo xtask ci` passes (fmt, clippy, test, assets, layers, wasm).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Tables: a selected column's word count is its cells'; merged cells shade once

With whole cells selected (a column, or a rectangle that isn't one run of
the text) the status bar said "12 of 23 words": `Session::selected_text`
took everything between the selection's ends. It now takes each piece's
own text, a line each, for a column block too, so the status bar, Word
Count and the other callers see what is selected.

Since #669 a vertically merged cell is one box as tall as its rows, with a
`covered` box for each continuation row; shading selected cells skips
those, so a merged cell isn't shaded twice. `selected_paths` follows
main's `para_paths_in` (#418): a selection ending at the start of the next
paragraph doesn't take it.

- Test: a selected column's text is its three cells' and Word Count says
  three words.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Tables: double-click AutoFit and the "+" buttons work as in Word

Checked against Word (2019, Windows):

- A double-click on a column border fits the column left of it to its
  contents and the columns right of it keep their widths, moving with the
  border, so the table narrows or widens (up to the right margin). The
  right neighbour used to give or take the difference.
- A "+" insert button selects the new row or column (the caret used to
  go into it); typing then goes into its first cell. If the table can't
  take another row or column, nothing changes.
- A double-click along a cell's left edge (the cell selection area)
  selects its row.

- Tests: engine (fit keeps the columns on the right; insert selects the
  new row or column, typing lands in its first cell) and kittest (real
  double-click on a border; "+" selects the row; double-click by a cell's
  edge selects the row).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Tables: the right-click menu offers the table's commands

Right-clicking a table cell now offers what Word's table menu does, all
through existing commands: Insert (rows above/below, columns left/right),
Delete (cells, rows, columns, table), Select (cell, column, row, table),
Merge Cells, Split Cells, Distribute Rows, Distribute Columns, AutoFit
(contents, window, fixed column width), Text Direction, Cell Alignment
(the nine alignments) and Table Properties… (opens the dialog, as the
ribbon's button does).

A right-click beside selected cells now moves the caret there, as in
Word: with a column selected, the cells between its first and last cell
in the text (the other columns of those rows) counted as "inside the
selection", so the selection stayed and the menu acted on the column
instead of the cell clicked. A right-click on a selected cell keeps the
selection, so Cell Alignment, Distribute and the rest act on it.

- UI only (crates/ui-egui/src/canvas.rs): the table part of
  `context_menu()` and a small check before the right-click caret logic
  (separate from it, so it doesn't overlap #521's change to that block).
  Table Layout's nine cell alignments are one shared list (`CELL_ALIGN`
  in ribbon.rs) for the ribbon grid and the menu.
- Two new labels, "Cell Alignment" and "Table Properties…", translated
  in all eleven catalogs; the rest reuse the ribbon's labels.
- Tests: kittest with real pointer events: right-click in a cell, the
  menu's table entries, Select > Select Column; with a column selected,
  a right-click on it keeps it and Cell Alignment > Align Bottom Right
  aligns just the column (one undo step), and a right-click beside it
  drops it.

Progress docs updated: ui-parity (context menus 55% -> 60%), gaps,
target-app-parity, ROADMAP. No new commands, so the catalog is unchanged.
`cargo xtask ci` passes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Tables: the right-click menu's table items follow the selection, as in Word

Checked against Word (2019, Windows): Word's table items in the context
menu depend on what is selected, and there is no Select or Cell
Alignment submenu among them.

- Caret in a cell: Insert, Delete Cells, Split Cells, Text Direction,
  Table Properties…
- Several cells: Insert, Delete Cells, Merge Cells, Text Direction,
  Table Properties…
- Whole columns: Insert, Delete Columns, Merge Cells, Distribute Rows,
  Distribute Columns, Text Direction, Table Properties… (whole rows the
  same with Delete Rows; not checked in Word).
- The whole table: Insert, Delete Table, Distribute Rows and Columns,
  AutoFit, Text Direction, Insert Caption…, Table Properties…

Insert lists the columns first, as Word does. Select and Cell Alignment
are gone, and with them the shared CELL_ALIGN constant in the ribbon;
"Insert Caption…" replaces "Cell Alignment" in all fifteen catalogs.
Word's Border Styles and Insert Cells… aren't here yet.

- Tests (kittest, real right-clicks): the menu with the caret in a cell
  and with the whole table; a selected column keeps its column menu and
  Text Direction turns only it; beside it the menu is a cell's again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: rabis <340973947+rabis7575@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Brandon Thomas <echelon@gmail.com>
This commit is contained in:
rabis7575 2026-10-12 16:29:45 +02:00 committed by GitHub
parent 994162fdff
commit 284818b467
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
24 changed files with 234 additions and 16 deletions

View File

@ -2,7 +2,7 @@
**Stage: alpha** · next: beta, ~15 points (60% → 75% ready for real work) and ~150–230 h away
> **Last reviewed:** 2026-10-11 · **Last updated:** 2026-10-11 · **Change:** trivial (table selection areas, insert buttons, move handle and double-click AutoFit on the page, Select Column: catalog 484/499; previously trivial: independent complex-script formatting preserved across DOCX open/save; previously trivial: Turkish interface landed; previously trivial: formatting revisions landed, #41; previously trivial: Draw tab ink, #307, and Draw Table and Eraser, #303, landed: catalog 402/434; previously minor: readiness table with hours per audience; full number back to the additive weighted sum, 60%; mainstream and essentials numbers added; alpha gate checked; previously major: full re-measure against Word for Mac 16.113.4; restructured to the craftrules progress-docs standard) · **Target:** Microsoft Word (Microsoft 365) for Mac 16.113.4
> **Last reviewed:** 2026-10-11 · **Last updated:** 2026-10-11 · **Change:** trivial (table context menu whose items follow the selection, as in Word; previously trivial: table selection areas, insert buttons, move handle and double-click AutoFit on the page, Select Column: catalog 484/499; previously trivial: independent complex-script formatting preserved across DOCX open/save; previously trivial: Turkish interface landed; previously trivial: formatting revisions landed, #41; previously trivial: Draw tab ink, #307, and Draw Table and Eraser, #303, landed: catalog 402/434; previously minor: readiness table with hours per audience; full number back to the additive weighted sum, 60%; mainstream and essentials numbers added; alpha gate checked; previously major: full re-measure against Word for Mac 16.113.4; restructured to the craftrules progress-docs standard) · **Target:** Microsoft Word (Microsoft 365) for Mac 16.113.4
WordCraft aims for complete parity with Microsoft Word, then goes further on speed, openness and
agent control. This page is the summary; the assessment is
@ -133,6 +133,7 @@ Ranked, to beta (detail and remaining milestones in [docs/roadmap.md](docs/roadm
| Date | What landed |
|---|---|
| 2026-10-11 | Right-clicking a table cell offers the table's commands, and as in Word they follow the selection: with the caret in a cell Insert, Delete Cells, Split Cells, Text Direction and Table Properties…; with several cells Merge Cells instead of Split; with whole columns or rows Delete Columns or Rows, Merge Cells and Distribute Rows and Columns; with the whole table Delete Table, Distribute, AutoFit and Insert Caption…. A right-click beside selected cells moves the caret there instead of keeping them |
| 2026-10-11 | More of the table mouse: arrows above a column, left of a row and along a cell's left edge select it (a drag selects more; a selected column is edited cell by cell, numbering it makes one list), "+" buttons beside the borders insert a row or column, the move handle past the top-left corner selects the table or drags it to float where it's dropped, and a double-click on a column border fits the column; Select Column in the ribbon; `table.selectAt`, `table.insertAt`, `table.moveDrag`, `table.fitColumn` and `table.selectColumn` for agents |
| 2026-10-12 | AutoCorrect keys its built-in English replacement list by language (#835): Polish, Croatian, Bosnian and Serbian `i` ("and") is no longer turned into `I`; English and untagged text unchanged |
| 2026-10-12 | Ribbon groups fit above their labels: View › Show splits its four check boxes into two columns (Hide White Space, #645, had pushed the fourth onto the "Show" label), Developer › Controls loses the gaps that ran into its label, and Layout › Paragraph (#654) no longer trips a debug assertion and sits 2.5 pt higher; a test draws every tab in every language and fails on any group taller than the ribbon |
@ -254,6 +255,7 @@ Ranked, to beta (detail and remaining milestones in [docs/roadmap.md](docs/roadm
| Date | Change | Summary |
|---|---|---|
| 2026-10-11 | trivial | Progress log: the table context menu |
| 2026-10-11 | trivial | Progress log: table selection areas, insert buttons, move handle and double-click AutoFit; catalog 484/499 |
| 2026-10-12 | trivial | Progress log: Undo history list (#701) |
| 2026-10-12 | trivial | Progress log: Start screen at launch (#766) |

View File

@ -68,6 +68,5 @@ real_name = "Alexander Alber"
real_name = "Manuel Carmona"
display_name = "manucarcor"
sync_github_name = false
sync_github_name = true
[people.odedigo]

View File

@ -1175,6 +1175,20 @@ pub fn show(app: &mut WordApp, ui: &mut Ui) {
}
// A click on a check box ticks it; on a list's button opens the list.
crate::content_controls::clicks(app, &resp);
// Selected table cells: a right-click off them drops them, even between the selection's ends
// (beside a selected column), so the menu acts on the cell clicked.
if resp.secondary_clicked()
&& let Some(range) = app.session.cell_range()
&& let Some(p) = resp.interact_pointer_pos()
&& let Some((page, x, y)) = page_at(&rects, &layout, geo.scale, p)
{
let at = wordcraft_geom::Point::new(x, y);
let on_cells =
wordcraft_engine::cmd::table_mouse::cell_rects(&layout, &app.session.doc, range).iter().any(|(pi, r)| *pi == page && r.contains(at));
if !on_cells && let Some(pos) = layout.hit(page, x, y, app.session.sel.focus.story) {
app.session.sel = wordcraft_engine::Selection::caret(pos);
}
}
// Right-click: move the caret there (unless inside the selection), then the context menu.
// Right-click in an equation puts the caret there and opens the equation menu.
if resp.secondary_clicked()
@ -2388,19 +2402,76 @@ fn context_menu(app: &mut WordApp, ui: &mut Ui) {
ui.menu_button(tl!("Wrap Text"), |ui| crate::ribbon::wrap_text_items(ui, app));
}
if app.session.sel.focus.path.cell().is_some() {
// The table's items follow what is selected, as in Word (2019, Windows).
let pick = table_pick(&app.session);
ui.separator();
ui.menu_button(tl!("Insert"), |ui| {
item(ui, app, "Insert Rows Above", "table.insertRowAbove", json!({}));
item(ui, app, "Insert Rows Below", "table.insertRowBelow", json!({}));
item(ui, app, "Insert Columns to the Left", "table.insertColumnLeft", json!({}));
item(ui, app, "Insert Columns to the Right", "table.insertColumnRight", json!({}));
item(ui, app, "Insert Rows Above", "table.insertRowAbove", json!({}));
item(ui, app, "Insert Rows Below", "table.insertRowBelow", json!({}));
});
ui.menu_button(tl!("Delete"), |ui| {
item(ui, app, "Delete Rows", "table.deleteRow", json!({}));
item(ui, app, "Delete Columns", "table.deleteColumn", json!({}));
item(ui, app, "Delete Table", "table.deleteTable", json!({}));
});
item(ui, app, "Merge Cells", "table.merge", json!({}));
match pick {
TablePick::Cell | TablePick::Cells => item(ui, app, "Delete Cells", "table.deleteCells", json!({})),
TablePick::Rows => item(ui, app, "Delete Rows", "table.deleteRow", json!({})),
TablePick::Columns => item(ui, app, "Delete Columns", "table.deleteColumn", json!({})),
TablePick::Table => item(ui, app, "Delete Table", "table.deleteTable", json!({})),
}
if pick == TablePick::Cell {
item(ui, app, "Split Cells", "table.split", json!({}));
}
if matches!(pick, TablePick::Cells | TablePick::Rows | TablePick::Columns) {
item(ui, app, "Merge Cells", "table.merge", json!({}));
}
if matches!(pick, TablePick::Rows | TablePick::Columns | TablePick::Table) {
item(ui, app, "Distribute Rows", "table.distributeRows", json!({}));
item(ui, app, "Distribute Columns", "table.distributeColumns", json!({}));
}
if pick == TablePick::Table {
ui.menu_button(tl!("AutoFit"), |ui| {
item(ui, app, "AutoFit Contents", "table.autofit", json!({"mode": "contents"}));
item(ui, app, "AutoFit Window", "table.autofit", json!({"mode": "window"}));
item(ui, app, "Fixed Column Width", "table.autofit", json!({"mode": "fixed"}));
});
}
item(ui, app, "Text Direction", "table.textDirection", json!({}));
if pick == TablePick::Table {
item(ui, app, "Insert Caption…", "references.caption", json!({}));
}
item(ui, app, "Table Properties…", "table.properties", json!({}));
}
}
/// What of a table the selection is: Word's context menu offers different table items for each.
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
enum TablePick {
/// The caret or text in one cell, or that one cell.
Cell,
/// Cells of more than one row or column, but not whole rows or columns.
Cells,
Rows,
Columns,
Table,
}
fn table_pick(s: &wordcraft_engine::Session) -> TablePick {
if let Some(r) = s.cell_range()
&& let Some(t) = s.doc.table(r.story, &r.table)
{
let all_rows = r.rows == (0, t.rows.len().saturating_sub(1));
let all_cols = r.cols == (0, t.cols().saturating_sub(1));
return match (all_rows, all_cols) {
(true, true) => TablePick::Table,
(true, false) => TablePick::Columns,
(false, true) => TablePick::Rows,
_ if r.cells(t).len() > 1 => TablePick::Cells,
_ => TablePick::Cell,
};
}
// Text running from one cell into another of the same table.
match (s.sel.anchor.path.cell(), s.sel.focus.path.cell()) {
(Some((ta, ra, ca)), Some((tb, rb, cb))) if ta == tb && (ra, ca) != (rb, cb) => TablePick::Cells,
_ => TablePick::Cell,
}
}
@ -2447,6 +2518,7 @@ fn is_followable_link(url: &str) -> bool {
#[cfg(test)]
mod tests {
use super::*;
use crate::table_resize::tests::{H, cell, screen, steps, table_window};
#[test]
fn reading_animation_eases_then_lands_exactly_on_column_start() {
@ -2780,6 +2852,112 @@ mod tests {
assert_eq!(clamped_scroll(egui::Vec2::ZERO, vec2(0.0, 50.0), egui::Vec2::ZERO).y, 0.0, "nothing to scroll");
}
/// A right-click at `at`, the button pressed and released a frame apart.
fn right_click(h: &mut H, at: Pos2) {
h.event(egui::Event::PointerMoved(at));
h.step();
for pressed in [true, false] {
h.event(egui::Event::PointerButton { pos: at, button: egui::PointerButton::Secondary, pressed, modifiers: Default::default() });
h.step();
}
steps(h, 2);
}
/// Where the open context menu's entry holding `label` is (an entry's label also has its
/// shortcut or submenu arrow, and the ribbon above the page may show the same name).
fn menu_entry(h: &H, label: &str) -> Option<Pos2> {
use egui_kittest::kittest::Queryable;
let top = h.state().canvas.page_rects.first().map_or(0.0, |r| r.min.y);
h.query_all_by_label_contains(label).map(|n| n.rect()).find(|r| r.min.y >= top).map(|r| r.center())
}
/// Picks `path` in the open context menu with the mouse: over each submenu on the way, then a
/// click on the last entry.
fn pick(h: &mut H, path: &[&str]) {
let Some((last, submenus)) = path.split_last() else { return };
for label in submenus {
let at = menu_entry(h, label).expect(label);
h.event(egui::Event::PointerMoved(at));
steps(h, 2);
}
let at = menu_entry(h, last).expect(last);
h.event(egui::Event::PointerMoved(at));
h.step();
for pressed in [true, false] {
h.event(egui::Event::PointerButton { pos: at, button: egui::PointerButton::Primary, pressed, modifiers: Default::default() });
h.step();
}
steps(h, 2);
}
/// Whether the open context menu has an entry holding each of `labels` (`true`) or none
/// (`false`).
fn assert_menu(h: &H, labels: &[&str], there: bool) {
for label in labels {
assert_eq!(menu_entry(h, label).is_some(), there, "{label} in the menu: {there}");
}
}
/// Right-clicking a table cell puts the caret there, and the table's items follow what is
/// selected, as in Word: with the caret in a cell, Delete Cells and Split Cells; with the
/// whole table, Delete Table, Distribute, AutoFit and Insert Caption… (never Select or Cell
/// Alignment).
#[test]
fn the_context_menu_in_a_table_follows_the_selection() {
let mut h = table_window();
let b = cell(&mut h, 1, 2);
let at = screen(&mut h, b.x + b.w / 2.0, b.y + b.h / 2.0);
right_click(&mut h, at);
assert_eq!(h.state().session.sel.focus.path.cell().map(|(_, r, c)| (r, c)), Some((1, 2)), "the caret moved to the cell");
assert_menu(&h, &["Insert", "Delete Cells", "Split Cells", "Text Direction", "Table Properties…"], true);
assert_menu(&h, &["Merge Cells", "Distribute Rows", "Delete Table", "AutoFit", "Select", "Cell Alignment"], false);
let depth = h.state().session.undo_depth();
pick(&mut h, &["Insert", "Insert Rows Below"]);
assert_eq!(h.state().session.doc.body.iter().find_map(|b| b.as_table()).map(|t| t.rows.len()), Some(3));
assert_eq!(h.state().session.undo_depth(), depth + 1);
h.state_mut().run("table.selectTable", json!({})).unwrap();
right_click(&mut h, at);
assert!(h.state().session.cell_range().is_some(), "a right-click on the selected table keeps it");
assert_menu(&h, &["Delete Table", "Distribute Rows", "Distribute Columns", "AutoFit", "Insert Caption…", "Table Properties…"], true);
assert_menu(&h, &["Delete Cells", "Split Cells", "Merge Cells"], false);
pick(&mut h, &["Delete Table"]);
assert!(h.state().session.doc.body.iter().all(|b| b.as_table().is_none()));
}
/// With a column's cells selected, a right-click on one of them keeps them: the menu is a
/// column's (Delete Columns, Merge Cells, Distribute) and its Text Direction turns just the
/// column, in one undo step; one on a cell beside them drops them, though that cell lies
/// between the selection's ends in the text, and the menu is a cell's again.
#[test]
fn a_right_click_keeps_selected_cells_only_on_them() {
use wordcraft_doc::props::TextDirection;
let mut h = table_window();
h.state_mut().run("table.selectColumn", json!({})).unwrap();
assert_eq!(h.state().session.cell_range().map(|r| (r.rows, r.cols)), Some(((0, 1), (0, 0))));
let on = cell(&mut h, 1, 0);
let at = screen(&mut h, on.x + on.w / 2.0, on.y + on.h / 2.0);
right_click(&mut h, at);
assert_eq!(h.state().session.cell_range().map(|r| r.cols), Some((0, 0)), "still the column");
assert_menu(&h, &["Delete Columns", "Merge Cells", "Distribute Rows", "Distribute Columns", "Text Direction"], true);
assert_menu(&h, &["Delete Cells", "Split Cells", "AutoFit"], false);
let depth = h.state().session.undo_depth();
pick(&mut h, &["Text Direction"]);
assert_eq!(h.state().session.undo_depth(), depth + 1);
let t = h.state().session.doc.body.iter().find_map(|b| b.as_table()).unwrap();
let dir = |r: usize, c: usize| t.rows[r].cells[c].props.text_direction;
assert_eq!(
[dir(0, 0), dir(1, 0), dir(0, 1), dir(1, 2)],
[TextDirection::Down, TextDirection::Down, TextDirection::Horizontal, TextDirection::Horizontal]
);
let beside = cell(&mut h, 0, 2);
let at = screen(&mut h, beside.x + beside.w / 2.0, beside.y + beside.h / 2.0);
right_click(&mut h, at);
assert!(h.state().session.cell_range().is_none(), "the column is no longer selected");
assert_eq!(h.state().session.sel.focus.path.cell().map(|(_, r, c)| (r, c)), Some((0, 2)));
assert_menu(&h, &["Split Cells"], true);
assert_menu(&h, &["Delete Columns", "Merge Cells"], false);
}
/// Issue #123: zoomed out, pages sit side by side in rows when the width allows; at 100% a
/// letter page in an ordinary window stays one per row.
#[test]

View File

@ -2460,3 +2460,5 @@
Insert Row or Column by Clicking Вмъкване на ред или колона с щракване
Move Table by Dragging Преместване на таблица с плъзгане
AutoFit Column by Double-Clicking Автопобиране на колона с двойно щракване
Insert Caption… Вмъкване на надпис…
Table Properties… Свойства на таблица…

Can't render this file because it contains an unexpected character in line 7 and column 25.

View File

@ -535,6 +535,7 @@
Insert Above Vložit nad
Insert Below Vložit pod
Insert Caption Vložit titulek
Insert Caption… Vložit titulek…
Insert Citation Vložit citaci
Insert Endnote Vložit vysvětlivku
Insert Footnote Vložit poznámku pod čarou
@ -1111,6 +1112,7 @@
Table of Contents Obsah
Table of\nContents Obsah
Table Properties Vlastnosti tabulky
Table Properties… Vlastnosti tabulky…
Table Row Height Výška řádku tabulky
Table style Styl tabulky
Table Style Options Možnosti stylu tabulky

Can't render this file because it contains an unexpected character in line 6 and column 25.

View File

@ -416,6 +416,7 @@
Insert Above Oberhalb einfügen
Insert Below Unterhalb einfügen
Insert Caption Beschriftung einfügen
Insert Caption… Beschriftung einfügen…
Insert Citation Zitat einfügen
Insert Endnote Endnote einfügen
Insert Footnote Fußnote einfügen
@ -791,6 +792,7 @@
Table of Contents Inhaltsverzeichnis
Table of\nContents Inhalts-\nverzeichnis
Table Properties Tabelleneigenschaften
Table Properties… Tabelleneigenschaften…
Table Row Height Tabellenzeilenhöhe
Table Style Options Tabellenformat-Optionen
Table Styles Tabellenformate

Can't render this file because it contains an unexpected character in line 6 and column 25.

View File

@ -475,6 +475,7 @@
Insert Above Insertar encima
Insert Below Insertar debajo
Insert Caption Insertar leyenda
Insert Caption… Insertar leyenda…
Insert Citation Insertar cita
Insert Endnote Insertar nota final
Insert Footnote Insertar nota al pie
@ -898,6 +899,7 @@
Table Design Diseño de tabla
Table Layout Disposición de tabla
Table Properties Propiedades de tabla
Table Properties… Propiedades de tabla…
Table Row Height Alto de fila de tabla
Table Style Options Opciones de estilo de tabla
Table Styles Estilos de tabla

Can't render this file because it contains an unexpected character in line 6 and column 25.

View File

@ -353,6 +353,7 @@
Insert Above Lisa üles
Insert Below Lisa alla
Insert Caption Lisa pealdis
Insert Caption… Lisa pealdis…
Insert Citation Lisa viide
Insert Endnote Lisa lõpumärkus
Insert Footnote Lisa allmärkus
@ -778,6 +779,7 @@
Table Design Tabeli kujundus
Table Layout Tabeli paigutus
Table Properties Tabeli atribuudid
Table Properties… Tabeli atribuudid…
Table Row Height Tabeli reakõrgus
Table Style Options Tabelistiili valikud
Table Styles Tabelistiilid

Can't render this file because it has a wrong number of fields in line 12.

View File

@ -2079,3 +2079,5 @@
Insert Row or Column by Clicking Insérer une ligne ou une colonne en cliquant
Move Table by Dragging Déplacer le tableau en le faisant glisser
AutoFit Column by Double-Clicking Ajuster la colonne en double-cliquant
Insert Caption… Insérer une légende…
Table Properties… Propriétés du tableau…

Can't render this file because it contains an unexpected character in line 7 and column 25.

View File

@ -2469,3 +2469,5 @@
Insert Row or Column by Clicking Sor vagy oszlop beszúrása kattintással
Move Table by Dragging Táblázat áthelyezése húzással
AutoFit Column by Double-Clicking Oszlop automatikus igazítása dupla kattintással
Insert Caption… Felirat beszúrása…
Table Properties… Táblázat tulajdonságai…

Can't render this file because it contains an unexpected character in line 6 and column 25.

View File

@ -412,6 +412,7 @@
Insert Above Inserisci sopra
Insert Below Inserisci sotto
Insert Caption Inserisci didascalia
Insert Caption… Inserisci didascalia…
Insert Citation Inserisci citazione
Insert Endnote Inserisci nota di chiusura
Insert Footnote Inserisci nota a piè di pagina
@ -803,6 +804,7 @@
Table Design Tabella Design
Table Layout Tabella Layout
Table Properties Proprietà tabella
Table Properties… Proprietà tabella…
Table Row Height Altezza riga tabella
Table Style Options Opzioni stile tabella
Table Styles Stili tabella

Can't render this file because it contains an unexpected character in line 6 and column 25.

View File

@ -469,6 +469,7 @@
Insert Above 上に行を挿入
Insert Below 下に行を挿入
Insert Caption 図表番号の挿入
Insert Caption… 図表番号の挿入…
Insert Citation 引用文献の挿入
Insert Endnote 文末脚注の挿入
Insert Footnote 脚注の挿入
@ -858,6 +859,7 @@
Table of Contents 目次
Table of\nContents 目次
Table Properties 表のプロパティ
Table Properties… 表のプロパティ…
Table Row Height 表の行の高さ
Table Style Options 表スタイルのオプション
Table Styles 表のスタイル

Can't render this file because it has a wrong number of fields in line 3.

View File

@ -336,6 +336,7 @@
Insert Above Wstaw powyżej
Insert Below Wstaw poniżej
Insert Caption Wstaw podpis
Insert Caption… Wstaw podpis…
Insert Citation Wstaw cytat
Insert Endnote Wstaw przypis końcowy
Insert Footnote Wstaw przypis dolny
@ -719,6 +720,7 @@
Table Design Projekt tabeli
Table Layout Układ tabeli
Table Properties Właściwości tabeli
Table Properties… Właściwości tabeli…
Table Row Height Wysokość wiersza tabeli
Table Style Options Opcje stylu tabeli
Table Styles Style tabeli

Can't render this file because it contains an unexpected character in line 6 and column 25.

View File

@ -470,6 +470,7 @@
Insert Above Inserir acima
Insert Below Inserir abaixo
Insert Caption Inserir legenda
Insert Caption… Inserir legenda…
Insert Citation Inserir citação
Insert Endnote Inserir nota de fim
Insert Footnote Inserir nota de rodapé
@ -859,6 +860,7 @@
Table of Contents Sumário
Table of\nContents Sumário
Table Properties Propriedades da tabela
Table Properties… Propriedades da tabela…
Table Row Height Altura da linha da tabela
Table Style Options Opções de estilo de tabela
Table Styles Estilos de tabela

Can't render this file because it contains an unexpected character in line 6 and column 25.

View File

@ -341,6 +341,7 @@
Insert Above Вставить сверху
Insert Below Вставить снизу
Insert Caption Вставить подпись
Insert Caption… Вставить подпись…
Insert Citation Вставить ссылку на источник
Insert Endnote Вставить концевую сноску
Insert Footnote Вставить сноску
@ -728,6 +729,7 @@
Table of Figures Список иллюстраций
Table of\nContents Оглавление
Table Properties Свойства таблицы
Table Properties… Свойства таблицы…
Table Row Height Высота строки таблицы
Table Style Options Параметры стилей таблиц
Table Styles Стили таблиц

Can't render this file because it contains an unexpected character in line 7 and column 25.

View File

@ -517,6 +517,7 @@
Insert Above Umetni iznad
Insert Below Umetni ispod
Insert Caption Umetni natpis
Insert Caption… Umetni natpis…
Insert Citation Umetni citat
Insert Endnote Umetni endnotu
Insert Footnote Umetni fusnotu
@ -912,6 +913,7 @@
Table of Contents Sadržaj
Table of\nContents Sadržaj
Table Properties Svojstva tabele
Table Properties… Svojstva tabele…
Table Row Height Visina reda tabele
Table style Stil tabele
Table Style Options Opcije stila tabele

Can't render this file because it contains an unexpected character in line 6 and column 25.

View File

@ -521,6 +521,7 @@
Insert Above Уметни изнад
Insert Below Уметни испод
Insert Caption Уметни натпис
Insert Caption… Уметни натпис…
Insert Citation Уметни цитат
Insert Endnote Уметни ендноту
Insert Footnote Уметни фусноту
@ -916,6 +917,7 @@
Table of Contents Садржај
Table of\nContents Садржај
Table Properties Својства табеле
Table Properties… Својства табеле…
Table Row Height Висина реда табеле
Table style Стил табеле
Table Style Options Опције стила табеле

Can't render this file because it contains an unexpected character in line 11 and column 25.

View File

@ -341,6 +341,7 @@
Insert Above Üste Ekle
Insert Below Alta Ekle
Insert Caption Resim Yazısı Ekle
Insert Caption… Resim Yazısı Ekle…
Insert Citation Atıf Ekle
Insert Endnote Sonnot Ekle
Insert Footnote Dipnot Ekle
@ -734,6 +735,7 @@
Table of Figures Şekiller Tablosu
Table of\nContents İçindekiler\nTablosu
Table Properties Tablo Özellikleri
Table Properties… Tablo Özellikleri…
Table Row Height Tablo Satır Yüksekliği
Table Style Options Tablo Stili Seçenekleri
Table Styles Tablo Stilleri

Can't render this file because it has a wrong number of fields in line 15.

View File

@ -482,6 +482,7 @@
Insert Above Вставити вище
Insert Below Вставити нижче
Insert Caption Вставити підпис
Insert Caption… Вставити підпис…
Insert Citation Вставити цитату
Insert Endnote Вставити кінцеву виноску
Insert Footnote Вставити виноску
@ -885,6 +886,7 @@
Table of Contents Зміст
Table of\nContents Зміст
Table Properties Властивості таблиці
Table Properties… Властивості таблиці…
Table Row Height Висота рядка таблиці
Table Style Options Параметри стилю таблиці
Table Styles Стилі таблиць

Can't render this file because it contains an unexpected character in line 6 and column 31.

View File

@ -481,6 +481,7 @@
Insert Above 在上方插入
Insert Below 在下方插入
Insert Caption 插入题注
Insert Caption… 插入题注…
Insert Citation 插入引文
Insert Endnote 插入尾注
Insert Footnote 插入脚注
@ -870,6 +871,7 @@
Table of Contents 目录
Table of\nContents 目录
Table Properties 表格属性
Table Properties… 表格属性…
Table Row Height 表格行高
Table Style Options 表格样式选项
Table Styles 表格样式

Can't render this file because it contains an unexpected character in line 7 and column 25.

View File

@ -470,6 +470,7 @@
Insert Above 插入上方列
Insert Below 插入下方列
Insert Caption 插入標號
Insert Caption… 插入標號…
Insert Citation 插入引文
Insert Endnote 插入章節附註
Insert Footnote 插入註腳
@ -859,6 +860,7 @@
Table of Contents 目錄
Table of\nContents 目錄
Table Properties 表格內容
Table Properties… 表格內容…
Table Row Height 表格列高
Table Style Options 表格樣式選項
Table Styles 表格樣式

Can't render this file because it has a wrong number of fields in line 4.

View File

@ -1,6 +1,6 @@
# Where WordCraft falls short of Word
> **Last reviewed:** 2026-10-11 · **Last updated:** 2026-10-11 · **Change:** trivial (table selection areas, insert buttons, move handle and double-click AutoFit on the page; previously trivial: DOCX complex-script formatting inheritance fixed; broader RTL work remains; previously trivial: #24 narrowed: Customize Keyboard and Customize Ribbon landed; previously trivial: formatting revisions landed, #41; previously trivial: Draw Table and Eraser landed, #303; previously minor: beta distance restated: ~15 points, ~150–230 h; previously: first version; every known shortfall from the 2026-10-10 re-measure, ranked) · **Target:** Microsoft Word (Microsoft 365) for Mac 16.113.4
> **Last reviewed:** 2026-10-11 · **Last updated:** 2026-10-11 · **Change:** trivial (table context menu whose items follow the selection, as in Word; previously trivial: table selection areas, insert buttons, move handle and double-click AutoFit on the page; previously trivial: DOCX complex-script formatting inheritance fixed; broader RTL work remains; previously trivial: #24 narrowed: Customize Keyboard and Customize Ribbon landed; previously trivial: formatting revisions landed, #41; previously trivial: Draw Table and Eraser landed, #303; previously minor: beta distance restated: ~15 points, ~150–230 h; previously: first version; every known shortfall from the 2026-10-10 re-measure, ranked) · **Target:** Microsoft Word (Microsoft 365) for Mac 16.113.4
The work list. One entry per shortfall, ranked by how much it stops a Word user from switching
(**B** = blocks beta). Each says what's missing, the evidence, who it hurts, an Opus 5.5 agent
@ -63,7 +63,7 @@ The same gaps grouped the way the parity documents are, for agents working in on
- **UI/UX gaps:** #7, #18, #24; crop handles on the canvas (rotation handle landed, #332); table column markers on the
ruler (#49; dragging borders and the resize handle on the page landed, #217, and selecting, inserting and moving with the mouse);
ordinary drags and Shift+arrows over cells of several rows still select a run of text, not a rectangle of cells;
context menus for objects and tables; Linux title bar theming (#78); File ›
context menus for objects (the table's landed; it still lacks Border Styles); Linux title bar theming (#78); File ›
Options › Animation effects › Use system setting reads macOS (Reduce motion) and the Linux/BSD
desktops (`apps/wordcraft/src/animations.rs`) but hasn't been tried on a Mac or in a real
GNOME or KDE session yet.
@ -76,6 +76,7 @@ The same gaps grouped the way the parity documents are, for agents working in on
| Date | Change | Summary |
|---|---|---|
| 2026-10-11 | trivial | UI/UX gaps: the table context menu landed, its items following the selection as in Word (Delete Cells, Rows, Columns or Table, Merge and Split Cells, Distribute, AutoFit, Text Direction, Insert Caption…, Table Properties…); objects' menus and Border Styles remain |
| 2026-10-11 | trivial | Tables: selection areas, insert buttons, move handle and double-click AutoFit on the page landed; ordinary drags over cells of several rows (a run of text, not a rectangle) added to the UI/UX gaps |
| 2026-10-12 | trivial | #1: Word 365 cover page (#743): freeforms in groups keep their outline; text boxes keep their own margins and Resize shape to fit text, so no line is cut |
| 2026-10-12 | trivial | #3: 32-bit Windows no longer exits at launch; DirectX 12 graphics pipelines fail to create, so that build starts on OpenGL |

View File

@ -1,6 +1,6 @@
# WordCraft parity with Microsoft Word
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-11 · **Change:** trivial (table selection areas, insert buttons, move handle and double-click AutoFit on the page, Select Column: catalog 484/499; previously minor: Polish interface and Polish proofing; previously trivial: English spelling knows common modern words, #520; previously trivial: all 12 bibliography styles, #383; previously trivial: formatting revisions landed, #41; previously trivial: Draw Table and Eraser landed, #303; previously minor: readiness table with hours per audience; full number back to the additive weighted sum, 60%; mainstream and essentials numbers added; alpha gate checked; previously major: full re-measure against Word for Mac 16.113.4; replaces the parity tables that lived in ROADMAP.md) · **Target:** Microsoft Word (Microsoft 365) for Mac 16.113.4
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-11 · **Change:** trivial (table context menu whose items follow the selection, as in Word; previously trivial: table selection areas, insert buttons, move handle and double-click AutoFit on the page, Select Column: catalog 484/499; previously minor: Polish interface and Polish proofing; previously trivial: English spelling knows common modern words, #520; previously trivial: all 12 bibliography styles, #383; previously trivial: formatting revisions landed, #41; previously trivial: Draw Table and Eraser landed, #303; previously minor: readiness table with hours per audience; full number back to the additive weighted sum, 60%; mainstream and essentials numbers added; alpha gate checked; previously major: full re-measure against Word for Mac 16.113.4; replaces the parity tables that lived in ROADMAP.md) · **Target:** Microsoft Word (Microsoft 365) for Mac 16.113.4
The authoritative assessment of how close WordCraft is to Microsoft Word. [`ROADMAP.md`](../ROADMAP.md)
summarizes it; [`gaps.md`](gaps.md) itemizes every shortfall; the deep checklists are
@ -60,7 +60,7 @@ full parity for the area.
| Character and paragraph formatting | 11 | 82% | 85% | 8–12 | Nearly every property, Font/Paragraph dialogs, character border, Phonetic Guide (#288), Enclose Characters (#297). Missing: Asian Typography, kerning/ligature/stylistic-set options in the Font dialog's Advanced tab. |
| Styles and themes | 8 | 74% | 75% | 8–12 | Gallery, pane, create/modify, style sets, themes. Style Inspector landed (#236). Missing: Manage Styles (#270 open), style separators, linked-style edge cases; Word ships 11 Quick Style sets plus dozens of themes, we ship our own smaller set. |
| Lists | 6 | 78% | 75% | 5–8 | Bullets, numbering, multilevel, restart, `w:lvlOverride` levels (#134), Word's list AutoFormat and Enter/Backspace behaviour. Missing: Define New Multilevel List dialog depth, list styles, legal numbering edge cases. |
| Tables | 8 | 76% | 72% | 10–16 | Merge/split, styles (cell text takes style formatting, #104), custom table styles saved in the .docx (#256), Word 2013 edge, floating tables, rows split across pages, sort, formula, cell gridlines (#243), Draw Table and Eraser (#303). Missing: splitting or erasing around vertically merged cells, nested-table polish, table column markers on the ruler (#49). Dragging column and row borders and the resize handle on the page landed (#217), and so did selecting columns, rows and cells, the "+" insert buttons, the move handle and double-click AutoFit on the page, and Select Column; cell text direction landed (#245). |
| Tables | 8 | 76% | 72% | 10–16 | Merge/split, styles (cell text takes style formatting, #104), custom table styles saved in the .docx (#256), Word 2013 edge, floating tables, rows split across pages, sort, formula, cell gridlines (#243), Draw Table and Eraser (#303). Missing: splitting or erasing around vertically merged cells, nested-table polish, table column markers on the ruler (#49). Dragging column and row borders and the resize handle on the page landed (#217), and so did selecting columns, rows and cells, the "+" insert buttons, the move handle and double-click AutoFit on the page, and Select Column; right-clicking a cell offers the table's commands, following the selection as in Word (Delete Cells, Rows, Columns or Table, Merge and Split Cells, Distribute, AutoFit, Text Direction, Insert Caption…, Table Properties…); cell text direction landed (#245). |
| Page layout and sections | 7 | 70% | 72% | 12–20 | Margins, size, columns, breaks, page borders, line numbers, vertical alignment, drop caps, hyphenation. Columns don't balance; RTL sections missing. Vertical sections (tbRl/btLr) landed (#491). Detail: [layout-parity.md](layout-parity.md). |
| Headers, footers, page numbers, fields | 5 | 70% | 70% | 8–12 | First/even/odd, link to previous, TOC as an updatable field (#52), cross-references to real bookmarks (#227). Field coverage is a subset of Word's ~90 field codes; Field dialog missing. |
| Footnotes and endnotes | 3 | 60% | 60% | 3–5 | Placed and editable, numbers from Word files (#103); long notes continue onto the next page under the continuation separator (#352). Footnote and Endnote dialog with options per section: below text, end of section, number format, start at, restart each section or page, custom mark, convert (#385). |
@ -251,6 +251,7 @@ can be used without committing Word output.
| Date | Change | Summary |
|---|---|---|
| 2026-10-11 | trivial | Tables: the table context menu, its items following the selection as in Word (Delete Cells, Rows, Columns or Table, Merge and Split Cells, Distribute, AutoFit, Text Direction, Insert Caption…, Table Properties…); Tables row updated, no percentage change |
| 2026-10-11 | trivial | Tables: selection areas for columns, rows and cells, "+" insert buttons, the move handle and double-click AutoFit on the page; Select Column (catalog 484/499); Tables row updated, no percentage change |
| 2026-10-12 | minor | Portuguese proofing (pt-BR spelling from the installed VERO dictionary, accent-first suggestions, grammar, hyphenation; Review › Language gains Português (Brasil)): Proofing 40% → 42%; other dimensions unchanged at this precision |
| 2026-10-12 | trivial | Proofing: custom dictionary persists across sessions (#40); no percentage change |

View File

@ -1,6 +1,6 @@
# UI parity with Microsoft Word
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-11 · **Change:** trivial (table selection areas, insert buttons, move handle and double-click AutoFit on the page; previously trivial: one drop-down marker, #659; previously minor: status bar language follows the caret and sets the proofing language; Review › Language is a menu; previously trivial: Customize Ribbon and the Quick Access Toolbar, #379; previously: major, first version; ribbon, dialogs, shortcuts and on-canvas interaction measured from `crates/ui-egui` and the command registry) · **Target:** Microsoft Word (Microsoft 365) for Mac 16.113.4
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-11 · **Change:** trivial (table context menu whose items follow the selection, as in Word; previously trivial: table selection areas, insert buttons, move handle and double-click AutoFit on the page; previously trivial: one drop-down marker, #659; previously minor: status bar language follows the caret and sets the proofing language; Review › Language is a menu; previously trivial: Customize Ribbon and the Quick Access Toolbar, #379; previously: major, first version; ribbon, dialogs, shortcuts and on-canvas interaction measured from `crates/ui-egui` and the command registry) · **Target:** Microsoft Word (Microsoft 365) for Mac 16.113.4
How WordCraft looks and feels next to Word: ribbon, dialogs, panes, keyboard, mouse and touch.
Typing behaviour has its own checklist ([`typing-parity.md`](typing-parity.md)). All assets are our
@ -20,7 +20,7 @@ own (`AGENTS.md`: no Microsoft iconography, ever).
| Keyboard shortcuts | **137** commands bound in `CommandSpec::key`, 156 key combinations (measured on Linux/Windows); styles, spacing, symbols, fields, views, mail merge (#330); field keys Alt+F9, Shift+F9, Ctrl+Shift+F9, Ctrl+F11, Ctrl+Shift+F11, F11, Shift+F11 (#339); Alt+Shift+arrows (move paragraphs, promote/demote), Shift+F5 Go Back and Alt+X (#343); Outline view: Alt+Shift+Plus/Minus expand/collapse, Alt+Shift+1–9 and Alt+Shift+A Show Level (#493); Alt+Q to "Tell me" command search (#819, not on macOS). Missing: en dash on the numeric keypad | ~250 default shortcuts | ~70% | 2–4 |
| Modal dialogs | **54** (`Dialog` enum: Font, Enclose Characters, Paragraph, Tabs, Borders and Shading, Find, Go To, Insert Table, Table Properties, Page Setup, Link, Bookmark, Word Count, Zoom, Watermark, New Style, Modify Style, Manage Styles, Table Style, Commands, Icons, Templates and Add-ins, Organizer, Compare and Combine, AutoCorrect Options, Paste Special, About, Save Changes, Password, Encrypt with Password, Define New Multilevel List, Track Changes Options; Columns, Symbol with Special Characters, Field (#321); Field code (#339); mail merge Recipients, Insert Merge Field, Find Recipient, Rules, Match Fields, Check for Errors; Caption with New Label and Numbering, Index, Mark Index Entry, Custom Table of Contents with Options and TOC styles, Source Manager, Create/Edit Source (#402); Line Numbers, Hyphenation with Manual Hyphenation, Language, Envelopes, Labels (#407)) plus panes and menus for the rest | ~100 (Options panes…) | ~45% | 11–19 |
| Task panes (Navigation, Styles, Comments, Reviewing, Format Picture/Shape, Thesaurus, Accessibility, Clipboard, Selection) | Navigation (long headings truncate with an ellipsis instead of expanding the pane, #759), Styles, Comments, Thesaurus, Restrict Editing, Accessibility (grouped findings, jump-to, fixes) and Alt Text (#386), Read Aloud, Zotero; Style Inspector (#236); Clipboard pane (#264) open | all | 70% | 4–6 |
| Context menus (right-click) | text, spelling suggestions, fields (Update Field, Edit Field…, Toggle Field Codes, #339); right-click selects a picture, shape or text box and offers Wrap Text (styles, Move with Text / Fix Position on Page, #513); tables partial | rich per context | 60% | 3–5 |
| Context menus (right-click) | text, spelling suggestions, fields (Update Field, Edit Field…, Toggle Field Codes, #339); right-click selects a picture, shape or text box and offers Wrap Text (styles, Move with Text / Fix Position on Page, #513); tables, the items following the selection as in Word (Insert, Delete Cells, Rows, Columns or Table, Merge and Split Cells, Distribute, AutoFit, Text Direction, Insert Caption…, Table Properties…; no Border Styles yet) | rich per context | 65% | 2–4 |
| Backstage (Home, New, Open, Info, Save As, Print, Share, Export, Options) | Home and New separate (#254), Info properties kept (#268), Options in Word's panes with working settings (#485), Print page with preview, page range and copies (#641); launched with nothing to open, the app starts on Home (the Start screen: Blank document, templates, Recent; Esc leaves a blank document), with File › Options › General › Start-up to turn it off (#766) | | 68% | 4–6 |
| Rulers: indents, tabs, margins, table columns | indents draggable (one undo, #62); tabs; table column drag pending (#49) | ✅ | 70% | 2–3 |
| On-canvas objects: select, drag, resize handles, nudge | ✅ tested (#228) | ✅ | 75% | — |
@ -44,6 +44,7 @@ own (`AGENTS.md`: no Microsoft iconography, ever).
| Date | Change | Summary |
|---|---|---|
| 2026-10-11 | trivial | Table context menu as in Word: its items follow the selection (the caret in a cell, several cells, whole columns or rows, the whole table), adding Delete Cells, Split Cells, Distribute Rows and Columns, AutoFit, Text Direction, Insert Caption… and Table Properties… to Insert, Delete and Merge Cells; a right-click beside selected cells drops them |
| 2026-10-11 | trivial | Tables on the page: selection areas for columns, rows and cells, "+" insert buttons, the move handle and double-click AutoFit; Select Column in the ribbon |
| 2026-10-12 | trivial | Quick Access Toolbar: Undo list to undo several steps at once (#701) |
| 2026-10-12 | trivial | Start screen (#766): launched with no file, the app opens on File › Home (Blank document, templates, Recent) as Word does; Esc or the back arrow leaves an empty blank document; File › Options › General › Start-up turns it off, kept between runs; `ui.startScreen` for agents. Not shown with files, `--sample` or `--control` |