menu-string
Version:
Generate a menu with selectable menu items as a string
144 lines (99 loc) • 3.5 kB
Markdown
Generate a menu with selectable menu items as a string.
[](https://www.npmjs.com/package/menu-string)
[](https://travis-ci.org/watson/menu-string)
[](https://github.com/feross/standard)
```
npm install menu-string --save
```
```js
const Menu = require('menu-string')
const menu = new Menu({
items: [
{text: 'Item 1'},
{text: 'Item 2'},
{text: '------', separator: true},
{text: 'Item 3'}
],
selected: 0
})
console.log(menu.toString())
// > Item 1
// Item 2
// ------
// Item 3
// Move cursor one item down
menu.down()
console.log(menu.toString())
// Item 1
// > Item 2
// ------
// Item 3
```
Initialize a new `menu` object.
Options:
- `items` - An array of `item` objects
- `render` - An optional render function that will be called for each
menu item that is rendered. Will be called with the `item` object that
should be rendered and a boolean indicating if the `item` is currectly
selected. Should return a rendered string representing the menu item.
The `item` object will have an `index` property indicating its
position in the menu
- `selected` - An optional integer specifying which menu item should be
selected by default (defaults to `0`)
- `height` - Set menu max height (in rows). If set, the menu will
maintain a viewport, only ever rendering that amout of menu items.
When moving the cursor up or down, the viewport will scroll to
accommodate.
An `item` object can have the following properties:
- `text` - The text to show when rendering the item
- `separator` - A boolean indicating if the item can be selected
- `marked` - A boolean indicating if the item should me "marked". This
property can be toggled using `item.toggleMark()`. It's up the the
implementer to render marked items differently.
An `item` can also just be a string, which is treated as `{text: item}`.
If no custom render function is provided, the following default render
function is used:
```js
function (item, selected) {
return (selected ? '> ' : ' ') + item.text
}
```
An alias for:
```js
new Menu({
items: items
})
```
### Event: `update`
An update event is emitted when ever the menu is updated - i.e. the
cursor is moved.
### `menu.items`
Array of menu items.
### `success = menu.up()`
Move the cursor one item up. Separator items will be skipped.
Returns `false` if top of menu have been reached. Returns `true`
otherwise.
Move the cursor one item down. Separator items will be skipped.
Returns `false` if bottom of menu have been reached. Returns `true`
otherwise.
Select a specific menu item.
Returns `false` if the index was invalid. Returns `true` otherwise.
Returns the selected `item` object. The returned `item` object will have
an `index` property indicating its position in the menu. Returns `null`
if no selectable menu item exists.
Toggle the `marked` boolean of the currently selected item.
Returns the entire menu as a single string. One line for each menu item
rendered by the render function.
[](LICENSE)