1
0
mirror of https://github.com/jaandrle/deka-dom-el synced 2024-11-25 09:49:36 +01:00
deka-dom-el/examples/components/webComponent.js

82 lines
2.6 KiB
JavaScript
Raw Normal View History

import { el, scope } from "../../index.js";
import { S } from "../../signals.js";
2023-09-12 15:26:06 +02:00
const { hasOwnProperty }= Object.prototype;
/**
* Compatible with `npx-wca test/components/webComponent.js`
* */
export class CustomHTMLTestElement extends HTMLElement{
static get observedAttributes(){
2023-09-12 15:26:06 +02:00
return [ "name", "pre-name" ];
}
connectedCallback(){
2023-09-12 15:26:06 +02:00
this.attachShadow({ mode: "open" }).append(
customElementRender(this, this.render)
2023-09-12 15:26:06 +02:00
);
}
render({ test }){
console.log(scope.state);
scope.host(on.connected(()=> console.log(CustomHTMLTestElement)));
scope.host(on.attributeChanged(e=> console.log(e)));
scope.host(on.disconnected(()=> console.log(CustomHTMLTestElement)));
const name= S.attribute("name");
const preName= S.attribute("pre-name");
console.log({ name, test, preName});
2023-09-12 15:26:06 +02:00
return el("p").append(
el("#text", { textContent: name }),
el("#text", { textContent: test }),
el("#text", { textContent: preName }),
);
}
}
// https://gist.github.com/WebReflection/ec9f6687842aa385477c4afca625bbf4
customElementsAssign(
CustomHTMLTestElement,
reflectObservedAttributes,
lifecycleToEvents,
);
customElements.define("custom-test", CustomHTMLTestElement);
function customElementRender(_this, render){
scope.push({ scope: _this, host: (...a)=> a.length ? a[0](_this) : _this });
const out= render(_this);
scope.pop();
return out;
}
/** @returns {HTMLElement} */
function customElementsAssign(class_base, ...automatize){
2023-09-12 15:26:06 +02:00
automatize.forEach(a=> a(class_base));
}
function reflectObservedAttributes(c){
2023-09-12 15:26:06 +02:00
for(const name of c.observedAttributes){
const name_camel= name.replace(/([a-z])-([a-z])/g, (_, l, r)=> l+r.toUpperCase());
if(hasOwnProperty.call(c.prototype, name_camel))
continue;
Reflect.defineProperty(c.prototype, name_camel, {
get(){ return this.getAttribute(name); },
set(value){ this.setAttribute(name, value); }
});
2023-09-12 15:26:06 +02:00
}
}
function lifecycleToEvents(class_declaration){
for (const name of [ "connected", "disconnected" ])
wrapMethod(class_declaration.prototype, name+"Callback", function(target, thisArg, detail){
target.apply(thisArg, detail);
thisArg.dispatchEvent(new Event("dde:"+name));
});
const name= "attributeChanged";
wrapMethod(class_declaration.prototype, name+"Callback", function(target, thisArg, detail){
const [ attribute, , value ]= detail;
thisArg.dispatchEvent(new CustomEvent("dde:"+name, {
detail: [ attribute, value ]
}));
target.apply(thisArg, detail);
});
class_declaration.prototype.__dde_lifecycleToEvents= true;
}
function wrapMethod(obj, method, apply){
obj[method]= new Proxy(obj[method] || (()=> {}), { apply });
}