reflex-vty
Reflex FRP host and widgets for VTY applications
| Stackage Nightly 2026-06-28: | 1.1.0.0 |
| Latest on Hackage: | 1.1.0.0 |
reflex-vty-1.1.0.0@sha256:7fc01120ccfe48d48a1b4d8ddf2cb9599cf99d211b087bd2d47164f109d07927,5596Module documentation for 1.1.0.0
- Control
- Control.Monad
- Data
- Data.Text
- Reflex
reflex-vty
Build terminal user interfaces with functional reactive programming.
reflex-vty provides a Reflex FRP host and a library of reactive widgets for Vty terminal applications: layout, text input and editing, boxes, scrolling, mouse support, focus management, and theming.
A minimal app
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Reflex.Vty
main :: IO ()
main = mainWidget def $ do
text "Hello, reflex-vty! Press Ctrl+C to quit."
ctrlc
mainWidget takes a VtyAppConfig (def for the defaults) and runs a widget until the Event t () it returns fires. Here that is ctrlc, which fires when the user presses Ctrl+C. Docs are available on Hackage.
Features
- Layout: arrange widgets into rows and columns (
tile/grout) with fixed or proportional (stretch) size constraints. - Focus: tab-cycling focus management across the focusable widgets in a layout (
tabNavigation). - Text: word-wrapped text display, rich text with per-span attributes, and single- or multi-line text input backed by a zipper that handles wide characters, tabs, and wrapping.
- Inputs: clickable buttons, hyperlinks, and checkboxes.
- Boxes: single, thick, double, rounded, ASCII, inner-half, and outer-half border styles, with optional titles and horizontal rules.
- Scrolling: scrollable containers with programmatic scrolling, auto-scroll-to-bottom mode, and a visual scrollbar with four visibility modes (always, thumb-only, while-scrolling, hidden).
- Split panes: fixed horizontal and vertical splits, plus a mouse-draggable splitter you can resize at runtime (
splitVDrag). - Mouse: button clicks, drags (with from/to/button/modifier tracking), scroll-wheel events, and last-known mouse-position tracking.
- Keyboard: individual key and key-combo events, plus input filtering.
- Runtime: alternate-screen mode, terminal cursor control (shape, visibility, and position), bracketed paste, terminal focus tracking, resize, and POSIX signal handling.
- Theming: a
Themerecord with presets (default, dark, charm, dracula, nord, zenburn, gruvbox). Widgets inherit the ambient theme and can override locally. - Declarative styling: Lip Gloss-inspired
Styletype with foreground/background colors, text attributes (bold/italic/underline/etc.), padding, margin, borders with per-side colors, width/height constraints, alignment, text transforms, tab expansion, inline mode, whitespace coloring, and border presets. - Color:
RGBcolor type, operations (darken,lighten,complementary,mix,alpha), and gradients (Gradient1D,Gradient2D). - Compositing:
Reflex.Vty.Canvasmodule with per-cell transparency for overlays and layered rendering. - Image composition:
joinHorizontal/joinVertical/placeutilities for composing rendered images. - Color profiles: automatic terminal color-capability detection (
TrueColor/Ansi256/Ansi16/Ascii/NoTTY) with downsampling.
Run the bundled demo with cabal run example to see many of these in action: a text editor, a to-do list, scrollable text, clickable buttons, a live CPU-usage display with a true-color gradient bar, a scrollbar-modes demo, a terminal-cursor demo, and a little styling showcase featuring gradients, color operations, a canvas overlay, border presets, theming, and color-profile downsampling.
Example gallery
Each of these examples is a module in src-bin/Example/. You can run any of them with cabal run examples -- <name>.
spinner — an animated braille spinner |
|
progress — a gradient-filled progress bar |
|
stopwatch — a tick-driven count-up timer |
|
timer — a count-down timer |
|
textinput — a focused text-input field |
|
pager — a scrollable text viewport |
|
views — toggle between two views |
More demos: full-screen canvas animations (the classic Doom fire, a plasma field, a starfield, an animated splash) live on the examples page.
Feature requests, pull requests, and other feedback are welcome and appreciated (see the contribution guide).
How to Build
With reflex-platform
Enter a nix-shell for the project:
git clone https://github.com/reflex-frp/reflex-vty.git
cd reflex-vty
nix-shell
From within the nix-shell you can:
- Run the example:
cabal run example - Load the library in the repl:
cabal repl reflex-vty - Build the example executable:
cabal build example - Build the docs:
cabal haddock - Run ghcid for immediate compiler feedback when you save a .hs file:
ghcid -c "cabal repl library:reflex-vty executable:example test:reflex-vty-test --ghc-options=-Wall" -o ghcid-output.txt - etc.
Selecting a compiler
nix-shell defaults to GHC 9.8. The other compilers defined in release.nix are ghc94, ghc96, and ghc98. To enter a shell with one of them, pass it as the compiler argument:
nix-shell --argstr compiler ghc96
If you were previously building with a different compiler, you may need to run cabal clean first.
With cabal
Please see the tested-with field of the cabal file for known-compatible versions of GHC.
From the reflex-vty project directory:
# nix-shell -p cabal-install binutils icu # for nix users
cabal build # to build the library, example, and test suite
cabal repl # to enter a multi-repl covering all components
cabal repl example # to enter a repl for the example executable only
About Obsidian Systems
reflex-vty is built and maintained by Obsidian Systems. We provide frontier engineering for high-assurance systems: we build production software in Haskell and Nix, and we’re long-time stewards of open-source tooling like Obelisk, Reflex, and nix-thunk.
If you’re working with Reflex, terminal or web UIs in Haskell, or Nix and want a partner to help design, build, or ship it, we’d love to hear from you.
- Website: https://obsidian.systems
- Blog: https://blog.obsidian.systems
- GitHub: https://github.com/obsidiansystems
License
reflex-vty is released under the BSD-3-Clause License, © 2018 Obsidian Systems LLC.
Changes
Revision history for reflex-vty
1.1.0.0
- Breaking change: reflex-vty now builds on Windows. OS signals are handled through a platform-agnostic type called
AppSignal. This changesVtyApp’s signal argument (Event t AppSignalinstead ofEvent t Signal(synonym forCInt)).
1.0.0.1
- Add some more examples, especially of the new canvas features
1.0.0.0
- Breaking change: Add
HasColorProfileclass (withcolorProfile/localColorProfileand aColorProfileReadertransformer) toReflex.Vty.Widget. Widgets can callcolorProfileto make decisions based on terminal capability. - Breaking change:
CheckboxConfig._checkboxConfig_attributesremoved;checkboxreads fromHasTheme. - Breaking change:
HasDisplayRegionnow hasaskViewportandlocalLayoutRegionmethods, separating layout height (inflated insidescrollable) from viewport height (real terminal size). Rendering widgets useviewportWidth/viewportHeight; layout system usesdisplayWidth/displayHeight. - Breaking change:
HasThemenow has a structuredThemerecord (inReflex.Vty.Theme) instead ofBehavior t V.Attr. UsethemeAttrto get theV.Attr, orthemefor the full record. - Breaking change:
Reflex.Vty.Style.renderborder attr now inherits from the contentbaseAttrinstead oftransparentAttr, so borders pick up themed foreground/background unlesswithBorderForeground/withBorderBackgroundis explicitly set. - Breaking change:
Reflex.Vty.Stylere-exports color constants (red/yellow/white/etc.) fromReflex.Vty. - Breaking change:
ScrollableConfighas a new field_scrollableConfig_scrollbarVisibility :: ScrollbarVisibility. - Breaking change:
TextInputConfighas a new field,_textInputConfig_alignment :: TextAlignment, controlling how entered text is aligned within the input region.defusesTextAlignment_Left. - Breaking change:
boxTitlenow takes aBehavior t TextAlignmentas its first argument, controlling title alignment within the top border. Passpure TextAlignment_Centerto preserve the old behavior.boxandboxStaticare unchanged. - Breaking change:
scrollableandscrollableTextnow requirePerformEvent t m,TriggerEvent t m, andMonadIO (Performable m)constraints (needed forScrollbarWhileScrollingdebounce). - Breaking change:
Reflex.Vty.Host.runVtyAppWithHandle,runVtyApp, andReflex.Vty.Widget.mainWidget/mainWidgetWithHandlenow take aVtyAppConfigas their first argument. Usedef(aDefaultinstance) ordefaultVtyAppConfigfor the defaults._vtyConfig_eventQueueCapacityconfigures the bounded event-queue capacity used to backpressure fast external producers. - Breaking change:
Reflex.Vty.Widget.Input.Mouse.Dragreplaces the_drag_end :: Boolfield with_drag_state :: DragState, whereDragStateisDragStart | Dragging | DragEnd. This distinguishes the start of a drag from its continuation (#87). Migrate_drag_end dto_drag_state d == DragEnd. The pure state machine is now exposed asstepDragfor testing. - Add
Reflex.Vty.Canvasmodule: per-cell compositing with transparency.Canvastype (sparseMapof cells),placeCanvas,translate,stack,imageToCanvas/canvasToImageconversions. - Add
Reflex.Vty.ColorProfilemodule:ColorProfiledatatype (TrueColor/Ansi256/Ansi16/Ascii/NoTTY),detectColorProfile/colorProfileFromVtyto read the terminal’s capability from vty handle,convertColorfor downsampling, andapplyProfileto downsample an entireV.Attr(resets colors/style toDefaultforAscii/NoTTY). - Add
Reflex.Vty.Colormodule:RGBcolor type withdarken,lighten,complementary,mix,alphaoperations;Gradient1D(n-stop linear interpolation) andGradient2D(bilinear corner interpolation);toRGB/fromRGBconversions to/from vtyColor. - Add
Reflex.Vty.Style.mergeAttr: overlay oneV.Attron another, whereSetTofields take precedence andDefault/KeepCurrentfall through. - Add
Reflex.Vty.Styleborder presets:innerHalfBorder(▀▄▌▐),outerHalfBlockBorder(▔▁▏▕). - Add
Reflex.Vty.Styleimage composition:joinHorizontal,joinVertical,placeHorizontal,placeVertical,place. - Add
Reflex.Vty.Stylesetters:withTransform(text transform),withTabWidth(tab expansion),withMarginBackground(colored margin),withInline(skip margin/padding/border),withColorWhitespace(toggle fill coloring),withBorderTopForeground/withBorderBottomBackground/etc (per-side border colors, 8 setters). - Add
Reflex.Vty.Styletext utilities:truncateWith(ellipsis truncation respecting display width),textHeight,textSize. - Add
Reflex.Vty.Style: Lip Gloss-inspired declarative styling. - Add
Reflex.Vty.Theme.darkTheme. - Add
Reflex.Vty.Themepresets:charmTheme,draculaTheme,nordTheme,zenburnTheme,gruvboxTheme. - Add
Reflex.Vty.Widget.Box.alignText, a general-purpose text alignment function. - Add
Reflex.Vty.Widget.Text.textWithAlignment, an alignable version oftext.textis now a synonym fortextWithAlignment TextAlignment_Left. - Add visual scrollbar to
Reflex.Vty.Widget.Scroll.scrollablewith four visibility modes:ScrollbarAlways(gutter + thumb),ScrollbarThumbOnly(thumb only),ScrollbarWhileScrolling(thumb appears while scrolling, hides viadebounce),ScrollbarHidden. Default isScrollbarThumbOnly. Controlled via_scrollableConfig_scrollbarVisibilityonScrollableConfig. - Change
Reflex.Vty.Theme.darkTheme: specify colors directly (greenonblack) instead of usingreverseVideo. - Fix
Reflex.Vty.Style.measure: usestextWidth(wcwidth) and splits on newlines for correct multi-line and wide-character dimensions. - Fix
Reflex.Vty.Style.render: now handles multi-line text viaV.vertCatper-line rendering. - Fix
Reflex.Vty.Widget.Input.link: now uses_theme_linkon ambientthemeAttrinstead ofV.defAttrto preserve themed background. - Fix
Reflex.Vty.Widget.Text.richText: now merges config attrs onthemeAttrviamergeAttr, soRichTextConfig definherits the ambient theme. - Fix
textButtoncentering: now usestextWithAlignment TextAlignment_Center. - Fix
textInputcursor: uses_theme_textInputCursorinstead of hardcodedreverseVideo. - Fix
Data.Text.Zipper.displayLinesWithAlignment: the cursor is now rendered as a blank highlighted cell when it sits past the last character of a line or on an empty line. - Fix space leak in
Reflex.Vty.Host.runVtyAppWithHandle: an application that fired external triggers (e.g. a hotperformEventAsynccallback) faster than the host could process would grow the host’s event channel without limit. The host now backpressures producers via a bounded, closeable event queue, and drains every available batch each frame (firing each in its own Reflex frame, redrawing once), so memory is bounded and no event occurrences are dropped. The bounded capacity is configurable via the newVtyAppConfig(see the breaking-change entry above; default 4096). - Behavior change: external event triggers (
performEventAsync,newTriggerEvent, etc.) may now block when the host’s event queue is full, throttling a producer that fires faster than the host can process to the host’s own rate. This is the intended flow-control; shutdown closes the queue so any blocked producer is released. - Debounce terminal resize events (50ms) to reduce lag and flicker during window drag.
- Enable terminal focus tracking mode by default. Add
gainedFocusandlostFocushelpers toReflex.Vty.Widget. - Enable bracketed paste by default. Add
pastehelper toReflex.Vty.Widget.textInputnow handles paste events. - Add
mousePositionhelper toReflex.Vty.Widget.Input.Mouse— tracks last known mouse coordinates from click/release events. True hover (motion without button) deferred — requires terminal mode 1003 which vty does not expose. - Add terminal cursor control:
CursorStyle,CursorVisibility,CursorState, and theHasCursorcapability withsetCursor/tellCursorhelpers. - Add alternate screen support:
ScreenMode,setScreenMode, and theHasScreenModecapability withtellScreenMode/enterAlternateScreen/exitAlternateScreenhelpers. The host restores normal screen on shutdown. - Breaking change:
VtyAppnow takes a third argument,Event t Signal, exposing POSIX signals (SIGINT, SIGTERM, SIGHUP). SIGINT and SIGTERM automatically trigger clean shutdown, replacing the old Ctrl-C key detection. - Install POSIX signal handlers (SIGINT, SIGTERM, SIGHUP) in
runVtyAppWithHandle. Addunixdependency.
0.6.2.1
- Update dependency version bounds
0.6.2.0
- Relax bounds for GHC 9.12.2 by @plt-amy in https://github.com/reflex-frp/reflex-vty/pull/97
- scrollable: promptly use
displayHighton scroll by @Rosuavio in https://github.com/reflex-frp/reflex-vty/pull/94
0.6.1.1
- Extend version bounds
- Add support for GHC 9.8.4
0.6.1.0
- Fix mouse input translation in scrollable elements
0.6.0.0
- Breaking Change:
Reflex.Vty.Widget.Scroll.scrollable’s type has changed. The child widget no longer has to return images (seecaptureImagesbelow), but can return a value. Specifically, the child widget type has gone fromm (Behavior t Image, Event t ())tom (Event t (), a). - Breaking Change: Instance of
HasImageWritermust now implementcaptureImages, a function that allows theImages produced by a widget to be intercepted and not rendered. This is used to implementscrollable.
0.5.2.1
- Extend version bounds
0.5.2.0
- Update to use latest version of vty (for cross-platform support)
- Fix an issue where the cursor tag is not used for an empty string in
displayLineWithAlignment
0.5.1.0
- Change
inputInFocusedRegionto filter mouse scroll wheel input based on if the region under than the mouse rather than using mouse drag tracking - Add MonadCatch, MonadThrow, and MonadMask instances (relies on reflex-0.9.2.0 or greater)
0.5.0.0
- Breaking change:
scrollableTextnow takes aScrollableConfigurationinstead of just anEvent t Intof lines to scroll by. Replacing ascrollableText myEventinvocation withscrollableText (def { _scrollableConfig_scrollBy = myEvent })should recover the old behavior.scrollableTextnow returns aScrollable tinstead of aBehavior (Int, Int). The secondInt, representing the total number of lines, is part of theScrollablerecord. The firstInt, representing the current scroll position is replaced by theScrollPosin theScrollableoutput.ScrollPosis a new type that captures whether ascrollableTextis scrolled to the very top, very bottom, or somewhere in between.
scrollableTextcan now be given a starting scroll position and an event that scrolls it to a particular position.scrollableTextcan be configured to remain scrolled to the bottom on new output, either always or whenever the user is scrolled to the bottom and new output appears.- Added a new
scrollablewidget inReflex.Vty.Widget.Scrollthat allows vertical scrolling when anImageis taller than the widget’s height. - Add
ctrlc, a convenience function that returns an event that fires when a Ctrl+c keypress is detected - Fix several issues with wide chars, cursor position and word wrapping in Zipper.hs
- Add
centerTextfunction to Reflex.Vty.Widget.Box
0.4.1.1
- Support ghc-9.6
0.4.1.0
- Loosen version bounds and support GHC 9.4.4
- Add
MonadHold t (Performable m)andMonadFix (Performable m)instances toMonadVtyApp
0.4.0.0
- Breaking Changes:
- Added mouse tracking to the behavior of
panesuch that- Mouse actions that start outside of the region are not tracked
- Mouse drag sequences that start OFF the region are NOT reported
- Mouse drag sequences that start ON the region and drag off ARE reported
- Introduce
MonadHoldconstraint topane
- Added
MonadHoldconstraint to several methods that usepane
- Added mouse tracking to the behavior of
0.3.1.1
- Loosen version bounds and support GHC 9.4
0.3.1.0
- Replace
memptywithdefAttrfor Attr from Graphics.Vty to make it compatible with vty-5.34
0.3.0.0
- Re-design
textInput,TextInputandTextInputConfig.- Allows users to implement more complex behavior.
_textInputConfig_modifyis now applied to the text-value oftextInputafter user input events such as mouse clicks and keyboard input. This may change the observable behavior.
0.2.0.1
- Loosen version bounds on ref-tf and vty
0.2.0.0
- Module Reorganization: The following modules have been added (and are all re-exported by Reflex.Vty):
- Reflex.Vty.Widget.Box for all the box functions and datatypes
- Reflex.Vty.Widget.Input.Mouse for clicking, dragging, and scrolling
- Reflex.Vty.Widget.Split contains
splitV,splitH, etc - Reflex.Vty.Widget.Text contains text rendering functions like
textanddisplay
- Bugfixes:
- Remove text-icu dependency and switch to
wcwidthfrom vty package to compute character width inData.Text.Zipper. goToDisplayLinePositioninData.Text.Zippercorrectly accounts for character width now.- #37
Layoutshould support focus changes through nested layouts (thanks @pdlla for getting this started – see entry on Layout and Focus below). - Fix distribution of available space when it cannot be evenly distributed. Previously, all leftover space would be allocated to the first stretchable widget.
- Remove text-icu dependency and switch to
- Breaking Changes:
- Layout and focus have been substantially refactored to fix #37 and support a wider variety of layouts and focus switching requirements.
- Added a new
HasFocusclass (the old one is nowHasFocusReader) to produce focusable elements, and manage focus state. See the “Focus” section of the Reflex.Vty.Widget.Layout module documentation. Layoutno longer has any focus-tracking responsibility. See the “Layout” section of the Reflex.Vty.Widget.Layout module documentation.tileno longer takes a configuration record and no longer requires that its child widget return a focus request event. Focus requests are instead handled using calls torequestFocusin the child widget.- Calls to
fixedandstretchmust now be replaced withtile . fixedandtile . stretch stretchnow takes a minimum size argument- Added
flexwhich is equivalent tostretch 0 tabNavigationno longer returns anEvent. Instead it callsrequestFocusdirectly with the appropriateRefocus_Shiftvalue.- Added
axis(inHasLayout), a lower-level primitive which is used to implementrowandcol. - Added
region(inHasLayout), which is used to claim screen real estate and used to implementtileandgrout - Added
grout, a container element that is not itself focusable (though its children can be)
- Added a new
- Removed
VtyWidgetand replaced it with a number of separate classes and monad transformers- Replace
HasDisplaySizewithHasDisplayRegionwhich carries around a region instead of just a width and height.displayWidthanddisplayHeightare now functions implemented in terms ofaskRegioninstead of class methods. - Add a
DisplayRegionmonad transformer - Rename
ImageWritertoHasImageWriter - Introduce an
ImageWritermonad transformer - Rename
HasFocustoHasFocusReader - Introduce a
FocusReadermonad transformer - Replace
HasVtyInputwithHasInput - Introduce an
Inputmonad transformer - Introduce
HasThemereader class to allow setting Vty attributes of all built-in widgets - Introduce
ThemeReadermonad transformer
- Replace
- Remove
DynRegionandcurrentRegion. UseDynamic t Regionandcurrentinstead. This also changes the type ofpane’s argument. CheckboxConfignow has a field taking anEventto set the value of the checkbox.checkboxnow accepts keyboard input (spacebar to check and uncheck) and is displayed in bold when focused.HasInput(formerlyHasVtyInput) now has a methodlocalInputfor filtering the input a child widget may receiveHasImageWriternow has a methodmapImagesfor transforming the images emitted by a child widgetboxTitlenow takes aBehavior t Textas its title, instead of a plainTextfillnow takes aBehavior t Charinstead of aChar- The following functions are no longer specialized to
VtyWidget:pane: Now requiresHasInput t m, HasImageWriter t m, HasDisplayRegion t m, HasFocusReader t mdrag: Now requiresHasInputmouseDown: Now requiresHasInputmouseUp: Now requiresHasInputmouseScroll: Now requiresHasInputkey: Now requiresHasInputkeys: Now requiresHasInputkeyCombo: Now requiresHasInputkeyCombos: Now requiresHasInputsplitV: Now requiresHasDisplayRegion t m, HasInput t m, HasImageWriter t m, HasFocusReader t msplitH: Now requiresHasDisplayRegion t m, HasInput t m, HasImageWriter t m, HasFocusReader t msplitVDrag: Now requiresHasDisplayRegion t m, HasInput t m, HasImageWriter t m, HasFocusReader t mfill: Now requiresHasImageWriterandHasDisplayRegionboxTitle: Now requiresHasDisplayRegion t m, HasImageWriter t m, HasInput t m, HasFocusReader t m, HasTheme t mbox: Now requiresHasDisplayRegion t m, HasImageWriter t m, HasInput t m, HasFocusReader t m, HasTheme t mboxStatic: Now requiresHasDisplayRegion t m, HasImageWriter t m, HasInput t m, HasFocusReader t m, HasTheme t mrichText: Now requiresHasImageWriter, andHasDisplayRegionscrollableText: Now requiresHasInput,HasImageWriter,HasTheme, andHasDisplayRegionblank: Now requiresMonadbutton: Now requiresHasFocusReader,HasInput,HasImageWriter,HasTheme, andHasDisplayRegiontextButton: Now requiresHasFocusReader,HasInput,HasImageWriter,HasTheme, andHasDisplayRegiontextButtonStatic: Now requiresHasFocusReader,HasInput,HasImageWriter,HasTheme, andHasDisplayRegionlink: Now requiresHasInput,HasImageWriter,HasTheme, andHasDisplayRegioncheckbox: Now requiresHasFocusReader,HasInput,HasImageWriter, andHasDisplayRegion
- TextZipper interface changes
_displayLines_offsetMaptype changed toOffsetMapWithAlignment_displayLines_cursorYreplaced with_displayLines_cursorPoswhich include X position- some exposed methods intended for internal use only have been removed
textInput: Now requiresHasFocusReader,HasInput,HasImageWriter,HasTheme, andHasDisplayRegionmultilineTextInput: Now requiresHasFocusReader,HasInput,HasImageWriter,HasTheme, andHasDisplayRegiontextInputTile: Now requiresHasFocusReader,HasInput,HasLayout,HasTheme, andHasFocus
- Layout and focus have been substantially refactored to fix #37 and support a wider variety of layouts and focus switching requirements.
- Misc:
- (#40 Add alignment support to TextZipper)[https://github.com/reflex-frp/reflex-vty/pull/40]
- Add alignment (left/center/right) support to TextZipper
- Add basic unit tests for newly created alignment methods in TextZipper
- Add default instances for
HasInput,HasFocus, andHasImageWriter - Export
withinImageand addimagesInRegionto crop images to a region - Add
anyChildFocused, which provides information about whether subwidgets are focused - Add
filterKeys, which is the same aslocalInputbut only cares about keyboard events - Add
hoistRunLayoutto apply a transformation to the context of aLayoutaction and run that action - Add various
MFunctorinstances - Add a CPU usage indicator to the example executable
- (#40 Add alignment support to TextZipper)[https://github.com/reflex-frp/reflex-vty/pull/40]
0.1.4.2
- Wider bounds for GHC 8.10 support
0.1.4.1
0.1.4.1
- Migrate to new dependent-sum / dependent-map (after the “some” package split)
0.1.4.0
- (#15) Add
PostBuildinstance forLayout. - (#17) Add
splitHto implement horizontal functionality ofsplitV. - (#19) Add
boxTitle: a box with a title. - (#19) Update the text editing example to use
boxTitle. - (#21) Fix bug in
dragthat caused dragging with different mouse button to trigger the click event. - (#22) Add support for GHC 8.8.
0.1.3.0
- Add
mouseScrollto capture scroll wheel events. - Add
scrollableText: a text display widget that can be scrolled using the mouse or keyboard. - Add widget to the example executable that displays scrollable text.
0.1.2.1
- Add
keyCombofunction (single-key-combination version ofkeyCombos). - Use upstream
NotReadyinstances instead of orphans defined in this package if reflex-0.6.3 is available.
0.1.2.0
- Allow
TextZippercontents to be transformed before being displayed. - Fix bug in
roworientation. - Handle wrapping of lines containing full-width unicode characters in
textInput.
0.1.1.1
- Bump minimum version of reflex.
0.1.1.0
- Set version bounds in cabal file.
- Add travis CI config.
0.1.0.0
- Initial release