packages feed

ansiform-1.0.0: ChangeLog.md

# Revision history for Ansiform

> Formerly Vis. The 0.4.0 release renames the package and the module namespace.

## Functional Versions

### 1.0.0 -- 2026-10-21
* Forms now draw every prefilled field when they open, so all current values are visible before the first field is focused. The active field redraws the same text and starts with the cursor at the end.
* Marked the library stable at 1.0.0 after the editable form fields, the shortcut key reader, the line editing core and the multiplatform CI work.

### 0.9.0.6 -- 2026-10-21
* Fixed a lone Escape never timing out in `readKeyPress` and the line editor. `waitKey` called `isEOF` before `hWaitForInput`; on a terminal, `isEOF` blocks until the next key, so Esc cancellation and the 50 ms sequence timeout never fired. `waitKey` now relies on `hWaitForInput` and converts only end-of-file exceptions into `KeyEnded`.
* Verified the Linux terminal checklist in `docs/platforms.md` under a pseudo-terminal: immediate keys, arrow isolation, forms, editor navigation, Esc cancellation, horizontal scrolling, colour detection and resize all pass.

### 0.9.0.5 -- 2026-10-21
* Pinned the macOS CI job to `macos-15`. The `macos-latest` image ships an SDK that the GHC 9.14.1 linker cannot parse, so the build failed before the tests ran.

### 0.9.0.4 -- 2026-10-21
* Fixed a Windows crash when rendering to a temporary handle. `termWOn` and `termHOn` now query the terminal size only when the handle is a terminal. The `stty` fallback in `terminal-size` can close a non-console handle on Windows, which broke `renderPage`, `renderSection` and `renderPrinter` on that platform.

### 0.9.0.3 -- 2026-10-21
* Fixed the test suite on Windows. `captureStdout` used lazy `readFile` and tried to remove the temporary file before it was closed; Windows cannot delete an open file. It now uses strict `readFile'`.
* The first Windows CI run exposed this test-only failure.

### 0.9.0.2 -- 2026-10-21
* Added macOS and Windows jobs to the CI matrix for build, test, package check, Haddock and source distribution.
* The cache now uses the Cabal store reported by `haskell-actions/setup`, which works on all three operating systems.
* GHC 9.2.8 is excluded on the arm64 macOS runner, which has no aarch64-darwin bindist; macOS runs GHC 9.14.1.
* Updated the platform and release notes to describe the new matrix.

### 0.9.0.1 -- 2026-10-21
* Automatic colour detection now uses `hSupportsANSI`, so Windows consoles and MinTTY are recognised; `NO_COLOR` still disables styling.
* Escape-sequence timeouts use `hWaitForInput` instead of an asynchronous timeout around `getChar`, which is portable and does not interrupt a blocked read.
* Added `docs/platforms.md` with the Linux, macOS and Windows behaviour, terminal requirements and known limitations.
* The demo and tutorial enable the `winio` I/O manager on Windows, and the demo version label follows the package version.
* Added a regression test that documents the raw `readKey` output for an arrow-key sequence.

### 0.9.0 -- 2026-10-21
* Added `readKeyPress` to `Ansiform.Input`, a key reader for menus that consumes and ignores terminal escape sequences such as arrow keys.
* Fixed the tutorial and the demo treating arrow-key sequences as `A` or `D` shortcuts, which opened the add or edit form instead of moving the selection.
* The tutorial, the demo and the README quick start now use `readKeyPress` in their command loops.
* Updated the demo version label to follow the package version.

### 0.8.0 -- 2026-10-21
* Added `promptWithInitial` to `Ansiform.Input`, opening a form field with an editable initial value.
* Added a single-line editor with insertion, Backspace, Delete, arrows, Home, End, Enter to submit and Esc to cancel the whole form.
* Added `FormCancelled` to `FormError`; code that matches `FormError` exhaustively must handle the new constructor.
* Added `Ansiform.Line` with the pure `LineState`, `LineKey`, `applyLineKey` and `visibleLine` core.
* The editor scrolls horizontally and keeps Unicode widths, so wide characters and combining marks stay aligned.
* Non-terminal input still uses `readLine` and ignores the initial value.
* The tutorial gained an `E` edit mode that prefills the selected bookmark; its form page now takes the footer instruction as a parameter.
* Added docs for editable fields and updated the architecture and roadmap.

