diff --git a/.meteor/versions b/.meteor/versions index 84c98f13a..76647b8a0 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -219,7 +219,7 @@ url@1.3.2 useraccounts:core@1.14.2 useraccounts:flow-routing@1.14.2 useraccounts:unstyled@1.14.2 -meteor-autosize@3.0.8 +meteor-autosize@5.0.1 webapp@1.10.1 webapp-hashing@1.1.0 wekan-accounts-cas@0.1.0 diff --git a/packages/meteor-autosize/lib/autosize.js b/packages/meteor-autosize/lib/autosize.js index dd1e3ce67..749e46922 100755 --- a/packages/meteor-autosize/lib/autosize.js +++ b/packages/meteor-autosize/lib/autosize.js @@ -1,214 +1,274 @@ -/*! - Autosize 3.0.8 - license: MIT - http://www.jacklmoore.com/autosize -*/ (function (global, factory) { - if (typeof define === 'function' && define.amd) { - define(['exports', 'module'], factory); - } else if (typeof exports !== 'undefined' && typeof module !== 'undefined') { - factory(exports, module); - } else { - var mod = { - exports: {} - }; - factory(mod.exports, mod); - global.autosize = mod.exports; - } -})(this, function (exports, module) { - 'use strict'; + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, global.autosize = factory()); +}(this, (function () { + var map = typeof Map === "function" ? new Map() : function () { + var keys = []; + var values = []; + return { + has: function has(key) { + return keys.indexOf(key) > -1; + }, + get: function get(key) { + return values[keys.indexOf(key)]; + }, + set: function set(key, value) { + if (keys.indexOf(key) === -1) { + keys.push(key); + values.push(value); + } + }, + "delete": function _delete(key) { + var index = keys.indexOf(key); - function assign(ta) { - var _ref = arguments[1] === undefined ? {} : arguments[1]; + if (index > -1) { + keys.splice(index, 1); + values.splice(index, 1); + } + } + }; + }(); - var _ref$setOverflowX = _ref.setOverflowX; - var setOverflowX = _ref$setOverflowX === undefined ? true : _ref$setOverflowX; - var _ref$setOverflowY = _ref.setOverflowY; - var setOverflowY = _ref$setOverflowY === undefined ? true : _ref$setOverflowY; + var createEvent = function createEvent(name) { + return new Event(name, { + bubbles: true + }); + }; - if (!ta || !ta.nodeName || ta.nodeName !== 'TEXTAREA' || ta.hasAttribute('data-autosize-on')) return; + try { + new Event('test'); + } catch (e) { + // IE does not support `new Event()` + createEvent = function createEvent(name) { + var evt = document.createEvent('Event'); + evt.initEvent(name, true, false); + return evt; + }; + } - var heightOffset = null; - var overflowY = 'hidden'; + function assign(ta) { + if (!ta || !ta.nodeName || ta.nodeName !== 'TEXTAREA' || map.has(ta)) return; + var heightOffset = null; + var clientWidth = null; + var cachedHeight = null; - function init() { - var style = window.getComputedStyle(ta, null); + function init() { + var style = window.getComputedStyle(ta, null); - if (style.resize === 'vertical') { - ta.style.resize = 'none'; - } else if (style.resize === 'both') { - ta.style.resize = 'horizontal'; - } + if (style.resize === 'vertical') { + ta.style.resize = 'none'; + } else if (style.resize === 'both') { + ta.style.resize = 'horizontal'; + } - if (style.boxSizing === 'content-box') { - heightOffset = -(parseFloat(style.paddingTop) + parseFloat(style.paddingBottom)); - } else { - heightOffset = parseFloat(style.borderTopWidth) + parseFloat(style.borderBottomWidth); - } + if (style.boxSizing === 'content-box') { + heightOffset = -(parseFloat(style.paddingTop) + parseFloat(style.paddingBottom)); + } else { + heightOffset = parseFloat(style.borderTopWidth) + parseFloat(style.borderBottomWidth); + } // Fix when a textarea is not on document body and heightOffset is Not a Number - update(); - } - function changeOverflow(value) { - { - // Chrome/Safari-specific fix: - // When the textarea y-overflow is hidden, Chrome/Safari do not reflow the text to account for the space - // made available by removing the scrollbar. The following forces the necessary text reflow. - var width = ta.style.width; - ta.style.width = '0px'; - // Force reflow: - /* jshint ignore:start */ - ta.offsetWidth; - /* jshint ignore:end */ - ta.style.width = width; - } + if (isNaN(heightOffset)) { + heightOffset = 0; + } - overflowY = value; + update(); + } - if (setOverflowY) { - ta.style.overflowY = value; - } + function changeOverflow(value) { + { + // Chrome/Safari-specific fix: + // When the textarea y-overflow is hidden, Chrome/Safari do not reflow the text to account for the space + // made available by removing the scrollbar. The following forces the necessary text reflow. + var width = ta.style.width; + ta.style.width = '0px'; // Force reflow: + /* jshint ignore:end */ - resize(); - } + ta.style.width = width; + } + ta.style.overflowY = value; + } - function resize() { - var htmlTop = window.pageYOffset; - var bodyTop = document.body.scrollTop; - var originalHeight = ta.style.height; + function getParentOverflows(el) { + var arr = []; - ta.style.height = 'auto'; + while (el && el.parentNode && el.parentNode instanceof Element) { + if (el.parentNode.scrollTop) { + arr.push({ + node: el.parentNode, + scrollTop: el.parentNode.scrollTop + }); + } - var endHeight = ta.scrollHeight + heightOffset; + el = el.parentNode; + } - if (ta.scrollHeight === 0) { - // If the scrollHeight is 0, then the element probably has display:none or is detached from the DOM. - ta.style.height = originalHeight; - return; - } + return arr; + } - ta.style.height = endHeight + 'px'; + function resize() { + if (ta.scrollHeight === 0) { + // If the scrollHeight is 0, then the element probably has display:none or is detached from the DOM. + return; + } - // prevents scroll-position jumping - document.documentElement.scrollTop = htmlTop; - document.body.scrollTop = bodyTop; - } + var overflows = getParentOverflows(ta); + var docTop = document.documentElement && document.documentElement.scrollTop; // Needed for Mobile IE (ticket #240) - function update() { - var startHeight = ta.style.height; + ta.style.height = ''; + ta.style.height = ta.scrollHeight + heightOffset + 'px'; // used to check if an update is actually necessary on window.resize - resize(); + clientWidth = ta.clientWidth; // prevents scroll-position jumping - var style = window.getComputedStyle(ta, null); + overflows.forEach(function (el) { + el.node.scrollTop = el.scrollTop; + }); - if (style.height !== ta.style.height) { - if (overflowY !== 'visible') { - changeOverflow('visible'); - } - } else { - if (overflowY !== 'hidden') { - changeOverflow('hidden'); - } - } + if (docTop) { + document.documentElement.scrollTop = docTop; + } + } - if (startHeight !== ta.style.height) { - var evt = document.createEvent('Event'); - evt.initEvent('autosize:resized', true, false); - ta.dispatchEvent(evt); - } - } + function update() { + resize(); + var styleHeight = Math.round(parseFloat(ta.style.height)); + var computed = window.getComputedStyle(ta, null); // Using offsetHeight as a replacement for computed.height in IE, because IE does not account use of border-box - var destroy = (function (style) { - window.removeEventListener('resize', update); - ta.removeEventListener('input', update); - ta.removeEventListener('keyup', update); - ta.removeAttribute('data-autosize-on'); - ta.removeEventListener('autosize:destroy', destroy); + var actualHeight = computed.boxSizing === 'content-box' ? Math.round(parseFloat(computed.height)) : ta.offsetHeight; // The actual height not matching the style height (set via the resize method) indicates that + // the max-height has been exceeded, in which case the overflow should be allowed. - Object.keys(style).forEach(function (key) { - ta.style[key] = style[key]; - }); - }).bind(ta, { - height: ta.style.height, - resize: ta.style.resize, - overflowY: ta.style.overflowY, - overflowX: ta.style.overflowX, - wordWrap: ta.style.wordWrap }); + if (actualHeight < styleHeight) { + if (computed.overflowY === 'hidden') { + changeOverflow('scroll'); + resize(); + actualHeight = computed.boxSizing === 'content-box' ? Math.round(parseFloat(window.getComputedStyle(ta, null).height)) : ta.offsetHeight; + } + } else { + // Normally keep overflow set to hidden, to avoid flash of scrollbar as the textarea expands. + if (computed.overflowY !== 'hidden') { + changeOverflow('hidden'); + resize(); + actualHeight = computed.boxSizing === 'content-box' ? Math.round(parseFloat(window.getComputedStyle(ta, null).height)) : ta.offsetHeight; + } + } - ta.addEventListener('autosize:destroy', destroy); + if (cachedHeight !== actualHeight) { + cachedHeight = actualHeight; + var evt = createEvent('autosize:resized'); - // IE9 does not fire onpropertychange or oninput for deletions, - // so binding to onkeyup to catch most of those events. - // There is no way that I know of to detect something like 'cut' in IE9. - if ('onpropertychange' in ta && 'oninput' in ta) { - ta.addEventListener('keyup', update); - } + try { + ta.dispatchEvent(evt); + } catch (err) {// Firefox will throw an error on dispatchEvent for a detached element + // https://bugzilla.mozilla.org/show_bug.cgi?id=889376 + } + } + } - window.addEventListener('resize', update); - ta.addEventListener('input', update); - ta.addEventListener('autosize:update', update); - ta.setAttribute('data-autosize-on', true); + var pageResize = function pageResize() { + if (ta.clientWidth !== clientWidth) { + update(); + } + }; - if (setOverflowY) { - ta.style.overflowY = 'hidden'; - } - if (setOverflowX) { - ta.style.overflowX = 'hidden'; - ta.style.wordWrap = 'break-word'; - } + var destroy = function (style) { + window.removeEventListener('resize', pageResize, false); + ta.removeEventListener('input', update, false); + ta.removeEventListener('keyup', update, false); + ta.removeEventListener('autosize:destroy', destroy, false); + ta.removeEventListener('autosize:update', update, false); + Object.keys(style).forEach(function (key) { + ta.style[key] = style[key]; + }); + map["delete"](ta); + }.bind(ta, { + height: ta.style.height, + resize: ta.style.resize, + overflowY: ta.style.overflowY, + overflowX: ta.style.overflowX, + wordWrap: ta.style.wordWrap + }); - init(); - } + ta.addEventListener('autosize:destroy', destroy, false); // IE9 does not fire onpropertychange or oninput for deletions, + // so binding to onkeyup to catch most of those events. + // There is no way that I know of to detect something like 'cut' in IE9. - function destroy(ta) { - if (!(ta && ta.nodeName && ta.nodeName === 'TEXTAREA')) return; - var evt = document.createEvent('Event'); - evt.initEvent('autosize:destroy', true, false); - ta.dispatchEvent(evt); - } + if ('onpropertychange' in ta && 'oninput' in ta) { + ta.addEventListener('keyup', update, false); + } - function update(ta) { - if (!(ta && ta.nodeName && ta.nodeName === 'TEXTAREA')) return; - var evt = document.createEvent('Event'); - evt.initEvent('autosize:update', true, false); - ta.dispatchEvent(evt); - } + window.addEventListener('resize', pageResize, false); + ta.addEventListener('input', update, false); + ta.addEventListener('autosize:update', update, false); + ta.style.overflowX = 'hidden'; + ta.style.wordWrap = 'break-word'; + map.set(ta, { + destroy: destroy, + update: update + }); + init(); + } - var autosize = null; + function destroy(ta) { + var methods = map.get(ta); - // Do nothing in Node.js environment and IE8 (or lower) - if (typeof window === 'undefined' || typeof window.getComputedStyle !== 'function') { - autosize = function (el) { - return el; - }; - autosize.destroy = function (el) { - return el; - }; - autosize.update = function (el) { - return el; - }; - } else { - autosize = function (el, options) { - if (el) { - Array.prototype.forEach.call(el.length ? el : [el], function (x) { - return assign(x, options); - }); - } - return el; - }; - autosize.destroy = function (el) { - if (el) { - Array.prototype.forEach.call(el.length ? el : [el], destroy); - } - return el; - }; - autosize.update = function (el) { - if (el) { - Array.prototype.forEach.call(el.length ? el : [el], update); - } - return el; - }; - } + if (methods) { + methods.destroy(); + } + } - module.exports = autosize; -}); + function update(ta) { + var methods = map.get(ta); + + if (methods) { + methods.update(); + } + } + + var autosize = null; // Do nothing in Node.js environment and IE8 (or lower) + + if (typeof window === 'undefined' || typeof window.getComputedStyle !== 'function') { + autosize = function autosize(el) { + return el; + }; + + autosize.destroy = function (el) { + return el; + }; + + autosize.update = function (el) { + return el; + }; + } else { + autosize = function autosize(el, options) { + if (el) { + Array.prototype.forEach.call(el.length ? el : [el], function (x) { + return assign(x); + }); + } + + return el; + }; + + autosize.destroy = function (el) { + if (el) { + Array.prototype.forEach.call(el.length ? el : [el], destroy); + } + + return el; + }; + + autosize.update = function (el) { + if (el) { + Array.prototype.forEach.call(el.length ? el : [el], update); + } + + return el; + }; + } + + var autosize$1 = autosize; + + return autosize$1; + +}))); diff --git a/packages/meteor-autosize/package.js b/packages/meteor-autosize/package.js index 8b62c6a44..850cfb86f 100644 --- a/packages/meteor-autosize/package.js +++ b/packages/meteor-autosize/package.js @@ -1,7 +1,7 @@ Package.describe({ name: 'meteor-autosize', summary: 'Automatically adjust textarea height based on user input.', - version: '3.0.8', + version: '5.0.1', git: "https://github.com/DeDeSt/meteor-autosize.git", documentation: 'README.md' });