diff --git a/README.md b/README.md index a4622aa..f765216 100644 --- a/README.md +++ b/README.md @@ -1,104 +1,8 @@ **WIP** (the experimentation phase) | [source code on GitHub](https://github.com/jaandrle/deka-dom-el) | [*mirrored* on Gitea](https://gitea.jaandrle.cz/jaandrle/deka-dom-el) -# Deka DOM Elements -This is reimplementation of [jaandrle/dollar_dom_component: Functional DOM components without JSX and virtual DOM.](https://github.com/jaandrle/dollar_dom_component). +***Vanilla by default — steroids if needed*** +*…use simple DOM API by default and library tools and logic when you need them* -The goal is to be even more close to the native JavaScript. - -# Native JavaScript DOM elements creations -Let’s go through all patterns we would like to use and what needs to be improved for better experience. - -## Creating element and DOM templates natively -```js -document.body.append( - document.createElement("div"), - document.createElement("span"), - document.createElement("main") -); -//=> HTML output:
-const template= document.createElement("main").append( - document.createElement("div"), - document.createElement("span"), -); -//=> ★:: typeof template==="undefined" -``` -**Pitfalls**: -- there is lots of text -- `.append` methdo returns `void`⇒ it cannot be chained (see ★) - -## Set properties of created element -```js -const element= Object.assign(document.createElement("p"), { className: "red", textContent: "paragraph" }); -document.body.append(element); -//=> HTML output:paragraph
-``` -**Pitfalls**: -- there is lots of text -- `Object.assign` isn’t ideal as it can set only (some) [IDL](https://developer.mozilla.org/en-US/docs/Glossary/IDL) - -# Events and dynamic parts -```js -const input= document.createElement("input"); -const output= document.createElement("output"); -input.addEventListener("change", function(event){ - output.value= event.target.value; -}); -document.body.append( - output, - input -); -//=> HTML output: -``` -**Pitfalls**: -- there is lots of text -- very hard to organize code - -# Helpers and modifications -Now, let's introduce library helpers and modifications. - -## `.append` -The `.append` is owerwrote to always returns element. This seem to be the best way to do it as it is very hard -to create Proxy around `HTMLElement`, …. -```js -document.body.append( - document.createElement("main").append( - document.createElement("div"), - document.createElement("span"), - ) -); -//=> HTML output:Basic concepts of elements modifications and creations.
Let’s go through all patterns we would like to use and what needs to be improved for better experience.
You can create a native DOM element by using the document.createElement()
. It is also possible to provide a some attribute(s) declaratively using Object.assign()
. More precisely, this way you can sets some IDL.
document.body.append(
+`deka-dom-el` — Elements `deka-dom-el` — Elements
Basic concepts of elements modifications and creations.
Native JavaScript DOM elements creations
Let’s go through all patterns we would like to use and what needs to be improved for better experience.
Creating element(s) (with custom attributes)
You can create a native DOM element by using the document.createElement()
. It is also possible to provide a some attribute(s) declaratively using Object.assign()
. More precisely, this way you can sets some IDL.
document.body.append(
document.createElement("div")
);
console.log(
@@ -12,7 +12,7 @@ document.body.append(
{ textContent: "Element’s text content.", style: "color: coral;" }
)
);
-
To make this easier, you can use the el
function. Internally in basic examples, it is wrapper around assign(document.createElement(…), { … })
.
import { el, assign } from "https://cdn.jsdelivr.net/gh/jaandrle/deka-dom-el/dist/esm-with-signals.js";
+
To make this easier, you can use the el
function. Internally in basic examples, it is wrapper around assign(document.createElement(…), { … })
.
import { el, assign } from "https://cdn.jsdelivr.net/gh/jaandrle/deka-dom-el/dist/esm-with-signals.js";
const color= "lightcoral";
document.body.append(
el("p", { textContent: "Hello (first time)", style: { color } })
@@ -23,7 +23,7 @@ document.body.append(
{ textContent: "Hello (second time)", style: { color } }
)
);
-
The assign
function provides improved behaviour of Object.assign()
. You can declaratively sets any IDL and attribute of the given element. Function prefers IDL and fallback to the element.setAttribute
if there is no writable property in the element prototype.
You can study all JavaScript elements interfaces to the corresponding HTML elements. All HTML elements inherits from HTMLElement. To see all available IDLs for example for paragraphs, see HTMLParagraphElement. Moreover, the assign
provides a way to sets declaratively some convenient properties:
- It is possible to sets
data-*
/aria-*
attributes using object notation. - In opposite, it is also possible to sets
data-*
/aria-*
attribute using camelCase notation. - You can use string or object as a value for
style
property. className
(IDL – preffered)/class
are ways to add CSS class to the element. You can use string (similarly to class="…"
syntax in HTML) or array of strings. This is handy to concat conditional classes.- Use
classList
to toggle specific classes. This will be handy later when the reactivity via signals is beeing introduced. - The
assign
also accepts the undefined
as a value for any property to remove it from the element declaratively. Also for some IDL the corresponding attribute is removed as it can be confusing. For example, natievly the element’s id
is removed by setting the IDL to an empty string.
For processing, the assign
internally uses assignAttribute
and classListDeclarative
.
import { assignAttribute, classListDeclarative } from "https://cdn.jsdelivr.net/gh/jaandrle/deka-dom-el/dist/esm-with-signals.js";
+
The assign
function provides improved behaviour of Object.assign()
. You can declaratively sets any IDL and attribute of the given element. Function prefers IDL and fallback to the element.setAttribute
if there is no writable property in the element prototype.
You can study all JavaScript elements interfaces to the corresponding HTML elements. All HTML elements inherits from HTMLElement. To see all available IDLs for example for paragraphs, see HTMLParagraphElement. Moreover, the assign
provides a way to sets declaratively some convenient properties:
- It is possible to sets
data-*
/aria-*
attributes using object notation. - In opposite, it is also possible to sets
data-*
/aria-*
attribute using camelCase notation. - You can use string or object as a value for
style
property. className
(IDL – preffered)/class
are ways to add CSS class to the element. You can use string (similarly to class="…"
syntax in HTML) or array of strings. This is handy to concat conditional classes.- Use
classList
to toggle specific classes. This will be handy later when the reactivity via signals is beeing introduced. - The
assign
also accepts the undefined
as a value for any property to remove it from the element declaratively. Also for some IDL the corresponding attribute is removed as it can be confusing. For example, natievly the element’s id
is removed by setting the IDL to an empty string.
For processing, the assign
internally uses assignAttribute
and classListDeclarative
.
import { assignAttribute, classListDeclarative } from "https://cdn.jsdelivr.net/gh/jaandrle/deka-dom-el/dist/esm-with-signals.js";
const paragraph= document.createElement("p");
assignAttribute(paragraph, "textContent", "Hello, world!");
@@ -48,7 +48,7 @@ console.log(paragraph.outerHTML);
document.body.append(
paragraph
);
-
Native JavaScript templating
By default, the native JS has no good way to define HTML template using DOM API:
document.body.append(
+
Native JavaScript templating
By default, the native JS has no good way to define HTML template using DOM API:
document.body.append(
document.createElement("div"),
document.createElement("span"),
document.createElement("main")
@@ -59,7 +59,7 @@ const template= document.createElement("main").append(
document.createElement("span"),
);
console.log(typeof template==="undefined");
-
This library therefore ooverwrites the append
method to always return parent element.
import { el } from "https://cdn.jsdelivr.net/gh/jaandrle/deka-dom-el/dist/esm-with-signals.js";
+
This library therefore ooverwrites the append
method to always return parent element.
import { el } from "https://cdn.jsdelivr.net/gh/jaandrle/deka-dom-el/dist/esm-with-signals.js";
document.head.append(
el("style").append(
"tr, td{ border: 1px solid red; padding: 1em; }",
@@ -83,7 +83,7 @@ document.body.append(
)
)
);
-
Creating advanced (reactive) templates and components
Basic components
You can use functions for encapsulation (repeating) logic. The el
accepts function as first argument. In that case, the function should return dom elements and the second argument for el
is argument for given element.
import { el } from "https://cdn.jsdelivr.net/gh/jaandrle/deka-dom-el/dist/esm-with-signals.js";
+
Creating advanced (reactive) templates and components
Basic components
You can use functions for encapsulation (repeating) logic. The el
accepts function as first argument. In that case, the function should return dom elements and the second argument for el
is argument for given element.
import { el } from "https://cdn.jsdelivr.net/gh/jaandrle/deka-dom-el/dist/esm-with-signals.js";
document.head.append(
el("style").append(
".class1{ font-weight: bold; }",
@@ -100,4 +100,4 @@ function component({ className, textContent }){
el("p", textContent)
);
}
-
It is nice to use similar naming convention as native DOM API.
\ No newline at end of file
+
It is nice to use similar naming convention as native DOM API.
Introducing a library and motivations.
The library tries to provide pure JavaScript tool(s) to create reactive interfaces.
The main goals are:
It is, in fact, an reimplementation of jaandrle/dollar_dom_component.
import { el, S } from "https://cdn.jsdelivr.net/gh/jaandrle/deka-dom-el/dist/esm-with-signals.js";
+`deka-dom-el` — Introduction `deka-dom-el` — Introduction
Introducing a library and motivations.
The library tries to provide pure JavaScript tool(s) to create reactive interfaces.
import { el, S } from "https://cdn.jsdelivr.net/gh/jaandrle/deka-dom-el/dist/esm-with-signals.js";
const clicks= S(0);
document.body.append(
el().append(
@@ -12,4 +12,4 @@ document.body.append(
})
)
);
-
\ No newline at end of file
+