cat / 012
clone

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

Merge branch 'main' into worktree-agent-a310ee441d83cdd0c

Dami committed d555e09
commit
d555e092b5bb8d6ca724a615fa95b6686fde9679
parent
ad47f191df64dc36d9c7e595fb31f7e165f2c852
parent
62a3e613539d08e782dfa36d25f0afcf63e8b965
author
Dami <dami.etoile@gmail.com>
154 files changed, +4177 -1145
MCLAUDE.md10+-
MMakefile2+-
MROADMAP.md2+-
Mdemos/notebook.tape39+++--
Mdemos/nu-recipe.tape12+-
Mdemos/pipeline.tape18+-
Mdocs/contributing/limits.md7+-
Mdocs/contributing/site.md55+++++-
Mdocs/contributing/testing.md12+-
Mdocs/contributing/ux.md10+-
Mdocs/formulas/tracing.md17+-
Adocs/media/evaluate-dark.pngbin
Adocs/media/evaluate-light.pngbin
Adocs/media/layout-dark.pngbin
Adocs/media/layout-light.pngbin
Adocs/media/notebook-cells-dark.pngbin
Adocs/media/notebook-cells-light.pngbin
Adocs/media/notebook-grid-dark.pngbin
Adocs/media/notebook-grid-light.pngbin
Adocs/media/notebook-nu-error-dark.pngbin
Adocs/media/notebook-nu-error-light.pngbin
Mdocs/media/notebook.gifbin
Mdocs/media/nu-recipe.gifbin
Adocs/media/palette-dark.pngbin
Adocs/media/palette-light.pngbin
Mdocs/media/pipeline.gifbin
Adocs/media/rules-bars-dark.pngbin
Adocs/media/rules-bars-light.pngbin
Adocs/media/rules-panel-dark.pngbin
Adocs/media/rules-panel-light.pngbin
Mdocs/media/sheet.gifbin
Adocs/media/table-dark.pngbin
Adocs/media/table-light.pngbin
Adocs/media/trace-view-dark.pngbin
Adocs/media/trace-view-light.pngbin
Mdocs/nushell/README.md2+-
Mdocs/nushell/cookbook.md9+-
Mdocs/nushell/notebooks.md136++++++++++----
Mdocs/nushell/pipelines.md18+-
Mdocs/reference/keys.md21++-
Mdocs/sheets/formatting.md51+++--
Mdocs/sheets/rules.md197++++++++++++---------
Mdocs/sheets/tables.md18+-
Me2e/crash_test.go7+-
Me2e/go.mod3+-
Me2e/go.sum4+
Me2e/harness_test.go1+
Me2e/jupyter_test.go33+++
Me2e/screennotebook_test.go21++-
Ae2e/stillboxes_test.go281+++++++++++++++++++++++++++++
Ae2e/stillcells_test.go245++++++++++++++++++++++++++
Ae2e/stilldraw_test.go229++++++++++++++++++++++++
Ae2e/stills_test.go157++++++++++++++++
Ae2e/stillshapes_test.go231++++++++++++++++++++++++
Ae2e/testdata/screens/docs-evaluate-light.html12+
Ae2e/testdata/screens/docs-evaluate.html12+
Ae2e/testdata/screens/docs-layout-light.html28+++
Ae2e/testdata/screens/docs-layout.html28+++
Ae2e/testdata/screens/docs-notebook-cells-light.html26+++
Ae2e/testdata/screens/docs-notebook-cells.html26+++
Ae2e/testdata/screens/docs-notebook-grid-light.html24+++
Ae2e/testdata/screens/docs-notebook-grid.html24+++
Ae2e/testdata/screens/docs-notebook-nu-error-light.html16++
Ae2e/testdata/screens/docs-notebook-nu-error.html16++
Ae2e/testdata/screens/docs-palette-light.html18++
Ae2e/testdata/screens/docs-palette.html18++
Ae2e/testdata/screens/docs-rules-bars-light.html12+
Ae2e/testdata/screens/docs-rules-bars.html12+
Ae2e/testdata/screens/docs-rules-panel-light.html12+
Ae2e/testdata/screens/docs-rules-panel.html12+
Ae2e/testdata/screens/docs-table-light.html13+
Ae2e/testdata/screens/docs-table.html13+
Ae2e/testdata/screens/docs-trace-view-light.html14+
Ae2e/testdata/screens/docs-trace-view.html14+
Me2e/testdata/screens/notebook-cells-high-contrast.html20+-
Me2e/testdata/screens/notebook-cells-light.html20+-
Me2e/testdata/screens/notebook-cells.html20+-
Me2e/testdata/screens/notebook-error-high-contrast.html20+-
Me2e/testdata/screens/notebook-error-light.html20+-
Me2e/testdata/screens/notebook-error.html20+-
Ae2e/testdata/screens/notebook-grid-filter-high-contrast.html30+++
Ae2e/testdata/screens/notebook-grid-filter-light.html30+++
Ae2e/testdata/screens/notebook-grid-filter.html30+++
Ae2e/testdata/screens/notebook-grid-high-contrast.html30+++
Ae2e/testdata/screens/notebook-grid-light.html30+++
Ae2e/testdata/screens/notebook-grid.html30+++
Me2e/testdata/screens/notebook-nu-error-high-contrast.html20+-
Me2e/testdata/screens/notebook-nu-error-light.html20+-
Me2e/testdata/screens/notebook-nu-error.html20+-
Me2e/testdata/screens/notebook-nu-highlight-high-contrast.html20+-
Me2e/testdata/screens/notebook-nu-highlight-light.html20+-
Me2e/testdata/screens/notebook-nu-highlight.html20+-
Me2e/testdata/screens/notebook-output-high-contrast.html14+-
Me2e/testdata/screens/notebook-output-light.html14+-
Me2e/testdata/screens/notebook-output.html14+-
Me2e/testdata/screens/notebook-running-high-contrast.html20+-
Me2e/testdata/screens/notebook-running-light.html20+-
Me2e/testdata/screens/notebook-running.html20+-
Me2e/testdata/screens/notebook-scroll-high-contrast.html38++--
Me2e/testdata/screens/notebook-scroll-light.html38++--
Me2e/testdata/screens/notebook-scroll.html38++--
Me2e/testdata/screens/notebook-select-high-contrast.html20+-
Me2e/testdata/screens/notebook-select-light.html20+-
Me2e/testdata/screens/notebook-select.html20+-
Me2e/testdata/screens/notebook-stale-high-contrast.html20+-
Me2e/testdata/screens/notebook-stale-light.html20+-
Me2e/testdata/screens/notebook-stale.html20+-
Me2e/testdata/screens/notebook-wrap-high-contrast.html20+-
Me2e/testdata/screens/notebook-wrap-light.html20+-
Me2e/testdata/screens/notebook-wrap-narrow-high-contrast.html16+-
Me2e/testdata/screens/notebook-wrap-narrow-light.html16+-
Me2e/testdata/screens/notebook-wrap-narrow.html16+-
Me2e/testdata/screens/notebook-wrap.html20+-
Minternal/numfmt/size.go23+-
Minternal/numfmt/size_test.go12+-
Minternal/ui/commands.go25++-
Minternal/ui/context.go4+-
Minternal/ui/crash.go8+-
Minternal/ui/crash_test.go7+-
Minternal/ui/filter.go19+-
Minternal/ui/format_test.go2+-
Minternal/ui/grid.go5+
Minternal/ui/gridlines.go3+
Minternal/ui/menuoverlay.go4+-
Minternal/ui/model.go6+
Minternal/ui/monochrome_test.go17+-
Minternal/ui/mouse.go4+-
Minternal/ui/nbcommands.go8+-
Ainternal/ui/nbgrid.go287++++++++++++++++++++++++++++++
Ainternal/ui/nbgrid_test.go200+++++++++++++++++++++
Ainternal/ui/nbgridcmd.go215++++++++++++++++++++++
Ainternal/ui/nbgridin.go275+++++++++++++++++++++++++++++
Minternal/ui/nbrun.go4+
Minternal/ui/nbscreen.go22++-
Minternal/ui/nbview/draw.go4+-
Minternal/ui/nbview/full.go271++++------------------------
Ainternal/ui/nbview/grid.go199+++++++++++++++++++++
Minternal/ui/nbview/keys.go8+-
Minternal/ui/nbview/mouse.go4+
Minternal/ui/nbview/output.go158+++-------------
Minternal/ui/nbview/outwin.go113+++---------
Minternal/ui/nbview/panel.go6+-
Minternal/ui/nbview/view.go7+
Minternal/ui/nbview/view_test.go108+++++++++---
Minternal/ui/notebook.go8+-
Minternal/ui/panel.go22++-
Minternal/ui/pivot.go4+
Minternal/ui/sort.go7+-
Minternal/ui/speed_test.go22++
Minternal/ui/testdata/speed.json5+
Minternal/ui/view.go12+-
Mscripts/doccheck/main.go106+++++++++--
Mscripts/doclint/main.go34+++-
Mwebsite/src/css/custom.css12+
M CLAUDE.md +6 -4
M Makefile +1 -1
M ROADMAP.md +1 -1
@@ -34,7 +34,6 @@ completed by nu as they're written.
3434 3535 | Item | Result | Size |3636 |---|---|---|37-| Outputs drawn as 012's own grid rather than text: column widths and number formats by type, the active cell and selection, sort, filter and find in place, copy a range, freeze the header, a chart or pivot from the output, and formulas beside it when sent to a sheet | An output works like the data it is | M |3837 | A command's signature and description for the word at the caret, on the context line, through `nu --ide-hover` or `nu --lsp` | Writing a cell without leaving for `help` | S |3938 4039 ### 3. Toward multiplayer
@@ -131,6 +130,7 @@ stream above rather than a design of their own.
131130 - The `sheet` command: a nushell module shipped in the binary (`012 nu --install-module`), so nu calls 012 without `^012` or NUON on either side: [Pipelines](docs/nushell/pipelines.md#the-sheet-command)132131 - Notebook tabs, a TUI Jupyter for nushell: code and note cells with Jupyter's keys, outputs drawn in place and opened full-screen, `$name` between cells, stale marks and a reactive mode, outputs sent to sheets as live regions (`nu.name`), saved up to a cap, and earlier notebook sheets converted on open: [Notebooks](docs/nushell/notebooks.md)133132 - Code cells highlighted, checked and completed as they're written by nu itself (`--ide-ast`, `--ide-check`, `--ide-complete`), in the background, falling back to 012's own when nu is missing, old, slow or not trusted: [Notebooks](docs/nushell/notebooks.md#writing-a-cell)133+- Table and record outputs drawn and worked as 012's own grid: formats by type, fitted and resizable columns, select, copy, sort, filter and find in place, full-screen, charts and pivots on the sheet the output is sent to: [Notebooks](docs/nushell/notebooks.md#outputs-as-grids)134134 135135 **Files**136136
M demos/notebook.tape +24 -15
@@ -1,6 +1,7 @@
11 # Notebooks: 012 nu opens a notebook, its first cell ready to type in.22 # A code cell reads a CSV as sales, a second reads it as $sales, and its3-# output goes to a sheet (G) where a formula sums it; with the notebook3+# output, entered with Enter, is a grid to select in, and goes to a4+# sheet (G) where a formula sums it; with the notebook45 # reactive, editing sales runs both again and the sheet follows. The terminal (ttyd) sends Shift+Enter as Enter, so56 # cells run with Esc then r. Needs nu on the PATH.67 Output out/notebook.gif
@@ -12,52 +13,60 @@ Sleep 2s
1213 Show1314 1415 Sleep 800ms15-Type@25ms "sales = open data/sales.csv | where Region in [North South] | select Region Quarter Units"16+Type@15ms "sales = open data/sales.csv | where Region in [North South] | select Region Quarter Units"1617 Sleep 500ms1718 Escape1819 Type "r"19-Sleep 1.5s20+Sleep 1s2021 Type "b"2122 Enter22-Type@25ms "top = $sales | where Units > 250 | sort-by Units --reverse"23+Type@15ms "top = $sales | where Units > 250 | sort-by Units --reverse"2324 Sleep 500ms2425 Escape2526 Type "r"2627 Sleep 2s2728 Screenshot out/stills/notebook-cells.png29+Down30+Enter31+Sleep 400ms32+Ctrl+Shift+Down33+Sleep 1s34+Screenshot out/stills/notebook-grid.png35+Escape Escape36+Sleep 500ms2837 Type "G"2938 Sleep 800ms3039 Enter3140 Sleep 1.2s3241 Ctrl+K33-Type@40ms "next sh"42+Type@20ms "next sh"3443 Sleep 500ms3544 Enter36-Sleep 600ms45+Sleep 400ms3746 Right Right Right Right3847 Type "=SUM(nu.top)" Enter39-Sleep 1.5s48+Sleep 1s4049 Screenshot out/stills/notebook-sent.png4150 Ctrl+K42-Type@40ms "previous sh"51+Type@20ms "previous sh"4352 Sleep 500ms4453 Enter45-Sleep 600ms54+Sleep 400ms4655 Ctrl+K47-Type@50ms "reacti"48-Sleep 600ms56+Type@20ms "reacti"57+Sleep 400ms4958 Enter5059 Sleep 400ms51-Up Up60+Up Up Up5261 Sleep 300ms5362 Enter54-Type@30ms " | where Quarter != Q1"63+Type@20ms " | where Quarter != Q1"5564 Escape5665 Type "r"57-Sleep 2.5s66+Sleep 2s5867 Screenshot out/stills/notebook-reactive.png5968 Ctrl+K60-Type@40ms "next sh"69+Type@20ms "next sh"6170 Sleep 500ms6271 Enter6372 Sleep 2s
M demos/nu-recipe.tape +3 -9
M demos/pipeline.tape +11 -7
M docs/contributing/limits.md +4 -3
M docs/contributing/site.md +52 -3
@@ -75,7 +75,9 @@ the site's first commit for every page there has been.
7575 and the sidebar is generated from the tree: `_category_.json` for7676 folders, `title` and `sidebar_position` for pages7777 ([Docs](testing.md#docs) has the rules the tree follows).78-- Images in `docs/media/` are bundled from the pages that show them.78+- Images in `docs/media/` are bundled from the pages that show them;79+ an image marked `#gh-dark-mode-only` or `#gh-light-mode-only` shows in80+ that color mode only ([Pictures of 012](#pictures-of-012)).7981 - Prism has no nushell grammar, so `nu` code blocks use a small one in8082 `website/src/prism/nushell.ts`, loaded by the swizzled8183 `website/src/theme/prism-include-languages.ts`.
@@ -105,8 +107,8 @@ are IBM Plex Mono, body text IBM Plex Sans, both bundled with the site.
105107 106108 Diagrams are Mermaid, in a `mermaid` code block, never ASCII art: the107109 same source is drawn on the site and on GitHub. A code block of text108-stays for what is text on a terminal: screens, mockups of them and109-command output.110+stays for text a reader types or a shell prints; 012's own screen is a111+picture ([Pictures of 012](#pictures-of-012)).110112 111113 - Draw one where a flow, a state machine or a sequence would otherwise112114 take paragraphs: a flowchart for data moving through the code, a state
@@ -121,3 +123,50 @@ command output.
121123 (Docusaurus's component, swizzled) draws with Mermaid's `base` theme122124 and variables read from the palette in `custom.css` for the color123125 mode shown, so diagrams don't set their own styles.126+127+## Pictures of 012128+129+A page shows 012 as a picture: a still of the screen in the site's130+color mode, or a recording. A screen typed out in a code block reads as131+a test fixture, loses the colors that carry meaning, and wraps on a132+narrow page, so `scripts/doclint` fails a code block that draws one133+(box-drawing lines with the menu bar or the notebook's toolbar, or the134+grid's column headers).135+136+A still is a [golden screen](testing.md#golden-screens) drawn as a PNG.137+Each is an entry of `docScreens` in `e2e/stills_test.go`: its name,138+the screen whose setup it records, and a terminal size that reads on a139+page (80 columns, unless the state needs more). `make screens` records140+it on a dark and a light terminal and draws both into `docs/media`:141+142+```go143+{name: "evaluate", from: "evaluate", cols: 80, rows: 12},144+// docs/media/evaluate-dark.png and docs/media/evaluate-light.png145+```146+147+The drawing is Go (`e2e/stilldraw_test.go`): the golden's cells in the148+[reference palettes](testing.md#golden-screens), text in Go Mono, and149+box drawing, blocks, braille and the chrome's symbols drawn as a150+terminal draws them, so frames join and every machine draws the same151+picture. Each PNG records which golden it was drawn from, and152+`make e2e` fails when a golden has changed since.153+154+A page shows both pictures together, marked as GitHub marks an image for155+one color mode; `custom.css` shows the site's the same way:156+157+```md158+![Evaluate formula on B8, two steps in: the next part underlined](../media/evaluate-dark.png#gh-dark-mode-only)159+![Evaluate formula on B8, two steps in: the next part underlined](../media/evaluate-light.png#gh-light-mode-only)160+```161+162+- The alt text says what the picture shows, the state and what to look163+ at, the same words on both. Write a range in it as `B3 to B5`: the site164+ reads `:B5` in text as a directive and drops it.165+- One still where the state is the point: what a feature looks like166+ before a page explains it, or a state words describe badly (a box,167+ marks in the grid). The prose keeps what the picture can't: keys,168+ limits, why.169+- A flow of several steps is a recording, a VHS tape in `demos/`170+ ([Demo recordings](testing.md#demo-recordings)).171+- `scripts/doccheck` fails on a still no page shows, or one shown172+ without its other color mode.
M docs/contributing/testing.md +8 -4
@@ -85,7 +85,10 @@ with light-terminal variants. The states are listed in
8585 `e2e/screenlist_test.go`, with the fixtures they share in8686 `e2e/screensetup_test.go`. `make screens` rewrites them and builds8787 `e2e/testdata/screens/gallery.html` with dark and light reference palettes.88-Every visual change is reviewed there before it's committed.88+Every visual change is reviewed there before it's committed. It also89+draws the docs' stills, the screens `docScreens` lists, into90+`docs/media` ([Pictures of 012](site.md#pictures-of-012)); `make e2e`91+fails on one not drawn from its golden as it is.8992 9093 ## The excelize oracle9194
@@ -203,11 +206,12 @@ and a line in the folder's README. `make site` builds them into the
203206 [docs site](site.md) and fails on any link or anchor it can't resolve.204207 205208 `make lint` runs `scripts/doclint`, which flags wording that narrates206-history (see [CLAUDE.md](../../CLAUDE.md)), and `scripts/doccheck`, which209+history (see [CLAUDE.md](../../CLAUDE.md)) and code blocks that draw210+012's screen ([Pictures of 012](site.md#pictures-of-012)), and `scripts/doccheck`, which207211 checks the tree above, that relative links and anchors resolve, that208212 every `docs/...md` path Go code names exists, that every file in209-`docs/media` is shown by a doc and made by a tape, that every tape210-records something a doc shows, and that a page the site has published213+`docs/media` is shown by a doc and made by a tape or drawn from a golden214+screen, that every tape and still is shown by a doc, and that a page the site has published211215 isn't gone without a redirect ([The docs site](site.md#old-addresses-keep-working)).212216 Unit tests check what the docs say about213217 the code: menu paths lead to menu items, command ids and keys exist and
M docs/contributing/ux.md +9 -1
@@ -52,6 +52,14 @@ follow-up task.
5252 5353 ## Visual rules5454 55+The palette over a sheet shows most of them at once: bars that fill56+the width, an overlay framed in light lines with its title in the top57+border and a count in the bottom one, keys drawn as chips, and the58+status line saying what the highlighted item does.59+60+![The command palette open over a budget: the mode indicator saying MENU, a framed list of commands with their keys as chips and a count in the bottom border, and the status line describing the highlighted one](../media/palette-dark.png#gh-dark-mode-only)61+![The command palette open over a budget: the mode indicator saying MENU, a framed list of commands with their keys as chips and a count in the bottom border, and the status line describing the highlighted one](../media/palette-light.png#gh-light-mode-only)62+5563 - Style only through `theme` roles (`internal/ui/theme`). No inline5664 `lipgloss.NewStyle()` in views. Need a new role? Add it to `theme` with a5765 comment saying what it's for, in both the dark and light variants.
@@ -99,7 +107,7 @@ there.
99107 | Entries failing validation | A dotted underline, and `Invalid:` with the rule on the context line |100108 | Values an array spilled | Italic, and `Spilled from B2` on the context line |101109 | Linked files' rows, following, paused or failing | Italic; `●`, `‖` or `!` beside the tab's name and on the context line, with the state in words (`Following`, `Paused`, the error) |102-| A notebook's cells and outputs | `❯` before the tab's name; `▌` left of the active cell and `▎` left of the others selected; a heavy box around the cell being edited; the prompt's and the box's words for its state (`[*]:` and `running`, `waiting`, `failed`, `stale`); `■` for `▶` while it runs; `output hidden` for a hidden output, and which rows show for one scrolled; `×` before an error; an output table's header bold and underlined; an output sent to a sheet in italic, with `Output of files` on the context line; a problem nu finds in the cell being written curly-underlined, in words on the context line with the caret on it |110+| A notebook's cells and outputs | Marks and words, listed in [Notebooks](../nushell/notebooks.md#reading-a-cell): the bar left of the active cell, a heavy box while it's edited, the prompt's and the box's words for its state, `×` before an error, `OUTPUT` in an output's grid, an output sent to a sheet in italic |103111 | A table's header row | Bold and underlined, when the table styles its header; `Table Sales, column Amount` on the context line |104112 | Pivot table results | Their headings (`SUM of Units`, `Grand Total`), and a note in words when an edit is refused |105113 | Protected ranges | A question in words before an edit (`A1:B2 is protected.`) |
M docs/formulas/tracing.md +6 -11
@@ -18,11 +18,11 @@ the pointer moves: the cells the active cell's formula reads in green,
1818 the formulas that read the active cell in magenta and bold. Without1919 color both are in reverse video, dependents bold as well. The context2020 line lists them all, those off screen with an arrow toward them and21-those on other sheets with their sheet:21+those on other sheets with their sheet (`C7 reads B3, Rate, Data!B2:B9;22+read by D7, A40↓, Summary!B2 +3 more`):2223 23-```24-C7 reads B3, Rate, Data!B2:B9; read by D7, A40↓, Summary!B2 +3 more25-```24+![Tracing on at the total in B7: B3:B5, which it reads, marked green, C7, which reads it, magenta, and the context line listing them, B30 below the screen](../media/trace-view-dark.png#gh-dark-mode-only)25+![Tracing on at the total in B7: B3:B5, which it reads, marked green, C7, which reads it, magenta, and the context line listing them, B30 below the screen](../media/trace-view-light.png#gh-light-mode-only)2626 2727 Alt+; again stops. What counts as a link:2828
@@ -64,13 +64,8 @@ Evaluate Formula, opens a box over the grid with the active cell's
6464 formula. The part computed next is underlined, and the line under it6565 says what it computes:6666 67-```68-┌─ Evaluate D1 ────────────────────────────────────────┐69-│ =IF(TRUE,SUM(A2:A3)*2,A3) │70-├──────────────────────────────────────────────────────┤71-│ Next SUM(A2:A3) = 5 │72-└───────────────────────────────────────────── 2 of 5 ─┘73-```67+![Evaluate formula on B8, two steps in: the values computed so far in italic, the next part underlined, and on the line under it what that part computes](../media/evaluate-dark.png#gh-dark-mode-only)68+![Evaluate formula on B8, two steps in: the values computed so far in italic, the next part underlined, and on the line under it what that part computes](../media/evaluate-light.png#gh-light-mode-only)7469 7570 - Enter puts the value in its place, in italic, and underlines the next7671 part, until the formula's value is all that's left; Enter then starts
A docs/media/evaluate-dark.png +0 -0

Binary file.

A docs/media/evaluate-light.png +0 -0

Binary file.

A docs/media/layout-dark.png +0 -0

Binary file.

A docs/media/layout-light.png +0 -0

Binary file.

A docs/media/notebook-cells-dark.png +0 -0

Binary file.

A docs/media/notebook-cells-light.png +0 -0

Binary file.

A docs/media/notebook-grid-dark.png +0 -0

Binary file.

A docs/media/notebook-grid-light.png +0 -0

Binary file.

A docs/media/notebook-nu-error-dark.png +0 -0

Binary file.

A docs/media/notebook-nu-error-light.png +0 -0

Binary file.

M docs/media/notebook.gif +0 -0

Binary file.

M docs/media/nu-recipe.gif +0 -0

Binary file.

A docs/media/palette-dark.png +0 -0

Binary file.

A docs/media/palette-light.png +0 -0

Binary file.

M docs/media/pipeline.gif +0 -0

Binary file.

A docs/media/rules-bars-dark.png +0 -0

Binary file.

A docs/media/rules-bars-light.png +0 -0

Binary file.

A docs/media/rules-panel-dark.png +0 -0

Binary file.

A docs/media/rules-panel-light.png +0 -0

Binary file.

M docs/media/sheet.gif +0 -0

Binary file.

A docs/media/table-dark.png +0 -0

Binary file.

A docs/media/table-light.png +0 -0

Binary file.

A docs/media/trace-view-dark.png +0 -0

Binary file.

A docs/media/trace-view-light.png +0 -0

Binary file.

M docs/nushell/README.md +1 -1
M docs/nushell/cookbook.md +5 -4
@@ -20,15 +20,16 @@ Money written as text (`"$2,252.50"`) becomes numbers in nushell, and a
2020 second cell totals it by region, sent to a sheet with a chart that2121 follows it.2222 23-![Nushell turns a CSV's money text into numbers, a second cell totals it by region, and its output, sent to a sheet, feeds a column chart](../media/nu-recipe.gif)23+![Nushell turns a CSV's money text into numbers, a second cell totals it by region, and Insert > Chart on its output's grid sends it to a sheet and charts it there](../media/nu-recipe.gif)2424 2525 ```nu2626 sales = open sales.csv | update Revenue { str replace -ar '[$,]' '' | into float }2727 totals = $sales | group-by Region --to-table | update items { get Revenue | math sum } | rename Region Revenue2828 ```2929 30-To chart it, `G` on `totals` sends its output to a new sheet; there,31-**Insert > Chart** charts the table around the pointer. Edit `sales` to30+To chart it, Enter on `totals`'s output, then **Insert > Chart**: the31+output goes to a new sheet named `totals` and the chart goes beside it32+([Outputs as grids](notebooks.md#outputs-as-grids)). Edit `sales` to3233 read another file and run it: `totals` shows `stale` until it runs too3334 (at once in a [reactive notebook](notebooks.md#stale-outputs-and-reactive-notebooks)),3435 and then the sheet and the chart follow.
@@ -89,7 +90,7 @@ http get https://api.github.com/repos/nushell/nushell/issues | select number tit
8990 Sort by comments, filter by author, or make a pivot table of issues by9091 author, in the sheet. In a notebook, the same pipeline without9192 `| sheet view` is a cell that fetches the list again each time it runs;92-Enter on its output opens it full-screen to sort and filter, and93+Enter on its output works in it as a grid, to sort, filter and chart, and9394 `nu-timeout` stops a request that hangs.9495 9596 Nushell: [`http get`](https://www.nushell.sh/commands/docs/http_get.html),
M docs/nushell/notebooks.md +96 -40
@@ -16,7 +16,7 @@ files = ls | where type == file
1616 $files | where size > 1kb | sort-by size --reverse1717 ```1818 19-![A notebook: a cell reads a CSV as sales, a second reads it as $sales, its output is sent to a sheet and summed there, and with the notebook reactive, editing sales runs both again and the sum follows](../media/notebook.gif)19+![A notebook: a cell reads a CSV as sales, a second reads it as $sales, its output is a grid to select in and is sent to a sheet and summed there, and with the notebook reactive, editing sales runs both again and the sum follows](../media/notebook.gif)2020 2121 Open one from a shell with `012 nu`, or from nushell with `sheet nu`2222 (`sheet` comes from 012's nushell module: [Install the `sheet`
@@ -38,27 +38,28 @@ works as before.
3838 3939 The tab looks and works like Jupyter's: a toolbar over the cells, a4040 code cell's pipeline in a box with its prompt at the left and a `▶` that41-runs it at the right, its output under it, and note cells drawn as text:41+runs it at the right, its output under it, and note cells drawn as text.4242 43-```44- ▶ Run ■ Stop ↻ Restart ▶▶ Run all │ + Add ✂ Cut ⧉ Copy ⎘ Paste │ Code ▾ nu ○ idle45- big: reads $files; read as $big, nu.big in formulas ──────────────── Enter edit46- Files47- What's big in the repo, from ls.48-49-▌ ╭─ big ───────────────────────────────────────────── ✓ <1s ─╮50-▌ [2]: │ big = $files | where size > 1kb │ ▶51-▌ │ | sort-by size --reverse │52-▌ ╰────────────────────────────────────────────────────────────╯53-▌ Out[2]: name size54-▌ README.md 9.8 kB55-▌ 012 4.2 kB56-```43+![A notebook of a note and two code cells: files lists the directory, and the second cell, selected, keeps its files over 1 kB; each output is a grid under its cell, and the toolbar runs, adds and moves cells](../media/notebook-cells-dark.png#gh-dark-mode-only)44+![A notebook of a note and two code cells: files lists the directory, and the second cell, selected, keeps its files over 1 kB; each output is a grid under its cell, and the toolbar runs, adds and moves cells](../media/notebook-cells-light.png#gh-light-mode-only)45+46+### Reading a cell47+48+Every state shows in words or marks as well as in color, so a notebook49+reads the same on a terminal without it:5750 58-The prompt says how many runs came before this one (`[2]:`, `[*]:` while59-it runs, `[ ]:` before it has), and `Out[2]:` marks the output of that60-run. The box's top border names the cell and says at its right how its61-run stands, `saved` for an output read from the file:51+| Where | Shows |52+|---|---|53+| The tab | `❯` before the notebook's name |54+| Left of the cells | A bar at the active cell, blue in command mode and green in edit mode, and a thinner one at the others selected ([Keys](#keys)) |55+| The box | Light lines, and heavy ones around the cell being edited |56+| The prompt | How many runs came before this one: `[2]:`, `[*]:` while it runs, `[ ]:` before it has; `Out[2]:` marks the output of that run |57+| The box's top border | The cell's name at the left, and at the right how its run stands (below): `waiting`, `running`, ✓ and how long it took, `failed`, `stale`, or `saved` for an output read from the file |58+| Right of the box | `▶` runs the cell, `■` stops it while it runs |59+| The output | What it is ([below](#outputs)): a table or a record as a grid, its column names where a sheet has letters; `×` before an error; `output hidden`; which rows show in its window. Worked in, `OUTPUT` in the mode indicator, the bar left of it green, and its pointer and selection in reverse video, as on a sheet ([Outputs as grids](#outputs-as-grids)) |60+| The context line | What the cell reads and how others read it (`big: reads $files; read as $big, nu.big in formulas`), the keys that apply, and what nu says about the cell being written, underlined curly in the cell ([Writing a cell](#writing-a-cell)) |61+62+A cell's run goes through these states:6263 6364 ```mermaid6465 stateDiagram-v2
@@ -82,13 +83,15 @@ stateDiagram-v2
8283 A source is shown whole: a line too long for the screen wraps before a8384 pipe where it can, its next rows indented.8485 86+### Outputs87+8588 Outputs are drawn by what they are, with values formatted as cells8689 ([Types](types.md)):8790 8891 | Output | Shows |8992 |---|---|90-| A table (a list of records) | Its columns fitted to their values, numbers right-aligned, under its header |91-| A record | Its fields, one a line: `key value` |93+| A table (a list of records) | 012's grid ([Outputs as grids](#outputs-as-grids)): its columns headed by their names and fitted to their values, its rows numbered from 1 |94+| A record | The same grid of two columns, `field` and `value`, a field a row |9295 | A list | Its items, numbered from 0, as nushell numbers them |9396 | Text | Its lines, wrapped |9497 | A value | As a cell shows it: `4.2 kB`, `9/27/2026 11:27:31` |
@@ -116,11 +119,68 @@ stateDiagram-v2
116119 hidden --> window: o117120 ```118121 119-**Enter** on an output, or a double click, opens it full-screen: arrows120-(or `h` `j` `k` `l`) move, `s` sorts by the pointer's column and `S` in121-descending order (again for the output's own order), `/` keeps the rows122-holding what's typed, and Esc (or `◀ Back`) goes back. The output itself123-doesn't change.122+**Enter** on any other output, or a double click, opens it full-screen,123+its lines scrolled with the arrows; Esc (or `◀ Back`) goes back.124+125+### Outputs as grids126+127+A table or a record is drawn as 012's own grid, the one a sheet has:128+the values are the cells [sending it to a sheet](#send-to-a-sheet)129+makes, each in the format of its type (sizes as `4.2 kB`, durations,130+dates), right-aligned numbers, fitted columns and the grid's row131+numbers, with the table's column names where a sheet has letters.132+133+**Enter** on the output, or a click in it, works in it (the mode134+indicator says `OUTPUT`, and the bar left of it turns green, as for a135+cell edited): an active cell moves with the arrows, and the grid's keys,136+menus and mouse work on it as on a sheet, in its window:137+138+![The output of files worked as a grid: OUTPUT in the mode indicator, the bar left of it green, its first two rows selected and the status line counting them](../media/notebook-grid-dark.png#gh-dark-mode-only)139+![The output of files worked as a grid: OUTPUT in the mode indicator, the bar left of it green, its first two rows selected and the status line counting them](../media/notebook-grid-light.png#gh-light-mode-only)140+141+- Shift+arrows, Ctrl+A or a drag select a range, and the status line142+ shows its Sum, Avg and Count; Ctrl+C copies it, as TSV to the system143+ clipboard and with its formats for Ctrl+V on a sheet.144+- **Data > Sort sheet** (or the column's right-click menu) sorts by the145+ active column, **Data > Create a filter** puts `▾` on each column's146+ name, and Alt+Down (or a click on `▾`) opens the column's filter;147+ Ctrl+F finds.148+- Drag the right edge of a column's name, or **Format > Column width**,149+ to resize it; Shift+wheel scrolls a wide table sideways; the names150+ stay on top as the rows scroll.151+- Ctrl+Z undoes a sort, a filter or a width; typing, Del, paste and152+ formats are refused, as they'd change the output: `G` sends it to a153+ sheet, where its copy can change.154+- **Enter** shows the grid full-screen, where it all works the same;155+ **Esc** deselects, then goes back from full-screen, then back to the156+ notebook.157+158+```mermaid159+stateDiagram-v2160+ selected: output selected (NOTEBOOK)161+ window: its grid, in its window (OUTPUT)162+ full: its grid, full-screen (OUTPUT)163+ selected --> window: Enter, a click in it164+ window --> full: Enter, a double click165+ full --> window: Esc166+ window --> selected: Esc167+```168+169+Sorting and filtering act on the grid's copy: the output, what later170+cells read as `$name`, doesn't change, and running the cell again171+draws its new output afresh.172+173+**Insert > Chart**, **Data > Pivot table** and the frequency table174+(Alt+Shift+F) on the grid make them where charts and pivot tables live,175+on a sheet: the output is [sent to a sheet](#send-to-a-sheet) first (a new176+one named after the cell, unless it's on one already), and the command177+runs there on the columns selected in the grid, every row under the178+header. A chart drawn under the output would have to squeeze into the179+notebook's column and scroll with the cells; on the sheet it has room,180+its editor, images where the terminal draws them, and it follows the181+cell's next run, as the region it charts does.182+183+### Note cells124184 125185 Note cells are Markdown: headings, **bold**, *italic*, `code`, links (the126186 terminal opens them), lists and quotes. They're drawn as text, without a
@@ -142,11 +202,10 @@ stateDiagram-v2
142202 Output --> Command: Esc143203 ```144204 145-A bar at the left marks the active cell: `▌`, blue in command mode and146-green in edit mode, where the cell's box is drawn in heavy lines too, so147-the mode reads without color. Shift+Up and Shift+Down (or `K` and `J`,148-or Shift+click) select the cells passed over as well, marked `▎`, and149-the commands below that act on "the cells" act on all of them: run,205+The bar left of the active cell and the box's lines say which mode206+you're in ([Reading a cell](#reading-a-cell)). Shift+Up and Shift+Down207+(or `K` and `J`, or Shift+click) select the cells passed over as well,208+and the commands below that act on "the cells" act on all of them: run,150209 delete, copy, cut, move, make notes or code, hide or clear outputs.151210 152211 | Key | In command mode |
@@ -154,7 +213,7 @@ delete, copy, cut, move, make notes or code, hide or clear outputs.
154213 | Up, Down, `j`, `k` | Move between cells, stopping at each output; on an output, scroll its window first |155214 | Shift+Up, Shift+Down, `K`, `J` | Select the cells passed over too |156215 | Home, End, PgUp, PgDn | The first cell, the last, a screen up or down |157-| Enter | Edit the cell; on an output, open it full-screen |216+| Enter | Edit the cell; on a table or record output, work in its grid; on another, open it full-screen |158217 | Shift+Enter | Run the cells and select the next, adding one at the end |159218 | Ctrl+Enter, `r` | Run the cells, staying on them |160219 | Alt+Enter | Run the cells and add a code cell under them |
@@ -226,12 +285,8 @@ keywords, operators; flags stay plain), and `nu --ide-check` what's
226285 wrong. A problem is underlined with a curly line, and with the caret on227286 it the context line says what nu said:228287 229-```230- [ ] not run231-│ $files | sort-by size --revrse232- ~~~~~~~~233-The `sort-by` command doesn't have flag `revrse`.234-```288+![A cell being edited, its box in heavy lines: the misspelled flag --revrse is underlined with a curly line, and the context line says the sort-by command doesn't have that flag](../media/notebook-nu-error-dark.png#gh-dark-mode-only)289+![A cell being edited, its box in heavy lines: the misspelled flag --revrse is underlined with a curly line, and the context line says the sort-by command doesn't have that flag](../media/notebook-nu-error-light.png#gh-light-mode-only)235290 236291 Tab asks `nu --ide-complete` too, after the notebook's own names, so it237292 completes flags, subcommands and paths as well as cells and commands.
@@ -342,7 +397,8 @@ nu.files, 3, FALSE)`), and charts and pivot tables use. It's also a
342397 [table](../sheets/tables.md#notebook-outputs-and-linked-files) by the343398 cell's name, read by column: `=SUM(big[size])`, `=COUNTIF(app[status],344399 500)`, with `big` alone its rows under the header. A cell without a345-name is given one first.400+name is given one first. On the region's cells the context line says401+whose output they are (`Output of big`).346402 347403 ```mermaid348404 sequenceDiagram
M docs/nushell/pipelines.md +10 -8
@@ -5,23 +5,25 @@ sidebar_position: 2
55 66 # Pipelines77 8-012 can be a stage in a pipeline: a table comes in on standard input,9-you look at it or edit it in the terminal, and with `--pipe` the result10-goes out on standard output for the next command.8+012 can be a stage in a pipeline: a table comes in, you look at it or9+edit it in the terminal, and what you send back goes on to the next10+command. With the [`sheet` command](#the-sheet-command) installed11+(`012 nu --install-module`), that stage is one word:1112 1213 ```nu13-ls | select name size | to nuon | ^012 --pipe | from nuon | where size > 1kb14+ls | select name size | sheet --send selection | where size > 1kb1415 ```1516 16-![In nushell, ls's table goes through 012, three of its rows are selected and sent on, and nu keeps filtering them by size](../media/pipeline.gif)17+![In nushell, ls's table goes through sheet, three of its rows are selected, and quitting sends them on for nu to keep filtering by size](../media/pipeline.gif)1718 19+`sheet` is shorthand for20+`to nuon | ^012 --pipe | from nuon`:1821 [`to nuon`](https://www.nushell.sh/commands/docs/to_nuon.html) writes1922 the table in NUON, nushell's own notation, so file sizes, durations and2023 dates arrive as themselves, and2124 [`from nuon`](https://www.nushell.sh/commands/docs/from_nuon.html) reads22-what 012 sends back with the same types ([Types](types.md)). With the23-[`sheet` command](#the-sheet-command) installed, the same stage is24-`ls | select name size | sheet | where size > 1kb`.25+what 012 sends back with the same types ([Types](types.md)). Without the26+module, write it out.2527 2628 The screen is the terminal's own (`/dev/tty`, or the console on2729 Windows), not standard input or output, so the pipeline's data never
M docs/reference/keys.md +15 -6
@@ -147,7 +147,7 @@ on a sheet, `!` starts an entry as any character does.
147147 | Up, Down, `j`, `k`, Home, End, PgUp, PgDn | Move between cells and their outputs; on an output, Up and Down scroll its window first |148148 | Shift+Up, Shift+Down, `K`, `J` | Select the cells passed over too, to run, delete, copy or move together |149149 | Alt+Up, Alt+Down, Ctrl+Shift+Up, Ctrl+Shift+Down | Move the selected cells up or down |150-| Enter | Edit the cell; on an output, open it full-screen |150+| Enter | Edit the cell; on a table or record output, work in its grid; on another output, open it full-screen |151151 | Shift+Enter, Ctrl+Enter, `r`, Alt+Enter | Run the cells and select the next; run them in place (`r` too); run them and add a cell under them |152152 | F9 | Run every cell |153153 | `a`, `b`, `!` | Add a code cell above, below; add one below and edit it |
@@ -167,11 +167,19 @@ on a sheet, `!` starts an entry as any character does.
167167 | Up, Down, Home, End, Ctrl+A, Ctrl+E | Move by the lines on screen; the start, the end of the line |168168 | Word keys | As [anywhere text is edited](#entering-data); Ctrl+U deletes to the start of the line, not the cell |169169 170-| Key | On an output full-screen |170+| Key | In a table's or record's output ([its grid](../nushell/notebooks.md#outputs-as-grids)) |171171 |---|---|172-| Arrows, `h`, `j`, `k`, `l`, PgUp, PgDn, `g`, `G` | Move |173-| `s`, `S` | Sort by the pointer's column, A to Z or Z to A; again for the output's order |174-| `/` | Keep the rows holding what's typed; Esc clears it |172+| Arrows, Shift+arrows, Ctrl+arrows, PgUp, PgDn, Ctrl+A | Move and select, as [on a sheet](#selecting); the status line shows Sum, Avg and Count |173+| Ctrl+C | Copy the selection, to paste on a sheet or elsewhere |174+| Ctrl+F | Find in the output |175+| Alt+Down | With a filter on (Data > Create a filter), the column's filter |176+| Ctrl+Z, Ctrl+Y | Undo, redo a sort, a filter or a column's width |177+| Enter | Show the grid full-screen |178+| Esc | Deselect; then back from full-screen, then back to the notebook |179+180+| Key | On any other output full-screen |181+|---|---|182+| Up, Down, `j`, `k`, PgUp, PgDn, `g`, `G` | Move |175183 | Esc, `q` | Back to the notebook |176184 177185 ## Keys the terminal has to tell apart
@@ -323,7 +331,8 @@ On a notebook's tab, as in JupyterLab:
323331 | Click a cell; Shift+click | Select it; select the cells between too |324332 | Click in a code cell's box; double-click a note | Edit it, the caret where you clicked |325333 | Click `▶` (`■` while it runs) | Run the cell (stop it) |326-| Click an output; double-click it | Select it; open it full-screen |334+| Click an output; double-click it | Select it (in a table's or record's grid, the cell clicked, to work in it); open it full-screen |335+| Drag in an output's grid; drag its column header's right edge | Select cells; resize the column |327336 | Click left of an output | Hide it, or show it again |328337 | Wheel over an output's window | Scroll the output, then the notebook |329338 | Click a toolbar button | Run, stop, restart, run all, add, cut, copy, paste, or pick the cell's kind |
M docs/sheets/formatting.md +28 -23
@@ -97,31 +97,36 @@ copied, cut or moved.
9797 9898 ## Borders9999 100-Format > Borders draws lines along the edges of the selected cells: all101-of them, the outline (outer), the lines between the cells (inner), or102-one side; None removes them. Lines are thin, thick or double, whichever103-of Thin lines, Thick lines and Double lines was picked last (thin at104-first), as Sheets' border style keeps its choice. Alt+Shift+1 to 4 draw105-the top, right, bottom and left border, Alt+Shift+7 the outline and106-Alt+Shift+6 clears them ([keys](../reference/keys.md#formatting)).100+![A trip plan with thin lines between its cells, a thick outline and a double line under the headers, under a title merged across it; the notes wrap, and their rows grow to fit](../media/layout-dark.png#gh-dark-mode-only)101+![A trip plan with thin lines between its cells, a thick outline and a double line under the headers, under a title merged across it; the notes wrap, and their rows grow to fit](../media/layout-light.png#gh-light-mode-only)102+103+Select the cells, then Format > Borders:104+105+- **All**, **Outer** (the outline) or **Inner** (the lines between the106+ cells) draws those edges; **Top**, **Bottom**, **Left** and **Right**107+ one side; **None** removes them.108+- **Thin lines**, **Thick lines** and **Double lines** pick the line the109+ next border is drawn with, thin until you pick, as Sheets' border110+ style keeps its choice.111+- Alt+Shift+1 to 4 draw the top, right, bottom and left border,112+ Alt+Shift+7 the outline and Alt+Shift+6 clears them113+ ([keys](../reference/keys.md#formatting)).114+115+Where two cells share an edge, the heavier line shows, and drawing an116+edge again from one side replaces the other side's line. Borders are117+part of a cell's formatting: they fall back on rows and columns, travel118+with copies and go with Clear formatting. The outline of whole columns119+or rows runs along the sheet's own edges too: over row 1 and under the120+last row, or down column A and the last column.107121 108122 The grid draws borders with box-drawing characters, which terminals109-join where lines meet (`┌─┬─┐`, `╔═╤═╗`). A line down the side of a cell110-takes the first column of the cell to its right, which is padding111-anyway. A terminal has no thinner line between two rows of characters,112-so a line along the top of a row takes a line of the screen above it,113-as tables printed in a terminal do: a bordered table is taller than a114-plain one. Where two cells share an edge, the heavier line shows, and115-drawing an edge again from one side replaces the other side's line.116-Borders are part of a cell's formatting: they fall back on rows and117-columns, travel with copies and go with Clear formatting. The outline118-of whole columns or rows runs along the sheet's own edges too: over119-row 1 and under the last row, or down column A and the last column.120-121-Unicode has no joint where a double line meets a thick one, so there122-the joint is drawn thick, the heavier look, and the double line starts123-beside it with a thick stub: a double line under the headers of a124-table with a thick outline reads `┣━═══════╪═══════━┫`.123+join where lines meet. A line down the side of a cell takes the first124+column of the cell to its right, which is padding anyway. A terminal125+has no thinner line between two rows of characters, so a line along126+the top of a row takes a line of the screen above it, as tables printed127+in a terminal do: a bordered table is taller than a plain one. Unicode128+has no joint where a double line meets a thick one, so there the joint129+is drawn thick, and the double line starts beside it.125130 126131 ### Border colors127132
M docs/sheets/rules.md +114 -83
@@ -5,95 +5,137 @@ sidebar_position: 7
55 66 # Conditional formatting and data validation77 8+Rules make cells show and check what they hold, as Sheets' do.9+Conditional formatting colors a cell by its value, or draws a bar or an10+icon in it; data validation limits what a cell takes, and gives it a11+dropdown or a checkbox. Both only change how cells look and what they12+accept, never a value already there.13+14+![A class's scores: data bars across the points, arrows by the change and filling circles by grade; a dropdown on each track, and checkboxes for who passed](../media/rules-bars-dark.png#gh-dark-mode-only)15+![A class's scores: data bars across the points, arrows by the change and filling circles by grade; a dropdown on each track, and checkboxes for who passed](../media/rules-bars-light.png#gh-light-mode-only)16+817 ## Conditional formatting918 10-Format > Conditional formatting opens the sheet's rules in a panel at the11-right of the grid, as Sheets' sidebar: `+ Add rule` adds one over the12-selection, Enter edits the highlighted rule, Del removes it and13-Shift+Up/Down moves it. In a rule's form, Up/Down pick a line,14-Left/Right change a choice, Space flips a check, text lines are typed15-into, Enter saves and Esc goes back without saving. Every change is an16-undo step.19+Select the cells, then Format > Conditional formatting. The sheet's20+rules open in a panel at the right of the grid, as Sheets' sidebar:1721 18-![Checking a task off, picking an owner from a dropdown, a rejected entry, and the rules panel](../media/rules.gif)22+![The conditional format rules panel beside a task list: a custom formula striking out done tasks, a color scale on the hours, and a rule on the total, each with a swatch of what it does](../media/rules-panel-dark.png#gh-dark-mode-only)23+![The conditional format rules panel beside a task list: a custom formula striking out done tasks, a color scale on the hours, and a rule on the total, each with a swatch of what it does](../media/rules-panel-light.png#gh-light-mode-only)1924 20-A rule applies to ranges (`A2:A100`, or several: `A2:A9,C2:C9`) and is21-one of:22-23-- **Single color**: cells that meet a condition get a text color, a fill,24- and bold, italic, underline or strikethrough. The conditions are25- Sheets': is empty, is not empty, text contains, does not contain,26- starts with, ends with, is exactly (ignoring case), date is, is before,27- is after, greater than, greater than or equal to, less than, less than28- or equal to, is equal to, is not equal to, is between, is not between,29- and custom formula is; and Excel's, which compare a cell with the rest30- of the rule's cells: top values and bottom values (the highest or31- lowest 1 to 1000, ties included), top and bottom percent, above and32- below average, and duplicate and unique values (text ignoring case).33- A value may be a formula (`=B2`), and a custom formula (`=$C2>100`) is34- written for the first cell of the first range: its relative references35- move with each cell, as a copied formula's would.36-- **Color scale**: every number in the ranges is shaded along two or three37- colors, from its minimum to its maximum; each point is the minimum or38- maximum value, a number, a percent of the way between them, or a39- percentile, and a midpoint is optional.40-- **Data bar**: every number gets a bar across its cell, as long as the41- number is far from the shortest point to the longest. Automatic points42- run from zero (or the lowest number, when that's below zero) to the43- highest; either may be a number, a percent or a percentile. Bars are44- drawn in eighth blocks (`██▍`) in one of the named colors, so a bar45- ends within a column, and text they run under is drawn in reverse46- video; Show bar only hides the numbers.47-- **Icon set**: every number gets an icon at its cell's left by the48- thresholds it reaches, each a percent of the way from lowest to49- highest, a number or a percentile: arrows (`↓ → ↑`, in 3, 4 or 5),50- circles filling up (`○ ◑ ●`, in 3, 4 or 5), symbols (`✗ ! ✓`) or51- rating bars (`▂ ▄ ▆ █`, in 4 or 5), the lowest red, the highest green52- and those between yellow (rating bars blue). Reverse icons gives the53- lowest values the highest icon, and Show icon only hides the numbers.54-55-Dates in "date is", "is before" and "is after" are a date, or a period56-as Sheets and Excel name them: today, tomorrow, yesterday, the past57-week, month or year, and this, last or next week, month or year (weeks58-run Sunday to Saturday). A date is in a period, before its first day or59-after its last.60-61-Data bars and icons are glyphs, so they read without color as they do62-in it; their colors are the terminal's, as the other rules' are.25+- **Add a rule**: `+ Add rule` makes one over the selection and opens26+ its form. Up and Down pick a line, Left and Right change a choice,27+ Space flips a check, text lines are typed into; Enter saves and Esc28+ goes back without saving.29+- **Change one**: Enter edits the highlighted rule, Del removes it, and30+ Shift+Up and Shift+Down move it up or down the list.31+- **Take cells out of every rule**: Format > Clear conditional formats32+ on the selection.33+34+Every change is an undo step. A rule applies to ranges (`A2:A100`, or35+several: `A2:A9,C2:C9`), and is one of four kinds:36+37+| Rule | Does | Shows |38+|---|---|---|39+| Single color | Formats the cells that meet a [condition](#conditions) | A text color, a fill, and bold, italic, underline or strikethrough |40+| Color scale | Shades every number from its [lowest point to its highest](#points) | A fill along two or three colors |41+| Data bar | Draws a bar across every number, as long as the number is far from the shortest point to the longest | A bar in one of the named colors; the text over it in reverse video. Show bar only hides the numbers |42+| Icon set | Puts an icon at the left of every number by the thresholds it reaches | Arrows (3, 4 or 5), circles filling up (3, 4 or 5), symbols (3) or rating bars (4 or 5), the lowest red, the highest green, those between yellow (rating bars blue). Reverse icons turns them around; Show icon only hides the numbers |43+44+Data bars and icons are characters (eighth blocks, arrows, circles), so45+they read without color as they do in it.46+47+### Conditions48+49+A single-color rule formats the cells that meet its condition; a value50+in it may be a formula (`=B2`).51+52+| Condition | A cell meets it when |53+|---|---|54+| Is empty, is not empty | It's blank, or not |55+| Text contains, does not contain, starts with, ends with, is exactly | Its text does, ignoring case |56+| Date is, is before, is after | Its date is, is before or is after a date or a [period](#dates-and-periods) |57+| Greater than, greater than or equal to, less than, less than or equal to, is equal to, is not equal to, is between, is not between | Its number compares so |58+| Custom formula is | The formula is TRUE for it |59+| Top values, bottom values | It's among the highest or lowest 1 to 1000 of the rule's cells, ties included |60+| Top percent, bottom percent | It's in the highest or lowest percent of them |61+| Above average, below average | It's above or below their average |62+| Duplicate values, unique values | Another of them holds the same (text ignoring case), or none does |63+64+The last four rows are Excel's, and compare a cell with the rest of the65+rule's cells; the others are Sheets'. A custom formula (`=$C2>100`) is66+written for the first cell of the first range: its relative references67+move with each cell, as a copied formula's would.68+69+#### Dates and periods70+71+A date condition takes a date, or a period as Sheets and Excel name72+them: today, tomorrow, yesterday, the past week, month or year, and73+this, last or next week, month or year (weeks run Sunday to Saturday). A74+date is in a period, before its first day or after its last.75+76+### Points77+78+A color scale runs from a minimum to a maximum, with an optional79+midpoint, and a data bar from its shortest point to its longest. Each80+point is the lowest or highest value, a number, a percent of the way81+between them, or a percentile. A data bar's automatic points run from82+zero (or the lowest number, when that's below zero) to the highest. An83+icon set's thresholds are each a percent of the way from lowest to84+highest, a number or a percentile.85+86+### Which rule wins, and colors6387 6488 Rules are tried in order, and the first that applies to a cell formats65-it, so a rule higher in the list wins. The pointer and the selection draw66-over a rule's colors; its text styles show through them.89+it, so a rule higher in the list wins. The pointer and the selection90+draw over a rule's colors; its text styles show through them.6791 6892 Colors are named (red, yellow, green, cyan, blue, magenta) rather than6993 picked from a color wheel, because each is one of the terminal's 16 ANSI70-colors: the terminal's palette or the color scheme ([Themes](../terminal/themes.md))71-decides what they look like, and a fill's text is drawn in whichever of72-black or white reads on it. A text color that wouldn't read on a rule's73-fill takes the fill's ink instead. Color scales blend the scheme's colors74-(or the terminal's, as it reports them) and pick readable text for each75-shade.94+colors: the terminal's palette or the color scheme95+([Themes](../terminal/themes.md)) decides what they look like, and a96+fill's text is drawn in whichever of black or white reads on it. A text97+color that wouldn't read on a rule's fill takes the fill's ink instead.98+Color scales blend the scheme's colors (or the terminal's, as it reports99+them) and pick readable text for each shade.76100 77101 Rules only change how cells look, so they may go on a pivot table's78102 results. They follow inserted and deleted rows and columns, and a rule79-whose cells are all deleted goes. Format > Clear conditional formats80-takes the selection out of every rule.103+whose cells are all deleted goes.81104 82105 ## Data validation83106 84-Data > Data validation opens the sheet's validation rules in the same85-panel; Insert > Dropdown opens it with a dropdown for the selection, and86-Insert > Checkbox makes the selection checkboxes at once. The criteria:107+Select the cells, then Data > Data validation: the sheet's validation108+rules open in the same panel, and work as conditional formats' do.109+Insert > Dropdown opens it with a dropdown for the selection, and110+Insert > Checkbox makes the selection checkboxes at once.111+112+![Checking a task off, picking an owner from a dropdown, a rejected entry, and the rules panel](../media/rules.gif)87113 88114 | Criteria | Cells may hold | Shows |89115 |---|---|---|90-| Dropdown | one of the items typed (`Yes, No, Maybe`), ignoring case | the value on a chip, `▐Yes ▾▌`, or ▾ at the right of the cell |91-| Dropdown (from a range) | one of the values in a range, on any sheet (`Lists!A1:A20`) | a chip, or ▾ |116+| Dropdown | One of the items typed (`Yes, No, Maybe`), ignoring case | The value on a chip, or ▾ at the right of the cell |117+| Dropdown (from a range) | One of the values in a range, on any sheet (`Lists!A1:A20`) | A chip, or ▾ |92118 | Checkbox | TRUE or FALSE, or values of its own (`Yes` and `No`); a blank cell is unchecked | `[✓]` or `[ ]`, centered |93-| Number | a number between, not between, equal to, greater than ... values | |94-| Date | any date, or one on, after, before, between ... dates | |95-| Text length | text whose length is between, less than ... | |96-| Custom formula is | anything for which the formula (`=B2<=C2`) is TRUE | |119+| Number | A number between, not between, equal to, greater than ... values | |120+| Date | Any date, or one on, after, before, between ... dates | |121+| Text length | Text whose length is between, less than ... | |122+| Custom formula is | Anything for which the formula (`=B2<=C2`) is TRUE | |123+124+Blanks are always valid, and a formula is checked by the value it125+computes. Each cell has one rule: a rule added over cells that had126+another takes them from it. Validation can't go on a pivot table's127+results, which take no entries. Data > Remove data validation takes the128+selection out of every rule.129+130+### Dropdowns and checkboxes131+132+- **Pick an item**: Alt+Down, or a click on the ▾, opens a dropdown's133+ list under the cell; type to search, and Enter enters the item as if134+ typed. When the active cell has no dropdown, Alt+Down opens the135+ column's filter.136+- **Check a box**: Space, or a click on the box, checks or unchecks the137+ selected checkboxes (all checked when the active one isn't, as in138+ Sheets); Space anywhere else starts an entry as usual.97139 98140 A dropdown's Display is Sheets' too: Chip draws its value between99141 rounded ends in reverse video, with the ▾ inside (new dropdowns), Arrow
@@ -102,12 +144,7 @@ Checked and Unchecked values, when set, are what checking and
102144 unchecking enter instead of TRUE and FALSE; with only a checked value,103145 unchecking leaves the cell blank.104146 105-Alt+Down, or a click on the ▾, opens a dropdown's list under the cell:106-type to search, Enter enters the item as if typed. Space, or a click on107-the box, checks or unchecks the selected checkboxes (all checked when108-the active one isn't, as in Sheets); Space anywhere else starts an entry109-as usual. When the active cell has no dropdown, Alt+Down opens the110-column's filter.147+### Rejected or warned111148 112149 Each rule either **rejects** an invalid entry or **shows a warning**.113150 Rejected, the entry stays open with Sheets' message on the context line
@@ -115,13 +152,7 @@ Rejected, the entry stays open with Sheets' message on the context line
115152 fixing or Esc. Warned, it goes in, and the cell's text gets a dotted116153 underline; on the active cell the context line says why ("Invalid:117154 Input must be ..."). A rule's help text, when it has one, replaces its118-own words there. A formula is checked by the value it computes. Blanks119-are always valid.120-121-Each cell has one rule: a rule added over cells that had another takes122-them from it. Validation can't go on a pivot table's results, which take123-no entries. Data > Remove data validation takes the selection out of124-every rule.155+own words there.125156 126157 What validation checks:127158
M docs/sheets/tables.md +6 -12
@@ -10,6 +10,9 @@ Sheets' and Excel's tables. Formulas read it by those names,
1010 `=SUM(Sales[Amount])`, so they keep reading the right cells as the table1111 grows and its columns move ([Structured references](../formulas/references.md#tables-by-column-name)).1212 13+![The table Sales, its header styled and its rows banded, the pointer on its Amount column; the context line says how formulas read the column, and the total beside the table sums it](../media/table-dark.png#gh-dark-mode-only)14+![The table Sales, its header styled and its rows banded, the pointer on its Amount column; the context line says how formulas read the column, and the total beside the table sums it](../media/table-light.png#gh-light-mode-only)15+1316 ## Making one1417 1518 Format > Convert to table (Ctrl+Alt+T) makes a table of the selection, or
@@ -25,18 +28,9 @@ A blank header is named after its place (`Column3`) and a repeat
2528 numbered (`Amount2`), in the cell too, so the header shows what formulas2629 use. A selection of one row gains an empty row of data below it.2730 28-```29- A B C30- 1 Region Units Amount31- 2 North 2 1032- 3 South 3 2033- 4 East 5 3034-```35-36-Made a table named `Sales`, this reads `Sales[Amount]` as C2:C4 and37-`Sales[#All]` as A1:C4; a value typed in row 5 joins it.38-39-On a table's cell the context line names the table and the column, and31+The table above is A1:D7, named `Sales`: `Sales[Amount]` reads D2:D732+and `Sales[#All]` reads A1:D7, and a value typed in row 8 joins it. On33+a table's cell the context line names the table and the column, and4034 how a formula reads it: `Table Sales, column Amount: Sales[Amount] in4135 formulas`.4236
M e2e/crash_test.go +5 -2
M e2e/go.mod +2 -1
M e2e/go.sum +4 -0
M e2e/harness_test.go +1 -0
M e2e/jupyter_test.go +33 -0
@@ -49,6 +49,39 @@ func (s *session) codes() []string {
4949 return out5050 }5151 52+// An output is 012's grid: Enter works in it, Shift+arrows select,53+// Ctrl+C copies, the palette's sort sorts it, a click moves the active54+// cell, Enter shows it full-screen and Esc goes back a level at a time.55+func TestNotebookOutputGrid(t *testing.T) {56+ s := startWith(t, options{cols: 100, rows: 40, startsOn: "EDIT", env: fakeNu}, "nu")57+ clip := s.watchClipboard()58+ s.keys("files = ls", "<ctrl+enter>")59+ s.waitFor("Out[1]:")60+ s.keys("<esc>", "<down>", "<enter>")61+ s.waitFor("OUTPUT")62+ s.keys("<shift+down>", "<shift+right>", "<ctrl+c>")63+ s.eventually("the rows copied", func() bool { return clip.get() == "012\tfile\nCLAUDE.md\tfile" })64+ s.waitFor("name to type, rows 1 to 2")65+ s.keys("<esc>", "<right>", "<right>", "<ctrl+k>", "Sort sheet Z to A", "<enter>")66+ s.eventually("sorted by size", func() bool {67+ _, first := s.rowOf("README.md")68+ _, last := s.rowOf("go.mod")69+ return first < last && strings.Contains(s.line(first), " 1 README.md")70+ })71+ col, row := s.rowOf("demos")72+ s.leftClick(col+1, row, 0)73+ s.keys("<ctrl+c>")74+ s.eventually("the cell clicked copied", func() bool { return clip.get() == "demos" })75+ s.keys("<enter>")76+ s.waitFor("files [1], full-screen")77+ s.keys("<esc>")78+ s.eventually("back in the window", func() bool {79+ return !strings.Contains(s.screen(), "full-screen") || strings.Contains(s.screen(), "[1]:")80+ })81+ s.keys("<esc>")82+ s.waitFor("NOTEBOOK")83+}84+5285 func TestNotebookMouseAndKeys(t *testing.T) {5386 s := startWith(t, options{cols: 100, rows: 40, startsOn: "EDIT", env: fakeNu}, "nu")5487 s.keys("files = ls", "<esc>")
M e2e/screennotebook_test.go +17 -4
@@ -10,8 +10,9 @@ import (
1010 // Golden screens for notebooks: cells with a note and table outputs, a1111 // cell edited with a long pipeline wrapped (at 80 and 60 columns), a1212 // failure, nu's highlighting and a problem nu found, a cell running and13-// one waiting, stale outputs, an output full-screen, and an output sent14-// to a sheet. Each is recorded on a light terminal and in the13+// one waiting, stale outputs, an output's grid entered with a range14+// selected, its filter open, and full-screen, and an output sent to a15+// sheet. Each is recorded on a light terminal and in the1516 // high-contrast theme too. nu is testdata/nu/nu, which answers what the1617 // screens run, and what the code editor asks, with fixed outputs.1718
@@ -91,8 +92,20 @@ var notebookScreens = []screen{
9192 }},9293 {name: "notebook-output", setup: func(s *session) {9394 filesNotebook(s)94- s.keys("<up>", "<up>", "<up>", "<enter>")95- s.waitFor("full-screen")95+ s.keys("<up>", "<up>", "<up>", "<enter>", "<enter>")96+ s.waitFor("◀ Back")97+ }},98+ {name: "notebook-grid", setup: func(s *session) {99+ filesNotebook(s)100+ s.keys("<up>", "<up>", "<up>", "<enter>", "<shift+down>", "<shift+right>", "<shift+right>")101+ s.waitFor("Count 6")102+ }},103+ {name: "notebook-grid-filter", setup: func(s *session) {104+ filesNotebook(s)105+ s.keys("<up>", "<up>", "<up>", "<enter>", "<ctrl+k>", "Create a filter", "<enter>")106+ s.waitFor("▾")107+ s.keys("<right>", "<alt+down>")108+ s.waitFor("Select all")96109 }},97110 {name: "notebook-nu-highlight", setup: func(s *session) {98111 filesNotebook(s)
A e2e/stillboxes_test.go +281 -0
@@ -0,0 +1,281 @@
1+package e2e2+3+import (4+ "image"5+ "image/color"6+ "math"7+)8+9+// Box drawing and block elements, drawn to the cell's edges as10+// terminals draw them, so a frame's lines meet across cells.11+12+// boxArms gives each box-drawing character the weight of its four arms,13+// up, right, down and left: 0 none, 1 light, 2 heavy, 3 double.14+var boxArms = map[rune]string{15+ '─': "0101", '━': "0202", '│': "1010", '┃': "2020",16+ '╴': "0001", '╵': "1000", '╶': "0100", '╷': "0010",17+ '╸': "0002", '╹': "2000", '╺': "0200", '╻': "0020",18+ '╼': "0201", '╽': "1020", '╾': "0102", '╿': "2010",19+ '╭': "0110", '╮': "0011", '╯': "1001", '╰': "1100",20+}21+22+// boxRuns are the characters U+250C to U+254B and U+2550 to U+256C, in23+// order, as their arms.24+const (25+ boxRun1 = "0110 0210 0120 0220 0011 0012 0021 0022 1100 1200 2100 2200 1001 1002 2001 2002 " +26+ "1110 1210 2110 1120 2120 2210 1220 2220 1011 1012 2011 1021 2021 2012 1022 2022 " +27+ "0111 0112 0211 0212 0121 0122 0221 0222 1101 1102 1201 1202 2101 2102 2201 2202 " +28+ "1111 1112 1211 1212 2111 1121 2121 2112 2211 1122 1221 2212 1222 2122 2221 2222"29+ boxRun2 = "0303 3030 0310 0130 0330 0013 0031 0033 1300 3100 3300 1003 3001 3003 " +30+ "1310 3130 3330 1013 3031 3033 0313 0131 0333 1303 3101 3303 1313 3131 3333"31+)32+33+// boxDashes are the dashed lines: vertical or not, heavy or not, and34+// how many dashes a cell.35+var boxDashes = map[rune]struct {36+ vertical, heavy bool37+ n int38+}{39+ '┄': {false, false, 3}, '┅': {false, true, 3}, '┆': {true, false, 3}, '┇': {true, true, 3},40+ '┈': {false, false, 4}, '┉': {false, true, 4}, '┊': {true, false, 4}, '┋': {true, true, 4},41+ '╌': {false, false, 2}, '╍': {false, true, 2}, '╎': {true, false, 2}, '╏': {true, true, 2},42+}43+44+func init() {45+ for i, arms := range splitFields(boxRun1) {46+ boxArms[rune(0x250c+i)] = arms47+ }48+ for i, arms := range splitFields(boxRun2) {49+ boxArms[rune(0x2550+i)] = arms50+ }51+}52+53+func splitFields(s string) []string {54+ var out []string55+ for i := 0; i+4 <= len(s); i += 5 {56+ out = append(out, s[i:i+4])57+ }58+ return out59+}60+61+// boxCell is one cell being drawn: its rectangle, center and the widths62+// of its lines.63+type boxCell struct {64+ img *image.NRGBA65+ cell image.Rectangle66+ c color.RGBA67+ mx, my float32 // the center68+ t, d float32 // a light line's width; a double line's offset from center69+ w [4]int // arms' weights70+}71+72+// boxDrawing draws U+2500 to U+257F; false for one it doesn't know.73+func boxDrawing(img *image.NRGBA, r rune, cell image.Rectangle, c color.RGBA) bool {74+ t := float32(lineWidth(cell.Dx()))75+ b := boxCell{img: img, cell: cell, c: c, t: t, d: t * 2,76+ mx: float32(cell.Min.X) + float32(cell.Dx())/2, my: float32(cell.Min.Y) + float32(cell.Dy())/2}77+ if dash, ok := boxDashes[r]; ok {78+ b.dashes(dash.vertical, dash.heavy, dash.n)79+ return true80+ }81+ if r >= '╱' && r <= '╳' {82+ b.diagonal(r)83+ return true84+ }85+ arms, ok := boxArms[r]86+ if !ok {87+ return false88+ }89+ for i := range b.w {90+ b.w[i] = int(arms[i] - '0')91+ }92+ if r >= '╭' && r <= '╰' {93+ b.rounded(r)94+ return true95+ }96+ for i := range b.w {97+ b.arm(i)98+ }99+ return true100+}101+102+func (b *boxCell) thickness(weight int) float32 {103+ if weight == 2 {104+ return 2.5 * b.t105+ }106+ return b.t107+}108+109+// rect fills the part of arm i from s0 to its cell edge, s measured from110+// the center outward, and q across it (down or right positive).111+func (b *boxCell) rect(i int, s0, q0, q1 float32) {112+ half := float32(b.cell.Dx()) / 2113+ if i%2 == 0 {114+ half = float32(b.cell.Dy()) / 2115+ }116+ var x0, y0, x1, y1 float32117+ switch i {118+ case 0:119+ x0, x1, y0, y1 = b.mx+q0, b.mx+q1, b.my-half, b.my-s0120+ case 1:121+ x0, x1, y0, y1 = b.mx+s0, b.mx+half, b.my+q0, b.my+q1122+ case 2:123+ x0, x1, y0, y1 = b.mx+q0, b.mx+q1, b.my+s0, b.my+half124+ default:125+ x0, x1, y0, y1 = b.mx-half, b.mx-s0, b.my+q0, b.my+q1126+ }127+ rd := func(v float32) int { return int(math.Round(float64(v))) }128+ fill(b.img, image.Rect(rd(x0), rd(y0), rd(x1), rd(y1)), b.c)129+}130+131+// arm draws arm i, joined to the lines across it.132+func (b *boxCell) arm(i int) {133+ k := b.w[i]134+ if k == 0 {135+ return136+ }137+ perpA, perpB, opp := b.w[(i+1)%4], b.w[(i+3)%4], b.w[(i+2)%4]138+ if k != 3 {139+ th := b.thickness(k)140+ s0 := -th / 2141+ switch perp := max(perpA, perpB); {142+ case perp == 3 && opp == 0 && min(perpA, perpB) == 0:143+ s0 = -b.d - b.t/2 // a corner: reach the far line144+ case perp == 3 && opp == 0:145+ s0 = b.d - b.t/2 // a tee: stop at the near line146+ case perp == 3:147+ s0 = -b.d - b.t/2148+ case perp > 0:149+ s0 = -b.thickness(perp) / 2150+ }151+ b.rect(i, s0, -th/2, th/2)152+ return153+ }154+ for _, o := range []float32{-1, 1} {155+ b.rect(i, b.doubleStart(i, o), o*b.d-b.t/2, o*b.d+b.t/2)156+ }157+}158+159+// doubleStart is where the line of double arm i on side o starts: at160+// the inner line of a double arm on its side, the outer line of one on161+// the other side, or the line across it.162+func (b *boxCell) doubleStart(i int, o float32) float32 {163+ side, other := 2, 0 // for a horizontal arm, o > 0 is down164+ if i%2 == 0 {165+ side, other = 1, 3166+ }167+ if o < 0 {168+ side, other = other, side169+ }170+ switch {171+ case b.w[side] == 3:172+ return b.d - b.t/2173+ case b.w[other] == 3:174+ return -b.d - b.t/2175+ case b.w[side] > 0 || b.w[other] > 0:176+ return -b.thickness(max(b.w[side], b.w[other])) / 2177+ }178+ return -b.t / 2179+}180+181+// rounded draws ╭ ╮ ╯ ╰: a quarter circle between two arms.182+func (b *boxCell) rounded(r rune) {183+ w, h := float32(b.cell.Dx()), float32(b.cell.Dy())184+ cx, cy, rad := w/2, h/2, w/2185+ var a0, a1, ox, oy float32186+ switch r {187+ case '╭':188+ ox, oy, a0, a1 = rad, rad, 1.5*math.Pi, math.Pi189+ case '╮':190+ ox, oy, a0, a1 = -rad, rad, -math.Pi/2, 0191+ case '╯':192+ ox, oy, a0, a1 = -rad, -rad, math.Pi/2, 0193+ default:194+ ox, oy, a0, a1 = rad, -rad, math.Pi/2, math.Pi195+ }196+ fillShape(b.img, b.cell, b.c, func(s *shape) {197+ pts := arc(cx+ox, cy+oy, rad, a0, a1, 16)198+ if oy > 0 {199+ pts = append(pts, pt{cx, h + 1})200+ } else {201+ pts = append(pts, pt{cx, -1})202+ }203+ s.stroke(pts, b.t)204+ })205+}206+207+func (b *boxCell) diagonal(r rune) {208+ w, h := float32(b.cell.Dx()), float32(b.cell.Dy())209+ fillShape(b.img, b.cell, b.c, func(s *shape) {210+ if r != '╲' {211+ s.seg(pt{0, h}, pt{w, 0}, b.t)212+ }213+ if r != '╱' {214+ s.seg(pt{0, 0}, pt{w, h}, b.t)215+ }216+ })217+}218+219+// dashes draws a dashed line of n dashes a cell.220+func (b *boxCell) dashes(vertical, heavy bool, n int) {221+ th := b.thickness(1)222+ if heavy {223+ th = b.thickness(2)224+ }225+ length, i := float32(b.cell.Dx()), 1226+ if vertical {227+ length, i = float32(b.cell.Dy()), 2228+ }229+ step := length / float32(n)230+ for k := range n {231+ s0 := -length/2 + step*float32(k) + step/4232+ b.segment(i, s0, s0+step/2, th)233+ }234+}235+236+// segment fills a stretch of the line along arm i's axis from s0 to s1,237+// measured from the center.238+func (b *boxCell) segment(i int, s0, s1, th float32) {239+ rd := func(v float32) int { return int(math.Round(float64(v))) }240+ if i == 2 {241+ fill(b.img, image.Rect(rd(b.mx-th/2), rd(b.my+s0), rd(b.mx+th/2), rd(b.my+s1)), b.c)242+ return243+ }244+ fill(b.img, image.Rect(rd(b.mx+s0), rd(b.my-th/2), rd(b.mx+s1), rd(b.my+th/2)), b.c)245+}246+247+// quadrants are U+2596 to U+259F as the quarters they fill: 1 upper248+// left, 2 upper right, 4 lower left, 8 lower right.249+var quadrants = [10]int{4, 8, 1, 1 | 4 | 8, 1 | 8, 1 | 2 | 4, 1 | 2 | 8, 2, 2 | 4, 2 | 4 | 8}250+251+// blockElement draws U+2580 to U+259F.252+func blockElement(img *image.NRGBA, r rune, cell image.Rectangle, c color.RGBA) bool {253+ x0, y0, w, h := cell.Min.X, cell.Min.Y, cell.Dx(), cell.Dy()254+ ex := func(n int) int { return x0 + (w*n+4)/8 } // n eighths across255+ ey := func(n int) int { return y0 + (h*n+4)/8 } // n eighths down256+ box := func(xa, ya, xb, yb int) { fill(img, image.Rect(xa, ya, xb, yb), c) }257+ switch {258+ case r == '▀':259+ box(x0, y0, cell.Max.X, ey(4))260+ case r >= '▁' && r <= '█':261+ box(x0, ey(8-int(r-'▀')), cell.Max.X, cell.Max.Y)262+ case r >= '▉' && r <= '▏':263+ box(x0, y0, ex(8-int(r-'█')), cell.Max.Y)264+ case r == '▐':265+ box(ex(4), y0, cell.Max.X, cell.Max.Y)266+ case r >= '░' && r <= '▓':267+ fill(img, cell, color.NRGBA{c.R, c.G, c.B, uint8(64 * (r - '░' + 1))})268+ case r == '▔':269+ box(x0, y0, cell.Max.X, ey(1))270+ case r == '▕':271+ box(ex(7), y0, cell.Max.X, cell.Max.Y)272+ default:273+ q := quadrants[r-'▖']274+ for bit, qr := range [4][4]int{{x0, y0, ex(4), ey(4)}, {ex(4), y0, cell.Max.X, ey(4)}, {x0, ey(4), ex(4), cell.Max.Y}, {ex(4), ey(4), cell.Max.X, cell.Max.Y}} {275+ if q&(1<<bit) != 0 {276+ box(qr[0], qr[1], qr[2], qr[3])277+ }278+ }279+ }280+ return true281+}
A e2e/stillcells_test.go +245 -0
@@ -0,0 +1,245 @@
1+package e2e2+3+import (4+ "fmt"5+ "html"6+ "image/color"7+ "strconv"8+ "strings"9+10+ "golang.org/x/text/width"11+)12+13+// A golden screen read back into cells, for drawing it as a still. The14+// HTML is what renderHTML writes: one line of text per row, runs of15+// cells with the same style in a span, colors as palette variables.16+17+// ink is a color as the golden names it: the terminal's default18+// foreground or background, a palette entry or an RGB value.19+type ink struct {20+ kind inkKind21+ palette int22+ rgb color.RGBA23+}24+25+type inkKind uint826+27+const (28+ inkNone inkKind = iota // the default: fg or bg as the slot says29+ inkFg30+ inkBg31+ inkPalette32+ inkRGB33+)34+35+// underline styles, as the golden's text-decoration names them.36+const (37+ ulNone = iota38+ ulSingle39+ ulDouble40+ ulWavy41+ ulDotted42+ ulDashed43+)44+45+// stillCell is one cell of the screen.46+type stillCell struct {47+ r rune // 0 for the second half of a wide character48+ fg, bg, ulInk ink49+ bold, italic, faint bool50+ underline int51+ strike, wide, filled bool52+}53+54+// parseScreen reads a golden's HTML into rows of cols cells.55+func parseScreen(src string, cols, rows int) ([][]stillCell, error) {56+ src = strings.TrimPrefix(src, `<pre class="screen">`)57+ src = strings.TrimSuffix(src, "</pre>")58+ grid := make([][]stillCell, rows)59+ for y := range grid {60+ grid[y] = make([]stillCell, cols)61+ }62+ for y, line := range strings.Split(src, "\n") {63+ if y >= rows {64+ return nil, fmt.Errorf("more than %d rows", rows)65+ }66+ if err := parseLine(grid[y], line); err != nil {67+ return nil, fmt.Errorf("row %d: %w", y, err)68+ }69+ }70+ return grid, nil71+}72+73+// parseLine fills row from one line of the golden.74+func parseLine(row []stillCell, line string) error {75+ x := 076+ var st stillCell77+ for line != "" {78+ switch {79+ case strings.HasPrefix(line, `<span style="`):80+ end := strings.Index(line, `">`)81+ if end < 0 {82+ return fmt.Errorf("unclosed span")83+ }84+ st = styleOf(line[len(`<span style="`):end])85+ line = line[end+2:]86+ case strings.HasPrefix(line, "</span>"):87+ st = stillCell{}88+ line = line[len("</span>"):]89+ default:90+ end := strings.IndexByte(line, '<')91+ if end < 0 {92+ end = len(line)93+ }94+ var err error95+ if x, err = putText(row, x, html.UnescapeString(line[:end]), st); err != nil {96+ return err97+ }98+ line = line[end:]99+ }100+ }101+ return nil102+}103+104+// putText writes text into row from column x in style st and returns105+// the column after it.106+func putText(row []stillCell, x int, text string, st stillCell) (int, error) {107+ for _, r := range text {108+ w := 1109+ if k := width.LookupRune(r).Kind(); k == width.EastAsianWide || k == width.EastAsianFullwidth {110+ w = 2111+ }112+ if x+w > len(row) {113+ return x, fmt.Errorf("wider than %d columns", len(row))114+ }115+ c := st116+ c.r, c.wide, c.filled = r, w == 2, true117+ row[x] = c118+ if w == 2 {119+ row[x+1] = st120+ row[x+1].filled = true121+ }122+ x += w123+ }124+ return x, nil125+}126+127+// styleOf reads a span's CSS.128+func styleOf(css string) stillCell {129+ var c stillCell130+ for _, decl := range strings.Split(css, ";") {131+ prop, val, _ := strings.Cut(decl, ":")132+ switch prop {133+ case "color":134+ c.fg = inkOf(val)135+ case "background":136+ c.bg = inkOf(val)137+ case "font-weight":138+ c.bold = val == "bold"139+ case "font-style":140+ c.italic = val == "italic"141+ case "opacity":142+ c.faint = true143+ case "text-decoration":144+ decorate(&c, val)145+ }146+ }147+ return c148+}149+150+// decorate reads a text-decoration: underline with its style and color,151+// or line-through.152+func decorate(c *stillCell, val string) {153+ f := strings.Fields(val)154+ if len(f) == 0 {155+ return156+ }157+ if f[0] == "line-through" {158+ c.strike = true159+ return160+ }161+ c.underline = ulSingle162+ for _, w := range f[1:] {163+ switch w {164+ case "double":165+ c.underline = ulDouble166+ case "wavy":167+ c.underline = ulWavy168+ case "dotted":169+ c.underline = ulDotted170+ case "dashed":171+ c.underline = ulDashed172+ default:173+ c.ulInk = inkOf(w)174+ }175+ }176+}177+178+// inkOf reads a CSS color as the goldens write them.179+func inkOf(v string) ink {180+ switch {181+ case v == "var(--fg)":182+ return ink{kind: inkFg}183+ case v == "var(--bg)":184+ return ink{kind: inkBg}185+ case strings.HasPrefix(v, "var(--vt-palette-"):186+ n, _ := strconv.Atoi(strings.TrimSuffix(strings.TrimPrefix(v, "var(--vt-palette-"), ")"))187+ return ink{kind: inkPalette, palette: n}188+ case strings.HasPrefix(v, "#") && len(v) == 7:189+ n, _ := strconv.ParseUint(v[1:], 16, 32)190+ return ink{kind: inkRGB, rgb: rgba(uint32(n))}191+ }192+ return ink{}193+}194+195+func rgba(v uint32) color.RGBA {196+ return color.RGBA{R: uint8(v >> 16), G: uint8(v >> 8), B: uint8(v), A: 0xff}197+}198+199+// stillPalette is a terminal's colors: the reference palettes the200+// gallery shows.201+type stillPalette struct {202+ ansi [16]uint32203+ fg, bg uint32204+}205+206+var (207+ darkStill = stillPalette{darkANSI, 0xc5c8c6, 0x1d1f21}208+ lightStill = stillPalette{lightANSI, 0x1d1f21, 0xfafafa}209+)210+211+// color resolves an ink; def is what inkNone means in its slot.212+func (p stillPalette) color(k ink, def inkKind) color.RGBA {213+ if k.kind == inkNone {214+ k.kind = def215+ }216+ switch k.kind {217+ case inkFg:218+ return rgba(p.fg)219+ case inkPalette:220+ return rgba(p.xterm(k.palette))221+ case inkRGB:222+ return k.rgb223+ }224+ return rgba(p.bg)225+}226+227+// xterm is palette entry n: the 16 ANSI colors, then xterm's 6x6x6 cube228+// and gray ramp.229+func (p stillPalette) xterm(n int) uint32 {230+ switch {231+ case n < 16:232+ return p.ansi[n]233+ case n < 232:234+ n -= 16235+ level := func(v int) uint32 {236+ if v == 0 {237+ return 0238+ }239+ return uint32(55 + 40*v)240+ }241+ return level(n/36)<<16 | level(n/6%6)<<8 | level(n%6)242+ }243+ g := uint32(8 + 10*(n-232))244+ return g<<16 | g<<8 | g245+}
A e2e/stilldraw_test.go +229 -0
@@ -0,0 +1,229 @@
1+package e2e2+3+import (4+ "fmt"5+ "image"6+ "image/color"7+ "image/draw"8+ "math"9+10+ "golang.org/x/image/font"11+ "golang.org/x/image/font/gofont/gomono"12+ "golang.org/x/image/font/gofont/gomonobold"13+ "golang.org/x/image/font/gofont/gomonobolditalic"14+ "golang.org/x/image/font/gofont/gomonoitalic"15+ "golang.org/x/image/font/opentype"16+ "golang.org/x/image/math/fixed"17+ "golang.org/x/image/vector"18+)19+20+// Drawing a screen's cells as a picture of a terminal: text in Go Mono21+// (bundled with golang.org/x/image, so every machine draws the same22+// letters), and box drawing, blocks, braille and the symbols 012 draws23+// its chrome with drawn as shapes, as terminals draw them, so lines join24+// across cells.25+26+const (27+ stillFontSize = 26 // pixels; stills are drawn at twice the size they show28+ stillPad = 28 // around the screen, inside the window29+ stillRadius = 18 // the window's corners30+)31+32+// stillFaces are Go Mono's four styles at the still's size.33+type stillFaces struct {34+ regular, bold, italic, boldItalic font.Face35+ cw, ch, ascent int36+}37+38+func loadFaces() (*stillFaces, error) {39+ var fs stillFaces40+ for _, f := range []struct {41+ ttf []byte42+ dst *font.Face43+ }{{gomono.TTF, &fs.regular}, {gomonobold.TTF, &fs.bold}, {gomonoitalic.TTF, &fs.italic}, {gomonobolditalic.TTF, &fs.boldItalic}} {44+ parsed, err := opentype.Parse(f.ttf)45+ if err != nil {46+ return nil, err47+ }48+ face, err := opentype.NewFace(parsed, &opentype.FaceOptions{Size: stillFontSize, DPI: 72, Hinting: font.HintingNone})49+ if err != nil {50+ return nil, err51+ }52+ *f.dst = face53+ }54+ adv, _ := fs.regular.GlyphAdvance('0')55+ m := fs.regular.Metrics()56+ fs.cw = adv.Round()57+ fs.ch = int(math.Round(stillFontSize * 1.3))58+ fs.ascent = (fs.ch-(m.Ascent+m.Descent).Round())/2 + m.Ascent.Round()59+ return &fs, nil60+}61+62+func (fs *stillFaces) face(c stillCell) font.Face {63+ switch {64+ case c.bold && c.italic:65+ return fs.boldItalic66+ case c.bold:67+ return fs.bold68+ case c.italic:69+ return fs.italic70+ }71+ return fs.regular72+}73+74+// drawStill draws grid as a terminal window in palette p. It returns the75+// runes it had no way to draw.76+func drawStill(grid [][]stillCell, p stillPalette, fs *stillFaces) (*image.NRGBA, []rune) {77+ cols, rows := len(grid[0]), len(grid)78+ w, h := cols*fs.cw+2*stillPad, rows*fs.ch+2*stillPad79+ img := image.NewNRGBA(image.Rect(0, 0, w, h))80+ window(img, p)81+ var missing []rune82+ for y, row := range grid {83+ for x := range row {84+ origin := image.Pt(stillPad+x*fs.cw, stillPad+y*fs.ch)85+ if !drawCell(img, row, x, origin, p, fs) {86+ missing = append(missing, row[x].r)87+ }88+ }89+ }90+ return img, missing91+}92+93+// window fills a rounded rectangle with the terminal's background, with94+// a hairline border so the window reads on a page of the same color.95+func window(img *image.NRGBA, p stillPalette) {96+ b := img.Bounds()97+ w, h := float32(b.Dx()), float32(b.Dy())98+ border := blend(rgba(p.bg), rgba(p.fg), 0.18)99+ fillShape(img, b, border, func(s *shape) { s.roundRect(0, 0, w, h, stillRadius) })100+ fillShape(img, b, rgba(p.bg), func(s *shape) { s.roundRect(2, 2, w-2, h-2, stillRadius-2) })101+}102+103+// drawCell draws cell x of row at origin; false when its rune has no104+// glyph.105+func drawCell(img *image.NRGBA, row []stillCell, x int, origin image.Point, p stillPalette, fs *stillFaces) bool {106+ c := row[x]107+ span := 1108+ if c.wide {109+ span = 2110+ }111+ r := image.Rect(origin.X, origin.Y, origin.X+span*fs.cw, origin.Y+fs.ch)112+ if c.r == 0 && c.filled {113+ return true // the second half of a wide character, drawn with the first114+ }115+ bg := p.color(c.bg, inkBg)116+ if c.bg.kind != inkNone {117+ draw.Draw(img, image.Rect(origin.X, origin.Y, origin.X+fs.cw, origin.Y+fs.ch), image.NewUniform(bg), image.Point{}, draw.Src)118+ }119+ fg := p.color(c.fg, inkFg)120+ if c.faint {121+ fg = blend(bg, fg, 0.6)122+ }123+ ok := true124+ if c.r != 0 && c.r != ' ' && c.r != ' ' {125+ ok = drawGlyph(img, c, r, fg, fs)126+ }127+ lines(img, c, r, fg, p, fs)128+ return ok129+}130+131+// drawGlyph draws c's rune: as a shape when it's one terminals draw132+// themselves, else from the font.133+func drawGlyph(img *image.NRGBA, c stillCell, r image.Rectangle, fg color.RGBA, fs *stillFaces) bool {134+ if drawn := drawSpecial(img, c.r, r, fg, fs); drawn {135+ return true136+ }137+ face := fs.face(c)138+ if _, ok := face.GlyphAdvance(c.r); !ok {139+ return false140+ }141+ adv, _ := face.GlyphAdvance(c.r)142+ d := font.Drawer{Dst: img, Src: image.NewUniform(fg), Face: face}143+ d.Dot = fixed.P(r.Min.X, r.Min.Y+fs.ascent)144+ d.Dot.X += (fixed.I(r.Dx()) - adv) / 2145+ d.DrawString(string(c.r))146+ return true147+}148+149+// lines draws c's underline and strikethrough.150+func lines(img *image.NRGBA, c stillCell, r image.Rectangle, fg color.RGBA, p stillPalette, fs *stillFaces) {151+ t := lineWidth(fs.cw)152+ if c.strike {153+ y := r.Min.Y + fs.ascent - stillFontSize*3/10154+ fill(img, image.Rect(r.Min.X, y, r.Max.X, y+t), fg)155+ }156+ if c.underline == ulNone {157+ return158+ }159+ col := fg160+ if c.ulInk.kind != inkNone {161+ col = p.color(c.ulInk, inkFg)162+ }163+ y := r.Min.Y + fs.ascent + t*2164+ switch c.underline {165+ case ulDouble:166+ fill(img, image.Rect(r.Min.X, y-t, r.Max.X, y), col)167+ fill(img, image.Rect(r.Min.X, y+t, r.Max.X, y+2*t), col)168+ case ulWavy:169+ wavy(img, r, y, t, col)170+ case ulDotted:171+ for x := r.Min.X; x < r.Max.X; x += 2 * t {172+ fill(img, image.Rect(x, y, x+t, y+t), col)173+ }174+ case ulDashed:175+ for x := r.Min.X; x < r.Max.X; x += r.Dx() / 2 {176+ fill(img, image.Rect(x, y, x+r.Dx()*3/10, y+t), col)177+ }178+ default:179+ fill(img, image.Rect(r.Min.X, y, r.Max.X, y+t), col)180+ }181+}182+183+// wavy draws a curly underline: one wave a cell, in phase across cells.184+func wavy(img *image.NRGBA, r image.Rectangle, y, t int, col color.RGBA) {185+ amp := float32(t) * 1.2186+ fillShape(img, image.Rect(r.Min.X, y-2*t-2, r.Max.X, y+2*t+2), col, func(s *shape) {187+ var pts [][2]float32188+ w := float32(r.Dx())189+ for i := 0; i <= 12; i++ {190+ fx := w * float32(i) / 12191+ pts = append(pts, [2]float32{fx, float32(2*t+2) + amp*float32(math.Sin(2*math.Pi*float64(i)/12))})192+ }193+ s.stroke(pts, float32(t))194+ })195+}196+197+// lineWidth is a light line's width for cells cw wide.198+func lineWidth(cw int) int { return max(1, (cw+4)/8) }199+200+func fill(img *image.NRGBA, r image.Rectangle, c color.Color) {201+ draw.Draw(img, r, image.NewUniform(c), image.Point{}, draw.Over)202+}203+204+// blend mixes a toward b by t.205+func blend(a, b color.RGBA, t float64) color.RGBA {206+ mix := func(x, y uint8) uint8 { return uint8(math.Round(float64(x)*(1-t) + float64(y)*t)) }207+ return color.RGBA{mix(a.R, b.R), mix(a.G, b.G), mix(a.B, b.B), 0xff}208+}209+210+// fillShape rasterizes the shape build makes, in r's coordinates, and211+// fills it with c.212+func fillShape(img *image.NRGBA, r image.Rectangle, c color.Color, build func(*shape)) {213+ s := &shape{z: vector.NewRasterizer(r.Dx(), r.Dy())}214+ s.z.DrawOp = draw.Over215+ build(s)216+ s.z.Draw(img, r, image.NewUniform(c), image.Point{})217+}218+219+func runeList(rs []rune) string {220+ seen := map[rune]bool{}221+ var out string222+ for _, r := range rs {223+ if !seen[r] {224+ seen[r] = true225+ out += fmt.Sprintf(" %q", r)226+ }227+ }228+ return out229+}
A e2e/stills_test.go +157 -0
@@ -0,0 +1,157 @@
1+package e2e2+3+import (4+ "bytes"5+ "crypto/sha256"6+ "encoding/binary"7+ "encoding/hex"8+ "fmt"9+ "hash/crc32"10+ "image"11+ "image/png"12+ "os"13+ "path/filepath"14+ "strings"15+ "testing"16+)17+18+// Stills are pictures of 012 for the docs, drawn from golden screens:19+// each docScreen is recorded again from another screen's setup, on a20+// terminal the size a page shows well, dark and light, and drawn in its21+// reference palette to docs/media/<name>-dark.png and <name>-light.png.22+// `make screens` records and draws them; `make e2e` fails when a23+// still wasn't drawn from its golden as it is.24+type docScreen struct {25+ name, from string // docs/media/<name>-*.png; the screen whose setup it records26+ cols, rows uint1627+}28+29+var docScreens = []docScreen{30+ {name: "trace-view", from: "trace-view", cols: 80, rows: 14},31+ {name: "evaluate", from: "evaluate", cols: 80, rows: 12},32+ {name: "rules-bars", from: "rules-bars", cols: 80, rows: 12},33+ {name: "rules-panel", from: "rules-panel", cols: 100, rows: 12},34+ {name: "table", from: "table", cols: 80, rows: 13},35+ {name: "layout", from: "layout", cols: 80, rows: 28},36+ {name: "palette", from: "palette", cols: 80, rows: 18},37+ {name: "notebook-cells", from: "notebook-cells", cols: 80, rows: 26},38+ {name: "notebook-nu-error", from: "notebook-nu-error", cols: 80, rows: 16},39+ {name: "notebook-grid", from: "notebook-grid", cols: 80, rows: 24},40+}41+42+// stillsVersion changes when the drawing does, so every still is43+// drawn again.44+const stillsVersion = "1"45+46+// addDocScreens adds the docs' screens, docs-<name> and47+// docs-<name>-light, to the golden screens once every screen they're48+// recorded from is listed.49+func addDocScreens() {50+ byName := map[string]screen{}51+ for _, sc := range screens {52+ byName[sc.name] = sc53+ }54+ for _, d := range docScreens {55+ from, ok := byName[d.from]56+ if !ok {57+ panic("docScreens: no golden screen " + d.from)58+ }59+ sc := from60+ sc.name, sc.opts.cols, sc.opts.rows = "docs-"+d.name, d.cols, d.rows61+ light := sc62+ light.name += "-light"63+ light.opts.light = true64+ screens = append(screens, sc, light)65+ }66+}67+68+func TestStills(t *testing.T) {69+ faces, err := loadFaces()70+ if err != nil {71+ t.Fatal(err)72+ }73+ for _, d := range docScreens {74+ for _, v := range []struct {75+ suffix string76+ p stillPalette77+ }{{"dark", darkStill}, {"light", lightStill}} {78+ screen := "docs-" + d.name79+ if v.suffix == "light" {80+ screen += "-light"81+ }82+ t.Run(d.name+"-"+v.suffix, func(t *testing.T) {83+ path := filepath.Join("..", "docs", "media", d.name+"-"+v.suffix+".png")84+ checkStill(t, screen, int(d.cols), int(d.rows), v.p, faces, path)85+ })86+ }87+ }88+}89+90+// checkStill draws the still of screen into path under -update, and91+// otherwise checks the one there was drawn from the golden as it is.92+func checkStill(t *testing.T, screen string, cols, rows int, p stillPalette, fs *stillFaces, path string) {93+ src, err := os.ReadFile(filepath.Join("testdata", "screens", screen+".html"))94+ if err != nil {95+ t.Fatal(err)96+ }97+ sum := sha256.Sum256([]byte(fmt.Sprintf("%s\n%v\n%s", stillsVersion, p, src)))98+ want := hex.EncodeToString(sum[:])99+ if !*update {100+ if got := pngText(path, "012-golden"); got != want {101+ t.Errorf("%s is not drawn from the golden %s as it is; run make screens", path, screen)102+ }103+ return104+ }105+ grid, err := parseScreen(string(src), cols, rows)106+ if err != nil {107+ t.Fatalf("%s: %v", screen, err)108+ }109+ img, missing := drawStill(grid, p, fs)110+ if len(missing) > 0 {111+ t.Errorf("%s: no glyph for%s", screen, runeList(missing))112+ }113+ if err := writePNG(path, img, "012-golden", want); err != nil {114+ t.Fatal(err)115+ }116+}117+118+// writePNG writes img with a text chunk key=value after its header, so119+// the check can tell which golden it was drawn from without drawing it120+// again (drawing isn't bit for bit the same on every CPU).121+func writePNG(path string, img image.Image, key, value string) error {122+ var buf bytes.Buffer123+ enc := png.Encoder{CompressionLevel: png.BestCompression}124+ if err := enc.Encode(&buf, img); err != nil {125+ return err126+ }127+ b := buf.Bytes()128+ const header = 8 + 8 + 13 + 4 // signature, then IHDR's length, type, data and CRC129+ data := []byte(key + "\x00" + value)130+ chunk := binary.BigEndian.AppendUint32(nil, uint32(len(data)))131+ chunk = append(chunk, "tEXt"...)132+ chunk = append(chunk, data...)133+ chunk = binary.BigEndian.AppendUint32(chunk, crc32.ChecksumIEEE(chunk[4:]))134+ out := append(append(append([]byte{}, b[:header]...), chunk...), b[header:]...)135+ return os.WriteFile(path, out, 0o644)136+}137+138+// pngText is the value of the PNG's text chunk named key, or "".139+func pngText(path, key string) string {140+ b, err := os.ReadFile(path)141+ if err != nil || len(b) < 8 {142+ return ""143+ }144+ for b = b[8:]; len(b) >= 12; {145+ n := int(binary.BigEndian.Uint32(b))146+ if len(b) < 12+n {147+ return ""148+ }149+ if string(b[4:8]) == "tEXt" {150+ if k, v, ok := strings.Cut(string(b[8:8+n]), "\x00"); ok && k == key {151+ return v152+ }153+ }154+ b = b[12+n:]155+ }156+ return ""157+}
A e2e/stillshapes_test.go +231 -0
@@ -0,0 +1,231 @@
1+package e2e2+3+import (4+ "image"5+ "image/color"6+ "math"7+8+ "golang.org/x/image/vector"9+)10+11+// shape builds a filled outline for the rasterizer. Every polygon is12+// wound the same way, so overlapping parts add up rather than cancel,13+// except holes, wound the other way.14+type shape struct {15+ z *vector.Rasterizer16+}17+18+type pt = [2]float3219+20+// poly adds a closed polygon; hole winds it the other way.21+func (s *shape) poly(pts []pt, hole bool) {22+ var area float3223+ for i, p := range pts {24+ q := pts[(i+1)%len(pts)]25+ area += p[0]*q[1] - q[0]*p[1]26+ }27+ if (area < 0) != hole {28+ for i, j := 0, len(pts)-1; i < j; i, j = i+1, j-1 {29+ pts[i], pts[j] = pts[j], pts[i]30+ }31+ }32+ s.z.MoveTo(pts[0][0], pts[0][1])33+ for _, p := range pts[1:] {34+ s.z.LineTo(p[0], p[1])35+ }36+ s.z.ClosePath()37+}38+39+// arc is n+1 points along a circle's arc from a0 to a1 (radians, y down).40+func arc(cx, cy, r, a0, a1 float32, n int) []pt {41+ pts := make([]pt, 0, n+1)42+ for i := 0; i <= n; i++ {43+ a := float64(a0 + (a1-a0)*float32(i)/float32(n))44+ pts = append(pts, pt{cx + r*float32(math.Cos(a)), cy + r*float32(math.Sin(a))})45+ }46+ return pts47+}48+49+func (s *shape) disk(cx, cy, r float32) {50+ pts := arc(cx, cy, r, 0, 2*math.Pi, 32)51+ s.poly(pts[:32], false)52+}53+54+// ring is a circle's outline t wide, centered on radius r.55+func (s *shape) ring(cx, cy, r, t float32) {56+ outer := arc(cx, cy, r+t/2, 0, 2*math.Pi, 32)57+ inner := arc(cx, cy, r-t/2, 0, 2*math.Pi, 32)58+ s.poly(outer[:32], false)59+ s.poly(inner[:32], true)60+}61+62+// pie is the slice of a disk from a0 to a1.63+func (s *shape) pie(cx, cy, r, a0, a1 float32) {64+ s.poly(append([]pt{{cx, cy}}, arc(cx, cy, r, a0, a1, 24)...), false)65+}66+67+// seg is a straight line t wide from a to b.68+func (s *shape) seg(a, b pt, t float32) {69+ dx, dy := b[0]-a[0], b[1]-a[1]70+ l := float32(math.Hypot(float64(dx), float64(dy)))71+ if l == 0 {72+ return73+ }74+ nx, ny := -dy/l*t/2, dx/l*t/275+ s.poly([]pt{{a[0] + nx, a[1] + ny}, {b[0] + nx, b[1] + ny}, {b[0] - nx, b[1] - ny}, {a[0] - nx, a[1] - ny}}, false)76+}77+78+// stroke is a line through pts, t wide, with round joins and ends.79+func (s *shape) stroke(pts []pt, t float32) {80+ for i := range pts {81+ if i > 0 {82+ s.seg(pts[i-1], pts[i], t)83+ }84+ s.disk(pts[i][0], pts[i][1], t/2)85+ }86+}87+88+// roundRect is a rectangle with corners of radius r.89+func (s *shape) roundRect(x0, y0, x1, y1, r float32) {90+ var pts []pt91+ pts = append(pts, arc(x1-r, y0+r, r, -math.Pi/2, 0, 8)...)92+ pts = append(pts, arc(x1-r, y1-r, r, 0, math.Pi/2, 8)...)93+ pts = append(pts, arc(x0+r, y1-r, r, math.Pi/2, math.Pi, 8)...)94+ pts = append(pts, arc(x0+r, y0+r, r, math.Pi, 3*math.Pi/2, 8)...)95+ s.poly(pts, false)96+}97+98+// symbol draws in a square the cell's width, centered on the cell:99+// (u, v) from 0 to 1 across it.100+type symbol struct {101+ *shape102+ x0, y0, side float32103+}104+105+func (y symbol) p(u, v float32) pt { return pt{y.x0 + u*y.side, y.y0 + v*y.side} }106+107+func (y symbol) tri(a, b, c pt) {108+ y.poly([]pt{y.p(a[0], a[1]), y.p(b[0], b[1]), y.p(c[0], c[1])}, false)109+}110+111+func (y symbol) line(t float32, uv ...float32) {112+ var pts []pt113+ for i := 0; i+1 < len(uv); i += 2 {114+ pts = append(pts, y.p(uv[i], uv[i+1]))115+ }116+ y.stroke(pts, t*y.side)117+}118+119+func (y symbol) box(u0, v0, u1, v1, t float32) {120+ y.line(t, u0, v0, u1, v0, u1, v1, u0, v1, u0, v0)121+}122+123+func (y symbol) rect(u0, v0, u1, v1 float32) {124+ y.poly([]pt{y.p(u0, v0), y.p(u1, v0), y.p(u1, v1), y.p(u0, v1)}, false)125+}126+127+// symbols are the shapes 012 draws its chrome with that fonts draw at128+// odd sizes or not at all: triangles, circles, checks and the notebook129+// toolbar's icons.130+var symbols = map[rune]func(y symbol){131+ '▶': func(y symbol) { y.tri(pt{.2, .12}, pt{.92, .5}, pt{.2, .88}) },132+ '▸': func(y symbol) { y.tri(pt{.3, .28}, pt{.76, .5}, pt{.3, .72}) },133+ '◀': func(y symbol) { y.tri(pt{.8, .12}, pt{.08, .5}, pt{.8, .88}) },134+ '◂': func(y symbol) { y.tri(pt{.7, .28}, pt{.24, .5}, pt{.7, .72}) },135+ '▼': func(y symbol) { y.tri(pt{.08, .22}, pt{.92, .22}, pt{.5, .86}) },136+ '▾': func(y symbol) { y.tri(pt{.22, .34}, pt{.78, .34}, pt{.5, .7}) },137+ '▲': func(y symbol) { y.tri(pt{.08, .8}, pt{.92, .8}, pt{.5, .16}) },138+ '▴': func(y symbol) { y.tri(pt{.22, .68}, pt{.78, .68}, pt{.5, .32}) },139+ '■': func(y symbol) { y.rect(.14, .14, .86, .86) },140+ '●': func(y symbol) { y.disk(y.p(.5, .5)[0], y.p(.5, .5)[1], .4*y.side) },141+ '○': func(y symbol) { circle(y, 0, 0) },142+ '◔': func(y symbol) { circle(y, -math.Pi/2, 0) },143+ '◑': func(y symbol) { circle(y, -math.Pi/2, math.Pi/2) },144+ '◕': func(y symbol) { circle(y, -math.Pi/2, math.Pi) },145+ '✓': func(y symbol) { y.line(.12, .14, .54, .4, .8, .88, .2) },146+ '✗': func(y symbol) { y.line(.12, .2, .2, .8, .8); y.line(.12, .8, .2, .2, .8) },147+ '❯': func(y symbol) { y.line(.16, .3, .16, .72, .5, .3, .84) },148+ '⧉': func(y symbol) { y.box(.08, .08, .64, .64, .08); y.box(.36, .36, .92, .92, .08) },149+ '⎘': func(y symbol) { y.box(.16, .16, .84, .94, .08); y.rect(.34, .04, .66, .26) },150+ '↻': reload,151+ '↵': func(y symbol) {152+ y.line(.09, .84, .12, .84, .62, .3, .62)153+ y.tri(pt{.06, .62}, pt{.36, .38}, pt{.36, .86})154+ },155+ '✂': func(y symbol) {156+ y.ring(y.p(.22, .26)[0], y.p(.22, .26)[1], .13*y.side, .08*y.side)157+ y.ring(y.p(.22, .74)[0], y.p(.22, .74)[1], .13*y.side, .08*y.side)158+ y.line(.09, .32, .34, .94, .7)159+ y.line(.09, .32, .66, .94, .3)160+ },161+}162+163+// circle is an outline with the slice from a0 to a1 filled.164+func circle(y symbol, a0, a1 float32) {165+ c := y.p(.5, .5)166+ y.ring(c[0], c[1], .36*y.side, .09*y.side)167+ if a1 > a0 {168+ y.pie(c[0], c[1], .38*y.side, a0, a1)169+ }170+}171+172+// reload is ↻: most of a circle, clockwise, with the arrowhead at its173+// end.174+func reload(y symbol) {175+ c := y.p(.5, .52)176+ r := .32 * y.side177+ a0, a1 := float32(-math.Pi/5), float32(1.4*math.Pi)178+ y.stroke(arc(c[0], c[1], r, a0, a1, 24), .09*y.side)179+ end := pt{c[0] + r*float32(math.Cos(float64(a1))), c[1] + r*float32(math.Sin(float64(a1)))}180+ dir := pt{-float32(math.Sin(float64(a1))), float32(math.Cos(float64(a1)))}181+ n := pt{-dir[1], dir[0]}182+ h := .22 * y.side183+ y.poly([]pt{184+ {end[0] + dir[0]*h, end[1] + dir[1]*h},185+ {end[0] + n[0]*h*.8, end[1] + n[1]*h*.8},186+ {end[0] - n[0]*h*.8, end[1] - n[1]*h*.8},187+ }, false)188+}189+190+// drawSpecial draws r as terminals draw it rather than from the font:191+// box drawing, blocks and braille fill the cell and join their192+// neighbors, and symbols are drawn at one size. False when r is text.193+func drawSpecial(img *image.NRGBA, r rune, cell image.Rectangle, c color.RGBA, fs *stillFaces) bool {194+ switch {195+ case r >= 0x2500 && r <= 0x257f:196+ return boxDrawing(img, r, cell, c)197+ case r >= 0x2580 && r <= 0x259f:198+ return blockElement(img, r, cell, c)199+ case r >= 0x2800 && r <= 0x28ff:200+ braille(img, r, cell, c)201+ return true202+ }203+ draw, ok := symbols[r]204+ if !ok {205+ return false206+ }207+ // A symbol is as big as a capital letter, centered on one, and may208+ // reach a little into the cells beside it, as fonts draw them.209+ side := float32(stillFontSize) * .9210+ area := cell.Inset(-cell.Dx() / 4)211+ mid := float32(fs.ascent+cell.Dx()/4) - float32(stillFontSize)*.33212+ fillShape(img, area, c, func(s *shape) {213+ draw(symbol{shape: s, x0: (float32(area.Dx()) - side) / 2, y0: mid - side/2, side: side})214+ })215+ return true216+}217+218+// braille draws the dots of a braille pattern, two columns of four.219+func braille(img *image.NRGBA, r rune, cell image.Rectangle, c color.RGBA) {220+ bits := int(r - 0x2800)221+ // dots 1-3 and 7 down the left, 4-6 and 8 down the right222+ pos := [8][2]int{{0, 0}, {0, 1}, {0, 2}, {1, 0}, {1, 1}, {1, 2}, {0, 3}, {1, 3}}223+ w, h := float32(cell.Dx()), float32(cell.Dy())224+ fillShape(img, cell, c, func(s *shape) {225+ for i, p := range pos {226+ if bits&(1<<i) != 0 {227+ s.disk(w*(.27+.46*float32(p[0])), h*(.14+.24*float32(p[1])), w*.14)228+ }229+ }230+ })231+}
A e2e/testdata/screens/docs-evaluate-light.html +12 -0
@@ -0,0 +1,12 @@
1+<pre class="screen"> <span style="text-decoration:underline">F</span>ile <span style="text-decoration:underline">E</span>dit <span style="text-decoration:underline">V</span>iew <span style="text-decoration:underline">I</span>nsert F<span style="text-decoration:underline">o</span>rmat <span style="text-decoration:underline">D</span>ata <span style="text-decoration:underline">H</span>elp <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">EVAL</span><span style="background:var(--vt-palette-6)"> </span>2+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-8)">┌─</span> <span style="font-weight:bold">Evaluate</span> <span style="font-weight:bold">B8</span> <span style="color:var(--vt-palette-8)">──────────────────────────────────────────────────────────────┐</span>3+ <span style="color:var(--vt-palette-8)">│</span> =<span style="color:var(--vt-palette-4);font-weight:bold;font-style:italic;text-decoration:underline">719.466666666667</span><span style="font-weight:bold;text-decoration:underline">*</span><span style="color:var(--vt-palette-4);font-weight:bold;font-style:italic;text-decoration:underline">4</span> <span style="color:var(--vt-palette-8)">│</span>4+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-8)">├────────────────────────────────────────────────────────────────────────────┤</span>5+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-0)">Next</span> <span style="font-weight:bold;text-decoration:underline">AVERAGE(Expenses)*C2</span> <span style="color:var(--vt-palette-0)">=</span> <span style="color:var(--vt-palette-4);font-style:italic">2877.86666666667</span> <span style="color:var(--vt-palette-8)">│</span>6+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-8)">└───────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-0)">2</span> <span style="color:var(--vt-palette-0)">of</span> <span style="color:var(--vt-palette-0)">3</span> <span style="color:var(--vt-palette-8)">─┘</span>7+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">5</span><span style="background:var(--vt-palette-7)"> </span> Transit 968+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">6</span><span style="background:var(--vt-palette-7)"> </span> Savings r <span style="color:var(--vt-palette-1);text-decoration:underline wavy var(--vt-palette-1)">#DIV/0!</span>9+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">7</span><span style="background:var(--vt-palette-7)"> </span> Total 2158.410+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">8</span><span style="background:var(--vt-palette-6)"> </span> <span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">2877.8667</span><span style="background:var(--vt-palette-6)"> </span>11+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">9</span><span style="background:var(--vt-palette-7)"> </span>12+The underlined part is computed next <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Enter</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">evaluate</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Esc</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">close</span></pre>\ No newline at end of file
A e2e/testdata/screens/docs-evaluate.html +12 -0
@@ -0,0 +1,12 @@
1+<pre class="screen"> <span style="text-decoration:underline">F</span>ile <span style="text-decoration:underline">E</span>dit <span style="text-decoration:underline">V</span>iew <span style="text-decoration:underline">I</span>nsert F<span style="text-decoration:underline">o</span>rmat <span style="text-decoration:underline">D</span>ata <span style="text-decoration:underline">H</span>elp <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">EVAL</span><span style="background:var(--vt-palette-6)"> </span>2+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-8)">┌─</span> <span style="font-weight:bold">Evaluate</span> <span style="font-weight:bold">B8</span> <span style="color:var(--vt-palette-8)">──────────────────────────────────────────────────────────────┐</span>3+ <span style="color:var(--vt-palette-8)">│</span> =<span style="color:var(--vt-palette-6);font-weight:bold;font-style:italic;text-decoration:underline">719.466666666667</span><span style="font-weight:bold;text-decoration:underline">*</span><span style="color:var(--vt-palette-6);font-weight:bold;font-style:italic;text-decoration:underline">4</span> <span style="color:var(--vt-palette-8)">│</span>4+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-8)">├────────────────────────────────────────────────────────────────────────────┤</span>5+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">Next</span> <span style="font-weight:bold;text-decoration:underline">AVERAGE(Expenses)*C2</span> <span style="color:var(--vt-palette-8)">=</span> <span style="color:var(--vt-palette-6);font-style:italic">2877.86666666667</span> <span style="color:var(--vt-palette-8)">│</span>6+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-8)">└───────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-8)">2</span> <span style="color:var(--vt-palette-8)">of</span> <span style="color:var(--vt-palette-8)">3</span> <span style="color:var(--vt-palette-8)">─┘</span>7+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">5</span><span style="background:var(--vt-palette-8)"> </span> Transit 968+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">6</span><span style="background:var(--vt-palette-8)"> </span> Savings r <span style="color:var(--vt-palette-1);text-decoration:underline wavy var(--vt-palette-1)">#DIV/0!</span>9+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">7</span><span style="background:var(--vt-palette-8)"> </span> Total 2158.410+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">8</span><span style="background:var(--vt-palette-6)"> </span> <span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">2877.8667</span><span style="background:var(--vt-palette-6)"> </span>11+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">9</span><span style="background:var(--vt-palette-8)"> </span>12+The underlined part is computed next <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Enter</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">evaluate</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Esc</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">close</span></pre>\ No newline at end of file
A e2e/testdata/screens/docs-layout-light.html +28 -0
@@ -0,0 +1,28 @@
1+<pre class="screen"> <span style="text-decoration:underline">F</span>ile <span style="text-decoration:underline">E</span>dit <span style="text-decoration:underline">V</span>iew <span style="text-decoration:underline">I</span>nsert F<span style="text-decoration:underline">o</span>rmat <span style="text-decoration:underline">D</span>ata <span style="text-decoration:underline">H</span>elp <span style="background:var(--vt-palette-6)"> </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+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">C4</span><span style="background:var(--vt-palette-7)"> </span> Tram 28 and the castle, before the crowds3+4+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">A</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">B</span><span style="background:var(--vt-palette-7)"> </span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">C</span><span style="background:var(--vt-palette-6)"> </span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">D</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">E</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">F</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">G</span><span style="background:var(--vt-palette-7)"> </span>5+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">1</span><span style="background:var(--vt-palette-7)"> </span> Trip to Lisbon6+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0)">┏━━━━━━━━━┯━━━━━━━━━┯━━━━━━━━━┓</span>7+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">2</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0)">┃</span>Day <span style="color:var(--vt-palette-0)">│</span>Cost <span style="color:var(--vt-palette-0)">│</span>Notes <span style="color:var(--vt-palette-0)">┃</span>8+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0)">┣━════════╪═════════╪════════━┫</span>9+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0)">┃</span> <span style="color:var(--vt-palette-0)">│</span> <span style="color:var(--vt-palette-0)">│</span>Train, <span style="color:var(--vt-palette-0)">┃</span>10+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0)">┃</span> <span style="color:var(--vt-palette-0)">│</span> <span style="color:var(--vt-palette-0)">│</span>book the <span style="color:var(--vt-palette-0)">┃</span>11+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0)">┃</span> <span style="color:var(--vt-palette-0)">│</span> <span style="color:var(--vt-palette-0)">│</span>early <span style="color:var(--vt-palette-0)">┃</span>12+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">3</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0)">┃</span>Fri <span style="color:var(--vt-palette-0)">│</span> 120 <span style="color:var(--vt-palette-0)">│</span>fare <span style="color:var(--vt-palette-0)">┃</span>13+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0)">┠─────────┼─────────┼─────────┨</span>14+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0)">┃</span> <span style="color:var(--vt-palette-0)">│</span> <span style="color:var(--vt-palette-0)">│</span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">Tram</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">28</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0)">┃</span>15+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0)">┃</span> <span style="color:var(--vt-palette-0)">│</span> <span style="color:var(--vt-palette-0)">│</span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">and</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">the</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0)">┃</span>16+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0)">┃</span> <span style="color:var(--vt-palette-0)">│</span> <span style="color:var(--vt-palette-0)">│</span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">castle,</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0)">┃</span>17+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0)">┃</span> <span style="color:var(--vt-palette-0)">│</span> <span style="color:var(--vt-palette-0)">│</span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">before</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0)">┃</span>18+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0)">┃</span> <span style="color:var(--vt-palette-0)">│</span> <span style="color:var(--vt-palette-0)">│</span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">the</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0)">┃</span>19+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">4</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0)">┃</span>Sat <span style="color:var(--vt-palette-0)">│</span> 45 <span style="color:var(--vt-palette-0)">│</span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">crowds</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0)">┃</span>20+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0)">┠─────────┼─────────┼─────────┨</span>21+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">5</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0)">┃</span>Sun <span style="color:var(--vt-palette-0)">│</span> 60 <span style="color:var(--vt-palette-0)">│</span>Fly home <span style="color:var(--vt-palette-0)">┃</span>22+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0)">┠─────────┼─────────┼─────────┨</span>23+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0)">┃</span> <span style="color:var(--vt-palette-0)">│</span> <span style="color:var(--vt-palette-0)">│</span> <span style="color:var(--vt-palette-0)">┃</span>24+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">6</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0)">┃</span>Total <span style="color:var(--vt-palette-0)">│</span> 225 <span style="color:var(--vt-palette-0)">│</span> <span style="color:var(--vt-palette-0)">┃</span>25+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0)">┗━━━━━━━━━┷━━━━━━━━━┷━━━━━━━━━┛</span>26+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">7</span><span style="background:var(--vt-palette-7)"> </span>27+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">8</span><span style="background:var(--vt-palette-7)"> </span>28+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">Sheet1</span><span style="background:var(--vt-palette-6)"> </span> <span style="color:var(--vt-palette-0)">+</span> <span style="color:var(--vt-palette-8)">│</span> untitled <span style="color:var(--vt-palette-0)">modified</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Ctrl+K</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">search</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Ctrl+/</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">shortcuts</span></pre>\ No newline at end of file
A e2e/testdata/screens/docs-layout.html +28 -0
@@ -0,0 +1,28 @@
1+<pre class="screen"> <span style="text-decoration:underline">F</span>ile <span style="text-decoration:underline">E</span>dit <span style="text-decoration:underline">V</span>iew <span style="text-decoration:underline">I</span>nsert F<span style="text-decoration:underline">o</span>rmat <span style="text-decoration:underline">D</span>ata <span style="text-decoration:underline">H</span>elp <span style="background:var(--vt-palette-6)"> </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+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">C4</span><span style="background:var(--vt-palette-8)"> </span> Tram 28 and the castle, before the crowds3+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="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">B</span><span style="background:var(--vt-palette-8)"> </span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">C</span><span style="background:var(--vt-palette-6)"> </span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">D</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">E</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">F</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">G</span><span style="background:var(--vt-palette-8)"> </span>5+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">1</span><span style="background:var(--vt-palette-8)"> </span> Trip to Lisbon6+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-7)">┏━━━━━━━━━┯━━━━━━━━━┯━━━━━━━━━┓</span>7+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">2</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-7)">┃</span>Day <span style="color:var(--vt-palette-7)">│</span>Cost <span style="color:var(--vt-palette-7)">│</span>Notes <span style="color:var(--vt-palette-7)">┃</span>8+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-7)">┣━════════╪═════════╪════════━┫</span>9+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-7)">┃</span> <span style="color:var(--vt-palette-7)">│</span> <span style="color:var(--vt-palette-7)">│</span>Train, <span style="color:var(--vt-palette-7)">┃</span>10+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-7)">┃</span> <span style="color:var(--vt-palette-7)">│</span> <span style="color:var(--vt-palette-7)">│</span>book the <span style="color:var(--vt-palette-7)">┃</span>11+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-7)">┃</span> <span style="color:var(--vt-palette-7)">│</span> <span style="color:var(--vt-palette-7)">│</span>early <span style="color:var(--vt-palette-7)">┃</span>12+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">3</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-7)">┃</span>Fri <span style="color:var(--vt-palette-7)">│</span> 120 <span style="color:var(--vt-palette-7)">│</span>fare <span style="color:var(--vt-palette-7)">┃</span>13+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-7)">┠─────────┼─────────┼─────────┨</span>14+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-7)">┃</span> <span style="color:var(--vt-palette-7)">│</span> <span style="color:var(--vt-palette-7)">│</span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">Tram</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">28</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-7)">┃</span>15+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-7)">┃</span> <span style="color:var(--vt-palette-7)">│</span> <span style="color:var(--vt-palette-7)">│</span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">and</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">the</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-7)">┃</span>16+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-7)">┃</span> <span style="color:var(--vt-palette-7)">│</span> <span style="color:var(--vt-palette-7)">│</span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">castle,</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-7)">┃</span>17+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-7)">┃</span> <span style="color:var(--vt-palette-7)">│</span> <span style="color:var(--vt-palette-7)">│</span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">before</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-7)">┃</span>18+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-7)">┃</span> <span style="color:var(--vt-palette-7)">│</span> <span style="color:var(--vt-palette-7)">│</span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">the</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-7)">┃</span>19+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">4</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-7)">┃</span>Sat <span style="color:var(--vt-palette-7)">│</span> 45 <span style="color:var(--vt-palette-7)">│</span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">crowds</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-7)">┃</span>20+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-7)">┠─────────┼─────────┼─────────┨</span>21+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">5</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-7)">┃</span>Sun <span style="color:var(--vt-palette-7)">│</span> 60 <span style="color:var(--vt-palette-7)">│</span>Fly home <span style="color:var(--vt-palette-7)">┃</span>22+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-7)">┠─────────┼─────────┼─────────┨</span>23+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-7)">┃</span> <span style="color:var(--vt-palette-7)">│</span> <span style="color:var(--vt-palette-7)">│</span> <span style="color:var(--vt-palette-7)">┃</span>24+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">6</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-7)">┃</span>Total <span style="color:var(--vt-palette-7)">│</span> 225 <span style="color:var(--vt-palette-7)">│</span> <span style="color:var(--vt-palette-7)">┃</span>25+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-7)">┗━━━━━━━━━┷━━━━━━━━━┷━━━━━━━━━┛</span>26+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">7</span><span style="background:var(--vt-palette-8)"> </span>27+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">8</span><span style="background:var(--vt-palette-8)"> </span>28+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">Sheet1</span><span style="background:var(--vt-palette-6)"> </span> <span style="color:var(--vt-palette-8)">+</span> <span style="color:var(--vt-palette-8)">│</span> untitled <span style="color:var(--vt-palette-8)">modified</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Ctrl+K</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">search</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Ctrl+/</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">shortcuts</span></pre>\ No newline at end of file
A e2e/testdata/screens/docs-notebook-cells-light.html +26 -0
@@ -0,0 +1,26 @@
1+<pre class="screen"> <span style="text-decoration:underline">F</span>ile <span style="text-decoration:underline">E</span>dit <span style="text-decoration:underline">V</span>iew <span style="text-decoration:underline">I</span>nsert F<span style="text-decoration:underline">o</span>rmat <span style="text-decoration:underline">D</span>ata <span style="text-decoration:underline">H</span>elp <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">NOTEBOOK</span><span style="background:var(--vt-palette-6)"> </span>2+ ▶ Run <span style="color:var(--vt-palette-8)">■</span> <span style="color:var(--vt-palette-8)">Stop</span> ↻ Restart ▶▶ Run all <span style="color:var(--vt-palette-8)">│</span> + Add ✂ ⧉ <span style="color:var(--vt-palette-8)">⎘</span> <span style="color:var(--vt-palette-8)">│</span> Code ▾ <span style="color:var(--vt-palette-0)">nu</span> <span style="color:var(--vt-palette-0)">○</span> <span style="color:var(--vt-palette-0)">idle</span>3+ <span style="color:var(--vt-palette-0)">cell</span> <span style="color:var(--vt-palette-0)">3:</span> <span style="color:var(--vt-palette-0)">reads</span> <span style="color:var(--vt-palette-0)">$files</span> <span style="color:var(--vt-palette-8)">─────────────────────────</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Enter</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">edit</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Shift+↑↓</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">select</span>4+ <span style="font-weight:bold;text-decoration:underline">Files</span>5+ What&#39;s big in the repo, from <span style="color:var(--vt-palette-4)">ls</span>.6+7+ <span style="color:var(--vt-palette-8)">╭─</span> <span style="color:var(--vt-palette-0)">files</span> <span style="color:var(--vt-palette-8)">──────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-0)">✓</span> <span style="color:var(--vt-palette-0)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>8+ <span style="color:var(--vt-palette-0)">[1]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">files</span> <span style="font-weight:bold">=</span> <span style="color:var(--vt-palette-4)">ls</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-0)">▶</span>9+ <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────╯</span>10+ <span style="color:var(--vt-palette-0)">Out[1]:</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">name</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">type</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">size</span><span style="background:var(--vt-palette-7)"> </span>11+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">1</span><span style="background:var(--vt-palette-7)"> </span> 012 file 4.2 kB12+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">2</span><span style="background:var(--vt-palette-7)"> </span> CLAUDE.md file 1.0 kB13+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">3</span><span style="background:var(--vt-palette-7)"> </span> README.md file 9.8 kB14+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">4</span><span style="background:var(--vt-palette-7)"> </span> demos dir 3.1 kB15+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">5</span><span style="background:var(--vt-palette-7)"> </span> go.mod file 812 B16+17+<span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-4)">╭──────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-0)">✓</span> <span style="color:var(--vt-palette-0)">&lt;1s</span> <span style="color:var(--vt-palette-4)">─╮</span>18+<span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-0)">[2]:</span> <span style="color:var(--vt-palette-4)">│</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-4)">where</span> size <span style="font-weight:bold">&gt;</span> <span style="color:var(--vt-palette-1)">1kb</span> <span style="color:var(--vt-palette-4)">│</span> <span style="color:var(--vt-palette-4)">▶</span>19+<span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-4)">╰──────────────────────────────────────────────────────────────────╯</span>20+<span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-0)">Out[2]:</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">name</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">type</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">size</span><span style="background:var(--vt-palette-7)"> </span>21+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">1</span><span style="background:var(--vt-palette-7)"> </span> 012 file 4.2 kB22+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">2</span><span style="background:var(--vt-palette-7)"> </span> README.md file 9.8 kB23+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">3</span><span style="background:var(--vt-palette-7)"> </span> demos dir 3.1 kB24+25+ <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────────────╮</span>26+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">❯</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">Notebook</span><span style="background:var(--vt-palette-6)"> </span> <span style="color:var(--vt-palette-0)">+</span> <span style="color:var(--vt-palette-8)">│</span> untitled <span style="color:var(--vt-palette-0)">modified</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Ctrl+K</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">search</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Ctrl+/</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">shortcuts</span></pre>\ No newline at end of file
A e2e/testdata/screens/docs-notebook-cells.html +26 -0
@@ -0,0 +1,26 @@
1+<pre class="screen"> <span style="text-decoration:underline">F</span>ile <span style="text-decoration:underline">E</span>dit <span style="text-decoration:underline">V</span>iew <span style="text-decoration:underline">I</span>nsert F<span style="text-decoration:underline">o</span>rmat <span style="text-decoration:underline">D</span>ata <span style="text-decoration:underline">H</span>elp <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">NOTEBOOK</span><span style="background:var(--vt-palette-6)"> </span>2+ ▶ Run <span style="color:var(--vt-palette-8)">■</span> <span style="color:var(--vt-palette-8)">Stop</span> ↻ Restart ▶▶ Run all <span style="color:var(--vt-palette-8)">│</span> + Add ✂ ⧉ <span style="color:var(--vt-palette-8)">⎘</span> <span style="color:var(--vt-palette-8)">│</span> Code ▾ <span style="color:var(--vt-palette-8)">nu</span> <span style="color:var(--vt-palette-8)">○</span> <span style="color:var(--vt-palette-8)">idle</span>3+ <span style="color:var(--vt-palette-8)">cell</span> <span style="color:var(--vt-palette-8)">3:</span> <span style="color:var(--vt-palette-8)">reads</span> <span style="color:var(--vt-palette-8)">$files</span> <span style="color:var(--vt-palette-8)">─────────────────────────</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Enter</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">edit</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Shift+↑↓</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">select</span>4+ <span style="font-weight:bold;text-decoration:underline">Files</span>5+ What&#39;s big in the repo, from <span style="color:var(--vt-palette-6)">ls</span>.6+7+ <span style="color:var(--vt-palette-8)">╭─</span> <span style="color:var(--vt-palette-8)">files</span> <span style="color:var(--vt-palette-8)">──────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-8)">✓</span> <span style="color:var(--vt-palette-8)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>8+ <span style="color:var(--vt-palette-8)">[1]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">files</span> <span style="font-weight:bold">=</span> <span style="color:var(--vt-palette-6)">ls</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">▶</span>9+ <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────╯</span>10+ <span style="color:var(--vt-palette-8)">Out[1]:</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">name</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">type</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">size</span><span style="background:var(--vt-palette-8)"> </span>11+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">1</span><span style="background:var(--vt-palette-8)"> </span> 012 file 4.2 kB12+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">2</span><span style="background:var(--vt-palette-8)"> </span> CLAUDE.md file 1.0 kB13+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">3</span><span style="background:var(--vt-palette-8)"> </span> README.md file 9.8 kB14+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">4</span><span style="background:var(--vt-palette-8)"> </span> demos dir 3.1 kB15+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">5</span><span style="background:var(--vt-palette-8)"> </span> go.mod file 812 B16+17+<span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-4)">╭──────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-8)">✓</span> <span style="color:var(--vt-palette-8)">&lt;1s</span> <span style="color:var(--vt-palette-4)">─╮</span>18+<span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-8)">[2]:</span> <span style="color:var(--vt-palette-4)">│</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-6)">where</span> size <span style="font-weight:bold">&gt;</span> <span style="color:var(--vt-palette-3)">1kb</span> <span style="color:var(--vt-palette-4)">│</span> <span style="color:var(--vt-palette-4)">▶</span>19+<span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-4)">╰──────────────────────────────────────────────────────────────────╯</span>20+<span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-8)">Out[2]:</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">name</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">type</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">size</span><span style="background:var(--vt-palette-8)"> </span>21+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">1</span><span style="background:var(--vt-palette-8)"> </span> 012 file 4.2 kB22+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">2</span><span style="background:var(--vt-palette-8)"> </span> README.md file 9.8 kB23+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">3</span><span style="background:var(--vt-palette-8)"> </span> demos dir 3.1 kB24+25+ <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────────────╮</span>26+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">❯</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">Notebook</span><span style="background:var(--vt-palette-6)"> </span> <span style="color:var(--vt-palette-8)">+</span> <span style="color:var(--vt-palette-8)">│</span> untitled <span style="color:var(--vt-palette-8)">modified</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Ctrl+K</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">search</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Ctrl+/</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">shortcuts</span></pre>\ No newline at end of file
A e2e/testdata/screens/docs-notebook-grid-light.html +24 -0
@@ -0,0 +1,24 @@
1+<pre class="screen"> <span style="text-decoration:underline">F</span>ile <span style="text-decoration:underline">E</span>dit <span style="text-decoration:underline">V</span>iew <span style="text-decoration:underline">I</span>nsert F<span style="text-decoration:underline">o</span>rmat <span style="text-decoration:underline">D</span>ata <span style="text-decoration:underline">H</span>elp <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">OUTPUT</span><span style="background:var(--vt-palette-6)"> </span>2+ ▶ Run <span style="color:var(--vt-palette-8)">■</span> <span style="color:var(--vt-palette-8)">Stop</span> ↻ Restart ▶▶ Run all <span style="color:var(--vt-palette-8)">│</span> + Add ✂ ⧉ <span style="color:var(--vt-palette-8)">⎘</span> <span style="color:var(--vt-palette-8)">│</span> Code ▾ <span style="color:var(--vt-palette-0)">nu</span> <span style="color:var(--vt-palette-0)">○</span> <span style="color:var(--vt-palette-0)">idle</span>3+ <span style="color:var(--vt-palette-0)">Output</span> <span style="color:var(--vt-palette-0)">of</span> <span style="color:var(--vt-palette-0)">files</span> <span style="color:var(--vt-palette-8)">───────────────</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Ctrl+F</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">find</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Enter</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">full-screen</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Esc</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">back</span>4+ What&#39;s big in the repo, from <span style="color:var(--vt-palette-4)">ls</span>.5+6+ <span style="color:var(--vt-palette-8)">╭─</span> <span style="color:var(--vt-palette-0)">files</span> <span style="color:var(--vt-palette-8)">──────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-0)">✓</span> <span style="color:var(--vt-palette-0)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>7+ <span style="color:var(--vt-palette-0)">[1]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">files</span> <span style="font-weight:bold">=</span> <span style="color:var(--vt-palette-4)">ls</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">▶</span>8+ <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────╯</span>9+<span style="color:var(--vt-palette-2)">▌</span> <span style="color:var(--vt-palette-0)">Out[1]:</span> <span style="background:var(--vt-palette-7)"> </span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">name</span><span style="background:var(--vt-palette-6)"> </span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4)">type</span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4)">size</span><span style="background:var(--vt-palette-4)"> </span>10+<span style="color:var(--vt-palette-2)">▌</span> <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">1</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">012</span><span style="background:var(--vt-palette-6)"> </span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4)">file</span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4)">4.2</span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4)">kB</span><span style="background:var(--vt-palette-4)"> </span>11+<span style="color:var(--vt-palette-2)">▌</span> <span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4)">2</span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4)">CLAUDE.md</span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4)">file</span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4)">1.0</span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4)">kB</span><span style="background:var(--vt-palette-4)"> </span>12+<span style="color:var(--vt-palette-2)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">3</span><span style="background:var(--vt-palette-7)"> </span> README.md file 9.8 kB13+<span style="color:var(--vt-palette-2)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">4</span><span style="background:var(--vt-palette-7)"> </span> demos dir 3.1 kB14+<span style="color:var(--vt-palette-2)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">5</span><span style="background:var(--vt-palette-7)"> </span> go.mod file 812 B15+16+ <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-0)">✓</span> <span style="color:var(--vt-palette-0)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>17+ <span style="color:var(--vt-palette-0)">[2]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-4)">where</span> size <span style="font-weight:bold">&gt;</span> <span style="color:var(--vt-palette-1)">1kb</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-0)">▶</span>18+ <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────╯</span>19+ <span style="color:var(--vt-palette-0)">Out[2]:</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">name</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">type</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">size</span><span style="background:var(--vt-palette-7)"> </span>20+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">1</span><span style="background:var(--vt-palette-7)"> </span> 012 file 4.2 kB21+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">2</span><span style="background:var(--vt-palette-7)"> </span> README.md file 9.8 kB22+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">3</span><span style="background:var(--vt-palette-7)"> </span> demos dir 3.1 kB23+24+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">❯</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">Notebook</span><span style="background:var(--vt-palette-6)"> </span> <span style="color:var(--vt-palette-0)">+</span> <span style="color:var(--vt-palette-8)">│</span> untitled <span style="color:var(--vt-palette-0)">modified</span> <span style="font-weight:bold">name</span> <span style="font-weight:bold">to</span> <span style="font-weight:bold">size,</span> <span style="font-weight:bold">rows</span> <span style="font-weight:bold">1</span> <span style="font-weight:bold">to</span> <span style="font-weight:bold">2</span> <span style="color:var(--vt-palette-0)">Count</span> 6</pre>\ No newline at end of file
A e2e/testdata/screens/docs-notebook-grid.html +24 -0
@@ -0,0 +1,24 @@
1+<pre class="screen"> <span style="text-decoration:underline">F</span>ile <span style="text-decoration:underline">E</span>dit <span style="text-decoration:underline">V</span>iew <span style="text-decoration:underline">I</span>nsert F<span style="text-decoration:underline">o</span>rmat <span style="text-decoration:underline">D</span>ata <span style="text-decoration:underline">H</span>elp <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">OUTPUT</span><span style="background:var(--vt-palette-6)"> </span>2+ ▶ Run <span style="color:var(--vt-palette-8)">■</span> <span style="color:var(--vt-palette-8)">Stop</span> ↻ Restart ▶▶ Run all <span style="color:var(--vt-palette-8)">│</span> + Add ✂ ⧉ <span style="color:var(--vt-palette-8)">⎘</span> <span style="color:var(--vt-palette-8)">│</span> Code ▾ <span style="color:var(--vt-palette-8)">nu</span> <span style="color:var(--vt-palette-8)">○</span> <span style="color:var(--vt-palette-8)">idle</span>3+ <span style="color:var(--vt-palette-8)">Output</span> <span style="color:var(--vt-palette-8)">of</span> <span style="color:var(--vt-palette-8)">files</span> <span style="color:var(--vt-palette-8)">───────────────</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Ctrl+F</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">find</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Enter</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">full-screen</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Esc</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">back</span>4+ What&#39;s big in the repo, from <span style="color:var(--vt-palette-6)">ls</span>.5+6+ <span style="color:var(--vt-palette-8)">╭─</span> <span style="color:var(--vt-palette-8)">files</span> <span style="color:var(--vt-palette-8)">──────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-8)">✓</span> <span style="color:var(--vt-palette-8)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>7+ <span style="color:var(--vt-palette-8)">[1]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">files</span> <span style="font-weight:bold">=</span> <span style="color:var(--vt-palette-6)">ls</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">▶</span>8+ <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────╯</span>9+<span style="color:var(--vt-palette-2)">▌</span> <span style="color:var(--vt-palette-8)">Out[1]:</span> <span style="background:var(--vt-palette-8)"> </span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">name</span><span style="background:var(--vt-palette-6)"> </span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4)">type</span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4)">size</span><span style="background:var(--vt-palette-4)"> </span>10+<span style="color:var(--vt-palette-2)">▌</span> <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">1</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">012</span><span style="background:var(--vt-palette-6)"> </span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4)">file</span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4)">4.2</span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4)">kB</span><span style="background:var(--vt-palette-4)"> </span>11+<span style="color:var(--vt-palette-2)">▌</span> <span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4)">2</span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4)">CLAUDE.md</span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4)">file</span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4)">1.0</span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4)">kB</span><span style="background:var(--vt-palette-4)"> </span>12+<span style="color:var(--vt-palette-2)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">3</span><span style="background:var(--vt-palette-8)"> </span> README.md file 9.8 kB13+<span style="color:var(--vt-palette-2)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">4</span><span style="background:var(--vt-palette-8)"> </span> demos dir 3.1 kB14+<span style="color:var(--vt-palette-2)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">5</span><span style="background:var(--vt-palette-8)"> </span> go.mod file 812 B15+16+ <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-8)">✓</span> <span style="color:var(--vt-palette-8)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>17+ <span style="color:var(--vt-palette-8)">[2]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-6)">where</span> size <span style="font-weight:bold">&gt;</span> <span style="color:var(--vt-palette-3)">1kb</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">▶</span>18+ <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────╯</span>19+ <span style="color:var(--vt-palette-8)">Out[2]:</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">name</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">type</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">size</span><span style="background:var(--vt-palette-8)"> </span>20+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">1</span><span style="background:var(--vt-palette-8)"> </span> 012 file 4.2 kB21+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">2</span><span style="background:var(--vt-palette-8)"> </span> README.md file 9.8 kB22+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">3</span><span style="background:var(--vt-palette-8)"> </span> demos dir 3.1 kB23+24+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">❯</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">Notebook</span><span style="background:var(--vt-palette-6)"> </span> <span style="color:var(--vt-palette-8)">+</span> <span style="color:var(--vt-palette-8)">│</span> untitled <span style="color:var(--vt-palette-8)">modified</span> <span style="font-weight:bold">name</span> <span style="font-weight:bold">to</span> <span style="font-weight:bold">size,</span> <span style="font-weight:bold">rows</span> <span style="font-weight:bold">1</span> <span style="font-weight:bold">to</span> <span style="font-weight:bold">2</span> <span style="color:var(--vt-palette-8)">Count</span> 6</pre>\ No newline at end of file
A e2e/testdata/screens/docs-notebook-nu-error-light.html +16 -0
@@ -0,0 +1,16 @@
1+<pre class="screen"> <span style="text-decoration:underline">F</span>ile <span style="text-decoration:underline">E</span>dit <span style="text-decoration:underline">V</span>iew <span style="text-decoration:underline">I</span>nsert F<span style="text-decoration:underline">o</span>rmat <span style="text-decoration:underline">D</span>ata <span style="text-decoration:underline">H</span>elp <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">EDIT</span><span style="background:var(--vt-palette-6)"> </span>2+ ▶ Run <span style="color:var(--vt-palette-8)">■</span> <span style="color:var(--vt-palette-8)">Stop</span> ↻ Restart ▶▶ Run all <span style="color:var(--vt-palette-8)">│</span> + Add ✂ ⧉ <span style="color:var(--vt-palette-8)">⎘</span> <span style="color:var(--vt-palette-8)">│</span> Code ▾ <span style="color:var(--vt-palette-0)">nu</span> <span style="color:var(--vt-palette-0)">○</span> <span style="color:var(--vt-palette-0)">idle</span>3+ <span style="color:var(--vt-palette-3)">The</span> <span style="color:var(--vt-palette-3)">`sort-by`</span> <span style="color:var(--vt-palette-3)">command</span> <span style="color:var(--vt-palette-3)">doesn&#39;t</span> <span style="color:var(--vt-palette-3)">have</span> <span style="color:var(--vt-palette-3)">flag</span> <span style="color:var(--vt-palette-3)">`revrse`.</span> <span style="color:var(--vt-palette-8)">─</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Esc</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">done</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Tab</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">complete</span>4+5+ <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-0)">✓</span> <span style="color:var(--vt-palette-0)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>6+ <span style="color:var(--vt-palette-0)">[2]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-4)">where</span> size <span style="font-weight:bold">&gt;</span> <span style="color:var(--vt-palette-1)">1kb</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-0)">▶</span>7+ <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────╯</span>8+ <span style="color:var(--vt-palette-0)">Out[2]:</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">name</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">type</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">size</span><span style="background:var(--vt-palette-7)"> </span>9+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">1</span><span style="background:var(--vt-palette-7)"> </span> 012 file 4.2 kB10+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">2</span><span style="background:var(--vt-palette-7)"> </span> README.md file 9.8 kB11+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">3</span><span style="background:var(--vt-palette-7)"> </span> demos dir 3.1 kB12+13+<span style="color:var(--vt-palette-2)">▌</span> <span style="color:var(--vt-palette-2)">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓</span>14+<span style="color:var(--vt-palette-2)">▌</span> <span style="color:var(--vt-palette-0)">[</span> <span style="color:var(--vt-palette-0)">]:</span> <span style="color:var(--vt-palette-2)">┃</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-4)">sort-by</span> <span style="color:var(--vt-palette-2)">size</span> <span style="text-decoration:underline wavy var(--vt-palette-1)">--revrse</span> <span style="color:var(--vt-palette-2)">┃</span> <span style="color:var(--vt-palette-2)">▶</span>15+<span style="color:var(--vt-palette-2)">▌</span> <span style="color:var(--vt-palette-2)">┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛</span>16+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">❯</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">Notebook</span><span style="background:var(--vt-palette-6)"> </span> <span style="color:var(--vt-palette-0)">+</span> <span style="color:var(--vt-palette-8)">│</span> untitled <span style="color:var(--vt-palette-0)">modified</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Ctrl+K</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">search</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Ctrl+/</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">shortcuts</span></pre>\ No newline at end of file
A e2e/testdata/screens/docs-notebook-nu-error.html +16 -0
@@ -0,0 +1,16 @@
1+<pre class="screen"> <span style="text-decoration:underline">F</span>ile <span style="text-decoration:underline">E</span>dit <span style="text-decoration:underline">V</span>iew <span style="text-decoration:underline">I</span>nsert F<span style="text-decoration:underline">o</span>rmat <span style="text-decoration:underline">D</span>ata <span style="text-decoration:underline">H</span>elp <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">EDIT</span><span style="background:var(--vt-palette-6)"> </span>2+ ▶ Run <span style="color:var(--vt-palette-8)">■</span> <span style="color:var(--vt-palette-8)">Stop</span> ↻ Restart ▶▶ Run all <span style="color:var(--vt-palette-8)">│</span> + Add ✂ ⧉ <span style="color:var(--vt-palette-8)">⎘</span> <span style="color:var(--vt-palette-8)">│</span> Code ▾ <span style="color:var(--vt-palette-8)">nu</span> <span style="color:var(--vt-palette-8)">○</span> <span style="color:var(--vt-palette-8)">idle</span>3+ <span style="color:var(--vt-palette-3)">The</span> <span style="color:var(--vt-palette-3)">`sort-by`</span> <span style="color:var(--vt-palette-3)">command</span> <span style="color:var(--vt-palette-3)">doesn&#39;t</span> <span style="color:var(--vt-palette-3)">have</span> <span style="color:var(--vt-palette-3)">flag</span> <span style="color:var(--vt-palette-3)">`revrse`.</span> <span style="color:var(--vt-palette-8)">─</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Esc</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">done</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Tab</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">complete</span>4+5+ <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-8)">✓</span> <span style="color:var(--vt-palette-8)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>6+ <span style="color:var(--vt-palette-8)">[2]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-6)">where</span> size <span style="font-weight:bold">&gt;</span> <span style="color:var(--vt-palette-3)">1kb</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">▶</span>7+ <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────╯</span>8+ <span style="color:var(--vt-palette-8)">Out[2]:</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">name</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">type</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">size</span><span style="background:var(--vt-palette-8)"> </span>9+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">1</span><span style="background:var(--vt-palette-8)"> </span> 012 file 4.2 kB10+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">2</span><span style="background:var(--vt-palette-8)"> </span> README.md file 9.8 kB11+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">3</span><span style="background:var(--vt-palette-8)"> </span> demos dir 3.1 kB12+13+<span style="color:var(--vt-palette-2)">▌</span> <span style="color:var(--vt-palette-2)">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓</span>14+<span style="color:var(--vt-palette-2)">▌</span> <span style="color:var(--vt-palette-8)">[</span> <span style="color:var(--vt-palette-8)">]:</span> <span style="color:var(--vt-palette-2)">┃</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-6)">sort-by</span> <span style="color:var(--vt-palette-2)">size</span> <span style="text-decoration:underline wavy var(--vt-palette-1)">--revrse</span> <span style="color:var(--vt-palette-2)">┃</span> <span style="color:var(--vt-palette-2)">▶</span>15+<span style="color:var(--vt-palette-2)">▌</span> <span style="color:var(--vt-palette-2)">┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛</span>16+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">❯</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">Notebook</span><span style="background:var(--vt-palette-6)"> </span> <span style="color:var(--vt-palette-8)">+</span> <span style="color:var(--vt-palette-8)">│</span> untitled <span style="color:var(--vt-palette-8)">modified</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Ctrl+K</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">search</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Ctrl+/</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">shortcuts</span></pre>\ No newline at end of file
A e2e/testdata/screens/docs-palette-light.html +18 -0
@@ -0,0 +1,18 @@
1+<pre class="screen"> <span style="text-decoration:underline">F</span>ile <span style="text-decoration:underline">E</span>dit <span style="text-decoration:underline">V</span>iew <span style="text-decoration:underline">I</span>nsert F<span style="text-decoration:underline">o</span>rmat <span style="text-decoration:underline">D</span>ata <span style="text-decoration:underline">H</span>elp <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">MENU</span><span style="background:var(--vt-palette-6)"> </span>2+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-8)">┌─</span> <span style="font-weight:bold">Search</span> <span style="font-weight:bold">the</span> <span style="font-weight:bold">menus</span> <span style="color:var(--vt-palette-8)">─────────────────────────────────────────────────────────┐</span>3+ <span style="color:var(--vt-palette-8)">│</span> <span style="font-weight:bold">›</span> <span style="color:var(--vt-palette-0)">Type</span> <span style="color:var(--vt-palette-0)">a</span> <span style="color:var(--vt-palette-0)">command,</span> <span style="color:var(--vt-palette-0)">e.g.</span> <span style="color:var(--vt-palette-0)">save</span> <span style="color:var(--vt-palette-0)">or</span> <span style="color:var(--vt-palette-0)">width</span> <span style="color:var(--vt-palette-8)">│</span>4+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-8)">├────────────────────────────────────────────────────────────────────────────┤</span>5+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-8)">│</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">New</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">File</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-8)">│</span>6+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-8)">│</span> Open <span style="color:var(--vt-palette-0)">File</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Ctrl+O</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-8)">│</span>7+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-8)">│</span> Import <span style="color:var(--vt-palette-0)">File</span> <span style="color:var(--vt-palette-8)">│</span>8+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-8)">│</span> Save <span style="color:var(--vt-palette-0)">File</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Ctrl+S</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-8)">│</span>9+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-8)">│</span> Save as <span style="color:var(--vt-palette-0)">File</span> <span style="color:var(--vt-palette-8)">│</span>10+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-8)">│</span> Download as CSV <span style="color:var(--vt-palette-0)">File</span> <span style="color:var(--vt-palette-0)">›</span> <span style="color:var(--vt-palette-0)">Download</span> <span style="color:var(--vt-palette-8)">│</span>11+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-8)">│</span> Download as TSV <span style="color:var(--vt-palette-0)">File</span> <span style="color:var(--vt-palette-0)">›</span> <span style="color:var(--vt-palette-0)">Download</span> <span style="color:var(--vt-palette-8)">│</span>12+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-8)">│</span> Download as XLSX <span style="color:var(--vt-palette-0)">File</span> <span style="color:var(--vt-palette-0)">›</span> <span style="color:var(--vt-palette-0)">Download</span> <span style="color:var(--vt-palette-8)">│</span>13+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-8)">│</span> Download as SQLite <span style="color:var(--vt-palette-0)">File</span> <span style="color:var(--vt-palette-0)">›</span> <span style="color:var(--vt-palette-0)">Download</span> <span style="color:var(--vt-palette-8)">│</span>14+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-8)">│</span> Download as JSON <span style="color:var(--vt-palette-0)">File</span> <span style="color:var(--vt-palette-0)">›</span> <span style="color:var(--vt-palette-0)">Download</span> <span style="color:var(--vt-palette-8)">│</span>15+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-8)">│</span> Download as NUON <span style="color:var(--vt-palette-0)">File</span> <span style="color:var(--vt-palette-0)">›</span> <span style="color:var(--vt-palette-0)">Download</span> <span style="color:var(--vt-palette-8)">│</span>16+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-8)">│</span> Download as HTML <span style="color:var(--vt-palette-0)">File</span> <span style="color:var(--vt-palette-0)">›</span> <span style="color:var(--vt-palette-0)">Download</span> <span style="color:var(--vt-palette-8)">│</span>17+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-8)">└───────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-0)">226</span> <span style="color:var(--vt-palette-0)">of</span> <span style="color:var(--vt-palette-0)">226</span> <span style="color:var(--vt-palette-8)">─┘</span>18+Start a new, empty sheet <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Up/Down</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">move</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Enter</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">run</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Esc</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">close</span></pre>\ No newline at end of file
A e2e/testdata/screens/docs-palette.html +18 -0
@@ -0,0 +1,18 @@
1+<pre class="screen"> <span style="text-decoration:underline">F</span>ile <span style="text-decoration:underline">E</span>dit <span style="text-decoration:underline">V</span>iew <span style="text-decoration:underline">I</span>nsert F<span style="text-decoration:underline">o</span>rmat <span style="text-decoration:underline">D</span>ata <span style="text-decoration:underline">H</span>elp <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">MENU</span><span style="background:var(--vt-palette-6)"> </span>2+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-8)">┌─</span> <span style="font-weight:bold">Search</span> <span style="font-weight:bold">the</span> <span style="font-weight:bold">menus</span> <span style="color:var(--vt-palette-8)">─────────────────────────────────────────────────────────┐</span>3+ <span style="color:var(--vt-palette-8)">│</span> <span style="font-weight:bold">›</span> <span style="color:var(--vt-palette-8)">Type</span> <span style="color:var(--vt-palette-8)">a</span> <span style="color:var(--vt-palette-8)">command,</span> <span style="color:var(--vt-palette-8)">e.g.</span> <span style="color:var(--vt-palette-8)">save</span> <span style="color:var(--vt-palette-8)">or</span> <span style="color:var(--vt-palette-8)">width</span> <span style="color:var(--vt-palette-8)">│</span>4+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-8)">├────────────────────────────────────────────────────────────────────────────┤</span>5+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-8)">│</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">New</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">File</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-8)">│</span>6+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-8)">│</span> Open <span style="color:var(--vt-palette-8)">File</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Ctrl+O</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">│</span>7+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-8)">│</span> Import <span style="color:var(--vt-palette-8)">File</span> <span style="color:var(--vt-palette-8)">│</span>8+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-8)">│</span> Save <span style="color:var(--vt-palette-8)">File</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Ctrl+S</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">│</span>9+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-8)">│</span> Save as <span style="color:var(--vt-palette-8)">File</span> <span style="color:var(--vt-palette-8)">│</span>10+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-8)">│</span> Download as CSV <span style="color:var(--vt-palette-8)">File</span> <span style="color:var(--vt-palette-8)">›</span> <span style="color:var(--vt-palette-8)">Download</span> <span style="color:var(--vt-palette-8)">│</span>11+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-8)">│</span> Download as TSV <span style="color:var(--vt-palette-8)">File</span> <span style="color:var(--vt-palette-8)">›</span> <span style="color:var(--vt-palette-8)">Download</span> <span style="color:var(--vt-palette-8)">│</span>12+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-8)">│</span> Download as XLSX <span style="color:var(--vt-palette-8)">File</span> <span style="color:var(--vt-palette-8)">›</span> <span style="color:var(--vt-palette-8)">Download</span> <span style="color:var(--vt-palette-8)">│</span>13+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-8)">│</span> Download as SQLite <span style="color:var(--vt-palette-8)">File</span> <span style="color:var(--vt-palette-8)">›</span> <span style="color:var(--vt-palette-8)">Download</span> <span style="color:var(--vt-palette-8)">│</span>14+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-8)">│</span> Download as JSON <span style="color:var(--vt-palette-8)">File</span> <span style="color:var(--vt-palette-8)">›</span> <span style="color:var(--vt-palette-8)">Download</span> <span style="color:var(--vt-palette-8)">│</span>15+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-8)">│</span> Download as NUON <span style="color:var(--vt-palette-8)">File</span> <span style="color:var(--vt-palette-8)">›</span> <span style="color:var(--vt-palette-8)">Download</span> <span style="color:var(--vt-palette-8)">│</span>16+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-8)">│</span> Download as HTML <span style="color:var(--vt-palette-8)">File</span> <span style="color:var(--vt-palette-8)">›</span> <span style="color:var(--vt-palette-8)">Download</span> <span style="color:var(--vt-palette-8)">│</span>17+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-8)">└───────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-8)">226</span> <span style="color:var(--vt-palette-8)">of</span> <span style="color:var(--vt-palette-8)">226</span> <span style="color:var(--vt-palette-8)">─┘</span>18+Start a new, empty sheet <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Up/Down</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">move</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Enter</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">run</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Esc</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">close</span></pre>\ No newline at end of file
A e2e/testdata/screens/docs-rules-bars-light.html +12 -0
@@ -0,0 +1,12 @@
1+<pre class="screen"> <span style="text-decoration:underline">F</span>ile <span style="text-decoration:underline">E</span>dit <span style="text-decoration:underline">V</span>iew <span style="text-decoration:underline">I</span>nsert F<span style="text-decoration:underline">o</span>rmat <span style="text-decoration:underline">D</span>ata <span style="text-decoration:underline">H</span>elp <span style="background:var(--vt-palette-6)"> </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+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">E3</span><span style="background:var(--vt-palette-7)"> </span> Art3+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Alt+Down</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">choose</span> <span style="color:var(--vt-palette-0)">from</span> <span style="color:var(--vt-palette-0)">the</span> <span style="color:var(--vt-palette-0)">list</span>4+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">A</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">B</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">C</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">D</span><span style="background:var(--vt-palette-7)"> </span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">E</span><span style="background:var(--vt-palette-6)"> </span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">F</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">G</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">H</span><span style="background:var(--vt-palette-7)"> </span>5+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">1</span><span style="background:var(--vt-palette-7)"> </span> <span style="font-weight:bold">Name</span> <span style="font-weight:bold">Points</span> <span style="font-weight:bold">Change</span> <span style="font-weight:bold">Grade</span> <span style="font-weight:bold">Track</span> <span style="font-weight:bold">Passed</span>6+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">2</span><span style="background:var(--vt-palette-7)"> </span> Ada <span style="color:var(--vt-palette-4)">██████</span><span style="color:var(--bg);background:var(--vt-palette-4)">9</span>2 <span style="color:var(--vt-palette-2)">↑</span> 12 <span style="color:var(--vt-palette-3)">◕</span> <span style="color:var(--vt-palette-7)">▐</span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Math</span><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-7)">▌</span> [✓]7+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">3</span><span style="background:var(--vt-palette-6)"> </span> <span style="color:var(--vt-palette-5);font-style:italic">Bo</span> <span style="color:var(--vt-palette-4)">███▉</span> 48 <span style="color:var(--vt-palette-1)">↓</span> -8 <span style="color:var(--vt-palette-3)">◔</span> <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">Art</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">▾</span> [ ]8+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">4</span><span style="background:var(--vt-palette-7)"> </span> Cy <span style="color:var(--vt-palette-4)">██████</span>75 <span style="color:var(--vt-palette-3)">→</span> 3 <span style="color:var(--vt-palette-3)">◑</span> <span style="color:var(--vt-palette-7)">▐</span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Math</span><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-7)">▌</span> [✓]9+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">5</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-5);font-style:italic">Bo</span> <span style="color:var(--vt-palette-4)">██▍</span> 30 <span style="color:var(--vt-palette-1)">↓</span> -2 <span style="color:var(--vt-palette-1)">○</span> <span style="color:var(--vt-palette-0)">▾</span> [ ]10+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">6</span><span style="background:var(--vt-palette-7)"> </span> Dee <span style="color:var(--vt-palette-4)">█████</span><span style="color:var(--bg);background:var(--vt-palette-4)">100</span> <span style="color:var(--vt-palette-2)">↑</span> 15 <span style="color:var(--vt-palette-2)">●</span> <span style="color:var(--vt-palette-7)">▐</span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Music</span><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-7)">▌</span> [✓]11+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">7</span><span style="background:var(--vt-palette-7)"> </span>12+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">Sheet1</span><span style="background:var(--vt-palette-6)"> </span> <span style="color:var(--vt-palette-0)">+</span> <span style="color:var(--vt-palette-8)">│</span> scores.012 <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Ctrl+K</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">search</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Ctrl+/</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">shortcuts</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">F10</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">menu</span></pre>\ No newline at end of file
A e2e/testdata/screens/docs-rules-bars.html +12 -0
@@ -0,0 +1,12 @@
1+<pre class="screen"> <span style="text-decoration:underline">F</span>ile <span style="text-decoration:underline">E</span>dit <span style="text-decoration:underline">V</span>iew <span style="text-decoration:underline">I</span>nsert F<span style="text-decoration:underline">o</span>rmat <span style="text-decoration:underline">D</span>ata <span style="text-decoration:underline">H</span>elp <span style="background:var(--vt-palette-6)"> </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+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">E3</span><span style="background:var(--vt-palette-8)"> </span> Art3+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Alt+Down</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">choose</span> <span style="color:var(--vt-palette-8)">from</span> <span style="color:var(--vt-palette-8)">the</span> <span style="color:var(--vt-palette-8)">list</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="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">B</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">C</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">D</span><span style="background:var(--vt-palette-8)"> </span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">E</span><span style="background:var(--vt-palette-6)"> </span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">F</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">G</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">H</span><span style="background:var(--vt-palette-8)"> </span>5+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">1</span><span style="background:var(--vt-palette-8)"> </span> <span style="font-weight:bold">Name</span> <span style="font-weight:bold">Points</span> <span style="font-weight:bold">Change</span> <span style="font-weight:bold">Grade</span> <span style="font-weight:bold">Track</span> <span style="font-weight:bold">Passed</span>6+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">2</span><span style="background:var(--vt-palette-8)"> </span> Ada <span style="color:var(--vt-palette-4)">██████</span><span style="color:var(--bg);background:var(--vt-palette-4)">9</span>2 <span style="color:var(--vt-palette-2)">↑</span> 12 <span style="color:var(--vt-palette-3)">◕</span> <span style="color:var(--vt-palette-8)">▐</span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Math</span><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-8)">▌</span> [✓]7+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">3</span><span style="background:var(--vt-palette-6)"> </span> <span style="color:var(--vt-palette-5);font-style:italic">Bo</span> <span style="color:var(--vt-palette-4)">███▉</span> 48 <span style="color:var(--vt-palette-1)">↓</span> -8 <span style="color:var(--vt-palette-3)">◔</span> <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">Art</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">▾</span> [ ]8+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">4</span><span style="background:var(--vt-palette-8)"> </span> Cy <span style="color:var(--vt-palette-4)">██████</span>75 <span style="color:var(--vt-palette-3)">→</span> 3 <span style="color:var(--vt-palette-3)">◑</span> <span style="color:var(--vt-palette-8)">▐</span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Math</span><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-8)">▌</span> [✓]9+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">5</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-5);font-style:italic">Bo</span> <span style="color:var(--vt-palette-4)">██▍</span> 30 <span style="color:var(--vt-palette-1)">↓</span> -2 <span style="color:var(--vt-palette-1)">○</span> <span style="color:var(--vt-palette-8)">▾</span> [ ]10+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">6</span><span style="background:var(--vt-palette-8)"> </span> Dee <span style="color:var(--vt-palette-4)">█████</span><span style="color:var(--bg);background:var(--vt-palette-4)">100</span> <span style="color:var(--vt-palette-2)">↑</span> 15 <span style="color:var(--vt-palette-2)">●</span> <span style="color:var(--vt-palette-8)">▐</span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Music</span><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-8)">▌</span> [✓]11+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">7</span><span style="background:var(--vt-palette-8)"> </span>12+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">Sheet1</span><span style="background:var(--vt-palette-6)"> </span> <span style="color:var(--vt-palette-8)">+</span> <span style="color:var(--vt-palette-8)">│</span> scores.012 <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Ctrl+K</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">search</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Ctrl+/</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">shortcuts</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">F10</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">menu</span></pre>\ No newline at end of file
A e2e/testdata/screens/docs-rules-panel-light.html +12 -0
@@ -0,0 +1,12 @@
1+<pre class="screen"> <span style="text-decoration:underline">F</span>ile <span style="text-decoration:underline">E</span>dit <span style="text-decoration:underline">V</span>iew <span style="text-decoration:underline">I</span>nsert F<span style="text-decoration:underline">o</span>rmat <span style="text-decoration:underline">D</span>ata <span style="text-decoration:underline">H</span>elp <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">RULES</span><span style="background:var(--vt-palette-6)"> </span>2+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">A1</span><span style="background:var(--vt-palette-7)"> </span> Task3+4+<span style="background:var(--vt-palette-7)"> </span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">A</span><span style="background:var(--vt-palette-6)"> </span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">B</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">C</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">D</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">E</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">F</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">G</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">H</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">I</span><span style="background:var(--vt-palette-7)"> </span>5+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">1</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">Task</span><span style="background:var(--vt-palette-6)"> </span> <span style="font-weight:bold">Owner</span> <span style="font-weight:bold">Hours</span> <span style="font-weight:bold">Done</span> <span style="color:var(--vt-palette-8)">┌─</span> <span style="font-weight:bold">Conditional</span> <span style="font-weight:bold">format</span> <span style="font-weight:bold">rules</span> <span style="color:var(--vt-palette-8)">───────────────────┐</span>6+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">2</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-2);text-decoration:line-through">Write</span><span style="text-decoration:line-through"> </span><span style="color:var(--vt-palette-2);text-decoration:line-through">spec</span> Ann <span style="color:var(--vt-palette-0)">▾</span><span style="background:#b58900"> </span><span style="color:#1d1f21;background:#b58900">12</span><span style="background:#b58900"> </span> [✓] <span style="color:var(--vt-palette-8)">│</span> + Add rule <span style="color:var(--vt-palette-8)">│</span>7+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">3</span><span style="background:var(--vt-palette-7)"> </span> Build UI Bo <span style="color:var(--vt-palette-0)">▾</span><span style="background:#c82829"> </span><span style="color:#ffffff;background:#c82829">40</span><span style="background:#c82829"> </span> [ ] <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-2);text-decoration:line-through">123</span> A2:A6 Custom formula is =$D2 <span style="color:var(--vt-palette-8)">│</span>8+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">4</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-2);text-decoration:line-through">Tests</span> Cy <span style="color:var(--vt-palette-0)">▾</span><span style="background:#bf5915"> </span><span style="color:#ffffff;background:#bf5915">26</span><span style="background:#bf5915"> </span> [✓] <span style="color:var(--vt-palette-8)">│</span><span style="background:var(--vt-palette-6)"> </span><span style="background:#718c00"> </span><span style="background:#9e8a00"> </span><span style="background:#bc680e"> </span><span style="background:#c82829"> </span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">C2:C6</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">Color</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">scale</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-8)">│</span>9+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">5</span><span style="background:var(--vt-palette-7)"> </span> Docs <span style="text-decoration:underline dotted var(--vt-palette-3)">Dee</span> <span style="color:var(--vt-palette-0)">▾</span><span style="background:#888b00"> </span><span style="color:#1d1f21;background:#888b00">6</span><span style="background:#888b00"> </span> [ ] <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-15);background:var(--vt-palette-5);font-weight:bold">123</span><span style="background:var(--vt-palette-5)"> </span> C7 Greater than 80 <span style="color:var(--vt-palette-8)">│</span>10+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">6</span><span style="background:var(--vt-palette-7)"> </span> Release Ann <span style="color:var(--vt-palette-0)">▾</span><span style="background:#718c00"> </span><span style="color:var(--vt-palette-0);background:#718c00">3</span><span style="background:#718c00"> </span> [ ] <span style="color:var(--vt-palette-8)">└────────────────────────────────────</span> <span style="color:var(--vt-palette-0)">3</span> <span style="color:var(--vt-palette-0)">rules</span> <span style="color:var(--vt-palette-8)">─┘</span>11+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">7</span><span style="background:var(--vt-palette-7)"> </span> Total <span style="background:var(--vt-palette-5)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-5);font-weight:bold">87</span><span style="background:var(--vt-palette-5)"> </span>12+<span style="color:var(--vt-palette-0)">The</span> <span style="color:var(--vt-palette-0)">first</span> <span style="color:var(--vt-palette-0)">rule</span> <span style="color:var(--vt-palette-0)">that</span> <span style="color:var(--vt-palette-0)">matches</span> <span style="color:var(--vt-palette-0)">a</span> <span style="color:var(--vt-palette-0)">cell</span> <span style="color:var(--vt-palette-0)">wins</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Enter</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">edit</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Del</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">remove</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Shift+↑/↓</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">move</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Esc</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">close</span></pre>\ No newline at end of file
A e2e/testdata/screens/docs-rules-panel.html +12 -0
@@ -0,0 +1,12 @@
1+<pre class="screen"> <span style="text-decoration:underline">F</span>ile <span style="text-decoration:underline">E</span>dit <span style="text-decoration:underline">V</span>iew <span style="text-decoration:underline">I</span>nsert F<span style="text-decoration:underline">o</span>rmat <span style="text-decoration:underline">D</span>ata <span style="text-decoration:underline">H</span>elp <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">RULES</span><span style="background:var(--vt-palette-6)"> </span>2+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">A1</span><span style="background:var(--vt-palette-8)"> </span> Task3+4+<span style="background:var(--vt-palette-8)"> </span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">A</span><span style="background:var(--vt-palette-6)"> </span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">B</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">C</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">D</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">E</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">F</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">G</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">H</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">I</span><span style="background:var(--vt-palette-8)"> </span>5+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">1</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">Task</span><span style="background:var(--vt-palette-6)"> </span> <span style="font-weight:bold">Owner</span> <span style="font-weight:bold">Hours</span> <span style="font-weight:bold">Done</span> <span style="color:var(--vt-palette-8)">┌─</span> <span style="font-weight:bold">Conditional</span> <span style="font-weight:bold">format</span> <span style="font-weight:bold">rules</span> <span style="color:var(--vt-palette-8)">───────────────────┐</span>6+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">2</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-2);text-decoration:line-through">Write</span><span style="text-decoration:line-through"> </span><span style="color:var(--vt-palette-2);text-decoration:line-through">spec</span> Ann <span style="color:var(--vt-palette-8)">▾</span><span style="background:#f0c674"> </span><span style="color:#1d1f21;background:#f0c674">12</span><span style="background:#f0c674"> </span> [✓] <span style="color:var(--vt-palette-8)">│</span> + Add rule <span style="color:var(--vt-palette-8)">│</span>7+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">3</span><span style="background:var(--vt-palette-8)"> </span> Build UI Bo <span style="color:var(--vt-palette-8)">▾</span><span style="background:#cc6666"> </span><span style="color:#000000;background:#cc6666">40</span><span style="background:#cc6666"> </span> [ ] <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-2);text-decoration:line-through">123</span> A2:A6 Custom formula is =$D2 <span style="color:var(--vt-palette-8)">│</span>8+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">4</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-2);text-decoration:line-through">Tests</span> Cy <span style="color:var(--vt-palette-8)">▾</span><span style="background:#de966d"> </span><span style="color:#1d1f21;background:#de966d">26</span><span style="background:#de966d"> </span> [✓] <span style="color:var(--vt-palette-8)">│</span><span style="background:var(--vt-palette-6)"> </span><span style="background:#b5bd68"> </span><span style="background:#dcc370"> </span><span style="background:#e4a56f"> </span><span style="background:#cc6666"> </span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">C2:C6</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">Color</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">scale</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-8)">│</span>9+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">5</span><span style="background:var(--vt-palette-8)"> </span> Docs <span style="text-decoration:underline dotted var(--vt-palette-3)">Dee</span> <span style="color:var(--vt-palette-8)">▾</span><span style="background:#c9c06c"> </span><span style="color:#1d1f21;background:#c9c06c">6</span><span style="background:#c9c06c"> </span> [ ] <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-0);background:var(--vt-palette-5);font-weight:bold">123</span><span style="background:var(--vt-palette-5)"> </span> C7 Greater than 80 <span style="color:var(--vt-palette-8)">│</span>10+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">6</span><span style="background:var(--vt-palette-8)"> </span> Release Ann <span style="color:var(--vt-palette-8)">▾</span><span style="background:#b5bd68"> </span><span style="color:#1d1f21;background:#b5bd68">3</span><span style="background:#b5bd68"> </span> [ ] <span style="color:var(--vt-palette-8)">└────────────────────────────────────</span> <span style="color:var(--vt-palette-8)">3</span> <span style="color:var(--vt-palette-8)">rules</span> <span style="color:var(--vt-palette-8)">─┘</span>11+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">7</span><span style="background:var(--vt-palette-8)"> </span> Total <span style="background:var(--vt-palette-5)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-5);font-weight:bold">87</span><span style="background:var(--vt-palette-5)"> </span>12+<span style="color:var(--vt-palette-8)">The</span> <span style="color:var(--vt-palette-8)">first</span> <span style="color:var(--vt-palette-8)">rule</span> <span style="color:var(--vt-palette-8)">that</span> <span style="color:var(--vt-palette-8)">matches</span> <span style="color:var(--vt-palette-8)">a</span> <span style="color:var(--vt-palette-8)">cell</span> <span style="color:var(--vt-palette-8)">wins</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Enter</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">edit</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Del</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">remove</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Shift+↑/↓</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">move</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Esc</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">close</span></pre>\ No newline at end of file
A e2e/testdata/screens/docs-table-light.html +13 -0
@@ -0,0 +1,13 @@
1+<pre class="screen"> <span style="text-decoration:underline">F</span>ile <span style="text-decoration:underline">E</span>dit <span style="text-decoration:underline">V</span>iew <span style="text-decoration:underline">I</span>nsert F<span style="text-decoration:underline">o</span>rmat <span style="text-decoration:underline">D</span>ata <span style="text-decoration:underline">H</span>elp <span style="background:var(--vt-palette-6)"> </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+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">D3</span><span style="background:var(--vt-palette-7)"> </span> 2803+<span style="color:var(--vt-palette-0)">Table</span> <span style="color:var(--vt-palette-0)">Sales,</span> <span style="color:var(--vt-palette-0)">column</span> <span style="font-weight:bold">Amount</span><span style="color:var(--vt-palette-0)">:</span> <span style="color:var(--vt-palette-0)">Sales[Amount]</span> <span style="color:var(--vt-palette-0)">in</span> <span style="color:var(--vt-palette-0)">formulas</span>4+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">A</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">B</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">C</span><span style="background:var(--vt-palette-7)"> </span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">D</span><span style="background:var(--vt-palette-6)"> </span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">E</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">F</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">G</span><span style="background:var(--vt-palette-7)"> </span>5+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">1</span><span style="background:var(--vt-palette-7)"> </span><span style="text-decoration:underline"> </span><span style="color:var(--vt-palette-4);font-weight:bold;text-decoration:underline">Region</span><span style="text-decoration:underline"> </span><span style="color:var(--vt-palette-4);font-weight:bold;text-decoration:underline">Month</span><span style="text-decoration:underline"> </span><span style="color:var(--vt-palette-4);font-weight:bold;text-decoration:underline">Units</span><span style="text-decoration:underline"> </span><span style="color:var(--vt-palette-4);font-weight:bold;text-decoration:underline">Amount</span><span style="text-decoration:underline"> </span> Total6+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">2</span><span style="background:var(--vt-palette-7)"> </span> North Jan 12 480 26807+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">3</span><span style="background:var(--vt-palette-6)"> </span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">South</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Jan</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">7</span><span style="background:var(--vt-palette-7)"> </span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">280</span><span style="background:var(--vt-palette-6)"> </span> Per unit8+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">4</span><span style="background:var(--vt-palette-7)"> </span> East Feb 20 800 409+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">5</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">North</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Feb</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">9</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">360</span><span style="background:var(--vt-palette-7)"> </span>10+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">6</span><span style="background:var(--vt-palette-7)"> </span> West Mar 15 60011+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">7</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">South</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Mar</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">4</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">160</span><span style="background:var(--vt-palette-7)"> </span>12+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">8</span><span style="background:var(--vt-palette-7)"> </span>13+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">Sheet1</span><span style="background:var(--vt-palette-6)"> </span> <span style="color:var(--vt-palette-0)">+</span> <span style="color:var(--vt-palette-8)">│</span> untitled <span style="color:var(--vt-palette-0)">modified</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Ctrl+K</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">search</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Ctrl+/</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">shortcuts</span></pre>\ No newline at end of file
A e2e/testdata/screens/docs-table.html +13 -0
@@ -0,0 +1,13 @@
1+<pre class="screen"> <span style="text-decoration:underline">F</span>ile <span style="text-decoration:underline">E</span>dit <span style="text-decoration:underline">V</span>iew <span style="text-decoration:underline">I</span>nsert F<span style="text-decoration:underline">o</span>rmat <span style="text-decoration:underline">D</span>ata <span style="text-decoration:underline">H</span>elp <span style="background:var(--vt-palette-6)"> </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+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">D3</span><span style="background:var(--vt-palette-8)"> </span> 2803+<span style="color:var(--vt-palette-8)">Table</span> <span style="color:var(--vt-palette-8)">Sales,</span> <span style="color:var(--vt-palette-8)">column</span> <span style="font-weight:bold">Amount</span><span style="color:var(--vt-palette-8)">:</span> <span style="color:var(--vt-palette-8)">Sales[Amount]</span> <span style="color:var(--vt-palette-8)">in</span> <span style="color:var(--vt-palette-8)">formulas</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="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">B</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">C</span><span style="background:var(--vt-palette-8)"> </span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">D</span><span style="background:var(--vt-palette-6)"> </span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">E</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">F</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">G</span><span style="background:var(--vt-palette-8)"> </span>5+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">1</span><span style="background:var(--vt-palette-8)"> </span><span style="text-decoration:underline"> </span><span style="color:var(--vt-palette-6);font-weight:bold;text-decoration:underline">Region</span><span style="text-decoration:underline"> </span><span style="color:var(--vt-palette-6);font-weight:bold;text-decoration:underline">Month</span><span style="text-decoration:underline"> </span><span style="color:var(--vt-palette-6);font-weight:bold;text-decoration:underline">Units</span><span style="text-decoration:underline"> </span><span style="color:var(--vt-palette-6);font-weight:bold;text-decoration:underline">Amount</span><span style="text-decoration:underline"> </span> Total6+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">2</span><span style="background:var(--vt-palette-8)"> </span> North Jan 12 480 26807+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">3</span><span style="background:var(--vt-palette-6)"> </span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">South</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Jan</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">7</span><span style="background:var(--vt-palette-8)"> </span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">280</span><span style="background:var(--vt-palette-6)"> </span> Per unit8+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">4</span><span style="background:var(--vt-palette-8)"> </span> East Feb 20 800 409+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">5</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">North</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Feb</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">9</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">360</span><span style="background:var(--vt-palette-8)"> </span>10+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">6</span><span style="background:var(--vt-palette-8)"> </span> West Mar 15 60011+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">7</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">South</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Mar</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">4</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">160</span><span style="background:var(--vt-palette-8)"> </span>12+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">8</span><span style="background:var(--vt-palette-8)"> </span>13+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">Sheet1</span><span style="background:var(--vt-palette-6)"> </span> <span style="color:var(--vt-palette-8)">+</span> <span style="color:var(--vt-palette-8)">│</span> untitled <span style="color:var(--vt-palette-8)">modified</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Ctrl+K</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">search</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Ctrl+/</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">shortcuts</span></pre>\ No newline at end of file
A e2e/testdata/screens/docs-trace-view-light.html +14 -0
@@ -0,0 +1,14 @@
1+<pre class="screen"> <span style="text-decoration:underline">F</span>ile <span style="text-decoration:underline">E</span>dit <span style="text-decoration:underline">V</span>iew <span style="text-decoration:underline">I</span>nsert F<span style="text-decoration:underline">o</span>rmat <span style="text-decoration:underline">D</span>ata <span style="text-decoration:underline">H</span>elp <span style="background:var(--vt-palette-6)"> </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+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">B7</span><span style="background:var(--vt-palette-7)"> </span> =SUM(B3:B5)3+<span style="color:var(--vt-palette-0)">B7</span> <span style="color:var(--vt-palette-0)">reads</span> Expenses<span style="color:var(--vt-palette-0)">;</span> <span style="color:var(--vt-palette-0)">read</span> <span style="color:var(--vt-palette-0)">by</span> C7, B30↓ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Alt+&#39;</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">list</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Alt+;</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">stop</span>4+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">A</span><span style="background:var(--vt-palette-7)"> </span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">B</span><span style="background:var(--vt-palette-6)"> </span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">C</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">D</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">E</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">F</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">G</span><span style="background:var(--vt-palette-7)"> </span>5+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">1</span><span style="background:var(--vt-palette-7)"> </span> Household budget 20266+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">2</span><span style="background:var(--vt-palette-7)"> </span> 47+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">3</span><span style="background:var(--vt-palette-7)"> </span> Rent <span style="background:var(--vt-palette-2)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-2)">1450</span><span style="background:var(--vt-palette-2)"> </span>8+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">4</span><span style="background:var(--vt-palette-7)"> </span> Groceries<span style="background:var(--vt-palette-2)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-2)">612.4</span><span style="background:var(--vt-palette-2)"> </span>9+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">5</span><span style="background:var(--vt-palette-7)"> </span> Transit <span style="background:var(--vt-palette-2)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-2)">96</span><span style="background:var(--vt-palette-2)"> </span>10+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">6</span><span style="background:var(--vt-palette-7)"> </span> Savings r <span style="color:var(--vt-palette-1);text-decoration:underline wavy var(--vt-palette-1)">#DIV/0!</span>11+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">7</span><span style="background:var(--vt-palette-6)"> </span> Total <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">2158.4</span><span style="background:var(--vt-palette-6)"> </span><span style="background:var(--vt-palette-5)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-5);font-weight:bold">539.6</span><span style="background:var(--vt-palette-5)"> </span>12+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">8</span><span style="background:var(--vt-palette-7)"> </span> 2877.866713+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">9</span><span style="background:var(--vt-palette-7)"> </span>14+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">Sheet1</span><span style="background:var(--vt-palette-6)"> </span> <span style="color:var(--vt-palette-0)">+</span> <span style="color:var(--vt-palette-8)">│</span> untitled <span style="color:var(--vt-palette-0)">modified</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Ctrl+K</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">search</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Ctrl+/</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">shortcuts</span></pre>\ No newline at end of file
A e2e/testdata/screens/docs-trace-view.html +14 -0
@@ -0,0 +1,14 @@
1+<pre class="screen"> <span style="text-decoration:underline">F</span>ile <span style="text-decoration:underline">E</span>dit <span style="text-decoration:underline">V</span>iew <span style="text-decoration:underline">I</span>nsert F<span style="text-decoration:underline">o</span>rmat <span style="text-decoration:underline">D</span>ata <span style="text-decoration:underline">H</span>elp <span style="background:var(--vt-palette-6)"> </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+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">B7</span><span style="background:var(--vt-palette-8)"> </span> =SUM(B3:B5)3+<span style="color:var(--vt-palette-8)">B7</span> <span style="color:var(--vt-palette-8)">reads</span> Expenses<span style="color:var(--vt-palette-8)">;</span> <span style="color:var(--vt-palette-8)">read</span> <span style="color:var(--vt-palette-8)">by</span> C7, B30↓ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Alt+&#39;</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">list</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Alt+;</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">stop</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="background:var(--vt-palette-8)"> </span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">B</span><span style="background:var(--vt-palette-6)"> </span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">C</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">D</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">E</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">F</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">G</span><span style="background:var(--vt-palette-8)"> </span>5+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">1</span><span style="background:var(--vt-palette-8)"> </span> Household budget 20266+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">2</span><span style="background:var(--vt-palette-8)"> </span> 47+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">3</span><span style="background:var(--vt-palette-8)"> </span> Rent <span style="background:var(--vt-palette-2)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-2)">1450</span><span style="background:var(--vt-palette-2)"> </span>8+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">4</span><span style="background:var(--vt-palette-8)"> </span> Groceries<span style="background:var(--vt-palette-2)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-2)">612.4</span><span style="background:var(--vt-palette-2)"> </span>9+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">5</span><span style="background:var(--vt-palette-8)"> </span> Transit <span style="background:var(--vt-palette-2)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-2)">96</span><span style="background:var(--vt-palette-2)"> </span>10+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">6</span><span style="background:var(--vt-palette-8)"> </span> Savings r <span style="color:var(--vt-palette-1);text-decoration:underline wavy var(--vt-palette-1)">#DIV/0!</span>11+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">7</span><span style="background:var(--vt-palette-6)"> </span> Total <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">2158.4</span><span style="background:var(--vt-palette-6)"> </span><span style="background:var(--vt-palette-5)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-5);font-weight:bold">539.6</span><span style="background:var(--vt-palette-5)"> </span>12+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">8</span><span style="background:var(--vt-palette-8)"> </span> 2877.866713+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">9</span><span style="background:var(--vt-palette-8)"> </span>14+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">Sheet1</span><span style="background:var(--vt-palette-6)"> </span> <span style="color:var(--vt-palette-8)">+</span> <span style="color:var(--vt-palette-8)">│</span> untitled <span style="color:var(--vt-palette-8)">modified</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Ctrl+K</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">search</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Ctrl+/</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">shortcuts</span></pre>\ No newline at end of file
M e2e/testdata/screens/notebook-cells-high-contrast.html +10 -10
@@ -7,20 +7,20 @@
77 <span style="background:#000000"> </span><span style="color:#757575;background:#000000">╭─</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">files</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">──────────────────────────────────────────────────────────────────────</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">✓</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">&lt;1s</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">─╮</span><span style="background:#000000"> </span>88 <span style="background:#000000"> </span><span style="color:#959595;background:#000000">[1]:</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ff80ff;background:#000000">files</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">=</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">ls</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">▶</span>99 <span style="background:#000000"> </span><span style="color:#757575;background:#000000">╰──────────────────────────────────────────────────────────────────────────────────────╯</span><span style="background:#000000"> </span>10-<span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[1]:</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">name</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">type</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">size</span><span style="background:#000000"> </span>11-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>12-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">CLAUDE.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">1.0</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>13-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>14-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>15-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">go.mod</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">812</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">B</span><span style="background:#000000"> </span>10+<span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[1]:</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">name</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">type</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">size</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span>11+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">1</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>12+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">2</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">CLAUDE.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">1.0</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>13+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">3</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>14+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">4</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>15+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">5</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">go.mod</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">812</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">B</span><span style="background:#000000"> </span>1616 <span style="background:#000000"> </span>1717 <span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#80a8ff;background:#000000">╭──────────────────────────────────────────────────────────────────────────────</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">✓</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">&lt;1s</span><span style="background:#000000"> </span><span style="color:#80a8ff;background:#000000">─╮</span><span style="background:#000000"> </span>1818 <span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">[2]:</span><span style="background:#000000"> </span><span style="color:#80a8ff;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ff80ff;background:#000000">$files</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">|</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">where</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">size</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">&gt;</span><span style="background:#000000"> </span><span style="color:#ffe040;background:#000000">1kb</span><span style="background:#000000"> </span><span style="color:#80a8ff;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#80a8ff;background:#000000">▶</span>1919 <span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#80a8ff;background:#000000">╰──────────────────────────────────────────────────────────────────────────────────────╯</span><span style="background:#000000"> </span>20-<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[2]:</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">name</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">type</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">size</span><span style="background:#000000"> </span>21-<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>22-<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>23-<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>20+<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[2]:</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">name</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">type</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">size</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span>21+<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">1</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>22+<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">2</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>23+<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">3</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>2424 <span style="background:#000000"> </span>2525 <span style="background:#000000"> </span><span style="color:#757575;background:#000000">╭──────────────────────────────────────────────────────────────────────────────────────╮</span><span style="background:#000000"> </span>2626 <span style="background:#000000"> </span><span style="color:#959595;background:#000000">[</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">]:</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">▶</span>
M e2e/testdata/screens/notebook-cells-light.html +10 -10
@@ -7,20 +7,20 @@
77 <span style="color:var(--vt-palette-8)">╭─</span> <span style="color:var(--vt-palette-0)">files</span> <span style="color:var(--vt-palette-8)">──────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-0)">✓</span> <span style="color:var(--vt-palette-0)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>88 <span style="color:var(--vt-palette-0)">[1]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">files</span> <span style="font-weight:bold">=</span> <span style="color:var(--vt-palette-4)">ls</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-0)">▶</span>99 <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>10- <span style="color:var(--vt-palette-0)">Out[1]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>11- 012 file 4.2 kB12- CLAUDE.md file 1.0 kB13- README.md file 9.8 kB14- demos dir 3.1 kB15- go.mod file 812 B10+ <span style="color:var(--vt-palette-0)">Out[1]:</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">name</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">type</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">size</span><span style="background:var(--vt-palette-7)"> </span>11+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">1</span><span style="background:var(--vt-palette-7)"> </span> 012 file 4.2 kB12+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">2</span><span style="background:var(--vt-palette-7)"> </span> CLAUDE.md file 1.0 kB13+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">3</span><span style="background:var(--vt-palette-7)"> </span> README.md file 9.8 kB14+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">4</span><span style="background:var(--vt-palette-7)"> </span> demos dir 3.1 kB15+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">5</span><span style="background:var(--vt-palette-7)"> </span> go.mod file 812 B1616 1717 <span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-4)">╭──────────────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-0)">✓</span> <span style="color:var(--vt-palette-0)">&lt;1s</span> <span style="color:var(--vt-palette-4)">─╮</span>1818 <span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-0)">[2]:</span> <span style="color:var(--vt-palette-4)">│</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-4)">where</span> size <span style="font-weight:bold">&gt;</span> <span style="color:var(--vt-palette-1)">1kb</span> <span style="color:var(--vt-palette-4)">│</span> <span style="color:var(--vt-palette-4)">▶</span>1919 <span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-4)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>20-<span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-0)">Out[2]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>21-<span style="color:var(--vt-palette-4)">▌</span> 012 file 4.2 kB22-<span style="color:var(--vt-palette-4)">▌</span> README.md file 9.8 kB23-<span style="color:var(--vt-palette-4)">▌</span> demos dir 3.1 kB20+<span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-0)">Out[2]:</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">name</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">type</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">size</span><span style="background:var(--vt-palette-7)"> </span>21+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">1</span><span style="background:var(--vt-palette-7)"> </span> 012 file 4.2 kB22+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">2</span><span style="background:var(--vt-palette-7)"> </span> README.md file 9.8 kB23+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">3</span><span style="background:var(--vt-palette-7)"> </span> demos dir 3.1 kB2424 2525 <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────────────────────────────────╮</span>2626 <span style="color:var(--vt-palette-0)">[</span> <span style="color:var(--vt-palette-0)">]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-0)">▶</span>
M e2e/testdata/screens/notebook-cells.html +10 -10
@@ -7,20 +7,20 @@
77 <span style="color:var(--vt-palette-8)">╭─</span> <span style="color:var(--vt-palette-8)">files</span> <span style="color:var(--vt-palette-8)">──────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-8)">✓</span> <span style="color:var(--vt-palette-8)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>88 <span style="color:var(--vt-palette-8)">[1]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">files</span> <span style="font-weight:bold">=</span> <span style="color:var(--vt-palette-6)">ls</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">▶</span>99 <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>10- <span style="color:var(--vt-palette-8)">Out[1]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>11- 012 file 4.2 kB12- CLAUDE.md file 1.0 kB13- README.md file 9.8 kB14- demos dir 3.1 kB15- go.mod file 812 B10+ <span style="color:var(--vt-palette-8)">Out[1]:</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">name</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">type</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">size</span><span style="background:var(--vt-palette-8)"> </span>11+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">1</span><span style="background:var(--vt-palette-8)"> </span> 012 file 4.2 kB12+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">2</span><span style="background:var(--vt-palette-8)"> </span> CLAUDE.md file 1.0 kB13+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">3</span><span style="background:var(--vt-palette-8)"> </span> README.md file 9.8 kB14+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">4</span><span style="background:var(--vt-palette-8)"> </span> demos dir 3.1 kB15+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">5</span><span style="background:var(--vt-palette-8)"> </span> go.mod file 812 B1616 1717 <span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-4)">╭──────────────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-8)">✓</span> <span style="color:var(--vt-palette-8)">&lt;1s</span> <span style="color:var(--vt-palette-4)">─╮</span>1818 <span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-8)">[2]:</span> <span style="color:var(--vt-palette-4)">│</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-6)">where</span> size <span style="font-weight:bold">&gt;</span> <span style="color:var(--vt-palette-3)">1kb</span> <span style="color:var(--vt-palette-4)">│</span> <span style="color:var(--vt-palette-4)">▶</span>1919 <span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-4)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>20-<span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-8)">Out[2]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>21-<span style="color:var(--vt-palette-4)">▌</span> 012 file 4.2 kB22-<span style="color:var(--vt-palette-4)">▌</span> README.md file 9.8 kB23-<span style="color:var(--vt-palette-4)">▌</span> demos dir 3.1 kB20+<span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-8)">Out[2]:</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">name</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">type</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">size</span><span style="background:var(--vt-palette-8)"> </span>21+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">1</span><span style="background:var(--vt-palette-8)"> </span> 012 file 4.2 kB22+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">2</span><span style="background:var(--vt-palette-8)"> </span> README.md file 9.8 kB23+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">3</span><span style="background:var(--vt-palette-8)"> </span> demos dir 3.1 kB2424 2525 <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────────────────────────────────╮</span>2626 <span style="color:var(--vt-palette-8)">[</span> <span style="color:var(--vt-palette-8)">]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">▶</span>
M e2e/testdata/screens/notebook-error-high-contrast.html +10 -10
@@ -7,20 +7,20 @@
77 <span style="background:#000000"> </span><span style="color:#757575;background:#000000">╭─</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">files</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">──────────────────────────────────────────────────────────────────────</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">✓</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">&lt;1s</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">─╮</span><span style="background:#000000"> </span>88 <span style="background:#000000"> </span><span style="color:#959595;background:#000000">[1]:</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ff80ff;background:#000000">files</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">=</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">ls</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">▶</span>99 <span style="background:#000000"> </span><span style="color:#757575;background:#000000">╰──────────────────────────────────────────────────────────────────────────────────────╯</span><span style="background:#000000"> </span>10-<span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[1]:</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">name</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">type</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">size</span><span style="background:#000000"> </span>11-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>12-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">CLAUDE.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">1.0</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>13-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>14-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>15-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">go.mod</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">812</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">B</span><span style="background:#000000"> </span>10+<span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[1]:</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">name</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">type</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">size</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span>11+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">1</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>12+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">2</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">CLAUDE.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">1.0</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>13+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">3</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>14+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">4</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>15+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">5</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">go.mod</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">812</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">B</span><span style="background:#000000"> </span>1616 <span style="background:#000000"> </span>1717 <span style="background:#000000"> </span><span style="color:#757575;background:#000000">╭──────────────────────────────────────────────────────────────────────────────</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">✓</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">&lt;1s</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">─╮</span><span style="background:#000000"> </span>1818 <span style="background:#000000"> </span><span style="color:#959595;background:#000000">[2]:</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ff80ff;background:#000000">$files</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">|</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">where</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">size</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">&gt;</span><span style="background:#000000"> </span><span style="color:#ffe040;background:#000000">1kb</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">▶</span>1919 <span style="background:#000000"> </span><span style="color:#757575;background:#000000">╰──────────────────────────────────────────────────────────────────────────────────────╯</span><span style="background:#000000"> </span>20-<span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[2]:</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">name</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">type</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">size</span><span style="background:#000000"> </span>21-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>22-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>23-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>20+<span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[2]:</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">name</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">type</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">size</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span>21+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">1</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>22+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">2</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>23+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">3</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>2424 <span style="background:#000000"> </span>2525 <span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#80a8ff;background:#000000">╭─────────────────────────────────────────────────────────────────────────</span><span style="background:#000000"> </span><span style="color:#ffe040;background:#000000">failed</span><span style="background:#000000"> </span><span style="color:#ffe040;background:#000000">&lt;1s</span><span style="background:#000000"> </span><span style="color:#80a8ff;background:#000000">─╮</span><span style="background:#000000"> </span>2626 <span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">[3]:</span><span style="background:#000000"> </span><span style="color:#80a8ff;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">lss</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">-a</span><span style="background:#000000"> </span><span style="color:#80a8ff;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#80a8ff;background:#000000">▶</span>
M e2e/testdata/screens/notebook-error-light.html +10 -10
@@ -7,20 +7,20 @@
77 <span style="color:var(--vt-palette-8)">╭─</span> <span style="color:var(--vt-palette-0)">files</span> <span style="color:var(--vt-palette-8)">──────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-0)">✓</span> <span style="color:var(--vt-palette-0)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>88 <span style="color:var(--vt-palette-0)">[1]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">files</span> <span style="font-weight:bold">=</span> <span style="color:var(--vt-palette-4)">ls</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-0)">▶</span>99 <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>10- <span style="color:var(--vt-palette-0)">Out[1]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>11- 012 file 4.2 kB12- CLAUDE.md file 1.0 kB13- README.md file 9.8 kB14- demos dir 3.1 kB15- go.mod file 812 B10+ <span style="color:var(--vt-palette-0)">Out[1]:</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">name</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">type</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">size</span><span style="background:var(--vt-palette-7)"> </span>11+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">1</span><span style="background:var(--vt-palette-7)"> </span> 012 file 4.2 kB12+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">2</span><span style="background:var(--vt-palette-7)"> </span> CLAUDE.md file 1.0 kB13+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">3</span><span style="background:var(--vt-palette-7)"> </span> README.md file 9.8 kB14+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">4</span><span style="background:var(--vt-palette-7)"> </span> demos dir 3.1 kB15+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">5</span><span style="background:var(--vt-palette-7)"> </span> go.mod file 812 B1616 1717 <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-0)">✓</span> <span style="color:var(--vt-palette-0)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>1818 <span style="color:var(--vt-palette-0)">[2]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-4)">where</span> size <span style="font-weight:bold">&gt;</span> <span style="color:var(--vt-palette-1)">1kb</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-0)">▶</span>1919 <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>20- <span style="color:var(--vt-palette-0)">Out[2]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>21- 012 file 4.2 kB22- README.md file 9.8 kB23- demos dir 3.1 kB20+ <span style="color:var(--vt-palette-0)">Out[2]:</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">name</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">type</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">size</span><span style="background:var(--vt-palette-7)"> </span>21+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">1</span><span style="background:var(--vt-palette-7)"> </span> 012 file 4.2 kB22+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">2</span><span style="background:var(--vt-palette-7)"> </span> README.md file 9.8 kB23+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">3</span><span style="background:var(--vt-palette-7)"> </span> demos dir 3.1 kB2424 2525 <span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-4)">╭─────────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-3)">failed</span> <span style="color:var(--vt-palette-3)">&lt;1s</span> <span style="color:var(--vt-palette-4)">─╮</span>2626 <span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-0)">[3]:</span> <span style="color:var(--vt-palette-4)">│</span> <span style="color:var(--vt-palette-4)">lss</span> -a <span style="color:var(--vt-palette-4)">│</span> <span style="color:var(--vt-palette-4)">▶</span>
M e2e/testdata/screens/notebook-error.html +10 -10
@@ -7,20 +7,20 @@
77 <span style="color:var(--vt-palette-8)">╭─</span> <span style="color:var(--vt-palette-8)">files</span> <span style="color:var(--vt-palette-8)">──────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-8)">✓</span> <span style="color:var(--vt-palette-8)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>88 <span style="color:var(--vt-palette-8)">[1]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">files</span> <span style="font-weight:bold">=</span> <span style="color:var(--vt-palette-6)">ls</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">▶</span>99 <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>10- <span style="color:var(--vt-palette-8)">Out[1]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>11- 012 file 4.2 kB12- CLAUDE.md file 1.0 kB13- README.md file 9.8 kB14- demos dir 3.1 kB15- go.mod file 812 B10+ <span style="color:var(--vt-palette-8)">Out[1]:</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">name</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">type</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">size</span><span style="background:var(--vt-palette-8)"> </span>11+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">1</span><span style="background:var(--vt-palette-8)"> </span> 012 file 4.2 kB12+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">2</span><span style="background:var(--vt-palette-8)"> </span> CLAUDE.md file 1.0 kB13+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">3</span><span style="background:var(--vt-palette-8)"> </span> README.md file 9.8 kB14+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">4</span><span style="background:var(--vt-palette-8)"> </span> demos dir 3.1 kB15+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">5</span><span style="background:var(--vt-palette-8)"> </span> go.mod file 812 B1616 1717 <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-8)">✓</span> <span style="color:var(--vt-palette-8)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>1818 <span style="color:var(--vt-palette-8)">[2]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-6)">where</span> size <span style="font-weight:bold">&gt;</span> <span style="color:var(--vt-palette-3)">1kb</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">▶</span>1919 <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>20- <span style="color:var(--vt-palette-8)">Out[2]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>21- 012 file 4.2 kB22- README.md file 9.8 kB23- demos dir 3.1 kB20+ <span style="color:var(--vt-palette-8)">Out[2]:</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">name</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">type</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">size</span><span style="background:var(--vt-palette-8)"> </span>21+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">1</span><span style="background:var(--vt-palette-8)"> </span> 012 file 4.2 kB22+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">2</span><span style="background:var(--vt-palette-8)"> </span> README.md file 9.8 kB23+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">3</span><span style="background:var(--vt-palette-8)"> </span> demos dir 3.1 kB2424 2525 <span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-4)">╭─────────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-3)">failed</span> <span style="color:var(--vt-palette-3)">&lt;1s</span> <span style="color:var(--vt-palette-4)">─╮</span>2626 <span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-8)">[3]:</span> <span style="color:var(--vt-palette-4)">│</span> <span style="color:var(--vt-palette-6)">lss</span> -a <span style="color:var(--vt-palette-4)">│</span> <span style="color:var(--vt-palette-4)">▶</span>
A e2e/testdata/screens/notebook-grid-filter-high-contrast.html +30 -0
@@ -0,0 +1,30 @@
1+<pre class="screen"><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">F</span><span style="color:#ffffff;background:#1f1f1f">ile</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">E</span><span style="color:#ffffff;background:#1f1f1f">dit</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">V</span><span style="color:#ffffff;background:#1f1f1f">iew</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">I</span><span style="color:#ffffff;background:#1f1f1f">nsert</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f">F</span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">o</span><span style="color:#ffffff;background:#1f1f1f">rmat</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">D</span><span style="color:#ffffff;background:#1f1f1f">ata</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">H</span><span style="color:#ffffff;background:#1f1f1f">elp</span><span style="background:#1f1f1f"> </span><span style="background:#40e0ff"> </span><span style="color:#000000;background:#40e0ff;font-weight:bold">FILTER</span><span style="background:#40e0ff"> </span>2+<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">▶</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">Run</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">■</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">Stop</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">↻</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">Restart</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">▶▶</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">Run</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">all</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">+</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">Add</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">✂</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">Cut</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">⧉</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">Copy</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">⎘</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">Paste</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">Code</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">▾</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">nu</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">○</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">idle</span><span style="background:#000000"> </span>3+<span style="background:#000000"> </span>4+<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">Files</span><span style="background:#000000"> </span>5+<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">What&#39;s</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">big</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">in</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">the</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">repo,</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">from</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">ls</span><span style="color:#ffffff;background:#000000">.</span><span style="background:#000000"> </span>6+<span style="background:#000000"> </span>7+<span style="background:#000000"> </span><span style="color:#757575;background:#000000">╭─</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">files</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">──────────────────────────────────────────────────────────────────────</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">✓</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">&lt;1s</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">─╮</span><span style="background:#000000"> </span>8+<span style="background:#000000"> </span><span style="color:#959595;background:#000000">[1]:</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ff80ff;background:#000000">files</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">=</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">ls</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">▶</span>9+<span style="background:#000000"> </span><span style="color:#757575;background:#000000">╰──────────────────────────────────────────────────────────────────────────────────────╯</span><span style="background:#000000"> </span>10+<span style="color:#40e040;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[1]:</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">name</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">▾</span><span style="background:#3a3a3a"> </span><span style="background:#40e0ff"> </span><span style="color:#000000;background:#40e0ff;font-weight:bold">type</span><span style="background:#40e0ff"> </span><span style="color:#000000;background:#40e0ff;font-weight:bold">▾</span><span style="background:#40e0ff"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">size</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">▾</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span>11+<span style="color:#40e040;background:#000000">▌</span><span style="background:#000000"> </span><span style="background:#40e0ff"> </span><span style="color:#000000;background:#40e0ff;font-weight:bold">1</span><span style="background:#40e0ff"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">┌─</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">Filter</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">type</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">──────────────────────┐</span><span style="background:#000000"> </span>12+<span style="color:#40e040;background:#000000">▌</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">2</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">CLAUDE.md</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">If</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#3a3a3a">‹</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">None</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">›</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span>13+<span style="color:#40e040;background:#000000">▌</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">3</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">├────────────────────────────────────┤</span><span style="background:#000000"> </span>14+<span style="color:#40e040;background:#000000">▌</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">4</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">›</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">Search</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">values</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span>15+<span style="color:#40e040;background:#000000">▌</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">5</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">go.mod</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">├────────────────────────────────────┤</span><span style="background:#000000"> </span>16+<span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#40e0ff"> </span><span style="color:#000000;background:#40e0ff">[x]</span><span style="background:#40e0ff"> </span><span style="color:#000000;background:#40e0ff">Select</span><span style="background:#40e0ff"> </span><span style="color:#000000;background:#40e0ff">all</span><span style="background:#40e0ff"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span>17+<span style="background:#000000"> </span><span style="color:#757575;background:#000000">╭──────────────────│</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">[x]</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">1</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│──────────────────────</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">✓</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">&lt;1s</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">─╮</span><span style="background:#000000"> </span>18+<span style="background:#000000"> </span><span style="color:#959595;background:#000000">[2]:</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ff80ff;background:#000000">$files</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">|</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">where</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">si</span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">[x]</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">4</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">▶</span>19+<span style="background:#000000"> </span><span style="color:#757575;background:#000000">╰──────────────────└───────────────────────────</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">2</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">of</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">2</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">─┘──────────────────────────────╯</span><span style="background:#000000"> </span>20+<span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[2]:</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">name</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">type</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">size</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span>21+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">1</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>22+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">2</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>23+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">3</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>24+<span style="background:#000000"> </span>25+<span style="background:#000000"> </span><span style="color:#757575;background:#000000">╭──────────────────────────────────────────────────────────────────────────────────────╮</span><span style="background:#000000"> </span>26+<span style="background:#000000"> </span><span style="color:#959595;background:#000000">[</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">]:</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">▶</span>27+<span style="background:#000000"> </span><span style="color:#757575;background:#000000">╰──────────────────────────────────────────────────────────────────────────────────────╯</span><span style="background:#000000"> </span>28+<span style="background:#000000"> </span>29+<span style="background:#000000"> </span>30+<span style="color:#959595;background:#1f1f1f">Type</span><span style="background:#1f1f1f"> </span><span style="color:#959595;background:#1f1f1f">to</span><span style="background:#1f1f1f"> </span><span style="color:#959595;background:#1f1f1f">search</span><span style="background:#1f1f1f"> </span><span style="color:#959595;background:#1f1f1f">the</span><span style="background:#1f1f1f"> </span><span style="color:#959595;background:#1f1f1f">values</span><span style="background:#1f1f1f"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">Space</span><span style="background:#3a3a3a"> </span><span style="background:#1f1f1f"> </span><span style="color:#959595;background:#1f1f1f">check</span><span style="background:#1f1f1f"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">Tab</span><span style="background:#3a3a3a"> </span><span style="background:#1f1f1f"> </span><span style="color:#959595;background:#1f1f1f">condition</span><span style="background:#1f1f1f"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">Enter</span><span style="background:#3a3a3a"> </span><span style="background:#1f1f1f"> </span><span style="color:#959595;background:#1f1f1f">apply</span><span style="background:#1f1f1f"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">Esc</span><span style="background:#3a3a3a"> </span><span style="background:#1f1f1f"> </span><span style="color:#959595;background:#1f1f1f">cancel</span><span style="background:#1f1f1f"> </span></pre>\ No newline at end of file
A e2e/testdata/screens/notebook-grid-filter-light.html +30 -0
@@ -0,0 +1,30 @@
1+<pre class="screen"> <span style="text-decoration:underline">F</span>ile <span style="text-decoration:underline">E</span>dit <span style="text-decoration:underline">V</span>iew <span style="text-decoration:underline">I</span>nsert F<span style="text-decoration:underline">o</span>rmat <span style="text-decoration:underline">D</span>ata <span style="text-decoration:underline">H</span>elp <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">FILTER</span><span style="background:var(--vt-palette-6)"> </span>2+ ▶ Run <span style="color:var(--vt-palette-8)">■</span> <span style="color:var(--vt-palette-8)">Stop</span> ↻ Restart ▶▶ Run all <span style="color:var(--vt-palette-8)">│</span> + Add ✂ Cut ⧉ Copy <span style="color:var(--vt-palette-8)">⎘</span> <span style="color:var(--vt-palette-8)">Paste</span> <span style="color:var(--vt-palette-8)">│</span> Code ▾ <span style="color:var(--vt-palette-0)">nu</span> <span style="color:var(--vt-palette-0)">○</span> <span style="color:var(--vt-palette-0)">idle</span>3+4+ <span style="font-weight:bold;text-decoration:underline">Files</span>5+ What&#39;s big in the repo, from <span style="color:var(--vt-palette-4)">ls</span>.6+7+ <span style="color:var(--vt-palette-8)">╭─</span> <span style="color:var(--vt-palette-0)">files</span> <span style="color:var(--vt-palette-8)">──────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-0)">✓</span> <span style="color:var(--vt-palette-0)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>8+ <span style="color:var(--vt-palette-0)">[1]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">files</span> <span style="font-weight:bold">=</span> <span style="color:var(--vt-palette-4)">ls</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">▶</span>9+ <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>10+<span style="color:var(--vt-palette-2)">▌</span> <span style="color:var(--vt-palette-0)">Out[1]:</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">name</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">▾</span><span style="background:var(--vt-palette-7)"> </span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">type</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">▾</span><span style="background:var(--vt-palette-6)"> </span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">size</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">▾</span><span style="background:var(--vt-palette-7)"> </span>11+<span style="color:var(--vt-palette-2)">▌</span> <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">1</span><span style="background:var(--vt-palette-6)"> </span> 012 <span style="color:var(--vt-palette-8)">┌─</span> <span style="font-weight:bold">Filter</span> <span style="font-weight:bold">type</span> <span style="color:var(--vt-palette-8)">──────────────────────┐</span>12+<span style="color:var(--vt-palette-2)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">2</span><span style="background:var(--vt-palette-7)"> </span> CLAUDE.md <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-0)">If</span> <span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">‹</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">None</span><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-8)">│</span>13+<span style="color:var(--vt-palette-2)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">3</span><span style="background:var(--vt-palette-7)"> </span> README.md <span style="color:var(--vt-palette-8)">├────────────────────────────────────┤</span>14+<span style="color:var(--vt-palette-2)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">4</span><span style="background:var(--vt-palette-7)"> </span> demos <span style="color:var(--vt-palette-8)">│</span> <span style="font-weight:bold">›</span> <span style="color:var(--vt-palette-0)">Search</span> <span style="color:var(--vt-palette-0)">values</span> <span style="color:var(--vt-palette-8)">│</span>15+<span style="color:var(--vt-palette-2)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">5</span><span style="background:var(--vt-palette-7)"> </span> go.mod <span style="color:var(--vt-palette-8)">├────────────────────────────────────┤</span>16+ <span style="color:var(--vt-palette-8)">│</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">[x]</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">Select</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">all</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-8)">│</span>17+ <span style="color:var(--vt-palette-8)">╭──────────────────│</span> [x] dir <span style="color:var(--vt-palette-0)">1</span> <span style="color:var(--vt-palette-8)">│──────────────────────</span> <span style="color:var(--vt-palette-0)">✓</span> <span style="color:var(--vt-palette-0)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>18+ <span style="color:var(--vt-palette-0)">[2]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-4)">where</span> si<span style="color:var(--vt-palette-8)">│</span> [x] file <span style="color:var(--vt-palette-0)">4</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-0)">▶</span>19+ <span style="color:var(--vt-palette-8)">╰──────────────────└───────────────────────────</span> <span style="color:var(--vt-palette-0)">2</span> <span style="color:var(--vt-palette-0)">of</span> <span style="color:var(--vt-palette-0)">2</span> <span style="color:var(--vt-palette-8)">─┘──────────────────────────────╯</span>20+ <span style="color:var(--vt-palette-0)">Out[2]:</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">name</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">type</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">size</span><span style="background:var(--vt-palette-7)"> </span>21+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">1</span><span style="background:var(--vt-palette-7)"> </span> 012 file 4.2 kB22+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">2</span><span style="background:var(--vt-palette-7)"> </span> README.md file 9.8 kB23+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">3</span><span style="background:var(--vt-palette-7)"> </span> demos dir 3.1 kB24+25+ <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────────────────────────────────╮</span>26+ <span style="color:var(--vt-palette-0)">[</span> <span style="color:var(--vt-palette-0)">]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-0)">▶</span>27+ <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>28+29+30+<span style="color:var(--vt-palette-0)">Type</span> <span style="color:var(--vt-palette-0)">to</span> <span style="color:var(--vt-palette-0)">search</span> <span style="color:var(--vt-palette-0)">the</span> <span style="color:var(--vt-palette-0)">values</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Space</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">check</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Tab</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">condition</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Enter</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">apply</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Esc</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">cancel</span></pre>\ No newline at end of file
A e2e/testdata/screens/notebook-grid-filter.html +30 -0
@@ -0,0 +1,30 @@
1+<pre class="screen"> <span style="text-decoration:underline">F</span>ile <span style="text-decoration:underline">E</span>dit <span style="text-decoration:underline">V</span>iew <span style="text-decoration:underline">I</span>nsert F<span style="text-decoration:underline">o</span>rmat <span style="text-decoration:underline">D</span>ata <span style="text-decoration:underline">H</span>elp <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">FILTER</span><span style="background:var(--vt-palette-6)"> </span>2+ ▶ Run <span style="color:var(--vt-palette-8)">■</span> <span style="color:var(--vt-palette-8)">Stop</span> ↻ Restart ▶▶ Run all <span style="color:var(--vt-palette-8)">│</span> + Add ✂ Cut ⧉ Copy <span style="color:var(--vt-palette-8)">⎘</span> <span style="color:var(--vt-palette-8)">Paste</span> <span style="color:var(--vt-palette-8)">│</span> Code ▾ <span style="color:var(--vt-palette-8)">nu</span> <span style="color:var(--vt-palette-8)">○</span> <span style="color:var(--vt-palette-8)">idle</span>3+4+ <span style="font-weight:bold;text-decoration:underline">Files</span>5+ What&#39;s big in the repo, from <span style="color:var(--vt-palette-6)">ls</span>.6+7+ <span style="color:var(--vt-palette-8)">╭─</span> <span style="color:var(--vt-palette-8)">files</span> <span style="color:var(--vt-palette-8)">──────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-8)">✓</span> <span style="color:var(--vt-palette-8)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>8+ <span style="color:var(--vt-palette-8)">[1]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">files</span> <span style="font-weight:bold">=</span> <span style="color:var(--vt-palette-6)">ls</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">▶</span>9+ <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>10+<span style="color:var(--vt-palette-2)">▌</span> <span style="color:var(--vt-palette-8)">Out[1]:</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">name</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">▾</span><span style="background:var(--vt-palette-8)"> </span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">type</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">▾</span><span style="background:var(--vt-palette-6)"> </span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">size</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">▾</span><span style="background:var(--vt-palette-8)"> </span>11+<span style="color:var(--vt-palette-2)">▌</span> <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">1</span><span style="background:var(--vt-palette-6)"> </span> 012 <span style="color:var(--vt-palette-8)">┌─</span> <span style="font-weight:bold">Filter</span> <span style="font-weight:bold">type</span> <span style="color:var(--vt-palette-8)">──────────────────────┐</span>12+<span style="color:var(--vt-palette-2)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">2</span><span style="background:var(--vt-palette-8)"> </span> CLAUDE.md <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">If</span> <span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">‹</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">None</span><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-8)">│</span>13+<span style="color:var(--vt-palette-2)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">3</span><span style="background:var(--vt-palette-8)"> </span> README.md <span style="color:var(--vt-palette-8)">├────────────────────────────────────┤</span>14+<span style="color:var(--vt-palette-2)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">4</span><span style="background:var(--vt-palette-8)"> </span> demos <span style="color:var(--vt-palette-8)">│</span> <span style="font-weight:bold">›</span> <span style="color:var(--vt-palette-8)">Search</span> <span style="color:var(--vt-palette-8)">values</span> <span style="color:var(--vt-palette-8)">│</span>15+<span style="color:var(--vt-palette-2)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">5</span><span style="background:var(--vt-palette-8)"> </span> go.mod <span style="color:var(--vt-palette-8)">├────────────────────────────────────┤</span>16+ <span style="color:var(--vt-palette-8)">│</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">[x]</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">Select</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">all</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-8)">│</span>17+ <span style="color:var(--vt-palette-8)">╭──────────────────│</span> [x] dir <span style="color:var(--vt-palette-8)">1</span> <span style="color:var(--vt-palette-8)">│──────────────────────</span> <span style="color:var(--vt-palette-8)">✓</span> <span style="color:var(--vt-palette-8)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>18+ <span style="color:var(--vt-palette-8)">[2]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-6)">where</span> si<span style="color:var(--vt-palette-8)">│</span> [x] file <span style="color:var(--vt-palette-8)">4</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">▶</span>19+ <span style="color:var(--vt-palette-8)">╰──────────────────└───────────────────────────</span> <span style="color:var(--vt-palette-8)">2</span> <span style="color:var(--vt-palette-8)">of</span> <span style="color:var(--vt-palette-8)">2</span> <span style="color:var(--vt-palette-8)">─┘──────────────────────────────╯</span>20+ <span style="color:var(--vt-palette-8)">Out[2]:</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">name</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">type</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">size</span><span style="background:var(--vt-palette-8)"> </span>21+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">1</span><span style="background:var(--vt-palette-8)"> </span> 012 file 4.2 kB22+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">2</span><span style="background:var(--vt-palette-8)"> </span> README.md file 9.8 kB23+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">3</span><span style="background:var(--vt-palette-8)"> </span> demos dir 3.1 kB24+25+ <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────────────────────────────────╮</span>26+ <span style="color:var(--vt-palette-8)">[</span> <span style="color:var(--vt-palette-8)">]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">▶</span>27+ <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>28+29+30+<span style="color:var(--vt-palette-8)">Type</span> <span style="color:var(--vt-palette-8)">to</span> <span style="color:var(--vt-palette-8)">search</span> <span style="color:var(--vt-palette-8)">the</span> <span style="color:var(--vt-palette-8)">values</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Space</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">check</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Tab</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">condition</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Enter</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">apply</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Esc</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">cancel</span></pre>\ No newline at end of file
A e2e/testdata/screens/notebook-grid-high-contrast.html +30 -0
@@ -0,0 +1,30 @@
1+<pre class="screen"><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">F</span><span style="color:#ffffff;background:#1f1f1f">ile</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">E</span><span style="color:#ffffff;background:#1f1f1f">dit</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">V</span><span style="color:#ffffff;background:#1f1f1f">iew</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">I</span><span style="color:#ffffff;background:#1f1f1f">nsert</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f">F</span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">o</span><span style="color:#ffffff;background:#1f1f1f">rmat</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">D</span><span style="color:#ffffff;background:#1f1f1f">ata</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">H</span><span style="color:#ffffff;background:#1f1f1f">elp</span><span style="background:#1f1f1f"> </span><span style="background:#40e0ff"> </span><span style="color:#000000;background:#40e0ff;font-weight:bold">OUTPUT</span><span style="background:#40e0ff"> </span>2+<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">▶</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">Run</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">■</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">Stop</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">↻</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">Restart</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">▶▶</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">Run</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">all</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">+</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">Add</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">✂</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">Cut</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">⧉</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">Copy</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">⎘</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">Paste</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">Code</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">▾</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">nu</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">○</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">idle</span><span style="background:#000000"> </span>3+<span style="background:#000000"> </span><span style="color:#959595;background:#000000">Output</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">of</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">files</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">────────────────────</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">Ctrl+C</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">copy</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">Ctrl+F</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">find</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">Enter</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">full-screen</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">Esc</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">back</span><span style="background:#000000"> </span>4+<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">Files</span><span style="background:#000000"> </span>5+<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">What&#39;s</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">big</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">in</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">the</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">repo,</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">from</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">ls</span><span style="color:#ffffff;background:#000000">.</span><span style="background:#000000"> </span>6+<span style="background:#000000"> </span>7+<span style="background:#000000"> </span><span style="color:#757575;background:#000000">╭─</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">files</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">──────────────────────────────────────────────────────────────────────</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">✓</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">&lt;1s</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">─╮</span><span style="background:#000000"> </span>8+<span style="background:#000000"> </span><span style="color:#959595;background:#000000">[1]:</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ff80ff;background:#000000">files</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">=</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">ls</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">▶</span>9+<span style="background:#000000"> </span><span style="color:#757575;background:#000000">╰──────────────────────────────────────────────────────────────────────────────────────╯</span><span style="background:#000000"> </span>10+<span style="color:#40e040;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[1]:</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="background:#40e0ff"> </span><span style="color:#000000;background:#40e0ff;font-weight:bold">name</span><span style="background:#40e0ff"> </span><span style="background:#0033cc"> </span><span style="color:#ffffff;background:#0033cc">type</span><span style="background:#0033cc"> </span><span style="color:#ffffff;background:#0033cc">size</span><span style="background:#0033cc"> </span><span style="background:#000000"> </span>11+<span style="color:#40e040;background:#000000">▌</span><span style="background:#000000"> </span><span style="background:#40e0ff"> </span><span style="color:#000000;background:#40e0ff;font-weight:bold">1</span><span style="background:#40e0ff"> </span><span style="color:#000000;background:#40e0ff">012</span><span style="background:#40e0ff"> </span><span style="background:#0033cc"> </span><span style="color:#ffffff;background:#0033cc">file</span><span style="background:#0033cc"> </span><span style="color:#ffffff;background:#0033cc">4.2</span><span style="background:#0033cc"> </span><span style="color:#ffffff;background:#0033cc">kB</span><span style="background:#0033cc"> </span><span style="background:#000000"> </span>12+<span style="color:#40e040;background:#000000">▌</span><span style="background:#000000"> </span><span style="background:#0033cc"> </span><span style="color:#ffffff;background:#0033cc">2</span><span style="background:#0033cc"> </span><span style="color:#ffffff;background:#0033cc">CLAUDE.md</span><span style="background:#0033cc"> </span><span style="color:#ffffff;background:#0033cc">file</span><span style="background:#0033cc"> </span><span style="color:#ffffff;background:#0033cc">1.0</span><span style="background:#0033cc"> </span><span style="color:#ffffff;background:#0033cc">kB</span><span style="background:#0033cc"> </span><span style="background:#000000"> </span>13+<span style="color:#40e040;background:#000000">▌</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">3</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>14+<span style="color:#40e040;background:#000000">▌</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">4</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>15+<span style="color:#40e040;background:#000000">▌</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">5</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">go.mod</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">812</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">B</span><span style="background:#000000"> </span>16+<span style="background:#000000"> </span>17+<span style="background:#000000"> </span><span style="color:#757575;background:#000000">╭──────────────────────────────────────────────────────────────────────────────</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">✓</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">&lt;1s</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">─╮</span><span style="background:#000000"> </span>18+<span style="background:#000000"> </span><span style="color:#959595;background:#000000">[2]:</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ff80ff;background:#000000">$files</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">|</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">where</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">size</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">&gt;</span><span style="background:#000000"> </span><span style="color:#ffe040;background:#000000">1kb</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">▶</span>19+<span style="background:#000000"> </span><span style="color:#757575;background:#000000">╰──────────────────────────────────────────────────────────────────────────────────────╯</span><span style="background:#000000"> </span>20+<span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[2]:</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">name</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">type</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">size</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span>21+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">1</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>22+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">2</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>23+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">3</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>24+<span style="background:#000000"> </span>25+<span style="background:#000000"> </span><span style="color:#757575;background:#000000">╭──────────────────────────────────────────────────────────────────────────────────────╮</span><span style="background:#000000"> </span>26+<span style="background:#000000"> </span><span style="color:#959595;background:#000000">[</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">]:</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">▶</span>27+<span style="background:#000000"> </span><span style="color:#757575;background:#000000">╰──────────────────────────────────────────────────────────────────────────────────────╯</span><span style="background:#000000"> </span>28+<span style="background:#000000"> </span>29+<span style="background:#000000"> </span>30+<span style="background:#40e0ff"> </span><span style="color:#000000;background:#40e0ff;font-weight:bold">❯</span><span style="background:#40e0ff"> </span><span style="color:#000000;background:#40e0ff;font-weight:bold">Notebook</span><span style="background:#40e0ff"> </span><span style="background:#1f1f1f"> </span><span style="color:#959595;background:#1f1f1f">+</span><span style="background:#1f1f1f"> </span><span style="color:#757575;background:#1f1f1f">│</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f">untitled</span><span style="background:#1f1f1f"> </span><span style="color:#959595;background:#1f1f1f">modified</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;font-weight:bold">name</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;font-weight:bold">to</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;font-weight:bold">size,</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;font-weight:bold">rows</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;font-weight:bold">1</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;font-weight:bold">to</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;font-weight:bold">2</span><span style="background:#1f1f1f"> </span><span style="color:#959595;background:#1f1f1f">Sum</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f">5200</span><span style="background:#1f1f1f"> </span><span style="color:#959595;background:#1f1f1f">Avg</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f">2600</span><span style="background:#1f1f1f"> </span><span style="color:#959595;background:#1f1f1f">Count</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f">6</span></pre>\ No newline at end of file
A e2e/testdata/screens/notebook-grid-light.html +30 -0
@@ -0,0 +1,30 @@
1+<pre class="screen"> <span style="text-decoration:underline">F</span>ile <span style="text-decoration:underline">E</span>dit <span style="text-decoration:underline">V</span>iew <span style="text-decoration:underline">I</span>nsert F<span style="text-decoration:underline">o</span>rmat <span style="text-decoration:underline">D</span>ata <span style="text-decoration:underline">H</span>elp <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">OUTPUT</span><span style="background:var(--vt-palette-6)"> </span>2+ ▶ Run <span style="color:var(--vt-palette-8)">■</span> <span style="color:var(--vt-palette-8)">Stop</span> ↻ Restart ▶▶ Run all <span style="color:var(--vt-palette-8)">│</span> + Add ✂ Cut ⧉ Copy <span style="color:var(--vt-palette-8)">⎘</span> <span style="color:var(--vt-palette-8)">Paste</span> <span style="color:var(--vt-palette-8)">│</span> Code ▾ <span style="color:var(--vt-palette-0)">nu</span> <span style="color:var(--vt-palette-0)">○</span> <span style="color:var(--vt-palette-0)">idle</span>3+ <span style="color:var(--vt-palette-0)">Output</span> <span style="color:var(--vt-palette-0)">of</span> <span style="color:var(--vt-palette-0)">files</span> <span style="color:var(--vt-palette-8)">────────────────────</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Ctrl+C</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">copy</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Ctrl+F</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">find</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Enter</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">full-screen</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Esc</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">back</span>4+ <span style="font-weight:bold;text-decoration:underline">Files</span>5+ What&#39;s big in the repo, from <span style="color:var(--vt-palette-4)">ls</span>.6+7+ <span style="color:var(--vt-palette-8)">╭─</span> <span style="color:var(--vt-palette-0)">files</span> <span style="color:var(--vt-palette-8)">──────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-0)">✓</span> <span style="color:var(--vt-palette-0)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>8+ <span style="color:var(--vt-palette-0)">[1]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">files</span> <span style="font-weight:bold">=</span> <span style="color:var(--vt-palette-4)">ls</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">▶</span>9+ <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>10+<span style="color:var(--vt-palette-2)">▌</span> <span style="color:var(--vt-palette-0)">Out[1]:</span> <span style="background:var(--vt-palette-7)"> </span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">name</span><span style="background:var(--vt-palette-6)"> </span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4)">type</span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4)">size</span><span style="background:var(--vt-palette-4)"> </span>11+<span style="color:var(--vt-palette-2)">▌</span> <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">1</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">012</span><span style="background:var(--vt-palette-6)"> </span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4)">file</span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4)">4.2</span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4)">kB</span><span style="background:var(--vt-palette-4)"> </span>12+<span style="color:var(--vt-palette-2)">▌</span> <span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4)">2</span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4)">CLAUDE.md</span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4)">file</span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4)">1.0</span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4)">kB</span><span style="background:var(--vt-palette-4)"> </span>13+<span style="color:var(--vt-palette-2)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">3</span><span style="background:var(--vt-palette-7)"> </span> README.md file 9.8 kB14+<span style="color:var(--vt-palette-2)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">4</span><span style="background:var(--vt-palette-7)"> </span> demos dir 3.1 kB15+<span style="color:var(--vt-palette-2)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">5</span><span style="background:var(--vt-palette-7)"> </span> go.mod file 812 B16+17+ <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-0)">✓</span> <span style="color:var(--vt-palette-0)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>18+ <span style="color:var(--vt-palette-0)">[2]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-4)">where</span> size <span style="font-weight:bold">&gt;</span> <span style="color:var(--vt-palette-1)">1kb</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-0)">▶</span>19+ <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>20+ <span style="color:var(--vt-palette-0)">Out[2]:</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">name</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">type</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">size</span><span style="background:var(--vt-palette-7)"> </span>21+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">1</span><span style="background:var(--vt-palette-7)"> </span> 012 file 4.2 kB22+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">2</span><span style="background:var(--vt-palette-7)"> </span> README.md file 9.8 kB23+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">3</span><span style="background:var(--vt-palette-7)"> </span> demos dir 3.1 kB24+25+ <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────────────────────────────────╮</span>26+ <span style="color:var(--vt-palette-0)">[</span> <span style="color:var(--vt-palette-0)">]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-0)">▶</span>27+ <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>28+29+30+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">❯</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">Notebook</span><span style="background:var(--vt-palette-6)"> </span> <span style="color:var(--vt-palette-0)">+</span> <span style="color:var(--vt-palette-8)">│</span> untitled <span style="color:var(--vt-palette-0)">modified</span> <span style="font-weight:bold">name</span> <span style="font-weight:bold">to</span> <span style="font-weight:bold">size,</span> <span style="font-weight:bold">rows</span> <span style="font-weight:bold">1</span> <span style="font-weight:bold">to</span> <span style="font-weight:bold">2</span> <span style="color:var(--vt-palette-0)">Sum</span> 5200 <span style="color:var(--vt-palette-0)">Avg</span> 2600 <span style="color:var(--vt-palette-0)">Count</span> 6</pre>\ No newline at end of file
A e2e/testdata/screens/notebook-grid.html +30 -0
@@ -0,0 +1,30 @@
1+<pre class="screen"> <span style="text-decoration:underline">F</span>ile <span style="text-decoration:underline">E</span>dit <span style="text-decoration:underline">V</span>iew <span style="text-decoration:underline">I</span>nsert F<span style="text-decoration:underline">o</span>rmat <span style="text-decoration:underline">D</span>ata <span style="text-decoration:underline">H</span>elp <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">OUTPUT</span><span style="background:var(--vt-palette-6)"> </span>2+ ▶ Run <span style="color:var(--vt-palette-8)">■</span> <span style="color:var(--vt-palette-8)">Stop</span> ↻ Restart ▶▶ Run all <span style="color:var(--vt-palette-8)">│</span> + Add ✂ Cut ⧉ Copy <span style="color:var(--vt-palette-8)">⎘</span> <span style="color:var(--vt-palette-8)">Paste</span> <span style="color:var(--vt-palette-8)">│</span> Code ▾ <span style="color:var(--vt-palette-8)">nu</span> <span style="color:var(--vt-palette-8)">○</span> <span style="color:var(--vt-palette-8)">idle</span>3+ <span style="color:var(--vt-palette-8)">Output</span> <span style="color:var(--vt-palette-8)">of</span> <span style="color:var(--vt-palette-8)">files</span> <span style="color:var(--vt-palette-8)">────────────────────</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Ctrl+C</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">copy</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Ctrl+F</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">find</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Enter</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">full-screen</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Esc</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">back</span>4+ <span style="font-weight:bold;text-decoration:underline">Files</span>5+ What&#39;s big in the repo, from <span style="color:var(--vt-palette-6)">ls</span>.6+7+ <span style="color:var(--vt-palette-8)">╭─</span> <span style="color:var(--vt-palette-8)">files</span> <span style="color:var(--vt-palette-8)">──────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-8)">✓</span> <span style="color:var(--vt-palette-8)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>8+ <span style="color:var(--vt-palette-8)">[1]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">files</span> <span style="font-weight:bold">=</span> <span style="color:var(--vt-palette-6)">ls</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">▶</span>9+ <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>10+<span style="color:var(--vt-palette-2)">▌</span> <span style="color:var(--vt-palette-8)">Out[1]:</span> <span style="background:var(--vt-palette-8)"> </span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">name</span><span style="background:var(--vt-palette-6)"> </span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4)">type</span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4)">size</span><span style="background:var(--vt-palette-4)"> </span>11+<span style="color:var(--vt-palette-2)">▌</span> <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">1</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">012</span><span style="background:var(--vt-palette-6)"> </span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4)">file</span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4)">4.2</span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4)">kB</span><span style="background:var(--vt-palette-4)"> </span>12+<span style="color:var(--vt-palette-2)">▌</span> <span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4)">2</span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4)">CLAUDE.md</span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4)">file</span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4)">1.0</span><span style="background:var(--vt-palette-4)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4)">kB</span><span style="background:var(--vt-palette-4)"> </span>13+<span style="color:var(--vt-palette-2)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">3</span><span style="background:var(--vt-palette-8)"> </span> README.md file 9.8 kB14+<span style="color:var(--vt-palette-2)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">4</span><span style="background:var(--vt-palette-8)"> </span> demos dir 3.1 kB15+<span style="color:var(--vt-palette-2)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">5</span><span style="background:var(--vt-palette-8)"> </span> go.mod file 812 B16+17+ <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-8)">✓</span> <span style="color:var(--vt-palette-8)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>18+ <span style="color:var(--vt-palette-8)">[2]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-6)">where</span> size <span style="font-weight:bold">&gt;</span> <span style="color:var(--vt-palette-3)">1kb</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">▶</span>19+ <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>20+ <span style="color:var(--vt-palette-8)">Out[2]:</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">name</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">type</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">size</span><span style="background:var(--vt-palette-8)"> </span>21+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">1</span><span style="background:var(--vt-palette-8)"> </span> 012 file 4.2 kB22+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">2</span><span style="background:var(--vt-palette-8)"> </span> README.md file 9.8 kB23+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">3</span><span style="background:var(--vt-palette-8)"> </span> demos dir 3.1 kB24+25+ <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────────────────────────────────╮</span>26+ <span style="color:var(--vt-palette-8)">[</span> <span style="color:var(--vt-palette-8)">]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">▶</span>27+ <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>28+29+30+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">❯</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">Notebook</span><span style="background:var(--vt-palette-6)"> </span> <span style="color:var(--vt-palette-8)">+</span> <span style="color:var(--vt-palette-8)">│</span> untitled <span style="color:var(--vt-palette-8)">modified</span> <span style="font-weight:bold">name</span> <span style="font-weight:bold">to</span> <span style="font-weight:bold">size,</span> <span style="font-weight:bold">rows</span> <span style="font-weight:bold">1</span> <span style="font-weight:bold">to</span> <span style="font-weight:bold">2</span> <span style="color:var(--vt-palette-8)">Sum</span> 5200 <span style="color:var(--vt-palette-8)">Avg</span> 2600 <span style="color:var(--vt-palette-8)">Count</span> 6</pre>\ No newline at end of file
M e2e/testdata/screens/notebook-nu-error-high-contrast.html +10 -10
@@ -7,20 +7,20 @@
77 <span style="background:#000000"> </span><span style="color:#757575;background:#000000">╭─</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">files</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">──────────────────────────────────────────────────────────────────────</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">✓</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">&lt;1s</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">─╮</span><span style="background:#000000"> </span>88 <span style="background:#000000"> </span><span style="color:#959595;background:#000000">[1]:</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ff80ff;background:#000000">files</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">=</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">ls</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">▶</span>99 <span style="background:#000000"> </span><span style="color:#757575;background:#000000">╰──────────────────────────────────────────────────────────────────────────────────────╯</span><span style="background:#000000"> </span>10-<span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[1]:</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">name</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">type</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">size</span><span style="background:#000000"> </span>11-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>12-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">CLAUDE.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">1.0</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>13-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>14-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>15-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">go.mod</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">812</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">B</span><span style="background:#000000"> </span>10+<span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[1]:</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">name</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">type</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">size</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span>11+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">1</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>12+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">2</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">CLAUDE.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">1.0</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>13+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">3</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>14+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">4</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>15+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">5</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">go.mod</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">812</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">B</span><span style="background:#000000"> </span>1616 <span style="background:#000000"> </span>1717 <span style="background:#000000"> </span><span style="color:#757575;background:#000000">╭──────────────────────────────────────────────────────────────────────────────</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">✓</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">&lt;1s</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">─╮</span><span style="background:#000000"> </span>1818 <span style="background:#000000"> </span><span style="color:#959595;background:#000000">[2]:</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ff80ff;background:#000000">$files</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">|</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">where</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">size</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">&gt;</span><span style="background:#000000"> </span><span style="color:#ffe040;background:#000000">1kb</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">▶</span>1919 <span style="background:#000000"> </span><span style="color:#757575;background:#000000">╰──────────────────────────────────────────────────────────────────────────────────────╯</span><span style="background:#000000"> </span>20-<span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[2]:</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">name</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">type</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">size</span><span style="background:#000000"> </span>21-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>22-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>23-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>20+<span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[2]:</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">name</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">type</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">size</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span>21+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">1</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>22+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">2</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>23+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">3</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>2424 <span style="background:#000000"> </span>2525 <span style="color:#40e040;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#40e040;background:#000000">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓</span><span style="background:#000000"> </span>2626 <span style="color:#40e040;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">[</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">]:</span><span style="background:#000000"> </span><span style="color:#40e040;background:#000000">┃</span><span style="background:#000000"> </span><span style="color:#ff80ff;background:#000000">$files</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">|</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">sort-by</span><span style="background:#000000"> </span><span style="color:#40e040;background:#000000">size</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;text-decoration:underline wavy #ff8080">--revrse</span><span style="background:#000000"> </span><span style="color:#40e040;background:#000000">┃</span><span style="background:#000000"> </span><span style="color:#40e040;background:#000000">▶</span>
M e2e/testdata/screens/notebook-nu-error-light.html +10 -10
@@ -7,20 +7,20 @@
77 <span style="color:var(--vt-palette-8)">╭─</span> <span style="color:var(--vt-palette-0)">files</span> <span style="color:var(--vt-palette-8)">──────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-0)">✓</span> <span style="color:var(--vt-palette-0)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>88 <span style="color:var(--vt-palette-0)">[1]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">files</span> <span style="font-weight:bold">=</span> <span style="color:var(--vt-palette-4)">ls</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-0)">▶</span>99 <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>10- <span style="color:var(--vt-palette-0)">Out[1]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>11- 012 file 4.2 kB12- CLAUDE.md file 1.0 kB13- README.md file 9.8 kB14- demos dir 3.1 kB15- go.mod file 812 B10+ <span style="color:var(--vt-palette-0)">Out[1]:</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">name</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">type</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">size</span><span style="background:var(--vt-palette-7)"> </span>11+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">1</span><span style="background:var(--vt-palette-7)"> </span> 012 file 4.2 kB12+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">2</span><span style="background:var(--vt-palette-7)"> </span> CLAUDE.md file 1.0 kB13+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">3</span><span style="background:var(--vt-palette-7)"> </span> README.md file 9.8 kB14+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">4</span><span style="background:var(--vt-palette-7)"> </span> demos dir 3.1 kB15+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">5</span><span style="background:var(--vt-palette-7)"> </span> go.mod file 812 B1616 1717 <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-0)">✓</span> <span style="color:var(--vt-palette-0)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>1818 <span style="color:var(--vt-palette-0)">[2]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-4)">where</span> size <span style="font-weight:bold">&gt;</span> <span style="color:var(--vt-palette-1)">1kb</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-0)">▶</span>1919 <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>20- <span style="color:var(--vt-palette-0)">Out[2]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>21- 012 file 4.2 kB22- README.md file 9.8 kB23- demos dir 3.1 kB20+ <span style="color:var(--vt-palette-0)">Out[2]:</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">name</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">type</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">size</span><span style="background:var(--vt-palette-7)"> </span>21+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">1</span><span style="background:var(--vt-palette-7)"> </span> 012 file 4.2 kB22+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">2</span><span style="background:var(--vt-palette-7)"> </span> README.md file 9.8 kB23+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">3</span><span style="background:var(--vt-palette-7)"> </span> demos dir 3.1 kB2424 2525 <span style="color:var(--vt-palette-2)">▌</span> <span style="color:var(--vt-palette-2)">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓</span>2626 <span style="color:var(--vt-palette-2)">▌</span> <span style="color:var(--vt-palette-0)">[</span> <span style="color:var(--vt-palette-0)">]:</span> <span style="color:var(--vt-palette-2)">┃</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-4)">sort-by</span> <span style="color:var(--vt-palette-2)">size</span> <span style="text-decoration:underline wavy var(--vt-palette-1)">--revrse</span> <span style="color:var(--vt-palette-2)">┃</span> <span style="color:var(--vt-palette-2)">▶</span>
M e2e/testdata/screens/notebook-nu-error.html +10 -10
@@ -7,20 +7,20 @@
77 <span style="color:var(--vt-palette-8)">╭─</span> <span style="color:var(--vt-palette-8)">files</span> <span style="color:var(--vt-palette-8)">──────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-8)">✓</span> <span style="color:var(--vt-palette-8)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>88 <span style="color:var(--vt-palette-8)">[1]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">files</span> <span style="font-weight:bold">=</span> <span style="color:var(--vt-palette-6)">ls</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">▶</span>99 <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>10- <span style="color:var(--vt-palette-8)">Out[1]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>11- 012 file 4.2 kB12- CLAUDE.md file 1.0 kB13- README.md file 9.8 kB14- demos dir 3.1 kB15- go.mod file 812 B10+ <span style="color:var(--vt-palette-8)">Out[1]:</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">name</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">type</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">size</span><span style="background:var(--vt-palette-8)"> </span>11+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">1</span><span style="background:var(--vt-palette-8)"> </span> 012 file 4.2 kB12+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">2</span><span style="background:var(--vt-palette-8)"> </span> CLAUDE.md file 1.0 kB13+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">3</span><span style="background:var(--vt-palette-8)"> </span> README.md file 9.8 kB14+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">4</span><span style="background:var(--vt-palette-8)"> </span> demos dir 3.1 kB15+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">5</span><span style="background:var(--vt-palette-8)"> </span> go.mod file 812 B1616 1717 <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-8)">✓</span> <span style="color:var(--vt-palette-8)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>1818 <span style="color:var(--vt-palette-8)">[2]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-6)">where</span> size <span style="font-weight:bold">&gt;</span> <span style="color:var(--vt-palette-3)">1kb</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">▶</span>1919 <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>20- <span style="color:var(--vt-palette-8)">Out[2]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>21- 012 file 4.2 kB22- README.md file 9.8 kB23- demos dir 3.1 kB20+ <span style="color:var(--vt-palette-8)">Out[2]:</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">name</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">type</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">size</span><span style="background:var(--vt-palette-8)"> </span>21+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">1</span><span style="background:var(--vt-palette-8)"> </span> 012 file 4.2 kB22+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">2</span><span style="background:var(--vt-palette-8)"> </span> README.md file 9.8 kB23+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">3</span><span style="background:var(--vt-palette-8)"> </span> demos dir 3.1 kB2424 2525 <span style="color:var(--vt-palette-2)">▌</span> <span style="color:var(--vt-palette-2)">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓</span>2626 <span style="color:var(--vt-palette-2)">▌</span> <span style="color:var(--vt-palette-8)">[</span> <span style="color:var(--vt-palette-8)">]:</span> <span style="color:var(--vt-palette-2)">┃</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-6)">sort-by</span> <span style="color:var(--vt-palette-2)">size</span> <span style="text-decoration:underline wavy var(--vt-palette-1)">--revrse</span> <span style="color:var(--vt-palette-2)">┃</span> <span style="color:var(--vt-palette-2)">▶</span>
M e2e/testdata/screens/notebook-nu-highlight-high-contrast.html +10 -10
@@ -7,20 +7,20 @@
77 <span style="background:#000000"> </span><span style="color:#757575;background:#000000">╭─</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">files</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">──────────────────────────────────────────────────────────────────────</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">✓</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">&lt;1s</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">─╮</span><span style="background:#000000"> </span>88 <span style="background:#000000"> </span><span style="color:#959595;background:#000000">[1]:</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ff80ff;background:#000000">files</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">=</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">ls</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">▶</span>99 <span style="background:#000000"> </span><span style="color:#757575;background:#000000">╰──────────────────────────────────────────────────────────────────────────────────────╯</span><span style="background:#000000"> </span>10-<span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[1]:</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">name</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">type</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">size</span><span style="background:#000000"> </span>11-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>12-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">CLAUDE.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">1.0</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>13-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>14-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>15-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">go.mod</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">812</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">B</span><span style="background:#000000"> </span>10+<span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[1]:</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">name</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">type</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">size</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span>11+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">1</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>12+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">2</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">CLAUDE.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">1.0</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>13+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">3</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>14+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">4</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>15+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">5</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">go.mod</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">812</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">B</span><span style="background:#000000"> </span>1616 <span style="background:#000000"> </span>1717 <span style="background:#000000"> </span><span style="color:#757575;background:#000000">╭──────────────────────────────────────────────────────────────────────────────</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">✓</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">&lt;1s</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">─╮</span><span style="background:#000000"> </span>1818 <span style="background:#000000"> </span><span style="color:#959595;background:#000000">[2]:</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ff80ff;background:#000000">$files</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">|</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">where</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">size</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">&gt;</span><span style="background:#000000"> </span><span style="color:#ffe040;background:#000000">1kb</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">▶</span>1919 <span style="background:#000000"> </span><span style="color:#757575;background:#000000">╰──────────────────────────────────────────────────────────────────────────────────────╯</span><span style="background:#000000"> </span>20-<span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[2]:</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">name</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">type</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">size</span><span style="background:#000000"> </span>21-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>22-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>23-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>20+<span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[2]:</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">name</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">type</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">size</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span>21+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">1</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>22+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">2</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>23+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">3</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>2424 <span style="background:#000000"> </span>2525 <span style="color:#40e040;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#40e040;background:#000000">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓</span><span style="background:#000000"> </span>2626 <span style="color:#40e040;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">[</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">]:</span><span style="background:#000000"> </span><span style="color:#40e040;background:#000000">┃</span><span style="background:#000000"> </span><span style="color:#ff80ff;background:#000000">big</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">=</span><span style="background:#000000"> </span><span style="color:#ff80ff;background:#000000">$files</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">|</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">where</span><span style="background:#000000"> </span><span style="color:#ff80ff;background:#000000">size</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">&gt;</span><span style="background:#000000"> </span><span style="color:#ffe040;background:#000000">1kb</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">|</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">sort-by</span><span style="background:#000000"> </span><span style="color:#40e040;background:#000000">size</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">--reverse</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000;font-style:italic">#</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000;font-style:italic">largest</span><span style="background:#000000"> </span><span style="color:#40e040;background:#000000">┃</span><span style="background:#000000"> </span><span style="color:#40e040;background:#000000">▶</span>
M e2e/testdata/screens/notebook-nu-highlight-light.html +10 -10
@@ -7,20 +7,20 @@
77 <span style="color:var(--vt-palette-8)">╭─</span> <span style="color:var(--vt-palette-0)">files</span> <span style="color:var(--vt-palette-8)">──────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-0)">✓</span> <span style="color:var(--vt-palette-0)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>88 <span style="color:var(--vt-palette-0)">[1]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">files</span> <span style="font-weight:bold">=</span> <span style="color:var(--vt-palette-4)">ls</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-0)">▶</span>99 <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>10- <span style="color:var(--vt-palette-0)">Out[1]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>11- 012 file 4.2 kB12- CLAUDE.md file 1.0 kB13- README.md file 9.8 kB14- demos dir 3.1 kB15- go.mod file 812 B10+ <span style="color:var(--vt-palette-0)">Out[1]:</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">name</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">type</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">size</span><span style="background:var(--vt-palette-7)"> </span>11+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">1</span><span style="background:var(--vt-palette-7)"> </span> 012 file 4.2 kB12+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">2</span><span style="background:var(--vt-palette-7)"> </span> CLAUDE.md file 1.0 kB13+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">3</span><span style="background:var(--vt-palette-7)"> </span> README.md file 9.8 kB14+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">4</span><span style="background:var(--vt-palette-7)"> </span> demos dir 3.1 kB15+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">5</span><span style="background:var(--vt-palette-7)"> </span> go.mod file 812 B1616 1717 <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-0)">✓</span> <span style="color:var(--vt-palette-0)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>1818 <span style="color:var(--vt-palette-0)">[2]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-4)">where</span> size <span style="font-weight:bold">&gt;</span> <span style="color:var(--vt-palette-1)">1kb</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-0)">▶</span>1919 <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>20- <span style="color:var(--vt-palette-0)">Out[2]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>21- 012 file 4.2 kB22- README.md file 9.8 kB23- demos dir 3.1 kB20+ <span style="color:var(--vt-palette-0)">Out[2]:</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">name</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">type</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">size</span><span style="background:var(--vt-palette-7)"> </span>21+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">1</span><span style="background:var(--vt-palette-7)"> </span> 012 file 4.2 kB22+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">2</span><span style="background:var(--vt-palette-7)"> </span> README.md file 9.8 kB23+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">3</span><span style="background:var(--vt-palette-7)"> </span> demos dir 3.1 kB2424 2525 <span style="color:var(--vt-palette-2)">▌</span> <span style="color:var(--vt-palette-2)">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓</span>2626 <span style="color:var(--vt-palette-2)">▌</span> <span style="color:var(--vt-palette-0)">[</span> <span style="color:var(--vt-palette-0)">]:</span> <span style="color:var(--vt-palette-2)">┃</span> <span style="color:var(--vt-palette-5)">big</span> <span style="font-weight:bold">=</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-4)">where</span> <span style="color:var(--vt-palette-5)">size</span> <span style="font-weight:bold">&gt;</span> <span style="color:var(--vt-palette-1)">1kb</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-4)">sort-by</span> <span style="color:var(--vt-palette-2)">size</span> --reverse <span style="color:var(--vt-palette-0);font-style:italic">#</span> <span style="color:var(--vt-palette-0);font-style:italic">largest</span> <span style="color:var(--vt-palette-2)">┃</span> <span style="color:var(--vt-palette-2)">▶</span>
M e2e/testdata/screens/notebook-nu-highlight.html +10 -10
@@ -7,20 +7,20 @@
77 <span style="color:var(--vt-palette-8)">╭─</span> <span style="color:var(--vt-palette-8)">files</span> <span style="color:var(--vt-palette-8)">──────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-8)">✓</span> <span style="color:var(--vt-palette-8)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>88 <span style="color:var(--vt-palette-8)">[1]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">files</span> <span style="font-weight:bold">=</span> <span style="color:var(--vt-palette-6)">ls</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">▶</span>99 <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>10- <span style="color:var(--vt-palette-8)">Out[1]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>11- 012 file 4.2 kB12- CLAUDE.md file 1.0 kB13- README.md file 9.8 kB14- demos dir 3.1 kB15- go.mod file 812 B10+ <span style="color:var(--vt-palette-8)">Out[1]:</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">name</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">type</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">size</span><span style="background:var(--vt-palette-8)"> </span>11+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">1</span><span style="background:var(--vt-palette-8)"> </span> 012 file 4.2 kB12+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">2</span><span style="background:var(--vt-palette-8)"> </span> CLAUDE.md file 1.0 kB13+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">3</span><span style="background:var(--vt-palette-8)"> </span> README.md file 9.8 kB14+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">4</span><span style="background:var(--vt-palette-8)"> </span> demos dir 3.1 kB15+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">5</span><span style="background:var(--vt-palette-8)"> </span> go.mod file 812 B1616 1717 <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-8)">✓</span> <span style="color:var(--vt-palette-8)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>1818 <span style="color:var(--vt-palette-8)">[2]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-6)">where</span> size <span style="font-weight:bold">&gt;</span> <span style="color:var(--vt-palette-3)">1kb</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">▶</span>1919 <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>20- <span style="color:var(--vt-palette-8)">Out[2]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>21- 012 file 4.2 kB22- README.md file 9.8 kB23- demos dir 3.1 kB20+ <span style="color:var(--vt-palette-8)">Out[2]:</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">name</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">type</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">size</span><span style="background:var(--vt-palette-8)"> </span>21+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">1</span><span style="background:var(--vt-palette-8)"> </span> 012 file 4.2 kB22+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">2</span><span style="background:var(--vt-palette-8)"> </span> README.md file 9.8 kB23+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">3</span><span style="background:var(--vt-palette-8)"> </span> demos dir 3.1 kB2424 2525 <span style="color:var(--vt-palette-2)">▌</span> <span style="color:var(--vt-palette-2)">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓</span>2626 <span style="color:var(--vt-palette-2)">▌</span> <span style="color:var(--vt-palette-8)">[</span> <span style="color:var(--vt-palette-8)">]:</span> <span style="color:var(--vt-palette-2)">┃</span> <span style="color:var(--vt-palette-5)">big</span> <span style="font-weight:bold">=</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-6)">where</span> <span style="color:var(--vt-palette-5)">size</span> <span style="font-weight:bold">&gt;</span> <span style="color:var(--vt-palette-3)">1kb</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-6)">sort-by</span> <span style="color:var(--vt-palette-2)">size</span> --reverse <span style="color:var(--vt-palette-8);font-style:italic">#</span> <span style="color:var(--vt-palette-8);font-style:italic">largest</span> <span style="color:var(--vt-palette-2)">┃</span> <span style="color:var(--vt-palette-2)">▶</span>
M e2e/testdata/screens/notebook-output-high-contrast.html +7 -7
@@ -1,12 +1,12 @@
11 <pre class="screen"><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">F</span><span style="color:#ffffff;background:#1f1f1f">ile</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">E</span><span style="color:#ffffff;background:#1f1f1f">dit</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">V</span><span style="color:#ffffff;background:#1f1f1f">iew</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">I</span><span style="color:#ffffff;background:#1f1f1f">nsert</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f">F</span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">o</span><span style="color:#ffffff;background:#1f1f1f">rmat</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">D</span><span style="color:#ffffff;background:#1f1f1f">ata</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">H</span><span style="color:#ffffff;background:#1f1f1f">elp</span><span style="background:#1f1f1f"> </span><span style="background:#40e0ff"> </span><span style="color:#000000;background:#40e0ff;font-weight:bold">OUTPUT</span><span style="background:#40e0ff"> </span>22 <span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">◀</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">Back</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">Esc</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">files</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">[1]</span><span style="color:#959595;background:#000000">,</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">full-screen</span><span style="background:#000000"> </span>3-<span style="color:#959595;background:#000000">files</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">[1]</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">5</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">rows</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">s</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">sort</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">S</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">descending</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">/</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">filter</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">Esc</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">back</span>4-<span style="background:#3a3a3a"> </span><span style="color:#000000;background:#40e0ff;font-weight:bold">name</span><span style="background:#40e0ff"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">type</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">size</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span>5-<span style="background:#40e0ff"> </span><span style="color:#000000;background:#40e0ff;font-weight:bold">1</span><span style="background:#000000"> </span><span style="color:#000000;background:#40e0ff">012</span><span style="background:#40e0ff"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>6-<span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">CLAUDE.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">1.0</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>7-<span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">3</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>8-<span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">4</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>9-<span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">5</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">go.mod</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">812</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">B</span><span style="background:#000000"> </span>3+<span style="background:#000000"> </span><span style="color:#959595;background:#000000">Output</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">of</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">files</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">──────────────────</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">Shift+arrows</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">select</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">Ctrl+C</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">copy</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">Ctrl+F</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">find</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">Esc</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">back</span><span style="background:#000000"> </span>4+<span style="background:#3a3a3a"> </span><span style="background:#40e0ff"> </span><span style="color:#000000;background:#40e0ff;font-weight:bold">name</span><span style="background:#40e0ff"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">type</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">size</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span>5+<span style="background:#40e0ff"> </span><span style="color:#000000;background:#40e0ff;font-weight:bold">1</span><span style="background:#40e0ff"> </span><span style="color:#000000;background:#40e0ff">012</span><span style="background:#40e0ff"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>6+<span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">2</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">CLAUDE.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">1.0</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>7+<span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">3</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>8+<span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">4</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>9+<span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">5</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">go.mod</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">812</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">B</span><span style="background:#000000"> </span>1010 <span style="background:#000000"> </span>1111 <span style="background:#000000"> </span>1212 <span style="background:#000000"> </span>
M e2e/testdata/screens/notebook-output-light.html +7 -7
@@ -1,12 +1,12 @@
11 <pre class="screen"> <span style="text-decoration:underline">F</span>ile <span style="text-decoration:underline">E</span>dit <span style="text-decoration:underline">V</span>iew <span style="text-decoration:underline">I</span>nsert F<span style="text-decoration:underline">o</span>rmat <span style="text-decoration:underline">D</span>ata <span style="text-decoration:underline">H</span>elp <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">OUTPUT</span><span style="background:var(--vt-palette-6)"> </span>22 ◀ Back <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Esc</span><span style="background:var(--vt-palette-7)"> </span> <span style="font-weight:bold">files</span> <span style="font-weight:bold">[1]</span><span style="color:var(--vt-palette-0)">,</span> <span style="color:var(--vt-palette-0)">full-screen</span>3-<span style="color:var(--vt-palette-0)">files</span> <span style="color:var(--vt-palette-0)">[1]</span> <span style="color:var(--vt-palette-0)">5</span> <span style="color:var(--vt-palette-0)">rows</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">s</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">sort</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">S</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">descending</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">/</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">filter</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Esc</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">back</span>4-<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">name</span><span style="background:var(--vt-palette-6)"> </span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">type</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">size</span><span style="background:var(--vt-palette-7)"> </span>5-<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">1</span> <span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">012</span><span style="background:var(--vt-palette-6)"> </span> file 4.2 kB6-<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">2</span> CLAUDE.md file 1.0 kB7-<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">3</span> README.md file 9.8 kB8-<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">4</span> demos dir 3.1 kB9-<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">5</span> go.mod file 812 B3+ <span style="color:var(--vt-palette-0)">Output</span> <span style="color:var(--vt-palette-0)">of</span> <span style="color:var(--vt-palette-0)">files</span> <span style="color:var(--vt-palette-8)">──────────────────</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Shift+arrows</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">select</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Ctrl+C</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">copy</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Ctrl+F</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">find</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Esc</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">back</span>4+<span style="background:var(--vt-palette-7)"> </span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">name</span><span style="background:var(--vt-palette-6)"> </span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">type</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">size</span><span style="background:var(--vt-palette-7)"> </span>5+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">1</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">012</span><span style="background:var(--vt-palette-6)"> </span> file 4.2 kB6+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">2</span><span style="background:var(--vt-palette-7)"> </span> CLAUDE.md file 1.0 kB7+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">3</span><span style="background:var(--vt-palette-7)"> </span> README.md file 9.8 kB8+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">4</span><span style="background:var(--vt-palette-7)"> </span> demos dir 3.1 kB9+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">5</span><span style="background:var(--vt-palette-7)"> </span> go.mod file 812 B1010 1111 1212
M e2e/testdata/screens/notebook-output.html +7 -7
@@ -1,12 +1,12 @@
11 <pre class="screen"> <span style="text-decoration:underline">F</span>ile <span style="text-decoration:underline">E</span>dit <span style="text-decoration:underline">V</span>iew <span style="text-decoration:underline">I</span>nsert F<span style="text-decoration:underline">o</span>rmat <span style="text-decoration:underline">D</span>ata <span style="text-decoration:underline">H</span>elp <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">OUTPUT</span><span style="background:var(--vt-palette-6)"> </span>22 ◀ Back <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Esc</span><span style="background:var(--vt-palette-8)"> </span> <span style="font-weight:bold">files</span> <span style="font-weight:bold">[1]</span><span style="color:var(--vt-palette-8)">,</span> <span style="color:var(--vt-palette-8)">full-screen</span>3-<span style="color:var(--vt-palette-8)">files</span> <span style="color:var(--vt-palette-8)">[1]</span> <span style="color:var(--vt-palette-8)">5</span> <span style="color:var(--vt-palette-8)">rows</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">s</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">sort</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">S</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">descending</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">/</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">filter</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Esc</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">back</span>4-<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">name</span><span style="background:var(--vt-palette-6)"> </span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">type</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">size</span><span style="background:var(--vt-palette-8)"> </span>5-<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">1</span> <span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">012</span><span style="background:var(--vt-palette-6)"> </span> file 4.2 kB6-<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">2</span> CLAUDE.md file 1.0 kB7-<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">3</span> README.md file 9.8 kB8-<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">4</span> demos dir 3.1 kB9-<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">5</span> go.mod file 812 B3+ <span style="color:var(--vt-palette-8)">Output</span> <span style="color:var(--vt-palette-8)">of</span> <span style="color:var(--vt-palette-8)">files</span> <span style="color:var(--vt-palette-8)">──────────────────</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Shift+arrows</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">select</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Ctrl+C</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">copy</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Ctrl+F</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">find</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Esc</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">back</span>4+<span style="background:var(--vt-palette-8)"> </span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">name</span><span style="background:var(--vt-palette-6)"> </span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">type</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">size</span><span style="background:var(--vt-palette-8)"> </span>5+<span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">1</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6)">012</span><span style="background:var(--vt-palette-6)"> </span> file 4.2 kB6+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">2</span><span style="background:var(--vt-palette-8)"> </span> CLAUDE.md file 1.0 kB7+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">3</span><span style="background:var(--vt-palette-8)"> </span> README.md file 9.8 kB8+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">4</span><span style="background:var(--vt-palette-8)"> </span> demos dir 3.1 kB9+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">5</span><span style="background:var(--vt-palette-8)"> </span> go.mod file 812 B1010 1111 1212
M e2e/testdata/screens/notebook-running-high-contrast.html +10 -10
@@ -4,20 +4,20 @@
44 <span style="background:#000000"> </span><span style="color:#757575;background:#000000">╭─</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">files</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">──────────────────────────────────────────────────────────────────────</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">✓</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">&lt;1s</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">─╮</span><span style="background:#000000"> </span>55 <span style="background:#000000"> </span><span style="color:#959595;background:#000000">[3]:</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ff80ff;background:#000000">files</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">=</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">ls</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">▶</span>66 <span style="background:#000000"> </span><span style="color:#757575;background:#000000">╰──────────────────────────────────────────────────────────────────────────────────────╯</span><span style="background:#000000"> </span>7-<span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[3]:</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">name</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">type</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">size</span><span style="background:#000000"> </span>8-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>9-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">CLAUDE.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">1.0</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>10-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>11-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>12-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">go.mod</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">812</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">B</span><span style="background:#000000"> </span>7+<span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[3]:</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">name</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">type</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">size</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span>8+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">1</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>9+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">2</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">CLAUDE.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">1.0</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>10+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">3</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>11+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">4</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>12+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">5</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">go.mod</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">812</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">B</span><span style="background:#000000"> </span>1313 <span style="background:#000000"> </span>1414 <span style="background:#000000"> </span><span style="color:#757575;background:#000000">╭──────────────────────────────────────────────────────────────────────────────</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">✓</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">&lt;1s</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">─╮</span><span style="background:#000000"> </span>1515 <span style="background:#000000"> </span><span style="color:#959595;background:#000000">[4]:</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ff80ff;background:#000000">$files</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">|</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">where</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">size</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">&gt;</span><span style="background:#000000"> </span><span style="color:#ffe040;background:#000000">1kb</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">▶</span>1616 <span style="background:#000000"> </span><span style="color:#757575;background:#000000">╰──────────────────────────────────────────────────────────────────────────────────────╯</span><span style="background:#000000"> </span>17-<span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[4]:</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">name</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">type</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">size</span><span style="background:#000000"> </span>18-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>19-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>20-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>17+<span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[4]:</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">name</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">type</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">size</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span>18+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">1</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>19+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">2</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>20+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">3</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>2121 <span style="background:#000000"> </span>2222 <span style="background:#000000"> </span><span style="color:#757575;background:#000000">╭────────────────────────────────────────────────────────────────────────────</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">running</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">─╮</span><span style="background:#000000"> </span>2323 <span style="background:#000000"> </span><span style="color:#959595;background:#000000">[*]:</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">sleep</span><span style="background:#000000"> </span><span style="color:#ffe040;background:#000000">10min</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">■</span>
M e2e/testdata/screens/notebook-running-light.html +10 -10
@@ -4,20 +4,20 @@
44 <span style="color:var(--vt-palette-8)">╭─</span> <span style="color:var(--vt-palette-0)">files</span> <span style="color:var(--vt-palette-8)">──────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-0)">✓</span> <span style="color:var(--vt-palette-0)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>55 <span style="color:var(--vt-palette-0)">[3]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">files</span> <span style="font-weight:bold">=</span> <span style="color:var(--vt-palette-4)">ls</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-0)">▶</span>66 <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>7- <span style="color:var(--vt-palette-0)">Out[3]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>8- 012 file 4.2 kB9- CLAUDE.md file 1.0 kB10- README.md file 9.8 kB11- demos dir 3.1 kB12- go.mod file 812 B7+ <span style="color:var(--vt-palette-0)">Out[3]:</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">name</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">type</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">size</span><span style="background:var(--vt-palette-7)"> </span>8+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">1</span><span style="background:var(--vt-palette-7)"> </span> 012 file 4.2 kB9+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">2</span><span style="background:var(--vt-palette-7)"> </span> CLAUDE.md file 1.0 kB10+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">3</span><span style="background:var(--vt-palette-7)"> </span> README.md file 9.8 kB11+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">4</span><span style="background:var(--vt-palette-7)"> </span> demos dir 3.1 kB12+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">5</span><span style="background:var(--vt-palette-7)"> </span> go.mod file 812 B1313 1414 <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-0)">✓</span> <span style="color:var(--vt-palette-0)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>1515 <span style="color:var(--vt-palette-0)">[4]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-4)">where</span> size <span style="font-weight:bold">&gt;</span> <span style="color:var(--vt-palette-1)">1kb</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-0)">▶</span>1616 <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>17- <span style="color:var(--vt-palette-0)">Out[4]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>18- 012 file 4.2 kB19- README.md file 9.8 kB20- demos dir 3.1 kB17+ <span style="color:var(--vt-palette-0)">Out[4]:</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">name</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">type</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">size</span><span style="background:var(--vt-palette-7)"> </span>18+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">1</span><span style="background:var(--vt-palette-7)"> </span> 012 file 4.2 kB19+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">2</span><span style="background:var(--vt-palette-7)"> </span> README.md file 9.8 kB20+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">3</span><span style="background:var(--vt-palette-7)"> </span> demos dir 3.1 kB2121 2222 <span style="color:var(--vt-palette-8)">╭────────────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-0)">running</span> <span style="color:var(--vt-palette-8)">─╮</span>2323 <span style="color:var(--vt-palette-0)">[*]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-4)">sleep</span> <span style="color:var(--vt-palette-1)">10min</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-0)">■</span>
M e2e/testdata/screens/notebook-running.html +10 -10
@@ -4,20 +4,20 @@
44 <span style="color:var(--vt-palette-8)">╭─</span> <span style="color:var(--vt-palette-8)">files</span> <span style="color:var(--vt-palette-8)">──────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-8)">✓</span> <span style="color:var(--vt-palette-8)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>55 <span style="color:var(--vt-palette-8)">[3]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">files</span> <span style="font-weight:bold">=</span> <span style="color:var(--vt-palette-6)">ls</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">▶</span>66 <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>7- <span style="color:var(--vt-palette-8)">Out[3]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>8- 012 file 4.2 kB9- CLAUDE.md file 1.0 kB10- README.md file 9.8 kB11- demos dir 3.1 kB12- go.mod file 812 B7+ <span style="color:var(--vt-palette-8)">Out[3]:</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">name</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">type</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">size</span><span style="background:var(--vt-palette-8)"> </span>8+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">1</span><span style="background:var(--vt-palette-8)"> </span> 012 file 4.2 kB9+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">2</span><span style="background:var(--vt-palette-8)"> </span> CLAUDE.md file 1.0 kB10+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">3</span><span style="background:var(--vt-palette-8)"> </span> README.md file 9.8 kB11+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">4</span><span style="background:var(--vt-palette-8)"> </span> demos dir 3.1 kB12+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">5</span><span style="background:var(--vt-palette-8)"> </span> go.mod file 812 B1313 1414 <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-8)">✓</span> <span style="color:var(--vt-palette-8)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>1515 <span style="color:var(--vt-palette-8)">[4]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-6)">where</span> size <span style="font-weight:bold">&gt;</span> <span style="color:var(--vt-palette-3)">1kb</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">▶</span>1616 <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>17- <span style="color:var(--vt-palette-8)">Out[4]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>18- 012 file 4.2 kB19- README.md file 9.8 kB20- demos dir 3.1 kB17+ <span style="color:var(--vt-palette-8)">Out[4]:</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">name</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">type</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">size</span><span style="background:var(--vt-palette-8)"> </span>18+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">1</span><span style="background:var(--vt-palette-8)"> </span> 012 file 4.2 kB19+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">2</span><span style="background:var(--vt-palette-8)"> </span> README.md file 9.8 kB20+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">3</span><span style="background:var(--vt-palette-8)"> </span> demos dir 3.1 kB2121 2222 <span style="color:var(--vt-palette-8)">╭────────────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-8)">running</span> <span style="color:var(--vt-palette-8)">─╮</span>2323 <span style="color:var(--vt-palette-8)">[*]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-6)">sleep</span> <span style="color:var(--vt-palette-3)">10min</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">■</span>
M e2e/testdata/screens/notebook-scroll-high-contrast.html +19 -19
@@ -1,30 +1,30 @@
11 <pre class="screen"><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">F</span><span style="color:#ffffff;background:#1f1f1f">ile</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">E</span><span style="color:#ffffff;background:#1f1f1f">dit</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">V</span><span style="color:#ffffff;background:#1f1f1f">iew</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">I</span><span style="color:#ffffff;background:#1f1f1f">nsert</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f">F</span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">o</span><span style="color:#ffffff;background:#1f1f1f">rmat</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">D</span><span style="color:#ffffff;background:#1f1f1f">ata</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">H</span><span style="color:#ffffff;background:#1f1f1f">elp</span><span style="background:#1f1f1f"> </span><span style="background:#40e0ff"> </span><span style="color:#000000;background:#40e0ff;font-weight:bold">NOTEBOOK</span><span style="background:#40e0ff"> </span>22 <span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">▶</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">Run</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">■</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">Stop</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">↻</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">Restart</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">▶▶</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">Run</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">all</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">+</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">Add</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">✂</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">Cut</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">⧉</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">Copy</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">⎘</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">Paste</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">Code</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">▾</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">nu</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">○</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">idle</span><span style="background:#000000"> </span>3-<span style="background:#000000"> </span><span style="color:#959595;background:#000000">a</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">table:</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">30</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">rows,</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">2</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">columns</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">──────────────────────────────────</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">o</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">hide</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">O</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">whole</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">G</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">to</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">a</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">sheet</span><span style="background:#000000"> </span>4-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>5-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">go.mod</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">812</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">B</span><span style="background:#000000"> </span>3+<span style="background:#000000"> </span><span style="color:#959595;background:#000000">a</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">table:</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">30</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">rows,</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">2</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">columns</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">──────────────</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">Enter</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">work</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">in</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">it</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">o</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">hide</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">O</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">whole</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">G</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">to</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">a</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">sheet</span><span style="background:#000000"> </span>4+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">4</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>5+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">5</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">go.mod</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">812</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">B</span><span style="background:#000000"> </span>66 <span style="background:#000000"> </span>77 <span style="background:#000000"> </span><span style="color:#757575;background:#000000">╭──────────────────────────────────────────────────────────────────────────────</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">✓</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">&lt;1s</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">─╮</span><span style="background:#000000"> </span>88 <span style="background:#000000"> </span><span style="color:#959595;background:#000000">[2]:</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ff80ff;background:#000000">$files</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">|</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">where</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">size</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">&gt;</span><span style="background:#000000"> </span><span style="color:#ffe040;background:#000000">1kb</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">▶</span>99 <span style="background:#000000"> </span><span style="color:#757575;background:#000000">╰──────────────────────────────────────────────────────────────────────────────────────╯</span><span style="background:#000000"> </span>10-<span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[2]:</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">name</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">type</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">size</span><span style="background:#000000"> </span>11-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>12-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>13-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>10+<span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[2]:</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">name</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">type</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">size</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span>11+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">1</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>12+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">2</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>13+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">3</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>1414 <span style="background:#000000"> </span>1515 <span style="background:#000000"> </span><span style="color:#757575;background:#000000">╭──────────────────────────────────────────────────────────────────────────────</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">✓</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">&lt;1s</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">─╮</span><span style="background:#000000"> </span>1616 <span style="background:#000000"> </span><span style="color:#959595;background:#000000">[3]:</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ffe040;background:#000000">1..30</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">|</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">each</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">{</span><span style="color:#ffffff;background:#000000;font-weight:bold">|</span><span style="color:#40e0ff;background:#000000">i</span><span style="color:#ffffff;background:#000000;font-weight:bold">|</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">{n:</span><span style="background:#000000"> </span><span style="color:#ff80ff;background:#000000">$i</span><span style="color:#ffffff;background:#000000">,</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">square:</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">(</span><span style="color:#ff80ff;background:#000000">$i</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">*</span><span style="background:#000000"> </span><span style="color:#ff80ff;background:#000000">$i</span><span style="color:#ffffff;background:#000000">)}}</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">▶</span>1717 <span style="background:#000000"> </span><span style="color:#757575;background:#000000">╰──────────────────────────────────────────────────────────────────────────────────────╯</span><span style="background:#000000"> </span>18-<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[3]:</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">n</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">square</span><span style="background:#000000"> </span>19-<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">16</span><span style="background:#000000"> </span>20-<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">5</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">25</span><span style="background:#000000"> </span>21-<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">6</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">36</span><span style="background:#000000"> </span>22-<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">7</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">49</span><span style="background:#000000"> </span>23-<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">64</span><span style="background:#000000"> </span>24-<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">81</span><span style="background:#000000"> </span>25-<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">10</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">100</span><span style="background:#000000"> </span>26-<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">11</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">121</span><span style="background:#000000"> </span>27-<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">12</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">144</span><span style="background:#000000"> </span>28-<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">13</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">169</span><span style="background:#000000"> </span>29-<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">…</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">rows</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">4</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">to</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">13</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">of</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">30</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">(O</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">shows</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">all,</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">Enter</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">opens</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">it)</span><span style="background:#000000"> </span>18+<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[3]:</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">n</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">square</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span>19+<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">4</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">16</span><span style="background:#000000"> </span>20+<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">5</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">5</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">25</span><span style="background:#000000"> </span>21+<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">6</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">6</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">36</span><span style="background:#000000"> </span>22+<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">7</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">7</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">49</span><span style="background:#000000"> </span>23+<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">8</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">64</span><span style="background:#000000"> </span>24+<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">9</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">81</span><span style="background:#000000"> </span>25+<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">10</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">10</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">100</span><span style="background:#000000"> </span>26+<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">11</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">11</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">121</span><span style="background:#000000"> </span>27+<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">12</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">12</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">144</span><span style="background:#000000"> </span>28+<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">13</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">13</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">169</span><span style="background:#000000"> </span>29+<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">…</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">rows</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">4</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">to</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">13</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">of</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">30</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">(O</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">shows</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">all,</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">Enter</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">works</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">in</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">it)</span><span style="background:#000000"> </span>3030 <span style="background:#40e0ff"> </span><span style="color:#000000;background:#40e0ff;font-weight:bold">❯</span><span style="background:#40e0ff"> </span><span style="color:#000000;background:#40e0ff;font-weight:bold">Notebook</span><span style="background:#40e0ff"> </span><span style="background:#1f1f1f"> </span><span style="color:#959595;background:#1f1f1f">+</span><span style="background:#1f1f1f"> </span><span style="color:#757575;background:#1f1f1f">│</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f">untitled</span><span style="background:#1f1f1f"> </span><span style="color:#959595;background:#1f1f1f">modified</span><span style="background:#1f1f1f"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">Ctrl+K</span><span style="background:#3a3a3a"> </span><span style="background:#1f1f1f"> </span><span style="color:#959595;background:#1f1f1f">search</span><span style="background:#1f1f1f"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">Ctrl+/</span><span style="background:#3a3a3a"> </span><span style="background:#1f1f1f"> </span><span style="color:#959595;background:#1f1f1f">shortcuts</span><span style="background:#1f1f1f"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">F10</span><span style="background:#3a3a3a"> </span><span style="background:#1f1f1f"> </span><span style="color:#959595;background:#1f1f1f">menu</span></pre>\ No newline at end of file
M e2e/testdata/screens/notebook-scroll-light.html +19 -19
@@ -1,30 +1,30 @@
11 <pre class="screen"> <span style="text-decoration:underline">F</span>ile <span style="text-decoration:underline">E</span>dit <span style="text-decoration:underline">V</span>iew <span style="text-decoration:underline">I</span>nsert F<span style="text-decoration:underline">o</span>rmat <span style="text-decoration:underline">D</span>ata <span style="text-decoration:underline">H</span>elp <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">NOTEBOOK</span><span style="background:var(--vt-palette-6)"> </span>22 ▶ Run <span style="color:var(--vt-palette-8)">■</span> <span style="color:var(--vt-palette-8)">Stop</span> ↻ Restart ▶▶ Run all <span style="color:var(--vt-palette-8)">│</span> + Add ✂ Cut ⧉ Copy <span style="color:var(--vt-palette-8)">⎘</span> <span style="color:var(--vt-palette-8)">Paste</span> <span style="color:var(--vt-palette-8)">│</span> Code ▾ <span style="color:var(--vt-palette-0)">nu</span> <span style="color:var(--vt-palette-0)">○</span> <span style="color:var(--vt-palette-0)">idle</span>3- <span style="color:var(--vt-palette-0)">a</span> <span style="color:var(--vt-palette-0)">table:</span> <span style="color:var(--vt-palette-0)">30</span> <span style="color:var(--vt-palette-0)">rows,</span> <span style="color:var(--vt-palette-0)">2</span> <span style="color:var(--vt-palette-0)">columns</span> <span style="color:var(--vt-palette-8)">──────────────────────────────────</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">o</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">hide</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">O</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">whole</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">G</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">to</span> <span style="color:var(--vt-palette-0)">a</span> <span style="color:var(--vt-palette-0)">sheet</span>4- demos dir 3.1 kB5- go.mod file 812 B3+ <span style="color:var(--vt-palette-0)">a</span> <span style="color:var(--vt-palette-0)">table:</span> <span style="color:var(--vt-palette-0)">30</span> <span style="color:var(--vt-palette-0)">rows,</span> <span style="color:var(--vt-palette-0)">2</span> <span style="color:var(--vt-palette-0)">columns</span> <span style="color:var(--vt-palette-8)">──────────────</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Enter</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">work</span> <span style="color:var(--vt-palette-0)">in</span> <span style="color:var(--vt-palette-0)">it</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">o</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">hide</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">O</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">whole</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">G</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">to</span> <span style="color:var(--vt-palette-0)">a</span> <span style="color:var(--vt-palette-0)">sheet</span>4+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">4</span><span style="background:var(--vt-palette-7)"> </span> demos dir 3.1 kB5+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">5</span><span style="background:var(--vt-palette-7)"> </span> go.mod file 812 B66 77 <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-0)">✓</span> <span style="color:var(--vt-palette-0)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>88 <span style="color:var(--vt-palette-0)">[2]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-4)">where</span> size <span style="font-weight:bold">&gt;</span> <span style="color:var(--vt-palette-1)">1kb</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-0)">▶</span>99 <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>10- <span style="color:var(--vt-palette-0)">Out[2]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>11- 012 file 4.2 kB12- README.md file 9.8 kB13- demos dir 3.1 kB10+ <span style="color:var(--vt-palette-0)">Out[2]:</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">name</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">type</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">size</span><span style="background:var(--vt-palette-7)"> </span>11+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">1</span><span style="background:var(--vt-palette-7)"> </span> 012 file 4.2 kB12+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">2</span><span style="background:var(--vt-palette-7)"> </span> README.md file 9.8 kB13+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">3</span><span style="background:var(--vt-palette-7)"> </span> demos dir 3.1 kB1414 1515 <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-0)">✓</span> <span style="color:var(--vt-palette-0)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>1616 <span style="color:var(--vt-palette-0)">[3]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-1)">1..30</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-4)">each</span> {<span style="font-weight:bold">|</span><span style="color:var(--vt-palette-4)">i</span><span style="font-weight:bold">|</span> {n: <span style="color:var(--vt-palette-5)">$i</span>, square: (<span style="color:var(--vt-palette-5)">$i</span> <span style="font-weight:bold">*</span> <span style="color:var(--vt-palette-5)">$i</span>)}} <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">▶</span>1717 <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>18-<span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-0)">Out[3]:</span> <span style="font-weight:bold;text-decoration:underline">n</span> <span style="font-weight:bold;text-decoration:underline">square</span>19-<span style="color:var(--vt-palette-4)">▌</span> 4 1620-<span style="color:var(--vt-palette-4)">▌</span> 5 2521-<span style="color:var(--vt-palette-4)">▌</span> 6 3622-<span style="color:var(--vt-palette-4)">▌</span> 7 4923-<span style="color:var(--vt-palette-4)">▌</span> 8 6424-<span style="color:var(--vt-palette-4)">▌</span> 9 8125-<span style="color:var(--vt-palette-4)">▌</span> 10 10026-<span style="color:var(--vt-palette-4)">▌</span> 11 12127-<span style="color:var(--vt-palette-4)">▌</span> 12 14428-<span style="color:var(--vt-palette-4)">▌</span> 13 16929-<span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-0)">…</span> <span style="color:var(--vt-palette-0)">rows</span> <span style="color:var(--vt-palette-0)">4</span> <span style="color:var(--vt-palette-0)">to</span> <span style="color:var(--vt-palette-0)">13</span> <span style="color:var(--vt-palette-0)">of</span> <span style="color:var(--vt-palette-0)">30</span> <span style="color:var(--vt-palette-0)">(O</span> <span style="color:var(--vt-palette-0)">shows</span> <span style="color:var(--vt-palette-0)">all,</span> <span style="color:var(--vt-palette-0)">Enter</span> <span style="color:var(--vt-palette-0)">opens</span> <span style="color:var(--vt-palette-0)">it)</span>18+<span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-0)">Out[3]:</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">n</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">square</span><span style="background:var(--vt-palette-7)"> </span>19+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">4</span><span style="background:var(--vt-palette-7)"> </span> 4 1620+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">5</span><span style="background:var(--vt-palette-7)"> </span> 5 2521+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">6</span><span style="background:var(--vt-palette-7)"> </span> 6 3622+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">7</span><span style="background:var(--vt-palette-7)"> </span> 7 4923+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">8</span><span style="background:var(--vt-palette-7)"> </span> 8 6424+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">9</span><span style="background:var(--vt-palette-7)"> </span> 9 8125+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">10</span><span style="background:var(--vt-palette-7)"> </span> 10 10026+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">11</span><span style="background:var(--vt-palette-7)"> </span> 11 12127+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">12</span><span style="background:var(--vt-palette-7)"> </span> 12 14428+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">13</span><span style="background:var(--vt-palette-7)"> </span> 13 16929+<span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-0)">…</span> <span style="color:var(--vt-palette-0)">rows</span> <span style="color:var(--vt-palette-0)">4</span> <span style="color:var(--vt-palette-0)">to</span> <span style="color:var(--vt-palette-0)">13</span> <span style="color:var(--vt-palette-0)">of</span> <span style="color:var(--vt-palette-0)">30</span> <span style="color:var(--vt-palette-0)">(O</span> <span style="color:var(--vt-palette-0)">shows</span> <span style="color:var(--vt-palette-0)">all,</span> <span style="color:var(--vt-palette-0)">Enter</span> <span style="color:var(--vt-palette-0)">works</span> <span style="color:var(--vt-palette-0)">in</span> <span style="color:var(--vt-palette-0)">it)</span>3030 <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">❯</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">Notebook</span><span style="background:var(--vt-palette-6)"> </span> <span style="color:var(--vt-palette-0)">+</span> <span style="color:var(--vt-palette-8)">│</span> untitled <span style="color:var(--vt-palette-0)">modified</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Ctrl+K</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">search</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Ctrl+/</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">shortcuts</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">F10</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">menu</span></pre>\ No newline at end of file
M e2e/testdata/screens/notebook-scroll.html +19 -19
@@ -1,30 +1,30 @@
11 <pre class="screen"> <span style="text-decoration:underline">F</span>ile <span style="text-decoration:underline">E</span>dit <span style="text-decoration:underline">V</span>iew <span style="text-decoration:underline">I</span>nsert F<span style="text-decoration:underline">o</span>rmat <span style="text-decoration:underline">D</span>ata <span style="text-decoration:underline">H</span>elp <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">NOTEBOOK</span><span style="background:var(--vt-palette-6)"> </span>22 ▶ Run <span style="color:var(--vt-palette-8)">■</span> <span style="color:var(--vt-palette-8)">Stop</span> ↻ Restart ▶▶ Run all <span style="color:var(--vt-palette-8)">│</span> + Add ✂ Cut ⧉ Copy <span style="color:var(--vt-palette-8)">⎘</span> <span style="color:var(--vt-palette-8)">Paste</span> <span style="color:var(--vt-palette-8)">│</span> Code ▾ <span style="color:var(--vt-palette-8)">nu</span> <span style="color:var(--vt-palette-8)">○</span> <span style="color:var(--vt-palette-8)">idle</span>3- <span style="color:var(--vt-palette-8)">a</span> <span style="color:var(--vt-palette-8)">table:</span> <span style="color:var(--vt-palette-8)">30</span> <span style="color:var(--vt-palette-8)">rows,</span> <span style="color:var(--vt-palette-8)">2</span> <span style="color:var(--vt-palette-8)">columns</span> <span style="color:var(--vt-palette-8)">──────────────────────────────────</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">o</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">hide</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">O</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">whole</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">G</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">to</span> <span style="color:var(--vt-palette-8)">a</span> <span style="color:var(--vt-palette-8)">sheet</span>4- demos dir 3.1 kB5- go.mod file 812 B3+ <span style="color:var(--vt-palette-8)">a</span> <span style="color:var(--vt-palette-8)">table:</span> <span style="color:var(--vt-palette-8)">30</span> <span style="color:var(--vt-palette-8)">rows,</span> <span style="color:var(--vt-palette-8)">2</span> <span style="color:var(--vt-palette-8)">columns</span> <span style="color:var(--vt-palette-8)">──────────────</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Enter</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">work</span> <span style="color:var(--vt-palette-8)">in</span> <span style="color:var(--vt-palette-8)">it</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">o</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">hide</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">O</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">whole</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">G</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">to</span> <span style="color:var(--vt-palette-8)">a</span> <span style="color:var(--vt-palette-8)">sheet</span>4+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">4</span><span style="background:var(--vt-palette-8)"> </span> demos dir 3.1 kB5+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">5</span><span style="background:var(--vt-palette-8)"> </span> go.mod file 812 B66 77 <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-8)">✓</span> <span style="color:var(--vt-palette-8)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>88 <span style="color:var(--vt-palette-8)">[2]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-6)">where</span> size <span style="font-weight:bold">&gt;</span> <span style="color:var(--vt-palette-3)">1kb</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">▶</span>99 <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>10- <span style="color:var(--vt-palette-8)">Out[2]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>11- 012 file 4.2 kB12- README.md file 9.8 kB13- demos dir 3.1 kB10+ <span style="color:var(--vt-palette-8)">Out[2]:</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">name</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">type</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">size</span><span style="background:var(--vt-palette-8)"> </span>11+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">1</span><span style="background:var(--vt-palette-8)"> </span> 012 file 4.2 kB12+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">2</span><span style="background:var(--vt-palette-8)"> </span> README.md file 9.8 kB13+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">3</span><span style="background:var(--vt-palette-8)"> </span> demos dir 3.1 kB1414 1515 <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-8)">✓</span> <span style="color:var(--vt-palette-8)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>1616 <span style="color:var(--vt-palette-8)">[3]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-3)">1..30</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-6)">each</span> {<span style="font-weight:bold">|</span><span style="color:var(--vt-palette-6)">i</span><span style="font-weight:bold">|</span> {n: <span style="color:var(--vt-palette-5)">$i</span>, square: (<span style="color:var(--vt-palette-5)">$i</span> <span style="font-weight:bold">*</span> <span style="color:var(--vt-palette-5)">$i</span>)}} <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">▶</span>1717 <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>18-<span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-8)">Out[3]:</span> <span style="font-weight:bold;text-decoration:underline">n</span> <span style="font-weight:bold;text-decoration:underline">square</span>19-<span style="color:var(--vt-palette-4)">▌</span> 4 1620-<span style="color:var(--vt-palette-4)">▌</span> 5 2521-<span style="color:var(--vt-palette-4)">▌</span> 6 3622-<span style="color:var(--vt-palette-4)">▌</span> 7 4923-<span style="color:var(--vt-palette-4)">▌</span> 8 6424-<span style="color:var(--vt-palette-4)">▌</span> 9 8125-<span style="color:var(--vt-palette-4)">▌</span> 10 10026-<span style="color:var(--vt-palette-4)">▌</span> 11 12127-<span style="color:var(--vt-palette-4)">▌</span> 12 14428-<span style="color:var(--vt-palette-4)">▌</span> 13 16929-<span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-8)">…</span> <span style="color:var(--vt-palette-8)">rows</span> <span style="color:var(--vt-palette-8)">4</span> <span style="color:var(--vt-palette-8)">to</span> <span style="color:var(--vt-palette-8)">13</span> <span style="color:var(--vt-palette-8)">of</span> <span style="color:var(--vt-palette-8)">30</span> <span style="color:var(--vt-palette-8)">(O</span> <span style="color:var(--vt-palette-8)">shows</span> <span style="color:var(--vt-palette-8)">all,</span> <span style="color:var(--vt-palette-8)">Enter</span> <span style="color:var(--vt-palette-8)">opens</span> <span style="color:var(--vt-palette-8)">it)</span>18+<span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-8)">Out[3]:</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">n</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">square</span><span style="background:var(--vt-palette-8)"> </span>19+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">4</span><span style="background:var(--vt-palette-8)"> </span> 4 1620+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">5</span><span style="background:var(--vt-palette-8)"> </span> 5 2521+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">6</span><span style="background:var(--vt-palette-8)"> </span> 6 3622+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">7</span><span style="background:var(--vt-palette-8)"> </span> 7 4923+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">8</span><span style="background:var(--vt-palette-8)"> </span> 8 6424+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">9</span><span style="background:var(--vt-palette-8)"> </span> 9 8125+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">10</span><span style="background:var(--vt-palette-8)"> </span> 10 10026+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">11</span><span style="background:var(--vt-palette-8)"> </span> 11 12127+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">12</span><span style="background:var(--vt-palette-8)"> </span> 12 14428+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">13</span><span style="background:var(--vt-palette-8)"> </span> 13 16929+<span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-8)">…</span> <span style="color:var(--vt-palette-8)">rows</span> <span style="color:var(--vt-palette-8)">4</span> <span style="color:var(--vt-palette-8)">to</span> <span style="color:var(--vt-palette-8)">13</span> <span style="color:var(--vt-palette-8)">of</span> <span style="color:var(--vt-palette-8)">30</span> <span style="color:var(--vt-palette-8)">(O</span> <span style="color:var(--vt-palette-8)">shows</span> <span style="color:var(--vt-palette-8)">all,</span> <span style="color:var(--vt-palette-8)">Enter</span> <span style="color:var(--vt-palette-8)">works</span> <span style="color:var(--vt-palette-8)">in</span> <span style="color:var(--vt-palette-8)">it)</span>3030 <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">❯</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">Notebook</span><span style="background:var(--vt-palette-6)"> </span> <span style="color:var(--vt-palette-8)">+</span> <span style="color:var(--vt-palette-8)">│</span> untitled <span style="color:var(--vt-palette-8)">modified</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Ctrl+K</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">search</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Ctrl+/</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">shortcuts</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">F10</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">menu</span></pre>\ No newline at end of file
M e2e/testdata/screens/notebook-select-high-contrast.html +10 -10
@@ -7,20 +7,20 @@
77 <span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#80a8ff;background:#000000">╭─</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">files</span><span style="background:#000000"> </span><span style="color:#80a8ff;background:#000000">──────────────────────────────────────────────────────────────────────────────────────────</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">✓</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">&lt;1s</span><span style="background:#000000"> </span><span style="color:#80a8ff;background:#000000">─╮</span><span style="background:#000000"> </span>88 <span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">[1]:</span><span style="background:#000000"> </span><span style="color:#80a8ff;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ff80ff;background:#000000">files</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">=</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">ls</span><span style="background:#000000"> </span><span style="color:#80a8ff;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#80a8ff;background:#000000">▶</span>99 <span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#80a8ff;background:#000000">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯</span><span style="background:#000000"> </span>10-<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[1]:</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">name</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">type</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">size</span><span style="background:#000000"> </span>11-<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>12-<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">CLAUDE.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">1.0</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>13-<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>14-<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>15-<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">go.mod</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">812</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">B</span><span style="background:#000000"> </span>10+<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[1]:</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">name</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">type</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">size</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span>11+<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">1</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>12+<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">2</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">CLAUDE.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">1.0</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>13+<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">3</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>14+<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">4</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>15+<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">5</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">go.mod</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">812</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">B</span><span style="background:#000000"> </span>1616 <span style="background:#000000"> </span>1717 <span style="color:#80a8ff;background:#000000">▎</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">╭──────────────────────────────────────────────────────────────────────────────────────────────────</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">✓</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">&lt;1s</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">─╮</span><span style="background:#000000"> </span>1818 <span style="color:#80a8ff;background:#000000">▎</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">[2]:</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ff80ff;background:#000000">$files</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">|</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">where</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">size</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">&gt;</span><span style="background:#000000"> </span><span style="color:#ffe040;background:#000000">1kb</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">▶</span>1919 <span style="color:#80a8ff;background:#000000">▎</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯</span><span style="background:#000000"> </span>20-<span style="color:#80a8ff;background:#000000">▎</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[2]:</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">name</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">type</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">size</span><span style="background:#000000"> </span>21-<span style="color:#80a8ff;background:#000000">▎</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>22-<span style="color:#80a8ff;background:#000000">▎</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>23-<span style="color:#80a8ff;background:#000000">▎</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>20+<span style="color:#80a8ff;background:#000000">▎</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[2]:</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">name</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">type</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">size</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span>21+<span style="color:#80a8ff;background:#000000">▎</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">1</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>22+<span style="color:#80a8ff;background:#000000">▎</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">2</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>23+<span style="color:#80a8ff;background:#000000">▎</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">3</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>2424 <span style="background:#000000"> </span>2525 <span style="background:#000000"> </span><span style="color:#757575;background:#000000">╭──────────────────────────────────────────────────────────────────────────────────────────────────────────╮</span><span style="background:#000000"> </span>2626 <span style="background:#000000"> </span><span style="color:#959595;background:#000000">[</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">]:</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">▶</span>
M e2e/testdata/screens/notebook-select-light.html +10 -10
@@ -7,20 +7,20 @@
77 <span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-4)">╭─</span> <span style="color:var(--vt-palette-0)">files</span> <span style="color:var(--vt-palette-4)">──────────────────────────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-0)">✓</span> <span style="color:var(--vt-palette-0)">&lt;1s</span> <span style="color:var(--vt-palette-4)">─╮</span>88 <span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-0)">[1]:</span> <span style="color:var(--vt-palette-4)">│</span> <span style="color:var(--vt-palette-5)">files</span> <span style="font-weight:bold">=</span> <span style="color:var(--vt-palette-4)">ls</span> <span style="color:var(--vt-palette-4)">│</span> <span style="color:var(--vt-palette-4)">▶</span>99 <span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-4)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯</span>10-<span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-0)">Out[1]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>11-<span style="color:var(--vt-palette-4)">▌</span> 012 file 4.2 kB12-<span style="color:var(--vt-palette-4)">▌</span> CLAUDE.md file 1.0 kB13-<span style="color:var(--vt-palette-4)">▌</span> README.md file 9.8 kB14-<span style="color:var(--vt-palette-4)">▌</span> demos dir 3.1 kB15-<span style="color:var(--vt-palette-4)">▌</span> go.mod file 812 B10+<span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-0)">Out[1]:</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">name</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">type</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">size</span><span style="background:var(--vt-palette-7)"> </span>11+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">1</span><span style="background:var(--vt-palette-7)"> </span> 012 file 4.2 kB12+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">2</span><span style="background:var(--vt-palette-7)"> </span> CLAUDE.md file 1.0 kB13+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">3</span><span style="background:var(--vt-palette-7)"> </span> README.md file 9.8 kB14+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">4</span><span style="background:var(--vt-palette-7)"> </span> demos dir 3.1 kB15+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">5</span><span style="background:var(--vt-palette-7)"> </span> go.mod file 812 B1616 1717 <span style="color:var(--vt-palette-4)">▎</span> <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-0)">✓</span> <span style="color:var(--vt-palette-0)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>1818 <span style="color:var(--vt-palette-4)">▎</span> <span style="color:var(--vt-palette-0)">[2]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-4)">where</span> size <span style="font-weight:bold">&gt;</span> <span style="color:var(--vt-palette-1)">1kb</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-0)">▶</span>1919 <span style="color:var(--vt-palette-4)">▎</span> <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯</span>20-<span style="color:var(--vt-palette-4)">▎</span> <span style="color:var(--vt-palette-0)">Out[2]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>21-<span style="color:var(--vt-palette-4)">▎</span> 012 file 4.2 kB22-<span style="color:var(--vt-palette-4)">▎</span> README.md file 9.8 kB23-<span style="color:var(--vt-palette-4)">▎</span> demos dir 3.1 kB20+<span style="color:var(--vt-palette-4)">▎</span> <span style="color:var(--vt-palette-0)">Out[2]:</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">name</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">type</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">size</span><span style="background:var(--vt-palette-7)"> </span>21+<span style="color:var(--vt-palette-4)">▎</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">1</span><span style="background:var(--vt-palette-7)"> </span> 012 file 4.2 kB22+<span style="color:var(--vt-palette-4)">▎</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">2</span><span style="background:var(--vt-palette-7)"> </span> README.md file 9.8 kB23+<span style="color:var(--vt-palette-4)">▎</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">3</span><span style="background:var(--vt-palette-7)"> </span> demos dir 3.1 kB2424 2525 <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────────────────────────────────────────────────────╮</span>2626 <span style="color:var(--vt-palette-0)">[</span> <span style="color:var(--vt-palette-0)">]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-0)">▶</span>
M e2e/testdata/screens/notebook-select.html +10 -10
@@ -7,20 +7,20 @@
77 <span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-4)">╭─</span> <span style="color:var(--vt-palette-8)">files</span> <span style="color:var(--vt-palette-4)">──────────────────────────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-8)">✓</span> <span style="color:var(--vt-palette-8)">&lt;1s</span> <span style="color:var(--vt-palette-4)">─╮</span>88 <span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-8)">[1]:</span> <span style="color:var(--vt-palette-4)">│</span> <span style="color:var(--vt-palette-5)">files</span> <span style="font-weight:bold">=</span> <span style="color:var(--vt-palette-6)">ls</span> <span style="color:var(--vt-palette-4)">│</span> <span style="color:var(--vt-palette-4)">▶</span>99 <span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-4)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯</span>10-<span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-8)">Out[1]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>11-<span style="color:var(--vt-palette-4)">▌</span> 012 file 4.2 kB12-<span style="color:var(--vt-palette-4)">▌</span> CLAUDE.md file 1.0 kB13-<span style="color:var(--vt-palette-4)">▌</span> README.md file 9.8 kB14-<span style="color:var(--vt-palette-4)">▌</span> demos dir 3.1 kB15-<span style="color:var(--vt-palette-4)">▌</span> go.mod file 812 B10+<span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-8)">Out[1]:</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">name</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">type</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">size</span><span style="background:var(--vt-palette-8)"> </span>11+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">1</span><span style="background:var(--vt-palette-8)"> </span> 012 file 4.2 kB12+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">2</span><span style="background:var(--vt-palette-8)"> </span> CLAUDE.md file 1.0 kB13+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">3</span><span style="background:var(--vt-palette-8)"> </span> README.md file 9.8 kB14+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">4</span><span style="background:var(--vt-palette-8)"> </span> demos dir 3.1 kB15+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">5</span><span style="background:var(--vt-palette-8)"> </span> go.mod file 812 B1616 1717 <span style="color:var(--vt-palette-4)">▎</span> <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-8)">✓</span> <span style="color:var(--vt-palette-8)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>1818 <span style="color:var(--vt-palette-4)">▎</span> <span style="color:var(--vt-palette-8)">[2]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-6)">where</span> size <span style="font-weight:bold">&gt;</span> <span style="color:var(--vt-palette-3)">1kb</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">▶</span>1919 <span style="color:var(--vt-palette-4)">▎</span> <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯</span>20-<span style="color:var(--vt-palette-4)">▎</span> <span style="color:var(--vt-palette-8)">Out[2]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>21-<span style="color:var(--vt-palette-4)">▎</span> 012 file 4.2 kB22-<span style="color:var(--vt-palette-4)">▎</span> README.md file 9.8 kB23-<span style="color:var(--vt-palette-4)">▎</span> demos dir 3.1 kB20+<span style="color:var(--vt-palette-4)">▎</span> <span style="color:var(--vt-palette-8)">Out[2]:</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">name</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">type</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">size</span><span style="background:var(--vt-palette-8)"> </span>21+<span style="color:var(--vt-palette-4)">▎</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">1</span><span style="background:var(--vt-palette-8)"> </span> 012 file 4.2 kB22+<span style="color:var(--vt-palette-4)">▎</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">2</span><span style="background:var(--vt-palette-8)"> </span> README.md file 9.8 kB23+<span style="color:var(--vt-palette-4)">▎</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">3</span><span style="background:var(--vt-palette-8)"> </span> demos dir 3.1 kB2424 2525 <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────────────────────────────────────────────────────╮</span>2626 <span style="color:var(--vt-palette-8)">[</span> <span style="color:var(--vt-palette-8)">]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">▶</span>
M e2e/testdata/screens/notebook-stale-high-contrast.html +10 -10
@@ -7,20 +7,20 @@
77 <span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#80a8ff;background:#000000">╭─</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">files</span><span style="background:#000000"> </span><span style="color:#80a8ff;background:#000000">──────────────────────────────────────────────────────────────────</span><span style="background:#000000"> </span><span style="color:#ffe040;background:#000000;font-style:italic">stale</span><span style="background:#000000"> </span><span style="color:#ffe040;background:#000000;font-style:italic">&lt;1s</span><span style="background:#000000"> </span><span style="color:#80a8ff;background:#000000">─╮</span><span style="background:#000000"> </span>88 <span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">[1]:</span><span style="background:#000000"> </span><span style="color:#80a8ff;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ff80ff;background:#000000">files</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">=</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">ls</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">|</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">first</span><span style="background:#000000"> </span><span style="color:#ffe040;background:#000000">4</span><span style="background:#000000"> </span><span style="color:#80a8ff;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#80a8ff;background:#000000">▶</span>99 <span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#80a8ff;background:#000000">╰──────────────────────────────────────────────────────────────────────────────────────╯</span><span style="background:#000000"> </span>10-<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[1]:</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">name</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">type</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">size</span><span style="background:#000000"> </span>11-<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>12-<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">CLAUDE.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">1.0</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>13-<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>14-<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>15-<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">go.mod</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">812</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">B</span><span style="background:#000000"> </span>10+<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[1]:</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">name</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">type</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">size</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span>11+<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">1</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>12+<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">2</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">CLAUDE.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">1.0</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>13+<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">3</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>14+<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">4</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>15+<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">5</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">go.mod</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">812</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">B</span><span style="background:#000000"> </span>1616 <span style="background:#000000"> </span>1717 <span style="background:#000000"> </span><span style="color:#757575;background:#000000">╭──────────────────────────────────────────────────────────────────────────</span><span style="background:#000000"> </span><span style="color:#ffe040;background:#000000;font-style:italic">stale</span><span style="background:#000000"> </span><span style="color:#ffe040;background:#000000;font-style:italic">&lt;1s</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">─╮</span><span style="background:#000000"> </span>1818 <span style="background:#000000"> </span><span style="color:#959595;background:#000000">[2]:</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ff80ff;background:#000000">$files</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">|</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">where</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">size</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">&gt;</span><span style="background:#000000"> </span><span style="color:#ffe040;background:#000000">1kb</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">▶</span>1919 <span style="background:#000000"> </span><span style="color:#757575;background:#000000">╰──────────────────────────────────────────────────────────────────────────────────────╯</span><span style="background:#000000"> </span>20-<span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[2]:</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">name</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">type</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">size</span><span style="background:#000000"> </span>21-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>22-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>23-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>20+<span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[2]:</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">name</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">type</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">size</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span>21+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">1</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>22+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">2</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>23+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">3</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>2424 <span style="background:#000000"> </span>2525 <span style="background:#000000"> </span><span style="color:#757575;background:#000000">╭──────────────────────────────────────────────────────────────────────────────────────╮</span><span style="background:#000000"> </span>2626 <span style="background:#000000"> </span><span style="color:#959595;background:#000000">[</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">]:</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">▶</span>
M e2e/testdata/screens/notebook-stale-light.html +10 -10
@@ -7,20 +7,20 @@
77 <span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-4)">╭─</span> <span style="color:var(--vt-palette-0)">files</span> <span style="color:var(--vt-palette-4)">──────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-5);font-style:italic">stale</span> <span style="color:var(--vt-palette-5);font-style:italic">&lt;1s</span> <span style="color:var(--vt-palette-4)">─╮</span>88 <span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-0)">[1]:</span> <span style="color:var(--vt-palette-4)">│</span> <span style="color:var(--vt-palette-5)">files</span> <span style="font-weight:bold">=</span> <span style="color:var(--vt-palette-4)">ls</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-4)">first</span> <span style="color:var(--vt-palette-1)">4</span> <span style="color:var(--vt-palette-4)">│</span> <span style="color:var(--vt-palette-4)">▶</span>99 <span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-4)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>10-<span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-0)">Out[1]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>11-<span style="color:var(--vt-palette-4)">▌</span> 012 file 4.2 kB12-<span style="color:var(--vt-palette-4)">▌</span> CLAUDE.md file 1.0 kB13-<span style="color:var(--vt-palette-4)">▌</span> README.md file 9.8 kB14-<span style="color:var(--vt-palette-4)">▌</span> demos dir 3.1 kB15-<span style="color:var(--vt-palette-4)">▌</span> go.mod file 812 B10+<span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-0)">Out[1]:</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">name</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">type</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">size</span><span style="background:var(--vt-palette-7)"> </span>11+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">1</span><span style="background:var(--vt-palette-7)"> </span> 012 file 4.2 kB12+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">2</span><span style="background:var(--vt-palette-7)"> </span> CLAUDE.md file 1.0 kB13+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">3</span><span style="background:var(--vt-palette-7)"> </span> README.md file 9.8 kB14+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">4</span><span style="background:var(--vt-palette-7)"> </span> demos dir 3.1 kB15+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">5</span><span style="background:var(--vt-palette-7)"> </span> go.mod file 812 B1616 1717 <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-5);font-style:italic">stale</span> <span style="color:var(--vt-palette-5);font-style:italic">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>1818 <span style="color:var(--vt-palette-0)">[2]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-4)">where</span> size <span style="font-weight:bold">&gt;</span> <span style="color:var(--vt-palette-1)">1kb</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-0)">▶</span>1919 <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>20- <span style="color:var(--vt-palette-0)">Out[2]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>21- 012 file 4.2 kB22- README.md file 9.8 kB23- demos dir 3.1 kB20+ <span style="color:var(--vt-palette-0)">Out[2]:</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">name</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">type</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">size</span><span style="background:var(--vt-palette-7)"> </span>21+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">1</span><span style="background:var(--vt-palette-7)"> </span> 012 file 4.2 kB22+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">2</span><span style="background:var(--vt-palette-7)"> </span> README.md file 9.8 kB23+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">3</span><span style="background:var(--vt-palette-7)"> </span> demos dir 3.1 kB2424 2525 <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────────────────────────────────╮</span>2626 <span style="color:var(--vt-palette-0)">[</span> <span style="color:var(--vt-palette-0)">]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-0)">▶</span>
M e2e/testdata/screens/notebook-stale.html +10 -10
@@ -7,20 +7,20 @@
77 <span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-4)">╭─</span> <span style="color:var(--vt-palette-8)">files</span> <span style="color:var(--vt-palette-4)">──────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-3);font-style:italic">stale</span> <span style="color:var(--vt-palette-3);font-style:italic">&lt;1s</span> <span style="color:var(--vt-palette-4)">─╮</span>88 <span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-8)">[1]:</span> <span style="color:var(--vt-palette-4)">│</span> <span style="color:var(--vt-palette-5)">files</span> <span style="font-weight:bold">=</span> <span style="color:var(--vt-palette-6)">ls</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-6)">first</span> <span style="color:var(--vt-palette-3)">4</span> <span style="color:var(--vt-palette-4)">│</span> <span style="color:var(--vt-palette-4)">▶</span>99 <span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-4)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>10-<span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-8)">Out[1]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>11-<span style="color:var(--vt-palette-4)">▌</span> 012 file 4.2 kB12-<span style="color:var(--vt-palette-4)">▌</span> CLAUDE.md file 1.0 kB13-<span style="color:var(--vt-palette-4)">▌</span> README.md file 9.8 kB14-<span style="color:var(--vt-palette-4)">▌</span> demos dir 3.1 kB15-<span style="color:var(--vt-palette-4)">▌</span> go.mod file 812 B10+<span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-8)">Out[1]:</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">name</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">type</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">size</span><span style="background:var(--vt-palette-8)"> </span>11+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">1</span><span style="background:var(--vt-palette-8)"> </span> 012 file 4.2 kB12+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">2</span><span style="background:var(--vt-palette-8)"> </span> CLAUDE.md file 1.0 kB13+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">3</span><span style="background:var(--vt-palette-8)"> </span> README.md file 9.8 kB14+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">4</span><span style="background:var(--vt-palette-8)"> </span> demos dir 3.1 kB15+<span style="color:var(--vt-palette-4)">▌</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">5</span><span style="background:var(--vt-palette-8)"> </span> go.mod file 812 B1616 1717 <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-3);font-style:italic">stale</span> <span style="color:var(--vt-palette-3);font-style:italic">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>1818 <span style="color:var(--vt-palette-8)">[2]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-6)">where</span> size <span style="font-weight:bold">&gt;</span> <span style="color:var(--vt-palette-3)">1kb</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">▶</span>1919 <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────────────────────────╯</span>20- <span style="color:var(--vt-palette-8)">Out[2]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>21- 012 file 4.2 kB22- README.md file 9.8 kB23- demos dir 3.1 kB20+ <span style="color:var(--vt-palette-8)">Out[2]:</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">name</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">type</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">size</span><span style="background:var(--vt-palette-8)"> </span>21+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">1</span><span style="background:var(--vt-palette-8)"> </span> 012 file 4.2 kB22+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">2</span><span style="background:var(--vt-palette-8)"> </span> README.md file 9.8 kB23+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">3</span><span style="background:var(--vt-palette-8)"> </span> demos dir 3.1 kB2424 2525 <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────────────────────────────────╮</span>2626 <span style="color:var(--vt-palette-8)">[</span> <span style="color:var(--vt-palette-8)">]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">▶</span>
M e2e/testdata/screens/notebook-wrap-high-contrast.html +10 -10
@@ -1,20 +1,20 @@
11 <pre class="screen"><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">F</span><span style="color:#ffffff;background:#1f1f1f">ile</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">E</span><span style="color:#ffffff;background:#1f1f1f">dit</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">V</span><span style="color:#ffffff;background:#1f1f1f">iew</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">I</span><span style="color:#ffffff;background:#1f1f1f">nsert</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f">F</span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">o</span><span style="color:#ffffff;background:#1f1f1f">rmat</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">D</span><span style="color:#ffffff;background:#1f1f1f">ata</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">H</span><span style="color:#ffffff;background:#1f1f1f">elp</span><span style="background:#1f1f1f"> </span><span style="background:#40e0ff"> </span><span style="color:#000000;background:#40e0ff;font-weight:bold">EDIT</span><span style="background:#40e0ff"> </span>22 <span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">▶</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">Run</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">■</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">Stop</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">↻</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">Restart</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">▶▶</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">Run</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">all</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">+</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">Add</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">✂</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">⧉</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">⎘</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">Code</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">▾</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">nu</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">○</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">idle</span><span style="background:#000000"> </span>33 <span style="color:#757575;background:#000000">────────────────────────────────────────────────────</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">Esc</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">done</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">Tab</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">complete</span><span style="background:#000000"> </span>4-<span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[1]:</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">name</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">type</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">size</span><span style="background:#000000"> </span>5-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>6-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">CLAUDE.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">1.0</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>7-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>8-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>9-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">go.mod</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">812</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">B</span><span style="background:#000000"> </span>4+<span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[1]:</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">name</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">type</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">size</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span>5+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">1</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>6+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">2</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">CLAUDE.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">1.0</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>7+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">3</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>8+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">4</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>9+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">5</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">go.mod</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">812</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">B</span><span style="background:#000000"> </span>1010 <span style="background:#000000"> </span>1111 <span style="background:#000000"> </span><span style="color:#757575;background:#000000">╭──────────────────────────────────────────────────────────</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">✓</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">&lt;1s</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">─╮</span><span style="background:#000000"> </span>1212 <span style="background:#000000"> </span><span style="color:#959595;background:#000000">[2]:</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ff80ff;background:#000000">$files</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">|</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">where</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">size</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">&gt;</span><span style="background:#000000"> </span><span style="color:#ffe040;background:#000000">1kb</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">▶</span>1313 <span style="background:#000000"> </span><span style="color:#757575;background:#000000">╰──────────────────────────────────────────────────────────────────╯</span><span style="background:#000000"> </span>14-<span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[2]:</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">name</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">type</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">size</span><span style="background:#000000"> </span>15-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>16-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>17-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>14+<span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[2]:</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">name</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">type</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">size</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span>15+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">1</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>16+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">2</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>17+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">3</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>1818 <span style="background:#000000"> </span>1919 <span style="color:#40e040;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#40e040;background:#000000">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓</span><span style="background:#000000"> </span>2020 <span style="color:#40e040;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">[</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">]:</span><span style="background:#000000"> </span><span style="color:#40e040;background:#000000">┃</span><span style="background:#000000"> </span><span style="color:#ff80ff;background:#000000">$files</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">|</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">where</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">size</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">&gt;</span><span style="background:#000000"> </span><span style="color:#ffe040;background:#000000">1kb</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">|</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">where</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">type</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">==</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#40e040;background:#000000">┃</span><span style="background:#000000"> </span><span style="color:#40e040;background:#000000">▶</span>
M e2e/testdata/screens/notebook-wrap-light.html +10 -10
@@ -1,20 +1,20 @@
11 <pre class="screen"> <span style="text-decoration:underline">F</span>ile <span style="text-decoration:underline">E</span>dit <span style="text-decoration:underline">V</span>iew <span style="text-decoration:underline">I</span>nsert F<span style="text-decoration:underline">o</span>rmat <span style="text-decoration:underline">D</span>ata <span style="text-decoration:underline">H</span>elp <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">EDIT</span><span style="background:var(--vt-palette-6)"> </span>22 ▶ Run <span style="color:var(--vt-palette-8)">■</span> <span style="color:var(--vt-palette-8)">Stop</span> ↻ Restart ▶▶ Run all <span style="color:var(--vt-palette-8)">│</span> + Add ✂ ⧉ <span style="color:var(--vt-palette-8)">⎘</span> <span style="color:var(--vt-palette-8)">│</span> Code ▾ <span style="color:var(--vt-palette-0)">nu</span> <span style="color:var(--vt-palette-0)">○</span> <span style="color:var(--vt-palette-0)">idle</span>33 <span style="color:var(--vt-palette-8)">────────────────────────────────────────────────────</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Esc</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">done</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Tab</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">complete</span>4- <span style="color:var(--vt-palette-0)">Out[1]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>5- 012 file 4.2 kB6- CLAUDE.md file 1.0 kB7- README.md file 9.8 kB8- demos dir 3.1 kB9- go.mod file 812 B4+ <span style="color:var(--vt-palette-0)">Out[1]:</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">name</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">type</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">size</span><span style="background:var(--vt-palette-7)"> </span>5+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">1</span><span style="background:var(--vt-palette-7)"> </span> 012 file 4.2 kB6+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">2</span><span style="background:var(--vt-palette-7)"> </span> CLAUDE.md file 1.0 kB7+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">3</span><span style="background:var(--vt-palette-7)"> </span> README.md file 9.8 kB8+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">4</span><span style="background:var(--vt-palette-7)"> </span> demos dir 3.1 kB9+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">5</span><span style="background:var(--vt-palette-7)"> </span> go.mod file 812 B1010 1111 <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-0)">✓</span> <span style="color:var(--vt-palette-0)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>1212 <span style="color:var(--vt-palette-0)">[2]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-4)">where</span> size <span style="font-weight:bold">&gt;</span> <span style="color:var(--vt-palette-1)">1kb</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-0)">▶</span>1313 <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────╯</span>14- <span style="color:var(--vt-palette-0)">Out[2]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>15- 012 file 4.2 kB16- README.md file 9.8 kB17- demos dir 3.1 kB14+ <span style="color:var(--vt-palette-0)">Out[2]:</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">name</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">type</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">size</span><span style="background:var(--vt-palette-7)"> </span>15+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">1</span><span style="background:var(--vt-palette-7)"> </span> 012 file 4.2 kB16+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">2</span><span style="background:var(--vt-palette-7)"> </span> README.md file 9.8 kB17+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">3</span><span style="background:var(--vt-palette-7)"> </span> demos dir 3.1 kB1818 1919 <span style="color:var(--vt-palette-2)">▌</span> <span style="color:var(--vt-palette-2)">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓</span>2020 <span style="color:var(--vt-palette-2)">▌</span> <span style="color:var(--vt-palette-0)">[</span> <span style="color:var(--vt-palette-0)">]:</span> <span style="color:var(--vt-palette-2)">┃</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-4)">where</span> size <span style="font-weight:bold">&gt;</span> <span style="color:var(--vt-palette-1)">1kb</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-4)">where</span> type <span style="font-weight:bold">==</span> file <span style="color:var(--vt-palette-2)">┃</span> <span style="color:var(--vt-palette-2)">▶</span>
M e2e/testdata/screens/notebook-wrap-narrow-high-contrast.html +8 -8
@@ -1,17 +1,17 @@
11 <pre class="screen"><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">F</span><span style="color:#ffffff;background:#1f1f1f">ile</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">E</span><span style="color:#ffffff;background:#1f1f1f">dit</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">V</span><span style="color:#ffffff;background:#1f1f1f">iew</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">I</span><span style="color:#ffffff;background:#1f1f1f">nsert</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f">F</span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">o</span><span style="color:#ffffff;background:#1f1f1f">rmat</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">D</span><span style="color:#ffffff;background:#1f1f1f">ata</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f;text-decoration:underline">H</span><span style="color:#ffffff;background:#1f1f1f">elp</span><span style="background:#1f1f1f"> </span><span style="background:#40e0ff"> </span><span style="color:#000000;background:#40e0ff;font-weight:bold">NOTEBOOK</span><span style="background:#40e0ff"> </span>22 <span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">▶</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">Run</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">■</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">Stop</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">↻</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">▶▶</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">+</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">✂</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">⧉</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">⎘</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">Code</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">▾</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">nu</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">○</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">idle</span><span style="background:#000000"> </span>33 <span style="background:#000000"> </span><span style="color:#959595;background:#000000">cell</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">4:</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">reads</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">$files</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">─────</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">Enter</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">edit</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">Shift+↑↓</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">select</span><span style="background:#000000"> </span>4-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>5-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>6-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">go.mod</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">812</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">B</span><span style="background:#000000"> </span>4+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">3</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>5+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">4</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>6+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">5</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">go.mod</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">812</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">B</span><span style="background:#000000"> </span>77 <span style="background:#000000"> </span>88 <span style="background:#000000"> </span><span style="color:#757575;background:#000000">╭──────────────────────────────────────</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">✓</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">&lt;1s</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">─╮</span><span style="background:#000000"> </span>99 <span style="background:#000000"> </span><span style="color:#959595;background:#000000">[2]:</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ff80ff;background:#000000">$files</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">|</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">where</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">size</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">&gt;</span><span style="background:#000000"> </span><span style="color:#ffe040;background:#000000">1kb</span><span style="background:#000000"> </span><span style="color:#757575;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">▶</span>1010 <span style="background:#000000"> </span><span style="color:#757575;background:#000000">╰──────────────────────────────────────────────╯</span><span style="background:#000000"> </span>11-<span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[2]:</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">name</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">type</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">size</span><span style="background:#000000"> </span>12-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>13-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>14-<span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>11+<span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[2]:</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">name</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">type</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">size</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span>12+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">1</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">012</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">4.2</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>13+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">2</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">README.md</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">9.8</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>14+<span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">3</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">demos</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">dir</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">3.1</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">kB</span><span style="background:#000000"> </span>1515 <span style="background:#000000"> </span>1616 <span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#80a8ff;background:#000000">╭──────────────────────────────────────</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">✓</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">&lt;1s</span><span style="background:#000000"> </span><span style="color:#80a8ff;background:#000000">─╮</span><span style="background:#000000"> </span>1717 <span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">[3]:</span><span style="background:#000000"> </span><span style="color:#80a8ff;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ff80ff;background:#000000">$files</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">|</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">where</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">size</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">&gt;</span><span style="background:#000000"> </span><span style="color:#ffe040;background:#000000">1kb</span><span style="background:#000000"> </span><span style="color:#80a8ff;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#80a8ff;background:#000000">▶</span>
@@ -20,5 +20,5 @@
2020 <span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#80a8ff;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">|</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">select</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">name</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">size</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">|</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">first</span><span style="background:#000000"> </span><span style="color:#ffe040;background:#000000">10</span><span style="background:#000000"> </span><span style="color:#80a8ff;background:#000000">│</span><span style="background:#000000"> </span>2121 <span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#80a8ff;background:#000000">│</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold">|</span><span style="background:#000000"> </span><span style="color:#40e0ff;background:#000000">rename</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">file</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000">bytes</span><span style="background:#000000"> </span><span style="color:#80a8ff;background:#000000">│</span><span style="background:#000000"> </span>2222 <span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#80a8ff;background:#000000">╰──────────────────────────────────────────────╯</span><span style="background:#000000"> </span>23-<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[3]:</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">name</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">type</span><span style="background:#000000"> </span><span style="color:#ffffff;background:#000000;font-weight:bold;text-decoration:underline">size</span><span style="background:#000000"> </span>23+<span style="color:#80a8ff;background:#000000">▌</span><span style="background:#000000"> </span><span style="color:#959595;background:#000000">Out[3]:</span><span style="background:#000000"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">name</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">type</span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">size</span><span style="background:#3a3a3a"> </span><span style="background:#000000"> </span>2424 <span style="background:#40e0ff"> </span><span style="color:#000000;background:#40e0ff;font-weight:bold">❯</span><span style="background:#40e0ff"> </span><span style="color:#000000;background:#40e0ff;font-weight:bold">Notebook</span><span style="background:#40e0ff"> </span><span style="background:#1f1f1f"> </span><span style="color:#959595;background:#1f1f1f">+</span><span style="background:#1f1f1f"> </span><span style="color:#757575;background:#1f1f1f">│</span><span style="background:#1f1f1f"> </span><span style="color:#ffffff;background:#1f1f1f">untitled</span><span style="background:#1f1f1f"> </span><span style="color:#959595;background:#1f1f1f">modified</span><span style="background:#1f1f1f"> </span><span style="background:#3a3a3a"> </span><span style="color:#ffffff;background:#3a3a3a">Ctrl+K</span><span style="background:#3a3a3a"> </span><span style="background:#1f1f1f"> </span><span style="color:#959595;background:#1f1f1f">search</span></pre>\ No newline at end of file
M e2e/testdata/screens/notebook-wrap-narrow-light.html +8 -8
@@ -1,17 +1,17 @@
11 <pre class="screen"> <span style="text-decoration:underline">F</span>ile <span style="text-decoration:underline">E</span>dit <span style="text-decoration:underline">V</span>iew <span style="text-decoration:underline">I</span>nsert F<span style="text-decoration:underline">o</span>rmat <span style="text-decoration:underline">D</span>ata <span style="text-decoration:underline">H</span>elp <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">NOTEBOOK</span><span style="background:var(--vt-palette-6)"> </span>22 ▶ Run <span style="color:var(--vt-palette-8)">■</span> <span style="color:var(--vt-palette-8)">Stop</span> ↻ ▶▶ <span style="color:var(--vt-palette-8)">│</span> + ✂ ⧉ <span style="color:var(--vt-palette-8)">⎘</span> <span style="color:var(--vt-palette-8)">│</span> Code ▾ <span style="color:var(--vt-palette-0)">nu</span> <span style="color:var(--vt-palette-0)">○</span> <span style="color:var(--vt-palette-0)">idle</span>33 <span style="color:var(--vt-palette-0)">cell</span> <span style="color:var(--vt-palette-0)">4:</span> <span style="color:var(--vt-palette-0)">reads</span> <span style="color:var(--vt-palette-0)">$files</span> <span style="color:var(--vt-palette-8)">─────</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Enter</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">edit</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Shift+↑↓</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">select</span>4- README.md file 9.8 kB5- demos dir 3.1 kB6- go.mod file 812 B4+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">3</span><span style="background:var(--vt-palette-7)"> </span> README.md file 9.8 kB5+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">4</span><span style="background:var(--vt-palette-7)"> </span> demos dir 3.1 kB6+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">5</span><span style="background:var(--vt-palette-7)"> </span> go.mod file 812 B77 88 <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────</span> <span style="color:var(--vt-palette-0)">✓</span> <span style="color:var(--vt-palette-0)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>99 <span style="color:var(--vt-palette-0)">[2]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-4)">where</span> size <span style="font-weight:bold">&gt;</span> <span style="color:var(--vt-palette-1)">1kb</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-0)">▶</span>1010 <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────╯</span>11- <span style="color:var(--vt-palette-0)">Out[2]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>12- 012 file 4.2 kB13- README.md file 9.8 kB14- demos dir 3.1 kB11+ <span style="color:var(--vt-palette-0)">Out[2]:</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">name</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">type</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">size</span><span style="background:var(--vt-palette-7)"> </span>12+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">1</span><span style="background:var(--vt-palette-7)"> </span> 012 file 4.2 kB13+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">2</span><span style="background:var(--vt-palette-7)"> </span> README.md file 9.8 kB14+ <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">3</span><span style="background:var(--vt-palette-7)"> </span> demos dir 3.1 kB1515 1616 <span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-4)">╭──────────────────────────────────────</span> <span style="color:var(--vt-palette-0)">✓</span> <span style="color:var(--vt-palette-0)">&lt;1s</span> <span style="color:var(--vt-palette-4)">─╮</span>1717 <span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-0)">[3]:</span> <span style="color:var(--vt-palette-4)">│</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-4)">where</span> size <span style="font-weight:bold">&gt;</span> <span style="color:var(--vt-palette-1)">1kb</span> <span style="color:var(--vt-palette-4)">│</span> <span style="color:var(--vt-palette-4)">▶</span>
@@ -20,5 +20,5 @@
2020 <span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-4)">│</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-4)">select</span> name size <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-4)">first</span> <span style="color:var(--vt-palette-1)">10</span> <span style="color:var(--vt-palette-4)">│</span>2121 <span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-4)">│</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-4)">rename</span> file bytes <span style="color:var(--vt-palette-4)">│</span>2222 <span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-4)">╰──────────────────────────────────────────────╯</span>23-<span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-0)">Out[3]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>23+<span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-0)">Out[3]:</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">name</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">type</span><span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">size</span><span style="background:var(--vt-palette-7)"> </span>2424 <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">❯</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">Notebook</span><span style="background:var(--vt-palette-6)"> </span> <span style="color:var(--vt-palette-0)">+</span> <span style="color:var(--vt-palette-8)">│</span> untitled <span style="color:var(--vt-palette-0)">modified</span> <span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)">Ctrl+K</span><span style="background:var(--vt-palette-7)"> </span> <span style="color:var(--vt-palette-0)">search</span></pre>\ No newline at end of file
M e2e/testdata/screens/notebook-wrap-narrow.html +8 -8
@@ -1,17 +1,17 @@
11 <pre class="screen"> <span style="text-decoration:underline">F</span>ile <span style="text-decoration:underline">E</span>dit <span style="text-decoration:underline">V</span>iew <span style="text-decoration:underline">I</span>nsert F<span style="text-decoration:underline">o</span>rmat <span style="text-decoration:underline">D</span>ata <span style="text-decoration:underline">H</span>elp <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">NOTEBOOK</span><span style="background:var(--vt-palette-6)"> </span>22 ▶ Run <span style="color:var(--vt-palette-8)">■</span> <span style="color:var(--vt-palette-8)">Stop</span> ↻ ▶▶ <span style="color:var(--vt-palette-8)">│</span> + ✂ ⧉ <span style="color:var(--vt-palette-8)">⎘</span> <span style="color:var(--vt-palette-8)">│</span> Code ▾ <span style="color:var(--vt-palette-8)">nu</span> <span style="color:var(--vt-palette-8)">○</span> <span style="color:var(--vt-palette-8)">idle</span>33 <span style="color:var(--vt-palette-8)">cell</span> <span style="color:var(--vt-palette-8)">4:</span> <span style="color:var(--vt-palette-8)">reads</span> <span style="color:var(--vt-palette-8)">$files</span> <span style="color:var(--vt-palette-8)">─────</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Enter</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">edit</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Shift+↑↓</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">select</span>4- README.md file 9.8 kB5- demos dir 3.1 kB6- go.mod file 812 B4+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">3</span><span style="background:var(--vt-palette-8)"> </span> README.md file 9.8 kB5+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">4</span><span style="background:var(--vt-palette-8)"> </span> demos dir 3.1 kB6+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">5</span><span style="background:var(--vt-palette-8)"> </span> go.mod file 812 B77 88 <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────</span> <span style="color:var(--vt-palette-8)">✓</span> <span style="color:var(--vt-palette-8)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>99 <span style="color:var(--vt-palette-8)">[2]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-6)">where</span> size <span style="font-weight:bold">&gt;</span> <span style="color:var(--vt-palette-3)">1kb</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">▶</span>1010 <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────╯</span>11- <span style="color:var(--vt-palette-8)">Out[2]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>12- 012 file 4.2 kB13- README.md file 9.8 kB14- demos dir 3.1 kB11+ <span style="color:var(--vt-palette-8)">Out[2]:</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">name</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">type</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">size</span><span style="background:var(--vt-palette-8)"> </span>12+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">1</span><span style="background:var(--vt-palette-8)"> </span> 012 file 4.2 kB13+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">2</span><span style="background:var(--vt-palette-8)"> </span> README.md file 9.8 kB14+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">3</span><span style="background:var(--vt-palette-8)"> </span> demos dir 3.1 kB1515 1616 <span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-4)">╭──────────────────────────────────────</span> <span style="color:var(--vt-palette-8)">✓</span> <span style="color:var(--vt-palette-8)">&lt;1s</span> <span style="color:var(--vt-palette-4)">─╮</span>1717 <span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-8)">[3]:</span> <span style="color:var(--vt-palette-4)">│</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-6)">where</span> size <span style="font-weight:bold">&gt;</span> <span style="color:var(--vt-palette-3)">1kb</span> <span style="color:var(--vt-palette-4)">│</span> <span style="color:var(--vt-palette-4)">▶</span>
@@ -20,5 +20,5 @@
2020 <span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-4)">│</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-6)">select</span> name size <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-6)">first</span> <span style="color:var(--vt-palette-3)">10</span> <span style="color:var(--vt-palette-4)">│</span>2121 <span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-4)">│</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-6)">rename</span> file bytes <span style="color:var(--vt-palette-4)">│</span>2222 <span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-4)">╰──────────────────────────────────────────────╯</span>23-<span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-8)">Out[3]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>23+<span style="color:var(--vt-palette-4)">▌</span> <span style="color:var(--vt-palette-8)">Out[3]:</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">name</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">type</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">size</span><span style="background:var(--vt-palette-8)"> </span>2424 <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">❯</span><span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">Notebook</span><span style="background:var(--vt-palette-6)"> </span> <span style="color:var(--vt-palette-8)">+</span> <span style="color:var(--vt-palette-8)">│</span> untitled <span style="color:var(--vt-palette-8)">modified</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Ctrl+K</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">search</span></pre>\ No newline at end of file
M e2e/testdata/screens/notebook-wrap.html +10 -10
@@ -1,20 +1,20 @@
11 <pre class="screen"> <span style="text-decoration:underline">F</span>ile <span style="text-decoration:underline">E</span>dit <span style="text-decoration:underline">V</span>iew <span style="text-decoration:underline">I</span>nsert F<span style="text-decoration:underline">o</span>rmat <span style="text-decoration:underline">D</span>ata <span style="text-decoration:underline">H</span>elp <span style="background:var(--vt-palette-6)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold">EDIT</span><span style="background:var(--vt-palette-6)"> </span>22 ▶ Run <span style="color:var(--vt-palette-8)">■</span> <span style="color:var(--vt-palette-8)">Stop</span> ↻ Restart ▶▶ Run all <span style="color:var(--vt-palette-8)">│</span> + Add ✂ ⧉ <span style="color:var(--vt-palette-8)">⎘</span> <span style="color:var(--vt-palette-8)">│</span> Code ▾ <span style="color:var(--vt-palette-8)">nu</span> <span style="color:var(--vt-palette-8)">○</span> <span style="color:var(--vt-palette-8)">idle</span>33 <span style="color:var(--vt-palette-8)">────────────────────────────────────────────────────</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Esc</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">done</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">Tab</span><span style="background:var(--vt-palette-8)"> </span> <span style="color:var(--vt-palette-8)">complete</span>4- <span style="color:var(--vt-palette-8)">Out[1]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>5- 012 file 4.2 kB6- CLAUDE.md file 1.0 kB7- README.md file 9.8 kB8- demos dir 3.1 kB9- go.mod file 812 B4+ <span style="color:var(--vt-palette-8)">Out[1]:</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">name</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">type</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">size</span><span style="background:var(--vt-palette-8)"> </span>5+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">1</span><span style="background:var(--vt-palette-8)"> </span> 012 file 4.2 kB6+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">2</span><span style="background:var(--vt-palette-8)"> </span> CLAUDE.md file 1.0 kB7+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">3</span><span style="background:var(--vt-palette-8)"> </span> README.md file 9.8 kB8+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">4</span><span style="background:var(--vt-palette-8)"> </span> demos dir 3.1 kB9+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">5</span><span style="background:var(--vt-palette-8)"> </span> go.mod file 812 B1010 1111 <span style="color:var(--vt-palette-8)">╭──────────────────────────────────────────────────────────</span> <span style="color:var(--vt-palette-8)">✓</span> <span style="color:var(--vt-palette-8)">&lt;1s</span> <span style="color:var(--vt-palette-8)">─╮</span>1212 <span style="color:var(--vt-palette-8)">[2]:</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-6)">where</span> size <span style="font-weight:bold">&gt;</span> <span style="color:var(--vt-palette-3)">1kb</span> <span style="color:var(--vt-palette-8)">│</span> <span style="color:var(--vt-palette-8)">▶</span>1313 <span style="color:var(--vt-palette-8)">╰──────────────────────────────────────────────────────────────────╯</span>14- <span style="color:var(--vt-palette-8)">Out[2]:</span> <span style="font-weight:bold;text-decoration:underline">name</span> <span style="font-weight:bold;text-decoration:underline">type</span> <span style="font-weight:bold;text-decoration:underline">size</span>15- 012 file 4.2 kB16- README.md file 9.8 kB17- demos dir 3.1 kB14+ <span style="color:var(--vt-palette-8)">Out[2]:</span> <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">name</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">type</span><span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">size</span><span style="background:var(--vt-palette-8)"> </span>15+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">1</span><span style="background:var(--vt-palette-8)"> </span> 012 file 4.2 kB16+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">2</span><span style="background:var(--vt-palette-8)"> </span> README.md file 9.8 kB17+ <span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)">3</span><span style="background:var(--vt-palette-8)"> </span> demos dir 3.1 kB1818 1919 <span style="color:var(--vt-palette-2)">▌</span> <span style="color:var(--vt-palette-2)">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓</span>2020 <span style="color:var(--vt-palette-2)">▌</span> <span style="color:var(--vt-palette-8)">[</span> <span style="color:var(--vt-palette-8)">]:</span> <span style="color:var(--vt-palette-2)">┃</span> <span style="color:var(--vt-palette-5)">$files</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-6)">where</span> size <span style="font-weight:bold">&gt;</span> <span style="color:var(--vt-palette-3)">1kb</span> <span style="font-weight:bold">|</span> <span style="color:var(--vt-palette-6)">where</span> type <span style="font-weight:bold">==</span> file <span style="color:var(--vt-palette-2)">┃</span> <span style="color:var(--vt-palette-2)">▶</span>
M internal/numfmt/size.go +12 -11
@@ -13,8 +13,10 @@ var sizeUnits = []string{"B", "kB", "MB", "GB", "TB", "PB", "EB"}
1313 1414 // Size shows v bytes as nushell shows a file size: whole bytes below1515 // 1000 ("512 B"), and above that dec decimals of the largest unit, a16-// thousand times apart, that keeps the number under 1000 once rounded17-// ("1.6 kB", "1.0 MB"). Negative sizes show a minus sign.16+// thousand times apart, that keeps the number under 1000. Like nushell,17+// it cuts the digits past dec rather than rounding them, so 2998 bytes18+// is "2.9 kB", never a unit it hasn't reached. Negative sizes show a19+// minus sign.1820 func Size(v float64, dec int) string { return SizeIn(v, dec, locale.Canonical) }1921 2022 // SizeIn is Size as shown in loc: 1,6 kB in de-DE.
@@ -27,23 +29,22 @@ func SizeIn(v float64, dec int, loc *locale.Locale) string {
2729 return sign + "∞ B"2830 }2931 unit := 030- for unit < len(sizeUnits)-1 && roundTo(v, 0) >= 1000 {31- v /= 100032- unit++33- }34- if unit > 0 && roundTo(v, dec) >= 1000 && unit < len(sizeUnits)-1 {32+ for unit < len(sizeUnits)-1 && v >= 1000 {3533 v /= 10003634 unit++3735 }3836 pat := "0"3937 if unit > 0 && dec > 0 {4038 pat += "." + strings.Repeat("0", dec)39+ } else {40+ dec = 04141 }42- return sign + FormatIn(v, pat, loc) + " " + sizeUnits[unit]42+ return sign + FormatIn(truncTo(v, dec), pat, loc) + " " + sizeUnits[unit]4343 }4444 45-// roundTo rounds v to dec decimals, halves away from zero.46-func roundTo(v float64, dec int) float64 {45+// truncTo cuts v to dec decimals. The nudge keeps a value that is46+// exactly on a digit, such as 1.6 held as 1.5999999, from losing it.47+func truncTo(v float64, dec int) float64 {4748 p := math.Pow10(dec)48- return math.Round(v*p) / p49+ return math.Trunc(v*p*(1+1e-12)) / p4950 }
M internal/numfmt/size_test.go +8 -4
M internal/ui/commands.go +20 -5
M internal/ui/context.go +2 -2
M internal/ui/crash.go +4 -4
M internal/ui/crash_test.go +6 -1
M internal/ui/filter.go +12 -7
@@ -9,6 +9,7 @@ import (
99 "strings"1010 1111 tea "charm.land/bubbletea/v2"12+ "github.com/charmbracelet/x/ansi"1213 1314 "github.com/FelineStateMachine/012/internal/sheet"1415 "github.com/FelineStateMachine/012/internal/ui/filterpick"
@@ -49,9 +50,12 @@ func init() {
4950 // createFilter filters the selection, or the data around the active cell.5051 func (m *Model) createFilter() tea.Cmd {5152 r := m.dataRange()53+ if m.out != nil {54+ r = m.out.table() // an output's grid filters the whole table, under its header55+ }5256 m.sheet.CreateFilter(r)5357 m.changed = true54- m.note = "Created a filter on " + r.String() + " " + m.th.KeyHints(m.shortcut("data.filter_column"), "filter the active column")58+ m.note = "Created a filter on " + m.rangeLabel(r) + " " + m.th.KeyHints(m.shortcut("data.filter_column"), "filter the active column")5559 return nil5660 }5761
@@ -100,12 +104,13 @@ func (g *grid) filterMark(c int) (string, bool) {
100104 101105 // filterButtonX is the screen x of column c's filter button, or -1.102106 func (g *grid) filterButtonX(c int) int {103- name := sheet.ColName(c)104107 w := g.sheet.ColWidth(c)105- if mark, _ := g.filterMark(c); mark == "" || w < len(name)+3 {108+ mark, _ := g.filterMark(c)109+ name := g.colLabel(c, w, 2)110+ if mark == "" || w < ansi.StringWidth(name)+3 {106111 return -1107112 }108- lw := len(name) + 2113+ lw := ansi.StringWidth(name) + 2109114 return g.colStart(c) + (w-lw)/2 + lw - 1110115 }111116
@@ -115,8 +120,8 @@ func (m *Model) openFilterPicker(col int) *filterpick.Picker {
115120 if !on || col < r.From.Col || col > r.To.Col {116121 return nil117122 }118- title := "Filter " + sheet.ColName(col)119- if h := m.sheet.LocalText(sheet.Addr{Col: col, Row: r.From.Row}); h != "" {123+ title := "Filter " + m.colName(col)124+ if h := m.sheet.LocalText(sheet.Addr{Col: col, Row: r.From.Row}); h != "" && !m.named {120125 title += " " + h121126 }122127 return m.openValuesPicker(title, m.colStart(col), m.sheet.FilterValues(col), m.sheet.Filter().Cols[col].Cond,
@@ -181,7 +186,7 @@ func (m *Model) filterColumn(col int, cr sheet.Criteria) {
181186 span.End(slog.Int("hidden", m.sheet.HiddenRows()))182187 m.changed = true183188 if n := m.sheet.HiddenRows(); n > 0 {184- m.note = "Filtered column " + sheet.ColName(col) + ": " + rowCount(n) + " hidden"189+ m.note = "Filtered column " + m.colName(col) + ": " + rowCount(n) + " hidden"185190 } else {186191 m.note = "The filter shows every row"187192 }
M internal/ui/format_test.go +1 -1
M internal/ui/grid.go +5 -0
M internal/ui/gridlines.go +3 -0
M internal/ui/menuoverlay.go +2 -2
M internal/ui/model.go +6 -0
M internal/ui/monochrome_test.go +10 -7
@@ -208,10 +208,11 @@ func cellsOf(l []monoCell, text string) []monoCell {
208208 209209 // A notebook's states read without color: the active cell marked by ▌210210 // at its left, the other cells selected with it by ▎, the cell being211-// edited in a heavy box, the mode in words, an output table's header212-// bold and underlined, a stale output and a failure in words.211+// edited in a heavy box, the mode in words, an output's grid entered by212+// its bar, OUTPUT and its pointer, a stale output and a failure in words.213213 func TestMonochromeNotebook(t *testing.T) {214214 m, nu := notebookModel(t, map[string]string{"ls": lsOut, "$files | first": "{name: a.txt}"})215+ m.height = 30215216 write(t, m, "files = ls")216217 write(t, m, "$files | first")217218 write(t, m, "nope")
@@ -225,12 +226,14 @@ func TestMonochromeNotebook(t *testing.T) {
225226 if bar("[1]:") != "▎" || bar("[2]:") != "▎" || bar("[3]:") != "▌" {226227 t.Errorf("the cells selected: %q %q %q", bar("[1]:"), bar("[2]:"), bar("[3]:"))227228 }228- press(t, m, "<home>")229- hdr := findLine(t, m, "name")230- if c := cellsOf(hdr, "name"); !every(c, true, func(c monoCell) bool { return c.bold && c.underline == "1" }) {231- t.Errorf("an output's header: %+v", c)229+ press(t, m, "<home>", "<down>", "<enter>")230+ if c := cellsOf(findLine(t, m, "a.txt"), "a.txt"); !every(c, true, isReverse) {231+ t.Errorf("the active cell of an output's grid: %+v", c)232+ }233+ if !strings.Contains(cellText(monoLine(m, menuLine)), " OUTPUT ") || bar("1 a.txt") != "▌" {234+ t.Error("working in an output isn't in words")232235 }233- press(t, m, "<end>")236+ press(t, m, "<esc>", "<end>")234237 if !strings.Contains(cellText(findLine(t, m, "× Command")), "× Command `nope` not found") {235238 t.Error("the failure isn't in words")236239 }
M internal/ui/mouse.go +2 -2
M internal/ui/nbcommands.go +6 -2
A internal/ui/nbgrid.go +287 -0
@@ -0,0 +1,287 @@
1+package ui2+3+import (4+ "bytes"5+ "context"6+ "slices"7+ "strconv"8+9+ "github.com/charmbracelet/x/ansi"10+11+ "github.com/FelineStateMachine/012/internal/fileio"12+ "github.com/FelineStateMachine/012/internal/sheet"13+ "github.com/FelineStateMachine/012/internal/ui/nbview"14+)15+16+// A notebook cell's table or record output is drawn and worked as 012's17+// own grid. Each such output gets a Model of its own, the grid's child,18+// over a workbook of one sheet holding the output as importing its NUON19+// makes it (as sending it to a sheet does): the header row, frozen, then20+// the rows, each value in the format of its type, the columns fitted.21+// The output's window shows the child's column header, named after the22+// table's columns rather than lettered, and its rows under the header,23+// numbered from 1; the child draws them with the grid's own code24+// (view.go), so borders, formats, the pointer, the selection, the copy25+// marker and search matches look as on a sheet. While the output is26+// entered, keys, the mouse and commands go to the child (nbgridin.go),27+// which refuses anything that would change a value: sorting, filtering,28+// finding, selecting, copying and resizing columns act on its copy, and29+// the output itself never changes.30+31+// outGrids are the outputs drawn as grids, and the one entered.32+type outGrids struct {33+ in *outGrid // the grid with the keys, or nil34+}35+36+// outGrid is an output's grid.37+type outGrid struct {38+ parent *Model39+ id int // the cell's40+ data []byte // the output as a table, NUON (nbview.Host.Grid)41+ rows int // its rows, until the child counts them42+ child *Model // made the first time the grid is drawn43+ err string // why the output couldn't be read as a table44+ cols int // the table's columns45+ // win is the rows the window shows, as last drawn, which the child46+ // is sized to.47+ win int48+ // shown are the rows showing when a filter hides some, for the49+ // sheet's version shownAt; nil when every row shows.50+ shown []int51+ shownAt uint6452+ // frame is the parent's frame the child last drew for.53+ frame int54+}55+56+var _ nbview.Grid = (*outGrid)(nil)57+58+// Grid makes cell id's output a grid (nbview.Host).59+func (h nbHost) Grid(id int, data []byte, rows int) nbview.Grid {60+ return &outGrid{parent: h.m, id: id, data: data, rows: rows}61+}62+63+// ready makes the child if it isn't yet, and sizes it to a window of64+// rows rows width wide: reports false if the output isn't a table.65+func (g *outGrid) ready(width, rows int) bool {66+ if g.child == nil && g.err == "" {67+ g.build()68+ }69+ if g.child == nil {70+ return false71+ }72+ c := g.child73+ if f := g.parent.nb.frame; g.frame != f {74+ g.frame = f75+ c.th = g.parent.th76+ clear(c.painted)77+ clear(c.mergeLines)78+ clear(c.shaded)79+ }80+ // An output shown whole draws its rows one at a time wherever they81+ // are, so the child needn't be taller than a screen.82+ g.win = min(max(rows, 1), maxWin)83+ // The frozen header and its divider take two of the child's lines,84+ // and at least two rows keep the header frozen (grid.frozen).85+ c.width, c.height = width, gridTop+max(g.win, 2)+2+186+ c.clampView()87+ return true88+}89+90+// build reads the output into the child's workbook.91+func (g *outGrid) build() {92+ res, err := fileio.ImportReader(context.Background(), "nu", bytes.NewReader(g.data), fileio.Options{})93+ if err != nil {94+ g.err = err.Error()95+ return96+ }97+ s := res.Sheet98+ s.Book().SetLocale(g.parent.book().LocaleTag())99+ s.LoadFrozen(1, 0)100+ s.LoadFitWidths()101+ s.ClearHistory()102+ used, _ := s.UsedRange()103+ g.cols, g.rows = used.To.Col+1, used.To.Row104+ c := New(s, "")105+ c.out, c.named = g, true106+ c.th = g.parent.th107+ c.prefs = g.parent.prefs108+ c.prefs.vim = false // vim's keys edit cells, and an output's are read-only109+ c.term = terminal{} // no images: its sheet has no charts, and the program draws the screen110+ c.cur, c.top = sheet.Addr{Row: 1}, 1111+ g.child = c112+}113+114+// table is the table on the child's sheet, its header row included.115+func (g *outGrid) table() sheet.Rect {116+ return sheet.Rect{To: sheet.Addr{Col: max(g.cols-1, 0), Row: max(g.rows, 1)}}117+}118+119+// Rows is how many rows show: those the filter keeps.120+func (g *outGrid) Rows() int {121+ if g.child == nil {122+ return g.rows123+ }124+ if s := g.child.sheet; s.HiddenRows() > 0 {125+ return len(g.shownRows())126+ }127+ return g.rows128+}129+130+// shownRows are the rows a filter keeps, worked out once for each131+// version of the sheet.132+func (g *outGrid) shownRows() []int {133+ s := g.child.sheet134+ if g.shown != nil && g.shownAt == s.Version() {135+ return g.shown136+ }137+ g.shown = g.shown[:0]138+ for r := 1; r <= g.rows; r++ {139+ if !s.RowHidden(r) {140+ g.shown = append(g.shown, r)141+ }142+ }143+ g.shownAt = s.Version()144+ return g.shown145+}146+147+// row is the sheet row of the i-th row showing.148+func (g *outGrid) row(i int) (int, bool) {149+ if i < 0 || i >= g.Rows() {150+ return 0, false151+ }152+ if g.child == nil || g.child.sheet.HiddenRows() == 0 {153+ return i + 1, true154+ }155+ return g.shownRows()[i], true156+}157+158+// index is where sheet row r is among the rows showing: the first159+// showing at or after it.160+func (g *outGrid) index(r int) int {161+ if g.child == nil || g.child.sheet.HiddenRows() == 0 {162+ return max(r-1, 0)163+ }164+ i, _ := slices.BinarySearch(g.shownRows(), r)165+ return i166+}167+168+// Top is the first row the window shows.169+func (g *outGrid) Top() int {170+ if g.child == nil {171+ return 0172+ }173+ return min(g.index(g.child.top), max(g.Rows()-g.win, 0))174+}175+176+// Scroll scrolls the window d rows, reporting whether it moved.177+func (g *outGrid) Scroll(d int) bool {178+ if g.child == nil && !g.ready(g.parent.nbGridWidth(), 10) {179+ return false180+ }181+ top := g.Top()182+ to := min(max(top+d, 0), max(g.Rows()-g.win, 0))183+ if to == top {184+ return false185+ }186+ r, _ := g.row(to)187+ g.child.top = r188+ return true189+}190+191+// Line draws line i of the window: the column header, or a row.192+func (g *outGrid) Line(i, from, rows, width int) string {193+ if !g.ready(width, rows) {194+ if i == 0 {195+ return g.parent.th.Warning.Render(ansi.Truncate("The output isn't a table: "+g.err, width, "…"))196+ }197+ return ""198+ }199+ c := g.child200+ if rows > g.win {201+ // Shown whole: the row numbers are as wide as the last one's,202+ // which the child measures from its top.203+ top := c.top204+ c.top, _ = g.row(max(g.Rows()-g.win, 0))205+ defer func() { c.top = top }()206+ }207+ var line string208+ if i == 0 {209+ line = c.headerRow()210+ } else {211+ r, ok := g.row(from + i - 1)212+ if !ok {213+ return ""214+ }215+ line = c.gridRow(r)216+ }217+ return ansi.Truncate(line, min(width, g.right()), "")218+}219+220+// maxWin is the most rows the child is sized to show.221+const maxWin = 500222+223+// right is where the table's last column ends on the child's screen:224+// nothing is drawn past it.225+func (g *outGrid) right() int {226+ c := g.child227+ if g.cols <= c.left {228+ return c.width229+ }230+ return c.colStart(g.cols)231+}232+233+// Hidden is how many columns don't show whole at width.234+func (g *outGrid) Hidden(width int) int {235+ if !g.ready(width, g.win) {236+ return 0237+ }238+ c := g.child239+ shown := 0240+ for col := c.left; col < g.cols && c.colStart(col)+c.sheet.ColWidth(col) <= width; col++ {241+ shown++242+ }243+ return g.cols - shown244+}245+246+// Entered reports whether the grid has the keys.247+func (g *outGrid) Entered() bool { return g.parent.nb.out.in == g }248+249+// unfocused reports whether m is an output's grid without the keys,250+// which draws neither its active cell nor its selection.251+func (m *Model) unfocused() bool { return m.out != nil && !m.out.Entered() }252+253+// colLabel is column c's name in the column header, w wide: its letters,254+// or on an output's grid the table's name for it, cut to fit beside255+// room more columns (a filter's button).256+func (g *grid) colLabel(c, w, room int) string {257+ if !g.named {258+ return sheet.ColName(c)259+ }260+ return ansi.Truncate(g.colName(c), max(w-2-room, 1), "…")261+}262+263+// colName names column c in messages: its letters, or the table's name264+// for it on an output's grid.265+func (g *grid) colName(c int) string {266+ if !g.named {267+ return sheet.ColName(c)268+ }269+ return g.sheet.ShownText(sheet.Addr{Col: c})270+}271+272+// rowLabel is row r's number: on an output's grid, counted from the273+// first row under the header.274+func (g *grid) rowLabel(r int) string {275+ if g.named {276+ return strconv.Itoa(r)277+ }278+ return strconv.Itoa(r + 1)279+}280+281+// nbGridWidth is how wide the notebook shown draws outputs' grids.282+func (m *Model) nbGridWidth() int {283+ if v := m.nbView(); v != nil {284+ return v.GridWidth()285+ }286+ return m.width287+}
A internal/ui/nbgrid_test.go +200 -0
@@ -0,0 +1,200 @@
1+package ui2+3+import (4+ "fmt"5+ "strings"6+ "testing"7+8+ tea "charm.land/bubbletea/v2"9+10+ "github.com/FelineStateMachine/012/internal/notebook"11+ "github.com/FelineStateMachine/012/internal/sheet"12+)13+14+// bigTable is an output of n rows of four columns, as nu prints it.15+func bigTable(n int) string {16+ var b strings.Builder17+ b.WriteString("[[name, size, when, ok]; ")18+ for i := range n {19+ fmt.Fprintf(&b, "[file%d.txt, %dkb, 2026-09-%02dT10:00:00Z, true], ", i, i%900, i%28+1)20+ }21+ b.WriteString("[last, 1b, 2026-09-01T00:00:00Z, false]]")22+ return b.String()23+}24+25+// outputModel is a notebook of one cell named files whose output is26+// out, w by h, the output selected.27+func outputModel(out string, w, h int) *Model {28+ m := sized(sheet.New(), w, h)29+ m.OpenNotebook()30+ id := m.book().NewCellID()31+ m.sheet.SetNotebookCells("cells", []notebook.Cell{{ID: id, Source: "files = ls"}})32+ m.book().SetOutput(id, &notebook.Output{NUON: []byte(out), Count: 1})33+ m.nbView().Select(0, true)34+ return m35+}36+37+// entered is a notebook with lsOut's output, its grid entered.38+func entered(t *testing.T) (*Model, *outGrid) {39+ t.Helper()40+ m := outputModel(lsOut, 80, 24)41+ press(t, m, "<enter>")42+ g := m.gridIn()43+ if g == nil {44+ t.Fatalf("Enter didn't enter the output:\n%s", screen(m))45+ }46+ return m, g47+}48+49+func TestOutputGridLooks(t *testing.T) {50+ m := outputModel(lsOut, 80, 24)51+ s := screen(m)52+ for _, want := range []string{"Out[1]: name size", "1 a.txt 2.0 kB", "3 c.txt 5.0 kB"} {53+ if !strings.Contains(s, want) {54+ t.Errorf("lacks %q:\n%s", want, s)55+ }56+ }57+ if strings.Contains(s, " A ") || strings.Contains(s, " C ") {58+ t.Errorf("the columns are lettered, or drawn past the table:\n%s", s)59+ }60+ rec := outputModel("{name: a.txt, size: 2kb}", 80, 24)61+ if s := screen(rec); !strings.Contains(s, "field value") || !strings.Contains(s, "2 size 2.0 kB") {62+ t.Errorf("a record's grid:\n%s", s)63+ }64+ if strings.Contains(line(m, menuLine), "OUTPUT") {65+ t.Error("selecting the output entered it")66+ }67+}68+69+func TestOutputGridSelectsAndCopies(t *testing.T) {70+ m, g := entered(t)71+ if !strings.Contains(line(m, menuLine), "OUTPUT") {72+ t.Errorf("mode: %q", line(m, menuLine))73+ }74+ press(t, m, "<down>", "<shift+right>", "<shift+down>")75+ if got := g.child.selection(); got.String() != "A3:B4" {76+ t.Errorf("selected %s", got)77+ }78+ if st := line(m, m.height-1); !strings.Contains(st, "name to size, rows 2 to 3") || !strings.Contains(st, "Count 4") {79+ t.Errorf("status: %q", st)80+ }81+ _, cmd := m.Update(tea.KeyPressMsg{Code: 'c', Mod: tea.ModCtrl})82+ if got := fmt.Sprint(cmd()); !strings.Contains(got, "b.txt\t10\nc.txt\t5000") {83+ t.Errorf("the system clipboard: %q", got)84+ }85+ // Ctrl+V on a sheet pastes what was copied, formats and all.86+ press(t, m, "<esc>", "<esc>")87+ run(m, m.runCommand("sheet.new"))88+ press(t, m, "<ctrl+v>")89+ if got := m.sheet.ShownText(addr("B2")); got != "5.0 kB" {90+ t.Errorf("pasted %q", got)91+ }92+}93+94+func TestOutputGridSortsFiltersFinds(t *testing.T) {95+ m, g := entered(t)96+ press(t, m, "<right>")97+ run(m, m.runCommand("data.sort_sheet_za"))98+ if got := line(m, 7); !strings.Contains(got, "1 c.txt") {99+ t.Errorf("sorted by size, Z to A:\n%s", screen(m))100+ }101+ if !strings.Contains(string(m.book().Output(m.sheet.NotebookCells()[0].ID).NUON), "a.txt, 2kb") {102+ t.Error("sorting changed the output")103+ }104+ press(t, m, "<ctrl+z>")105+ if got := line(m, 7); !strings.Contains(got, "1 a.txt") {106+ t.Errorf("undo takes back the sort:\n%s", screen(m))107+ }108+ run(m, m.runCommand("data.filter"))109+ var hide []string110+ for _, v := range g.child.sheet.FilterValues(1) {111+ if v.Label != "10 B" {112+ hide = append(hide, v.Text)113+ }114+ }115+ g.child.sheet.FilterColumn(1, sheet.Criteria{Hidden: hide})116+ if s := screen(m); !strings.Contains(s, "2 b.txt") || strings.Contains(s, "a.txt") {117+ t.Errorf("filtered to 10 B:\n%s", s)118+ }119+ run(m, m.runCommand("data.filter_remove"))120+ press(t, m, "<ctrl+f>", "c.t")121+ if !strings.Contains(line(m, menuLine), "FIND") || g.child.cur != addr("A4") {122+ t.Errorf("find: %s at %s\n%s", line(m, menuLine), g.child.cur, screen(m))123+ }124+}125+126+func TestOutputGridRefusesEdits(t *testing.T) {127+ m, g := entered(t)128+ press(t, m, "x")129+ if !strings.Contains(line(m, contextLine), "can't be changed") || g.child.mode != modeReady {130+ t.Errorf("typing: %q", line(m, contextLine))131+ }132+ press(t, m, "<delete>")133+ run(m, m.runCommand("format.bold"))134+ if got := g.child.sheet.ShownText(addr("A2")); got != "a.txt" || g.child.sheet.CellStyle(addr("A2")).Bold {135+ t.Errorf("the output changed: %q", got)136+ }137+ if commands["clear"].available(m) || !commands["data.sort_sheet_az"].available(m) {138+ t.Error("the menus offer what the grid refuses")139+ }140+}141+142+func TestOutputGridFullScreenAndBack(t *testing.T) {143+ m, g := entered(t)144+ press(t, m, "<enter>")145+ if !m.nbView().FullOpen() || !strings.HasPrefix(strings.TrimSpace(line(m, nbBody)), "name") {146+ t.Fatalf("Enter didn't show the grid full-screen:\n%s", screen(m))147+ }148+ press(t, m, "<esc>")149+ if m.nbView().FullOpen() || m.gridIn() != g {150+ t.Error("Esc from full-screen left the grid")151+ }152+ press(t, m, "<esc>")153+ if m.gridIn() != nil || !strings.Contains(line(m, menuLine), "NOTEBOOK") {154+ t.Error("Esc didn't leave the grid")155+ }156+}157+158+func TestOutputGridMouse(t *testing.T) {159+ m := outputModel(lsOut, 80, 24)160+ y := strings.Count(screen(m)[:strings.Index(screen(m), "b.txt")], "\n")161+ x := screenX(t, m, y, "b.txt")162+ send(m, tea.MouseClickMsg{X: x, Y: y, Button: tea.MouseLeft})163+ send(m, tea.MouseReleaseMsg{X: x, Y: y, Button: tea.MouseLeft})164+ g := m.gridIn()165+ if g == nil || g.child.cur != addr("A3") {166+ t.Fatalf("a click didn't enter the grid at b.txt:\n%s", screen(m))167+ }168+ // Drag the border right of name to widen it.169+ w := g.child.sheet.ColWidth(0)170+ bx := x + w - 2171+ send(m, tea.MouseClickMsg{X: bx, Y: y - 2, Button: tea.MouseLeft})172+ send(m, tea.MouseMotionMsg{X: bx + 4, Y: y - 2, Button: tea.MouseLeft})173+ send(m, tea.MouseReleaseMsg{X: bx + 4, Y: y - 2, Button: tea.MouseLeft})174+ if got := g.child.sheet.ColWidth(0); got != w+4 {175+ t.Errorf("the column is %d wide, was %d", got, w)176+ }177+}178+179+func TestOutputGridChartsOnASheet(t *testing.T) {180+ m, _ := entered(t)181+ run(m, m.runCommand("insert.chart"))182+ if m.sheet.IsNotebook() || m.sheet.Name() != "files" || !strings.Contains(line(m, menuLine), "CHART") {183+ t.Fatalf("the chart isn't on the output's sheet:\n%s", screen(m))184+ }185+ if _, r, ok := m.book().Region("files"); !ok || !r.Output {186+ t.Error("the output wasn't sent to the sheet")187+ }188+}189+190+// A long output scrolls in its window and jumps to its end.191+func TestOutputGridLong(t *testing.T) {192+ if testing.Short() {193+ t.Skip("reads 100,000 rows")194+ }195+ m := outputModel(bigTable(100000), 120, 40)196+ press(t, m, "<enter>", "<ctrl+down>")197+ if s := screen(m); !strings.Contains(s, "100001 last") || !strings.Contains(s, "rows 99,992 to 100,001 of 100,001") {198+ t.Errorf("the end:\n%s", s)199+ }200+}
A internal/ui/nbgridcmd.go +215 -0
@@ -0,0 +1,215 @@
1+package ui2+3+import (4+ "slices"5+ "strconv"6+7+ tea "charm.land/bubbletea/v2"8+ "github.com/charmbracelet/x/ansi"9+10+ "github.com/FelineStateMachine/012/internal/sheet"11+ "github.com/FelineStateMachine/012/internal/ui/nbview"12+ "github.com/FelineStateMachine/012/internal/ui/overlay"13+)14+15+// Commands on an output's grid, and what the control panel says of it.16+// The grid runs the commands that look at its values or change how they17+// show (selecting, copying, finding, sorting, filtering, column widths,18+// undoing those) and refuses the rest, which would change a value. A19+// chart, a pivot table or a frequency table from the output is made on20+// a sheet, where they live: the output goes to a sheet as G sends it,21+// so what's made from it follows the cell's next run, and a notebook's22+// cells stay code and what it printed.23+24+// gridCommands are the commands an output's grid runs itself.25+var gridCommands = map[string]bool{26+ "edit.copy": true, "edit.find": true, "edit.find_next": true, "edit.find_prev": true,27+ "select.none": true, "select.all": true, "select.columns": true, "select.rows": true,28+ "column.width": true, "column.reset": true, "menu.context": true, "data.dropdown": true,29+ "data.sort_sheet_az": true, "data.sort_sheet_za": true, "data.sort_range_az": true, "data.sort_range_za": true, "data.sort_range": true,30+ "data.filter": true, "data.filter_column": true, "data.filter_remove": true,31+}32+33+// onSheet are the commands whose result goes on a sheet of its own or34+// beside the data: run on the output sent to a sheet.35+var onSheet = map[string]bool{"insert.chart": true, "data.pivot": true, "data.frequency": true}36+37+// allows reports whether a command runs on the grid.38+func (g *outGrid) allows(id string) bool { return gridCommands[id] || gridTakes(id) || onSheet[id] }39+40+// gridMenu is the cell menu on an output's grid.41+var gridMenu = []menuItem{42+ {cmd: "edit.copy"}, sep, {cmd: "data.sort_sheet_az", title: "Sort A to Z"}, {cmd: "data.sort_sheet_za", title: "Sort Z to A"}, sep,43+ {cmd: "data.filter"}, {cmd: "data.filter_remove"}, sep, {cmd: "insert.chart"}, {cmd: "data.pivot"},44+}45+46+// cellMenu is the right-click menu of the cells.47+func (m *Model) cellMenu() []menuItem {48+ if m.out != nil {49+ return gridMenu50+ }51+ return cellMenu52+}53+54+// offers reports whether a menu on the grid lists a command: those it55+// runs and the program's own. A nil grid, the program's model, lists56+// every one.57+func (g *outGrid) offers(id string) bool { return g == nil || g.allows(id) || notebookSafe(id) }58+59+// command takes a command run on the grid's model, reporting whether it60+// did: the program's own commands go back to it, Edit shows the grid61+// full-screen, a chart or pivot table goes on a sheet, and anything62+// that would change a value is refused.63+func (g *outGrid) command(id string) (tea.Cmd, bool) {64+ p := g.parent65+ switch {66+ case g.allows(id) && !onSheet[id]:67+ return nil, false68+ case id == "edit":69+ p.gridFull()70+ case onSheet[id]:71+ return p.outputOnSheet(g, id), true72+ case notebookSafe(id):73+ return p.runCommand(id), true74+ default:75+ g.child.note = commands[id].title + " would change the output: G sends it to a sheet, where its copy can change"76+ }77+ return nil, true78+}79+80+// outputOnSheet runs command id on the output sent to a sheet: sent to a81+// new sheet first unless it's on one, with the columns selected in the82+// grid selected there, every row under the header.83+func (m *Model) outputOnSheet(g *outGrid, id string) tea.Cmd {84+ nb, v := m.sheet, m.nbView()85+ if v == nil {86+ return nil87+ }88+ name, ok := m.outputName(nb, g.id)89+ if !ok {90+ return nil91+ }92+ if _, _, sent := m.book().Region(name); !sent {93+ m.sendToNewSheet(nb, name)94+ }95+ t, _, ok := m.book().Region(name)96+ if !ok {97+ return nil98+ }99+ table, ok := t.RegionTable(name)100+ if !ok {101+ m.note = "The output sent to " + t.Name() + " has no rows yet"102+ return nil103+ }104+ c := g.child105+ r := table106+ if c.hasRange() {107+ sel := c.selection()108+ r.From.Col = table.From.Col + min(sel.From.Col, g.cols-1)109+ r.To.Col = table.From.Col + min(sel.To.Col, g.cols-1)110+ }111+ v.CloseFull()112+ m.nb.out.in = nil113+ m.showSheet(t)114+ m.selectRect(r)115+ m.cur = sheet.Addr{Col: table.From.Col + min(c.cur.Col, g.cols-1), Row: r.From.Row}116+ return m.runCommand(id)117+}118+119+// outputName is the name of cell id of notebook nb, naming it first as120+// sending it does when it has none.121+func (m *Model) outputName(nb *sheet.Sheet, id int) (string, bool) {122+ for i, c := range nb.NotebookCells() {123+ if c.ID != id {124+ continue125+ }126+ name := c.Name()127+ if name == "" {128+ name = m.book().FreeCellName("cell" + strconv.Itoa(i+1))129+ m.renameCell(nb, c, name)130+ }131+ return name, true132+ }133+ return "", false134+}135+136+// gridIndicator is the mode while a grid is entered: OUTPUT, or its137+// menu's or prompt's.138+func (m *Model) gridIndicator(g *outGrid) string {139+ c := g.child140+ switch {141+ case c.overlay != nil:142+ return c.overlay.Indicator()143+ case c.mode == modePrompt:144+ return c.prompt.indicator145+ }146+ return "OUTPUT"147+}148+149+// gridBusy reports whether the grid's own context line is to be shown:150+// a bar, a prompt, a menu, a resize or a message of its own.151+func (g *outGrid) gridBusy() bool {152+ c := g.child153+ return c.mode != modeReady || c.overlay != nil || c.mouse.drag == dragResize154+}155+156+// gridContext is the context line while grid g is entered: the grid's157+// own when it has something to say, otherwise what's shown and the keys.158+func (m *Model) gridContext(g *outGrid, v *nbview.View) string {159+ c := g.child160+ switch {161+ case g.gridBusy():162+ return c.contextLineText()163+ case c.warn != "":164+ return v.Rule(m.th.Warning.Render(c.warn), "", m.width)165+ case c.note != "":166+ return v.Rule(m.th.Hint.Render(c.note), "", m.width)167+ }168+ name, _ := v.Head()169+ keys := []string{"Shift+arrows", "select", "Ctrl+C", "copy", "Ctrl+F", "find", "Enter", "full-screen", "Esc", "back"}170+ if v.FullOpen() {171+ keys = slices.Delete(keys, 6, 8)172+ }173+ for len(keys) > 4 && ansi.StringWidth("Output of "+name+m.th.KeyHints(keys...))+8 > m.width {174+ keys = keys[2:] // the keys that matter most are last175+ }176+ return v.Rule(m.th.Muted.Render("Output of "+name), m.th.KeyHints(keys...), m.width)177+}178+179+// gridCursor is where the terminal's caret goes while grid g is180+// entered: in its bar or prompt, or its box's search field.181+func (m *Model) gridCursor(g *outGrid, v *nbview.View) (int, int, bool) {182+ x, y, ok := g.child.cursorPos()183+ if !ok || y == formulaLine || y == contextLine {184+ return x, y, ok185+ }186+ ox, oy := g.origin(v)187+ return x + ox, windowY(y) + oy, true188+}189+190+// rangeLabel names a selected range for the status line: its address,191+// or on an output's grid the columns' names and the rows as numbered.192+func (m *Model) rangeLabel(r sheet.Rect) string {193+ if m.out == nil {194+ return r.String()195+ }196+ name := func(c int) string { return ansi.Truncate(m.sheet.ShownText(sheet.Addr{Col: c}), 16, "…") }197+ cols := name(r.From.Col)198+ if r.To.Col > r.From.Col {199+ cols += " to " + name(min(r.To.Col, m.out.cols-1))200+ }201+ from, to := max(r.From.Row, 1), min(r.To.Row, m.out.rows)202+ if from == to {203+ return cols + ", row " + strconv.Itoa(from)204+ }205+ return cols + ", rows " + strconv.Itoa(from) + " to " + strconv.Itoa(to)206+}207+208+// boxWidth is how wide a box is drawn.209+func boxWidth(b overlay.Box) int {210+ w := 0211+ for _, l := range b.Lines {212+ w = max(w, ansi.StringWidth(l))213+ }214+ return w215+}
A internal/ui/nbgridin.go +275 -0
@@ -0,0 +1,275 @@
1+package ui2+3+import (4+ tea "charm.land/bubbletea/v2"5+6+ "github.com/FelineStateMachine/012/internal/sheet"7+ "github.com/FelineStateMachine/012/internal/ui/nbview"8+ "github.com/FelineStateMachine/012/internal/ui/overlay"9+)10+11+// Working in an output's grid (nbgrid.go). Enter on a table or record12+// output, or a click in it, gives its grid the keys: the window shows13+// the grid's active cell and selection, and keys, the mouse and the14+// commands that act on a sheet's cells go to the grid's own model, so15+// arrows, Shift+arrows, Ctrl+C, sorting and filtering from the menus,16+// Ctrl+F and resizing columns work as on a sheet. What belongs to the17+// notebook and the program (menus, the palette, help, saving, other18+// tabs) stays theirs. Enter shows the grid full-screen, and Esc goes19+// back a level: to the window, then to the notebook.20+21+// gridIn is the grid entered, while the notebook shown still shows it.22+func (m *Model) gridIn() *outGrid {23+ g := m.nb.out.in24+ if g == nil {25+ return nil26+ }27+ if v := m.nbView(); v == nil || !v.Shows(g) {28+ m.nb.out.in = nil29+ return nil30+ }31+ return g32+}33+34+// enterGrid gives grid g the keys, reporting whether it could.35+func (m *Model) enterGrid(g *outGrid) bool {36+ if !g.ready(m.nbGridWidth(), nbview.Window) {37+ m.note = "The output isn't a table: " + g.err38+ return false39+ }40+ m.nb.out.in = g41+ g.child.note, g.child.warn = "", ""42+ return true43+}44+45+// gridBack goes back a level from grid g: from full-screen to the46+// window, and from the window to the notebook.47+func (m *Model) gridBack() {48+ if v := m.nbView(); v != nil && v.FullOpen() {49+ v.CloseFull()50+ v.FollowOutput()51+ return52+ }53+ m.nb.out.in = nil54+}55+56+// gridFull shows the grid entered full-screen.57+func (m *Model) gridFull() {58+ if v := m.nbView(); v != nil && !v.FullOpen() {59+ v.OpenFull()60+ }61+}62+63+// gridKey gives a key to grid g, after the keys the notebook and the64+// program keep while the grid is at rest.65+func (m *Model) gridKey(g *outGrid, k tea.KeyPressMsg) tea.Cmd {66+ c := g.child67+ if c.mode == modeReady && c.overlay == nil && c.mouse.drag == dragNone {68+ if cmd, ok := m.gridOwnKey(g, k.String()); ok {69+ return cmd70+ }71+ }72+ return g.forward(k)73+}74+75+// gridOwnKey takes the keys the grid leaves to the notebook: Esc when76+// nothing is selected, the menus, and the program's own commands.77+func (m *Model) gridOwnKey(g *outGrid, key string) (tea.Cmd, bool) {78+ if key == "esc" && !g.child.hasRange() {79+ m.gridBack()80+ return nil, true81+ }82+ if i := barMenuFor(key); i >= 0 {83+ m.showBarMenu(i)84+ return nil, true85+ }86+ if id, ok := keymap[canonicalKey(key)]; ok && notebookSafe(id) && !gridTakes(id) {87+ return m.runCommand(id), true88+ }89+ return m.runShortcut(key)90+}91+92+// gridTakes reports whether a command the notebook would run acts on93+// the grid entered instead: undo and redo, of its sorts and filters.94+func gridTakes(id string) bool { return id == "edit.undo" || id == "edit.redo" }95+96+// forward hands the grid a message, then keeps its active cell on the97+// table, passes what it copied to the program's clipboard, and keeps98+// its window on screen.99+func (g *outGrid) forward(msg tea.Msg) tea.Cmd {100+ c := g.child101+ clip, focus := c.copied.clip, *c.focus()102+ var cmd tea.Cmd103+ g.roomy(func() { _, cmd = c.Update(msg) })104+ if *c.focus() != focus {105+ c.scrollTo(*c.focus()) // in the window, which is smaller106+ }107+ g.keep()108+ if c.copied.clip != clip && c.copied.clip != nil {109+ g.parent.copied = clipboard{clip: c.copied.clip, sheet: c.sheet}110+ if c.note == "" {111+ c.note = "Copied " + countCells(c.copied.clip.Range) + ": Ctrl+V pastes them on a sheet"112+ }113+ }114+ if v := g.parent.nbView(); v != nil {115+ v.FollowOutput()116+ }117+ return cmd118+}119+120+// run runs a command on the grid.121+func (g *outGrid) run(id string) tea.Cmd {122+ cmd := g.child.runCommand(id)123+ g.keep()124+ return cmd125+}126+127+// keep keeps the active cell and the selection's moving corner on the128+// table's rows and columns, under its header.129+func (g *outGrid) keep() {130+ c := g.child131+ in := func(a sheet.Addr) sheet.Addr {132+ return sheet.Addr{Col: clamp(a.Col, 0, max(g.cols-1, 0)), Row: clamp(a.Row, 1, max(g.rows, 1))}133+ }134+ if c.whole != wholeNone {135+ return136+ }137+ cur, ext := in(c.cur), in(c.ext)138+ if cur != c.cur || ext != c.ext {139+ c.cur, c.ext = cur, ext140+ c.scrollTo(*c.focus())141+ }142+}143+144+// gridMouse takes a mouse message over an output's grid, or any while145+// the grid entered drags or has a menu open, reporting whether it did.146+func (m *Model) gridMouse(v *nbview.View, msg tea.MouseMsg) (tea.Cmd, bool) {147+ mouse := msg.Mouse()148+ in := m.gridIn()149+ if in != nil && (in.child.overlay != nil || in.child.mouse.drag != dragNone || in.child.mode != modeReady) {150+ return in.forward(in.toChild(v, msg)), true151+ }152+ found, _, _, ok := v.GridAt(mouse.X, mouse.Y-nbBody)153+ g, _ := found.(*outGrid)154+ if in != nil && g != in {155+ in.child.mouse.hover = hit{}156+ }157+ if !ok || g == nil {158+ return nil, false159+ }160+ switch msg := msg.(type) {161+ case tea.MouseWheelMsg:162+ if g != in || !sideways(tea.Mouse(msg)) {163+ return nil, false // the notebook scrolls the window164+ }165+ case tea.MouseMotionMsg:166+ if g != in {167+ return nil, true168+ }169+ case tea.MouseClickMsg:170+ if g != in {171+ v.SelectGrid(g)172+ if !m.enterGrid(g) {173+ return nil, true174+ }175+ }176+ }177+ return g.forward(g.toChild(v, msg)), true178+}179+180+// sideways reports whether a wheel turn scrolls sideways.181+func sideways(mouse tea.Mouse) bool {182+ return mouse.Button == tea.MouseWheelLeft || mouse.Button == tea.MouseWheelRight || mouse.Mod.Contains(tea.ModShift)183+}184+185+// roomy runs fn with the child as large as the program's screen leaves186+// it from the window down, so the boxes it opens (a column's filter, a187+// menu) are laid out with the room the screen has rather than the188+// window's.189+func (g *outGrid) roomy(fn func()) {190+ c, v := g.child, g.parent.nbView()191+ if v == nil {192+ fn()193+ return194+ }195+ ox, oy := g.origin(v)196+ w, h := c.width, c.height197+ c.width, c.height = max(g.parent.width-ox, w), max(g.parent.height-oy+gridTop, h)198+ defer func() { c.width, c.height = w, h }()199+ fn()200+}201+202+// origin is where the grid's column header is on the program's screen.203+func (g *outGrid) origin(v *nbview.View) (x, y int) {204+ x, y, _ = v.GridOrigin(g)205+ return x, y + nbBody206+}207+208+// The child's screen has its column header on headerLine, then the209+// frozen header row and the divider under it, which the window leaves210+// out, then its rows: childY and parentY map lines between the two.211+212+// childY is the child's line for line y of the window, 0 its header.213+func childY(y int) int {214+ if y <= 0 {215+ return headerLine + y216+ }217+ return gridTop + 1 + y218+}219+220+// windowY is the window's line for the child's line y.221+func windowY(y int) int {222+ if y <= headerLine {223+ return y - headerLine224+ }225+ return max(y-gridTop-1, 1)226+}227+228+// toChild is a mouse message with its position on the child's screen:229+// in one of the child's boxes, where in the box; elsewhere, where in the230+// window.231+func (g *outGrid) toChild(v *nbview.View, msg tea.MouseMsg) tea.MouseMsg {232+ ox, oy := g.origin(v)233+ mouse := msg.Mouse()234+ x, y := mouse.X-ox, childY(mouse.Y-oy)235+ for _, b := range g.boxes() {236+ bx, by := b.X+ox, windowY(b.Y)+oy237+ if mouse.X >= bx && mouse.Y >= by && len(b.Lines) > 0 && mouse.Y < by+len(b.Lines) && mouse.X < bx+boxWidth(b) {238+ x, y = b.X+mouse.X-bx, b.Y+mouse.Y-by239+ }240+ }241+ at := tea.Mouse{X: x, Y: y, Button: mouse.Button, Mod: mouse.Mod}242+ switch msg.(type) {243+ case tea.MouseClickMsg:244+ return tea.MouseClickMsg(at)245+ case tea.MouseReleaseMsg:246+ return tea.MouseReleaseMsg(at)247+ case tea.MouseWheelMsg:248+ return tea.MouseWheelMsg(at)249+ }250+ return tea.MouseMotionMsg(at)251+}252+253+// boxes are the child's boxes, laid out with the screen's room.254+func (g *outGrid) boxes() []overlay.Box {255+ var out []overlay.Box256+ g.roomy(func() { out = g.child.floating() })257+ return out258+}259+260+// gridBoxes are the child's boxes (a column's filter, a menu) placed on the261+// program's screen over the window.262+func (m *Model) gridBoxes() []overlay.Box {263+ g, v := m.gridIn(), m.nbView()264+ if g == nil || v == nil {265+ return nil266+ }267+ ox, oy := g.origin(v)268+ boxes := g.boxes()269+ out := make([]overlay.Box, 0, len(boxes))270+ for _, b := range boxes {271+ b.X, b.Y = max(b.X+ox, 0), max(windowY(b.Y)+oy, 0)272+ out = append(out, b)273+ }274+ return out275+}
M internal/ui/nbrun.go +4 -0
M internal/ui/nbscreen.go +16 -6
@@ -145,6 +145,10 @@ func (m *Model) notebookContext(v *nbview.View) (string, string) {
145145 left, right = m.th.Warning.Render(m.warn), ""146146 case m.note != "":147147 left, right = m.th.Hint.Render(m.note), ""148+ default:149+ if g := m.gridIn(); g != nil {150+ return m.gridContext(g, v), ""151+ }148152 }149153 if v.FullOpen() {150154 return left, right
@@ -153,8 +157,10 @@ func (m *Model) notebookContext(v *nbview.View) (string, string) {
153157 }154158 155159 // notebookIndicator is the mode on a notebook tab.156-func notebookIndicator(v *nbview.View) string {157- switch {160+func (m *Model) notebookIndicator(v *nbview.View) string {161+ switch g := m.gridIn(); {162+ case g != nil:163+ return m.gridIndicator(g)158164 case v.FullOpen():159165 return "OUTPUT"160166 case v.Editing():
@@ -165,10 +171,7 @@ func notebookIndicator(v *nbview.View) string {
165171 166172 // notebookCursor is where the terminal's caret goes on a notebook tab.167173 func (m *Model) notebookCursor(v *nbview.View) (int, int, bool) {168- if f := v.Full(); f != nil {169- if x, ok := f.Cursor(); ok {170- return x, contextLine, true171- }174+ if v.FullOpen() {172175 return 0, 0, false173176 }174177 x, y, ok := v.Cursor()
@@ -178,6 +181,9 @@ func (m *Model) notebookCursor(v *nbview.View) (int, int, bool) {
178181 // notebookBoxes are the notebook's floating boxes: its completions.179182 func (m *Model) notebookBoxes() []overlay.Box {180183 if v := m.nbView(); v != nil && m.overlay == nil && m.mode == modeReady {184+ if m.gridIn() != nil {185+ return m.gridBoxes()186+ }181187 return v.Boxes(nbBody)182188 }183189 return nil
@@ -191,6 +197,10 @@ func (m *Model) notebookMouse(msg tea.MouseMsg) (tea.Cmd, bool) {
191197 if v == nil || m.mode != modeReady || m.overlay != nil {192198 return nil, false193199 }200+ m.sizeNotebook(v)201+ if cmd, ok := m.gridMouse(v, msg); ok {202+ return cmd, true203+ }194204 if click, ok := msg.(tea.MouseClickMsg); ok && mouse.Y == formulaLine && click.Button == tea.MouseLeft {195205 return m.toolbarClick(v, mouse.X), true196206 }
M internal/ui/nbview/draw.go +2 -2
M internal/ui/nbview/full.go +40 -231
@@ -1,144 +1,49 @@
11 package nbview22 33 import (4- "cmp"5- "slices"6- "strconv"7- "strings"8-94 tea "charm.land/bubbletea/v2"10- "github.com/charmbracelet/x/ansi"115 126 "github.com/FelineStateMachine/012/internal/locale"13- "github.com/FelineStateMachine/012/internal/sheet"14- "github.com/FelineStateMachine/012/internal/ui/lineedit"157 "github.com/FelineStateMachine/012/internal/ui/theme"168 )179 18-// Full is an output shown full-screen, read-only: a table as a grid19-// with a pointer, sorted by a column (s, S) and filtered to the rows20-// holding some text (/), without changing the output; anything else as21-// its lines, scrolled. Esc goes back to the notebook.10+// Full is an output shown full-screen, read-only: a table or record as11+// the UI's grid at the body's size, which the UI gives the keys, and12+// anything else as its lines, scrolled with a pointer. Esc goes back to13+// the notebook.2214 type Full struct {2315 Title string2416 sh *shown25- order []int // the rows shown, in the order shown26- sort int // the column sorted by, plus one; 0 for the output's order27- desc bool28- // filter is the text rows must hold; typing is set while it's typed.29- filter lineedit.Line30- typing bool3117 32- row, col int // the pointer33- top, left int18+ row, top int // the pointer and the first line shown, for lines3419 width, height int3520 }3621 3722 func newFull(title string, sh *shown, width, height int) *Full {3823 f := &Full{Title: title, sh: sh}3924 f.resize(width, height)40- f.apply()4125 return f4226 }4327 4428 func (f *Full) resize(width, height int) { f.width, f.height = width, max(height, 2) }4529 46-// table reports whether the output is a table.47-func (f *Full) table() bool { return f.sh.kind == outTable }48-49-// apply works out the rows shown from the filter and the sort.50-func (f *Full) apply() {51- if !f.table() {52- return53- }54- f.order = f.order[:0]55- needle := strings.ToLower(f.filter.Text())56- for i, row := range f.sh.rows {57- if needle == "" || slices.ContainsFunc(row, func(lc sheet.LiveCell) bool {58- return strings.Contains(strings.ToLower(cellText(lc, locale.Canonical)), needle)59- }) {60- f.order = append(f.order, i)61- }62- }63- if c := f.sort - 1; c >= 0 {64- slices.SortStableFunc(f.order, func(a, b int) int {65- x, y := cellAt(f.sh.rows[a], c), cellAt(f.sh.rows[b], c)66- if f.desc {67- return compareCells(y, x)68- }69- return compareCells(x, y)70- })71- }72- f.row = min(f.row, max(len(f.order)-1, 0))73-}74-75-func cellAt(row []sheet.LiveCell, c int) sheet.LiveCell {76- if c < len(row) {77- return row[c]78- }79- return sheet.LiveCell{}80-}81-82-// compareCells orders values as a sort does: numbers before text,83-// blanks last.84-func compareCells(a, b sheet.LiveCell) int {85- ae, be := a.V.Kind == sheet.Empty, b.V.Kind == sheet.Empty86- switch {87- case ae || be:88- return cmp.Compare(boolInt(ae), boolInt(be))89- case a.V.Kind == sheet.Number && b.V.Kind == sheet.Number:90- return cmp.Compare(a.V.Num, b.V.Num)91- case a.V.Kind == sheet.Number:92- return -193- case b.V.Kind == sheet.Number:94- return 195- }96- return cmp.Compare(strings.ToLower(a.V.String()), strings.ToLower(b.V.String()))97-}98-99-func boolInt(b bool) int {100- if b {101- return 1102- }103- return 0104-}30+// Grid is the output's grid, when it's drawn as one: the UI gives it31+// the keys.32+func (f *Full) Grid() Grid { return f.sh.grid }10533 106-// rowsShown is how many rows (or lines) there are to scroll through.107-func (f *Full) rowsShown() int {108- if f.table() {109- return len(f.order)110- }111- return f.sh.height(true, f.width-1)112-}34+// rowsShown is how many lines there are to scroll through.35+func (f *Full) rowsShown() int { return f.sh.height(true, f.width-1) }11336 11437 // Key takes a key, reporting whether Esc left the view.11538 func (f *Full) Key(k tea.KeyPressMsg) (closed bool) {116- key := k.String()117- if f.typing {118- switch key {119- case "esc":120- f.typing = false121- f.filter.Clear()122- case "enter":123- f.typing = false124- default:125- f.filter.Key(k)126- }127- f.apply()128- return false129- }130- page := max(f.height-2, 1)131- switch key {39+ page := max(f.height-1, 1)40+ switch k.String() {13241 case "esc", "q":13342 return true13443 case "up", "k":13544 f.row--13645 case "down", "j":13746 f.row++138- case "left", "h":139- f.col--140- case "right", "l":141- f.col++14247 case "pgup":14348 f.row -= page14449 case "pgdown", "space":
@@ -147,152 +52,56 @@ func (f *Full) Key(k tea.KeyPressMsg) (closed bool) {
14752 f.row = 014853 case "end", "G":14954 f.row = f.rowsShown() - 1150- case "s", "S":151- f.sortBy(f.col+1, key == "S")152- case "/":153- f.typing = true15455 }15556 f.settle()15657 return false15758 }15859 159-// sortBy sorts by column c (counted from 1), again to go back to the160-// output's order.161-func (f *Full) sortBy(c int, desc bool) {162- if !f.table() {163- return164- }165- if f.sort == c && f.desc == desc {166- f.sort = 0167- } else {168- f.sort, f.desc = c, desc169- }170- f.apply()171-}172-173-// settle keeps the pointer on the table and on screen.60+// settle keeps the pointer on the lines and on screen.17461 func (f *Full) settle() {17562 f.row = max(min(f.row, f.rowsShown()-1), 0)176- if f.table() {177- f.col = max(min(f.col, len(f.sh.cols)-1), 0)178- f.left = min(f.left, f.col)179- for f.left < f.col && f.colX(f.col)+f.sh.fit[f.col] > f.width {180- f.left++181- }182- }183- rows := f.height - 1184- if !f.table() {185- rows = f.height186- }187- f.top = max(min(f.top, f.row), f.row-rows+1, 0)188-}189-190-// numW is the row numbers' width.191-func (f *Full) numW() int { return len(strconv.Itoa(max(len(f.sh.rows), 1))) + 1 }192-193-// colX is where column c starts on screen, with the columns from left.194-func (f *Full) colX(c int) int {195- x := f.numW() + 1196- for i := f.left; i < c; i++ {197- x += f.sh.fit[i] + 2198- }199- return x63+ f.top = max(min(f.top, f.row), f.row-f.height+1, 0)20064 }20165 202-// lines draws the view.66+// lines draws the view: the grid at full size, its header on the first67+// line, or the output's lines with the pointer's marked.20368 func (f *Full) lines(th *theme.Theme, loc *locale.Locale) []string {20469 out := make([]string, 0, f.height)205- if !f.table() {206- for i := f.top; i < f.top+f.height && i < f.rowsShown(); i++ {207- line := f.sh.line(th, loc, i, fold{whole: true}, f.width-1)208- if i == f.row {209- line = th.Selection.Render("▌") + line210- } else {211- line = " " + line212- }213- out = append(out, line)70+ if g := f.sh.grid; g != nil {71+ rows := f.height - 172+ from := g.Top()73+ for i := range min(g.Rows(), rows) + 1 {74+ out = append(out, g.Line(i, from, rows, f.width))21475 }215- return pad2Lines(out, f.height)76+ return padLines(out, f.height)77+ }78+ for i := f.top; i < f.top+f.height && i < f.rowsShown(); i++ {79+ line := f.sh.line(th, loc, i, fold{whole: true}, f.width-1)80+ if i == f.row {81+ line = th.Selection.Render("▌") + line82+ } else {83+ line = " " + line84+ }85+ out = append(out, line)21686 }217- out = append(out, f.header(th))218- for i := f.top; i < f.top+f.height-1 && i < len(f.order); i++ {219- out = append(out, f.rowLine(th, loc, i))87+ return padLines(out, f.height)88+}89+90+func boolInt(b bool) int {91+ if b {92+ return 122093 }221- return pad2Lines(out, f.height)94+ return 022295 }22396 224-func pad2Lines(out []string, n int) []string {97+func padLines(out []string, n int) []string {22598 for len(out) < n {22699 out = append(out, "")227100 }228101 return out229102 }230103 231-// header is the column names, the sorted one marked ▲ or ▼, the232-// pointer's column's in reverse video.233-func (f *Full) header(th *theme.Theme) string {234- var b strings.Builder235- b.WriteString(th.Header.Render(strings.Repeat(" ", f.numW()+1)))236- for c := f.left; c < len(f.sh.cols) && f.colX(c) < f.width; c++ {237- name := f.sh.cols[c]238- if f.sort == c+1 {239- name += map[bool]string{false: " ▲", true: " ▼"}[f.desc]240- }241- style := th.Header242- if c == f.col {243- style = th.HeaderActive244- }245- b.WriteString(style.Render(pad(ansi.Truncate(name, f.sh.fit[c], "…"), f.sh.fit[c], sheet.AlignLeft)))246- b.WriteString(th.Header.Render(" "))247- }248- return ansi.Truncate(b.String(), f.width, "")249-}250-251-// rowLine is the i-th row shown, numbered as the output numbers it.252-func (f *Full) rowLine(th *theme.Theme, loc *locale.Locale, i int) string {253- r := f.order[i]254- num := th.Header255- if i == f.row {256- num = th.HeaderActive257- }258- var b strings.Builder259- b.WriteString(num.Render(pad(strconv.Itoa(r+1), f.numW(), sheet.AlignRight)) + " ")260- row := f.sh.rows[r]261- for c := f.left; c < len(f.sh.cols) && f.colX(c) < f.width; c++ {262- lc := cellAt(row, c)263- text := pad(ansi.Truncate(cellText(lc, loc), f.sh.fit[c], "…"), f.sh.fit[c], align(lc))264- if i == f.row && c == f.col {265- text = th.Pointer.Render(text)266- }267- b.WriteString(text + " ")268- }269- return ansi.Truncate(b.String(), f.width, "")270-}271-272104 // ContextLine says what's shown and the keys.273105 func (f *Full) ContextLine(th *theme.Theme) (string, string) {274- if f.typing {275- return th.Key.Render("Filter: ") + f.filter.Text(), th.KeyHints("Enter", "keep", "Esc", "clear")276- }277- what := f.Title278- if f.table() {279- what += " " + more(len(f.order), "row")280- if f.filter.Text() != "" {281- what += " holding " + strconv.Quote(f.filter.Text())282- }283- if f.sort > 0 {284- what += ", sorted by " + f.sh.cols[f.sort-1]285- }286- return th.Muted.Render(what), th.KeyHints("s", "sort", "S", "descending", "/", "filter", "Esc", "back")287- }288- return th.Muted.Render(what), th.KeyHints("Esc", "back")289-}290-291-// Cursor is where the terminal's caret goes while the filter is typed,292-// on the context line after "Filter: ".293-func (f *Full) Cursor() (int, bool) {294- if !f.typing {295- return 0, false296- }297- return ansi.StringWidth("Filter: " + f.filter.Head()), true106+ return th.Muted.Render(f.Title), th.KeyHints("Esc", "back")298107 }
A internal/ui/nbview/grid.go +199 -0
@@ -0,0 +1,199 @@
1+package nbview2+3+import (4+ "strings"5+6+ "github.com/FelineStateMachine/012/internal/nuon"7+ "github.com/FelineStateMachine/012/internal/ui/theme"8+)9+10+// A table (a list of records) or a record is drawn by the UI as its own11+// grid, which the output's window shows: the grid's column header, named12+// after the table's columns, then as many of its rows as the window13+// holds. The UI owns everything about the grid (its cells, formats,14+// widths, the active cell, the selection, sorting and filtering); the15+// notebook places it, says how many rows show, and scrolls it.16+17+// Grid is an output drawn as the UI's grid.18+type Grid interface {19+ // Rows is how many rows the grid has showing: the rows a filter20+ // keeps, the header not counted.21+ Rows() int22+ // Top is the first row the window shows, counted among those.23+ Top() int24+ // Scroll scrolls the window d rows, reporting whether it moved.25+ Scroll(d int) bool26+ // Line draws line i of a window of rows rows at width, showing the27+ // rows from row from on: the column header for 0, then the rows.28+ Line(i, from, rows, width int) string29+ // Hidden is how many of the grid's columns don't show at width.30+ Hidden(width int) int31+ // Entered reports whether the grid has the keys: its active cell32+ // and selection show, and arrows move them.33+ Entered() bool34+}35+36+// gridData is what the UI's grid of an output holds, as NUON: a table as37+// it is, and a record as a table of its fields, a column of their names38+// and one of their values.39+func gridData(v nuon.Value, data []byte) []byte {40+ if v.Kind != nuon.Record {41+ return data42+ }43+ list := nuon.Value{Kind: nuon.List}44+ for _, f := range v.Fields {45+ list.List = append(list.List, nuon.Value{Kind: nuon.Record, Fields: []nuon.Field{46+ {Key: "field", Value: nuon.StringValue(f.Key)}, {Key: "value", Value: f.Value}}})47+ }48+ return nuon.Append(nil, list)49+}50+51+// entered reports whether the output's grid has the keys.52+func (sh *shown) entered() bool { return sh.grid != nil && sh.grid.Entered() }53+54+// gridRows is how many of a grid's rows show, and from which: all of55+// them from the first when the output shows whole (unless it's entered,56+// when it scrolls in its window), or a window's worth from where it's57+// scrolled.58+func (sh *shown) gridRows(whole bool) (from, n int) {59+ total := sh.grid.Rows()60+ if whole && !sh.entered() {61+ return 0, total62+ }63+ return sh.grid.Top(), min(total, window)64+}65+66+// gridLine draws line i of a grid's window.67+func (sh *shown) gridLine(th *theme.Theme, i int, f fold, width int) string {68+ from, n := sh.gridRows(f.whole)69+ switch {70+ case i <= n:71+ return sh.grid.Line(i, from, max(n, 1), width)72+ case n == 0 && i == 1:73+ return th.Muted.Render("no rows: the filter hides them all")74+ }75+ return sh.gridFooter(th, from, n, width)76+}77+78+// gridFooter says what a grid's window leaves out.79+func (sh *shown) gridFooter(th *theme.Theme, from, n, width int) string {80+ total := sh.grid.Rows()81+ unit := "row"82+ if sh.kind == outRecord {83+ unit = "field"84+ }85+ var parts []string86+ switch {87+ case n >= total:88+ case from == 0:89+ parts = append(parts, more(total-n, "more "+unit))90+ default:91+ parts = append(parts, unit+"s "+grouped(from+1)+" to "+grouped(from+n)+" of "+grouped(total))92+ }93+ if c := sh.grid.Hidden(width); c > 0 {94+ parts = append(parts, more(c, "more column"))95+ }96+ var hints []string97+ if n < total && !sh.entered() {98+ hints = append(hints, "O shows all")99+ }100+ if !sh.entered() {101+ hints = append(hints, "Enter works in it")102+ }103+ line := "… " + strings.Join(parts, ", ")104+ if len(hints) > 0 {105+ line += " (" + strings.Join(hints, ", ") + ")"106+ }107+ return th.Muted.Render(line)108+}109+110+// SelectedGrid is the selected output's grid, if it's selected and drawn111+// as one.112+func (v *View) SelectedGrid() Grid {113+ c, ok := v.Cell()114+ if !ok || !v.onOut {115+ return nil116+ }117+ return v.shown(c).grid118+}119+120+// Window is how many rows an output's window shows.121+const Window = window122+123+// Shows reports whether grid g is the selected output's, or shown124+// full-screen.125+func (v *View) Shows(g Grid) bool {126+ if v.full != nil {127+ return v.full.Grid() == g128+ }129+ return g != nil && v.SelectedGrid() == g130+}131+132+// SelectGrid selects the output grid g is drawn in.133+func (v *View) SelectGrid(g Grid) {134+ for i, c := range v.h.Cells() {135+ if sh := v.shown(c); g != nil && sh.grid == g {136+ v.StopEdit()137+ v.Select(i, true)138+ return139+ }140+ }141+}142+143+// GridAt is the grid at column x of line y of the body, with where that144+// is in the grid: gy 0 its column header, then its rows as the window145+// shows them.146+func (v *View) GridAt(x, y int) (g Grid, gx, gy int, ok bool) {147+ if v.full != nil {148+ if g = v.full.Grid(); g == nil || y < 0 || y >= v.height {149+ return nil, 0, 0, false150+ }151+ return g, x, y, true152+ }153+ h, ok := v.hitAt(y)154+ if !ok || h.kind != rowOut || x < textX {155+ return nil, 0, 0, false156+ }157+ c := v.h.Cells()[h.cell]158+ f := v.foldOf(c.ID)159+ sh := v.shown(c)160+ if f.hidden || !sh.isGrid() {161+ return nil, 0, 0, false162+ }163+ if _, n := sh.gridRows(f.whole); h.r > n {164+ return nil, 0, 0, false165+ }166+ return sh.grid, x - textX, h.r, true167+}168+169+// GridOrigin is where grid g's column header is drawn in the body: its170+// first column and line, which may be off screen.171+func (v *View) GridOrigin(g Grid) (x, y int, ok bool) {172+ if v.full != nil {173+ return 0, 0, v.full.Grid() == g174+ }175+ for i, c := range v.h.Cells() {176+ if sh := v.shown(c); g != nil && sh.grid == g {177+ b := v.blockOf(i, c)178+ return textX, v.startOf(i) + 2*b.box + b.src - v.top, true179+ }180+ }181+ return 0, 0, false182+}183+184+// GridWidth is how wide an output's grid is drawn: the output's width,185+// or the body's full-screen.186+func (v *View) GridWidth() int {187+ if v.full != nil {188+ return v.width189+ }190+ return v.outWidth()191+}192+193+// FollowOutput scrolls so the selected output's window shows, as far as194+// it fits: its grid's active cell moved, or the grid changed its height.195+func (v *View) FollowOutput() {196+ if v.full == nil && v.onOut {197+ v.follow()198+ }199+}
M internal/ui/nbview/keys.go +6 -2
M internal/ui/nbview/mouse.go +4 -0
M internal/ui/nbview/output.go +33 -125
@@ -1,7 +1,6 @@
11 package nbview22 33 import (4- "slices"54 "strconv"65 "strings"76
@@ -16,26 +15,24 @@ import (
1615 )1716 1817 // Outputs as they show under a code cell. What a cell printed, NUON, is19-// parsed once into a shown output: a table (a list of records), a20-// record, a list, text, or a single value; values are the cells21-// importing them would make, formatted as cells are. A long output22-// scrolls in a window of its own (outwin.go) until O shows it whole; its23-// lines are drawn only when they're on screen, so an output of ten24-// thousand rows costs the rows showing.18+// parsed once into a shown output: a table (a list of records) or a19+// record, which the UI draws as its own grid (grid.go), a list, text,20+// or a single value; values are the cells importing them would make,21+// formatted as cells are. A long output scrolls in a window of its own22+// (outwin.go) until O shows it whole; its lines are drawn only when23+// they're on screen, so an output of ten thousand rows costs the rows24+// showing.2525 2626 // window is how many rows (or lines) an output's window shows.2727 const window = 102828 29-// maxColWidth caps how wide fitting makes a column, as a sheet's.30-const maxColWidth = 3031-3229 // outKind is what an output holds.3330 type outKind int3431 3532 const (3633 outNone outKind = iota // nothing printed37- outTable // a list of records38- outRecord // a record: its fields, one a line34+ outTable // a list of records: a grid35+ outRecord // a record: a grid of its fields3936 outList // a list of values that aren't records4037 outText // a string, its lines4138 outValue // a single value
@@ -47,13 +44,16 @@ const (
4744 // shown is an output parsed for showing.4845 type shown struct {4946 kind outKind50- cols []string // a table's column names, a record's keys51- rows [][]sheet.LiveCell // a table's rows, a list's items, a record's values, a value47+ cols int // a table's columns48+ rows [][]sheet.LiveCell // a list's items, or the one value5249 text []string // text's lines, or an error's53- fit []int // the columns' fitted widths5450 total int // rows or lines in all5551 wrap []string // text wrapped at wrapW5652 wrapW int53+ // data is a table's or record's grid as NUON (gridData), which the54+ // UI makes the grid from.55+ data []byte56+ grid Grid5757 }5858 5959 // parse reads an output for showing.
@@ -77,7 +77,9 @@ func parse(o *notebook.Output) *shown {
7777 return &shown{kind: outBad, text: []string{"nu's output isn't NUON: " + err.Error()}, total: 1}7878 }7979 sh := shownOf(v)80- sh.fitColumns()80+ if sh.kind == outTable || sh.kind == outRecord {81+ sh.data = gridData(v, o.NUON)82+ }8183 return sh8284 }8385
@@ -90,18 +92,16 @@ func shownOf(v nuon.Value) *shown {
9092 lines := strings.Split(strings.TrimRight(v.Str, "\n"), "\n")9193 return &shown{kind: outText, text: lines, total: len(lines)}9294 case nuon.Record:93- sh := &shown{kind: outRecord, total: len(v.Fields)}94- for _, f := range v.Fields {95- sh.cols = append(sh.cols, f.Key)96- sh.rows = append(sh.rows, []sheet.LiveCell{fileio.NUONCell(f.Value)})95+ if len(v.Fields) == 0 {96+ return &shown{}9797 }98- return sh98+ return &shown{kind: outRecord, total: len(v.Fields), cols: 2}9999 case nuon.List:100100 if len(v.List) == 0 {101101 return &shown{}102102 }103103 if isTable(v.List) {104- return tableOf(v.List)104+ return &shown{kind: outTable, total: len(v.List), cols: countCols(v.List)}105105 }106106 sh := &shown{kind: outList, total: len(v.List)}107107 for _, it := range v.List {
@@ -122,58 +122,19 @@ func isTable(list []nuon.Value) bool {
122122 return true123123 }124124 125-// tableOf is a list of records as a table: the columns in the order the126-// records name them.127-func tableOf(list []nuon.Value) *shown {128- sh := &shown{kind: outTable, total: len(list)}129- index := map[string]int{}125+// countCols is how many columns a list of records names.126+func countCols(list []nuon.Value) int {127+ seen := map[string]bool{}130128 for _, rec := range list {131129 for _, f := range rec.Fields {132- if _, ok := index[f.Key]; !ok {133- index[f.Key] = len(sh.cols)134- sh.cols = append(sh.cols, f.Key)135- }136- }137- }138- sh.rows = make([][]sheet.LiveCell, len(list))139- for i, rec := range list {140- row := make([]sheet.LiveCell, len(sh.cols))141- for _, f := range rec.Fields {142- row[index[f.Key]] = fileio.NUONCell(f.Value)130+ seen[f.Key] = true143131 }144- sh.rows[i] = row145132 }146- return sh133+ return len(seen)147134 }148135 149-// fitSample is how many rows at each end fitting the columns reads of a150-// table too long to read whole.151-const fitSample = 1000152-153-// fitColumns sizes a table's columns to their widest text, the header154-// included, at most maxColWidth: all its rows, or the first and last155-// of a long table.156-func (sh *shown) fitColumns() {157- if sh.kind != outTable {158- return159- }160- sh.fit = make([]int, len(sh.cols))161- for c, name := range sh.cols {162- sh.fit[c] = ansi.StringWidth(name)163- }164- rows := sh.rows165- if len(rows) > 20*fitSample {166- rows = append(slices.Clip(rows[:fitSample]), rows[len(rows)-fitSample:]...)167- }168- for _, row := range rows {169- for c, lc := range row {170- sh.fit[c] = max(sh.fit[c], ansi.StringWidth(cellText(lc, locale.Canonical)))171- }172- }173- for c := range sh.fit {174- sh.fit[c] = min(max(sh.fit[c], 1), maxColWidth)175- }176-}136+// isGrid reports whether the output is drawn as the UI's grid.137+func (sh *shown) isGrid() bool { return sh.grid != nil }177138 178139 // cellText is a value as a cell shows it, whole.179140 func cellText(lc sheet.LiveCell, loc *locale.Locale) string {
@@ -183,23 +144,6 @@ func cellText(lc sheet.LiveCell, loc *locale.Locale) string {
183144 return strings.ReplaceAll(sheet.FormatTextIn(lc.V, lc.F, loc), "\n", " ")184145 }185146 186-// shownCols is how many of a table's columns fit in width.187-func (sh *shown) shownCols(width int) int {188- x := 0189- for c, w := range sh.fit {190- if c > 0 {191- x += 2192- }193- if x+w > width && c > 0 {194- return c195- }196- x += w197- }198- return len(sh.fit)199-}200-201-func (sh *shown) hiddenCols(width int) int { return len(sh.fit) - sh.shownCols(width) }202-203147 // more counts what's left out: "9,991 more rows".204148 func more(n int, what string) string {205149 if n != 1 {
@@ -217,50 +161,14 @@ func grouped(n int) string {
217161 return s218162 }219163 220-// align is how a value lines up in its column, as in a cell.221-func align(lc sheet.LiveCell) sheet.Align {222- switch lc.V.Kind {223- case sheet.Number:224- if lc.F.Kind == sheet.FmtText {225- return sheet.AlignLeft226- }227- return sheet.AlignRight228- case sheet.Bool, sheet.Error:229- return sheet.AlignCenter230- }231- return sheet.AlignLeft232-}233-234-func pad(s string, w int, a sheet.Align) string {235- gap := max(w-ansi.StringWidth(s), 0)236- switch a {237- case sheet.AlignRight:238- return strings.Repeat(" ", gap) + s239- case sheet.AlignCenter:240- return strings.Repeat(" ", gap/2) + s + strings.Repeat(" ", gap-gap/2)241- }242- return s + strings.Repeat(" ", gap)243-}244-245-// fieldLine is a record's field, key: value, or a list's item, its246-// index first as nushell shows one.164+// fieldLine is a list's item, its index first as nushell shows one.247165 func (sh *shown) fieldLine(th *theme.Theme, loc *locale.Locale, i, width int) string {248166 if i >= len(sh.rows) {249167 return ""250168 }251- var key string252- if sh.kind == outRecord {253- kw := 0254- for _, k := range sh.cols {255- kw = max(kw, ansi.StringWidth(k))256- }257- kw = min(kw, 24)258- k := ansi.Truncate(sh.cols[i], kw, "…")259- key = th.OutputHead.Render(k) + strings.Repeat(" ", kw-ansi.StringWidth(k)+2)260- } else {261- n := len(strconv.Itoa(sh.total - 1))262- key = th.Muted.Render(pad(strconv.Itoa(i), n, sheet.AlignRight)) + " "263- }169+ n := len(strconv.Itoa(sh.total - 1))170+ num := strconv.Itoa(i)171+ key := th.Muted.Render(strings.Repeat(" ", max(n-len(num), 0))+num) + " "264172 room := max(width-ansi.StringWidth(key), 1)265173 return key + ansi.Truncate(cellText(sh.rows[i][0], loc), room, "…")266174 }
M internal/ui/nbview/outwin.go +27 -86
@@ -1,17 +1,14 @@
11 package nbview22 33 import (4- "strings"5-64 "github.com/charmbracelet/x/ansi"75 86 "github.com/FelineStateMachine/012/internal/locale"9- "github.com/FelineStateMachine/012/internal/sheet"107 "github.com/FelineStateMachine/012/internal/ui/theme"118 )129 13-// An output's window: a table's header, then at most window of its rows14-// (a list's items, a record's fields, text's lines) from the row it's10+// An output's window: at most window of its rows (a grid's rows under11+// its column header, a list's items, text's lines) from the row it's1512 // scrolled to, then a line saying what's left out. Whole shows every row1613 // instead, and hidden folds the output to one line, as Jupyter's1714 // collapsed outputs. The window's height doesn't change as it scrolls,
@@ -21,21 +18,13 @@ import (
2118 type fold struct {2219 hidden bool // o: folded to one line2320 whole bool // O: every row, no window24- scroll int // the window's first row25-}26-27-// head is how many lines stay above the rows: a table's header.28-func (sh *shown) head() int {29- if sh.kind == outTable {30- return 131- }32- return 021+ scroll int // the window's first row, but a grid's, which the grid keeps3322 }3423 3524 // items is how many rows the output scrolls through at width.3625 func (sh *shown) items(width int) int {3726 switch sh.kind {38- case outTable, outRecord, outList:27+ case outList:3928 return sh.total4029 case outText, outError:4130 return len(sh.wrapped(width))
@@ -52,22 +41,27 @@ func (sh *shown) rowsShown(whole bool, width int) (n int, footer bool) {
5241 if !whole && n > window {5342 n, footer = window, true5443 }55- if sh.kind == outTable && sh.hiddenCols(width) > 0 {56- footer = true57- }5844 return n, footer5945 }6046 6147 // height is how many lines the output takes at width.6248 func (sh *shown) height(whole bool, width int) int {63- if sh.kind == outNone {49+ switch {50+ case sh.kind == outNone:6451 return 052+ case sh.isGrid():53+ _, n := sh.gridRows(whole)54+ lines := 1 + max(n, 1)55+ if n < sh.grid.Rows() || sh.grid.Hidden(width) > 0 {56+ lines++57+ }58+ return lines6559 }6660 n, footer := sh.rowsShown(whole, width)6761 if footer {6862 n++6963 }70- return sh.head() + n64+ return n7165 }7266 7367 // maxScroll is how far the window scrolls: 0 when it shows every row.
@@ -78,10 +72,9 @@ func (sh *shown) maxScroll(whole bool, width int) int {
7872 7973 // line draws line i of the output as f shows it, at width.8074 func (sh *shown) line(th *theme.Theme, loc *locale.Locale, i int, f fold, width int) string {81- if i < sh.head() {82- return sh.tableHead(th, width)75+ if sh.isGrid() {76+ return sh.gridLine(th, i, f, width)8377 }84- i -= sh.head()8578 n, _ := sh.rowsShown(f.whole, width)8679 scroll := min(max(f.scroll, 0), sh.maxScroll(f.whole, width))8780 if i < n {
@@ -90,13 +83,10 @@ func (sh *shown) line(th *theme.Theme, loc *locale.Locale, i int, f fold, width
9083 return sh.footer(th, scroll, n, width)9184 }9285 93-// item draws row i: a table's row, a field or an item, a line of text,94-// or the one value.86+// item draws row i: a list's item, a line of text, or the one value.9587 func (sh *shown) item(th *theme.Theme, loc *locale.Locale, i, width int) string {9688 switch sh.kind {97- case outTable:98- return sh.tableRow(loc, i, width)99- case outRecord, outList:89+ case outList:10090 return sh.fieldLine(th, loc, i, width)10191 case outText, outError:10292 return sh.textLine(th, i, width)
@@ -110,68 +100,19 @@ func (sh *shown) item(th *theme.Theme, loc *locale.Locale, i, width int) string
110100 return ""111101 }112102 113-// footer says what the window leaves out: the rows under it (or where114-// it's scrolled to) and a table's columns past the width.103+// footer says what the window leaves out: the rows under it, or where104+// it's scrolled to.115105 func (sh *shown) footer(th *theme.Theme, scroll, n, width int) string {116- unit := map[outKind]string{outTable: "row", outRecord: "field", outList: "item"}[sh.kind]117- if unit == "" {118- unit = "line"106+ unit := "line"107+ if sh.kind == outList {108+ unit = "item"119109 }120110 total := sh.items(width)121- var parts []string122- switch {123- case n >= total:124- case scroll == 0:125- parts = append(parts, more(total-n, "more "+unit))126- default:127- parts = append(parts, unit+"s "+grouped(scroll+1)+" to "+grouped(scroll+n)+" of "+grouped(total))128- }129- if sh.kind == outTable {130- if c := sh.hiddenCols(width); c > 0 {131- parts = append(parts, more(c, "more column"))132- }133- }134- hint := "O shows all"135- if n >= total {136- hint = ""137- }138- if sh.kind == outTable {139- hint = strings.TrimPrefix(hint+", Enter opens it", ", ")140- }141- return ansi.Truncate(th.Muted.Render("… "+strings.Join(parts, ", ")+" ("+hint+")"), width, "…")142-}143-144-// tableHead is a table's header row.145-func (sh *shown) tableHead(th *theme.Theme, width int) string {146- var b strings.Builder147- for c := range sh.shownCols(width) {148- if c > 0 {149- b.WriteString(" ")150- }151- name := ansi.Truncate(sh.cols[c], sh.fit[c], "…")152- b.WriteString(th.OutputHead.Render(name) + strings.Repeat(" ", sh.fit[c]-ansi.StringWidth(name)))153- }154- return b.String()155-}156-157-// tableRow is a table's row i.158-func (sh *shown) tableRow(loc *locale.Locale, i, width int) string {159- if i >= len(sh.rows) {160- return ""161- }162- row := sh.rows[i]163- var b strings.Builder164- for c := range sh.shownCols(width) {165- if c > 0 {166- b.WriteString(" ")167- }168- var lc sheet.LiveCell169- if c < len(row) {170- lc = row[c]171- }172- b.WriteString(pad(ansi.Truncate(cellText(lc, loc), sh.fit[c], "…"), sh.fit[c], align(lc)))111+ part := more(total-n, "more "+unit)112+ if scroll > 0 {113+ part = unit + "s " + grouped(scroll+1) + " to " + grouped(scroll+n) + " of " + grouped(total)173114 }174- return b.String()115+ return ansi.Truncate(th.Muted.Render("… "+part+" (O shows all)"), width, "…")175116 }176117 177118 // textLine is line i of text or an error, wrapped at width.
M internal/ui/nbview/panel.go +5 -1

Not shown: this page already shows 6000 lines of diff.

M internal/ui/nbview/view.go +7 -0

Not shown: this page already shows 6000 lines of diff.

M internal/ui/nbview/view_test.go +84 -24

Not shown: this page already shows 6000 lines of diff.

M internal/ui/notebook.go +7 -1

Not shown: this page already shows 6000 lines of diff.

M internal/ui/panel.go +20 -2

Not shown: this page already shows 6000 lines of diff.

M internal/ui/pivot.go +4 -0

Not shown: this page already shows 6000 lines of diff.

M internal/ui/sort.go +4 -3

Not shown: this page already shows 6000 lines of diff.

M internal/ui/speed_test.go +22 -0

Not shown: this page already shows 6000 lines of diff.

M internal/ui/testdata/speed.json +5 -0

Not shown: this page already shows 6000 lines of diff.

M internal/ui/view.go +8 -4

Not shown: this page already shows 6000 lines of diff.

M scripts/doccheck/main.go +84 -22

Not shown: this page already shows 6000 lines of diff.

M scripts/doclint/main.go +31 -3

Not shown: this page already shows 6000 lines of diff.

M website/src/css/custom.css +12 -0

Not shown: this page already shows 6000 lines of diff.