UNPKG

@zag-js/auto-resize

Version:

Autoresize utilities for the web

90 lines (88 loc) 3.4 kB
"use strict"; 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 });