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(count.get())}`),
}),
// 🎮 Controls - Update state on events
el("button", { textContent: "Add Emoji" },
on("click", () => count.set(count.get() + 1))
),
el("select", null, on.host(el=> el.value= initial),
on("change", e => emoji.set(e.target.value))
).append(
el(Option, "🎉"),
el(Option, "🚀"),
el(Option, "💖"),
)
);
}
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
- ✅ Memoization for performance — optimize rendering with intelligent caching
- ✅ 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
CDN / Direct Script
For CDN links and various build formats (ESM/IIFE, with/without signals, minified/unminified), see the interactive format selector on the documentation site.
<!-- Example with IIFE build (creates a global DDE object) -->
<script src="https://cdn.jsdelivr.net/gh/jaandrle/deka-dom-el/dist/iife-with-signals.min.js"></script>
<script>
const { el, S } = DDE;
// Your code here
</script>
<!-- Or with ES modules -->
<script type="module">
import { el, S } from "https://cdn.jsdelivr.net/gh/jaandrle/deka-dom-el/dist/esm-with-signals.min.js";
// Your code here
</script>
Documentation
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)
Contributing
We welcome contributions from the community! Please see our Contributing Guide for details on how to get started, coding standards, commit guidelines, and the pull request process.
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
- AseasRoa/paintor - JavaScript library for building reactive client-side user interfaces or HTML code.
- pota — small and pluggable Reactive Web Renderer. It's compiler-less, includes an html function, and a optimized babel preset in case you fancy JSX.
- jaandrle/dollar_dom_component — Functional DOM components without JSX/virtual DOM
- TarekRaafat/eleva — A minimalist, lightweight, pure vanilla JavaScript frontend runtime framework.
- didi/mpx — Mpx,一款具有优秀开发体验和深度性能优化的增强型跨端小程序框架
- mxjp/rvx — A signal based frontend framework