aboutsummaryrefslogtreecommitdiffstats
path: root/src
Commit message (Collapse)AuthorAgeFilesLines
* Move the focus from a surface: clicks, the wheel, pointeunhhu2026-09-264-13/+99
| | | | | | | | | | | | | | | | | Only the app's key handlers could move a list's focus. When the focus view is a plain index position (`view tasks_list_focus = at.position`), Vega now asks Pure for that index and moves it as a user pointing at a row (pure_app_point), with no code in the app. The grid remembers which item each line shows; in the TUI a click on a row focuses it and the wheel moves the focus one row (SGR mouse reports, turned off on exit). Scripts say point VIEW ROW or click LINE COLUMN on the last shown frame. The focus is stored like any event, so the next run of any surface starts from it. The model now points too: random scripts with points (some past the end) and TUI clicks still match it on every surface, a mouse click on a real pseudo-terminal moves the focus, and the stored session keeps it.
* Send the terminal only the cells that changedeunhhu2026-09-263-35/+76
| | | | | | | | | | | | | | | The TUI rebuilt its grid from the app on every change and then sent all of it. It now keeps what the terminal shows and sends each run of changed cells after a cursor move (short unchanged gaps stay in a run, being cheaper than another move; a run that starts in the second half of a wide character starts at its first). A resize sends everything again. vega tui --paint WxH writes the bytes of each frame; the checks replay them with a small terminal emulator and compare with the dumped frame: 4,800 random frames at three sizes agree, and a change costs 139 bytes on average against 1,220 for a whole frame. The interactive check now reads the final screen from the replayed bytes.
* Add vega check for conventions a spec misseseunhhu2026-09-263-3/+79
| | | | | | | | | | | | | Surfaces read a view that misses a convention as something else without a word: a number label makes a list a table, a text tone disappears, a list never shows its other columns, X_focus without a table becomes a field, a second text input has nowhere to type. vega check MODULE names each such place (the view or input and what the surface does instead) and exits 1; the rules sit next to the code that reads the screen. The checks build a spec that misses eight conventions and expect exactly its nine findings, and none in the examples.
* Keep a surface's app in a storeeunhhu2026-09-251-8/+23
| | | | | | | | | | | Every surface takes --store PATH and runs the app on Pure's tree store, so a list typed in the terminal is there the next time, on any surface. Vega and the app carry no saving code; Vega saves the last frame changes when it ends. Checks let the CLI and the sentence surface take turns on one store and match the model each time, and reopen an interactive session's store.
* Add the first component and three surfaceseunhhu2026-09-255-0/+1064
Vega reads a verified Pure module by convention: a table view with a label column is a list (with optional badge, detail and tone), any other table is a table, <table>_focus is its focused row, a title view is the title and other views are fields. lib/vega.aup gives aup apps the tones, which say what a row means; each surface decides how it looks or sounds. vega tui draws the screen in a terminal, keeps the focused row in view and evaluates only the cells on screen; vega cli prints plain lines for pipes; vega say speaks the screen and each focus change as sentences. Display width handles Hangul, CJK, emoji, combining marks and controls. tests/check.py compares the CLI and NUI output with a reference model of examples/todo.aup line for line, checks 9,600 TUI frames for scrolling, focus, badge alignment and the number of cells evaluated, drives the interactive TUI on a pseudo-terminal, and runs every aup example on every surface.