WIP (the experimentation phase) | source code on GitHub | mirrored on Gitea
Deka DOM Elements (dd<el> or DDE)
Vanilla for flavouring — a full-fledged feast for large projects
…use simple DOM API by default and library tools and logic when you need them
// 🌟 Reactive component with clear separation of concerns
document.body.append(
el(EmojiCounter, { initial: "🚀" })
);
function EmojiCounter({ initial }) {
// ✨ State - Define reactive data
const count = S(0);
const emoji = S(initial);
/** @param {HTMLOptionElement} el */
const isSelected= el=> (el.selected= el.value===initial);
// 🔄 View - UI updates automatically when signals change
return el().append(
el("p", {
className: "output",
textContent: S(() =>
`Hello World ${emoji.get().repeat(clicks.get())}`),
}),
// 🎮 Controls - Update state on events
el("button", { textContent: "Add Emoji" },
on("click", () => count.set(count.get() + 1))
),
el("select", null,
on("change", e => emoji.set(e.target.value))
).append(
el(Option, "🎉", isSelected),
el(Option, "🚀", isSelected),
el(Option, "💖", isSelected),
)
);
}
function Option({ textContent }){
return el("option", { value: textContent, textContent });
}
Creating reactive elements, components, and Web Components using the native IDL/JavaScript DOM API enhanced with signals/observables.
Features at a Glance
- ✅ No build step required — use directly in browsers or Node.js
- ☑️ Lightweight — ~10-15kB minified (original goal 10kB) with zero/minimal dependencies
- ✅ Declarative & functional approach for clean, maintainable code
- ✅ Signals and events for reactive UI
- ✅ Optional build-in signals with support for custom reactive implementations
- ✅ Server-side rendering support via jsdom
- ✅ TypeScript support (work in progress)
- ☑️ Support for debugging with browser DevTools without extensions
- ☑️ Enhanced Web Components support (work in progress)
Why Another Library?
This library bridges the gap between minimal solutions like van/hyperscript and more comprehensive frameworks like solid-js, offering a balanced trade-off between size, complexity, and usability.
Following functional programming principles, dd<el> starts with pure JavaScript (DOM API) and gradually adds auxiliary functions. These range from minor improvements to advanced features for building complete declarative reactive UI templates.
A key advantage: any internal function (assign
, classListDeclarative
, on
, dispatchEvent
, S
, etc.) can be used
independently while also working seamlessly together. This modular approach makes it easier to integrate the library
into existing projects.
Getting Started
Installation
npm
# TBD
# npm install deka-dom-el
Direct Script
<script src="https://cdn.jsdelivr.net/gh/jaandrle/deka-dom-el/dist/iife-with-signals.min.js"></script>
<script type="module">
const { el, S } = DDE;
</script>
Documentation
- Interactive Guide: WIP
- Examples: TBD/WIP
Understanding Signals
Signals are the reactive backbone of Deka DOM Elements:
- Signals — what's going on behind the scenes
- The Evolution of Signals in JavaScript
- TC39 Signals Proposal (future standard)
- Observer pattern (underlying concept)
Inspiration and Alternatives
- vanjs-org/van - World's smallest reactive UI framework
- adamhaile/S - Simple, clean, fast reactive programming
- hyperhype/hyperscript - Create HyperText with JavaScript
- potch/signals - A small reactive signals library
- jaandrle/dollar_dom_component - Functional DOM components without JSX/virtual DOM