UNPKG

alien-dom

Version:

Next-generation JSX client renderer with observable data primitives, immediate DOM references, and more.

120 lines (116 loc) 3.84 kB
import { AlienElement, AlienNodeListPrototype } from './chunk-LGFYKT4J.mjs'; import { isNumber, isUnitlessNumber, defineEffectType, getCurrentEffect, isFunction } from './chunk-UI5LBDJV.mjs'; // internal/eventEffect.ts var createEventEffect = /* @__PURE__ */ defineEffectType( (target, eventName, handler, options) => { const self = getCurrentEffect(); if (self) { const isOnce = options && typeof options != "boolean" && options.once; const userHandler = isFunction(handler) ? handler : handler.handleEvent.bind(handler); handler = (event) => { if (isOnce) { self.context?.remove(self); } userHandler(event); }; } target.addEventListener(eventName, handler, options); return () => { target.removeEventListener(eventName, handler, options); }; } ); // addons/global/element.ts var AlienElementPrototype = new Proxy(AlienElement.prototype, { get(target, key, receiver) { if (typeof key == "string") { const cachedMethod = methodCache[key]; if (cachedMethod) { return cachedMethod; } if (cachedMethod === void 0) { const styleMethod = getStyleMethod(key); if (styleMethod) { return styleMethod; } const eventType = key.match(/^one?([A-Z]\w+?)(?:Capture)?$/)?.[1]; if (eventType) { return getEventMethod(key, eventType.toLowerCase()); } methodCache[key] = null; } } else if (key != Symbol.toStringTag) { return; } if (target.hasOwnProperty(key)) { return Reflect.get(target, key); } const prop = Object.getOwnPropertyDescriptor(Node.prototype, key) || Object.getOwnPropertyDescriptor(EventTarget.prototype, key) || Object.getOwnPropertyDescriptor(Object.prototype, key); if (prop && prop.get) { return prop.get.call(receiver); } return Reflect.get(target, key); } }); var styleDeconflict = /* @__PURE__ */ reverseLookup({ border: "cssBorder", // HTMLImageElement.border content: "cssContent", // HTMLMetaElement.content filter: "cssFilter", // AlienElement.filter() height: "cssHeight", // HTMLImageElement.height transform: "cssTransform", // SVGElement.transform translate: "cssTranslate", // HTMLElement.translate width: "cssWidth" // HTMLImageElement.width }); var cssProperties = typeof CSS2Properties != "undefined" ? CSS2Properties.prototype : document.body.style; function getStyleMethod(key) { const styleKey = styleDeconflict[key] || key; if (styleKey in cssProperties) { return methodCache[key] = function(value) { if (arguments.length == 0) { return this.style[styleKey]; } if (isNumber(value) && !isUnitlessNumber[key]) { value += "px"; } this.style[styleKey] = value; return this; }; } } var methodCache = {}; function getEventMethod(key, eventType) { const once = key.startsWith("one"); const passive = eventType == "scroll"; const capture = key.endsWith("Capture"); const baseOptions = once || passive || capture ? { once, passive, capture } : void 0; return methodCache[key] = function(callback, options) { if (baseOptions) { if (options) { options = options == true ? { capture: true } : options; options = { ...baseOptions, ...options }; } else { options = baseOptions; } } return createEventEffect(this, eventType, callback, options); }; } function reverseLookup(obj) { return { ...obj, ...Object.fromEntries( Object.entries(obj).map(([key, value]) => [value, key]) ) }; } // global.ts Object.setPrototypeOf(AlienElementPrototype, Node.prototype); Object.setPrototypeOf(Element.prototype, AlienElementPrototype); Object.assign(NodeList.prototype, AlienNodeListPrototype);