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 = { readonly dom: DomSource }
* @type
*/
export declare type DomSources = {
readonly dom: DomSource;
};
/**
* Sinks type returns by a DOM component.
* @name DomSinks
* @example
* export type DomSinks = { readonly view$: Stream }
* @type
*/
export declare type DomSinks = {
readonly view$: Stream;
};
/**
* 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 = events('click', query('button'))
*
* const amount$: Stream = scan(x => x + 1, 0, click$)
*
* const view$: Stream = 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;