rimmel
Version:
A Stream-Oriented UI library for the Rx.Observable Universe
81 lines • 2.53 kB
TypeScript
import { ExplicitSink } from "../types/sink";
export declare const MIXIN_SINK_TAG = "mixin";
/**
* A specialised sink to merge all properties of an object into a target element.
* If you pass a plain object it will be merged immediately. You can also merge event listeners on mount.
* If you pass a future, it will be merged whenever it emits any data.
* @param source A present or future Attribuend Object (a plain object of key-values to merge) that will be merged into the target element
* @returns SinkBindingConfiguration an object that tells Rimmel what to mount where and how
* You can specify this sink in the following ways:
* - implicitly, by passing it into a tag: `<div ...${source}">`
* - explicitly, with the `<div ...${Mixin(source)}">` sink
*
* ## Examples
*
* ### Add an event listener to a button after 5s
*
* ```ts
* import { rml } from 'rimmel';
*
* const delay = (ms: number) => new Promise(resolve => setTimeout(resolve), ms);
*
* const ClickMixin = async () => {
* const listener = (e: Event) => {
* debugger;
* }
*
* await delay(5000);
*
* return {
* onclick: listener,
* };
* }
*
* // Using the mixin:
* target.innerHTML = rml`
* <button ...${ClickMixin()}">
* click me
* </button>
* `;
* };
* ```
*
* ### Drag'n'drop with a mixin
*
* ```ts
* import { Subject, fromEvent, map, switchMap, takeUntil, tap } from 'rxjs';
*
* const currentXY = (str: string) => /translate\((?<x0>[-.\d]+)px, (?<y0>[-.\d]+)px\)/.exec(str)?.groups ?? {x0: '0', y0: '0'};
*
* export const Draggable = () => {
* const toCSSTransform = () => map(([Δx, Δy]) => ({
* transform: `translate(${Δx}px, ${Δy}px)`
* }));
*
* const dnd = new Subject().pipe(
* tap((e: PointerEvent) => e.preventDefault()),
* switchMap((e: PointerEvent) => {
* const mousemove = fromEvent(document, 'mousemove')
* const mouseup = fromEvent(document, 'mouseup');
*
* const {x0, y0} = currentXY((<HTMLElement>e.currentTarget).style.transform);
* const [eX, eY] = [e.clientX -parseFloat(x0), e.clientY -parseFloat(y0)];
*
* return mousemove.pipe(
* map((e: PointerEvent) => [e.clientX -eX, e.clientY -eY]),
* toCSSTransform(),
* takeUntil(mouseup),
* );
* }),
* );
*
* return {
* class: 'draggable',
* onmousedown: dnd,
* style: dnd,
* };
* };
* ```
*/
export declare const Mixin: ExplicitSink<'mixin'>;
//# sourceMappingURL=mixin-sink.d.ts.map