Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/lukasbach/ink-form

Complex user-friendly form component for React Ink
https://github.com/lukasbach/ink-form

cli cmd commandline component forms ink input react reusable ui

Last synced: 3 months ago
JSON representation

Complex user-friendly form component for React Ink

Awesome Lists containing this project

README

        

# ink-form

`ink-form` is a Node library for displaying a user-friendly form in a terminal window.
It can be used in two ways, either by using the React Ink component `Form` exported by
the package, or by using the imperative API `openForm(options)`.

![alt text](https://github.com/lukasbach/ink-form/raw/main/demo/overview.gif 'Demo 1')
![alt text](https://github.com/lukasbach/ink-form/raw/main/demo/packagejson.gif 'Demo 2')

## Example usage

npm install ink-form react ink

```typescript jsx
const options = [
{ label: 'Opt 1', value: 'a' },
{ label: 'Opt 2', value: 'b' },
];

const form: FormProps = {
form: {
title: 'Form title',
sections: [
{
title: 'Text and Number fields',
fields: [
{ type: 'string', name: 'field1', label: 'Input with initial value', initialValue: 'Initial value' },
{ type: 'string', name: 'field2', label: 'Masked input', mask: '*' },
{ type: 'integer', name: 'field3', label: 'Integer between -5 and 8, stepsize 2', min: -5, max: 8, step: 2 },
{ type: 'float', name: 'field4', label: 'Float between 0 and 5, stepsize 0.1', min: 0, max: 5, step: 0.1 },
],
},
{
title: 'Select and boolean fields',
fields: [
{ type: 'select', name: 'field5', label: 'Select', options },
{ type: 'multiselect', name: 'field6', label: 'Multi Select', options },
{ type: 'boolean', name: 'field7', label: 'Boolean select', options },
],
},
],
},
};

// either:
(async () => {
const result = await openForm(form);
console.log(`Finished with value`, result);
})();

// or:
render(
{
console.log(`Finished with value`, result);
}}
/>
);
```

If you want to see how using `ink-form` feels, you can clone this repo, run `yarn` to install
dependencies and then run one of the demo scripts:

- `yarn demo:overview` ([See Code](https://github.com/lukasbach/ink-form/blob/main/src/demo/overview.tsx))
- `yarn demo:packagejson` ([See Code](https://github.com/lukasbach/ink-form/blob/main/src/demo/packagejson.tsx))
- `yarn demo:custommanager` ([See Code](https://github.com/lukasbach/ink-form/blob/main/src/demo/custommanager.tsx))
- `yarn demo:imperative` ([See Code](https://github.com/lukasbach/ink-form/blob/main/src/demo/imperative.ts))

## Update Note

This package is now pure ESM as of 2.0.0. (Details: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c)

With that upgrade, I had to remove the multi select component as its dependency does not support ESM. Please
use the v1x version branch with CJS if you need that.

## Documentation

Detailed documentation is available at [lukasbach.github.io/ink-form](https://lukasbach.github.io/ink-form/).
Install the package with `npm install ink-form --save` or `yarn add ink-form` to your project.

Then, render the form by invoking the [imperative interface](https://lukasbach.github.io/ink-form/modules.html#openform)
or by rendering the [React Ink component](https://lukasbach.github.io/ink-form/modules.html#form).
Both take [`FormProps`](https://lukasbach.github.io/ink-form/interfaces/formprops.html) as parameters.

The most important property is the `form`-property, which dictates how the form fields are structured. It follows
the [`FormStructure`](https://lukasbach.github.io/ink-form/interfaces/formstructure.html)-interface. Look into the
example above to see an example.

## Custom fields

A form field describes a type of input, i.e. text input, number input etc.
Included are:

- FormFieldString
- FormFieldInteger
- FormFieldFloat
- FormFieldSelect
- FormFieldMultiSelect
- FormFieldBoolean

You can add your own form field by extending
[`AbstractFormField`](https://lukasbach.github.io/ink-form/modules.html#abstractformfield)
and implementing an associated
[`FormFieldManager`](https://lukasbach.github.io/ink-form/interfaces/formfieldmanager.html).

![alt text](https://github.com/lukasbach/ink-form/raw/main/demo/customfield.gif 'Demo 3')