2013-01-27 16:06:58 +00:00
# blessed
2015-03-19 11:17:13 +00:00
A curses-like library with a high level terminal interface API for node.js.
2013-01-27 16:06:58 +00:00
2013-07-16 01:33:47 +00:00
![blessed ](https://raw.github.com/chjj/blessed/master/img/screenshot.png )
2015-03-18 06:42:21 +00:00
Blessed is over 16,000 lines of code and terminal goodness. It's completely
2015-03-18 06:26:27 +00:00
implemented in javascript, and its goal consists of two things:
1. Reimplement ncurses entirely by parsing and compiling terminfo and termcap,
and exposing a `Program` object which can output escape sequences compatible
with _any_ terminal.
2015-03-19 11:17:13 +00:00
2. Implement a widget API which is heavily optimized for terminals.
The blessed renderer makes use of CSR (change-scroll-region), and BCE
(back-color-erase). It draws the screen using the painter's algorithm and is
sped up with smart cursor movements and a screen damage buffer. This means
rendering of your application will be extremely efficient: blessed only draws
the changes (damage) to the screen.
2015-03-18 06:26:27 +00:00
Blessed is arguably as accurate as ncurses, but even more optimized in some
ways. The widget library gives you an API which is reminiscent of the DOM.
Anyone is able to make an awesome terminal application with blessed. There are
2015-03-19 12:23:56 +00:00
terminal widget libraries for other platforms (primarily [python][urwid] and
[perl][curses-ui]), but blessed is possibly the most DOM-like (dare I say the
most user-friendly?).
2015-03-18 06:26:27 +00:00
Blessed has been used to implement other popular libraries and programs.
Examples include: the [slap text editor][slap] and [blessed-contrib][contrib].
2015-03-19 11:17:13 +00:00
The blessed API itself has gone on to inspire [termui][termui] for Go.
2015-03-18 06:26:27 +00:00
2015-03-31 12:32:05 +00:00
## Important Blessed Changes (>0.0.51)
- The absolute `.left` _property_ (not option) has been renamed to `.aleft` .
The `.rleft` property has been renamed to `.left` . This should not have much
effect on most applications. This includes all other coordinate properties.
- `autoPadding` is now enabled by default. To revert to the original behavior,
pass `autoPadding: false` into the screen object. That being said, it would
be wiser to adjust your code to use `autoPadding` . non-`autoPadding` is now
considered deprecated.
2013-07-17 00:12:08 +00:00
## Install
``` bash
2013-07-16 05:18:31 +00:00
$ npm install blessed
2013-07-17 00:12:08 +00:00
```
2013-07-16 05:18:31 +00:00
2013-07-15 22:45:08 +00:00
## Example
2013-01-27 17:14:06 +00:00
2013-07-16 22:50:02 +00:00
This will render a box with line borders containing the text `'Hello world!'` ,
2013-06-14 00:02:02 +00:00
perfectly centered horizontally and vertically.
2013-06-11 16:48:37 +00:00
2015-03-18 06:26:27 +00:00
__NOTE__: It is recommend you use either `smartCSR` or `fastCSR` as a
`blessed.screen` option. `autoPadding` is also recommended; it will
automatically offset box content within borders instead of on top of them when
coords are `0` . non-`autoPadding` _may_ be deprecated in the future. See the
API documentation for further explanation of these options.
2013-06-11 16:48:37 +00:00
``` js
2013-07-15 22:45:08 +00:00
var blessed = require('blessed');
2013-06-11 16:48:37 +00:00
2013-07-15 22:45:08 +00:00
// Create a screen object.
2015-03-18 06:26:27 +00:00
var screen = blessed.screen({
autoPadding: true,
smartCSR: true
});
2013-07-15 22:45:08 +00:00
2015-01-28 04:39:00 +00:00
screen.title = 'my window title';
2013-07-15 22:45:08 +00:00
// Create a box perfectly centered horizontally and vertically.
var box = blessed.box({
2013-06-11 16:48:37 +00:00
top: 'center',
left: 'center',
width: '50%',
height: '50%',
2013-07-15 22:45:08 +00:00
content: 'Hello {bold}world{/bold}!',
tags: true,
2013-07-29 22:06:36 +00:00
border: {
type: 'line'
},
style: {
fg: 'white',
bg: 'magenta',
border: {
2014-01-02 04:42:30 +00:00
fg: '#f0f0f0'
2013-07-29 22:06:36 +00:00
},
hover: {
bg: 'green'
}
2013-07-15 22:45:08 +00:00
}
2013-06-24 11:16:02 +00:00
});
2013-07-15 22:45:08 +00:00
// Append our box to the screen.
2013-06-24 11:16:02 +00:00
screen.append(box);
2015-02-01 22:15:29 +00:00
// Add a PNG icon to the box (X11 only)
var icon = blessed.image({
parent: box,
top: 0,
left: 0,
width: 'shrink',
height: 'shrink',
file: __dirname + '/my-program-icon.png'
});
2013-07-15 22:45:08 +00:00
// If our box is clicked, change the content.
2013-06-24 11:16:02 +00:00
box.on('click', function(data) {
box.setContent('{center}Some different {red-fg}content{/red-fg}.{/center}');
2013-06-30 17:17:27 +00:00
screen.render();
2013-06-24 11:16:02 +00:00
});
2013-06-11 16:48:37 +00:00
2013-08-03 01:59:49 +00:00
// If box is focused, handle `enter` /`return` and give us some more content.
2013-08-25 05:30:45 +00:00
box.key('enter', function(ch, key) {
2013-07-15 22:45:08 +00:00
box.setContent('{right}Even different {black-fg}content{/black-fg}.{/right}\n');
box.setLine(1, 'bar');
box.insertLine(1, 'foo');
screen.render();
});
// Quit on Escape, q, or Control-C.
screen.key(['escape', 'q', 'C-c'], function(ch, key) {
2013-07-12 09:59:58 +00:00
return process.exit(0);
2013-06-11 16:48:37 +00:00
});
2013-07-15 22:45:08 +00:00
// Focus our element.
box.focus();
// Render the screen.
2013-06-11 16:48:37 +00:00
screen.render();
```
2013-07-03 23:46:06 +00:00
2013-07-15 22:45:08 +00:00
## High-level Documentation
2013-06-11 16:48:37 +00:00
### Widgets
Blessed comes with a number of high-level widgets so you can avoid all the
nasty low-level terminal stuff.
2013-06-16 09:21:57 +00:00
2013-06-11 16:48:37 +00:00
#### Node (from EventEmitter)
The base node which everything inherits from.
2013-06-11 17:52:18 +00:00
##### Options:
2013-06-11 16:48:37 +00:00
2015-03-29 19:34:15 +00:00
- __screen__ - the screen to be associated with.
- __parent__ - the desired parent.
- __children__ - an arrray of children.
2013-06-11 16:48:37 +00:00
2013-06-11 17:52:18 +00:00
##### Properties:
2013-06-11 16:48:37 +00:00
- inherits all from EventEmitter.
2015-03-29 19:34:15 +00:00
- __type__ - type of the node (e.g. `box` ).
- __options__ - original options object.
- __parent__ - parent node.
- __screen__ - parent screen.
- __children__ - array of node's children.
- __data, _, $__ - an object for any miscellanous user data.
- __index__ - render index (document order index) of the last render call.
2013-06-11 16:48:37 +00:00
2013-06-11 17:52:18 +00:00
##### Events:
2013-06-11 16:48:37 +00:00
- inherits all from EventEmitter.
2015-03-29 19:34:15 +00:00
- __adopt__ - received when node is added to a parent.
- __remove__ - received when node is removed from it's current parent.
- __reparent__ - received when node gains a new parent.
- __attach__ - received when node is attached to the screen directly or
2013-06-20 11:43:56 +00:00
somewhere in its ancestry.
2015-03-29 19:34:15 +00:00
- __detach__ - received when node is detached from the screen directly or
2013-06-20 11:43:56 +00:00
somewhere in its ancestry.
2013-06-11 16:48:37 +00:00
2013-06-11 17:52:18 +00:00
##### Methods:
2013-06-11 16:48:37 +00:00
- inherits all from EventEmitter.
2015-03-29 19:34:15 +00:00
- __prepend(node)__ - prepend a node to this node's children.
- __append(node)__ - append a node to this node's children.
- __remove(node)__ - remove child node from node.
- __insert(node, i)__ - insert a node to this node's children at index `i` .
- __insertBefore(node, refNode)__ - insert a node to this node's children
2013-07-15 06:44:11 +00:00
before the reference node.
2015-03-29 19:34:15 +00:00
- __insertAfter(node, refNode)__ - insert a node from node after the reference
2013-07-15 06:44:11 +00:00
node.
2015-03-29 19:34:15 +00:00
- __detach()__ - remove node from its parent.
- __emitDescendants(type, args..., [iterator])__ - emit event for element, and
2013-06-20 12:18:04 +00:00
recursively emit same event for all descendants.
2015-03-29 19:34:15 +00:00
- __get(name, [default])__ - get user property with a potential default value.
- __set(name, value)__ - set user property to value.
2013-06-11 16:48:37 +00:00
2013-06-16 09:21:57 +00:00
2013-06-11 16:48:37 +00:00
#### Screen (from Node)
The screen on which every other node renders.
2013-06-11 17:52:18 +00:00
##### Options:
2013-06-11 16:48:37 +00:00
2015-03-29 19:34:15 +00:00
- __program__ - the blessed `Program` to be associated with. will be
2015-03-19 11:25:39 +00:00
automatically instantiated if none is provided.
2015-03-29 19:34:15 +00:00
- __smartCSR__ - attempt to perform CSR optimization on all possible elements
2013-07-15 06:44:11 +00:00
(not just full-width ones, elements with uniform cells to their sides).
this is known to cause flickering with elements that are not full-width,
however, it is more optimal for terminal rendering.
2015-03-29 19:34:15 +00:00
- __fastCSR__ - do CSR on any element within 20 cols of the screen edge on
2014-01-02 04:42:30 +00:00
either side. faster than `smartCSR` , but may cause flickering depending on
2013-08-10 14:49:39 +00:00
what is on each side of the element.
2015-03-29 19:34:15 +00:00
- __useBCE__ - attempt to perform `back_color_erase` optimizations for terminals
2013-07-23 10:04:04 +00:00
that support it. it will also work with terminals that don't support it, but
only on lines with the default background color. as it stands with the current
implementation, it's uncertain how much terminal performance this adds at the
cost of overhead within node.
2015-03-29 19:34:15 +00:00
- __resizeTimeout__ - amount of time (in ms) to redraw the screen after the
2013-07-17 06:32:49 +00:00
terminal is resized (default: 300).
2015-03-29 19:34:15 +00:00
- __tabSize__ - the width of tabs within an element's content.
- __autoPadding__ - automatically position child elements with border and
2015-03-18 06:26:27 +00:00
padding in mind (__NOTE__: this is a recommended option. it may become
default in the future).
2015-03-29 19:34:15 +00:00
- __artificialCursor__ - have blessed draw a custom cursor and hide the
2015-03-18 06:26:27 +00:00
terminal cursor (__experimental__).
2015-03-29 19:34:15 +00:00
- __cursorShape__ - shape of the artificial cursor. can be: block, underline,
2015-03-14 23:47:46 +00:00
or line.
2015-03-29 19:34:15 +00:00
- __cursorBlink__ - whether the artificial cursor blinks.
- __cursorColor__ - color of the artificial color. accepts any valid color
2015-03-18 06:26:27 +00:00
value (`null` is default).
2015-03-29 19:34:15 +00:00
- __log__ - create a log file. see `log` method.
- __dump__ - dump all output and input to desired file. can be used together
2015-03-19 11:46:31 +00:00
with `log` option if set as a boolean.
2015-03-31 09:25:18 +00:00
- __debug__ - debug mode. enables usage of the `debug` method. also creates a
debug console which will display when pressing F12. it will display all log
and debug messages.
2015-03-29 19:34:15 +00:00
- __ignoreLocked__ - Array of keys in their full format (e.g. `C-c` ) to ignore
when keys are locked. Useful for creating a key that will _always_ exit no
2015-03-19 11:46:31 +00:00
matter whether the keys are locked.
2013-06-11 16:48:37 +00:00
2013-06-11 17:52:18 +00:00
##### Properties:
2013-06-11 16:48:37 +00:00
- inherits all from Node.
2015-03-29 19:34:15 +00:00
- __program__ - the blessed Program object.
- __tput__ - the blessed Tput object (only available if you passed `tput: true`
2013-06-13 21:49:48 +00:00
to the Program constructor.)
2015-03-29 19:34:15 +00:00
- __focused__ - top of the focus history stack.
- __width__ - width of the screen (same as `program.cols` ).
- __height__ - height of the screen (same as `program.rows` ).
- __cols__ - same as `screen.width` .
- __rows__ - same as `screen.height` .
- __left__ - relative left offset, always zero.
- __right__ - relative right offset, always zero.
- __top__ - relative top offset, always zero.
- __bottom__ - relative bottom offset, always zero.
- __aleft__ - absolute left offset, always zero.
- __aright__ - absolute right offset, always zero.
- __atop__ - absolute top offset, always zero.
- __abottom__ - absolute bottom offset, always zero.
- __grabKeys__ - whether the focused element grabs all keypresses.
- __lockKeys__ - prevent keypresses from being received by any element.
- __hover__ - the currently hovered element. only set if mouse events are bound.
- __title__ - set or get window title.
2013-06-11 17:52:18 +00:00
##### Events:
2013-06-11 16:48:37 +00:00
- inherits all from Node.
2015-03-29 19:34:15 +00:00
- __resize__ - received on screen resize.
- __mouse__ - received on mouse events.
- __keypress__ - received on key events.
- __element [name]__ - global events received for all elements.
- __key [name]__ - received on key event for [name].
- __focus, blur__ - received when the terminal window focuses/blurs. requires a
2013-07-15 23:53:04 +00:00
terminal supporting the focus protocol and focus needs to be passed to
2013-07-14 04:38:43 +00:00
program.enableMouse().
2015-03-29 19:34:15 +00:00
- __prerender__ - received before render.
- __render__ - received on render.
2013-06-11 16:48:37 +00:00
2013-06-11 17:52:18 +00:00
##### Methods:
2013-06-11 16:48:37 +00:00
- inherits all from Node.
2015-03-29 19:34:15 +00:00
- __log(msg, ...)__ - write string to the log file if one was created.
- __debug(msg, ...)__ - same as the log method, but only gets called if the
2013-07-31 05:14:13 +00:00
`debug` option was set.
2015-03-29 19:34:15 +00:00
- __alloc()__ - allocate a new pending screen buffer and a new output screen
2013-06-25 23:17:21 +00:00
buffer.
2015-03-29 19:34:15 +00:00
- __draw(start, end)__ - draw the screen based on the contents of the screen
2013-06-25 23:17:21 +00:00
buffer.
2015-03-29 19:34:15 +00:00
- __render()__ - render all child elements, writing all data to the screen
2013-06-25 23:17:21 +00:00
buffer and drawing the screen.
2015-03-29 19:34:15 +00:00
- __clearRegion(x1, x2, y1, y2)__ - clear any region on the screen.
- __fillRegion(attr, ch, x1, x2, y1, y2)__ - fill any region with a character
2013-06-25 23:17:21 +00:00
of a certain attribute.
2015-03-29 19:34:15 +00:00
- __focusOffset(offset)__ - focus element by offset of focusable elements.
- __focusPrevious()__ - focus previous element in the index.
- __focusNext()__ - focus next element in the index.
- __focusPush(element)__ - push element on the focus stack (equivalent to
2013-06-25 23:17:21 +00:00
`screen.focused = el` ).
2015-03-29 19:34:15 +00:00
- __focusPop()__ - pop element off the focus stack.
- __saveFocus()__ - save the focused element.
- __restoreFocus()__ - restore the saved focused element.
- __rewindFocus()__ - "rewind" focus to the last visible and attached element.
- __key(name, listener)__ - bind a keypress listener for a specific key.
- __onceKey(name, listener)__ - bind a keypress listener for a specific key
2013-07-12 09:59:58 +00:00
once.
2015-03-29 19:34:15 +00:00
- __unkey(name, listener)__ - remove a keypress listener for a specific key.
- __spawn(file, args, options)__ - spawn a process in the foreground, return to
2013-07-04 04:15:09 +00:00
blessed app after exit.
2015-03-29 19:34:15 +00:00
- __exec(file, args, options, callback)__ - spawn a process in the foreground,
2013-07-04 04:15:09 +00:00
return to blessed app after exit. executes callback on error or exit.
2015-03-29 19:34:15 +00:00
- __readEditor([options], callback)__ - read data from text editor.
- __setEffects(el, fel, over, out, effects, temp)__ - set effects based on
2013-07-12 09:59:58 +00:00
two events and attributes.
2015-03-29 19:34:15 +00:00
- __insertLine(n, y, top, bottom)__ - insert a line into the screen (using csr:
2013-07-12 09:59:58 +00:00
this bypasses the output buffer).
2015-03-29 19:34:15 +00:00
- __deleteLine(n, y, top, bottom)__ - delete a line from the screen (using csr:
2013-07-12 09:59:58 +00:00
this bypasses the output buffer).
2015-03-29 19:34:15 +00:00
- __insertBottom(top, bottom)__ - insert a line at the bottom of the screen.
- __insertTop(top, bottom)__ - insert a line at the top of the screen.
- __deleteBottom(top, bottom)__ - delete a line at the bottom of the screen.
- __deleteTop(top, bottom)__ - delete a line at the top of the screen.
- __enableMouse([el])__ - enable mouse events for the screen and optionally an element (automatically called when a form of on('mouse') is bound).
- __enableKeys([el])__ - enable keypress events for the screen and optionally an element (automatically called when a form of on('keypress') is bound).
- __enableInput([el])__ - enable key and mouse events. calls bot enableMouse and enableKeys.
- __copyToClipboard(text)__ - attempt to copy text to clipboard using iTerm2's
2015-03-19 11:46:31 +00:00
proprietary sequence. returns true if successful.
2015-03-29 19:34:15 +00:00
- __cursorShape(shape, blink)__ - attempt to change cursor shape. will not work
2015-03-19 11:25:39 +00:00
in all terminals (see artificial cursors for a solution to this). returns
true if successful.
2015-03-29 19:34:15 +00:00
- __cursorColor(color)__ - attempt to change cursor color. returns true if
2015-03-19 11:25:39 +00:00
successful.
2015-03-29 19:34:15 +00:00
- __cursorReset()__ - attempt to reset cursor. returns true if successful.
2013-06-11 16:48:37 +00:00
2013-06-16 09:21:57 +00:00
2013-06-11 16:48:37 +00:00
#### Element (from Node)
The base element.
2013-06-11 17:52:18 +00:00
##### Options:
2013-06-11 16:48:37 +00:00
2015-03-29 19:34:15 +00:00
- __fg, bg, bold, underline__ - attributes.
- __style__ - may contain attributes in the format of:
2013-08-08 11:19:44 +00:00
``` js
{
fg: 'blue',
bg: 'black',
border: {
fg: 'blue'
},
scrollbar: {
bg: 'blue'
},
focus: {
bg: 'red'
},
hover: {
bg: 'red'
2013-07-17 03:28:56 +00:00
}
2013-08-08 11:19:44 +00:00
}
```
2015-03-29 19:34:15 +00:00
- __border__ - border object, see below.
- __content__ - element's text content.
- __clickable__ - element is clickable.
- __input__ - element is focusable and can receive key input.
- __focused__ - element is focused.
- __hidden__ - whether the element is hidden.
- __label__ - a simple text label for the element.
- __hoverText__ - a floating text label for the element which appears on mouseover.
- __align__ - text alignment: `left` , `center` , or `right` .
- __valign__ - vertical text alignment: `top` , `middle` , or `bottom` .
- __shrink__ - shrink/flex/grow to content and child elements. width/height
2013-07-17 09:20:22 +00:00
during render.
2015-03-29 19:34:15 +00:00
- __padding__ - amount of padding on the inside of the element. can be a number
2013-07-29 13:54:02 +00:00
or an object containing the properties: `left` , `right` , `top` , and `bottom` .
2015-03-29 19:34:15 +00:00
- __width, height__ - width/height of the element, can be a number, percentage
2013-07-17 09:20:22 +00:00
(`0-100%`), or keyword (`half` or `shrink` ).
2015-03-29 19:34:15 +00:00
- __left, right, top, bottom__ - offsets of the element __relative to its
parent__. can be a number, percentage (`0-100%`), or keyword (`center`).
2013-07-19 01:55:16 +00:00
`right` and `bottom` do not accept keywords.
2015-03-29 19:34:15 +00:00
- __position__ - can contain the above options.
- __scrollable__ - whether the element is scrollable or not.
- __ch__ - background character (default is whitespace ` ` ).
2015-03-31 09:25:18 +00:00
- __draggable__ - allow the element to be dragged with the mouse.
2013-06-11 16:48:37 +00:00
2013-06-11 17:52:18 +00:00
##### Properties:
2013-06-11 16:48:37 +00:00
- inherits all from Node.
2015-03-29 19:34:15 +00:00
- __name__ - name of the element. useful for form submission.
- __border__ - border object.
- __type__ - type of border (`line` or `bg` ). `bg` by default.
- __ch__ - character to use if `bg` type, default is space.
- __bg, fg__ - border foreground and background, must be numbers (-1 for
2013-06-25 23:17:21 +00:00
default).
2015-03-29 19:34:15 +00:00
- __bold, underline__ - border attributes.
- __style__ - contains attributes (e.g. `fg/bg/underline` ). see above.
- __position__ - raw width, height, and offsets.
- __content__ - raw text content.
- __hidden__ - whether the element is hidden or not.
- __visible__ - whether the element is visible or not.
- __detached__ - whether the element is attached to a screen in its ancestry
2013-07-17 09:38:11 +00:00
somewhere.
2015-03-29 19:34:15 +00:00
- __fg, bg__ - foreground and background, must be numbers (-1 for default).
- __bold, underline__ - attributes.
- __width__ - calculated width.
- __height__ - calculated height.
- __left__ - calculated relative left offset.
- __right__ - calculated relative right offset.
- __top__ - calculated relative top offset.
- __bottom__ - calculated relative bottom offset.
- __aleft__ - calculated absolute left offset.
- __aright__ - calculated absolute right offset.
- __atop__ - calculated absolute top offset.
- __abottom__ - calculated absolute bottom offset.
2015-03-31 09:25:18 +00:00
- __draggable__ - whether the element is draggable. set to true to allow
dragging.
2013-06-11 17:52:18 +00:00
##### Events:
2013-06-11 16:48:37 +00:00
- inherits all from Node.
2015-03-29 19:34:15 +00:00
- __blur, focus__ - received when an element is focused or unfocused.
- __mouse__ - received on mouse events for this element.
- __mousedown, mouseup__ - mouse button was pressed or released.
- __wheeldown, wheelup__ - wheel was scrolled down or up.
- __mouseover, mouseout__ - element was hovered or unhovered.
- __mousemove__ - mouse was moved somewhere on this element.
- __click__ - element was clicked (slightly smarter than mouseup).
- __keypress__ - received on key events for this element.
- __move__ - received when the element is moved.
- __resize__ - received when the element is resized.
- __key [name]__ - received on key event for [name].
- __prerender__ - received before a call to render.
- __render__ - received after a call to render.
2013-06-11 16:48:37 +00:00
2013-06-11 17:52:18 +00:00
##### Methods:
2013-06-11 16:48:37 +00:00
- inherits all from Node.
2013-07-29 13:54:02 +00:00
- note: if the `scrollable` option is enabled, Element inherits all methods
from ScrollableBox.
2015-03-29 19:34:15 +00:00
- __render()__ - write content and children to the screen buffer.
- __hide()__ - hide element.
- __show()__ - show element.
- __toggle()__ - toggle hidden/shown.
- __focus()__ - focus element.
- __key(name, listener)__ - bind a keypress listener for a specific key.
- __onceKey(name, listener)__ - bind a keypress listener for a specific key
2013-07-12 09:59:58 +00:00
once.
2015-03-29 19:34:15 +00:00
- __unkey(name, listener)__ - remove a keypress listener for a specific key.
- __onScreenEvent(type, listener)__ - same as`el.on('screen', ...)` except this
2013-07-12 09:59:58 +00:00
will automatically cleanup listeners after the element is detached.
2015-03-29 19:34:15 +00:00
- __setIndex(z)__ - set the z-index of the element (changes rendering order).
- __setFront()__ - put the element in front of its siblings.
- __setBack()__ - put the element in back of its siblings.
- __setLabel(text/options)__ - set the label text for the top-left corner.
2015-01-25 02:34:57 +00:00
example options: `{text:'foo',side:'left'}`
2015-03-29 19:34:15 +00:00
- __removeLabel()__ - remove the label completely.
- __setHover(text/options)__ - set the hover text for the bottom-right corner.
2015-01-25 02:34:57 +00:00
example options: `{text:'foo'}`
2015-03-29 19:34:15 +00:00
- __removeHover()__ - remove the hover label completely.
- __enableMouse()__ - enable mouse events for the element (automatically called when a form of on('mouse') is bound).
- __enableKeys()__ - enable keypress events for the element (automatically called when a form of on('keypress') is bound).
- __enableInput()__ - enable key and mouse events. calls bot enableMouse and enableKeys.
2015-03-31 09:25:18 +00:00
- __enableDrag()__ - enable dragging of the element.
2013-06-11 16:48:37 +00:00
2013-07-23 23:37:56 +00:00
###### Content Methods
Methods for dealing with text content, line by line. Useful for writing a
text editor, irc client, etc.
Note: all of these methods deal with pre-aligned, pre-wrapped text. If you use
deleteTop() on a box with a wrapped line at the top, it may remove 3-4 "real"
lines (rows) depending on how long the original line was.
The `lines` parameter can be a string or an array of strings. The `line`
parameter must be a string.
2015-03-29 19:34:15 +00:00
- __setContent(text)__ - set the content. note: when text is input, it will be
2013-07-23 23:37:56 +00:00
stripped of all non-SGR escape codes, tabs will be replaced with 8 spaces,
and tags will be replaced with SGR codes (if enabled).
2015-03-29 19:34:15 +00:00
- __getContent()__ - return content, slightly different from `el.content` .
2013-07-23 23:37:56 +00:00
assume the above formatting.
2015-03-29 19:34:15 +00:00
- __setText(text)__ - similar to `setContent` , but ignore tags and remove escape
2013-08-04 09:50:13 +00:00
codes.
2015-03-29 19:34:15 +00:00
- __getText()__ - similar to `getContent` , but return content with tags and
2013-08-04 09:50:13 +00:00
escape codes removed.
2015-03-29 19:34:15 +00:00
- __insertLine(i, lines)__ - insert a line into the box's content.
- __deleteLine(i)__ - delete a line from the box's content.
- __getLine(i)__ - get a line from the box's content.
- __getBaseLine(i)__ - get a line from the box's content from the visible top.
- __setLine(i, line)__ - set a line in the box's content.
- __setBaseLine(i, line)__ - set a line in the box's content from the visible
2013-07-23 23:37:56 +00:00
top.
2015-03-29 19:34:15 +00:00
- __clearLine(i)__ - clear a line from the box's content.
- __clearBaseLine(i)__ - clear a line from the box's content from the visible
2013-07-23 23:37:56 +00:00
top.
2015-03-29 19:34:15 +00:00
- __insertTop(lines)__ - insert a line at the top of the box.
- __insertBottom(lines)__ - insert a line at the bottom of the box.
- __deleteTop()__ - delete a line at the top of the box.
- __deleteBottom()__ - delete a line at the bottom of the box.
- __unshiftLine(lines)__ - unshift a line onto the top of the content.
- __shiftLine(i)__ - shift a line off the top of the content.
- __pushLine(lines)__ - push a line onto the bottom of the content.
- __popLine(i)__ - pop a line off the bottom of the content.
- __getLines()__ - an array containing the content lines.
- __getScreenLines()__ - an array containing the lines as they are displayed on
2014-01-13 16:25:31 +00:00
the screen.
2015-03-31 09:54:01 +00:00
- __textLength(text)__ - get a string's real length, taking into account tags.
2013-07-23 23:37:56 +00:00
2013-06-16 09:21:57 +00:00
2013-06-11 16:48:37 +00:00
#### Box (from Element)
A box element which draws a simple box containing `content` or other elements.
2013-07-12 09:59:58 +00:00
##### Options:
- inherits all from Element.
##### Properties:
- inherits all from Element.
##### Events:
- inherits all from Element.
##### Methods:
- inherits all from Element.
2013-06-11 16:48:37 +00:00
#### Text (from Element)
An element similar to Box, but geared towards rendering simple text elements.
2013-06-11 17:52:18 +00:00
##### Options:
2013-06-11 16:48:37 +00:00
- inherits all from Element.
2015-03-29 19:34:15 +00:00
- __fill__ - fill the entire line with chosen bg until parent bg ends, even if
there is not enough text to fill the entire width. __ (deprecated)__
- __align__ - text alignment: `left` , `center` , or `right` .
2013-06-11 16:48:37 +00:00
Inherits all options, properties, events, and methods from Element.
2013-06-16 09:21:57 +00:00
2013-06-11 16:48:37 +00:00
#### Line (from Box)
2013-07-16 22:50:02 +00:00
A simple line which can be `line` or `bg` styled.
2013-06-11 16:48:37 +00:00
2013-06-11 17:52:18 +00:00
##### Options:
2013-06-11 16:48:37 +00:00
- inherits all from Box.
2015-03-29 19:34:15 +00:00
- __orientation__ - can be `vertical` or `horizontal` .
- __type, bg, fg, ch__ - treated the same as a border object.
2013-07-17 03:28:56 +00:00
(attributes can be contained in `style` ).
2013-06-11 16:48:37 +00:00
Inherits all options, properties, events, and methods from Box.
2013-06-16 09:21:57 +00:00
2013-06-11 16:48:37 +00:00
#### ScrollableBox (from Box)
2015-03-29 19:34:15 +00:00
__DEPRECATED__ - Use Box with the `scrollable` option instead.
2013-07-25 06:20:47 +00:00
2013-06-11 16:48:37 +00:00
A box with scrollable content.
2013-06-11 17:52:18 +00:00
##### Options:
2013-06-11 16:48:37 +00:00
- inherits all from Box.
2015-03-29 19:34:15 +00:00
- __baseLimit__ - a limit to the childBase. default is `Infinity` .
- __alwaysScroll__ - a option which causes the ignoring of `childOffset` . this
2013-06-25 23:17:21 +00:00
in turn causes the childBase to change every time the element is scrolled.
2015-03-30 11:58:15 +00:00
- __scrollbar__ - object enabling a scrollbar.
- __scrollbar.style__ - style of the scrollbar.
- __scrollbar.track__ - style of the scrollbar track if present (takes regular
style options).
2013-06-11 16:48:37 +00:00
2013-06-11 17:52:18 +00:00
##### Properties:
2013-06-11 16:48:37 +00:00
- inherits all from Box.
2015-03-29 19:34:15 +00:00
- __childBase__ - the offset of the top of the scroll content.
2015-03-30 11:58:15 +00:00
- __childOffset__ - the offset of the chosen item/line.
2013-06-11 16:48:37 +00:00
2013-06-11 17:52:18 +00:00
##### Events:
2013-06-11 16:48:37 +00:00
- inherits all from Box.
2015-03-29 19:34:15 +00:00
- __scroll__ - received when the element is scrolled.
2013-06-11 16:48:37 +00:00
2013-06-11 17:52:18 +00:00
##### Methods:
2013-06-11 16:48:37 +00:00
2015-03-29 19:34:15 +00:00
- __scroll(offset)__ - scroll the content by a relative offset.
- __scrollTo(index)__ - scroll the content to an absolute index.
- __setScroll(index)__ - same as `scrollTo` .
- __setScrollPerc(perc)__ - set the current scroll index in percentage (0-100).
- __getScroll()__ - get the current scroll index in lines.
- __getScrollHeight()__ - get the actual height of the scrolling area.
- __getScrollPerc()__ - get the current scroll index in percentage.
- __resetScroll()__ - reset the scroll index to its initial state.
2013-06-11 16:48:37 +00:00
2013-06-16 09:21:57 +00:00
2013-07-29 13:54:02 +00:00
#### ScrollableText (from ScrollableBox)
2013-06-11 16:48:37 +00:00
2015-03-29 19:34:15 +00:00
__DEPRECATED__ - Use Box with the `scrollable` and `alwaysScroll` options
2013-07-29 22:08:02 +00:00
instead.
2013-07-29 13:54:02 +00:00
A scrollable text box which can display and scroll text, as well as handle
pre-existing newlines and escape codes.
2013-06-11 16:48:37 +00:00
2013-06-11 17:52:18 +00:00
##### Options:
2013-06-11 16:48:37 +00:00
- inherits all from ScrollableBox.
2015-03-29 19:34:15 +00:00
- __mouse__ - whether to enable automatic mouse support for this element.
- __keys__ - use predefined keys for navigating the text.
- __vi__ - use vi keys with the `keys` option.
2013-07-29 13:54:02 +00:00
##### Properties:
- inherits all from ScrollableBox.
##### Events:
- inherits all from ScrollableBox.
##### Methods:
- inherits all from ScrollableBox.
#### List (from Box)
A scrollable list which can display selectable items.
##### Options:
- inherits all from Box.
2015-03-30 11:58:15 +00:00
- __style.selected__ - style for a selected item.
- __style.item__ - style for an unselected item.
2015-03-29 19:34:15 +00:00
- __mouse__ - whether to automatically enable mouse support for this list
2013-06-25 23:17:21 +00:00
(allows clicking items).
2015-03-29 19:34:15 +00:00
- __keys__ - use predefined keys for navigating the list.
- __vi__ - use vi keys with the `keys` option.
- __items__ - an array of strings which become the list's items.
- __search__ - a function that is called when `vi` mode is enabled and the key
2015-02-10 04:11:02 +00:00
`/` is pressed. This function accepts a callback function which should be
called with the search string. The search string is then used to jump to an
item that is found in `items` .
2015-03-29 19:34:15 +00:00
- __interactive__ - whether the list is interactive and can have items selected
2015-02-10 04:11:02 +00:00
(default: true).
2013-06-11 16:48:37 +00:00
2013-06-11 17:52:18 +00:00
##### Properties:
2013-06-11 16:48:37 +00:00
2013-07-29 13:54:02 +00:00
- inherits all from Box.
2013-06-11 16:48:37 +00:00
2013-06-11 17:52:18 +00:00
##### Events:
2013-06-11 16:48:37 +00:00
2013-07-29 13:54:02 +00:00
- inherits all from Box.
2015-03-29 19:34:15 +00:00
- __select__ - received when an item is selected.
- __cancel__ - list was canceled (when `esc` is pressed with the `keys` option).
- __action__ - either a select or a cancel event was received.
2013-06-11 16:48:37 +00:00
2013-06-11 17:52:18 +00:00
##### Methods:
2013-06-11 16:48:37 +00:00
2013-07-29 13:54:02 +00:00
- inherits all from Box.
2015-03-29 19:34:15 +00:00
- __add/addItem(text)__ - add an item based on a string.
- __getItemIndex(child)__ - returns the item index from the list. child can be
2014-04-26 06:09:18 +00:00
an element, index, or string.
2015-03-29 19:34:15 +00:00
- __getItem(child)__ - returns the item element. child can be an element,
2014-04-26 06:09:18 +00:00
index, or string.
2015-03-29 19:34:15 +00:00
- __removeItem(child)__ - removes an item from the list. child can be an
2014-04-26 06:05:25 +00:00
element, index, or string.
2015-03-29 19:34:15 +00:00
- __clearItems()__ - clears all items from the list.
- __setItems(items)__ - sets the list items to multiple strings.
- __select(index)__ - select an index of an item.
- __move(offset)__ - select item based on current offset.
- __up(amount)__ - select item above selected.
- __down(amount)__ - select item below selected.
- __pick(callback)__ - show/focus list and pick an item. the callback is
2014-04-26 06:00:57 +00:00
executed with the result.
2013-06-11 16:48:37 +00:00
2013-06-16 09:21:57 +00:00
2013-07-17 05:53:34 +00:00
#### Form (from Box)
A form which can contain form elements.
##### Options:
- inherits all from Box.
2015-03-29 19:34:15 +00:00
- __keys__ - allow default keys (tab, vi keys, enter).
- __vi__ - allow vi keys.
2013-07-17 05:53:34 +00:00
##### Properties:
- inherits all from Box.
2015-03-29 19:34:15 +00:00
- __submission__ - last submitted data.
2013-07-17 05:53:34 +00:00
##### Events:
- inherits all from Box.
2015-03-29 19:34:15 +00:00
- __submit__ - form is submitted. receives a data object.
- __cancel__ - form is discarded.
- __reset__ - form is cleared.
2013-07-17 05:53:34 +00:00
##### Methods:
- inherits all from Box.
2015-03-29 19:34:15 +00:00
- __focusNext()__ - focus next form element.
- __focusPrevious()__ - focus previous form element.
- __submit()__ - submit the form.
- __cancel()__ - discard the form.
- __reset()__ - clear the form.
2013-07-17 05:53:34 +00:00
2013-06-11 16:48:37 +00:00
#### Input (from Box)
A form input.
2013-06-16 09:21:57 +00:00
2013-07-29 13:54:02 +00:00
#### Textarea (from Input)
2013-06-11 16:48:37 +00:00
2013-07-29 13:54:02 +00:00
A box which allows multiline text input.
2013-06-11 16:48:37 +00:00
2013-06-11 17:52:18 +00:00
##### Options:
2013-06-11 16:48:37 +00:00
- inherits all from Input.
2015-03-29 19:34:15 +00:00
- __keys__ - use pre-defined keys (`i` or `enter` for insert, `e` for editor,
2013-07-29 22:04:39 +00:00
`C-e` for editor while inserting).
2015-03-29 19:34:15 +00:00
- __mouse__ - use pre-defined mouse events (right-click for editor).
- __inputOnFocus__ - call `readInput()` when the element is focused.
2013-07-29 22:04:39 +00:00
automatically unfocus.
2013-06-11 16:48:37 +00:00
2013-06-11 17:52:18 +00:00
##### Properties:
2013-06-11 16:48:37 +00:00
- inherits all from Input.
2015-03-29 19:34:15 +00:00
- __value__ - the input text. __read-only__ .
2013-06-11 16:48:37 +00:00
2013-06-11 17:52:18 +00:00
##### Events:
2013-06-11 16:48:37 +00:00
- inherits all from Input.
2015-03-29 19:34:15 +00:00
- __submit__ - value is submitted (enter).
- __cancel__ - value is discared (escape).
- __action__ - either submit or cancel.
2013-06-11 16:48:37 +00:00
2013-06-11 17:52:18 +00:00
##### Methods:
2013-06-11 16:48:37 +00:00
- inherits all from Input.
2015-03-29 19:34:15 +00:00
- __submit__ - submit the textarea (emits `submit` ).
- __cancel__ - cancel the textarea (emits `cancel` ).
- __readInput(callback)__ - grab key events and start reading text from the
2013-07-04 05:10:01 +00:00
keyboard. takes a callback which receives the final value.
2015-03-29 19:34:15 +00:00
- __readEditor(callback)__ - open text editor in `$EDITOR` , read the output from
2013-07-04 05:10:01 +00:00
the resulting file. takes a callback which receives the final value.
2015-03-29 19:34:15 +00:00
- __getValue()__ - the same as `this.value` , for now.
- __clearValue()__ - clear input.
- __setValue(text)__ - set value.
2013-07-04 05:10:01 +00:00
2013-07-29 13:54:02 +00:00
#### Textbox (from Textarea)
2013-07-04 05:10:01 +00:00
2013-07-29 13:54:02 +00:00
A box which allows text input.
2013-07-04 05:10:01 +00:00
##### Options:
2013-07-29 13:54:02 +00:00
- inherits all from Textarea.
2015-03-29 19:34:15 +00:00
- __secret__ - completely hide text.
- __censor__ - replace text with asterisks (`*`).
2013-07-04 05:10:01 +00:00
##### Properties:
2013-07-29 13:54:02 +00:00
- inherits all from Textarea.
2015-03-29 19:34:15 +00:00
- __secret__ - completely hide text.
- __censor__ - replace text with asterisks (`*`).
2013-07-04 05:10:01 +00:00
##### Events:
2013-07-29 13:54:02 +00:00
- inherits all from Textarea.
2013-07-04 05:10:01 +00:00
##### Methods:
2013-07-29 13:54:02 +00:00
- inherits all from Textarea.
2013-06-11 16:48:37 +00:00
2013-06-16 09:21:57 +00:00
#### Button (from Input)
A button which can be focused and allows key and mouse input.
##### Options:
- inherits all from Input.
##### Properties:
- inherits all from Input.
##### Events:
2013-07-29 13:54:02 +00:00
- inherits all from Input.
2015-03-29 19:34:15 +00:00
- __press__ - received when the button is clicked/pressed.
2013-06-16 09:21:57 +00:00
##### Methods:
2013-07-29 13:54:02 +00:00
- inherits all from Input.
2015-03-29 19:34:15 +00:00
- __press()__ - press button. emits `press` .
2013-06-16 09:21:57 +00:00
2013-06-11 16:48:37 +00:00
#### ProgressBar (from Input)
2013-07-17 05:53:34 +00:00
A progress bar allowing various styles. This can also be used as a form input.
2013-06-11 16:48:37 +00:00
2013-06-11 17:52:18 +00:00
##### Options:
2013-06-11 16:48:37 +00:00
- inherits all from Input.
2015-03-29 19:34:15 +00:00
- __orientation__ - can be `horizontal` or `vertical` .
2015-03-30 11:58:15 +00:00
- __style.bar__ - style of the bar contents itself.
2015-03-29 19:34:15 +00:00
- __pch__ - the character to fill the bar with (default is space).
- __filled__ - the amount filled (0 - 100).
- __value__ - same as `filled` .
- __keys__ - enable key support.
- __mouse__ - enable mouse support.
2013-06-11 16:48:37 +00:00
2013-06-11 17:52:18 +00:00
##### Properties:
2013-06-11 16:48:37 +00:00
- inherits all from Input.
2013-06-11 17:52:18 +00:00
##### Events:
2013-06-11 16:48:37 +00:00
- inherits all from Input.
2015-03-29 19:34:15 +00:00
- __reset__ - bar was reset.
- __complete__ - bar has completely filled.
2013-06-11 16:48:37 +00:00
2013-06-11 17:52:18 +00:00
##### Methods:
2013-06-11 16:48:37 +00:00
- inherits all from Input.
2015-03-29 19:34:15 +00:00
- __progress(amount)__ - progress the bar by a fill amount.
- __setProgress(amount)__ - set progress to specific amount.
- __reset()__ - reset the bar.
2013-06-11 16:48:37 +00:00
2013-06-16 09:21:57 +00:00
2013-07-12 12:48:55 +00:00
#### FileManager (from List)
A very simple file manager for selecting files.
##### Options:
- inherits all from List.
2015-03-29 19:34:15 +00:00
- __cwd__ - current working directory.
2013-07-12 12:48:55 +00:00
##### Properties:
- inherits all from List.
2015-03-29 19:34:15 +00:00
- __cwd__ - current working directory.
2013-07-12 12:48:55 +00:00
##### Events:
- inherits all from List.
2015-03-29 19:34:15 +00:00
- __cd__ - directory was selected and navigated to.
- __file__ - file was selected.
2013-07-12 12:48:55 +00:00
##### Methods:
- inherits all from List.
2015-03-29 19:34:15 +00:00
- __refresh([cwd], [callback])__ - refresh the file list (perform a `readdir` on `cwd`
2013-07-12 12:48:55 +00:00
and update the list items).
2015-03-29 19:34:15 +00:00
- __pick([cwd], callback)__ - pick a single file and return the path in the callback.
- __reset([cwd], [callback])__ - reset back to original cwd.
2013-07-12 12:48:55 +00:00
2013-07-17 05:53:34 +00:00
#### Checkbox (from Input)
A checkbox which can be used in a form element.
##### Options:
- inherits all from Input.
2015-03-29 19:34:15 +00:00
- __checked__ - whether the element is checked or not.
- __mouse__ - enable mouse support.
2013-07-17 05:53:34 +00:00
##### Properties:
- inherits all from Input.
2015-03-29 19:34:15 +00:00
- __text__ - the text next to the checkbox (do not use setContent, use
2013-07-17 05:53:34 +00:00
`check.text = ''` ).
2015-03-29 19:34:15 +00:00
- __checked__ - whether the element is checked or not.
- __value__ - same as `checked` .
2013-07-17 05:53:34 +00:00
##### Events:
- inherits all from Input.
2015-03-29 19:34:15 +00:00
- __check__ - received when element is checked.
- __uncheck__ received when element is unchecked.
2013-07-17 05:53:34 +00:00
##### Methods:
- inherits all from Input.
2015-03-29 19:34:15 +00:00
- __check()__ - check the element.
- __uncheck()__ - uncheck the element.
- __toggle()__ - toggle checked state.
2013-07-17 05:53:34 +00:00
#### RadioSet (from Box)
An element wrapping RadioButtons. RadioButtons within this element will be
mutually exclusive with each other.
##### Options:
- inherits all from Box.
##### Properties:
- inherits all from Box.
##### Events:
- inherits all from Box.
##### Methods:
- inherits all from Box.
#### RadioButton (from Checkbox)
A radio button which can be used in a form element.
##### Options:
- inherits all from Checkbox.
##### Properties:
- inherits all from Checkbox.
##### Events:
- inherits all from Checkbox.
##### Methods:
- inherits all from Checkbox.
2015-03-30 11:58:15 +00:00
#### Prompt (from Box)
A prompt box containing a text input, okay, and cancel buttons.
##### Options:
- inherits all from Box.
##### Properties:
- inherits all from Box.
##### Events:
- inherits all from Box.
##### Methods:
- inherits all from Box.
#### Question (from Box)
A question box containing okay and cancel buttons.
##### Options:
- inherits all from Box.
##### Properties:
- inherits all from Box.
##### Events:
- inherits all from Box.
##### Methods:
- inherits all from Box.
#### Message (from Box)
A box containing a message to be displayed.
##### Options:
- inherits all from Box.
##### Properties:
- inherits all from Box.
##### Events:
- inherits all from Box.
##### Methods:
- inherits all from Box.
#### Loading (from Box)
A box with a spinning line to denote loading.
##### Options:
- inherits all from Box.
##### Properties:
- inherits all from Box.
##### Events:
- inherits all from Box.
##### Methods:
- inherits all from Box.
#### Listbar (from Box)
A horizontal list. Useful for a main menu bar.
##### Options:
- inherits all from Box.
- __style.selected__ - style for a selected item.
- __style.item__ - style for an unselected item.
##### Properties:
- inherits all from Box.
##### Events:
- inherits all from Box.
##### Methods:
- inherits all from Box.
#### Log (from ScrollableText)
A log permanently scrolled to the bottom.
##### Options:
- inherits all from ScrollableText.
2015-03-31 08:31:43 +00:00
- __scrollback__ - amount of scrollback allowed. default: Infinity.
- __scrollOnInput__ - scroll to bottom on input even if the user has scrolled
up. default: false.
2015-03-30 11:58:15 +00:00
##### Properties:
- inherits all from ScrollableText.
2015-03-31 08:31:43 +00:00
- __scrollback__ - amount of scrollback allowed. default: Infinity.
- __scrollOnInput__ - scroll to bottom on input even if the user has scrolled
up. default: false.
2015-03-30 11:58:15 +00:00
##### Events:
- inherits all from ScrollableText.
2015-03-31 08:31:43 +00:00
- __log__ - emitted on a log line. passes in line.
2015-03-30 11:58:15 +00:00
##### Methods:
- inherits all from ScrollableText.
- __log/add(text)__ - add a log line.
#### Table (from Box)
A stylized table of text elements.
##### Options:
- inherits all from Box.
- __rows/data__ - array of array of strings representing rows.
- __pad__ - spaces to attempt to pad on the sides of each cell. `2` by default:
one space on each side.
- __style.header__ - header style.
- __style.cell__ - cell style.
##### Properties:
- inherits all from Box.
##### Events:
- inherits all from Box.
##### Methods:
- inherits all from Box.
- __setRows/setData(rows)__ - set rows in table. array of arrays of strings.
2015-03-31 07:37:32 +00:00
``` js
table.setData([
[ 'Animals', 'Foods' ],
[ 'Elephant', 'Apple' ],
[ 'Bird', 'Orange' ]
]);
```
2015-03-30 11:58:15 +00:00
2015-03-31 07:25:38 +00:00
2015-03-31 07:37:32 +00:00
#### ListTable (from List)
2015-03-31 07:25:38 +00:00
A stylized table of text elements with a list.
##### Options:
2015-03-31 07:37:32 +00:00
- inherits all from List.
2015-03-31 07:25:38 +00:00
- __rows/data__ - array of array of strings representing rows.
- __pad__ - spaces to attempt to pad on the sides of each cell. `2` by default:
one space on each side.
- __style.header__ - header style.
- __style.cell__ - cell style.
##### Properties:
2015-03-31 07:37:32 +00:00
- inherits all from List.
2015-03-31 07:25:38 +00:00
##### Events:
2015-03-31 07:37:32 +00:00
- inherits all from List.
2015-03-31 07:25:38 +00:00
##### Methods:
- inherits all from Box.
- __setRows/setData(rows)__ - set rows in table. array of arrays of strings.
2015-03-31 07:37:32 +00:00
``` js
table.setData([
[ 'Animals', 'Foods' ],
[ 'Elephant', 'Apple' ],
[ 'Bird', 'Orange' ]
]);
```
2015-03-31 07:25:38 +00:00
2015-01-25 02:34:57 +00:00
#### Terminal (from Box)
2015-02-12 01:20:22 +00:00
A box which spins up a pseudo terminal and renders the output. Useful for
writing a terminal multiplexer, or something similar to an mc-like file
manager. Requires term.js and pty.js to be installed. See
`example/multiplex.js` for an example terminal multiplexer.
2015-01-25 02:34:57 +00:00
##### Options:
- inherits all from Box.
2015-03-29 19:34:15 +00:00
- __handler__ - handler for input data.
- __shell__ - name of shell. `$SHELL` by default.
- __args__ - args for shell.
- __cursor__ - can be `line` , `underline` , and `block` .
2015-02-12 01:20:22 +00:00
- Other options similar to term.js'.
2015-01-25 02:34:57 +00:00
##### Properties:
- inherits all from Box.
2015-03-29 19:34:15 +00:00
- __term__ - reference to the headless term.js terminal.
- __pty__ - reference to the pty.js pseudo terminal.
2015-01-25 02:34:57 +00:00
##### Events:
- inherits all from Box.
2015-03-29 19:34:15 +00:00
- __title__ - window title from terminal.
2015-02-12 01:20:22 +00:00
- Other events similar to ScrollableBox.
2015-01-25 02:34:57 +00:00
##### Methods:
- inherits all from Box.
2015-03-29 19:34:15 +00:00
- __write(data)__ - write data to the terminal.
2015-02-12 01:20:22 +00:00
- Other methods similar to ScrollableBox.
2015-01-25 02:34:57 +00:00
2015-02-01 21:43:52 +00:00
#### Image (from Box)
Display an image in the terminal (jpeg, png, gif) using w3mimgdisplay. Requires
w3m to be installed. X11 required: works in xterm, urxvt, and possibly other
terminals.
##### Options:
- inherits all from Box.
2015-03-29 19:34:15 +00:00
- __file__ - path to image.
- __w3m__ - path to w3mimgdisplay. if a proper w3mimgdisplay path is not given,
2015-02-12 01:20:22 +00:00
blessed will search the entire disk for the binary.
2015-02-01 21:43:52 +00:00
##### Properties:
- inherits all from Box.
##### Events:
- inherits all from Box.
##### Methods:
- inherits all from Box.
2015-03-29 19:34:15 +00:00
- __setImage(img, callback)__ - set the image in the box to a new path.
- __clearImage(callback)__ - clear the current image.
- __imageSize(img, callback)__ - get the size of an image file in pixels.
- __termSize(callback)__ - get the size of the terminal in pixels.
- __getPixelRatio(callback)__ - get the pixel to cell ratio for the terminal.
2015-02-01 21:43:52 +00:00
2015-03-14 23:35:17 +00:00
### Artificial Cursors
Terminal cursors can be tricky. They all have different custom escape codes to
alter. As an _experimental_ alternative, blessed can draw a cursor for you,
allowing you to have a custom cursor that you control.
``` js
var screen = blessed.screen({
2015-03-20 06:49:26 +00:00
cursor: {
artificial: true,
shape: 'line',
blink: true,
color: null // null for default
}
2015-03-14 23:35:17 +00:00
});
```
That's it. It's controlled the same way as the regular cursor.
2015-03-20 06:49:26 +00:00
To create a custom cursor:
``` js
var screen = blessed.screen({
cursor: {
artificial: true,
shape: {
bg: 'red',
fg: 'white',
bold: true,
ch: '#'
},
blink: true
}
});
```
2015-03-14 23:35:17 +00:00
2013-06-11 16:48:37 +00:00
### Positioning
Offsets may be a number, a percentage (e.g. `50%` ), or a keyword (e.g.
`center` ).
Dimensions may be a number, or a percentage (e.g. `50%` ).
2015-03-29 19:34:15 +00:00
Positions are treated almost _exactly_ the same as they are in CSS/CSSOM when
2013-06-11 16:48:37 +00:00
an element has the `position: absolute` CSS property.
When an element is created, it can be given coordinates in its constructor:
``` js
2013-07-04 04:15:09 +00:00
var box = blessed.box({
2013-06-11 16:48:37 +00:00
left: 'center',
top: 'center',
2013-06-14 00:02:02 +00:00
bg: 'yellow',
2013-06-11 16:48:37 +00:00
width: '50%',
height: '50%'
});
```
2015-03-29 19:34:15 +00:00
This tells blessed to create a box, perfectly centered __relative to its
parent__, 50% as wide and 50% as tall as its parent.
2013-06-11 16:48:37 +00:00
To access the calculated offsets, relative to the parent:
``` js
console.log(box.rleft);
console.log(box.rtop);
```
To access the calculated offsets, absolute (relative to the screen):
``` js
console.log(box.left);
console.log(box.top);
```
#### Overlapping offsets and dimensions greater than parents'
This still needs to be tested a bit, but it should work.
2013-07-03 23:46:06 +00:00
2013-06-24 11:16:02 +00:00
### Content
Every element can have text content via `setContent` . If `tags: true` was
passed to the element's constructor, the content can contain tags. For example:
```
box.setContent('hello {red-fg}{green-bg}{bold}world{/bold}{/green-bg}{/red-fg}');
```
To make this more concise `{/}` cancels all character attributes.
```
box.setContent('hello {red-fg}{green-bg}{bold}world{/}');
```
Newlines and alignment are also possible in content.
2013-07-03 23:46:06 +00:00
``` js
2013-06-24 11:16:02 +00:00
box.setContent('hello\n'
+ '{right}world{/right}\n'
+ '{center}foo{/center}');
```
This will produce a box that looks like:
```
| hello |
| world |
| foo |
```
Content can also handle SGR escape codes. This means if you got output from a
program, say `git log` for example, you can feed it directly to an element's
content and the colors will be parsed appropriately.
This means that while `{red-fg}foo{/red-fg}` produces `^[[31mfoo^[[39m` , you
could just feed `^[[31mfoo^[[39m` directly to the content.
2013-07-03 23:46:06 +00:00
2013-08-02 01:07:58 +00:00
### Event Bubbling
Events can bubble in blessed. For example:
Receiving all click events for `box` :
``` js
box.on('click', function(mouse) {
box.setContent('You clicked ' + mouse.x + ', ' + mouse.y + '.');
screen.render();
});
```
Receiving all click events for `box` , as well as all of its children:
``` js
box.on('element click', function(el, mouse) {
box.setContent('You clicked '
+ el.type + ' at ' + mouse.x + ', ' + mouse.y + '.');
screen.render();
if (el === box) {
return false; // Cancel propagation.
}
});
```
`el` gets passed in as the first argument. It refers to the target element the
event occurred on. Returning `false` will cancel propagation up the tree.
2013-06-11 16:48:37 +00:00
### Rendering
To actually render the screen buffer, you must call `render` .
``` js
box.setContent('Hello world.');
screen.render();
```
Elements are rendered with the lower elements in the children array being
painted first. In terms of the painter's algorithm, the lowest indicies in the
array are the furthest away, just like in the DOM.
2013-07-03 23:46:06 +00:00
2015-03-19 11:46:31 +00:00
### Windows compatibility
Currently there is no `mouse` or `resize` event support on Windows.
Windows users will need to explicitly set `term` when creating a screen like so
2015-03-29 19:34:15 +00:00
(__NOTE__: This is no longer necessary as of the latest versions of blessed.
2015-03-19 11:46:31 +00:00
This is now handled automatically):
``` js
var screen = blessed.screen({ term: 'windows-ansi' });
```
2013-06-11 16:48:37 +00:00
### Testing
2015-03-19 11:46:31 +00:00
Most tests contained in the `test/` directory are interactive. It's up to the
programmer to determine whether the test is properly displayed. In the future
it might be better to do something similar to vttest.
2013-06-11 16:48:37 +00:00
2013-07-03 23:46:06 +00:00
2013-07-15 22:45:08 +00:00
## Lower-Level Usage
This will actually parse the xterm terminfo and compile every
string capability to a javascript function:
``` js
2013-07-18 22:56:05 +00:00
var blessed = require('blessed')
, tput = blessed.tput('xterm-256color');
2013-07-15 22:45:08 +00:00
console.log(tput.setaf(4) + 'hello' + tput.sgr0());
```
To play around with it on the command line, it works just like tput:
``` bash
$ tput.js setaf 2
$ tput.js sgr0
$ echo "$(tput.js setaf 2)hello world$(tput.js sgr0)"
```
The main functionality is exposed in the main `blessed` module:
``` js
var blessed = require('blessed')
2013-07-18 22:56:05 +00:00
, program = blessed.program();
2013-07-15 22:45:08 +00:00
program.key('q', function(ch, key) {
program.clear();
program.disableMouse();
program.showCursor();
program.normalBuffer();
process.exit(0);
});
program.on('mouse', function(data) {
if (data.action === 'mousemove') {
program.move(data.x, data.y);
program.bg('red');
program.write('x');
program.bg('!red');
}
});
program.alternateBuffer();
program.enableMouse();
program.hideCursor();
program.clear();
program.move(1, 1);
program.bg('black');
program.write('Hello world', 'blue fg');
program.setx((program.cols / 2 | 0) - 4);
program.down(5);
program.write('Hi again!');
program.bg('!black');
program.feed();
```
2015-02-01 22:15:29 +00:00
## FAQ
1. Why doesn't the Linux console render lines correctly on Ubuntu?
2015-03-19 12:23:56 +00:00
- You need to install the `ncurses-base` package __and__ the `ncurses-term`
package. (#98)
2015-02-01 22:15:29 +00:00
2. Why do vertical lines look chopped up in iTerm2?
2015-03-19 12:23:56 +00:00
- All ACS vertical lines look this way in iTerm2.
2015-02-01 22:15:29 +00:00
3. Why can't I use my mouse in Terminal.app?
2015-03-19 12:23:56 +00:00
- Terminal.app does not support mouse events.
2015-02-01 22:15:29 +00:00
4. Why doesn't the Image element appear in my terminal?
2015-03-19 12:23:56 +00:00
- The Image element uses w3m to display images. This generally only works on
2015-03-29 19:34:15 +00:00
X11+xterm/urxvt, but it _may_ work on other unix terminals.
2015-02-01 22:15:29 +00:00
5. Why can't my mouse clicks register beyond 255-287 cells?
2015-03-19 12:23:56 +00:00
- Older versions of VTE do not support any modern mouse protocol. On top of
that, the old x10 protocol it does implement is bugged. Through several
workarounds we've managed to get the cell limit from 127 to 255/287. If
you're not happy with this, you may want to look into using xterm or
urxvt, or a terminal which uses a modern VTE, like gnome-terminal.
2015-02-01 22:15:29 +00:00
6. Is blessed efficient?
2015-03-19 12:23:56 +00:00
- Yes. Blessed implements CSR and uses the painter's algorithm to render the
screen. It maintains two screen buffers so it only needs to render what
has changed on the terminal screen.
2015-02-01 22:15:29 +00:00
7. Will blessed work with all terminals?
2015-03-19 12:23:56 +00:00
- Yes. blessed has a terminfo/termcap parser and compiler that was written
from scratch. It should work with every terminal as long as a terminfo
file is provided. If you notice any compatibility issues in your termial,
do not hesitate to post an issue.
2015-03-19 11:46:31 +00:00
8. What is "curses" and "ncurses"?
2015-03-19 12:23:56 +00:00
- ["curses"][curses] was an old library written in the early days of unix
which allowed a programmer to not have to worry about terminal
compatibility. ["ncurses"][ncurses] is a free reimplementation of curses.
It improved upon it quite a bit and is now the standard library for
implementing terminal programs. Blessed uses neither of these, and instead
handles terminal compatibility itself.
2015-03-19 11:46:31 +00:00
9. What is the difference between blessed and blessed-contrib?
2015-03-19 12:23:56 +00:00
- blessed is a major piece of code which reimplements curses from the ground
up. A UI API is then layered on top of this. blessed-contrib is a popular
library built on top of blessed which makes clever use of modules to
implement useful widgets like graphs, ascii art, and so on.
10. Are there blessed-like solutions for non-javascript platforms?
- Yes. There are some fantastic solutions out there.
- Perl: [Curses::UI][curses-ui]
- Python: [Urwid][urwid]
- Go: [termui][termui] & [termbox-go][termbox]
2015-02-01 22:15:29 +00:00
2014-01-02 04:42:30 +00:00
## Contribution and License Agreement
2013-12-04 12:34:22 +00:00
2013-12-04 12:37:55 +00:00
If you contribute code to this project, you are implicitly allowing your code
to be distributed under the MIT license. You are also implicitly verifying that
all code is your original work. `</legalese>`
2013-07-15 22:45:08 +00:00
2015-02-01 22:15:29 +00:00
2013-01-27 16:06:58 +00:00
## License
2015-03-31 13:12:14 +00:00
Copyright (c) 2013-2015, Christopher Jeffrey. (MIT License)
2013-01-27 16:06:58 +00:00
See LICENSE for more info.
2015-03-18 06:26:27 +00:00
[slap]: https://github.com/slap-editor/slap
[contrib]: https://github.com/yaronn/blessed-contrib
2015-03-19 11:17:13 +00:00
[termui]: https://github.com/gizak/termui
2015-03-19 11:46:31 +00:00
[curses]: https://en.wikipedia.org/wiki/Curses_(programming_library)
[ncurses]: https://en.wikipedia.org/wiki/Ncurses
2015-03-19 12:23:56 +00:00
[urwid]: http://urwid.org/reference/index.html
[curses-ui]: http://search.cpan.org/~mdxi/Curses-UI-0.9609/lib/Curses/UI.pm
[termbox]: https://github.com/nsf/termbox-go