minitel-react
Version:
A react renderer for the french Minitel
160 lines (124 loc) • 10 kB
Markdown
# Minitel React
A (somewhat experimental! also somewhat opiniated) package to render react into a minitel!
<small>*Experimental until v4.2.0, thanks for understanding!*<small>

## Principle
This package interacts with a stream which is supposed to be relayed to the Minitel. The duplex stream could come from, for instance, a serial handler.
## Example
```jsx
import { SerialPort } from 'serialport';
import { render, Minitel } from 'minitel-react';
const serialport = new SerialPort({ path: '/dev/ttyUSB0', baudRate: 1200, parity: 'even' });
function App() {
return (
<yjoin widthAlign="middle" heightAlign="middle">
<para invert>
Hello world!
</para>
</yjoin>
);
}
render(<App/>, new Minitel(serialport));
```
Also: an example with websockets, miedit minitel (You may need to clone [miedit](https://github.com/Zigazou/miedit) into `miedit/` first), inside the dist/examples folder
## Reference
### CharAttributes
|Attribute |Type |Default|Description |
|------------|---------|-------|-----------------------------------|
|fg |`number` |7 |The foreground color to be used |
|bg |`number` |0 |The background color to be used |
|underline |`boolean`|false |Whether to underline or not |
|sizeCode |`number` |0 |The size code to be used |
|noBlink |`boolean`|true |Whether to not blink or to blink |
|invert |`boolean`|true |Whether to invert or not |
|doubleWidth |`boolean`|true |Whether to use double width or not |
|doubleHeight|`boolean`|true |Whether to use double height or not|
#### On colors
|Color code|Color |Brightness|
|----------|-------|----------|
|0 |Black |0% |
|1 |Red |50% |
|2 |Green |70% |
|3 |Yellow |90% |
|4 |Blue |40% |
|5 |Magenta|60% |
|6 |Cyan |80% |
|7 |White |100% |
### MinitelObjectAttributes
|Attribute |Type |Description |
|-----------------------|----------------------|--------------------------------------------------------------------------------------------------------|
|All from CharAttributes|`CharAttributes[k]` |The properties to pass to the underlying characters. doubleWidth, doubleHeight won't apply for fillChars|
|fillChar |`string` |The character to fill holes with (can be useful for transparency) |
|width |`number` |The desired width of the element |
|height |`number` |The desired height of the element |
|wrap |`string` |The behaviour of text overflowing |
|ref |`RefObject` |The ref which should store the underlying document. The relevant classes are in [`minitel-standalone`](https://github.com/immjs/minitel-standalone) (docs to be written) |
|textAlign |`string` |The way text should be aligned (start, middle, or end) |
|flexGrow |`boolean` or `number` |The flexGrow factor to be applied (refer to CSS flex-grow). `true` is interpreted as `1` |
|visible |`boolean` |If `false`, the element will only be displayed as a grid of its `fillChar`s |
### new Minitel
|Argument (in order)|Type |Description |
|-------------------|----------|--------------------------------------------------|
|stream |`Duplex` |The duplex stream to communicate with the minitel |
|settings |`Settings`|The setings to configure the minitel instance with|
#### On Settings
|Argument |Type |Description |
|---------|----------|------------------------------------------------------------------|
|statusBar|`boolean` |Whether to consider the first line of the render as the status bar|
|localEcho|`boolean` |Whether to keep local echo (écho local) enabled |
### <yjoin>
Will vertically join all children
|Attribute |Type |Description |
|---------------------|----------------------|-----------------------------------------------------------------|
|gap |`number` or `string` |The amount of gap to be had. Can be a number or space-{between,around,evenly} (refer to flexbox's justify-center)|
|widthAlign |`string` |The way to align along the x axis (start, middle, end or stretch)|
|heightAlign |`string` |The way to align along the y axis (start, middle or end) |
### <xjoin>
Will horizontally join all children
|Attribute |Type |Description |
|---------------------|----------------------|-----------------------------------------------------------------|
|gap |`number` or `string` |The amount of gap to be had. Can be a number or space-{between,around,evenly} (refer to flex's justify-center)|
|heightAlign |`string` |The way to align along the y axis (start, middle, end or stretch)|
|widthAlign |`string` |The way to align along the x axis (start, middle or end) |
### <input>
Will be an input
|Attribute |Type |Description |
|---------------------|----------------------|-----------------------------------------------------------------|
|autofocus |`boolean` |Whether or not to autofocus on the input |
|type |`string` |The type of input (for now, text or password) |
|multiline |`boolean` |Whether or not the input should be multiline |
|onChange |`function(value)` |A function to be called whenever the input is changed |
|onScroll |`function([dy, dx])` |A function to be called whenever the input is scolled |
### <para>
Will show text
### <scroll>
Will allow scrolling (the element needs to be focused to be scrolled upon)
#### Attributes
| Attribute | Type | Description |
|----------------------|-------------------------------------|------------------------------------------------------------------------|
| overflowX | `string` | Horizontal overflow behavior: refer to description under the table |
| overflowY | `string` | Vertical overflow behavior: refer to description under the table |
| autofocus | `false` | Whether autofocus is enabled for the scrollable area. |
| disabled | `boolean` | Whether this element is unfocusable |
| scrollbarColor | `number` | The color code for the scrollbar. |
| scrollbarBackColor | `number` | The color code for the scrollbar background. |
| blinkPeriod | `number` | The blinking period for the scrollbar (in milliseconds). |
| onScroll | `function([dy, dx])` | A function to be called whenever the scroll is scolled |
`noscrollbar` will hide the scrollbar
`auto` will hide the scrollbar except when the scrollable area exists (I.E. content does not fit)
`scroll` and `pad` only differ in the case that the children already fit in the imposed area: `scroll` will show the scrollbar anyway, while `pad` will leave this space empty
### <cont>
Will hold one child.
#### Attributes
| Attribute | Type | Description |
|---------------|---------------|---------------------------------------------------------------------------------------------------|
| widthAlign | `Align` | The alignment of child elements along the horizontal axis (`start`, `middle`, `end`, or `stretch`). |
| heightAlign | `Align` | The alignment of child elements along the vertical axis (`start`, `middle`, `end`, or `stretch`). |
### <zjoin>
Will allow stacking of one element onto another. The character `\x09` will order `zjoin` to show the character underneath.
#### Attributes
| Attribute | Type | Description |
|----------------------|------------|---------------------------------------------------------------------------------------------------|
| widthAlign | `Align` | The alignment of child elements along the horizontal axis (`start`, `middle`, `end`, or `stretch`). |
| heightAlign | `Align` | The alignment of child elements along the vertical axis (`start`, `middle`, `end`, or `stretch`). |
| inheritTransparency | `boolean` | Whether child elements should have fillChar set to `\x09` by default |