{"version":3,"sources":["webpack:///./src/js/components/Component.js","webpack:///./src/js/components/ReadMore.js","webpack:///./src/js/helpers/getLineHeight.js"],"names":["domTree","WeakMap","configuration","Component","el","config","arguments","length","undefined","_classCallCheck","this","Error","$el","jQuery","$","set","hasOwnProperty","dom","setupDefaults","addListeners","get","elements","_component","__webpack_require__","_getLineHeight","ReadMore","_this","_possibleConstructorReturn","__proto__","Object","getPrototypeOf","call","classList","contains","$text","wrapInner","$textInner","find","css","configureComponent","activeBreakpoint","isInitialized","isExpanded","appliedConfig","margins","$window","window","textSelector","on","bind","buttonClass","toggleTextHeight","_this2","textHeight","height","lineHeight","getLineHeight","e","console","log","responsive","forEach","matchMedia","breakpoint","matches","_extends","totalLines","childElements","children","filter","i","each","textLines","maxLines","parseInt","shouldInitialize","addClass","insertAfter","$link","removeClass","remove","event","preventDefault","html","data","elem","lh"],"mappings":"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","file":"22.f27219d8001f0b31cced.js","sourcesContent":["const domTree = new WeakMap();\r\nconst configuration = new WeakMap();\r\n\r\n/**\r\n * Component is a class that should be extended for every component that's being made. It\r\n * is a helper class to keep the code uniform.\r\n *\r\n * __PLEASE NOTE__: This is only to be extended, not instantiated.\r\n *\r\n * @example\r\n * import Component from 'component';\r\n *\r\n * class Foo extends Component {\r\n *   construction(el){\r\n *     super(el);\r\n *   }\r\n *\r\n *   setupDefaults(){\r\n *     // ...defaults go here\r\n *   }\r\n *\r\n *   addListeners(){\r\n *     // ...listeners go here\r\n *   }\r\n * }\r\n *\r\n * // Create a new Foo component\r\n * new Foo('.foo');\r\n */\r\nclass Component {\r\n  /**\r\n   * Component constructor - see {@link config} on how to pass in additional configuration to the constructor\r\n   *\r\n   * @param {string|Object} el - Main DOM element, you can pass a string such as `'.foo'` __or__ a jQuery object such as `$('.foo')`\r\n   * @param {Object} [config={ }] - Additional component configuration; reachable with `this.config`\r\n   */\r\n  constructor(el, config = {}){\r\n    if (typeof el === 'undefined') {\r\n      throw new Error('You must provide an element as a String type or a jQuery object type');\r\n    }\r\n\r\n    /**\r\n     * Main class element, this will be a jQuery instance\r\n     * This can be reachable at any time in your superclass with `this.$el`\r\n     *\r\n     * @type {Object}\r\n     */\r\n    this.$el = el instanceof jQuery ? el : $(el);\r\n\r\n    if (this.$el.length === 0) return;\r\n\r\n    domTree.set(this, {});\r\n    configuration.set(this, config);\r\n\r\n    if (this.config.hasOwnProperty('dom')) {\r\n      this.dom = this.config.dom;\r\n    }\r\n\r\n    this.setupDefaults();\r\n    this.addListeners();\r\n  }\r\n\r\n  /**\r\n   * This method is used for override;\r\n   * It's called directly after the element and configuration have been set up\r\n   * @abstract\r\n   */\r\n  setupDefaults(){}\r\n\r\n  /**\r\n   * This method is used for override;\r\n   * It's called directly after `setupDefaults()`, so everything is ready and setup at this point.\r\n   * @abstract\r\n   */\r\n  addListeners(){}\r\n\r\n  /**\r\n   * Get component configuration\r\n   *\r\n   * @example\r\n   * class Foo extends Component {\r\n   *   construction(el, config){\r\n   *     super(el, config);\r\n   *   }\r\n   *\r\n   *   setupDefaults(){\r\n   *     console.log(this.config.name); // Outputs \"Foo\"\r\n   *   }\r\n   * }\r\n   *\r\n   * // Create a new Foo component with some configuration\r\n   * new Foo('.foo', {\r\n   *   name: 'Foo'\r\n   * });\r\n   *\r\n   * @type {Object}\r\n   */\r\n  get config(){\r\n    return configuration.get(this);\r\n  }\r\n\r\n  /**\r\n   * Set DOM object\r\n   *\r\n   * @example\r\n   * class Foo extends Component {\r\n   *   construction(el){\r\n   *     super(el);\r\n   *   }\r\n   *\r\n   *   setupDefaults(){\r\n   *     this.dom = {\r\n   *       $container: this.$el.find('.container')\r\n   *     }\r\n   *   }\r\n   *\r\n   *   addListeners(){\r\n   *     //DOM object is available\r\n   *     console.log(this.dom.$container);\r\n   *   }\r\n   * }\r\n   *\r\n   * // Create a new Foo component\r\n   * new Foo('.foo');\r\n   *\r\n   * @type {Object}\r\n   */\r\n  set dom(elements){\r\n    elements = {\r\n      ...this.dom,\r\n      ...elements\r\n    };\r\n\r\n    domTree.set(this, elements);\r\n  }\r\n\r\n  /**\r\n   * Get DOM object\r\n   *\r\n   * @example\r\n   * this.dom\r\n   *\r\n   * @type {Object}\r\n   */\r\n  get dom(){\r\n    return domTree.get(this);\r\n  }\r\n}\r\n\r\nexport default Component;\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/components/Component.js","import Component from 'component';\r\nimport { getLineHeight } from '../helpers/getLineHeight';\r\n\r\nclass ReadMore extends Component {\r\n  constructor(el, config) {\r\n    super(el, config);\r\n    if (el[0].classList.contains('no-read-more')) return;\r\n\r\n    this.dom.$text.wrapInner('<div class=\"read-more__inner\"></div>');\r\n    this.dom.$textInner = this.dom.$text.find('.read-more__inner');\r\n    this.dom.$textInner.css('overflow', 'hidden');\r\n\r\n    this.configureComponent();\r\n  }\r\n\r\n  setupDefaults() {\r\n    this.activeBreakpoint;\r\n    this.isInitialized = false;\r\n    this.isExpanded = false;\r\n    this.appliedConfig = this.config;\r\n    this.margins = 0;\r\n\r\n    this.dom = {\r\n      $window: $(window),\r\n      $text: this.$el.find(this.config.textSelector)\r\n    };\r\n  }\r\n\r\n  addListeners() {\r\n    this.dom.$window.on('resize', ::this.configureComponent);\r\n    this.$el.on(\r\n      'click',\r\n      `.${this.config.buttonClass || 'btn-read-more'}`,\r\n      ::this.toggleTextHeight\r\n    );\r\n  }\r\n\r\n  configureComponent() {\r\n    try {\r\n      this.appliedConfig = this.config;\r\n      this.textHeight = this.dom.$textInner.height();\r\n      this.lineHeight = getLineHeight(this.dom.$textInner);\r\n    } catch (e) {\r\n      console.log(`Error in ReadMore configureComponent: ${e}`);\r\n    }\r\n    // Check if current mq has custom config\r\n    if (this.config.responsive && this.config.responsive.length) {\r\n      this.config.responsive.forEach(responsive => {\r\n        if (\r\n          window.matchMedia(`(max-width: ${responsive.breakpoint}px)`).matches\r\n        ) {\r\n          this.appliedConfig = { ...this.config, ...responsive.config };\r\n        }\r\n      });\r\n    }\r\n\r\n    let totalLines = 0;\r\n    // Get child block elements\r\n    const childElements = this.dom.$textInner.children().filter((i, el) => {\r\n      return $(el).css('display') === 'block';\r\n    });\r\n\r\n    // Check if element has child elements\r\n    if (childElements.length) {\r\n      this.margins = 0;\r\n      childElements.each((i, el) => {\r\n        // Get number of lines for each p tag\r\n        const textHeight = $(el).height();\r\n        const textLines = textHeight / this.lineHeight;\r\n\r\n        totalLines += textLines;\r\n\r\n        if (\r\n          this.appliedConfig.maxLines &&\r\n          totalLines < this.appliedConfig.maxLines\r\n        ) {\r\n          this.margins +=\r\n            parseInt($(el).css('margin-top')) +\r\n            parseInt($(el).css('margin-bottom'));\r\n        } else if (\r\n          this.appliedConfig.maxLines &&\r\n          totalLines === this.appliedConfig.maxLines\r\n        ) {\r\n          this.margins += parseInt($(el).css('margin-top'));\r\n        }\r\n      });\r\n    } else {\r\n      totalLines = this.textHeight / this.lineHeight;\r\n    }\r\n\r\n    const shouldInitialize =\r\n      this.appliedConfig.maxLines && totalLines > this.appliedConfig.maxLines;\r\n\r\n    if (this.isInitialized !== shouldInitialize) {\r\n      this.isInitialized = shouldInitialize;\r\n      if (shouldInitialize) {\r\n        this.$el.addClass('read-more__initialized');\r\n        $('<button class=\"btn-read-more\"></button>').insertAfter(\r\n          this.dom.$text\r\n        );\r\n        this.dom.$link = this.$el.find('.btn-read-more');\r\n        this.toggleTextHeight();\r\n      } else {\r\n        this.$el.removeClass('read-more__initialized');\r\n        this.dom.$text.css('height', '');\r\n        this.$el.find('.btn-read-more').remove();\r\n      }\r\n    }\r\n  }\r\n\r\n  toggleTextHeight(event) {\r\n    if (event) {\r\n      event.preventDefault();\r\n      this.isExpanded = !this.isExpanded;\r\n    }\r\n\r\n    if (this.isExpanded) {\r\n      this.$el.addClass('read-more__expanded');\r\n      this.dom.$text.height(this.textHeight);\r\n      this.dom.$link.html(\r\n        `<svg><use xlink:href=\"#minus\" /></svg>${\r\n          this.$el.data('readLessLabel') || ''\r\n        }`\r\n      );\r\n    } else {\r\n      this.$el.removeClass('read-more__expanded');\r\n      this.dom.$text.height(\r\n        this.appliedConfig.maxLines * this.lineHeight + this.margins\r\n      );\r\n      this.dom.$link.html(\r\n        `<svg><use xlink:href=\"#plus\" /></svg>${\r\n          this.$el.data('readMoreLabel') || ''\r\n        }`\r\n      );\r\n    }\r\n  }\r\n}\r\n\r\nexport default ReadMore;\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/components/ReadMore.js","//-- Get Line Height\r\n\r\nexport const getLineHeight = elem => {\r\n  let lh = elem.css('line-height')\r\n  if (lh === 'normal') {\r\n    // Normal line heights vary from browser to browser. The spec recommends\r\n    // a value between 1.0 and 1.2 of the font size. Using 1.1 to split the diff.\r\n    lh = parseInt(elem.css('font-size')) * 1.1;\r\n  }\r\n  return parseInt(lh);\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/helpers/getLineHeight.js"],"sourceRoot":""}