WIP (the experimentation phase) | source code on GitHub | mirrored on Gitea
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.
- โ 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)
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.
# TBD
# npm install deka-dom-el
<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>
- Interactive Guide: WIP
- Examples: TBD/WIP
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)
- 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