@joshuafcole/fluorine
Version:
A highly reactive, optionally compiled, and strongly typed view layer for TypeScript.
165 lines (141 loc) • 4.08 kB
text/typescript
export { Renderer, PropType, FElement, FElem, FNode, FChild } from "./renderer";
export { handle, get, handlers, EventBinder, Compilable } from "./catalyst";
export { stasis } from "./stasis";
import { Renderer, FElement, FElem, FSVGElement } from "./renderer";
import { handlers } from "./catalyst";
import { EMPTY } from "efreet/utils";
// Macros
declare global {
export type PARRArray<T> = PARRLabel<T> & [any, ...(string | number)[]];
export interface PARRLabel<T> {
__type: T;
slice(end?: number): PARRArray<T>;
slice(start?: number, end?: number): PARRArray<T>;
}
function PARR<T>(x: T): PARRArray<T>;
}
let _renderer: Renderer | undefined;
if (typeof window !== "undefined") _renderer = new Renderer();
export let renderer = _renderer!;
let _handlers = handlers;
namespace React {
export let renderer = _renderer!;
export let handlers = _handlers;
export function createElement(
tagname:
| string
| ((
props: FElement,
children?: (string | FElement | FElement[] | undefined)[]
) => FElement),
props?: FElement,
...children: (FElem | string | undefined)[]
): FElem {
if (!props) props = { kind: "dynamic" };
if (!props.kind) props.kind = "dynamic";
if (children) {
let _cleaned: (string | FElem | undefined)[] = [];
for (let child of children) {
if (child instanceof Array) _cleaned.push(...child);
else _cleaned.push(child);
}
children = _cleaned;
}
if (props.svg) {
if (props.xlinkHref) {
props["xlink:href"] = props.xlinkHref;
delete props.xlinkHref;
}
}
let elem = props as FElem;
if (typeof tagname === "function") elem = tagname(props, children) as FElem;
else {
elem.tagname = tagname;
if (children) props.children = children;
}
return elem;
}
}
declare global {
namespace React {
export let renderer: Renderer;
export let handlers: typeof _handlers;
export function createElement(
tagname: string,
props?: FElement,
...children: (FElem | string | undefined)[]
): FElem;
}
namespace JSX {
// interface ElementAttributesProperty { props: {}; }
interface ElementChildrenAttribute {
children: {}; // specify children name to use
}
// interface Element extends FElement {}
interface IntrinsicElements {
[tag: string]: FElement;
div: FElement;
section: FElement;
span: FElement;
button: FElement;
a: FElement;
nav: FElement;
ul: FElement;
ol: FElement;
li: FElement;
input: FElement;
textarea: FElement;
// SVG
svg: FSVGElement & {
viewBox: string;
height?: number | string;
width?: number | string;
preserveAspectRatio?: string;
x?: number | string;
y?: number | string;
};
g: FSVGElement;
circle: FSVGElement & {
cx: number | string;
cy: number | string;
r: number | string;
pathLength?: number | string;
};
ellipse: FSVGElement & {
cx: number | string;
cy: number | string;
rx: number | string;
ry: number | string;
pathLength?: number | string;
};
line: FSVGElement & {
x1: number | string;
y1: number | string;
x2: number | string;
y2: number | string;
pathLength?: number | string;
};
polygon: FSVGElement & {
points: string;
pathLength?: number | string;
};
polyline: FSVGElement & {
points: string;
pathLength?: number | string;
};
path: FSVGElement & {
d: string;
};
rect: FSVGElement & {
x: number | string;
y: number | string;
width: number | string;
height: number | string;
rx?: number | string;
ry?: number | string;
pathLength?: number | string;
};
}
}
}
if (typeof window !== "undefined") (window as any).React = React;