mirror of
				https://github.com/jaandrle/deka-dom-el
				synced 2025-10-31 05:49:15 +01:00 
			
		
		
		
	🔤 Improves and updates docs
- customElementRender - introduction example
This commit is contained in:
		
							
								
								
									
										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); | ||||
| 	}; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user