{"version":3,"sources":["webpack://fair-labour/./assets/project/general/js/device-observer/src/device-observer.js","webpack://fair-labour/./assets/project/general/js/device-observer/src/index.js","webpack://fair-labour/./assets/project/general/js/enums.ts","webpack://fair-labour/./assets/project/general/js/device.js"],"names":["DeviceObserver","_classCallCheck","this","_inited","_devices","_ascendingDevicesArray","_deviceName","_deviceIndex","_deviceChangeCallbacks","_resizeCallbacks","_debounceTimeoutId","key","value","devices","options","arguments","length","undefined","_setDevicesData","_resizeDebounce","resizeDebounce","_mobileFirst","mobileFirst","_updateDeviceData","window","addEventListener","_onWindowResize","bind","Object","keys","map","deviceName","sort","a","b","Error","clearTimeout","setTimeout","_handleWindowResize","oldDeviceType","_invokeResize","_invokeDeviceChange","indexOf","concat","join","Infinity","currentDevice","_this","_checkDevices","reverse","find","deviceData","_isGreaterOrEqual","_isLowerOrEqual","forEach","cb","newDeviceType","pixelsValue","matchMedia","matches","findIndex","_this2","push","filter","storedCb","_this3","operator","isMatch","isGt","isGe","isLt","isLe","_checkDeviceNameRegistered","_getDeviceNameIndex","constants","freeze","CONTAINER_MAX_WIDTH","containerMaxWidth","VIEWPORT_WIDTH_DESKTOP_WIDE","viewports","VIEWPORT_WIDTH_DESKTOP","VIEWPORT_WIDTH_TABLET","deviceObserver","ACTIVE_CLASS","init","mobile","tablet","desktop"],"mappings":"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","file":"126.3381977e9d601f0e5976.js","sourcesContent":["const DEFAULT_RESIZE_DEBOUNCE = 100;\n\nclass DeviceObserver {\n constructor() {\n this._inited = false;\n this._devices = {};\n this._ascendingDevicesArray = [];\n this._deviceName = null;\n this._deviceIndex = null;\n this._deviceChangeCallbacks = [];\n\n this._resizeCallbacks = [];\n this._debounceTimeoutId = null;\n }\n\n /**\n * @param {Object} devices - Collection of devices and its breakpoints from which they start\n * For example: {\n * 'mobile': 0,\n * 'tablet': 768,\n * 'desktop:' 1024,\n * }\n * @param {Object} options\n */\n init(devices, options = {}) {\n this._setDevicesData(devices);\n this._resizeDebounce = 'resizeDebounce' in options ? options.resizeDebounce : DEFAULT_RESIZE_DEBOUNCE;\n this._mobileFirst = 'mobileFirst' in options ? options.mobileFirst : true;\n this._updateDeviceData();\n\n if (!this._inited) {\n this._inited = true;\n window.addEventListener('resize', this._onWindowResize.bind(this));\n }\n }\n\n /**\n * Apply desired format and save to the private variable\n * @param devices\n * @private\n */\n _setDevicesData(devices) {\n // save original devices\n this._devices = devices;\n // prepare an array of devices\n // make sure devices are sorted by breakpoints values [['mobile', 0], ['tablet', 768], ['desktop', 1024]]\n this._ascendingDevicesArray = Object.keys(devices).map((deviceName) => [deviceName, devices[deviceName]]).sort((a, b) => a[1] - b[1]);\n\n if (this._ascendingDevicesArray.length === 0) {\n throw new Error('No devices specified');\n }\n }\n\n _onWindowResize() {\n if (this._debounceTimeoutId !== null) {\n clearTimeout(this._debounceTimeoutId);\n }\n\n this._debounceTimeoutId = setTimeout(this._handleWindowResize.bind(this), this._resizeDebounce);\n }\n\n _handleWindowResize() {\n const oldDeviceType = this._deviceName;\n this._updateDeviceData();\n this._invokeResize();\n if (oldDeviceType !== this._deviceName) {\n this._invokeDeviceChange(this._deviceName, oldDeviceType);\n }\n }\n\n _checkDeviceNameRegistered(deviceName) {\n if (Object.keys(this._devices).indexOf(deviceName) === -1) {\n throw new Error(`Passes device name ${deviceName} was not found among registered: ${Object.keys(this._devices).join(', ')}`)\n }\n }\n\n _checkDevices() {\n if (this._ascendingDevicesArray.length === 0) {\n throw new Error('No devices specified');\n }\n\n if (this._mobileFirst && this._ascendingDevicesArray[0][1] !== 0) {\n throw new Error('The smallest device must have breakpoint equal 0 in case mobile-first approach is used');\n }\n\n if (!this._mobileFirst && this._ascendingDevicesArray[this._ascendingDevicesArray.length - 1][1] !== Infinity) {\n throw new Error('The greatest device name must have breakpoint equal Infinity in case desktop-first approach is used');\n }\n }\n\n _updateDeviceData() {\n this._checkDevices();\n\n let currentDevice;\n if (this._mobileFirst) {\n // reverse array because of mobile-first\n // create the new array before reverse not to mutate original one\n currentDevice = [...this._ascendingDevicesArray].reverse().find(deviceData => this._isGreaterOrEqual(deviceData[1]));\n } else {\n currentDevice = this._ascendingDevicesArray.find(deviceData => this._isLowerOrEqual(deviceData[1]));\n }\n\n this._deviceIndex = this._ascendingDevicesArray.indexOf(currentDevice);\n this._deviceName = currentDevice[0];\n }\n\n _invokeResize() {\n this._resizeCallbacks.forEach(cb => cb());\n }\n\n _invokeDeviceChange(newDeviceType, oldDeviceType) {\n this._deviceChangeCallbacks.forEach(cb => cb(newDeviceType, oldDeviceType));\n }\n\n _isGreaterOrEqual(pixelsValue) {\n return matchMedia(`only screen and (min-width:${pixelsValue}px)`).matches;\n }\n\n _isLowerOrEqual(pixelsValue) {\n // convert Infinity to some really big number\n // to make sure matchMedia below returns true in that case\n if (pixelsValue === Infinity) {\n pixelsValue = 100000;\n }\n return matchMedia(`only screen and (max-width:${pixelsValue}px)`).matches;\n }\n\n _getDeviceNameIndex(deviceName) {\n return this._ascendingDevicesArray.findIndex(deviceData => deviceData[0] === deviceName);\n }\n\n subscribeOnResize(cb) {\n this._resizeCallbacks.push(cb);\n\n // return unsubscribe method\n return () => {\n this._resizeCallbacks = this._resizeCallbacks.filter(storedCb => storedCb !== cb);\n };\n }\n\n subscribeOnChange(cb) {\n this._deviceChangeCallbacks.push(cb);\n\n // return unsubscribe method\n return () => {\n this._deviceChangeCallbacks = this._deviceChangeCallbacks.filter(storedCb => storedCb !== cb);\n };\n }\n\n is(operator, deviceName) {\n switch (operator) {\n case '=':\n return this.isMatch(deviceName);\n case '>':\n return this.isGt(deviceName);\n case '>=':\n return this.isGe(deviceName);\n case '<':\n return this.isLt(deviceName);\n case '<=':\n return this.isLe(deviceName);\n default:\n throw new Error('Unexpected operator received. You can use only the following: =, >, >=, <, <=');\n }\n }\n\n isMatch(deviceName) {\n this._checkDeviceNameRegistered(deviceName);\n return this._deviceName === deviceName;\n }\n\n isGt(deviceName) {\n this._checkDeviceNameRegistered(deviceName);\n return this._deviceIndex > this._getDeviceNameIndex(deviceName);\n }\n\n isGe(deviceName) {\n this._checkDeviceNameRegistered(deviceName);\n return this._deviceIndex >= this._getDeviceNameIndex(deviceName);\n }\n\n isLt(deviceName) {\n this._checkDeviceNameRegistered(deviceName);\n return this._deviceIndex < this._getDeviceNameIndex(deviceName);\n }\n\n isLe(deviceName) {\n this._checkDeviceNameRegistered(deviceName);\n return this._deviceIndex <= this._getDeviceNameIndex(deviceName);\n }\n\n // todo consider removing\n /**\n * @param {number} value - width in pixels to compare with\n * @return {boolean}\n */\n isGeCustom(value) {\n return this._isGreaterOrEqual(value);\n }\n}\n\nexport default DeviceObserver;\n","import DeviceObserver from './device-observer';\n\nconst deviceObserver = new DeviceObserver();\nexport { deviceObserver, DeviceObserver };\n","import { viewports, containerMaxWidth } from '../../../config';\n\nexport const constants = Object.freeze({\n CONTAINER_MAX_WIDTH: containerMaxWidth,\n VIEWPORT_WIDTH_DESKTOP_WIDE: viewports['desktop-wide'],\n VIEWPORT_WIDTH_DESKTOP: viewports.desktop,\n VIEWPORT_WIDTH_TABLET: viewports.tablet,\n});\n\nexport const defaultValues = Object.freeze({\n ACTIVE_CLASS: 'is-active',\n});\n","import { DeviceObserver } from './device-observer';\nimport { constants } from './enums';\n\nconst deviceObserver = new DeviceObserver();\n\ndeviceObserver.init({\n mobile: 0,\n tablet: constants.VIEWPORT_WIDTH_TABLET,\n desktop: constants.VIEWPORT_WIDTH_DESKTOP,\n 'desktop-wide': constants.VIEWPORT_WIDTH_DESKTOP_WIDE,\n});\n\nexport { deviceObserver };\n"],"sourceRoot":""}