cat / 012
clone

a spreadsheet for the terminal: lotus 1-2-3 looks, google sheets keys and formulas, one go binary

Test copy, paste, undo, fill and insert end to end

Dami committed a2eb17e
The harness records OSC 52 clipboard writes and pastes through
libghostty's encoder. New screens show the copy marker on plain and
selected cells (with light variants), a cut, the undo note and the
narrow layout; the renderer now draws underline styles.
commit
a2eb17eed4c01b9c4e87f2a6e4fddb46b00d5252
parent
89336a7d66c744189d74bf384b508ca4b1eb53b7
author
Dami <dami.etoile@gmail.com>
10 files changed, +324 -3
Me2e/app_test.go69++++++++++++++++++++++++++++++
Ae2e/clipboard_test.go59++++++++++++++++++++++++++
Me2e/render_test.go11++++-
Me2e/screens_test.go22+++++++++-
Ae2e/testdata/screens/copy-marker-light.html30+++++++++++++
Ae2e/testdata/screens/copy-marker-selected-light.html30+++++++++++++
Ae2e/testdata/screens/copy-marker-selected.html30+++++++++++++
Ae2e/testdata/screens/copy-marker.html30+++++++++++++
Ae2e/testdata/screens/narrow-copy.html16+++++++
Ae2e/testdata/screens/undo-note.html30+++++++++++++
M e2e/app_test.go +69 -0
@@ -131,6 +131,75 @@ func TestResizeShowsMoreColumns(t *testing.T) {
131131 s.eventually("column N after resize", func() bool { return strings.Contains(s.line(3), " N") })132132 }133133 134+func TestCopyPasteAdjustsReferences(t *testing.T) {135+ s := start(t, "")136+ clip := s.watchClipboard()137+ s.keys("2", "<tab>", "=A1*10", "<enter>", "3", "<enter>", "<ctrl+home>", "<right>", "<ctrl+c>")138+ s.waitFor("Copied B1")139+ s.eventually("system clipboard", func() bool { return clip.get() == "20" })140+ s.keys("<down>", "<ctrl+v>")141+ s.waitFor("Pasted 1 cell at B2")142+ s.waitFor("B2 =A2*10")143+ s.waitForLine(gridRow1+1, numRow(2, "3", "30"))144+145+ // Esc clears the marker; the paste stays.146+ s.keys("<esc>")147+ s.eventually("marker cleared", func() bool { return !strings.Contains(s.line(2), "Copied") })148+149+ // Cut and paste moves the cell and the formula that uses it follows.150+ s.keys("<ctrl+home>", "<ctrl+x>", "<down>", "<down>", "<down>", "<ctrl+v>")151+ s.waitFor("Moved A1 to A4")152+ s.keys("<ctrl+home>", "<right>")153+ s.waitFor("B1 =A4*10")154+ s.waitForLine(gridRow1+3, numRow(4, "2"))155+}156+157+func TestUndoRedo(t *testing.T) {158+ s := start(t, "")159+ s.keys("10", "<enter>", "=A1+1", "<enter>", "<up>", "<up>", "<shift+down>", "<delete>")160+ s.waitForLine(gridRow1, " 1")161+ s.keys("<ctrl+z>")162+ s.waitFor("Undid: clear A1:A2")163+ s.waitForLine(gridRow1+1, numRow(2, "11"))164+ s.keys("<ctrl+y>")165+ s.waitFor("Redid: clear A1:A2")166+ s.waitForLine(gridRow1+1, " 2")167+ s.keys("<ctrl+shift+z>")168+ s.waitFor("Nothing to redo")169+}170+171+func TestInsertRowRewritesFormulas(t *testing.T) {172+ s := start(t, "")173+ s.keys("1", "<enter>", "2", "<enter>", "=SUM(A1:A2)", "<enter>")174+ s.keys("<up>", "<up>", "<shift+space>", "<ctrl+alt+=>")175+ s.waitForLine(gridRow1+3, numRow(4, "3"))176+ s.keys("<down>", "<down>")177+ s.waitFor("A4 =SUM(A1:A3)")178+ s.keys("<up>", "<up>", "5", "<enter>")179+ s.waitForLine(gridRow1+3, numRow(4, "8"))180+ s.keys("<ctrl+z>", "<ctrl+z>")181+ s.waitFor("Undid: insert 1 row")182+ s.waitForLine(gridRow1+2, numRow(3, "3"))183+}184+185+func TestPasteTSVFillsCells(t *testing.T) {186+ s := start(t, "")187+ s.paste("Item\tCost\nRent\t1450\nFood\t=B2/2\n")188+ s.waitFor("Pasted 6 cells at A1:B3")189+ s.waitForLine(gridRow1+2, " 3 Food 725")190+}191+192+func TestFillAndAbsoluteReferences(t *testing.T) {193+ s := start(t, "")194+ s.keys("2", "<enter>", "3", "<enter>", "4", "<enter>", "<ctrl+home>", "<right>")195+ s.keys("=A1*A1", "<left>", "<left>", "<f4>")196+ s.waitForLine(1, "=A1*$A$1")197+ s.keys("<enter>", "<up>", "<shift+down>", "<shift+down>", "<ctrl+d>")198+ s.waitForLine(gridRow1+2, numRow(3, "4", "8"))199+ s.keys("<right>", "<shift+down>", "=B1+1", "<ctrl+enter>")200+ s.waitForLine(gridRow1+1, numRow(2, "3", "6", "7"))201+}202+134203 // Click handling is covered by the unit tests; this checks the program135204 // actually turned on mouse reporting in the terminal.136205 func TestMouseTrackingEnabled(t *testing.T) {
A e2e/clipboard_test.go +59 -0
M e2e/render_test.go +9 -2
M e2e/screens_test.go +21 -1
A e2e/testdata/screens/copy-marker-light.html +30 -0
@@ -0,0 +1,30 @@
1+<pre class="screen"><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> C2 </span> <span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> READY</span><span style="background:var(--vt-palette-6)"> </span>2+3+Copied B3:B5 <span style="font-weight:bold">Ctrl+V</span> <span style="color:var(--vt-palette-0)">paste </span><span style="font-weight:bold">Ctrl+Shift+V</span> <span style="color:var(--vt-palette-0)">paste values </span><span style="font-weight:bold">Esc</span> <span style="color:var(--vt-palette-0)">clear</span>4+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> A B </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> C </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> D E F G H I </span>5+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 1 </span> Household budget 20266+<span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> 2 </span> <span style="color:var(--vt-palette-0);background:var(--vt-palette-6)"> </span>7+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 3 </span> Rent <span style="color:var(--vt-palette-5);text-decoration:underline"> </span><span style="color:var(--vt-palette-5);text-decoration:underline dashed">1450</span><span style="color:var(--vt-palette-5);text-decoration:underline"> </span>8+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 4 </span> Groceries<span style="color:var(--vt-palette-5);text-decoration:underline"> </span><span style="color:var(--vt-palette-5);text-decoration:underline dashed">612.4</span><span style="color:var(--vt-palette-5);text-decoration:underline"> </span>9+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 5 </span> Transit <span style="color:var(--vt-palette-5);text-decoration:underline"> </span><span style="color:var(--vt-palette-5);text-decoration:underline dashed">96</span><span style="color:var(--vt-palette-5);text-decoration:underline"> </span>10+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 6 </span> Savings r<span style="color:var(--vt-palette-1)"> #DIV/0! </span>11+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 7 </span> Total 2158.412+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 8 </span>13+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 9 </span>14+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 10 </span>15+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 11 </span>16+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 12 </span>17+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 13 </span>18+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 14 </span>19+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 15 </span>20+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 16 </span>21+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 17 </span>22+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 18 </span>23+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 19 </span>24+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 20 </span>25+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 21 </span>26+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 22 </span>27+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 23 </span>28+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 24 </span>29+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 25 </span>30+untitled<span style="color:var(--vt-palette-0)"> modified</span> <span style="font-weight:bold">F1</span> <span style="color:var(--vt-palette-0)">help </span><span style="font-weight:bold">F10</span> <span style="color:var(--vt-palette-0)">menu </span><span style="font-weight:bold">Ctrl+Q</span> <span style="color:var(--vt-palette-0)">quit</span></pre>\ No newline at end of file
A e2e/testdata/screens/copy-marker-selected-light.html +30 -0
@@ -0,0 +1,30 @@
1+<pre class="screen"><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> A3 </span> Rent <span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> READY</span><span style="background:var(--vt-palette-6)"> </span>2+3+Cut A3:B5 <span style="font-weight:bold">Ctrl+V</span> <span style="color:var(--vt-palette-0)">move here </span><span style="font-weight:bold">Esc</span> <span style="color:var(--vt-palette-0)">cancel</span>4+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> A </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4)"> B </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> C D E F G H I </span>5+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 1 </span> Household budget 20266+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 2 </span>7+<span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> 3 </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);text-decoration:underline"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);text-decoration:underline dashed">Rent</span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);text-decoration:underline"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4);text-decoration:underline"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4);text-decoration:underline dashed">1450</span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4);text-decoration:underline"> </span>8+<span style="color:var(--vt-palette-15);background:var(--vt-palette-4)"> 4 </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4);text-decoration:underline"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4);text-decoration:underline dashed">Groceries</span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4);text-decoration:underline"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4);text-decoration:underline dashed">612.4</span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4);text-decoration:underline"> </span>9+<span style="color:var(--vt-palette-15);background:var(--vt-palette-4)"> 5 </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4);text-decoration:underline"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4);text-decoration:underline dashed">Transit</span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4);text-decoration:underline"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4);text-decoration:underline dashed">96</span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4);text-decoration:underline"> </span>10+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 6 </span> Savings r<span style="color:var(--vt-palette-1)"> #DIV/0! </span>11+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 7 </span> Total 2158.412+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 8 </span>13+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 9 </span>14+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 10 </span>15+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 11 </span>16+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 12 </span>17+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 13 </span>18+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 14 </span>19+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 15 </span>20+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 16 </span>21+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 17 </span>22+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 18 </span>23+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 19 </span>24+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 20 </span>25+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 21 </span>26+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 22 </span>27+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 23 </span>28+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 24 </span>29+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 25 </span>30+untitled<span style="color:var(--vt-palette-0)"> modified</span> <span style="font-weight:bold">A3:B5</span> <span style="color:var(--vt-palette-0)">Sum </span>2158.4 <span style="color:var(--vt-palette-0)">Avg </span>719.47 <span style="color:var(--vt-palette-0)">Count </span>6</pre>\ No newline at end of file
A e2e/testdata/screens/copy-marker-selected.html +30 -0
@@ -0,0 +1,30 @@
1+<pre class="screen"><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> A3 </span> Rent <span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> READY</span><span style="background:var(--vt-palette-6)"> </span>2+3+Cut A3:B5 <span style="font-weight:bold">Ctrl+V</span> <span style="color:var(--vt-palette-8)">move here </span><span style="font-weight:bold">Esc</span> <span style="color:var(--vt-palette-8)">cancel</span>4+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> A </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4)"> B </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> C D E F G H I </span>5+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 1 </span> Household budget 20266+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 2 </span>7+<span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> 3 </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);text-decoration:underline"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);text-decoration:underline dashed">Rent</span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);text-decoration:underline"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4);text-decoration:underline"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4);text-decoration:underline dashed">1450</span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4);text-decoration:underline"> </span>8+<span style="color:var(--vt-palette-0);background:var(--vt-palette-4)"> 4 </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4);text-decoration:underline"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4);text-decoration:underline dashed">Groceries</span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4);text-decoration:underline"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4);text-decoration:underline dashed">612.4</span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4);text-decoration:underline"> </span>9+<span style="color:var(--vt-palette-0);background:var(--vt-palette-4)"> 5 </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4);text-decoration:underline"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4);text-decoration:underline dashed">Transit</span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4);text-decoration:underline"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4);text-decoration:underline dashed">96</span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4);text-decoration:underline"> </span>10+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 6 </span> Savings r<span style="color:var(--vt-palette-1)"> #DIV/0! </span>11+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 7 </span> Total 2158.412+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 8 </span>13+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 9 </span>14+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 10 </span>15+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 11 </span>16+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 12 </span>17+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 13 </span>18+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 14 </span>19+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 15 </span>20+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 16 </span>21+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 17 </span>22+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 18 </span>23+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 19 </span>24+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 20 </span>25+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 21 </span>26+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 22 </span>27+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 23 </span>28+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 24 </span>29+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 25 </span>30+untitled<span style="color:var(--vt-palette-8)"> modified</span> <span style="font-weight:bold">A3:B5</span> <span style="color:var(--vt-palette-8)">Sum </span>2158.4 <span style="color:var(--vt-palette-8)">Avg </span>719.47 <span style="color:var(--vt-palette-8)">Count </span>6</pre>\ No newline at end of file
A e2e/testdata/screens/copy-marker.html +30 -0
@@ -0,0 +1,30 @@
1+<pre class="screen"><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> C2 </span> <span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> READY</span><span style="background:var(--vt-palette-6)"> </span>2+3+Copied B3:B5 <span style="font-weight:bold">Ctrl+V</span> <span style="color:var(--vt-palette-8)">paste </span><span style="font-weight:bold">Ctrl+Shift+V</span> <span style="color:var(--vt-palette-8)">paste values </span><span style="font-weight:bold">Esc</span> <span style="color:var(--vt-palette-8)">clear</span>4+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> A B </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> C </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> D E F G H I </span>5+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 1 </span> Household budget 20266+<span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> 2 </span> <span style="color:var(--vt-palette-0);background:var(--vt-palette-6)"> </span>7+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 3 </span> Rent <span style="color:var(--vt-palette-5);text-decoration:underline"> </span><span style="color:var(--vt-palette-5);text-decoration:underline dashed">1450</span><span style="color:var(--vt-palette-5);text-decoration:underline"> </span>8+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 4 </span> Groceries<span style="color:var(--vt-palette-5);text-decoration:underline"> </span><span style="color:var(--vt-palette-5);text-decoration:underline dashed">612.4</span><span style="color:var(--vt-palette-5);text-decoration:underline"> </span>9+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 5 </span> Transit <span style="color:var(--vt-palette-5);text-decoration:underline"> </span><span style="color:var(--vt-palette-5);text-decoration:underline dashed">96</span><span style="color:var(--vt-palette-5);text-decoration:underline"> </span>10+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 6 </span> Savings r<span style="color:var(--vt-palette-1)"> #DIV/0! </span>11+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 7 </span> Total 2158.412+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 8 </span>13+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 9 </span>14+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 10 </span>15+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 11 </span>16+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 12 </span>17+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 13 </span>18+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 14 </span>19+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 15 </span>20+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 16 </span>21+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 17 </span>22+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 18 </span>23+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 19 </span>24+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 20 </span>25+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 21 </span>26+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 22 </span>27+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 23 </span>28+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 24 </span>29+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 25 </span>30+untitled<span style="color:var(--vt-palette-8)"> modified</span> <span style="font-weight:bold">F1</span> <span style="color:var(--vt-palette-8)">help </span><span style="font-weight:bold">F10</span> <span style="color:var(--vt-palette-8)">menu </span><span style="font-weight:bold">Ctrl+Q</span> <span style="color:var(--vt-palette-8)">quit</span></pre>\ No newline at end of file
A e2e/testdata/screens/narrow-copy.html +16 -0
@@ -0,0 +1,16 @@
1+<pre class="screen"><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> B8 </span> <span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> READY</span><span style="background:var(--vt-palette-6)"> </span>2+3+Copied B7 <span style="font-weight:bold">Ctrl+V</span> <span style="color:var(--vt-palette-8)">paste </span><span style="font-weight:bold">Esc</span> <span style="color:var(--vt-palette-8)">clear</span>4+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> A </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> B </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> C D E </span>5+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 1 </span> Household budget 20266+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 2 </span>7+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 3 </span> Rent 14508+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 4 </span> Groceries 612.49+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 5 </span> Transit 9610+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 6 </span> Savings r<span style="color:var(--vt-palette-1)"> #DIV/0! </span>11+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 7 </span> Total <span style="color:var(--vt-palette-5);text-decoration:underline"> </span><span style="color:var(--vt-palette-5);text-decoration:underline dashed">2158.4</span><span style="color:var(--vt-palette-5);text-decoration:underline"> </span>12+<span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> 8 </span> <span style="color:var(--vt-palette-0);background:var(--vt-palette-6)"> </span>13+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 9 </span>14+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 10 </span>15+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 11 </span>16+untitled<span style="color:var(--vt-palette-8)"> modified</span> <span style="font-weight:bold">F1</span> <span style="color:var(--vt-palette-8)">help </span><span style="font-weight:bold">F10</span> <span style="color:var(--vt-palette-8)">menu </span><span style="font-weight:bold">Ctrl+Q</span> <span style="color:var(--vt-palette-8)">quit</span></pre>\ No newline at end of file
A e2e/testdata/screens/undo-note.html +30 -0
@@ -0,0 +1,30 @@
1+<pre class="screen"><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> B5 </span> 96 <span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> READY</span><span style="background:var(--vt-palette-6)"> </span>2+3+Undid: clear B5:B64+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> A </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> B </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> C D E F G H I </span>5+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 1 </span> Household budget 20266+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 2 </span>7+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 3 </span> Rent 14508+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 4 </span> Groceries 612.49+<span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> 5 </span> Transit <span style="color:var(--vt-palette-0);background:var(--vt-palette-6)"> 96 </span>10+<span style="color:var(--vt-palette-0);background:var(--vt-palette-4)"> 6 </span> Savings r<span style="color:var(--vt-palette-0);background:var(--vt-palette-4)"> #DIV/0! </span>11+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 7 </span> Total 2158.412+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 8 </span>13+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 9 </span>14+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 10 </span>15+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 11 </span>16+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 12 </span>17+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 13 </span>18+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 14 </span>19+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 15 </span>20+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 16 </span>21+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 17 </span>22+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 18 </span>23+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 19 </span>24+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 20 </span>25+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 21 </span>26+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 22 </span>27+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 23 </span>28+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 24 </span>29+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 25 </span>30+untitled<span style="color:var(--vt-palette-8)"> modified</span> <span style="font-weight:bold">B5:B6</span> <span style="color:var(--vt-palette-8)">Sum </span>96 <span style="color:var(--vt-palette-8)">Avg </span>96 <span style="color:var(--vt-palette-8)">Count </span>2</pre>\ No newline at end of file