{"version":3,"sources":["webpack:///../WCC.UI/App/components/heatmap/enums/viewType.ts","webpack:///../WCC.UI/App/components/heatmap/heatmap.html?e5fd","webpack:///../WCC.UI/App/components/heatmap/heatmap.scss?6c27","webpack:///../WCC.UI/App/components/heatmap/heatmap.ts","webpack:///../WCC.UI/App/components/heatmap/hint/hint.html?974a","webpack:///../WCC.UI/App/components/heatmap/hint/hint.scss?25cc","webpack:///../WCC.UI/App/components/heatmap/hint/hint.ts","webpack:///../WCC.UI/App/components/heatmap/offsetViewer/offsetViewer.html?c050","webpack:///../WCC.UI/App/components/heatmap/offsetViewer/offsetViewer.scss?49c9","webpack:///../WCC.UI/App/components/heatmap/offsetViewer/offsetViewer.ts","webpack:///../WCC.UI/App/components/heatmap/pin/pin.html?8ff6","webpack:///../WCC.UI/App/components/heatmap/pin/pin.scss?f076","webpack:///../WCC.UI/App/components/heatmap/pin/pin.ts","webpack:///../WCC.UI/App/components/heatmap/viewsPanel/viewLink.ts","webpack:///../WCC.UI/App/components/heatmap/viewsPanel/viewsPanel.html?0acf","webpack:///../WCC.UI/App/components/heatmap/viewsPanel/viewsPanel.scss?5bc1","webpack:///../WCC.UI/App/components/heatmap/viewsPanel/viewsPanel.ts","webpack:///../WCC.UI/App/components/heatmap/zoomPanel/zoomPanel.html?8b64","webpack:///../WCC.UI/App/components/heatmap/zoomPanel/zoomPanel.scss?087a","webpack:///../WCC.UI/App/components/heatmap/zoomPanel/zoomPanel.ts","webpack:///../WCC.UI/App/webpack/runtime/htmlExposer.js","webpack:///../WCC.UI/App/components/heatmap/heatmap.scss","webpack:///../WCC.UI/App/components/heatmap/hint/hint.scss","webpack:///../WCC.UI/App/components/heatmap/offsetViewer/offsetViewer.scss","webpack:///../WCC.UI/App/components/heatmap/pin/pin.scss","webpack:///../WCC.UI/App/components/heatmap/viewsPanel/viewsPanel.scss","webpack:///../WCC.UI/App/components/heatmap/zoomPanel/zoomPanel.scss","webpack:///../WCC.UI/App/components/heatmap/heatmap.html","webpack:///../WCC.UI/App/components/heatmap/hint/hint.html","webpack:///../WCC.UI/App/components/heatmap/offsetViewer/offsetViewer.html","webpack:///../WCC.UI/App/components/heatmap/pin/pin.html","webpack:///../WCC.UI/App/components/heatmap/viewsPanel/viewsPanel.html","webpack:///../WCC.UI/App/components/heatmap/zoomPanel/zoomPanel.html"],"names":["HeatmapViewType","content","expose","__esModule","default","api","module","i","options","exports","locals","components","registerLocal","require","preload","Pan","constructor","dx","dy","this","Pinch","scale","HeatmapVM","config","info","storage","effects","imageNode","ko","observable","imageInnerNode","imageWrapperNode","pan","pinch","imageLoaded","clickHandler","click","topicId","flattenComputed","isActive","isWritableObservable","active","allowHeatmapView","heatmap","theme","hint","pins","noBox","focusMode","focus","zoomAllowed","zoom","allowZoom","pureComputed","isInline","inline","expandedMode","expand","get","TopicManager","pluck","m","topic","t","heatMapOptions","image","o","height","elementHeight","Tracker","node","element","width","imageWidth","imageHeight","loadedImage","fromPromise","img","ImageHelpers","waitImage","undefined","naturalWidth","imageReady","imageOffset","strictComputed","extend","rateLimit","timeout","method","targetImageMaxHeight","maxHeight","imageMaxHeight","pinMaxHeight","device","isMobile","offset","scaleCSS","translateCSS","waitFor","ready","loading","not","allowHint","length","headerShown","view","pinnedComments","isPinsView","is","isHeatmapView","zoomPanel","heatmapViewsPanel","isOffsetViewerNeeded","offsetViewerTimeout","offsetViewer","viewportWidth","viewportHeight","visible","register","clearTimeout","setTimeout","heatmapjs","create","minOpacity","maxOpacity","container","$","find","remove","withEffect","setData","min","max","data","map","pin","point","filter","x","Math","ceil","y","value","onResize","move","async","isReady","when","imageHeightValue","v","heightValue","Number","POSITIVE_INFINITY","hammer","Hammer","recognizers","Tap","threshold","enable","on","onTap","bind","onPanStart","onPanMove","onPanEnd","onPinchStart","onPinch","onPinchEnd","DOMHelpers","onNodeEvent","e","onWheel","originalEvent","destroy","computed","handleFocus","applyBindingsToNode","isEmpty","zoomIn","delta","scaleAtCenter","zoomOut","force","maxDx","maxDy","newDx","newDy","abs","scaleAt","absX","absY","getRelCoords","realDelta","maxScale","newScale","_this$imageWrapperNod","invokeNotNull","wrapper","top","left","getBoundingClientRect","centerX","centerY","imageCenterY","baseX","baseY","_","first","_this$clickHandler","coords","center","call","preventDefault","deltaX","deltaY","ctrlKey","clientX","clientY","__decorate","injectable","__param","inject","wccModules","componentConfig","componentInfo","HeatmapHintVM","isVisible","hideHint","isNeeded","HeatmapOffsetViewerVM","frameNode","ratio","frameWidth","frameHeight","frameDx","frameDy","toPrts","activePin","HeatmapPinVM","boxNode","onBoxClick","noop","toggle","$context","allowOverlay","template","overlayManager","toOverlay","buttons","stretch","lock","context","isExpandedMode","overlay","tracker","NodeTracker","boxWidth","boxHeight","heatmapWidth","h","heatmapHeight","heatmapImageWidth","heatmapImageHeight","heatmapDx","heatmapDy","p","tag","tags","color","tagColor","expanded","hovered","clickable","showSmallDot","showBox","position","getPosition","deferred","maxWidth","mapNotNull","mouseenter","mouseleave","dotWidth","dotHeight","HeatmapViewLink","_config$isActive","title","type","HeatmapViewsPanelVM","activateView","viewLinkOrType","_this$viewLinks$find","viewLinks","forEach","link","getViewLinks","activeViewLink","viewLink","links","Array","push","labels","PinnedComments","Heatmap","HeatmapZoomPanelVM","toFixed","system","SystemHelpers","html","getTemplatesAndResources","document","head","appendChild","___CSS_LOADER_API_IMPORT___"],"mappings":"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","file":"103.f004a2d5f69b0cee63f3.js","sourcesContent":["enum HeatmapViewType {\r\n pinnedComments = 0,\r\n heatmap = 1\r\n}\r\n\r\nexport default HeatmapViewType;","define([\n \"!!../../../node_modules/html-loader/dist/cjs.js??ref--26-1!./heatmap.html\", \n \"!../../webpack/runtime/htmlExposer.js\"], function (content, expose) {\n content = content.__esModule ? content.default : content;\n expose(content);\n return content;\n });","var api = require(\"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n var content = require(\"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/sass-loader/dist/cjs.js!./heatmap.scss\");\n\n content = content.__esModule ? content.default : content;\n\n if (typeof content === 'string') {\n content = [[module.id, content, '']];\n }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};","import { wccModules } from 'enums/wccModules';\r\nimport Hammer from 'hammerjs';\r\nimport heatmapjs from 'heatmap.js';\r\nimport { DOMHelpers } from 'helpers/dom';\r\nimport { ImageHelpers } from 'helpers/images';\r\nimport { inject, injectable } from 'inversify';\r\nimport { Observable, Subscribable } from 'knockout';\r\nimport device from 'managers/device';\r\nimport { IWCCStorageManager } from 'managers/iStorage';\r\nimport { NodeTracker as Tracker } from 'managers/nodes/tracker';\r\nimport { TopicManager } from 'managers/topic';\r\nimport { withEffect } from 'mixins/withEffect';\r\nimport { EffectsContainer } from 'mixins/withEffects';\r\nimport WCCAttachment from 'models/attachments/attachment';\r\nimport { HeatmapPoint } from 'models/heatmapPoint';\r\nimport { TopicThread } from 'models/topicThread';\r\nimport HeatmapViewType from './enums/viewType';\r\nimport './heatmap.html';\r\nimport { HeatmapConfig } from './heatmap.interfaces';\r\nimport './heatmap.scss';\r\nimport { HeatmapHintConfig } from './hint/hint';\r\nimport { HeatmapOffsetViewerConfig } from './offsetViewer/offsetViewer';\r\nimport { HeatmapViewsPanelConfig } from './viewsPanel/viewsPanel';\r\nimport { HeatmapZoomPanelConfig } from './zoomPanel/zoomPanel';\r\n\ncomponents\n .registerLocal('wcc-heatmap-hint', () => require('./hint/hint'))\n .registerLocal('wcc-heatmap-pin', () => require('./pin/pin'))\n .registerLocal('wcc-heatmap-zoom-panel', () => require('./zoomPanel/zoomPanel'))\n .registerLocal('wcc-heatmap-views-panel', () => require('./viewsPanel/viewsPanel'))\n .registerLocal('wcc-heatmap-offset-viewer', () => require('./offsetViewer/offsetViewer'))\n .preload('wcc-image');\n\nclass Pan {\n dx: number\n dy: number\n\n constructor(dx = 0, dy = 0) {\n this.dx = dx;\n this.dy = dy;\n }\n}\n\nclass Pinch {\n scale: number\n\n constructor(scale = 1) {\n this.scale = scale;\n }\n}\n\n@injectable()\nexport default class HeatmapVM {\n private elementHeight: Subscribable\n\n private imageOffset: Subscribable\n private naturalWidth: Subscribable\n\n private focusMode: Subscribable\n \n private clickHandler?: Action<[number, number]>\n\n zoomPanel: HeatmapZoomPanelConfig\n heatmapViewsPanel: HeatmapViewsPanelConfig\n offsetViewer: HeatmapOffsetViewerConfig\n hint: HeatmapHintConfig\n\n imageNode = ko.observable();\n imageInnerNode = ko.observable();\n imageWrapperNode = ko.observable();\n\n dx = ko.observable(0);\r\n dy = ko.observable(0);\r\n scale = ko.observable(1);\n\n pan: Observable = ko.observable();\n pinch: Observable = ko.observable();\n\n imageLoaded = ko.observable(false);\n\n pins: Subscribable>\n image: Subscribable\n\n width: Subscribable\n height: Subscribable\n\n imageWidth: Subscribable\n imageHeight: Subscribable\n\n pinMaxHeight: Subscribable\n imageMaxHeight: Subscribable\n\n scaleCSS: Subscribable\n translateCSS: Subscribable\n\n ready: Subscribable\n imageReady: Subscribable\n loading: Subscribable\n\n noBox: Subscribable\n headerShown: Subscribable\n allowHeatmapView: Subscribable\n allowHint: Subscribable\n allowZoom: Subscribable\n\n isInline: Subscribable\n isHeatmapView: Subscribable\n isPinsView: Subscribable\n\n constructor(\r\n @inject(wccModules.componentConfig) config: HeatmapConfig,\r\n @inject(wccModules.componentInfo) info: ko.components.ComponentInfo,\r\n @inject(wccModules.storage) storage: IWCCStorageManager,\r\n @inject(wccModules.effects) effects: EffectsContainer\r\n ) {\r\n this.clickHandler = config.click;\r\n\r\n const topicId = ko.flattenComputed(config.topicId);\n const isActive = ko.isWritableObservable(config.active) ? >config.active : ko.observable(false);\n\n this.allowHeatmapView = ko.flattenComputed(config.heatmap, false);\n\n const theme = ko.flattenComputed(config.theme, 'light');\n const hint = ko.flattenComputed(config.hint, '');\n\n this.pins = ko.flattenComputed(config.pins, []);\n\n this.noBox = ko.flattenComputed(config.noBox, false);\n this.focusMode = ko.flattenComputed(config.focus, false);\n\n const zoomAllowed = ko.flattenComputed(config.zoom, false);\n this.allowZoom = ko.pureComputed(() => zoomAllowed() && !this.focusMode());\n\n this.isInline = ko.flattenComputed(config.inline, false);\n\n const expandedMode = ko.flattenComputed(config.expand, false);\n\n const topicManager = storage.get(TopicManager, { topicId });\n const topic = topicManager.pluck(m => m.topic);\n const options = topic.pluck(t => t.heatMapOptions);\n this.image = options.pluck(o => o.image);\n\n const { height: elementHeight } = new Tracker({ node: info.element as HTMLElement });\n this.elementHeight = elementHeight;\n\n const { width, height } = new Tracker({ node: this.imageWrapperNode });\n this.width = width;\n this.height = height;\n\n const { width: imageWidth, height: imageHeight } = new Tracker({ node: this.imageNode as Observable });\n this.imageWidth = ko.pureComputed(() => imageWidth() * this.scale());\n this.imageHeight = ko.pureComputed(() => imageHeight() * this.scale());\n\n const loadedImage = ko.fromPromise(img => img ? ImageHelpers.waitImage(img) : undefined, [this.imageNode]);\n this.naturalWidth = loadedImage.pluck(img => img.naturalWidth, 0);\n\n this.imageReady = ko.pureComputed(() => imageWidth() > 0 && imageHeight() > 0 && loadedImage() != undefined);\n\n this.imageOffset = ko.strictComputed((elementHeight, imageHeight) => {\n return elementHeight > 0 && imageHeight > 0 ? elementHeight - imageHeight : 0;\n }, [this.elementHeight, this.height]).extend({ rateLimit: { timeout: 0, method: 'notifyWhenChangesStop' } });\n\n const targetImageMaxHeight = ko.flattenComputed(config.maxHeight, 0);\n\n this.imageMaxHeight = ko.strictComputed((maxHeight, imageOffset) => {\n return maxHeight > 0 ? maxHeight - imageOffset : undefined;\n }, [targetImageMaxHeight, this.imageOffset]);\n\n this.pinMaxHeight = device.isMobile.pluck(isMobile => {\n if (isMobile)\n return undefined;\n\n return ko.strictComputed((height, offset) => {\n return height - offset;\n }, [this.height, this.imageOffset]);\n });\n\n this.scaleCSS = ko.pureComputed(() => `scale(${this.scale()})`);\n this.translateCSS = ko.pureComputed(() => `translateX(${this.dx()}px) translateY(${this.dy()}px)`);\n\n const waitFor = ko.flattenComputed(config.waitFor, true);\n this.ready = ko.pureComputed(() => this.imageLoaded() && waitFor());\n this.loading = this.ready.not();\r\n\r\n this.allowHint = ko.pureComputed(() => !this.noBox() && hint().length > 0);\r\n this.headerShown = ko.pureComputed(() => !this.focusMode() && (this.allowHint() || zoomAllowed() || this.allowHeatmapView()));\r\n\r\n const view = ko.observable(HeatmapViewType.pinnedComments);\r\n this.isPinsView = view.is(view => view == HeatmapViewType.pinnedComments);\r\n this.isHeatmapView = view.is(view => view == HeatmapViewType.heatmap);\r\n\r\n this.hint = { hint }\r\n this.zoomPanel = { heatmap: this }\r\n this.heatmapViewsPanel = { heatmap: this, view }\r\n\r\n const isOffsetViewerNeeded = ko.observable(false);\r\n let offsetViewerTimeout: NodeJS.Timeout | undefined;\r\n\r\n this.offsetViewer = {\r\n viewportWidth: this.width,\r\n viewportHeight: this.height,\r\n imageWidth: this.imageWidth,\r\n imageHeight: this.imageHeight,\r\n dx: this.dx,\r\n dy: this.dy,\r\n visible: isOffsetViewerNeeded\r\n }\r\n\r\n effects.register(scale => {\r\n if (offsetViewerTimeout != undefined) {\r\n clearTimeout(offsetViewerTimeout);\r\n offsetViewerTimeout = undefined;\r\n }\r\n\r\n if (scale > 1)\r\n isOffsetViewerNeeded(true);\r\n\r\n if (isOffsetViewerNeeded())\r\n offsetViewerTimeout = setTimeout(() => isOffsetViewerNeeded(false), 2000);\r\n }, [this.scale, this.dx, this.dy]);\r\n\r\n effects.register((imageReady, isHeatmapView, node) => {\r\n if (imageReady && isHeatmapView && node != undefined) {\r\n const heatmap = heatmapjs.create({\r\n minOpacity: 0,\r\n maxOpacity: 0.6,\r\n container: node\r\n });\r\n\r\n\r\n return [\r\n () => $(node).find('.heatmap-canvas').remove(),\r\n\r\n withEffect((pins, imageWidth, imageHeight) => {\r\n heatmap.setData({\r\n min: 0,\r\n max: 1,\r\n data: pins\r\n .map(pin => pin.point())\r\n .filter(point => point != undefined)\r\n .map(point => ({\r\n x: Math.ceil(imageWidth * point.x()),\r\n y: Math.ceil(imageHeight * point.y()),\r\n value: 1\r\n }))\r\n });\r\n }, [this.pins, this.imageWidth, this.imageHeight])\r\n ]\r\n }\r\n }, [this.imageReady, this.isHeatmapView, this.imageInnerNode]);\r\n\r\n effects.register(() => {\r\n return [\r\n device.onResize(() => this.move(0, 0)),\r\n () => isActive(false)\r\n ]\r\n });\r\n\r\n effects.register(async isReady => {\r\n isActive(isReady);\r\n\r\n if (isReady) {\r\n this.scale(1);\r\n\r\n await this.imageReady.when();\r\n\r\n const imageHeightValue = await imageHeight.when(v => v > 0);\r\n const heightValue = await this.height.when(v => v > 0);\r\n\r\n this.move(0, imageHeightValue > heightValue ? Number.POSITIVE_INFINITY : 0);\r\n }\r\n }, [this.ready, this.image]);\r\n\r\n effects.register((node, allowZoom) => {\r\n if (allowZoom && node != undefined) {\r\n const hammer = new Hammer(node, {\n recognizers: [\n [Hammer.Tap],\n [Hammer.Pan, { threshold: 0 }],\n [Hammer.Pinch, { enable: true }]\n ]\n });\n\n hammer.on('tap', this.onTap.bind(this));\n hammer.on('panstart', this.onPanStart.bind(this));\n hammer.on('panmove', this.onPanMove.bind(this));\n hammer.on('panend', this.onPanEnd.bind(this));\n hammer.on('pinchstart', this.onPinchStart.bind(this));\n hammer.on('pinch', this.onPinch.bind(this));\n hammer.on('pinchend', this.onPinchEnd.bind(this));\n\n return withEffect(() => [\n DOMHelpers.onNodeEvent(node, 'wheel', e => this.onWheel(e.originalEvent as WheelEvent)),\n () => hammer.destroy()\n ]);\r\n }\r\n }, [this.imageNode, this.allowZoom]);\r\n\r\n effects.register([\n ko.computed(() => this.handleFocus())\n ]);\n\n ko.applyBindingsToNode(info.element, {\n 'css': {\n 'wcc-heatmap': true,\n 'wcc-heatmap--inline': this.isInline,\n 'wcc-heatmap--ready': this.ready,\n 'wcc-heatmap--expanded': expandedMode,\n 'wcc-heatmap--mobile': device.isMobile,\n 'wcc-heatmap--no-hint': hint.isEmpty()\n }\n });\r\n\r\n ko.applyBindingsToNode(info.element, {\r\n 'css': theme.pluck(theme => `wcc-heatmap--${theme}-theme`)\r\n });\r\n }\r\n\r\n zoomIn(delta = 0.15) {\r\n this.scaleAtCenter(1 + delta);\r\n }\r\n\r\n zoomOut(delta = 0.15) {\r\n this.scaleAtCenter(1 - delta);\r\n this.move(0, 0);\r\n }\r\n\r\n private move(dx: number, dy: number, force = false) {\n if (!this.allowZoom() && !force) return;\n\n const width = this.width();\n const height = this.height();\n\n const imageWidth = this.imageWidth();\n const imageHeight = this.imageHeight();\n\n //lets calculate max offsets as difference between image and container sizes\n //but we scale image so offsets will be scaled too\n const maxDx = imageWidth > width ? (imageWidth - width) / 2 : 0;\n const maxDy = imageHeight > height ? (imageHeight - height) / 2 : 0;\n\n const newDx = this.dx() + dx;\n const newDy = this.dy() + dy;\n\n if (Math.abs(newDx) < maxDx) {\n this.dx(newDx);\n } else {\n this.dx(newDx < 0 ? -maxDx : maxDx);\n }\n\n if (Math.abs(newDy) < maxDy) {\n this.dy(newDy);\n } else {\n this.dy(newDy < 0 ? -maxDy : maxDy);\n }\n }\n\n private scaleAt(absX: number, absY: number, delta: number) {\n if (!this.allowZoom()) return;\n\n const { x, y } = this.getRelCoords(absX, absY);\n\n const scale = this.scale();\n const width = this.imageWidth() / scale;\n const height = this.imageHeight() / scale;\n\n const newScale = this.scaleAtCenter(delta);\n const realDelta = newScale - scale;\n\n const dx = (0.5 - x) * width * realDelta;\n const dy = (0.5 - y) * height * realDelta;\n\n this.move(dx, dy);\n }\n\n private scaleAtCenter(delta: number) {\n const scale = this.scale();\n\n const maxScale = this.naturalWidth() / this.width() * 2;\n const minScale = 1;\n\n let newScale = scale * delta;\n\n if (newScale > maxScale)\n newScale = maxScale;\n\n if (newScale < minScale)\n newScale = minScale;\r\n\r\n this.scale(newScale);\r\n\r\n return newScale;\r\n }\n\n private getRelCoords(absX: number, absY: number) {\n return this.imageWrapperNode.invokeNotNull(wrapper => {\n const { width, height, top, left } = wrapper.getBoundingClientRect();\n\n const imageWidth = this.imageWidth();\n const imageHeight = this.imageHeight();\n\n const centerX = width / 2;\n const centerY = height / 2;\n\n const imageCenterX = imageWidth / 2;\n const imageCenterY = imageHeight / 2;\n\n //top-left corner of wrapper\n const baseX = imageCenterX - this.dx() - centerX;\n const baseY = imageCenterY - this.dy() - centerY;\n\n if (width > 0 && height > 0) {\n //coordinates relative to wrapper's top-left corner\n const wrapperX = absX - left;\n const wrapperY = absY - top;\n\n let x = (wrapperX + baseX) / imageWidth,\n y = (wrapperY + baseY) / imageHeight;\n\n if (x < 0) x = 0;\n if (x > 1) x = 1;\n if (y < 0) y = 0;\n if (y > 1) y = 1;\n\n return { x, y };\n }\n }) ?? { x: 0, y: 0 };\n }\n\n private handleFocus() {\n if (!this.focusMode()) return;\n\n var pin = _(this.pins()).first();\n\n if (pin !== undefined) {\n var point = pin.point();\n\n if (point != null) {\n var x = point.x(),\n y = point.y();\n\n if (x != null && y != null && this.width() > 0) {\n var scale = this.naturalWidth() / this.width();\n\n var dx = (0.5 - x) * this.width() * scale,\n dy = (0.5 - y) * this.height() * scale;\n\n this.scale(scale);\n this.dx(0);\n this.dy(0);\n\n this.move(dx, dy, true);\n }\n }\n }\n }\n\n private onTap(e: HammerInput) {\n const coords = this.getRelCoords(e.center.x, e.center.y);\n\n this.clickHandler?.(coords.x, coords.y);\n }\n\n private onPanStart(e: HammerInput) {\n e.preventDefault();\n this.pan(new Pan());\n }\n\n private onPanMove(e: HammerInput) {\n e.preventDefault();\n\n var pan = this.pan() || new Pan(),\n dx = e.deltaX - pan.dx,\n dy = e.deltaY - pan.dy;\n\n this.move(dx, dy);\n this.pan(new Pan(e.deltaX, e.deltaY));\n }\n\n private onPanEnd(e: HammerInput) {\n e.preventDefault();\n this.pan(undefined);\n }\n\n private onPinchStart(e: HammerInput) {\n e.preventDefault();\n this.pinch(new Pinch());\n }\n\n private onPinch(e: HammerInput) {\n e.preventDefault();\n\n var pinch = this.pinch() || new Pinch(),\n scale = e.scale / pinch.scale;\n\n this.scaleAt(e.center.x, e.center.y, scale);\n this.pinch(new Pinch(e.scale));\n }\n\n private onPinchEnd(e: HammerInput) {\n e.preventDefault();\n this.pinch(undefined);\n }\n\n private onWheel(e: WheelEvent) {\n if (e.ctrlKey) {\n e.preventDefault();\n\n this.scaleAt(e.clientX, e.clientY, 1 - e.deltaY * 0.001);\n }\n }\r\n}","define([\n \"!!../../../../node_modules/html-loader/dist/cjs.js??ref--26-1!./hint.html\", \n \"!../../../webpack/runtime/htmlExposer.js\"], function (content, expose) {\n content = content.__esModule ? content.default : content;\n expose(content);\n return content;\n });","var api = require(\"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n var content = require(\"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/sass-loader/dist/cjs.js!./hint.scss\");\n\n content = content.__esModule ? content.default : content;\n\n if (typeof content === 'string') {\n content = [[module.id, content, '']];\n }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};","import { wccModules } from 'enums/wccModules';\r\nimport { inject, injectable } from 'inversify';\r\nimport { Subscribable, SubscribableOrNullableValue } from 'knockout';\r\nimport './hint.html';\r\nimport './hint.scss';\r\n\r\nexport interface HeatmapHintConfig {\r\n hint: SubscribableOrNullableValue\r\n}\r\n\r\n@injectable()\r\nexport default class HeatmapHintVM {\r\n private isVisible = ko.observable(true);\r\n\r\n hint: Subscribable\r\n\r\n constructor(\r\n @inject(wccModules.componentConfig) config: HeatmapHintConfig,\r\n @inject(wccModules.componentInfo) info: ko.components.ComponentInfo\r\n ) {\r\n this.hint = ko.flattenComputed(config.hint, '');\r\n\r\n const isNeeded = ko.pureComputed(() => this.hint().length > 0 && this.isVisible());\r\n\r\n ko.applyBindingsToNode(info.element, {\r\n 'visible': isNeeded,\r\n\r\n 'css': {\r\n 'wcc-heatmap__hint': true\r\n }\r\n });\r\n }\r\n\r\n hideHint = () => {\r\n this.isVisible(false);\r\n }\r\n}","define([\n \"!!../../../../node_modules/html-loader/dist/cjs.js??ref--26-1!./offsetViewer.html\", \n \"!../../../webpack/runtime/htmlExposer.js\"], function (content, expose) {\n content = content.__esModule ? content.default : content;\n expose(content);\n return content;\n });","var api = require(\"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n var content = require(\"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/sass-loader/dist/cjs.js!./offsetViewer.scss\");\n\n content = content.__esModule ? content.default : content;\n\n if (typeof content === 'string') {\n content = [[module.id, content, '']];\n }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};","import { wccModules } from 'enums/wccModules';\r\nimport { AppearBindingOptions } from 'extensions/knockout/bindings/appear';\r\nimport { inject, injectable } from 'inversify';\r\nimport { SubscribableOrNullableValue } from 'knockout';\r\nimport { EffectsContainer } from 'mixins/withEffects';\r\nimport './offsetViewer.html';\r\nimport './offsetViewer.scss';\r\n\r\nexport interface HeatmapOffsetViewerConfig {\r\n viewportWidth: SubscribableOrNullableValue\r\n viewportHeight: SubscribableOrNullableValue\r\n imageWidth: SubscribableOrNullableValue\r\n imageHeight: SubscribableOrNullableValue\r\n dx: SubscribableOrNullableValue\r\n dy: SubscribableOrNullableValue\r\n visible?: SubscribableOrNullableValue\r\n}\r\n\r\n@injectable()\r\nexport default class HeatmapOffsetViewerVM {\r\n frameNode = ko.observable();\r\n\r\n constructor(\r\n @inject(wccModules.componentConfig) config: HeatmapOffsetViewerConfig,\r\n @inject(wccModules.componentInfo) info: ko.components.ComponentInfo,\r\n @inject(wccModules.effects) effects: EffectsContainer\r\n ) {\r\n const viewportWidth = ko.flattenComputed(config.viewportWidth, 0);\r\n const viewportHeight = ko.flattenComputed(config.viewportHeight, 0);\r\n\r\n const imageWidth = ko.flattenComputed(config.imageWidth, 0);\r\n const imageHeight = ko.flattenComputed(config.imageHeight, 0);\r\n\r\n const ratio = ko.strictComputed((width, height) => width > 0 && height > 0 ? width / height : 1, [imageWidth, imageHeight]);\r\n\r\n const frameWidth = ko.strictComputed((imageWidth, viewportWidth) => imageWidth > 0 && viewportWidth > 0 && imageWidth > viewportWidth ? viewportWidth / imageWidth * 100 : 100, [imageWidth, viewportWidth]);\r\n const frameHeight = ko.strictComputed((imageHeight, viewportHeight) => imageHeight > 0 && viewportHeight > 0 && imageHeight > viewportHeight ? viewportHeight / imageHeight * 100 : 100, [imageHeight, viewportHeight]);\r\n\r\n const dx = ko.flattenComputed(config.dx, 0);\r\n const dy = ko.flattenComputed(config.dy, 0);\r\n\r\n const frameDx = ko.strictComputed((dx, viewportWidth) => viewportWidth > 0 ? dx / viewportWidth * 100 : 0, [dx, viewportWidth]);\r\n const frameDy = ko.strictComputed((dy, viewportHeight) => viewportHeight > 0 ? dy / viewportHeight * 100 : 0, [dy, viewportHeight]);\r\n\r\n const isVisible = ko.flattenComputed(config.visible, true);\r\n\r\n effects.register(frameNode => {\r\n if (frameNode != undefined) {\r\n ko.applyBindingsToNode(frameNode, {\r\n 'style': {\r\n 'width': frameWidth.toPrts(),\r\n 'height': frameHeight.toPrts(),\r\n 'transform': ko.pureComputed(() => `translateX(${-frameDx()}%) translateY(${-frameDy()}%)`)\r\n }\r\n });\r\n }\r\n }, [this.frameNode]);\r\n\r\n ko.applyBindingsToNode(info.element, {\r\n 'appear': { visible: isVisible },\r\n\r\n 'css': {\r\n 'wcc-heatmap__offset-viewer': true\r\n },\r\n\r\n 'style': {\r\n 'padding-top': ko.pureComputed(() => 1 / ratio() * 100).toPrts()\r\n }\r\n });\r\n }\r\n}","define([\n \"!!../../../../node_modules/html-loader/dist/cjs.js??ref--26-1!./pin.html\", \n \"!../../../webpack/runtime/htmlExposer.js\"], function (content, expose) {\n content = content.__esModule ? content.default : content;\n expose(content);\n return content;\n });","var api = require(\"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n var content = require(\"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/sass-loader/dist/cjs.js!./pin.scss\");\n\n content = content.__esModule ? content.default : content;\n\n if (typeof content === 'string') {\n content = [[module.id, content, '']];\n }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};","import { wccModules } from 'enums/wccModules';\r\nimport { PositionBindingOptions } from 'extensions/knockout/bindings/position';\r\nimport { inject, injectable } from 'inversify';\r\nimport { Subscribable, SubscribableOrNullableValue } from 'knockout';\r\nimport device from 'managers/device';\r\nimport { NodeTracker } from 'managers/nodes/tracker';\r\nimport overlayManager from 'managers/overlay';\r\nimport { Tag } from 'models/tag';\r\nimport { TopicThread } from 'models/topicThread';\r\nimport HeatmapVM from '../heatmap';\r\nimport './pin.html';\r\nimport './pin.scss';\r\n\r\nconst offset = 15;\n\nconst dotWidth = 30;\nconst dotHeight = 30;\n\nconst halfDotWidth = dotWidth / 2;\nconst halfDotHeight = dotHeight / 2;\r\n\r\nconst activePin = ko.observable();\r\n\r\nexport type HeatmapPinVMThemes = 'classic' | 'simple';\r\n\nexport interface HeatmapPinVMConfig {\n heatmap?: SubscribableOrNullableValue\r\n pin?: SubscribableOrNullableValue\r\n x?: SubscribableOrNullableValue\r\n y?: SubscribableOrNullableValue\r\n tag?: SubscribableOrNullableValue\r\n expand?: SubscribableOrNullableValue\r\n overlay?: SubscribableOrNullableValue\r\n\r\n theme?: SubscribableOrNullableValue\r\n}\n\n@injectable()\nexport default class HeatmapPinVM {\n private boxWidth: Subscribable\n private boxHeight: Subscribable\n\n private heatmapWidth: Subscribable\n private heatmapHeight: Subscribable\n private heatmapDx: Subscribable\n private heatmapDy: Subscribable\n\n private x: Subscribable\n private y: Subscribable\n\n private allowOverlay: Subscribable\n\n boxNode = ko.observable();\n\n color: Subscribable\n position: Subscribable\n maxWidth: Subscribable\n\n noBox: Subscribable\n showBox: Subscribable\n showSmallDot: Subscribable\n ready: Subscribable\n\n constructor(\r\n @inject(wccModules.componentConfig) config: HeatmapPinVMConfig,\r\n @inject(wccModules.componentInfo) info: ko.components.ComponentInfo\r\n ) {\r\n const isExpandedMode = ko.flattenComputed(config.expand, false);\r\n this.allowOverlay = ko.flattenComputed(config.overlay, true);\r\n\r\n const tracker = new NodeTracker({ node: this.boxNode });\n this.boxWidth = tracker.width;\n this.boxHeight = tracker.height;\n\n const heatmap = ko.flattenComputed(config.heatmap);\n this.heatmapWidth = heatmap.pluck(h => h.width);\n this.heatmapHeight = heatmap.pluck(h => h.height);\n const heatmapImageWidth = heatmap.pluck(h => h.imageWidth);\n const heatmapImageHeight = heatmap.pluck(h => h.imageHeight);\n this.heatmapDx = heatmap.pluck(h => h.dx);\n this.heatmapDy = heatmap.pluck(h => h.dy);\n this.noBox = heatmap.pluck(h => h.noBox, false);\n\n const pin = ko.flattenComputed(config.pin);\n const point = pin.pluck(p => p.point);\n const x = point.pluck(p => p.x, config.x);\n const y = point.pluck(p => p.y, config.y);\n\n this.x = ko.strictComputed((x, heatmapDx, heatmapWidth, heatmapImageWidth) => {\n if (x != undefined && heatmapDx != undefined && heatmapWidth != undefined && heatmapWidth > 0 && heatmapImageWidth != undefined && heatmapImageWidth > 0) {\n const absX = x * heatmapImageWidth;\n const imageCenterX = heatmapImageWidth / 2;\n const centerX = heatmapWidth / 2;\n const viewportX = imageCenterX - centerX - heatmapDx;\n\n return (absX - viewportX) / heatmapWidth;\n }\n }, [x, this.heatmapDx, this.heatmapWidth, heatmapImageWidth]);\n\n this.y = ko.strictComputed((y, heatmapDy, heatmapHeight, heatmapImageHeight) => {\n if (y != undefined && heatmapDy != undefined && heatmapHeight != undefined && heatmapHeight > 0 && heatmapImageHeight != undefined && heatmapImageHeight > 0) {\n const absY = y * heatmapImageHeight;\n const imageCenterY = heatmapImageHeight / 2;\n const centerY = heatmapHeight / 2;\n const viewportY = imageCenterY - centerY - heatmapDy;\n\n return (absY - viewportY) / heatmapHeight;\n }\n }, [y, this.heatmapDy, this.heatmapHeight, heatmapImageHeight]);\n\n const tags = pin.pluck(p => p.tags);\n const tag = tags.first().default(config.tag);\n this.color = tag.pluck(t => t.tagColor);\n const theme = ko.flattenComputed(config.theme);\n\n const expanded = activePin.is(this);\n const hovered = ko.observable(false);\n const clickable = ko.pureComputed(() => !isExpandedMode() && !this.noBox());\n\n this.showSmallDot = ko.pureComputed(() => !expanded() && !hovered() && !isExpandedMode() || this.noBox());\n this.showBox = ko.pureComputed(() => expanded() || isExpandedMode());\n\n this.position = ko.pureComputed(() => this.getPosition()).extend({ deferred: true });\n\n this.maxWidth = this.heatmapWidth.pluck(heatmapWidth => heatmapWidth / 2);\n\n this.ready = ko.strictComputed((x, y) => x != undefined && x > 0 && x < 1 && y != undefined && y > 0 && y < 1, [this.x, this.y]);\r\n\r\n ko.applyBindingsToNode(info.element, {\n 'visible': this.ready,\n\n 'css': {\n 'wcc-heatmap__pin': true,\n 'wcc-heatmap__pin--clickable': clickable,\n 'wcc-heatmap__pin--active': this.showBox,\n 'wcc-heatmap__pin--simple': theme.is('simple'),\n 'wcc-heatmap__pin--mobile': device.isMobile\n },\n\n 'style': {\n 'top': this.y.mapNotNull(v => v * 100).toPrts(),\n 'left': this.x.mapNotNull(v => v * 100).toPrts(),\n 'border-color': this.color\n },\n\n 'event': {\n 'mouseenter': () => hovered(true),\n 'mouseleave': () => hovered(false)\n }\n });\r\n }\r\n\r\n onBoxClick = _.noop\n\n toggle = ($context: ko.BindingContext) => {\n if (activePin() === this) {\n activePin(undefined);\n } else if (!this.noBox()) {\n if (device.isMobile() && this.allowOverlay()) {\n const template = `
\n \n \n \n
`;\n\n overlayManager.toOverlay(template, {\r\n buttons: ['close'],\r\n stretch: true,\r\n lock: true,\r\n\r\n data: {\r\n context: $context\r\n }\r\n });\r\n } else {\n activePin(this);\n }\n }\r\n }\n\n private getPosition() {\n if (this.ready() && this.showBox()) {\n const boxWidth = this.boxWidth();\n const boxHeight = this.boxHeight();\n\n const heatmapWidth = this.heatmapWidth();\n const heatmapHeight = this.heatmapHeight();\n\n if (heatmapWidth != undefined && heatmapHeight != undefined) {\n const x = this.x();\n const y = this.y();\n\n if (x != undefined && y != undefined) {\n const absX = x * heatmapWidth;\n const absY = y * heatmapHeight;\n\n var left = x <= 0.5 ?\n (absX - offset < halfDotWidth ? halfDotWidth : -offset) :\n -(absX + offset > heatmapWidth - halfDotWidth ? halfDotWidth : -offset) + dotWidth - boxWidth;\n\n var top = y <= 0.5 ?\n dotHeight + offset :\n -offset - boxHeight;\n\n var bigPinMode = top > 0 && absY + top + boxHeight + halfDotHeight > heatmapHeight ||\n top < 0 && absY + top - halfDotHeight < 0;\n\n if (bigPinMode) {\n left = x < 0.5 ?\n dotWidth + offset :\n -offset - boxWidth;\n\n top = -absY + heatmapHeight / 2 - boxHeight / 2 + halfDotHeight;\n }\n\n return {\n left: left,\n top: top\n }\n }\n }\n }\n }\r\n}","import { Observable } from 'knockout';\r\nimport HeatmapViewType from '../enums/viewType';\r\n\r\nexport interface HeatmapViewLinkConfig {\r\n title: string\r\n type: HeatmapViewType\r\n isActive?: boolean\r\n}\r\n\r\nexport default class HeatmapViewLink {\r\n title: Observable\r\n type: Observable\r\n isActive: Observable\r\n\r\n constructor(config: HeatmapViewLinkConfig) {\r\n this.title = ko.observable(config.title);\r\n this.type = ko.observable(config.type);\r\n this.isActive = ko.observable(config.isActive ?? false);\r\n }\r\n}","define([\n \"!!../../../../node_modules/html-loader/dist/cjs.js??ref--26-1!./viewsPanel.html\", \n \"!../../../webpack/runtime/htmlExposer.js\"], function (content, expose) {\n content = content.__esModule ? content.default : content;\n expose(content);\n return content;\n });","var api = require(\"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n var content = require(\"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/sass-loader/dist/cjs.js!./viewsPanel.scss\");\n\n content = content.__esModule ? content.default : content;\n\n if (typeof content === 'string') {\n content = [[module.id, content, '']];\n }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};","import { wccModules } from 'enums/wccModules';\r\nimport { inject, injectable } from 'inversify';\r\nimport { Observable, Subscribable } from 'knockout';\r\nimport { withEffect } from 'mixins/withEffect';\r\nimport { EffectsContainer } from 'mixins/withEffects';\r\nimport HeatmapViewType from '../enums/viewType';\r\nimport HeatmapVM from '../heatmap';\r\nimport HeatmapViewLink from './viewLink';\r\nimport './viewsPanel.html';\r\nimport './viewsPanel.scss';\r\n\r\nexport interface HeatmapViewsPanelConfig {\r\n heatmap: HeatmapVM\r\n view: Observable\r\n}\r\n\r\n@injectable()\r\nexport default class HeatmapViewsPanelVM {\r\n private heatmap: HeatmapVM\r\n\r\n viewLinks: Subscribable>\r\n\r\n constructor(\r\n @inject(wccModules.componentConfig) config: HeatmapViewsPanelConfig,\r\n @inject(wccModules.componentInfo) info: ko.components.ComponentInfo,\r\n @inject(wccModules.effects) effects: EffectsContainer\r\n ) {\r\n this.heatmap = config.heatmap;\r\n\r\n this.viewLinks = ko.pureComputed(() => this.getViewLinks());\r\n\r\n const activeViewLink = this.viewLinks.find(link => link.isActive());\r\n\r\n effects.register(() => {\r\n this.activateView(config.view());\r\n\r\n return withEffect(viewLink => {\r\n if (viewLink != undefined)\r\n config.view(viewLink.type());\r\n }, [activeViewLink]);\r\n });\r\n\r\n ko.applyBindingsToNode(info.element, {\r\n 'visible': this.viewLinks.is(links => links.length > 1),\r\n\r\n 'css': {\r\n 'wcc-heatmap__views-panel': true\r\n }\r\n });\r\n }\r\n\r\n activateView = (viewLinkOrType: HeatmapViewLink | HeatmapViewType) => {\r\n if (viewLinkOrType instanceof HeatmapViewLink)\r\n this.viewLinks().forEach(link => link.isActive(link === viewLinkOrType));\r\n else\r\n this.activateView(this.viewLinks().find(link => link.type() === viewLinkOrType) ?? this.viewLinks()[0]);\r\n }\r\n\r\n private getViewLinks() {\r\n const viewLinks = new Array();\r\n\r\n viewLinks.push(new HeatmapViewLink({ title: labels.PinnedComments, type: HeatmapViewType.pinnedComments, isActive: true }));\r\n\r\n if (this.heatmap.allowHeatmapView())\r\n viewLinks.push(new HeatmapViewLink({ title: labels.Heatmap, type: HeatmapViewType.heatmap }));\r\n\r\n return viewLinks;\r\n }\r\n}","define([\n \"!!../../../../node_modules/html-loader/dist/cjs.js??ref--26-1!./zoomPanel.html\", \n \"!../../../webpack/runtime/htmlExposer.js\"], function (content, expose) {\n content = content.__esModule ? content.default : content;\n expose(content);\n return content;\n });","var api = require(\"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n var content = require(\"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/sass-loader/dist/cjs.js!./zoomPanel.scss\");\n\n content = content.__esModule ? content.default : content;\n\n if (typeof content === 'string') {\n content = [[module.id, content, '']];\n }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};","import { wccModules } from 'enums/wccModules';\r\nimport { inject, injectable } from 'inversify';\r\nimport { Subscribable } from 'knockout';\r\nimport HeatmapVM from '../heatmap';\r\nimport './zoomPanel.html';\r\nimport './zoomPanel.scss';\r\n\r\nexport interface HeatmapZoomPanelConfig {\r\n heatmap: HeatmapVM\r\n}\r\n\r\n@injectable()\r\nexport default class HeatmapZoomPanelVM {\r\n private heatmap: HeatmapVM\r\n\r\n scale: Subscribable\r\n\r\n constructor(\r\n @inject(wccModules.componentConfig) config: HeatmapZoomPanelConfig,\r\n @inject(wccModules.componentInfo) info: ko.components.ComponentInfo\r\n ) {\r\n this.heatmap = config.heatmap;\r\n\r\n this.scale = this.heatmap.scale.pluck(scale => `${scale.toFixed(1)}x`);\r\n\r\n ko.applyBindingsToNode(info.element, {\r\n 'css': {\r\n 'wcc-heatmap__zoom-panel': true\r\n }\r\n });\r\n }\r\n\r\n zoomIn = () => {\r\n this.heatmap.zoomIn();\r\n }\r\n\r\n zoomOut = () => {\r\n this.heatmap.zoomOut();\r\n }\r\n}","define(function () {\r\n const system = require('helpers/system').SystemHelpers;\r\n\r\n return function (html) {\r\n system.getTemplatesAndResources(html)\r\n .forEach(function (node) { document.head.appendChild(node) });\r\n }\r\n});","// Imports\nvar ___CSS_LOADER_API_IMPORT___ = require(\"../../../node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.id, \".wcc-heatmap.wcc-heatmap--inline .wcc-heatmap__body{border:none}.wcc-heatmap.wcc-heatmap--no-hint .wcc-heatmap__header{justify-content:center}.wcc-heatmap,.wcc-heatmap__inner__content,.wcc-heatmap__body,.wcc-heatmap__image{display:flex;flex-direction:column;min-height:0}.wcc-heatmap__inner{display:flex;min-height:0}.wcc-heatmap__header{display:flex;justify-content:space-between;align-items:center;margin-bottom:4px}.wcc-heatmap__header .wcc-heatmap__hint{margin-right:10px}.wcc-heatmap__hint-wrapper{padding:2px;border-bottom:2px dashed #fff;border-radius:4px}.wcc-heatmap__body{position:relative;padding:4px;border:2px dashed #f8f8f7;border-radius:4px}.wcc-heatmap__image{position:relative;border-radius:4px;overflow:hidden}.wcc-heatmap__image__inner{display:flex;justify-content:center;min-height:0}.wcc-heatmap__image__offset-viewer{position:absolute;bottom:0;right:0;width:80px;opacity:.65}.wcc-heatmap__rasterization-wrapper{position:absolute;top:0;right:0;bottom:0;left:0}\", \"\"]);\n// Exports\nmodule.exports = exports;\n","// Imports\nvar ___CSS_LOADER_API_IMPORT___ = require(\"../../../../node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.id, \".wcc-heatmap__hint{display:flex;padding:3px 5px;background-color:#5ca2dd;color:#fff;border-radius:4px}.wcc-heatmap__hint__content{flex-grow:1}.wcc-heatmap__hint__controls{flex-shrink:0}.wcc-heatmap__hint__control{display:flex;justify-content:center;align-items:center;width:20px;height:20px;transition:color ease-in-out 250ms;color:#fff;cursor:pointer}.wcc-heatmap__hint__control:hover{color:#f8f8f7}\", \"\"]);\n// Exports\nmodule.exports = exports;\n","// Imports\nvar ___CSS_LOADER_API_IMPORT___ = require(\"../../../../node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.id, \".wcc-heatmap__offset-viewer{position:relative;display:block;background-color:#000;border-radius:3px}.wcc-heatmap__offset-viewer__frame__inner{position:absolute;top:0;left:0;right:0;bottom:0;display:flex;justify-content:center;align-items:center}.wcc-heatmap__offset-viewer__frame{position:absolute;border:1px solid #f8f8f7;border-radius:3px}\", \"\"]);\n// Exports\nmodule.exports = exports;\n","// Imports\nvar ___CSS_LOADER_API_IMPORT___ = require(\"../../../../node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.id, \".wcc-heatmap__pin{position:absolute;display:block;transform:translate(-50%, -50%)}.wcc-heatmap__pin--clickable .wcc-heatmap__pin__dot{cursor:pointer}.wcc-heatmap__pin--active{z-index:1}.wcc-heatmap__pin--simple .wcc-heatmap__pin__box{width:auto;border:none}.wcc-heatmap__pin__dot{box-shadow:rgba(0,0,0,.8) 0 0 11px;-webkit-box-shadow:0 0 11px 0 rgba(0,0,0,.8);-webkit-transition:width .25s ease-in-out,height .25s ease-in-out;-moz-transition:width .25s ease-in-out,height .25s ease-in-out;-o-transition:width .25s ease-in-out,height .25s ease-in-out;transition:width .25s ease-in-out,height .25s ease-in-out;position:relative;background-color:#fff;border-radius:15px;border:4px solid #269efa;width:30px;height:30px}.wcc-heatmap__pin__dot--small{width:18px;height:18px}.wcc-heatmap__pin__dot--small .wcc-heatmap__pin__dot__body{width:4px;height:4px}.wcc-heatmap__pin__dot__body{-webkit-transition:width .25s ease-in-out,height .25s ease-in-out;-moz-transition:width .25s ease-in-out,height .25s ease-in-out;-o-transition:width .25s ease-in-out,height .25s ease-in-out;transition:width .25s ease-in-out,height .25s ease-in-out;position:absolute;background-color:#269efa;border-radius:4px;left:50%;top:50%;transform:translate(-50%, -50%);width:6px;height:6px}.wcc-heatmap__pin__box{position:absolute;max-width:90vw;background-color:#5ca2dd;border:3px solid #5ca2dd;border-radius:4px;width:280px}.wcc-heatmap__pin__mobile-box{max-width:300px;margin:auto}\", \"\"]);\n// Exports\nmodule.exports = exports;\n","// Imports\nvar ___CSS_LOADER_API_IMPORT___ = require(\"../../../../node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.id, \".wcc-heatmap__views-panel{display:block}.wcc-heatmap__views-panel__link{cursor:pointer;border-bottom:1px dotted transparent;color:#c6c6c6;border-bottom-color:#c6c6c6;margin-right:10px}.wcc-heatmap__views-panel__link:focus,.wcc-heatmap__views-panel__link:hover{outline:none;text-decoration:none}.wcc-heatmap__views-panel__link:hover{color:#939393;border-bottom-color:#939393}.wcc-heatmap__views-panel__link:last-child{margin-right:0}.wcc-heatmap__views-panel__link:not(.wcc-heatmap__views-panel__link--active){border-bottom-color:transparent}\", \"\"]);\n// Exports\nmodule.exports = exports;\n","// Imports\nvar ___CSS_LOADER_API_IMPORT___ = require(\"../../../../node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.id, \".wcc-heatmap:not(.wcc-heatmap--mobile) .wcc-heatmap__zoom-panel__control{cursor:pointer}.wcc-heatmap:not(.wcc-heatmap--mobile).wcc-heatmap--light-theme .wcc-heatmap__zoom-panel__control:hover{background-color:#e0e0dc}.wcc-heatmap:not(.wcc-heatmap--mobile).wcc-heatmap--dark-theme .wcc-heatmap__zoom-panel__control:hover{background-color:#c8c8c1}.wcc-heatmap.wcc-heatmap--light-theme .wcc-heatmap__zoom-panel__control,.wcc-heatmap.wcc-heatmap--light-theme .wcc-heatmap__zoom-panel__label{background-color:#fff}.wcc-heatmap.wcc-heatmap--dark-theme .wcc-heatmap__zoom-panel__control,.wcc-heatmap.wcc-heatmap--dark-theme .wcc-heatmap__zoom-panel__label{background-color:#e0e0dc}.wcc-heatmap__zoom-panel{display:flex;border-radius:20px;overflow:hidden}.wcc-heatmap__zoom-panel i{font-size:16px}.wcc-heatmap__zoom-panel__control,.wcc-heatmap__zoom-panel__label{min-width:36px;height:26px;display:flex;justify-content:center;align-items:center;transition:background-color ease-in-out 250ms;border-right:1px solid #c6c6c6;user-select:none}.wcc-heatmap__zoom-panel__control:last-child,.wcc-heatmap__zoom-panel__label:last-child{border-right:none}\", \"\"]);\n// Exports\nmodule.exports = exports;\n","// Module\nvar code = \"\";\n// Exports\nmodule.exports = code;","// Module\nvar code = \"\";\n// Exports\nmodule.exports = code;","// Module\nvar code = \"\";\n// Exports\nmodule.exports = code;","// Module\nvar code = \"\";\n// Exports\nmodule.exports = code;","// Module\nvar code = \"\";\n// Exports\nmodule.exports = code;","// Module\nvar code = \"\";\n// Exports\nmodule.exports = code;"],"sourceRoot":""}