### 0.7.10.4 -- 2026-10-21
* Removed the obsolete URL readability comment from the tutorial example and its documentation snippet.

### 0.7.10.3 -- 2026-10-21
* BordersNone now renders a true borderless table with the same row and column layout as the bordered printers, without border characters, horizontal separators or column bands.
* Columns in the borderless mode are separated by two spaces.

### 0.7.10.2 -- 2026-10-21
* Changed defaultTheme.themeMuted from vivid black to italic white for readability on dark terminals.
* Kept defaultTheme.themeRule as bold vivid black.
* Condensed the tutorial form instruction into the footer and removed the extra body line.

### 0.7.10.1 -- 2026-10-21
* Changed the tutorial bookmark URL style from muted black to italic white for readability on dark terminals.
* Kept the tutorial rules on the theme rule style, which is black in the default theme.

### 0.7.10.0 -- 2026-10-21
* Added docs/tutorial.md, a step-by-step guide to a small bookmarks program.
* Added the ansiform-tutorial executable in examples/Tutorial.hs.

### 0.7.9.0 -- 2026-10-21
* Added readForm and readFormOn to Ansiform.Input, reading several page prompts with the cursor arithmetic handled by the library.
* Added Prompt, promptAt and FormError as public types for page forms.
* printerGroupsBordered and its variants now pad unequal groups with empty blocks automatically.
* Added addNumber, subtractNumber and subtractNumberMaybe to Ansiform.Number; checked subtraction reports a negative result as Nothing.
* Clarified the Haddock comments for the single-block and line solid printers, and warned that readLineAt already wraps withLineInput.
* Added docs/number.md.

### 0.7.8.6 -- 2026-10-21
* Fixed README links so they resolve on Hackage.
* Removed the top horizontal rule from the demo header.

### 0.7.8.5 -- 2026-10-20
* Added PVP upper bounds to the directory dependency of the test suite.

### 0.7.8.4 -- 2026-10-18
* Finalized the package metadata with the author name and the project maintainer alias.
* Documented the Hackage candidate workflow for verification before publication.

### 0.7.8.3 -- 2026-10-17
* Removed docs/design-notes.md; the original notes remain available in the Git history.

### 0.7.8.2 -- 2026-10-17
* Changed the Groups shortcut for the philosopher prompt from E to C.
* Added a blank line below the prompt and removed the choose shortcut from the prompt page.
* Removed the local secrets file path from the release guide and repository history.
* Removed personal SSH paths from the release guide and reviewed the documentation, translating the remaining design notes.

### 0.7.8.1 -- 2026-10-17
* Merged the Groups prompt message and input line into a single footer line.

### 0.7.8.0 -- 2026-10-17
* Added readLineAt and readLineAtOn to Ansiform.Input for prompts printed inside a page.
* The demo Groups prompt now lives in the footer, above the command keys, so nothing is printed below the footer.
* Fixed the demo losing immediate key input after returning from a philosopher article.
* Translated the demo prompt and the E key label to English.

### 0.7.7.1 -- 2026-10-17
* Updated the README dependency list and documentation index.
* Recorded the initial push and roadmap completion in the release checklist.

### 0.7.7.0 -- 2026-10-17
* Added withLineInput and readLine to Ansiform.Input.
* Replaced the Cicero and Locke shortcuts with an E Escolher prompt that accepts any philosopher number.
* Back from a philosopher article now returns to the Groups screen.

### 0.7.6.0 -- 2026-10-17
* Added dedicated demo screens and articles for Cicero and Locke.
* Added C and L shortcuts to the Groups footer.
* Added a CI matrix with GHC 9.2.8 and GHC 9.14.1.
* Documented direct command-line Hackage tokens and SSH setup for GitHub.

