* 🔤 ⚡ T now uses DocumentFragment * 🔤 * 🔤 ⚡ * 🐛 lint * ⚡ cleanup * ⚡ 🔤 lib download * ⚡ 🔤 ui * ⚡ reorganize files * ⚡ on.host * 🐛 on.* types * ⚡ 🔤 cdn * 🔤 converter * 🐛 signal.set(value, force) * ⚡ 🔤 * 🔤 ⚡ converter - convert also comments * ⚡ bs/build * 🔤 ui p14 * 🔤 * 🔤 Examples * 🔤 * 🐛 now only el(..., string|number) * 🐛 fixes #38 * 🔤 * ⚡ on.host → on.defer * 🔤 * 📺
5.7 KiB
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)
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