@evergis/charts 2.0.21 → 2.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"charts.cjs.production.min.js","sources":["../src/common/components/Wrapper.ts","../src/hooks/useNode.ts","../src/hooks/useResize.ts","../src/helpers/throttle.ts","../src/helpers/appendSvg.ts","../src/common/components/SwipeScroll/styled.ts","../src/common/components/SwipeScroll/animate.ts","../src/common/components/SwipeScroll/hooks/useSwipe.ts","../src/common/components/SwipeScroll/index.tsx","../src/charts/RadarChart/drawRadialLabels/styled.ts","../src/common/components/labels/index.ts","../src/charts/RadarChart/styled.ts","../src/charts/RadarChart/draw.tsx","../src/charts/RadarChart/drawRadialLabels/index.tsx","../src/charts/RadarChart/helpers.ts","../src/charts/RadarChart/index.tsx","../src/helpers/math.ts","../src/charts/PieChart/styled.ts","../src/charts/PieChart/drawRadialLabels/helpers.ts","../src/common/components/tooltips/index.ts","../src/charts/PieChart/draw.tsx","../src/charts/PieChart/drawRadialLabels/index.tsx","../src/charts/PieChart/drawTooltips/index.tsx","../src/charts/PieChart/index.tsx","../src/helpers/getLegend/index.ts","../src/charts/CalendarChart/styled.ts","../src/charts/CalendarChart/index.tsx","../src/charts/CalendarChart/draw.ts","../src/helpers/computeDimensions.ts","../src/helpers/common.ts","../src/charts/LineChart/styled.ts","../src/charts/LineChart/drawLabel/styled.ts","../src/charts/LineChart/draw.ts","../src/helpers/stackedData.ts","../src/charts/LineChart/drawGrid/index.ts","../src/charts/LineChart/drawLabel/index.tsx","../src/charts/LineChart/drawTooltip/index.tsx","../src/charts/LineChart/index.tsx","../src/charts/BarChart/drawLines/index.ts","../src/charts/BarChart/styled.ts","../src/charts/BarChart/draw.ts","../src/charts/BarChart/getDomain.ts","../src/charts/BarChart/resizeBarWidth/index.ts","../src/charts/BarChart/marshaling.ts","../src/charts/BarChart/drawGrid/index.ts","../src/charts/BarChart/getBars/index.ts","../src/charts/BarChart/drawTooltip/index.tsx","../src/charts/BarChart/drawTooltip/getLabel.tsx","../src/charts/BarChart/drawTooltip/getLabelY.ts","../src/charts/BarChart/index.tsx","../src/charts/HorizontalBarChart/styled.ts","../src/charts/HorizontalBarChart/Tooltip/index.tsx","../src/charts/HorizontalBarChart/hooks/useTooltip/index.tsx","../src/charts/HorizontalBarChart/Bar/styled.ts","../src/charts/HorizontalBarChart/Bar/index.tsx","../src/charts/HorizontalBarChart/XScale/styled.ts","../src/charts/HorizontalBarChart/XScale/index.tsx","../src/charts/HorizontalBarChart/XScale/hooks/useScale.ts","../src/charts/HorizontalBarChart/index.tsx","../src/charts/HorizontalBarChart/hooks/useMarshaling.ts","../src/charts/HorizontalBarChart/hooks/useStackWrapper.tsx","../src/charts/BubbleChart/styled.ts","../src/charts/BubbleChart/drawTooltip/styled.ts","../src/charts/BubbleChart/draw.ts","../src/charts/BubbleChart/drawGrid/index.ts","../src/charts/BubbleChart/drawTooltip/index.tsx","../src/charts/BubbleChart/index.tsx","../src/charts/BubbleChart/unmount.ts"],"sourcesContent":["import styled from 'styled-components';\n\nexport const Wrapper = styled.div`\n position: relative;\n width: 100%;\n box-sizing: border-box;\n`;\n","import { PropsWithRef, useCallback, useState } from 'react';\n\nexport function useNode(): [PropsWithRef<any>, HTMLElement | null] {\n const [node, onSetNode] = useState<HTMLElement | null>(null);\n\n const ref = useCallback(onSetNode, [onSetNode]);\n\n return [ref, node];\n}\n","import { useEffect, useMemo } from 'react';\n\nimport { throttle } from '../helpers/throttle';\n\nconst THROTTLE_DELAY = 44;\n\nexport const useResize = (\n width?: number,\n callback?: (...args: any) => any,\n delay?: number\n) => {\n const throttledCallback: VoidFunction | undefined = useMemo(() => {\n return callback ? throttle(callback, delay || THROTTLE_DELAY) : undefined;\n }, [callback, delay]);\n\n useEffect(() => {\n throttledCallback &&\n typeof width !== 'number' &&\n window.addEventListener('resize', throttledCallback);\n\n return () =>\n throttledCallback &&\n window.removeEventListener('resize', throttledCallback);\n }, [width, throttledCallback]);\n};\n","export function throttle(fn: Function, wait: number) {\n let isCalled = false;\n\n return function(...args: any) {\n if (!isCalled) {\n fn(...args);\n isCalled = true;\n setTimeout(function() {\n isCalled = false;\n }, wait);\n }\n };\n}\n","import * as d3 from 'd3';\n\nexport const appendSvg = (node: HTMLElement, width: number, height: number) => {\n d3.select(node)\n .select('svg')\n .remove();\n\n const svg = d3\n .select(node)\n .append('svg')\n .attr('width', width)\n .attr('height', height);\n\n return svg;\n};\n","import styled from 'styled-components';\n\nexport const SwipeScrollContainer = styled.div`\n width: 100%;\n overflow: hidden;\n user-select: none;\n`;\n","export function animate({\n duration,\n timing,\n draw,\n}: {\n duration: number;\n timing: (n: number) => number;\n draw: (progress: number, requestId: number) => void;\n}): void {\n const start = performance.now();\n let requestId: number;\n\n requestAnimationFrame(function requestAnimate(time) {\n let timeFraction = (time - start) / duration;\n\n if (timeFraction < 1) {\n requestId = requestAnimationFrame(requestAnimate);\n }\n\n if (timeFraction > 1) cancelAnimationFrame(requestId);\n const progress = timing(timeFraction);\n\n draw(progress, requestId);\n });\n}\n\nexport const easeOutQuad = (time: number): number => time * (2 - time);\n","import { useEffect, useRef, useCallback } from 'react';\nimport * as d3 from 'd3';\n\nimport { animate, easeOutQuad } from '../animate';\n\nimport { SwipeScrollProps } from '../types';\n\nconst range = (num: number, min: number, max: number) =>\n Math.min(Math.max(num, min), max);\n\nconst defaultRefs = {\n animation: 0,\n speed: 0,\n timestamp: 0,\n startX: 0,\n currentX: 0,\n};\n\nexport const useSwipe = (\n node: HTMLElement | null,\n { width, duration, animationFunc, onSwipe }: SwipeScrollProps\n) => {\n const container = d3.select(node);\n const body = d3.select('body');\n const documentSelect = d3.select(document);\n const refs = useRef(defaultRefs);\n\n useEffect(() => {\n if (width && refs.current.animation) {\n cancelAnimationFrame(refs.current.animation);\n refs.current = defaultRefs;\n }\n }, [width]);\n\n const onMove = useCallback(\n event => {\n const { width: nodeWidth } = node\n ? node.getBoundingClientRect()\n : { width: 0 };\n const [x] = d3.pointer(\n event.type.includes('touch') ? event.touches[0] : event\n );\n const newX = x - refs.current.startX;\n const maxX = width - nodeWidth;\n const translateX = range(newX, -maxX, 0);\n\n container.style('transform', `translateX(${translateX}px)`);\n\n if (refs.current.currentX) {\n const hundred = 100;\n const now = Date.now();\n const dt = now - refs.current.timestamp;\n const dx = translateX - refs.current.currentX;\n const speedX = Math.round((dx / dt) * hundred);\n\n refs.current.speed = speedX;\n refs.current.timestamp = now;\n }\n\n refs.current.currentX = translateX;\n\n onSwipe && onSwipe(translateX, container);\n },\n [onSwipe, width, node, container]\n );\n\n const onEnd = useCallback(() => {\n const { width: nodeWidth } = node\n ? node.getBoundingClientRect()\n : { width: 0 };\n\n documentSelect.on(\n 'mousemove.swipe touchmove.swipe mouseup.swipe touchend.swipe',\n null\n );\n body.style('cursor', null);\n if (width > nodeWidth) {\n container.style('cursor', 'grab');\n } else {\n container.style('cursor', null);\n }\n\n const dt = Date.now() - refs.current.timestamp;\n const dtEnd = 44;\n\n if (dt < dtEnd) {\n animate({\n duration: duration as number,\n timing: animationFunc || easeOutQuad,\n draw: (progress, requestId) => {\n refs.current.animation = requestId;\n const px = Math.round(refs.current.speed * 2 * progress);\n const currX = refs.current.currentX + px;\n const maxX = width - nodeWidth;\n const translateX = range(currX, -maxX, 0);\n\n const transX = Math.max(Math.min(currX, maxX), 0);\n\n if (refs.current.currentX !== transX) {\n container.style('transform', `translateX(${translateX}px)`);\n\n onSwipe && onSwipe(translateX, container);\n }\n },\n });\n }\n }, [\n body,\n animationFunc,\n onSwipe,\n container,\n duration,\n node,\n width,\n documentSelect,\n ]);\n\n const onStart = useCallback(\n event => {\n const isTouch = event.type.includes('touch');\n const [x] = d3.pointer(isTouch ? event.touches[0] : event, node);\n\n const { left } =\n node && node.parentElement\n ? node.parentElement.getBoundingClientRect()\n : { left: 0 };\n body.style('cursor', 'grabbing');\n container.style('cursor', 'grabbing');\n\n if (refs.current.animation) {\n cancelAnimationFrame(refs.current.animation);\n refs.current = defaultRefs;\n }\n\n refs.current.startX = Math.max(x + left, 0);\n documentSelect.on('mousemove.swipe touchmove.swipe', onMove);\n documentSelect.on('mouseup.swipe touchend.swipe', onEnd);\n },\n [container, body, node, onEnd, onMove, documentSelect]\n );\n\n useEffect(() => {\n if (node) {\n const { width: nodeWidth } = node.getBoundingClientRect();\n\n if (width > nodeWidth) {\n container.style('cursor', 'grab');\n container.on('mousedown.swipe touchstart.swipe', onStart);\n }\n }\n }, [container, onStart, node, width]);\n};\n","import React from 'react';\n\nimport { SwipeScrollContainer } from './styled';\n\nimport { useNode } from '../../../hooks';\nimport { useSwipe } from './hooks/useSwipe';\n\nimport { SwipeScrollProps } from './types';\n\nexport const SwipeScroll: React.FC<SwipeScrollProps> = ({\n children,\n width,\n onSwipe,\n ...props\n}): React.ReactElement => {\n const [ref, draggingNode] = useNode();\n\n useSwipe(draggingNode, { width, onSwipe, ...props });\n\n return (\n <SwipeScrollContainer {...props}>\n <div ref={ref}>{children}</div>\n </SwipeScrollContainer>\n );\n};\n\nSwipeScroll.defaultProps = {\n duration: 1400,\n};\n","import styled from 'styled-components';\n\nimport { LabelContainerProps } from './types';\n\nconst getTranslate = ({\n anchor,\n index,\n translateX,\n translateY,\n}: LabelContainerProps) => {\n if (index === 0 && anchor === 'middle') {\n return `translate(calc(-50% + ${translateX}px), calc(-100% + ${translateY}px))`;\n } else if (anchor === 'middle') {\n return `translate(calc(-50% + ${translateX}px), calc(${translateY}px))`;\n } else if (anchor === 'start') {\n return `translate(calc(${translateX}px), calc(-50% + ${translateY}px))`;\n } else if (anchor === 'end') {\n return `translate(calc(-100% + ${translateX}px), calc(-50% + ${translateY}px))`;\n }\n return `translate(${translateX}px, ${translateY}px)`;\n};\n\nexport const LabelContainer = styled.div.attrs<LabelContainerProps>(props => ({\n style: {\n transform: getTranslate(props),\n },\n}))<LabelContainerProps>`\n position: absolute;\n`;\n","import styled, { css } from 'styled-components';\n\nimport { LabelContainerProps } from './types';\n\nexport const getTranslate = ({\n anchor,\n index,\n translateX,\n translateY,\n}: LabelContainerProps) => {\n if (index === 0 && anchor === 'middle') {\n return `translate(calc(-50% + ${translateX}px), calc(-100% + ${translateY}px))`;\n } else if (anchor === 'middle') {\n return `translate(calc(-50% + ${translateX}px), calc(${translateY}px))`;\n } else if (anchor === 'start') {\n return `translate(calc(${translateX}px), calc(-50% + ${translateY}px))`;\n } else if (anchor === 'end') {\n return `translate(calc(-100% + ${translateX}px), calc(-50% + ${translateY}px))`;\n }\n return `translate(${translateX}px, ${translateY}px)`;\n};\n\nexport const Label = styled.div`\n display: flex;\n align-items: center;\n font-size: 12px;\n`;\n\nexport const Name = styled.div`\n text-align: center;\n max-width: 120px;\n`;\n\nconst middleBadgeStyles = css`\n position: absolute;\n top: 50%;\n right: 0;\n transform: translate(calc(100% + 6px), -50%);\n`;\n\nexport const DefaultBadge = styled.div`\n display: flex;\n align-items: center;\n padding: 2px 4px;\n border-radius: 4px;\n color: rgb(255, 255, 255);\n background-color: rgb(144, 197, 61);\n margin-left: 8px;\n`;\n\nexport const MiddleBadge = styled(DefaultBadge)`\n ${middleBadgeStyles}\n`;\n\nexport const BadgePrefix = styled.div`\n margin-left: 4px;\n font-size: 10px;\n color: rgba(255, 255, 255, 0.54);\n`;\n","import styled from 'styled-components';\n\nimport { Wrapper } from '../../common/components/Wrapper';\n\nexport const radarChartclassNames = {\n radar: 'radar',\n radarAxis: 'radarAxis',\n radarAxisTextGlobal: 'radarAxisTextGlobal',\n radarAxisText: 'radarAxisText',\n radarPolygon: 'radarPolygon',\n radarLabel: 'radarLabel',\n radarLabelName: 'radarLabelName',\n radarLabelBadge: 'radarLabelBadge',\n radarLabelBadgePrefix: 'radarLabelBadgePrefix',\n radarCircle: 'radarCircle',\n};\n\nexport const SvgWrapper = styled(Wrapper)`\n .${radarChartclassNames.radarAxis} {\n path,\n line,\n circle {\n fill: none;\n stroke-width: 1px;\n stroke: rgba(149, 149, 149, 0.18);\n }\n }\n .${radarChartclassNames.radarAxisText} {\n font-size: 12px;\n fill-opacity: 0.56;\n }\n .${radarChartclassNames.radarPolygon} {\n fill-opacity: 0.06;\n stroke-width: 2px;\n fill: rgb(144, 197, 61);\n stroke: rgb(144, 197, 61);\n }\n .${radarChartclassNames.radarCircle} {\n fill: rgb(144, 197, 61);\n }\n`;\n","import React from 'react';\nimport ReactDOMServer from 'react-dom/server';\nimport * as d3 from 'd3';\n\nimport { RadarChartProps } from './types';\n\nimport { appendSvg } from '../../helpers';\nimport { drawRadialLabels } from './drawRadialLabels';\n\nimport {\n Label,\n MiddleBadge,\n DefaultBadge,\n Name,\n BadgePrefix,\n} from '../../common/components/labels';\nimport { radarChartclassNames } from './styled';\n\nexport const draw = (\n node: HTMLElement | null,\n props: RadarChartProps\n): void => {\n const {\n data,\n curve,\n polar,\n formatValue,\n badgePrefix,\n labelOffset,\n circleRadius,\n svgElements,\n renderLabel,\n customize,\n formatAxisValue,\n radarStyles,\n labelIndex,\n selectLabel,\n } = props;\n\n if (node !== null && data.length) {\n const defaultBleedLength = 10;\n const bleedLength =\n typeof props.bleedLength === 'number'\n ? props.bleedLength\n : defaultBleedLength;\n\n const { width: nodeWidth } = node.getBoundingClientRect();\n const width = props.width || nodeWidth;\n const defaultHeight = 400;\n const height = props.height || defaultHeight;\n\n const minValue =\n props.minValue ||\n Math.min(\n 0,\n d3.min(data, i => d3.min(i.map(({ value }) => value))) as number\n );\n const maxValue =\n (props.maxValue ||\n Math.max(\n 0,\n d3.max(data, i => d3.max(i.map(({ value }) => value))) as number\n )) - minValue;\n const paddingX = props.paddingX || 0;\n const paddingY = props.paddingY || 0;\n const radius = Math.min(\n (width - paddingX * 2 - bleedLength * 2) / 2,\n (height - paddingY * 2 - bleedLength * 2) / 2\n );\n\n const defaultLevels = 4;\n const ticks = d3\n .scaleLinear()\n .domain([0, maxValue || 1])\n .range([])\n .ticks(props.levels || defaultLevels);\n const lastTick = ticks[ticks.length - 1];\n const newLastTick = lastTick + (ticks[1] - ticks[0]);\n\n if (lastTick < maxValue) {\n ticks.push(newLastTick);\n }\n\n const levels = props.levels || ticks.length - 1;\n const newMaxValue = ticks[ticks.length - 1];\n const angleSlice = (Math.PI * 2) / data[0].length;\n\n const radiusScale = d3\n .scaleLinear()\n .range([0, radius])\n .domain([0, newMaxValue]);\n\n const radarLine = d3\n .lineRadial()\n .curve(d3.curveLinearClosed)\n // @ts-ignore\n .radius(({ value }) => radiusScale(value) as number)\n .angle((_, i) => i * angleSlice);\n const radarValue = d3\n .lineRadial()\n .curve(curve || d3.curveLinearClosed)\n // @ts-ignore\n .radius(({ value }) => radiusScale(value) as number)\n .angle((_, i) => i * angleSlice);\n\n const svg = appendSvg(node, width, height);\n const globalCenter = svg.append('g');\n\n const levelsGrid = d3.range(1, levels + 1).reverse();\n const axisGridY = (value: number) => (-value * radius) / levels;\n const getAxisValue = (value: number) => (newMaxValue * value) / levels;\n\n const gridGlobal = globalCenter\n .append('g')\n .attr('class', radarChartclassNames.radarAxis)\n .selectAll()\n .data([data[0]])\n .enter();\n\n const radarGlobal = globalCenter\n .append('g')\n .attr('class', radarChartclassNames.radar);\n\n const axis = gridGlobal\n .selectAll()\n .data(data[0].map(({ name }) => name))\n .enter();\n\n let maxGridHeight = 0;\n\n if (polar) {\n levelsGrid.forEach(value => {\n const path = gridGlobal\n .append('circle')\n .attr('cx', 0)\n .attr('cy', 0)\n .attr('r', () => (radius / levels) * value);\n\n const circleNode = path.node() as SVGCircleElement;\n const circleHeight = circleNode.getBoundingClientRect().height;\n maxGridHeight = Math.max(maxGridHeight, circleHeight);\n });\n } else {\n levelsGrid.map(getAxisValue).forEach(value => {\n const path = gridGlobal.append('path').attr('d', () =>\n // @ts-ignore\n radarLine(Array.from({ length: data[0].length }, () => ({ value })))\n );\n const pathNode = path.node() as SVGPathElement;\n const pathHeight = pathNode.getBoundingClientRect().height;\n maxGridHeight = Math.max(maxGridHeight, pathHeight);\n });\n }\n\n const radiusByMaxValue = (radiusScale(newMaxValue) as number) + bleedLength;\n\n axis\n .append('line')\n .attr('x1', 0)\n .attr('y1', 0)\n .attr('x2', (_, i) =>\n Math.round(radiusByMaxValue * Math.cos(angleSlice * i - Math.PI / 2))\n )\n .attr('y2', (_, i) =>\n Math.round(radiusByMaxValue * Math.sin(angleSlice * i - Math.PI / 2))\n );\n\n radarGlobal\n .selectAll('path')\n .data(data)\n .join('path')\n .attr('class', radarChartclassNames.radarPolygon)\n .attr('style', (_, index) => radarStyles?.[index] || '')\n .attr('d', d =>\n radarValue(\n // @ts-ignore\n d.map(dataItem => ({\n ...dataItem,\n value: dataItem.value - minValue,\n }))\n )\n );\n\n const format = d3.format(',');\n const axisTextGlobal = globalCenter\n .append('g')\n .attr('class', radarChartclassNames.radarAxisTextGlobal);\n axisTextGlobal\n .selectAll('text')\n .data(levelsGrid)\n .enter()\n .append('text')\n .attr('class', radarChartclassNames.radarAxisText)\n .attr('x', '4')\n .attr('y', axisGridY)\n .attr('dy', 0)\n .attr('dominant-baseline', 'central')\n .text((value, index) => {\n const axisValue = getAxisValue(value) + minValue;\n\n return formatAxisValue\n ? formatAxisValue(axisValue, index)\n : format(axisValue);\n });\n\n circleRadius &&\n data.forEach(item => {\n const circleGlobal = globalCenter\n .append('g')\n .attr('class', radarChartclassNames.radarCircle);\n\n item.forEach(({ value }, i) => {\n circleGlobal\n .append('circle')\n .attr(\n 'cx',\n Math.round(\n (radiusScale(value) as number) *\n Math.cos(angleSlice * i - Math.PI / 2)\n )\n )\n .attr(\n 'cy',\n Math.round(\n radiusScale(\n value * Math.sin(angleSlice * i - Math.PI / 2)\n ) as number\n )\n )\n .attr('r', circleRadius);\n });\n });\n\n const defaultLabelOffset = 8;\n const heightInner = height - bleedLength - paddingY;\n const translateX = width / 2;\n const translateY = heightInner / 2 + (heightInner - maxGridHeight) / 2;\n const offset = bleedLength + (labelOffset || defaultLabelOffset);\n\n globalCenter.attr('transform', `translate(${translateX},${translateY})`);\n\n drawRadialLabels({\n node,\n maxValue: newMaxValue,\n translateX,\n translateY,\n dataLength: data[labelIndex || 0].length,\n angleSlice,\n radius,\n radiusScale,\n xOffset: offset,\n yOffset: offset,\n renderLabel: (anchor, index) => {\n const items = data.map(item => item[index]);\n const Badge = anchor === 'middle' ? MiddleBadge : DefaultBadge;\n const item = data[labelIndex || 0][index];\n const { name, value } = item;\n\n return renderLabel ? (\n renderLabel({ item, items, anchor, index })\n ) : (\n <Label className={radarChartclassNames.radarLabel}>\n <Name className={radarChartclassNames.radarLabelName}>{name}</Name>\n <Badge className={radarChartclassNames.radarLabelBadge}>\n {formatValue ? formatValue(value, index) : format(value)}\n {badgePrefix && (\n <BadgePrefix\n className={radarChartclassNames.radarLabelBadgePrefix}\n >\n {badgePrefix}\n </BadgePrefix>\n )}\n </Badge>\n </Label>\n );\n },\n selectLabel: (label, anchor, index) => {\n if (selectLabel) {\n const items = data.map(item => item[index]);\n const item = data[labelIndex || 0][index];\n\n selectLabel(label, { index, item, items, anchor });\n }\n },\n });\n\n if (svgElements) {\n const html = ReactDOMServer.renderToString(svgElements);\n\n svg.append('g').html(html);\n }\n\n customize && customize(svg);\n }\n};\n","import * as d3 from 'd3';\nimport ReactDOMServer from 'react-dom/server';\nimport React from 'react';\n\nimport { DrawRadialLabels } from './types';\n\nimport { getTextAnchor } from '../helpers';\nimport { LabelContainer } from './styled';\n\nconst labelClassName = 'd3-chart-label';\n\nexport const drawRadialLabels = ({\n node,\n dataLength,\n radiusScale,\n maxValue,\n angleSlice,\n radius,\n xOffset,\n yOffset,\n translateX,\n translateY,\n renderLabel,\n selectLabel,\n}: DrawRadialLabels) => {\n const d3container = d3.select(node);\n d3container.selectAll(`.${labelClassName}`).remove();\n\n const pxToValue = (value: number) => (maxValue / radius) * value;\n const axisX = (i: number) =>\n (radiusScale(maxValue + pxToValue(xOffset || 0)) as number) *\n Math.cos(angleSlice * i - Math.PI / 2);\n\n const axisY = (i: number) =>\n radiusScale(\n (maxValue + pxToValue(yOffset || 0)) *\n Math.sin(angleSlice * i - Math.PI / 2)\n ) as number;\n\n const labels = Array.from({ length: dataLength }, (_, index) => ({\n x: Math.ceil(axisX(index)),\n y: Math.ceil(axisY(index)),\n }));\n\n labels.forEach(({ x, y }: { x: number; y: number }, index: number) => {\n const anchor = getTextAnchor(index, dataLength);\n const html = ReactDOMServer.renderToString(\n <LabelContainer\n anchor={anchor}\n translateX={translateX || 0}\n translateY={translateY || 0}\n index={index}\n style={{\n left: x,\n top: y,\n }}\n >\n {typeof renderLabel === 'function'\n ? renderLabel(anchor, index)\n : renderLabel}\n </LabelContainer>\n );\n\n const label = d3container\n .append('div')\n .attr('class', labelClassName)\n .html(html);\n\n selectLabel(label, anchor, index);\n });\n};\n","const degByIndex = (index: number, count: number): number => {\n const degs = 360;\n const deg = (degs / count) * index;\n\n return deg;\n};\n\nexport const getTextAnchor = (\n index: number,\n length: number\n): 'start' | 'middle' | 'end' => {\n const deg = degByIndex(index, length);\n const halfAngle = 180;\n\n if ([0, halfAngle].includes(deg)) {\n return 'middle';\n }\n if (deg < halfAngle) {\n return 'start';\n }\n\n return 'end';\n};\n\nexport const getMaxWidth = (elements: SVGElement[]) => {\n let maxWidth = 0;\n\n for (let i = 0; i < elements.length; i++) {\n const element = elements[i];\n\n if (element && 'getBoundingClientRect' in element) {\n maxWidth = Math.max(maxWidth, element.getBoundingClientRect().width);\n }\n }\n\n return maxWidth;\n};\n","import React, { useEffect } from 'react';\nimport * as d3 from 'd3';\n\nimport { RadarChartProps } from './types';\n\nimport { useNode } from '../../hooks';\nimport { useResize } from '../../hooks';\n\nimport { draw } from './draw';\n\nimport { SvgWrapper } from './styled';\n\nexport const RadarChart: React.FC<RadarChartProps> = (\n props\n): React.ReactElement => {\n const { className, style } = props;\n const [ref, node] = useNode();\n\n useEffect(() => {\n node && draw(node, props);\n }, [node, props]);\n\n const onDraw = () => draw(node, props);\n\n useResize(props.width, onDraw);\n\n return (\n <div className={className} style={style}>\n <SvgWrapper ref={ref} />\n </div>\n );\n};\n\nRadarChart.defaultProps = {\n height: 400,\n data: [],\n curve: d3.curveLinearClosed,\n};\n","export function radiansToDegrees(radians: number): number {\n const flatAngle = 180;\n\n return (radians * flatAngle) / Math.PI;\n}\n\nexport function degreesToRadians(degrees: number): number {\n const flatAngle = 180;\n\n return degrees * (Math.PI / flatAngle);\n}\n","import styled from 'styled-components';\n\nimport { Wrapper } from '../../common/components/Wrapper';\n\nexport const pieChartclassNames = {\n pieGlobal: 'pieGlobal',\n pieSlice: 'pieSlice',\n pieSliceLabel: 'pieSliceLabel',\n pieSliceLabelValue: 'pieSliceLabelValue',\n pieSliceLabelName: 'pieSliceLabelName',\n pieRadialLabel: 'pieRadialLabel',\n pieRadialLink: 'pieRadialLink',\n pieTooltipContainer: 'pieTooltipContainer',\n pieTooltipFlex: 'pieTooltipFlex',\n pieTooltip: 'pieTooltip',\n pieTooltipItem: 'pieTooltipItem',\n pieTooltipName: 'pieTooltipName',\n pieTooltipValue: 'pieTooltipValue',\n pieTooltipColorBox: 'pieTooltipColorBox',\n pieFullChartTooltipCircle: 'pieFullChartTooltipCircle',\n};\n\nexport const SvgWrapper = styled(Wrapper)`\n .${pieChartclassNames.pieSliceLabel} {\n fill: #4a4a4a;\n }\n .${pieChartclassNames.pieRadialLabel} {\n position: absolute;\n max-width: 128px;\n }\n .${pieChartclassNames.pieRadialLink} {\n stroke: #000;\n }\n .${pieChartclassNames.pieFullChartTooltipCircle} {\n fill: transparent;\n cursor: pointer;\n }\n`;\n","import { PieChartDatum } from '../types';\n\nexport const getMidFactor = (d: PieChartDatum) =>\n d.startAngle + (d.endAngle - d.startAngle) / 2 < Math.PI ? 1 : -1;\n\nexport const getAlign = (d: PieChartDatum): 'start' | 'end' => {\n const midangle = d.startAngle + (d.endAngle - d.startAngle) / 2;\n\n return midangle < Math.PI ? 'start' : 'end';\n};\n","import styled from 'styled-components';\n\nexport const TooltipFlex = styled.div`\n width: 0;\n height: 0;\n display: flex;\n align-items: flex-end;\n justify-content: center;\n pointer-events: none;\n white-space: nowrap;\n`;\n\nexport const LabelFlex = styled(TooltipFlex)``;\n\nexport const LabelFlexCenter = styled(LabelFlex)`\n align-items: center;\n`;\n\nexport const TooltipContainer = styled.div`\n position: relative;\n font-size: 11px;\n color: #fff;\n margin-bottom: 8px;\n padding: 4px 6px;\n background-color: rgba(48, 69, 79, 1);\n border-radius: 4px;\n box-shadow: 0 0.1875rem 0.5rem rgba(48, 69, 79, 0.06);\n :before {\n content: '';\n position: absolute;\n bottom: 0;\n left: 50%;\n transform: translate(-50%, 100%);\n width: 0;\n height: 0;\n border-style: solid;\n border-width: 4px 3px 0 3px;\n border-color: rgba(48, 69, 79, 1) transparent transparent transparent;\n }\n`;\n\nexport const TooltipGroupName = styled.div`\n font-size: 14px;\n margin-bottom: 6px;\n`;\n\nexport const TooltipItem = styled.div`\n display: flex;\n align-items: center;\n margin-bottom: 0.25rem;\n &:last-of-type {\n margin-bottom: 0;\n }\n`;\n\nexport const ColFlex = styled.div`\n display: flex;\n align-items: center;\n margin-right: 4px;\n`;\n\nexport const ColorBox = styled.div`\n margin-right: 4px;\n width: 10px;\n height: 10px;\n border-radius: 2px;\n`;\n\nexport const ColorLine = styled(ColorBox)`\n height: 2px;\n border-radius: 0;\n`;\n\nexport const Name = styled.div`\n margin-right: 4px;\n`;\n\nexport const Value = styled.div`\n text-align: right;\n flex-shrink: 0;\n flex-grow: 1;\n`;\n\nexport const Label = styled.div`\n position: relative;\n font-size: 11px;\n color: #fff;\n font-weight: bold;\n letter-spacing: 0.52px;\n`;\n\nexport const LabelTop = styled(Label)`\n top: 6px;\n`;\n\nexport const LabelBottom = styled(Label)`\n bottom: 6px;\n`;\n","import * as d3 from 'd3';\nimport ReactDOMServer from 'react-dom/server';\n\nimport { PieChartProps, PieChartDatum } from './types';\n\nimport { appendSvg } from '../../helpers';\nimport { degreesToRadians, radiansToDegrees } from '../../helpers/math';\nimport { drawRadialLabels } from './drawRadialLabels';\nimport { drawTooltip } from './drawTooltips';\n\nimport { pieChartclassNames } from './styled';\n\nexport const draw = (node: HTMLElement | null, props: PieChartProps): void => {\n const {\n data,\n padAngle,\n onClick,\n outerRadius,\n startAngle,\n endAngle,\n cornerRadius,\n margin,\n enableSlicesLabels,\n formatSliceLabel,\n slicesLabelsSkipAngle,\n enableSlicesLabelsName,\n formatSliceLabelName,\n borderWidth,\n borderColor,\n enableRadialLabels,\n backgroundColor,\n radialLabelsLinkHorizontalLength,\n radialLabelsTextXOffset,\n formatRadialLabel,\n radialLabelYOffset,\n svgElements,\n formatSliceTitle,\n radialAngleXOffset,\n withTooltip,\n fullChartTooltip,\n tooltipClassName,\n tooltipBind,\n renderTooltip,\n tooltipStyle,\n } = props;\n\n if (node !== null && data.length) {\n const marginTop = margin ? margin.top : 0;\n const marginRight = margin ? margin.right : 0;\n const marginBottom = margin ? margin.bottom : 0;\n const marginLeft = margin ? margin.left : 0;\n const { width: nodeWidth } = node.getBoundingClientRect();\n const width = props.width || nodeWidth;\n const defaultHeight = 240;\n const height = props.height || defaultHeight;\n const radius =\n (Math.min(width, height) -\n (borderWidth || 0) * 2 -\n (width > height\n ? marginTop + marginBottom\n : marginRight + marginLeft)) /\n 2;\n\n const svg = appendSvg(node, width, height);\n const global = svg\n .append('g')\n .attr('class', pieChartclassNames.pieGlobal)\n .attr(\n 'transform',\n `translate(${(width - (marginLeft + marginRight)) / 2 +\n marginLeft},${(height - (marginBottom + marginTop)) / 2 + marginTop})`\n );\n\n const maxPadAngle = 45;\n const dividerPadAngle = 100;\n const fullAngle = 360;\n\n const pie = d3\n .pie()\n .startAngle(-degreesToRadians(startAngle || 0))\n .endAngle(degreesToRadians(endAngle || fullAngle))\n .padAngle(\n padAngle\n ? Math.max(Math.min(padAngle / dividerPadAngle, maxPadAngle), 0)\n : 0\n )\n .sort(null)\n // @ts-ignore\n .value(({ value }) => value);\n\n // @ts-ignore\n const dataReady = pie(data) as PieChartDatum[];\n\n const maxOuterRadius = 0.95;\n const arc = d3\n .arc()\n .cornerRadius(cornerRadius || 0)\n .innerRadius(radius)\n .outerRadius(\n radius * Math.min(Math.max(outerRadius || 0, 0), maxOuterRadius)\n );\n\n if (typeof backgroundColor === 'string') {\n global\n .append('path')\n .attr('fill', backgroundColor)\n .attr('d', () =>\n // @ts-ignore\n arc({\n startAngle: degreesToRadians(0),\n endAngle: degreesToRadians(fullAngle),\n })\n );\n }\n\n const format = d3.format(',');\n const allSlices = global\n .selectAll('allSlices')\n .data(dataReady)\n .enter()\n .append('path')\n // @ts-ignore\n .attr('d', arc);\n\n allSlices\n .attr('class', pieChartclassNames.pieSlice)\n .attr('fill', ({ index }) => data[index].color || '')\n .attr('stroke', borderColor || '')\n .attr('stroke-width', borderWidth || 0)\n .attr('style', onClick ? 'cursor: pointer' : '')\n .on(\n 'click',\n // @ts-ignore\n (_, d) => onClick && onClick(data[d.index])\n )\n .append('svg:title')\n .text(d =>\n formatSliceTitle\n ? // @ts-ignore\n formatSliceTitle(d)\n : fullChartTooltip || withTooltip\n ? ''\n : `${data[d.index].name || ''} (${format(data[d.index].value)})`\n );\n\n if (enableSlicesLabels) {\n const text = global\n .selectAll('allSlices')\n .data(dataReady)\n .enter()\n .append('text')\n .attr('class', pieChartclassNames.pieSliceLabel)\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'central')\n .attr(\n 'transform',\n // @ts-ignore\n (d: PieChartDatum) => 'translate(' + arc.centroid(d) + ')'\n );\n\n text\n .append('tspan')\n .attr('class', pieChartclassNames.pieSliceLabelValue)\n // @ts-ignore\n .text((d: PieChartDatum) => {\n const deg = radiansToDegrees(d.endAngle - d.startAngle);\n\n if (!slicesLabelsSkipAngle || deg > slicesLabelsSkipAngle) {\n return formatSliceLabel ? formatSliceLabel(d) : d.value;\n }\n });\n\n if (enableSlicesLabelsName) {\n text\n .append('tspan')\n .attr('class', pieChartclassNames.pieSliceLabelName)\n // @ts-ignore\n .text((d: PieChartDatum) =>\n formatSliceLabelName ? formatSliceLabelName(d) : d.data.name\n )\n .attr('x', '0')\n .attr('dy', '1.2em');\n }\n }\n\n drawRadialLabels({\n arc,\n enableRadialLabels,\n global,\n radius,\n node,\n dataReady,\n translateX: (width - (marginLeft - marginRight)) / 2,\n translateY: (height + (marginTop - marginBottom)) / 2,\n radialLabelsLinkHorizontalLength,\n radialLabelsTextXOffset,\n formatRadialLabel,\n radialLabelYOffset,\n radialAngleXOffset,\n });\n\n if (withTooltip || fullChartTooltip) {\n drawTooltip({\n fullChartTooltip,\n global,\n data,\n tooltipClassName,\n tooltipBind,\n renderTooltip,\n allSlices,\n arc,\n tooltipStyle,\n width,\n height,\n radius,\n });\n }\n\n if (svgElements) {\n const html = ReactDOMServer.renderToString(svgElements);\n\n svg.append('g').html(html);\n }\n }\n};\n","import * as d3 from 'd3';\nimport ReactDOMServer from 'react-dom/server';\n\nimport { DrawRadialLabels } from './types';\nimport { PieChartDatum } from '../types';\n\nimport { pieChartclassNames } from '../styled';\nimport { getMidFactor, getAlign } from './helpers';\nimport { getTranslate } from '../../../common/components/labels';\n\nexport const drawRadialLabels = ({\n arc,\n enableRadialLabels,\n global,\n node,\n radius,\n dataReady,\n radialLabelsLinkHorizontalLength,\n formatRadialLabel,\n radialLabelsTextXOffset,\n translateX,\n translateY,\n radialLabelYOffset,\n radialAngleXOffset,\n}: DrawRadialLabels): void => {\n const d3container = d3.select(node);\n d3container.selectAll(`.${pieChartclassNames.pieRadialLabel}`).remove();\n\n if (enableRadialLabels) {\n const defaultRadialLabelsLinkHorizontalLength = 4;\n const outerArc = d3\n .arc()\n .innerRadius(radius)\n .outerRadius(radius);\n\n global\n .selectAll('allPolylines')\n .data(dataReady)\n .enter()\n .append('polyline')\n .attr('class', pieChartclassNames.pieRadialLink)\n .style('fill', 'none')\n .attr('points', (d: PieChartDatum) => {\n const midFactor = getMidFactor(d);\n const posA = arc.centroid(d);\n const posB = outerArc.centroid(d);\n const posC = outerArc.centroid(d);\n const posCPi = [\n (radius +\n (radialLabelsLinkHorizontalLength ||\n defaultRadialLabelsLinkHorizontalLength)) *\n midFactor,\n posC[1],\n ];\n return [\n [posA[0], posA[1]],\n [\n posB[0] + (radialAngleXOffset || 0) * midFactor,\n posB[1] - (radialLabelYOffset || 0) * d.index,\n ],\n [posCPi[0], posCPi[1] - (radialLabelYOffset || 0) * d.index],\n ];\n });\n\n const getPosition = (d: PieChartDatum): [number, number] => {\n const pos = outerArc.centroid(d);\n return [\n (radius +\n (radialLabelsLinkHorizontalLength ||\n defaultRadialLabelsLinkHorizontalLength)) *\n getMidFactor(d),\n pos[1],\n ];\n };\n\n const defaultRadialLabelsTextXOffset = 4;\n d3container\n .selectAll('allLabels')\n .data(dataReady)\n .enter()\n .append('div')\n // @ts-ignore\n .html((d: PieChartDatum) => {\n const html = ReactDOMServer.renderToString(\n // @ts-ignore\n formatRadialLabel ? formatRadialLabel(d) : d.data.name\n );\n\n return html;\n })\n .attr('class', pieChartclassNames.pieRadialLabel)\n // @ts-ignore\n .style('transform', (d: PieChartDatum) =>\n getTranslate({\n anchor: getAlign(d),\n index: d.index,\n translateX,\n translateY: translateY - (radialLabelYOffset || 0) * d.index,\n })\n )\n // @ts-ignore\n .style(\n 'left',\n // @ts-ignore\n (d: PieChartDatum) =>\n `${getPosition(d)[0] -\n (getAlign(d) === 'start'\n ? -(radialLabelsTextXOffset || defaultRadialLabelsTextXOffset)\n : radialLabelsTextXOffset || defaultRadialLabelsTextXOffset)}px`\n )\n // @ts-ignore\n .style('top', (d: PieChartDatum) => `${getPosition(d)[1]}px`)\n // @ts-ignore\n .style('text-align', getAlign);\n }\n};\n","import React from 'react';\nimport ReactDOMServer from 'react-dom/server';\nimport * as d3 from 'd3';\n\nimport { pieChartclassNames as classNames } from '../styled';\n\nimport { DrawTooltipProps } from './types';\n\nimport {\n TooltipContainer,\n TooltipFlex,\n TooltipItem,\n Value,\n Name,\n ColorBox,\n} from '../../../common/components/tooltips';\nimport { PieChartData, PieChartDatum } from '../types';\n\nexport const drawTooltip = ({\n fullChartTooltip,\n global,\n tooltipRoot,\n data,\n tooltipClassName,\n tooltipBind,\n renderTooltip,\n arc,\n allSlices,\n tooltipStyle,\n width,\n height,\n radius,\n}: DrawTooltipProps) => {\n const container: Element | null =\n tooltipRoot || document.querySelector('body');\n const format = d3.format(',');\n const pieTooltipContainer: d3.Selection<\n HTMLDivElement,\n unknown,\n null,\n undefined\n > = d3.select(container).select(`.${classNames.pieTooltipContainer}`);\n const isEmpty = pieTooltipContainer.empty();\n\n const tooltipContainer = isEmpty\n ? d3\n .select(container)\n .append('div')\n .attr(\n 'class',\n `${classNames.pieTooltipContainer} ${tooltipClassName || ''}`\n )\n .style('position', 'absolute')\n .style('opacity', '0')\n : pieTooltipContainer;\n\n if (tooltipStyle) {\n Object.entries(tooltipStyle).forEach(([prop, val]) =>\n tooltipContainer.style(prop, val)\n );\n }\n\n tooltipContainer.html('');\n let isVisible = false;\n\n const setVisible = (visible?: boolean) => {\n isVisible = Boolean(visible);\n const opacity = isVisible ? '1' : '0';\n tooltipContainer.style('opacity', opacity);\n };\n\n const setPosition = (event: any, pieChartDatum?: PieChartDatum) => {\n let [x, y] = d3.pointer(event, document);\n\n if (!tooltipBind && fullChartTooltip) {\n const [itemX, itemY] = d3.pointer(event, event.target);\n\n x = x - itemX;\n y = y - itemY;\n } else if (!tooltipBind) {\n const globalNode = global.node();\n const {\n x: itemX,\n y: itemY,\n width: itemWidth,\n height: itemHeight,\n } = globalNode\n ? globalNode.getBoundingClientRect()\n : { x: 0, y: 0, width: 0, height: 0 };\n const [arcX, arcY] = arc.centroid(pieChartDatum as d3.DefaultArcObject);\n x = itemX + itemWidth / 2 + arcX;\n y = itemY + itemHeight / 2 + arcY;\n }\n\n tooltipContainer.style('left', x + 'px').style('top', y + 'px');\n };\n\n const setTooltip = (event: any, pieChartDatum?: PieChartDatum) => {\n setVisible(true);\n setPosition(event, pieChartDatum);\n const pieChartData = pieChartDatum ? [pieChartDatum.data] : data;\n\n tooltipContainer.html(() => {\n const html = ReactDOMServer.renderToString(\n <TooltipFlex className={classNames.pieTooltipFlex}>\n <TooltipContainer className={classNames.pieTooltip}>\n {renderTooltip ? (\n renderTooltip(pieChartData)\n ) : (\n <>\n {pieChartData.map(\n ({ color, name, value }: PieChartData, index: number) => (\n <TooltipItem\n key={`${name}-${index}`}\n className={classNames.pieTooltipItem}\n >\n {color && (\n <ColorBox\n className={classNames.pieTooltipColorBox}\n style={{ backgroundColor: color }}\n />\n )}\n {name && (\n <Name className={classNames.pieTooltipName}>\n {name}\n </Name>\n )}\n <Value className={classNames.pieTooltipValue}>\n {format(value)}\n </Value>\n </TooltipItem>\n )\n )}\n </>\n )}\n </TooltipContainer>\n </TooltipFlex>\n );\n\n return html;\n });\n };\n\n if (fullChartTooltip) {\n global.on('mouseover.fulltooltip', event => setTooltip(event));\n global.on('mouseout.fulltooltip', () => {\n tooltipContainer.html('');\n setVisible();\n });\n\n if (width && height) {\n global\n .append('circle')\n .attr('class', classNames.pieFullChartTooltipCircle)\n .attr('r', radius)\n .attr('cx', 0)\n .attr('cy', 0);\n }\n\n if (!tooltipBind) {\n global.on('touchmove.tooltipBind mousemove.tooltipBind', event =>\n setPosition(event)\n );\n }\n } else {\n allSlices.on('mouseover.slice', setTooltip);\n if (!tooltipBind) {\n allSlices.on('touchmove.slice mousemove.slice', setPosition);\n }\n allSlices.on('mouseout.slice', () => {\n tooltipContainer.html('');\n setVisible();\n });\n }\n};\n","import React, { useEffect } from 'react';\n\nimport { PieChartProps } from './types';\n\nimport { useNode } from '../../hooks';\nimport { useResize } from '../../hooks';\n\nimport { draw } from './draw';\n\nimport { SvgWrapper } from './styled';\n\nexport const PieChart: React.FC<PieChartProps> = (\n props\n): React.ReactElement => {\n const { className, style, children } = props;\n const [ref, node] = useNode();\n\n useEffect(() => {\n node && draw(node, props);\n }, [node, props]);\n\n const onDraw = () => draw(node, props);\n\n useResize(props.width, onDraw);\n\n return (\n <div className={className} style={style}>\n <SvgWrapper ref={ref}>{children}</SvgWrapper>\n </div>\n );\n};\n\nPieChart.defaultProps = {\n data: [],\n startAngle: 0,\n endAngle: 360,\n slicesLabelsSkipAngle: 0,\n radialLabelYOffset: 16,\n radialAngleXOffset: 8,\n};\n","import * as d3 from 'd3';\n\nimport { Interpolator } from '../../common/types/interpolator';\nimport { GetLegendProps } from './types';\n\nconst defaultN = 256;\n\nexport const legendClassNames = {\n legendContainer: 'd3-legend-container',\n legendTitle: 'd3-legend-title',\n legendTick: 'd3-legend-tick',\n legendTickLine: 'd3-legend-tick-line',\n legendTickText: 'd3-legend-tick-text',\n};\n\nfunction ramp(color: Interpolator, n: number = defaultN) {\n const canvas = document.createElement('canvas');\n canvas.width = n;\n canvas.height = 1;\n const context = canvas.getContext('2d') as CanvasRenderingContext2D;\n\n for (let i = 0; i < n; ++i) {\n context.fillStyle = color(i / (n - 1));\n context.fillRect(i, 0, 1, 1);\n }\n\n return canvas;\n}\n\nexport const legendDefaultParams = {\n tickSize: 6,\n height: 44,\n width: 320,\n marginTop: 18,\n marginBottom: 16,\n ticksDivier: 64,\n titleMarginBottom: 6,\n};\n\nexport const getLegend = ({\n color,\n title,\n tickSize = legendDefaultParams.tickSize,\n width = legendDefaultParams.width,\n height = legendDefaultParams.height + tickSize,\n marginTop = legendDefaultParams.marginTop,\n marginRight = 0,\n marginBottom = legendDefaultParams.marginBottom + tickSize,\n marginLeft = 0,\n ticks = legendDefaultParams.width / legendDefaultParams.ticksDivier,\n tickFormat,\n tickValues,\n titleMarginBottom,\n}: GetLegendProps) => {\n const svg = d3\n .create('svg')\n .attr('width', width)\n .attr('height', height)\n // @ts-ignore\n .attr('viewBox', [0, 0, width, height])\n .style('overflow', 'visible')\n .style('display', 'block');\n\n let tickAdjust = (g: d3.Selection<SVGGElement, any, any, any>) => {\n const tick = g.selectAll('.tick');\n\n tick\n .selectAll('.tick line')\n .attr('y1', marginTop + marginBottom - height)\n .attr('class', legendClassNames.legendTickLine);\n tick.selectAll('.tick text').attr('class', legendClassNames.legendTickText);\n tick.attr('class', legendClassNames.legendTick);\n\n return tick;\n };\n let x: any;\n\n // Continuous\n if (color.interpolate) {\n const n = Math.min(color.domain().length, color.range().length);\n\n x = color\n .copy()\n .rangeRound(\n d3.quantize(d3.interpolate(marginLeft, width - marginRight), n)\n );\n\n svg\n .append('image')\n .attr('x', marginLeft)\n .attr('y', marginTop)\n .attr('class', legendClassNames.legendContainer)\n .attr('width', width - marginLeft - marginRight)\n .attr('height', height - marginTop - marginBottom)\n .attr('preserveAspectRatio', 'none')\n .attr(\n 'xlink:href',\n ramp(\n color.copy().domain(d3.quantize(d3.interpolate(0, 1), n))\n ).toDataURL()\n );\n }\n\n // Sequential\n else if (color.interpolator) {\n x = Object.assign(\n color\n .copy()\n .interpolator(d3.interpolateRound(marginLeft, width - marginRight)),\n {\n range() {\n return [marginLeft, width - marginRight];\n },\n }\n );\n\n svg\n .append('image')\n .attr('x', marginLeft)\n .attr('y', marginTop)\n .attr('width', width - marginLeft - marginRight)\n .attr('height', height - marginTop - marginBottom)\n .attr('preserveAspectRatio', 'none')\n .attr('xlink:href', ramp(color.interpolator()).toDataURL());\n\n // scaleSequentialQuantile doesn’t implement ticks or tickFormat.\n if (!x.ticks) {\n if (tickValues === undefined) {\n const n = Math.round(ticks + 1);\n tickValues = d3\n .range(n)\n .map(i => d3.quantile(color.domain(), i / (n - 1)));\n }\n if (typeof tickFormat !== 'function') {\n tickFormat = d3.format(tickFormat === undefined ? ',f' : tickFormat);\n }\n }\n }\n\n svg\n .append('g')\n .attr('transform', `translate(0,${height - marginBottom})`)\n .call(\n d3\n .axisBottom(x)\n .ticks(ticks, typeof tickFormat === 'string' ? tickFormat : undefined)\n // @ts-ignore\n .tickFormat(typeof tickFormat === 'function' ? tickFormat : undefined)\n .tickSize(tickSize)\n // @ts-ignore\n .tickValues(tickValues)\n )\n .call(tickAdjust)\n .call(g => g.select('.domain').remove())\n .call(g =>\n g\n .append('text')\n .attr('x', marginLeft)\n .attr('class', legendClassNames.legendTitle)\n .attr(\n 'y',\n marginTop +\n marginBottom -\n height -\n (titleMarginBottom || legendDefaultParams.titleMarginBottom)\n )\n .attr('fill', 'currentColor')\n .attr('text-anchor', 'start')\n .attr('font-weight', 'bold')\n .text(title as string)\n );\n\n return svg;\n};\n","import styled from 'styled-components';\n\nimport { Wrapper } from '../../common/components/Wrapper';\nimport { legendClassNames } from '../../helpers/getLegend';\n\nexport const calendarChartClassNames = {\n calendarChart: 'calendarChart',\n calendarYear: 'calendarYear',\n calendarAxis: 'calendarAxis',\n calendarBody: 'calendarBody',\n calendarHeader: 'calendarHeader',\n calendarYearTitle: 'calendarYearTitle',\n calendarWeekDay: 'calendarWeekDay',\n calendarMonth: 'calendarMonth',\n calendarDays: 'calendarDays',\n calendarDay: 'calendarDay',\n ...legendClassNames,\n};\n\nconst headerHeight = '20px';\n\nexport const SvgWrapper = styled(Wrapper)`\n .${calendarChartClassNames.calendarYear} {\n display: flex;\n margin-bottom: 16px;\n }\n .${calendarChartClassNames.calendarYearTitle} {\n display: inline-flex;\n align-items: flex-end;\n height: ${headerHeight};\n margin-bottom: 4px;\n font-weight: bold;\n }\n .${calendarChartClassNames.calendarHeader} {\n height: ${headerHeight};\n margin-bottom: 4px;\n position: relative;\n display: flex;\n }\n .${calendarChartClassNames.calendarMonth} {\n font-size: 14px;\n bottom: 0;\n position: absolute;\n }\n .${calendarChartClassNames.calendarAxis} {\n display: flex;\n flex-direction: column;\n margin-right: 10px;\n }\n .${calendarChartClassNames.calendarWeekDay} {\n font-size: 12px;\n display: inline-flex;\n align-items: center;\n justify-content: flex-end;\n }\n .${calendarChartClassNames.calendarDays} {\n position: relative;\n }\n .${calendarChartClassNames.calendarDay} {\n position: absolute;\n }\n`;\n","import React, { useEffect } from 'react';\n\nimport { CalendarChartProps } from './types';\n\nimport { useNode } from '../../hooks';\n\nimport { draw } from './draw';\n\nimport { SvgWrapper } from './styled';\n\nexport const CalendarChart: React.FC<CalendarChartProps> = (\n props\n): React.ReactElement => {\n const {\n className,\n style,\n children,\n data,\n startSunday,\n weekdays,\n cellOffset,\n cellSize,\n interpolator,\n monthSpacing,\n colorRange,\n legendProps,\n } = props;\n const [ref, node] = useNode();\n\n useEffect(() => {\n node && draw(node, props);\n // eslint-disable-next-line\n }, [\n node,\n data,\n startSunday,\n weekdays,\n cellOffset,\n cellSize,\n interpolator,\n monthSpacing,\n colorRange,\n legendProps,\n ]);\n\n return (\n <SvgWrapper ref={ref} className={className} style={style}>\n {children}\n </SvgWrapper>\n );\n};\n\nCalendarChart.defaultProps = {\n data: [],\n};\n","import * as d3 from 'd3';\n\nimport { Interpolator } from '../../common/types/interpolator';\nimport { CalendarChartProps, CalendarChartData } from './types';\n\nimport { getLegend } from '../../helpers/getLegend';\n\nimport { calendarChartClassNames } from './styled';\n\nexport const draw = (\n node: HTMLElement | null,\n props: CalendarChartProps\n): void => {\n const {\n data,\n startSunday,\n weekdays,\n interpolator,\n monthSpacing,\n onEachDay,\n colorRange,\n legendProps,\n } = props;\n\n if (node !== null && data.length) {\n const years: Map<number, CalendarChartData[]> = d3.group(data, d =>\n d.date.getUTCFullYear()\n );\n const cellOffset =\n typeof props.cellOffset === 'number' ? props.cellOffset : 0;\n const weekDays = 7;\n const defaultCellSize = 18;\n const cellSize = props.cellSize || defaultCellSize;\n const countDay = (i: number) =>\n startSunday ? i : (i + (weekDays - 1)) % weekDays;\n const days = weekdays || ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'];\n const sundayIndex = 6;\n const formatDay = (i: number) =>\n startSunday ? days[i] : i === sundayIndex ? days[0] : days[i + 1];\n const formatDate = d3.utcFormat('%x');\n const timeWeek = startSunday ? d3.utcSunday : d3.utcMonday;\n const getTimeWeekCount = (from: Date, to: Date) =>\n timeWeek.count(d3.utcYear(from), to);\n const getMonthSpacing = (date: Date) =>\n date.getUTCMonth() * (monthSpacing || 0);\n const formatMonth = d3.utcFormat('%b');\n const max = d3.max(data.map(({ value }) => value)) as number;\n const min = d3.min(data.map(({ value }) => value)) as number;\n\n const color = colorRange\n ? d3\n .scaleLinear()\n .domain([min, max])\n // @ts-ignore\n .range(colorRange)\n : d3\n .scaleSequential(interpolator || d3.interpolateGreens)\n .domain([min, +max]);\n\n let chartWidth = 0;\n\n years.forEach((values, year) => {\n const min = new Date(year, 1);\n const max = d3.max(values.map(d => d.date)) as Date;\n const months = max.getUTCMonth() - min.getUTCMonth();\n const weekCount = getTimeWeekCount(min, max) + 1;\n const width =\n weekCount * (cellSize + cellOffset) + (monthSpacing || 0) * months;\n\n chartWidth = Math.max(chartWidth, width);\n });\n\n d3.select(node)\n .select(`.${calendarChartClassNames.calendarChart}`)\n .remove();\n\n const container = d3\n .select(node)\n .append('div')\n .attr('class', calendarChartClassNames.calendarChart);\n\n const year = container\n .selectAll('div')\n // @ts-ignore\n .data(years)\n .join('div')\n .attr('class', calendarChartClassNames.calendarYear);\n\n const calendarWeekdays = year\n .append('div')\n .attr('class', calendarChartClassNames.calendarAxis);\n\n calendarWeekdays\n .append('div')\n .attr('class', calendarChartClassNames.calendarYearTitle)\n // @ts-ignore\n .text(([key]) => key);\n\n calendarWeekdays\n .selectAll('span')\n .data(d3.range(weekDays))\n .join('div')\n .attr('class', calendarChartClassNames.calendarWeekDay)\n .style('height', cellSize + 'px')\n .style('margin-bottom', cellOffset + 'px')\n .text(formatDay);\n\n const body = year\n .append('div')\n .attr('class', calendarChartClassNames.calendarBody);\n\n const header = body\n .append('div')\n .attr('class', calendarChartClassNames.calendarHeader);\n\n header\n .selectAll('div')\n // @ts-ignore\n .data(([_, values]) => {\n const fullYearlastMonth = 12;\n const fullYearlastDate = 31;\n\n return d3.utcMonths(\n d3.utcMonth(new Date(values[0].date.getUTCFullYear(), 1, 1)),\n d3.utcMonth(\n new Date(\n values[0].date.getUTCFullYear(),\n fullYearlastMonth,\n fullYearlastDate\n )\n )\n );\n })\n .join('div')\n .attr('class', calendarChartClassNames.calendarMonth)\n .style(\n 'left',\n (d: any) =>\n getTimeWeekCount(d, timeWeek.ceil(d)) * (cellSize + cellOffset) +\n getMonthSpacing(d) +\n 'px'\n )\n // @ts-ignore\n .text(formatMonth);\n\n // @ts-ignore\n body\n .append('div')\n .attr('class', calendarChartClassNames.calendarDays)\n .style('height', (cellSize + cellOffset) * weekDays + 'px')\n .style('width', chartWidth + 'px')\n .selectAll('div')\n // @ts-ignore\n .data(([, values]) => values)\n .join('div')\n // @ts-ignore\n .each((data: CalendarChartData, index, elements) => {\n if (onEachDay) {\n const element = elements[index] as HTMLDivElement;\n const currColor = color(data.value) as string;\n\n onEachDay(data, element, currColor);\n }\n })\n .attr('class', calendarChartClassNames.calendarDay)\n .style('width', cellSize + 'px')\n .style('height', cellSize + 'px')\n // @ts-ignore\n .style(\n 'left',\n (d: any) =>\n getTimeWeekCount(d.date, d.date) * (cellSize + cellOffset) +\n getMonthSpacing(d.date) +\n 'px'\n )\n .style(\n 'top',\n // @ts-ignore\n d => countDay(d.date.getUTCDay()) * (cellSize + cellOffset) + 'px'\n )\n // @ts-ignore\n .style('background-color', d => color(d.value))\n // @ts-ignore\n .attr('title', d => `${formatDate(d.date)} - ${d.value}`);\n\n if (typeof legendProps === 'object') {\n const legend = getLegend({\n color: color as Interpolator,\n ...legendProps,\n });\n\n const containerNode = container.node() as HTMLDivElement;\n const legendSvg = legend.node() as SVGElement;\n\n containerNode.appendChild(legendSvg);\n }\n }\n};\n","import * as d3 from 'd3';\n\nexport function computeDimensions(\n selection: d3.Selection<any, any, any, any>\n): SVGRect | DOMRect {\n let dimensions;\n const node = selection.node();\n\n if (node instanceof SVGGraphicsElement) {\n // check if node is svg element\n dimensions = node.getBBox();\n } else {\n // else is html element\n dimensions = node.getBoundingClientRect();\n }\n\n return dimensions;\n}\n","export function none() {\n return;\n}\n\nexport function isVoid(value: any) {\n return value === undefined || value === null || Number.isNaN(value);\n}\n","import styled, { createGlobalStyle } from 'styled-components';\n\nimport { Wrapper } from '../../common/components/Wrapper';\n\nexport const lineChartClassNames = {\n lineChartYScaleGlobal: 'lineChartYScaleGlobal',\n lineChartXScaleGlobal: 'lineChartXScaleGlobal',\n lineChartLinesGlobal: 'lineChartLinesGlobal',\n lineChartLine: 'lineChartLine',\n lineChartAreasGlobal: 'lineChartAreasGlobal',\n lineChartArea: 'lineChartArea',\n lineChartDotsGlobalContainer: 'lineChartDotsGlobalContainer',\n lineChartDotsGlobal: 'lineChartDotsGlobal',\n lineChartDot: 'lineChartDot',\n lineChartGridGlobal: 'lineChartGridGlobal',\n lineChartGridLineX: 'lineChartGridLineX',\n lineChartGridLineY: 'lineChartGridLineY',\n lineChartLabelContainer: 'lineChartLabelContainer',\n lineChartLabelFlex: 'lineChartLabelFlex',\n lineChartLabel: 'lineChartLabel',\n lineChartMouseGlobal: 'lineChartMouseGlobal',\n lineChartMouseLine: 'lineChartMouseLine',\n lineChartMouseRect: 'lineChartMouseRect',\n lineChartMouseCircle: 'lineChartMouseCircle',\n lineChartMouseLabelContainer: 'lineChartMouseLabelContainer',\n lineChartMouseLabel: 'lineChartMouseLabel',\n};\n\nexport const SvgWrapper = styled(Wrapper)`\n .${lineChartClassNames.lineChartYScaleGlobal},\n .${lineChartClassNames.lineChartXScaleGlobal},\n .${lineChartClassNames.lineChartGridGlobal} {\n shape-rendering: crispEdges;\n }\n .${lineChartClassNames.lineChartLinesGlobal} {\n fill: none;\n stroke: steelblue;\n stroke-width: 1.5px;\n stroke-linejoin: round;\n stroke-linecap: round;\n }\n .${lineChartClassNames.lineChartArea} {\n fill-opacity: 0.24;\n }\n .${lineChartClassNames.lineChartGridLineX},\n .${lineChartClassNames.lineChartGridLineY},\n .${lineChartClassNames.lineChartMouseLine} {\n stroke: rgba(149, 149, 149, 0.24);\n }\n .${lineChartClassNames.lineChartMouseLine},\n .${lineChartClassNames.lineChartMouseCircle} {\n transition: opacity linear 200ms;\n pointer-events: none;\n stroke-width: 1px;\n }\n .${lineChartClassNames.lineChartDot} {\n stroke: #fff;\n stroke-width: 2px;\n }\n .${lineChartClassNames.lineChartMouseLine} {\n shape-rendering: crispEdges;\n }\n .${lineChartClassNames.lineChartMouseRect} {\n fill: none;\n pointer-events: all;\n }\n`;\n\nexport const TooltipStyles = createGlobalStyle`\n .${lineChartClassNames.lineChartMouseLabel} {\n transition: opacity linear 200ms;\n z-index: 1;\n .${lineChartClassNames.lineChartLabelFlex} {\n justify-content: flex-start;\n align-items: center;\n pointer-events: none;\n }\n .${lineChartClassNames.lineChartLabel} {\n margin: 0 0 0 10px;\n }\n }\n`;\n","import styled from 'styled-components';\n\nexport const LabelContainer = styled.div`\n width: 0;\n height: 0;\n display: flex;\n align-items: flex-end;\n justify-content: center;\n font-size: 12px;\n white-space: nowrap;\n`;\n\nexport const Label = styled.div`\n margin-bottom: 4px;\n`;\n","import * as d3 from 'd3';\n\nimport { LineChartProps, LineChartData, LineChartDot } from './types';\n\nimport { computeDimensions } from '../../helpers/computeDimensions';\nimport { appendSvg } from '../../helpers';\nimport { none } from '../../helpers/common';\nimport { stackedData } from '../../helpers/stackedData';\nimport { drawGrid } from './drawGrid';\nimport { drawLabel, labelClassName } from './drawLabel';\nimport { drawTooltip } from './drawTooltip';\n\nimport { lineChartClassNames } from './styled';\n\nexport const draw = (node: HTMLElement | null, props: LineChartProps): void => {\n const {\n data: chartData,\n labels,\n margin,\n customYAxisSelection,\n customXAxisSelection,\n customYAxis,\n customXAxis,\n curve,\n yAxisPadding,\n xAxisPadding,\n drawGridY,\n drawGridX,\n withLabels,\n formatLabel,\n eachLabel,\n stacked,\n dynamicTooltipEnable,\n dynamicCircleRadius,\n formatDynamicTooltip,\n renderTooltip,\n stackedTooltip,\n stackedTooltipIndex,\n tooltipLineTop,\n customize,\n customYScale,\n customLine,\n tooltipClassName,\n xScaleItemWidth,\n areaCurve,\n } = props;\n\n if (node !== null && chartData.length) {\n const data = stacked ? stackedData(chartData) : chartData;\n const marginTop = margin ? margin.top : 0;\n const marginRight = margin ? margin.right : 0;\n const marginBottom = margin ? margin.bottom : 0;\n const marginLeft = margin ? margin.left : 0;\n const { width: nodeWidth } = node.getBoundingClientRect();\n const width = props.width || nodeWidth;\n const height = props.height || 0;\n const min =\n typeof props.min === 'number'\n ? props.min\n : d3.min(data, ({ values }) => d3.min(values as number[]));\n const max =\n typeof props.max === 'number'\n ? props.max\n : d3.max(data, ({ values }) => d3.max(values as number[]));\n\n const svg = appendSvg(node, width, height || 0);\n\n const yScale = d3\n .scaleLinear()\n .domain([min || 0, max || 0])\n .range([\n height - marginTop - marginBottom - (xAxisPadding || 0),\n marginTop,\n ])\n .nice();\n\n customYScale && customYScale(yScale);\n\n const yTicksCountDefault = 8;\n const yAxisLeft = d3.axisLeft(yScale).ticks(yTicksCountDefault);\n\n customYAxis && customYAxis(yAxisLeft);\n\n const yTicksCount = yAxisLeft.tickArguments()[0];\n\n const yAxis = svg\n .append('g')\n .attr('class', lineChartClassNames.lineChartYScaleGlobal)\n .call(yAxisLeft)\n .call(customYAxisSelection ? customYAxisSelection : none);\n const { width: yAxisWidth } = computeDimensions(yAxis);\n\n yAxis.attr('transform', `translate(${marginLeft + yAxisWidth}, 0)`);\n\n /** xScale **/\n const lastIndex =\n labels && labels.length\n ? labels.length - 1\n : data.reduce((acc, { values }) => Math.max(acc, values.length), 0) - 1;\n\n const xScale = d3\n .scaleLinear()\n .domain([0, lastIndex])\n .range([\n marginLeft + yAxisWidth + (yAxisPadding || 0),\n width - marginRight,\n ]);\n\n const xAxisBottom = d3\n .axisBottom(xScale)\n .tickFormat((value: d3.NumberValue) =>\n // @ts-ignore\n labels && labels.length > 0 ? labels[value] : 0\n )\n .ticks(lastIndex);\n\n if (typeof xScaleItemWidth === 'number') {\n const [x1, x2] = xScale.range();\n const chartWidth = x2 - x1;\n\n xAxisBottom\n .ticks(Math.round(chartWidth / xScaleItemWidth))\n .tickSizeOuter(0);\n }\n\n customXAxis && customXAxis(xAxisBottom);\n\n drawGrid({\n svg,\n yScale,\n xScale,\n yTicksCount,\n lastIndex,\n drawGridY,\n drawGridX,\n });\n\n if (Array.isArray(labels) && labels.length > 0) {\n const xAxis = svg\n .append('g')\n .call(customXAxisSelection ? customXAxisSelection : none)\n .attr('class', lineChartClassNames.lineChartXScaleGlobal)\n .call(xAxisBottom);\n\n const { height: xAxisHeight } = computeDimensions(xAxis);\n\n xAxis.attr(\n 'transform',\n `translate(0, ${height - Math.ceil(xAxisHeight) - marginBottom})`\n );\n }\n\n const line = d3\n .line()\n .defined(d => d !== null)\n .x((_, index) => xScale(index))\n .y((d: unknown) => yScale(d as d3.NumberValue))\n .curve(curve || d3.curveLinear);\n\n customLine && customLine(line);\n\n const withAreas = data.some(({ fill }) => fill);\n\n if (withAreas) {\n let dataIndex = -2;\n\n const getArea = (d: LineChartData): d3.Area<[number, number]> => {\n const { minAreaValues } = d;\n const minTick = yScale.ticks()[0];\n\n return d3\n .area()\n .defined(d => d !== null)\n .x((_, index) => xScale(index))\n .y0((value: unknown, index) => {\n if (index === 0) {\n dataIndex = dataIndex + 1;\n }\n\n let minValue: number = minTick;\n\n if (minAreaValues && typeof minAreaValues[index] === 'number') {\n minValue = minAreaValues[index] || minValue;\n } else if (minAreaValues) {\n minValue = yScale(\n (minValue - (value as number)) as d3.NumberValue\n );\n }\n\n const currData = data[dataIndex];\n\n return stacked\n ? dataIndex > -1\n ? yScale(\n typeof currData.values[index] !== 'number'\n ? 0\n : (currData.values[index] as number)\n )\n : yScale(minValue)\n : yScale(minValue);\n })\n .y1((d: unknown) => yScale(d as d3.NumberValue))\n .curve(areaCurve || curve || d3.curveLinear);\n };\n\n svg\n .append('g')\n .attr('class', lineChartClassNames.lineChartAreasGlobal)\n .selectAll('path')\n .data(data.filter(({ fill }) => Boolean(fill)))\n .join('path')\n .attr('class', lineChartClassNames.lineChartArea)\n .attr('d', (d: LineChartData) => {\n const area = getArea(d);\n\n return area((d.values as unknown) as [number, number][]);\n })\n .attr('fill', ({ fill }) => fill || 'none')\n .attr('style', ({ areaStyle }) => areaStyle || '');\n }\n\n svg\n .append('g')\n .attr('class', lineChartClassNames.lineChartLinesGlobal)\n .selectAll('path')\n .data(data)\n .join('path')\n .attr('class', lineChartClassNames.lineChartLine)\n .attr('d', (d: LineChartData | any) => line(d.values))\n .attr('stroke', ({ stroke }) => stroke || 'steelblue')\n .attr('style', ({ style }) => style || '');\n\n const dots = data.filter(({ dot }) => dot) as (Omit<\n LineChartData,\n 'dot'\n > & {\n dot: LineChartDot;\n })[];\n\n if (dots.length > 0) {\n const dotsGlobal = svg\n .append('g')\n .attr('class', lineChartClassNames.lineChartDotsGlobalContainer);\n\n dots.forEach(item => {\n const { values, dot } = item;\n const { radius, style, filter } = dot;\n\n const dotsGroup = dotsGlobal\n .append('g')\n .attr('class', lineChartClassNames.lineChartDotsGlobal);\n\n dotsGroup\n .selectAll('circle')\n .data(values)\n .join('circle')\n .attr('cx', (_, index) => xScale(index))\n .attr('class', lineChartClassNames.lineChartDot)\n .attr('cy', d => yScale(d as d3.NumberValue))\n .attr('r', radius || 0)\n .attr('style', style || '');\n\n if (filter) {\n dotsGroup\n .selectAll('circle')\n .select((_, i, g) => (filter(item, i, g) ? g[i] : null))\n .remove();\n }\n });\n }\n\n d3.select(node)\n .select(`.${labelClassName}`)\n .remove();\n withLabels &&\n drawLabel({ node, eachLabel, data, yScale, xScale, formatLabel });\n\n if (dynamicTooltipEnable) {\n drawTooltip({\n tooltipLineTop,\n stackedTooltip,\n renderTooltip,\n stackedTooltipIndex,\n formatDynamicTooltip,\n node,\n svg,\n data,\n xScale,\n yScale,\n dynamicCircleRadius,\n tooltipClassName,\n });\n }\n\n customize && customize({ svg, yScale, xScale });\n }\n};\n","import { LineChartData } from '../charts/LineChart/types';\n\nexport const stackedData = (data: LineChartData[]) => {\n const stacks: { [key: string]: { [key: string]: number } } = {};\n\n return data.map((item, index) => {\n stacks[index] = {};\n\n if (index > 0) {\n return {\n ...item,\n values: item.values.map((value, valuesIndex) => {\n const prevValue = stacks[index - 1][valuesIndex];\n stacks[index][valuesIndex] = Number(\n (typeof prevValue !== 'number' ? 0 : Math.abs(prevValue)) +\n (typeof value !== 'number' ? 0 : Math.abs(value))\n );\n\n return stacks[index][valuesIndex];\n }),\n };\n } else {\n item.values.forEach((value, valuesIndex) => {\n stacks[index][valuesIndex] = Number(value);\n });\n }\n\n return item;\n });\n};\n","import { DrawGridProps } from './types';\n\nimport { lineChartClassNames } from '../styled';\n\nexport const drawGrid = ({\n svg,\n yScale,\n xScale,\n yTicksCount,\n lastIndex,\n drawGridX,\n drawGridY,\n}: DrawGridProps) => {\n if (!drawGridY && !drawGridX) return;\n\n const global = svg\n .append('g')\n .attr('class', lineChartClassNames.lineChartGridGlobal);\n\n const yTicks = yScale.ticks(yTicksCount);\n\n if (drawGridX) {\n global\n .append('g')\n .selectAll('line')\n .data(yTicks)\n .join('line')\n .attr('class', lineChartClassNames.lineChartGridLineX)\n .attr('x1', () => xScale(0))\n .attr('x2', () => xScale(lastIndex))\n .attr('y1', (d: number) => Math.round(yScale(d)))\n .attr('y2', (d: number) => Math.round(yScale(d)));\n }\n\n if (drawGridY) {\n global\n .append('g')\n .selectAll('line')\n .data(Array.from({ length: lastIndex + 1 }, (_, index) => index))\n .join('line')\n .attr('class', lineChartClassNames.lineChartGridLineY)\n .attr('x1', (_, index: number) => Math.round(xScale(index) as number))\n .attr('x2', (_, index: number) => Math.round(xScale(index) as number))\n .attr('y1', () => Math.round(yScale(yTicks[0]) as number))\n .attr('y2', () =>\n Math.round(yScale(yTicks[yTicks.length - 1]) as number)\n );\n }\n};\n","import React from 'react';\nimport * as d3 from 'd3';\nimport ReactDOMServer from 'react-dom/server';\n\nimport { DrawLabelProps } from './types';\n\nimport { none } from '../../../helpers/common';\n\nimport { lineChartClassNames } from '../styled';\nimport { LabelContainer, Label } from './styled';\n\nexport const labelClassName = 'd3-chart-label';\n\nexport const drawLabel = ({\n node,\n data,\n yScale,\n xScale,\n formatLabel,\n eachLabel,\n}: DrawLabelProps) => {\n const labelsDiv = d3\n .select(node)\n .append('div')\n .attr('class', labelClassName);\n const format = d3.format(',');\n\n // @ts-ignore\n data.forEach(({ values }: { values: number[] }) => {\n labelsDiv\n .append('div')\n .selectAll('div')\n .data(values)\n .join('div')\n .attr('class', lineChartClassNames.lineChartLabelContainer)\n .style('position', 'absolute')\n .style('left', (_, index) => xScale(index) + 'px')\n .style('top', d => yScale(d) + 'px')\n .html((d: number, index, elements: any) => {\n const html = ReactDOMServer.renderToString(\n <LabelContainer className={lineChartClassNames.lineChartLabelFlex}>\n <Label className={lineChartClassNames.lineChartLabel}>\n {formatLabel ? formatLabel(d, index, elements) : format(d)}\n </Label>\n </LabelContainer>\n );\n\n return html;\n })\n // @ts-ignore\n .each(eachLabel ? eachLabel : none);\n });\n};\n","import React from 'react';\nimport * as d3 from 'd3';\nimport ReactDOMServer from 'react-dom/server';\n\nimport { DrawTooltipProps } from './types';\n\nimport { isVoid } from '../../../helpers/common';\n\nimport { lineChartClassNames } from '../styled';\nimport { Label, LabelContainer } from '../drawLabel/styled';\n\nexport const drawTooltip = ({\n svg,\n node,\n data: argData,\n xScale,\n yScale,\n dynamicCircleRadius,\n formatDynamicTooltip,\n renderTooltip,\n stackedTooltipIndex,\n stackedTooltip,\n tooltipLineTop,\n tooltipRoot,\n tooltipClassName,\n}: DrawTooltipProps) => {\n const container: Element | null =\n tooltipRoot || document.querySelector('body');\n const format = d3.format(',');\n const chartData = argData.filter(({ tooltipOff }) => !tooltipOff);\n\n const data =\n typeof stackedTooltipIndex === 'number'\n ? [chartData[stackedTooltipIndex]]\n : stackedTooltip\n ? [chartData[0]]\n : chartData;\n const [x1, x2] = xScale.range();\n const [y1, y2] = yScale.range();\n\n const mouseGlobal = svg\n .append('g')\n .attr('class', lineChartClassNames.lineChartMouseGlobal);\n const mouseRect = mouseGlobal\n .append('rect')\n .attr('width', x2 - x1)\n .attr('height', Math.abs(y1 - y2))\n .attr('class', lineChartClassNames.lineChartMouseRect)\n .attr('transform', `translate(${x1}, ${y2})`);\n const mouseLine = mouseGlobal\n .append('path')\n .attr('class', lineChartClassNames.lineChartMouseLine)\n .style('opacity', '0');\n\n const lines = svg\n .selectAll(`.${lineChartClassNames.lineChartLine}`)\n .nodes() as SVGPathElement[];\n\n const circles = mouseGlobal\n .selectAll('circle')\n .data(chartData.filter(({ dynamicDotOff }) => !dynamicDotOff))\n .join('circle')\n .attr('class', lineChartClassNames.lineChartMouseCircle)\n .attr('r', dynamicCircleRadius as number)\n .attr('fill', ({ stroke }) => stroke || 'none')\n .attr('stroke', ({ stroke }) => stroke || 'none')\n .style('opacity', '0');\n\n let labelContainer: d3.Selection<any, unknown, any, any> = d3.select(\n `.${lineChartClassNames.lineChartMouseLabelContainer}`\n );\n\n if (labelContainer.size() === 0) {\n labelContainer = d3\n .select(container)\n .append('div')\n .attr('class', lineChartClassNames.lineChartMouseLabelContainer);\n }\n\n let labels: d3.Selection<any, any, any, any> | null = null;\n\n let isVisible = false;\n\n const setVisible = (visible?: boolean) => {\n isVisible = Boolean(visible);\n const opacity = isVisible ? '1' : '0';\n mouseLine.style('opacity', opacity);\n circles.style('opacity', opacity);\n labels && labels.style('opacity', opacity);\n };\n\n const mouseMove = (event: MouseEvent | TouchEvent) => {\n const [docX, docY] = d3.pointer(event, document);\n const [rectrX] = d3.pointer(event, mouseRect);\n const [nodeX, nodeY] = d3.pointer(event, node);\n const x = rectrX - (rectrX - nodeX);\n const left = nodeX + (docX - nodeX);\n const currIndex = Math.abs(xScale.invert(x));\n const positions: { [key: string]: { x: number; y: number } } = {};\n\n const getValue = (values: (number | null)[]) =>\n !isVoid(values[Math.floor(currIndex + 1)])\n ? values[Math.floor(currIndex)]\n : null;\n\n lines.forEach((line, index) => {\n let pos = {\n x: 0,\n y: 0,\n };\n\n if (!line.hasAttribute('d') || argData[index].tooltipOff) {\n positions[index] = pos;\n return;\n }\n\n let beginning = 0;\n let end = line.getTotalLength();\n let target = null;\n\n while (true) {\n target = Math.floor((beginning + end) / 2);\n pos = line.getPointAtLength(target);\n if ((target === end || target === beginning) && pos.x !== x) {\n break;\n }\n if (pos.x > x) end = target;\n else if (pos.x < x) beginning = target;\n else break;\n }\n\n positions[index] = pos;\n });\n\n circles\n .attr('transform', (lineChartData, index) => {\n const value = getValue(lineChartData.values);\n\n return positions[index] && value\n ? 'translate(' + x + ',' + positions[index].y + ')'\n : 'translate(-9999, -9999)';\n })\n .attr('style', ({ dynamicDotStyle }) => dynamicDotStyle || '');\n\n const datas = chartData.map(({ values, ...rest }, i) => ({\n ...rest,\n value: getValue(values),\n invertValue: positions[i] ? yScale.invert(positions[i].y) : 0,\n }));\n\n const noHasData = datas.every(({ value }) => isVoid(value));\n\n if (noHasData && isVisible) {\n setVisible();\n } else if (!isVisible && !noHasData) {\n setVisible(true);\n }\n\n const topIndex = Object.keys(positions).reduce((acc, key, index) => {\n const prevValue = datas[Number(acc)]?.value;\n const value = datas[Number(key)]?.value;\n const dynamicDotOff = argData?.[index].dynamicDotOff;\n\n return index === 0 || isVoid(value) || dynamicDotOff\n ? acc\n : isVoid(prevValue) || positions[acc].y > positions[key].y\n ? key\n : acc;\n }, '0');\n\n const labelTexts =\n labels &&\n labels\n .style('left', `${left}px`)\n .style('top', (_, i) => {\n const index =\n typeof stackedTooltipIndex === 'number'\n ? stackedTooltipIndex\n : stackedTooltip\n ? topIndex\n : i;\n\n return `${positions[index] && positions[index].y + (docY - nodeY)}px`;\n })\n .select(`.${lineChartClassNames.lineChartLabel}`);\n\n if (renderTooltip && labels) {\n labels.html((_, index) => {\n const html = ReactDOMServer.renderToString(\n <LabelContainer className={lineChartClassNames.lineChartLabelFlex}>\n {renderTooltip(datas, {\n indexX: Math.round(currIndex),\n indexY: index,\n svg,\n event,\n })}\n </LabelContainer>\n );\n\n return html;\n });\n } else {\n labelTexts &&\n labelTexts.text((_, i) => {\n const value = datas[i].value;\n const invertValue = datas[i].invertValue;\n\n return formatDynamicTooltip\n ? formatDynamicTooltip(invertValue, value)\n : format(invertValue);\n });\n }\n\n mouseLine.attr('d', () => {\n let d = 'M' + x + ',' + y1;\n d += ' ' + x + ',' + (tooltipLineTop ? y2 : positions[topIndex]?.y || 0);\n return d;\n });\n };\n\n mouseRect.on('mouseover.tooltip', event => {\n labels = labelContainer\n .selectAll('div')\n .data(data)\n .join('div')\n .attr(\n 'class',\n `${lineChartClassNames.lineChartMouseLabel} ${tooltipClassName || ''}`\n )\n .style('opacity', '0')\n .style('position', 'absolute')\n .html(() => {\n const html = ReactDOMServer.renderToString(\n <LabelContainer className={lineChartClassNames.lineChartLabelFlex}>\n <Label className={lineChartClassNames.lineChartLabel} />\n </LabelContainer>\n );\n\n return html;\n });\n\n mouseMove(event);\n });\n\n mouseRect.on('mouseout.tooltip', () => {\n d3.select(`.${lineChartClassNames.lineChartMouseLabelContainer}`)\n .selectAll('*')\n .remove();\n setVisible();\n });\n\n mouseRect.on('touchmove.tooltip mousemove.tooltip', mouseMove);\n};\n","import React, { useEffect } from 'react';\n\nimport { LineChartProps } from './types';\n\nimport { useNode } from '../../hooks';\nimport { useResize } from '../../hooks';\n\nimport { draw } from './draw';\n\nimport { SvgWrapper, TooltipStyles } from './styled';\n\nexport const LineChart: React.FC<LineChartProps> = (\n props\n): React.ReactElement => {\n const { className, style, children } = props;\n const [ref, node] = useNode();\n\n useEffect(() => {\n node && draw(node, props);\n }, [node, props]);\n\n const onDraw = () => draw(node, props);\n\n useResize(props.width, onDraw);\n\n return (\n <div className={className} style={style}>\n <TooltipStyles />\n <SvgWrapper ref={ref}>{children}</SvgWrapper>\n </div>\n );\n};\n\nLineChart.defaultProps = {\n data: [],\n labels: [],\n height: 240,\n yAxisPadding: 10,\n xAxisPadding: 20,\n margin: {\n top: 10,\n right: 10,\n bottom: 10,\n left: 0,\n },\n dynamicCircleRadius: 4,\n stackedTooltip: false,\n};\n","import * as d3 from 'd3';\n\nimport { BarChartLinetData } from '../types';\nimport { DrawLinesProps } from './types';\n\nexport const barChartLinesClassNames = {\n barChartLinesGlobal: 'barChartLinesGlobal',\n barChartLine: 'barChartLine',\n barChartAreasGlobal: 'barChartAreasGlobal',\n barChartArea: 'barChartArea',\n};\n\nexport const drawLines = ({\n svg,\n lineData,\n min,\n yScale,\n xScale,\n curve,\n stackedLine,\n}: DrawLinesProps) => {\n let linesSelection = null;\n let areasSelection = null;\n let area: d3.Area<[number, number]> | null = null;\n\n const line = d3\n .line()\n .defined(d => d !== null)\n .x((_, index) => (xScale(index.toString()) as number) + bandwidth / 2)\n // @ts-ignore\n .y((d: number) => yScale(d))\n .curve(curve || d3.curveLinear);\n const bandwidth = xScale.bandwidth();\n\n const linesData = lineData.filter(({ lineType }) => lineType === 'line');\n const areasData = lineData.filter(({ lineType }) => lineType === 'area');\n\n if (linesData.length > 0) {\n linesSelection = svg\n .append('g')\n .attr('class', barChartLinesClassNames.barChartLinesGlobal)\n .selectAll('path')\n .data(linesData)\n .join('path')\n .attr('class', barChartLinesClassNames.barChartLine)\n .attr('d', (d: BarChartLinetData) =>\n line(d.values as Iterable<[number, number]>)\n )\n .attr('stroke', ({ stroke }) => stroke || '')\n .attr('fill', ({ fill }) => fill || 'none');\n }\n\n if (areasData.length > 0) {\n let dataIndex = -2;\n\n area = d3\n .area()\n .x((_, index) => (xScale(index.toString()) as number) + bandwidth / 2)\n .y0((_, index) => {\n if (index === 0) {\n dataIndex = dataIndex + 1;\n }\n\n return stackedLine\n ? dataIndex > -1\n ? yScale(\n typeof lineData[dataIndex].values[index] !== 'number'\n ? 0\n : (lineData[dataIndex].values[index] as number)\n )\n : yScale(min as number)\n : yScale(min as number);\n })\n // @ts-ignore\n .y1(d => yScale(d))\n .curve(curve || d3.curveLinear);\n\n areasSelection = svg\n .append('g')\n .attr('class', barChartLinesClassNames.barChartAreasGlobal)\n .selectAll('path')\n .data(areasData)\n .join('path')\n .attr('class', barChartLinesClassNames.barChartArea)\n .attr('d', (d: BarChartLinetData | any) => area && area(d.values))\n .attr('fill', ({ fill }) => fill || 'none');\n }\n\n return {\n areasSelection,\n linesSelection,\n area,\n };\n};\n","import styled, { createGlobalStyle } from 'styled-components';\n\nimport { Wrapper } from '../../common/components/Wrapper';\nimport { barChartLinesClassNames } from './drawLines';\n\nconst tooltipClassnames = {\n barChartMouseRect: 'barChartMouseRect',\n barChartMouseContainer: 'barChartMouseContainer',\n barChartTooltipFlex: 'barChartTooltipFlex',\n barChartMouseTooltip: 'barChartMouseTooltip',\n barChartTooltip: 'barChartTooltip',\n barChartTooltipItem: 'barChartTooltipItem',\n barChartTooltipColFlex: 'barChartTooltipColFlex',\n barChartTooltipGroupName: 'barChartTooltipGroupName',\n barChartColorBox: 'barChartColorBox',\n barChartColorLine: 'barChartColorLine',\n barChartTooltipName: 'barChartTooltipName',\n barChartTooltipValue: 'barChartTooltipValue',\n};\n\nconst labelClassnames = {\n barChartLabelContainer: 'barChartLabelContainer',\n barChartLabelFlex: 'barChartLabelFlex',\n barChartLabel: 'barChartLabel',\n};\n\nexport const barChartClassNames = {\n barChartBarGlobal: 'barChartBarGlobal',\n barChartYScaleGlobal: 'barChartYScaleGlobal',\n barChartYAxis: 'barChartYAxis',\n barChartXAxis: 'barChartXAxis',\n barChartYAxisZeroTick: 'barChartYAxisZeroTick',\n barChartGridGlobal: 'barChartGridGlobal',\n barChartGridLineX: 'barChartGridLineX',\n barChartGridLineXZero: 'barChartGridLineXZero',\n barChartGridLineYZero: 'barChartGridLineYZero',\n barChartGridLineY: 'barChartGridLineY',\n ...tooltipClassnames,\n ...labelClassnames,\n ...barChartLinesClassNames,\n};\n\nexport const SvgWrapper = styled(Wrapper)`\n line {\n stroke-width: 1px;\n shape-rendering: crispEdges;\n }\n .${barChartClassNames.barChartGridLineX},\n .${barChartClassNames.barChartGridLineY} {\n stroke: rgba(48, 69, 79, 0.06);\n }\n .${barChartClassNames.barChartMouseRect} {\n }\n .${barChartClassNames.barChartMouseRect} {\n fill: none;\n pointer-events: all;\n }\n .${barChartClassNames.barChartLinesGlobal} {\n stroke-width: 1.5px;\n stroke-linejoin: round;\n stroke-linecap: round;\n }\n .${barChartClassNames.barChartLine} {\n shape-rendering: auto;\n }\n .${barChartClassNames.barChartArea} {\n fill-opacity: 0.24;\n }\n`;\n\nexport const TooltipStyles = createGlobalStyle`\n .${barChartClassNames.barChartMouseTooltip} {\n z-index: 1;\n transition: all linear 144ms;\n\n .${barChartClassNames.barChartTooltipItem} {\n margin-bottom: 4px;\n :last-of-type {\n margin-bottom: 0;\n }\n }\n }\n`;\n","import * as d3 from 'd3';\n\nimport { barChartClassNames as classNames } from './styled';\nimport { drawGrid } from './drawGrid';\nimport { appendSvg } from '../../helpers';\nimport { computeDimensions } from '../../helpers/computeDimensions';\nimport { getDomain } from './getDomain';\nimport { marshaling } from './marshaling';\nimport { drawTooltip } from './drawTooltip';\nimport { resizeBarWidth } from './resizeBarWidth';\nimport { drawLines } from './drawLines';\nimport { getBars } from './getBars';\nimport { BarChartProps, BarChartData, BarChartMarshalledGroup } from './types';\n\nexport const draw = (node: HTMLElement | null, props: BarChartProps): void => {\n const {\n data,\n lineData = [],\n barWidth: barWidthProp,\n barPadding,\n colors,\n margin,\n xAxisPadding,\n yAxisPadding,\n drawGridY,\n drawGridX,\n customYScale,\n customXScale,\n customYAxisLeft,\n customXAxisBottom,\n customYAxis,\n customXAxis,\n customBars,\n customize,\n dynamicTooltipEnable,\n renderTooltip,\n labelPosition,\n renderLabel,\n tooltipY,\n tooltipBind,\n stackedLine,\n curve,\n formatTooltipValue,\n formatTooltipName,\n sectionPadding,\n minValuesLine,\n tooltipYDomain,\n marshalledMap,\n minValue,\n maxValue,\n minDomainValue,\n maxDomainValue,\n drawBars,\n setTooltipPosition,\n onLabelItem,\n isBarTooltip,\n xScaleItemWidth,\n tooltipRoot,\n tooltipClassName,\n } = props;\n\n if (node !== null && data.length) {\n const marginTop = margin ? margin.top : 0;\n const marginRight = margin ? margin.right : 0;\n const marginBottom = margin ? margin.bottom : 0;\n const marginLeft = margin ? margin.left : 0;\n const defaultBarWidth = 12;\n const { width: nodeWidth } = node.getBoundingClientRect();\n const width = props.width || nodeWidth;\n const height = props.height || 0;\n const barDomain = getDomain({\n data,\n minDomainValue,\n maxDomainValue,\n });\n\n const min =\n typeof minValue === 'number'\n ? minValue\n : Math.min(\n d3.min(lineData, ({ values }) => d3.min(values as number[])) ||\n Number.POSITIVE_INFINITY,\n barDomain.min || 0\n );\n const max =\n typeof maxValue === 'number'\n ? maxValue\n : Math.max(\n d3.max(lineData, ({ values }) => d3.max(values as number[])) ||\n Number.NEGATIVE_INFINITY,\n barDomain.max\n );\n const svg = appendSvg(node, width, height || 0);\n const yTicksCountDefault = 6;\n const labels = data.map((item: BarChartData) => item.groupName as string);\n let barWidth = barWidthProp || defaultBarWidth;\n\n const yScale = d3\n .scaleLinear()\n .domain([min, max])\n .range([\n height - marginTop - marginBottom - (xAxisPadding || 0),\n marginTop,\n ])\n .nice();\n\n customYScale && customYScale(yScale);\n\n const yTicks = yScale.ticks();\n const yAxisLeft = d3.axisLeft(yScale).ticks(yTicksCountDefault);\n\n customYAxisLeft && customYAxisLeft(yAxisLeft);\n\n const yTicksCount = yAxisLeft.tickArguments()[0];\n\n const yAxis = svg\n .append('g')\n .attr('class', classNames.barChartYAxis)\n .call(yAxisLeft);\n\n yAxis.selectAll('.tick').attr('class', value => {\n return value === 0 ? `tick ${classNames.barChartYAxisZeroTick}` : 'tick';\n });\n\n customYAxis && customYAxis(yAxis);\n\n const { width: yAxisWidth } = computeDimensions(yAxis);\n const range = [\n marginLeft + yAxisWidth + (yAxisPadding || 0),\n width - marginRight,\n ];\n\n const xScale = d3\n .scaleBand()\n .domain(d3.range(data.length) as [])\n .range(range);\n\n barWidth = resizeBarWidth({\n data,\n sectionPadding,\n range,\n barWidth,\n barPadding,\n });\n\n customXScale && customXScale(xScale);\n\n const [x1, x2] = xScale.range();\n\n const xAxisBottom = d3\n .axisBottom(xScale)\n .tickFormat(value => labels[Number(value)]);\n\n if (typeof xScaleItemWidth === 'number') {\n xAxisBottom\n .tickValues(\n xScale.domain().filter((_, i, array) => {\n const chartWidth = x2 - x1;\n const ticks = Math.round(chartWidth / xScaleItemWidth);\n const length = array.length;\n const divider = Math.round(length / ticks);\n\n return !(i % divider);\n })\n )\n .tickSizeOuter(0);\n }\n\n customXAxisBottom && customXAxisBottom(xAxisBottom, { node, labels });\n\n const xAxis = svg\n .append('g')\n .call(xAxisBottom)\n .attr('class', classNames.barChartXAxis);\n\n customXAxis && customXAxis(xAxis);\n\n const marshalled = marshaling({\n data,\n yScale,\n xScale,\n barWidth,\n barPadding: typeof barPadding === 'number' ? barPadding : 0,\n colors,\n marginTop,\n });\n\n const marshalledData = marshalledMap\n ? marshalledMap(marshalled)\n : marshalled;\n\n yAxis.attr('transform', `translate( ${marginLeft + yAxisWidth}, 0)`);\n\n drawGrid({\n svg,\n yScale,\n xScale,\n yTicksCount,\n drawGridY,\n drawGridX,\n });\n\n xAxis.attr(\n 'transform',\n `translate(0, ${yScale(yTicks[0]) + (xAxisPadding || 0)})`\n );\n\n const gSvg = svg.append('g').attr('class', classNames.barChartBarGlobal);\n\n const groups = gSvg\n .selectAll('g')\n .data(marshalledData)\n .enter()\n .append('g')\n .attr(\n 'transform',\n (_: BarChartMarshalledGroup[], i) =>\n `translate(${Math.round(xScale(i.toString()) as number)},${-(\n marginTop || 0\n )})`\n );\n\n const bars = drawBars\n ? drawBars({ groups, yScale, marshalledData, barWidth })\n : getBars({ groups, barWidth });\n let lines = null;\n\n if (Array.isArray(lineData) && lineData.length > 0) {\n lines = drawLines({\n svg,\n lineData,\n xScale,\n yScale,\n min: typeof minValuesLine === 'number' ? minValuesLine : min,\n stackedLine,\n curve,\n });\n }\n\n customBars && customBars({ bars, yScale, lines, marshalledData, lineData });\n\n if (dynamicTooltipEnable || labelPosition) {\n drawTooltip({\n svg,\n node,\n xScale,\n yScale,\n marshalledData,\n data,\n lineData,\n renderTooltip,\n labelPosition,\n marginTop,\n renderLabel,\n barWidth,\n barPadding,\n dynamicTooltipEnable,\n tooltipY,\n tooltipBind,\n formatTooltipValue,\n formatTooltipName,\n tooltipYDomain,\n setTooltipPosition,\n onLabelItem,\n isBarTooltip,\n bars: groups,\n tooltipRoot,\n tooltipClassName,\n });\n }\n\n customize && customize({ svg, marshalledData, yScale, xScale, lineData });\n }\n};\n","import { BarChartProps } from './types';\n\nexport const getDomain = ({\n data,\n minDomainValue,\n maxDomainValue,\n}: Pick<BarChartProps, 'data' | 'minDomainValue' | 'maxDomainValue'>) => {\n let MIN = Number.POSITIVE_INFINITY;\n let MAX = Number.NEGATIVE_INFINITY;\n\n data.forEach(({ groupName, ...groups }) => {\n let groupMax = 0;\n let groupMin = 0;\n\n Object.keys(groups).forEach(key => {\n const group = groups[key as never];\n\n let stackMax = 0;\n let stackMin = 0;\n\n Object.keys(group).forEach(groupKey => {\n const value = group[groupKey];\n\n if (value > 0) {\n stackMax += value;\n } else {\n stackMin += value;\n }\n });\n\n groupMax = Math.min(groupMax, stackMin);\n groupMin = Math.max(groupMin, stackMax);\n });\n\n MIN = Math.min(MIN, groupMax);\n MAX = Math.max(MAX, groupMin);\n });\n\n if (MIN === 0 && MAX === 0) {\n return {\n min: typeof minDomainValue === 'number' ? minDomainValue : 0,\n max: typeof maxDomainValue === 'number' ? maxDomainValue : 1,\n };\n }\n\n return {\n min: typeof minDomainValue === 'number' ? minDomainValue : MIN,\n max: typeof maxDomainValue === 'number' ? maxDomainValue : MAX,\n };\n};\n","import { ResizeBarWidthProps } from './types';\n\nexport const resizeBarWidth = ({\n data,\n range,\n barWidth,\n barPadding,\n sectionPadding,\n}: ResizeBarWidthProps): number => {\n const groupPadding = typeof sectionPadding === 'number' ? sectionPadding : 0;\n const chartWidth = range[1] - range[0];\n const barsWidth = data.reduce((acc, { groupName, ...curr }) => {\n return (\n acc +\n Object.keys(curr).reduce(\n (acc, _key, index) =>\n index > 0\n ? acc + (barWidth || 0) + (barPadding || 0)\n : acc + barWidth,\n 0\n ) +\n groupPadding\n );\n }, groupPadding);\n\n if (chartWidth < barsWidth) {\n return Math.floor(barWidth * (chartWidth / barsWidth));\n }\n\n return barWidth;\n};\n","import { BarChartMarshalledGroup, BarChartMarshaling } from './types';\n\nexport const marshaling = ({\n data,\n yScale,\n xScale,\n barWidth,\n barPadding,\n colors,\n marginTop,\n}: BarChartMarshaling): BarChartMarshalledGroup[][] =>\n data.map(({ groupName, ...groups }, groupIndex) => {\n const marshalledGroup: BarChartMarshalledGroup[] = [];\n const hundred = 100;\n const bandwidth = xScale.bandwidth();\n const groupsKeys = Object.keys(groups);\n\n groupsKeys.forEach((key: string, stackIndex: number) => {\n const group = groups[key as never];\n const groupKeys = Object.keys(group);\n const barGroupWidth =\n ((barWidth as number) + (barPadding as number)) * groupsKeys.length -\n (groupKeys.length > 1 ? (barPadding as number) : 0);\n\n let stackMax = 0;\n let stackMin = 0;\n\n groupKeys.forEach(groupKey => {\n const value = group[groupKey];\n const color = colors[groupKey];\n const x =\n ((barWidth as number) + (barPadding as number)) * stackIndex +\n bandwidth / 2 -\n barGroupWidth / 2;\n const isPositiveValue = value > 0;\n const height = isPositiveValue\n ? Math.abs(\n ((yScale(stackMax - value) - yScale(stackMax) + Number.EPSILON) *\n hundred) /\n hundred\n )\n : Math.abs(\n ((yScale(stackMin - value) - yScale(stackMin) + Number.EPSILON) *\n hundred) /\n hundred\n );\n\n if (isPositiveValue) {\n stackMax += value;\n }\n\n const y = isPositiveValue\n ? ((yScale(stackMax) + Number.EPSILON) * hundred) / hundred\n : yScale(stackMin) - yScale(0) + yScale(0);\n\n marshalledGroup.push({\n x,\n y: y + (marginTop || 0),\n height,\n color,\n value,\n groupName: groupName as string,\n name: groupKey,\n stackIndex,\n groupIndex,\n });\n\n if (!isPositiveValue) {\n stackMin += value;\n }\n });\n });\n\n return marshalledGroup;\n });\n","import { BarChartData } from '../types';\nimport { DrawGridProps } from './types';\n\nimport { barChartClassNames } from '../styled';\n\nexport const drawGrid = ({\n svg,\n yScale,\n xScale,\n yTicksCount,\n drawGridX,\n drawGridY,\n}: DrawGridProps) => {\n if (!drawGridY && !drawGridX) return;\n\n const global = svg\n .append('g')\n .attr('class', barChartClassNames.barChartGridGlobal);\n\n const yTicks = yScale.ticks(yTicksCount);\n const range = xScale.range();\n const domain = xScale.domain();\n\n if (drawGridX) {\n global\n .append('g')\n .selectAll('line')\n .data(yTicks)\n .join('line')\n .attr('class', d =>\n d === 0\n ? `${barChartClassNames.barChartGridLineX} ${barChartClassNames.barChartGridLineXZero}`\n : barChartClassNames.barChartGridLineX\n )\n .attr('x1', () => range[0])\n .attr('x2', () => range[1])\n .attr('y1', (d: BarChartData | any) => Math.round(yScale(d) as number))\n .attr('y2', (d: BarChartData | any) => Math.round(yScale(d) as number));\n }\n\n if (drawGridY) {\n const getX = (index: number) =>\n domain[index] !== void 0\n ? index === 0\n ? range[0]\n : Math.round(\n xScale.step() * index +\n range[0] -\n (xScale.step() / 2) * xScale.padding()\n )\n : range[1];\n\n global\n .append('g')\n .selectAll('line')\n .data(Array.from({ length: domain.length + 1 }, (_, index) => index))\n .join('line')\n .attr('class', d =>\n d === 0\n ? `${barChartClassNames.barChartGridLineY} ${barChartClassNames.barChartGridLineYZero}`\n : barChartClassNames.barChartGridLineY\n )\n .attr('x1', getX)\n .attr('x2', getX)\n .attr('y1', () => Math.round(yScale(yTicks[0]) as number))\n .attr('y2', () =>\n Math.round(yScale(yTicks[yTicks.length - 1]) as number)\n );\n }\n};\n","import { BarChartMarshalledGroup } from '../types';\nimport { GetBarsProps } from './types';\n\nexport const getBars = ({ groups, barWidth }: GetBarsProps) => {\n return groups\n .selectAll('rect')\n .data((item: BarChartMarshalledGroup[]) => item)\n .join('rect')\n .attr('x', (item: BarChartMarshalledGroup) => item.x)\n .attr('y', (item: BarChartMarshalledGroup) => item.y)\n .attr('width', barWidth)\n .attr('height', (item: BarChartMarshalledGroup) => item.height)\n .style('fill', (item: BarChartMarshalledGroup) => item.color);\n};\n","import React from 'react';\nimport * as d3 from 'd3';\nimport ReactDOMServer from 'react-dom/server';\n\nimport { DrawTooltipProps } from './types';\nimport {\n BarChartMarshalledGroup,\n BarChartLinetData,\n BarChartMergedData,\n} from '../types';\n\nimport { getLabelY } from './getLabelY';\nimport { getLabel } from './getLabel';\nimport { barChartClassNames } from '../styled';\nimport {\n TooltipFlex,\n TooltipGroupName,\n LabelFlex,\n LabelFlexCenter,\n TooltipContainer,\n TooltipItem,\n ColFlex,\n ColorBox,\n ColorLine,\n Name,\n Value,\n} from '../../../common/components/tooltips';\n\nexport const drawTooltip = ({\n svg,\n node,\n data,\n marshalledData,\n xScale,\n yScale,\n renderTooltip,\n labelPosition,\n marginTop,\n renderLabel,\n barWidth,\n barPadding,\n dynamicTooltipEnable,\n tooltipY,\n tooltipBind,\n lineData,\n formatTooltipValue,\n formatTooltipName,\n tooltipYDomain,\n setTooltipPosition,\n onLabelItem,\n isBarTooltip,\n bars,\n tooltipRoot,\n tooltipClassName,\n}: DrawTooltipProps) => {\n d3.select(node)\n .select(`.${barChartClassNames.barChartMouseContainer}`)\n .remove();\n\n const xScaleBandDomain = xScale.domain();\n const [x1, x2] = xScale.range();\n const [y1, y2] = yScale.range();\n const bandwidth = xScale.bandwidth();\n const format = d3.format(',');\n\n const getX = (index: number): number =>\n xScaleBandDomain[index] !== void 0\n ? index === 0\n ? x1\n : Math.round(\n xScale.step() * index + x1 - (xScale.step() / 2) * xScale.padding()\n )\n : x2;\n const groups = xScaleBandDomain.map(value => getX(Number(value) + 1));\n\n const topYDomain = tooltipYDomain\n ? tooltipYDomain({ data: marshalledData, lineData, yScale })\n : marshalledData.reduce((acc, curr, index) => {\n const lineMin =\n d3.min(lineData as BarChartLinetData[], ({ values }) =>\n typeof values[index] === 'number'\n ? yScale((values[index] || 0) - y2)\n : Number.POSITIVE_INFINITY\n ) || Number.POSITIVE_INFINITY;\n\n acc.push(\n curr.reduce(\n (acc, { y }) => Math.min(acc, y, lineMin as number),\n Number.POSITIVE_INFINITY\n ) as any\n );\n return acc;\n }, []);\n\n const mouseGlobal = svg.append('g').attr('class', 'lineChartMouseGlobal');\n const mouseRect = mouseGlobal\n .append('rect')\n .attr('width', x2 - x1)\n .attr('height', Math.abs(y1 - y2))\n .attr('class', barChartClassNames.barChartMouseRect)\n .attr('transform', `translate(${x1}, ${y2})`);\n\n if (dynamicTooltipEnable) {\n const tooltipContainer: Element | null =\n tooltipRoot || document.querySelector('body');\n let tooltip: d3.Selection<any, unknown, any, any> = d3.select(\n `.${barChartClassNames.barChartMouseTooltip}`\n );\n\n if (tooltip.size() === 0) {\n tooltip = d3\n .select(tooltipContainer)\n .append('div')\n .attr('class', barChartClassNames.barChartMouseTooltip)\n .style('opacity', '0')\n .style('position', 'absolute')\n .html(() => {\n const html = ReactDOMServer.renderToString(\n <TooltipFlex className={barChartClassNames.barChartTooltipFlex} />\n );\n\n return html;\n });\n }\n\n const barChartTootipFlex = tooltip.select(\n `.${barChartClassNames.barChartTooltipFlex}`\n );\n\n let isVisible = false;\n let flagCurrIndex: number | null = null;\n\n const setVisible = (visible?: boolean) => {\n isVisible = Boolean(visible);\n\n const opacity = isVisible ? '1' : '0';\n tooltip.style('opacity', opacity);\n\n if (!isVisible) {\n tooltip.attr('class', barChartClassNames.barChartMouseTooltip);\n flagCurrIndex = null;\n tooltip.style('transition', 'none');\n tooltip.style('top', null);\n tooltip.style('left', null);\n } else {\n tooltip.attr(\n 'class',\n `${barChartClassNames.barChartMouseTooltip} ${tooltipClassName || ''}`\n );\n tooltip.style('transition', null);\n }\n };\n\n mouseRect.on('mouseout.tooltip', () => setVisible());\n mouseRect.on('touchmove.tooltip mousemove.tooltip', event => {\n const [docX, docY] = d3.pointer(event, document);\n const [rectrX] = d3.pointer(event, mouseRect);\n const [nodeX, nodeY] = d3.pointer(event, node);\n const x = rectrX - (rectrX - nodeX);\n const offsetX = docX - nodeX;\n const offsetY = docY - nodeY;\n\n const currIndex = groups.findIndex(value => x <= value);\n\n if (isBarTooltip) {\n const containts = document.elementsFromPoint(\n event.clientX,\n event.clientY\n );\n const currBars = d3\n .select(bars.nodes()[currIndex])\n .selectAll('rect')\n .nodes();\n const isContains = containts.some(item => currBars.includes(item));\n\n if (!isContains) {\n if (isVisible) {\n setVisible(false);\n }\n mouseRect.style('cursor', 'default');\n return;\n } else {\n mouseRect.style('cursor', 'pointer');\n }\n }\n\n const top =\n (typeof tooltipY === 'number'\n ? tooltipY\n : ((topYDomain[currIndex] as unknown) as number) - y2) + offsetY;\n const left =\n (tooltipBind\n ? (xScale(currIndex.toString()) || 0) + bandwidth / 2\n : x) + offsetX;\n\n if (tooltipBind && flagCurrIndex === currIndex) {\n return;\n }\n\n let currData = marshalledData[currIndex] as BarChartMergedData;\n if (Array.isArray(currData) && currData.length === 0) {\n return;\n }\n\n if (lineData) {\n const currLineData = lineData.map(({ values, ...rest }) => ({\n ...rest,\n value: values[currIndex],\n groupName: data[currIndex] && data[currIndex].groupName,\n }));\n\n if (Array.isArray(currLineData) && Array.isArray(currData)) {\n currData = currData.concat(currLineData as BarChartMergedData);\n }\n }\n\n const svgWidth = (svg.node() as SVGElement).getBoundingClientRect()\n .width as number;\n\n if (typeof setTooltipPosition === 'function') {\n setTooltipPosition({\n left,\n top,\n tooltip,\n svgWidth,\n });\n } else if (!setTooltipPosition) {\n tooltip.style('left', `${left}px`).style('top', `${top}px`);\n }\n\n if (renderTooltip) {\n barChartTootipFlex.html(() => {\n const html = ReactDOMServer.renderToString(\n <>\n {renderTooltip(\n currData,\n setTooltipPosition\n ? {\n left,\n top,\n tooltip,\n svgWidth,\n }\n : undefined,\n barWidth\n )}\n </>\n );\n\n return html;\n });\n } else {\n if (!isVisible) {\n setVisible(true);\n }\n\n barChartTootipFlex.html(() => {\n const html = ReactDOMServer.renderToString(\n <TooltipContainer className={barChartClassNames.barChartTooltip}>\n {currData && currData[0] && (\n <TooltipGroupName\n className={barChartClassNames.barChartTooltipGroupName}\n >\n {currData[0].groupName}\n </TooltipGroupName>\n )}\n {currData &&\n currData.map(\n ({ name, value, stroke, fill, color, lineType }) => (\n <TooltipItem\n key={name}\n className={barChartClassNames.barChartTooltipItem}\n >\n <ColFlex\n className={barChartClassNames.barChartTooltipColFlex}\n >\n {lineType ? (\n <ColorLine\n className={barChartClassNames.barChartColorLine}\n style={{ backgroundColor: stroke || fill }}\n />\n ) : (\n <ColorBox\n className={barChartClassNames.barChartColorBox}\n style={{ backgroundColor: color }}\n />\n )}\n <Name\n className={barChartClassNames.barChartTooltipName}\n >\n {formatTooltipName ? formatTooltipName(name) : name}\n </Name>\n </ColFlex>\n <Value\n className={barChartClassNames.barChartTooltipValue}\n >\n {formatTooltipValue\n ? formatTooltipValue(value)\n : format(value)}\n </Value>\n </TooltipItem>\n )\n )}\n </TooltipContainer>\n );\n\n return html;\n });\n }\n\n flagCurrIndex = currIndex;\n if (!isVisible) {\n setVisible(true);\n }\n });\n }\n\n const container = d3\n .select(node)\n .append('div')\n .attr('class', barChartClassNames.barChartMouseContainer);\n\n const labelContainer = container\n .append('div')\n .attr('class', barChartClassNames.barChartLabelContainer)\n .style('position', 'absolute')\n .style('top', `${y2}px`);\n\n if (labelPosition) {\n const concatedData: BarChartMarshalledGroup[][] = lineData\n ? marshalledData.map((stack, index) =>\n stack.concat(\n lineData.map(({ values, name, stroke }) => {\n const { stacksCount } = stack.reduce(\n (acc, { stackIndex }) => {\n const { indexFlag, stacksCount } = acc;\n if (stackIndex !== indexFlag) {\n return {\n indexFlag: stackIndex,\n stacksCount: stacksCount + 1,\n };\n }\n return acc;\n },\n {\n indexFlag: -1,\n stacksCount: 0,\n }\n );\n const barsWidth =\n (barWidth * stacksCount +\n (barPadding || 0) * (stacksCount - 1)) /\n 2;\n\n return {\n x: stack[0].x - barWidth / 2 + barsWidth,\n y: yScale(values[index] as number) + marginTop,\n height: 0,\n color: stroke,\n value: values[index],\n groupName: stack[0].groupName,\n name,\n stackIndex: 0,\n groupIndex: index,\n };\n }) as BarChartMarshalledGroup[]\n )\n )\n : marshalledData;\n\n const groups = labelContainer\n .selectAll('div')\n .data(concatedData)\n .enter()\n .append('div')\n .style('position', 'absolute')\n .style(\n 'transform',\n (_: BarChartMarshalledGroup[], index) =>\n `translate(${Math.round(xScale(index.toString()) as number)}px,${-(\n marginTop || 0\n )}px)`\n );\n\n const LabelFlexStyled =\n labelPosition === 'center' ? LabelFlexCenter : LabelFlex;\n\n const LabelStyle = getLabel(labelPosition);\n\n groups\n .selectAll('span')\n .data((item: BarChartMarshalledGroup[]) =>\n onLabelItem ? onLabelItem(item) : item\n )\n .join('div')\n .style('left', item => `${Math.round(item.x + barWidth / 2)}px`)\n .style(\n 'top',\n (item: BarChartMarshalledGroup) =>\n `${getLabelY(labelPosition, y2, item)}px`\n )\n .style('position', 'absolute')\n .html((item: BarChartMarshalledGroup) =>\n ReactDOMServer.renderToString(\n <LabelFlexStyled className={barChartClassNames.barChartLabelFlex}>\n {renderLabel ? (\n renderLabel({ ...item, barWidth })\n ) : (\n <LabelStyle className={barChartClassNames.barChartLabel}>\n {format(item.value)}\n </LabelStyle>\n )}\n </LabelFlexStyled>\n )\n );\n }\n};\n","import { BarChartLabelPosition } from '../types';\n\nimport {\n Label as LabelUI,\n LabelTop,\n LabelBottom,\n} from '../../../common/components/tooltips';\n\nexport const getLabel = (labelPosition: BarChartLabelPosition) => {\n switch (labelPosition) {\n case 'top':\n return LabelTop;\n case 'bottom':\n return LabelBottom;\n default:\n return LabelUI;\n }\n};\n","import { BarChartLabelPosition, BarChartMarshalledGroup } from '../types';\n\nexport const getLabelY = (\n labelPosition: BarChartLabelPosition,\n y2: number,\n item: BarChartMarshalledGroup\n): number => {\n switch (labelPosition) {\n case 'center':\n return item.y + item.height / 2 - y2;\n case 'bottom':\n return item.y + item.height - y2;\n default:\n return item.y;\n }\n};\n","import React, { useEffect } from 'react';\n\nimport { BarChartProps } from './types';\n\nimport { useNode } from '../../hooks';\nimport { useResize } from '../../hooks';\n\nimport { draw } from './draw';\n\nimport { SvgWrapper, TooltipStyles } from './styled';\n\nexport const BarChart: React.FC<BarChartProps> = (\n props\n): React.ReactElement => {\n const { className, style, children } = props;\n const [ref, node] = useNode();\n\n useEffect(() => {\n node && draw(node, props);\n }, [node, props]);\n\n const onDraw = () => draw(node, props);\n\n useResize(props.width, onDraw);\n\n return (\n <div className={className} style={style}>\n <TooltipStyles />\n <SvgWrapper ref={ref}>{children}</SvgWrapper>\n </div>\n );\n};\n\nBarChart.defaultProps = {\n data: [],\n colors: {},\n margin: {\n top: 10,\n right: 10,\n bottom: 10,\n left: 0,\n },\n barWidth: 12,\n barPadding: 0,\n height: 320,\n yAxisPadding: 0,\n xAxisPadding: 0,\n tooltipBind: true,\n sectionPadding: 1,\n};\n","import styled from 'styled-components';\n\nimport { TooltipFlex as TooltipFlexUI } from '../../common/components/tooltips';\n\nexport const horizontalBarChartClassNames = {\n horizontalBarChartButtonTd: 'horizontalBarChartButtonTd',\n horizontalBarChartLabelTd: 'horizontalBarChartLabelTd',\n horizontalBarChartLabelCell: 'horizontalBarChartLabelCell',\n horizontalBarChartBarTd: 'horizontalBarChartBarTd',\n horizontalBarChartBarFlex: 'horizontalBarChartBarFlex',\n horizontalBarChartBar: 'horizontalBarChartBar',\n horizontalBarChartBarFirst: 'horizontalBarChartBarFirst',\n horizontalBarChartBarLast: 'horizontalBarChartBarLast',\n horizontalBarChartBarOnly: 'horizontalBarChartBarOnly',\n horizontalBarChartTooltipFlex: 'horizontalBarChartTooltipFlex',\n horizontalBarChartStackWrapper: 'horizontalBarChartStackWrapper',\n horizontalBarChartTooltipContainer: 'horizontalBarChartTooltipContainer',\n horizontalBarChartStackSumContainer: 'horizontalBarChartStackSumContainer',\n horizontalBarChartStackSum: 'horizontalBarChartStackSum',\n horizontalBarChartXScaleTd: 'horizontalBarChartXScaleTd',\n horizontalBarChartXScaleTicks: 'horizontalBarChartXScaleTicks',\n horizontalBarChartXScaleTick: 'horizontalBarChartXScaleTick',\n horizontalBarChartTooltipItem: 'horizontalBarChartTooltipItem',\n horizontalBarChartTooltipName: 'horizontalBarChartTooltipName',\n horizontalBarChartTooltipValue: 'horizontalBarChartTooltipValue',\n};\n\nexport const Table = styled.table`\n width: 100%;\n`;\n\nexport const LabelCell = styled.div`\n text-align: right;\n`;\n\nexport const BarFlex = styled.div`\n width: 100%;\n display: flex;\n height: 1rem;\n`;\n\nexport const BarsTd = styled.td`\n width: 100%;\n position: relative;\n vertical-align: middle;\n`;\n\nexport const TooltipFlex = styled(TooltipFlexUI)`\n position: absolute;\n top: 0;\n left: 50%;\n transform: translate(-50%, -50%);\n will-change: left, top;\n`;\n\nexport const StackSumContainer = styled.div`\n position: relative;\n`;\n\nexport const StackSum = styled.div`\n white-space: nowrap;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(0, -50%);\n`;\n\nexport const StackWrapper = styled.div`\n position: absolute;\n top: 0;\n display: flex;\n justify-content: flex-start;\n height: 100%;\n`;\n","import React from 'react';\nimport * as d3 from 'd3';\n\nimport {\n horizontalBarChartClassNames as classNames,\n TooltipFlex,\n} from '../styled';\nimport {\n TooltipContainer,\n TooltipItem,\n Name,\n Value,\n ColorBox,\n} from '../../../common/components/tooltips';\n\nimport { TooltipProps } from './types';\n\nexport const Tooltip: React.FC<TooltipProps> = ({\n renderTooltip,\n bars,\n style,\n className,\n}): React.ReactElement => {\n const format = d3.format(',');\n\n return (\n <TooltipFlex\n className={`${classNames.horizontalBarChartTooltipFlex} ${className ||\n ''}`}\n style={style}\n >\n <TooltipContainer\n className={classNames.horizontalBarChartTooltipContainer}\n >\n {renderTooltip\n ? renderTooltip(bars)\n : bars.map(({ color, name, value, groupName }, index) => (\n <TooltipItem\n key={`${name || ''}-${index}-${groupName}`}\n className={classNames.horizontalBarChartTooltipItem}\n >\n {color && <ColorBox style={{ backgroundColor: color }} />}\n {name && (\n <Name className={classNames.horizontalBarChartTooltipName}>\n {name}\n </Name>\n )}\n <Value className={classNames.horizontalBarChartTooltipValue}>\n {format(value)}\n </Value>\n </TooltipItem>\n ))}\n </TooltipContainer>\n </TooltipFlex>\n );\n};\n","import React, { useCallback, useEffect } from 'react';\nimport * as d3 from 'd3';\nimport { render, unmountComponentAtNode } from 'react-dom';\n\nimport {\n HorizontalBarChartMarshalingData,\n HorizontalBarChartProps,\n} from '../../types';\nimport { UseTooltip } from './types';\n\nimport { Tooltip } from '../../Tooltip';\n\nconst rootElement: HTMLDivElement = document.createElement('div');\n\nexport const useTooltip = ({\n renderTooltip,\n tooltipBind,\n tooltipStyle,\n tooltipRoot,\n tooltipClassName,\n hideTooltip,\n}: Pick<\n HorizontalBarChartProps,\n | 'renderTooltip'\n | 'tooltipBind'\n | 'tooltipStyle'\n | 'tooltipRoot'\n | 'tooltipClassName'\n | 'hideTooltip'\n>): UseTooltip => {\n useEffect(() => {\n const container: Element | null =\n tooltipRoot || document.querySelector('body');\n\n container && container.appendChild(rootElement);\n return () => {\n unmountComponentAtNode(rootElement);\n };\n }, [tooltipRoot]);\n\n const onMouseMove = useCallback(\n (event: React.MouseEvent, bars: HorizontalBarChartMarshalingData[]) => {\n let [x, y] = d3.pointer(event, document);\n\n if (!tooltipBind && 'getBoundingClientRect' in event.target) {\n const {\n width,\n height,\n }: DOMRect = (event.target as HTMLDivElement).getBoundingClientRect();\n const [barX, barY] = d3.pointer(event, event.target);\n\n x = x - barX + width / 2;\n y = y - barY + height / 2;\n }\n\n if (rootElement) {\n rootElement.style.visibility = 'visible';\n }\n\n render(\n <Tooltip\n style={{\n left: x,\n top: y,\n ...tooltipStyle,\n }}\n bars={bars}\n renderTooltip={renderTooltip}\n className={tooltipClassName}\n />,\n rootElement\n );\n },\n [tooltipClassName, tooltipStyle, renderTooltip, tooltipBind]\n );\n\n const onMouseLeave = useCallback(() => {\n if (rootElement) {\n rootElement.style.visibility = 'hidden';\n hideTooltip && hideTooltip();\n }\n }, [hideTooltip]);\n\n return [onMouseMove, onMouseLeave];\n};\n","import styled from 'styled-components';\n\nexport const BarStyled = styled.div`\n position: relative;\n display: inline-flex;\n height: 100%;\n`;\n","import React from 'react';\n\nimport { BarProps } from './types';\n\nimport { horizontalBarChartClassNames as classNames } from '../styled';\nimport { BarStyled } from './styled';\n\nexport const Bar: React.FC<BarProps> = ({\n withTooltip,\n bar,\n formatNativeTitle,\n tooltipBind,\n mouseMove,\n mouseLeave,\n pointerEventsNone,\n isFirstChild,\n isLastChild,\n isOnlyChild,\n}): React.ReactElement => {\n const { color, width } = bar;\n const ceiledWidth = Math.abs(width);\n const onMouseMove = withTooltip\n ? (event: React.MouseEvent) => mouseMove(event, [bar])\n : void 0;\n const onMouseLeave = withTooltip ? () => mouseLeave() : void 0;\n\n return (\n <BarStyled\n className={`${classNames.horizontalBarChartBar} ${\n isFirstChild ? classNames.horizontalBarChartBarFirst : ''\n } ${isLastChild ? classNames.horizontalBarChartBarLast : ''} ${\n isOnlyChild ? classNames.horizontalBarChartBarOnly : ''\n }`}\n style={{\n width: `${ceiledWidth}%`,\n backgroundColor: color,\n pointerEvents: pointerEventsNone ? 'none' : 'auto',\n }}\n title={formatNativeTitle ? formatNativeTitle(bar) : ''}\n onMouseOver={onMouseMove}\n onMouseMove={tooltipBind ? onMouseMove : void 0}\n onMouseOut={onMouseLeave}\n />\n );\n};\n","import styled from 'styled-components';\n\nexport const TickTd = styled.td`\n position: relative;\n`;\n\nexport const Ticks = styled.div`\n position: relative;\n height: 1rem;\n`;\n\nexport const Tick = styled.div`\n white-space: nowrap;\n width: 0;\n height: 0;\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n","import React from 'react';\nimport * as d3 from 'd3';\n\nimport { HorizontalBarChartProps } from '../types';\n\nimport { useScale } from './hooks/useScale';\n\nimport { TickTd, Ticks, Tick } from './styled';\nimport { horizontalBarChartClassNames as classNames } from '../styled';\n\nexport const XScale: React.FC<Pick<\n HorizontalBarChartProps,\n 'maxValue' | 'scaleTicks' | 'renderTicks' | 'scaleDomain'\n>> = ({\n maxValue,\n scaleTicks,\n renderTicks,\n scaleDomain,\n}): React.ReactElement => {\n const range = useScale({ maxValue, scaleTicks, scaleDomain });\n const format = d3.format(',');\n\n return (\n <tr>\n <td />\n <TickTd className={classNames.horizontalBarChartXScaleTd}>\n <Ticks className={classNames.horizontalBarChartXScaleTicks}>\n {range.map((tick, index, ticks) => {\n const { value, x } = tick;\n\n return (\n <Tick\n key={value}\n className={classNames.horizontalBarChartXScaleTick}\n style={{\n left: `${x}%`,\n justifyContent:\n index === 0\n ? 'flex-start'\n : index === ticks.length - 1\n ? 'flex-end'\n : '',\n }}\n >\n {renderTicks ? renderTicks(tick) : format(value)}\n </Tick>\n );\n })}\n </Ticks>\n </TickTd>\n </tr>\n );\n};\n","import { useMemo } from 'react';\nimport * as d3 from 'd3';\n\nimport {\n HorizontalBarChartProps,\n HorizontalBarChartScaleItem,\n} from '../../types';\n\nconst hundred = 100;\n\nexport const useScale = ({\n maxValue,\n scaleTicks,\n scaleDomain,\n}: Pick<\n HorizontalBarChartProps,\n 'maxValue' | 'scaleTicks' | 'scaleDomain'\n>): HorizontalBarChartScaleItem[] => {\n return useMemo(() => {\n const scaleLinear = d3\n .scaleLinear()\n .domain([0, maxValue] as Iterable<d3.NumberValue>)\n .range([0, hundred]);\n\n const ticks = scaleLinear.ticks(scaleTicks);\n\n return (scaleDomain || ticks).map((value: number) => ({\n value,\n x: scaleLinear(value),\n }));\n }, [maxValue, scaleTicks, scaleDomain]);\n};\n","import React from 'react';\nimport * as d3 from 'd3';\n\nimport { HorizontalBarChartProps } from './types';\n\nimport { useMarshaling } from './hooks/useMarshaling';\nimport { useTooltip } from './hooks/useTooltip';\nimport { useStackWrapper } from './hooks/useStackWrapper';\n\nimport { Bar } from './Bar';\nimport { XScale } from './XScale';\nimport {\n Table,\n LabelCell,\n horizontalBarChartClassNames as classNames,\n BarFlex,\n BarsTd,\n StackSumContainer,\n StackSum,\n} from './styled';\n\nexport const HorizontalBarChart: React.FC<HorizontalBarChartProps> = ({\n data,\n className,\n style,\n children,\n labels,\n fullExtent,\n maxValue,\n formatNativeTitle,\n renderTooltip,\n withTooltip,\n withStackSum,\n tooltipBind,\n scaleTicks,\n renderTicks,\n renderButton,\n tooltipStyle,\n tooltipClassName,\n scaleDomain,\n renderDataTable,\n thead,\n withoutXScale,\n stackedTooltip,\n fullChartTooltip,\n hideTooltip,\n}): React.ReactElement => {\n const { fullMax, data: marshalingData } = useMarshaling({\n data,\n fullExtent,\n maxValue,\n labels,\n });\n const [mouseMove, mouseLeave] = useTooltip({\n renderTooltip,\n tooltipBind,\n tooltipStyle,\n tooltipClassName,\n hideTooltip,\n });\n const Stack = useStackWrapper(stackedTooltip);\n\n return (\n <Table\n className={className}\n style={style}\n onMouseOver={\n fullChartTooltip\n ? event => mouseMove(event, marshalingData.flat())\n : void 0\n }\n onMouseMove={\n fullChartTooltip\n ? event => mouseMove(event, marshalingData.flat())\n : void 0\n }\n onMouseOut={fullChartTooltip ? mouseLeave : void 0}\n >\n {thead}\n <tbody>\n {marshalingData.map((item, rowIndex) => {\n const stackSum =\n (withStackSum || renderDataTable) &&\n d3.sum(item, ({ value }) => value);\n const sumWidth = d3.sum(item, ({ width }) => width);\n\n return (\n <tr key={`row-${rowIndex}`}>\n {typeof renderButton === 'function' && (\n <td className={classNames.horizontalBarChartButtonTd}>\n {renderButton(item, rowIndex)}\n </td>\n )}\n <td className={classNames.horizontalBarChartLabelTd}>\n {labels && labels[rowIndex] && (\n <LabelCell className={classNames.horizontalBarChartLabelCell}>\n {labels[rowIndex]}\n </LabelCell>\n )}\n </td>\n <BarsTd\n className={classNames.horizontalBarChartBarTd}\n style={{ pointerEvents: fullChartTooltip ? 'none' : 'auto' }}\n >\n <BarFlex\n className={classNames.horizontalBarChartBarFlex}\n style={{ pointerEvents: fullChartTooltip ? 'none' : 'auto' }}\n >\n <Stack\n style={stackedTooltip ? { width: `${sumWidth}%` } : void 0}\n item={item}\n tooltipBind={tooltipBind}\n mouseMove={mouseMove}\n mouseLeave={mouseLeave}\n />\n {item.map(\n (bar, barIndex, array) =>\n bar.value !== 0 && (\n <Bar\n key={`bar-${bar.name || ''}-${barIndex}`}\n formatNativeTitle={formatNativeTitle}\n bar={bar}\n tooltipBind={tooltipBind}\n pointerEventsNone={stackedTooltip || fullChartTooltip}\n withTooltip={withTooltip && !stackedTooltip}\n mouseMove={mouseMove}\n mouseLeave={mouseLeave}\n isOnlyChild={array.length === 1}\n isFirstChild={barIndex === 0 && array.length > 1}\n isLastChild={\n array.length - 1 === barIndex && array.length > 1\n }\n />\n )\n )}\n {withStackSum && (\n <StackSumContainer\n className={classNames.horizontalBarChartStackSumContainer}\n >\n <StackSum\n className={classNames.horizontalBarChartStackSum}\n >\n {stackSum}\n </StackSum>\n </StackSumContainer>\n )}\n </BarFlex>\n </BarsTd>\n {renderDataTable &&\n renderDataTable(item, stackSum as number, rowIndex)}\n </tr>\n );\n })}\n {!withoutXScale && (\n <XScale\n maxValue={typeof maxValue === 'number' ? maxValue : fullMax}\n scaleTicks={scaleTicks}\n renderTicks={renderTicks}\n scaleDomain={scaleDomain}\n />\n )}\n {children}\n </tbody>\n </Table>\n );\n};\n\nHorizontalBarChart.defaultProps = {\n fullExtent: true,\n withTooltip: false,\n withStackSum: false,\n tooltipBind: false,\n scaleTicks: 4,\n withoutXScale: false,\n};\n","import { useMemo } from 'react';\nimport * as d3 from 'd3';\n\nimport {\n HorizontalBarChartProps,\n HorizontalBarChartData,\n HorizontalBarChartMarshalingData,\n} from '../types';\n\nconst hundred = 100;\n\nexport const useMarshaling = ({\n data,\n fullExtent,\n maxValue,\n labels,\n}: Pick<\n HorizontalBarChartProps,\n 'data' | 'fullExtent' | 'maxValue' | 'labels'\n>): {\n fullMax: number;\n data: HorizontalBarChartMarshalingData[][];\n} => {\n return useMemo(() => {\n const fullMax = d3.max(data, item =>\n d3.sum(item, ({ value }) => value)\n ) as number;\n const scaleLinear = d3\n .scaleLinear()\n .domain([\n 0,\n typeof maxValue === 'number' ? maxValue : fullMax,\n ] as Iterable<d3.NumberValue>)\n .range([0, hundred]);\n\n return {\n fullMax,\n data: data.map((item: HorizontalBarChartData[], index) => {\n if (!fullExtent) {\n scaleLinear.domain([\n 0,\n typeof maxValue === 'number'\n ? maxValue\n : d3.sum(item, ({ value }) => value),\n ] as Iterable<d3.NumberValue>);\n }\n\n return item.map(({ value, ...rest }) => ({\n ...rest,\n value,\n width: scaleLinear(value),\n groupName: labels ? labels[index] : '',\n }));\n }),\n };\n }, [data, fullExtent, maxValue, labels]);\n};\n","import React, { Fragment, useMemo, CSSProperties, ReactNode } from 'react';\n\nimport {\n horizontalBarChartClassNames as classNames,\n StackWrapper,\n} from '../styled';\n\nimport { UseTooltip } from './useTooltip/types';\nimport {\n HorizontalBarChartMarshalingData,\n HorizontalBarChartProps,\n} from '../types';\n\nexport const useStackWrapper = (stackedTooltip?: boolean) => {\n return useMemo(\n () =>\n stackedTooltip\n ? ({\n item,\n mouseMove,\n mouseLeave,\n tooltipBind,\n ...props\n }: {\n style?: CSSProperties;\n item: HorizontalBarChartMarshalingData[];\n tooltipBind: HorizontalBarChartProps['tooltipBind'];\n mouseMove: UseTooltip[0];\n mouseLeave: UseTooltip[1];\n }) => (\n <StackWrapper\n className={classNames.horizontalBarChartStackWrapper}\n onMouseOver={event => mouseMove(event, item)}\n onMouseMove={\n tooltipBind ? event => mouseMove(event, item) : void 0\n }\n onMouseOut={mouseLeave}\n {...props}\n />\n )\n : ({ children }: { children?: ReactNode }) => (\n <Fragment>{children}</Fragment>\n ),\n [stackedTooltip]\n );\n};\n","import styled, { createGlobalStyle } from 'styled-components';\n\nimport { Wrapper } from '../../common/components/Wrapper';\n\nexport const bubbleChartClassNames = {\n bubbleChartYAxis: 'bubbleChartYAxis',\n bubbleChartYAxisZeroTick: 'bubbleChartYAxisZeroTick',\n bubbleChartXAxis: 'bubbleChartXAxis',\n bubbleChartGridGlobal: 'bubbleChartGridGlobal',\n bubbleChartGridLineX: 'bubbleChartGridLineX',\n bubbleChartGridLineY: 'bubbleChartGridLineY',\n bubbleChartCircle: 'bubbleChartCircle',\n bubbleChartYScaleLabel: 'bubbleChartYScaleLabel',\n bubbleChartTooltip: 'bubbleChartTooltip',\n bubbleChartTooltipContainer: 'bubbleChartTooltipContainer',\n bubbleChartTooltipFlex: 'bubbleChartTooltipFlex',\n bubbleChartTip: 'bubbleChartTip',\n};\n\nexport const SvgWrapper = styled(Wrapper)`\n .${bubbleChartClassNames.bubbleChartYAxis},\n .${bubbleChartClassNames.bubbleChartXAxis},\n .${bubbleChartClassNames.bubbleChartGridGlobal} {\n shape-rendering: crispEdges;\n }\n\n .${bubbleChartClassNames.bubbleChartGridLineX},\n .${bubbleChartClassNames.bubbleChartGridLineY} {\n stroke: rgba(149, 149, 149, 0.24);\n }\n\n .${bubbleChartClassNames.bubbleChartYScaleLabel} {\n font-size: 10px;\n }\n`;\n\nexport const TooltipStyles = createGlobalStyle`\n .${bubbleChartClassNames.bubbleChartTooltipContainer} {\n position: absolute;\n transition: opacity 150ms cubic-bezier(0.2, 1, 0.6, 1);\n pointer-events: none;\n z-index: 1;\n }\n`;\n","import styled from 'styled-components';\n\nexport const Tooltip = styled.div`\n width: 0;\n height: 0;\n display: flex;\n align-items: flex-end;\n justify-content: center;\n font-size: 12px;\n white-space: nowrap;\n`;\n","import * as d3 from 'd3';\n\nimport { bubbleChartClassNames as classNames } from './styled';\nimport { appendSvg } from '../../helpers';\nimport { computeDimensions } from '../../helpers/computeDimensions';\nimport { BubbleChartProps } from './types';\nimport { bubbleChartDefaultProps } from './';\nimport { drawGrid } from './drawGrid';\nimport { drawTooltip } from './drawTooltip';\n\nexport const draw = (\n node: HTMLElement | null,\n props: BubbleChartProps\n): void => {\n const {\n data,\n margin,\n xAxisPadding,\n yAxisPadding,\n customYScale,\n customYAxis,\n customXScale,\n customXAxis,\n minSize,\n maxSize,\n minYValue,\n maxYValue,\n drawGridY,\n drawGridX,\n xScaleItemWidth,\n bubbleStyle,\n customize,\n yScaleLabel,\n yScaleLabelPadding,\n enableTooltip,\n tooltipRoot,\n tooltipClassName,\n renderTooltip,\n } = props;\n\n if (node !== null && data.length) {\n const marginTop = margin ? margin.top : 0;\n const marginRight = margin ? margin.right : 0;\n const marginBottom = margin ? margin.bottom : 0;\n const marginLeft = margin ? margin.left : 0;\n const { width: nodeWidth } = node.getBoundingClientRect();\n const width = props.width || nodeWidth;\n const height = props.height || 0;\n const yTicksCountDefault = 6;\n\n const minY =\n typeof minYValue === 'number'\n ? minYValue\n : (d3.min(data, ({ yValue }) => yValue) as number);\n const maxY =\n typeof maxYValue === 'number'\n ? maxYValue\n : (d3.max(data, ({ yValue }) => yValue) as number);\n\n const svg = appendSvg(node, width, height || 0);\n\n const sizeScale = d3\n .scaleLinear()\n .domain([\n d3.min(data, ({ sizeValue }) => sizeValue) as number,\n d3.max(data, ({ sizeValue }) => sizeValue) as number,\n ])\n .range([\n minSize || bubbleChartDefaultProps.minSize,\n maxSize || bubbleChartDefaultProps.maxSize,\n ]);\n\n const yRange1 = height - marginTop - marginBottom - (xAxisPadding || 0);\n\n const yScale = d3\n .scaleLinear()\n .domain([minY, maxY])\n .range([yRange1, marginTop])\n .nice();\n\n customYScale && customYScale(yScale);\n\n const yTicks = yScale.ticks();\n const yAxisLeft = d3.axisLeft(yScale).ticks(yTicksCountDefault);\n\n const yTicksCount = yAxisLeft.tickArguments()[0];\n\n const yAxis = svg\n .append('g')\n .attr('class', classNames.bubbleChartYAxis)\n .call(yAxisLeft);\n\n let yScaleLabelHeight = yScaleLabelPadding || 0;\n\n if (yScaleLabel) {\n const label = svg\n .append('text')\n .text(yScaleLabel)\n .attr('class', classNames.bubbleChartYScaleLabel);\n\n const { width, height } = computeDimensions(label);\n\n yScaleLabelHeight = yScaleLabelHeight + height;\n\n label.attr(\n 'transform',\n `rotate(-90) translate(-${(yRange1 + marginBottom + width) /\n 2}, ${height})`\n );\n }\n\n yAxis.selectAll('.tick').attr('class', value => {\n return value === 0\n ? `tick ${classNames.bubbleChartYAxisZeroTick}`\n : 'tick';\n });\n\n customYAxis && customYAxis(yAxis);\n\n const { width: yAxisWidth } = computeDimensions(yAxis);\n const range = [\n marginLeft + yAxisWidth + (yAxisPadding || 0) + yScaleLabelHeight,\n width - marginRight,\n ];\n\n const xScale = d3\n .scaleLinear()\n .domain([\n d3.min(data, ({ xValue }) => xValue) as number,\n d3.max(data, ({ xValue }) => xValue) as number,\n ])\n .range(range);\n\n customXScale && customXScale(xScale);\n\n const xAxisBottom = d3.axisBottom(xScale);\n\n if (typeof xScaleItemWidth === 'number') {\n const [x1, x2] = xScale.range();\n const chartWidth = x2 - x1;\n\n xAxisBottom\n .ticks(Math.round(chartWidth / xScaleItemWidth))\n .tickSizeOuter(0);\n }\n\n const xAxis = svg\n .append('g')\n .call(xAxisBottom)\n .attr('class', classNames.bubbleChartXAxis);\n\n customXAxis && customXAxis(xAxis);\n\n yAxis.attr(\n 'transform',\n `translate(${marginLeft + yAxisWidth + yScaleLabelHeight}, 0)`\n );\n\n drawGrid({\n svg,\n yScale,\n xScale,\n yTicksCount,\n drawGridY,\n drawGridX,\n });\n\n xAxis.attr(\n 'transform',\n `translate(0, ${yScale(yTicks[0]) + (xAxisPadding || 0)})`\n );\n\n const bubbles = svg\n .append('g')\n .selectAll('dot')\n .data(data)\n .enter()\n .append('circle')\n .attr('class', classNames.bubbleChartCircle)\n .attr('cx', ({ xValue }) => xScale(xValue))\n .attr('cy', ({ yValue }) => yScale(yValue))\n .attr('r', ({ sizeValue }) => sizeScale(sizeValue) / 2)\n .attr('fill', ({ color }) => color || 'rgba(0, 176, 113, 0.6)')\n .attr('stroke', ({ stroke }) => stroke || 'transparent')\n .attr('style', ({ style }) => style || bubbleStyle || '');\n\n if (enableTooltip) {\n drawTooltip({ bubbles, tooltipRoot, tooltipClassName, renderTooltip });\n }\n\n customize && customize({ svg, bubbles, yScale, xScale, sizeScale });\n }\n};\n","import { DrawGridProps } from './types';\n\nimport { bubbleChartClassNames } from '../styled';\n\nexport const drawGrid = ({\n svg,\n yScale,\n xScale,\n yTicksCount,\n drawGridX,\n drawGridY,\n}: DrawGridProps) => {\n if (!drawGridY && !drawGridX) return;\n const [min, max] = xScale.domain();\n\n const global = svg\n .append('g')\n .attr('class', bubbleChartClassNames.bubbleChartGridGlobal);\n\n const yTicks = yScale.ticks(yTicksCount);\n\n if (drawGridX) {\n global\n .append('g')\n .selectAll('line')\n .data(yTicks)\n .join('line')\n .attr('class', bubbleChartClassNames.bubbleChartGridLineX)\n .attr('x1', () => xScale(min))\n .attr('x2', () => xScale(max))\n .attr('y1', (d: number) => Math.round(yScale(d)))\n .attr('y2', (d: number) => Math.round(yScale(d)));\n }\n\n if (drawGridY) {\n global\n .append('g')\n .selectAll('line')\n .data(xScale.ticks(yTicksCount))\n .join('line')\n .attr('class', bubbleChartClassNames.bubbleChartGridLineY)\n .attr('x1', (d: number) => Math.round(xScale(d)))\n .attr('x2', (d: number) => Math.round(xScale(d)))\n .attr('y1', () => Math.round(yScale(yTicks[0])))\n .attr('y2', () => Math.round(yScale(yTicks[yTicks.length - 1])));\n }\n};\n","import React from 'react';\nimport ReactDOMServer from 'react-dom/server';\nimport * as d3 from 'd3';\n\nimport { Tooltip } from './styled';\nimport { bubbleChartClassNames as classNames } from '../styled';\nimport { TooltipContainer } from '../../../common/components/tooltips';\nimport { DrawTooltipProps } from './types';\n\nexport const drawTooltip = ({\n bubbles,\n tooltipRoot,\n tooltipClassName,\n renderTooltip,\n}: DrawTooltipProps) => {\n const root: Element | null = tooltipRoot || document.querySelector('body');\n const format = d3.format(',');\n\n let container: d3.Selection<any, unknown, any, any> = d3\n .select(root)\n .select(`.${classNames.bubbleChartTooltip}`);\n\n if (container.node() === null) {\n container = d3\n .select(root)\n .append('div')\n .attr('class', classNames.bubbleChartTooltip);\n }\n\n let tooltip: d3.Selection<\n HTMLDivElement,\n unknown,\n d3.BaseType,\n any\n > = container\n .append('div')\n .attr(\n 'class',\n `${classNames.bubbleChartTooltipContainer} ${tooltipClassName || ''}`\n )\n .style('opacity', '0');\n\n bubbles.on('mouseover.tooltip', (event, data) => {\n const { sizeValue } = data;\n const circle = event.currentTarget as SVGCircleElement;\n const { x, y, width } = circle.getBoundingClientRect();\n const left = window.pageXOffset + x + width / 2;\n const top = window.pageYOffset + y;\n\n tooltip\n .style('left', `${left}px`)\n .style('top', `${top}px`)\n .html(() => {\n const html = ReactDOMServer.renderToString(\n <Tooltip className={classNames.bubbleChartTooltipFlex}>\n <TooltipContainer className={classNames.bubbleChartTip}>\n {format(sizeValue)}\n </TooltipContainer>\n </Tooltip>\n );\n\n return html;\n });\n\n renderTooltip && renderTooltip({ tooltip, data, circle });\n\n tooltip.style('opacity', '1');\n });\n\n bubbles.on('mouseout.tooltip', () => {\n tooltip.style('opacity', '0');\n });\n};\n","import React, { useEffect } from 'react';\n\nimport { BubbleChartProps } from './types';\n\nimport { useNode } from '../../hooks';\nimport { useResize } from '../../hooks';\n\nimport { draw } from './draw';\nimport { unmount } from './unmount';\n\nimport { SvgWrapper, TooltipStyles } from './styled';\n\nexport const BubbleChart: React.FC<BubbleChartProps> = (\n props\n): React.ReactElement => {\n const { className, style, children, tooltipRoot } = props;\n const [ref, node] = useNode();\n\n useEffect(() => {\n node && draw(node, props);\n }, [node, props]);\n\n useEffect(() => {\n return () => unmount(tooltipRoot);\n }, [tooltipRoot]);\n\n const onDraw = () => draw(node, props);\n\n useResize(props.width, onDraw);\n\n return (\n <div className={className} style={style}>\n <TooltipStyles />\n <SvgWrapper ref={ref}>{children}</SvgWrapper>\n </div>\n );\n};\n\nexport const bubbleChartDefaultProps = {\n height: 280,\n minSize: 6,\n maxSize: 30,\n margin: {\n top: 10,\n right: 15,\n bottom: 10,\n left: 0,\n },\n yAxisPadding: 10,\n xAxisPadding: 10,\n yScaleLabelPadding: 10,\n};\n\nBubbleChart.defaultProps = bubbleChartDefaultProps;\n","import * as d3 from 'd3';\n\nimport { bubbleChartClassNames as classNames } from './styled';\n\nexport const unmount = (tooltipRoot?: Element) => {\n const root: Element | null = tooltipRoot || document.querySelector('body');\n\n d3.select(root)\n .select(`.${classNames.bubbleChartTooltip}`)\n .remove();\n};\n"],"names":["Wrapper","styled","div","useNode","node","onSetNode","useState","useCallback","useResize","width","callback","delay","throttledCallback","useMemo","fn","wait","isCalled","setTimeout","throttle","undefined","useEffect","window","addEventListener","removeEventListener","appendSvg","height","d3","select","remove","append","attr","SwipeScrollContainer","easeOutQuad","time","range","num","min","max","Math","defaultRefs","animation","speed","timestamp","startX","currentX","SwipeScroll","children","onSwipe","props","ref","draggingNode","duration","animationFunc","container","body","documentSelect","document","refs","useRef","current","cancelAnimationFrame","onMove","event","nodeWidth","getBoundingClientRect","x","type","includes","touches","translateX","style","hundred","now","Date","speedX","round","onEnd","on","timing","draw","start","performance","requestId","requestAnimationFrame","requestAnimate","timeFraction","progress","animate","px","currX","maxX","transX","onStart","isTouch","left","parentElement","useSwipe","React","defaultProps","getTranslate","anchor","index","translateY","LabelContainer","attrs","transform","Label","Name","middleBadgeStyles","css","DefaultBadge","MiddleBadge","BadgePrefix","radarChartclassNames","radar","radarAxis","radarAxisTextGlobal","radarAxisText","radarPolygon","radarLabel","radarLabelName","radarLabelBadge","radarLabelBadgePrefix","radarCircle","SvgWrapper","data","curve","polar","formatValue","badgePrefix","labelOffset","circleRadius","svgElements","renderLabel","customize","formatAxisValue","radarStyles","labelIndex","selectLabel","length","defaultBleedLength","bleedLength","defaultHeight","minValue","i","map","value","maxValue","paddingY","radius","paddingX","defaultLevels","ticks","domain","levels","lastTick","newLastTick","push","newMaxValue","angleSlice","PI","radiusScale","radarLine","angle","_","radarValue","svg","globalCenter","levelsGrid","reverse","axisGridY","getAxisValue","gridGlobal","selectAll","enter","radarGlobal","axis","name","maxGridHeight","forEach","circleHeight","pathHeight","Array","from","radiusByMaxValue","cos","sin","join","d","dataItem","format","text","axisValue","item","circleGlobal","defaultLabelOffset","heightInner","offset","dataLength","xOffset","yOffset","d3container","pxToValue","axisY","ceil","y","deg","count","degByIndex","halfAngle","getTextAnchor","html","ReactDOMServer","renderToString","top","label","drawRadialLabels","items","Badge","className","RadarChart","degreesToRadians","degrees","pieChartclassNames","pieGlobal","pieSlice","pieSliceLabel","pieSliceLabelValue","pieSliceLabelName","pieRadialLabel","pieRadialLink","pieTooltipContainer","pieTooltipFlex","pieTooltip","pieTooltipItem","pieTooltipName","pieTooltipValue","pieTooltipColorBox","pieFullChartTooltipCircle","getMidFactor","startAngle","endAngle","getAlign","TooltipFlex","LabelFlex","LabelFlexCenter","TooltipContainer","TooltipGroupName","TooltipItem","ColFlex","ColorBox","ColorLine","Value","LabelTop","LabelBottom","padAngle","onClick","outerRadius","cornerRadius","margin","enableSlicesLabels","formatSliceLabel","slicesLabelsSkipAngle","enableSlicesLabelsName","formatSliceLabelName","borderWidth","borderColor","enableRadialLabels","backgroundColor","radialLabelsLinkHorizontalLength","radialLabelsTextXOffset","formatRadialLabel","radialLabelYOffset","formatSliceTitle","radialAngleXOffset","withTooltip","fullChartTooltip","tooltipClassName","tooltipBind","renderTooltip","tooltipStyle","marginTop","marginRight","right","marginBottom","bottom","marginLeft","global","maxPadAngle","dividerPadAngle","fullAngle","dataReady","sort","pie","maxOuterRadius","arc","innerRadius","allSlices","color","centroid","defaultRadialLabelsLinkHorizontalLength","outerArc","midFactor","posA","posB","posC","posCPi","getPosition","pos","defaultRadialLabelsTextXOffset","tooltipRoot","querySelector","classNames","tooltipContainer","empty","Object","entries","prop","val","isVisible","setVisible","visible","Boolean","setPosition","pieChartDatum","itemX","itemY","target","globalNode","itemWidth","itemHeight","arcX","arcY","setTooltip","pieChartData","key","drawTooltip","PieChart","legendClassNames","legendContainer","legendTitle","legendTick","legendTickLine","legendTickText","ramp","n","canvas","createElement","context","getContext","fillStyle","fillRect","legendDefaultParams","tickSize","ticksDivier","titleMarginBottom","calendarChartClassNames","calendarChart","calendarYear","calendarAxis","calendarBody","calendarHeader","calendarYearTitle","calendarWeekDay","calendarMonth","calendarDays","calendarDay","CalendarChart","startSunday","weekdays","cellOffset","cellSize","interpolator","monthSpacing","colorRange","legendProps","onEachDay","years","date","getUTCFullYear","weekDays","defaultCellSize","countDay","days","sundayIndex","formatDay","formatDate","timeWeek","getTimeWeekCount","to","getMonthSpacing","getUTCMonth","formatMonth","chartWidth","values","year","months","weekCount","calendarWeekdays","each","elements","element","currColor","getUTCDay","legend","title","tickFormat","tickValues","interpolate","copy","rangeRound","toDataURL","assign","call","g","tick","getLegend","containerNode","legendSvg","appendChild","computeDimensions","selection","dimensions","SVGGraphicsElement","getBBox","none","isVoid","Number","isNaN","lineChartClassNames","lineChartYScaleGlobal","lineChartXScaleGlobal","lineChartLinesGlobal","lineChartLine","lineChartAreasGlobal","lineChartArea","lineChartDotsGlobalContainer","lineChartDotsGlobal","lineChartDot","lineChartGridGlobal","lineChartGridLineX","lineChartGridLineY","lineChartLabelContainer","lineChartLabelFlex","lineChartLabel","lineChartMouseGlobal","lineChartMouseLine","lineChartMouseRect","lineChartMouseCircle","lineChartMouseLabelContainer","lineChartMouseLabel","TooltipStyles","createGlobalStyle","chartData","labels","customYAxisSelection","customXAxisSelection","customYAxis","customXAxis","yAxisPadding","xAxisPadding","drawGridY","drawGridX","withLabels","formatLabel","eachLabel","stacked","dynamicTooltipEnable","dynamicCircleRadius","formatDynamicTooltip","stackedTooltip","stackedTooltipIndex","tooltipLineTop","customYScale","customLine","xScaleItemWidth","areaCurve","stacks","valuesIndex","prevValue","abs","stackedData","yScale","nice","yTicksCountDefault","yAxisLeft","yTicksCount","tickArguments","yAxis","yAxisWidth","lastIndex","reduce","acc","xScale","xAxisBottom","x1","x2","tickSizeOuter","yTicks","drawGrid","isArray","xAxis","xAxisHeight","line","defined","some","fill","dataIndex","getArea","minAreaValues","minTick","y0","currData","y1","filter","area","areaStyle","stroke","dots","dot","dotsGlobal","dotsGroup","labelsDiv","drawLabel","argData","tooltipOff","y2","mouseGlobal","mouseRect","mouseLine","lines","nodes","circles","dynamicDotOff","labelContainer","size","opacity","mouseMove","docX","docY","rectrX","nodeX","nodeY","currIndex","invert","positions","getValue","floor","hasAttribute","beginning","end","getTotalLength","getPointAtLength","lineChartData","dynamicDotStyle","datas","invertValue","noHasData","every","topIndex","keys","_datas$Number","_datas$Number2","labelTexts","indexX","indexY","LineChart","barChartLinesClassNames","barChartLinesGlobal","barChartLine","barChartAreasGlobal","barChartArea","barChartClassNames","barChartBarGlobal","barChartYScaleGlobal","barChartYAxis","barChartXAxis","barChartYAxisZeroTick","barChartGridGlobal","barChartGridLineX","barChartGridLineXZero","barChartGridLineYZero","barChartGridLineY","barChartMouseRect","barChartMouseContainer","barChartTooltipFlex","barChartMouseTooltip","barChartTooltip","barChartTooltipItem","barChartTooltipColFlex","barChartTooltipGroupName","barChartColorBox","barChartColorLine","barChartTooltipName","barChartTooltipValue","barChartLabelContainer","barChartLabelFlex","barChartLabel","lineData","barWidth","barWidthProp","barPadding","colors","customXScale","customYAxisLeft","customXAxisBottom","customBars","labelPosition","tooltipY","stackedLine","formatTooltipValue","formatTooltipName","sectionPadding","minValuesLine","tooltipYDomain","marshalledMap","minDomainValue","maxDomainValue","drawBars","setTooltipPosition","onLabelItem","isBarTooltip","defaultBarWidth","barDomain","MIN","POSITIVE_INFINITY","MAX","NEGATIVE_INFINITY","groups","groupMax","groupMin","group","stackMax","stackMin","groupKey","getDomain","groupName","groupPadding","barsWidth","curr","_key","resizeBarWidth","array","marshalled","groupIndex","marshalledGroup","bandwidth","groupsKeys","stackIndex","groupKeys","barGroupWidth","isPositiveValue","EPSILON","marshaling","marshalledData","getX","step","padding","toString","bars","getBars","linesSelection","areasSelection","linesData","lineType","areasData","drawLines","xScaleBandDomain","topYDomain","lineMin","tooltip","barChartTootipFlex","flagCurrIndex","offsetX","offsetY","findIndex","containts","elementsFromPoint","clientX","clientY","currBars","currLineData","concat","svgWidth","concatedData","stack","stacksCount","indexFlag","LabelFlexStyled","LabelStyle","LabelUI","getLabel","getLabelY","BarChart","horizontalBarChartClassNames","horizontalBarChartButtonTd","horizontalBarChartLabelTd","horizontalBarChartLabelCell","horizontalBarChartBarTd","horizontalBarChartBarFlex","horizontalBarChartBar","horizontalBarChartBarFirst","horizontalBarChartBarLast","horizontalBarChartBarOnly","horizontalBarChartTooltipFlex","horizontalBarChartStackWrapper","horizontalBarChartTooltipContainer","horizontalBarChartStackSumContainer","horizontalBarChartStackSum","horizontalBarChartXScaleTd","horizontalBarChartXScaleTicks","horizontalBarChartXScaleTick","horizontalBarChartTooltipItem","horizontalBarChartTooltipName","horizontalBarChartTooltipValue","Table","table","LabelCell","BarFlex","BarsTd","td","TooltipFlexUI","StackSumContainer","StackSum","StackWrapper","Tooltip","rootElement","BarStyled","Bar","bar","formatNativeTitle","mouseLeave","pointerEventsNone","isFirstChild","isLastChild","isOnlyChild","ceiledWidth","onMouseMove","onMouseLeave","pointerEvents","onMouseOver","onMouseOut","TickTd","Ticks","Tick","XScale","scaleTicks","renderTicks","scaleDomain","scaleLinear","useScale","justifyContent","HorizontalBarChart","fullExtent","withStackSum","renderButton","renderDataTable","thead","withoutXScale","hideTooltip","fullMax","marshalingData","useMarshaling","unmountComponentAtNode","barX","barY","visibility","render","useTooltip","Stack","Fragment","useStackWrapper","flat","rowIndex","stackSum","sumWidth","barIndex","bubbleChartClassNames","bubbleChartYAxis","bubbleChartYAxisZeroTick","bubbleChartXAxis","bubbleChartGridGlobal","bubbleChartGridLineX","bubbleChartGridLineY","bubbleChartCircle","bubbleChartYScaleLabel","bubbleChartTooltip","bubbleChartTooltipContainer","bubbleChartTooltipFlex","bubbleChartTip","minSize","maxSize","minYValue","maxYValue","bubbleStyle","yScaleLabel","yScaleLabelPadding","enableTooltip","minY","yValue","maxY","sizeScale","sizeValue","bubbleChartDefaultProps","yRange1","yScaleLabelHeight","xValue","bubbles","root","circle","currentTarget","pageXOffset","pageYOffset","BubbleChart","unmount"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"charts.cjs.production.min.js","sources":["../src/common/components/Wrapper.ts","../src/hooks/useNode.ts","../src/hooks/useResize.ts","../src/helpers/throttle.ts","../src/helpers/appendSvg.ts","../src/common/components/SwipeScroll/styled.ts","../src/common/components/SwipeScroll/animate.ts","../src/common/components/SwipeScroll/hooks/useSwipe.ts","../src/common/components/SwipeScroll/index.tsx","../src/charts/RadarChart/drawRadialLabels/styled.ts","../src/common/components/labels/index.ts","../src/charts/RadarChart/styled.ts","../src/charts/RadarChart/draw.tsx","../src/charts/RadarChart/drawRadialLabels/index.tsx","../src/charts/RadarChart/helpers.ts","../src/charts/RadarChart/index.tsx","../src/helpers/math.ts","../src/charts/PieChart/styled.ts","../src/charts/PieChart/drawRadialLabels/helpers.ts","../src/common/components/tooltips/index.ts","../src/charts/PieChart/draw.tsx","../src/charts/PieChart/drawRadialLabels/index.tsx","../src/charts/PieChart/drawTooltips/index.tsx","../src/charts/PieChart/index.tsx","../src/helpers/getLegend/index.ts","../src/charts/CalendarChart/styled.ts","../src/charts/CalendarChart/index.tsx","../src/charts/CalendarChart/draw.ts","../src/helpers/computeDimensions.ts","../src/helpers/common.ts","../src/charts/LineChart/styled.ts","../src/charts/LineChart/drawLabel/styled.ts","../src/charts/LineChart/draw.ts","../src/helpers/stackedData.ts","../src/charts/LineChart/drawGrid/index.ts","../src/charts/LineChart/drawLabel/index.tsx","../src/charts/LineChart/drawTooltip/index.tsx","../src/charts/LineChart/index.tsx","../src/charts/BarChart/drawLines/index.ts","../src/charts/BarChart/styled.ts","../src/charts/BarChart/draw.ts","../src/charts/BarChart/getDomain.ts","../src/charts/BarChart/resizeBarWidth/index.ts","../src/charts/BarChart/marshaling.ts","../src/charts/BarChart/drawGrid/index.ts","../src/charts/BarChart/getBars/index.ts","../src/charts/BarChart/drawTooltip/index.tsx","../src/charts/BarChart/drawTooltip/getLabel.tsx","../src/charts/BarChart/drawTooltip/getLabelY.ts","../src/charts/BarChart/index.tsx","../src/charts/HorizontalBarChart/styled.ts","../src/charts/HorizontalBarChart/Tooltip/index.tsx","../src/charts/HorizontalBarChart/hooks/useTooltip/index.tsx","../src/charts/HorizontalBarChart/Bar/styled.ts","../src/charts/HorizontalBarChart/Bar/index.tsx","../src/charts/HorizontalBarChart/XScale/styled.ts","../src/charts/HorizontalBarChart/XScale/index.tsx","../src/charts/HorizontalBarChart/XScale/hooks/useScale.ts","../src/charts/HorizontalBarChart/index.tsx","../src/charts/HorizontalBarChart/hooks/useMarshaling.ts","../src/charts/HorizontalBarChart/hooks/useStackWrapper.tsx","../src/charts/BubbleChart/styled.ts","../src/charts/BubbleChart/drawTooltip/styled.ts","../src/charts/BubbleChart/draw.ts","../src/charts/BubbleChart/drawGrid/index.ts","../src/charts/BubbleChart/drawTooltip/index.tsx","../src/charts/BubbleChart/index.tsx","../src/charts/BubbleChart/unmount.ts"],"sourcesContent":["import styled from 'styled-components';\n\nexport const Wrapper = styled.div`\n position: relative;\n width: 100%;\n box-sizing: border-box;\n`;\n","import { PropsWithRef, useCallback, useState } from 'react';\n\nexport function useNode(): [PropsWithRef<any>, HTMLElement | null] {\n const [node, onSetNode] = useState<HTMLElement | null>(null);\n\n const ref = useCallback(onSetNode, [onSetNode]);\n\n return [ref, node];\n}\n","import { useEffect, useMemo } from 'react';\n\nimport { throttle } from '../helpers/throttle';\n\nconst THROTTLE_DELAY = 44;\n\nexport const useResize = (\n width?: number,\n callback?: (...args: any) => any,\n delay?: number\n) => {\n const throttledCallback: VoidFunction | undefined = useMemo(() => {\n return callback ? throttle(callback, delay || THROTTLE_DELAY) : undefined;\n }, [callback, delay]);\n\n useEffect(() => {\n throttledCallback &&\n typeof width !== 'number' &&\n window.addEventListener('resize', throttledCallback);\n\n return () =>\n throttledCallback &&\n window.removeEventListener('resize', throttledCallback);\n }, [width, throttledCallback]);\n};\n","export function throttle(fn: Function, wait: number) {\n let isCalled = false;\n\n return function(...args: any) {\n if (!isCalled) {\n fn(...args);\n isCalled = true;\n setTimeout(function() {\n isCalled = false;\n }, wait);\n }\n };\n}\n","import * as d3 from 'd3';\n\nexport const appendSvg = (node: HTMLElement, width: number, height: number) => {\n d3.select(node)\n .select('svg')\n .remove();\n\n const svg = d3\n .select(node)\n .append('svg')\n .attr('width', width)\n .attr('height', height);\n\n return svg;\n};\n","import styled from 'styled-components';\n\nexport const SwipeScrollContainer = styled.div`\n width: 100%;\n overflow: hidden;\n user-select: none;\n`;\n","export function animate({\n duration,\n timing,\n draw,\n}: {\n duration: number;\n timing: (n: number) => number;\n draw: (progress: number, requestId: number) => void;\n}): void {\n const start = performance.now();\n let requestId: number;\n\n requestAnimationFrame(function requestAnimate(time) {\n let timeFraction = (time - start) / duration;\n\n if (timeFraction < 1) {\n requestId = requestAnimationFrame(requestAnimate);\n }\n\n if (timeFraction > 1) cancelAnimationFrame(requestId);\n const progress = timing(timeFraction);\n\n draw(progress, requestId);\n });\n}\n\nexport const easeOutQuad = (time: number): number => time * (2 - time);\n","import { useEffect, useRef, useCallback } from 'react';\nimport * as d3 from 'd3';\n\nimport { animate, easeOutQuad } from '../animate';\n\nimport { SwipeScrollProps } from '../types';\n\nconst range = (num: number, min: number, max: number) =>\n Math.min(Math.max(num, min), max);\n\nconst defaultRefs = {\n animation: 0,\n speed: 0,\n timestamp: 0,\n startX: 0,\n currentX: 0,\n};\n\nexport const useSwipe = (\n node: HTMLElement | null,\n { width, duration, animationFunc, onSwipe }: SwipeScrollProps\n) => {\n const container = d3.select(node);\n const body = d3.select('body');\n const documentSelect = d3.select(document);\n const refs = useRef(defaultRefs);\n\n useEffect(() => {\n if (width && refs.current.animation) {\n cancelAnimationFrame(refs.current.animation);\n refs.current = defaultRefs;\n }\n }, [width]);\n\n const onMove = useCallback(\n event => {\n const { width: nodeWidth } = node\n ? node.getBoundingClientRect()\n : { width: 0 };\n const [x] = d3.pointer(\n event.type.includes('touch') ? event.touches[0] : event\n );\n const newX = x - refs.current.startX;\n const maxX = width - nodeWidth;\n const translateX = range(newX, -maxX, 0);\n\n container.style('transform', `translateX(${translateX}px)`);\n\n if (refs.current.currentX) {\n const hundred = 100;\n const now = Date.now();\n const dt = now - refs.current.timestamp;\n const dx = translateX - refs.current.currentX;\n const speedX = Math.round((dx / dt) * hundred);\n\n refs.current.speed = speedX;\n refs.current.timestamp = now;\n }\n\n refs.current.currentX = translateX;\n\n onSwipe && onSwipe(translateX, container);\n },\n [onSwipe, width, node, container]\n );\n\n const onEnd = useCallback(() => {\n const { width: nodeWidth } = node\n ? node.getBoundingClientRect()\n : { width: 0 };\n\n documentSelect.on(\n 'mousemove.swipe touchmove.swipe mouseup.swipe touchend.swipe',\n null\n );\n body.style('cursor', null);\n if (width > nodeWidth) {\n container.style('cursor', 'grab');\n } else {\n container.style('cursor', null);\n }\n\n const dt = Date.now() - refs.current.timestamp;\n const dtEnd = 44;\n\n if (dt < dtEnd) {\n animate({\n duration: duration as number,\n timing: animationFunc || easeOutQuad,\n draw: (progress, requestId) => {\n refs.current.animation = requestId;\n const px = Math.round(refs.current.speed * 2 * progress);\n const currX = refs.current.currentX + px;\n const maxX = width - nodeWidth;\n const translateX = range(currX, -maxX, 0);\n\n const transX = Math.max(Math.min(currX, maxX), 0);\n\n if (refs.current.currentX !== transX) {\n container.style('transform', `translateX(${translateX}px)`);\n\n onSwipe && onSwipe(translateX, container);\n }\n },\n });\n }\n }, [\n body,\n animationFunc,\n onSwipe,\n container,\n duration,\n node,\n width,\n documentSelect,\n ]);\n\n const onStart = useCallback(\n event => {\n const isTouch = event.type.includes('touch');\n const [x] = d3.pointer(isTouch ? event.touches[0] : event, node);\n\n const { left } =\n node && node.parentElement\n ? node.parentElement.getBoundingClientRect()\n : { left: 0 };\n body.style('cursor', 'grabbing');\n container.style('cursor', 'grabbing');\n\n if (refs.current.animation) {\n cancelAnimationFrame(refs.current.animation);\n refs.current = defaultRefs;\n }\n\n refs.current.startX = Math.max(x + left, 0);\n documentSelect.on('mousemove.swipe touchmove.swipe', onMove);\n documentSelect.on('mouseup.swipe touchend.swipe', onEnd);\n },\n [container, body, node, onEnd, onMove, documentSelect]\n );\n\n useEffect(() => {\n if (node) {\n const { width: nodeWidth } = node.getBoundingClientRect();\n\n if (width > nodeWidth) {\n container.style('cursor', 'grab');\n container.on('mousedown.swipe touchstart.swipe', onStart);\n }\n }\n }, [container, onStart, node, width]);\n};\n","import React from 'react';\n\nimport { SwipeScrollContainer } from './styled';\n\nimport { useNode } from '../../../hooks';\nimport { useSwipe } from './hooks/useSwipe';\n\nimport { SwipeScrollProps } from './types';\n\nexport const SwipeScroll: React.FC<SwipeScrollProps> = ({\n children,\n width,\n onSwipe,\n ...props\n}): React.ReactElement => {\n const [ref, draggingNode] = useNode();\n\n useSwipe(draggingNode, { width, onSwipe, ...props });\n\n return (\n <SwipeScrollContainer {...props}>\n <div ref={ref}>{children}</div>\n </SwipeScrollContainer>\n );\n};\n\nSwipeScroll.defaultProps = {\n duration: 1400,\n};\n","import styled from 'styled-components';\n\nimport { LabelContainerProps } from './types';\n\nconst getTranslate = ({\n anchor,\n index,\n translateX,\n translateY,\n}: LabelContainerProps) => {\n if (index === 0 && anchor === 'middle') {\n return `translate(calc(-50% + ${translateX}px), calc(-100% + ${translateY}px))`;\n } else if (anchor === 'middle') {\n return `translate(calc(-50% + ${translateX}px), calc(${translateY}px))`;\n } else if (anchor === 'start') {\n return `translate(calc(${translateX}px), calc(-50% + ${translateY}px))`;\n } else if (anchor === 'end') {\n return `translate(calc(-100% + ${translateX}px), calc(-50% + ${translateY}px))`;\n }\n return `translate(${translateX}px, ${translateY}px)`;\n};\n\nexport const LabelContainer = styled.div.attrs<LabelContainerProps>(props => ({\n style: {\n transform: getTranslate(props),\n },\n}))<LabelContainerProps>`\n position: absolute;\n`;\n","import styled, { css } from 'styled-components';\n\nimport { LabelContainerProps } from './types';\n\nexport const getTranslate = ({\n anchor,\n index,\n translateX,\n translateY,\n}: LabelContainerProps) => {\n if (index === 0 && anchor === 'middle') {\n return `translate(calc(-50% + ${translateX}px), calc(-100% + ${translateY}px))`;\n } else if (anchor === 'middle') {\n return `translate(calc(-50% + ${translateX}px), calc(${translateY}px))`;\n } else if (anchor === 'start') {\n return `translate(calc(${translateX}px), calc(-50% + ${translateY}px))`;\n } else if (anchor === 'end') {\n return `translate(calc(-100% + ${translateX}px), calc(-50% + ${translateY}px))`;\n }\n return `translate(${translateX}px, ${translateY}px)`;\n};\n\nexport const Label = styled.div`\n display: flex;\n align-items: center;\n font-size: 12px;\n`;\n\nexport const Name = styled.div`\n text-align: center;\n max-width: 120px;\n`;\n\nconst middleBadgeStyles = css`\n position: absolute;\n top: 50%;\n right: 0;\n transform: translate(calc(100% + 6px), -50%);\n`;\n\nexport const DefaultBadge = styled.div`\n display: flex;\n align-items: center;\n padding: 2px 4px;\n border-radius: 4px;\n color: rgb(255, 255, 255);\n background-color: rgb(144, 197, 61);\n margin-left: 8px;\n`;\n\nexport const MiddleBadge = styled(DefaultBadge)`\n ${middleBadgeStyles}\n`;\n\nexport const BadgePrefix = styled.div`\n margin-left: 4px;\n font-size: 10px;\n color: rgba(255, 255, 255, 0.54);\n`;\n","import styled from 'styled-components';\n\nimport { Wrapper } from '../../common/components/Wrapper';\n\nexport const radarChartclassNames = {\n radar: 'radar',\n radarAxis: 'radarAxis',\n radarAxisTextGlobal: 'radarAxisTextGlobal',\n radarAxisText: 'radarAxisText',\n radarPolygon: 'radarPolygon',\n radarLabel: 'radarLabel',\n radarLabelName: 'radarLabelName',\n radarLabelBadge: 'radarLabelBadge',\n radarLabelBadgePrefix: 'radarLabelBadgePrefix',\n radarCircle: 'radarCircle',\n};\n\nexport const SvgWrapper = styled(Wrapper)`\n .${radarChartclassNames.radarAxis} {\n path,\n line,\n circle {\n fill: none;\n stroke-width: 1px;\n stroke: rgba(149, 149, 149, 0.18);\n }\n }\n .${radarChartclassNames.radarAxisText} {\n font-size: 12px;\n fill-opacity: 0.56;\n }\n .${radarChartclassNames.radarPolygon} {\n fill-opacity: 0.06;\n stroke-width: 2px;\n fill: rgb(144, 197, 61);\n stroke: rgb(144, 197, 61);\n }\n .${radarChartclassNames.radarCircle} {\n fill: rgb(144, 197, 61);\n }\n`;\n","import React from 'react';\nimport ReactDOMServer from 'react-dom/server';\nimport * as d3 from 'd3';\n\nimport { RadarChartProps } from './types';\n\nimport { appendSvg } from '../../helpers';\nimport { drawRadialLabels } from './drawRadialLabels';\n\nimport {\n Label,\n MiddleBadge,\n DefaultBadge,\n Name,\n BadgePrefix,\n} from '../../common/components/labels';\nimport { radarChartclassNames } from './styled';\n\nexport const draw = (\n node: HTMLElement | null,\n props: RadarChartProps\n): void => {\n const {\n data,\n curve,\n polar,\n formatValue,\n badgePrefix,\n labelOffset,\n circleRadius,\n svgElements,\n renderLabel,\n customize,\n formatAxisValue,\n radarStyles,\n labelIndex,\n selectLabel,\n } = props;\n\n if (node !== null && data.length) {\n const defaultBleedLength = 10;\n const bleedLength =\n typeof props.bleedLength === 'number'\n ? props.bleedLength\n : defaultBleedLength;\n\n const { width: nodeWidth } = node.getBoundingClientRect();\n const width = props.width || nodeWidth;\n const defaultHeight = 400;\n const height = props.height || defaultHeight;\n\n const minValue =\n props.minValue ||\n Math.min(\n 0,\n d3.min(data, i => d3.min(i.map(({ value }) => value))) as number\n );\n const maxValue =\n (props.maxValue ||\n Math.max(\n 0,\n d3.max(data, i => d3.max(i.map(({ value }) => value))) as number\n )) - minValue;\n const paddingX = props.paddingX || 0;\n const paddingY = props.paddingY || 0;\n const radius = Math.min(\n (width - paddingX * 2 - bleedLength * 2) / 2,\n (height - paddingY * 2 - bleedLength * 2) / 2\n );\n\n const defaultLevels = 4;\n const ticks = d3\n .scaleLinear()\n .domain([0, maxValue || 1])\n .range([])\n .ticks(props.levels || defaultLevels);\n const lastTick = ticks[ticks.length - 1];\n const newLastTick = lastTick + (ticks[1] - ticks[0]);\n\n if (lastTick < maxValue) {\n ticks.push(newLastTick);\n }\n\n const levels = props.levels || ticks.length - 1;\n const newMaxValue = ticks[ticks.length - 1];\n const angleSlice = (Math.PI * 2) / data[0].length;\n\n const radiusScale = d3\n .scaleLinear()\n .range([0, radius])\n .domain([0, newMaxValue]);\n\n const radarLine = d3\n .lineRadial()\n .curve(d3.curveLinearClosed)\n // @ts-ignore\n .radius(({ value }) => radiusScale(value) as number)\n .angle((_, i) => i * angleSlice);\n const radarValue = d3\n .lineRadial()\n .curve(curve || d3.curveLinearClosed)\n // @ts-ignore\n .radius(({ value }) => radiusScale(value) as number)\n .angle((_, i) => i * angleSlice);\n\n const svg = appendSvg(node, width, height);\n const globalCenter = svg.append('g');\n\n const levelsGrid = d3.range(1, levels + 1).reverse();\n const axisGridY = (value: number) => (-value * radius) / levels;\n const getAxisValue = (value: number) => (newMaxValue * value) / levels;\n\n const gridGlobal = globalCenter\n .append('g')\n .attr('class', radarChartclassNames.radarAxis)\n .selectAll()\n .data([data[0]])\n .enter();\n\n const radarGlobal = globalCenter\n .append('g')\n .attr('class', radarChartclassNames.radar);\n\n const axis = gridGlobal\n .selectAll()\n .data(data[0].map(({ name }) => name))\n .enter();\n\n let maxGridHeight = 0;\n\n if (polar) {\n levelsGrid.forEach(value => {\n const path = gridGlobal\n .append('circle')\n .attr('cx', 0)\n .attr('cy', 0)\n .attr('r', () => (radius / levels) * value);\n\n const circleNode = path.node() as SVGCircleElement;\n const circleHeight = circleNode.getBoundingClientRect().height;\n maxGridHeight = Math.max(maxGridHeight, circleHeight);\n });\n } else {\n levelsGrid.map(getAxisValue).forEach(value => {\n const path = gridGlobal.append('path').attr('d', () =>\n // @ts-ignore\n radarLine(Array.from({ length: data[0].length }, () => ({ value })))\n );\n const pathNode = path.node() as SVGPathElement;\n const pathHeight = pathNode.getBoundingClientRect().height;\n maxGridHeight = Math.max(maxGridHeight, pathHeight);\n });\n }\n\n const radiusByMaxValue = (radiusScale(newMaxValue) as number) + bleedLength;\n\n axis\n .append('line')\n .attr('x1', 0)\n .attr('y1', 0)\n .attr('x2', (_, i) =>\n Math.round(radiusByMaxValue * Math.cos(angleSlice * i - Math.PI / 2))\n )\n .attr('y2', (_, i) =>\n Math.round(radiusByMaxValue * Math.sin(angleSlice * i - Math.PI / 2))\n );\n\n radarGlobal\n .selectAll('path')\n .data(data)\n .join('path')\n .attr('class', radarChartclassNames.radarPolygon)\n .attr('style', (_, index) => radarStyles?.[index] || '')\n .attr('d', d =>\n radarValue(\n // @ts-ignore\n d.map(dataItem => ({\n ...dataItem,\n value: dataItem.value - minValue,\n }))\n )\n );\n\n const format = d3.format(',');\n const axisTextGlobal = globalCenter\n .append('g')\n .attr('class', radarChartclassNames.radarAxisTextGlobal);\n axisTextGlobal\n .selectAll('text')\n .data(levelsGrid)\n .enter()\n .append('text')\n .attr('class', radarChartclassNames.radarAxisText)\n .attr('x', '4')\n .attr('y', axisGridY)\n .attr('dy', 0)\n .attr('dominant-baseline', 'central')\n .text((value, index) => {\n const axisValue = getAxisValue(value) + minValue;\n\n return formatAxisValue\n ? formatAxisValue(axisValue, index)\n : format(axisValue);\n });\n\n circleRadius &&\n data.forEach(item => {\n const circleGlobal = globalCenter\n .append('g')\n .attr('class', radarChartclassNames.radarCircle);\n\n item.forEach(({ value }, i) => {\n circleGlobal\n .append('circle')\n .attr(\n 'cx',\n Math.round(\n (radiusScale(value) as number) *\n Math.cos(angleSlice * i - Math.PI / 2)\n )\n )\n .attr(\n 'cy',\n Math.round(\n radiusScale(\n value * Math.sin(angleSlice * i - Math.PI / 2)\n ) as number\n )\n )\n .attr('r', circleRadius);\n });\n });\n\n const defaultLabelOffset = 8;\n const heightInner = height - bleedLength - paddingY;\n const translateX = width / 2;\n const translateY = heightInner / 2 + (heightInner - maxGridHeight) / 2;\n const offset = bleedLength + (labelOffset || defaultLabelOffset);\n\n globalCenter.attr('transform', `translate(${translateX},${translateY})`);\n\n drawRadialLabels({\n node,\n maxValue: newMaxValue,\n translateX,\n translateY,\n dataLength: data[labelIndex || 0].length,\n angleSlice,\n radius,\n radiusScale,\n xOffset: offset,\n yOffset: offset,\n renderLabel: (anchor, index) => {\n const items = data.map(item => item[index]);\n const Badge = anchor === 'middle' ? MiddleBadge : DefaultBadge;\n const item = data[labelIndex || 0][index];\n const { name, value } = item;\n\n return renderLabel ? (\n renderLabel({ item, items, anchor, index })\n ) : (\n <Label className={radarChartclassNames.radarLabel}>\n <Name className={radarChartclassNames.radarLabelName}>{name}</Name>\n <Badge className={radarChartclassNames.radarLabelBadge}>\n {formatValue ? formatValue(value, index) : format(value)}\n {badgePrefix && (\n <BadgePrefix\n className={radarChartclassNames.radarLabelBadgePrefix}\n >\n {badgePrefix}\n </BadgePrefix>\n )}\n </Badge>\n </Label>\n );\n },\n selectLabel: (label, anchor, index) => {\n if (selectLabel) {\n const items = data.map(item => item[index]);\n const item = data[labelIndex || 0][index];\n\n selectLabel(label, { index, item, items, anchor });\n }\n },\n });\n\n if (svgElements) {\n const html = ReactDOMServer.renderToString(svgElements);\n\n svg.append('g').html(html);\n }\n\n customize && customize(svg);\n }\n};\n","import * as d3 from 'd3';\nimport ReactDOMServer from 'react-dom/server';\nimport React from 'react';\n\nimport { DrawRadialLabels } from './types';\n\nimport { getTextAnchor } from '../helpers';\nimport { LabelContainer } from './styled';\n\nconst labelClassName = 'd3-chart-label';\n\nexport const drawRadialLabels = ({\n node,\n dataLength,\n radiusScale,\n maxValue,\n angleSlice,\n radius,\n xOffset,\n yOffset,\n translateX,\n translateY,\n renderLabel,\n selectLabel,\n}: DrawRadialLabels) => {\n const d3container = d3.select(node);\n d3container.selectAll(`.${labelClassName}`).remove();\n\n const pxToValue = (value: number) => (maxValue / radius) * value;\n const axisX = (i: number) =>\n (radiusScale(maxValue + pxToValue(xOffset || 0)) as number) *\n Math.cos(angleSlice * i - Math.PI / 2);\n\n const axisY = (i: number) =>\n radiusScale(\n (maxValue + pxToValue(yOffset || 0)) *\n Math.sin(angleSlice * i - Math.PI / 2)\n ) as number;\n\n const labels = Array.from({ length: dataLength }, (_, index) => ({\n x: Math.ceil(axisX(index)),\n y: Math.ceil(axisY(index)),\n }));\n\n labels.forEach(({ x, y }: { x: number; y: number }, index: number) => {\n const anchor = getTextAnchor(index, dataLength);\n const html = ReactDOMServer.renderToString(\n <LabelContainer\n anchor={anchor}\n translateX={translateX || 0}\n translateY={translateY || 0}\n index={index}\n style={{\n left: x,\n top: y,\n }}\n >\n {typeof renderLabel === 'function'\n ? renderLabel(anchor, index)\n : renderLabel}\n </LabelContainer>\n );\n\n const label = d3container\n .append('div')\n .attr('class', labelClassName)\n .html(html);\n\n selectLabel(label, anchor, index);\n });\n};\n","const degByIndex = (index: number, count: number): number => {\n const degs = 360;\n const deg = (degs / count) * index;\n\n return deg;\n};\n\nexport const getTextAnchor = (\n index: number,\n length: number\n): 'start' | 'middle' | 'end' => {\n const deg = degByIndex(index, length);\n const halfAngle = 180;\n\n if ([0, halfAngle].includes(deg)) {\n return 'middle';\n }\n if (deg < halfAngle) {\n return 'start';\n }\n\n return 'end';\n};\n\nexport const getMaxWidth = (elements: SVGElement[]) => {\n let maxWidth = 0;\n\n for (let i = 0; i < elements.length; i++) {\n const element = elements[i];\n\n if (element && 'getBoundingClientRect' in element) {\n maxWidth = Math.max(maxWidth, element.getBoundingClientRect().width);\n }\n }\n\n return maxWidth;\n};\n","import React, { useEffect } from 'react';\nimport * as d3 from 'd3';\n\nimport { RadarChartProps } from './types';\n\nimport { useNode } from '../../hooks';\nimport { useResize } from '../../hooks';\n\nimport { draw } from './draw';\n\nimport { SvgWrapper } from './styled';\n\nexport const RadarChart: React.FC<RadarChartProps> = (\n props\n): React.ReactElement => {\n const { className, style } = props;\n const [ref, node] = useNode();\n\n useEffect(() => {\n node && draw(node, props);\n }, [node, props]);\n\n const onDraw = () => draw(node, props);\n\n useResize(props.width, onDraw);\n\n return (\n <div className={className} style={style}>\n <SvgWrapper ref={ref} />\n </div>\n );\n};\n\nRadarChart.defaultProps = {\n height: 400,\n data: [],\n curve: d3.curveLinearClosed,\n};\n","export function radiansToDegrees(radians: number): number {\n const flatAngle = 180;\n\n return (radians * flatAngle) / Math.PI;\n}\n\nexport function degreesToRadians(degrees: number): number {\n const flatAngle = 180;\n\n return degrees * (Math.PI / flatAngle);\n}\n","import styled from 'styled-components';\n\nimport { Wrapper } from '../../common/components/Wrapper';\n\nexport const pieChartclassNames = {\n pieGlobal: 'pieGlobal',\n pieSlice: 'pieSlice',\n pieSliceLabel: 'pieSliceLabel',\n pieSliceLabelValue: 'pieSliceLabelValue',\n pieSliceLabelName: 'pieSliceLabelName',\n pieRadialLabel: 'pieRadialLabel',\n pieRadialLink: 'pieRadialLink',\n pieTooltipContainer: 'pieTooltipContainer',\n pieTooltipFlex: 'pieTooltipFlex',\n pieTooltip: 'pieTooltip',\n pieTooltipItem: 'pieTooltipItem',\n pieTooltipName: 'pieTooltipName',\n pieTooltipValue: 'pieTooltipValue',\n pieTooltipColorBox: 'pieTooltipColorBox',\n pieFullChartTooltipCircle: 'pieFullChartTooltipCircle',\n};\n\nexport const SvgWrapper = styled(Wrapper)`\n .${pieChartclassNames.pieSliceLabel} {\n fill: #4a4a4a;\n }\n .${pieChartclassNames.pieRadialLabel} {\n position: absolute;\n max-width: 128px;\n }\n .${pieChartclassNames.pieRadialLink} {\n stroke: #000;\n }\n .${pieChartclassNames.pieFullChartTooltipCircle} {\n fill: transparent;\n cursor: pointer;\n }\n`;\n","import { PieChartDatum } from '../types';\n\nexport const getMidFactor = (d: PieChartDatum) =>\n d.startAngle + (d.endAngle - d.startAngle) / 2 < Math.PI ? 1 : -1;\n\nexport const getAlign = (d: PieChartDatum): 'start' | 'end' => {\n const midangle = d.startAngle + (d.endAngle - d.startAngle) / 2;\n\n return midangle < Math.PI ? 'start' : 'end';\n};\n","import styled from 'styled-components';\n\nexport const TooltipFlex = styled.div`\n width: 0;\n height: 0;\n display: flex;\n align-items: flex-end;\n justify-content: center;\n pointer-events: none;\n white-space: nowrap;\n`;\n\nexport const LabelFlex = styled(TooltipFlex)``;\n\nexport const LabelFlexCenter = styled(LabelFlex)`\n align-items: center;\n`;\n\nexport const TooltipContainer = styled.div`\n position: relative;\n font-size: 11px;\n color: #fff;\n margin-bottom: 8px;\n padding: 4px 6px;\n background-color: rgba(48, 69, 79, 1);\n border-radius: 4px;\n box-shadow: 0 0.1875rem 0.5rem rgba(48, 69, 79, 0.06);\n :before {\n content: '';\n position: absolute;\n bottom: 0;\n left: 50%;\n transform: translate(-50%, 100%);\n width: 0;\n height: 0;\n border-style: solid;\n border-width: 4px 3px 0 3px;\n border-color: rgba(48, 69, 79, 1) transparent transparent transparent;\n }\n`;\n\nexport const TooltipGroupName = styled.div`\n font-size: 14px;\n margin-bottom: 6px;\n`;\n\nexport const TooltipItem = styled.div`\n display: flex;\n align-items: center;\n margin-bottom: 0.25rem;\n &:last-of-type {\n margin-bottom: 0;\n }\n`;\n\nexport const ColFlex = styled.div`\n display: flex;\n align-items: center;\n margin-right: 4px;\n`;\n\nexport const ColorBox = styled.div`\n margin-right: 4px;\n width: 10px;\n height: 10px;\n border-radius: 2px;\n`;\n\nexport const ColorLine = styled(ColorBox)`\n height: 2px;\n border-radius: 0;\n`;\n\nexport const Name = styled.div`\n margin-right: 4px;\n`;\n\nexport const Value = styled.div`\n text-align: right;\n flex-shrink: 0;\n flex-grow: 1;\n`;\n\nexport const Label = styled.div`\n position: relative;\n font-size: 11px;\n color: #fff;\n font-weight: bold;\n letter-spacing: 0.52px;\n`;\n\nexport const LabelTop = styled(Label)`\n top: 6px;\n`;\n\nexport const LabelBottom = styled(Label)`\n bottom: 6px;\n`;\n","import * as d3 from 'd3';\nimport ReactDOMServer from 'react-dom/server';\n\nimport { PieChartProps, PieChartDatum } from './types';\n\nimport { appendSvg } from '../../helpers';\nimport { degreesToRadians, radiansToDegrees } from '../../helpers/math';\nimport { drawRadialLabels } from './drawRadialLabels';\nimport { drawTooltip } from './drawTooltips';\n\nimport { pieChartclassNames } from './styled';\n\nexport const draw = (node: HTMLElement | null, props: PieChartProps): void => {\n const {\n data,\n padAngle,\n onClick,\n outerRadius,\n startAngle,\n endAngle,\n cornerRadius,\n margin,\n enableSlicesLabels,\n formatSliceLabel,\n slicesLabelsSkipAngle,\n enableSlicesLabelsName,\n formatSliceLabelName,\n borderWidth,\n borderColor,\n enableRadialLabels,\n backgroundColor,\n radialLabelsLinkHorizontalLength,\n radialLabelsTextXOffset,\n formatRadialLabel,\n radialLabelYOffset,\n svgElements,\n formatSliceTitle,\n radialAngleXOffset,\n withTooltip,\n fullChartTooltip,\n tooltipClassName,\n tooltipBind,\n renderTooltip,\n tooltipStyle,\n } = props;\n\n if (node !== null && data.length) {\n const marginTop = margin ? margin.top : 0;\n const marginRight = margin ? margin.right : 0;\n const marginBottom = margin ? margin.bottom : 0;\n const marginLeft = margin ? margin.left : 0;\n const { width: nodeWidth } = node.getBoundingClientRect();\n const width = props.width || nodeWidth;\n const defaultHeight = 240;\n const height = props.height || defaultHeight;\n const radius =\n (Math.min(width, height) -\n (borderWidth || 0) * 2 -\n (width > height\n ? marginTop + marginBottom\n : marginRight + marginLeft)) /\n 2;\n\n const svg = appendSvg(node, width, height);\n const global = svg\n .append('g')\n .attr('class', pieChartclassNames.pieGlobal)\n .attr(\n 'transform',\n `translate(${(width - (marginLeft + marginRight)) / 2 +\n marginLeft},${(height - (marginBottom + marginTop)) / 2 + marginTop})`\n );\n\n const maxPadAngle = 45;\n const dividerPadAngle = 100;\n const fullAngle = 360;\n\n const pie = d3\n .pie()\n .startAngle(-degreesToRadians(startAngle || 0))\n .endAngle(degreesToRadians(endAngle || fullAngle))\n .padAngle(\n padAngle\n ? Math.max(Math.min(padAngle / dividerPadAngle, maxPadAngle), 0)\n : 0\n )\n .sort(null)\n // @ts-ignore\n .value(({ value }) => value);\n\n // @ts-ignore\n const dataReady = pie(data) as PieChartDatum[];\n\n const maxOuterRadius = 0.95;\n const arc = d3\n .arc()\n .cornerRadius(cornerRadius || 0)\n .innerRadius(radius)\n .outerRadius(\n radius * Math.min(Math.max(outerRadius || 0, 0), maxOuterRadius)\n );\n\n if (typeof backgroundColor === 'string') {\n global\n .append('path')\n .attr('fill', backgroundColor)\n .attr('d', () =>\n // @ts-ignore\n arc({\n startAngle: degreesToRadians(0),\n endAngle: degreesToRadians(fullAngle),\n })\n );\n }\n\n const format = d3.format(',');\n const allSlices = global\n .selectAll('allSlices')\n .data(dataReady)\n .enter()\n .append('path')\n // @ts-ignore\n .attr('d', arc);\n\n allSlices\n .attr('class', pieChartclassNames.pieSlice)\n .attr('fill', ({ index }) => data[index].color || '')\n .attr('stroke', borderColor || '')\n .attr('stroke-width', borderWidth || 0)\n .attr('style', onClick ? 'cursor: pointer' : '')\n .on(\n 'click',\n // @ts-ignore\n (_, d) => onClick && onClick(data[d.index])\n )\n .append('svg:title')\n .text(d =>\n formatSliceTitle\n ? // @ts-ignore\n formatSliceTitle(d)\n : fullChartTooltip || withTooltip\n ? ''\n : `${data[d.index].name || ''} (${format(data[d.index].value)})`\n );\n\n if (enableSlicesLabels) {\n const text = global\n .selectAll('allSlices')\n .data(dataReady)\n .enter()\n .append('text')\n .attr('class', pieChartclassNames.pieSliceLabel)\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'central')\n .attr(\n 'transform',\n // @ts-ignore\n (d: PieChartDatum) => 'translate(' + arc.centroid(d) + ')'\n );\n\n text\n .append('tspan')\n .attr('class', pieChartclassNames.pieSliceLabelValue)\n // @ts-ignore\n .text((d: PieChartDatum) => {\n const deg = radiansToDegrees(d.endAngle - d.startAngle);\n\n if (!slicesLabelsSkipAngle || deg > slicesLabelsSkipAngle) {\n return formatSliceLabel ? formatSliceLabel(d) : d.value;\n }\n });\n\n if (enableSlicesLabelsName) {\n text\n .append('tspan')\n .attr('class', pieChartclassNames.pieSliceLabelName)\n // @ts-ignore\n .text((d: PieChartDatum) =>\n formatSliceLabelName ? formatSliceLabelName(d) : d.data.name\n )\n .attr('x', '0')\n .attr('dy', '1.2em');\n }\n }\n\n drawRadialLabels({\n arc,\n enableRadialLabels,\n global,\n radius,\n node,\n dataReady,\n translateX: (width - (marginLeft - marginRight)) / 2,\n translateY: (height + (marginTop - marginBottom)) / 2,\n radialLabelsLinkHorizontalLength,\n radialLabelsTextXOffset,\n formatRadialLabel,\n radialLabelYOffset,\n radialAngleXOffset,\n });\n\n if (withTooltip || fullChartTooltip) {\n drawTooltip({\n fullChartTooltip,\n global,\n data,\n tooltipClassName,\n tooltipBind,\n renderTooltip,\n allSlices,\n arc,\n tooltipStyle,\n width,\n height,\n radius,\n });\n }\n\n if (svgElements) {\n const html = ReactDOMServer.renderToString(svgElements);\n\n svg.append('g').html(html);\n }\n }\n};\n","import * as d3 from 'd3';\nimport ReactDOMServer from 'react-dom/server';\n\nimport { DrawRadialLabels } from './types';\nimport { PieChartDatum } from '../types';\n\nimport { pieChartclassNames } from '../styled';\nimport { getMidFactor, getAlign } from './helpers';\nimport { getTranslate } from '../../../common/components/labels';\n\nexport const drawRadialLabels = ({\n arc,\n enableRadialLabels,\n global,\n node,\n radius,\n dataReady,\n radialLabelsLinkHorizontalLength,\n formatRadialLabel,\n radialLabelsTextXOffset,\n translateX,\n translateY,\n radialLabelYOffset,\n radialAngleXOffset,\n}: DrawRadialLabels): void => {\n const d3container = d3.select(node);\n d3container.selectAll(`.${pieChartclassNames.pieRadialLabel}`).remove();\n\n if (enableRadialLabels) {\n const defaultRadialLabelsLinkHorizontalLength = 4;\n const outerArc = d3\n .arc()\n .innerRadius(radius)\n .outerRadius(radius);\n\n global\n .selectAll('allPolylines')\n .data(dataReady)\n .enter()\n .append('polyline')\n .attr('class', pieChartclassNames.pieRadialLink)\n .style('fill', 'none')\n .attr('points', (d: PieChartDatum) => {\n const midFactor = getMidFactor(d);\n const posA = arc.centroid(d);\n const posB = outerArc.centroid(d);\n const posC = outerArc.centroid(d);\n const posCPi = [\n (radius +\n (radialLabelsLinkHorizontalLength ||\n defaultRadialLabelsLinkHorizontalLength)) *\n midFactor,\n posC[1],\n ];\n return [\n [posA[0], posA[1]],\n [\n posB[0] + (radialAngleXOffset || 0) * midFactor,\n posB[1] - (radialLabelYOffset || 0) * d.index,\n ],\n [posCPi[0], posCPi[1] - (radialLabelYOffset || 0) * d.index],\n ];\n });\n\n const getPosition = (d: PieChartDatum): [number, number] => {\n const pos = outerArc.centroid(d);\n return [\n (radius +\n (radialLabelsLinkHorizontalLength ||\n defaultRadialLabelsLinkHorizontalLength)) *\n getMidFactor(d),\n pos[1],\n ];\n };\n\n const defaultRadialLabelsTextXOffset = 4;\n d3container\n .selectAll('allLabels')\n .data(dataReady)\n .enter()\n .append('div')\n // @ts-ignore\n .html((d: PieChartDatum) => {\n const html = ReactDOMServer.renderToString(\n // @ts-ignore\n formatRadialLabel ? formatRadialLabel(d) : d.data.name\n );\n\n return html;\n })\n .attr('class', pieChartclassNames.pieRadialLabel)\n // @ts-ignore\n .style('transform', (d: PieChartDatum) =>\n getTranslate({\n anchor: getAlign(d),\n index: d.index,\n translateX,\n translateY: translateY - (radialLabelYOffset || 0) * d.index,\n })\n )\n // @ts-ignore\n .style(\n 'left',\n // @ts-ignore\n (d: PieChartDatum) =>\n `${getPosition(d)[0] -\n (getAlign(d) === 'start'\n ? -(radialLabelsTextXOffset || defaultRadialLabelsTextXOffset)\n : radialLabelsTextXOffset || defaultRadialLabelsTextXOffset)}px`\n )\n // @ts-ignore\n .style('top', (d: PieChartDatum) => `${getPosition(d)[1]}px`)\n // @ts-ignore\n .style('text-align', getAlign);\n }\n};\n","import React from 'react';\nimport ReactDOMServer from 'react-dom/server';\nimport * as d3 from 'd3';\n\nimport { pieChartclassNames as classNames } from '../styled';\n\nimport { DrawTooltipProps } from './types';\n\nimport {\n TooltipContainer,\n TooltipFlex,\n TooltipItem,\n Value,\n Name,\n ColorBox,\n} from '../../../common/components/tooltips';\nimport { PieChartData, PieChartDatum } from '../types';\n\nexport const drawTooltip = ({\n fullChartTooltip,\n global,\n tooltipRoot,\n data,\n tooltipClassName,\n tooltipBind,\n renderTooltip,\n arc,\n allSlices,\n tooltipStyle,\n width,\n height,\n radius,\n}: DrawTooltipProps) => {\n const container: Element | null =\n tooltipRoot || document.querySelector('body');\n const format = d3.format(',');\n const pieTooltipContainer: d3.Selection<\n HTMLDivElement,\n unknown,\n null,\n undefined\n > = d3.select(container).select(`.${classNames.pieTooltipContainer}`);\n const isEmpty = pieTooltipContainer.empty();\n\n const tooltipContainer = isEmpty\n ? d3\n .select(container)\n .append('div')\n .attr(\n 'class',\n `${classNames.pieTooltipContainer} ${tooltipClassName || ''}`\n )\n .style('position', 'absolute')\n .style('opacity', '0')\n : pieTooltipContainer;\n\n if (tooltipStyle) {\n Object.entries(tooltipStyle).forEach(([prop, val]) =>\n tooltipContainer.style(prop, val)\n );\n }\n\n tooltipContainer.html('');\n let isVisible = false;\n\n const setVisible = (visible?: boolean) => {\n isVisible = Boolean(visible);\n const opacity = isVisible ? '1' : '0';\n tooltipContainer.style('opacity', opacity);\n };\n\n const setPosition = (event: any, pieChartDatum?: PieChartDatum) => {\n let [x, y] = d3.pointer(event, document);\n\n if (!tooltipBind && fullChartTooltip) {\n const [itemX, itemY] = d3.pointer(event, event.target);\n\n x = x - itemX;\n y = y - itemY;\n } else if (!tooltipBind) {\n const globalNode = global.node();\n const {\n x: itemX,\n y: itemY,\n width: itemWidth,\n height: itemHeight,\n } = globalNode\n ? globalNode.getBoundingClientRect()\n : { x: 0, y: 0, width: 0, height: 0 };\n const [arcX, arcY] = arc.centroid(pieChartDatum as d3.DefaultArcObject);\n x = itemX + itemWidth / 2 + arcX;\n y = itemY + itemHeight / 2 + arcY;\n }\n\n tooltipContainer.style('left', x + 'px').style('top', y + 'px');\n };\n\n const setTooltip = (event: any, pieChartDatum?: PieChartDatum) => {\n setVisible(true);\n setPosition(event, pieChartDatum);\n const pieChartData = pieChartDatum ? [pieChartDatum.data] : data;\n\n tooltipContainer.html(() => {\n const html = ReactDOMServer.renderToString(\n <TooltipFlex className={classNames.pieTooltipFlex}>\n <TooltipContainer className={classNames.pieTooltip}>\n {renderTooltip ? (\n renderTooltip(pieChartData)\n ) : (\n <>\n {pieChartData.map(\n ({ color, name, value }: PieChartData, index: number) => (\n <TooltipItem\n key={`${name}-${index}`}\n className={classNames.pieTooltipItem}\n >\n {color && (\n <ColorBox\n className={classNames.pieTooltipColorBox}\n style={{ backgroundColor: color }}\n />\n )}\n {name && (\n <Name className={classNames.pieTooltipName}>\n {name}\n </Name>\n )}\n <Value className={classNames.pieTooltipValue}>\n {format(value)}\n </Value>\n </TooltipItem>\n )\n )}\n </>\n )}\n </TooltipContainer>\n </TooltipFlex>\n );\n\n return html;\n });\n };\n\n if (fullChartTooltip) {\n global.on('mouseover.fulltooltip', event => setTooltip(event));\n global.on('mouseout.fulltooltip', () => {\n tooltipContainer.html('');\n setVisible();\n });\n\n if (width && height) {\n global\n .append('circle')\n .attr('class', classNames.pieFullChartTooltipCircle)\n .attr('r', radius)\n .attr('cx', 0)\n .attr('cy', 0);\n }\n\n if (!tooltipBind) {\n global.on('touchmove.tooltipBind mousemove.tooltipBind', event =>\n setPosition(event)\n );\n }\n } else {\n allSlices.on('mouseover.slice', setTooltip);\n if (!tooltipBind) {\n allSlices.on('touchmove.slice mousemove.slice', setPosition);\n }\n allSlices.on('mouseout.slice', () => {\n tooltipContainer.html('');\n setVisible();\n });\n }\n};\n","import React, { useEffect } from 'react';\n\nimport { PieChartProps } from './types';\n\nimport { useNode } from '../../hooks';\nimport { useResize } from '../../hooks';\n\nimport { draw } from './draw';\n\nimport { SvgWrapper } from './styled';\n\nexport const PieChart: React.FC<PieChartProps> = (\n props\n): React.ReactElement => {\n const { className, style, children } = props;\n const [ref, node] = useNode();\n\n useEffect(() => {\n node && draw(node, props);\n }, [node, props]);\n\n const onDraw = () => draw(node, props);\n\n useResize(props.width, onDraw);\n\n return (\n <div className={className} style={style}>\n <SvgWrapper ref={ref}>{children}</SvgWrapper>\n </div>\n );\n};\n\nPieChart.defaultProps = {\n data: [],\n startAngle: 0,\n endAngle: 360,\n slicesLabelsSkipAngle: 0,\n radialLabelYOffset: 16,\n radialAngleXOffset: 8,\n};\n","import * as d3 from 'd3';\n\nimport { Interpolator } from '../../common/types/interpolator';\nimport { GetLegendProps } from './types';\n\nconst defaultN = 256;\n\nexport const legendClassNames = {\n legendContainer: 'd3-legend-container',\n legendTitle: 'd3-legend-title',\n legendTick: 'd3-legend-tick',\n legendTickLine: 'd3-legend-tick-line',\n legendTickText: 'd3-legend-tick-text',\n};\n\nfunction ramp(color: Interpolator, n: number = defaultN) {\n const canvas = document.createElement('canvas');\n canvas.width = n;\n canvas.height = 1;\n const context = canvas.getContext('2d') as CanvasRenderingContext2D;\n\n for (let i = 0; i < n; ++i) {\n context.fillStyle = color(i / (n - 1));\n context.fillRect(i, 0, 1, 1);\n }\n\n return canvas;\n}\n\nexport const legendDefaultParams = {\n tickSize: 6,\n height: 44,\n width: 320,\n marginTop: 18,\n marginBottom: 16,\n ticksDivier: 64,\n titleMarginBottom: 6,\n};\n\nexport const getLegend = ({\n color,\n title,\n tickSize = legendDefaultParams.tickSize,\n width = legendDefaultParams.width,\n height = legendDefaultParams.height + tickSize,\n marginTop = legendDefaultParams.marginTop,\n marginRight = 0,\n marginBottom = legendDefaultParams.marginBottom + tickSize,\n marginLeft = 0,\n ticks = legendDefaultParams.width / legendDefaultParams.ticksDivier,\n tickFormat,\n tickValues,\n titleMarginBottom,\n}: GetLegendProps) => {\n const svg = d3\n .create('svg')\n .attr('width', width)\n .attr('height', height)\n // @ts-ignore\n .attr('viewBox', [0, 0, width, height])\n .style('overflow', 'visible')\n .style('display', 'block');\n\n let tickAdjust = (g: d3.Selection<SVGGElement, any, any, any>) => {\n const tick = g.selectAll('.tick');\n\n tick\n .selectAll('.tick line')\n .attr('y1', marginTop + marginBottom - height)\n .attr('class', legendClassNames.legendTickLine);\n tick.selectAll('.tick text').attr('class', legendClassNames.legendTickText);\n tick.attr('class', legendClassNames.legendTick);\n\n return tick;\n };\n let x: any;\n\n // Continuous\n if (color.interpolate) {\n const n = Math.min(color.domain().length, color.range().length);\n\n x = color\n .copy()\n .rangeRound(\n d3.quantize(d3.interpolate(marginLeft, width - marginRight), n)\n );\n\n svg\n .append('image')\n .attr('x', marginLeft)\n .attr('y', marginTop)\n .attr('class', legendClassNames.legendContainer)\n .attr('width', width - marginLeft - marginRight)\n .attr('height', height - marginTop - marginBottom)\n .attr('preserveAspectRatio', 'none')\n .attr(\n 'xlink:href',\n ramp(\n color.copy().domain(d3.quantize(d3.interpolate(0, 1), n))\n ).toDataURL()\n );\n }\n\n // Sequential\n else if (color.interpolator) {\n x = Object.assign(\n color\n .copy()\n .interpolator(d3.interpolateRound(marginLeft, width - marginRight)),\n {\n range() {\n return [marginLeft, width - marginRight];\n },\n }\n );\n\n svg\n .append('image')\n .attr('x', marginLeft)\n .attr('y', marginTop)\n .attr('width', width - marginLeft - marginRight)\n .attr('height', height - marginTop - marginBottom)\n .attr('preserveAspectRatio', 'none')\n .attr('xlink:href', ramp(color.interpolator()).toDataURL());\n\n // scaleSequentialQuantile doesn’t implement ticks or tickFormat.\n if (!x.ticks) {\n if (tickValues === undefined) {\n const n = Math.round(ticks + 1);\n tickValues = d3\n .range(n)\n .map(i => d3.quantile(color.domain(), i / (n - 1)));\n }\n if (typeof tickFormat !== 'function') {\n tickFormat = d3.format(tickFormat === undefined ? ',f' : tickFormat);\n }\n }\n }\n\n svg\n .append('g')\n .attr('transform', `translate(0,${height - marginBottom})`)\n .call(\n d3\n .axisBottom(x)\n .ticks(ticks, typeof tickFormat === 'string' ? tickFormat : undefined)\n // @ts-ignore\n .tickFormat(typeof tickFormat === 'function' ? tickFormat : undefined)\n .tickSize(tickSize)\n // @ts-ignore\n .tickValues(tickValues)\n )\n .call(tickAdjust)\n .call(g => g.select('.domain').remove())\n .call(g =>\n g\n .append('text')\n .attr('x', marginLeft)\n .attr('class', legendClassNames.legendTitle)\n .attr(\n 'y',\n marginTop +\n marginBottom -\n height -\n (titleMarginBottom || legendDefaultParams.titleMarginBottom)\n )\n .attr('fill', 'currentColor')\n .attr('text-anchor', 'start')\n .attr('font-weight', 'bold')\n .text(title as string)\n );\n\n return svg;\n};\n","import styled from 'styled-components';\n\nimport { Wrapper } from '../../common/components/Wrapper';\nimport { legendClassNames } from '../../helpers/getLegend';\n\nexport const calendarChartClassNames = {\n calendarChart: 'calendarChart',\n calendarYear: 'calendarYear',\n calendarAxis: 'calendarAxis',\n calendarBody: 'calendarBody',\n calendarHeader: 'calendarHeader',\n calendarYearTitle: 'calendarYearTitle',\n calendarWeekDay: 'calendarWeekDay',\n calendarMonth: 'calendarMonth',\n calendarDays: 'calendarDays',\n calendarDay: 'calendarDay',\n ...legendClassNames,\n};\n\nconst headerHeight = '20px';\n\nexport const SvgWrapper = styled(Wrapper)`\n .${calendarChartClassNames.calendarYear} {\n display: flex;\n margin-bottom: 16px;\n }\n .${calendarChartClassNames.calendarYearTitle} {\n display: inline-flex;\n align-items: flex-end;\n height: ${headerHeight};\n margin-bottom: 4px;\n font-weight: bold;\n }\n .${calendarChartClassNames.calendarHeader} {\n height: ${headerHeight};\n margin-bottom: 4px;\n position: relative;\n display: flex;\n }\n .${calendarChartClassNames.calendarMonth} {\n font-size: 14px;\n bottom: 0;\n position: absolute;\n }\n .${calendarChartClassNames.calendarAxis} {\n display: flex;\n flex-direction: column;\n margin-right: 10px;\n }\n .${calendarChartClassNames.calendarWeekDay} {\n font-size: 12px;\n display: inline-flex;\n align-items: center;\n justify-content: flex-end;\n }\n .${calendarChartClassNames.calendarDays} {\n position: relative;\n }\n .${calendarChartClassNames.calendarDay} {\n position: absolute;\n }\n`;\n","import React, { useEffect } from 'react';\n\nimport { CalendarChartProps } from './types';\n\nimport { useNode } from '../../hooks';\n\nimport { draw } from './draw';\n\nimport { SvgWrapper } from './styled';\n\nexport const CalendarChart: React.FC<CalendarChartProps> = (\n props\n): React.ReactElement => {\n const {\n className,\n style,\n children,\n data,\n startSunday,\n weekdays,\n cellOffset,\n cellSize,\n interpolator,\n monthSpacing,\n colorRange,\n legendProps,\n } = props;\n const [ref, node] = useNode();\n\n useEffect(() => {\n node && draw(node, props);\n // eslint-disable-next-line\n }, [\n node,\n data,\n startSunday,\n weekdays,\n cellOffset,\n cellSize,\n interpolator,\n monthSpacing,\n colorRange,\n legendProps,\n ]);\n\n return (\n <SvgWrapper ref={ref} className={className} style={style}>\n {children}\n </SvgWrapper>\n );\n};\n\nCalendarChart.defaultProps = {\n data: [],\n};\n","import * as d3 from 'd3';\n\nimport { Interpolator } from '../../common/types/interpolator';\nimport { CalendarChartProps, CalendarChartData } from './types';\n\nimport { getLegend } from '../../helpers/getLegend';\n\nimport { calendarChartClassNames } from './styled';\n\nexport const draw = (\n node: HTMLElement | null,\n props: CalendarChartProps\n): void => {\n const {\n data,\n startSunday,\n weekdays,\n interpolator,\n monthSpacing,\n onEachDay,\n colorRange,\n legendProps,\n } = props;\n\n if (node !== null && data.length) {\n const years: Map<number, CalendarChartData[]> = d3.group(data, d =>\n d.date.getUTCFullYear()\n );\n const cellOffset =\n typeof props.cellOffset === 'number' ? props.cellOffset : 0;\n const weekDays = 7;\n const defaultCellSize = 18;\n const cellSize = props.cellSize || defaultCellSize;\n const countDay = (i: number) =>\n startSunday ? i : (i + (weekDays - 1)) % weekDays;\n const days = weekdays || ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'];\n const sundayIndex = 6;\n const formatDay = (i: number) =>\n startSunday ? days[i] : i === sundayIndex ? days[0] : days[i + 1];\n const formatDate = d3.utcFormat('%x');\n const timeWeek = startSunday ? d3.utcSunday : d3.utcMonday;\n const getTimeWeekCount = (from: Date, to: Date) =>\n timeWeek.count(d3.utcYear(from), to);\n const getMonthSpacing = (date: Date) =>\n date.getUTCMonth() * (monthSpacing || 0);\n const formatMonth = d3.utcFormat('%b');\n const max = d3.max(data.map(({ value }) => value)) as number;\n const min = d3.min(data.map(({ value }) => value)) as number;\n\n const color = colorRange\n ? d3\n .scaleLinear()\n .domain([min, max])\n // @ts-ignore\n .range(colorRange)\n : d3\n .scaleSequential(interpolator || d3.interpolateGreens)\n .domain([min, +max]);\n\n let chartWidth = 0;\n\n years.forEach((values, year) => {\n const min = new Date(year, 1);\n const max = d3.max(values.map(d => d.date)) as Date;\n const months = max.getUTCMonth() - min.getUTCMonth();\n const weekCount = getTimeWeekCount(min, max) + 1;\n const width =\n weekCount * (cellSize + cellOffset) + (monthSpacing || 0) * months;\n\n chartWidth = Math.max(chartWidth, width);\n });\n\n d3.select(node)\n .select(`.${calendarChartClassNames.calendarChart}`)\n .remove();\n\n const container = d3\n .select(node)\n .append('div')\n .attr('class', calendarChartClassNames.calendarChart);\n\n const year = container\n .selectAll('div')\n // @ts-ignore\n .data(years)\n .join('div')\n .attr('class', calendarChartClassNames.calendarYear);\n\n const calendarWeekdays = year\n .append('div')\n .attr('class', calendarChartClassNames.calendarAxis);\n\n calendarWeekdays\n .append('div')\n .attr('class', calendarChartClassNames.calendarYearTitle)\n // @ts-ignore\n .text(([key]) => key);\n\n calendarWeekdays\n .selectAll('span')\n .data(d3.range(weekDays))\n .join('div')\n .attr('class', calendarChartClassNames.calendarWeekDay)\n .style('height', cellSize + 'px')\n .style('margin-bottom', cellOffset + 'px')\n .text(formatDay);\n\n const body = year\n .append('div')\n .attr('class', calendarChartClassNames.calendarBody);\n\n const header = body\n .append('div')\n .attr('class', calendarChartClassNames.calendarHeader);\n\n header\n .selectAll('div')\n // @ts-ignore\n .data(([_, values]) => {\n const fullYearlastMonth = 12;\n const fullYearlastDate = 31;\n\n return d3.utcMonths(\n d3.utcMonth(new Date(values[0].date.getUTCFullYear(), 1, 1)),\n d3.utcMonth(\n new Date(\n values[0].date.getUTCFullYear(),\n fullYearlastMonth,\n fullYearlastDate\n )\n )\n );\n })\n .join('div')\n .attr('class', calendarChartClassNames.calendarMonth)\n .style(\n 'left',\n (d: any) =>\n getTimeWeekCount(d, timeWeek.ceil(d)) * (cellSize + cellOffset) +\n getMonthSpacing(d) +\n 'px'\n )\n // @ts-ignore\n .text(formatMonth);\n\n // @ts-ignore\n body\n .append('div')\n .attr('class', calendarChartClassNames.calendarDays)\n .style('height', (cellSize + cellOffset) * weekDays + 'px')\n .style('width', chartWidth + 'px')\n .selectAll('div')\n // @ts-ignore\n .data(([, values]) => values)\n .join('div')\n // @ts-ignore\n .each((data: CalendarChartData, index, elements) => {\n if (onEachDay) {\n const element = elements[index] as HTMLDivElement;\n const currColor = color(data.value) as string;\n\n onEachDay(data, element, currColor);\n }\n })\n .attr('class', calendarChartClassNames.calendarDay)\n .style('width', cellSize + 'px')\n .style('height', cellSize + 'px')\n // @ts-ignore\n .style(\n 'left',\n (d: any) =>\n getTimeWeekCount(d.date, d.date) * (cellSize + cellOffset) +\n getMonthSpacing(d.date) +\n 'px'\n )\n .style(\n 'top',\n // @ts-ignore\n d => countDay(d.date.getUTCDay()) * (cellSize + cellOffset) + 'px'\n )\n // @ts-ignore\n .style('background-color', d => color(d.value))\n // @ts-ignore\n .attr('title', d => `${formatDate(d.date)} - ${d.value}`);\n\n if (typeof legendProps === 'object') {\n const legend = getLegend({\n color: color as Interpolator,\n ...legendProps,\n });\n\n const containerNode = container.node() as HTMLDivElement;\n const legendSvg = legend.node() as SVGElement;\n\n containerNode.appendChild(legendSvg);\n }\n }\n};\n","import * as d3 from 'd3';\n\nexport function computeDimensions(\n selection: d3.Selection<any, any, any, any>\n): SVGRect | DOMRect {\n let dimensions;\n const node = selection.node();\n\n if (node instanceof SVGGraphicsElement) {\n // check if node is svg element\n dimensions = node.getBBox();\n } else {\n // else is html element\n dimensions = node.getBoundingClientRect();\n }\n\n return dimensions;\n}\n","export function none() {\n return;\n}\n\nexport function isVoid(value: any) {\n return value === undefined || value === null || Number.isNaN(value);\n}\n","import styled, { createGlobalStyle } from 'styled-components';\n\nimport { Wrapper } from '../../common/components/Wrapper';\n\nexport const lineChartClassNames = {\n lineChartYScaleGlobal: 'lineChartYScaleGlobal',\n lineChartXScaleGlobal: 'lineChartXScaleGlobal',\n lineChartLinesGlobal: 'lineChartLinesGlobal',\n lineChartLine: 'lineChartLine',\n lineChartAreasGlobal: 'lineChartAreasGlobal',\n lineChartArea: 'lineChartArea',\n lineChartDotsGlobalContainer: 'lineChartDotsGlobalContainer',\n lineChartDotsGlobal: 'lineChartDotsGlobal',\n lineChartDot: 'lineChartDot',\n lineChartGridGlobal: 'lineChartGridGlobal',\n lineChartGridLineX: 'lineChartGridLineX',\n lineChartGridLineY: 'lineChartGridLineY',\n lineChartLabelContainer: 'lineChartLabelContainer',\n lineChartLabelFlex: 'lineChartLabelFlex',\n lineChartLabel: 'lineChartLabel',\n lineChartMouseGlobal: 'lineChartMouseGlobal',\n lineChartMouseLine: 'lineChartMouseLine',\n lineChartMouseRect: 'lineChartMouseRect',\n lineChartMouseCircle: 'lineChartMouseCircle',\n lineChartMouseLabelContainer: 'lineChartMouseLabelContainer',\n lineChartMouseLabel: 'lineChartMouseLabel',\n};\n\nexport const SvgWrapper = styled(Wrapper)`\n .${lineChartClassNames.lineChartYScaleGlobal},\n .${lineChartClassNames.lineChartXScaleGlobal},\n .${lineChartClassNames.lineChartGridGlobal} {\n shape-rendering: crispEdges;\n }\n .${lineChartClassNames.lineChartLinesGlobal} {\n fill: none;\n stroke: steelblue;\n stroke-width: 1.5px;\n stroke-linejoin: round;\n stroke-linecap: round;\n }\n .${lineChartClassNames.lineChartArea} {\n fill-opacity: 0.24;\n }\n .${lineChartClassNames.lineChartGridLineX},\n .${lineChartClassNames.lineChartGridLineY},\n .${lineChartClassNames.lineChartMouseLine} {\n stroke: rgba(149, 149, 149, 0.24);\n }\n .${lineChartClassNames.lineChartMouseLine},\n .${lineChartClassNames.lineChartMouseCircle} {\n transition: opacity linear 200ms;\n pointer-events: none;\n stroke-width: 1px;\n }\n .${lineChartClassNames.lineChartDot} {\n stroke: #fff;\n stroke-width: 2px;\n }\n .${lineChartClassNames.lineChartMouseLine} {\n shape-rendering: crispEdges;\n }\n .${lineChartClassNames.lineChartMouseRect} {\n fill: none;\n pointer-events: all;\n }\n`;\n\nexport const TooltipStyles = createGlobalStyle`\n .${lineChartClassNames.lineChartMouseLabel} {\n transition: opacity linear 200ms;\n z-index: 1;\n .${lineChartClassNames.lineChartLabelFlex} {\n justify-content: flex-start;\n align-items: center;\n pointer-events: none;\n }\n .${lineChartClassNames.lineChartLabel} {\n margin: 0 0 0 10px;\n }\n }\n`;\n","import styled from 'styled-components';\n\nexport const LabelContainer = styled.div`\n width: 0;\n height: 0;\n display: flex;\n align-items: flex-end;\n justify-content: center;\n font-size: 12px;\n white-space: nowrap;\n`;\n\nexport const Label = styled.div`\n margin-bottom: 4px;\n`;\n","import * as d3 from 'd3';\n\nimport { LineChartProps, LineChartData, LineChartDot } from './types';\n\nimport { computeDimensions } from '../../helpers/computeDimensions';\nimport { appendSvg } from '../../helpers';\nimport { none } from '../../helpers/common';\nimport { stackedData } from '../../helpers/stackedData';\nimport { drawGrid } from './drawGrid';\nimport { drawLabel, labelClassName } from './drawLabel';\nimport { drawTooltip } from './drawTooltip';\n\nimport { lineChartClassNames } from './styled';\n\nexport const draw = (node: HTMLElement | null, props: LineChartProps): void => {\n const {\n data: chartData,\n labels,\n margin,\n customYAxisSelection,\n customXAxisSelection,\n customYAxis,\n customXAxis,\n curve,\n yAxisPadding,\n xAxisPadding,\n drawGridY,\n drawGridX,\n withLabels,\n formatLabel,\n eachLabel,\n stacked,\n dynamicTooltipEnable,\n dynamicCircleRadius,\n formatDynamicTooltip,\n renderTooltip,\n stackedTooltip,\n stackedTooltipIndex,\n tooltipLineTop,\n customize,\n customYScale,\n customLine,\n tooltipClassName,\n xScaleItemWidth,\n areaCurve,\n } = props;\n\n if (node !== null && chartData.length) {\n const data = stacked ? stackedData(chartData) : chartData;\n const marginTop = margin ? margin.top : 0;\n const marginRight = margin ? margin.right : 0;\n const marginBottom = margin ? margin.bottom : 0;\n const marginLeft = margin ? margin.left : 0;\n const { width: nodeWidth } = node.getBoundingClientRect();\n const width = props.width || nodeWidth;\n const height = props.height || 0;\n const min =\n typeof props.min === 'number'\n ? props.min\n : d3.min(data, ({ values }) => d3.min(values as number[]));\n const max =\n typeof props.max === 'number'\n ? props.max\n : d3.max(data, ({ values }) => d3.max(values as number[]));\n\n const svg = appendSvg(node, width, height || 0);\n\n const yScale = d3\n .scaleLinear()\n .domain([min || 0, max || 0])\n .range([\n height - marginTop - marginBottom - (xAxisPadding || 0),\n marginTop,\n ])\n .nice();\n\n customYScale && customYScale(yScale);\n\n const yTicksCountDefault = 8;\n const yAxisLeft = d3.axisLeft(yScale).ticks(yTicksCountDefault);\n\n customYAxis && customYAxis(yAxisLeft);\n\n const yTicksCount = yAxisLeft.tickArguments()[0];\n\n const yAxis = svg\n .append('g')\n .attr('class', lineChartClassNames.lineChartYScaleGlobal)\n .call(yAxisLeft)\n .call(customYAxisSelection ? customYAxisSelection : none);\n const { width: yAxisWidth } = computeDimensions(yAxis);\n\n yAxis.attr('transform', `translate(${marginLeft + yAxisWidth}, 0)`);\n\n /** xScale **/\n const lastIndex =\n labels && labels.length\n ? labels.length - 1\n : data.reduce((acc, { values }) => Math.max(acc, values.length), 0) - 1;\n\n const xScale = d3\n .scaleLinear()\n .domain([0, lastIndex])\n .range([\n marginLeft + yAxisWidth + (yAxisPadding || 0),\n width - marginRight,\n ]);\n\n const xAxisBottom = d3\n .axisBottom(xScale)\n .tickFormat((value: d3.NumberValue) =>\n // @ts-ignore\n labels && labels.length > 0 ? labels[value] : 0\n )\n .ticks(lastIndex);\n\n if (typeof xScaleItemWidth === 'number') {\n const [x1, x2] = xScale.range();\n const chartWidth = x2 - x1;\n\n xAxisBottom\n .ticks(Math.round(chartWidth / xScaleItemWidth))\n .tickSizeOuter(0);\n }\n\n customXAxis && customXAxis(xAxisBottom);\n\n drawGrid({\n svg,\n yScale,\n xScale,\n yTicksCount,\n lastIndex,\n drawGridY,\n drawGridX,\n });\n\n if (Array.isArray(labels) && labels.length > 0) {\n const xAxis = svg\n .append('g')\n .call(customXAxisSelection ? customXAxisSelection : none)\n .attr('class', lineChartClassNames.lineChartXScaleGlobal)\n .call(xAxisBottom);\n\n const { height: xAxisHeight } = computeDimensions(xAxis);\n\n xAxis.attr(\n 'transform',\n `translate(0, ${height - Math.ceil(xAxisHeight) - marginBottom})`\n );\n }\n\n const line = d3\n .line()\n .defined(d => d !== null)\n .x((_, index) => xScale(index))\n .y((d: unknown) => yScale(d as d3.NumberValue))\n .curve(curve || d3.curveLinear);\n\n customLine && customLine(line);\n\n const withAreas = data.some(({ fill }) => fill);\n\n if (withAreas) {\n let dataIndex = -2;\n\n const getArea = (d: LineChartData): d3.Area<[number, number]> => {\n const { minAreaValues } = d;\n const minTick = yScale.ticks()[0];\n\n return d3\n .area()\n .defined(d => d !== null)\n .x((_, index) => xScale(index))\n .y0((value: unknown, index) => {\n if (index === 0) {\n dataIndex = dataIndex + 1;\n }\n\n let minValue: number = minTick;\n\n if (minAreaValues && typeof minAreaValues[index] === 'number') {\n minValue = minAreaValues[index] || minValue;\n } else if (minAreaValues) {\n minValue = yScale(\n (minValue - (value as number)) as d3.NumberValue\n );\n }\n\n const currData = data[dataIndex];\n\n return stacked\n ? dataIndex > -1\n ? yScale(\n typeof currData.values[index] !== 'number'\n ? 0\n : (currData.values[index] as number)\n )\n : yScale(minValue)\n : yScale(minValue);\n })\n .y1((d: unknown) => yScale(d as d3.NumberValue))\n .curve(areaCurve || curve || d3.curveLinear);\n };\n\n svg\n .append('g')\n .attr('class', lineChartClassNames.lineChartAreasGlobal)\n .selectAll('path')\n .data(data.filter(({ fill }) => Boolean(fill)))\n .join('path')\n .attr('class', lineChartClassNames.lineChartArea)\n .attr('d', (d: LineChartData) => {\n const area = getArea(d);\n\n return area((d.values as unknown) as [number, number][]);\n })\n .attr('fill', ({ fill }) => fill || 'none')\n .attr('style', ({ areaStyle }) => areaStyle || '');\n }\n\n svg\n .append('g')\n .attr('class', lineChartClassNames.lineChartLinesGlobal)\n .selectAll('path')\n .data(data)\n .join('path')\n .attr('class', lineChartClassNames.lineChartLine)\n .attr('d', (d: LineChartData | any) => line(d.values))\n .attr('stroke', ({ stroke }) => stroke || 'steelblue')\n .attr('style', ({ style }) => style || '');\n\n const dots = data.filter(({ dot }) => dot) as (Omit<\n LineChartData,\n 'dot'\n > & {\n dot: LineChartDot;\n })[];\n\n if (dots.length > 0) {\n const dotsGlobal = svg\n .append('g')\n .attr('class', lineChartClassNames.lineChartDotsGlobalContainer);\n\n dots.forEach(item => {\n const { values, dot } = item;\n const { radius, style, filter } = dot;\n\n const dotsGroup = dotsGlobal\n .append('g')\n .attr('class', lineChartClassNames.lineChartDotsGlobal);\n\n dotsGroup\n .selectAll('circle')\n .data(values)\n .join('circle')\n .attr('cx', (_, index) => xScale(index))\n .attr('class', lineChartClassNames.lineChartDot)\n .attr('cy', d => yScale(d as d3.NumberValue))\n .attr('r', radius || 0)\n .attr('style', style || '');\n\n if (filter) {\n dotsGroup\n .selectAll('circle')\n .select((_, i, g) => (filter(item, i, g) ? g[i] : null))\n .remove();\n }\n });\n }\n\n d3.select(node)\n .select(`.${labelClassName}`)\n .remove();\n withLabels &&\n drawLabel({ node, eachLabel, data, yScale, xScale, formatLabel });\n\n if (dynamicTooltipEnable) {\n drawTooltip({\n tooltipLineTop,\n stackedTooltip,\n renderTooltip,\n stackedTooltipIndex,\n formatDynamicTooltip,\n node,\n svg,\n data,\n xScale,\n yScale,\n dynamicCircleRadius,\n tooltipClassName,\n });\n }\n\n customize && customize({ svg, yScale, xScale });\n }\n};\n","import { LineChartData } from '../charts/LineChart/types';\n\nexport const stackedData = (data: LineChartData[]) => {\n const stacks: { [key: string]: { [key: string]: number } } = {};\n\n return data.map((item, index) => {\n stacks[index] = {};\n\n if (index > 0) {\n return {\n ...item,\n values: item.values.map((value, valuesIndex) => {\n const prevValue = stacks[index - 1][valuesIndex];\n stacks[index][valuesIndex] = Number(\n (typeof prevValue !== 'number' ? 0 : Math.abs(prevValue)) +\n (typeof value !== 'number' ? 0 : Math.abs(value))\n );\n\n return stacks[index][valuesIndex];\n }),\n };\n } else {\n item.values.forEach((value, valuesIndex) => {\n stacks[index][valuesIndex] = Number(value);\n });\n }\n\n return item;\n });\n};\n","import { DrawGridProps } from './types';\n\nimport { lineChartClassNames } from '../styled';\n\nexport const drawGrid = ({\n svg,\n yScale,\n xScale,\n yTicksCount,\n lastIndex,\n drawGridX,\n drawGridY,\n}: DrawGridProps) => {\n if (!drawGridY && !drawGridX) return;\n\n const global = svg\n .append('g')\n .attr('class', lineChartClassNames.lineChartGridGlobal);\n\n const yTicks = yScale.ticks(yTicksCount);\n\n if (drawGridX) {\n global\n .append('g')\n .selectAll('line')\n .data(yTicks)\n .join('line')\n .attr('class', lineChartClassNames.lineChartGridLineX)\n .attr('x1', () => xScale(0))\n .attr('x2', () => xScale(lastIndex))\n .attr('y1', (d: number) => Math.round(yScale(d)))\n .attr('y2', (d: number) => Math.round(yScale(d)));\n }\n\n if (drawGridY) {\n global\n .append('g')\n .selectAll('line')\n .data(Array.from({ length: lastIndex + 1 }, (_, index) => index))\n .join('line')\n .attr('class', lineChartClassNames.lineChartGridLineY)\n .attr('x1', (_, index: number) => Math.round(xScale(index) as number))\n .attr('x2', (_, index: number) => Math.round(xScale(index) as number))\n .attr('y1', () => Math.round(yScale(yTicks[0]) as number))\n .attr('y2', () =>\n Math.round(yScale(yTicks[yTicks.length - 1]) as number)\n );\n }\n};\n","import React from 'react';\nimport * as d3 from 'd3';\nimport ReactDOMServer from 'react-dom/server';\n\nimport { DrawLabelProps } from './types';\n\nimport { none } from '../../../helpers/common';\n\nimport { lineChartClassNames } from '../styled';\nimport { LabelContainer, Label } from './styled';\n\nexport const labelClassName = 'd3-chart-label';\n\nexport const drawLabel = ({\n node,\n data,\n yScale,\n xScale,\n formatLabel,\n eachLabel,\n}: DrawLabelProps) => {\n const labelsDiv = d3\n .select(node)\n .append('div')\n .attr('class', labelClassName);\n const format = d3.format(',');\n\n // @ts-ignore\n data.forEach(({ values }: { values: number[] }) => {\n labelsDiv\n .append('div')\n .selectAll('div')\n .data(values)\n .join('div')\n .attr('class', lineChartClassNames.lineChartLabelContainer)\n .style('position', 'absolute')\n .style('left', (_, index) => xScale(index) + 'px')\n .style('top', d => yScale(d) + 'px')\n .html((d: number, index, elements: any) => {\n const html = ReactDOMServer.renderToString(\n <LabelContainer className={lineChartClassNames.lineChartLabelFlex}>\n <Label className={lineChartClassNames.lineChartLabel}>\n {formatLabel ? formatLabel(d, index, elements) : format(d)}\n </Label>\n </LabelContainer>\n );\n\n return html;\n })\n // @ts-ignore\n .each(eachLabel ? eachLabel : none);\n });\n};\n","import React from 'react';\nimport * as d3 from 'd3';\nimport ReactDOMServer from 'react-dom/server';\n\nimport { DrawTooltipProps } from './types';\n\nimport { isVoid } from '../../../helpers/common';\n\nimport { lineChartClassNames } from '../styled';\nimport { Label, LabelContainer } from '../drawLabel/styled';\n\nexport const drawTooltip = ({\n svg,\n node,\n data: argData,\n xScale,\n yScale,\n dynamicCircleRadius,\n formatDynamicTooltip,\n renderTooltip,\n stackedTooltipIndex,\n stackedTooltip,\n tooltipLineTop,\n tooltipRoot,\n tooltipClassName,\n}: DrawTooltipProps) => {\n const container: Element | null =\n tooltipRoot || document.querySelector('body');\n const format = d3.format(',');\n const chartData = argData.filter(({ tooltipOff }) => !tooltipOff);\n\n const data =\n typeof stackedTooltipIndex === 'number'\n ? [chartData[stackedTooltipIndex]]\n : stackedTooltip\n ? [chartData[0]]\n : chartData;\n const [x1, x2] = xScale.range();\n const [y1, y2] = yScale.range();\n\n const mouseGlobal = svg\n .append('g')\n .attr('class', lineChartClassNames.lineChartMouseGlobal);\n const mouseRect = mouseGlobal\n .append('rect')\n .attr('width', x2 - x1)\n .attr('height', Math.abs(y1 - y2))\n .attr('class', lineChartClassNames.lineChartMouseRect)\n .attr('transform', `translate(${x1}, ${y2})`);\n const mouseLine = mouseGlobal\n .append('path')\n .attr('class', lineChartClassNames.lineChartMouseLine)\n .style('opacity', '0');\n\n const lines = svg\n .selectAll(`.${lineChartClassNames.lineChartLine}`)\n .nodes() as SVGPathElement[];\n\n const circles = mouseGlobal\n .selectAll('circle')\n .data(chartData.filter(({ dynamicDotOff }) => !dynamicDotOff))\n .join('circle')\n .attr('class', lineChartClassNames.lineChartMouseCircle)\n .attr('r', dynamicCircleRadius as number)\n .attr('fill', ({ stroke }) => stroke || 'none')\n .attr('stroke', ({ stroke }) => stroke || 'none')\n .style('opacity', '0');\n\n let labelContainer: d3.Selection<any, unknown, any, any> = d3.select(\n `.${lineChartClassNames.lineChartMouseLabelContainer}`\n );\n\n if (labelContainer.size() === 0) {\n labelContainer = d3\n .select(container)\n .append('div')\n .attr('class', lineChartClassNames.lineChartMouseLabelContainer);\n }\n\n let labels: d3.Selection<any, any, any, any> | null = null;\n\n let isVisible = false;\n\n const setVisible = (visible?: boolean) => {\n isVisible = Boolean(visible);\n const opacity = isVisible ? '1' : '0';\n mouseLine.style('opacity', opacity);\n circles.style('opacity', opacity);\n labels && labels.style('opacity', opacity);\n };\n\n const mouseMove = (event: MouseEvent | TouchEvent) => {\n const [docX, docY] = d3.pointer(event, document);\n const [rectrX] = d3.pointer(event, mouseRect);\n const [nodeX, nodeY] = d3.pointer(event, node);\n const x = rectrX - (rectrX - nodeX);\n const left = nodeX + (docX - nodeX);\n const currIndex = Math.abs(xScale.invert(x));\n const positions: { [key: string]: { x: number; y: number } } = {};\n\n const getValue = (values: (number | null)[]) =>\n !isVoid(values[Math.floor(currIndex + 1)])\n ? values[Math.floor(currIndex)]\n : null;\n\n lines.forEach((line, index) => {\n let pos = {\n x: 0,\n y: 0,\n };\n\n if (!line.hasAttribute('d') || argData[index].tooltipOff) {\n positions[index] = pos;\n return;\n }\n\n let beginning = 0;\n let end = line.getTotalLength();\n let target = null;\n\n while (true) {\n target = Math.floor((beginning + end) / 2);\n pos = line.getPointAtLength(target);\n if ((target === end || target === beginning) && pos.x !== x) {\n break;\n }\n if (pos.x > x) end = target;\n else if (pos.x < x) beginning = target;\n else break;\n }\n\n positions[index] = pos;\n });\n\n circles\n .attr('transform', (lineChartData, index) => {\n const value = getValue(lineChartData.values);\n\n return positions[index] && value\n ? 'translate(' + x + ',' + positions[index].y + ')'\n : 'translate(-9999, -9999)';\n })\n .attr('style', ({ dynamicDotStyle }) => dynamicDotStyle || '');\n\n const datas = chartData.map(({ values, ...rest }, i) => ({\n ...rest,\n value: getValue(values),\n invertValue: positions[i] ? yScale.invert(positions[i].y) : 0,\n }));\n\n const noHasData = datas.every(({ value }) => isVoid(value));\n\n if (noHasData && isVisible) {\n setVisible();\n } else if (!isVisible && !noHasData) {\n setVisible(true);\n }\n\n const topIndex = Object.keys(positions).reduce((acc, key, index) => {\n const prevValue = datas[Number(acc)]?.value;\n const value = datas[Number(key)]?.value;\n const dynamicDotOff = argData?.[index].dynamicDotOff;\n\n return index === 0 || isVoid(value) || dynamicDotOff\n ? acc\n : isVoid(prevValue) || positions[acc].y > positions[key].y\n ? key\n : acc;\n }, '0');\n\n const labelTexts =\n labels &&\n labels\n .style('left', `${left}px`)\n .style('top', (_, i) => {\n const index =\n typeof stackedTooltipIndex === 'number'\n ? stackedTooltipIndex\n : stackedTooltip\n ? topIndex\n : i;\n\n return `${positions[index] && positions[index].y + (docY - nodeY)}px`;\n })\n .select(`.${lineChartClassNames.lineChartLabel}`);\n\n if (renderTooltip && labels) {\n labels.html((_, index) => {\n const html = ReactDOMServer.renderToString(\n <LabelContainer className={lineChartClassNames.lineChartLabelFlex}>\n {renderTooltip(datas, {\n indexX: Math.round(currIndex),\n indexY: index,\n svg,\n event,\n })}\n </LabelContainer>\n );\n\n return html;\n });\n } else {\n labelTexts &&\n labelTexts.text((_, i) => {\n const value = datas[i].value;\n const invertValue = datas[i].invertValue;\n\n return formatDynamicTooltip\n ? formatDynamicTooltip(invertValue, value)\n : format(invertValue);\n });\n }\n\n mouseLine.attr('d', () => {\n let d = 'M' + x + ',' + y1;\n d += ' ' + x + ',' + (tooltipLineTop ? y2 : positions[topIndex]?.y || 0);\n return d;\n });\n };\n\n mouseRect.on('mouseover.tooltip', event => {\n labels = labelContainer\n .selectAll('div')\n .data(data)\n .join('div')\n .attr(\n 'class',\n `${lineChartClassNames.lineChartMouseLabel} ${tooltipClassName || ''}`\n )\n .style('opacity', '0')\n .style('position', 'absolute')\n .html(() => {\n const html = ReactDOMServer.renderToString(\n <LabelContainer className={lineChartClassNames.lineChartLabelFlex}>\n <Label className={lineChartClassNames.lineChartLabel} />\n </LabelContainer>\n );\n\n return html;\n });\n\n mouseMove(event);\n });\n\n mouseRect.on('mouseout.tooltip', () => {\n d3.select(`.${lineChartClassNames.lineChartMouseLabelContainer}`)\n .selectAll('*')\n .remove();\n setVisible();\n });\n\n mouseRect.on('touchmove.tooltip mousemove.tooltip', mouseMove);\n};\n","import React, { useEffect } from 'react';\n\nimport { LineChartProps } from './types';\n\nimport { useNode } from '../../hooks';\nimport { useResize } from '../../hooks';\n\nimport { draw } from './draw';\n\nimport { SvgWrapper, TooltipStyles } from './styled';\n\nexport const LineChart: React.FC<LineChartProps> = (\n props\n): React.ReactElement => {\n const { className, style, children } = props;\n const [ref, node] = useNode();\n\n useEffect(() => {\n node && draw(node, props);\n }, [node, props]);\n\n const onDraw = () => draw(node, props);\n\n useResize(props.width, onDraw);\n\n return (\n <div className={className} style={style}>\n <TooltipStyles />\n <SvgWrapper ref={ref}>{children}</SvgWrapper>\n </div>\n );\n};\n\nLineChart.defaultProps = {\n data: [],\n labels: [],\n height: 240,\n yAxisPadding: 10,\n xAxisPadding: 20,\n margin: {\n top: 10,\n right: 10,\n bottom: 10,\n left: 0,\n },\n dynamicCircleRadius: 4,\n stackedTooltip: false,\n};\n","import * as d3 from 'd3';\n\nimport { BarChartLinetData } from '../types';\nimport { DrawLinesProps } from './types';\n\nexport const barChartLinesClassNames = {\n barChartLinesGlobal: 'barChartLinesGlobal',\n barChartLine: 'barChartLine',\n barChartAreasGlobal: 'barChartAreasGlobal',\n barChartArea: 'barChartArea',\n};\n\nexport const drawLines = ({\n svg,\n lineData,\n min,\n yScale,\n xScale,\n curve,\n stackedLine,\n}: DrawLinesProps) => {\n let linesSelection = null;\n let areasSelection = null;\n let area: d3.Area<[number, number]> | null = null;\n\n const line = d3\n .line()\n .defined(d => d !== null)\n .x(\n (_, index) =>\n (xScale((index as unknown) as string) as number) + bandwidth / 2\n )\n // @ts-ignore\n .y((d: number) => yScale(d))\n .curve(curve || d3.curveLinear);\n const bandwidth = xScale.bandwidth();\n\n const linesData = lineData.filter(({ lineType }) => lineType === 'line');\n const areasData = lineData.filter(({ lineType }) => lineType === 'area');\n\n if (linesData.length > 0) {\n linesSelection = svg\n .append('g')\n .attr('class', barChartLinesClassNames.barChartLinesGlobal)\n .selectAll('path')\n .data(linesData)\n .join('path')\n .attr('class', barChartLinesClassNames.barChartLine)\n .attr('d', (d: BarChartLinetData) =>\n line(d.values as Iterable<[number, number]>)\n )\n .attr('stroke', ({ stroke }) => stroke || '')\n .attr('fill', ({ fill }) => fill || 'none');\n }\n\n if (areasData.length > 0) {\n let dataIndex = -2;\n\n area = d3\n .area()\n .x(\n (_, index) =>\n (xScale((index as unknown) as string) as number) + bandwidth / 2\n )\n .y0((_, index) => {\n if (index === 0) {\n dataIndex = dataIndex + 1;\n }\n\n return stackedLine\n ? dataIndex > -1\n ? yScale(\n typeof lineData[dataIndex].values[index] !== 'number'\n ? 0\n : (lineData[dataIndex].values[index] as number)\n )\n : yScale(min as number)\n : yScale(min as number);\n })\n // @ts-ignore\n .y1(d => yScale(d))\n .curve(curve || d3.curveLinear);\n\n areasSelection = svg\n .append('g')\n .attr('class', barChartLinesClassNames.barChartAreasGlobal)\n .selectAll('path')\n .data(areasData)\n .join('path')\n .attr('class', barChartLinesClassNames.barChartArea)\n .attr('d', (d: BarChartLinetData | any) => area && area(d.values))\n .attr('fill', ({ fill }) => fill || 'none');\n }\n\n return {\n areasSelection,\n linesSelection,\n area,\n };\n};\n","import styled, { createGlobalStyle } from 'styled-components';\n\nimport { Wrapper } from '../../common/components/Wrapper';\nimport { barChartLinesClassNames } from './drawLines';\n\nconst tooltipClassnames = {\n barChartMouseRect: 'barChartMouseRect',\n barChartMouseContainer: 'barChartMouseContainer',\n barChartTooltipFlex: 'barChartTooltipFlex',\n barChartMouseTooltip: 'barChartMouseTooltip',\n barChartTooltip: 'barChartTooltip',\n barChartTooltipItem: 'barChartTooltipItem',\n barChartTooltipColFlex: 'barChartTooltipColFlex',\n barChartTooltipGroupName: 'barChartTooltipGroupName',\n barChartColorBox: 'barChartColorBox',\n barChartColorLine: 'barChartColorLine',\n barChartTooltipName: 'barChartTooltipName',\n barChartTooltipValue: 'barChartTooltipValue',\n};\n\nconst labelClassnames = {\n barChartLabelContainer: 'barChartLabelContainer',\n barChartLabelFlex: 'barChartLabelFlex',\n barChartLabel: 'barChartLabel',\n};\n\nexport const barChartClassNames = {\n barChartBarGlobal: 'barChartBarGlobal',\n barChartYScaleGlobal: 'barChartYScaleGlobal',\n barChartYAxis: 'barChartYAxis',\n barChartXAxis: 'barChartXAxis',\n barChartYAxisZeroTick: 'barChartYAxisZeroTick',\n barChartGridGlobal: 'barChartGridGlobal',\n barChartGridLineX: 'barChartGridLineX',\n barChartGridLineXZero: 'barChartGridLineXZero',\n barChartGridLineYZero: 'barChartGridLineYZero',\n barChartGridLineY: 'barChartGridLineY',\n ...tooltipClassnames,\n ...labelClassnames,\n ...barChartLinesClassNames,\n};\n\nexport const SvgWrapper = styled(Wrapper)`\n line {\n stroke-width: 1px;\n shape-rendering: crispEdges;\n }\n .${barChartClassNames.barChartGridLineX},\n .${barChartClassNames.barChartGridLineY} {\n stroke: rgba(48, 69, 79, 0.06);\n }\n .${barChartClassNames.barChartMouseRect} {\n }\n .${barChartClassNames.barChartMouseRect} {\n fill: none;\n pointer-events: all;\n }\n .${barChartClassNames.barChartLinesGlobal} {\n stroke-width: 1.5px;\n stroke-linejoin: round;\n stroke-linecap: round;\n }\n .${barChartClassNames.barChartLine} {\n shape-rendering: auto;\n }\n .${barChartClassNames.barChartArea} {\n fill-opacity: 0.24;\n }\n`;\n\nexport const TooltipStyles = createGlobalStyle`\n .${barChartClassNames.barChartMouseTooltip} {\n z-index: 1;\n transition: all linear 144ms;\n\n .${barChartClassNames.barChartTooltipItem} {\n margin-bottom: 4px;\n :last-of-type {\n margin-bottom: 0;\n }\n }\n }\n`;\n","import * as d3 from 'd3';\n\nimport { barChartClassNames as classNames } from './styled';\nimport { drawGrid } from './drawGrid';\nimport { appendSvg } from '../../helpers';\nimport { computeDimensions } from '../../helpers/computeDimensions';\nimport { getDomain } from './getDomain';\nimport { marshaling } from './marshaling';\nimport { drawTooltip } from './drawTooltip';\nimport { resizeBarWidth } from './resizeBarWidth';\nimport { drawLines } from './drawLines';\nimport { getBars } from './getBars';\nimport { BarChartProps, BarChartData, BarChartMarshalledGroup } from './types';\n\nexport const draw = (node: HTMLElement | null, props: BarChartProps): void => {\n const {\n data,\n lineData = [],\n barWidth: barWidthProp,\n barPadding,\n colors,\n margin,\n xAxisPadding,\n yAxisPadding,\n drawGridY,\n drawGridX,\n customYScale,\n customXScale,\n customYAxisLeft,\n customXAxisBottom,\n customYAxis,\n customXAxis,\n customBars,\n customize,\n dynamicTooltipEnable,\n renderTooltip,\n labelPosition,\n renderLabel,\n tooltipY,\n tooltipBind,\n stackedLine,\n curve,\n formatTooltipValue,\n formatTooltipName,\n sectionPadding,\n minValuesLine,\n tooltipYDomain,\n marshalledMap,\n minValue,\n maxValue,\n minDomainValue,\n maxDomainValue,\n drawBars,\n setTooltipPosition,\n onLabelItem,\n isBarTooltip,\n xScaleItemWidth,\n tooltipRoot,\n tooltipClassName,\n } = props;\n\n if (node !== null && data.length) {\n const marginTop = margin ? margin.top : 0;\n const marginRight = margin ? margin.right : 0;\n const marginBottom = margin ? margin.bottom : 0;\n const marginLeft = margin ? margin.left : 0;\n const defaultBarWidth = 12;\n const { width: nodeWidth } = node.getBoundingClientRect();\n const width = props.width || nodeWidth;\n const height = props.height || 0;\n const barDomain = getDomain({\n data,\n minDomainValue,\n maxDomainValue,\n });\n\n const min =\n typeof minValue === 'number'\n ? minValue\n : Math.min(\n d3.min(lineData, ({ values }) => d3.min(values as number[])) ||\n Number.POSITIVE_INFINITY,\n barDomain.min || 0\n );\n const max =\n typeof maxValue === 'number'\n ? maxValue\n : Math.max(\n d3.max(lineData, ({ values }) => d3.max(values as number[])) ||\n Number.NEGATIVE_INFINITY,\n barDomain.max\n );\n const svg = appendSvg(node, width, height || 0);\n const yTicksCountDefault = 6;\n const labels = data.map((item: BarChartData) => item.groupName as string);\n let barWidth = barWidthProp || defaultBarWidth;\n\n const yScale = d3\n .scaleLinear()\n .domain([min, max])\n .range([\n height - marginTop - marginBottom - (xAxisPadding || 0),\n marginTop,\n ])\n .nice();\n\n customYScale && customYScale(yScale);\n\n const yTicks = yScale.ticks();\n const yAxisLeft = d3.axisLeft(yScale).ticks(yTicksCountDefault);\n\n customYAxisLeft && customYAxisLeft(yAxisLeft);\n\n const yTicksCount = yAxisLeft.tickArguments()[0];\n\n const yAxis = svg\n .append('g')\n .attr('class', classNames.barChartYAxis)\n .call(yAxisLeft);\n\n yAxis.selectAll('.tick').attr('class', value => {\n return value === 0 ? `tick ${classNames.barChartYAxisZeroTick}` : 'tick';\n });\n\n customYAxis && customYAxis(yAxis);\n\n const { width: yAxisWidth } = computeDimensions(yAxis);\n const range = [\n marginLeft + yAxisWidth + (yAxisPadding || 0),\n width - marginRight,\n ];\n\n const xScale = d3\n .scaleBand()\n .domain(d3.range(data.length) as [])\n .range(range);\n\n barWidth = resizeBarWidth({\n data,\n sectionPadding,\n range,\n barWidth,\n barPadding,\n });\n\n customXScale && customXScale(xScale);\n\n const [x1, x2] = xScale.range();\n\n const xAxisBottom = d3\n .axisBottom(xScale)\n .tickFormat(value => labels[Number(value)]);\n\n if (typeof xScaleItemWidth === 'number') {\n xAxisBottom\n .tickValues(\n xScale.domain().filter((_, i, array) => {\n const chartWidth = x2 - x1;\n const ticks = Math.round(chartWidth / xScaleItemWidth);\n const length = array.length;\n const divider = Math.round(length / ticks);\n\n return !(i % divider);\n })\n )\n .tickSizeOuter(0);\n }\n\n customXAxisBottom && customXAxisBottom(xAxisBottom, { node, labels });\n\n const xAxis = svg\n .append('g')\n .call(xAxisBottom)\n .attr('class', classNames.barChartXAxis);\n\n customXAxis && customXAxis(xAxis);\n\n const marshalled = marshaling({\n data,\n yScale,\n xScale,\n barWidth,\n barPadding: typeof barPadding === 'number' ? barPadding : 0,\n colors,\n marginTop,\n });\n\n const marshalledData = marshalledMap\n ? marshalledMap(marshalled)\n : marshalled;\n\n yAxis.attr('transform', `translate( ${marginLeft + yAxisWidth}, 0)`);\n\n drawGrid({\n svg,\n yScale,\n xScale,\n yTicksCount,\n drawGridY,\n drawGridX,\n });\n\n xAxis.attr(\n 'transform',\n `translate(0, ${yScale(yTicks[0]) + (xAxisPadding || 0)})`\n );\n\n const gSvg = svg.append('g').attr('class', classNames.barChartBarGlobal);\n\n const groups = gSvg\n .selectAll('g')\n .data(marshalledData)\n .enter()\n .append('g')\n .attr(\n 'transform',\n (_: BarChartMarshalledGroup[], i) =>\n `translate(${Math.round(\n xScale((i as unknown) as string) as number\n )},${-(marginTop || 0)})`\n );\n\n const bars = drawBars\n ? drawBars({ groups, yScale, marshalledData, barWidth })\n : getBars({ groups, barWidth });\n let lines = null;\n\n if (Array.isArray(lineData) && lineData.length > 0) {\n lines = drawLines({\n svg,\n lineData,\n xScale,\n yScale,\n min: typeof minValuesLine === 'number' ? minValuesLine : min,\n stackedLine,\n curve,\n });\n }\n\n customBars && customBars({ bars, yScale, lines, marshalledData, lineData });\n\n if (dynamicTooltipEnable || labelPosition) {\n drawTooltip({\n svg,\n node,\n xScale,\n yScale,\n marshalledData,\n data,\n lineData,\n renderTooltip,\n labelPosition,\n marginTop,\n renderLabel,\n barWidth,\n barPadding,\n dynamicTooltipEnable,\n tooltipY,\n tooltipBind,\n formatTooltipValue,\n formatTooltipName,\n tooltipYDomain,\n setTooltipPosition,\n onLabelItem,\n isBarTooltip,\n bars: groups,\n tooltipRoot,\n tooltipClassName,\n });\n }\n\n customize && customize({ svg, marshalledData, yScale, xScale, lineData });\n }\n};\n","import { BarChartProps } from './types';\n\nexport const getDomain = ({\n data,\n minDomainValue,\n maxDomainValue,\n}: Pick<BarChartProps, 'data' | 'minDomainValue' | 'maxDomainValue'>) => {\n let MIN = Number.POSITIVE_INFINITY;\n let MAX = Number.NEGATIVE_INFINITY;\n\n data.forEach(({ groupName, ...groups }) => {\n let groupMax = 0;\n let groupMin = 0;\n\n Object.keys(groups).forEach(key => {\n const group = groups[key as never];\n\n let stackMax = 0;\n let stackMin = 0;\n\n Object.keys(group).forEach(groupKey => {\n const value = group[groupKey];\n\n if (value > 0) {\n stackMax += value;\n } else {\n stackMin += value;\n }\n });\n\n groupMax = Math.min(groupMax, stackMin);\n groupMin = Math.max(groupMin, stackMax);\n });\n\n MIN = Math.min(MIN, groupMax);\n MAX = Math.max(MAX, groupMin);\n });\n\n if (MIN === 0 && MAX === 0) {\n return {\n min: typeof minDomainValue === 'number' ? minDomainValue : 0,\n max: typeof maxDomainValue === 'number' ? maxDomainValue : 1,\n };\n }\n\n return {\n min: typeof minDomainValue === 'number' ? minDomainValue : MIN,\n max: typeof maxDomainValue === 'number' ? maxDomainValue : MAX,\n };\n};\n","import { ResizeBarWidthProps } from './types';\n\nexport const resizeBarWidth = ({\n data,\n range,\n barWidth,\n barPadding,\n sectionPadding,\n}: ResizeBarWidthProps): number => {\n const groupPadding = typeof sectionPadding === 'number' ? sectionPadding : 0;\n const chartWidth = range[1] - range[0];\n const barsWidth = data.reduce((acc, { groupName, ...curr }) => {\n return (\n acc +\n Object.keys(curr).reduce(\n (acc, _key, index) =>\n index > 0\n ? acc + (barWidth || 0) + (barPadding || 0)\n : acc + barWidth,\n 0\n ) +\n groupPadding\n );\n }, groupPadding);\n\n if (chartWidth < barsWidth) {\n return Math.floor(barWidth * (chartWidth / barsWidth));\n }\n\n return barWidth;\n};\n","import { BarChartMarshalledGroup, BarChartMarshaling } from './types';\n\nexport const marshaling = ({\n data,\n yScale,\n xScale,\n barWidth,\n barPadding,\n colors,\n marginTop,\n}: BarChartMarshaling): BarChartMarshalledGroup[][] =>\n data.map(({ groupName, ...groups }, groupIndex) => {\n const marshalledGroup: BarChartMarshalledGroup[] = [];\n const hundred = 100;\n const bandwidth = xScale.bandwidth();\n const groupsKeys = Object.keys(groups);\n\n groupsKeys.forEach((key: string, stackIndex: number) => {\n const group = groups[key as never];\n const groupKeys = Object.keys(group);\n const barGroupWidth =\n ((barWidth as number) + (barPadding as number)) * groupsKeys.length -\n (groupKeys.length > 1 ? (barPadding as number) : 0);\n\n let stackMax = 0;\n let stackMin = 0;\n\n groupKeys.forEach(groupKey => {\n const value = group[groupKey];\n const color = colors[groupKey];\n const x =\n ((barWidth as number) + (barPadding as number)) * stackIndex +\n bandwidth / 2 -\n barGroupWidth / 2;\n const isPositiveValue = value > 0;\n const height = isPositiveValue\n ? Math.abs(\n ((yScale(stackMax - value) - yScale(stackMax) + Number.EPSILON) *\n hundred) /\n hundred\n )\n : Math.abs(\n ((yScale(stackMin - value) - yScale(stackMin) + Number.EPSILON) *\n hundred) /\n hundred\n );\n\n if (isPositiveValue) {\n stackMax += value;\n }\n\n const y = isPositiveValue\n ? ((yScale(stackMax) + Number.EPSILON) * hundred) / hundred\n : yScale(stackMin) - yScale(0) + yScale(0);\n\n marshalledGroup.push({\n x,\n y: y + (marginTop || 0),\n height,\n color,\n value,\n groupName: groupName as string,\n name: groupKey,\n stackIndex,\n groupIndex,\n });\n\n if (!isPositiveValue) {\n stackMin += value;\n }\n });\n });\n\n return marshalledGroup;\n });\n","import { BarChartData } from '../types';\nimport { DrawGridProps } from './types';\n\nimport { barChartClassNames } from '../styled';\n\nexport const drawGrid = ({\n svg,\n yScale,\n xScale,\n yTicksCount,\n drawGridX,\n drawGridY,\n}: DrawGridProps) => {\n if (!drawGridY && !drawGridX) return;\n\n const global = svg\n .append('g')\n .attr('class', barChartClassNames.barChartGridGlobal);\n\n const yTicks = yScale.ticks(yTicksCount);\n const range = xScale.range();\n const domain = xScale.domain();\n\n if (drawGridX) {\n global\n .append('g')\n .selectAll('line')\n .data(yTicks)\n .join('line')\n .attr('class', d =>\n d === 0\n ? `${barChartClassNames.barChartGridLineX} ${barChartClassNames.barChartGridLineXZero}`\n : barChartClassNames.barChartGridLineX\n )\n .attr('x1', () => range[0])\n .attr('x2', () => range[1])\n .attr('y1', (d: BarChartData | any) => Math.round(yScale(d) as number))\n .attr('y2', (d: BarChartData | any) => Math.round(yScale(d) as number));\n }\n\n if (drawGridY) {\n const getX = (index: number) =>\n domain[index] !== void 0\n ? index === 0\n ? range[0]\n : Math.round(\n xScale.step() * index +\n range[0] -\n (xScale.step() / 2) * xScale.padding()\n )\n : range[1];\n\n global\n .append('g')\n .selectAll('line')\n .data(Array.from({ length: domain.length + 1 }, (_, index) => index))\n .join('line')\n .attr('class', d =>\n d === 0\n ? `${barChartClassNames.barChartGridLineY} ${barChartClassNames.barChartGridLineYZero}`\n : barChartClassNames.barChartGridLineY\n )\n .attr('x1', getX)\n .attr('x2', getX)\n .attr('y1', () => Math.round(yScale(yTicks[0]) as number))\n .attr('y2', () =>\n Math.round(yScale(yTicks[yTicks.length - 1]) as number)\n );\n }\n};\n","import { BarChartMarshalledGroup } from '../types';\nimport { GetBarsProps } from './types';\n\nexport const getBars = ({ groups, barWidth }: GetBarsProps) => {\n return groups\n .selectAll('rect')\n .data((item: BarChartMarshalledGroup[]) => item)\n .join('rect')\n .attr('x', (item: BarChartMarshalledGroup) => item.x)\n .attr('y', (item: BarChartMarshalledGroup) => item.y)\n .attr('width', barWidth)\n .attr('height', (item: BarChartMarshalledGroup) => item.height)\n .style('fill', (item: BarChartMarshalledGroup) => item.color);\n};\n","import React from 'react';\nimport * as d3 from 'd3';\nimport ReactDOMServer from 'react-dom/server';\n\nimport { DrawTooltipProps } from './types';\nimport {\n BarChartMarshalledGroup,\n BarChartLinetData,\n BarChartMergedData,\n} from '../types';\n\nimport { getLabelY } from './getLabelY';\nimport { getLabel } from './getLabel';\nimport { barChartClassNames } from '../styled';\nimport {\n TooltipFlex,\n TooltipGroupName,\n LabelFlex,\n LabelFlexCenter,\n TooltipContainer,\n TooltipItem,\n ColFlex,\n ColorBox,\n ColorLine,\n Name,\n Value,\n} from '../../../common/components/tooltips';\n\nexport const drawTooltip = ({\n svg,\n node,\n data,\n marshalledData,\n xScale,\n yScale,\n renderTooltip,\n labelPosition,\n marginTop,\n renderLabel,\n barWidth,\n barPadding,\n dynamicTooltipEnable,\n tooltipY,\n tooltipBind,\n lineData,\n formatTooltipValue,\n formatTooltipName,\n tooltipYDomain,\n setTooltipPosition,\n onLabelItem,\n isBarTooltip,\n bars,\n tooltipRoot,\n tooltipClassName,\n}: DrawTooltipProps) => {\n d3.select(node)\n .select(`.${barChartClassNames.barChartMouseContainer}`)\n .remove();\n\n const xScaleBandDomain = xScale.domain();\n const [x1, x2] = xScale.range();\n const [y1, y2] = yScale.range();\n const bandwidth = xScale.bandwidth();\n const format = d3.format(',');\n\n const getX = (index: number): number =>\n xScaleBandDomain[index] !== void 0\n ? index === 0\n ? x1\n : Math.round(\n xScale.step() * index + x1 - (xScale.step() / 2) * xScale.padding()\n )\n : x2;\n const groups = xScaleBandDomain.map(value => getX(Number(value) + 1));\n\n const topYDomain = tooltipYDomain\n ? tooltipYDomain({ data: marshalledData, lineData, yScale })\n : marshalledData.reduce((acc, curr, index) => {\n const lineMin =\n d3.min(lineData as BarChartLinetData[], ({ values }) =>\n typeof values[index] === 'number'\n ? yScale((values[index] || 0) - y2)\n : Number.POSITIVE_INFINITY\n ) || Number.POSITIVE_INFINITY;\n\n acc.push(\n curr.reduce(\n (acc, { y }) => Math.min(acc, y, lineMin as number),\n Number.POSITIVE_INFINITY\n ) as any\n );\n return acc;\n }, []);\n\n const mouseGlobal = svg.append('g').attr('class', 'lineChartMouseGlobal');\n const mouseRect = mouseGlobal\n .append('rect')\n .attr('width', x2 - x1)\n .attr('height', Math.abs(y1 - y2))\n .attr('class', barChartClassNames.barChartMouseRect)\n .attr('transform', `translate(${x1}, ${y2})`);\n\n if (dynamicTooltipEnable) {\n const tooltipContainer: Element | null =\n tooltipRoot || document.querySelector('body');\n let tooltip: d3.Selection<any, unknown, any, any> = d3.select(\n `.${barChartClassNames.barChartMouseTooltip}`\n );\n\n if (tooltip.size() === 0) {\n tooltip = d3\n .select(tooltipContainer)\n .append('div')\n .attr('class', barChartClassNames.barChartMouseTooltip)\n .style('opacity', '0')\n .style('position', 'absolute')\n .html(() => {\n const html = ReactDOMServer.renderToString(\n <TooltipFlex className={barChartClassNames.barChartTooltipFlex} />\n );\n\n return html;\n });\n }\n\n const barChartTootipFlex = tooltip.select(\n `.${barChartClassNames.barChartTooltipFlex}`\n );\n\n let isVisible = false;\n let flagCurrIndex: number | null = null;\n\n const setVisible = (visible?: boolean) => {\n isVisible = Boolean(visible);\n\n const opacity = isVisible ? '1' : '0';\n tooltip.style('opacity', opacity);\n\n if (!isVisible) {\n tooltip.attr('class', barChartClassNames.barChartMouseTooltip);\n flagCurrIndex = null;\n tooltip.style('transition', 'none');\n tooltip.style('top', null);\n tooltip.style('left', null);\n } else {\n tooltip.attr(\n 'class',\n `${barChartClassNames.barChartMouseTooltip} ${tooltipClassName || ''}`\n );\n tooltip.style('transition', null);\n }\n };\n\n mouseRect.on('mouseout.tooltip', () => setVisible());\n mouseRect.on('touchmove.tooltip mousemove.tooltip', event => {\n const [docX, docY] = d3.pointer(event, document);\n const [rectrX] = d3.pointer(event, mouseRect);\n const [nodeX, nodeY] = d3.pointer(event, node);\n const x = rectrX - (rectrX - nodeX);\n const offsetX = docX - nodeX;\n const offsetY = docY - nodeY;\n\n const currIndex = groups.findIndex(value => x <= value);\n\n if (isBarTooltip) {\n const containts = document.elementsFromPoint(\n event.clientX,\n event.clientY\n );\n const currBars = d3\n .select(bars.nodes()[currIndex])\n .selectAll('rect')\n .nodes();\n const isContains = containts.some(item => currBars.includes(item));\n\n if (!isContains) {\n if (isVisible) {\n setVisible(false);\n }\n mouseRect.style('cursor', 'default');\n return;\n } else {\n mouseRect.style('cursor', 'pointer');\n }\n }\n\n const top =\n (typeof tooltipY === 'number'\n ? tooltipY\n : ((topYDomain[currIndex] as unknown) as number) - y2) + offsetY;\n const left =\n (tooltipBind\n ? (xScale((currIndex as unknown) as string) || 0) + bandwidth / 2\n : x) + offsetX;\n\n if (tooltipBind && flagCurrIndex === currIndex) {\n return;\n }\n\n let currData = marshalledData[currIndex] as BarChartMergedData;\n if (Array.isArray(currData) && currData.length === 0) {\n return;\n }\n\n if (lineData) {\n const currLineData = lineData.map(({ values, ...rest }) => ({\n ...rest,\n value: values[currIndex],\n groupName: data[currIndex] && data[currIndex].groupName,\n }));\n\n if (Array.isArray(currLineData) && Array.isArray(currData)) {\n currData = currData.concat(currLineData as BarChartMergedData);\n }\n }\n\n const svgWidth = (svg.node() as SVGElement).getBoundingClientRect()\n .width as number;\n\n if (typeof setTooltipPosition === 'function') {\n setTooltipPosition({\n left,\n top,\n tooltip,\n svgWidth,\n });\n } else if (!setTooltipPosition) {\n tooltip.style('left', `${left}px`).style('top', `${top}px`);\n }\n\n if (renderTooltip) {\n barChartTootipFlex.html(() => {\n const html = ReactDOMServer.renderToString(\n <>\n {renderTooltip(\n currData,\n setTooltipPosition\n ? {\n left,\n top,\n tooltip,\n svgWidth,\n }\n : undefined,\n barWidth\n )}\n </>\n );\n\n return html;\n });\n } else {\n if (!isVisible) {\n setVisible(true);\n }\n\n barChartTootipFlex.html(() => {\n const html = ReactDOMServer.renderToString(\n <TooltipContainer className={barChartClassNames.barChartTooltip}>\n {currData && currData[0] && (\n <TooltipGroupName\n className={barChartClassNames.barChartTooltipGroupName}\n >\n {currData[0].groupName}\n </TooltipGroupName>\n )}\n {currData &&\n currData.map(\n ({ name, value, stroke, fill, color, lineType }) => (\n <TooltipItem\n key={name}\n className={barChartClassNames.barChartTooltipItem}\n >\n <ColFlex\n className={barChartClassNames.barChartTooltipColFlex}\n >\n {lineType ? (\n <ColorLine\n className={barChartClassNames.barChartColorLine}\n style={{ backgroundColor: stroke || fill }}\n />\n ) : (\n <ColorBox\n className={barChartClassNames.barChartColorBox}\n style={{ backgroundColor: color }}\n />\n )}\n <Name\n className={barChartClassNames.barChartTooltipName}\n >\n {formatTooltipName ? formatTooltipName(name) : name}\n </Name>\n </ColFlex>\n <Value\n className={barChartClassNames.barChartTooltipValue}\n >\n {formatTooltipValue\n ? formatTooltipValue(value)\n : format(value)}\n </Value>\n </TooltipItem>\n )\n )}\n </TooltipContainer>\n );\n\n return html;\n });\n }\n\n flagCurrIndex = currIndex;\n if (!isVisible) {\n setVisible(true);\n }\n });\n }\n\n const container = d3\n .select(node)\n .append('div')\n .attr('class', barChartClassNames.barChartMouseContainer);\n\n const labelContainer = container\n .append('div')\n .attr('class', barChartClassNames.barChartLabelContainer)\n .style('position', 'absolute')\n .style('top', `${y2}px`);\n\n if (labelPosition) {\n const concatedData: BarChartMarshalledGroup[][] = lineData\n ? marshalledData.map((stack, index) =>\n stack.concat(\n lineData.map(({ values, name, stroke }) => {\n const { stacksCount } = stack.reduce(\n (acc, { stackIndex }) => {\n const { indexFlag, stacksCount } = acc;\n if (stackIndex !== indexFlag) {\n return {\n indexFlag: stackIndex,\n stacksCount: stacksCount + 1,\n };\n }\n return acc;\n },\n {\n indexFlag: -1,\n stacksCount: 0,\n }\n );\n const barsWidth =\n (barWidth * stacksCount +\n (barPadding || 0) * (stacksCount - 1)) /\n 2;\n\n return {\n x: stack[0].x - barWidth / 2 + barsWidth,\n y: yScale(values[index] as number) + marginTop,\n height: 0,\n color: stroke,\n value: values[index],\n groupName: stack[0].groupName,\n name,\n stackIndex: 0,\n groupIndex: index,\n };\n }) as BarChartMarshalledGroup[]\n )\n )\n : marshalledData;\n\n const groups = labelContainer\n .selectAll('div')\n .data(concatedData)\n .enter()\n .append('div')\n .style('position', 'absolute')\n .style(\n 'transform',\n (_: BarChartMarshalledGroup[], index) =>\n `translate(${Math.round(\n xScale((index as unknown) as string) as number\n )}px,${-(marginTop || 0)}px)`\n );\n\n const LabelFlexStyled =\n labelPosition === 'center' ? LabelFlexCenter : LabelFlex;\n\n const LabelStyle = getLabel(labelPosition);\n\n groups\n .selectAll('span')\n .data((item: BarChartMarshalledGroup[]) =>\n onLabelItem ? onLabelItem(item) : item\n )\n .join('div')\n .style('left', item => `${Math.round(item.x + barWidth / 2)}px`)\n .style(\n 'top',\n (item: BarChartMarshalledGroup) =>\n `${getLabelY(labelPosition, y2, item)}px`\n )\n .style('position', 'absolute')\n .html((item: BarChartMarshalledGroup) =>\n ReactDOMServer.renderToString(\n <LabelFlexStyled className={barChartClassNames.barChartLabelFlex}>\n {renderLabel ? (\n renderLabel({ ...item, barWidth })\n ) : (\n <LabelStyle className={barChartClassNames.barChartLabel}>\n {format(item.value)}\n </LabelStyle>\n )}\n </LabelFlexStyled>\n )\n );\n }\n};\n","import { BarChartLabelPosition } from '../types';\n\nimport {\n Label as LabelUI,\n LabelTop,\n LabelBottom,\n} from '../../../common/components/tooltips';\n\nexport const getLabel = (labelPosition: BarChartLabelPosition) => {\n switch (labelPosition) {\n case 'top':\n return LabelTop;\n case 'bottom':\n return LabelBottom;\n default:\n return LabelUI;\n }\n};\n","import { BarChartLabelPosition, BarChartMarshalledGroup } from '../types';\n\nexport const getLabelY = (\n labelPosition: BarChartLabelPosition,\n y2: number,\n item: BarChartMarshalledGroup\n): number => {\n switch (labelPosition) {\n case 'center':\n return item.y + item.height / 2 - y2;\n case 'bottom':\n return item.y + item.height - y2;\n default:\n return item.y;\n }\n};\n","import React, { useEffect } from 'react';\n\nimport { BarChartProps } from './types';\n\nimport { useNode } from '../../hooks';\nimport { useResize } from '../../hooks';\n\nimport { draw } from './draw';\n\nimport { SvgWrapper, TooltipStyles } from './styled';\n\nexport const BarChart: React.FC<BarChartProps> = (\n props\n): React.ReactElement => {\n const { className, style, children } = props;\n const [ref, node] = useNode();\n\n useEffect(() => {\n node && draw(node, props);\n }, [node, props]);\n\n const onDraw = () => draw(node, props);\n\n useResize(props.width, onDraw);\n\n return (\n <div className={className} style={style}>\n <TooltipStyles />\n <SvgWrapper ref={ref}>{children}</SvgWrapper>\n </div>\n );\n};\n\nBarChart.defaultProps = {\n data: [],\n colors: {},\n margin: {\n top: 10,\n right: 10,\n bottom: 10,\n left: 0,\n },\n barWidth: 12,\n barPadding: 0,\n height: 320,\n yAxisPadding: 0,\n xAxisPadding: 0,\n tooltipBind: true,\n sectionPadding: 1,\n};\n","import styled from 'styled-components';\n\nimport { TooltipFlex as TooltipFlexUI } from '../../common/components/tooltips';\n\nexport const horizontalBarChartClassNames = {\n horizontalBarChartButtonTd: 'horizontalBarChartButtonTd',\n horizontalBarChartLabelTd: 'horizontalBarChartLabelTd',\n horizontalBarChartLabelCell: 'horizontalBarChartLabelCell',\n horizontalBarChartBarTd: 'horizontalBarChartBarTd',\n horizontalBarChartBarFlex: 'horizontalBarChartBarFlex',\n horizontalBarChartBar: 'horizontalBarChartBar',\n horizontalBarChartBarFirst: 'horizontalBarChartBarFirst',\n horizontalBarChartBarLast: 'horizontalBarChartBarLast',\n horizontalBarChartBarOnly: 'horizontalBarChartBarOnly',\n horizontalBarChartTooltipFlex: 'horizontalBarChartTooltipFlex',\n horizontalBarChartStackWrapper: 'horizontalBarChartStackWrapper',\n horizontalBarChartTooltipContainer: 'horizontalBarChartTooltipContainer',\n horizontalBarChartStackSumContainer: 'horizontalBarChartStackSumContainer',\n horizontalBarChartStackSum: 'horizontalBarChartStackSum',\n horizontalBarChartXScaleTd: 'horizontalBarChartXScaleTd',\n horizontalBarChartXScaleTicks: 'horizontalBarChartXScaleTicks',\n horizontalBarChartXScaleTick: 'horizontalBarChartXScaleTick',\n horizontalBarChartTooltipItem: 'horizontalBarChartTooltipItem',\n horizontalBarChartTooltipName: 'horizontalBarChartTooltipName',\n horizontalBarChartTooltipValue: 'horizontalBarChartTooltipValue',\n};\n\nexport const Table = styled.table`\n width: 100%;\n`;\n\nexport const LabelCell = styled.div`\n text-align: right;\n`;\n\nexport const BarFlex = styled.div`\n width: 100%;\n display: flex;\n height: 1rem;\n`;\n\nexport const BarsTd = styled.td`\n width: 100%;\n position: relative;\n vertical-align: middle;\n`;\n\nexport const TooltipFlex = styled(TooltipFlexUI)`\n position: absolute;\n top: 0;\n left: 50%;\n transform: translate(-50%, -50%);\n will-change: left, top;\n`;\n\nexport const StackSumContainer = styled.div`\n position: relative;\n`;\n\nexport const StackSum = styled.div`\n white-space: nowrap;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(0, -50%);\n`;\n\nexport const StackWrapper = styled.div`\n position: absolute;\n top: 0;\n display: flex;\n justify-content: flex-start;\n height: 100%;\n`;\n","import React from 'react';\nimport * as d3 from 'd3';\n\nimport {\n horizontalBarChartClassNames as classNames,\n TooltipFlex,\n} from '../styled';\nimport {\n TooltipContainer,\n TooltipItem,\n Name,\n Value,\n ColorBox,\n} from '../../../common/components/tooltips';\n\nimport { TooltipProps } from './types';\n\nexport const Tooltip: React.FC<TooltipProps> = ({\n renderTooltip,\n bars,\n style,\n className,\n}): React.ReactElement => {\n const format = d3.format(',');\n\n return (\n <TooltipFlex\n className={`${classNames.horizontalBarChartTooltipFlex} ${className ||\n ''}`}\n style={style}\n >\n <TooltipContainer\n className={classNames.horizontalBarChartTooltipContainer}\n >\n {renderTooltip\n ? renderTooltip(bars)\n : bars.map(({ color, name, value, groupName }, index) => (\n <TooltipItem\n key={`${name || ''}-${index}-${groupName}`}\n className={classNames.horizontalBarChartTooltipItem}\n >\n {color && <ColorBox style={{ backgroundColor: color }} />}\n {name && (\n <Name className={classNames.horizontalBarChartTooltipName}>\n {name}\n </Name>\n )}\n <Value className={classNames.horizontalBarChartTooltipValue}>\n {format(value)}\n </Value>\n </TooltipItem>\n ))}\n </TooltipContainer>\n </TooltipFlex>\n );\n};\n","import React, { useCallback, useEffect } from 'react';\nimport * as d3 from 'd3';\nimport { render, unmountComponentAtNode } from 'react-dom';\n\nimport {\n HorizontalBarChartMarshalingData,\n HorizontalBarChartProps,\n} from '../../types';\nimport { UseTooltip } from './types';\n\nimport { Tooltip } from '../../Tooltip';\n\nconst rootElement: HTMLDivElement = document.createElement('div');\n\nexport const useTooltip = ({\n renderTooltip,\n tooltipBind,\n tooltipStyle,\n tooltipRoot,\n tooltipClassName,\n hideTooltip,\n}: Pick<\n HorizontalBarChartProps,\n | 'renderTooltip'\n | 'tooltipBind'\n | 'tooltipStyle'\n | 'tooltipRoot'\n | 'tooltipClassName'\n | 'hideTooltip'\n>): UseTooltip => {\n useEffect(() => {\n const container: Element | null =\n tooltipRoot || document.querySelector('body');\n\n container && container.appendChild(rootElement);\n return () => {\n unmountComponentAtNode(rootElement);\n };\n }, [tooltipRoot]);\n\n const onMouseMove = useCallback(\n (event: React.MouseEvent, bars: HorizontalBarChartMarshalingData[]) => {\n let [x, y] = d3.pointer(event, document);\n\n if (!tooltipBind && 'getBoundingClientRect' in event.target) {\n const {\n width,\n height,\n }: DOMRect = (event.target as HTMLDivElement).getBoundingClientRect();\n const [barX, barY] = d3.pointer(event, event.target);\n\n x = x - barX + width / 2;\n y = y - barY + height / 2;\n }\n\n if (rootElement) {\n rootElement.style.visibility = 'visible';\n }\n\n render(\n <Tooltip\n style={{\n left: x,\n top: y,\n ...tooltipStyle,\n }}\n bars={bars}\n renderTooltip={renderTooltip}\n className={tooltipClassName}\n />,\n rootElement\n );\n },\n [tooltipClassName, tooltipStyle, renderTooltip, tooltipBind]\n );\n\n const onMouseLeave = useCallback(() => {\n if (rootElement) {\n rootElement.style.visibility = 'hidden';\n hideTooltip && hideTooltip();\n }\n }, [hideTooltip]);\n\n return [onMouseMove, onMouseLeave];\n};\n","import styled from 'styled-components';\n\nexport const BarStyled = styled.div`\n position: relative;\n display: inline-flex;\n height: 100%;\n`;\n","import React from 'react';\n\nimport { BarProps } from './types';\n\nimport { horizontalBarChartClassNames as classNames } from '../styled';\nimport { BarStyled } from './styled';\n\nexport const Bar: React.FC<BarProps> = ({\n withTooltip,\n bar,\n formatNativeTitle,\n tooltipBind,\n mouseMove,\n mouseLeave,\n pointerEventsNone,\n isFirstChild,\n isLastChild,\n isOnlyChild,\n}): React.ReactElement => {\n const { color, width } = bar;\n const ceiledWidth = Math.abs(width);\n const onMouseMove = withTooltip\n ? (event: React.MouseEvent) => mouseMove(event, [bar])\n : void 0;\n const onMouseLeave = withTooltip ? () => mouseLeave() : void 0;\n\n return (\n <BarStyled\n className={`${classNames.horizontalBarChartBar} ${\n isFirstChild ? classNames.horizontalBarChartBarFirst : ''\n } ${isLastChild ? classNames.horizontalBarChartBarLast : ''} ${\n isOnlyChild ? classNames.horizontalBarChartBarOnly : ''\n }`}\n style={{\n width: `${ceiledWidth}%`,\n backgroundColor: color,\n pointerEvents: pointerEventsNone ? 'none' : 'auto',\n }}\n title={formatNativeTitle ? formatNativeTitle(bar) : ''}\n onMouseOver={onMouseMove}\n onMouseMove={tooltipBind ? onMouseMove : void 0}\n onMouseOut={onMouseLeave}\n />\n );\n};\n","import styled from 'styled-components';\n\nexport const TickTd = styled.td`\n position: relative;\n`;\n\nexport const Ticks = styled.div`\n position: relative;\n height: 1rem;\n`;\n\nexport const Tick = styled.div`\n white-space: nowrap;\n width: 0;\n height: 0;\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n","import React from 'react';\nimport * as d3 from 'd3';\n\nimport { HorizontalBarChartProps } from '../types';\n\nimport { useScale } from './hooks/useScale';\n\nimport { TickTd, Ticks, Tick } from './styled';\nimport { horizontalBarChartClassNames as classNames } from '../styled';\n\nexport const XScale: React.FC<Pick<\n HorizontalBarChartProps,\n 'maxValue' | 'scaleTicks' | 'renderTicks' | 'scaleDomain'\n>> = ({\n maxValue,\n scaleTicks,\n renderTicks,\n scaleDomain,\n}): React.ReactElement => {\n const range = useScale({ maxValue, scaleTicks, scaleDomain });\n const format = d3.format(',');\n\n return (\n <tr>\n <td />\n <TickTd className={classNames.horizontalBarChartXScaleTd}>\n <Ticks className={classNames.horizontalBarChartXScaleTicks}>\n {range.map((tick, index, ticks) => {\n const { value, x } = tick;\n\n return (\n <Tick\n key={value}\n className={classNames.horizontalBarChartXScaleTick}\n style={{\n left: `${x}%`,\n justifyContent:\n index === 0\n ? 'flex-start'\n : index === ticks.length - 1\n ? 'flex-end'\n : '',\n }}\n >\n {renderTicks ? renderTicks(tick) : format(value)}\n </Tick>\n );\n })}\n </Ticks>\n </TickTd>\n </tr>\n );\n};\n","import { useMemo } from 'react';\nimport * as d3 from 'd3';\n\nimport {\n HorizontalBarChartProps,\n HorizontalBarChartScaleItem,\n} from '../../types';\n\nconst hundred = 100;\n\nexport const useScale = ({\n maxValue,\n scaleTicks,\n scaleDomain,\n}: Pick<\n HorizontalBarChartProps,\n 'maxValue' | 'scaleTicks' | 'scaleDomain'\n>): HorizontalBarChartScaleItem[] => {\n return useMemo(() => {\n const scaleLinear = d3\n .scaleLinear()\n .domain([0, maxValue] as Iterable<d3.NumberValue>)\n .range([0, hundred]);\n\n const ticks = scaleLinear.ticks(scaleTicks);\n\n return (scaleDomain || ticks).map((value: number) => ({\n value,\n x: scaleLinear(value),\n }));\n }, [maxValue, scaleTicks, scaleDomain]);\n};\n","import React from 'react';\nimport * as d3 from 'd3';\n\nimport { HorizontalBarChartProps } from './types';\n\nimport { useMarshaling } from './hooks/useMarshaling';\nimport { useTooltip } from './hooks/useTooltip';\nimport { useStackWrapper } from './hooks/useStackWrapper';\n\nimport { Bar } from './Bar';\nimport { XScale } from './XScale';\nimport {\n Table,\n LabelCell,\n horizontalBarChartClassNames as classNames,\n BarFlex,\n BarsTd,\n StackSumContainer,\n StackSum,\n} from './styled';\n\nexport const HorizontalBarChart: React.FC<HorizontalBarChartProps> = ({\n data,\n className,\n style,\n children,\n labels,\n fullExtent,\n maxValue,\n formatNativeTitle,\n renderTooltip,\n withTooltip,\n withStackSum,\n tooltipBind,\n scaleTicks,\n renderTicks,\n renderButton,\n tooltipStyle,\n tooltipClassName,\n scaleDomain,\n renderDataTable,\n thead,\n withoutXScale,\n stackedTooltip,\n fullChartTooltip,\n hideTooltip,\n}): React.ReactElement => {\n const { fullMax, data: marshalingData } = useMarshaling({\n data,\n fullExtent,\n maxValue,\n labels,\n });\n const [mouseMove, mouseLeave] = useTooltip({\n renderTooltip,\n tooltipBind,\n tooltipStyle,\n tooltipClassName,\n hideTooltip,\n });\n const Stack = useStackWrapper(stackedTooltip);\n\n return (\n <Table\n className={className}\n style={style}\n onMouseOver={\n fullChartTooltip\n ? event => mouseMove(event, marshalingData.flat())\n : void 0\n }\n onMouseMove={\n fullChartTooltip\n ? event => mouseMove(event, marshalingData.flat())\n : void 0\n }\n onMouseOut={fullChartTooltip ? mouseLeave : void 0}\n >\n {thead}\n <tbody>\n {marshalingData.map((item, rowIndex) => {\n const stackSum =\n (withStackSum || renderDataTable) &&\n d3.sum(item, ({ value }) => value);\n const sumWidth = d3.sum(item, ({ width }) => width);\n\n return (\n <tr key={`row-${rowIndex}`}>\n {typeof renderButton === 'function' && (\n <td className={classNames.horizontalBarChartButtonTd}>\n {renderButton(item, rowIndex)}\n </td>\n )}\n <td className={classNames.horizontalBarChartLabelTd}>\n {labels && labels[rowIndex] && (\n <LabelCell className={classNames.horizontalBarChartLabelCell}>\n {labels[rowIndex]}\n </LabelCell>\n )}\n </td>\n <BarsTd\n className={classNames.horizontalBarChartBarTd}\n style={{ pointerEvents: fullChartTooltip ? 'none' : 'auto' }}\n >\n <BarFlex\n className={classNames.horizontalBarChartBarFlex}\n style={{ pointerEvents: fullChartTooltip ? 'none' : 'auto' }}\n >\n <Stack\n style={stackedTooltip ? { width: `${sumWidth}%` } : void 0}\n item={item}\n tooltipBind={tooltipBind}\n mouseMove={mouseMove}\n mouseLeave={mouseLeave}\n />\n {item.map(\n (bar, barIndex, array) =>\n bar.value !== 0 && (\n <Bar\n key={`bar-${bar.name || ''}-${barIndex}`}\n formatNativeTitle={formatNativeTitle}\n bar={bar}\n tooltipBind={tooltipBind}\n pointerEventsNone={stackedTooltip || fullChartTooltip}\n withTooltip={withTooltip && !stackedTooltip}\n mouseMove={mouseMove}\n mouseLeave={mouseLeave}\n isOnlyChild={array.length === 1}\n isFirstChild={barIndex === 0 && array.length > 1}\n isLastChild={\n array.length - 1 === barIndex && array.length > 1\n }\n />\n )\n )}\n {withStackSum && (\n <StackSumContainer\n className={classNames.horizontalBarChartStackSumContainer}\n >\n <StackSum\n className={classNames.horizontalBarChartStackSum}\n >\n {stackSum}\n </StackSum>\n </StackSumContainer>\n )}\n </BarFlex>\n </BarsTd>\n {renderDataTable &&\n renderDataTable(item, stackSum as number, rowIndex)}\n </tr>\n );\n })}\n {!withoutXScale && (\n <XScale\n maxValue={typeof maxValue === 'number' ? maxValue : fullMax}\n scaleTicks={scaleTicks}\n renderTicks={renderTicks}\n scaleDomain={scaleDomain}\n />\n )}\n {children}\n </tbody>\n </Table>\n );\n};\n\nHorizontalBarChart.defaultProps = {\n fullExtent: true,\n withTooltip: false,\n withStackSum: false,\n tooltipBind: false,\n scaleTicks: 4,\n withoutXScale: false,\n};\n","import { useMemo } from 'react';\nimport * as d3 from 'd3';\n\nimport {\n HorizontalBarChartProps,\n HorizontalBarChartData,\n HorizontalBarChartMarshalingData,\n} from '../types';\n\nconst hundred = 100;\n\nexport const useMarshaling = ({\n data,\n fullExtent,\n maxValue,\n labels,\n}: Pick<\n HorizontalBarChartProps,\n 'data' | 'fullExtent' | 'maxValue' | 'labels'\n>): {\n fullMax: number;\n data: HorizontalBarChartMarshalingData[][];\n} => {\n return useMemo(() => {\n const fullMax = d3.max(data, item =>\n d3.sum(item, ({ value }) => value)\n ) as number;\n const scaleLinear = d3\n .scaleLinear()\n .domain([\n 0,\n typeof maxValue === 'number' ? maxValue : fullMax,\n ] as Iterable<d3.NumberValue>)\n .range([0, hundred]);\n\n return {\n fullMax,\n data: data.map((item: HorizontalBarChartData[], index) => {\n if (!fullExtent) {\n scaleLinear.domain([\n 0,\n typeof maxValue === 'number'\n ? maxValue\n : d3.sum(item, ({ value }) => value),\n ] as Iterable<d3.NumberValue>);\n }\n\n return item.map(({ value, ...rest }) => ({\n ...rest,\n value,\n width: scaleLinear(value),\n groupName: labels ? labels[index] : '',\n }));\n }),\n };\n }, [data, fullExtent, maxValue, labels]);\n};\n","import React, { Fragment, useMemo, CSSProperties, ReactNode } from 'react';\n\nimport {\n horizontalBarChartClassNames as classNames,\n StackWrapper,\n} from '../styled';\n\nimport { UseTooltip } from './useTooltip/types';\nimport {\n HorizontalBarChartMarshalingData,\n HorizontalBarChartProps,\n} from '../types';\n\nexport const useStackWrapper = (stackedTooltip?: boolean) => {\n return useMemo(\n () =>\n stackedTooltip\n ? ({\n item,\n mouseMove,\n mouseLeave,\n tooltipBind,\n ...props\n }: {\n style?: CSSProperties;\n item: HorizontalBarChartMarshalingData[];\n tooltipBind: HorizontalBarChartProps['tooltipBind'];\n mouseMove: UseTooltip[0];\n mouseLeave: UseTooltip[1];\n }) => (\n <StackWrapper\n className={classNames.horizontalBarChartStackWrapper}\n onMouseOver={event => mouseMove(event, item)}\n onMouseMove={\n tooltipBind ? event => mouseMove(event, item) : void 0\n }\n onMouseOut={mouseLeave}\n {...props}\n />\n )\n : ({ children }: { children?: ReactNode }) => (\n <Fragment>{children}</Fragment>\n ),\n [stackedTooltip]\n );\n};\n","import styled, { createGlobalStyle } from 'styled-components';\n\nimport { Wrapper } from '../../common/components/Wrapper';\n\nexport const bubbleChartClassNames = {\n bubbleChartYAxis: 'bubbleChartYAxis',\n bubbleChartYAxisZeroTick: 'bubbleChartYAxisZeroTick',\n bubbleChartXAxis: 'bubbleChartXAxis',\n bubbleChartGridGlobal: 'bubbleChartGridGlobal',\n bubbleChartGridLineX: 'bubbleChartGridLineX',\n bubbleChartGridLineY: 'bubbleChartGridLineY',\n bubbleChartCircle: 'bubbleChartCircle',\n bubbleChartYScaleLabel: 'bubbleChartYScaleLabel',\n bubbleChartTooltip: 'bubbleChartTooltip',\n bubbleChartTooltipContainer: 'bubbleChartTooltipContainer',\n bubbleChartTooltipFlex: 'bubbleChartTooltipFlex',\n bubbleChartTip: 'bubbleChartTip',\n};\n\nexport const SvgWrapper = styled(Wrapper)`\n .${bubbleChartClassNames.bubbleChartYAxis},\n .${bubbleChartClassNames.bubbleChartXAxis},\n .${bubbleChartClassNames.bubbleChartGridGlobal} {\n shape-rendering: crispEdges;\n }\n\n .${bubbleChartClassNames.bubbleChartGridLineX},\n .${bubbleChartClassNames.bubbleChartGridLineY} {\n stroke: rgba(149, 149, 149, 0.24);\n }\n\n .${bubbleChartClassNames.bubbleChartYScaleLabel} {\n font-size: 10px;\n }\n`;\n\nexport const TooltipStyles = createGlobalStyle`\n .${bubbleChartClassNames.bubbleChartTooltipContainer} {\n position: absolute;\n transition: opacity 150ms cubic-bezier(0.2, 1, 0.6, 1);\n pointer-events: none;\n z-index: 1;\n }\n`;\n","import styled from 'styled-components';\n\nexport const Tooltip = styled.div`\n width: 0;\n height: 0;\n display: flex;\n align-items: flex-end;\n justify-content: center;\n font-size: 12px;\n white-space: nowrap;\n`;\n","import * as d3 from 'd3';\n\nimport { bubbleChartClassNames as classNames } from './styled';\nimport { appendSvg } from '../../helpers';\nimport { computeDimensions } from '../../helpers/computeDimensions';\nimport { BubbleChartProps } from './types';\nimport { bubbleChartDefaultProps } from './';\nimport { drawGrid } from './drawGrid';\nimport { drawTooltip } from './drawTooltip';\n\nexport const draw = (\n node: HTMLElement | null,\n props: BubbleChartProps\n): void => {\n const {\n data,\n margin,\n xAxisPadding,\n yAxisPadding,\n customYScale,\n customYAxis,\n customXScale,\n customXAxis,\n minSize,\n maxSize,\n minYValue,\n maxYValue,\n drawGridY,\n drawGridX,\n xScaleItemWidth,\n bubbleStyle,\n customize,\n yScaleLabel,\n yScaleLabelPadding,\n enableTooltip,\n tooltipRoot,\n tooltipClassName,\n renderTooltip,\n } = props;\n\n if (node !== null && data.length) {\n const marginTop = margin ? margin.top : 0;\n const marginRight = margin ? margin.right : 0;\n const marginBottom = margin ? margin.bottom : 0;\n const marginLeft = margin ? margin.left : 0;\n const { width: nodeWidth } = node.getBoundingClientRect();\n const width = props.width || nodeWidth;\n const height = props.height || 0;\n const yTicksCountDefault = 6;\n\n const minY =\n typeof minYValue === 'number'\n ? minYValue\n : (d3.min(data, ({ yValue }) => yValue) as number);\n const maxY =\n typeof maxYValue === 'number'\n ? maxYValue\n : (d3.max(data, ({ yValue }) => yValue) as number);\n\n const svg = appendSvg(node, width, height || 0);\n\n const sizeScale = d3\n .scaleLinear()\n .domain([\n d3.min(data, ({ sizeValue }) => sizeValue) as number,\n d3.max(data, ({ sizeValue }) => sizeValue) as number,\n ])\n .range([\n minSize || bubbleChartDefaultProps.minSize,\n maxSize || bubbleChartDefaultProps.maxSize,\n ]);\n\n const yRange1 = height - marginTop - marginBottom - (xAxisPadding || 0);\n\n const yScale = d3\n .scaleLinear()\n .domain([minY, maxY])\n .range([yRange1, marginTop])\n .nice();\n\n customYScale && customYScale(yScale);\n\n const yTicks = yScale.ticks();\n const yAxisLeft = d3.axisLeft(yScale).ticks(yTicksCountDefault);\n\n const yTicksCount = yAxisLeft.tickArguments()[0];\n\n const yAxis = svg\n .append('g')\n .attr('class', classNames.bubbleChartYAxis)\n .call(yAxisLeft);\n\n let yScaleLabelHeight = yScaleLabelPadding || 0;\n\n if (yScaleLabel) {\n const label = svg\n .append('text')\n .text(yScaleLabel)\n .attr('class', classNames.bubbleChartYScaleLabel);\n\n const { width, height } = computeDimensions(label);\n\n yScaleLabelHeight = yScaleLabelHeight + height;\n\n label.attr(\n 'transform',\n `rotate(-90) translate(-${(yRange1 + marginBottom + width) /\n 2}, ${height})`\n );\n }\n\n yAxis.selectAll('.tick').attr('class', value => {\n return value === 0\n ? `tick ${classNames.bubbleChartYAxisZeroTick}`\n : 'tick';\n });\n\n customYAxis && customYAxis(yAxis);\n\n const { width: yAxisWidth } = computeDimensions(yAxis);\n const range = [\n marginLeft + yAxisWidth + (yAxisPadding || 0) + yScaleLabelHeight,\n width - marginRight,\n ];\n\n const xScale = d3\n .scaleLinear()\n .domain([\n d3.min(data, ({ xValue }) => xValue) as number,\n d3.max(data, ({ xValue }) => xValue) as number,\n ])\n .range(range);\n\n customXScale && customXScale(xScale);\n\n const xAxisBottom = d3.axisBottom(xScale);\n\n if (typeof xScaleItemWidth === 'number') {\n const [x1, x2] = xScale.range();\n const chartWidth = x2 - x1;\n\n xAxisBottom\n .ticks(Math.round(chartWidth / xScaleItemWidth))\n .tickSizeOuter(0);\n }\n\n const xAxis = svg\n .append('g')\n .call(xAxisBottom)\n .attr('class', classNames.bubbleChartXAxis);\n\n customXAxis && customXAxis(xAxis);\n\n yAxis.attr(\n 'transform',\n `translate(${marginLeft + yAxisWidth + yScaleLabelHeight}, 0)`\n );\n\n drawGrid({\n svg,\n yScale,\n xScale,\n yTicksCount,\n drawGridY,\n drawGridX,\n });\n\n xAxis.attr(\n 'transform',\n `translate(0, ${yScale(yTicks[0]) + (xAxisPadding || 0)})`\n );\n\n const bubbles = svg\n .append('g')\n .selectAll('dot')\n .data(data)\n .enter()\n .append('circle')\n .attr('class', classNames.bubbleChartCircle)\n .attr('cx', ({ xValue }) => xScale(xValue))\n .attr('cy', ({ yValue }) => yScale(yValue))\n .attr('r', ({ sizeValue }) => sizeScale(sizeValue) / 2)\n .attr('fill', ({ color }) => color || 'rgba(0, 176, 113, 0.6)')\n .attr('stroke', ({ stroke }) => stroke || 'transparent')\n .attr('style', ({ style }) => style || bubbleStyle || '');\n\n if (enableTooltip) {\n drawTooltip({ bubbles, tooltipRoot, tooltipClassName, renderTooltip });\n }\n\n customize && customize({ svg, bubbles, yScale, xScale, sizeScale });\n }\n};\n","import { DrawGridProps } from './types';\n\nimport { bubbleChartClassNames } from '../styled';\n\nexport const drawGrid = ({\n svg,\n yScale,\n xScale,\n yTicksCount,\n drawGridX,\n drawGridY,\n}: DrawGridProps) => {\n if (!drawGridY && !drawGridX) return;\n const [min, max] = xScale.domain();\n\n const global = svg\n .append('g')\n .attr('class', bubbleChartClassNames.bubbleChartGridGlobal);\n\n const yTicks = yScale.ticks(yTicksCount);\n\n if (drawGridX) {\n global\n .append('g')\n .selectAll('line')\n .data(yTicks)\n .join('line')\n .attr('class', bubbleChartClassNames.bubbleChartGridLineX)\n .attr('x1', () => xScale(min))\n .attr('x2', () => xScale(max))\n .attr('y1', (d: number) => Math.round(yScale(d)))\n .attr('y2', (d: number) => Math.round(yScale(d)));\n }\n\n if (drawGridY) {\n global\n .append('g')\n .selectAll('line')\n .data(xScale.ticks(yTicksCount))\n .join('line')\n .attr('class', bubbleChartClassNames.bubbleChartGridLineY)\n .attr('x1', (d: number) => Math.round(xScale(d)))\n .attr('x2', (d: number) => Math.round(xScale(d)))\n .attr('y1', () => Math.round(yScale(yTicks[0])))\n .attr('y2', () => Math.round(yScale(yTicks[yTicks.length - 1])));\n }\n};\n","import React from 'react';\nimport ReactDOMServer from 'react-dom/server';\nimport * as d3 from 'd3';\n\nimport { Tooltip } from './styled';\nimport { bubbleChartClassNames as classNames } from '../styled';\nimport { TooltipContainer } from '../../../common/components/tooltips';\nimport { DrawTooltipProps } from './types';\n\nexport const drawTooltip = ({\n bubbles,\n tooltipRoot,\n tooltipClassName,\n renderTooltip,\n}: DrawTooltipProps) => {\n const root: Element | null = tooltipRoot || document.querySelector('body');\n const format = d3.format(',');\n\n let container: d3.Selection<any, unknown, any, any> = d3\n .select(root)\n .select(`.${classNames.bubbleChartTooltip}`);\n\n if (container.node() === null) {\n container = d3\n .select(root)\n .append('div')\n .attr('class', classNames.bubbleChartTooltip);\n }\n\n let tooltip: d3.Selection<\n HTMLDivElement,\n unknown,\n d3.BaseType,\n any\n > = container\n .append('div')\n .attr(\n 'class',\n `${classNames.bubbleChartTooltipContainer} ${tooltipClassName || ''}`\n )\n .style('opacity', '0');\n\n bubbles.on('mouseover.tooltip', (event, data) => {\n const { sizeValue } = data;\n const circle = event.currentTarget as SVGCircleElement;\n const { x, y, width } = circle.getBoundingClientRect();\n const left = window.pageXOffset + x + width / 2;\n const top = window.pageYOffset + y;\n\n tooltip\n .style('left', `${left}px`)\n .style('top', `${top}px`)\n .html(() => {\n const html = ReactDOMServer.renderToString(\n <Tooltip className={classNames.bubbleChartTooltipFlex}>\n <TooltipContainer className={classNames.bubbleChartTip}>\n {format(sizeValue)}\n </TooltipContainer>\n </Tooltip>\n );\n\n return html;\n });\n\n renderTooltip && renderTooltip({ tooltip, data, circle });\n\n tooltip.style('opacity', '1');\n });\n\n bubbles.on('mouseout.tooltip', () => {\n tooltip.style('opacity', '0');\n });\n};\n","import React, { useEffect } from 'react';\n\nimport { BubbleChartProps } from './types';\n\nimport { useNode } from '../../hooks';\nimport { useResize } from '../../hooks';\n\nimport { draw } from './draw';\nimport { unmount } from './unmount';\n\nimport { SvgWrapper, TooltipStyles } from './styled';\n\nexport const BubbleChart: React.FC<BubbleChartProps> = (\n props\n): React.ReactElement => {\n const { className, style, children, tooltipRoot } = props;\n const [ref, node] = useNode();\n\n useEffect(() => {\n node && draw(node, props);\n }, [node, props]);\n\n useEffect(() => {\n return () => unmount(tooltipRoot);\n }, [tooltipRoot]);\n\n const onDraw = () => draw(node, props);\n\n useResize(props.width, onDraw);\n\n return (\n <div className={className} style={style}>\n <TooltipStyles />\n <SvgWrapper ref={ref}>{children}</SvgWrapper>\n </div>\n );\n};\n\nexport const bubbleChartDefaultProps = {\n height: 280,\n minSize: 6,\n maxSize: 30,\n margin: {\n top: 10,\n right: 15,\n bottom: 10,\n left: 0,\n },\n yAxisPadding: 10,\n xAxisPadding: 10,\n yScaleLabelPadding: 10,\n};\n\nBubbleChart.defaultProps = bubbleChartDefaultProps;\n","import * as d3 from 'd3';\n\nimport { bubbleChartClassNames as classNames } from './styled';\n\nexport const unmount = (tooltipRoot?: Element) => {\n const root: Element | null = tooltipRoot || document.querySelector('body');\n\n d3.select(root)\n .select(`.${classNames.bubbleChartTooltip}`)\n .remove();\n};\n"],"names":["Wrapper","styled","div","useNode","node","onSetNode","useState","useCallback","useResize","width","callback","delay","throttledCallback","useMemo","fn","wait","isCalled","setTimeout","throttle","undefined","useEffect","window","addEventListener","removeEventListener","appendSvg","height","d3","select","remove","append","attr","SwipeScrollContainer","easeOutQuad","time","range","num","min","max","Math","defaultRefs","animation","speed","timestamp","startX","currentX","SwipeScroll","children","onSwipe","props","ref","draggingNode","duration","animationFunc","container","body","documentSelect","document","refs","useRef","current","cancelAnimationFrame","onMove","event","nodeWidth","getBoundingClientRect","x","type","includes","touches","translateX","style","hundred","now","Date","speedX","round","onEnd","on","timing","draw","start","performance","requestId","requestAnimationFrame","requestAnimate","timeFraction","progress","animate","px","currX","maxX","transX","onStart","isTouch","left","parentElement","useSwipe","React","defaultProps","getTranslate","anchor","index","translateY","LabelContainer","attrs","transform","Label","Name","middleBadgeStyles","css","DefaultBadge","MiddleBadge","BadgePrefix","radarChartclassNames","radar","radarAxis","radarAxisTextGlobal","radarAxisText","radarPolygon","radarLabel","radarLabelName","radarLabelBadge","radarLabelBadgePrefix","radarCircle","SvgWrapper","data","curve","polar","formatValue","badgePrefix","labelOffset","circleRadius","svgElements","renderLabel","customize","formatAxisValue","radarStyles","labelIndex","selectLabel","length","defaultBleedLength","bleedLength","defaultHeight","minValue","i","map","value","maxValue","paddingY","radius","paddingX","defaultLevels","ticks","domain","levels","lastTick","newLastTick","push","newMaxValue","angleSlice","PI","radiusScale","radarLine","angle","_","radarValue","svg","globalCenter","levelsGrid","reverse","axisGridY","getAxisValue","gridGlobal","selectAll","enter","radarGlobal","axis","name","maxGridHeight","forEach","circleHeight","pathHeight","Array","from","radiusByMaxValue","cos","sin","join","d","dataItem","format","text","axisValue","item","circleGlobal","defaultLabelOffset","heightInner","offset","dataLength","xOffset","yOffset","d3container","pxToValue","axisY","ceil","y","deg","count","degByIndex","halfAngle","getTextAnchor","html","ReactDOMServer","renderToString","top","label","drawRadialLabels","items","Badge","className","RadarChart","degreesToRadians","degrees","pieChartclassNames","pieGlobal","pieSlice","pieSliceLabel","pieSliceLabelValue","pieSliceLabelName","pieRadialLabel","pieRadialLink","pieTooltipContainer","pieTooltipFlex","pieTooltip","pieTooltipItem","pieTooltipName","pieTooltipValue","pieTooltipColorBox","pieFullChartTooltipCircle","getMidFactor","startAngle","endAngle","getAlign","TooltipFlex","LabelFlex","LabelFlexCenter","TooltipContainer","TooltipGroupName","TooltipItem","ColFlex","ColorBox","ColorLine","Value","LabelTop","LabelBottom","padAngle","onClick","outerRadius","cornerRadius","margin","enableSlicesLabels","formatSliceLabel","slicesLabelsSkipAngle","enableSlicesLabelsName","formatSliceLabelName","borderWidth","borderColor","enableRadialLabels","backgroundColor","radialLabelsLinkHorizontalLength","radialLabelsTextXOffset","formatRadialLabel","radialLabelYOffset","formatSliceTitle","radialAngleXOffset","withTooltip","fullChartTooltip","tooltipClassName","tooltipBind","renderTooltip","tooltipStyle","marginTop","marginRight","right","marginBottom","bottom","marginLeft","global","maxPadAngle","dividerPadAngle","fullAngle","dataReady","sort","pie","maxOuterRadius","arc","innerRadius","allSlices","color","centroid","defaultRadialLabelsLinkHorizontalLength","outerArc","midFactor","posA","posB","posC","posCPi","getPosition","pos","defaultRadialLabelsTextXOffset","tooltipRoot","querySelector","classNames","tooltipContainer","empty","Object","entries","prop","val","isVisible","setVisible","visible","Boolean","setPosition","pieChartDatum","itemX","itemY","target","globalNode","itemWidth","itemHeight","arcX","arcY","setTooltip","pieChartData","key","drawTooltip","PieChart","legendClassNames","legendContainer","legendTitle","legendTick","legendTickLine","legendTickText","ramp","n","canvas","createElement","context","getContext","fillStyle","fillRect","legendDefaultParams","tickSize","ticksDivier","titleMarginBottom","calendarChartClassNames","calendarChart","calendarYear","calendarAxis","calendarBody","calendarHeader","calendarYearTitle","calendarWeekDay","calendarMonth","calendarDays","calendarDay","CalendarChart","startSunday","weekdays","cellOffset","cellSize","interpolator","monthSpacing","colorRange","legendProps","onEachDay","years","date","getUTCFullYear","weekDays","defaultCellSize","countDay","days","sundayIndex","formatDay","formatDate","timeWeek","getTimeWeekCount","to","getMonthSpacing","getUTCMonth","formatMonth","chartWidth","values","year","months","weekCount","calendarWeekdays","each","elements","element","currColor","getUTCDay","legend","title","tickFormat","tickValues","interpolate","copy","rangeRound","toDataURL","assign","call","g","tick","getLegend","containerNode","legendSvg","appendChild","computeDimensions","selection","dimensions","SVGGraphicsElement","getBBox","none","isVoid","Number","isNaN","lineChartClassNames","lineChartYScaleGlobal","lineChartXScaleGlobal","lineChartLinesGlobal","lineChartLine","lineChartAreasGlobal","lineChartArea","lineChartDotsGlobalContainer","lineChartDotsGlobal","lineChartDot","lineChartGridGlobal","lineChartGridLineX","lineChartGridLineY","lineChartLabelContainer","lineChartLabelFlex","lineChartLabel","lineChartMouseGlobal","lineChartMouseLine","lineChartMouseRect","lineChartMouseCircle","lineChartMouseLabelContainer","lineChartMouseLabel","TooltipStyles","createGlobalStyle","chartData","labels","customYAxisSelection","customXAxisSelection","customYAxis","customXAxis","yAxisPadding","xAxisPadding","drawGridY","drawGridX","withLabels","formatLabel","eachLabel","stacked","dynamicTooltipEnable","dynamicCircleRadius","formatDynamicTooltip","stackedTooltip","stackedTooltipIndex","tooltipLineTop","customYScale","customLine","xScaleItemWidth","areaCurve","stacks","valuesIndex","prevValue","abs","stackedData","yScale","nice","yTicksCountDefault","yAxisLeft","yTicksCount","tickArguments","yAxis","yAxisWidth","lastIndex","reduce","acc","xScale","xAxisBottom","x1","x2","tickSizeOuter","yTicks","drawGrid","isArray","xAxis","xAxisHeight","line","defined","some","fill","dataIndex","getArea","minAreaValues","minTick","y0","currData","y1","filter","area","areaStyle","stroke","dots","dot","dotsGlobal","dotsGroup","labelsDiv","drawLabel","argData","tooltipOff","y2","mouseGlobal","mouseRect","mouseLine","lines","nodes","circles","dynamicDotOff","labelContainer","size","opacity","mouseMove","docX","docY","rectrX","nodeX","nodeY","currIndex","invert","positions","getValue","floor","hasAttribute","beginning","end","getTotalLength","getPointAtLength","lineChartData","dynamicDotStyle","datas","invertValue","noHasData","every","topIndex","keys","_datas$Number","_datas$Number2","labelTexts","indexX","indexY","LineChart","barChartLinesClassNames","barChartLinesGlobal","barChartLine","barChartAreasGlobal","barChartArea","barChartClassNames","barChartBarGlobal","barChartYScaleGlobal","barChartYAxis","barChartXAxis","barChartYAxisZeroTick","barChartGridGlobal","barChartGridLineX","barChartGridLineXZero","barChartGridLineYZero","barChartGridLineY","barChartMouseRect","barChartMouseContainer","barChartTooltipFlex","barChartMouseTooltip","barChartTooltip","barChartTooltipItem","barChartTooltipColFlex","barChartTooltipGroupName","barChartColorBox","barChartColorLine","barChartTooltipName","barChartTooltipValue","barChartLabelContainer","barChartLabelFlex","barChartLabel","lineData","barWidth","barWidthProp","barPadding","colors","customXScale","customYAxisLeft","customXAxisBottom","customBars","labelPosition","tooltipY","stackedLine","formatTooltipValue","formatTooltipName","sectionPadding","minValuesLine","tooltipYDomain","marshalledMap","minDomainValue","maxDomainValue","drawBars","setTooltipPosition","onLabelItem","isBarTooltip","defaultBarWidth","barDomain","MIN","POSITIVE_INFINITY","MAX","NEGATIVE_INFINITY","groups","groupMax","groupMin","group","stackMax","stackMin","groupKey","getDomain","groupName","groupPadding","barsWidth","curr","_key","resizeBarWidth","array","marshalled","groupIndex","marshalledGroup","bandwidth","groupsKeys","stackIndex","groupKeys","barGroupWidth","isPositiveValue","EPSILON","marshaling","marshalledData","getX","step","padding","bars","getBars","linesSelection","areasSelection","linesData","lineType","areasData","drawLines","xScaleBandDomain","topYDomain","lineMin","tooltip","barChartTootipFlex","flagCurrIndex","offsetX","offsetY","findIndex","containts","elementsFromPoint","clientX","clientY","currBars","currLineData","concat","svgWidth","concatedData","stack","stacksCount","indexFlag","LabelFlexStyled","LabelStyle","LabelUI","getLabel","getLabelY","BarChart","horizontalBarChartClassNames","horizontalBarChartButtonTd","horizontalBarChartLabelTd","horizontalBarChartLabelCell","horizontalBarChartBarTd","horizontalBarChartBarFlex","horizontalBarChartBar","horizontalBarChartBarFirst","horizontalBarChartBarLast","horizontalBarChartBarOnly","horizontalBarChartTooltipFlex","horizontalBarChartStackWrapper","horizontalBarChartTooltipContainer","horizontalBarChartStackSumContainer","horizontalBarChartStackSum","horizontalBarChartXScaleTd","horizontalBarChartXScaleTicks","horizontalBarChartXScaleTick","horizontalBarChartTooltipItem","horizontalBarChartTooltipName","horizontalBarChartTooltipValue","Table","table","LabelCell","BarFlex","BarsTd","td","TooltipFlexUI","StackSumContainer","StackSum","StackWrapper","Tooltip","rootElement","BarStyled","Bar","bar","formatNativeTitle","mouseLeave","pointerEventsNone","isFirstChild","isLastChild","isOnlyChild","ceiledWidth","onMouseMove","onMouseLeave","pointerEvents","onMouseOver","onMouseOut","TickTd","Ticks","Tick","XScale","scaleTicks","renderTicks","scaleDomain","scaleLinear","useScale","justifyContent","HorizontalBarChart","fullExtent","withStackSum","renderButton","renderDataTable","thead","withoutXScale","hideTooltip","fullMax","marshalingData","useMarshaling","unmountComponentAtNode","barX","barY","visibility","render","useTooltip","Stack","Fragment","useStackWrapper","flat","rowIndex","stackSum","sumWidth","barIndex","bubbleChartClassNames","bubbleChartYAxis","bubbleChartYAxisZeroTick","bubbleChartXAxis","bubbleChartGridGlobal","bubbleChartGridLineX","bubbleChartGridLineY","bubbleChartCircle","bubbleChartYScaleLabel","bubbleChartTooltip","bubbleChartTooltipContainer","bubbleChartTooltipFlex","bubbleChartTip","minSize","maxSize","minYValue","maxYValue","bubbleStyle","yScaleLabel","yScaleLabelPadding","enableTooltip","minY","yValue","maxY","sizeScale","sizeValue","bubbleChartDefaultProps","yRange1","yScaleLabelHeight","xValue","bubbles","root","circle","currentTarget","pageXOffset","pageYOffset","BubbleChart","unmount"],"mappings":"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"}
|