mirror of
https://github.com/jaandrle/deka-dom-el
synced 2025-04-02 20:15:53 +02:00
* :tap: removed on.attributeChanged and static observedAttributes * ⚡ import optimalization * ⚡ scope.signal * 🔤 🐛 * ⚡ 🐛 registerReactivity and types * 🔤 * ⚡ * 🔤 * 🐛 Node in enviroment * ⚡ todos * ⚡ * ⚡ 🔤 * ⚡ lint * ⚡ memo * 🔤 🐛 memo * ⚡ 🔤 todomvc * 🐛 types * 🔤 p08 signal factory * 🔤 ⚡ types * ⚡ 🔤 lint * 🔤 * 🔤 * 🔤 * 🔤 * 📺
37 lines
1.3 KiB
JavaScript
37 lines
1.3 KiB
JavaScript
import { el, on } from "deka-dom-el";
|
|
import { S } from "deka-dom-el/signals";
|
|
document.body.append(
|
|
el(HelloWorldComponent, { initial: "🚀" })
|
|
);
|
|
/** @typedef {"🎉" | "🚀"} Emoji */
|
|
/** @param {{ initial: Emoji }} attrs */
|
|
function HelloWorldComponent({ initial }){
|
|
const clicks= S(0);
|
|
const emoji= S(initial);
|
|
/** @param {HTMLOptionElement} el */
|
|
const isSelected= el=> (el.selected= el.value===initial);
|
|
// @ts-expect-error 2339: The <select> has only two options with {@link Emoji}
|
|
const onChange= on("change", event=> emoji(event.target.value));
|
|
|
|
return el().append(
|
|
el("p", {
|
|
textContent: S(() => `Hello World ${emoji.get().repeat(clicks.get())}`),
|
|
className: "example",
|
|
ariaLive: "polite", //OR ariaset: { live: "polite" },
|
|
dataset: { example: "Example" }, //OR dataExample: "Example",
|
|
}),
|
|
el("button",
|
|
{ textContent: "Fire", type: "button" },
|
|
on("click", ()=> clicks.set(clicks.get() + 1)),
|
|
on("keyup", ()=> clicks.set(clicks.get() - 2)),
|
|
),
|
|
el("select", null, onChange).append(
|
|
el(OptionComponent, "🎉", isSelected),//OR { textContent: "🎉" }
|
|
el(OptionComponent, "🚀", isSelected),//OR { textContent: "🚀" }
|
|
)
|
|
);
|
|
}
|
|
function OptionComponent({ textContent }){
|
|
return el("option", { value: textContent, textContent })
|
|
}
|