@zag-js/auto-resize
Version:
Autoresize utilities for the web
90 lines (88 loc) • 3.4 kB
JavaScript
;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/autoresize-textarea.ts
var autoresize_textarea_exports = {};
__export(autoresize_textarea_exports, {
autoresizeTextarea: () => autoresizeTextarea
});
module.exports = __toCommonJS(autoresize_textarea_exports);
var import_dom_query = require("@zag-js/dom-query");
var autoresizeTextarea = (el) => {
if (!el) return;
const style = (0, import_dom_query.getComputedStyle)(el);
const win = (0, import_dom_query.getWindow)(el);
const doc = (0, import_dom_query.getDocument)(el);
const resize = () => {
requestAnimationFrame(() => {
el.style.height = "auto";
let newHeight;
if (style.boxSizing === "content-box") {
newHeight = el.scrollHeight - (parseFloat(style.paddingTop) + parseFloat(style.paddingBottom));
} else {
newHeight = el.scrollHeight + parseFloat(style.borderTopWidth) + parseFloat(style.borderBottomWidth);
}
if (style.maxHeight !== "none" && newHeight > parseFloat(style.maxHeight)) {
if (style.overflowY === "hidden") {
el.style.overflowY = "scroll";
}
newHeight = parseFloat(style.maxHeight);
} else if (style.overflowY !== "hidden") {
el.style.overflowY = "hidden";
}
el.style.height = `${newHeight}px`;
});
};
el.addEventListener("input", resize);
el.form?.addEventListener("reset", resize);
const elementPrototype = Object.getPrototypeOf(el);
const descriptor = Object.getOwnPropertyDescriptor(elementPrototype, "value");
if (descriptor) {
Object.defineProperty(el, "value", {
...descriptor,
set(newValue) {
const prevValue = descriptor.get?.call(this);
descriptor.set?.call(this, newValue);
resize();
if (prevValue !== newValue) {
queueMicrotask(() => {
el.dispatchEvent(new win.InputEvent("input", { bubbles: true }));
});
}
}
});
}
const resizeObserver = new win.ResizeObserver(() => {
requestAnimationFrame(() => resize());
});
resizeObserver.observe(el);
const attrObserver = new win.MutationObserver(() => resize());
attrObserver.observe(el, { attributes: true, attributeFilter: ["rows", "placeholder"] });
doc.fonts?.addEventListener("loadingdone", resize);
return () => {
el.removeEventListener("input", resize);
el.form?.removeEventListener("reset", resize);
doc.fonts?.removeEventListener("loadingdone", resize);
resizeObserver.disconnect();
attrObserver.disconnect();
};
};
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
autoresizeTextarea
});