export function gid(id: string, doc: (Document | ShadowRoot) | undefined) { return ((doc ?? document).getElementById(id)); } export function qs(query: string, sub: (HTMLElement | ShadowRoot) | undefined) { return ((sub ?? document).querySelector(query)); } export function qsa(query: string, sub?: (HTMLElement | ShadowRoot) | undefined) { return ((sub ?? document).querySelectorAll(query)); } export function h( tag: T, opts?: Partial | undefined, children?: Node[], ) { const newEl = Object.assign(document.createElement(tag), opts ?? {}); if (children) { newEl.append(...children); } return newEl; } export function html(strs: TemplateStringsArray, ...vals: string[]) { let result = strs[0]; for (let i = 1; i < strs.length; i++) { result += vals[i] + strs[i]; } const template = document.createElement("template"); template.innerHTML = result; return template; } export function css(strs: TemplateStringsArray, ...vals: string[]) { let result = strs[0]; for (let i = 1; i < strs.length; i++) { result += vals[i] + strs[i]; } const sheet = new CSSStyleSheet(); sheet.replaceSync(result); return sheet; } export class DJElement extends HTMLElement { static styles: CSSStyleSheet; static template: HTMLTemplateElement; root: ShadowRoot; constructor() { super(); const statics = this.constructor as typeof DJElement; this.root = this.attachShadow({ mode: "open" }); this.root.appendChild(statics.template.content.cloneNode(true)); this.root.adoptedStyleSheets = statics.styles ? [statics.styles] : []; } }