@motorcycle/mostly-dom
Version:
Motorcycle.ts adapter for mostly-dom. Built on @motorcycle/dom.
68 lines (67 loc) • 1.7 kB
TypeScript
import { DomSource } from '@motorcycle/dom';
import { VNode } from 'mostly-dom';
import { IOComponent, Stream } from '@motorcycle/types';
/**
* Sources type expected by a DOM component.
* @name DomSources
* @example
* export type DomSources<A = Element, B = Event> = { readonly dom: DomSource<A, B> }
* @type
*/
export declare type DomSources<A = Element, B = Event> = {
readonly dom: DomSource<A, B>;
};
/**
* Sinks type returns by a DOM component.
* @name DomSinks
* @example
* export type DomSinks = { readonly view$: Stream<VNode> }
* @type
*/
export declare type DomSinks = {
readonly view$: Stream<VNode>;
};
/**
* Takes an element and returns a DOM component function.
*
* @name makeDomComponent(element: Element): (sinks: DomSinks) => DomSources
* @example
* import {
* makeDomComponent,
* DomSources,
* DomSinks,
* VNode,
* events,
* query,
* div,
* h1,
* button
* } from '@motorcycle/mostly-dom'
* import { run } from '@motorcycle/run'
*
* const element = document.querySelector('#app')
*
* if (!element) throw new Error('unable to find element')
*
* run(Main, makeDomComponent(element))
*
* function Main(sources: DomSources): DomSinks {
* const { dom } = sources
*
* const click$: Stream<Event> = events('click', query('button'))
*
* const amount$: Stream<number> = scan(x => x + 1, 0, click$)
*
* const view$: Stream<VNode> = map(view, amount$)
*
* return { view$ }
* }
*
* function view(amount: number) {
* return div([
* h1(`Clicked ${amount} times`),
* button(`Click me`)
* ])
* }
*/
export declare function makeDomComponent(element: Element): IOComponent<DomSinks, DomSources>;