@ztools.org/runtime
v0.0.4
Published
Tiny DOM-first reactive UI runtime
Readme
ztools
Tiny JavaScript-first reactive UI runtime (no virtual DOM, no compile step).
Features
- Reactive primitives:
signal,effect,computed,batch,onCleanup - DOM helpers:
h,tag,createTags - Control flow:
Show,For(keyed) - App mounting:
mount(Component, container)with cleanup
Install
npm install @ztools.org/runtimeQuick start
import { signal, computed, createTags, Show, For, mount } from "ztools";
const [div, h1, p, button] = createTags("div", "h1", "p", "button");
function App() {
const count = signal(0);
const doubled = computed(() => count() * 2);
const items = signal([{ id: 1, title: "A" }, { id: 2, title: "B" }]);
return div(
h1("ztools demo"),
p("count: ", () => count(), " x2=", () => doubled()),
button({ onClick: () => count.set(count() + 1) }, "+1"),
Show(() => count() % 2 === 0, () => div("even"), () => div("odd")),
For(items, (it, idx) => div(() => `${idx() + 1}. ${it.title}`), (it) => it.id)
);
}
mount(App, document.body);API
Reactivity
signal(initial)-> getter function with.set(next)effect(fn)-> runs reactively when signal dependencies changecomputed(fn)-> derived signalbatch(fn)-> coalesce updatesonCleanup(fn)-> register cleanup in current effect/owner
DOM
h(tag, ...args)-> create elementtag(name)/createTags(...names)-> ergonomic tag factoriestags-> proxy-based tag factory (tags.div(...),tags.button(...))
Control flow
Show(when, render, fallback?)For(listSignal, renderItem, keyFn?)
Mounting
mount(Component, container)-> returnsdispose()enhance(root, setup)-> attach reactive behavior to existing DOM
Development
npm install
npm run generate:ssr-demo
npm test
npm run build:pagesDemos source is in demo/.
SSR demo page is generated server-side from demo/ssr/generate-ssr-page.mjs into demo/ssr/index.html.
GitHub Pages artifact is generated in build/ (copied from docs/ plus built examples/runtime files), so you can test locally before deployment.
Example local preview:
npx serve build