mirror of
https://github.com/jaandrle/deka-dom-el
synced 2025-04-01 19:55:53 +02:00
🔤 Improves and updates docs
- customElementRender - introduction example
This commit is contained in:
parent
3d0aeafc5c
commit
e81ac9a3e5
21
README.md
21
README.md
@ -8,12 +8,17 @@
|
||||
|
||||
```javascript
|
||||
document.body.append(
|
||||
el(HelloWorldComponent)
|
||||
el(HelloWorldComponent, { initial: "🚀" })
|
||||
);
|
||||
function HelloWorldComponent(){
|
||||
/** @typedef {"🎉" | "🚀"} Emoji */
|
||||
/** @param {{ initial: Emoji }} attrs */
|
||||
function HelloWorldComponent({ initial }){
|
||||
const clicks= S(0);
|
||||
const emoji= S("🚀");
|
||||
const isSelected= el=> (el.selected= el.value===emoji());
|
||||
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", {
|
||||
@ -27,11 +32,9 @@ function HelloWorldComponent(){
|
||||
on("click", ()=> clicks(clicks() + 1)),
|
||||
on("keyup", ()=> clicks(clicks() - 2)),
|
||||
),
|
||||
el("select", {
|
||||
onchange: event=> emoji(event.target.value),
|
||||
}).append(
|
||||
el(OptionComponent, "🎉", isSelected),
|
||||
el(OptionComponent, "🚀", isSelected),
|
||||
el("select", null, onChange).append(
|
||||
el(OptionComponent, "🎉", isSelected),//OR { textContent: "🎉" }
|
||||
el(OptionComponent, "🚀", isSelected),//OR { textContent: "🚀" }
|
||||
)
|
||||
);
|
||||
}
|
||||
|
1
dist/esm-with-signals.d.ts
vendored
1
dist/esm-with-signals.d.ts
vendored
@ -227,7 +227,6 @@ export function customElementRender<
|
||||
EL extends HTMLElement,
|
||||
P extends any = Record<string, string | ddeSignal<string>>
|
||||
>(
|
||||
custom_element: EL,
|
||||
target: ShadowRoot | EL,
|
||||
render: (props: P)=> SupportedElement | DocumentFragment,
|
||||
props?: P | ((el: EL)=> P)
|
||||
|
1
dist/esm.d.ts
vendored
1
dist/esm.d.ts
vendored
@ -227,7 +227,6 @@ export function customElementRender<
|
||||
EL extends HTMLElement,
|
||||
P extends any = Record<string, string | ddeSignal<string>>
|
||||
>(
|
||||
custom_element: EL,
|
||||
target: ShadowRoot | EL,
|
||||
render: (props: P)=> SupportedElement | DocumentFragment,
|
||||
props?: P | ((el: EL)=> P)
|
||||
|
@ -7,7 +7,6 @@ export class HTMLCustomElement extends HTMLElement{
|
||||
static observedAttributes= [ "attr" ];
|
||||
connectedCallback(){
|
||||
customElementRender(
|
||||
this,
|
||||
this.attachShadow({ mode: "open" }),
|
||||
ddeComponent
|
||||
);
|
||||
|
@ -11,7 +11,6 @@ export class HTMLCustomElement extends HTMLElement{
|
||||
connectedCallback(){
|
||||
console.log(observedAttributes(this));
|
||||
customElementRender(
|
||||
this,
|
||||
this.attachShadow({ mode: "open" }),
|
||||
ddeComponent,
|
||||
S.observedAttributes
|
||||
|
@ -17,11 +17,7 @@ function ddeComponent(){
|
||||
export class A extends HTMLElement{
|
||||
static tagName= "custom-element-without";
|
||||
connectedCallback(){
|
||||
customElementRender(
|
||||
this,
|
||||
this,
|
||||
ddeComponent
|
||||
);
|
||||
customElementRender(this, ddeComponent);
|
||||
}
|
||||
}
|
||||
customElementWithDDE(A);
|
||||
@ -30,7 +26,6 @@ export class B extends HTMLElement{
|
||||
static tagName= "custom-element-open";
|
||||
connectedCallback(){
|
||||
customElementRender(
|
||||
this,
|
||||
this.attachShadow({ mode: "open" }),
|
||||
ddeComponent
|
||||
);
|
||||
@ -42,7 +37,6 @@ export class C extends HTMLElement{
|
||||
static tagName= "custom-element-closed";
|
||||
connectedCallback(){
|
||||
customElementRender(
|
||||
this,
|
||||
this.attachShadow({ mode: "closed" }),
|
||||
ddeComponent
|
||||
);
|
||||
|
@ -8,7 +8,7 @@ export class HTMLCustomElement extends HTMLElement{
|
||||
static tagName= "custom-slotting";
|
||||
connectedCallback(){
|
||||
const c= ()=> simulateSlots(this, ddeComponent());
|
||||
customElementRender(this, this, c);
|
||||
customElementRender(this, c);
|
||||
}
|
||||
}
|
||||
customElementWithDDE(HTMLCustomElement);
|
||||
|
@ -1,18 +1,36 @@
|
||||
import { el } from "deka-dom-el";
|
||||
import { el, on } from "deka-dom-el";
|
||||
import { S } from "deka-dom-el/signals";
|
||||
document.body.append(
|
||||
el(HelloWorldComponent)
|
||||
el(HelloWorldComponent, { initial: "🚀" })
|
||||
);
|
||||
function HelloWorldComponent(){
|
||||
const clicksS= S(0); // A
|
||||
/** @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", S(()=>
|
||||
"Hello World "+"🎉".repeat(clicksS()) // B
|
||||
)),
|
||||
el("button", {
|
||||
type: "button",
|
||||
onclick: ()=> clicksS(clicksS()+1), // C
|
||||
textContent: "Fire",
|
||||
})
|
||||
)
|
||||
el("p", {
|
||||
textContent: S(() => `Hello World ${emoji().repeat(clicks())}`),
|
||||
className: "example",
|
||||
ariaLive: "polite", //OR ariaset: { live: "polite" },
|
||||
dataset: { example: "Example" }, //OR dataExample: "Example",
|
||||
}),
|
||||
el("button",
|
||||
{ textContent: "Fire", type: "button" },
|
||||
on("click", ()=> clicks(clicks() + 1)),
|
||||
on("keyup", ()=> clicks(clicks() - 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 })
|
||||
}
|
||||
|
@ -4,8 +4,8 @@ import { mnemonicUl } from "../mnemonicUl.html.js";
|
||||
export function mnemonic(){
|
||||
return mnemonicUl().append(
|
||||
el("li").append(
|
||||
el("code", "customElementRender(<custom-element>, <connect-target>, <render-function>[, <properties>])"),
|
||||
" — use function to render DOM structure for given <custom-element>",
|
||||
el("code", "customElementRender(<connect-target>, <render-function>[, <properties>])"),
|
||||
" — use function to render DOM structure for given custom element (or its Shadow DOM)",
|
||||
),
|
||||
el("li").append(
|
||||
el("code", "customElementWithDDE(<custom-element>)"),
|
||||
@ -24,7 +24,7 @@ export function mnemonic(){
|
||||
" — convert lifecycle methods to events, can be also used as decorator",
|
||||
),
|
||||
el("li").append(
|
||||
el("code", "simulateSlots(<class-instance>, <body>[, <mapper>])"),
|
||||
el("code", "simulateSlots(<class-instance>, <body>)"),
|
||||
" — simulate slots for Custom Elements without shadow DOM",
|
||||
),
|
||||
el("li").append(
|
||||
|
1
index.d.ts
vendored
1
index.d.ts
vendored
@ -227,7 +227,6 @@ export function customElementRender<
|
||||
EL extends HTMLElement,
|
||||
P extends any = Record<string, string | ddeSignal<string>>
|
||||
>(
|
||||
custom_element: EL,
|
||||
target: ShadowRoot | EL,
|
||||
render: (props: P)=> SupportedElement | DocumentFragment,
|
||||
props?: P | ((el: EL)=> P)
|
||||
|
@ -1,6 +1,7 @@
|
||||
import { signals } from "./signals-common.js";
|
||||
import { enviroment as env } from './dom-common.js';
|
||||
|
||||
//TODO: add type, docs ≡ make it public
|
||||
export function queue(promise){ return env.q(promise); }
|
||||
/** @type {{ scope: object, prevent: boolean, host: function }[]} */
|
||||
const scopes= [ {
|
||||
|
@ -8,6 +8,7 @@ export function dispatchEvent(name, options, host){
|
||||
d.unshift(element);
|
||||
element= typeof host==="function"? host() : host;
|
||||
}
|
||||
//TODO: what about re-emmitting?
|
||||
const event= d.length ? new CustomEvent(name, Object.assign({ detail: d[0] }, options)) : new Event(name, options);
|
||||
return element.dispatchEvent(event);
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user