### 0.7.5.2 -- 2026-10-17
* Renamed CHANGELOG.md back to ChangeLog.md, following the Hackage convention.
* Documented the Hackage token key at the top level of ~/.cabal/config.

### 0.7.5.1 -- 2026-10-17
* Documented every public function and type with Haddock comments; all public modules report 100% coverage.
* Changed the default theme footer to italic white for readability.
* Documented Hackage and GitHub credential configuration in docs/releasing.md.

### 0.7.5.0 -- 2026-10-17
* Added Borders with ASCII, light, heavy and double styles.
* Added the printerTableBordered and printerGroupsBordered families.
* Added the GitHub repository metadata and configured the origin remote.
* The demo Rich screen now uses a light bordered table and unknown keys are ignored without a message.

### 0.7.4.0 -- 2026-10-17
* Added Ansiform.Theme with Theme and defaultTheme.
* Added blockMenuStyle for menu keys that use a Style instead of a Color.
* Updated the demo header, footer, menus, rules and simple table to use the theme.
* Fixed the demo Tables column width so Tchaikovsky is readable.
* Added docs/theme.md.

### 0.7.3.0 -- 2026-10-17
* Added Ansiform.Table with per-column alignment, maximum widths and ellipsis truncation.
* Added printerTableFormat, printerTableFormat', printerTableLimitedFormat and printerTableLimitedFormat'.
* Updated the demo Tables screen to right-align numeric columns and truncate long composer names.
* Added docs/table-format.md.

### 0.7.2.0 -- 2026-10-17
* Added handle-aware runners: startOn, drawOn, redrawOn, amendOn, replaceOn and their variants.
* Added runPrinterOn, runPrinterDefaultOn and runPrinterDefaultOn' for writing to a specific handle.
* Added Ansiform.Render with renderPage, renderSection and renderPrinter.
* Added docs/render.md and expanded the demo article for the Article screen.

### 0.7.1.0 -- 2026-10-17
* Added Ansiform.Input with withImmediateInput and readKey, making single-key interaction the standard library pattern.
* Updated the demo to use the shared input API and restore terminal state automatically.
* Added Unicode-aware display widths through Ansiform.Width, used for wrapping, alignment, lists and tables.
* Added docs/input.md and updated the README quick start, pages, architecture, content and roadmap.

### 0.7.0 -- 2026-10-17
* Added the ColorMode setting with Auto, Always and Never.
* Auto suppresses ANSI styles when stdout is not a terminal, when NO_COLOR is set or when TERM is dumb.
* Added the colorMode modifier and the autoColors, alwaysColors and neverColors shortcuts.
* Added regression tests for style suppression and forced styling.
* Renamed ChangeLog.md to CHANGELOG.md (reverted in 0.7.5.2).

### 0.6.1 -- 2026-10-17
* Added the GitHub Actions CI workflow.
* Added docs/releasing.md with the Hackage and GitHub checklist.
* Added docs/roadmap.md with prioritized feature suggestions.
* Added module-level Haddock headers to the public modules.

### 0.6.0 -- 2026-10-17
* Renamed the internal vis* builders to form* (formItem, formBlock, formGroup, ...).
* Renamed the low-level style helpers to descriptive names (applyStyle, resetStyle, styleCommands, colorCommands, formatCommands, setBackground, swapBackground).
* Renamed the public visNumber to formNumber.
* Updated the demo, tests and docs for the new builder names.

### 0.5.0 -- 2026-10-17
* Removed the Vis prefix from all public types.
* Renamed VisItem to Item, VisBlock to Block, and so on, including Color, Format, Style, Printer, Section, Page, Settings, Config, State and Sample.
* Updated the demo, tests, README and docs for the new type names.
* Kept the internal vis* builder helpers as implementation details.

