Ecosyste.ms: Awesome

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

Awesome Lists | Featured Topics | Projects

https://github.com/tjkandala/baahu

🐘 (fast) state machine-based UI framework
https://github.com/tjkandala/baahu

fast framework frontend javascript library lightweight state-machine state-management typescript ui web

Last synced: about 1 month ago
JSON representation

🐘 (fast) state machine-based UI framework

Awesome Lists containing this project

README

        


Baahu




read the documentation

Coverage Status

gzip size


brotli size


GitHub top language


npm


license

GitHub Workflow Status

---

## What is Baahu?

Baahu is a small zero-dependency [Moore machine-based](https://en.wikipedia.org/wiki/Moore_machine) UI framework for Javascript + TypeScript

## Features

- [Faster and smaller than major frameworks/libraries](https://baahu.dev/docs/performance) (Svelte, Preact, Vue, React, and Angular)
- Built-in robust state management: Finite State Machines!
- Event-driven, not change-driven/reactive
- Built-in trie-based router & code-splitting
- First-class TypeScript support: type-checked JSX, props, states, events.
- [O(1) component rendering](https://baahu.dev/docs/performance#higher-level-internal-optimizations) for _all_ components, not just leaves.

## Get Started

Everything you need to know about Baahu is in the [docs](https://baahu.dev/docs/introduction)!

[Try it out live on Code Sandbox!](https://codesandbox.io/s/hello-baahu-2zzv7?file=/src/index.tsx)

## Example Components

You should read the docs, but if you want a sneak peek at what the API looks like, here a couple of example components:

### Toggle

```tsx
import { b, machine, emit } from 'baahu';

const Toggle = machine({
id: 'toggle',
initial: 'inactive',
context: () => ({}),
when: {
inactive: { on: { TOGGLE: { to: 'active' } } },
active: { on: { TOGGLE: { to: 'inactive' } } },
},
render: state => (


{state}


emit({ type: 'TOGGLE' })}>Toggle

),
});
```

### Traffic Light

A traffic light component that doesn't let you cross the street when it is red, and displays the # of times you crossed the street.

[codesandbox](https://codesandbox.io/s/baahu-traffic-light-zox6c)

```tsx
import { b, machine, emit } from 'baahu';

/** returns a function that is called by baahu. emit the
* provided event after the specified time */
function delayedEmit(event, delayMS) {
return () => setTimeout(() => emit(event, 'light'), delayMS);
}

/**
* you can make your own abstractions like `delayedEmit`
* for entry/exit/"do" actions.
*
* embracing js/ts (as opposed to shipping with every
* possible abstraction) keeps baahu fast and light!
*/

const Light = machine({
id: 'light',
initial: 'red',
context: () => ({
streetsCrossed: 0,
}),
when: {
red: {
entry: delayedEmit({ type: 'START' }, 3000),
on: {
START: {
to: 'green',
},
CROSS: {
do: () => alert('JAYWALKING'),
},
},
},
yellow: {
entry: delayedEmit({ type: 'STOP' }, 1500),
on: {
STOP: {
to: 'red',
},
CROSS: {
do: ctx => ctx.streetsCrossed++,
},
},
},
green: {
entry: delayedEmit({ type: 'SLOW_DOWN' }, 2500),
on: {
SLOW_DOWN: {
to: 'yellow',
},
CROSS: {
do: ctx => ctx.streetsCrossed++,
},
},
},
},
render: (state, ctx) => (


{state}


{/* this is a targeted event:
only the machine with the specified
id will be checked */}
emit({ type: 'CROSS' }, 'light')}>
Cross the Street

Time(s) street crossed: {ctx.streetsCrossed}



),
});
```