@alegendstale/holly-components
Version:
Reusable UI components created using lit
99 lines (98 loc) • 2.82 kB
JavaScript
import h, { resolveOptions as g } from "./element-style-observer.js";
import { toArray as n } from "./util.js";
class p {
/**
* @type { WeakMap<Element, ElementStyleObserver> }
*/
elementObservers = /* @__PURE__ */ new WeakMap();
/**
* @param {StyleObserverCallback} callback
* @param {StyleObserverOptions | string | string[]} [options]
*/
constructor(t, e) {
this.callback = t, e = g(e), e.targets ??= [], e.target && e.targets.push(e.target), this.options = e, this.options.targets.length > 0 && this.options.properties.length > 0 && this.observe(this.options.targets, this.options.properties);
}
/**
* @type {StyleObserverCallback}
*/
changed(t) {
this.callback(t);
}
/**
* Observe one or more targets for changes to one or more CSS properties.
*
* @overload
* @param {Element | Element[]} targets
* @param {string | string[]} properties
* @returns {void}
*
* @overload
* @param {string | string[]} properties
* @param {Element | Element[]} targets
* @returns {void}
*
* @overload
* @param {...(string | Element | (string | Element)[]) } propertiesOrTargets
* @returns {void}
*/
observe(...t) {
let { targets: e, properties: r } = l(...t);
if (e.length === 0 && (e = this.options.targets), e.length !== 0)
for (let i of e) {
let s = this.elementObservers.get(i);
s || (s = new h(
i,
(a) => this.changed(a),
this.options
), this.elementObservers.set(i, s)), s.observe(r);
}
}
/**
* Stop observing one or more targets for changes to one or more CSS properties.
*
* @overload
* @param {Element | Element[]} targets
* @param {string | string[]} properties
* @returns {void}
*
* @overload
* @param {string | string[]} properties
* @param {Element | Element[]} targets
* @returns {void}
*
* @overload
* @param {...(string | Element | (string | Element)[]) } propertiesOrTargets
* @returns {void}
*/
unobserve(...t) {
let { targets: e, properties: r } = l(...t);
if (e.length === 0 && (e = this.options.targets), e.length !== 0) {
r.length === 0 && (r = this.options.properties);
for (let i of e) {
let s = this.elementObservers.get(i);
s && s.unobserve(r);
}
}
}
/**
* Update the transition for one or more targets.
* @param {Element | Element[]} targets
* @returns {void}
*/
updateTransition(t) {
for (let e of n(t)) {
let r = this.elementObservers.get(e);
r && r.updateTransition();
}
}
}
function l(o, t) {
let e = [...n(o), ...n(t)];
o = [], t = [];
for (let r of e)
(typeof r == "string" || r instanceof String ? t : o).push(r);
return { targets: o, properties: t };
}
export {
p as default
};