@evergis/charts 3.0.23 → 3.0.25
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/BarChart/hooks/useSelection.ts","../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/bubbleChartDefaultProps.ts","../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';\r\n\r\nexport const Wrapper = styled.div`\r\n position: relative;\r\n width: 100%;\r\n box-sizing: border-box;\r\n`;\r\n","import { PropsWithRef, useCallback, useState } from 'react';\r\n\r\nexport function useNode(): [PropsWithRef<any>, HTMLElement | null] {\r\n const [node, onSetNode] = useState<HTMLElement | null>(null);\r\n\r\n const ref = useCallback(onSetNode, [onSetNode]);\r\n\r\n return [ref, node];\r\n}\r\n","import { useEffect, useMemo } from 'react';\r\n\r\nimport { throttle } from '../helpers/throttle';\r\n\r\nconst THROTTLE_DELAY = 44;\r\n\r\nexport const useResize = (\r\n width?: number,\r\n callback?: (...args: any) => any,\r\n delay?: number\r\n) => {\r\n const throttledCallback: VoidFunction | undefined = useMemo(() => {\r\n return callback ? throttle(callback, delay || THROTTLE_DELAY) : undefined;\r\n }, [callback, delay]);\r\n\r\n useEffect(() => {\r\n throttledCallback &&\r\n typeof width !== 'number' &&\r\n window.addEventListener('resize', throttledCallback);\r\n\r\n return () =>\r\n throttledCallback &&\r\n window.removeEventListener('resize', throttledCallback);\r\n }, [width, throttledCallback]);\r\n};\r\n","export function throttle(fn: Function, wait: number) {\r\n let isCalled = false;\r\n\r\n return function(...args: any) {\r\n if (!isCalled) {\r\n fn(...args);\r\n isCalled = true;\r\n setTimeout(function() {\r\n isCalled = false;\r\n }, wait);\r\n }\r\n };\r\n}\r\n","import * as d3 from 'd3';\r\n\r\nexport const appendSvg = (node: HTMLElement, width: number, height: number) => {\r\n d3.select(node)\r\n .select('svg')\r\n .remove();\r\n\r\n const svg = d3\r\n .select(node)\r\n .append('svg')\r\n .attr('width', width)\r\n .attr('height', height);\r\n\r\n return svg;\r\n};\r\n","import styled from 'styled-components';\r\n\r\nexport const SwipeScrollContainer = styled.div`\r\n width: 100%;\r\n overflow: hidden;\r\n user-select: none;\r\n`;\r\n","export function animate({\r\n duration,\r\n timing,\r\n draw,\r\n}: {\r\n duration: number;\r\n timing: (n: number) => number;\r\n draw: (progress: number, requestId: number) => void;\r\n}): void {\r\n const start = performance.now();\r\n let requestId: number;\r\n\r\n requestAnimationFrame(function requestAnimate(time) {\r\n let timeFraction = (time - start) / duration;\r\n\r\n if (timeFraction < 1) {\r\n requestId = requestAnimationFrame(requestAnimate);\r\n }\r\n\r\n if (timeFraction > 1) cancelAnimationFrame(requestId);\r\n const progress = timing(timeFraction);\r\n\r\n draw(progress, requestId);\r\n });\r\n}\r\n\r\nexport const easeOutQuad = (time: number): number => time * (2 - time);\r\n","import { useEffect, useRef, useCallback } from 'react';\r\nimport * as d3 from 'd3';\r\n\r\nimport { animate, easeOutQuad } from '../animate';\r\n\r\nimport { SwipeScrollProps } from '../types';\r\n\r\nconst range = (num: number, min: number, max: number) =>\r\n Math.min(Math.max(num, min), max);\r\n\r\nconst defaultRefs = {\r\n animation: 0,\r\n speed: 0,\r\n timestamp: 0,\r\n startX: 0,\r\n currentX: 0,\r\n};\r\n\r\nexport const useSwipe = (\r\n node: HTMLElement | null,\r\n { width, duration, animationFunc, onSwipe }: SwipeScrollProps\r\n) => {\r\n const container = d3.select(node);\r\n const body = d3.select('body');\r\n const documentSelect = d3.select(document);\r\n const refs = useRef(defaultRefs);\r\n\r\n useEffect(() => {\r\n if (width && refs.current.animation) {\r\n cancelAnimationFrame(refs.current.animation);\r\n refs.current = defaultRefs;\r\n }\r\n }, [width]);\r\n\r\n const onMove = useCallback(\r\n event => {\r\n const { width: nodeWidth } = node\r\n ? node.getBoundingClientRect()\r\n : { width: 0 };\r\n const [x] = d3.pointer(\r\n event.type.includes('touch') ? event.touches[0] : event\r\n );\r\n const newX = x - refs.current.startX;\r\n const maxX = width - nodeWidth;\r\n const translateX = range(newX, -maxX, 0);\r\n\r\n container.style('transform', `translateX(${translateX}px)`);\r\n\r\n if (refs.current.currentX) {\r\n const hundred = 100;\r\n const now = Date.now();\r\n const dt = now - refs.current.timestamp;\r\n const dx = translateX - refs.current.currentX;\r\n const speedX = Math.round((dx / dt) * hundred);\r\n\r\n refs.current.speed = speedX;\r\n refs.current.timestamp = now;\r\n }\r\n\r\n refs.current.currentX = translateX;\r\n\r\n onSwipe && onSwipe(translateX, container);\r\n },\r\n [onSwipe, width, node, container]\r\n );\r\n\r\n const onEnd = useCallback(() => {\r\n const { width: nodeWidth } = node\r\n ? node.getBoundingClientRect()\r\n : { width: 0 };\r\n\r\n documentSelect.on(\r\n 'mousemove.swipe touchmove.swipe mouseup.swipe touchend.swipe',\r\n null\r\n );\r\n body.style('cursor', null);\r\n if (width > nodeWidth) {\r\n container.style('cursor', 'grab');\r\n } else {\r\n container.style('cursor', null);\r\n }\r\n\r\n const dt = Date.now() - refs.current.timestamp;\r\n const dtEnd = 44;\r\n\r\n if (dt < dtEnd) {\r\n animate({\r\n duration: duration as number,\r\n timing: animationFunc || easeOutQuad,\r\n draw: (progress, requestId) => {\r\n refs.current.animation = requestId;\r\n const px = Math.round(refs.current.speed * 2 * progress);\r\n const currX = refs.current.currentX + px;\r\n const maxX = width - nodeWidth;\r\n const translateX = range(currX, -maxX, 0);\r\n\r\n const transX = Math.max(Math.min(currX, maxX), 0);\r\n\r\n if (refs.current.currentX !== transX) {\r\n container.style('transform', `translateX(${translateX}px)`);\r\n\r\n onSwipe && onSwipe(translateX, container);\r\n }\r\n },\r\n });\r\n }\r\n }, [\r\n body,\r\n animationFunc,\r\n onSwipe,\r\n container,\r\n duration,\r\n node,\r\n width,\r\n documentSelect,\r\n ]);\r\n\r\n const onStart = useCallback(\r\n event => {\r\n const isTouch = event.type.includes('touch');\r\n const [x] = d3.pointer(isTouch ? event.touches[0] : event, node);\r\n\r\n const { left } =\r\n node && node.parentElement\r\n ? node.parentElement.getBoundingClientRect()\r\n : { left: 0 };\r\n body.style('cursor', 'grabbing');\r\n container.style('cursor', 'grabbing');\r\n\r\n if (refs.current.animation) {\r\n cancelAnimationFrame(refs.current.animation);\r\n refs.current = defaultRefs;\r\n }\r\n\r\n refs.current.startX = Math.max(x + left, 0);\r\n documentSelect.on('mousemove.swipe touchmove.swipe', onMove);\r\n documentSelect.on('mouseup.swipe touchend.swipe', onEnd);\r\n },\r\n [container, body, node, onEnd, onMove, documentSelect]\r\n );\r\n\r\n useEffect(() => {\r\n if (node) {\r\n const { width: nodeWidth } = node.getBoundingClientRect();\r\n\r\n if (width > nodeWidth) {\r\n container.style('cursor', 'grab');\r\n container.on('mousedown.swipe touchstart.swipe', onStart);\r\n }\r\n }\r\n }, [container, onStart, node, width]);\r\n};\r\n","import React from 'react';\r\n\r\nimport { SwipeScrollContainer } from './styled';\r\n\r\nimport { useNode } from '../../../hooks';\r\nimport { useSwipe } from './hooks/useSwipe';\r\n\r\nimport { SwipeScrollProps } from './types';\r\n\r\nexport const SwipeScroll: React.FC<SwipeScrollProps> = ({\r\n children,\r\n width,\r\n onSwipe,\r\n ...props\r\n}): React.ReactElement => {\r\n const [ref, draggingNode] = useNode();\r\n\r\n useSwipe(draggingNode, { width, onSwipe, ...props });\r\n\r\n return (\r\n <SwipeScrollContainer {...props}>\r\n <div ref={ref}>{children}</div>\r\n </SwipeScrollContainer>\r\n );\r\n};\r\n\r\nSwipeScroll.defaultProps = {\r\n duration: 1400,\r\n};\r\n","import styled from 'styled-components';\r\n\r\nimport { LabelContainerProps } from './types';\r\n\r\nconst getTranslate = ({\r\n anchor,\r\n index,\r\n translateX,\r\n translateY,\r\n}: LabelContainerProps) => {\r\n if (index === 0 && anchor === 'middle') {\r\n return `translate(calc(-50% + ${translateX}px), calc(-100% + ${translateY}px))`;\r\n } else if (anchor === 'middle') {\r\n return `translate(calc(-50% + ${translateX}px), calc(${translateY}px))`;\r\n } else if (anchor === 'start') {\r\n return `translate(calc(${translateX}px), calc(-50% + ${translateY}px))`;\r\n } else if (anchor === 'end') {\r\n return `translate(calc(-100% + ${translateX}px), calc(-50% + ${translateY}px))`;\r\n }\r\n return `translate(${translateX}px, ${translateY}px)`;\r\n};\r\n\r\nexport const LabelContainer = styled.div.attrs<LabelContainerProps>(props => ({\r\n style: {\r\n transform: getTranslate(props),\r\n },\r\n}))<LabelContainerProps>`\r\n position: absolute;\r\n`;\r\n","import styled, { css } from 'styled-components';\r\n\r\nimport { LabelContainerProps } from './types';\r\n\r\nexport const getTranslate = ({\r\n anchor,\r\n index,\r\n translateX,\r\n translateY,\r\n}: LabelContainerProps) => {\r\n if (index === 0 && anchor === 'middle') {\r\n return `translate(calc(-50% + ${translateX}px), calc(-100% + ${translateY}px))`;\r\n } else if (anchor === 'middle') {\r\n return `translate(calc(-50% + ${translateX}px), calc(${translateY}px))`;\r\n } else if (anchor === 'start') {\r\n return `translate(calc(${translateX}px), calc(-50% + ${translateY}px))`;\r\n } else if (anchor === 'end') {\r\n return `translate(calc(-100% + ${translateX}px), calc(-50% + ${translateY}px))`;\r\n }\r\n return `translate(${translateX}px, ${translateY}px)`;\r\n};\r\n\r\nexport const Label = styled.div`\r\n display: flex;\r\n align-items: center;\r\n font-size: 12px;\r\n`;\r\n\r\nexport const Name = styled.div`\r\n text-align: center;\r\n max-width: 120px;\r\n`;\r\n\r\nconst middleBadgeStyles = css`\r\n position: absolute;\r\n top: 50%;\r\n right: 0;\r\n transform: translate(calc(100% + 6px), -50%);\r\n`;\r\n\r\nexport const DefaultBadge = styled.div`\r\n display: flex;\r\n align-items: center;\r\n padding: 2px 4px;\r\n border-radius: 4px;\r\n color: rgb(255, 255, 255);\r\n background-color: rgb(144, 197, 61);\r\n margin-left: 8px;\r\n`;\r\n\r\nexport const MiddleBadge = styled(DefaultBadge)`\r\n ${middleBadgeStyles}\r\n`;\r\n\r\nexport const BadgePrefix = styled.div`\r\n margin-left: 4px;\r\n font-size: 10px;\r\n color: rgba(255, 255, 255, 0.54);\r\n`;\r\n","import styled from 'styled-components';\r\n\r\nimport { Wrapper } from '../../common/components/Wrapper';\r\n\r\nexport const radarChartclassNames = {\r\n radar: 'radar',\r\n radarAxis: 'radarAxis',\r\n radarAxisTextGlobal: 'radarAxisTextGlobal',\r\n radarAxisText: 'radarAxisText',\r\n radarPolygon: 'radarPolygon',\r\n radarLabel: 'radarLabel',\r\n radarLabelName: 'radarLabelName',\r\n radarLabelBadge: 'radarLabelBadge',\r\n radarLabelBadgePrefix: 'radarLabelBadgePrefix',\r\n radarCircle: 'radarCircle',\r\n};\r\n\r\nexport const SvgWrapper = styled(Wrapper)`\r\n .${radarChartclassNames.radarAxis} {\r\n path,\r\n line,\r\n circle {\r\n fill: none;\r\n stroke-width: 1px;\r\n stroke: rgba(149, 149, 149, 0.18);\r\n }\r\n }\r\n .${radarChartclassNames.radarAxisText} {\r\n font-size: 12px;\r\n fill-opacity: 0.56;\r\n }\r\n .${radarChartclassNames.radarPolygon} {\r\n fill-opacity: 0.06;\r\n stroke-width: 2px;\r\n fill: rgb(144, 197, 61);\r\n stroke: rgb(144, 197, 61);\r\n }\r\n .${radarChartclassNames.radarCircle} {\r\n fill: rgb(144, 197, 61);\r\n }\r\n`;\r\n","import React from 'react';\r\nimport ReactDOMServer from 'react-dom/server';\r\nimport * as d3 from 'd3';\r\n\r\nimport { RadarChartProps } from './types';\r\n\r\nimport { appendSvg } from '../../helpers';\r\nimport { drawRadialLabels } from './drawRadialLabels';\r\n\r\nimport {\r\n Label,\r\n MiddleBadge,\r\n DefaultBadge,\r\n Name,\r\n BadgePrefix,\r\n} from '../../common/components/labels';\r\nimport { radarChartclassNames } from './styled';\r\n\r\nexport const draw = (\r\n node: HTMLElement | null,\r\n props: RadarChartProps\r\n): void => {\r\n const {\r\n data,\r\n curve,\r\n polar,\r\n formatValue,\r\n badgePrefix,\r\n labelOffset,\r\n circleRadius,\r\n svgElements,\r\n renderLabel,\r\n customize,\r\n formatAxisValue,\r\n radarStyles,\r\n labelIndex,\r\n selectLabel,\r\n } = props;\r\n\r\n if (node !== null && data.length) {\r\n const defaultBleedLength = 10;\r\n const bleedLength =\r\n typeof props.bleedLength === 'number'\r\n ? props.bleedLength\r\n : defaultBleedLength;\r\n\r\n const { width: nodeWidth } = node.getBoundingClientRect();\r\n const width = props.width || nodeWidth;\r\n const defaultHeight = 400;\r\n const height = props.height || defaultHeight;\r\n\r\n const minValue =\r\n props.minValue ||\r\n Math.min(\r\n 0,\r\n d3.min(data, i => d3.min(i.map(({ value }) => value))) as number\r\n );\r\n const maxValue =\r\n (props.maxValue ||\r\n Math.max(\r\n 0,\r\n d3.max(data, i => d3.max(i.map(({ value }) => value))) as number\r\n )) - minValue;\r\n const paddingX = props.paddingX || 0;\r\n const paddingY = props.paddingY || 0;\r\n const radius = Math.min(\r\n (width - paddingX * 2 - bleedLength * 2) / 2,\r\n (height - paddingY * 2 - bleedLength * 2) / 2\r\n );\r\n\r\n const defaultLevels = 4;\r\n const ticks = d3\r\n .scaleLinear()\r\n .domain([0, maxValue || 1])\r\n .range([])\r\n .ticks(props.levels || defaultLevels);\r\n const lastTick = ticks[ticks.length - 1];\r\n const newLastTick = lastTick + (ticks[1] - ticks[0]);\r\n\r\n if (lastTick < maxValue) {\r\n ticks.push(newLastTick);\r\n }\r\n\r\n const levels = props.levels || ticks.length - 1;\r\n const newMaxValue = ticks[ticks.length - 1];\r\n const angleSlice = (Math.PI * 2) / data[0].length;\r\n\r\n const radiusScale = d3\r\n .scaleLinear()\r\n .range([0, radius])\r\n .domain([0, newMaxValue]);\r\n\r\n const radarLine = d3\r\n .lineRadial()\r\n .curve(d3.curveLinearClosed)\r\n // @ts-ignore\r\n .radius(({ value }) => radiusScale(value) as number)\r\n .angle((_, i) => i * angleSlice);\r\n const radarValue = d3\r\n .lineRadial()\r\n .curve(curve || d3.curveLinearClosed)\r\n // @ts-ignore\r\n .radius(({ value }) => radiusScale(value) as number)\r\n .angle((_, i) => i * angleSlice);\r\n\r\n const svg = appendSvg(node, width, height);\r\n const globalCenter = svg.append('g');\r\n\r\n const levelsGrid = d3.range(1, levels + 1).reverse();\r\n const axisGridY = (value: number) => (-value * radius) / levels;\r\n const getAxisValue = (value: number) => (newMaxValue * value) / levels;\r\n\r\n const gridGlobal = globalCenter\r\n .append('g')\r\n .attr('class', radarChartclassNames.radarAxis)\r\n .selectAll()\r\n .data([data[0]])\r\n .enter();\r\n\r\n const radarGlobal = globalCenter\r\n .append('g')\r\n .attr('class', radarChartclassNames.radar);\r\n\r\n const axis = gridGlobal\r\n .selectAll()\r\n .data(data[0].map(({ name }) => name))\r\n .enter();\r\n\r\n let maxGridHeight = 0;\r\n\r\n if (polar) {\r\n levelsGrid.forEach(value => {\r\n const path = gridGlobal\r\n .append('circle')\r\n .attr('cx', 0)\r\n .attr('cy', 0)\r\n .attr('r', () => (radius / levels) * value);\r\n\r\n const circleNode = path.node() as SVGCircleElement;\r\n const circleHeight = circleNode.getBoundingClientRect().height;\r\n maxGridHeight = Math.max(maxGridHeight, circleHeight);\r\n });\r\n } else {\r\n levelsGrid.map(getAxisValue).forEach(value => {\r\n const path = gridGlobal.append('path').attr('d', () =>\r\n // @ts-ignore\r\n radarLine(Array.from({ length: data[0].length }, () => ({ value })))\r\n );\r\n const pathNode = path.node() as SVGPathElement;\r\n const pathHeight = pathNode.getBoundingClientRect().height;\r\n maxGridHeight = Math.max(maxGridHeight, pathHeight);\r\n });\r\n }\r\n\r\n const radiusByMaxValue = (radiusScale(newMaxValue) as number) + bleedLength;\r\n\r\n axis\r\n .append('line')\r\n .attr('x1', 0)\r\n .attr('y1', 0)\r\n .attr('x2', (_, i) =>\r\n Math.round(radiusByMaxValue * Math.cos(angleSlice * i - Math.PI / 2))\r\n )\r\n .attr('y2', (_, i) =>\r\n Math.round(radiusByMaxValue * Math.sin(angleSlice * i - Math.PI / 2))\r\n );\r\n\r\n radarGlobal\r\n .selectAll('path')\r\n .data(data)\r\n .join('path')\r\n .attr('class', radarChartclassNames.radarPolygon)\r\n .attr('style', (_, index) => radarStyles?.[index] || '')\r\n .attr('d', d =>\r\n radarValue(\r\n // @ts-ignore\r\n d.map(dataItem => ({\r\n ...dataItem,\r\n value: dataItem.value - minValue,\r\n }))\r\n )\r\n );\r\n\r\n const format = d3.format(',');\r\n const axisTextGlobal = globalCenter\r\n .append('g')\r\n .attr('class', radarChartclassNames.radarAxisTextGlobal);\r\n axisTextGlobal\r\n .selectAll('text')\r\n .data(levelsGrid)\r\n .enter()\r\n .append('text')\r\n .attr('class', radarChartclassNames.radarAxisText)\r\n .attr('x', '4')\r\n .attr('y', axisGridY)\r\n .attr('dy', 0)\r\n .attr('dominant-baseline', 'central')\r\n .text((value, index) => {\r\n const axisValue = getAxisValue(value) + minValue;\r\n\r\n return formatAxisValue\r\n ? formatAxisValue(axisValue, index)\r\n : format(axisValue);\r\n });\r\n\r\n circleRadius &&\r\n data.forEach(item => {\r\n const circleGlobal = globalCenter\r\n .append('g')\r\n .attr('class', radarChartclassNames.radarCircle);\r\n\r\n item.forEach(({ value }, i) => {\r\n circleGlobal\r\n .append('circle')\r\n .attr(\r\n 'cx',\r\n Math.round(\r\n (radiusScale(value) as number) *\r\n Math.cos(angleSlice * i - Math.PI / 2)\r\n )\r\n )\r\n .attr(\r\n 'cy',\r\n Math.round(\r\n radiusScale(\r\n value * Math.sin(angleSlice * i - Math.PI / 2)\r\n ) as number\r\n )\r\n )\r\n .attr('r', circleRadius);\r\n });\r\n });\r\n\r\n const defaultLabelOffset = 8;\r\n const heightInner = height - bleedLength - paddingY;\r\n const translateX = width / 2;\r\n const translateY = heightInner / 2 + (heightInner - maxGridHeight) / 2;\r\n const offset = bleedLength + (labelOffset || defaultLabelOffset);\r\n\r\n globalCenter.attr('transform', `translate(${translateX},${translateY})`);\r\n\r\n drawRadialLabels({\r\n node,\r\n maxValue: newMaxValue,\r\n translateX,\r\n translateY,\r\n dataLength: data[labelIndex || 0].length,\r\n angleSlice,\r\n radius,\r\n radiusScale,\r\n xOffset: offset,\r\n yOffset: offset,\r\n renderLabel: (anchor, index) => {\r\n const items = data.map(item => item[index]);\r\n const Badge = anchor === 'middle' ? MiddleBadge : DefaultBadge;\r\n const item = data[labelIndex || 0][index];\r\n const { name, value } = item;\r\n\r\n return renderLabel ? (\r\n renderLabel({ item, items, anchor, index })\r\n ) : (\r\n <Label className={radarChartclassNames.radarLabel}>\r\n <Name className={radarChartclassNames.radarLabelName}>{name}</Name>\r\n <Badge className={radarChartclassNames.radarLabelBadge}>\r\n {formatValue ? formatValue(value, index) : format(value)}\r\n {badgePrefix && (\r\n <BadgePrefix\r\n className={radarChartclassNames.radarLabelBadgePrefix}\r\n >\r\n {badgePrefix}\r\n </BadgePrefix>\r\n )}\r\n </Badge>\r\n </Label>\r\n );\r\n },\r\n selectLabel: (label, anchor, index) => {\r\n if (selectLabel) {\r\n const items = data.map(item => item[index]);\r\n const item = data[labelIndex || 0][index];\r\n\r\n selectLabel(label, { index, item, items, anchor });\r\n }\r\n },\r\n });\r\n\r\n if (svgElements) {\r\n const html = ReactDOMServer.renderToString(svgElements);\r\n\r\n svg.append('g').html(html);\r\n }\r\n\r\n customize && customize(svg);\r\n }\r\n};\r\n","import * as d3 from 'd3';\r\nimport ReactDOMServer from 'react-dom/server';\r\nimport React from 'react';\r\n\r\nimport { DrawRadialLabels } from './types';\r\n\r\nimport { getTextAnchor } from '../helpers';\r\nimport { LabelContainer } from './styled';\r\n\r\nconst labelClassName = 'd3-chart-label';\r\n\r\nexport const drawRadialLabels = ({\r\n node,\r\n dataLength,\r\n radiusScale,\r\n maxValue,\r\n angleSlice,\r\n radius,\r\n xOffset,\r\n yOffset,\r\n translateX,\r\n translateY,\r\n renderLabel,\r\n selectLabel,\r\n}: DrawRadialLabels) => {\r\n const d3container = d3.select(node);\r\n d3container.selectAll(`.${labelClassName}`).remove();\r\n\r\n const pxToValue = (value: number) => (maxValue / radius) * value;\r\n const axisX = (i: number) =>\r\n (radiusScale(maxValue + pxToValue(xOffset || 0)) as number) *\r\n Math.cos(angleSlice * i - Math.PI / 2);\r\n\r\n const axisY = (i: number) =>\r\n radiusScale(\r\n (maxValue + pxToValue(yOffset || 0)) *\r\n Math.sin(angleSlice * i - Math.PI / 2)\r\n ) as number;\r\n\r\n const labels = Array.from({ length: dataLength }, (_, index) => ({\r\n x: Math.ceil(axisX(index)),\r\n y: Math.ceil(axisY(index)),\r\n }));\r\n\r\n labels.forEach(({ x, y }: { x: number; y: number }, index: number) => {\r\n const anchor = getTextAnchor(index, dataLength);\r\n const html = ReactDOMServer.renderToString(\r\n <LabelContainer\r\n anchor={anchor}\r\n translateX={translateX || 0}\r\n translateY={translateY || 0}\r\n index={index}\r\n style={{\r\n left: x,\r\n top: y,\r\n }}\r\n >\r\n {typeof renderLabel === 'function'\r\n ? renderLabel(anchor, index)\r\n : renderLabel}\r\n </LabelContainer>\r\n );\r\n\r\n const label = d3container\r\n .append('div')\r\n .attr('class', labelClassName)\r\n .html(html);\r\n\r\n selectLabel(label, anchor, index);\r\n });\r\n};\r\n","const degByIndex = (index: number, count: number): number => {\r\n const degs = 360;\r\n const deg = (degs / count) * index;\r\n\r\n return deg;\r\n};\r\n\r\nexport const getTextAnchor = (\r\n index: number,\r\n length: number\r\n): 'start' | 'middle' | 'end' => {\r\n const deg = degByIndex(index, length);\r\n const halfAngle = 180;\r\n\r\n if ([0, halfAngle].includes(deg)) {\r\n return 'middle';\r\n }\r\n if (deg < halfAngle) {\r\n return 'start';\r\n }\r\n\r\n return 'end';\r\n};\r\n\r\nexport const getMaxWidth = (elements: SVGElement[]) => {\r\n let maxWidth = 0;\r\n\r\n for (let i = 0; i < elements.length; i++) {\r\n const element = elements[i];\r\n\r\n if (element && 'getBoundingClientRect' in element) {\r\n maxWidth = Math.max(maxWidth, element.getBoundingClientRect().width);\r\n }\r\n }\r\n\r\n return maxWidth;\r\n};\r\n","import React, { useEffect } from 'react';\r\nimport * as d3 from 'd3';\r\n\r\nimport { RadarChartProps } from './types';\r\n\r\nimport { useNode } from '../../hooks';\r\nimport { useResize } from '../../hooks';\r\n\r\nimport { draw } from './draw';\r\n\r\nimport { SvgWrapper } from './styled';\r\n\r\nexport const RadarChart: React.FC<RadarChartProps> = (\r\n props\r\n): React.ReactElement => {\r\n const { className, style } = props;\r\n const [ref, node] = useNode();\r\n\r\n useEffect(() => {\r\n node && draw(node, props);\r\n }, [node, props]);\r\n\r\n const onDraw = () => draw(node, props);\r\n\r\n useResize(props.width, onDraw);\r\n\r\n return (\r\n <div className={className} style={style}>\r\n <SvgWrapper ref={ref} />\r\n </div>\r\n );\r\n};\r\n\r\nRadarChart.defaultProps = {\r\n height: 400,\r\n data: [],\r\n curve: d3.curveLinearClosed,\r\n};\r\n","export function radiansToDegrees(radians: number): number {\r\n const flatAngle = 180;\r\n\r\n return (radians * flatAngle) / Math.PI;\r\n}\r\n\r\nexport function degreesToRadians(degrees: number): number {\r\n const flatAngle = 180;\r\n\r\n return degrees * (Math.PI / flatAngle);\r\n}\r\n","import styled from 'styled-components';\r\n\r\nimport { Wrapper } from '../../common/components/Wrapper';\r\n\r\nexport const pieChartclassNames = {\r\n pieGlobal: 'pieGlobal',\r\n pieSlice: 'pieSlice',\r\n pieSliceLabel: 'pieSliceLabel',\r\n pieSliceLabelValue: 'pieSliceLabelValue',\r\n pieSliceLabelName: 'pieSliceLabelName',\r\n pieRadialLabel: 'pieRadialLabel',\r\n pieRadialLink: 'pieRadialLink',\r\n pieTooltipContainer: 'pieTooltipContainer',\r\n pieTooltipFlex: 'pieTooltipFlex',\r\n pieTooltip: 'pieTooltip',\r\n pieTooltipItem: 'pieTooltipItem',\r\n pieTooltipName: 'pieTooltipName',\r\n pieTooltipValue: 'pieTooltipValue',\r\n pieTooltipColorBox: 'pieTooltipColorBox',\r\n pieFullChartTooltipCircle: 'pieFullChartTooltipCircle',\r\n};\r\n\r\nexport const SvgWrapper = styled(Wrapper)`\r\n .${pieChartclassNames.pieSliceLabel} {\r\n fill: #4a4a4a;\r\n }\r\n .${pieChartclassNames.pieRadialLabel} {\r\n position: absolute;\r\n max-width: 128px;\r\n }\r\n .${pieChartclassNames.pieRadialLink} {\r\n stroke: #000;\r\n }\r\n .${pieChartclassNames.pieFullChartTooltipCircle} {\r\n fill: transparent;\r\n cursor: pointer;\r\n }\r\n`;\r\n","import { PieChartDatum } from '../types';\r\n\r\nexport const getMidFactor = (d: PieChartDatum) =>\r\n d.startAngle + (d.endAngle - d.startAngle) / 2 < Math.PI ? 1 : -1;\r\n\r\nexport const getAlign = (d: PieChartDatum): 'start' | 'end' => {\r\n const midangle = d.startAngle + (d.endAngle - d.startAngle) / 2;\r\n\r\n return midangle < Math.PI ? 'start' : 'end';\r\n};\r\n","import styled from 'styled-components';\r\n\r\nexport const TooltipFlex = styled.div`\r\n width: 0;\r\n height: 0;\r\n display: flex;\r\n align-items: flex-end;\r\n justify-content: center;\r\n pointer-events: none;\r\n white-space: nowrap;\r\n`;\r\n\r\nexport const LabelFlex = styled(TooltipFlex)``;\r\n\r\nexport const LabelFlexCenter = styled(LabelFlex)`\r\n align-items: center;\r\n`;\r\n\r\nexport const TooltipContainer = styled.div`\r\n position: relative;\r\n font-size: 11px;\r\n color: #fff;\r\n margin-bottom: 8px;\r\n padding: 4px 6px;\r\n background-color: rgba(48, 69, 79, 1);\r\n border-radius: 4px;\r\n box-shadow: 0 0.1875rem 0.5rem rgba(48, 69, 79, 0.06);\r\n :before {\r\n content: '';\r\n position: absolute;\r\n bottom: 0;\r\n left: 50%;\r\n transform: translate(-50%, 100%);\r\n width: 0;\r\n height: 0;\r\n border-style: solid;\r\n border-width: 4px 3px 0 3px;\r\n border-color: rgba(48, 69, 79, 1) transparent transparent transparent;\r\n }\r\n`;\r\n\r\nexport const TooltipGroupName = styled.div`\r\n font-size: 14px;\r\n margin-bottom: 6px;\r\n`;\r\n\r\nexport const TooltipItem = styled.div`\r\n display: flex;\r\n align-items: center;\r\n margin-bottom: 0.25rem;\r\n &:last-of-type {\r\n margin-bottom: 0;\r\n }\r\n`;\r\n\r\nexport const ColFlex = styled.div`\r\n display: flex;\r\n align-items: center;\r\n margin-right: 4px;\r\n`;\r\n\r\nexport const ColorBox = styled.div`\r\n margin-right: 4px;\r\n width: 10px;\r\n height: 10px;\r\n border-radius: 2px;\r\n`;\r\n\r\nexport const ColorLine = styled(ColorBox)`\r\n height: 2px;\r\n border-radius: 0;\r\n`;\r\n\r\nexport const Name = styled.div`\r\n margin-right: 4px;\r\n`;\r\n\r\nexport const Value = styled.div`\r\n text-align: right;\r\n flex-shrink: 0;\r\n flex-grow: 1;\r\n`;\r\n\r\nexport const Label = styled.div`\r\n position: relative;\r\n font-size: 11px;\r\n color: #fff;\r\n font-weight: bold;\r\n letter-spacing: 0.52px;\r\n`;\r\n\r\nexport const LabelTop = styled(Label)`\r\n top: 6px;\r\n`;\r\n\r\nexport const LabelBottom = styled(Label)`\r\n bottom: 6px;\r\n`;\r\n","import * as d3 from 'd3';\r\nimport ReactDOMServer from 'react-dom/server';\r\n\r\nimport { PieChartProps, PieChartDatum } from './types';\r\n\r\nimport { appendSvg } from '../../helpers';\r\nimport { degreesToRadians, radiansToDegrees } from '../../helpers/math';\r\nimport { drawRadialLabels } from './drawRadialLabels';\r\nimport { drawTooltip } from './drawTooltips';\r\n\r\nimport { pieChartclassNames } from './styled';\r\n\r\nexport const draw = (node: HTMLElement | null, props: PieChartProps): void => {\r\n const {\r\n data,\r\n padAngle,\r\n onClick,\r\n outerRadius,\r\n startAngle,\r\n endAngle,\r\n cornerRadius,\r\n margin,\r\n enableSlicesLabels,\r\n formatSliceLabel,\r\n slicesLabelsSkipAngle,\r\n enableSlicesLabelsName,\r\n formatSliceLabelName,\r\n borderWidth,\r\n borderColor,\r\n enableRadialLabels,\r\n backgroundColor,\r\n radialLabelsLinkHorizontalLength,\r\n radialLabelsTextXOffset,\r\n formatRadialLabel,\r\n radialLabelYOffset,\r\n svgElements,\r\n formatSliceTitle,\r\n radialAngleXOffset,\r\n withTooltip,\r\n fullChartTooltip,\r\n tooltipClassName,\r\n tooltipBind,\r\n renderTooltip,\r\n tooltipStyle,\r\n } = props;\r\n\r\n if (node !== null && data.length) {\r\n const marginTop = margin ? margin.top : 0;\r\n const marginRight = margin ? margin.right : 0;\r\n const marginBottom = margin ? margin.bottom : 0;\r\n const marginLeft = margin ? margin.left : 0;\r\n const { width: nodeWidth } = node.getBoundingClientRect();\r\n const width = props.width || nodeWidth;\r\n const defaultHeight = 240;\r\n const height = props.height || defaultHeight;\r\n const radius =\r\n (Math.min(width, height) -\r\n (borderWidth || 0) * 2 -\r\n (width > height\r\n ? marginTop + marginBottom\r\n : marginRight + marginLeft)) /\r\n 2;\r\n\r\n const svg = appendSvg(node, width, height);\r\n const global = svg\r\n .append('g')\r\n .attr('class', pieChartclassNames.pieGlobal)\r\n .attr(\r\n 'transform',\r\n `translate(${(width - (marginLeft + marginRight)) / 2 +\r\n marginLeft},${(height - (marginBottom + marginTop)) / 2 + marginTop})`\r\n );\r\n\r\n const maxPadAngle = 45;\r\n const dividerPadAngle = 100;\r\n const fullAngle = 360;\r\n\r\n const pie = d3\r\n .pie()\r\n .startAngle(-degreesToRadians(startAngle || 0))\r\n .endAngle(degreesToRadians(endAngle || fullAngle))\r\n .padAngle(\r\n padAngle\r\n ? Math.max(Math.min(padAngle / dividerPadAngle, maxPadAngle), 0)\r\n : 0\r\n )\r\n .sort(null)\r\n // @ts-ignore\r\n .value(({ value }) => value);\r\n\r\n // @ts-ignore\r\n const dataReady = pie(data) as PieChartDatum[];\r\n\r\n const maxOuterRadius = 0.95;\r\n const arc = d3\r\n .arc()\r\n .cornerRadius(cornerRadius || 0)\r\n .innerRadius(radius)\r\n .outerRadius(\r\n radius * Math.min(Math.max(outerRadius || 0, 0), maxOuterRadius)\r\n );\r\n\r\n if (typeof backgroundColor === 'string') {\r\n global\r\n .append('path')\r\n .attr('fill', backgroundColor)\r\n .attr('d', () =>\r\n // @ts-ignore\r\n arc({\r\n startAngle: degreesToRadians(0),\r\n endAngle: degreesToRadians(fullAngle),\r\n })\r\n );\r\n }\r\n\r\n const format = d3.format(',');\r\n const allSlices = global\r\n .selectAll('allSlices')\r\n .data(dataReady)\r\n .enter()\r\n .append('path')\r\n // @ts-ignore\r\n .attr('d', arc);\r\n\r\n allSlices\r\n .attr('class', pieChartclassNames.pieSlice)\r\n .attr('fill', ({ index }) => data[index].color || '')\r\n .attr('stroke', borderColor || '')\r\n .attr('stroke-width', borderWidth || 0)\r\n .attr('style', onClick ? 'cursor: pointer' : '')\r\n .on(\r\n 'click',\r\n // @ts-ignore\r\n (_, d) => onClick && onClick(data[d.index])\r\n )\r\n .append('svg:title')\r\n .text(d =>\r\n formatSliceTitle\r\n ? // @ts-ignore\r\n formatSliceTitle(d)\r\n : fullChartTooltip || withTooltip\r\n ? ''\r\n : `${data[d.index].name || ''} (${format(data[d.index].value)})`\r\n );\r\n\r\n if (enableSlicesLabels) {\r\n const text = global\r\n .selectAll('allSlices')\r\n .data(dataReady)\r\n .enter()\r\n .append('text')\r\n .attr('class', pieChartclassNames.pieSliceLabel)\r\n .attr('text-anchor', 'middle')\r\n .attr('dominant-baseline', 'central')\r\n .attr(\r\n 'transform',\r\n // @ts-ignore\r\n (d: PieChartDatum) => 'translate(' + arc.centroid(d) + ')'\r\n );\r\n\r\n text\r\n .append('tspan')\r\n .attr('class', pieChartclassNames.pieSliceLabelValue)\r\n // @ts-ignore\r\n .text((d: PieChartDatum) => {\r\n const deg = radiansToDegrees(d.endAngle - d.startAngle);\r\n\r\n if (!slicesLabelsSkipAngle || deg > slicesLabelsSkipAngle) {\r\n return formatSliceLabel ? formatSliceLabel(d) : d.value;\r\n }\r\n });\r\n\r\n if (enableSlicesLabelsName) {\r\n text\r\n .append('tspan')\r\n .attr('class', pieChartclassNames.pieSliceLabelName)\r\n // @ts-ignore\r\n .text((d: PieChartDatum) =>\r\n formatSliceLabelName ? formatSliceLabelName(d) : d.data.name\r\n )\r\n .attr('x', '0')\r\n .attr('dy', '1.2em');\r\n }\r\n }\r\n\r\n drawRadialLabels({\r\n arc,\r\n enableRadialLabels,\r\n global,\r\n radius,\r\n node,\r\n dataReady,\r\n translateX: (width - (marginLeft - marginRight)) / 2,\r\n translateY: (height + (marginTop - marginBottom)) / 2,\r\n radialLabelsLinkHorizontalLength,\r\n radialLabelsTextXOffset,\r\n formatRadialLabel,\r\n radialLabelYOffset,\r\n radialAngleXOffset,\r\n });\r\n\r\n if (withTooltip || fullChartTooltip) {\r\n drawTooltip({\r\n fullChartTooltip,\r\n global,\r\n data,\r\n tooltipClassName,\r\n tooltipBind,\r\n renderTooltip,\r\n allSlices,\r\n arc,\r\n tooltipStyle,\r\n width,\r\n height,\r\n radius,\r\n });\r\n }\r\n\r\n if (svgElements) {\r\n const html = ReactDOMServer.renderToString(svgElements);\r\n\r\n svg.append('g').html(html);\r\n }\r\n }\r\n};\r\n","import * as d3 from 'd3';\r\nimport ReactDOMServer from 'react-dom/server';\r\n\r\nimport { DrawRadialLabels } from './types';\r\nimport { PieChartDatum } from '../types';\r\n\r\nimport { pieChartclassNames } from '../styled';\r\nimport { getMidFactor, getAlign } from './helpers';\r\nimport { getTranslate } from '../../../common/components/labels';\r\n\r\nexport const drawRadialLabels = ({\r\n arc,\r\n enableRadialLabels,\r\n global,\r\n node,\r\n radius,\r\n dataReady,\r\n radialLabelsLinkHorizontalLength,\r\n formatRadialLabel,\r\n radialLabelsTextXOffset,\r\n translateX,\r\n translateY,\r\n radialLabelYOffset,\r\n radialAngleXOffset,\r\n}: DrawRadialLabels): void => {\r\n const d3container = d3.select(node);\r\n d3container.selectAll(`.${pieChartclassNames.pieRadialLabel}`).remove();\r\n\r\n if (enableRadialLabels) {\r\n const defaultRadialLabelsLinkHorizontalLength = 4;\r\n const outerArc = d3\r\n .arc()\r\n .innerRadius(radius)\r\n .outerRadius(radius);\r\n\r\n global\r\n .selectAll('allPolylines')\r\n .data(dataReady)\r\n .enter()\r\n .append('polyline')\r\n .attr('class', pieChartclassNames.pieRadialLink)\r\n .style('fill', 'none')\r\n .attr('points', (d: PieChartDatum) => {\r\n const midFactor = getMidFactor(d);\r\n const posA = arc.centroid(d);\r\n const posB = outerArc.centroid(d);\r\n const posC = outerArc.centroid(d);\r\n const posCPi = [\r\n (radius +\r\n (radialLabelsLinkHorizontalLength ||\r\n defaultRadialLabelsLinkHorizontalLength)) *\r\n midFactor,\r\n posC[1],\r\n ];\r\n return [\r\n [posA[0], posA[1]],\r\n [\r\n posB[0] + (radialAngleXOffset || 0) * midFactor,\r\n posB[1] - (radialLabelYOffset || 0) * d.index,\r\n ],\r\n [posCPi[0], posCPi[1] - (radialLabelYOffset || 0) * d.index],\r\n ];\r\n });\r\n\r\n const getPosition = (d: PieChartDatum): [number, number] => {\r\n const pos = outerArc.centroid(d);\r\n return [\r\n (radius +\r\n (radialLabelsLinkHorizontalLength ||\r\n defaultRadialLabelsLinkHorizontalLength)) *\r\n getMidFactor(d),\r\n pos[1],\r\n ];\r\n };\r\n\r\n const defaultRadialLabelsTextXOffset = 4;\r\n d3container\r\n .selectAll('allLabels')\r\n .data(dataReady)\r\n .enter()\r\n .append('div')\r\n // @ts-ignore\r\n .html((d: PieChartDatum) => {\r\n const html = ReactDOMServer.renderToString(\r\n // @ts-ignore\r\n formatRadialLabel ? formatRadialLabel(d) : d.data.name\r\n );\r\n\r\n return html;\r\n })\r\n .attr('class', pieChartclassNames.pieRadialLabel)\r\n // @ts-ignore\r\n .style('transform', (d: PieChartDatum) =>\r\n getTranslate({\r\n anchor: getAlign(d),\r\n index: d.index,\r\n translateX,\r\n translateY: translateY - (radialLabelYOffset || 0) * d.index,\r\n })\r\n )\r\n // @ts-ignore\r\n .style(\r\n 'left',\r\n // @ts-ignore\r\n (d: PieChartDatum) =>\r\n `${getPosition(d)[0] -\r\n (getAlign(d) === 'start'\r\n ? -(radialLabelsTextXOffset || defaultRadialLabelsTextXOffset)\r\n : radialLabelsTextXOffset || defaultRadialLabelsTextXOffset)}px`\r\n )\r\n // @ts-ignore\r\n .style('top', (d: PieChartDatum) => `${getPosition(d)[1]}px`)\r\n // @ts-ignore\r\n .style('text-align', getAlign);\r\n }\r\n};\r\n","import React from 'react';\r\nimport ReactDOMServer from 'react-dom/server';\r\nimport * as d3 from 'd3';\r\n\r\nimport { pieChartclassNames as classNames } from '../styled';\r\n\r\nimport { DrawTooltipProps } from './types';\r\n\r\nimport {\r\n TooltipContainer,\r\n TooltipFlex,\r\n TooltipItem,\r\n Value,\r\n Name,\r\n ColorBox,\r\n} from '../../../common/components/tooltips';\r\nimport { PieChartData, PieChartDatum } from '../types';\r\n\r\nexport const drawTooltip = ({\r\n fullChartTooltip,\r\n global,\r\n tooltipRoot,\r\n data,\r\n tooltipClassName,\r\n tooltipBind,\r\n renderTooltip,\r\n arc,\r\n allSlices,\r\n tooltipStyle,\r\n width,\r\n height,\r\n radius,\r\n}: DrawTooltipProps) => {\r\n const container: Element | null =\r\n tooltipRoot || document.querySelector('body');\r\n const format = d3.format(',');\r\n const pieTooltipContainer: d3.Selection<\r\n HTMLDivElement,\r\n unknown,\r\n null,\r\n undefined\r\n > = d3.select(container).select(`.${classNames.pieTooltipContainer}`);\r\n const isEmpty = pieTooltipContainer.empty();\r\n\r\n const tooltipContainer = isEmpty\r\n ? d3\r\n .select(container)\r\n .append('div')\r\n .attr(\r\n 'class',\r\n `${classNames.pieTooltipContainer} ${tooltipClassName || ''}`\r\n )\r\n .style('position', 'absolute')\r\n .style('opacity', '0')\r\n .style('z-index', '103')\r\n : pieTooltipContainer;\r\n\r\n if (tooltipStyle) {\r\n Object.entries(tooltipStyle).forEach(([prop, val]) =>\r\n tooltipContainer.style(prop, val)\r\n );\r\n }\r\n\r\n tooltipContainer.html('');\r\n let isVisible = false;\r\n\r\n const setVisible = (visible?: boolean) => {\r\n isVisible = Boolean(visible);\r\n const opacity = isVisible ? '1' : '0';\r\n tooltipContainer.style('opacity', opacity);\r\n };\r\n\r\n const setPosition = (event: any, pieChartDatum?: PieChartDatum) => {\r\n let [x, y] = d3.pointer(event, document);\r\n\r\n if (!tooltipBind && fullChartTooltip) {\r\n const [itemX, itemY] = d3.pointer(event, event.target);\r\n\r\n x = x - itemX;\r\n y = y - itemY;\r\n } else if (!tooltipBind) {\r\n const globalNode = global.node();\r\n const {\r\n x: itemX,\r\n y: itemY,\r\n width: itemWidth,\r\n height: itemHeight,\r\n } = globalNode\r\n ? globalNode.getBoundingClientRect()\r\n : { x: 0, y: 0, width: 0, height: 0 };\r\n const [arcX, arcY] = arc.centroid(pieChartDatum as d3.DefaultArcObject);\r\n x = itemX + itemWidth / 2 + arcX;\r\n y = itemY + itemHeight / 2 + arcY;\r\n }\r\n\r\n tooltipContainer.style('left', x + 'px').style('top', y + 'px');\r\n };\r\n\r\n const setTooltip = (event: any, pieChartDatum?: PieChartDatum) => {\r\n setVisible(true);\r\n setPosition(event, pieChartDatum);\r\n const pieChartData = pieChartDatum ? [pieChartDatum.data] : data;\r\n\r\n tooltipContainer.html(() => {\r\n const html = ReactDOMServer.renderToString(\r\n <TooltipFlex className={classNames.pieTooltipFlex}>\r\n <TooltipContainer className={classNames.pieTooltip}>\r\n {renderTooltip ? (\r\n renderTooltip(pieChartData)\r\n ) : (\r\n <>\r\n {pieChartData.map(\r\n ({ color, name, value }: PieChartData, index: number) => (\r\n <TooltipItem\r\n key={`${name}-${index}`}\r\n className={classNames.pieTooltipItem}\r\n >\r\n {color && (\r\n <ColorBox\r\n className={classNames.pieTooltipColorBox}\r\n style={{ backgroundColor: color }}\r\n />\r\n )}\r\n {name && (\r\n <Name className={classNames.pieTooltipName}>\r\n {name}\r\n </Name>\r\n )}\r\n <Value className={classNames.pieTooltipValue}>\r\n {format(value)}\r\n </Value>\r\n </TooltipItem>\r\n )\r\n )}\r\n </>\r\n )}\r\n </TooltipContainer>\r\n </TooltipFlex>\r\n );\r\n\r\n return html;\r\n });\r\n };\r\n\r\n if (fullChartTooltip) {\r\n global.on('mouseover.fulltooltip', event => setTooltip(event));\r\n global.on('mouseout.fulltooltip', () => {\r\n tooltipContainer.html('');\r\n setVisible();\r\n });\r\n\r\n if (width && height) {\r\n global\r\n .append('circle')\r\n .attr('class', classNames.pieFullChartTooltipCircle)\r\n .attr('r', radius)\r\n .attr('cx', 0)\r\n .attr('cy', 0);\r\n }\r\n\r\n if (!tooltipBind) {\r\n global.on('touchmove.tooltipBind mousemove.tooltipBind', event =>\r\n setPosition(event)\r\n );\r\n }\r\n } else {\r\n allSlices.on('mouseover.slice', setTooltip);\r\n if (!tooltipBind) {\r\n allSlices.on('touchmove.slice mousemove.slice', setPosition);\r\n }\r\n allSlices.on('mouseout.slice', () => {\r\n tooltipContainer.html('');\r\n setVisible();\r\n });\r\n }\r\n};\r\n","import React, { useEffect } from 'react';\r\n\r\nimport { PieChartProps } from './types';\r\n\r\nimport { useNode } from '../../hooks';\r\nimport { useResize } from '../../hooks';\r\n\r\nimport { draw } from './draw';\r\n\r\nimport { SvgWrapper } from './styled';\r\n\r\nexport const PieChart: React.FC<PieChartProps> = (\r\n props\r\n): React.ReactElement => {\r\n const { className, style, children } = props;\r\n const [ref, node] = useNode();\r\n\r\n useEffect(() => {\r\n node && draw(node, props);\r\n }, [node, props]);\r\n\r\n const onDraw = () => draw(node, props);\r\n\r\n useResize(props.width, onDraw);\r\n\r\n return (\r\n <div className={className} style={style}>\r\n <SvgWrapper ref={ref}>{children}</SvgWrapper>\r\n </div>\r\n );\r\n};\r\n\r\nPieChart.defaultProps = {\r\n data: [],\r\n startAngle: 0,\r\n endAngle: 360,\r\n slicesLabelsSkipAngle: 0,\r\n radialLabelYOffset: 16,\r\n radialAngleXOffset: 8,\r\n};\r\n","import * as d3 from 'd3';\r\n\r\nimport { Interpolator } from '../../common/types/interpolator';\r\nimport { GetLegendProps } from './types';\r\n\r\nconst defaultN = 256;\r\n\r\nexport const legendClassNames = {\r\n legendContainer: 'd3-legend-container',\r\n legendTitle: 'd3-legend-title',\r\n legendTick: 'd3-legend-tick',\r\n legendTickLine: 'd3-legend-tick-line',\r\n legendTickText: 'd3-legend-tick-text',\r\n};\r\n\r\nfunction ramp(color: Interpolator, n: number = defaultN) {\r\n const canvas = document.createElement('canvas');\r\n canvas.width = n;\r\n canvas.height = 1;\r\n const context = canvas.getContext('2d') as CanvasRenderingContext2D;\r\n\r\n for (let i = 0; i < n; ++i) {\r\n context.fillStyle = color(i / (n - 1));\r\n context.fillRect(i, 0, 1, 1);\r\n }\r\n\r\n return canvas;\r\n}\r\n\r\nexport const legendDefaultParams = {\r\n tickSize: 6,\r\n height: 44,\r\n width: 320,\r\n marginTop: 18,\r\n marginBottom: 16,\r\n ticksDivier: 64,\r\n titleMarginBottom: 6,\r\n};\r\n\r\nexport const getLegend = ({\r\n color,\r\n title,\r\n tickSize = legendDefaultParams.tickSize,\r\n width = legendDefaultParams.width,\r\n height = legendDefaultParams.height + tickSize,\r\n marginTop = legendDefaultParams.marginTop,\r\n marginRight = 0,\r\n marginBottom = legendDefaultParams.marginBottom + tickSize,\r\n marginLeft = 0,\r\n ticks = legendDefaultParams.width / legendDefaultParams.ticksDivier,\r\n tickFormat,\r\n tickValues,\r\n titleMarginBottom,\r\n}: GetLegendProps) => {\r\n const svg = d3\r\n .create('svg')\r\n .attr('width', width)\r\n .attr('height', height)\r\n // @ts-ignore\r\n .attr('viewBox', [0, 0, width, height])\r\n .style('overflow', 'visible')\r\n .style('display', 'block');\r\n\r\n let tickAdjust = (g: d3.Selection<SVGGElement, any, any, any>) => {\r\n const tick = g.selectAll('.tick');\r\n\r\n tick\r\n .selectAll('.tick line')\r\n .attr('y1', marginTop + marginBottom - height)\r\n .attr('class', legendClassNames.legendTickLine);\r\n tick.selectAll('.tick text').attr('class', legendClassNames.legendTickText);\r\n tick.attr('class', legendClassNames.legendTick);\r\n\r\n return tick;\r\n };\r\n let x: any;\r\n\r\n // Continuous\r\n if (color.interpolate) {\r\n const n = Math.min(color.domain().length, color.range().length);\r\n\r\n x = color\r\n .copy()\r\n .rangeRound(\r\n d3.quantize(d3.interpolate(marginLeft, width - marginRight), n)\r\n );\r\n\r\n svg\r\n .append('image')\r\n .attr('x', marginLeft)\r\n .attr('y', marginTop)\r\n .attr('class', legendClassNames.legendContainer)\r\n .attr('width', width - marginLeft - marginRight)\r\n .attr('height', height - marginTop - marginBottom)\r\n .attr('preserveAspectRatio', 'none')\r\n .attr(\r\n 'xlink:href',\r\n ramp(\r\n color.copy().domain(d3.quantize(d3.interpolate(0, 1), n))\r\n ).toDataURL()\r\n );\r\n }\r\n\r\n // Sequential\r\n else if (color.interpolator) {\r\n x = Object.assign(\r\n color\r\n .copy()\r\n .interpolator(d3.interpolateRound(marginLeft, width - marginRight)),\r\n {\r\n range() {\r\n return [marginLeft, width - marginRight];\r\n },\r\n }\r\n );\r\n\r\n svg\r\n .append('image')\r\n .attr('x', marginLeft)\r\n .attr('y', marginTop)\r\n .attr('width', width - marginLeft - marginRight)\r\n .attr('height', height - marginTop - marginBottom)\r\n .attr('preserveAspectRatio', 'none')\r\n .attr('xlink:href', ramp(color.interpolator()).toDataURL());\r\n\r\n // scaleSequentialQuantile doesn’t implement ticks or tickFormat.\r\n if (!x.ticks) {\r\n if (tickValues === undefined) {\r\n const n = Math.round(ticks + 1);\r\n tickValues = d3\r\n .range(n)\r\n .map(i => d3.quantile(color.domain(), i / (n - 1)));\r\n }\r\n if (typeof tickFormat !== 'function') {\r\n tickFormat = d3.format(tickFormat === undefined ? ',f' : tickFormat);\r\n }\r\n }\r\n }\r\n\r\n svg\r\n .append('g')\r\n .attr('transform', `translate(0,${height - marginBottom})`)\r\n .call(\r\n d3\r\n .axisBottom(x)\r\n .ticks(ticks, typeof tickFormat === 'string' ? tickFormat : undefined)\r\n // @ts-ignore\r\n .tickFormat(typeof tickFormat === 'function' ? tickFormat : undefined)\r\n .tickSize(tickSize)\r\n // @ts-ignore\r\n .tickValues(tickValues)\r\n )\r\n .call(tickAdjust)\r\n .call(g => g.select('.domain').remove())\r\n .call(g =>\r\n g\r\n .append('text')\r\n .attr('x', marginLeft)\r\n .attr('class', legendClassNames.legendTitle)\r\n .attr(\r\n 'y',\r\n marginTop +\r\n marginBottom -\r\n height -\r\n (titleMarginBottom || legendDefaultParams.titleMarginBottom)\r\n )\r\n .attr('fill', 'currentColor')\r\n .attr('text-anchor', 'start')\r\n .attr('font-weight', 'bold')\r\n .text(title as string)\r\n );\r\n\r\n return svg;\r\n};\r\n","import styled from 'styled-components';\r\n\r\nimport { Wrapper } from '../../common/components/Wrapper';\r\nimport { legendClassNames } from '../../helpers/getLegend';\r\n\r\nexport const calendarChartClassNames = {\r\n calendarChart: 'calendarChart',\r\n calendarYear: 'calendarYear',\r\n calendarAxis: 'calendarAxis',\r\n calendarBody: 'calendarBody',\r\n calendarHeader: 'calendarHeader',\r\n calendarYearTitle: 'calendarYearTitle',\r\n calendarWeekDay: 'calendarWeekDay',\r\n calendarMonth: 'calendarMonth',\r\n calendarDays: 'calendarDays',\r\n calendarDay: 'calendarDay',\r\n ...legendClassNames,\r\n};\r\n\r\nconst headerHeight = '20px';\r\n\r\nexport const SvgWrapper = styled(Wrapper)`\r\n .${calendarChartClassNames.calendarYear} {\r\n display: flex;\r\n margin-bottom: 16px;\r\n }\r\n .${calendarChartClassNames.calendarYearTitle} {\r\n display: inline-flex;\r\n align-items: flex-end;\r\n height: ${headerHeight};\r\n margin-bottom: 4px;\r\n font-weight: bold;\r\n }\r\n .${calendarChartClassNames.calendarHeader} {\r\n height: ${headerHeight};\r\n margin-bottom: 4px;\r\n position: relative;\r\n display: flex;\r\n }\r\n .${calendarChartClassNames.calendarMonth} {\r\n font-size: 14px;\r\n bottom: 0;\r\n position: absolute;\r\n }\r\n .${calendarChartClassNames.calendarAxis} {\r\n display: flex;\r\n flex-direction: column;\r\n margin-right: 10px;\r\n }\r\n .${calendarChartClassNames.calendarWeekDay} {\r\n font-size: 12px;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: flex-end;\r\n }\r\n .${calendarChartClassNames.calendarDays} {\r\n position: relative;\r\n }\r\n .${calendarChartClassNames.calendarDay} {\r\n position: absolute;\r\n }\r\n`;\r\n","import React, { useEffect } from 'react';\r\n\r\nimport { CalendarChartProps } from './types';\r\n\r\nimport { useNode } from '../../hooks';\r\n\r\nimport { draw } from './draw';\r\n\r\nimport { SvgWrapper } from './styled';\r\n\r\nexport const CalendarChart: React.FC<CalendarChartProps> = (\r\n props\r\n): React.ReactElement => {\r\n const {\r\n className,\r\n style,\r\n children,\r\n data,\r\n startSunday,\r\n weekdays,\r\n cellOffset,\r\n cellSize,\r\n interpolator,\r\n monthSpacing,\r\n colorRange,\r\n legendProps,\r\n } = props;\r\n const [ref, node] = useNode();\r\n\r\n useEffect(() => {\r\n node && draw(node, props);\r\n // eslint-disable-next-line\r\n }, [\r\n node,\r\n data,\r\n startSunday,\r\n weekdays,\r\n cellOffset,\r\n cellSize,\r\n interpolator,\r\n monthSpacing,\r\n colorRange,\r\n legendProps,\r\n ]);\r\n\r\n return (\r\n <SvgWrapper ref={ref} className={className} style={style}>\r\n {children}\r\n </SvgWrapper>\r\n );\r\n};\r\n\r\nCalendarChart.defaultProps = {\r\n data: [],\r\n};\r\n","import * as d3 from 'd3';\r\n\r\nimport { Interpolator } from '../../common/types/interpolator';\r\nimport { CalendarChartProps, CalendarChartData } from './types';\r\n\r\nimport { getLegend } from '../../helpers/getLegend';\r\n\r\nimport { calendarChartClassNames } from './styled';\r\n\r\nexport const draw = (\r\n node: HTMLElement | null,\r\n props: CalendarChartProps\r\n): void => {\r\n const {\r\n data,\r\n startSunday,\r\n weekdays,\r\n interpolator,\r\n monthSpacing,\r\n onEachDay,\r\n colorRange,\r\n legendProps,\r\n } = props;\r\n\r\n if (node !== null && data.length) {\r\n const years: Map<number, CalendarChartData[]> = d3.group(data, d =>\r\n d.date.getUTCFullYear()\r\n );\r\n const cellOffset =\r\n typeof props.cellOffset === 'number' ? props.cellOffset : 0;\r\n const weekDays = 7;\r\n const defaultCellSize = 18;\r\n const cellSize = props.cellSize || defaultCellSize;\r\n const countDay = (i: number) =>\r\n startSunday ? i : (i + (weekDays - 1)) % weekDays;\r\n const days = weekdays || ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'];\r\n const sundayIndex = 6;\r\n const formatDay = (i: number) =>\r\n startSunday ? days[i] : i === sundayIndex ? days[0] : days[i + 1];\r\n const formatDate = d3.utcFormat('%x');\r\n const timeWeek = startSunday ? d3.utcSunday : d3.utcMonday;\r\n const getTimeWeekCount = (from: Date, to: Date) =>\r\n timeWeek.count(d3.utcYear(from), to);\r\n const getMonthSpacing = (date: Date) =>\r\n date.getUTCMonth() * (monthSpacing || 0);\r\n const formatMonth = d3.utcFormat('%b');\r\n const max = d3.max(data.map(({ value }) => value)) as number;\r\n const min = d3.min(data.map(({ value }) => value)) as number;\r\n\r\n const color = colorRange\r\n ? d3\r\n .scaleLinear()\r\n .domain([min, max])\r\n // @ts-ignore\r\n .range(colorRange)\r\n : d3\r\n .scaleSequential(interpolator || d3.interpolateGreens)\r\n .domain([min, +max]);\r\n\r\n let chartWidth = 0;\r\n\r\n years.forEach((values, year) => {\r\n const min = new Date(year, 1);\r\n const max = d3.max(values.map(d => d.date)) as Date;\r\n const months = max.getUTCMonth() - min.getUTCMonth();\r\n const weekCount = getTimeWeekCount(min, max) + 1;\r\n const width =\r\n weekCount * (cellSize + cellOffset) + (monthSpacing || 0) * months;\r\n\r\n chartWidth = Math.max(chartWidth, width);\r\n });\r\n\r\n d3.select(node)\r\n .select(`.${calendarChartClassNames.calendarChart}`)\r\n .remove();\r\n\r\n const container = d3\r\n .select(node)\r\n .append('div')\r\n .attr('class', calendarChartClassNames.calendarChart);\r\n\r\n const year = container\r\n .selectAll('div')\r\n // @ts-ignore\r\n .data(years)\r\n .join('div')\r\n .attr('class', calendarChartClassNames.calendarYear);\r\n\r\n const calendarWeekdays = year\r\n .append('div')\r\n .attr('class', calendarChartClassNames.calendarAxis);\r\n\r\n calendarWeekdays\r\n .append('div')\r\n .attr('class', calendarChartClassNames.calendarYearTitle)\r\n // @ts-ignore\r\n .text(([key]) => key);\r\n\r\n calendarWeekdays\r\n .selectAll('span')\r\n .data(d3.range(weekDays))\r\n .join('div')\r\n .attr('class', calendarChartClassNames.calendarWeekDay)\r\n .style('height', cellSize + 'px')\r\n .style('margin-bottom', cellOffset + 'px')\r\n .text(formatDay);\r\n\r\n const body = year\r\n .append('div')\r\n .attr('class', calendarChartClassNames.calendarBody);\r\n\r\n const header = body\r\n .append('div')\r\n .attr('class', calendarChartClassNames.calendarHeader);\r\n\r\n header\r\n .selectAll('div')\r\n // @ts-ignore\r\n .data(([_, values]) => {\r\n const fullYearlastMonth = 12;\r\n const fullYearlastDate = 31;\r\n\r\n return d3.utcMonths(\r\n d3.utcMonth(new Date(values[0].date.getUTCFullYear(), 1, 1)),\r\n d3.utcMonth(\r\n new Date(\r\n values[0].date.getUTCFullYear(),\r\n fullYearlastMonth,\r\n fullYearlastDate\r\n )\r\n )\r\n );\r\n })\r\n .join('div')\r\n .attr('class', calendarChartClassNames.calendarMonth)\r\n .style(\r\n 'left',\r\n (d: any) =>\r\n getTimeWeekCount(d, timeWeek.ceil(d)) * (cellSize + cellOffset) +\r\n getMonthSpacing(d) +\r\n 'px'\r\n )\r\n // @ts-ignore\r\n .text(formatMonth);\r\n\r\n // @ts-ignore\r\n body\r\n .append('div')\r\n .attr('class', calendarChartClassNames.calendarDays)\r\n .style('height', (cellSize + cellOffset) * weekDays + 'px')\r\n .style('width', chartWidth + 'px')\r\n .selectAll('div')\r\n // @ts-ignore\r\n .data(([, values]) => values)\r\n .join('div')\r\n // @ts-ignore\r\n .each((data: CalendarChartData, index, elements) => {\r\n if (onEachDay) {\r\n const element = elements[index] as HTMLDivElement;\r\n const currColor = color(data.value) as string;\r\n\r\n onEachDay(data, element, currColor);\r\n }\r\n })\r\n .attr('class', calendarChartClassNames.calendarDay)\r\n .style('width', cellSize + 'px')\r\n .style('height', cellSize + 'px')\r\n // @ts-ignore\r\n .style(\r\n 'left',\r\n (d: any) =>\r\n getTimeWeekCount(d.date, d.date) * (cellSize + cellOffset) +\r\n getMonthSpacing(d.date) +\r\n 'px'\r\n )\r\n .style(\r\n 'top',\r\n // @ts-ignore\r\n d => countDay(d.date.getUTCDay()) * (cellSize + cellOffset) + 'px'\r\n )\r\n // @ts-ignore\r\n .style('background-color', d => color(d.value))\r\n // @ts-ignore\r\n .attr('title', d => `${formatDate(d.date)} - ${d.value}`);\r\n\r\n if (typeof legendProps === 'object') {\r\n const legend = getLegend({\r\n color: color as Interpolator,\r\n ...legendProps,\r\n });\r\n\r\n const containerNode = container.node() as HTMLDivElement;\r\n const legendSvg = legend.node() as SVGElement;\r\n\r\n containerNode.appendChild(legendSvg);\r\n }\r\n }\r\n};\r\n","import * as d3 from 'd3';\r\n\r\nexport function computeDimensions(\r\n selection: d3.Selection<any, any, any, any>\r\n): SVGRect | DOMRect {\r\n let dimensions;\r\n const node = selection.node();\r\n\r\n if (node instanceof SVGGraphicsElement) {\r\n // check if node is svg element\r\n dimensions = node.getBBox();\r\n } else {\r\n // else is html element\r\n dimensions = node.getBoundingClientRect();\r\n }\r\n\r\n return dimensions;\r\n}\r\n","export function none() {\r\n return;\r\n}\r\n\r\nexport function isVoid(value: any) {\r\n return value === undefined || value === null || Number.isNaN(value);\r\n}\r\n","import styled, { createGlobalStyle } from 'styled-components';\r\n\r\nimport { Wrapper } from '../../common/components/Wrapper';\r\n\r\nexport const lineChartClassNames = {\r\n lineChartYScaleGlobal: 'lineChartYScaleGlobal',\r\n lineChartYScaleRight: 'lineChartYScaleRight',\r\n lineChartXScaleGlobal: 'lineChartXScaleGlobal',\r\n lineChartLinesGlobal: 'lineChartLinesGlobal',\r\n lineChartLine: 'lineChartLine',\r\n lineChartAreasGlobal: 'lineChartAreasGlobal',\r\n lineChartArea: 'lineChartArea',\r\n lineChartDotsGlobalContainer: 'lineChartDotsGlobalContainer',\r\n lineChartDotsGlobal: 'lineChartDotsGlobal',\r\n lineChartDot: 'lineChartDot',\r\n lineChartGridGlobal: 'lineChartGridGlobal',\r\n lineChartGridLineX: 'lineChartGridLineX',\r\n lineChartGridLineY: 'lineChartGridLineY',\r\n lineChartLabelContainer: 'lineChartLabelContainer',\r\n lineChartLabelFlex: 'lineChartLabelFlex',\r\n lineChartLabel: 'lineChartLabel',\r\n lineChartMouseGlobal: 'lineChartMouseGlobal',\r\n lineChartMouseLine: 'lineChartMouseLine',\r\n lineChartMouseRect: 'lineChartMouseRect',\r\n lineChartMouseCircle: 'lineChartMouseCircle',\r\n lineChartMouseLabelContainer: 'lineChartMouseLabelContainer',\r\n lineChartMouseLabel: 'lineChartMouseLabel',\r\n};\r\n\r\nexport const SvgWrapper = styled(Wrapper)`\r\n .${lineChartClassNames.lineChartYScaleGlobal},\r\n .${lineChartClassNames.lineChartXScaleGlobal},\r\n .${lineChartClassNames.lineChartGridGlobal} {\r\n shape-rendering: crispEdges;\r\n }\r\n .${lineChartClassNames.lineChartLinesGlobal} {\r\n fill: none;\r\n stroke: steelblue;\r\n stroke-width: 1.5px;\r\n stroke-linejoin: round;\r\n stroke-linecap: round;\r\n }\r\n .${lineChartClassNames.lineChartArea} {\r\n fill-opacity: 0.24;\r\n }\r\n .${lineChartClassNames.lineChartGridLineX},\r\n .${lineChartClassNames.lineChartGridLineY},\r\n .${lineChartClassNames.lineChartMouseLine} {\r\n stroke: rgba(149, 149, 149, 0.24);\r\n }\r\n .${lineChartClassNames.lineChartMouseLine},\r\n .${lineChartClassNames.lineChartMouseCircle} {\r\n transition: opacity linear 200ms;\r\n pointer-events: none;\r\n stroke-width: 1px;\r\n }\r\n .${lineChartClassNames.lineChartDot} {\r\n stroke: #fff;\r\n stroke-width: 2px;\r\n }\r\n .${lineChartClassNames.lineChartMouseLine} {\r\n shape-rendering: crispEdges;\r\n }\r\n .${lineChartClassNames.lineChartMouseRect} {\r\n fill: none;\r\n pointer-events: all;\r\n }\r\n`;\r\n\r\nexport const TooltipStyles = createGlobalStyle`\r\n .${lineChartClassNames.lineChartMouseLabel} {\r\n transition: opacity linear 200ms;\r\n z-index: 100;\r\n .${lineChartClassNames.lineChartLabelFlex} {\r\n justify-content: flex-start;\r\n align-items: center;\r\n pointer-events: none;\r\n }\r\n .${lineChartClassNames.lineChartLabel} {\r\n margin: 0 0 0 10px;\r\n }\r\n }\r\n`;\r\n","import styled from 'styled-components';\r\n\r\nexport const LabelContainer = styled.div`\r\n width: 0;\r\n height: 0;\r\n display: flex;\r\n align-items: flex-end;\r\n justify-content: center;\r\n font-size: 12px;\r\n white-space: nowrap;\r\n`;\r\n\r\nexport const Label = styled.div`\r\n margin-bottom: 4px;\r\n`;\r\n","import * as d3 from 'd3';\r\n\r\nimport { LineChartProps, LineChartData, LineChartDot } from './types';\r\n\r\nimport { computeDimensions } from '../../helpers/computeDimensions';\r\nimport { appendSvg } from '../../helpers';\r\nimport { none } from '../../helpers/common';\r\nimport { stackedData } from '../../helpers/stackedData';\r\nimport { drawGrid } from './drawGrid';\r\nimport { drawLabel, labelClassName } from './drawLabel';\r\nimport { drawTooltip } from './drawTooltip';\r\n\r\nimport { lineChartClassNames } from './styled';\r\n\r\nexport const draw = (node: HTMLElement | null, props: LineChartProps): void => {\r\n const {\r\n data: chartData,\r\n labels,\r\n margin,\r\n customYAxisSelection,\r\n customXAxisSelection,\r\n customYAxis,\r\n customXAxis,\r\n curve,\r\n yAxisPadding,\r\n xAxisPadding,\r\n drawGridY,\r\n drawGridX,\r\n withLabels,\r\n formatLabel,\r\n eachLabel,\r\n stacked,\r\n dynamicTooltipEnable,\r\n dynamicCircleRadius,\r\n formatDynamicTooltip,\r\n renderTooltip,\r\n stackedTooltip,\r\n stackedTooltipIndex,\r\n tooltipLineTop,\r\n customize,\r\n customYScale,\r\n customLine,\r\n tooltipClassName,\r\n xScaleItemWidth,\r\n areaCurve,\r\n dotSnapping,\r\n rightAxis,\r\n } = props;\r\n\r\n if (node !== null && chartData.length) {\r\n const data = stacked ? stackedData(chartData) : chartData;\r\n const marginTop = margin ? margin.top : 0;\r\n const marginRight = margin ? margin.right : 0;\r\n const marginBottom = margin ? margin.bottom : 0;\r\n const marginLeft = margin ? margin.left : 0;\r\n const { width: nodeWidth } = node.getBoundingClientRect();\r\n const width = props.width || nodeWidth;\r\n const height = props.height || 0;\r\n const min =\r\n typeof props.min === 'number'\r\n ? props.min\r\n : d3.min(data, ({ values }) => d3.min(values as number[]));\r\n const max =\r\n typeof props.max === 'number'\r\n ? props.max\r\n : d3.max(data, ({ values }) => d3.max(values as number[]));\r\n\r\n const svg = appendSvg(node, width, height || 0);\r\n\r\n const yRange = [\r\n height - marginTop - marginBottom - (xAxisPadding || 0),\r\n marginTop,\r\n ];\r\n const yScale = d3\r\n .scaleLinear()\r\n .domain([min || 0, max || 0])\r\n .range(yRange)\r\n .nice();\r\n\r\n customYScale && customYScale(yScale);\r\n\r\n const yTicksCountDefault = 8;\r\n const yAxisLeft = d3.axisLeft(yScale).ticks(yTicksCountDefault);\r\n\r\n customYAxis && customYAxis(yAxisLeft);\r\n\r\n const yTicksCount = yAxisLeft.tickArguments()[0];\r\n\r\n const yAxis = svg\r\n .append('g')\r\n .attr('class', lineChartClassNames.lineChartYScaleGlobal)\r\n .call(yAxisLeft)\r\n .call(customYAxisSelection ? customYAxisSelection : none);\r\n const { width: yAxisWidth } = computeDimensions(yAxis);\r\n\r\n yAxis.attr('transform', `translate(${marginLeft + yAxisWidth}, 0)`);\r\n\r\n let yAxisRightWidth = 0;\r\n\r\n if (rightAxis) {\r\n const rightAxisMin = d3.min(rightAxis);\r\n const rightAxisMax = d3.max(rightAxis);\r\n const yRightScale = d3\r\n .scaleLinear()\r\n .domain([rightAxisMin || 0, rightAxisMax || 0])\r\n .range(yRange)\r\n .nice();\r\n\r\n const yAxisRightTicks = d3.axisRight(yRightScale).ticks(yTicksCountDefault);\r\n const yAxisRight = svg\r\n .append('g')\r\n .attr('class', `${lineChartClassNames.lineChartYScaleGlobal} ${lineChartClassNames.lineChartYScaleRight}`)\r\n .call(yAxisRightTicks)\r\n .call(customYAxisSelection ? customYAxisSelection : none);\r\n\r\n ({ width: yAxisRightWidth } = computeDimensions(yAxisRight));\r\n\r\n yAxisRight.attr('transform', `translate(${width - yAxisRightWidth}, 0)`);\r\n }\r\n\r\n /** xScale **/\r\n const lastIndex =\r\n labels && labels.length\r\n ? labels.length - 1\r\n : data.reduce((acc, { values }) => Math.max(acc, values.length), 0) - 1;\r\n\r\n const xScale = d3\r\n .scaleLinear()\r\n .domain([0, lastIndex])\r\n .range([\r\n marginLeft + yAxisWidth + (yAxisPadding || 0),\r\n width - yAxisRightWidth - marginRight,\r\n ]);\r\n\r\n const xAxisBottom = d3\r\n .axisBottom(xScale)\r\n .tickFormat((value: d3.NumberValue) =>\r\n // @ts-ignore\r\n labels && labels.length > 0 ? labels[value] : 0\r\n )\r\n .ticks(lastIndex);\r\n\r\n if (typeof xScaleItemWidth === 'number') {\r\n const [x1, x2] = xScale.range();\r\n const chartWidth = x2 - x1;\r\n\r\n xAxisBottom\r\n .ticks(Math.round(chartWidth / xScaleItemWidth))\r\n .tickSizeOuter(0);\r\n }\r\n\r\n customXAxis && customXAxis(xAxisBottom);\r\n\r\n drawGrid({\r\n svg,\r\n yScale,\r\n xScale,\r\n yTicksCount,\r\n lastIndex,\r\n drawGridY,\r\n drawGridX,\r\n });\r\n\r\n if (Array.isArray(labels) && labels.length > 0) {\r\n const xAxis = svg\r\n .append('g')\r\n .call(customXAxisSelection ? customXAxisSelection : none)\r\n .attr('class', lineChartClassNames.lineChartXScaleGlobal)\r\n .call(xAxisBottom);\r\n\r\n const { height: xAxisHeight } = computeDimensions(xAxis);\r\n\r\n xAxis.attr(\r\n 'transform',\r\n `translate(0, ${height - Math.ceil(xAxisHeight) - marginBottom})`\r\n );\r\n }\r\n\r\n const line = d3\r\n .line()\r\n .defined(d => d !== null)\r\n .x((_, index) => xScale(index))\r\n .y((d: unknown) => yScale(d as d3.NumberValue))\r\n .curve(curve || d3.curveLinear);\r\n\r\n customLine && customLine(line);\r\n\r\n const withAreas = data.some(({ fill }) => fill);\r\n\r\n if (withAreas) {\r\n let dataIndex = -2;\r\n\r\n const getArea = (d: LineChartData): d3.Area<[number, number]> => {\r\n const { minAreaValues } = d;\r\n const minTick = yScale.ticks()[0];\r\n\r\n return d3\r\n .area()\r\n .defined(d => d !== null)\r\n .x((_, index) => xScale(index))\r\n .y0((value: unknown, index) => {\r\n if (index === 0) {\r\n dataIndex = dataIndex + 1;\r\n }\r\n\r\n let minValue: number = minTick;\r\n\r\n if (minAreaValues && typeof minAreaValues[index] === 'number') {\r\n minValue = minAreaValues[index] || minValue;\r\n } else if (minAreaValues) {\r\n minValue = yScale(\r\n (minValue - (value as number)) as d3.NumberValue\r\n );\r\n }\r\n\r\n const currData = data[dataIndex];\r\n\r\n return stacked\r\n ? dataIndex > -1\r\n ? yScale(\r\n typeof currData.values[index] !== 'number'\r\n ? 0\r\n : (currData.values[index] as number)\r\n )\r\n : yScale(minValue)\r\n : yScale(minValue);\r\n })\r\n .y1((d: unknown) => yScale(d as d3.NumberValue))\r\n .curve(areaCurve || curve || d3.curveLinear);\r\n };\r\n\r\n svg\r\n .append('g')\r\n .attr('class', lineChartClassNames.lineChartAreasGlobal)\r\n .selectAll('path')\r\n .data(data.filter(({ fill }) => Boolean(fill)))\r\n .join('path')\r\n .attr('class', lineChartClassNames.lineChartArea)\r\n .attr('d', (d: LineChartData) => {\r\n const area = getArea(d);\r\n\r\n return area((d.values as unknown) as [number, number][]);\r\n })\r\n .attr('fill', ({ fill }) => fill || 'none')\r\n .attr('style', ({ areaStyle }) => areaStyle || '');\r\n }\r\n\r\n svg\r\n .append('g')\r\n .attr('class', lineChartClassNames.lineChartLinesGlobal)\r\n .selectAll('path')\r\n .data(data)\r\n .join('path')\r\n .attr('class', lineChartClassNames.lineChartLine)\r\n .attr('d', (d: LineChartData | any) => line(d.values))\r\n .attr('stroke', ({ stroke }) => stroke || 'steelblue')\r\n .attr('style', ({ style }) => style || '');\r\n\r\n const dots = data.filter(({ dot }) => dot) as (Omit<\r\n LineChartData,\r\n 'dot'\r\n > & {\r\n dot: LineChartDot;\r\n })[];\r\n\r\n if (dots.length > 0) {\r\n const dotsGlobal = svg\r\n .append('g')\r\n .attr('class', lineChartClassNames.lineChartDotsGlobalContainer);\r\n\r\n dots.forEach(item => {\r\n const { values, dot } = item;\r\n const { radius, style, filter } = dot;\r\n\r\n const dotsGroup = dotsGlobal\r\n .append('g')\r\n .attr('class', lineChartClassNames.lineChartDotsGlobal);\r\n\r\n dotsGroup\r\n .selectAll('circle')\r\n .data(values)\r\n .join('circle')\r\n .attr('cx', (_, index) => xScale(index))\r\n .attr('class', lineChartClassNames.lineChartDot)\r\n .attr('cy', d => yScale(d as d3.NumberValue))\r\n .attr('r', radius || 0)\r\n .attr('style', style || '');\r\n\r\n if (filter) {\r\n dotsGroup\r\n .selectAll('circle')\r\n .select((_, i, g) => (filter(item, i, g) ? g[i] : null))\r\n .remove();\r\n }\r\n });\r\n }\r\n\r\n d3.select(node)\r\n .select(`.${labelClassName}`)\r\n .remove();\r\n withLabels &&\r\n drawLabel({ node, eachLabel, data, yScale, xScale, formatLabel });\r\n\r\n if (dynamicTooltipEnable) {\r\n drawTooltip({\r\n tooltipLineTop,\r\n stackedTooltip,\r\n renderTooltip,\r\n stackedTooltipIndex,\r\n formatDynamicTooltip,\r\n node,\r\n svg,\r\n data,\r\n xScale,\r\n yScale,\r\n dynamicCircleRadius,\r\n tooltipClassName,\r\n dotSnapping,\r\n lastIndex,\r\n });\r\n }\r\n\r\n customize && customize({ svg, yScale, xScale });\r\n }\r\n};\r\n","import { LineChartData } from '../charts/LineChart/types';\r\n\r\nexport const stackedData = (data: LineChartData[]) => {\r\n const stacks: { [key: string]: { [key: string]: number } } = {};\r\n\r\n return data.map((item, index) => {\r\n stacks[index] = {};\r\n\r\n if (index > 0) {\r\n return {\r\n ...item,\r\n values: item.values.map((value, valuesIndex) => {\r\n const prevValue = stacks[index - 1][valuesIndex];\r\n stacks[index][valuesIndex] = Number(\r\n (typeof prevValue !== 'number' ? 0 : Math.abs(prevValue)) +\r\n (typeof value !== 'number' ? 0 : Math.abs(value))\r\n );\r\n\r\n return stacks[index][valuesIndex];\r\n }),\r\n };\r\n } else {\r\n item.values.forEach((value, valuesIndex) => {\r\n stacks[index][valuesIndex] = Number(value);\r\n });\r\n }\r\n\r\n return item;\r\n });\r\n};\r\n","import { DrawGridProps } from './types';\r\n\r\nimport { lineChartClassNames } from '../styled';\r\n\r\nexport const drawGrid = ({\r\n svg,\r\n yScale,\r\n xScale,\r\n yTicksCount,\r\n lastIndex,\r\n drawGridX,\r\n drawGridY,\r\n}: DrawGridProps) => {\r\n if (!drawGridY && !drawGridX) return;\r\n\r\n const global = svg\r\n .append('g')\r\n .attr('class', lineChartClassNames.lineChartGridGlobal);\r\n\r\n const yTicks = yScale.ticks(yTicksCount);\r\n\r\n if (drawGridX) {\r\n global\r\n .append('g')\r\n .selectAll('line')\r\n .data(yTicks)\r\n .join('line')\r\n .attr('class', lineChartClassNames.lineChartGridLineX)\r\n .attr('x1', () => xScale(0))\r\n .attr('x2', () => xScale(lastIndex))\r\n .attr('y1', (d: number) => Math.round(yScale(d)))\r\n .attr('y2', (d: number) => Math.round(yScale(d)));\r\n }\r\n\r\n if (drawGridY) {\r\n global\r\n .append('g')\r\n .selectAll('line')\r\n .data(Array.from({ length: lastIndex + 1 }, (_, index) => index))\r\n .join('line')\r\n .attr('class', lineChartClassNames.lineChartGridLineY)\r\n .attr('x1', (_, index: number) => Math.round(xScale(index) as number))\r\n .attr('x2', (_, index: number) => Math.round(xScale(index) as number))\r\n .attr('y1', () => Math.round(yScale(yTicks[0]) as number))\r\n .attr('y2', () =>\r\n Math.round(yScale(yTicks[yTicks.length - 1]) as number)\r\n );\r\n }\r\n};\r\n","import React from 'react';\r\nimport * as d3 from 'd3';\r\nimport ReactDOMServer from 'react-dom/server';\r\n\r\nimport { DrawLabelProps } from './types';\r\n\r\nimport { none } from '../../../helpers/common';\r\n\r\nimport { lineChartClassNames } from '../styled';\r\nimport { LabelContainer, Label } from './styled';\r\n\r\nexport const labelClassName = 'd3-chart-label';\r\n\r\nexport const drawLabel = ({\r\n node,\r\n data,\r\n yScale,\r\n xScale,\r\n formatLabel,\r\n eachLabel,\r\n}: DrawLabelProps) => {\r\n const labelsDiv = d3\r\n .select(node)\r\n .append('div')\r\n .attr('class', labelClassName);\r\n const format = d3.format(',');\r\n\r\n // @ts-ignore\r\n data.forEach(({ values }: { values: number[] }) => {\r\n labelsDiv\r\n .append('div')\r\n .selectAll('div')\r\n .data(values)\r\n .join('div')\r\n .attr('class', lineChartClassNames.lineChartLabelContainer)\r\n .style('position', 'absolute')\r\n .style('left', (_, index) => xScale(index) + 'px')\r\n .style('top', d => yScale(d) + 'px')\r\n .html((d: number, index, elements: any) => {\r\n const html = ReactDOMServer.renderToString(\r\n <LabelContainer className={lineChartClassNames.lineChartLabelFlex}>\r\n <Label className={lineChartClassNames.lineChartLabel}>\r\n {formatLabel ? formatLabel(d, index, elements) : format(d)}\r\n </Label>\r\n </LabelContainer>\r\n );\r\n\r\n return html;\r\n })\r\n // @ts-ignore\r\n .each(eachLabel ? eachLabel : none);\r\n });\r\n};\r\n","import React from 'react';\r\nimport * as d3 from 'd3';\r\nimport ReactDOMServer from 'react-dom/server';\r\n\r\nimport { DrawTooltipProps } from './types';\r\n\r\nimport { isVoid } from '../../../helpers/common';\r\n\r\nimport { lineChartClassNames } from '../styled';\r\nimport { Label, LabelContainer } from '../drawLabel/styled';\r\n\r\nexport const drawTooltip = ({\r\n svg,\r\n node,\r\n data: argData,\r\n xScale,\r\n yScale,\r\n dynamicCircleRadius,\r\n formatDynamicTooltip,\r\n renderTooltip,\r\n stackedTooltipIndex,\r\n stackedTooltip,\r\n tooltipLineTop,\r\n tooltipRoot,\r\n tooltipClassName,\r\n dotSnapping,\r\n lastIndex,\r\n}: DrawTooltipProps) => {\r\n const container: Element | null =\r\n tooltipRoot || document.querySelector('body');\r\n const format = d3.format(',');\r\n const chartData = argData.filter(({ tooltipOff }) => !tooltipOff);\r\n\r\n const data =\r\n typeof stackedTooltipIndex === 'number'\r\n ? [chartData[stackedTooltipIndex]]\r\n : stackedTooltip\r\n ? [chartData[0]]\r\n : chartData;\r\n\r\n const [x1, x2] = xScale.range();\r\n const [y1, y2] = yScale.range();\r\n\r\n const mouseGlobal = svg\r\n .append('g')\r\n .attr('class', lineChartClassNames.lineChartMouseGlobal);\r\n\r\n const mouseRect = mouseGlobal\r\n .append('rect')\r\n .attr('width', x2 - x1)\r\n .attr('height', Math.abs(y1 - y2))\r\n .attr('class', lineChartClassNames.lineChartMouseRect)\r\n .attr('transform', `translate(${x1}, ${y2})`);\r\n\r\n const mouseLine = mouseGlobal\r\n .append('path')\r\n .attr('class', lineChartClassNames.lineChartMouseLine)\r\n .style('opacity', '0');\r\n\r\n const lines = svg\r\n .selectAll(`.${lineChartClassNames.lineChartLine}`)\r\n .nodes() as SVGPathElement[];\r\n\r\n const circles = mouseGlobal\r\n .selectAll('circle')\r\n .data(chartData.filter(({ dynamicDotOff }) => !dynamicDotOff))\r\n .join('circle')\r\n .attr('class', lineChartClassNames.lineChartMouseCircle)\r\n .attr('r', dynamicCircleRadius as number)\r\n .attr('fill', ({ stroke }) => stroke || 'none')\r\n .attr('stroke', ({ stroke }) => stroke || 'none')\r\n .style('opacity', '0');\r\n\r\n let labelContainer: d3.Selection<any, unknown, any, any> = d3.select(\r\n `.${lineChartClassNames.lineChartMouseLabelContainer}`\r\n );\r\n\r\n if (labelContainer.size() === 0) {\r\n labelContainer = d3\r\n .select(container)\r\n .append('div')\r\n .attr('class', lineChartClassNames.lineChartMouseLabelContainer);\r\n }\r\n\r\n let labels: d3.Selection<any, any, any, any> | null = null;\r\n\r\n let isVisible = false;\r\n\r\n const setVisible = (visible?: boolean) => {\r\n isVisible = Boolean(visible);\r\n const opacity = isVisible ? '1' : '0';\r\n mouseLine.style('opacity', opacity);\r\n circles.style('opacity', opacity);\r\n labels && labels.style('opacity', opacity);\r\n };\r\n\r\n const mouseMove = (event: MouseEvent | TouchEvent) => {\r\n const [docX, docY] = d3.pointer(event, document);\r\n const [rectrX] = d3.pointer(event, mouseRect);\r\n const [nodeX, nodeY] = d3.pointer(event, node);\r\n const x = rectrX - (rectrX - nodeX);\r\n const left = nodeX + (docX - nodeX);\r\n const currIndex = Math.abs(xScale.invert(x));\r\n const positions: { [key: string]: { x: number; y: number } } = {};\r\n\r\n const getValue = (values: (number | null)[]) => {\r\n // The returning result is fixed for the task: https://jr.everpoint.ru/browse/PUB-5648\r\n // Before the task it was like this (and I don't know why):\r\n /* return !isVoid(values[Math.floor(currIndex + 1)])\r\n ? values[Math.floor(currIndex)]\r\n : null;*/\r\n\r\n return values[Math.floor(currIndex)];\r\n }\r\n\r\n lines.forEach((line, index) => {\r\n let pos = {\r\n x: 0,\r\n y: 0,\r\n };\r\n\r\n if (!line.hasAttribute('d') || argData[index].tooltipOff) {\r\n positions[index] = pos;\r\n return;\r\n }\r\n\r\n if (!dotSnapping) {\r\n let beginning = 0;\r\n let end = line.getTotalLength();\r\n let target = null;\r\n\r\n while (true) {\r\n target = Math.floor((beginning + end) / 2);\r\n pos = line.getPointAtLength(target);\r\n\r\n if ((target === end || target === beginning) && pos.x !== x) {\r\n break;\r\n }\r\n\r\n if (pos.x > x) {\r\n end = target;\r\n } else if (pos.x < x) {\r\n beginning = target;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n positions[index] = pos;\r\n } else {\r\n const [x1, x2] = xScale.range();\r\n const chartWidth = x2 - x1;\r\n const step = chartWidth / lastIndex;\r\n\r\n positions[index] = {\r\n x: x1 + Math.round(currIndex) * step,\r\n y: typeof argData[index].values[Math.round(currIndex)] === \"number\"\r\n ? yScale(argData[index].values[Math.round(currIndex)] as number)\r\n : 0,\r\n };\r\n }\r\n });\r\n\r\n circles\r\n .attr('transform', (lineChartData, index) => {\r\n const value = getValue(lineChartData.values);\r\n\r\n return positions[index] && value\r\n ? 'translate(' + (!dotSnapping ? x : positions[index].x) + ',' + positions[index].y + ')'\r\n : 'translate(-9999, -9999)';\r\n })\r\n .attr('style', ({ dynamicDotStyle }) => dynamicDotStyle || '');\r\n\r\n const datas = chartData.map(({ values, ...rest }, i) => ({\r\n ...rest,\r\n value: getValue(values),\r\n invertValue: positions[i] ? yScale.invert(positions[i].y) : 0,\r\n }));\r\n\r\n const noHasData = datas.every(({ value }) => isVoid(value));\r\n\r\n if (noHasData && isVisible) {\r\n setVisible();\r\n } else if (!isVisible && !noHasData) {\r\n setVisible(true);\r\n }\r\n\r\n const topIndex = Object.keys(positions).reduce((acc, key, index) => {\r\n const prevValue = datas[Number(acc)]?.value;\r\n const value = datas[Number(key)]?.value;\r\n const dynamicDotOff = argData?.[index].dynamicDotOff;\r\n\r\n return index === 0 || isVoid(value) || dynamicDotOff\r\n ? acc\r\n : isVoid(prevValue) || positions[acc].y > positions[key].y\r\n ? key\r\n : acc;\r\n }, '0');\r\n\r\n const labelTexts =\r\n labels &&\r\n labels\r\n .style('left', (_, i) => {\r\n return !dotSnapping ? `${left}px` : `${positions[i]?.x ?? 0}px`;\r\n })\r\n .style('top', (_, i) => {\r\n const index =\r\n typeof stackedTooltipIndex === 'number'\r\n ? stackedTooltipIndex\r\n : stackedTooltip\r\n ? topIndex\r\n : i;\r\n\r\n return `${(positions[index]?.y ?? 0) + (docY - nodeY)}px`;\r\n })\r\n .select(`.${lineChartClassNames.lineChartLabel}`);\r\n\r\n if (renderTooltip && labels) {\r\n labels.html((_, index) => {\r\n return ReactDOMServer.renderToString(\r\n <LabelContainer className={lineChartClassNames.lineChartLabelFlex}>\r\n {renderTooltip(datas, {\r\n indexX: Math.round(currIndex),\r\n indexY: index,\r\n svg,\r\n event,\r\n })}\r\n </LabelContainer>\r\n );\r\n });\r\n } else {\r\n labelTexts &&\r\n labelTexts.text((_, i) => {\r\n const value = datas[i].value;\r\n const invertValue = datas[i].invertValue;\r\n\r\n return formatDynamicTooltip\r\n ? formatDynamicTooltip(invertValue, value)\r\n : format(invertValue);\r\n });\r\n }\r\n\r\n mouseLine.attr('d', () => {\r\n let d = 'M' + x + ',' + y1;\r\n d += ' ' + x + ',' + (tooltipLineTop ? y2 : positions[topIndex]?.y || 0);\r\n return d;\r\n });\r\n };\r\n\r\n mouseRect.on('mouseover.tooltip', event => {\r\n labels = labelContainer\r\n .selectAll('div')\r\n .data(data)\r\n .join('div')\r\n .attr(\r\n 'class',\r\n `${lineChartClassNames.lineChartMouseLabel} ${tooltipClassName || ''}`\r\n )\r\n .style('opacity', '0')\r\n .style('position', 'absolute')\r\n .html(() => {\r\n const html = ReactDOMServer.renderToString(\r\n <LabelContainer className={lineChartClassNames.lineChartLabelFlex}>\r\n <Label className={lineChartClassNames.lineChartLabel} />\r\n </LabelContainer>\r\n );\r\n\r\n return html;\r\n });\r\n\r\n mouseMove(event);\r\n });\r\n\r\n mouseRect.on('mouseout.tooltip', () => {\r\n d3.select(`.${lineChartClassNames.lineChartMouseLabelContainer}`)\r\n .selectAll('*')\r\n .remove();\r\n setVisible();\r\n });\r\n\r\n mouseRect.on('touchmove.tooltip mousemove.tooltip', mouseMove);\r\n};\r\n","import React, { useEffect } from 'react';\r\n\r\nimport { LineChartProps } from './types';\r\n\r\nimport { useNode } from '../../hooks';\r\nimport { useResize } from '../../hooks';\r\n\r\nimport { draw } from './draw';\r\n\r\nimport { SvgWrapper, TooltipStyles } from './styled';\r\n\r\nexport const LineChart: React.FC<LineChartProps> = (\r\n props\r\n): React.ReactElement => {\r\n const { className, style, children } = props;\r\n const [ref, node] = useNode();\r\n\r\n useEffect(() => {\r\n node && draw(node, props);\r\n }, [node, props]);\r\n\r\n const onDraw = () => draw(node, props);\r\n\r\n useResize(props.width, onDraw);\r\n\r\n return (\r\n <div className={className} style={style}>\r\n <TooltipStyles />\r\n <SvgWrapper ref={ref}>{children}</SvgWrapper>\r\n </div>\r\n );\r\n};\r\n\r\nLineChart.defaultProps = {\r\n data: [],\r\n labels: [],\r\n height: 240,\r\n yAxisPadding: 10,\r\n xAxisPadding: 20,\r\n margin: {\r\n top: 10,\r\n right: 10,\r\n bottom: 10,\r\n left: 0,\r\n },\r\n dynamicCircleRadius: 4,\r\n stackedTooltip: false,\r\n};\r\n","import * as d3 from 'd3';\r\n\r\nimport { BarChartLineData } from '../types';\r\nimport { DrawLinesProps } from './types';\r\n\r\nexport const barChartLinesClassNames = {\r\n barChartLinesGlobal: 'barChartLinesGlobal',\r\n barChartLine: 'barChartLine',\r\n barChartAreasGlobal: 'barChartAreasGlobal',\r\n barChartArea: 'barChartArea',\r\n};\r\n\r\nexport const drawLines = ({\r\n svg,\r\n lineData,\r\n min,\r\n yScale,\r\n xScale,\r\n curve,\r\n stackedLine,\r\n}: DrawLinesProps) => {\r\n let linesSelection = null;\r\n let areasSelection = null;\r\n let area: d3.Area<[number, number]> | null = null;\r\n\r\n const line = d3\r\n .line()\r\n .defined(d => d !== null)\r\n .x(\r\n (_, index) =>\r\n (xScale((index as unknown) as string) as number) + bandwidth / 2\r\n )\r\n // @ts-ignore\r\n .y((d: number) => yScale(d))\r\n .curve(curve || d3.curveLinear);\r\n const bandwidth = xScale.bandwidth();\r\n\r\n const linesData = lineData.filter(({ lineType }) => lineType === 'line');\r\n const areasData = lineData.filter(({ lineType }) => lineType === 'area');\r\n\r\n if (linesData.length > 0) {\r\n linesSelection = svg\r\n .append('g')\r\n .attr('class', barChartLinesClassNames.barChartLinesGlobal)\r\n .selectAll('path')\r\n .data(linesData)\r\n .join('path')\r\n .attr('class', barChartLinesClassNames.barChartLine)\r\n .attr('d', (d: BarChartLineData) =>\r\n line(d.values as Iterable<[number, number]>)\r\n )\r\n .attr('stroke', ({ stroke }) => stroke || '')\r\n .attr('fill', ({ fill }) => fill || 'none');\r\n }\r\n\r\n if (areasData.length > 0) {\r\n let dataIndex = -2;\r\n\r\n area = d3\r\n .area()\r\n .x(\r\n (_, index) =>\r\n (xScale((index as unknown) as string) as number) + bandwidth / 2\r\n )\r\n .y0((_, index) => {\r\n if (index === 0) {\r\n dataIndex = dataIndex + 1;\r\n }\r\n\r\n return stackedLine\r\n ? dataIndex > -1\r\n ? yScale(\r\n typeof lineData[dataIndex].values[index] !== 'number'\r\n ? 0\r\n : (lineData[dataIndex].values[index] as number)\r\n )\r\n : yScale(min as number)\r\n : yScale(min as number);\r\n })\r\n // @ts-ignore\r\n .y1(d => yScale(d))\r\n .curve(curve || d3.curveLinear);\r\n\r\n areasSelection = svg\r\n .append('g')\r\n .attr('class', barChartLinesClassNames.barChartAreasGlobal)\r\n .selectAll('path')\r\n .data(areasData)\r\n .join('path')\r\n .attr('class', barChartLinesClassNames.barChartArea)\r\n .attr('d', (d: BarChartLineData | any) => area && area(d.values))\r\n .attr('fill', ({ fill }) => fill || 'none');\r\n }\r\n\r\n return {\r\n areasSelection,\r\n linesSelection,\r\n area,\r\n };\r\n};\r\n","import styled, { createGlobalStyle } from 'styled-components';\r\n\r\nimport { Wrapper } from '../../common/components/Wrapper';\r\nimport { barChartLinesClassNames } from './drawLines';\r\n\r\nconst tooltipClassnames = {\r\n barChartMouseRect: 'barChartMouseRect',\r\n barChartMouseContainer: 'barChartMouseContainer',\r\n barChartTooltipFlex: 'barChartTooltipFlex',\r\n barChartMouseTooltip: 'barChartMouseTooltip',\r\n barChartTooltip: 'barChartTooltip',\r\n barChartTooltipItem: 'barChartTooltipItem',\r\n barChartTooltipColFlex: 'barChartTooltipColFlex',\r\n barChartTooltipGroupName: 'barChartTooltipGroupName',\r\n barChartColorBox: 'barChartColorBox',\r\n barChartColorLine: 'barChartColorLine',\r\n barChartTooltipName: 'barChartTooltipName',\r\n barChartTooltipValue: 'barChartTooltipValue',\r\n};\r\n\r\nconst labelClassnames = {\r\n barChartLabelContainer: 'barChartLabelContainer',\r\n barChartLabelFlex: 'barChartLabelFlex',\r\n barChartLabel: 'barChartLabel',\r\n};\r\n\r\nexport const barChartClassNames = {\r\n barChartBarGlobal: 'barChartBarGlobal',\r\n barChartYScaleGlobal: 'barChartYScaleGlobal',\r\n barChartYAxis: 'barChartYAxis',\r\n barChartXAxis: 'barChartXAxis',\r\n barChartYAxisZeroTick: 'barChartYAxisZeroTick',\r\n barChartGridGlobal: 'barChartGridGlobal',\r\n barChartGridLineX: 'barChartGridLineX',\r\n barChartGridLineXZero: 'barChartGridLineXZero',\r\n barChartGridLineYZero: 'barChartGridLineYZero',\r\n barChartGridLineY: 'barChartGridLineY',\r\n barChartSelection: 'barChartSelection',\r\n ...tooltipClassnames,\r\n ...labelClassnames,\r\n ...barChartLinesClassNames,\r\n};\r\n\r\nexport const SvgWrapper = styled(Wrapper)<{ selectable?: boolean }>`\r\n display: ${({ selectable }) => selectable && \"inline-block\"};\r\n user-select: ${({ selectable }) => selectable && \"none\"};\r\n width: ${({ selectable }) => selectable && \"auto\"};\r\n\r\n line {\r\n stroke-width: 1px;\r\n shape-rendering: crispEdges;\r\n }\r\n\r\n .${barChartClassNames.barChartGridLineX},\r\n .${barChartClassNames.barChartGridLineY} {\r\n stroke: rgba(48, 69, 79, 0.06);\r\n }\r\n\r\n .${barChartClassNames.barChartMouseRect} {\r\n }\r\n\r\n .${barChartClassNames.barChartMouseRect} {\r\n fill: none;\r\n pointer-events: all;\r\n }\r\n\r\n .${barChartClassNames.barChartLinesGlobal} {\r\n stroke-width: 1.5px;\r\n stroke-linejoin: round;\r\n stroke-linecap: round;\r\n }\r\n\r\n .${barChartClassNames.barChartLine} {\r\n shape-rendering: auto;\r\n }\r\n\r\n .${barChartClassNames.barChartArea} {\r\n fill-opacity: 0.24;\r\n }\r\n\r\n .${barChartClassNames.barChartSelection} {\r\n position: absolute;\r\n top: 0;\r\n width: 0;\r\n background: rgba(0, 170, 255, 0.06);\r\n box-shadow: 1px 0 0 #00AAFF, -1px 0 0 #00AAFF;\r\n pointer-events: none;\r\n }\r\n`;\r\n\r\nexport const TooltipStyles = createGlobalStyle`\r\n .${barChartClassNames.barChartMouseTooltip} {\r\n z-index: 100;\r\n transition: all linear 144ms;\r\n\r\n .${barChartClassNames.barChartTooltipItem} {\r\n margin-bottom: 4px;\r\n :last-of-type {\r\n margin-bottom: 0;\r\n }\r\n }\r\n }\r\n`;\r\n","import * as d3 from 'd3';\r\n\r\nimport { barChartClassNames as classNames } from './styled';\r\nimport { drawGrid } from './drawGrid';\r\nimport { appendSvg } from '../../helpers';\r\nimport { computeDimensions } from '../../helpers/computeDimensions';\r\nimport { getDomain } from './getDomain';\r\nimport { marshaling } from './marshaling';\r\nimport { drawTooltip } from './drawTooltip';\r\nimport { resizeBarWidth } from './resizeBarWidth';\r\nimport { drawLines } from './drawLines';\r\nimport { getBars } from './getBars';\r\nimport { BarChartProps, BarChartData, BarChartMarshalledGroup } from './types';\r\n\r\nconst MIN_BAR_HEIGHT = 2;\r\n\r\nexport const draw = (node: HTMLElement | null, props: BarChartProps): void => {\r\n const {\r\n data,\r\n lineData = [],\r\n markers = [],\r\n barWidth: barWidthProp,\r\n barPadding,\r\n colors,\r\n margin,\r\n xAxisPadding,\r\n yAxisPadding,\r\n drawGridY,\r\n drawGridX,\r\n customYScale,\r\n customXScale,\r\n customYAxisLeft,\r\n customXAxisBottom,\r\n customYAxis,\r\n customXAxis,\r\n customBars,\r\n customize,\r\n dynamicTooltipEnable,\r\n hideTooltipGroupName,\r\n renderTooltip,\r\n labelPosition,\r\n renderLabel,\r\n tooltipY,\r\n tooltipBind,\r\n stackedLine,\r\n curve,\r\n formatTooltipValue,\r\n formatTooltipName,\r\n sectionPadding,\r\n minValuesLine,\r\n tooltipYDomain,\r\n marshalledMap,\r\n minValue,\r\n maxValue,\r\n minDomainValue,\r\n maxDomainValue,\r\n drawBars,\r\n setTooltipPosition,\r\n onLabelItem,\r\n isBarTooltip,\r\n xScaleItemWidth,\r\n tooltipRoot,\r\n tooltipClassName,\r\n onBarClick,\r\n onBarHover,\r\n } = props;\r\n\r\n if (node !== null && data.length) {\r\n const marginTop = margin ? margin.top : 0;\r\n const marginRight = margin ? margin.right : 0;\r\n const marginBottom = margin ? margin.bottom : 0;\r\n const marginLeft = margin ? margin.left : 0;\r\n const defaultBarWidth = 12;\r\n const { width: nodeWidth } = node.getBoundingClientRect();\r\n const width = props.width || nodeWidth;\r\n const height = props.height || 0;\r\n const barDomain = getDomain({\r\n data,\r\n minDomainValue,\r\n maxDomainValue,\r\n });\r\n\r\n const min =\r\n typeof minValue === 'number'\r\n ? minValue\r\n : Math.min(\r\n d3.min(lineData, ({ values }) => d3.min(values as number[])) ||\r\n Number.POSITIVE_INFINITY,\r\n barDomain.min || 0\r\n );\r\n const max =\r\n typeof maxValue === 'number'\r\n ? maxValue\r\n : Math.max(\r\n d3.max(lineData, ({ values }) => d3.max(values as number[])) ||\r\n Number.NEGATIVE_INFINITY,\r\n barDomain.max\r\n );\r\n const svg = appendSvg(node, width, height || 0);\r\n const yTicksCountDefault = 6;\r\n const labels = data.map((item: BarChartData) => item.groupName as string);\r\n let barWidth = barWidthProp || defaultBarWidth;\r\n\r\n const yScale = d3\r\n .scaleLinear()\r\n .domain([min, max])\r\n .range([\r\n height - marginTop - marginBottom - (xAxisPadding || 0),\r\n marginTop,\r\n ])\r\n .nice();\r\n\r\n customYScale && customYScale(yScale);\r\n\r\n const yTicks = yScale.ticks();\r\n const yAxisLeft = d3.axisLeft(yScale).ticks(yTicksCountDefault);\r\n\r\n customYAxisLeft && customYAxisLeft(yAxisLeft);\r\n\r\n const yTicksCount = yAxisLeft.tickArguments()[0];\r\n\r\n const yAxis = svg\r\n .append('g')\r\n .attr('class', classNames.barChartYAxis)\r\n .call(yAxisLeft);\r\n\r\n yAxis.selectAll('.tick').attr('class', value => {\r\n return value === 0 ? `tick ${classNames.barChartYAxisZeroTick}` : 'tick';\r\n });\r\n\r\n customYAxis && customYAxis(yAxis);\r\n\r\n const { width: yAxisWidth } = computeDimensions(yAxis);\r\n const range = [\r\n marginLeft + yAxisWidth + (yAxisPadding || 0),\r\n width - marginRight,\r\n ];\r\n\r\n const xScale = d3\r\n .scaleBand()\r\n .domain(d3.range(data.length) as [])\r\n .range(range);\r\n\r\n barWidth = resizeBarWidth({\r\n data,\r\n sectionPadding,\r\n range,\r\n barWidth,\r\n barPadding,\r\n });\r\n\r\n customXScale && customXScale(xScale);\r\n\r\n const [x1, x2] = xScale.range();\r\n\r\n const xAxisBottom = d3\r\n .axisBottom(xScale)\r\n .tickFormat(value => labels[Number(value)]);\r\n\r\n if (typeof xScaleItemWidth === 'number') {\r\n xAxisBottom\r\n .tickValues(\r\n xScale.domain().filter((_, i, array) => {\r\n const chartWidth = x2 - x1;\r\n const ticks = Math.round(chartWidth / xScaleItemWidth);\r\n const length = array.length;\r\n const divider = Math.round(length / ticks);\r\n\r\n return !(i % divider);\r\n })\r\n )\r\n .tickSizeOuter(0);\r\n }\r\n\r\n customXAxisBottom && customXAxisBottom(xAxisBottom, { node, labels });\r\n\r\n const xAxis = svg\r\n .append('g')\r\n .call(xAxisBottom)\r\n .attr('class', classNames.barChartXAxis);\r\n\r\n customXAxis && customXAxis(xAxis);\r\n\r\n const marshalled = marshaling({\r\n data,\r\n yScale,\r\n xScale,\r\n barWidth,\r\n barPadding: typeof barPadding === 'number' ? barPadding : 0,\r\n colors,\r\n marginTop,\r\n });\r\n\r\n const marshalledData = marshalledMap\r\n ? marshalledMap(marshalled)\r\n : marshalled;\r\n\r\n yAxis.attr('transform', `translate( ${marginLeft + yAxisWidth}, 0)`);\r\n\r\n drawGrid({\r\n svg,\r\n yScale,\r\n xScale,\r\n yTicksCount,\r\n drawGridY,\r\n drawGridX,\r\n });\r\n\r\n xAxis.attr(\r\n 'transform',\r\n `translate(0, ${yScale(yTicks[0]) + (xAxisPadding || 0)})`\r\n );\r\n\r\n svg.append('defs')\r\n .append('mask')\r\n .attr('id', 'height-limit-mask')\r\n .append('rect')\r\n .attr('width', '100%')\r\n .attr('height', height - marginBottom + MIN_BAR_HEIGHT)\r\n .attr('fill', 'white');\r\n\r\n const gSvg = svg.append('g')\r\n .attr('class', classNames.barChartBarGlobal)\r\n .attr('mask', 'url(#height-limit-mask)');\r\n\r\n const groups = gSvg\r\n .selectAll('g')\r\n .data(marshalledData)\r\n .enter()\r\n .append('g')\r\n .attr(\r\n 'transform',\r\n (_: BarChartMarshalledGroup[], i) =>\r\n `translate(${Math.round(\r\n xScale((i as unknown) as string) as number\r\n )},${-(marginTop || 0)})`\r\n );\r\n\r\n const bars = drawBars\r\n ? drawBars({ groups, yScale, marshalledData, barWidth })\r\n : getBars({ groups, barWidth });\r\n\r\n markers.forEach((marker) => {\r\n if (!marker) {\r\n return;\r\n }\r\n\r\n if (marker.horizontal) {\r\n if (marker.line) {\r\n svg.append('line')\r\n .style(\"stroke\", marker.lineColor || marker.color || \"inherit\")\r\n .style(\"stroke-width\", 1)\r\n .style(\"stroke-dasharray\", (\"5, 3\"))\r\n .attr(\"x1\", marginLeft + yAxisWidth)\r\n .attr(\"y1\", yScale(marker.value) + 1)\r\n .attr(\"x2\", width)\r\n .attr(\"y2\", yScale(marker.value) + 1);\r\n }\r\n\r\n svg.append(\"text\")\r\n .attr(\"y\", yScale(marker.value) + 1)\r\n .attr(\"x\", marginLeft + yAxisWidth)\r\n .attr('text-anchor', 'middle')\r\n .attr(\"class\", [\"marker\", marker.className].filter(Boolean).join(\" \"))\r\n .style(\"fill\", marker?.color || \"inherit\")\r\n .text(marker.label);\r\n\r\n return;\r\n }\r\n\r\n if (marker.line) {\r\n svg.append('line')\r\n .style(\"stroke\", marker.lineColor || marker.color || \"inherit\")\r\n .style(\"stroke-width\", 1)\r\n .style(\"stroke-dasharray\", (\"5, 3\"))\r\n .attr(\"x1\", width / data.length * marker.value + 1)\r\n .attr(\"y1\", 0)\r\n .attr(\"x2\", width / data.length * marker.value + 1)\r\n .attr(\"y2\", (height - marginTop - marginBottom + 8));\r\n }\r\n\r\n svg.append(\"text\")\r\n .attr(\"y\", height - 2)\r\n .attr(\"x\", width / data.length * marker.value + 1)\r\n .attr('text-anchor', marker.align === 'right' ? 'end' : marker.align === 'left' ? 'start' : 'middle')\r\n .attr(\"class\", [\"marker\", marker.className].filter(Boolean).join(\" \"))\r\n .style(\"fill\", marker?.color || \"inherit\")\r\n .text(marker.label);\r\n });\r\n\r\n let lines = null;\r\n\r\n if (Array.isArray(lineData) && lineData.length > 0) {\r\n lines = drawLines({\r\n svg,\r\n lineData,\r\n xScale,\r\n yScale,\r\n min: typeof minValuesLine === 'number' ? minValuesLine : min,\r\n stackedLine,\r\n curve,\r\n });\r\n }\r\n\r\n customBars && customBars({ bars, yScale, lines, marshalledData, lineData });\r\n\r\n if (dynamicTooltipEnable || labelPosition) {\r\n drawTooltip({\r\n svg,\r\n node,\r\n xScale,\r\n yScale,\r\n marshalledData,\r\n data,\r\n lineData,\r\n renderTooltip,\r\n labelPosition,\r\n marginTop,\r\n renderLabel,\r\n barWidth,\r\n barPadding,\r\n dynamicTooltipEnable,\r\n hideTooltipGroupName,\r\n tooltipY,\r\n tooltipBind,\r\n formatTooltipValue,\r\n formatTooltipName,\r\n tooltipYDomain,\r\n setTooltipPosition,\r\n onLabelItem,\r\n isBarTooltip,\r\n bars: groups,\r\n tooltipRoot,\r\n tooltipClassName,\r\n onBarClick,\r\n onBarHover,\r\n });\r\n }\r\n\r\n customize && customize({ svg, marshalledData, yScale, xScale, lineData });\r\n }\r\n};\r\n","import { BarChartProps } from './types';\r\n\r\nexport const getDomain = ({\r\n data,\r\n minDomainValue,\r\n maxDomainValue,\r\n}: Pick<BarChartProps, 'data' | 'minDomainValue' | 'maxDomainValue'>) => {\r\n let MIN = Number.POSITIVE_INFINITY;\r\n let MAX = Number.NEGATIVE_INFINITY;\r\n\r\n data.forEach(({ groupName, ...groups }) => {\r\n let groupMax = 0;\r\n let groupMin = 0;\r\n\r\n Object.keys(groups).forEach(key => {\r\n const group = groups[key as never];\r\n\r\n let stackMax = 0;\r\n let stackMin = 0;\r\n\r\n Object.keys(group).forEach(groupKey => {\r\n const value = group[groupKey];\r\n\r\n if (value > 0) {\r\n stackMax += value;\r\n } else {\r\n stackMin += value;\r\n }\r\n });\r\n\r\n groupMax = Math.min(groupMax, stackMin);\r\n groupMin = Math.max(groupMin, stackMax);\r\n });\r\n\r\n MIN = Math.min(MIN, groupMax);\r\n MAX = Math.max(MAX, groupMin);\r\n });\r\n\r\n if (MIN === 0 && MAX === 0) {\r\n return {\r\n min: typeof minDomainValue === 'number' ? minDomainValue : 0,\r\n max: typeof maxDomainValue === 'number' ? maxDomainValue : 1,\r\n };\r\n }\r\n\r\n return {\r\n min: typeof minDomainValue === 'number' ? minDomainValue : MIN,\r\n max: typeof maxDomainValue === 'number' ? maxDomainValue : MAX,\r\n };\r\n};\r\n","import { ResizeBarWidthProps } from './types';\r\n\r\nexport const resizeBarWidth = ({\r\n data,\r\n range,\r\n barWidth,\r\n barPadding,\r\n sectionPadding,\r\n}: ResizeBarWidthProps): number => {\r\n const groupPadding = typeof sectionPadding === 'number' ? sectionPadding : 0;\r\n const chartWidth = range[1] - range[0];\r\n const barsWidth = data.reduce((acc, { groupName, ...curr }) => {\r\n return (\r\n acc +\r\n Object.keys(curr).reduce(\r\n (acc, _key, index) =>\r\n index > 0\r\n ? acc + (barWidth || 0) + (barPadding || 0)\r\n : acc + barWidth,\r\n 0\r\n ) +\r\n groupPadding\r\n );\r\n }, groupPadding);\r\n\r\n if (chartWidth < barsWidth) {\r\n return Math.floor(barWidth * (chartWidth / barsWidth));\r\n }\r\n\r\n return barWidth;\r\n};\r\n","import { BarChartMarshalledGroup, BarChartMarshaling } from './types';\r\n\r\nexport const marshaling = ({\r\n data,\r\n yScale,\r\n xScale,\r\n barWidth,\r\n barPadding,\r\n colors,\r\n marginTop,\r\n}: BarChartMarshaling): BarChartMarshalledGroup[][] =>\r\n data.map(({ groupName, ...groups }, groupIndex) => {\r\n const marshalledGroup: BarChartMarshalledGroup[] = [];\r\n const hundred = 100;\r\n const bandwidth = xScale.bandwidth();\r\n const groupsKeys = Object.keys(groups);\r\n\r\n groupsKeys.forEach((key: string, stackIndex: number) => {\r\n const group = groups[key as never];\r\n const groupKeys = Object.keys(group);\r\n const barGroupWidth =\r\n ((barWidth as number) + (barPadding as number)) * groupsKeys.length -\r\n (groupKeys.length > 1 ? (barPadding as number) : 0);\r\n\r\n let stackMax = 0;\r\n let stackMin = 0;\r\n\r\n groupKeys.forEach(groupKey => {\r\n const value = group[groupKey];\r\n const color = colors[groupKey];\r\n const x =\r\n ((barWidth as number) + (barPadding as number)) * stackIndex +\r\n bandwidth / 2 -\r\n barGroupWidth / 2;\r\n const isPositiveValue = value > 0;\r\n const height = isPositiveValue\r\n ? Math.abs(\r\n ((yScale(stackMax - value) - yScale(stackMax) + Number.EPSILON) *\r\n hundred) /\r\n hundred\r\n )\r\n : Math.abs(\r\n ((yScale(stackMin - value) - yScale(stackMin) + Number.EPSILON) *\r\n hundred) /\r\n hundred\r\n );\r\n\r\n if (isPositiveValue) {\r\n stackMax += value;\r\n }\r\n\r\n const y = isPositiveValue\r\n ? ((yScale(stackMax) + Number.EPSILON) * hundred) / hundred\r\n : yScale(stackMin) - yScale(0) + yScale(0);\r\n\r\n marshalledGroup.push({\r\n x,\r\n y: y + (marginTop || 0),\r\n height,\r\n color,\r\n value,\r\n groupName: groupName as string,\r\n name: groupKey,\r\n stackIndex,\r\n groupIndex,\r\n });\r\n\r\n if (!isPositiveValue) {\r\n stackMin += value;\r\n }\r\n });\r\n });\r\n\r\n return marshalledGroup;\r\n });\r\n","import { BarChartData } from '../types';\r\nimport { DrawGridProps } from './types';\r\n\r\nimport { barChartClassNames } from '../styled';\r\n\r\nexport const drawGrid = ({\r\n svg,\r\n yScale,\r\n xScale,\r\n yTicksCount,\r\n drawGridX,\r\n drawGridY,\r\n}: DrawGridProps) => {\r\n if (!drawGridY && !drawGridX) return;\r\n\r\n const global = svg\r\n .append('g')\r\n .attr('class', barChartClassNames.barChartGridGlobal);\r\n\r\n const yTicks = yScale.ticks(yTicksCount);\r\n const range = xScale.range();\r\n const domain = xScale.domain();\r\n\r\n if (drawGridX) {\r\n global\r\n .append('g')\r\n .selectAll('line')\r\n .data(yTicks)\r\n .join('line')\r\n .attr('class', d =>\r\n d === 0\r\n ? `${barChartClassNames.barChartGridLineX} ${barChartClassNames.barChartGridLineXZero}`\r\n : barChartClassNames.barChartGridLineX\r\n )\r\n .attr('x1', () => range[0])\r\n .attr('x2', () => range[1])\r\n .attr('y1', (d: BarChartData | any) => Math.round(yScale(d) as number))\r\n .attr('y2', (d: BarChartData | any) => Math.round(yScale(d) as number));\r\n }\r\n\r\n if (drawGridY) {\r\n const getX = (index: number) =>\r\n domain[index] !== void 0\r\n ? index === 0\r\n ? range[0]\r\n : Math.round(\r\n xScale.step() * index +\r\n range[0] -\r\n (xScale.step() / 2) * xScale.padding()\r\n )\r\n : range[1];\r\n\r\n global\r\n .append('g')\r\n .selectAll('line')\r\n .data(Array.from({ length: domain.length + 1 }, (_, index) => index))\r\n .join('line')\r\n .attr('class', d =>\r\n d === 0\r\n ? `${barChartClassNames.barChartGridLineY} ${barChartClassNames.barChartGridLineYZero}`\r\n : barChartClassNames.barChartGridLineY\r\n )\r\n .attr('x1', getX)\r\n .attr('x2', getX)\r\n .attr('y1', () => Math.round(yScale(yTicks[0]) as number))\r\n .attr('y2', () =>\r\n Math.round(yScale(yTicks[yTicks.length - 1]) as number)\r\n );\r\n }\r\n};\r\n","import { BarChartMarshalledGroup } from '../types';\r\nimport { GetBarsProps } from './types';\r\n\r\nexport const getBars = ({ groups, barWidth }: GetBarsProps) => {\r\n return groups\r\n .selectAll('rect')\r\n .data((item: BarChartMarshalledGroup[]) => item)\r\n .join('rect')\r\n .attr('x', (item: BarChartMarshalledGroup) => item.x)\r\n .attr('y', (item: BarChartMarshalledGroup) => item.y)\r\n .attr('width', barWidth)\r\n .attr('height', (item: BarChartMarshalledGroup) => item.height)\r\n .style('fill', (item: BarChartMarshalledGroup) => item.color);\r\n};\r\n","import React from 'react';\r\nimport * as d3 from 'd3';\r\nimport ReactDOMServer from 'react-dom/server';\r\n\r\nimport { DrawTooltipProps } from './types';\r\nimport {\r\n BarChartMarshalledGroup,\r\n BarChartLineData,\r\n BarChartMergedData,\r\n} from '../types';\r\n\r\nimport { getLabelY } from './getLabelY';\r\nimport { getLabel } from './getLabel';\r\nimport { barChartClassNames } from '../styled';\r\nimport {\r\n TooltipFlex,\r\n TooltipGroupName,\r\n LabelFlex,\r\n LabelFlexCenter,\r\n TooltipContainer,\r\n TooltipItem,\r\n ColFlex,\r\n ColorBox,\r\n ColorLine,\r\n Name,\r\n Value,\r\n} from '../../../common/components/tooltips';\r\n\r\nexport const drawTooltip = ({\r\n svg,\r\n node,\r\n data,\r\n marshalledData,\r\n xScale,\r\n yScale,\r\n renderTooltip,\r\n labelPosition,\r\n marginTop,\r\n renderLabel,\r\n barWidth,\r\n barPadding,\r\n dynamicTooltipEnable,\r\n hideTooltipGroupName,\r\n tooltipY,\r\n tooltipBind,\r\n lineData,\r\n formatTooltipValue,\r\n formatTooltipName,\r\n tooltipYDomain,\r\n setTooltipPosition,\r\n onLabelItem,\r\n isBarTooltip,\r\n bars,\r\n tooltipRoot,\r\n tooltipClassName,\r\n onBarClick,\r\n onBarHover,\r\n}: DrawTooltipProps) => {\r\n d3.select(node)\r\n .select(`.${barChartClassNames.barChartMouseContainer}`)\r\n .remove();\r\n\r\n const xScaleBandDomain = xScale.domain();\r\n const [x1, x2] = xScale.range();\r\n const [y1, y2] = yScale.range();\r\n const bandwidth = xScale.bandwidth();\r\n const format = d3.format(',');\r\n\r\n const getX = (index: number): number =>\r\n xScaleBandDomain[index] !== void 0\r\n ? index === 0\r\n ? x1\r\n : Math.round(\r\n xScale.step() * index + x1 - (xScale.step() / 2) * xScale.padding()\r\n )\r\n : x2;\r\n const groups = xScaleBandDomain.map(value => getX(Number(value) + 1));\r\n\r\n const topYDomain = tooltipYDomain\r\n ? tooltipYDomain({ data: marshalledData, lineData, yScale })\r\n : marshalledData.reduce((acc, curr, index) => {\r\n const lineMin =\r\n d3.min(lineData as BarChartLineData[], ({ values }) =>\r\n typeof values[index] === 'number'\r\n ? yScale((values[index] || 0) - y2)\r\n : Number.POSITIVE_INFINITY\r\n ) || Number.POSITIVE_INFINITY;\r\n\r\n acc.push(\r\n curr.reduce(\r\n (acc, { y }) => Math.min(acc, y, lineMin as number),\r\n Number.POSITIVE_INFINITY\r\n ) as any\r\n );\r\n return acc;\r\n }, []);\r\n\r\n const mouseGlobal = svg.append('g').attr('class', 'lineChartMouseGlobal');\r\n const mouseRect = mouseGlobal\r\n .append('rect')\r\n .attr('width', x2 - x1)\r\n .attr('height', Math.abs(y1 - y2))\r\n .attr('class', barChartClassNames.barChartMouseRect)\r\n .attr('transform', `translate(${x1}, ${y2})`);\r\n\r\n if (dynamicTooltipEnable) {\r\n const tooltipContainer: Element | null =\r\n tooltipRoot || document.querySelector('body');\r\n let tooltip: d3.Selection<any, unknown, any, any> = d3.select(\r\n `.${barChartClassNames.barChartMouseTooltip}`\r\n );\r\n\r\n if (tooltip.size() === 0) {\r\n tooltip = d3\r\n .select(tooltipContainer)\r\n .append('div')\r\n .attr('class', barChartClassNames.barChartMouseTooltip)\r\n .style('opacity', '0')\r\n .style('position', 'absolute')\r\n .html(() => {\r\n const html = ReactDOMServer.renderToString(\r\n <TooltipFlex className={barChartClassNames.barChartTooltipFlex} />\r\n );\r\n\r\n return html;\r\n });\r\n }\r\n\r\n const barChartTootipFlex = tooltip.select(\r\n `.${barChartClassNames.barChartTooltipFlex}`\r\n );\r\n\r\n let isVisible = false;\r\n let flagCurrIndex: number | null = null;\r\n\r\n const setVisible = (visible?: boolean) => {\r\n isVisible = Boolean(visible);\r\n\r\n const opacity = isVisible ? '1' : '0';\r\n tooltip.style('opacity', opacity);\r\n\r\n if (!isVisible) {\r\n tooltip.attr('class', barChartClassNames.barChartMouseTooltip);\r\n flagCurrIndex = null;\r\n tooltip.style('transition', 'none');\r\n tooltip.style('top', null);\r\n tooltip.style('left', null);\r\n } else {\r\n tooltip.attr(\r\n 'class',\r\n `${barChartClassNames.barChartMouseTooltip} ${tooltipClassName || ''}`\r\n );\r\n tooltip.style('transition', null);\r\n }\r\n };\r\n\r\n mouseRect.on('mouseout.tooltip', () => setVisible());\r\n mouseRect.on('touchmove.tooltip mousemove.tooltip', event => {\r\n const [docX, docY] = d3.pointer(event, document);\r\n const [rectrX] = d3.pointer(event, mouseRect);\r\n const [nodeX, nodeY] = d3.pointer(event, node);\r\n const x = rectrX - (rectrX - nodeX);\r\n const offsetX = docX - nodeX;\r\n const offsetY = docY - nodeY;\r\n\r\n const currIndex = groups.findIndex(value => x <= value);\r\n\r\n if (isBarTooltip) {\r\n const containts = document.elementsFromPoint(\r\n event.clientX,\r\n event.clientY\r\n );\r\n const currBars = d3\r\n .select(bars.nodes()[currIndex])\r\n .selectAll('rect')\r\n .nodes();\r\n const isContains = containts.some(item => currBars.includes(item));\r\n\r\n if (!isContains) {\r\n if (isVisible) {\r\n setVisible(false);\r\n }\r\n mouseRect.style('cursor', 'default');\r\n return;\r\n } else {\r\n mouseRect.style('cursor', 'pointer');\r\n }\r\n }\r\n\r\n const top =\r\n (typeof tooltipY === 'number'\r\n ? tooltipY\r\n : ((topYDomain[currIndex] as unknown) as number) - y2) + offsetY;\r\n const left =\r\n (tooltipBind\r\n ? (xScale((currIndex as unknown) as string) || 0) + bandwidth / 2\r\n : x) + offsetX;\r\n\r\n if (tooltipBind && flagCurrIndex === currIndex) {\r\n return;\r\n }\r\n\r\n let currData = marshalledData[currIndex] as BarChartMergedData;\r\n if (Array.isArray(currData) && currData.length === 0) {\r\n return;\r\n }\r\n\r\n if (lineData) {\r\n const currLineData = lineData.map(({ values, ...rest }) => ({\r\n ...rest,\r\n value: values[currIndex],\r\n groupName: data[currIndex] && data[currIndex].groupName,\r\n }));\r\n\r\n if (Array.isArray(currLineData) && Array.isArray(currData)) {\r\n currData = currData.concat(currLineData as BarChartMergedData);\r\n }\r\n }\r\n\r\n const svgWidth = (svg.node() as SVGElement).getBoundingClientRect()\r\n .width as number;\r\n\r\n if (typeof setTooltipPosition === 'function') {\r\n setTooltipPosition({\r\n left,\r\n top,\r\n tooltip,\r\n svgWidth,\r\n });\r\n } else if (!setTooltipPosition) {\r\n tooltip.style('left', `${left}px`).style('top', `${top}px`);\r\n }\r\n\r\n if (renderTooltip) {\r\n barChartTootipFlex.html(() => {\r\n const html = ReactDOMServer.renderToString(\r\n <>\r\n {renderTooltip(\r\n currData,\r\n setTooltipPosition\r\n ? {\r\n left,\r\n top,\r\n tooltip,\r\n svgWidth,\r\n }\r\n : undefined,\r\n barWidth\r\n )}\r\n </>\r\n );\r\n\r\n return html;\r\n });\r\n } else {\r\n if (!isVisible) {\r\n setVisible(true);\r\n }\r\n\r\n barChartTootipFlex.html(() => {\r\n const html = ReactDOMServer.renderToString(\r\n <TooltipContainer className={barChartClassNames.barChartTooltip}>\r\n {currData && currData[0] && !hideTooltipGroupName && (\r\n <TooltipGroupName\r\n className={barChartClassNames.barChartTooltipGroupName}\r\n >\r\n {currData[0].groupName}\r\n </TooltipGroupName>\r\n )}\r\n {currData &&\r\n currData.map(\r\n ({ name, value, stroke, fill, color, lineType }) => (\r\n <TooltipItem\r\n key={name}\r\n className={barChartClassNames.barChartTooltipItem}\r\n >\r\n <ColFlex\r\n className={barChartClassNames.barChartTooltipColFlex}\r\n >\r\n {lineType ? (\r\n <ColorLine\r\n className={barChartClassNames.barChartColorLine}\r\n style={{ backgroundColor: stroke || fill }}\r\n />\r\n ) : (\r\n <ColorBox\r\n className={barChartClassNames.barChartColorBox}\r\n style={{ backgroundColor: color }}\r\n />\r\n )}\r\n <Name\r\n className={barChartClassNames.barChartTooltipName}\r\n >\r\n {formatTooltipName ? formatTooltipName(name) : name}\r\n </Name>\r\n </ColFlex>\r\n <Value\r\n className={barChartClassNames.barChartTooltipValue}\r\n >\r\n {formatTooltipValue\r\n ? formatTooltipValue(value, name)\r\n : format(value)}\r\n </Value>\r\n </TooltipItem>\r\n )\r\n )}\r\n </TooltipContainer>\r\n );\r\n\r\n return html;\r\n });\r\n }\r\n\r\n flagCurrIndex = currIndex;\r\n if (!isVisible) {\r\n setVisible(true);\r\n }\r\n });\r\n }\r\n\r\n const container = d3\r\n .select(node)\r\n .append('div')\r\n .attr('class', barChartClassNames.barChartMouseContainer);\r\n\r\n const labelContainer = container\r\n .append('div')\r\n .attr('class', barChartClassNames.barChartLabelContainer)\r\n .style('position', 'absolute')\r\n .style('top', `${y2}px`);\r\n\r\n const isMouseWithin = (e: MouseEvent, callback: (group: BarChartMarshalledGroup) => void) => {\r\n const [rectrX, rectrY] = d3.pointer(e, mouseRect);\r\n const [nodeX, nodeY] = d3.pointer(e, node);\r\n const x = rectrX - (rectrX - nodeX);\r\n const y = rectrY - nodeY;\r\n\r\n const currIndex = groups.findIndex(value => x <= value);\r\n const dataItem = marshalledData[currIndex][0];\r\n\r\n if (dataItem.height >= y1 - y) {\r\n callback(dataItem);\r\n }\r\n };\r\n\r\n mouseGlobal\r\n .on(\"click\", e => isMouseWithin(e, (dataItem) => onBarClick && onBarClick(dataItem)))\r\n .on(\"mousemove\", e => isMouseWithin(e, (dataItem) => onBarHover && onBarHover(dataItem)))\r\n .on(\"mouseleave\", () => onBarHover && onBarHover(undefined));\r\n\r\n if (labelPosition) {\r\n const concatedData: BarChartMarshalledGroup[][] = lineData\r\n ? marshalledData.map((stack, index) =>\r\n stack.concat(\r\n lineData.map(({ values, name, stroke }) => {\r\n const { stacksCount } = stack.reduce(\r\n (acc, { stackIndex }) => {\r\n const { indexFlag, stacksCount } = acc;\r\n if (stackIndex !== indexFlag) {\r\n return {\r\n indexFlag: stackIndex,\r\n stacksCount: stacksCount + 1,\r\n };\r\n }\r\n return acc;\r\n },\r\n {\r\n indexFlag: -1,\r\n stacksCount: 0,\r\n }\r\n );\r\n const barsWidth =\r\n (barWidth * stacksCount +\r\n (barPadding || 0) * (stacksCount - 1)) /\r\n 2;\r\n\r\n return {\r\n x: stack[0].x - barWidth / 2 + barsWidth,\r\n y: yScale(values[index] as number) + marginTop,\r\n height: 0,\r\n color: stroke,\r\n value: values[index],\r\n groupName: stack[0].groupName,\r\n name,\r\n stackIndex: 0,\r\n groupIndex: index,\r\n };\r\n }) as BarChartMarshalledGroup[]\r\n )\r\n )\r\n : marshalledData;\r\n\r\n const groups = labelContainer\r\n .selectAll('div')\r\n .data(concatedData)\r\n .enter()\r\n .append('div')\r\n .style('position', 'absolute')\r\n .style(\r\n 'transform',\r\n (_: BarChartMarshalledGroup[], index) =>\r\n `translate(${Math.round(\r\n xScale((index as unknown) as string) as number\r\n )}px,${-(marginTop || 0)}px)`\r\n );\r\n\r\n const LabelFlexStyled =\r\n labelPosition === 'center' ? LabelFlexCenter : LabelFlex;\r\n\r\n const LabelStyle = getLabel(labelPosition);\r\n\r\n groups\r\n .selectAll('span')\r\n .data((item: BarChartMarshalledGroup[]) =>\r\n onLabelItem ? onLabelItem(item) : item\r\n )\r\n .join('div')\r\n .style('left', item => `${Math.round(item.x + barWidth / 2)}px`)\r\n .style(\r\n 'top',\r\n (item: BarChartMarshalledGroup) =>\r\n `${getLabelY(labelPosition, y2, item)}px`\r\n )\r\n .style('position', 'absolute')\r\n .html((item: BarChartMarshalledGroup) =>\r\n ReactDOMServer.renderToString(\r\n <LabelFlexStyled className={barChartClassNames.barChartLabelFlex}>\r\n {renderLabel ? (\r\n renderLabel({ ...item, barWidth })\r\n ) : (\r\n <LabelStyle className={barChartClassNames.barChartLabel}>\r\n {format(item.value)}\r\n </LabelStyle>\r\n )}\r\n </LabelFlexStyled>\r\n )\r\n );\r\n }\r\n};\r\n","import { BarChartLabelPosition } from '../types';\r\n\r\nimport {\r\n Label as LabelUI,\r\n LabelTop,\r\n LabelBottom,\r\n} from '../../../common/components/tooltips';\r\n\r\nexport const getLabel = (labelPosition: BarChartLabelPosition) => {\r\n switch (labelPosition) {\r\n case 'top':\r\n return LabelTop;\r\n case 'bottom':\r\n return LabelBottom;\r\n default:\r\n return LabelUI;\r\n }\r\n};\r\n","import { BarChartLabelPosition, BarChartMarshalledGroup } from '../types';\r\n\r\nexport const getLabelY = (\r\n labelPosition: BarChartLabelPosition,\r\n y2: number,\r\n item: BarChartMarshalledGroup\r\n): number => {\r\n switch (labelPosition) {\r\n case 'center':\r\n return item.y + item.height / 2 - y2;\r\n case 'bottom':\r\n return item.y + item.height - y2;\r\n default:\r\n return item.y;\r\n }\r\n};\r\n","import React, { FC, useEffect } from 'react';\r\n\r\nimport { SvgWrapper, TooltipStyles } from './styled';\r\n\r\nimport { useNode } from '../../hooks';\r\nimport { useResize } from '../../hooks';\r\nimport { useSelection } from \"./hooks/useSelection\";\r\n\r\nimport { draw } from './draw';\r\n\r\nimport { BarChartProps } from './types';\r\n\r\nexport const BarChart: FC<BarChartProps> = (props) => {\r\n const { className, style, children, selectable } = props;\r\n const [ref, node] = useNode();\r\n\r\n useEffect(() => {\r\n node && draw(node, props);\r\n }, [node, props]);\r\n\r\n const onDraw = () => draw(node, props);\r\n\r\n useResize(props.width, onDraw);\r\n useSelection(selectable ? node : null, props);\r\n\r\n return (\r\n <div className={className} style={style}>\r\n <TooltipStyles />\r\n <SvgWrapper ref={ref} selectable={selectable}>{children}</SvgWrapper>\r\n </div>\r\n );\r\n};\r\n\r\nBarChart.defaultProps = {\r\n data: [],\r\n colors: {},\r\n margin: {\r\n top: 10,\r\n right: 10,\r\n bottom: 10,\r\n left: 0,\r\n },\r\n barWidth: 12,\r\n barPadding: 0,\r\n height: 320,\r\n yAxisPadding: 0,\r\n xAxisPadding: 0,\r\n tooltipBind: true,\r\n sectionPadding: 1,\r\n};\r\n","import { useCallback, useEffect, useRef } from \"react\";\r\n\r\nimport { barChartClassNames } from \"../styled\";\r\n\r\nimport { BarChartProps } from \"../types\";\r\n\r\nexport const useSelection = (node: HTMLElement | null, props: BarChartProps) => {\r\n const drawing = useRef<boolean>(false);\r\n const startX = useRef<number>(0);\r\n const selection = useRef<HTMLDivElement | undefined>();\r\n\r\n const clearSelection = useCallback(() => {\r\n if (node && selection.current) {\r\n drawing.current = false;\r\n\r\n node.removeChild(selection.current);\r\n\r\n selection.current = undefined;\r\n }\r\n }, [node]);\r\n\r\n const onStartDrawing = useCallback((e) => {\r\n const isTouch = Boolean(e.touches);\r\n\r\n e.stopPropagation();\r\n\r\n if (node && e.which !== 3) {\r\n clearSelection();\r\n\r\n selection.current = document.createElement(\"div\");\r\n selection.current.setAttribute(\"class\", barChartClassNames.barChartSelection);\r\n selection.current.setAttribute(\"style\", `height: calc(100% - ${props.margin?.bottom ?? 0}px)`);\r\n\r\n node.appendChild(selection.current);\r\n\r\n drawing.current = true;\r\n startX.current = isTouch\r\n ? (e.touches[0]?.pageX - (node.firstChild as HTMLElement).getBoundingClientRect().left)\r\n : e.offsetX;\r\n selection.current.style.display = \"block\";\r\n selection.current.style.width = \"0px\";\r\n selection.current.style.left = `${startX.current}px`;\r\n }\r\n }, [node]);\r\n\r\n const onDraw = useCallback((e) => {\r\n const isTouch = Boolean(e.touches);\r\n\r\n e.stopPropagation();\r\n\r\n if (node && drawing.current && selection.current) {\r\n const nodeWidth = (node.firstChild as HTMLElement).getBoundingClientRect().width;\r\n const offsetX = isTouch\r\n ? (e.touches[0]?.pageX - (node.firstChild as HTMLElement).getBoundingClientRect().left)\r\n : e.offsetX;\r\n const newWidth = offsetX - startX.current;\r\n\r\n if (offsetX >= 0) {\r\n if (newWidth > 0) {\r\n selection.current.style.marginLeft = \"0px\";\r\n selection.current.style.width = offsetX <= nodeWidth ? `${newWidth}px` : `${nodeWidth - startX.current}px`;\r\n } else {\r\n selection.current.style.right = `${nodeWidth - startX.current}px`;\r\n selection.current.style.width = `${Math.abs(newWidth)}px`;\r\n selection.current.style.marginLeft = `${newWidth}px`;\r\n }\r\n }\r\n\r\n if (isTouch) {\r\n if (node.offsetLeft > e.touches[0].pageX) {\r\n selection.current.style.right = `${nodeWidth - startX.current}px`;\r\n selection.current.style.width = `${startX.current}px`;\r\n selection.current.style.marginLeft = `-${startX.current}px`;\r\n }\r\n }\r\n }\r\n }, [node]);\r\n\r\n const onMouseLeave = useCallback((e) => {\r\n if (drawing.current && node && selection.current) {\r\n if (node.offsetLeft > e.pageX) {\r\n const nodeWidth = (node.firstChild as HTMLElement).getBoundingClientRect().width;\r\n\r\n selection.current.style.right = `${nodeWidth - startX.current}px`;\r\n selection.current.style.width = `${startX.current}px`;\r\n selection.current.style.marginLeft = `-${startX.current}px`;\r\n }\r\n\r\n if (node.offsetLeft + node.offsetWidth < e.pageX) {\r\n const nodeWidth = (node.firstChild as HTMLElement).getBoundingClientRect().width;\r\n\r\n selection.current.style.left = `${startX.current}px`;\r\n selection.current.style.width = `${nodeWidth - startX.current}px`;\r\n selection.current.style.marginLeft = \"0px\";\r\n }\r\n }\r\n }, [node]);\r\n\r\n const onStopDrawing = useCallback(() => {\r\n if (node && selection.current) {\r\n const nodeWidth = (node.firstChild as HTMLElement).getBoundingClientRect().width;\r\n const selectionMinX = selection.current.offsetLeft >= 0\r\n ? selection.current.offsetLeft <= nodeWidth ? selection.current.offsetLeft : nodeWidth\r\n : 0;\r\n const selectionWidth = selection.current.getBoundingClientRect().right - selection.current.getBoundingClientRect().left;\r\n const selectionMaxX = selection.current.offsetLeft + selectionWidth <= nodeWidth\r\n ? selection.current.offsetLeft + selectionWidth >= 0 ? selection.current.offsetLeft + selectionWidth : 0\r\n : nodeWidth;\r\n const min = Math.round(selectionMinX);\r\n const max = Math.round(selectionMaxX);\r\n\r\n if (max - min > 0 && props.onSelect) {\r\n props.onSelect([min, max]);\r\n }\r\n }\r\n\r\n clearSelection();\r\n }, [node, clearSelection]);\r\n\r\n useEffect(() => {\r\n if (node) {\r\n node.childNodes.forEach((child) => {\r\n (child as HTMLElement).style.userSelect = \"none\";\r\n });\r\n\r\n node.addEventListener(\"mousedown\", onStartDrawing);\r\n node.addEventListener(\"touchstart\", onStartDrawing);\r\n node.addEventListener(\"mousemove\", onDraw);\r\n node.addEventListener(\"touchmove\", onDraw);\r\n node.addEventListener(\"mouseleave\", onMouseLeave);\r\n node.addEventListener(\"mouseup\", onStopDrawing);\r\n node.addEventListener(\"touchend\", onStopDrawing);\r\n document.addEventListener(\"mouseup\", onStopDrawing);\r\n }\r\n\r\n return () => {\r\n node?.removeEventListener(\"mousedown\", onStartDrawing);\r\n node?.removeEventListener(\"touchstart\", onStartDrawing);\r\n node?.removeEventListener(\"mousemove\", onDraw);\r\n node?.removeEventListener(\"touchmove\", onDraw);\r\n node?.removeEventListener(\"mouseleave\", onMouseLeave);\r\n node?.removeEventListener(\"mouseup\", onStopDrawing);\r\n node?.removeEventListener(\"touchend\", onStopDrawing);\r\n document.removeEventListener(\"mouseup\", onStopDrawing);\r\n };\r\n }, [node]);\r\n};\r\n","import styled from 'styled-components';\r\n\r\nimport { TooltipFlex as TooltipFlexUI } from '../../common/components/tooltips';\r\n\r\nexport const horizontalBarChartClassNames = {\r\n horizontalBarChartButtonTd: 'horizontalBarChartButtonTd',\r\n horizontalBarChartLabelTd: 'horizontalBarChartLabelTd',\r\n horizontalBarChartLabelCell: 'horizontalBarChartLabelCell',\r\n horizontalBarChartBarTd: 'horizontalBarChartBarTd',\r\n horizontalBarChartBarFlex: 'horizontalBarChartBarFlex',\r\n horizontalBarChartBar: 'horizontalBarChartBar',\r\n horizontalBarChartBarFirst: 'horizontalBarChartBarFirst',\r\n horizontalBarChartBarLast: 'horizontalBarChartBarLast',\r\n horizontalBarChartBarOnly: 'horizontalBarChartBarOnly',\r\n horizontalBarChartTooltipFlex: 'horizontalBarChartTooltipFlex',\r\n horizontalBarChartStackWrapper: 'horizontalBarChartStackWrapper',\r\n horizontalBarChartTooltipContainer: 'horizontalBarChartTooltipContainer',\r\n horizontalBarChartStackSumContainer: 'horizontalBarChartStackSumContainer',\r\n horizontalBarChartStackSum: 'horizontalBarChartStackSum',\r\n horizontalBarChartXScaleTd: 'horizontalBarChartXScaleTd',\r\n horizontalBarChartXScaleTicks: 'horizontalBarChartXScaleTicks',\r\n horizontalBarChartXScaleTick: 'horizontalBarChartXScaleTick',\r\n horizontalBarChartTooltipItem: 'horizontalBarChartTooltipItem',\r\n horizontalBarChartTooltipName: 'horizontalBarChartTooltipName',\r\n horizontalBarChartTooltipValue: 'horizontalBarChartTooltipValue',\r\n};\r\n\r\nexport const Table = styled.table`\r\n width: 100%;\r\n`;\r\n\r\nexport const LabelCell = styled.div`\r\n text-align: right;\r\n`;\r\n\r\nexport const BarFlex = styled.div`\r\n width: 100%;\r\n display: flex;\r\n height: 1rem;\r\n`;\r\n\r\nexport const BarsTd = styled.td`\r\n width: 100%;\r\n position: relative;\r\n vertical-align: middle;\r\n`;\r\n\r\nexport const TooltipFlex = styled(TooltipFlexUI)`\r\n position: absolute;\r\n top: 0;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\r\n will-change: left, top;\r\n`;\r\n\r\nexport const StackSumContainer = styled.div`\r\n position: relative;\r\n`;\r\n\r\nexport const StackSum = styled.div`\r\n white-space: nowrap;\r\n position: absolute;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(0, -50%);\r\n`;\r\n\r\nexport const StackWrapper = styled.div`\r\n position: absolute;\r\n top: 0;\r\n display: flex;\r\n justify-content: flex-start;\r\n height: 100%;\r\n`;\r\n","import React from 'react';\r\nimport * as d3 from 'd3';\r\n\r\nimport {\r\n horizontalBarChartClassNames as classNames,\r\n TooltipFlex,\r\n} from '../styled';\r\nimport {\r\n TooltipContainer,\r\n TooltipItem,\r\n Name,\r\n Value,\r\n ColorBox,\r\n} from '../../../common/components/tooltips';\r\n\r\nimport { TooltipProps } from './types';\r\n\r\nexport const Tooltip: React.FC<TooltipProps> = ({\r\n renderTooltip,\r\n bars,\r\n style,\r\n className,\r\n}): React.ReactElement => {\r\n const format = d3.format(',');\r\n\r\n return (\r\n <TooltipFlex\r\n className={`${classNames.horizontalBarChartTooltipFlex} ${className ||\r\n ''}`}\r\n style={style}\r\n >\r\n <TooltipContainer\r\n className={classNames.horizontalBarChartTooltipContainer}\r\n >\r\n {renderTooltip\r\n ? renderTooltip(bars)\r\n : bars.map(({ color, name, value, groupName }, index) => (\r\n <TooltipItem\r\n key={`${name || ''}-${index}-${groupName}`}\r\n className={classNames.horizontalBarChartTooltipItem}\r\n >\r\n {color && <ColorBox style={{ backgroundColor: color }} />}\r\n {name && (\r\n <Name className={classNames.horizontalBarChartTooltipName}>\r\n {name}\r\n </Name>\r\n )}\r\n <Value className={classNames.horizontalBarChartTooltipValue}>\r\n {format(value)}\r\n </Value>\r\n </TooltipItem>\r\n ))}\r\n </TooltipContainer>\r\n </TooltipFlex>\r\n );\r\n};\r\n","import React, { useCallback, useEffect } from 'react';\r\nimport * as d3 from 'd3';\r\nimport { render, unmountComponentAtNode } from 'react-dom';\r\n\r\nimport {\r\n HorizontalBarChartMarshalingData,\r\n HorizontalBarChartProps,\r\n} from '../../types';\r\nimport { UseTooltip } from './types';\r\n\r\nimport { Tooltip } from '../../Tooltip';\r\n\r\nconst rootElement: HTMLDivElement = document.createElement('div');\r\n\r\nexport const useTooltip = ({\r\n renderTooltip,\r\n tooltipBind,\r\n tooltipStyle,\r\n tooltipRoot,\r\n tooltipClassName,\r\n hideTooltip,\r\n}: Pick<\r\n HorizontalBarChartProps,\r\n | 'renderTooltip'\r\n | 'tooltipBind'\r\n | 'tooltipStyle'\r\n | 'tooltipRoot'\r\n | 'tooltipClassName'\r\n | 'hideTooltip'\r\n>): UseTooltip => {\r\n useEffect(() => {\r\n const container: Element | null =\r\n tooltipRoot || document.querySelector('body');\r\n\r\n container && container.appendChild(rootElement);\r\n return () => {\r\n unmountComponentAtNode(rootElement);\r\n };\r\n }, [tooltipRoot]);\r\n\r\n const onMouseMove = useCallback(\r\n (event: React.MouseEvent, bars: HorizontalBarChartMarshalingData[]) => {\r\n let [x, y] = d3.pointer(event, document);\r\n\r\n if (!tooltipBind && 'getBoundingClientRect' in event.target) {\r\n const {\r\n width,\r\n height,\r\n }: DOMRect = (event.target as HTMLDivElement).getBoundingClientRect();\r\n const [barX, barY] = d3.pointer(event, event.target);\r\n\r\n x = x - barX + width / 2;\r\n y = y - barY + height / 2;\r\n }\r\n\r\n if (rootElement) {\r\n rootElement.style.visibility = 'visible';\r\n }\r\n\r\n render(\r\n <Tooltip\r\n style={{\r\n left: x,\r\n top: y,\r\n ...tooltipStyle,\r\n }}\r\n bars={bars}\r\n renderTooltip={renderTooltip}\r\n className={tooltipClassName}\r\n />,\r\n rootElement\r\n );\r\n },\r\n [tooltipClassName, tooltipStyle, renderTooltip, tooltipBind]\r\n );\r\n\r\n const onMouseLeave = useCallback(() => {\r\n if (rootElement) {\r\n rootElement.style.visibility = 'hidden';\r\n hideTooltip && hideTooltip();\r\n }\r\n }, [hideTooltip]);\r\n\r\n return [onMouseMove, onMouseLeave];\r\n};\r\n","import styled from 'styled-components';\r\n\r\nexport const BarStyled = styled.div`\r\n position: relative;\r\n display: inline-flex;\r\n height: 100%;\r\n`;\r\n","import React from 'react';\r\n\r\nimport { BarProps } from './types';\r\n\r\nimport { horizontalBarChartClassNames as classNames } from '../styled';\r\nimport { BarStyled } from './styled';\r\n\r\nexport const Bar: React.FC<BarProps> = ({\r\n withTooltip,\r\n bar,\r\n formatNativeTitle,\r\n tooltipBind,\r\n mouseMove,\r\n mouseLeave,\r\n pointerEventsNone,\r\n isFirstChild,\r\n isLastChild,\r\n isOnlyChild,\r\n}): React.ReactElement => {\r\n const { color, width } = bar;\r\n const ceiledWidth = Math.abs(width);\r\n const onMouseMove = withTooltip\r\n ? (event: React.MouseEvent) => mouseMove(event, [bar])\r\n : void 0;\r\n const onMouseLeave = withTooltip ? () => mouseLeave() : void 0;\r\n\r\n return (\r\n <BarStyled\r\n className={`${classNames.horizontalBarChartBar} ${\r\n isFirstChild ? classNames.horizontalBarChartBarFirst : ''\r\n } ${isLastChild ? classNames.horizontalBarChartBarLast : ''} ${\r\n isOnlyChild ? classNames.horizontalBarChartBarOnly : ''\r\n }`}\r\n style={{\r\n width: `${ceiledWidth}%`,\r\n backgroundColor: color,\r\n pointerEvents: pointerEventsNone ? 'none' : 'auto',\r\n }}\r\n title={formatNativeTitle ? formatNativeTitle(bar) : ''}\r\n onMouseOver={onMouseMove}\r\n onMouseMove={tooltipBind ? onMouseMove : void 0}\r\n onMouseOut={onMouseLeave}\r\n />\r\n );\r\n};\r\n","import styled from 'styled-components';\r\n\r\nexport const TickTd = styled.td`\r\n position: relative;\r\n`;\r\n\r\nexport const Ticks = styled.div`\r\n position: relative;\r\n height: 1rem;\r\n`;\r\n\r\nexport const Tick = styled.div`\r\n white-space: nowrap;\r\n width: 0;\r\n height: 0;\r\n position: absolute;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n`;\r\n","import React from 'react';\r\nimport * as d3 from 'd3';\r\n\r\nimport { HorizontalBarChartProps } from '../types';\r\n\r\nimport { useScale } from './hooks/useScale';\r\n\r\nimport { TickTd, Ticks, Tick } from './styled';\r\nimport { horizontalBarChartClassNames as classNames } from '../styled';\r\n\r\nexport const XScale: React.FC<Pick<\r\n HorizontalBarChartProps,\r\n 'maxValue' | 'scaleTicks' | 'renderTicks' | 'scaleDomain'\r\n>> = ({\r\n maxValue,\r\n scaleTicks,\r\n renderTicks,\r\n scaleDomain,\r\n}): React.ReactElement => {\r\n const range = useScale({ maxValue, scaleTicks, scaleDomain });\r\n const format = d3.format(',');\r\n\r\n return (\r\n <tr>\r\n <td />\r\n <TickTd className={classNames.horizontalBarChartXScaleTd}>\r\n <Ticks className={classNames.horizontalBarChartXScaleTicks}>\r\n {range.map((tick, index, ticks) => {\r\n const { value, x } = tick;\r\n\r\n return (\r\n <Tick\r\n key={value}\r\n className={classNames.horizontalBarChartXScaleTick}\r\n style={{\r\n left: `${x}%`,\r\n justifyContent:\r\n index === 0\r\n ? 'flex-start'\r\n : index === ticks.length - 1\r\n ? 'flex-end'\r\n : '',\r\n }}\r\n >\r\n {renderTicks ? renderTicks(tick) : format(value)}\r\n </Tick>\r\n );\r\n })}\r\n </Ticks>\r\n </TickTd>\r\n </tr>\r\n );\r\n};\r\n","import { useMemo } from 'react';\r\nimport * as d3 from 'd3';\r\n\r\nimport {\r\n HorizontalBarChartProps,\r\n HorizontalBarChartScaleItem,\r\n} from '../../types';\r\n\r\nconst hundred = 100;\r\n\r\nexport const useScale = ({\r\n maxValue,\r\n scaleTicks,\r\n scaleDomain,\r\n}: Pick<\r\n HorizontalBarChartProps,\r\n 'maxValue' | 'scaleTicks' | 'scaleDomain'\r\n>): HorizontalBarChartScaleItem[] => {\r\n return useMemo(() => {\r\n const scaleLinear = d3\r\n .scaleLinear()\r\n .domain([0, maxValue] as Iterable<d3.NumberValue>)\r\n .range([0, hundred]);\r\n\r\n const ticks = scaleLinear.ticks(scaleTicks);\r\n\r\n return (scaleDomain || ticks).map((value: number) => ({\r\n value,\r\n x: scaleLinear(value),\r\n }));\r\n }, [maxValue, scaleTicks, scaleDomain]);\r\n};\r\n","import React from 'react';\r\nimport * as d3 from 'd3';\r\n\r\nimport { HorizontalBarChartProps } from './types';\r\n\r\nimport { useMarshaling } from './hooks/useMarshaling';\r\nimport { useTooltip } from './hooks/useTooltip';\r\nimport { useStackWrapper } from './hooks/useStackWrapper';\r\n\r\nimport { Bar } from './Bar';\r\nimport { XScale } from './XScale';\r\nimport {\r\n Table,\r\n LabelCell,\r\n horizontalBarChartClassNames as classNames,\r\n BarFlex,\r\n BarsTd,\r\n StackSumContainer,\r\n StackSum,\r\n} from './styled';\r\n\r\nexport const HorizontalBarChart: React.FC<HorizontalBarChartProps> = ({\r\n data,\r\n className,\r\n style,\r\n children,\r\n labels,\r\n fullExtent,\r\n maxValue,\r\n formatNativeTitle,\r\n renderTooltip,\r\n withTooltip,\r\n withStackSum,\r\n tooltipBind,\r\n scaleTicks,\r\n renderTicks,\r\n renderButton,\r\n tooltipStyle,\r\n tooltipClassName,\r\n scaleDomain,\r\n renderDataTable,\r\n thead,\r\n withoutXScale,\r\n stackedTooltip,\r\n fullChartTooltip,\r\n hideTooltip,\r\n}): React.ReactElement => {\r\n const { fullMax, data: marshalingData } = useMarshaling({\r\n data,\r\n fullExtent,\r\n maxValue,\r\n labels,\r\n });\r\n const [mouseMove, mouseLeave] = useTooltip({\r\n renderTooltip,\r\n tooltipBind,\r\n tooltipStyle,\r\n tooltipClassName,\r\n hideTooltip,\r\n });\r\n const Stack = useStackWrapper(stackedTooltip);\r\n\r\n return (\r\n <Table\r\n className={className}\r\n style={style}\r\n onMouseOver={\r\n fullChartTooltip\r\n ? event => mouseMove(event, marshalingData.flat())\r\n : void 0\r\n }\r\n onMouseMove={\r\n fullChartTooltip\r\n ? event => mouseMove(event, marshalingData.flat())\r\n : void 0\r\n }\r\n onMouseOut={fullChartTooltip ? mouseLeave : void 0}\r\n >\r\n {thead}\r\n <tbody>\r\n {marshalingData.map((item, rowIndex) => {\r\n const stackSum =\r\n (withStackSum || renderDataTable) &&\r\n d3.sum(item, ({ value }) => value);\r\n const sumWidth = d3.sum(item, ({ width }) => width);\r\n\r\n return (\r\n <tr key={`row-${rowIndex}`}>\r\n {typeof renderButton === 'function' && (\r\n <td className={classNames.horizontalBarChartButtonTd}>\r\n {renderButton(item, rowIndex)}\r\n </td>\r\n )}\r\n <td className={classNames.horizontalBarChartLabelTd}>\r\n {labels && labels[rowIndex] && (\r\n <LabelCell className={classNames.horizontalBarChartLabelCell}>\r\n {labels[rowIndex]}\r\n </LabelCell>\r\n )}\r\n </td>\r\n <BarsTd\r\n className={classNames.horizontalBarChartBarTd}\r\n style={{ pointerEvents: fullChartTooltip ? 'none' : 'auto' }}\r\n >\r\n <BarFlex\r\n className={classNames.horizontalBarChartBarFlex}\r\n style={{ pointerEvents: fullChartTooltip ? 'none' : 'auto' }}\r\n >\r\n <Stack\r\n style={stackedTooltip ? { width: `${sumWidth}%` } : void 0}\r\n item={item}\r\n tooltipBind={tooltipBind}\r\n mouseMove={mouseMove}\r\n mouseLeave={mouseLeave}\r\n />\r\n {item.map(\r\n (bar, barIndex, array) =>\r\n bar.value !== 0 && (\r\n <Bar\r\n key={`bar-${bar.name || ''}-${barIndex}`}\r\n formatNativeTitle={formatNativeTitle}\r\n bar={bar}\r\n tooltipBind={tooltipBind}\r\n pointerEventsNone={stackedTooltip || fullChartTooltip}\r\n withTooltip={withTooltip && !stackedTooltip}\r\n mouseMove={mouseMove}\r\n mouseLeave={mouseLeave}\r\n isOnlyChild={array.length === 1}\r\n isFirstChild={barIndex === 0 && array.length > 1}\r\n isLastChild={\r\n array.length - 1 === barIndex && array.length > 1\r\n }\r\n />\r\n )\r\n )}\r\n {withStackSum && (\r\n <StackSumContainer\r\n className={classNames.horizontalBarChartStackSumContainer}\r\n >\r\n <StackSum\r\n className={classNames.horizontalBarChartStackSum}\r\n >\r\n {stackSum}\r\n </StackSum>\r\n </StackSumContainer>\r\n )}\r\n </BarFlex>\r\n </BarsTd>\r\n {renderDataTable &&\r\n renderDataTable(item, stackSum as number, rowIndex)}\r\n </tr>\r\n );\r\n })}\r\n {!withoutXScale && (\r\n <XScale\r\n maxValue={typeof maxValue === 'number' ? maxValue : fullMax}\r\n scaleTicks={scaleTicks}\r\n renderTicks={renderTicks}\r\n scaleDomain={scaleDomain}\r\n />\r\n )}\r\n {children}\r\n </tbody>\r\n </Table>\r\n );\r\n};\r\n\r\nHorizontalBarChart.defaultProps = {\r\n fullExtent: true,\r\n withTooltip: false,\r\n withStackSum: false,\r\n tooltipBind: false,\r\n scaleTicks: 4,\r\n withoutXScale: false,\r\n};\r\n","import { useMemo } from 'react';\r\nimport * as d3 from 'd3';\r\n\r\nimport {\r\n HorizontalBarChartProps,\r\n HorizontalBarChartData,\r\n HorizontalBarChartMarshalingData,\r\n} from '../types';\r\n\r\nconst hundred = 100;\r\n\r\nexport const useMarshaling = ({\r\n data,\r\n fullExtent,\r\n maxValue,\r\n labels,\r\n}: Pick<\r\n HorizontalBarChartProps,\r\n 'data' | 'fullExtent' | 'maxValue' | 'labels'\r\n>): {\r\n fullMax: number;\r\n data: HorizontalBarChartMarshalingData[][];\r\n} => {\r\n return useMemo(() => {\r\n const fullMax = d3.max(data, item =>\r\n d3.sum(item, ({ value }) => value)\r\n ) as number;\r\n const scaleLinear = d3\r\n .scaleLinear()\r\n .domain([\r\n 0,\r\n typeof maxValue === 'number' ? maxValue : fullMax,\r\n ] as Iterable<d3.NumberValue>)\r\n .range([0, hundred]);\r\n\r\n return {\r\n fullMax,\r\n data: data.map((item: HorizontalBarChartData[], index) => {\r\n if (!fullExtent) {\r\n scaleLinear.domain([\r\n 0,\r\n typeof maxValue === 'number'\r\n ? maxValue\r\n : d3.sum(item, ({ value }) => value),\r\n ] as Iterable<d3.NumberValue>);\r\n }\r\n\r\n return item.map(({ value, ...rest }) => ({\r\n ...rest,\r\n value,\r\n width: scaleLinear(value),\r\n groupName: labels ? labels[index] : '',\r\n }));\r\n }),\r\n };\r\n }, [data, fullExtent, maxValue, labels]);\r\n};\r\n","import React, { Fragment, useMemo, CSSProperties, ReactNode } from 'react';\r\n\r\nimport {\r\n horizontalBarChartClassNames as classNames,\r\n StackWrapper,\r\n} from '../styled';\r\n\r\nimport { UseTooltip } from './useTooltip/types';\r\nimport {\r\n HorizontalBarChartMarshalingData,\r\n HorizontalBarChartProps,\r\n} from '../types';\r\n\r\nexport const useStackWrapper = (stackedTooltip?: boolean) => {\r\n return useMemo(\r\n () =>\r\n stackedTooltip\r\n ? ({\r\n item,\r\n mouseMove,\r\n mouseLeave,\r\n tooltipBind,\r\n ...props\r\n }: {\r\n style?: CSSProperties;\r\n item: HorizontalBarChartMarshalingData[];\r\n tooltipBind: HorizontalBarChartProps['tooltipBind'];\r\n mouseMove: UseTooltip[0];\r\n mouseLeave: UseTooltip[1];\r\n }) => (\r\n <StackWrapper\r\n className={classNames.horizontalBarChartStackWrapper}\r\n onMouseOver={event => mouseMove(event, item)}\r\n onMouseMove={\r\n tooltipBind ? event => mouseMove(event, item) : void 0\r\n }\r\n onMouseOut={mouseLeave}\r\n {...props}\r\n />\r\n )\r\n : ({ children }: { children?: ReactNode }) => (\r\n <Fragment>{children}</Fragment>\r\n ),\r\n [stackedTooltip]\r\n );\r\n};\r\n","export const bubbleChartDefaultProps = {\r\n height: 280,\r\n minSize: 6,\r\n maxSize: 30,\r\n margin: {\r\n top: 10,\r\n right: 15,\r\n bottom: 10,\r\n left: 0,\r\n },\r\n yAxisPadding: 10,\r\n xAxisPadding: 10,\r\n yScaleLabelPadding: 10,\r\n};\r\n","import styled, { createGlobalStyle } from 'styled-components';\r\n\r\nimport { Wrapper } from '../../common/components/Wrapper';\r\n\r\nexport const bubbleChartClassNames = {\r\n bubbleChartYAxis: 'bubbleChartYAxis',\r\n bubbleChartYAxisZeroTick: 'bubbleChartYAxisZeroTick',\r\n bubbleChartXAxis: 'bubbleChartXAxis',\r\n bubbleChartGridGlobal: 'bubbleChartGridGlobal',\r\n bubbleChartGridLineX: 'bubbleChartGridLineX',\r\n bubbleChartGridLineY: 'bubbleChartGridLineY',\r\n bubbleChartCircle: 'bubbleChartCircle',\r\n bubbleChartYScaleLabel: 'bubbleChartYScaleLabel',\r\n bubbleChartTooltip: 'bubbleChartTooltip',\r\n bubbleChartTooltipContainer: 'bubbleChartTooltipContainer',\r\n bubbleChartTooltipFlex: 'bubbleChartTooltipFlex',\r\n bubbleChartTip: 'bubbleChartTip',\r\n};\r\n\r\nexport const SvgWrapper = styled(Wrapper)`\r\n .${bubbleChartClassNames.bubbleChartYAxis},\r\n .${bubbleChartClassNames.bubbleChartXAxis},\r\n .${bubbleChartClassNames.bubbleChartGridGlobal} {\r\n shape-rendering: crispEdges;\r\n }\r\n\r\n .${bubbleChartClassNames.bubbleChartGridLineX},\r\n .${bubbleChartClassNames.bubbleChartGridLineY} {\r\n stroke: rgba(149, 149, 149, 0.24);\r\n }\r\n\r\n .${bubbleChartClassNames.bubbleChartYScaleLabel} {\r\n font-size: 10px;\r\n }\r\n`;\r\n\r\nexport const TooltipStyles = createGlobalStyle`\r\n .${bubbleChartClassNames.bubbleChartTooltipContainer} {\r\n position: absolute;\r\n transition: opacity 150ms cubic-bezier(0.2, 1, 0.6, 1);\r\n pointer-events: none;\r\n z-index: 1;\r\n }\r\n`;\r\n","import styled from 'styled-components';\r\n\r\nexport const Tooltip = styled.div`\r\n width: 0;\r\n height: 0;\r\n display: flex;\r\n align-items: flex-end;\r\n justify-content: center;\r\n font-size: 12px;\r\n white-space: nowrap;\r\n`;\r\n","import * as d3 from 'd3';\r\n\r\nimport { BubbleChartProps } from './types';\r\n\r\nimport { appendSvg } from '../../helpers';\r\nimport { computeDimensions } from '../../helpers/computeDimensions';\r\n\r\nimport { bubbleChartDefaultProps } from './bubbleChartDefaultProps';\r\nimport { drawGrid } from './drawGrid';\r\nimport { drawTooltip } from './drawTooltip';\r\n\r\nimport { bubbleChartClassNames as classNames } from './styled';\r\n\r\nexport const draw = (\r\n node: HTMLElement | null,\r\n props: BubbleChartProps\r\n): void => {\r\n const {\r\n data,\r\n margin,\r\n xAxisPadding,\r\n yAxisPadding,\r\n customYScale,\r\n customYAxis,\r\n customXScale,\r\n customXAxis,\r\n minSize,\r\n maxSize,\r\n minYValue,\r\n maxYValue,\r\n drawGridY,\r\n drawGridX,\r\n scaleLog,\r\n xScaleItemWidth,\r\n bubbleStyle,\r\n customize,\r\n yScaleLabel,\r\n yScaleLabelPadding,\r\n enableTooltip,\r\n tooltipRoot,\r\n tooltipClassName,\r\n renderTooltip,\r\n } = props;\r\n\r\n if (node !== null && data.length) {\r\n const marginTop = margin ? margin.top : 0;\r\n const marginRight = margin ? margin.right : 0;\r\n const marginBottom = margin ? margin.bottom : 0;\r\n const marginLeft = margin ? margin.left : 0;\r\n const { width: nodeWidth } = node.getBoundingClientRect();\r\n const width = props.width || nodeWidth;\r\n const height = props.height || 0;\r\n const yTicksCountDefault = 6;\r\n\r\n const minY =\r\n typeof minYValue === 'number'\r\n ? minYValue\r\n : (d3.min(data, ({ yValue }) => yValue) as number);\r\n const maxY =\r\n typeof maxYValue === 'number'\r\n ? maxYValue\r\n : (d3.max(data, ({ yValue }) => yValue) as number);\r\n\r\n const svg = appendSvg(node, width, height || 0);\r\n\r\n const sizeScale = scaleLog\r\n ? d3\r\n .scaleLog()\r\n .domain([\r\n d3.min(data, ({ sizeValue }) => sizeValue) as number || 0.1,\r\n d3.max(data, ({ sizeValue }) => sizeValue) as number || 0.1,\r\n ])\r\n .range([\r\n minSize || bubbleChartDefaultProps.minSize || 0.1,\r\n maxSize || bubbleChartDefaultProps.maxSize || 0.1,\r\n ])\r\n : d3\r\n .scaleLinear()\r\n .domain([\r\n d3.min(data, ({ sizeValue }) => sizeValue) as number,\r\n d3.max(data, ({ sizeValue }) => sizeValue) as number,\r\n ])\r\n .range([\r\n minSize || bubbleChartDefaultProps.minSize,\r\n maxSize || bubbleChartDefaultProps.maxSize,\r\n ]);\r\n\r\n const yRange1 = height - marginTop - marginBottom - (xAxisPadding || 0);\r\n\r\n const yScale = scaleLog\r\n ? d3\r\n .scaleLog()\r\n .domain([minY || 0.1, maxY || 0.1])\r\n .range([yRange1 || 0.1, marginTop || 0.1])\r\n .nice()\r\n : d3\r\n .scaleLinear()\r\n .domain([minY, maxY])\r\n .range([yRange1, marginTop])\r\n .nice();\r\n\r\n customYScale && customYScale(yScale);\r\n\r\n const yTicks = yScale.ticks();\r\n const yAxisLeft = d3.axisLeft(yScale).ticks(yTicksCountDefault);\r\n\r\n const yTicksCount = yAxisLeft.tickArguments()[0];\r\n\r\n const yAxis = svg\r\n .append('g')\r\n .attr('class', classNames.bubbleChartYAxis)\r\n .call(yAxisLeft);\r\n\r\n let yScaleLabelHeight = yScaleLabelPadding || 0;\r\n\r\n if (yScaleLabel) {\r\n const label = svg\r\n .append('text')\r\n .text(yScaleLabel)\r\n .attr('class', classNames.bubbleChartYScaleLabel);\r\n\r\n const { width, height } = computeDimensions(label);\r\n\r\n yScaleLabelHeight = yScaleLabelHeight + height;\r\n\r\n label.attr(\r\n 'transform',\r\n `rotate(-90) translate(-${(yRange1 + marginBottom + width) /\r\n 2}, ${height})`\r\n );\r\n }\r\n\r\n yAxis.selectAll('.tick').attr('class', value => {\r\n return value === 0\r\n ? `tick ${classNames.bubbleChartYAxisZeroTick}`\r\n : 'tick';\r\n });\r\n\r\n customYAxis && customYAxis(yAxis);\r\n\r\n const { width: yAxisWidth } = computeDimensions(yAxis);\r\n\r\n const xScale = scaleLog\r\n ? d3\r\n .scaleLog()\r\n .domain([\r\n d3.min(data, ({ xValue }) => xValue) as number || 0.1,\r\n d3.max(data, ({ xValue }) => xValue) as number || 0.1,\r\n ])\r\n .range([\r\n (marginLeft + yAxisWidth + (yAxisPadding || 0) + yScaleLabelHeight) || 0.1,\r\n (width - marginRight) || 0.1,\r\n ])\r\n : d3\r\n .scaleLinear()\r\n .domain([\r\n d3.min(data, ({ xValue }) => xValue) as number,\r\n d3.max(data, ({ xValue }) => xValue) as number,\r\n ])\r\n .range([\r\n marginLeft + yAxisWidth + (yAxisPadding || 0) + yScaleLabelHeight,\r\n width - marginRight,\r\n ]);\r\n\r\n customXScale && customXScale(xScale);\r\n\r\n const xAxisBottom = d3.axisBottom(xScale);\r\n\r\n if (typeof xScaleItemWidth === 'number') {\r\n const [x1, x2] = xScale.range();\r\n const chartWidth = x2 - x1;\r\n\r\n xAxisBottom\r\n .ticks(Math.round(chartWidth / xScaleItemWidth))\r\n .tickSizeOuter(0);\r\n }\r\n\r\n const xAxis = svg\r\n .append('g')\r\n .call(xAxisBottom)\r\n .attr('class', classNames.bubbleChartXAxis);\r\n\r\n customXAxis && customXAxis(xAxis);\r\n\r\n yAxis.attr(\r\n 'transform',\r\n `translate(${marginLeft + yAxisWidth + yScaleLabelHeight}, 0)`\r\n );\r\n\r\n drawGrid({\r\n svg,\r\n yScale,\r\n xScale,\r\n yTicksCount,\r\n drawGridY,\r\n drawGridX,\r\n });\r\n\r\n xAxis.attr(\r\n 'transform',\r\n `translate(0, ${yScale(yTicks[0]) + (xAxisPadding || 0)})`\r\n );\r\n\r\n const bubbles = svg\r\n .append('g')\r\n .selectAll('dot')\r\n .data(data)\r\n .enter()\r\n .append('circle')\r\n .attr('class', classNames.bubbleChartCircle)\r\n .attr('cx', ({ xValue }) => xScale(xValue))\r\n .attr('cy', ({ yValue }) => yScale(yValue))\r\n .attr('r', ({ sizeValue }) => sizeScale(sizeValue) / 2)\r\n .attr('fill', ({ color }) => color || 'rgba(0, 176, 113, 0.6)')\r\n .attr('stroke', ({ stroke }) => stroke || 'transparent')\r\n .attr('style', ({ style }) => style || bubbleStyle || '');\r\n\r\n if (enableTooltip) {\r\n drawTooltip({ bubbles, tooltipRoot, tooltipClassName, renderTooltip });\r\n }\r\n\r\n customize && customize({ svg, bubbles, yScale, xScale, sizeScale });\r\n }\r\n};\r\n","import { DrawGridProps } from './types';\r\n\r\nimport { bubbleChartClassNames } from '../styled';\r\n\r\nexport const drawGrid = ({\r\n svg,\r\n yScale,\r\n xScale,\r\n yTicksCount,\r\n drawGridX,\r\n drawGridY,\r\n}: DrawGridProps) => {\r\n if (!drawGridY && !drawGridX) return;\r\n const [min, max] = xScale.domain();\r\n\r\n const global = svg\r\n .append('g')\r\n .attr('class', bubbleChartClassNames.bubbleChartGridGlobal);\r\n\r\n const yTicks = yScale.ticks(yTicksCount);\r\n\r\n if (drawGridX) {\r\n global\r\n .append('g')\r\n .selectAll('line')\r\n .data(yTicks)\r\n .join('line')\r\n .attr('class', bubbleChartClassNames.bubbleChartGridLineX)\r\n .attr('x1', () => xScale(min))\r\n .attr('x2', () => xScale(max))\r\n .attr('y1', (d: number) => Math.round(yScale(d)))\r\n .attr('y2', (d: number) => Math.round(yScale(d)));\r\n }\r\n\r\n if (drawGridY) {\r\n global\r\n .append('g')\r\n .selectAll('line')\r\n .data(xScale.ticks(yTicksCount))\r\n .join('line')\r\n .attr('class', bubbleChartClassNames.bubbleChartGridLineY)\r\n .attr('x1', (d: number) => Math.round(xScale(d)))\r\n .attr('x2', (d: number) => Math.round(xScale(d)))\r\n .attr('y1', () => Math.round(yScale(yTicks[0])))\r\n .attr('y2', () => Math.round(yScale(yTicks[yTicks.length - 1])));\r\n }\r\n};\r\n","import React from 'react';\r\nimport ReactDOMServer from 'react-dom/server';\r\nimport * as d3 from 'd3';\r\n\r\nimport { Tooltip } from './styled';\r\nimport { bubbleChartClassNames as classNames } from '../styled';\r\nimport { TooltipContainer } from '../../../common/components/tooltips';\r\nimport { DrawTooltipProps } from './types';\r\n\r\nexport const drawTooltip = ({\r\n bubbles,\r\n tooltipRoot,\r\n tooltipClassName,\r\n renderTooltip,\r\n}: DrawTooltipProps) => {\r\n const root: Element | null = tooltipRoot || document.querySelector('body');\r\n const format = d3.format(',');\r\n\r\n let container: d3.Selection<any, unknown, any, any> = d3\r\n .select(root)\r\n .select(`.${classNames.bubbleChartTooltip}`);\r\n\r\n if (container.node() === null) {\r\n container = d3\r\n .select(root)\r\n .append('div')\r\n .attr('class', classNames.bubbleChartTooltip);\r\n }\r\n\r\n let tooltip: d3.Selection<\r\n HTMLDivElement,\r\n unknown,\r\n d3.BaseType,\r\n any\r\n > = container\r\n .append('div')\r\n .attr(\r\n 'class',\r\n `${classNames.bubbleChartTooltipContainer} ${tooltipClassName || ''}`\r\n )\r\n .style('opacity', '0');\r\n\r\n bubbles.on('mouseover.tooltip', (event, data) => {\r\n const { sizeValue } = data;\r\n const circle = event.currentTarget as SVGCircleElement;\r\n const { x, y, width } = circle.getBoundingClientRect();\r\n const left = window.pageXOffset + x + width / 2;\r\n const top = window.pageYOffset + y;\r\n\r\n tooltip\r\n .style('left', `${left}px`)\r\n .style('top', `${top}px`)\r\n .html(() => {\r\n const html = ReactDOMServer.renderToString(\r\n <Tooltip className={classNames.bubbleChartTooltipFlex}>\r\n <TooltipContainer className={classNames.bubbleChartTip}>\r\n {format(sizeValue)}\r\n </TooltipContainer>\r\n </Tooltip>\r\n );\r\n\r\n return html;\r\n });\r\n\r\n renderTooltip && renderTooltip({ tooltip, data, circle });\r\n\r\n tooltip.style('opacity', '1');\r\n });\r\n\r\n bubbles.on('mouseout.tooltip', () => {\r\n tooltip.style('opacity', '0');\r\n });\r\n};\r\n","import React, { useEffect } from 'react';\r\n\r\nimport { BubbleChartProps } from './types';\r\n\r\nimport { useNode } from '../../hooks';\r\nimport { useResize } from '../../hooks';\r\n\r\nimport { draw } from './draw';\r\nimport { unmount } from './unmount';\r\nimport { bubbleChartDefaultProps } from './bubbleChartDefaultProps';\r\n\r\nimport { SvgWrapper, TooltipStyles } from './styled';\r\n\r\nexport const BubbleChart: React.FC<BubbleChartProps> = (\r\n props\r\n): React.ReactElement => {\r\n const { className, style, children, tooltipRoot } = props;\r\n const [ref, node] = useNode();\r\n\r\n useEffect(() => {\r\n node && draw(node, props);\r\n }, [node, props]);\r\n\r\n useEffect(() => {\r\n return () => unmount(tooltipRoot);\r\n }, [tooltipRoot]);\r\n\r\n const onDraw = () => draw(node, props);\r\n\r\n useResize(props.width, onDraw);\r\n\r\n return (\r\n <div className={className} style={style}>\r\n <TooltipStyles />\r\n <SvgWrapper ref={ref}>{children}</SvgWrapper>\r\n </div>\r\n );\r\n};\r\n\r\nBubbleChart.defaultProps = bubbleChartDefaultProps;\r\n","import * as d3 from 'd3';\r\n\r\nimport { bubbleChartClassNames as classNames } from './styled';\r\n\r\nexport const unmount = (tooltipRoot?: Element) => {\r\n const root: Element | null = tooltipRoot || document.querySelector('body');\r\n\r\n d3.select(root)\r\n .select(`.${classNames.bubbleChartTooltip}`)\r\n .remove();\r\n};\r\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","_ref","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","_ref2","paddingY","radius","paddingX","defaultLevels","ticks","domain","levels","lastTick","newLastTick","push","newMaxValue","angleSlice","PI","radiusScale","radarLine","_ref3","angle","_","radarValue","_ref4","svg","globalCenter","levelsGrid","reverse","axisGridY","getAxisValue","gridGlobal","selectAll","enter","radarGlobal","axis","_ref5","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","lineChartYScaleRight","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","dotSnapping","rightAxis","stacks","valuesIndex","prevValue","abs","stackedData","yRange","yScale","nice","yTicksCountDefault","yAxisLeft","yTicksCount","tickArguments","yAxis","yAxisWidth","yAxisRightWidth","rightAxisMin","rightAxisMax","yRightScale","yAxisRightTicks","yAxisRight","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","_ref6","_ref7","areaStyle","_ref8","stroke","_ref9","dots","_ref10","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","step","beginning","end","getTotalLength","getPointAtLength","lineChartData","dynamicDotStyle","datas","invertValue","noHasData","every","topIndex","keys","_datas$Number","_datas$Number2","labelTexts","_positions$i","_positions$index","indexX","indexY","LineChart","barChartLinesClassNames","barChartLinesGlobal","barChartLine","barChartAreasGlobal","barChartArea","barChartClassNames","barChartBarGlobal","barChartYScaleGlobal","barChartYAxis","barChartXAxis","barChartYAxisZeroTick","barChartGridGlobal","barChartGridLineX","barChartGridLineXZero","barChartGridLineYZero","barChartGridLineY","barChartSelection","barChartMouseRect","barChartMouseContainer","barChartTooltipFlex","barChartMouseTooltip","barChartTooltip","barChartTooltipItem","barChartTooltipColFlex","barChartTooltipGroupName","barChartColorBox","barChartColorLine","barChartTooltipName","barChartTooltipValue","barChartLabelContainer","barChartLabelFlex","barChartLabel","selectable","lineData","markers","barWidth","barWidthProp","barPadding","colors","customXScale","customYAxisLeft","customXAxisBottom","customBars","hideTooltipGroupName","labelPosition","tooltipY","stackedLine","formatTooltipValue","formatTooltipName","sectionPadding","minValuesLine","tooltipYDomain","marshalledMap","minDomainValue","maxDomainValue","drawBars","setTooltipPosition","onLabelItem","isBarTooltip","onBarClick","onBarHover","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","padding","bars","getBars","marker","horizontal","lineColor","align","linesSelection","areasSelection","linesData","lineType","areasData","drawLines","xScaleBandDomain","topYDomain","lineMin","tooltip","barChartTootipFlex","flagCurrIndex","offsetX","offsetY","findIndex","containts","elementsFromPoint","clientX","clientY","currBars","currLineData","concat","svgWidth","isMouseWithin","e","rectrY","concatedData","stack","stacksCount","indexFlag","LabelFlexStyled","LabelStyle","LabelUI","getLabel","getLabelY","BarChart","drawing","clearSelection","removeChild","onStartDrawing","stopPropagation","which","setAttribute","_props$margin","pageX","firstChild","display","onDraw","newWidth","offsetLeft","onMouseLeave","offsetWidth","onStopDrawing","selectionMinX","selectionWidth","selectionMaxX","onSelect","childNodes","child","userSelect","useSelection","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","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","bubbleChartDefaultProps","minSize","maxSize","yScaleLabelPadding","bubbleChartClassNames","bubbleChartYAxis","bubbleChartYAxisZeroTick","bubbleChartXAxis","bubbleChartGridGlobal","bubbleChartGridLineX","bubbleChartGridLineY","bubbleChartCircle","bubbleChartYScaleLabel","bubbleChartTooltip","bubbleChartTooltipContainer","bubbleChartTooltipFlex","bubbleChartTip","minYValue","maxYValue","scaleLog","bubbleStyle","yScaleLabel","enableTooltip","minY","yValue","maxY","sizeScale","sizeValue","yRange1","yScaleLabelHeight","xValue","bubbles","_ref11","_ref12","_ref13","_ref14","_ref15","_ref16","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/BarChart/hooks/useSelection.ts","../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/bubbleChartDefaultProps.ts","../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';\r\n\r\nexport const Wrapper = styled.div`\r\n position: relative;\r\n width: 100%;\r\n box-sizing: border-box;\r\n`;\r\n","import { PropsWithRef, useCallback, useState } from 'react';\r\n\r\nexport function useNode(): [PropsWithRef<any>, HTMLElement | null] {\r\n const [node, onSetNode] = useState<HTMLElement | null>(null);\r\n\r\n const ref = useCallback(onSetNode, [onSetNode]);\r\n\r\n return [ref, node];\r\n}\r\n","import { useEffect, useMemo } from 'react';\r\n\r\nimport { throttle } from '../helpers/throttle';\r\n\r\nconst THROTTLE_DELAY = 44;\r\n\r\nexport const useResize = (\r\n width?: number,\r\n callback?: (...args: any) => any,\r\n delay?: number\r\n) => {\r\n const throttledCallback: VoidFunction | undefined = useMemo(() => {\r\n return callback ? throttle(callback, delay || THROTTLE_DELAY) : undefined;\r\n }, [callback, delay]);\r\n\r\n useEffect(() => {\r\n throttledCallback &&\r\n typeof width !== 'number' &&\r\n window.addEventListener('resize', throttledCallback);\r\n\r\n return () =>\r\n throttledCallback &&\r\n window.removeEventListener('resize', throttledCallback);\r\n }, [width, throttledCallback]);\r\n};\r\n","export function throttle(fn: Function, wait: number) {\r\n let isCalled = false;\r\n\r\n return function(...args: any) {\r\n if (!isCalled) {\r\n fn(...args);\r\n isCalled = true;\r\n setTimeout(function() {\r\n isCalled = false;\r\n }, wait);\r\n }\r\n };\r\n}\r\n","import * as d3 from 'd3';\r\n\r\nexport const appendSvg = (node: HTMLElement, width: number, height: number) => {\r\n d3.select(node)\r\n .select('svg')\r\n .remove();\r\n\r\n const svg = d3\r\n .select(node)\r\n .append('svg')\r\n .attr('width', width)\r\n .attr('height', height);\r\n\r\n return svg;\r\n};\r\n","import styled from 'styled-components';\r\n\r\nexport const SwipeScrollContainer = styled.div`\r\n width: 100%;\r\n overflow: hidden;\r\n user-select: none;\r\n`;\r\n","export function animate({\r\n duration,\r\n timing,\r\n draw,\r\n}: {\r\n duration: number;\r\n timing: (n: number) => number;\r\n draw: (progress: number, requestId: number) => void;\r\n}): void {\r\n const start = performance.now();\r\n let requestId: number;\r\n\r\n requestAnimationFrame(function requestAnimate(time) {\r\n let timeFraction = (time - start) / duration;\r\n\r\n if (timeFraction < 1) {\r\n requestId = requestAnimationFrame(requestAnimate);\r\n }\r\n\r\n if (timeFraction > 1) cancelAnimationFrame(requestId);\r\n const progress = timing(timeFraction);\r\n\r\n draw(progress, requestId);\r\n });\r\n}\r\n\r\nexport const easeOutQuad = (time: number): number => time * (2 - time);\r\n","import { useEffect, useRef, useCallback } from 'react';\r\nimport * as d3 from 'd3';\r\n\r\nimport { animate, easeOutQuad } from '../animate';\r\n\r\nimport { SwipeScrollProps } from '../types';\r\n\r\nconst range = (num: number, min: number, max: number) =>\r\n Math.min(Math.max(num, min), max);\r\n\r\nconst defaultRefs = {\r\n animation: 0,\r\n speed: 0,\r\n timestamp: 0,\r\n startX: 0,\r\n currentX: 0,\r\n};\r\n\r\nexport const useSwipe = (\r\n node: HTMLElement | null,\r\n { width, duration, animationFunc, onSwipe }: SwipeScrollProps\r\n) => {\r\n const container = d3.select(node);\r\n const body = d3.select('body');\r\n const documentSelect = d3.select(document);\r\n const refs = useRef(defaultRefs);\r\n\r\n useEffect(() => {\r\n if (width && refs.current.animation) {\r\n cancelAnimationFrame(refs.current.animation);\r\n refs.current = defaultRefs;\r\n }\r\n }, [width]);\r\n\r\n const onMove = useCallback(\r\n event => {\r\n const { width: nodeWidth } = node\r\n ? node.getBoundingClientRect()\r\n : { width: 0 };\r\n const [x] = d3.pointer(\r\n event.type.includes('touch') ? event.touches[0] : event\r\n );\r\n const newX = x - refs.current.startX;\r\n const maxX = width - nodeWidth;\r\n const translateX = range(newX, -maxX, 0);\r\n\r\n container.style('transform', `translateX(${translateX}px)`);\r\n\r\n if (refs.current.currentX) {\r\n const hundred = 100;\r\n const now = Date.now();\r\n const dt = now - refs.current.timestamp;\r\n const dx = translateX - refs.current.currentX;\r\n const speedX = Math.round((dx / dt) * hundred);\r\n\r\n refs.current.speed = speedX;\r\n refs.current.timestamp = now;\r\n }\r\n\r\n refs.current.currentX = translateX;\r\n\r\n onSwipe && onSwipe(translateX, container);\r\n },\r\n [onSwipe, width, node, container]\r\n );\r\n\r\n const onEnd = useCallback(() => {\r\n const { width: nodeWidth } = node\r\n ? node.getBoundingClientRect()\r\n : { width: 0 };\r\n\r\n documentSelect.on(\r\n 'mousemove.swipe touchmove.swipe mouseup.swipe touchend.swipe',\r\n null\r\n );\r\n body.style('cursor', null);\r\n if (width > nodeWidth) {\r\n container.style('cursor', 'grab');\r\n } else {\r\n container.style('cursor', null);\r\n }\r\n\r\n const dt = Date.now() - refs.current.timestamp;\r\n const dtEnd = 44;\r\n\r\n if (dt < dtEnd) {\r\n animate({\r\n duration: duration as number,\r\n timing: animationFunc || easeOutQuad,\r\n draw: (progress, requestId) => {\r\n refs.current.animation = requestId;\r\n const px = Math.round(refs.current.speed * 2 * progress);\r\n const currX = refs.current.currentX + px;\r\n const maxX = width - nodeWidth;\r\n const translateX = range(currX, -maxX, 0);\r\n\r\n const transX = Math.max(Math.min(currX, maxX), 0);\r\n\r\n if (refs.current.currentX !== transX) {\r\n container.style('transform', `translateX(${translateX}px)`);\r\n\r\n onSwipe && onSwipe(translateX, container);\r\n }\r\n },\r\n });\r\n }\r\n }, [\r\n body,\r\n animationFunc,\r\n onSwipe,\r\n container,\r\n duration,\r\n node,\r\n width,\r\n documentSelect,\r\n ]);\r\n\r\n const onStart = useCallback(\r\n event => {\r\n const isTouch = event.type.includes('touch');\r\n const [x] = d3.pointer(isTouch ? event.touches[0] : event, node);\r\n\r\n const { left } =\r\n node && node.parentElement\r\n ? node.parentElement.getBoundingClientRect()\r\n : { left: 0 };\r\n body.style('cursor', 'grabbing');\r\n container.style('cursor', 'grabbing');\r\n\r\n if (refs.current.animation) {\r\n cancelAnimationFrame(refs.current.animation);\r\n refs.current = defaultRefs;\r\n }\r\n\r\n refs.current.startX = Math.max(x + left, 0);\r\n documentSelect.on('mousemove.swipe touchmove.swipe', onMove);\r\n documentSelect.on('mouseup.swipe touchend.swipe', onEnd);\r\n },\r\n [container, body, node, onEnd, onMove, documentSelect]\r\n );\r\n\r\n useEffect(() => {\r\n if (node) {\r\n const { width: nodeWidth } = node.getBoundingClientRect();\r\n\r\n if (width > nodeWidth) {\r\n container.style('cursor', 'grab');\r\n container.on('mousedown.swipe touchstart.swipe', onStart);\r\n }\r\n }\r\n }, [container, onStart, node, width]);\r\n};\r\n","import React from 'react';\r\n\r\nimport { SwipeScrollContainer } from './styled';\r\n\r\nimport { useNode } from '../../../hooks';\r\nimport { useSwipe } from './hooks/useSwipe';\r\n\r\nimport { SwipeScrollProps } from './types';\r\n\r\nexport const SwipeScroll: React.FC<SwipeScrollProps> = ({\r\n children,\r\n width,\r\n onSwipe,\r\n ...props\r\n}): React.ReactElement => {\r\n const [ref, draggingNode] = useNode();\r\n\r\n useSwipe(draggingNode, { width, onSwipe, ...props });\r\n\r\n return (\r\n <SwipeScrollContainer {...props}>\r\n <div ref={ref}>{children}</div>\r\n </SwipeScrollContainer>\r\n );\r\n};\r\n\r\nSwipeScroll.defaultProps = {\r\n duration: 1400,\r\n};\r\n","import styled from 'styled-components';\r\n\r\nimport { LabelContainerProps } from './types';\r\n\r\nconst getTranslate = ({\r\n anchor,\r\n index,\r\n translateX,\r\n translateY,\r\n}: LabelContainerProps) => {\r\n if (index === 0 && anchor === 'middle') {\r\n return `translate(calc(-50% + ${translateX}px), calc(-100% + ${translateY}px))`;\r\n } else if (anchor === 'middle') {\r\n return `translate(calc(-50% + ${translateX}px), calc(${translateY}px))`;\r\n } else if (anchor === 'start') {\r\n return `translate(calc(${translateX}px), calc(-50% + ${translateY}px))`;\r\n } else if (anchor === 'end') {\r\n return `translate(calc(-100% + ${translateX}px), calc(-50% + ${translateY}px))`;\r\n }\r\n return `translate(${translateX}px, ${translateY}px)`;\r\n};\r\n\r\nexport const LabelContainer = styled.div.attrs<LabelContainerProps>(props => ({\r\n style: {\r\n transform: getTranslate(props),\r\n },\r\n}))<LabelContainerProps>`\r\n position: absolute;\r\n`;\r\n","import styled, { css } from 'styled-components';\r\n\r\nimport { LabelContainerProps } from './types';\r\n\r\nexport const getTranslate = ({\r\n anchor,\r\n index,\r\n translateX,\r\n translateY,\r\n}: LabelContainerProps) => {\r\n if (index === 0 && anchor === 'middle') {\r\n return `translate(calc(-50% + ${translateX}px), calc(-100% + ${translateY}px))`;\r\n } else if (anchor === 'middle') {\r\n return `translate(calc(-50% + ${translateX}px), calc(${translateY}px))`;\r\n } else if (anchor === 'start') {\r\n return `translate(calc(${translateX}px), calc(-50% + ${translateY}px))`;\r\n } else if (anchor === 'end') {\r\n return `translate(calc(-100% + ${translateX}px), calc(-50% + ${translateY}px))`;\r\n }\r\n return `translate(${translateX}px, ${translateY}px)`;\r\n};\r\n\r\nexport const Label = styled.div`\r\n display: flex;\r\n align-items: center;\r\n font-size: 12px;\r\n`;\r\n\r\nexport const Name = styled.div`\r\n text-align: center;\r\n max-width: 120px;\r\n`;\r\n\r\nconst middleBadgeStyles = css`\r\n position: absolute;\r\n top: 50%;\r\n right: 0;\r\n transform: translate(calc(100% + 6px), -50%);\r\n`;\r\n\r\nexport const DefaultBadge = styled.div`\r\n display: flex;\r\n align-items: center;\r\n padding: 2px 4px;\r\n border-radius: 4px;\r\n color: rgb(255, 255, 255);\r\n background-color: rgb(144, 197, 61);\r\n margin-left: 8px;\r\n`;\r\n\r\nexport const MiddleBadge = styled(DefaultBadge)`\r\n ${middleBadgeStyles}\r\n`;\r\n\r\nexport const BadgePrefix = styled.div`\r\n margin-left: 4px;\r\n font-size: 10px;\r\n color: rgba(255, 255, 255, 0.54);\r\n`;\r\n","import styled from 'styled-components';\r\n\r\nimport { Wrapper } from '../../common/components/Wrapper';\r\n\r\nexport const radarChartclassNames = {\r\n radar: 'radar',\r\n radarAxis: 'radarAxis',\r\n radarAxisTextGlobal: 'radarAxisTextGlobal',\r\n radarAxisText: 'radarAxisText',\r\n radarPolygon: 'radarPolygon',\r\n radarLabel: 'radarLabel',\r\n radarLabelName: 'radarLabelName',\r\n radarLabelBadge: 'radarLabelBadge',\r\n radarLabelBadgePrefix: 'radarLabelBadgePrefix',\r\n radarCircle: 'radarCircle',\r\n};\r\n\r\nexport const SvgWrapper = styled(Wrapper)`\r\n .${radarChartclassNames.radarAxis} {\r\n path,\r\n line,\r\n circle {\r\n fill: none;\r\n stroke-width: 1px;\r\n stroke: rgba(149, 149, 149, 0.18);\r\n }\r\n }\r\n .${radarChartclassNames.radarAxisText} {\r\n font-size: 12px;\r\n fill-opacity: 0.56;\r\n }\r\n .${radarChartclassNames.radarPolygon} {\r\n fill-opacity: 0.06;\r\n stroke-width: 2px;\r\n fill: rgb(144, 197, 61);\r\n stroke: rgb(144, 197, 61);\r\n }\r\n .${radarChartclassNames.radarCircle} {\r\n fill: rgb(144, 197, 61);\r\n }\r\n`;\r\n","import React from 'react';\r\nimport ReactDOMServer from 'react-dom/server';\r\nimport * as d3 from 'd3';\r\n\r\nimport { RadarChartProps } from './types';\r\n\r\nimport { appendSvg } from '../../helpers';\r\nimport { drawRadialLabels } from './drawRadialLabels';\r\n\r\nimport {\r\n Label,\r\n MiddleBadge,\r\n DefaultBadge,\r\n Name,\r\n BadgePrefix,\r\n} from '../../common/components/labels';\r\nimport { radarChartclassNames } from './styled';\r\n\r\nexport const draw = (\r\n node: HTMLElement | null,\r\n props: RadarChartProps\r\n): void => {\r\n const {\r\n data,\r\n curve,\r\n polar,\r\n formatValue,\r\n badgePrefix,\r\n labelOffset,\r\n circleRadius,\r\n svgElements,\r\n renderLabel,\r\n customize,\r\n formatAxisValue,\r\n radarStyles,\r\n labelIndex,\r\n selectLabel,\r\n } = props;\r\n\r\n if (node !== null && data.length) {\r\n const defaultBleedLength = 10;\r\n const bleedLength =\r\n typeof props.bleedLength === 'number'\r\n ? props.bleedLength\r\n : defaultBleedLength;\r\n\r\n const { width: nodeWidth } = node.getBoundingClientRect();\r\n const width = props.width || nodeWidth;\r\n const defaultHeight = 400;\r\n const height = props.height || defaultHeight;\r\n\r\n const minValue =\r\n props.minValue ||\r\n Math.min(\r\n 0,\r\n d3.min(data, i => d3.min(i.map(({ value }) => value))) as number\r\n );\r\n const maxValue =\r\n (props.maxValue ||\r\n Math.max(\r\n 0,\r\n d3.max(data, i => d3.max(i.map(({ value }) => value))) as number\r\n )) - minValue;\r\n const paddingX = props.paddingX || 0;\r\n const paddingY = props.paddingY || 0;\r\n const radius = Math.min(\r\n (width - paddingX * 2 - bleedLength * 2) / 2,\r\n (height - paddingY * 2 - bleedLength * 2) / 2\r\n );\r\n\r\n const defaultLevels = 4;\r\n const ticks = d3\r\n .scaleLinear()\r\n .domain([0, maxValue || 1])\r\n .range([])\r\n .ticks(props.levels || defaultLevels);\r\n const lastTick = ticks[ticks.length - 1];\r\n const newLastTick = lastTick + (ticks[1] - ticks[0]);\r\n\r\n if (lastTick < maxValue) {\r\n ticks.push(newLastTick);\r\n }\r\n\r\n const levels = props.levels || ticks.length - 1;\r\n const newMaxValue = ticks[ticks.length - 1];\r\n const angleSlice = (Math.PI * 2) / data[0].length;\r\n\r\n const radiusScale = d3\r\n .scaleLinear()\r\n .range([0, radius])\r\n .domain([0, newMaxValue]);\r\n\r\n const radarLine = d3\r\n .lineRadial()\r\n .curve(d3.curveLinearClosed)\r\n // @ts-ignore\r\n .radius(({ value }) => radiusScale(value) as number)\r\n .angle((_, i) => i * angleSlice);\r\n const radarValue = d3\r\n .lineRadial()\r\n .curve(curve || d3.curveLinearClosed)\r\n // @ts-ignore\r\n .radius(({ value }) => radiusScale(value) as number)\r\n .angle((_, i) => i * angleSlice);\r\n\r\n const svg = appendSvg(node, width, height);\r\n const globalCenter = svg.append('g');\r\n\r\n const levelsGrid = d3.range(1, levels + 1).reverse();\r\n const axisGridY = (value: number) => (-value * radius) / levels;\r\n const getAxisValue = (value: number) => (newMaxValue * value) / levels;\r\n\r\n const gridGlobal = globalCenter\r\n .append('g')\r\n .attr('class', radarChartclassNames.radarAxis)\r\n .selectAll()\r\n .data([data[0]])\r\n .enter();\r\n\r\n const radarGlobal = globalCenter\r\n .append('g')\r\n .attr('class', radarChartclassNames.radar);\r\n\r\n const axis = gridGlobal\r\n .selectAll()\r\n .data(data[0].map(({ name }) => name))\r\n .enter();\r\n\r\n let maxGridHeight = 0;\r\n\r\n if (polar) {\r\n levelsGrid.forEach(value => {\r\n const path = gridGlobal\r\n .append('circle')\r\n .attr('cx', 0)\r\n .attr('cy', 0)\r\n .attr('r', () => (radius / levels) * value);\r\n\r\n const circleNode = path.node() as SVGCircleElement;\r\n const circleHeight = circleNode.getBoundingClientRect().height;\r\n maxGridHeight = Math.max(maxGridHeight, circleHeight);\r\n });\r\n } else {\r\n levelsGrid.map(getAxisValue).forEach(value => {\r\n const path = gridGlobal.append('path').attr('d', () =>\r\n // @ts-ignore\r\n radarLine(Array.from({ length: data[0].length }, () => ({ value })))\r\n );\r\n const pathNode = path.node() as SVGPathElement;\r\n const pathHeight = pathNode.getBoundingClientRect().height;\r\n maxGridHeight = Math.max(maxGridHeight, pathHeight);\r\n });\r\n }\r\n\r\n const radiusByMaxValue = (radiusScale(newMaxValue) as number) + bleedLength;\r\n\r\n axis\r\n .append('line')\r\n .attr('x1', 0)\r\n .attr('y1', 0)\r\n .attr('x2', (_, i) =>\r\n Math.round(radiusByMaxValue * Math.cos(angleSlice * i - Math.PI / 2))\r\n )\r\n .attr('y2', (_, i) =>\r\n Math.round(radiusByMaxValue * Math.sin(angleSlice * i - Math.PI / 2))\r\n );\r\n\r\n radarGlobal\r\n .selectAll('path')\r\n .data(data)\r\n .join('path')\r\n .attr('class', radarChartclassNames.radarPolygon)\r\n .attr('style', (_, index) => radarStyles?.[index] || '')\r\n .attr('d', d =>\r\n radarValue(\r\n // @ts-ignore\r\n d.map(dataItem => ({\r\n ...dataItem,\r\n value: dataItem.value - minValue,\r\n }))\r\n )\r\n );\r\n\r\n const format = d3.format(',');\r\n const axisTextGlobal = globalCenter\r\n .append('g')\r\n .attr('class', radarChartclassNames.radarAxisTextGlobal);\r\n axisTextGlobal\r\n .selectAll('text')\r\n .data(levelsGrid)\r\n .enter()\r\n .append('text')\r\n .attr('class', radarChartclassNames.radarAxisText)\r\n .attr('x', '4')\r\n .attr('y', axisGridY)\r\n .attr('dy', 0)\r\n .attr('dominant-baseline', 'central')\r\n .text((value, index) => {\r\n const axisValue = getAxisValue(value) + minValue;\r\n\r\n return formatAxisValue\r\n ? formatAxisValue(axisValue, index)\r\n : format(axisValue);\r\n });\r\n\r\n circleRadius &&\r\n data.forEach(item => {\r\n const circleGlobal = globalCenter\r\n .append('g')\r\n .attr('class', radarChartclassNames.radarCircle);\r\n\r\n item.forEach(({ value }, i) => {\r\n circleGlobal\r\n .append('circle')\r\n .attr(\r\n 'cx',\r\n Math.round(\r\n (radiusScale(value) as number) *\r\n Math.cos(angleSlice * i - Math.PI / 2)\r\n )\r\n )\r\n .attr(\r\n 'cy',\r\n Math.round(\r\n radiusScale(\r\n value * Math.sin(angleSlice * i - Math.PI / 2)\r\n ) as number\r\n )\r\n )\r\n .attr('r', circleRadius);\r\n });\r\n });\r\n\r\n const defaultLabelOffset = 8;\r\n const heightInner = height - bleedLength - paddingY;\r\n const translateX = width / 2;\r\n const translateY = heightInner / 2 + (heightInner - maxGridHeight) / 2;\r\n const offset = bleedLength + (labelOffset || defaultLabelOffset);\r\n\r\n globalCenter.attr('transform', `translate(${translateX},${translateY})`);\r\n\r\n drawRadialLabels({\r\n node,\r\n maxValue: newMaxValue,\r\n translateX,\r\n translateY,\r\n dataLength: data[labelIndex || 0].length,\r\n angleSlice,\r\n radius,\r\n radiusScale,\r\n xOffset: offset,\r\n yOffset: offset,\r\n renderLabel: (anchor, index) => {\r\n const items = data.map(item => item[index]);\r\n const Badge = anchor === 'middle' ? MiddleBadge : DefaultBadge;\r\n const item = data[labelIndex || 0][index];\r\n const { name, value } = item;\r\n\r\n return renderLabel ? (\r\n renderLabel({ item, items, anchor, index })\r\n ) : (\r\n <Label className={radarChartclassNames.radarLabel}>\r\n <Name className={radarChartclassNames.radarLabelName}>{name}</Name>\r\n <Badge className={radarChartclassNames.radarLabelBadge}>\r\n {formatValue ? formatValue(value, index) : format(value)}\r\n {badgePrefix && (\r\n <BadgePrefix\r\n className={radarChartclassNames.radarLabelBadgePrefix}\r\n >\r\n {badgePrefix}\r\n </BadgePrefix>\r\n )}\r\n </Badge>\r\n </Label>\r\n );\r\n },\r\n selectLabel: (label, anchor, index) => {\r\n if (selectLabel) {\r\n const items = data.map(item => item[index]);\r\n const item = data[labelIndex || 0][index];\r\n\r\n selectLabel(label, { index, item, items, anchor });\r\n }\r\n },\r\n });\r\n\r\n if (svgElements) {\r\n const html = ReactDOMServer.renderToString(svgElements);\r\n\r\n svg.append('g').html(html);\r\n }\r\n\r\n customize && customize(svg);\r\n }\r\n};\r\n","import * as d3 from 'd3';\r\nimport ReactDOMServer from 'react-dom/server';\r\nimport React from 'react';\r\n\r\nimport { DrawRadialLabels } from './types';\r\n\r\nimport { getTextAnchor } from '../helpers';\r\nimport { LabelContainer } from './styled';\r\n\r\nconst labelClassName = 'd3-chart-label';\r\n\r\nexport const drawRadialLabels = ({\r\n node,\r\n dataLength,\r\n radiusScale,\r\n maxValue,\r\n angleSlice,\r\n radius,\r\n xOffset,\r\n yOffset,\r\n translateX,\r\n translateY,\r\n renderLabel,\r\n selectLabel,\r\n}: DrawRadialLabels) => {\r\n const d3container = d3.select(node);\r\n d3container.selectAll(`.${labelClassName}`).remove();\r\n\r\n const pxToValue = (value: number) => (maxValue / radius) * value;\r\n const axisX = (i: number) =>\r\n (radiusScale(maxValue + pxToValue(xOffset || 0)) as number) *\r\n Math.cos(angleSlice * i - Math.PI / 2);\r\n\r\n const axisY = (i: number) =>\r\n radiusScale(\r\n (maxValue + pxToValue(yOffset || 0)) *\r\n Math.sin(angleSlice * i - Math.PI / 2)\r\n ) as number;\r\n\r\n const labels = Array.from({ length: dataLength }, (_, index) => ({\r\n x: Math.ceil(axisX(index)),\r\n y: Math.ceil(axisY(index)),\r\n }));\r\n\r\n labels.forEach(({ x, y }: { x: number; y: number }, index: number) => {\r\n const anchor = getTextAnchor(index, dataLength);\r\n const html = ReactDOMServer.renderToString(\r\n <LabelContainer\r\n anchor={anchor}\r\n translateX={translateX || 0}\r\n translateY={translateY || 0}\r\n index={index}\r\n style={{\r\n left: x,\r\n top: y,\r\n }}\r\n >\r\n {typeof renderLabel === 'function'\r\n ? renderLabel(anchor, index)\r\n : renderLabel}\r\n </LabelContainer>\r\n );\r\n\r\n const label = d3container\r\n .append('div')\r\n .attr('class', labelClassName)\r\n .html(html);\r\n\r\n selectLabel(label, anchor, index);\r\n });\r\n};\r\n","const degByIndex = (index: number, count: number): number => {\r\n const degs = 360;\r\n const deg = (degs / count) * index;\r\n\r\n return deg;\r\n};\r\n\r\nexport const getTextAnchor = (\r\n index: number,\r\n length: number\r\n): 'start' | 'middle' | 'end' => {\r\n const deg = degByIndex(index, length);\r\n const halfAngle = 180;\r\n\r\n if ([0, halfAngle].includes(deg)) {\r\n return 'middle';\r\n }\r\n if (deg < halfAngle) {\r\n return 'start';\r\n }\r\n\r\n return 'end';\r\n};\r\n\r\nexport const getMaxWidth = (elements: SVGElement[]) => {\r\n let maxWidth = 0;\r\n\r\n for (let i = 0; i < elements.length; i++) {\r\n const element = elements[i];\r\n\r\n if (element && 'getBoundingClientRect' in element) {\r\n maxWidth = Math.max(maxWidth, element.getBoundingClientRect().width);\r\n }\r\n }\r\n\r\n return maxWidth;\r\n};\r\n","import React, { useEffect } from 'react';\r\nimport * as d3 from 'd3';\r\n\r\nimport { RadarChartProps } from './types';\r\n\r\nimport { useNode } from '../../hooks';\r\nimport { useResize } from '../../hooks';\r\n\r\nimport { draw } from './draw';\r\n\r\nimport { SvgWrapper } from './styled';\r\n\r\nexport const RadarChart: React.FC<RadarChartProps> = (\r\n props\r\n): React.ReactElement => {\r\n const { className, style } = props;\r\n const [ref, node] = useNode();\r\n\r\n useEffect(() => {\r\n node && draw(node, props);\r\n }, [node, props]);\r\n\r\n const onDraw = () => draw(node, props);\r\n\r\n useResize(props.width, onDraw);\r\n\r\n return (\r\n <div className={className} style={style}>\r\n <SvgWrapper ref={ref} />\r\n </div>\r\n );\r\n};\r\n\r\nRadarChart.defaultProps = {\r\n height: 400,\r\n data: [],\r\n curve: d3.curveLinearClosed,\r\n};\r\n","export function radiansToDegrees(radians: number): number {\r\n const flatAngle = 180;\r\n\r\n return (radians * flatAngle) / Math.PI;\r\n}\r\n\r\nexport function degreesToRadians(degrees: number): number {\r\n const flatAngle = 180;\r\n\r\n return degrees * (Math.PI / flatAngle);\r\n}\r\n","import styled from 'styled-components';\r\n\r\nimport { Wrapper } from '../../common/components/Wrapper';\r\n\r\nexport const pieChartclassNames = {\r\n pieGlobal: 'pieGlobal',\r\n pieSlice: 'pieSlice',\r\n pieSliceLabel: 'pieSliceLabel',\r\n pieSliceLabelValue: 'pieSliceLabelValue',\r\n pieSliceLabelName: 'pieSliceLabelName',\r\n pieRadialLabel: 'pieRadialLabel',\r\n pieRadialLink: 'pieRadialLink',\r\n pieTooltipContainer: 'pieTooltipContainer',\r\n pieTooltipFlex: 'pieTooltipFlex',\r\n pieTooltip: 'pieTooltip',\r\n pieTooltipItem: 'pieTooltipItem',\r\n pieTooltipName: 'pieTooltipName',\r\n pieTooltipValue: 'pieTooltipValue',\r\n pieTooltipColorBox: 'pieTooltipColorBox',\r\n pieFullChartTooltipCircle: 'pieFullChartTooltipCircle',\r\n};\r\n\r\nexport const SvgWrapper = styled(Wrapper)`\r\n .${pieChartclassNames.pieSliceLabel} {\r\n fill: #4a4a4a;\r\n }\r\n .${pieChartclassNames.pieRadialLabel} {\r\n position: absolute;\r\n max-width: 128px;\r\n }\r\n .${pieChartclassNames.pieRadialLink} {\r\n stroke: #000;\r\n }\r\n .${pieChartclassNames.pieFullChartTooltipCircle} {\r\n fill: transparent;\r\n cursor: pointer;\r\n }\r\n`;\r\n","import { PieChartDatum } from '../types';\r\n\r\nexport const getMidFactor = (d: PieChartDatum) =>\r\n d.startAngle + (d.endAngle - d.startAngle) / 2 < Math.PI ? 1 : -1;\r\n\r\nexport const getAlign = (d: PieChartDatum): 'start' | 'end' => {\r\n const midangle = d.startAngle + (d.endAngle - d.startAngle) / 2;\r\n\r\n return midangle < Math.PI ? 'start' : 'end';\r\n};\r\n","import styled from 'styled-components';\r\n\r\nexport const TooltipFlex = styled.div`\r\n width: 0;\r\n height: 0;\r\n display: flex;\r\n align-items: flex-end;\r\n justify-content: center;\r\n pointer-events: none;\r\n white-space: nowrap;\r\n`;\r\n\r\nexport const LabelFlex = styled(TooltipFlex)``;\r\n\r\nexport const LabelFlexCenter = styled(LabelFlex)`\r\n align-items: center;\r\n`;\r\n\r\nexport const TooltipContainer = styled.div`\r\n position: relative;\r\n font-size: 11px;\r\n color: #fff;\r\n margin-bottom: 8px;\r\n padding: 4px 6px;\r\n background-color: rgba(48, 69, 79, 1);\r\n border-radius: 4px;\r\n box-shadow: 0 0.1875rem 0.5rem rgba(48, 69, 79, 0.06);\r\n :before {\r\n content: '';\r\n position: absolute;\r\n bottom: 0;\r\n left: 50%;\r\n transform: translate(-50%, 100%);\r\n width: 0;\r\n height: 0;\r\n border-style: solid;\r\n border-width: 4px 3px 0 3px;\r\n border-color: rgba(48, 69, 79, 1) transparent transparent transparent;\r\n }\r\n`;\r\n\r\nexport const TooltipGroupName = styled.div`\r\n font-size: 14px;\r\n margin-bottom: 6px;\r\n`;\r\n\r\nexport const TooltipItem = styled.div`\r\n display: flex;\r\n align-items: center;\r\n margin-bottom: 0.25rem;\r\n &:last-of-type {\r\n margin-bottom: 0;\r\n }\r\n`;\r\n\r\nexport const ColFlex = styled.div`\r\n display: flex;\r\n align-items: center;\r\n margin-right: 4px;\r\n`;\r\n\r\nexport const ColorBox = styled.div`\r\n margin-right: 4px;\r\n width: 10px;\r\n height: 10px;\r\n border-radius: 2px;\r\n`;\r\n\r\nexport const ColorLine = styled(ColorBox)`\r\n height: 2px;\r\n border-radius: 0;\r\n`;\r\n\r\nexport const Name = styled.div`\r\n margin-right: 4px;\r\n`;\r\n\r\nexport const Value = styled.div`\r\n text-align: right;\r\n flex-shrink: 0;\r\n flex-grow: 1;\r\n`;\r\n\r\nexport const Label = styled.div`\r\n position: relative;\r\n font-size: 11px;\r\n color: #fff;\r\n font-weight: bold;\r\n letter-spacing: 0.52px;\r\n`;\r\n\r\nexport const LabelTop = styled(Label)`\r\n top: 6px;\r\n`;\r\n\r\nexport const LabelBottom = styled(Label)`\r\n bottom: 6px;\r\n`;\r\n","import * as d3 from 'd3';\r\nimport ReactDOMServer from 'react-dom/server';\r\n\r\nimport { PieChartProps, PieChartDatum } from './types';\r\n\r\nimport { appendSvg } from '../../helpers';\r\nimport { degreesToRadians, radiansToDegrees } from '../../helpers/math';\r\nimport { drawRadialLabels } from './drawRadialLabels';\r\nimport { drawTooltip } from './drawTooltips';\r\n\r\nimport { pieChartclassNames } from './styled';\r\n\r\nexport const draw = (node: HTMLElement | null, props: PieChartProps): void => {\r\n const {\r\n data,\r\n padAngle,\r\n onClick,\r\n outerRadius,\r\n startAngle,\r\n endAngle,\r\n cornerRadius,\r\n margin,\r\n enableSlicesLabels,\r\n formatSliceLabel,\r\n slicesLabelsSkipAngle,\r\n enableSlicesLabelsName,\r\n formatSliceLabelName,\r\n borderWidth,\r\n borderColor,\r\n enableRadialLabels,\r\n backgroundColor,\r\n radialLabelsLinkHorizontalLength,\r\n radialLabelsTextXOffset,\r\n formatRadialLabel,\r\n radialLabelYOffset,\r\n svgElements,\r\n formatSliceTitle,\r\n radialAngleXOffset,\r\n withTooltip,\r\n fullChartTooltip,\r\n tooltipClassName,\r\n tooltipBind,\r\n renderTooltip,\r\n tooltipStyle,\r\n } = props;\r\n\r\n if (node !== null && data.length) {\r\n const marginTop = margin ? margin.top : 0;\r\n const marginRight = margin ? margin.right : 0;\r\n const marginBottom = margin ? margin.bottom : 0;\r\n const marginLeft = margin ? margin.left : 0;\r\n const { width: nodeWidth } = node.getBoundingClientRect();\r\n const width = props.width || nodeWidth;\r\n const defaultHeight = 240;\r\n const height = props.height || defaultHeight;\r\n const radius =\r\n (Math.min(width, height) -\r\n (borderWidth || 0) * 2 -\r\n (width > height\r\n ? marginTop + marginBottom\r\n : marginRight + marginLeft)) /\r\n 2;\r\n\r\n const svg = appendSvg(node, width, height);\r\n const global = svg\r\n .append('g')\r\n .attr('class', pieChartclassNames.pieGlobal)\r\n .attr(\r\n 'transform',\r\n `translate(${(width - (marginLeft + marginRight)) / 2 +\r\n marginLeft},${(height - (marginBottom + marginTop)) / 2 + marginTop})`\r\n );\r\n\r\n const maxPadAngle = 45;\r\n const dividerPadAngle = 100;\r\n const fullAngle = 360;\r\n\r\n const pie = d3\r\n .pie()\r\n .startAngle(-degreesToRadians(startAngle || 0))\r\n .endAngle(degreesToRadians(endAngle || fullAngle))\r\n .padAngle(\r\n padAngle\r\n ? Math.max(Math.min(padAngle / dividerPadAngle, maxPadAngle), 0)\r\n : 0\r\n )\r\n .sort(null)\r\n // @ts-ignore\r\n .value(({ value }) => value);\r\n\r\n // @ts-ignore\r\n const dataReady = pie(data) as PieChartDatum[];\r\n\r\n const maxOuterRadius = 0.95;\r\n const arc = d3\r\n .arc()\r\n .cornerRadius(cornerRadius || 0)\r\n .innerRadius(radius)\r\n .outerRadius(\r\n radius * Math.min(Math.max(outerRadius || 0, 0), maxOuterRadius)\r\n );\r\n\r\n if (typeof backgroundColor === 'string') {\r\n global\r\n .append('path')\r\n .attr('fill', backgroundColor)\r\n .attr('d', () =>\r\n // @ts-ignore\r\n arc({\r\n startAngle: degreesToRadians(0),\r\n endAngle: degreesToRadians(fullAngle),\r\n })\r\n );\r\n }\r\n\r\n const format = d3.format(',');\r\n const allSlices = global\r\n .selectAll('allSlices')\r\n .data(dataReady)\r\n .enter()\r\n .append('path')\r\n // @ts-ignore\r\n .attr('d', arc);\r\n\r\n allSlices\r\n .attr('class', pieChartclassNames.pieSlice)\r\n .attr('fill', ({ index }) => data[index].color || '')\r\n .attr('stroke', borderColor || '')\r\n .attr('stroke-width', borderWidth || 0)\r\n .attr('style', onClick ? 'cursor: pointer' : '')\r\n .on(\r\n 'click',\r\n // @ts-ignore\r\n (_, d) => onClick && onClick(data[d.index])\r\n )\r\n .append('svg:title')\r\n .text(d =>\r\n formatSliceTitle\r\n ? // @ts-ignore\r\n formatSliceTitle(d)\r\n : fullChartTooltip || withTooltip\r\n ? ''\r\n : `${data[d.index].name || ''} (${format(data[d.index].value)})`\r\n );\r\n\r\n if (enableSlicesLabels) {\r\n const text = global\r\n .selectAll('allSlices')\r\n .data(dataReady)\r\n .enter()\r\n .append('text')\r\n .attr('class', pieChartclassNames.pieSliceLabel)\r\n .attr('text-anchor', 'middle')\r\n .attr('dominant-baseline', 'central')\r\n .attr(\r\n 'transform',\r\n // @ts-ignore\r\n (d: PieChartDatum) => 'translate(' + arc.centroid(d) + ')'\r\n );\r\n\r\n text\r\n .append('tspan')\r\n .attr('class', pieChartclassNames.pieSliceLabelValue)\r\n // @ts-ignore\r\n .text((d: PieChartDatum) => {\r\n const deg = radiansToDegrees(d.endAngle - d.startAngle);\r\n\r\n if (!slicesLabelsSkipAngle || deg > slicesLabelsSkipAngle) {\r\n return formatSliceLabel ? formatSliceLabel(d) : d.value;\r\n }\r\n });\r\n\r\n if (enableSlicesLabelsName) {\r\n text\r\n .append('tspan')\r\n .attr('class', pieChartclassNames.pieSliceLabelName)\r\n // @ts-ignore\r\n .text((d: PieChartDatum) =>\r\n formatSliceLabelName ? formatSliceLabelName(d) : d.data.name\r\n )\r\n .attr('x', '0')\r\n .attr('dy', '1.2em');\r\n }\r\n }\r\n\r\n drawRadialLabels({\r\n arc,\r\n enableRadialLabels,\r\n global,\r\n radius,\r\n node,\r\n dataReady,\r\n translateX: (width - (marginLeft - marginRight)) / 2,\r\n translateY: (height + (marginTop - marginBottom)) / 2,\r\n radialLabelsLinkHorizontalLength,\r\n radialLabelsTextXOffset,\r\n formatRadialLabel,\r\n radialLabelYOffset,\r\n radialAngleXOffset,\r\n });\r\n\r\n if (withTooltip || fullChartTooltip) {\r\n drawTooltip({\r\n fullChartTooltip,\r\n global,\r\n data,\r\n tooltipClassName,\r\n tooltipBind,\r\n renderTooltip,\r\n allSlices,\r\n arc,\r\n tooltipStyle,\r\n width,\r\n height,\r\n radius,\r\n });\r\n }\r\n\r\n if (svgElements) {\r\n const html = ReactDOMServer.renderToString(svgElements);\r\n\r\n svg.append('g').html(html);\r\n }\r\n }\r\n};\r\n","import * as d3 from 'd3';\r\nimport ReactDOMServer from 'react-dom/server';\r\n\r\nimport { DrawRadialLabels } from './types';\r\nimport { PieChartDatum } from '../types';\r\n\r\nimport { pieChartclassNames } from '../styled';\r\nimport { getMidFactor, getAlign } from './helpers';\r\nimport { getTranslate } from '../../../common/components/labels';\r\n\r\nexport const drawRadialLabels = ({\r\n arc,\r\n enableRadialLabels,\r\n global,\r\n node,\r\n radius,\r\n dataReady,\r\n radialLabelsLinkHorizontalLength,\r\n formatRadialLabel,\r\n radialLabelsTextXOffset,\r\n translateX,\r\n translateY,\r\n radialLabelYOffset,\r\n radialAngleXOffset,\r\n}: DrawRadialLabels): void => {\r\n const d3container = d3.select(node);\r\n d3container.selectAll(`.${pieChartclassNames.pieRadialLabel}`).remove();\r\n\r\n if (enableRadialLabels) {\r\n const defaultRadialLabelsLinkHorizontalLength = 4;\r\n const outerArc = d3\r\n .arc()\r\n .innerRadius(radius)\r\n .outerRadius(radius);\r\n\r\n global\r\n .selectAll('allPolylines')\r\n .data(dataReady)\r\n .enter()\r\n .append('polyline')\r\n .attr('class', pieChartclassNames.pieRadialLink)\r\n .style('fill', 'none')\r\n .attr('points', (d: PieChartDatum) => {\r\n const midFactor = getMidFactor(d);\r\n const posA = arc.centroid(d);\r\n const posB = outerArc.centroid(d);\r\n const posC = outerArc.centroid(d);\r\n const posCPi = [\r\n (radius +\r\n (radialLabelsLinkHorizontalLength ||\r\n defaultRadialLabelsLinkHorizontalLength)) *\r\n midFactor,\r\n posC[1],\r\n ];\r\n return [\r\n [posA[0], posA[1]],\r\n [\r\n posB[0] + (radialAngleXOffset || 0) * midFactor,\r\n posB[1] - (radialLabelYOffset || 0) * d.index,\r\n ],\r\n [posCPi[0], posCPi[1] - (radialLabelYOffset || 0) * d.index],\r\n ];\r\n });\r\n\r\n const getPosition = (d: PieChartDatum): [number, number] => {\r\n const pos = outerArc.centroid(d);\r\n return [\r\n (radius +\r\n (radialLabelsLinkHorizontalLength ||\r\n defaultRadialLabelsLinkHorizontalLength)) *\r\n getMidFactor(d),\r\n pos[1],\r\n ];\r\n };\r\n\r\n const defaultRadialLabelsTextXOffset = 4;\r\n d3container\r\n .selectAll('allLabels')\r\n .data(dataReady)\r\n .enter()\r\n .append('div')\r\n // @ts-ignore\r\n .html((d: PieChartDatum) => {\r\n const html = ReactDOMServer.renderToString(\r\n // @ts-ignore\r\n formatRadialLabel ? formatRadialLabel(d) : d.data.name\r\n );\r\n\r\n return html;\r\n })\r\n .attr('class', pieChartclassNames.pieRadialLabel)\r\n // @ts-ignore\r\n .style('transform', (d: PieChartDatum) =>\r\n getTranslate({\r\n anchor: getAlign(d),\r\n index: d.index,\r\n translateX,\r\n translateY: translateY - (radialLabelYOffset || 0) * d.index,\r\n })\r\n )\r\n // @ts-ignore\r\n .style(\r\n 'left',\r\n // @ts-ignore\r\n (d: PieChartDatum) =>\r\n `${getPosition(d)[0] -\r\n (getAlign(d) === 'start'\r\n ? -(radialLabelsTextXOffset || defaultRadialLabelsTextXOffset)\r\n : radialLabelsTextXOffset || defaultRadialLabelsTextXOffset)}px`\r\n )\r\n // @ts-ignore\r\n .style('top', (d: PieChartDatum) => `${getPosition(d)[1]}px`)\r\n // @ts-ignore\r\n .style('text-align', getAlign);\r\n }\r\n};\r\n","import React from 'react';\r\nimport ReactDOMServer from 'react-dom/server';\r\nimport * as d3 from 'd3';\r\n\r\nimport { pieChartclassNames as classNames } from '../styled';\r\n\r\nimport { DrawTooltipProps } from './types';\r\n\r\nimport {\r\n TooltipContainer,\r\n TooltipFlex,\r\n TooltipItem,\r\n Value,\r\n Name,\r\n ColorBox,\r\n} from '../../../common/components/tooltips';\r\nimport { PieChartData, PieChartDatum } from '../types';\r\n\r\nexport const drawTooltip = ({\r\n fullChartTooltip,\r\n global,\r\n tooltipRoot,\r\n data,\r\n tooltipClassName,\r\n tooltipBind,\r\n renderTooltip,\r\n arc,\r\n allSlices,\r\n tooltipStyle,\r\n width,\r\n height,\r\n radius,\r\n}: DrawTooltipProps) => {\r\n const container: Element | null =\r\n tooltipRoot || document.querySelector('body');\r\n const format = d3.format(',');\r\n const pieTooltipContainer: d3.Selection<\r\n HTMLDivElement,\r\n unknown,\r\n null,\r\n undefined\r\n > = d3.select(container).select(`.${classNames.pieTooltipContainer}`);\r\n const isEmpty = pieTooltipContainer.empty();\r\n\r\n const tooltipContainer = isEmpty\r\n ? d3\r\n .select(container)\r\n .append('div')\r\n .attr(\r\n 'class',\r\n `${classNames.pieTooltipContainer} ${tooltipClassName || ''}`\r\n )\r\n .style('position', 'absolute')\r\n .style('opacity', '0')\r\n .style('z-index', '103')\r\n : pieTooltipContainer;\r\n\r\n if (tooltipStyle) {\r\n Object.entries(tooltipStyle).forEach(([prop, val]) =>\r\n tooltipContainer.style(prop, val)\r\n );\r\n }\r\n\r\n tooltipContainer.html('');\r\n let isVisible = false;\r\n\r\n const setVisible = (visible?: boolean) => {\r\n isVisible = Boolean(visible);\r\n const opacity = isVisible ? '1' : '0';\r\n tooltipContainer.style('opacity', opacity);\r\n };\r\n\r\n const setPosition = (event: any, pieChartDatum?: PieChartDatum) => {\r\n let [x, y] = d3.pointer(event, document);\r\n\r\n if (!tooltipBind && fullChartTooltip) {\r\n const [itemX, itemY] = d3.pointer(event, event.target);\r\n\r\n x = x - itemX;\r\n y = y - itemY;\r\n } else if (!tooltipBind) {\r\n const globalNode = global.node();\r\n const {\r\n x: itemX,\r\n y: itemY,\r\n width: itemWidth,\r\n height: itemHeight,\r\n } = globalNode\r\n ? globalNode.getBoundingClientRect()\r\n : { x: 0, y: 0, width: 0, height: 0 };\r\n const [arcX, arcY] = arc.centroid(pieChartDatum as d3.DefaultArcObject);\r\n x = itemX + itemWidth / 2 + arcX;\r\n y = itemY + itemHeight / 2 + arcY;\r\n }\r\n\r\n tooltipContainer.style('left', x + 'px').style('top', y + 'px');\r\n };\r\n\r\n const setTooltip = (event: any, pieChartDatum?: PieChartDatum) => {\r\n setVisible(true);\r\n setPosition(event, pieChartDatum);\r\n const pieChartData = pieChartDatum ? [pieChartDatum.data] : data;\r\n\r\n tooltipContainer.html(() => {\r\n const html = ReactDOMServer.renderToString(\r\n <TooltipFlex className={classNames.pieTooltipFlex}>\r\n <TooltipContainer className={classNames.pieTooltip}>\r\n {renderTooltip ? (\r\n renderTooltip(pieChartData)\r\n ) : (\r\n <>\r\n {pieChartData.map(\r\n ({ color, name, value }: PieChartData, index: number) => (\r\n <TooltipItem\r\n key={`${name}-${index}`}\r\n className={classNames.pieTooltipItem}\r\n >\r\n {color && (\r\n <ColorBox\r\n className={classNames.pieTooltipColorBox}\r\n style={{ backgroundColor: color }}\r\n />\r\n )}\r\n {name && (\r\n <Name className={classNames.pieTooltipName}>\r\n {name}\r\n </Name>\r\n )}\r\n <Value className={classNames.pieTooltipValue}>\r\n {format(value)}\r\n </Value>\r\n </TooltipItem>\r\n )\r\n )}\r\n </>\r\n )}\r\n </TooltipContainer>\r\n </TooltipFlex>\r\n );\r\n\r\n return html;\r\n });\r\n };\r\n\r\n if (fullChartTooltip) {\r\n global.on('mouseover.fulltooltip', event => setTooltip(event));\r\n global.on('mouseout.fulltooltip', () => {\r\n tooltipContainer.html('');\r\n setVisible();\r\n });\r\n\r\n if (width && height) {\r\n global\r\n .append('circle')\r\n .attr('class', classNames.pieFullChartTooltipCircle)\r\n .attr('r', radius)\r\n .attr('cx', 0)\r\n .attr('cy', 0);\r\n }\r\n\r\n if (!tooltipBind) {\r\n global.on('touchmove.tooltipBind mousemove.tooltipBind', event =>\r\n setPosition(event)\r\n );\r\n }\r\n } else {\r\n allSlices.on('mouseover.slice', setTooltip);\r\n if (!tooltipBind) {\r\n allSlices.on('touchmove.slice mousemove.slice', setPosition);\r\n }\r\n allSlices.on('mouseout.slice', () => {\r\n tooltipContainer.html('');\r\n setVisible();\r\n });\r\n }\r\n};\r\n","import React, { useEffect } from 'react';\r\n\r\nimport { PieChartProps } from './types';\r\n\r\nimport { useNode } from '../../hooks';\r\nimport { useResize } from '../../hooks';\r\n\r\nimport { draw } from './draw';\r\n\r\nimport { SvgWrapper } from './styled';\r\n\r\nexport const PieChart: React.FC<PieChartProps> = (\r\n props\r\n): React.ReactElement => {\r\n const { className, style, children } = props;\r\n const [ref, node] = useNode();\r\n\r\n useEffect(() => {\r\n node && draw(node, props);\r\n }, [node, props]);\r\n\r\n const onDraw = () => draw(node, props);\r\n\r\n useResize(props.width, onDraw);\r\n\r\n return (\r\n <div className={className} style={style}>\r\n <SvgWrapper ref={ref}>{children}</SvgWrapper>\r\n </div>\r\n );\r\n};\r\n\r\nPieChart.defaultProps = {\r\n data: [],\r\n startAngle: 0,\r\n endAngle: 360,\r\n slicesLabelsSkipAngle: 0,\r\n radialLabelYOffset: 16,\r\n radialAngleXOffset: 8,\r\n};\r\n","import * as d3 from 'd3';\r\n\r\nimport { Interpolator } from '../../common/types/interpolator';\r\nimport { GetLegendProps } from './types';\r\n\r\nconst defaultN = 256;\r\n\r\nexport const legendClassNames = {\r\n legendContainer: 'd3-legend-container',\r\n legendTitle: 'd3-legend-title',\r\n legendTick: 'd3-legend-tick',\r\n legendTickLine: 'd3-legend-tick-line',\r\n legendTickText: 'd3-legend-tick-text',\r\n};\r\n\r\nfunction ramp(color: Interpolator, n: number = defaultN) {\r\n const canvas = document.createElement('canvas');\r\n canvas.width = n;\r\n canvas.height = 1;\r\n const context = canvas.getContext('2d') as CanvasRenderingContext2D;\r\n\r\n for (let i = 0; i < n; ++i) {\r\n context.fillStyle = color(i / (n - 1));\r\n context.fillRect(i, 0, 1, 1);\r\n }\r\n\r\n return canvas;\r\n}\r\n\r\nexport const legendDefaultParams = {\r\n tickSize: 6,\r\n height: 44,\r\n width: 320,\r\n marginTop: 18,\r\n marginBottom: 16,\r\n ticksDivier: 64,\r\n titleMarginBottom: 6,\r\n};\r\n\r\nexport const getLegend = ({\r\n color,\r\n title,\r\n tickSize = legendDefaultParams.tickSize,\r\n width = legendDefaultParams.width,\r\n height = legendDefaultParams.height + tickSize,\r\n marginTop = legendDefaultParams.marginTop,\r\n marginRight = 0,\r\n marginBottom = legendDefaultParams.marginBottom + tickSize,\r\n marginLeft = 0,\r\n ticks = legendDefaultParams.width / legendDefaultParams.ticksDivier,\r\n tickFormat,\r\n tickValues,\r\n titleMarginBottom,\r\n}: GetLegendProps) => {\r\n const svg = d3\r\n .create('svg')\r\n .attr('width', width)\r\n .attr('height', height)\r\n // @ts-ignore\r\n .attr('viewBox', [0, 0, width, height])\r\n .style('overflow', 'visible')\r\n .style('display', 'block');\r\n\r\n let tickAdjust = (g: d3.Selection<SVGGElement, any, any, any>) => {\r\n const tick = g.selectAll('.tick');\r\n\r\n tick\r\n .selectAll('.tick line')\r\n .attr('y1', marginTop + marginBottom - height)\r\n .attr('class', legendClassNames.legendTickLine);\r\n tick.selectAll('.tick text').attr('class', legendClassNames.legendTickText);\r\n tick.attr('class', legendClassNames.legendTick);\r\n\r\n return tick;\r\n };\r\n let x: any;\r\n\r\n // Continuous\r\n if (color.interpolate) {\r\n const n = Math.min(color.domain().length, color.range().length);\r\n\r\n x = color\r\n .copy()\r\n .rangeRound(\r\n d3.quantize(d3.interpolate(marginLeft, width - marginRight), n)\r\n );\r\n\r\n svg\r\n .append('image')\r\n .attr('x', marginLeft)\r\n .attr('y', marginTop)\r\n .attr('class', legendClassNames.legendContainer)\r\n .attr('width', width - marginLeft - marginRight)\r\n .attr('height', height - marginTop - marginBottom)\r\n .attr('preserveAspectRatio', 'none')\r\n .attr(\r\n 'xlink:href',\r\n ramp(\r\n color.copy().domain(d3.quantize(d3.interpolate(0, 1), n))\r\n ).toDataURL()\r\n );\r\n }\r\n\r\n // Sequential\r\n else if (color.interpolator) {\r\n x = Object.assign(\r\n color\r\n .copy()\r\n .interpolator(d3.interpolateRound(marginLeft, width - marginRight)),\r\n {\r\n range() {\r\n return [marginLeft, width - marginRight];\r\n },\r\n }\r\n );\r\n\r\n svg\r\n .append('image')\r\n .attr('x', marginLeft)\r\n .attr('y', marginTop)\r\n .attr('width', width - marginLeft - marginRight)\r\n .attr('height', height - marginTop - marginBottom)\r\n .attr('preserveAspectRatio', 'none')\r\n .attr('xlink:href', ramp(color.interpolator()).toDataURL());\r\n\r\n // scaleSequentialQuantile doesn’t implement ticks or tickFormat.\r\n if (!x.ticks) {\r\n if (tickValues === undefined) {\r\n const n = Math.round(ticks + 1);\r\n tickValues = d3\r\n .range(n)\r\n .map(i => d3.quantile(color.domain(), i / (n - 1)));\r\n }\r\n if (typeof tickFormat !== 'function') {\r\n tickFormat = d3.format(tickFormat === undefined ? ',f' : tickFormat);\r\n }\r\n }\r\n }\r\n\r\n svg\r\n .append('g')\r\n .attr('transform', `translate(0,${height - marginBottom})`)\r\n .call(\r\n d3\r\n .axisBottom(x)\r\n .ticks(ticks, typeof tickFormat === 'string' ? tickFormat : undefined)\r\n // @ts-ignore\r\n .tickFormat(typeof tickFormat === 'function' ? tickFormat : undefined)\r\n .tickSize(tickSize)\r\n // @ts-ignore\r\n .tickValues(tickValues)\r\n )\r\n .call(tickAdjust)\r\n .call(g => g.select('.domain').remove())\r\n .call(g =>\r\n g\r\n .append('text')\r\n .attr('x', marginLeft)\r\n .attr('class', legendClassNames.legendTitle)\r\n .attr(\r\n 'y',\r\n marginTop +\r\n marginBottom -\r\n height -\r\n (titleMarginBottom || legendDefaultParams.titleMarginBottom)\r\n )\r\n .attr('fill', 'currentColor')\r\n .attr('text-anchor', 'start')\r\n .attr('font-weight', 'bold')\r\n .text(title as string)\r\n );\r\n\r\n return svg;\r\n};\r\n","import styled from 'styled-components';\r\n\r\nimport { Wrapper } from '../../common/components/Wrapper';\r\nimport { legendClassNames } from '../../helpers/getLegend';\r\n\r\nexport const calendarChartClassNames = {\r\n calendarChart: 'calendarChart',\r\n calendarYear: 'calendarYear',\r\n calendarAxis: 'calendarAxis',\r\n calendarBody: 'calendarBody',\r\n calendarHeader: 'calendarHeader',\r\n calendarYearTitle: 'calendarYearTitle',\r\n calendarWeekDay: 'calendarWeekDay',\r\n calendarMonth: 'calendarMonth',\r\n calendarDays: 'calendarDays',\r\n calendarDay: 'calendarDay',\r\n ...legendClassNames,\r\n};\r\n\r\nconst headerHeight = '20px';\r\n\r\nexport const SvgWrapper = styled(Wrapper)`\r\n .${calendarChartClassNames.calendarYear} {\r\n display: flex;\r\n margin-bottom: 16px;\r\n }\r\n .${calendarChartClassNames.calendarYearTitle} {\r\n display: inline-flex;\r\n align-items: flex-end;\r\n height: ${headerHeight};\r\n margin-bottom: 4px;\r\n font-weight: bold;\r\n }\r\n .${calendarChartClassNames.calendarHeader} {\r\n height: ${headerHeight};\r\n margin-bottom: 4px;\r\n position: relative;\r\n display: flex;\r\n }\r\n .${calendarChartClassNames.calendarMonth} {\r\n font-size: 14px;\r\n bottom: 0;\r\n position: absolute;\r\n }\r\n .${calendarChartClassNames.calendarAxis} {\r\n display: flex;\r\n flex-direction: column;\r\n margin-right: 10px;\r\n }\r\n .${calendarChartClassNames.calendarWeekDay} {\r\n font-size: 12px;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: flex-end;\r\n }\r\n .${calendarChartClassNames.calendarDays} {\r\n position: relative;\r\n }\r\n .${calendarChartClassNames.calendarDay} {\r\n position: absolute;\r\n }\r\n`;\r\n","import React, { useEffect } from 'react';\r\n\r\nimport { CalendarChartProps } from './types';\r\n\r\nimport { useNode } from '../../hooks';\r\n\r\nimport { draw } from './draw';\r\n\r\nimport { SvgWrapper } from './styled';\r\n\r\nexport const CalendarChart: React.FC<CalendarChartProps> = (\r\n props\r\n): React.ReactElement => {\r\n const {\r\n className,\r\n style,\r\n children,\r\n data,\r\n startSunday,\r\n weekdays,\r\n cellOffset,\r\n cellSize,\r\n interpolator,\r\n monthSpacing,\r\n colorRange,\r\n legendProps,\r\n } = props;\r\n const [ref, node] = useNode();\r\n\r\n useEffect(() => {\r\n node && draw(node, props);\r\n // eslint-disable-next-line\r\n }, [\r\n node,\r\n data,\r\n startSunday,\r\n weekdays,\r\n cellOffset,\r\n cellSize,\r\n interpolator,\r\n monthSpacing,\r\n colorRange,\r\n legendProps,\r\n ]);\r\n\r\n return (\r\n <SvgWrapper ref={ref} className={className} style={style}>\r\n {children}\r\n </SvgWrapper>\r\n );\r\n};\r\n\r\nCalendarChart.defaultProps = {\r\n data: [],\r\n};\r\n","import * as d3 from 'd3';\r\n\r\nimport { Interpolator } from '../../common/types/interpolator';\r\nimport { CalendarChartProps, CalendarChartData } from './types';\r\n\r\nimport { getLegend } from '../../helpers/getLegend';\r\n\r\nimport { calendarChartClassNames } from './styled';\r\n\r\nexport const draw = (\r\n node: HTMLElement | null,\r\n props: CalendarChartProps\r\n): void => {\r\n const {\r\n data,\r\n startSunday,\r\n weekdays,\r\n interpolator,\r\n monthSpacing,\r\n onEachDay,\r\n colorRange,\r\n legendProps,\r\n } = props;\r\n\r\n if (node !== null && data.length) {\r\n const years: Map<number, CalendarChartData[]> = d3.group(data, d =>\r\n d.date.getUTCFullYear()\r\n );\r\n const cellOffset =\r\n typeof props.cellOffset === 'number' ? props.cellOffset : 0;\r\n const weekDays = 7;\r\n const defaultCellSize = 18;\r\n const cellSize = props.cellSize || defaultCellSize;\r\n const countDay = (i: number) =>\r\n startSunday ? i : (i + (weekDays - 1)) % weekDays;\r\n const days = weekdays || ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'];\r\n const sundayIndex = 6;\r\n const formatDay = (i: number) =>\r\n startSunday ? days[i] : i === sundayIndex ? days[0] : days[i + 1];\r\n const formatDate = d3.utcFormat('%x');\r\n const timeWeek = startSunday ? d3.utcSunday : d3.utcMonday;\r\n const getTimeWeekCount = (from: Date, to: Date) =>\r\n timeWeek.count(d3.utcYear(from), to);\r\n const getMonthSpacing = (date: Date) =>\r\n date.getUTCMonth() * (monthSpacing || 0);\r\n const formatMonth = d3.utcFormat('%b');\r\n const max = d3.max(data.map(({ value }) => value)) as number;\r\n const min = d3.min(data.map(({ value }) => value)) as number;\r\n\r\n const color = colorRange\r\n ? d3\r\n .scaleLinear()\r\n .domain([min, max])\r\n // @ts-ignore\r\n .range(colorRange)\r\n : d3\r\n .scaleSequential(interpolator || d3.interpolateGreens)\r\n .domain([min, +max]);\r\n\r\n let chartWidth = 0;\r\n\r\n years.forEach((values, year) => {\r\n const min = new Date(year, 1);\r\n const max = d3.max(values.map(d => d.date)) as Date;\r\n const months = max.getUTCMonth() - min.getUTCMonth();\r\n const weekCount = getTimeWeekCount(min, max) + 1;\r\n const width =\r\n weekCount * (cellSize + cellOffset) + (monthSpacing || 0) * months;\r\n\r\n chartWidth = Math.max(chartWidth, width);\r\n });\r\n\r\n d3.select(node)\r\n .select(`.${calendarChartClassNames.calendarChart}`)\r\n .remove();\r\n\r\n const container = d3\r\n .select(node)\r\n .append('div')\r\n .attr('class', calendarChartClassNames.calendarChart);\r\n\r\n const year = container\r\n .selectAll('div')\r\n // @ts-ignore\r\n .data(years)\r\n .join('div')\r\n .attr('class', calendarChartClassNames.calendarYear);\r\n\r\n const calendarWeekdays = year\r\n .append('div')\r\n .attr('class', calendarChartClassNames.calendarAxis);\r\n\r\n calendarWeekdays\r\n .append('div')\r\n .attr('class', calendarChartClassNames.calendarYearTitle)\r\n // @ts-ignore\r\n .text(([key]) => key);\r\n\r\n calendarWeekdays\r\n .selectAll('span')\r\n .data(d3.range(weekDays))\r\n .join('div')\r\n .attr('class', calendarChartClassNames.calendarWeekDay)\r\n .style('height', cellSize + 'px')\r\n .style('margin-bottom', cellOffset + 'px')\r\n .text(formatDay);\r\n\r\n const body = year\r\n .append('div')\r\n .attr('class', calendarChartClassNames.calendarBody);\r\n\r\n const header = body\r\n .append('div')\r\n .attr('class', calendarChartClassNames.calendarHeader);\r\n\r\n header\r\n .selectAll('div')\r\n // @ts-ignore\r\n .data(([_, values]) => {\r\n const fullYearlastMonth = 12;\r\n const fullYearlastDate = 31;\r\n\r\n return d3.utcMonths(\r\n d3.utcMonth(new Date(values[0].date.getUTCFullYear(), 1, 1)),\r\n d3.utcMonth(\r\n new Date(\r\n values[0].date.getUTCFullYear(),\r\n fullYearlastMonth,\r\n fullYearlastDate\r\n )\r\n )\r\n );\r\n })\r\n .join('div')\r\n .attr('class', calendarChartClassNames.calendarMonth)\r\n .style(\r\n 'left',\r\n (d: any) =>\r\n getTimeWeekCount(d, timeWeek.ceil(d)) * (cellSize + cellOffset) +\r\n getMonthSpacing(d) +\r\n 'px'\r\n )\r\n // @ts-ignore\r\n .text(formatMonth);\r\n\r\n // @ts-ignore\r\n body\r\n .append('div')\r\n .attr('class', calendarChartClassNames.calendarDays)\r\n .style('height', (cellSize + cellOffset) * weekDays + 'px')\r\n .style('width', chartWidth + 'px')\r\n .selectAll('div')\r\n // @ts-ignore\r\n .data(([, values]) => values)\r\n .join('div')\r\n // @ts-ignore\r\n .each((data: CalendarChartData, index, elements) => {\r\n if (onEachDay) {\r\n const element = elements[index] as HTMLDivElement;\r\n const currColor = color(data.value) as string;\r\n\r\n onEachDay(data, element, currColor);\r\n }\r\n })\r\n .attr('class', calendarChartClassNames.calendarDay)\r\n .style('width', cellSize + 'px')\r\n .style('height', cellSize + 'px')\r\n // @ts-ignore\r\n .style(\r\n 'left',\r\n (d: any) =>\r\n getTimeWeekCount(d.date, d.date) * (cellSize + cellOffset) +\r\n getMonthSpacing(d.date) +\r\n 'px'\r\n )\r\n .style(\r\n 'top',\r\n // @ts-ignore\r\n d => countDay(d.date.getUTCDay()) * (cellSize + cellOffset) + 'px'\r\n )\r\n // @ts-ignore\r\n .style('background-color', d => color(d.value))\r\n // @ts-ignore\r\n .attr('title', d => `${formatDate(d.date)} - ${d.value}`);\r\n\r\n if (typeof legendProps === 'object') {\r\n const legend = getLegend({\r\n color: color as Interpolator,\r\n ...legendProps,\r\n });\r\n\r\n const containerNode = container.node() as HTMLDivElement;\r\n const legendSvg = legend.node() as SVGElement;\r\n\r\n containerNode.appendChild(legendSvg);\r\n }\r\n }\r\n};\r\n","import * as d3 from 'd3';\r\n\r\nexport function computeDimensions(\r\n selection: d3.Selection<any, any, any, any>\r\n): SVGRect | DOMRect {\r\n let dimensions;\r\n const node = selection.node();\r\n\r\n if (node instanceof SVGGraphicsElement) {\r\n // check if node is svg element\r\n dimensions = node.getBBox();\r\n } else {\r\n // else is html element\r\n dimensions = node.getBoundingClientRect();\r\n }\r\n\r\n return dimensions;\r\n}\r\n","export function none() {\r\n return;\r\n}\r\n\r\nexport function isVoid(value: any) {\r\n return value === undefined || value === null || Number.isNaN(value);\r\n}\r\n","import styled, { createGlobalStyle } from 'styled-components';\r\n\r\nimport { Wrapper } from '../../common/components/Wrapper';\r\n\r\nexport const lineChartClassNames = {\r\n lineChartYScaleGlobal: 'lineChartYScaleGlobal',\r\n lineChartYScaleRight: 'lineChartYScaleRight',\r\n lineChartXScaleGlobal: 'lineChartXScaleGlobal',\r\n lineChartLinesGlobal: 'lineChartLinesGlobal',\r\n lineChartLine: 'lineChartLine',\r\n lineChartAreasGlobal: 'lineChartAreasGlobal',\r\n lineChartArea: 'lineChartArea',\r\n lineChartDotsGlobalContainer: 'lineChartDotsGlobalContainer',\r\n lineChartDotsGlobal: 'lineChartDotsGlobal',\r\n lineChartDot: 'lineChartDot',\r\n lineChartGridGlobal: 'lineChartGridGlobal',\r\n lineChartGridLineX: 'lineChartGridLineX',\r\n lineChartGridLineY: 'lineChartGridLineY',\r\n lineChartLabelContainer: 'lineChartLabelContainer',\r\n lineChartLabelFlex: 'lineChartLabelFlex',\r\n lineChartLabel: 'lineChartLabel',\r\n lineChartMouseGlobal: 'lineChartMouseGlobal',\r\n lineChartMouseLine: 'lineChartMouseLine',\r\n lineChartMouseRect: 'lineChartMouseRect',\r\n lineChartMouseCircle: 'lineChartMouseCircle',\r\n lineChartMouseLabelContainer: 'lineChartMouseLabelContainer',\r\n lineChartMouseLabel: 'lineChartMouseLabel',\r\n};\r\n\r\nexport const SvgWrapper = styled(Wrapper)`\r\n .${lineChartClassNames.lineChartYScaleGlobal},\r\n .${lineChartClassNames.lineChartXScaleGlobal},\r\n .${lineChartClassNames.lineChartGridGlobal} {\r\n shape-rendering: crispEdges;\r\n }\r\n .${lineChartClassNames.lineChartLinesGlobal} {\r\n fill: none;\r\n stroke: steelblue;\r\n stroke-width: 1.5px;\r\n stroke-linejoin: round;\r\n stroke-linecap: round;\r\n }\r\n .${lineChartClassNames.lineChartArea} {\r\n fill-opacity: 0.24;\r\n }\r\n .${lineChartClassNames.lineChartGridLineX},\r\n .${lineChartClassNames.lineChartGridLineY},\r\n .${lineChartClassNames.lineChartMouseLine} {\r\n stroke: rgba(149, 149, 149, 0.24);\r\n }\r\n .${lineChartClassNames.lineChartMouseLine},\r\n .${lineChartClassNames.lineChartMouseCircle} {\r\n transition: opacity linear 200ms;\r\n pointer-events: none;\r\n stroke-width: 1px;\r\n }\r\n .${lineChartClassNames.lineChartDot} {\r\n stroke: #fff;\r\n stroke-width: 2px;\r\n }\r\n .${lineChartClassNames.lineChartMouseLine} {\r\n shape-rendering: crispEdges;\r\n }\r\n .${lineChartClassNames.lineChartMouseRect} {\r\n fill: none;\r\n pointer-events: all;\r\n }\r\n`;\r\n\r\nexport const TooltipStyles = createGlobalStyle`\r\n .${lineChartClassNames.lineChartMouseLabel} {\r\n transition: opacity linear 200ms;\r\n z-index: 100;\r\n .${lineChartClassNames.lineChartLabelFlex} {\r\n justify-content: flex-start;\r\n align-items: center;\r\n pointer-events: none;\r\n }\r\n .${lineChartClassNames.lineChartLabel} {\r\n margin: 0 0 0 10px;\r\n }\r\n }\r\n`;\r\n","import styled from 'styled-components';\r\n\r\nexport const LabelContainer = styled.div`\r\n width: 0;\r\n height: 0;\r\n display: flex;\r\n align-items: flex-end;\r\n justify-content: center;\r\n font-size: 12px;\r\n white-space: nowrap;\r\n`;\r\n\r\nexport const Label = styled.div`\r\n margin-bottom: 4px;\r\n`;\r\n","import * as d3 from 'd3';\r\n\r\nimport { LineChartProps, LineChartData, LineChartDot } from './types';\r\n\r\nimport { computeDimensions } from '../../helpers/computeDimensions';\r\nimport { appendSvg } from '../../helpers';\r\nimport { none } from '../../helpers/common';\r\nimport { stackedData } from '../../helpers/stackedData';\r\nimport { drawGrid } from './drawGrid';\r\nimport { drawLabel, labelClassName } from './drawLabel';\r\nimport { drawTooltip } from './drawTooltip';\r\n\r\nimport { lineChartClassNames } from './styled';\r\n\r\nexport const draw = (node: HTMLElement | null, props: LineChartProps): void => {\r\n const {\r\n data: chartData,\r\n labels,\r\n margin,\r\n customYAxisSelection,\r\n customXAxisSelection,\r\n customYAxis,\r\n customXAxis,\r\n curve,\r\n yAxisPadding,\r\n xAxisPadding,\r\n drawGridY,\r\n drawGridX,\r\n withLabels,\r\n formatLabel,\r\n eachLabel,\r\n stacked,\r\n dynamicTooltipEnable,\r\n dynamicCircleRadius,\r\n formatDynamicTooltip,\r\n renderTooltip,\r\n stackedTooltip,\r\n stackedTooltipIndex,\r\n tooltipLineTop,\r\n customize,\r\n customYScale,\r\n customLine,\r\n tooltipClassName,\r\n xScaleItemWidth,\r\n areaCurve,\r\n dotSnapping,\r\n rightAxis,\r\n } = props;\r\n\r\n if (node !== null && chartData.length) {\r\n const data = stacked ? stackedData(chartData) : chartData;\r\n const marginTop = margin ? margin.top : 0;\r\n const marginRight = margin ? margin.right : 0;\r\n const marginBottom = margin ? margin.bottom : 0;\r\n const marginLeft = margin ? margin.left : 0;\r\n const { width: nodeWidth } = node.getBoundingClientRect();\r\n const width = props.width || nodeWidth;\r\n const height = props.height || 0;\r\n const min =\r\n typeof props.min === 'number'\r\n ? props.min\r\n : d3.min(data, ({ values }) => d3.min(values as number[]));\r\n const max =\r\n typeof props.max === 'number'\r\n ? props.max\r\n : d3.max(data, ({ values }) => d3.max(values as number[]));\r\n\r\n const svg = appendSvg(node, width, height || 0);\r\n\r\n const yRange = [\r\n height - marginTop - marginBottom - (xAxisPadding || 0),\r\n marginTop,\r\n ];\r\n const yScale = d3\r\n .scaleLinear()\r\n .domain([min || 0, max || 0])\r\n .range(yRange)\r\n .nice();\r\n\r\n customYScale && customYScale(yScale);\r\n\r\n const yTicksCountDefault = 8;\r\n const yAxisLeft = d3.axisLeft(yScale).ticks(yTicksCountDefault);\r\n\r\n customYAxis && customYAxis(yAxisLeft);\r\n\r\n const yTicksCount = yAxisLeft.tickArguments()[0];\r\n\r\n const yAxis = svg\r\n .append('g')\r\n .attr('class', lineChartClassNames.lineChartYScaleGlobal)\r\n .call(yAxisLeft)\r\n .call(customYAxisSelection ? customYAxisSelection : none);\r\n const { width: yAxisWidth } = computeDimensions(yAxis);\r\n\r\n yAxis.attr('transform', `translate(${marginLeft + yAxisWidth}, 0)`);\r\n\r\n let yAxisRightWidth = 0;\r\n\r\n if (rightAxis) {\r\n const rightAxisMin = d3.min(rightAxis);\r\n const rightAxisMax = d3.max(rightAxis);\r\n const yRightScale = d3\r\n .scaleLinear()\r\n .domain([rightAxisMin || 0, rightAxisMax || 0])\r\n .range(yRange)\r\n .nice();\r\n\r\n const yAxisRightTicks = d3.axisRight(yRightScale).ticks(yTicksCountDefault);\r\n const yAxisRight = svg\r\n .append('g')\r\n .attr('class', `${lineChartClassNames.lineChartYScaleGlobal} ${lineChartClassNames.lineChartYScaleRight}`)\r\n .call(yAxisRightTicks)\r\n .call(customYAxisSelection ? customYAxisSelection : none);\r\n\r\n ({ width: yAxisRightWidth } = computeDimensions(yAxisRight));\r\n\r\n yAxisRight.attr('transform', `translate(${width - yAxisRightWidth}, 0)`);\r\n }\r\n\r\n /** xScale **/\r\n const lastIndex =\r\n labels && labels.length\r\n ? labels.length - 1\r\n : data.reduce((acc, { values }) => Math.max(acc, values.length), 0) - 1;\r\n\r\n const xScale = d3\r\n .scaleLinear()\r\n .domain([0, lastIndex])\r\n .range([\r\n marginLeft + yAxisWidth + (yAxisPadding || 0),\r\n width - yAxisRightWidth - marginRight,\r\n ]);\r\n\r\n const xAxisBottom = d3\r\n .axisBottom(xScale)\r\n .tickFormat((value: d3.NumberValue) =>\r\n // @ts-ignore\r\n labels && labels.length > 0 ? labels[value] : 0\r\n )\r\n .ticks(lastIndex);\r\n\r\n if (typeof xScaleItemWidth === 'number') {\r\n const [x1, x2] = xScale.range();\r\n const chartWidth = x2 - x1;\r\n\r\n xAxisBottom\r\n .ticks(Math.round(chartWidth / xScaleItemWidth))\r\n .tickSizeOuter(0);\r\n }\r\n\r\n customXAxis && customXAxis(xAxisBottom);\r\n\r\n drawGrid({\r\n svg,\r\n yScale,\r\n xScale,\r\n yTicksCount,\r\n lastIndex,\r\n drawGridY,\r\n drawGridX,\r\n });\r\n\r\n if (Array.isArray(labels) && labels.length > 0) {\r\n const xAxis = svg\r\n .append('g')\r\n .call(customXAxisSelection ? customXAxisSelection : none)\r\n .attr('class', lineChartClassNames.lineChartXScaleGlobal)\r\n .call(xAxisBottom);\r\n\r\n const { height: xAxisHeight } = computeDimensions(xAxis);\r\n\r\n xAxis.attr(\r\n 'transform',\r\n `translate(0, ${height - Math.ceil(xAxisHeight) - marginBottom})`\r\n );\r\n }\r\n\r\n const line = d3\r\n .line()\r\n .defined(d => d !== null)\r\n .x((_, index) => xScale(index))\r\n .y((d: unknown) => yScale(d as d3.NumberValue))\r\n .curve(curve || d3.curveLinear);\r\n\r\n customLine && customLine(line);\r\n\r\n const withAreas = data.some(({ fill }) => fill);\r\n\r\n if (withAreas) {\r\n let dataIndex = -2;\r\n\r\n const getArea = (d: LineChartData): d3.Area<[number, number]> => {\r\n const { minAreaValues } = d;\r\n const minTick = yScale.ticks()[0];\r\n\r\n return d3\r\n .area()\r\n .defined(d => d !== null)\r\n .x((_, index) => xScale(index))\r\n .y0((value: unknown, index) => {\r\n if (index === 0) {\r\n dataIndex = dataIndex + 1;\r\n }\r\n\r\n let minValue: number = minTick;\r\n\r\n if (minAreaValues && typeof minAreaValues[index] === 'number') {\r\n minValue = minAreaValues[index] || minValue;\r\n } else if (minAreaValues) {\r\n minValue = yScale(\r\n (minValue - (value as number)) as d3.NumberValue\r\n );\r\n }\r\n\r\n const currData = data[dataIndex];\r\n\r\n return stacked\r\n ? dataIndex > -1\r\n ? yScale(\r\n typeof currData.values[index] !== 'number'\r\n ? 0\r\n : (currData.values[index] as number)\r\n )\r\n : yScale(minValue)\r\n : yScale(minValue);\r\n })\r\n .y1((d: unknown) => yScale(d as d3.NumberValue))\r\n .curve(areaCurve || curve || d3.curveLinear);\r\n };\r\n\r\n svg\r\n .append('g')\r\n .attr('class', lineChartClassNames.lineChartAreasGlobal)\r\n .selectAll('path')\r\n .data(data.filter(({ fill }) => Boolean(fill)))\r\n .join('path')\r\n .attr('class', lineChartClassNames.lineChartArea)\r\n .attr('d', (d: LineChartData) => {\r\n const area = getArea(d);\r\n\r\n return area((d.values as unknown) as [number, number][]);\r\n })\r\n .attr('fill', ({ fill }) => fill || 'none')\r\n .attr('style', ({ areaStyle }) => areaStyle || '');\r\n }\r\n\r\n svg\r\n .append('g')\r\n .attr('class', lineChartClassNames.lineChartLinesGlobal)\r\n .selectAll('path')\r\n .data(data)\r\n .join('path')\r\n .attr('class', lineChartClassNames.lineChartLine)\r\n .attr('d', (d: LineChartData | any) => line(d.values))\r\n .attr('stroke', ({ stroke }) => stroke || 'steelblue')\r\n .attr('style', ({ style }) => style || '');\r\n\r\n const dots = data.filter(({ dot }) => dot) as (Omit<\r\n LineChartData,\r\n 'dot'\r\n > & {\r\n dot: LineChartDot;\r\n })[];\r\n\r\n if (dots.length > 0) {\r\n const dotsGlobal = svg\r\n .append('g')\r\n .attr('class', lineChartClassNames.lineChartDotsGlobalContainer);\r\n\r\n dots.forEach(item => {\r\n const { values, dot } = item;\r\n const { radius, style, filter } = dot;\r\n\r\n const dotsGroup = dotsGlobal\r\n .append('g')\r\n .attr('class', lineChartClassNames.lineChartDotsGlobal);\r\n\r\n dotsGroup\r\n .selectAll('circle')\r\n .data(values)\r\n .join('circle')\r\n .attr('cx', (_, index) => xScale(index))\r\n .attr('class', lineChartClassNames.lineChartDot)\r\n .attr('cy', d => yScale(d as d3.NumberValue))\r\n .attr('r', radius || 0)\r\n .attr('style', style || '');\r\n\r\n if (filter) {\r\n dotsGroup\r\n .selectAll('circle')\r\n .select((_, i, g) => (filter(item, i, g) ? g[i] : null))\r\n .remove();\r\n }\r\n });\r\n }\r\n\r\n d3.select(node)\r\n .select(`.${labelClassName}`)\r\n .remove();\r\n withLabels &&\r\n drawLabel({ node, eachLabel, data, yScale, xScale, formatLabel });\r\n\r\n if (dynamicTooltipEnable) {\r\n drawTooltip({\r\n tooltipLineTop,\r\n stackedTooltip,\r\n renderTooltip,\r\n stackedTooltipIndex,\r\n formatDynamicTooltip,\r\n node,\r\n svg,\r\n data,\r\n xScale,\r\n yScale,\r\n dynamicCircleRadius,\r\n tooltipClassName,\r\n dotSnapping,\r\n lastIndex,\r\n });\r\n }\r\n\r\n customize && customize({ svg, yScale, xScale });\r\n }\r\n};\r\n","import { LineChartData } from '../charts/LineChart/types';\r\n\r\nexport const stackedData = (data: LineChartData[]) => {\r\n const stacks: { [key: string]: { [key: string]: number } } = {};\r\n\r\n return data.map((item, index) => {\r\n stacks[index] = {};\r\n\r\n if (index > 0) {\r\n return {\r\n ...item,\r\n values: item.values.map((value, valuesIndex) => {\r\n const prevValue = stacks[index - 1][valuesIndex];\r\n stacks[index][valuesIndex] = Number(\r\n (typeof prevValue !== 'number' ? 0 : Math.abs(prevValue)) +\r\n (typeof value !== 'number' ? 0 : Math.abs(value))\r\n );\r\n\r\n return stacks[index][valuesIndex];\r\n }),\r\n };\r\n } else {\r\n item.values.forEach((value, valuesIndex) => {\r\n stacks[index][valuesIndex] = Number(value);\r\n });\r\n }\r\n\r\n return item;\r\n });\r\n};\r\n","import { DrawGridProps } from './types';\r\n\r\nimport { lineChartClassNames } from '../styled';\r\n\r\nexport const drawGrid = ({\r\n svg,\r\n yScale,\r\n xScale,\r\n yTicksCount,\r\n lastIndex,\r\n drawGridX,\r\n drawGridY,\r\n}: DrawGridProps) => {\r\n if (!drawGridY && !drawGridX) return;\r\n\r\n const global = svg\r\n .append('g')\r\n .attr('class', lineChartClassNames.lineChartGridGlobal);\r\n\r\n const yTicks = yScale.ticks(yTicksCount);\r\n\r\n if (drawGridX) {\r\n global\r\n .append('g')\r\n .selectAll('line')\r\n .data(yTicks)\r\n .join('line')\r\n .attr('class', lineChartClassNames.lineChartGridLineX)\r\n .attr('x1', () => xScale(0))\r\n .attr('x2', () => xScale(lastIndex))\r\n .attr('y1', (d: number) => Math.round(yScale(d)))\r\n .attr('y2', (d: number) => Math.round(yScale(d)));\r\n }\r\n\r\n if (drawGridY) {\r\n global\r\n .append('g')\r\n .selectAll('line')\r\n .data(Array.from({ length: lastIndex + 1 }, (_, index) => index))\r\n .join('line')\r\n .attr('class', lineChartClassNames.lineChartGridLineY)\r\n .attr('x1', (_, index: number) => Math.round(xScale(index) as number))\r\n .attr('x2', (_, index: number) => Math.round(xScale(index) as number))\r\n .attr('y1', () => Math.round(yScale(yTicks[0]) as number))\r\n .attr('y2', () =>\r\n Math.round(yScale(yTicks[yTicks.length - 1]) as number)\r\n );\r\n }\r\n};\r\n","import React from 'react';\r\nimport * as d3 from 'd3';\r\nimport ReactDOMServer from 'react-dom/server';\r\n\r\nimport { DrawLabelProps } from './types';\r\n\r\nimport { none } from '../../../helpers/common';\r\n\r\nimport { lineChartClassNames } from '../styled';\r\nimport { LabelContainer, Label } from './styled';\r\n\r\nexport const labelClassName = 'd3-chart-label';\r\n\r\nexport const drawLabel = ({\r\n node,\r\n data,\r\n yScale,\r\n xScale,\r\n formatLabel,\r\n eachLabel,\r\n}: DrawLabelProps) => {\r\n const labelsDiv = d3\r\n .select(node)\r\n .append('div')\r\n .attr('class', labelClassName);\r\n const format = d3.format(',');\r\n\r\n // @ts-ignore\r\n data.forEach(({ values }: { values: number[] }) => {\r\n labelsDiv\r\n .append('div')\r\n .selectAll('div')\r\n .data(values)\r\n .join('div')\r\n .attr('class', lineChartClassNames.lineChartLabelContainer)\r\n .style('position', 'absolute')\r\n .style('left', (_, index) => xScale(index) + 'px')\r\n .style('top', d => yScale(d) + 'px')\r\n .html((d: number, index, elements: any) => {\r\n const html = ReactDOMServer.renderToString(\r\n <LabelContainer className={lineChartClassNames.lineChartLabelFlex}>\r\n <Label className={lineChartClassNames.lineChartLabel}>\r\n {formatLabel ? formatLabel(d, index, elements) : format(d)}\r\n </Label>\r\n </LabelContainer>\r\n );\r\n\r\n return html;\r\n })\r\n // @ts-ignore\r\n .each(eachLabel ? eachLabel : none);\r\n });\r\n};\r\n","import React from 'react';\r\nimport * as d3 from 'd3';\r\nimport ReactDOMServer from 'react-dom/server';\r\n\r\nimport { DrawTooltipProps } from './types';\r\n\r\nimport { isVoid } from '../../../helpers/common';\r\n\r\nimport { lineChartClassNames } from '../styled';\r\nimport { Label, LabelContainer } from '../drawLabel/styled';\r\n\r\nexport const drawTooltip = ({\r\n svg,\r\n node,\r\n data: argData,\r\n xScale,\r\n yScale,\r\n dynamicCircleRadius,\r\n formatDynamicTooltip,\r\n renderTooltip,\r\n stackedTooltipIndex,\r\n stackedTooltip,\r\n tooltipLineTop,\r\n tooltipRoot,\r\n tooltipClassName,\r\n dotSnapping,\r\n lastIndex,\r\n}: DrawTooltipProps) => {\r\n const container: Element | null =\r\n tooltipRoot || document.querySelector('body');\r\n const format = d3.format(',');\r\n const chartData = argData.filter(({ tooltipOff }) => !tooltipOff);\r\n\r\n const data =\r\n typeof stackedTooltipIndex === 'number'\r\n ? [chartData[stackedTooltipIndex]]\r\n : stackedTooltip\r\n ? [chartData[0]]\r\n : chartData;\r\n\r\n const [x1, x2] = xScale.range();\r\n const [y1, y2] = yScale.range();\r\n\r\n const mouseGlobal = svg\r\n .append('g')\r\n .attr('class', lineChartClassNames.lineChartMouseGlobal);\r\n\r\n const mouseRect = mouseGlobal\r\n .append('rect')\r\n .attr('width', x2 - x1)\r\n .attr('height', Math.abs(y1 - y2))\r\n .attr('class', lineChartClassNames.lineChartMouseRect)\r\n .attr('transform', `translate(${x1}, ${y2})`);\r\n\r\n const mouseLine = mouseGlobal\r\n .append('path')\r\n .attr('class', lineChartClassNames.lineChartMouseLine)\r\n .style('opacity', '0');\r\n\r\n const lines = svg\r\n .selectAll(`.${lineChartClassNames.lineChartLine}`)\r\n .nodes() as SVGPathElement[];\r\n\r\n const circles = mouseGlobal\r\n .selectAll('circle')\r\n .data(chartData.filter(({ dynamicDotOff }) => !dynamicDotOff))\r\n .join('circle')\r\n .attr('class', lineChartClassNames.lineChartMouseCircle)\r\n .attr('r', dynamicCircleRadius as number)\r\n .attr('fill', ({ stroke }) => stroke || 'none')\r\n .attr('stroke', ({ stroke }) => stroke || 'none')\r\n .style('opacity', '0');\r\n\r\n let labelContainer: d3.Selection<any, unknown, any, any> = d3.select(\r\n `.${lineChartClassNames.lineChartMouseLabelContainer}`\r\n );\r\n\r\n if (labelContainer.size() === 0) {\r\n labelContainer = d3\r\n .select(container)\r\n .append('div')\r\n .attr('class', lineChartClassNames.lineChartMouseLabelContainer);\r\n }\r\n\r\n let labels: d3.Selection<any, any, any, any> | null = null;\r\n\r\n let isVisible = false;\r\n\r\n const setVisible = (visible?: boolean) => {\r\n isVisible = Boolean(visible);\r\n const opacity = isVisible ? '1' : '0';\r\n mouseLine.style('opacity', opacity);\r\n circles.style('opacity', opacity);\r\n labels && labels.style('opacity', opacity);\r\n };\r\n\r\n const mouseMove = (event: MouseEvent | TouchEvent) => {\r\n const [docX, docY] = d3.pointer(event, document);\r\n const [rectrX] = d3.pointer(event, mouseRect);\r\n const [nodeX, nodeY] = d3.pointer(event, node);\r\n const x = rectrX - (rectrX - nodeX);\r\n const left = nodeX + (docX - nodeX);\r\n const currIndex = Math.abs(xScale.invert(x));\r\n const positions: { [key: string]: { x: number; y: number } } = {};\r\n\r\n const getValue = (values: (number | null)[]) => {\r\n // The returning result is fixed for the task: https://jr.everpoint.ru/browse/PUB-5648\r\n // Before the task it was like this (and I don't know why):\r\n /* return !isVoid(values[Math.floor(currIndex + 1)])\r\n ? values[Math.floor(currIndex)]\r\n : null;*/\r\n\r\n return values[Math.floor(currIndex)];\r\n }\r\n\r\n lines.forEach((line, index) => {\r\n let pos = {\r\n x: 0,\r\n y: 0,\r\n };\r\n\r\n if (!line.hasAttribute('d') || argData[index].tooltipOff) {\r\n positions[index] = pos;\r\n return;\r\n }\r\n\r\n if (!dotSnapping) {\r\n let beginning = 0;\r\n let end = line.getTotalLength();\r\n let target = null;\r\n\r\n while (true) {\r\n target = Math.floor((beginning + end) / 2);\r\n pos = line.getPointAtLength(target);\r\n\r\n if ((target === end || target === beginning) && pos.x !== x) {\r\n break;\r\n }\r\n\r\n if (pos.x > x) {\r\n end = target;\r\n } else if (pos.x < x) {\r\n beginning = target;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n positions[index] = pos;\r\n } else {\r\n const [x1, x2] = xScale.range();\r\n const chartWidth = x2 - x1;\r\n const step = chartWidth / lastIndex;\r\n\r\n positions[index] = {\r\n x: x1 + Math.round(currIndex) * step,\r\n y: typeof argData[index].values[Math.round(currIndex)] === \"number\"\r\n ? yScale(argData[index].values[Math.round(currIndex)] as number)\r\n : 0,\r\n };\r\n }\r\n });\r\n\r\n circles\r\n .attr('transform', (lineChartData, index) => {\r\n const value = getValue(lineChartData.values);\r\n\r\n return positions[index] && value\r\n ? 'translate(' + (!dotSnapping ? x : positions[index].x) + ',' + positions[index].y + ')'\r\n : 'translate(-9999, -9999)';\r\n })\r\n .attr('style', ({ dynamicDotStyle }) => dynamicDotStyle || '');\r\n\r\n const datas = chartData.map(({ values, ...rest }, i) => ({\r\n ...rest,\r\n value: getValue(values),\r\n invertValue: positions[i] ? yScale.invert(positions[i].y) : 0,\r\n }));\r\n\r\n const noHasData = datas.every(({ value }) => isVoid(value));\r\n\r\n if (noHasData && isVisible) {\r\n setVisible();\r\n } else if (!isVisible && !noHasData) {\r\n setVisible(true);\r\n }\r\n\r\n const topIndex = Object.keys(positions).reduce((acc, key, index) => {\r\n const prevValue = datas[Number(acc)]?.value;\r\n const value = datas[Number(key)]?.value;\r\n const dynamicDotOff = argData?.[index].dynamicDotOff;\r\n\r\n return index === 0 || isVoid(value) || dynamicDotOff\r\n ? acc\r\n : isVoid(prevValue) || positions[acc].y > positions[key].y\r\n ? key\r\n : acc;\r\n }, '0');\r\n\r\n const labelTexts =\r\n labels &&\r\n labels\r\n .style('left', (_, i) => {\r\n return !dotSnapping ? `${left}px` : `${positions[i]?.x ?? 0}px`;\r\n })\r\n .style('top', (_, i) => {\r\n const index =\r\n typeof stackedTooltipIndex === 'number'\r\n ? stackedTooltipIndex\r\n : stackedTooltip\r\n ? topIndex\r\n : i;\r\n\r\n return `${(positions[index]?.y ?? 0) + (docY - nodeY)}px`;\r\n })\r\n .select(`.${lineChartClassNames.lineChartLabel}`);\r\n\r\n if (renderTooltip && labels) {\r\n labels.html((_, index) => {\r\n return ReactDOMServer.renderToString(\r\n <LabelContainer className={lineChartClassNames.lineChartLabelFlex}>\r\n {renderTooltip(datas, {\r\n indexX: Math.round(currIndex),\r\n indexY: index,\r\n svg,\r\n event,\r\n })}\r\n </LabelContainer>\r\n );\r\n });\r\n } else {\r\n labelTexts &&\r\n labelTexts.text((_, i) => {\r\n const value = datas[i].value;\r\n const invertValue = datas[i].invertValue;\r\n\r\n return formatDynamicTooltip\r\n ? formatDynamicTooltip(invertValue, value)\r\n : format(invertValue);\r\n });\r\n }\r\n\r\n mouseLine.attr('d', () => {\r\n let d = 'M' + x + ',' + y1;\r\n d += ' ' + x + ',' + (tooltipLineTop ? y2 : positions[topIndex]?.y || 0);\r\n return d;\r\n });\r\n };\r\n\r\n mouseRect.on('mouseover.tooltip', event => {\r\n labels = labelContainer\r\n .selectAll('div')\r\n .data(data)\r\n .join('div')\r\n .attr(\r\n 'class',\r\n `${lineChartClassNames.lineChartMouseLabel} ${tooltipClassName || ''}`\r\n )\r\n .style('opacity', '0')\r\n .style('position', 'absolute')\r\n .html(() => {\r\n const html = ReactDOMServer.renderToString(\r\n <LabelContainer className={lineChartClassNames.lineChartLabelFlex}>\r\n <Label className={lineChartClassNames.lineChartLabel} />\r\n </LabelContainer>\r\n );\r\n\r\n return html;\r\n });\r\n\r\n mouseMove(event);\r\n });\r\n\r\n mouseRect.on('mouseout.tooltip', () => {\r\n d3.select(`.${lineChartClassNames.lineChartMouseLabelContainer}`)\r\n .selectAll('*')\r\n .remove();\r\n setVisible();\r\n });\r\n\r\n mouseRect.on('touchmove.tooltip mousemove.tooltip', mouseMove);\r\n};\r\n","import React, { useEffect } from 'react';\r\n\r\nimport { LineChartProps } from './types';\r\n\r\nimport { useNode } from '../../hooks';\r\nimport { useResize } from '../../hooks';\r\n\r\nimport { draw } from './draw';\r\n\r\nimport { SvgWrapper, TooltipStyles } from './styled';\r\n\r\nexport const LineChart: React.FC<LineChartProps> = (\r\n props\r\n): React.ReactElement => {\r\n const { className, style, children } = props;\r\n const [ref, node] = useNode();\r\n\r\n useEffect(() => {\r\n node && draw(node, props);\r\n }, [node, props]);\r\n\r\n const onDraw = () => draw(node, props);\r\n\r\n useResize(props.width, onDraw);\r\n\r\n return (\r\n <div className={className} style={style}>\r\n <TooltipStyles />\r\n <SvgWrapper ref={ref}>{children}</SvgWrapper>\r\n </div>\r\n );\r\n};\r\n\r\nLineChart.defaultProps = {\r\n data: [],\r\n labels: [],\r\n height: 240,\r\n yAxisPadding: 10,\r\n xAxisPadding: 20,\r\n margin: {\r\n top: 10,\r\n right: 10,\r\n bottom: 10,\r\n left: 0,\r\n },\r\n dynamicCircleRadius: 4,\r\n stackedTooltip: false,\r\n};\r\n","import * as d3 from 'd3';\r\n\r\nimport { BarChartLineData } from '../types';\r\nimport { DrawLinesProps } from './types';\r\n\r\nexport const barChartLinesClassNames = {\r\n barChartLinesGlobal: 'barChartLinesGlobal',\r\n barChartLine: 'barChartLine',\r\n barChartAreasGlobal: 'barChartAreasGlobal',\r\n barChartArea: 'barChartArea',\r\n};\r\n\r\nexport const drawLines = ({\r\n svg,\r\n lineData,\r\n min,\r\n yScale,\r\n xScale,\r\n curve,\r\n stackedLine,\r\n}: DrawLinesProps) => {\r\n let linesSelection = null;\r\n let areasSelection = null;\r\n let area: d3.Area<[number, number]> | null = null;\r\n\r\n const line = d3\r\n .line()\r\n .defined(d => d !== null)\r\n .x(\r\n (_, index) =>\r\n (xScale((index as unknown) as string) as number) + bandwidth / 2\r\n )\r\n // @ts-ignore\r\n .y((d: number) => yScale(d))\r\n .curve(curve || d3.curveLinear);\r\n const bandwidth = xScale.bandwidth();\r\n\r\n const linesData = lineData.filter(({ lineType }) => lineType === 'line');\r\n const areasData = lineData.filter(({ lineType }) => lineType === 'area');\r\n\r\n if (linesData.length > 0) {\r\n linesSelection = svg\r\n .append('g')\r\n .attr('class', barChartLinesClassNames.barChartLinesGlobal)\r\n .selectAll('path')\r\n .data(linesData)\r\n .join('path')\r\n .attr('class', barChartLinesClassNames.barChartLine)\r\n .attr('d', (d: BarChartLineData) =>\r\n line(d.values as Iterable<[number, number]>)\r\n )\r\n .attr('stroke', ({ stroke }) => stroke || '')\r\n .attr('fill', ({ fill }) => fill || 'none');\r\n }\r\n\r\n if (areasData.length > 0) {\r\n let dataIndex = -2;\r\n\r\n area = d3\r\n .area()\r\n .x(\r\n (_, index) =>\r\n (xScale((index as unknown) as string) as number) + bandwidth / 2\r\n )\r\n .y0((_, index) => {\r\n if (index === 0) {\r\n dataIndex = dataIndex + 1;\r\n }\r\n\r\n return stackedLine\r\n ? dataIndex > -1\r\n ? yScale(\r\n typeof lineData[dataIndex].values[index] !== 'number'\r\n ? 0\r\n : (lineData[dataIndex].values[index] as number)\r\n )\r\n : yScale(min as number)\r\n : yScale(min as number);\r\n })\r\n // @ts-ignore\r\n .y1(d => yScale(d))\r\n .curve(curve || d3.curveLinear);\r\n\r\n areasSelection = svg\r\n .append('g')\r\n .attr('class', barChartLinesClassNames.barChartAreasGlobal)\r\n .selectAll('path')\r\n .data(areasData)\r\n .join('path')\r\n .attr('class', barChartLinesClassNames.barChartArea)\r\n .attr('d', (d: BarChartLineData | any) => area && area(d.values))\r\n .attr('fill', ({ fill }) => fill || 'none');\r\n }\r\n\r\n return {\r\n areasSelection,\r\n linesSelection,\r\n area,\r\n };\r\n};\r\n","import styled, { createGlobalStyle } from 'styled-components';\r\n\r\nimport { Wrapper } from '../../common/components/Wrapper';\r\nimport { barChartLinesClassNames } from './drawLines';\r\n\r\nconst tooltipClassnames = {\r\n barChartMouseRect: 'barChartMouseRect',\r\n barChartMouseContainer: 'barChartMouseContainer',\r\n barChartTooltipFlex: 'barChartTooltipFlex',\r\n barChartMouseTooltip: 'barChartMouseTooltip',\r\n barChartTooltip: 'barChartTooltip',\r\n barChartTooltipItem: 'barChartTooltipItem',\r\n barChartTooltipColFlex: 'barChartTooltipColFlex',\r\n barChartTooltipGroupName: 'barChartTooltipGroupName',\r\n barChartColorBox: 'barChartColorBox',\r\n barChartColorLine: 'barChartColorLine',\r\n barChartTooltipName: 'barChartTooltipName',\r\n barChartTooltipValue: 'barChartTooltipValue',\r\n};\r\n\r\nconst labelClassnames = {\r\n barChartLabelContainer: 'barChartLabelContainer',\r\n barChartLabelFlex: 'barChartLabelFlex',\r\n barChartLabel: 'barChartLabel',\r\n};\r\n\r\nexport const barChartClassNames = {\r\n barChartBarGlobal: 'barChartBarGlobal',\r\n barChartYScaleGlobal: 'barChartYScaleGlobal',\r\n barChartYAxis: 'barChartYAxis',\r\n barChartXAxis: 'barChartXAxis',\r\n barChartYAxisZeroTick: 'barChartYAxisZeroTick',\r\n barChartGridGlobal: 'barChartGridGlobal',\r\n barChartGridLineX: 'barChartGridLineX',\r\n barChartGridLineXZero: 'barChartGridLineXZero',\r\n barChartGridLineYZero: 'barChartGridLineYZero',\r\n barChartGridLineY: 'barChartGridLineY',\r\n barChartSelection: 'barChartSelection',\r\n ...tooltipClassnames,\r\n ...labelClassnames,\r\n ...barChartLinesClassNames,\r\n};\r\n\r\nexport const SvgWrapper = styled(Wrapper)<{ selectable?: boolean }>`\r\n display: ${({ selectable }) => selectable && \"inline-block\"};\r\n user-select: ${({ selectable }) => selectable && \"none\"};\r\n width: ${({ selectable }) => selectable && \"auto\"};\r\n\r\n line {\r\n stroke-width: 1px;\r\n shape-rendering: crispEdges;\r\n }\r\n\r\n .${barChartClassNames.barChartGridLineX},\r\n .${barChartClassNames.barChartGridLineY} {\r\n stroke: rgba(48, 69, 79, 0.06);\r\n }\r\n\r\n .${barChartClassNames.barChartMouseRect} {\r\n }\r\n\r\n .${barChartClassNames.barChartMouseRect} {\r\n fill: none;\r\n pointer-events: all;\r\n }\r\n\r\n .${barChartClassNames.barChartLinesGlobal} {\r\n stroke-width: 1.5px;\r\n stroke-linejoin: round;\r\n stroke-linecap: round;\r\n }\r\n\r\n .${barChartClassNames.barChartLine} {\r\n shape-rendering: auto;\r\n }\r\n\r\n .${barChartClassNames.barChartArea} {\r\n fill-opacity: 0.24;\r\n }\r\n\r\n .${barChartClassNames.barChartSelection} {\r\n position: absolute;\r\n top: 0;\r\n width: 0;\r\n background: rgba(0, 170, 255, 0.06);\r\n box-shadow: 1px 0 0 #00AAFF, -1px 0 0 #00AAFF;\r\n pointer-events: none;\r\n }\r\n`;\r\n\r\nexport const TooltipStyles = createGlobalStyle`\r\n .${barChartClassNames.barChartMouseTooltip} {\r\n z-index: 100;\r\n transition: all linear 144ms;\r\n\r\n .${barChartClassNames.barChartTooltipItem} {\r\n margin-bottom: 4px;\r\n :last-of-type {\r\n margin-bottom: 0;\r\n }\r\n }\r\n }\r\n`;\r\n","import * as d3 from 'd3';\r\nimport { uniqueId } from 'lodash';\r\n\r\nimport { barChartClassNames as classNames } from './styled';\r\nimport { drawGrid } from './drawGrid';\r\nimport { appendSvg } from '../../helpers';\r\nimport { computeDimensions } from '../../helpers/computeDimensions';\r\nimport { getDomain } from './getDomain';\r\nimport { marshaling } from './marshaling';\r\nimport { drawTooltip } from './drawTooltip';\r\nimport { resizeBarWidth } from './resizeBarWidth';\r\nimport { drawLines } from './drawLines';\r\nimport { getBars } from './getBars';\r\nimport { BarChartProps, BarChartData, BarChartMarshalledGroup } from './types';\r\n\r\nconst MIN_BAR_HEIGHT = 2;\r\n\r\nexport const draw = (node: HTMLElement | null, props: BarChartProps): void => {\r\n const {\r\n data,\r\n lineData = [],\r\n markers = [],\r\n barWidth: barWidthProp,\r\n barPadding,\r\n colors,\r\n margin,\r\n xAxisPadding,\r\n yAxisPadding,\r\n drawGridY,\r\n drawGridX,\r\n customYScale,\r\n customXScale,\r\n customYAxisLeft,\r\n customXAxisBottom,\r\n customYAxis,\r\n customXAxis,\r\n customBars,\r\n customize,\r\n dynamicTooltipEnable,\r\n hideTooltipGroupName,\r\n renderTooltip,\r\n labelPosition,\r\n renderLabel,\r\n tooltipY,\r\n tooltipBind,\r\n stackedLine,\r\n curve,\r\n formatTooltipValue,\r\n formatTooltipName,\r\n sectionPadding,\r\n minValuesLine,\r\n tooltipYDomain,\r\n marshalledMap,\r\n minValue,\r\n maxValue,\r\n minDomainValue,\r\n maxDomainValue,\r\n drawBars,\r\n setTooltipPosition,\r\n onLabelItem,\r\n isBarTooltip,\r\n xScaleItemWidth,\r\n tooltipRoot,\r\n tooltipClassName,\r\n onBarClick,\r\n onBarHover,\r\n } = props;\r\n\r\n if (node !== null && data.length) {\r\n const marginTop = margin ? margin.top : 0;\r\n const marginRight = margin ? margin.right : 0;\r\n const marginBottom = margin ? margin.bottom : 0;\r\n const marginLeft = margin ? margin.left : 0;\r\n const defaultBarWidth = 12;\r\n const { width: nodeWidth } = node.getBoundingClientRect();\r\n const width = props.width || nodeWidth;\r\n const height = props.height || 0;\r\n const barDomain = getDomain({\r\n data,\r\n minDomainValue,\r\n maxDomainValue,\r\n });\r\n\r\n const min =\r\n typeof minValue === 'number'\r\n ? minValue\r\n : Math.min(\r\n d3.min(lineData, ({ values }) => d3.min(values as number[])) ||\r\n Number.POSITIVE_INFINITY,\r\n barDomain.min || 0\r\n );\r\n const max =\r\n typeof maxValue === 'number'\r\n ? maxValue\r\n : Math.max(\r\n d3.max(lineData, ({ values }) => d3.max(values as number[])) ||\r\n Number.NEGATIVE_INFINITY,\r\n barDomain.max\r\n );\r\n const svg = appendSvg(node, width, height || 0);\r\n const yTicksCountDefault = 6;\r\n const labels = data.map((item: BarChartData) => item.groupName as string);\r\n let barWidth = barWidthProp || defaultBarWidth;\r\n\r\n const yScale = d3\r\n .scaleLinear()\r\n .domain([min, max])\r\n .range([\r\n height - marginTop - marginBottom - (xAxisPadding || 0),\r\n marginTop,\r\n ])\r\n .nice();\r\n\r\n customYScale && customYScale(yScale);\r\n\r\n const yTicks = yScale.ticks();\r\n const yAxisLeft = d3.axisLeft(yScale).ticks(yTicksCountDefault);\r\n\r\n customYAxisLeft && customYAxisLeft(yAxisLeft);\r\n\r\n const yTicksCount = yAxisLeft.tickArguments()[0];\r\n\r\n const yAxis = svg\r\n .append('g')\r\n .attr('class', classNames.barChartYAxis)\r\n .call(yAxisLeft);\r\n\r\n yAxis.selectAll('.tick').attr('class', value => {\r\n return value === 0 ? `tick ${classNames.barChartYAxisZeroTick}` : 'tick';\r\n });\r\n\r\n customYAxis && customYAxis(yAxis);\r\n\r\n const { width: yAxisWidth } = computeDimensions(yAxis);\r\n const range = [\r\n marginLeft + yAxisWidth + (yAxisPadding || 0),\r\n width - marginRight,\r\n ];\r\n\r\n const xScale = d3\r\n .scaleBand()\r\n .domain(d3.range(data.length) as [])\r\n .range(range);\r\n\r\n barWidth = resizeBarWidth({\r\n data,\r\n sectionPadding,\r\n range,\r\n barWidth,\r\n barPadding,\r\n });\r\n\r\n customXScale && customXScale(xScale);\r\n\r\n const [x1, x2] = xScale.range();\r\n\r\n const xAxisBottom = d3\r\n .axisBottom(xScale)\r\n .tickFormat(value => labels[Number(value)]);\r\n\r\n if (typeof xScaleItemWidth === 'number') {\r\n xAxisBottom\r\n .tickValues(\r\n xScale.domain().filter((_, i, array) => {\r\n const chartWidth = x2 - x1;\r\n const ticks = Math.round(chartWidth / xScaleItemWidth);\r\n const length = array.length;\r\n const divider = Math.round(length / ticks);\r\n\r\n return !(i % divider);\r\n })\r\n )\r\n .tickSizeOuter(0);\r\n }\r\n\r\n customXAxisBottom && customXAxisBottom(xAxisBottom, { node, labels });\r\n\r\n const xAxis = svg\r\n .append('g')\r\n .call(xAxisBottom)\r\n .attr('class', classNames.barChartXAxis);\r\n\r\n customXAxis && customXAxis(xAxis);\r\n\r\n const marshalled = marshaling({\r\n data,\r\n yScale,\r\n xScale,\r\n barWidth,\r\n barPadding: typeof barPadding === 'number' ? barPadding : 0,\r\n colors,\r\n marginTop,\r\n });\r\n\r\n const marshalledData = marshalledMap\r\n ? marshalledMap(marshalled)\r\n : marshalled;\r\n\r\n yAxis.attr('transform', `translate( ${marginLeft + yAxisWidth}, 0)`);\r\n\r\n drawGrid({\r\n svg,\r\n yScale,\r\n xScale,\r\n yTicksCount,\r\n drawGridY,\r\n drawGridX,\r\n });\r\n\r\n xAxis.attr(\r\n 'transform',\r\n `translate(0, ${yScale(yTicks[0]) + (xAxisPadding || 0)})`\r\n );\r\n\r\n const maskId = `height-limit-mask-${uniqueId()}`;\r\n\r\n svg.append('defs')\r\n .append('mask')\r\n .attr('id', maskId)\r\n .append('rect')\r\n .attr('width', '100%')\r\n .attr('height', height - marginBottom + MIN_BAR_HEIGHT)\r\n .attr('fill', 'white');\r\n\r\n const gSvg = svg.append('g')\r\n .attr('class', classNames.barChartBarGlobal)\r\n .attr('mask', `url(#${maskId})`);\r\n\r\n const groups = gSvg\r\n .selectAll('g')\r\n .data(marshalledData)\r\n .enter()\r\n .append('g')\r\n .attr(\r\n 'transform',\r\n (_: BarChartMarshalledGroup[], i) =>\r\n `translate(${Math.round(\r\n xScale((i as unknown) as string) as number\r\n )},${-(marginTop || 0)})`\r\n );\r\n\r\n const bars = drawBars\r\n ? drawBars({ groups, yScale, marshalledData, barWidth })\r\n : getBars({ groups, barWidth });\r\n\r\n markers.forEach((marker) => {\r\n if (!marker) {\r\n return;\r\n }\r\n\r\n if (marker.horizontal) {\r\n if (marker.line) {\r\n svg.append('line')\r\n .style(\"stroke\", marker.lineColor || marker.color || \"inherit\")\r\n .style(\"stroke-width\", 1)\r\n .style(\"stroke-dasharray\", (\"5, 3\"))\r\n .attr(\"x1\", marginLeft + yAxisWidth)\r\n .attr(\"y1\", yScale(marker.value) + 1)\r\n .attr(\"x2\", width)\r\n .attr(\"y2\", yScale(marker.value) + 1);\r\n }\r\n\r\n svg.append(\"text\")\r\n .attr(\"y\", yScale(marker.value) + 1)\r\n .attr(\"x\", marginLeft + yAxisWidth)\r\n .attr('text-anchor', 'middle')\r\n .attr(\"class\", [\"marker\", marker.className].filter(Boolean).join(\" \"))\r\n .style(\"fill\", marker?.color || \"inherit\")\r\n .text(marker.label);\r\n\r\n return;\r\n }\r\n\r\n if (marker.line) {\r\n svg.append('line')\r\n .style(\"stroke\", marker.lineColor || marker.color || \"inherit\")\r\n .style(\"stroke-width\", 1)\r\n .style(\"stroke-dasharray\", (\"5, 3\"))\r\n .attr(\"x1\", width / data.length * marker.value + 1)\r\n .attr(\"y1\", 0)\r\n .attr(\"x2\", width / data.length * marker.value + 1)\r\n .attr(\"y2\", (height - marginTop - marginBottom + 8));\r\n }\r\n\r\n svg.append(\"text\")\r\n .attr(\"y\", height - 2)\r\n .attr(\"x\", width / data.length * marker.value + 1)\r\n .attr('text-anchor', marker.align === 'right' ? 'end' : marker.align === 'left' ? 'start' : 'middle')\r\n .attr(\"class\", [\"marker\", marker.className].filter(Boolean).join(\" \"))\r\n .style(\"fill\", marker?.color || \"inherit\")\r\n .text(marker.label);\r\n });\r\n\r\n let lines = null;\r\n\r\n if (Array.isArray(lineData) && lineData.length > 0) {\r\n lines = drawLines({\r\n svg,\r\n lineData,\r\n xScale,\r\n yScale,\r\n min: typeof minValuesLine === 'number' ? minValuesLine : min,\r\n stackedLine,\r\n curve,\r\n });\r\n }\r\n\r\n customBars && customBars({ bars, yScale, lines, marshalledData, lineData });\r\n\r\n if (dynamicTooltipEnable || labelPosition) {\r\n drawTooltip({\r\n svg,\r\n node,\r\n xScale,\r\n yScale,\r\n marshalledData,\r\n data,\r\n lineData,\r\n renderTooltip,\r\n labelPosition,\r\n marginTop,\r\n renderLabel,\r\n barWidth,\r\n barPadding,\r\n dynamicTooltipEnable,\r\n hideTooltipGroupName,\r\n tooltipY,\r\n tooltipBind,\r\n formatTooltipValue,\r\n formatTooltipName,\r\n tooltipYDomain,\r\n setTooltipPosition,\r\n onLabelItem,\r\n isBarTooltip,\r\n bars: groups,\r\n tooltipRoot,\r\n tooltipClassName,\r\n onBarClick,\r\n onBarHover,\r\n });\r\n }\r\n\r\n customize && customize({ svg, marshalledData, yScale, xScale, lineData });\r\n }\r\n};\r\n","import { BarChartProps } from './types';\r\n\r\nexport const getDomain = ({\r\n data,\r\n minDomainValue,\r\n maxDomainValue,\r\n}: Pick<BarChartProps, 'data' | 'minDomainValue' | 'maxDomainValue'>) => {\r\n let MIN = Number.POSITIVE_INFINITY;\r\n let MAX = Number.NEGATIVE_INFINITY;\r\n\r\n data.forEach(({ groupName, ...groups }) => {\r\n let groupMax = 0;\r\n let groupMin = 0;\r\n\r\n Object.keys(groups).forEach(key => {\r\n const group = groups[key as never];\r\n\r\n let stackMax = 0;\r\n let stackMin = 0;\r\n\r\n Object.keys(group).forEach(groupKey => {\r\n const value = group[groupKey];\r\n\r\n if (value > 0) {\r\n stackMax += value;\r\n } else {\r\n stackMin += value;\r\n }\r\n });\r\n\r\n groupMax = Math.min(groupMax, stackMin);\r\n groupMin = Math.max(groupMin, stackMax);\r\n });\r\n\r\n MIN = Math.min(MIN, groupMax);\r\n MAX = Math.max(MAX, groupMin);\r\n });\r\n\r\n if (MIN === 0 && MAX === 0) {\r\n return {\r\n min: typeof minDomainValue === 'number' ? minDomainValue : 0,\r\n max: typeof maxDomainValue === 'number' ? maxDomainValue : 1,\r\n };\r\n }\r\n\r\n return {\r\n min: typeof minDomainValue === 'number' ? minDomainValue : MIN,\r\n max: typeof maxDomainValue === 'number' ? maxDomainValue : MAX,\r\n };\r\n};\r\n","import { ResizeBarWidthProps } from './types';\r\n\r\nexport const resizeBarWidth = ({\r\n data,\r\n range,\r\n barWidth,\r\n barPadding,\r\n sectionPadding,\r\n}: ResizeBarWidthProps): number => {\r\n const groupPadding = typeof sectionPadding === 'number' ? sectionPadding : 0;\r\n const chartWidth = range[1] - range[0];\r\n const barsWidth = data.reduce((acc, { groupName, ...curr }) => {\r\n return (\r\n acc +\r\n Object.keys(curr).reduce(\r\n (acc, _key, index) =>\r\n index > 0\r\n ? acc + (barWidth || 0) + (barPadding || 0)\r\n : acc + barWidth,\r\n 0\r\n ) +\r\n groupPadding\r\n );\r\n }, groupPadding);\r\n\r\n if (chartWidth < barsWidth) {\r\n return Math.floor(barWidth * (chartWidth / barsWidth));\r\n }\r\n\r\n return barWidth;\r\n};\r\n","import { BarChartMarshalledGroup, BarChartMarshaling } from './types';\r\n\r\nexport const marshaling = ({\r\n data,\r\n yScale,\r\n xScale,\r\n barWidth,\r\n barPadding,\r\n colors,\r\n marginTop,\r\n}: BarChartMarshaling): BarChartMarshalledGroup[][] =>\r\n data.map(({ groupName, ...groups }, groupIndex) => {\r\n const marshalledGroup: BarChartMarshalledGroup[] = [];\r\n const hundred = 100;\r\n const bandwidth = xScale.bandwidth();\r\n const groupsKeys = Object.keys(groups);\r\n\r\n groupsKeys.forEach((key: string, stackIndex: number) => {\r\n const group = groups[key as never];\r\n const groupKeys = Object.keys(group);\r\n const barGroupWidth =\r\n ((barWidth as number) + (barPadding as number)) * groupsKeys.length -\r\n (groupKeys.length > 1 ? (barPadding as number) : 0);\r\n\r\n let stackMax = 0;\r\n let stackMin = 0;\r\n\r\n groupKeys.forEach(groupKey => {\r\n const value = group[groupKey];\r\n const color = colors[groupKey];\r\n const x =\r\n ((barWidth as number) + (barPadding as number)) * stackIndex +\r\n bandwidth / 2 -\r\n barGroupWidth / 2;\r\n const isPositiveValue = value > 0;\r\n const height = isPositiveValue\r\n ? Math.abs(\r\n ((yScale(stackMax - value) - yScale(stackMax) + Number.EPSILON) *\r\n hundred) /\r\n hundred\r\n )\r\n : Math.abs(\r\n ((yScale(stackMin - value) - yScale(stackMin) + Number.EPSILON) *\r\n hundred) /\r\n hundred\r\n );\r\n\r\n if (isPositiveValue) {\r\n stackMax += value;\r\n }\r\n\r\n const y = isPositiveValue\r\n ? ((yScale(stackMax) + Number.EPSILON) * hundred) / hundred\r\n : yScale(stackMin) - yScale(0) + yScale(0);\r\n\r\n marshalledGroup.push({\r\n x,\r\n y: y + (marginTop || 0),\r\n height,\r\n color,\r\n value,\r\n groupName: groupName as string,\r\n name: groupKey,\r\n stackIndex,\r\n groupIndex,\r\n });\r\n\r\n if (!isPositiveValue) {\r\n stackMin += value;\r\n }\r\n });\r\n });\r\n\r\n return marshalledGroup;\r\n });\r\n","import { BarChartData } from '../types';\r\nimport { DrawGridProps } from './types';\r\n\r\nimport { barChartClassNames } from '../styled';\r\n\r\nexport const drawGrid = ({\r\n svg,\r\n yScale,\r\n xScale,\r\n yTicksCount,\r\n drawGridX,\r\n drawGridY,\r\n}: DrawGridProps) => {\r\n if (!drawGridY && !drawGridX) return;\r\n\r\n const global = svg\r\n .append('g')\r\n .attr('class', barChartClassNames.barChartGridGlobal);\r\n\r\n const yTicks = yScale.ticks(yTicksCount);\r\n const range = xScale.range();\r\n const domain = xScale.domain();\r\n\r\n if (drawGridX) {\r\n global\r\n .append('g')\r\n .selectAll('line')\r\n .data(yTicks)\r\n .join('line')\r\n .attr('class', d =>\r\n d === 0\r\n ? `${barChartClassNames.barChartGridLineX} ${barChartClassNames.barChartGridLineXZero}`\r\n : barChartClassNames.barChartGridLineX\r\n )\r\n .attr('x1', () => range[0])\r\n .attr('x2', () => range[1])\r\n .attr('y1', (d: BarChartData | any) => Math.round(yScale(d) as number))\r\n .attr('y2', (d: BarChartData | any) => Math.round(yScale(d) as number));\r\n }\r\n\r\n if (drawGridY) {\r\n const getX = (index: number) =>\r\n domain[index] !== void 0\r\n ? index === 0\r\n ? range[0]\r\n : Math.round(\r\n xScale.step() * index +\r\n range[0] -\r\n (xScale.step() / 2) * xScale.padding()\r\n )\r\n : range[1];\r\n\r\n global\r\n .append('g')\r\n .selectAll('line')\r\n .data(Array.from({ length: domain.length + 1 }, (_, index) => index))\r\n .join('line')\r\n .attr('class', d =>\r\n d === 0\r\n ? `${barChartClassNames.barChartGridLineY} ${barChartClassNames.barChartGridLineYZero}`\r\n : barChartClassNames.barChartGridLineY\r\n )\r\n .attr('x1', getX)\r\n .attr('x2', getX)\r\n .attr('y1', () => Math.round(yScale(yTicks[0]) as number))\r\n .attr('y2', () =>\r\n Math.round(yScale(yTicks[yTicks.length - 1]) as number)\r\n );\r\n }\r\n};\r\n","import { BarChartMarshalledGroup } from '../types';\r\nimport { GetBarsProps } from './types';\r\n\r\nexport const getBars = ({ groups, barWidth }: GetBarsProps) => {\r\n return groups\r\n .selectAll('rect')\r\n .data((item: BarChartMarshalledGroup[]) => item)\r\n .join('rect')\r\n .attr('x', (item: BarChartMarshalledGroup) => item.x)\r\n .attr('y', (item: BarChartMarshalledGroup) => item.y)\r\n .attr('width', barWidth)\r\n .attr('height', (item: BarChartMarshalledGroup) => item.height)\r\n .style('fill', (item: BarChartMarshalledGroup) => item.color);\r\n};\r\n","import React from 'react';\r\nimport * as d3 from 'd3';\r\nimport ReactDOMServer from 'react-dom/server';\r\n\r\nimport { DrawTooltipProps } from './types';\r\nimport {\r\n BarChartMarshalledGroup,\r\n BarChartLineData,\r\n BarChartMergedData,\r\n} from '../types';\r\n\r\nimport { getLabelY } from './getLabelY';\r\nimport { getLabel } from './getLabel';\r\nimport { barChartClassNames } from '../styled';\r\nimport {\r\n TooltipFlex,\r\n TooltipGroupName,\r\n LabelFlex,\r\n LabelFlexCenter,\r\n TooltipContainer,\r\n TooltipItem,\r\n ColFlex,\r\n ColorBox,\r\n ColorLine,\r\n Name,\r\n Value,\r\n} from '../../../common/components/tooltips';\r\n\r\nexport const drawTooltip = ({\r\n svg,\r\n node,\r\n data,\r\n marshalledData,\r\n xScale,\r\n yScale,\r\n renderTooltip,\r\n labelPosition,\r\n marginTop,\r\n renderLabel,\r\n barWidth,\r\n barPadding,\r\n dynamicTooltipEnable,\r\n hideTooltipGroupName,\r\n tooltipY,\r\n tooltipBind,\r\n lineData,\r\n formatTooltipValue,\r\n formatTooltipName,\r\n tooltipYDomain,\r\n setTooltipPosition,\r\n onLabelItem,\r\n isBarTooltip,\r\n bars,\r\n tooltipRoot,\r\n tooltipClassName,\r\n onBarClick,\r\n onBarHover,\r\n}: DrawTooltipProps) => {\r\n d3.select(node)\r\n .select(`.${barChartClassNames.barChartMouseContainer}`)\r\n .remove();\r\n\r\n const xScaleBandDomain = xScale.domain();\r\n const [x1, x2] = xScale.range();\r\n const [y1, y2] = yScale.range();\r\n const bandwidth = xScale.bandwidth();\r\n const format = d3.format(',');\r\n\r\n const getX = (index: number): number =>\r\n xScaleBandDomain[index] !== void 0\r\n ? index === 0\r\n ? x1\r\n : Math.round(\r\n xScale.step() * index + x1 - (xScale.step() / 2) * xScale.padding()\r\n )\r\n : x2;\r\n const groups = xScaleBandDomain.map(value => getX(Number(value) + 1));\r\n\r\n const topYDomain = tooltipYDomain\r\n ? tooltipYDomain({ data: marshalledData, lineData, yScale })\r\n : marshalledData.reduce((acc, curr, index) => {\r\n const lineMin =\r\n d3.min(lineData as BarChartLineData[], ({ values }) =>\r\n typeof values[index] === 'number'\r\n ? yScale((values[index] || 0) - y2)\r\n : Number.POSITIVE_INFINITY\r\n ) || Number.POSITIVE_INFINITY;\r\n\r\n acc.push(\r\n curr.reduce(\r\n (acc, { y }) => Math.min(acc, y, lineMin as number),\r\n Number.POSITIVE_INFINITY\r\n ) as any\r\n );\r\n return acc;\r\n }, []);\r\n\r\n const mouseGlobal = svg.append('g').attr('class', 'lineChartMouseGlobal');\r\n const mouseRect = mouseGlobal\r\n .append('rect')\r\n .attr('width', x2 - x1)\r\n .attr('height', Math.abs(y1 - y2))\r\n .attr('class', barChartClassNames.barChartMouseRect)\r\n .attr('transform', `translate(${x1}, ${y2})`);\r\n\r\n if (dynamicTooltipEnable) {\r\n const tooltipContainer: Element | null =\r\n tooltipRoot || document.querySelector('body');\r\n let tooltip: d3.Selection<any, unknown, any, any> = d3.select(\r\n `.${barChartClassNames.barChartMouseTooltip}`\r\n );\r\n\r\n if (tooltip.size() === 0) {\r\n tooltip = d3\r\n .select(tooltipContainer)\r\n .append('div')\r\n .attr('class', barChartClassNames.barChartMouseTooltip)\r\n .style('opacity', '0')\r\n .style('position', 'absolute')\r\n .html(() => {\r\n const html = ReactDOMServer.renderToString(\r\n <TooltipFlex className={barChartClassNames.barChartTooltipFlex} />\r\n );\r\n\r\n return html;\r\n });\r\n }\r\n\r\n const barChartTootipFlex = tooltip.select(\r\n `.${barChartClassNames.barChartTooltipFlex}`\r\n );\r\n\r\n let isVisible = false;\r\n let flagCurrIndex: number | null = null;\r\n\r\n const setVisible = (visible?: boolean) => {\r\n isVisible = Boolean(visible);\r\n\r\n const opacity = isVisible ? '1' : '0';\r\n tooltip.style('opacity', opacity);\r\n\r\n if (!isVisible) {\r\n tooltip.attr('class', barChartClassNames.barChartMouseTooltip);\r\n flagCurrIndex = null;\r\n tooltip.style('transition', 'none');\r\n tooltip.style('top', null);\r\n tooltip.style('left', null);\r\n } else {\r\n tooltip.attr(\r\n 'class',\r\n `${barChartClassNames.barChartMouseTooltip} ${tooltipClassName || ''}`\r\n );\r\n tooltip.style('transition', null);\r\n }\r\n };\r\n\r\n mouseRect.on('mouseout.tooltip', () => setVisible());\r\n mouseRect.on('touchmove.tooltip mousemove.tooltip', event => {\r\n const [docX, docY] = d3.pointer(event, document);\r\n const [rectrX] = d3.pointer(event, mouseRect);\r\n const [nodeX, nodeY] = d3.pointer(event, node);\r\n const x = rectrX - (rectrX - nodeX);\r\n const offsetX = docX - nodeX;\r\n const offsetY = docY - nodeY;\r\n\r\n const currIndex = groups.findIndex(value => x <= value);\r\n\r\n if (isBarTooltip) {\r\n const containts = document.elementsFromPoint(\r\n event.clientX,\r\n event.clientY\r\n );\r\n const currBars = d3\r\n .select(bars.nodes()[currIndex])\r\n .selectAll('rect')\r\n .nodes();\r\n const isContains = containts.some(item => currBars.includes(item));\r\n\r\n if (!isContains) {\r\n if (isVisible) {\r\n setVisible(false);\r\n }\r\n mouseRect.style('cursor', 'default');\r\n return;\r\n } else {\r\n mouseRect.style('cursor', 'pointer');\r\n }\r\n }\r\n\r\n const top =\r\n (typeof tooltipY === 'number'\r\n ? tooltipY\r\n : ((topYDomain[currIndex] as unknown) as number) - y2) + offsetY;\r\n const left =\r\n (tooltipBind\r\n ? (xScale((currIndex as unknown) as string) || 0) + bandwidth / 2\r\n : x) + offsetX;\r\n\r\n if (tooltipBind && flagCurrIndex === currIndex) {\r\n return;\r\n }\r\n\r\n let currData = marshalledData[currIndex] as BarChartMergedData;\r\n if (Array.isArray(currData) && currData.length === 0) {\r\n return;\r\n }\r\n\r\n if (lineData) {\r\n const currLineData = lineData.map(({ values, ...rest }) => ({\r\n ...rest,\r\n value: values[currIndex],\r\n groupName: data[currIndex] && data[currIndex].groupName,\r\n }));\r\n\r\n if (Array.isArray(currLineData) && Array.isArray(currData)) {\r\n currData = currData.concat(currLineData as BarChartMergedData);\r\n }\r\n }\r\n\r\n const svgWidth = (svg.node() as SVGElement).getBoundingClientRect()\r\n .width as number;\r\n\r\n if (typeof setTooltipPosition === 'function') {\r\n setTooltipPosition({\r\n left,\r\n top,\r\n tooltip,\r\n svgWidth,\r\n });\r\n } else if (!setTooltipPosition) {\r\n tooltip.style('left', `${left}px`).style('top', `${top}px`);\r\n }\r\n\r\n if (renderTooltip) {\r\n barChartTootipFlex.html(() => {\r\n const html = ReactDOMServer.renderToString(\r\n <>\r\n {renderTooltip(\r\n currData,\r\n setTooltipPosition\r\n ? {\r\n left,\r\n top,\r\n tooltip,\r\n svgWidth,\r\n }\r\n : undefined,\r\n barWidth\r\n )}\r\n </>\r\n );\r\n\r\n return html;\r\n });\r\n } else {\r\n if (!isVisible) {\r\n setVisible(true);\r\n }\r\n\r\n barChartTootipFlex.html(() => {\r\n const html = ReactDOMServer.renderToString(\r\n <TooltipContainer className={barChartClassNames.barChartTooltip}>\r\n {currData && currData[0] && !hideTooltipGroupName && (\r\n <TooltipGroupName\r\n className={barChartClassNames.barChartTooltipGroupName}\r\n >\r\n {currData[0].groupName}\r\n </TooltipGroupName>\r\n )}\r\n {currData &&\r\n currData.map(\r\n ({ name, value, stroke, fill, color, lineType }) => (\r\n <TooltipItem\r\n key={name}\r\n className={barChartClassNames.barChartTooltipItem}\r\n >\r\n <ColFlex\r\n className={barChartClassNames.barChartTooltipColFlex}\r\n >\r\n {lineType ? (\r\n <ColorLine\r\n className={barChartClassNames.barChartColorLine}\r\n style={{ backgroundColor: stroke || fill }}\r\n />\r\n ) : (\r\n <ColorBox\r\n className={barChartClassNames.barChartColorBox}\r\n style={{ backgroundColor: color }}\r\n />\r\n )}\r\n <Name\r\n className={barChartClassNames.barChartTooltipName}\r\n >\r\n {formatTooltipName ? formatTooltipName(name) : name}\r\n </Name>\r\n </ColFlex>\r\n <Value\r\n className={barChartClassNames.barChartTooltipValue}\r\n >\r\n {formatTooltipValue\r\n ? formatTooltipValue(value, name)\r\n : format(value)}\r\n </Value>\r\n </TooltipItem>\r\n )\r\n )}\r\n </TooltipContainer>\r\n );\r\n\r\n return html;\r\n });\r\n }\r\n\r\n flagCurrIndex = currIndex;\r\n if (!isVisible) {\r\n setVisible(true);\r\n }\r\n });\r\n }\r\n\r\n const container = d3\r\n .select(node)\r\n .append('div')\r\n .attr('class', barChartClassNames.barChartMouseContainer);\r\n\r\n const labelContainer = container\r\n .append('div')\r\n .attr('class', barChartClassNames.barChartLabelContainer)\r\n .style('position', 'absolute')\r\n .style('top', `${y2}px`);\r\n\r\n const isMouseWithin = (e: MouseEvent, callback: (group: BarChartMarshalledGroup) => void) => {\r\n const [rectrX, rectrY] = d3.pointer(e, mouseRect);\r\n const [nodeX, nodeY] = d3.pointer(e, node);\r\n const x = rectrX - (rectrX - nodeX);\r\n const y = rectrY - nodeY;\r\n\r\n const currIndex = groups.findIndex(value => x <= value);\r\n const dataItem = marshalledData[currIndex][0];\r\n\r\n if (dataItem.height >= y1 - y) {\r\n callback(dataItem);\r\n }\r\n };\r\n\r\n mouseGlobal\r\n .on(\"click\", e => isMouseWithin(e, (dataItem) => onBarClick && onBarClick(dataItem)))\r\n .on(\"mousemove\", e => isMouseWithin(e, (dataItem) => onBarHover && onBarHover(dataItem)))\r\n .on(\"mouseleave\", () => onBarHover && onBarHover(undefined));\r\n\r\n if (labelPosition) {\r\n const concatedData: BarChartMarshalledGroup[][] = lineData\r\n ? marshalledData.map((stack, index) =>\r\n stack.concat(\r\n lineData.map(({ values, name, stroke }) => {\r\n const { stacksCount } = stack.reduce(\r\n (acc, { stackIndex }) => {\r\n const { indexFlag, stacksCount } = acc;\r\n if (stackIndex !== indexFlag) {\r\n return {\r\n indexFlag: stackIndex,\r\n stacksCount: stacksCount + 1,\r\n };\r\n }\r\n return acc;\r\n },\r\n {\r\n indexFlag: -1,\r\n stacksCount: 0,\r\n }\r\n );\r\n const barsWidth =\r\n (barWidth * stacksCount +\r\n (barPadding || 0) * (stacksCount - 1)) /\r\n 2;\r\n\r\n return {\r\n x: stack[0].x - barWidth / 2 + barsWidth,\r\n y: yScale(values[index] as number) + marginTop,\r\n height: 0,\r\n color: stroke,\r\n value: values[index],\r\n groupName: stack[0].groupName,\r\n name,\r\n stackIndex: 0,\r\n groupIndex: index,\r\n };\r\n }) as BarChartMarshalledGroup[]\r\n )\r\n )\r\n : marshalledData;\r\n\r\n const groups = labelContainer\r\n .selectAll('div')\r\n .data(concatedData)\r\n .enter()\r\n .append('div')\r\n .style('position', 'absolute')\r\n .style(\r\n 'transform',\r\n (_: BarChartMarshalledGroup[], index) =>\r\n `translate(${Math.round(\r\n xScale((index as unknown) as string) as number\r\n )}px,${-(marginTop || 0)}px)`\r\n );\r\n\r\n const LabelFlexStyled =\r\n labelPosition === 'center' ? LabelFlexCenter : LabelFlex;\r\n\r\n const LabelStyle = getLabel(labelPosition);\r\n\r\n groups\r\n .selectAll('span')\r\n .data((item: BarChartMarshalledGroup[]) =>\r\n onLabelItem ? onLabelItem(item) : item\r\n )\r\n .join('div')\r\n .style('left', item => `${Math.round(item.x + barWidth / 2)}px`)\r\n .style(\r\n 'top',\r\n (item: BarChartMarshalledGroup) =>\r\n `${getLabelY(labelPosition, y2, item)}px`\r\n )\r\n .style('position', 'absolute')\r\n .html((item: BarChartMarshalledGroup) =>\r\n ReactDOMServer.renderToString(\r\n <LabelFlexStyled className={barChartClassNames.barChartLabelFlex}>\r\n {renderLabel ? (\r\n renderLabel({ ...item, barWidth })\r\n ) : (\r\n <LabelStyle className={barChartClassNames.barChartLabel}>\r\n {format(item.value)}\r\n </LabelStyle>\r\n )}\r\n </LabelFlexStyled>\r\n )\r\n );\r\n }\r\n};\r\n","import { BarChartLabelPosition } from '../types';\r\n\r\nimport {\r\n Label as LabelUI,\r\n LabelTop,\r\n LabelBottom,\r\n} from '../../../common/components/tooltips';\r\n\r\nexport const getLabel = (labelPosition: BarChartLabelPosition) => {\r\n switch (labelPosition) {\r\n case 'top':\r\n return LabelTop;\r\n case 'bottom':\r\n return LabelBottom;\r\n default:\r\n return LabelUI;\r\n }\r\n};\r\n","import { BarChartLabelPosition, BarChartMarshalledGroup } from '../types';\r\n\r\nexport const getLabelY = (\r\n labelPosition: BarChartLabelPosition,\r\n y2: number,\r\n item: BarChartMarshalledGroup\r\n): number => {\r\n switch (labelPosition) {\r\n case 'center':\r\n return item.y + item.height / 2 - y2;\r\n case 'bottom':\r\n return item.y + item.height - y2;\r\n default:\r\n return item.y;\r\n }\r\n};\r\n","import React, { FC, useEffect } from 'react';\r\n\r\nimport { SvgWrapper, TooltipStyles } from './styled';\r\n\r\nimport { useNode } from '../../hooks';\r\nimport { useResize } from '../../hooks';\r\nimport { useSelection } from \"./hooks/useSelection\";\r\n\r\nimport { draw } from './draw';\r\n\r\nimport { BarChartProps } from './types';\r\n\r\nexport const BarChart: FC<BarChartProps> = (props) => {\r\n const { className, style, children, selectable } = props;\r\n const [ref, node] = useNode();\r\n\r\n useEffect(() => {\r\n node && draw(node, props);\r\n }, [node, props]);\r\n\r\n const onDraw = () => draw(node, props);\r\n\r\n useResize(props.width, onDraw);\r\n useSelection(selectable ? node : null, props);\r\n\r\n return (\r\n <div className={className} style={style}>\r\n <TooltipStyles />\r\n <SvgWrapper ref={ref} selectable={selectable}>{children}</SvgWrapper>\r\n </div>\r\n );\r\n};\r\n\r\nBarChart.defaultProps = {\r\n data: [],\r\n colors: {},\r\n margin: {\r\n top: 10,\r\n right: 10,\r\n bottom: 10,\r\n left: 0,\r\n },\r\n barWidth: 12,\r\n barPadding: 0,\r\n height: 320,\r\n yAxisPadding: 0,\r\n xAxisPadding: 0,\r\n tooltipBind: true,\r\n sectionPadding: 1,\r\n};\r\n","import { useCallback, useEffect, useRef } from \"react\";\r\n\r\nimport { barChartClassNames } from \"../styled\";\r\n\r\nimport { BarChartProps } from \"../types\";\r\n\r\nexport const useSelection = (node: HTMLElement | null, props: BarChartProps) => {\r\n const drawing = useRef<boolean>(false);\r\n const startX = useRef<number>(0);\r\n const selection = useRef<HTMLDivElement | undefined>();\r\n\r\n const clearSelection = useCallback(() => {\r\n if (node && selection.current) {\r\n drawing.current = false;\r\n\r\n node.removeChild(selection.current);\r\n\r\n selection.current = undefined;\r\n }\r\n }, [node]);\r\n\r\n const onStartDrawing = useCallback((e) => {\r\n const isTouch = Boolean(e.touches);\r\n\r\n e.stopPropagation();\r\n\r\n if (node && e.which !== 3) {\r\n clearSelection();\r\n\r\n selection.current = document.createElement(\"div\");\r\n selection.current.setAttribute(\"class\", barChartClassNames.barChartSelection);\r\n selection.current.setAttribute(\"style\", `height: calc(100% - ${props.margin?.bottom ?? 0}px)`);\r\n\r\n node.appendChild(selection.current);\r\n\r\n drawing.current = true;\r\n startX.current = isTouch\r\n ? (e.touches[0]?.pageX - (node.firstChild as HTMLElement).getBoundingClientRect().left)\r\n : e.offsetX;\r\n selection.current.style.display = \"block\";\r\n selection.current.style.width = \"0px\";\r\n selection.current.style.left = `${startX.current}px`;\r\n }\r\n }, [node]);\r\n\r\n const onDraw = useCallback((e) => {\r\n const isTouch = Boolean(e.touches);\r\n\r\n e.stopPropagation();\r\n\r\n if (node && drawing.current && selection.current) {\r\n const nodeWidth = (node.firstChild as HTMLElement).getBoundingClientRect().width;\r\n const offsetX = isTouch\r\n ? (e.touches[0]?.pageX - (node.firstChild as HTMLElement).getBoundingClientRect().left)\r\n : e.offsetX;\r\n const newWidth = offsetX - startX.current;\r\n\r\n if (offsetX >= 0) {\r\n if (newWidth > 0) {\r\n selection.current.style.marginLeft = \"0px\";\r\n selection.current.style.width = offsetX <= nodeWidth ? `${newWidth}px` : `${nodeWidth - startX.current}px`;\r\n } else {\r\n selection.current.style.right = `${nodeWidth - startX.current}px`;\r\n selection.current.style.width = `${Math.abs(newWidth)}px`;\r\n selection.current.style.marginLeft = `${newWidth}px`;\r\n }\r\n }\r\n\r\n if (isTouch) {\r\n if (node.offsetLeft > e.touches[0].pageX) {\r\n selection.current.style.right = `${nodeWidth - startX.current}px`;\r\n selection.current.style.width = `${startX.current}px`;\r\n selection.current.style.marginLeft = `-${startX.current}px`;\r\n }\r\n }\r\n }\r\n }, [node]);\r\n\r\n const onMouseLeave = useCallback((e) => {\r\n if (drawing.current && node && selection.current) {\r\n if (node.offsetLeft > e.pageX) {\r\n const nodeWidth = (node.firstChild as HTMLElement).getBoundingClientRect().width;\r\n\r\n selection.current.style.right = `${nodeWidth - startX.current}px`;\r\n selection.current.style.width = `${startX.current}px`;\r\n selection.current.style.marginLeft = `-${startX.current}px`;\r\n }\r\n\r\n if (node.offsetLeft + node.offsetWidth < e.pageX) {\r\n const nodeWidth = (node.firstChild as HTMLElement).getBoundingClientRect().width;\r\n\r\n selection.current.style.left = `${startX.current}px`;\r\n selection.current.style.width = `${nodeWidth - startX.current}px`;\r\n selection.current.style.marginLeft = \"0px\";\r\n }\r\n }\r\n }, [node]);\r\n\r\n const onStopDrawing = useCallback(() => {\r\n if (node && selection.current) {\r\n const nodeWidth = (node.firstChild as HTMLElement).getBoundingClientRect().width;\r\n const selectionMinX = selection.current.offsetLeft >= 0\r\n ? selection.current.offsetLeft <= nodeWidth ? selection.current.offsetLeft : nodeWidth\r\n : 0;\r\n const selectionWidth = selection.current.getBoundingClientRect().right - selection.current.getBoundingClientRect().left;\r\n const selectionMaxX = selection.current.offsetLeft + selectionWidth <= nodeWidth\r\n ? selection.current.offsetLeft + selectionWidth >= 0 ? selection.current.offsetLeft + selectionWidth : 0\r\n : nodeWidth;\r\n const min = Math.round(selectionMinX);\r\n const max = Math.round(selectionMaxX);\r\n\r\n if (max - min > 0 && props.onSelect) {\r\n props.onSelect([min, max]);\r\n }\r\n }\r\n\r\n clearSelection();\r\n }, [node, clearSelection]);\r\n\r\n useEffect(() => {\r\n if (node) {\r\n node.childNodes.forEach((child) => {\r\n (child as HTMLElement).style.userSelect = \"none\";\r\n });\r\n\r\n node.addEventListener(\"mousedown\", onStartDrawing);\r\n node.addEventListener(\"touchstart\", onStartDrawing);\r\n node.addEventListener(\"mousemove\", onDraw);\r\n node.addEventListener(\"touchmove\", onDraw);\r\n node.addEventListener(\"mouseleave\", onMouseLeave);\r\n node.addEventListener(\"mouseup\", onStopDrawing);\r\n node.addEventListener(\"touchend\", onStopDrawing);\r\n document.addEventListener(\"mouseup\", onStopDrawing);\r\n }\r\n\r\n return () => {\r\n node?.removeEventListener(\"mousedown\", onStartDrawing);\r\n node?.removeEventListener(\"touchstart\", onStartDrawing);\r\n node?.removeEventListener(\"mousemove\", onDraw);\r\n node?.removeEventListener(\"touchmove\", onDraw);\r\n node?.removeEventListener(\"mouseleave\", onMouseLeave);\r\n node?.removeEventListener(\"mouseup\", onStopDrawing);\r\n node?.removeEventListener(\"touchend\", onStopDrawing);\r\n document.removeEventListener(\"mouseup\", onStopDrawing);\r\n };\r\n }, [node]);\r\n};\r\n","import styled from 'styled-components';\r\n\r\nimport { TooltipFlex as TooltipFlexUI } from '../../common/components/tooltips';\r\n\r\nexport const horizontalBarChartClassNames = {\r\n horizontalBarChartButtonTd: 'horizontalBarChartButtonTd',\r\n horizontalBarChartLabelTd: 'horizontalBarChartLabelTd',\r\n horizontalBarChartLabelCell: 'horizontalBarChartLabelCell',\r\n horizontalBarChartBarTd: 'horizontalBarChartBarTd',\r\n horizontalBarChartBarFlex: 'horizontalBarChartBarFlex',\r\n horizontalBarChartBar: 'horizontalBarChartBar',\r\n horizontalBarChartBarFirst: 'horizontalBarChartBarFirst',\r\n horizontalBarChartBarLast: 'horizontalBarChartBarLast',\r\n horizontalBarChartBarOnly: 'horizontalBarChartBarOnly',\r\n horizontalBarChartTooltipFlex: 'horizontalBarChartTooltipFlex',\r\n horizontalBarChartStackWrapper: 'horizontalBarChartStackWrapper',\r\n horizontalBarChartTooltipContainer: 'horizontalBarChartTooltipContainer',\r\n horizontalBarChartStackSumContainer: 'horizontalBarChartStackSumContainer',\r\n horizontalBarChartStackSum: 'horizontalBarChartStackSum',\r\n horizontalBarChartXScaleTd: 'horizontalBarChartXScaleTd',\r\n horizontalBarChartXScaleTicks: 'horizontalBarChartXScaleTicks',\r\n horizontalBarChartXScaleTick: 'horizontalBarChartXScaleTick',\r\n horizontalBarChartTooltipItem: 'horizontalBarChartTooltipItem',\r\n horizontalBarChartTooltipName: 'horizontalBarChartTooltipName',\r\n horizontalBarChartTooltipValue: 'horizontalBarChartTooltipValue',\r\n};\r\n\r\nexport const Table = styled.table`\r\n width: 100%;\r\n`;\r\n\r\nexport const LabelCell = styled.div`\r\n text-align: right;\r\n`;\r\n\r\nexport const BarFlex = styled.div`\r\n width: 100%;\r\n display: flex;\r\n height: 1rem;\r\n`;\r\n\r\nexport const BarsTd = styled.td`\r\n width: 100%;\r\n position: relative;\r\n vertical-align: middle;\r\n`;\r\n\r\nexport const TooltipFlex = styled(TooltipFlexUI)`\r\n position: absolute;\r\n top: 0;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\r\n will-change: left, top;\r\n`;\r\n\r\nexport const StackSumContainer = styled.div`\r\n position: relative;\r\n`;\r\n\r\nexport const StackSum = styled.div`\r\n white-space: nowrap;\r\n position: absolute;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(0, -50%);\r\n`;\r\n\r\nexport const StackWrapper = styled.div`\r\n position: absolute;\r\n top: 0;\r\n display: flex;\r\n justify-content: flex-start;\r\n height: 100%;\r\n`;\r\n","import React from 'react';\r\nimport * as d3 from 'd3';\r\n\r\nimport {\r\n horizontalBarChartClassNames as classNames,\r\n TooltipFlex,\r\n} from '../styled';\r\nimport {\r\n TooltipContainer,\r\n TooltipItem,\r\n Name,\r\n Value,\r\n ColorBox,\r\n} from '../../../common/components/tooltips';\r\n\r\nimport { TooltipProps } from './types';\r\n\r\nexport const Tooltip: React.FC<TooltipProps> = ({\r\n renderTooltip,\r\n bars,\r\n style,\r\n className,\r\n}): React.ReactElement => {\r\n const format = d3.format(',');\r\n\r\n return (\r\n <TooltipFlex\r\n className={`${classNames.horizontalBarChartTooltipFlex} ${className ||\r\n ''}`}\r\n style={style}\r\n >\r\n <TooltipContainer\r\n className={classNames.horizontalBarChartTooltipContainer}\r\n >\r\n {renderTooltip\r\n ? renderTooltip(bars)\r\n : bars.map(({ color, name, value, groupName }, index) => (\r\n <TooltipItem\r\n key={`${name || ''}-${index}-${groupName}`}\r\n className={classNames.horizontalBarChartTooltipItem}\r\n >\r\n {color && <ColorBox style={{ backgroundColor: color }} />}\r\n {name && (\r\n <Name className={classNames.horizontalBarChartTooltipName}>\r\n {name}\r\n </Name>\r\n )}\r\n <Value className={classNames.horizontalBarChartTooltipValue}>\r\n {format(value)}\r\n </Value>\r\n </TooltipItem>\r\n ))}\r\n </TooltipContainer>\r\n </TooltipFlex>\r\n );\r\n};\r\n","import React, { useCallback, useEffect } from 'react';\r\nimport * as d3 from 'd3';\r\nimport { render, unmountComponentAtNode } from 'react-dom';\r\n\r\nimport {\r\n HorizontalBarChartMarshalingData,\r\n HorizontalBarChartProps,\r\n} from '../../types';\r\nimport { UseTooltip } from './types';\r\n\r\nimport { Tooltip } from '../../Tooltip';\r\n\r\nconst rootElement: HTMLDivElement = document.createElement('div');\r\n\r\nexport const useTooltip = ({\r\n renderTooltip,\r\n tooltipBind,\r\n tooltipStyle,\r\n tooltipRoot,\r\n tooltipClassName,\r\n hideTooltip,\r\n}: Pick<\r\n HorizontalBarChartProps,\r\n | 'renderTooltip'\r\n | 'tooltipBind'\r\n | 'tooltipStyle'\r\n | 'tooltipRoot'\r\n | 'tooltipClassName'\r\n | 'hideTooltip'\r\n>): UseTooltip => {\r\n useEffect(() => {\r\n const container: Element | null =\r\n tooltipRoot || document.querySelector('body');\r\n\r\n container && container.appendChild(rootElement);\r\n return () => {\r\n unmountComponentAtNode(rootElement);\r\n };\r\n }, [tooltipRoot]);\r\n\r\n const onMouseMove = useCallback(\r\n (event: React.MouseEvent, bars: HorizontalBarChartMarshalingData[]) => {\r\n let [x, y] = d3.pointer(event, document);\r\n\r\n if (!tooltipBind && 'getBoundingClientRect' in event.target) {\r\n const {\r\n width,\r\n height,\r\n }: DOMRect = (event.target as HTMLDivElement).getBoundingClientRect();\r\n const [barX, barY] = d3.pointer(event, event.target);\r\n\r\n x = x - barX + width / 2;\r\n y = y - barY + height / 2;\r\n }\r\n\r\n if (rootElement) {\r\n rootElement.style.visibility = 'visible';\r\n }\r\n\r\n render(\r\n <Tooltip\r\n style={{\r\n left: x,\r\n top: y,\r\n ...tooltipStyle,\r\n }}\r\n bars={bars}\r\n renderTooltip={renderTooltip}\r\n className={tooltipClassName}\r\n />,\r\n rootElement\r\n );\r\n },\r\n [tooltipClassName, tooltipStyle, renderTooltip, tooltipBind]\r\n );\r\n\r\n const onMouseLeave = useCallback(() => {\r\n if (rootElement) {\r\n rootElement.style.visibility = 'hidden';\r\n hideTooltip && hideTooltip();\r\n }\r\n }, [hideTooltip]);\r\n\r\n return [onMouseMove, onMouseLeave];\r\n};\r\n","import styled from 'styled-components';\r\n\r\nexport const BarStyled = styled.div`\r\n position: relative;\r\n display: inline-flex;\r\n height: 100%;\r\n`;\r\n","import React from 'react';\r\n\r\nimport { BarProps } from './types';\r\n\r\nimport { horizontalBarChartClassNames as classNames } from '../styled';\r\nimport { BarStyled } from './styled';\r\n\r\nexport const Bar: React.FC<BarProps> = ({\r\n withTooltip,\r\n bar,\r\n formatNativeTitle,\r\n tooltipBind,\r\n mouseMove,\r\n mouseLeave,\r\n pointerEventsNone,\r\n isFirstChild,\r\n isLastChild,\r\n isOnlyChild,\r\n}): React.ReactElement => {\r\n const { color, width } = bar;\r\n const ceiledWidth = Math.abs(width);\r\n const onMouseMove = withTooltip\r\n ? (event: React.MouseEvent) => mouseMove(event, [bar])\r\n : void 0;\r\n const onMouseLeave = withTooltip ? () => mouseLeave() : void 0;\r\n\r\n return (\r\n <BarStyled\r\n className={`${classNames.horizontalBarChartBar} ${\r\n isFirstChild ? classNames.horizontalBarChartBarFirst : ''\r\n } ${isLastChild ? classNames.horizontalBarChartBarLast : ''} ${\r\n isOnlyChild ? classNames.horizontalBarChartBarOnly : ''\r\n }`}\r\n style={{\r\n width: `${ceiledWidth}%`,\r\n backgroundColor: color,\r\n pointerEvents: pointerEventsNone ? 'none' : 'auto',\r\n }}\r\n title={formatNativeTitle ? formatNativeTitle(bar) : ''}\r\n onMouseOver={onMouseMove}\r\n onMouseMove={tooltipBind ? onMouseMove : void 0}\r\n onMouseOut={onMouseLeave}\r\n />\r\n );\r\n};\r\n","import styled from 'styled-components';\r\n\r\nexport const TickTd = styled.td`\r\n position: relative;\r\n`;\r\n\r\nexport const Ticks = styled.div`\r\n position: relative;\r\n height: 1rem;\r\n`;\r\n\r\nexport const Tick = styled.div`\r\n white-space: nowrap;\r\n width: 0;\r\n height: 0;\r\n position: absolute;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n`;\r\n","import React from 'react';\r\nimport * as d3 from 'd3';\r\n\r\nimport { HorizontalBarChartProps } from '../types';\r\n\r\nimport { useScale } from './hooks/useScale';\r\n\r\nimport { TickTd, Ticks, Tick } from './styled';\r\nimport { horizontalBarChartClassNames as classNames } from '../styled';\r\n\r\nexport const XScale: React.FC<Pick<\r\n HorizontalBarChartProps,\r\n 'maxValue' | 'scaleTicks' | 'renderTicks' | 'scaleDomain'\r\n>> = ({\r\n maxValue,\r\n scaleTicks,\r\n renderTicks,\r\n scaleDomain,\r\n}): React.ReactElement => {\r\n const range = useScale({ maxValue, scaleTicks, scaleDomain });\r\n const format = d3.format(',');\r\n\r\n return (\r\n <tr>\r\n <td />\r\n <TickTd className={classNames.horizontalBarChartXScaleTd}>\r\n <Ticks className={classNames.horizontalBarChartXScaleTicks}>\r\n {range.map((tick, index, ticks) => {\r\n const { value, x } = tick;\r\n\r\n return (\r\n <Tick\r\n key={value}\r\n className={classNames.horizontalBarChartXScaleTick}\r\n style={{\r\n left: `${x}%`,\r\n justifyContent:\r\n index === 0\r\n ? 'flex-start'\r\n : index === ticks.length - 1\r\n ? 'flex-end'\r\n : '',\r\n }}\r\n >\r\n {renderTicks ? renderTicks(tick) : format(value)}\r\n </Tick>\r\n );\r\n })}\r\n </Ticks>\r\n </TickTd>\r\n </tr>\r\n );\r\n};\r\n","import { useMemo } from 'react';\r\nimport * as d3 from 'd3';\r\n\r\nimport {\r\n HorizontalBarChartProps,\r\n HorizontalBarChartScaleItem,\r\n} from '../../types';\r\n\r\nconst hundred = 100;\r\n\r\nexport const useScale = ({\r\n maxValue,\r\n scaleTicks,\r\n scaleDomain,\r\n}: Pick<\r\n HorizontalBarChartProps,\r\n 'maxValue' | 'scaleTicks' | 'scaleDomain'\r\n>): HorizontalBarChartScaleItem[] => {\r\n return useMemo(() => {\r\n const scaleLinear = d3\r\n .scaleLinear()\r\n .domain([0, maxValue] as Iterable<d3.NumberValue>)\r\n .range([0, hundred]);\r\n\r\n const ticks = scaleLinear.ticks(scaleTicks);\r\n\r\n return (scaleDomain || ticks).map((value: number) => ({\r\n value,\r\n x: scaleLinear(value),\r\n }));\r\n }, [maxValue, scaleTicks, scaleDomain]);\r\n};\r\n","import React from 'react';\r\nimport * as d3 from 'd3';\r\n\r\nimport { HorizontalBarChartProps } from './types';\r\n\r\nimport { useMarshaling } from './hooks/useMarshaling';\r\nimport { useTooltip } from './hooks/useTooltip';\r\nimport { useStackWrapper } from './hooks/useStackWrapper';\r\n\r\nimport { Bar } from './Bar';\r\nimport { XScale } from './XScale';\r\nimport {\r\n Table,\r\n LabelCell,\r\n horizontalBarChartClassNames as classNames,\r\n BarFlex,\r\n BarsTd,\r\n StackSumContainer,\r\n StackSum,\r\n} from './styled';\r\n\r\nexport const HorizontalBarChart: React.FC<HorizontalBarChartProps> = ({\r\n data,\r\n className,\r\n style,\r\n children,\r\n labels,\r\n fullExtent,\r\n maxValue,\r\n formatNativeTitle,\r\n renderTooltip,\r\n withTooltip,\r\n withStackSum,\r\n tooltipBind,\r\n scaleTicks,\r\n renderTicks,\r\n renderButton,\r\n tooltipStyle,\r\n tooltipClassName,\r\n scaleDomain,\r\n renderDataTable,\r\n thead,\r\n withoutXScale,\r\n stackedTooltip,\r\n fullChartTooltip,\r\n hideTooltip,\r\n}): React.ReactElement => {\r\n const { fullMax, data: marshalingData } = useMarshaling({\r\n data,\r\n fullExtent,\r\n maxValue,\r\n labels,\r\n });\r\n const [mouseMove, mouseLeave] = useTooltip({\r\n renderTooltip,\r\n tooltipBind,\r\n tooltipStyle,\r\n tooltipClassName,\r\n hideTooltip,\r\n });\r\n const Stack = useStackWrapper(stackedTooltip);\r\n\r\n return (\r\n <Table\r\n className={className}\r\n style={style}\r\n onMouseOver={\r\n fullChartTooltip\r\n ? event => mouseMove(event, marshalingData.flat())\r\n : void 0\r\n }\r\n onMouseMove={\r\n fullChartTooltip\r\n ? event => mouseMove(event, marshalingData.flat())\r\n : void 0\r\n }\r\n onMouseOut={fullChartTooltip ? mouseLeave : void 0}\r\n >\r\n {thead}\r\n <tbody>\r\n {marshalingData.map((item, rowIndex) => {\r\n const stackSum =\r\n (withStackSum || renderDataTable) &&\r\n d3.sum(item, ({ value }) => value);\r\n const sumWidth = d3.sum(item, ({ width }) => width);\r\n\r\n return (\r\n <tr key={`row-${rowIndex}`}>\r\n {typeof renderButton === 'function' && (\r\n <td className={classNames.horizontalBarChartButtonTd}>\r\n {renderButton(item, rowIndex)}\r\n </td>\r\n )}\r\n <td className={classNames.horizontalBarChartLabelTd}>\r\n {labels && labels[rowIndex] && (\r\n <LabelCell className={classNames.horizontalBarChartLabelCell}>\r\n {labels[rowIndex]}\r\n </LabelCell>\r\n )}\r\n </td>\r\n <BarsTd\r\n className={classNames.horizontalBarChartBarTd}\r\n style={{ pointerEvents: fullChartTooltip ? 'none' : 'auto' }}\r\n >\r\n <BarFlex\r\n className={classNames.horizontalBarChartBarFlex}\r\n style={{ pointerEvents: fullChartTooltip ? 'none' : 'auto' }}\r\n >\r\n <Stack\r\n style={stackedTooltip ? { width: `${sumWidth}%` } : void 0}\r\n item={item}\r\n tooltipBind={tooltipBind}\r\n mouseMove={mouseMove}\r\n mouseLeave={mouseLeave}\r\n />\r\n {item.map(\r\n (bar, barIndex, array) =>\r\n bar.value !== 0 && (\r\n <Bar\r\n key={`bar-${bar.name || ''}-${barIndex}`}\r\n formatNativeTitle={formatNativeTitle}\r\n bar={bar}\r\n tooltipBind={tooltipBind}\r\n pointerEventsNone={stackedTooltip || fullChartTooltip}\r\n withTooltip={withTooltip && !stackedTooltip}\r\n mouseMove={mouseMove}\r\n mouseLeave={mouseLeave}\r\n isOnlyChild={array.length === 1}\r\n isFirstChild={barIndex === 0 && array.length > 1}\r\n isLastChild={\r\n array.length - 1 === barIndex && array.length > 1\r\n }\r\n />\r\n )\r\n )}\r\n {withStackSum && (\r\n <StackSumContainer\r\n className={classNames.horizontalBarChartStackSumContainer}\r\n >\r\n <StackSum\r\n className={classNames.horizontalBarChartStackSum}\r\n >\r\n {stackSum}\r\n </StackSum>\r\n </StackSumContainer>\r\n )}\r\n </BarFlex>\r\n </BarsTd>\r\n {renderDataTable &&\r\n renderDataTable(item, stackSum as number, rowIndex)}\r\n </tr>\r\n );\r\n })}\r\n {!withoutXScale && (\r\n <XScale\r\n maxValue={typeof maxValue === 'number' ? maxValue : fullMax}\r\n scaleTicks={scaleTicks}\r\n renderTicks={renderTicks}\r\n scaleDomain={scaleDomain}\r\n />\r\n )}\r\n {children}\r\n </tbody>\r\n </Table>\r\n );\r\n};\r\n\r\nHorizontalBarChart.defaultProps = {\r\n fullExtent: true,\r\n withTooltip: false,\r\n withStackSum: false,\r\n tooltipBind: false,\r\n scaleTicks: 4,\r\n withoutXScale: false,\r\n};\r\n","import { useMemo } from 'react';\r\nimport * as d3 from 'd3';\r\n\r\nimport {\r\n HorizontalBarChartProps,\r\n HorizontalBarChartData,\r\n HorizontalBarChartMarshalingData,\r\n} from '../types';\r\n\r\nconst hundred = 100;\r\n\r\nexport const useMarshaling = ({\r\n data,\r\n fullExtent,\r\n maxValue,\r\n labels,\r\n}: Pick<\r\n HorizontalBarChartProps,\r\n 'data' | 'fullExtent' | 'maxValue' | 'labels'\r\n>): {\r\n fullMax: number;\r\n data: HorizontalBarChartMarshalingData[][];\r\n} => {\r\n return useMemo(() => {\r\n const fullMax = d3.max(data, item =>\r\n d3.sum(item, ({ value }) => value)\r\n ) as number;\r\n const scaleLinear = d3\r\n .scaleLinear()\r\n .domain([\r\n 0,\r\n typeof maxValue === 'number' ? maxValue : fullMax,\r\n ] as Iterable<d3.NumberValue>)\r\n .range([0, hundred]);\r\n\r\n return {\r\n fullMax,\r\n data: data.map((item: HorizontalBarChartData[], index) => {\r\n if (!fullExtent) {\r\n scaleLinear.domain([\r\n 0,\r\n typeof maxValue === 'number'\r\n ? maxValue\r\n : d3.sum(item, ({ value }) => value),\r\n ] as Iterable<d3.NumberValue>);\r\n }\r\n\r\n return item.map(({ value, ...rest }) => ({\r\n ...rest,\r\n value,\r\n width: scaleLinear(value),\r\n groupName: labels ? labels[index] : '',\r\n }));\r\n }),\r\n };\r\n }, [data, fullExtent, maxValue, labels]);\r\n};\r\n","import React, { Fragment, useMemo, CSSProperties, ReactNode } from 'react';\r\n\r\nimport {\r\n horizontalBarChartClassNames as classNames,\r\n StackWrapper,\r\n} from '../styled';\r\n\r\nimport { UseTooltip } from './useTooltip/types';\r\nimport {\r\n HorizontalBarChartMarshalingData,\r\n HorizontalBarChartProps,\r\n} from '../types';\r\n\r\nexport const useStackWrapper = (stackedTooltip?: boolean) => {\r\n return useMemo(\r\n () =>\r\n stackedTooltip\r\n ? ({\r\n item,\r\n mouseMove,\r\n mouseLeave,\r\n tooltipBind,\r\n ...props\r\n }: {\r\n style?: CSSProperties;\r\n item: HorizontalBarChartMarshalingData[];\r\n tooltipBind: HorizontalBarChartProps['tooltipBind'];\r\n mouseMove: UseTooltip[0];\r\n mouseLeave: UseTooltip[1];\r\n }) => (\r\n <StackWrapper\r\n className={classNames.horizontalBarChartStackWrapper}\r\n onMouseOver={event => mouseMove(event, item)}\r\n onMouseMove={\r\n tooltipBind ? event => mouseMove(event, item) : void 0\r\n }\r\n onMouseOut={mouseLeave}\r\n {...props}\r\n />\r\n )\r\n : ({ children }: { children?: ReactNode }) => (\r\n <Fragment>{children}</Fragment>\r\n ),\r\n [stackedTooltip]\r\n );\r\n};\r\n","export const bubbleChartDefaultProps = {\r\n height: 280,\r\n minSize: 6,\r\n maxSize: 30,\r\n margin: {\r\n top: 10,\r\n right: 15,\r\n bottom: 10,\r\n left: 0,\r\n },\r\n yAxisPadding: 10,\r\n xAxisPadding: 10,\r\n yScaleLabelPadding: 10,\r\n};\r\n","import styled, { createGlobalStyle } from 'styled-components';\r\n\r\nimport { Wrapper } from '../../common/components/Wrapper';\r\n\r\nexport const bubbleChartClassNames = {\r\n bubbleChartYAxis: 'bubbleChartYAxis',\r\n bubbleChartYAxisZeroTick: 'bubbleChartYAxisZeroTick',\r\n bubbleChartXAxis: 'bubbleChartXAxis',\r\n bubbleChartGridGlobal: 'bubbleChartGridGlobal',\r\n bubbleChartGridLineX: 'bubbleChartGridLineX',\r\n bubbleChartGridLineY: 'bubbleChartGridLineY',\r\n bubbleChartCircle: 'bubbleChartCircle',\r\n bubbleChartYScaleLabel: 'bubbleChartYScaleLabel',\r\n bubbleChartTooltip: 'bubbleChartTooltip',\r\n bubbleChartTooltipContainer: 'bubbleChartTooltipContainer',\r\n bubbleChartTooltipFlex: 'bubbleChartTooltipFlex',\r\n bubbleChartTip: 'bubbleChartTip',\r\n};\r\n\r\nexport const SvgWrapper = styled(Wrapper)`\r\n .${bubbleChartClassNames.bubbleChartYAxis},\r\n .${bubbleChartClassNames.bubbleChartXAxis},\r\n .${bubbleChartClassNames.bubbleChartGridGlobal} {\r\n shape-rendering: crispEdges;\r\n }\r\n\r\n .${bubbleChartClassNames.bubbleChartGridLineX},\r\n .${bubbleChartClassNames.bubbleChartGridLineY} {\r\n stroke: rgba(149, 149, 149, 0.24);\r\n }\r\n\r\n .${bubbleChartClassNames.bubbleChartYScaleLabel} {\r\n font-size: 10px;\r\n }\r\n`;\r\n\r\nexport const TooltipStyles = createGlobalStyle`\r\n .${bubbleChartClassNames.bubbleChartTooltipContainer} {\r\n position: absolute;\r\n transition: opacity 150ms cubic-bezier(0.2, 1, 0.6, 1);\r\n pointer-events: none;\r\n z-index: 1;\r\n }\r\n`;\r\n","import styled from 'styled-components';\r\n\r\nexport const Tooltip = styled.div`\r\n width: 0;\r\n height: 0;\r\n display: flex;\r\n align-items: flex-end;\r\n justify-content: center;\r\n font-size: 12px;\r\n white-space: nowrap;\r\n`;\r\n","import * as d3 from 'd3';\r\n\r\nimport { BubbleChartProps } from './types';\r\n\r\nimport { appendSvg } from '../../helpers';\r\nimport { computeDimensions } from '../../helpers/computeDimensions';\r\n\r\nimport { bubbleChartDefaultProps } from './bubbleChartDefaultProps';\r\nimport { drawGrid } from './drawGrid';\r\nimport { drawTooltip } from './drawTooltip';\r\n\r\nimport { bubbleChartClassNames as classNames } from './styled';\r\n\r\nexport const draw = (\r\n node: HTMLElement | null,\r\n props: BubbleChartProps\r\n): void => {\r\n const {\r\n data,\r\n margin,\r\n xAxisPadding,\r\n yAxisPadding,\r\n customYScale,\r\n customYAxis,\r\n customXScale,\r\n customXAxis,\r\n minSize,\r\n maxSize,\r\n minYValue,\r\n maxYValue,\r\n drawGridY,\r\n drawGridX,\r\n scaleLog,\r\n xScaleItemWidth,\r\n bubbleStyle,\r\n customize,\r\n yScaleLabel,\r\n yScaleLabelPadding,\r\n enableTooltip,\r\n tooltipRoot,\r\n tooltipClassName,\r\n renderTooltip,\r\n } = props;\r\n\r\n if (node !== null && data.length) {\r\n const marginTop = margin ? margin.top : 0;\r\n const marginRight = margin ? margin.right : 0;\r\n const marginBottom = margin ? margin.bottom : 0;\r\n const marginLeft = margin ? margin.left : 0;\r\n const { width: nodeWidth } = node.getBoundingClientRect();\r\n const width = props.width || nodeWidth;\r\n const height = props.height || 0;\r\n const yTicksCountDefault = 6;\r\n\r\n const minY =\r\n typeof minYValue === 'number'\r\n ? minYValue\r\n : (d3.min(data, ({ yValue }) => yValue) as number);\r\n const maxY =\r\n typeof maxYValue === 'number'\r\n ? maxYValue\r\n : (d3.max(data, ({ yValue }) => yValue) as number);\r\n\r\n const svg = appendSvg(node, width, height || 0);\r\n\r\n const sizeScale = scaleLog\r\n ? d3\r\n .scaleLog()\r\n .domain([\r\n d3.min(data, ({ sizeValue }) => sizeValue) as number || 0.1,\r\n d3.max(data, ({ sizeValue }) => sizeValue) as number || 0.1,\r\n ])\r\n .range([\r\n minSize || bubbleChartDefaultProps.minSize || 0.1,\r\n maxSize || bubbleChartDefaultProps.maxSize || 0.1,\r\n ])\r\n : d3\r\n .scaleLinear()\r\n .domain([\r\n d3.min(data, ({ sizeValue }) => sizeValue) as number,\r\n d3.max(data, ({ sizeValue }) => sizeValue) as number,\r\n ])\r\n .range([\r\n minSize || bubbleChartDefaultProps.minSize,\r\n maxSize || bubbleChartDefaultProps.maxSize,\r\n ]);\r\n\r\n const yRange1 = height - marginTop - marginBottom - (xAxisPadding || 0);\r\n\r\n const yScale = scaleLog\r\n ? d3\r\n .scaleLog()\r\n .domain([minY || 0.1, maxY || 0.1])\r\n .range([yRange1 || 0.1, marginTop || 0.1])\r\n .nice()\r\n : d3\r\n .scaleLinear()\r\n .domain([minY, maxY])\r\n .range([yRange1, marginTop])\r\n .nice();\r\n\r\n customYScale && customYScale(yScale);\r\n\r\n const yTicks = yScale.ticks();\r\n const yAxisLeft = d3.axisLeft(yScale).ticks(yTicksCountDefault);\r\n\r\n const yTicksCount = yAxisLeft.tickArguments()[0];\r\n\r\n const yAxis = svg\r\n .append('g')\r\n .attr('class', classNames.bubbleChartYAxis)\r\n .call(yAxisLeft);\r\n\r\n let yScaleLabelHeight = yScaleLabelPadding || 0;\r\n\r\n if (yScaleLabel) {\r\n const label = svg\r\n .append('text')\r\n .text(yScaleLabel)\r\n .attr('class', classNames.bubbleChartYScaleLabel);\r\n\r\n const { width, height } = computeDimensions(label);\r\n\r\n yScaleLabelHeight = yScaleLabelHeight + height;\r\n\r\n label.attr(\r\n 'transform',\r\n `rotate(-90) translate(-${(yRange1 + marginBottom + width) /\r\n 2}, ${height})`\r\n );\r\n }\r\n\r\n yAxis.selectAll('.tick').attr('class', value => {\r\n return value === 0\r\n ? `tick ${classNames.bubbleChartYAxisZeroTick}`\r\n : 'tick';\r\n });\r\n\r\n customYAxis && customYAxis(yAxis);\r\n\r\n const { width: yAxisWidth } = computeDimensions(yAxis);\r\n\r\n const xScale = scaleLog\r\n ? d3\r\n .scaleLog()\r\n .domain([\r\n d3.min(data, ({ xValue }) => xValue) as number || 0.1,\r\n d3.max(data, ({ xValue }) => xValue) as number || 0.1,\r\n ])\r\n .range([\r\n (marginLeft + yAxisWidth + (yAxisPadding || 0) + yScaleLabelHeight) || 0.1,\r\n (width - marginRight) || 0.1,\r\n ])\r\n : d3\r\n .scaleLinear()\r\n .domain([\r\n d3.min(data, ({ xValue }) => xValue) as number,\r\n d3.max(data, ({ xValue }) => xValue) as number,\r\n ])\r\n .range([\r\n marginLeft + yAxisWidth + (yAxisPadding || 0) + yScaleLabelHeight,\r\n width - marginRight,\r\n ]);\r\n\r\n customXScale && customXScale(xScale);\r\n\r\n const xAxisBottom = d3.axisBottom(xScale);\r\n\r\n if (typeof xScaleItemWidth === 'number') {\r\n const [x1, x2] = xScale.range();\r\n const chartWidth = x2 - x1;\r\n\r\n xAxisBottom\r\n .ticks(Math.round(chartWidth / xScaleItemWidth))\r\n .tickSizeOuter(0);\r\n }\r\n\r\n const xAxis = svg\r\n .append('g')\r\n .call(xAxisBottom)\r\n .attr('class', classNames.bubbleChartXAxis);\r\n\r\n customXAxis && customXAxis(xAxis);\r\n\r\n yAxis.attr(\r\n 'transform',\r\n `translate(${marginLeft + yAxisWidth + yScaleLabelHeight}, 0)`\r\n );\r\n\r\n drawGrid({\r\n svg,\r\n yScale,\r\n xScale,\r\n yTicksCount,\r\n drawGridY,\r\n drawGridX,\r\n });\r\n\r\n xAxis.attr(\r\n 'transform',\r\n `translate(0, ${yScale(yTicks[0]) + (xAxisPadding || 0)})`\r\n );\r\n\r\n const bubbles = svg\r\n .append('g')\r\n .selectAll('dot')\r\n .data(data)\r\n .enter()\r\n .append('circle')\r\n .attr('class', classNames.bubbleChartCircle)\r\n .attr('cx', ({ xValue }) => xScale(xValue))\r\n .attr('cy', ({ yValue }) => yScale(yValue))\r\n .attr('r', ({ sizeValue }) => sizeScale(sizeValue) / 2)\r\n .attr('fill', ({ color }) => color || 'rgba(0, 176, 113, 0.6)')\r\n .attr('stroke', ({ stroke }) => stroke || 'transparent')\r\n .attr('style', ({ style }) => style || bubbleStyle || '');\r\n\r\n if (enableTooltip) {\r\n drawTooltip({ bubbles, tooltipRoot, tooltipClassName, renderTooltip });\r\n }\r\n\r\n customize && customize({ svg, bubbles, yScale, xScale, sizeScale });\r\n }\r\n};\r\n","import { DrawGridProps } from './types';\r\n\r\nimport { bubbleChartClassNames } from '../styled';\r\n\r\nexport const drawGrid = ({\r\n svg,\r\n yScale,\r\n xScale,\r\n yTicksCount,\r\n drawGridX,\r\n drawGridY,\r\n}: DrawGridProps) => {\r\n if (!drawGridY && !drawGridX) return;\r\n const [min, max] = xScale.domain();\r\n\r\n const global = svg\r\n .append('g')\r\n .attr('class', bubbleChartClassNames.bubbleChartGridGlobal);\r\n\r\n const yTicks = yScale.ticks(yTicksCount);\r\n\r\n if (drawGridX) {\r\n global\r\n .append('g')\r\n .selectAll('line')\r\n .data(yTicks)\r\n .join('line')\r\n .attr('class', bubbleChartClassNames.bubbleChartGridLineX)\r\n .attr('x1', () => xScale(min))\r\n .attr('x2', () => xScale(max))\r\n .attr('y1', (d: number) => Math.round(yScale(d)))\r\n .attr('y2', (d: number) => Math.round(yScale(d)));\r\n }\r\n\r\n if (drawGridY) {\r\n global\r\n .append('g')\r\n .selectAll('line')\r\n .data(xScale.ticks(yTicksCount))\r\n .join('line')\r\n .attr('class', bubbleChartClassNames.bubbleChartGridLineY)\r\n .attr('x1', (d: number) => Math.round(xScale(d)))\r\n .attr('x2', (d: number) => Math.round(xScale(d)))\r\n .attr('y1', () => Math.round(yScale(yTicks[0])))\r\n .attr('y2', () => Math.round(yScale(yTicks[yTicks.length - 1])));\r\n }\r\n};\r\n","import React from 'react';\r\nimport ReactDOMServer from 'react-dom/server';\r\nimport * as d3 from 'd3';\r\n\r\nimport { Tooltip } from './styled';\r\nimport { bubbleChartClassNames as classNames } from '../styled';\r\nimport { TooltipContainer } from '../../../common/components/tooltips';\r\nimport { DrawTooltipProps } from './types';\r\n\r\nexport const drawTooltip = ({\r\n bubbles,\r\n tooltipRoot,\r\n tooltipClassName,\r\n renderTooltip,\r\n}: DrawTooltipProps) => {\r\n const root: Element | null = tooltipRoot || document.querySelector('body');\r\n const format = d3.format(',');\r\n\r\n let container: d3.Selection<any, unknown, any, any> = d3\r\n .select(root)\r\n .select(`.${classNames.bubbleChartTooltip}`);\r\n\r\n if (container.node() === null) {\r\n container = d3\r\n .select(root)\r\n .append('div')\r\n .attr('class', classNames.bubbleChartTooltip);\r\n }\r\n\r\n let tooltip: d3.Selection<\r\n HTMLDivElement,\r\n unknown,\r\n d3.BaseType,\r\n any\r\n > = container\r\n .append('div')\r\n .attr(\r\n 'class',\r\n `${classNames.bubbleChartTooltipContainer} ${tooltipClassName || ''}`\r\n )\r\n .style('opacity', '0');\r\n\r\n bubbles.on('mouseover.tooltip', (event, data) => {\r\n const { sizeValue } = data;\r\n const circle = event.currentTarget as SVGCircleElement;\r\n const { x, y, width } = circle.getBoundingClientRect();\r\n const left = window.pageXOffset + x + width / 2;\r\n const top = window.pageYOffset + y;\r\n\r\n tooltip\r\n .style('left', `${left}px`)\r\n .style('top', `${top}px`)\r\n .html(() => {\r\n const html = ReactDOMServer.renderToString(\r\n <Tooltip className={classNames.bubbleChartTooltipFlex}>\r\n <TooltipContainer className={classNames.bubbleChartTip}>\r\n {format(sizeValue)}\r\n </TooltipContainer>\r\n </Tooltip>\r\n );\r\n\r\n return html;\r\n });\r\n\r\n renderTooltip && renderTooltip({ tooltip, data, circle });\r\n\r\n tooltip.style('opacity', '1');\r\n });\r\n\r\n bubbles.on('mouseout.tooltip', () => {\r\n tooltip.style('opacity', '0');\r\n });\r\n};\r\n","import React, { useEffect } from 'react';\r\n\r\nimport { BubbleChartProps } from './types';\r\n\r\nimport { useNode } from '../../hooks';\r\nimport { useResize } from '../../hooks';\r\n\r\nimport { draw } from './draw';\r\nimport { unmount } from './unmount';\r\nimport { bubbleChartDefaultProps } from './bubbleChartDefaultProps';\r\n\r\nimport { SvgWrapper, TooltipStyles } from './styled';\r\n\r\nexport const BubbleChart: React.FC<BubbleChartProps> = (\r\n props\r\n): React.ReactElement => {\r\n const { className, style, children, tooltipRoot } = props;\r\n const [ref, node] = useNode();\r\n\r\n useEffect(() => {\r\n node && draw(node, props);\r\n }, [node, props]);\r\n\r\n useEffect(() => {\r\n return () => unmount(tooltipRoot);\r\n }, [tooltipRoot]);\r\n\r\n const onDraw = () => draw(node, props);\r\n\r\n useResize(props.width, onDraw);\r\n\r\n return (\r\n <div className={className} style={style}>\r\n <TooltipStyles />\r\n <SvgWrapper ref={ref}>{children}</SvgWrapper>\r\n </div>\r\n );\r\n};\r\n\r\nBubbleChart.defaultProps = bubbleChartDefaultProps;\r\n","import * as d3 from 'd3';\r\n\r\nimport { bubbleChartClassNames as classNames } from './styled';\r\n\r\nexport const unmount = (tooltipRoot?: Element) => {\r\n const root: Element | null = tooltipRoot || document.querySelector('body');\r\n\r\n d3.select(root)\r\n .select(`.${classNames.bubbleChartTooltip}`)\r\n .remove();\r\n};\r\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","_ref","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","_ref2","paddingY","radius","paddingX","defaultLevels","ticks","domain","levels","lastTick","newLastTick","push","newMaxValue","angleSlice","PI","radiusScale","radarLine","_ref3","angle","_","radarValue","_ref4","svg","globalCenter","levelsGrid","reverse","axisGridY","getAxisValue","gridGlobal","selectAll","enter","radarGlobal","axis","_ref5","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","lineChartYScaleRight","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","dotSnapping","rightAxis","stacks","valuesIndex","prevValue","abs","stackedData","yRange","yScale","nice","yTicksCountDefault","yAxisLeft","yTicksCount","tickArguments","yAxis","yAxisWidth","yAxisRightWidth","rightAxisMin","rightAxisMax","yRightScale","yAxisRightTicks","yAxisRight","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","_ref6","_ref7","areaStyle","_ref8","stroke","_ref9","dots","_ref10","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","step","beginning","end","getTotalLength","getPointAtLength","lineChartData","dynamicDotStyle","datas","invertValue","noHasData","every","topIndex","keys","_datas$Number","_datas$Number2","labelTexts","_positions$i","_positions$index","indexX","indexY","LineChart","barChartLinesClassNames","barChartLinesGlobal","barChartLine","barChartAreasGlobal","barChartArea","barChartClassNames","barChartBarGlobal","barChartYScaleGlobal","barChartYAxis","barChartXAxis","barChartYAxisZeroTick","barChartGridGlobal","barChartGridLineX","barChartGridLineXZero","barChartGridLineYZero","barChartGridLineY","barChartSelection","barChartMouseRect","barChartMouseContainer","barChartTooltipFlex","barChartMouseTooltip","barChartTooltip","barChartTooltipItem","barChartTooltipColFlex","barChartTooltipGroupName","barChartColorBox","barChartColorLine","barChartTooltipName","barChartTooltipValue","barChartLabelContainer","barChartLabelFlex","barChartLabel","selectable","lineData","markers","barWidth","barWidthProp","barPadding","colors","customXScale","customYAxisLeft","customXAxisBottom","customBars","hideTooltipGroupName","labelPosition","tooltipY","stackedLine","formatTooltipValue","formatTooltipName","sectionPadding","minValuesLine","tooltipYDomain","marshalledMap","minDomainValue","maxDomainValue","drawBars","setTooltipPosition","onLabelItem","isBarTooltip","onBarClick","onBarHover","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","padding","maskId","uniqueId","bars","getBars","marker","horizontal","lineColor","align","linesSelection","areasSelection","linesData","lineType","areasData","drawLines","xScaleBandDomain","topYDomain","lineMin","tooltip","barChartTootipFlex","flagCurrIndex","offsetX","offsetY","findIndex","containts","elementsFromPoint","clientX","clientY","currBars","currLineData","concat","svgWidth","isMouseWithin","e","rectrY","concatedData","stack","stacksCount","indexFlag","LabelFlexStyled","LabelStyle","LabelUI","getLabel","getLabelY","BarChart","drawing","clearSelection","removeChild","onStartDrawing","stopPropagation","which","setAttribute","_props$margin","pageX","firstChild","display","onDraw","newWidth","offsetLeft","onMouseLeave","offsetWidth","onStopDrawing","selectionMinX","selectionWidth","selectionMaxX","onSelect","childNodes","child","userSelect","useSelection","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","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","bubbleChartDefaultProps","minSize","maxSize","yScaleLabelPadding","bubbleChartClassNames","bubbleChartYAxis","bubbleChartYAxisZeroTick","bubbleChartXAxis","bubbleChartGridGlobal","bubbleChartGridLineX","bubbleChartGridLineY","bubbleChartCircle","bubbleChartYScaleLabel","bubbleChartTooltip","bubbleChartTooltipContainer","bubbleChartTooltipFlex","bubbleChartTip","minYValue","maxYValue","scaleLog","bubbleStyle","yScaleLabel","enableTooltip","minY","yValue","maxY","sizeScale","sizeValue","yRange1","yScaleLabelHeight","xValue","bubbles","_ref11","_ref12","_ref13","_ref14","_ref15","_ref16","root","circle","currentTarget","pageXOffset","pageYOffset","BubbleChart","unmount"],"mappings":"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"}
|