atomico
Version:
Atomico is a small library for the creation of interfaces based on web-components, only using functions and hooks.
99 lines (78 loc) • 2.35 kB
TypeScript
import { FillObject } from "./schema.js";
import { JSXProps, Nullable } from "./dom.js";
export type VNodeChildren<Children> = Children extends null
? any[]
: Children extends any[]
? Children
: Children[];
export type VNodeProps<Props> = Props extends null
? FillObject
: FillObject & Props;
export type VnodeKeyTypesRaw = Node | typeof Element | Element | typeof Node;
export type VNodeKeyTypes = string | VnodeKeyTypesRaw | null;
export type VNodeType<Type> = Type;
export type VNodeRender = <T = Element>() => (
node: T,
id?: symbol | string,
hydrate?: boolean
) => T;
export type H = <Type, Props, Childre>(
type: Type,
props?: Props,
...children: Childre[]
) => VNode<Type, Props, Childre>;
interface VNodeGenericSchema {
[TYPE: symbol]: symbol;
key?: any;
shadow?: boolean | Partial<ShadowRootInit>;
static?: boolean;
is?: string;
clone?: boolean;
render: VNodeRender;
}
interface VNodeSchema<Type, Props, Children, Raw extends number>
extends VNodeGenericSchema {
type: Type;
props: Nullable<Props>;
children: Children;
raw: Raw;
}
export type VNode<Type, Props = any, Children = any> = Type extends string
? VNodeSchema<string, JSXProps<Type>, Children, 0>
: Type extends HTMLElement
? VNodeSchema<InternalElement, Props, Children, 1>
: Type extends typeof HTMLElement
? VNodeSchema<CustomElementConstructor, Props, Children, 2>
: VNodeSchema<any, Props, Children, number>;
export type VNodeAny = VNode<any>;
export type VNodeGeneric =
| VNode<string>
| VNode<Element>
| VNode<typeof HTMLElement>;
export interface VNodeListener extends AddEventListenerOptions {
(event: Event | CustomEvent): any;
}
export type VNodeStore = {
vnode: any;
cycle: number;
fragment?: Fragment;
handlers: any;
};
export type RenderId = symbol | string;
export type Keyes = Map<any, ChildNode>;
export interface Handlers extends EventListenerObject {
[event: string]: VNodeListener;
}
export type Fragment = {
markStart: ChildNode;
markEnd: ChildNode;
keyes?: Keyes;
};
export type Render = <T extends Element>(
vnode: VNodeAny,
node: T,
id?: RenderId
) => T;
interface InternalElement extends Element {
cloneNode(value: boolean): Element;
}