This commit is contained in:
Morten Olsen
2025-09-21 08:43:15 +02:00
commit 0ab9a27493
18 changed files with 5379 additions and 0 deletions

31
lib/component.ts Normal file
View File

@@ -0,0 +1,31 @@
import type { Html } from './html.js';
import { htmlElementContext, type HtmlElementContext } from './store.js';
type ComponentOptions<T> = (options: { props: T; context: HtmlElementContext['get'] }) => Html;
const component = <T>(options: ComponentOptions<T>) => {
const render = (props: T) => {
const toHtmlElement = () => {
const root = document.createElement('div');
root.style.display = 'content';
const context = htmlElementContext(root);
const api = { context: context.get, props };
const view = options(api);
context.emitter.addEventListener('change', () => {
view(root);
});
view(root);
return root;
};
return {
toHtmlElement,
};
};
return Object.assign(render, {
toHtmlElement: () => render({} as T).toHtmlElement(),
});
};
export { component };