### 0.4.0 -- 2026-10-17
* Renamed the package to ansiform and the module namespace to Ansiform.
* Changed the license from GPL-3.0-only to MIT.
* Updated the README, docs, demo and tests for the new name.
* Kept the Vis* type names for now; removing the prefix is future work.

### 0.3.5 -- 2026-10-17
* Modernized the Cabal setup to cabal-version 3.0.
* Added a common stanza and a cabal.project file.
* Removed the obsolete Setup.hs and switched to the SPDX license identifier.
* Documented the existing Hackage Vis package and recommended ansiform for publication.

### 0.3.4 -- 2026-10-17
* Documented the name rationale and its relationship to vis-network.js.
* Added a disambiguation note to the README.

### 0.3.3 -- 2026-10-17
* Fixed printLineCenter so blocks respect the minimum space and never overlap.
* Made the demo menu use the same shortcut presentation as the footer.
* Split the demo footer commands into two rows to keep long labels readable.

### 0.3.2 -- 2026-10-17
* Reflowed the README and documentation to remove hard wrapping.
* Added a blank line above the demo's main header line.
* Changed the demo to read single keys without a prompt or Enter.
* Fixed the Exit key highlight in the demo menu.
* Documented the evaluation of the proposed monadic Printer and Section interface.

### 0.3.1 -- 2026-10-17
* Removed the extra solid bar from the demo header, which covered part of the second line.
* Made the demo footer shortcuts functional with an interactive screen loop.
* Documented the decision to defer the Text and Seq migrations.

### 0.3.0 -- 2026-10-17
* Revival release: removed Example and internal modules from the public Vis module.
* Added public Vis.Number and Vis.Sample modules.
* Added the vis-demo executable and the vis-test suite.
* Made paragraph wrapping, list layout and group layout total for empty and narrow inputs.
* Fixed a division by zero in group overflow handling.
* Preserved section line counts across chained replace calls.
* Added documentation in docs/ and rewrote the README as an index.
* Enabled -Wall and cleaned compiler warnings.

## Early Versions

### 0.2.2.7 -- 2020-05-29
* Implementation of Sample instance for VisNumber.
* Refining of Sample class and instances for all types.

### 0.2.2.5 -- 2020-05-23
* Got rid of the Result type and module.
* Reversal of Show instances to default, creation of Sample class.
* Implementation of sample functions.
* Created Printer for single Item.

### 0.2.2.1 -- 2020-05-21
* Implemented minimum number of lines for Sections.

### 0.2.2.0 -- 2020-05-20
* Finished amend functionality for VisPage and workflow.
* Made Settings update at each redraw.
* Created the new VisConfig type for internal use.
* Made VisSettings the user exposed settings type.
* Made the basic Run functions work with configs, not settings.
* Created Draw module and internal State module.

### 0.2.1.4 -- 2020-05-19
* Exposed the basic builders.
* Reworked type runners to deal with IO separately.
* Defined VisState type and top level functionality.
* Created VisResult type to associate printed line numbers with Sections.
* Separated VisPage internal functionality.

### 0.2.0.9 -- 2020-05-09
* Gave up on verbose mode.
* Moved VisPrinter type to internal module.
* Reworked Show instances for most types and VisPrinter.
* Reworked Show instance for VisSection and moved type to internal module.

### 0.2.0.5 -- 2020-05-08
* Made VisItem remove non-printable characters.
* Creation of Internal folder to separate internal modules.
* Creation of Show Instances to implement the Verbose mode.
* Implementation of Settings type and functions.
* Improved Section type to calculate the total printed lines.

### 0.2.0.0 -- 2020-05-07
* Major change so VisPrinter returns the number of lines printed.
* Major refactoring and module splits.

### 0.1.1.0 -- 2020-04-25
* VisPrinter functionality implemented.

### 0.1.0.5 -- 2020-04-19
* Restarted project.
* Implemented basic content types and styles.

### 0.1.0.0 -- 2018-06-12
* First version, very basic functionality, not commited to VCS.