/*! * @preserve * * Readmore.js plugin * Author: @jed_foster * Project home: jedfoster.com/Readmore.js * Version: 3.0.0-beta-1 * Licensed under the MIT license * * Debounce function from davidwalsh.name/javascript-debounce-function */ (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define("Readmore", [], factory); else if(typeof exports === 'object') exports["Readmore"] = factory(); else root["Readmore"] = factory(); })(window, function() { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); /******/ } /******/ }; /******/ /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ /******/ // create a fake namespace object /******/ // mode & 1: value is a module id, require it /******/ // mode & 2: merge all properties of value into the ns /******/ // mode & 4: return value when already ns object /******/ // mode & 8|1: behave like require /******/ __webpack_require__.t = function(value, mode) { /******/ if(mode & 1) value = __webpack_require__(value); /******/ if(mode & 8) return value; /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; /******/ var ns = Object.create(null); /******/ __webpack_require__.r(ns); /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); /******/ return ns; /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 0); /******/ }) /************************************************************************/ /******/ ({ /***/ "./node_modules/@babel/runtime/helpers/classCallCheck.js": /*!***************************************************************!*\ !*** ./node_modules/@babel/runtime/helpers/classCallCheck.js ***! \***************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } module.exports = _classCallCheck; /***/ }), /***/ "./node_modules/@babel/runtime/helpers/createClass.js": /*!************************************************************!*\ !*** ./node_modules/@babel/runtime/helpers/createClass.js ***! \************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } module.exports = _createClass; /***/ }), /***/ "./node_modules/@babel/runtime/helpers/typeof.js": /*!*******************************************************!*\ !*** ./node_modules/@babel/runtime/helpers/typeof.js ***! \*******************************************************/ /*! no static exports found */ /***/ (function(module, exports) { function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof2 = function _typeof2(obj) { return typeof obj; }; } else { _typeof2 = function _typeof2(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof2(obj); } function _typeof(obj) { if (typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol") { module.exports = _typeof = function _typeof(obj) { return _typeof2(obj); }; } else { module.exports = _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : _typeof2(obj); }; } return _typeof(obj); } module.exports = _typeof; /***/ }), /***/ "./src/readmore.js": /*!*************************!*\ !*** ./src/readmore.js ***! \*************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/classCallCheck.js"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/createClass.js"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "./node_modules/@babel/runtime/helpers/typeof.js"); /* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_2__); var uniqueIdCounter = 0; var isCssEmbeddedFor = []; // from:https://github.com/jserz/js_piece/blob/master/DOM/ChildNode/remove()/remove().md (function removePolyfill(arr) { arr.forEach(function (item) { if (Object.prototype.hasOwnProperty.call(item, 'remove')) { return; } Object.defineProperty(item, 'remove', { configurable: true, enumerable: true, writable: true, value: function remove() { if (this.parentNode !== null) { this.parentNode.removeChild(this); } } }); }); })([Element.prototype, CharacterData.prototype, DocumentType.prototype]); function forEach(arr, callback, scope) { for (var i = 0; i < arr.length; i += 1) { callback.call(scope, arr[i], i); } } function extend() { for (var _len = arguments.length, objects = new Array(_len), _key = 0; _key < _len; _key++) { objects[_key] = arguments[_key]; } var hasProp = {}.hasOwnProperty; var child = objects[0]; var parent = objects[1]; if (objects.length > 2) { var args = []; Object.keys(objects).forEach(function (key) { args.push(objects[key]); }); while (args.length > 2) { var c1 = args.shift(); var p1 = args.shift(); args.unshift(extend(c1, p1)); } child = args.shift(); parent = args.shift(); } if (parent) { Object.keys(parent).forEach(function (key) { if (hasProp.call(parent, key)) { if (_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_2___default()(parent[key]) === 'object') { child[key] = child[key] || {}; child[key] = extend(child[key], parent[key]); } else { child[key] = parent[key]; } } }); } return child; } function debounce(func, wait, immediate) { var timeout; return function debouncedFunc() { var _this = this; for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } var callNow = immediate && !timeout; var later = function later() { timeout = null; if (!immediate) func.apply(_this, args); }; clearTimeout(timeout); timeout = setTimeout(later, wait); if (callNow) func.apply(this, args); }; } function uniqueId() { uniqueIdCounter += 1; return "rmjs-".concat(uniqueIdCounter); } function setBoxHeights(element) { element.style.height = 'auto'; var expandedHeight = parseInt(element.getBoundingClientRect().height, 10); var cssMaxHeight = parseInt(window.getComputedStyle(element).maxHeight, 10); var defaultHeight = parseInt(element.readmore.defaultHeight, 10); // Store our measurements. element.readmore.expandedHeight = expandedHeight; element.readmore.maxHeight = cssMaxHeight; element.readmore.collapsedHeight = cssMaxHeight || element.readmore.collapsedHeight || defaultHeight; element.style.maxHeight = 'none'; } function createElementFromString(htmlString) { var div = document.createElement('div'); div.innerHTML = htmlString; return div.firstChild; } function embedCSS(selector, options) { if (!isCssEmbeddedFor[selector]) { var styles = ''; if (options.embedCSS && options.blockCSS !== '') { styles += "".concat(selector, " + [data-readmore-toggle], ").concat(selector, "[data-readmore] {\n ").concat(options.blockCSS, "\n }"); } // Include the transition CSS even if embedCSS is false styles += "".concat(selector, "[data-readmore] {\n transition: height ").concat(options.speed, "ms;\n overflow: hidden;\n }"); (function (d, u) { var css = d.createElement('style'); css.type = 'text/css'; if (css.styleSheet) { css.styleSheet.cssText = u; } else { css.appendChild(d.createTextNode(u)); } d.getElementsByTagName('head')[0].appendChild(css); })(document, styles); isCssEmbeddedFor[selector] = true; } } function buildToggle(link, element, scope) { function clickHandler(event) { this.toggle(element, event); } var text = link; if (typeof link === 'function') { text = link(element); } var toggleLink = createElementFromString(text); toggleLink.setAttribute('data-readmore-toggle', element.id); toggleLink.setAttribute('aria-controls', element.id); toggleLink.addEventListener('click', clickHandler.bind(scope)); return toggleLink; } function isEnvironmentSupported() { return typeof window !== 'undefined' && typeof document !== 'undefined' && !!document.querySelectorAll && !!window.addEventListener; } var resizeBoxes = debounce(function () { var elements = document.querySelectorAll('[data-readmore]'); forEach(elements, function (element) { var expanded = element.getAttribute('aria-expanded') === 'true'; setBoxHeights(element); element.style.height = "".concat(expanded ? element.readmore.expandedHeight : element.readmore.collapsedHeight, "px"); }); }, 100); var defaults = { speed: 100, collapsedHeight: 200, heightMargin: 16, moreLink: 'Read More', lessLink: 'Close', embedCSS: true, blockCSS: 'display: block; width: 100%;', startOpen: false, sourceOrder: 'after', // callbacks blockProcessed: function blockProcessed() {}, beforeToggle: function beforeToggle() {}, afterToggle: function afterToggle() {} }; var Readmore = /*#__PURE__*/ function () { function Readmore() { var _this2 = this; _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Readmore); if (!isEnvironmentSupported()) return; for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { args[_key3] = arguments[_key3]; } var selector = args[0], options = args[1]; var elements; if (typeof selector === 'string') { elements = document.querySelectorAll(selector); } else if (selector.nodeName) { elements = [selector]; // emulate a NodeList by casting a single Node as an array } else { elements = selector; } // After all that, if we _still_ don't have iteratable NodeList, bail out. if (!elements.length) return; this.options = extend({}, defaults, options); if (typeof selector === 'string') { embedCSS(selector, this.options); } else { // Instances need distinct selectors so they don't stomp on each other. this.instanceSelector = ".".concat(uniqueId()); embedCSS(this.instanceSelector, this.options); } // Need to resize boxes when the page has fully loaded. window.addEventListener('load', resizeBoxes); window.addEventListener('resize', resizeBoxes); this.elements = []; forEach(elements, function (element) { if (_this2.instanceSelector) { element.classList.add(_this2.instanceSelector.substr(1)); } var expanded = _this2.options.startOpen; element.readmore = { defaultHeight: _this2.options.collapsedHeight, heightMargin: _this2.options.heightMargin }; setBoxHeights(element); var heightMargin = element.readmore.heightMargin; if (element.getBoundingClientRect().height <= element.readmore.collapsedHeight + heightMargin) { if (typeof _this2.options.blockProcessed === 'function') { _this2.options.blockProcessed(element, false); } return; } element.setAttribute('data-readmore', ''); element.setAttribute('aria-expanded', expanded); element.id = element.id || uniqueId(); var toggleLink = expanded ? _this2.options.lessLink : _this2.options.moreLink; var toggleElement = buildToggle(toggleLink, element, _this2); element.parentNode.insertBefore(toggleElement, _this2.options.sourceOrder === 'before' ? element : element.nextSibling); element.style.height = "".concat(expanded ? element.readmore.expandedHeight : element.readmore.collapsedHeight, "px"); if (typeof _this2.options.blockProcessed === 'function') { _this2.options.blockProcessed(element, true); } _this2.elements.push(element); }); } // Signature when called internally by the toggleLink click handler: // toggle(element, event) // // When called externally by an instance, // e.g. readmoreDemo.toggle(document.querySelector('article:nth-of-type(1)')): // toggle(elementOrQuerySelector) _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Readmore, [{ key: "toggle", value: function toggle() { var _this3 = this; var el = arguments.length <= 0 ? undefined : arguments[0]; var toggleElement = function toggleElement(element) { var trigger = document.querySelector("[aria-controls=\"".concat(element.id, "\"]")); var expanded = element.getBoundingClientRect().height <= element.readmore.collapsedHeight; var newHeight = expanded ? element.readmore.expandedHeight : element.readmore.collapsedHeight; // Fire beforeToggle callback // Since we determined the new "expanded" state above we're now out of sync // with our true current state, so we need to flip the value of `expanded` if (typeof _this3.options.beforeToggle === 'function') { var shouldContinueToggle = _this3.options.beforeToggle(trigger, element, !expanded); // if the beforeToggle callback returns false, stop toggling if (shouldContinueToggle === false) { return; } } element.style.height = "".concat(newHeight, "px"); var transitionendHandler = function transitionendHandler(transitionEvent) { // Fire afterToggle callback if (typeof _this3.options.afterToggle === 'function') { _this3.options.afterToggle(trigger, element, expanded); } transitionEvent.stopPropagation(); element.setAttribute('aria-expanded', expanded); element.removeEventListener('transitionend', transitionendHandler, false); }; element.addEventListener('transitionend', transitionendHandler, false); if (_this3.options.speed < 1) { transitionendHandler.call(_this3, { target: element }); } var toggleLink = expanded ? _this3.options.lessLink : _this3.options.moreLink; if (!toggleLink) { trigger.remove(); } else if (trigger && trigger.parentNode) { trigger.parentNode.replaceChild(buildToggle(toggleLink, element, _this3), trigger); } }; if (typeof el === 'string') { el = document.querySelectorAll(el); } if (!el) { throw new Error('Element MUST be either an HTML node or querySelector string'); } var event = arguments.length <= 1 ? undefined : arguments[1]; if (event) { event.preventDefault(); event.stopPropagation(); } if (_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_2___default()(el) === 'object' && !el.nodeName) { // element is likely a NodeList forEach(el, toggleElement); } else { toggleElement(el); } } }, { key: "destroy", value: function destroy(selector) { var _this4 = this; var elements; if (!selector) { elements = this.elements; // eslint-disable-line } else if (typeof selector === 'string') { elements = document.querySelectorAll(selector); } else if (selector.nodeName) { elements = [selector]; // emulate a NodeList by casting a single Node as an array } else { elements = selector; } forEach(elements, function (element) { if (_this4.elements.indexOf(element) === -1) { return; } _this4.elements = _this4.elements.filter(function (el) { return el !== element; }); if (_this4.instanceSelector) { element.classList.remove(_this4.instanceSelector.substr(1)); } delete element.readmore; element.style.height = 'initial'; element.style.maxHeight = 'initial'; element.removeAttribute('data-readmore'); element.removeAttribute('aria-expanded'); var trigger = document.querySelector("[aria-controls=\"".concat(element.id, "\"]")); if (trigger) { trigger.remove(); } if (element.id.indexOf('rmjs-') !== -1) { element.removeAttribute('id'); } }); delete this; } }]); return Readmore; }(); Readmore.VERSION = "3.0.0-beta-1"; /* harmony default export */ __webpack_exports__["default"] = (Readmore); /***/ }), /***/ 0: /*!*******************************!*\ !*** multi ./src/readmore.js ***! \*******************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { module.exports = __webpack_require__(/*! ./src/readmore.js */"./src/readmore.js"); /***/ }) /******/ })["default"]; }); //# sourceMappingURL=readmore.js.map