diff --git a/apps/web/styles/app.css b/apps/web/styles/app.css index 35c5d522..bf7af298 100644 --- a/apps/web/styles/app.css +++ b/apps/web/styles/app.css @@ -79,15 +79,3 @@ body, display: none; } } - -@keyframes gradient { - 0% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } - 100% { - background-position: 0% 50%; - } -} diff --git a/apps/website/package.json b/apps/website/package.json index 773ebbc4..c2010e8a 100644 --- a/apps/website/package.json +++ b/apps/website/package.json @@ -14,6 +14,7 @@ "dependencies": { "@radix-ui/react-dialog": "^1.0.3", "@radix-ui/react-navigation-menu": "^1.1.2", + "@react-spring/web": "^9.7.2", "@scure/base": "^1.1.1", "@status-im/colors": "*", "@status-im/components": "*", @@ -21,6 +22,9 @@ "@status-im/js": "*", "@tamagui/next-theme": "1.11.1", "class-variance-authority": "^0.6.0", + "@visx/visx": "^2.18.0", + "d3-array": "^3.2.3", + "d3-time-format": "^4.1.0", "next": "13.2.4", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -30,6 +34,8 @@ "devDependencies": { "@achingbrain/ssdp": "^4.0.1", "@tamagui/next-plugin": "1.11.1", + "@types/d3-array": "^3.0.4", + "@types/d3-time-format": "^4.0.0", "@types/node": "^18.11.11", "@types/react": "^18.0.33", "@types/react-dom": "^18.0.11", diff --git a/apps/website/public/assets/chart/empty.png b/apps/website/public/assets/chart/empty.png new file mode 100644 index 00000000..e2a0b413 Binary files /dev/null and b/apps/website/public/assets/chart/empty.png differ diff --git a/apps/website/src/components/chart/chart.tsx b/apps/website/src/components/chart/chart.tsx new file mode 100644 index 00000000..f55da37b --- /dev/null +++ b/apps/website/src/components/chart/chart.tsx @@ -0,0 +1,47 @@ +import { Stack } from '@tamagui/core' +import { ParentSize } from '@visx/responsive' + +import { ChartComponent, Empty, Loading } from './components' + +type DayType = { + date: string + open_issues: number + closed_issues: number +} + +interface Props { + data: DayType[] + height?: number + isLoading?: boolean +} + +const Chart = (props: Props) => { + const { data, isLoading, ...rest } = props + + if (isLoading) { + return ( + + + + ) + } + + if (!data.length) { + return ( + + + + ) + } + + return ( + + {({ width }) => { + return + }} + + ) +} + +export { Chart } +export type { Props as ChartProps, DayType } diff --git a/apps/website/src/components/chart/components/areas.tsx b/apps/website/src/components/chart/components/areas.tsx new file mode 100644 index 00000000..13aa88ea --- /dev/null +++ b/apps/website/src/components/chart/components/areas.tsx @@ -0,0 +1,98 @@ +import { animated } from '@react-spring/web' +import { curveMonotoneX } from '@visx/curve' +import { LinearGradient } from '@visx/gradient' +import { AreaClosed } from '@visx/shape' + +import { colors } from './chart-component' + +import type { SpringValue } from '@react-spring/web' +import type { ScaleLinear, ScaleTime } from 'd3-scale' + +type Datum = { + date: Date + value: number +} + +type Props = { + yScale: ScaleLinear + xScale: ScaleTime + totalIssuesData: Datum[] + closedIssuesData: Datum[] + clipPathAnimation: { + clipPath: SpringValue + } +} + +const AnimatedAreaClosed = animated(AreaClosed) + +const Areas = (props: Props) => { + const { + clipPathAnimation, + closedIssuesData, + totalIssuesData, + xScale, + yScale, + } = props + return ( + <> + + + + + + {/* Total issues area */} + { + const datum = d as Datum + return xScale(datum.date) + }} + y={d => { + const datum = d as Datum + return yScale(datum.value) + }} + yScale={yScale} + fill="url(#gradient)" + curve={curveMonotoneX} + style={{ ...clipPathAnimation, zIndex: 10 }} + /> + + {/* Closed issues area */} + { + const datum = d as Datum + return xScale(datum.date) + }} + y={d => { + const datum = d as Datum + return yScale(datum.value) + }} + yScale={yScale} + fill="url(#gradient-open)" + curve={curveMonotoneX} + style={{ ...clipPathAnimation, zIndex: 10 }} + /> + + ) +} + +export { Areas } diff --git a/apps/website/src/components/chart/components/assets/index.tsx b/apps/website/src/components/chart/components/assets/index.tsx new file mode 100644 index 00000000..ba63637f --- /dev/null +++ b/apps/website/src/components/chart/components/assets/index.tsx @@ -0,0 +1,2 @@ +export { LineA } from './line-a' +export { LineB } from './line-b' diff --git a/apps/website/src/components/chart/components/assets/line-a.tsx b/apps/website/src/components/chart/components/assets/line-a.tsx new file mode 100644 index 00000000..926e4cc1 --- /dev/null +++ b/apps/website/src/components/chart/components/assets/line-a.tsx @@ -0,0 +1,15 @@ +const LineA = () => { + return ( + + + + ) +} + +export { LineA } diff --git a/apps/website/src/components/chart/components/assets/line-b.tsx b/apps/website/src/components/chart/components/assets/line-b.tsx new file mode 100644 index 00000000..7318de3b --- /dev/null +++ b/apps/website/src/components/chart/components/assets/line-b.tsx @@ -0,0 +1,15 @@ +const LineB = () => { + return ( + + + + ) +} + +export { LineB } diff --git a/apps/website/src/components/chart/components/chart-component.tsx b/apps/website/src/components/chart/components/chart-component.tsx new file mode 100644 index 00000000..49cc2fbb --- /dev/null +++ b/apps/website/src/components/chart/components/chart-component.tsx @@ -0,0 +1,234 @@ +import { useMemo } from 'react' + +import { animated } from '@react-spring/web' +import { Axis } from '@visx/axis' +import { GridColumns } from '@visx/grid' +import { Group } from '@visx/group' +import { scaleLinear, scaleTime } from '@visx/scale' +import { extent, max } from 'd3-array' + +import { getClosedIssues, getTotalIssues } from '../helpers/get-data' +import { useAnimations, useChartTooltip } from '../hooks/' +import { format } from '../utils/format-time' +import { Areas } from './areas' +import { ChartTooltip } from './chart-tooltip' +import { Lines } from './lines' +import { Markers } from './markers' + +import type { DayType } from '../chart' + +// defining colors +export const colors = { + total: '#E95460', + closed: '#23ADA0', + background: '#F0F2F5', + marker: '#09101C', + totalGradient: 'rgba(233, 84, 96, 0.3)', + closedGradient: 'rgba(35, 173, 160, 0.3)', + white: '#FFF', +} as const + +interface Props { + data: DayType[] + height?: number + width?: number +} + +const AnimatedGridColumns = animated(GridColumns) + +const ChartComponent = (props: Props): JSX.Element => { + const { data, width: defaultWidth, height: defaultHeight } = props + + // Extract dates, open issues, and closed issues from data + const dates = data.map(d => new Date(d.date)) + + // Define dimensions + const height = defaultHeight || 300 + const width = defaultWidth || 300 + const margin = { top: 20, right: 0, bottom: 30, left: 26 } + const innerWidth = (width || 0) - margin.left - margin.right + const innerHeight = height - margin.top - margin.bottom + + const filteredDates = dates.filter(Boolean) // filters out undefined values + // Calculate total issues by summing open and closed issues + const totalIssues = data.map(d => d.open_issues + d.closed_issues) + + const xDomain = extent(filteredDates) as [Date, Date] + const xScale = scaleTime({ + domain: xDomain, + range: [0, innerWidth], + }) + + const numTicksBottom = Math.min(data.length, 12) + + const yScale = scaleLinear({ + domain: [0, max(totalIssues) || 0], + range: [innerHeight, 0], + nice: true, + }) + + const { tooltipData, updateTooltip, hideTooltip, tooltipOpen } = + useChartTooltip({ + data, + margin, + dates, + innerWidth, + }) + + const { + circleSpringClosed, + circleSpringTotal, + clipPathAnimation, + drawingGridColumns, + drawingLineStyle, + opacityAnimation, + tooltipAnimation, + } = useAnimations({ + data, + margin, + innerHeight, + tooltipData, + yScale, + xScale, + }) + + // Convert data to array of objects with `date` and `value` properties + const totalIssuesData = useMemo( + () => + data.map(d => ({ + date: new Date(d.date), + value: getTotalIssues(d), + })), + [data] + ) + + const closedIssuesData = useMemo( + () => + data.map(d => ({ + date: new Date(d.date), + value: getClosedIssues(d), + })), + [data] + ) + + return ( +
+ + + {/* x-axis */} + { + const textAnchor = + index === 0 + ? 'start' + : index === data.length - 1 + ? 'end' + : 'middle' + return { + dy: '.33em', + fill: '#A1ABBD', + fontFamily: 'Inter, sans-serif', + fontSize: 11, + textAnchor, + } + }} + tickFormat={value => { + if (typeof value === 'number') { + return value.toString() // Handle number values + } else if (value instanceof Date) { + // Specify the desired date format + return format(value) // Handle date values + } else { + return '' + } + }} + /> + {/* y-axis */} + ( + + {formattedValue} + + )} + /> + + + + + + + + {tooltipOpen && ( + + )} + hideTooltip()} + /> + + + {/* render a tooltip */} + {tooltipOpen && ( + + )} +
+ ) +} + +export { ChartComponent } diff --git a/apps/website/src/components/chart/components/chart-tooltip.tsx b/apps/website/src/components/chart/components/chart-tooltip.tsx new file mode 100644 index 00000000..1b17e042 --- /dev/null +++ b/apps/website/src/components/chart/components/chart-tooltip.tsx @@ -0,0 +1,115 @@ +import { animated } from '@react-spring/web' +import { Text } from '@status-im/components' +import { DoneIcon, OpenIcon } from '@status-im/icons' +import { Stack } from '@tamagui/core' +import { defaultStyles, TooltipWithBounds } from '@visx/tooltip' + +import type { TooltipData } from '../hooks/use-chart-tooltip' +import type { SpringValue } from '@react-spring/web' + +const AnimatedTooltip = animated(TooltipWithBounds) + +type Props = { + tooltipData: TooltipData + opacityAnimation: { + opacity: SpringValue + } + tooltipAnimation: { + x: SpringValue + y: SpringValue + } +} + +// defining tooltip styles +const tooltipStyles: React.CSSProperties = { + ...defaultStyles, + minWidth: 272, + padding: 12, + backgroundColor: '#FFF', + border: '1px solid #F0F2F5', + boxShadow: '0px 2px 20px rgba(9, 16, 28, 0.04)', + borderRadius: 20, + marginLeft: 25, +} + +const ChartTooltip = (props: Props) => { + const { tooltipData, opacityAnimation, tooltipAnimation } = props + return ( + + + + {tooltipData.totalIssues} + + + + issues + + + + + + {tooltipData.formattedDate} + + + + + + + + + + + {tooltipData.openIssues} open + + + + + {`${tooltipData.openIssuesPercentage}%`} + + + + + + + + {tooltipData.closedIssues} closes + + + + + {`${tooltipData.completedIssuesPercentage}%`} + + + + + ) +} + +export { ChartTooltip } diff --git a/apps/website/src/components/chart/components/empty.tsx b/apps/website/src/components/chart/components/empty.tsx new file mode 100644 index 00000000..c2a965f4 --- /dev/null +++ b/apps/website/src/components/chart/components/empty.tsx @@ -0,0 +1,48 @@ +import { Image, Text } from '@status-im/components' + +import { LineA, LineB } from './assets' + +const Empty = () => { + return ( +
+
+
+ +
+ + No results found + +
+ + Try adjusting your search or filter to find what you’re looking for. + +
+
+ +
+
+ +
+
+
+ {Array.from({ length: 12 }).map((_, i) => ( +
+ ))} +
+
+
+ ) +} + +export { Empty } diff --git a/apps/website/src/components/chart/components/index.tsx b/apps/website/src/components/chart/components/index.tsx new file mode 100644 index 00000000..5ebd09e1 --- /dev/null +++ b/apps/website/src/components/chart/components/index.tsx @@ -0,0 +1,3 @@ +export { ChartComponent } from './chart-component' +export { Empty } from './empty' +export { Loading } from './loading' diff --git a/apps/website/src/components/chart/components/lines.tsx b/apps/website/src/components/chart/components/lines.tsx new file mode 100644 index 00000000..0ef17d04 --- /dev/null +++ b/apps/website/src/components/chart/components/lines.tsx @@ -0,0 +1,73 @@ +import { animated } from '@react-spring/web' +import { curveMonotoneX } from '@visx/curve' +import { LinePath } from '@visx/shape' + +import { colors } from './chart-component' + +import type { SpringValue } from '@react-spring/web' +import type { ScaleLinear, ScaleTime } from 'd3-scale' + +type Datum = { + date: Date + value: number +} + +type Props = { + yScale: ScaleLinear + xScale: ScaleTime + totalIssuesData: Datum[] + closedIssuesData: Datum[] + drawingLineStyle: { + strokeDasharray: SpringValue + } +} + +const AnimatedLinePath = animated(LinePath) + +const Lines = (props: Props) => { + const { + closedIssuesData, + drawingLineStyle, + xScale, + yScale, + totalIssuesData, + } = props + return ( + <> + {/* Total issues line */} + { + const datum = d as Datum + return xScale(datum.date) + }} + y={d => { + const datum = d as Datum + return yScale(datum.value) + }} + stroke={colors.total} + strokeWidth={2} + curve={curveMonotoneX} + style={drawingLineStyle} + /> + + {/* Closed issues line */} + { + const datum = d as Datum + return xScale(datum.date) + }} + y={d => { + const datum = d as Datum + return yScale(datum.value) + }} + stroke={colors.closed} + strokeWidth={2} + curve={curveMonotoneX} + style={drawingLineStyle} + /> + + ) +} +export { Lines } diff --git a/apps/website/src/components/chart/components/loading.tsx b/apps/website/src/components/chart/components/loading.tsx new file mode 100644 index 00000000..1c9f1492 --- /dev/null +++ b/apps/website/src/components/chart/components/loading.tsx @@ -0,0 +1,39 @@ +import { Skeleton } from '@status-im/components' + +const Loading = () => { + return ( +
+
+
+
+ {Array.from({ length: 5 }).map((_, i) => ( + + ))} +
+
+ {Array.from({ length: 12 }).map((_, i) => ( +
+ ))} +
+
+
+ {Array.from({ length: 12 }).map((_, i) => ( + + ))} +
+
+ ) +} + +export { Loading } diff --git a/apps/website/src/components/chart/components/markers.tsx b/apps/website/src/components/chart/components/markers.tsx new file mode 100644 index 00000000..66a2b3a2 --- /dev/null +++ b/apps/website/src/components/chart/components/markers.tsx @@ -0,0 +1,74 @@ +import { animated } from '@react-spring/web' +import { GlyphCircle } from '@visx/glyph' +import { Group } from '@visx/group' +import { Line } from '@visx/shape' + +import { colors } from './chart-component' + +import type { SpringValue } from '@react-spring/web' + +type Props = { + innerHeight: number + circleSpringTotal: { + x: SpringValue + y: SpringValue + } + opacityAnimation: { + opacity: SpringValue + } + circleSpringClosed: { + x: SpringValue + y: SpringValue + } +} + +const AnimatedCircle = animated(GlyphCircle) +const AnimatedLine = animated(Line) +const AnimatedGroup = animated(Group) + +const Markers = (props: Props) => { + const { + innerHeight, + circleSpringTotal, + opacityAnimation, + circleSpringClosed, + } = props + + return ( + <> + + + + + + + ) +} + +export { Markers } diff --git a/apps/website/src/components/chart/helpers/get-data.ts b/apps/website/src/components/chart/helpers/get-data.ts new file mode 100644 index 00000000..6e056f2c --- /dev/null +++ b/apps/website/src/components/chart/helpers/get-data.ts @@ -0,0 +1,15 @@ +import type { DayType } from '../chart' + +/** + * Gets the total issues of a day + * @param d - the day to get the total issues + * @returns the total issues of a day + **/ +export const getTotalIssues = (d: DayType) => d?.open_issues + d?.closed_issues + +/** + * Gets the closed issues of a day + * @param d - the day to get the closes issues + * @returns the total issues of a day + **/ +export const getClosedIssues = (d: DayType) => d?.closed_issues diff --git a/apps/website/src/components/chart/hooks/index.ts b/apps/website/src/components/chart/hooks/index.ts new file mode 100644 index 00000000..776ee0fe --- /dev/null +++ b/apps/website/src/components/chart/hooks/index.ts @@ -0,0 +1,2 @@ +export { useAnimations } from './use-animations' +export { useChartTooltip } from './use-chart-tooltip' diff --git a/apps/website/src/components/chart/hooks/use-animations.ts b/apps/website/src/components/chart/hooks/use-animations.ts new file mode 100644 index 00000000..28ce1354 --- /dev/null +++ b/apps/website/src/components/chart/hooks/use-animations.ts @@ -0,0 +1,99 @@ +import { config, useSpring } from '@react-spring/web' + +import type { DayType } from '../chart' +import type { TooltipData } from './use-chart-tooltip' +import type { ScaleLinear, ScaleTime } from 'd3-scale' + +type Props = { + data: DayType[] + yScale: ScaleLinear + xScale: ScaleTime + margin: { + top: number + right: number + bottom: number + left: number + } + innerHeight: number + tooltipData: TooltipData +} + +/** + * An custom hook that handles animations logic + * @param data - the data to be used in the chart + * @param margin - the margin of the chart + * @param dates - the dates of the chart + * @param innerHeight - the inner height of the chart + * @param xScale - the xScale of the chart + * @param yScale - the yScale of the chart + * @param tooltipData - the data to be used in the tooltip + + + * @returns circleSpringTotal - the spring animation for the total issues circle + * @returns circleSpringClosed - the spring animation for the closed issues circle + * @returns opacityAnimation - the spring animation for the some chart elements opacity + * @returns tooltipAnimation - the spring animation for the tooltip + * @returns drawingLineStyle - the spring animation for the drawing line style + * @returns drawingGridColumns - the spring animation for the drawing grid columns + * @returns clipPathAnimation - the spring animation for the clip path + **/ + +const useAnimations = (props: Props) => { + const { data, margin, innerHeight, tooltipData, xScale, yScale } = props + + // Define spring for circle position + const circleSpringTotal = useSpring({ + x: xScale(new Date(tooltipData?.date || '')), + y: yScale(tooltipData?.totalIssues), + config: config.gentle, + }) + + const circleSpringClosed = useSpring({ + x: xScale(new Date(tooltipData?.date)), + y: yScale(tooltipData?.closedIssues), + config: config.gentle, + }) + + const opacityAnimation = useSpring({ + opacity: data ? 1 : 0, + config: config.gentle, + delay: 200, + }) + + const tooltipAnimation = useSpring({ + x: xScale(new Date(tooltipData?.date)), + y: innerHeight + margin.top + margin.bottom, + config: config.gentle, + }) + + const [drawingLineStyle] = useSpring(() => ({ + from: { strokeDasharray: `${3000}, ${0}` }, + to: { strokeDasharray: `${0}, ${3000}` }, + reverse: true, + config: { duration: 2000 }, + })) + + const [drawingGridColumns] = useSpring(() => ({ + from: { strokeDasharray: `0, 150` }, + to: { strokeDasharray: '4,2' }, + config: { duration: 250 }, + })) + + const [clipPathAnimation] = useSpring(() => ({ + from: { clipPath: 'inset(0 100% 0 0)' }, + to: { clipPath: 'inset(0 0 0 0)' }, + config: { duration: 800 }, + })) + + return { + circleSpringTotal, + circleSpringClosed, + opacityAnimation, + tooltipAnimation, + drawingLineStyle, + drawingGridColumns, + clipPathAnimation, + } +} + +export { useAnimations } diff --git a/apps/website/src/components/chart/hooks/use-chart-tooltip.ts b/apps/website/src/components/chart/hooks/use-chart-tooltip.ts new file mode 100644 index 00000000..d7d5e09f --- /dev/null +++ b/apps/website/src/components/chart/hooks/use-chart-tooltip.ts @@ -0,0 +1,129 @@ +import { useCallback } from 'react' + +import { localPoint } from '@visx/event' +import { scaleTime } from '@visx/scale' +import { useTooltip } from '@visx/tooltip' +import { bisector, extent } from 'd3-array' + +import { getClosedIssues, getTotalIssues } from '../helpers/get-data' +import { formatDate } from '../utils/format-time' +import { getPercentage } from '../utils/get-percentage' + +import type { DayType } from '../chart' +import type { EventType } from '@visx/event/lib/types' + +type Props = { + data: DayType[] + dates: Date[] + innerWidth: number + margin: { + top: number + right: number + bottom: number + left: number + } +} + +type TooltipData = { + date: string + completedIssuesPercentage: number + openIssuesPercentage: number + totalIssues: number + openIssues: number + closedIssues: number + formattedDate: string +} + +/** + * An custom hook that handles the tooltip logic + * @param data - the data to be used in the chart + * @param margin - the margin of the chart + * @param dates - the dates of the chart + * @param innerWidth - the inner width of the chart + + * @returns tooltipData - the data to be used in the tooltip + * @returns updateTooltip - a function that updates the tooltip + * @returns hideTooltip - a function that hides the tooltip + * @returns tooltipOpen - a boolean that indicates if the tooltip is open + **/ + +const useChartTooltip = (props: Props) => { + const { data, margin, dates, innerWidth } = props + + // tooltip parameters + const { tooltipData, showTooltip, hideTooltip, tooltipOpen } = + useTooltip({ + tooltipData: { + date: '', + completedIssuesPercentage: 0, + openIssuesPercentage: 0, + totalIssues: 0, + openIssues: 0, + closedIssues: 0, + formattedDate: '', + }, + }) + + const filteredDates = dates.filter(Boolean) // filters out undefined values + + const getDate = useCallback((d: DayType) => new Date(d?.date), []) + const bisectDate = bisector((d: DayType) => new Date(d?.date)).left + + const xDomain = extent(filteredDates) as [Date, Date] + const xScale = scaleTime({ + domain: xDomain, + range: [0, innerWidth], + }) + + // Define tooltip handler + const updateTooltip = useCallback( + (event: EventType) => { + const { x } = localPoint(event) || { x: 0 } + const x0 = xScale.invert(x - margin.left) + + const index = bisectDate(data, x0, 1) + const d0 = data[index - 1] + const d1 = data[index] + let d = d0 + + if (d1 && getDate(d1)) { + d = + x0.valueOf() - getDate(d0).valueOf() > + getDate(d1).valueOf() - x0.valueOf() + ? d1 + : d0 + } + + const closedIssues = getClosedIssues(d) + const totalIssues = getTotalIssues(d) + const openIssues = totalIssues - closedIssues + + const completedIssuesPercentage = getPercentage(closedIssues, totalIssues) + + const openIssuesPercentage = getPercentage(openIssues, totalIssues) + + showTooltip({ + tooltipData: { + date: d?.date, + formattedDate: formatDate(getDate(d)), + completedIssuesPercentage, + openIssuesPercentage, + closedIssues, + totalIssues, + openIssues, + }, + }) + }, + [xScale, margin.left, bisectDate, data, getDate, showTooltip] + ) + + return { + tooltipData: tooltipData!, + hideTooltip, + updateTooltip, + tooltipOpen, + } +} + +export { useChartTooltip } +export type { TooltipData, Props as UseChartTooltipProps } diff --git a/apps/website/src/components/chart/utils/format-time.ts b/apps/website/src/components/chart/utils/format-time.ts new file mode 100644 index 00000000..918041cf --- /dev/null +++ b/apps/website/src/components/chart/utils/format-time.ts @@ -0,0 +1,13 @@ +import { timeFormat } from 'd3-time-format' + +/** + * Util functions that formats a date + * formatDate @returns a string with the format 'MMM dd yyyy' - Ex: Jan 01 2021 + **/ +export const formatDate = timeFormat('%b %d %Y') + +/** + * Util functions that formats a date + * format @returns a string with the format 'dd MMM' - Ex: 01 Jan + **/ +export const format = timeFormat('%d %b') diff --git a/apps/website/src/components/chart/utils/get-percentage.ts b/apps/website/src/components/chart/utils/get-percentage.ts new file mode 100644 index 00000000..c174e4c2 --- /dev/null +++ b/apps/website/src/components/chart/utils/get-percentage.ts @@ -0,0 +1,8 @@ +/** + * An util function that gets the percentage of a value from a total + * @param value - the value to calculate the percentage + * @param total - the total value + **/ + +export const getPercentage = (value: number, total: number): number => + Math.round((value / total) * 100) diff --git a/apps/website/src/components/epic-overview.tsx b/apps/website/src/components/epic-overview.tsx index 59955691..fdf686e5 100644 --- a/apps/website/src/components/epic-overview.tsx +++ b/apps/website/src/components/epic-overview.tsx @@ -1,6 +1,98 @@ +import { useEffect, useState } from 'react' + import { Tag, Text } from '@status-im/components' import { OpenIcon } from '@status-im/icons' +import { Chart } from './chart/chart' + +const DATA = [ + { + date: '2022-01-25', + open_issues: 100, + closed_issues: 2, + }, + { + date: '2022-01-26', + open_issues: 100, + closed_issues: 10, + }, + { + date: '2022-01-27', + open_issues: 100, + closed_issues: 20, + }, + { + date: '2022-01-28', + open_issues: 90, + closed_issues: 30, + }, + { + date: '2022-01-29', + open_issues: 80, + closed_issues: 40, + }, + { + date: '2022-01-30', + open_issues: 40, + closed_issues: 80, + }, + { + date: '2022-01-31', + open_issues: 30, + closed_issues: 90, + }, + { + date: '2022-02-01', + open_issues: 25, + closed_issues: 95, + }, + { + date: '2022-02-02', + open_issues: 20, + closed_issues: 98, + }, + { + date: '2022-02-03', + open_issues: 10, + closed_issues: 130, + }, + { + date: '2022-02-04', + open_issues: 10, + closed_issues: 140, + }, + { + date: '2022-02-05', + open_issues: 10, + closed_issues: 150, + }, + { + date: '2022-02-06', + open_issues: 10, + closed_issues: 160, + }, + { + date: '2022-02-07', + open_issues: 10, + closed_issues: 180, + }, + { + date: '2022-02-08', + open_issues: 10, + closed_issues: 190, + }, + { + date: '2022-02-09', + open_issues: 10, + closed_issues: 200, + }, + { + date: '2022-02-10', + open_issues: 0, + closed_issues: 220, + }, +] + type Props = { title: string description: string @@ -10,8 +102,20 @@ type Props = { export const EpicOverview = (props: Props) => { const { title, description, fullscreen } = props + // Simulating loading state + const [isLoading, setIsLoading] = useState(true) + useEffect(() => { + const timeout = setTimeout(() => { + setIsLoading(false) + }, 2000) + + return () => { + clearTimeout(timeout) + } + }, []) + return ( -
+
{title} @@ -25,7 +129,7 @@ export const EpicOverview = (props: Props) => {
- +
@@ -41,750 +145,3 @@ export const EpicOverview = (props: Props) => {
) } - -// USE https://airbnb.io/visx/areas -const ChartPreview = () => ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -) diff --git a/apps/website/src/styles/app.css b/apps/website/src/styles/app.css new file mode 100644 index 00000000..81db796a --- /dev/null +++ b/apps/website/src/styles/app.css @@ -0,0 +1,36 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +html, +body, +#__next { + height: 100%; + overscroll-behavior: none; + user-select: none; + color: #000; +} + +*::selection { + color: #fff; + background: hsla(229, 71%, 57%, 1); +} + +#app { + position: relative; + isolation: isolate; + height: 100%; +} + +/* Animation for skeleton placeholder */ +@keyframes gradient { + 0% { + background-position: 0% 50%; + } + 50% { + background-position: 100% 50%; + } + 100% { + background-position: 0% 50%; + } +} diff --git a/packages/components/.storybook/preview.tsx b/packages/components/.storybook/preview.tsx index 16361664..015ce459 100644 --- a/packages/components/.storybook/preview.tsx +++ b/packages/components/.storybook/preview.tsx @@ -4,7 +4,6 @@ import type { Preview } from '@storybook/react' import { Provider, ToastContainer } from '../src' import './reset.css' -import './components.css' // export const parameters: Parameters = { // actions: { argTypesRegex: '^on[A-Z].*' }, diff --git a/packages/components/.storybook/components.css b/packages/components/src/skeleton/skeleton.css similarity index 100% rename from packages/components/.storybook/components.css rename to packages/components/src/skeleton/skeleton.css diff --git a/packages/components/src/skeleton/skeleton.tsx b/packages/components/src/skeleton/skeleton.tsx index b96a4064..f7019f2d 100644 --- a/packages/components/src/skeleton/skeleton.tsx +++ b/packages/components/src/skeleton/skeleton.tsx @@ -1,3 +1,5 @@ +import './skeleton.css' + import { Stack, useTheme } from '@tamagui/core' import type { RadiusTokens } from '../tokens' diff --git a/yarn.lock b/yarn.lock index 58381695..26883867 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4437,6 +4437,52 @@ dependencies: nanoid "^3.1.23" +"@react-spring/animated@~9.7.2": + version "9.7.2" + resolved "https://registry.yarnpkg.com/@react-spring/animated/-/animated-9.7.2.tgz#0119db8075e91d693ec45c42575541e01b104a70" + integrity sha512-ipvleJ99ipqlnHkz5qhSsgf/ny5aW0ZG8Q+/2Oj9cI7LCc7COdnrSO6V/v8MAX3JOoQNzfz6dye2s5Pt5jGaIA== + dependencies: + "@react-spring/shared" "~9.7.2" + "@react-spring/types" "~9.7.2" + +"@react-spring/core@~9.7.2": + version "9.7.2" + resolved "https://registry.yarnpkg.com/@react-spring/core/-/core-9.7.2.tgz#804ebadee45a6adff00886454d6f1c5d97ee219d" + integrity sha512-fF512edZT/gKVCA90ZRxfw1DmELeVwiL4OC2J6bMUlNr707C0h4QRoec6DjzG27uLX2MvS1CEatf9KRjwZR9/w== + dependencies: + "@react-spring/animated" "~9.7.2" + "@react-spring/rafz" "~9.7.2" + "@react-spring/shared" "~9.7.2" + "@react-spring/types" "~9.7.2" + +"@react-spring/rafz@~9.7.2": + version "9.7.2" + resolved "https://registry.yarnpkg.com/@react-spring/rafz/-/rafz-9.7.2.tgz#77e7088c215e05cf893851cd87ceb40d89f2a7d7" + integrity sha512-kDWMYDQto3+flkrX3vy6DU/l9pxQ4TVW91DglQEc11iDc7shF4+WVDRJvOVLX+xoMP7zyag1dMvlIgvQ+dvA/A== + +"@react-spring/shared@~9.7.2": + version "9.7.2" + resolved "https://registry.yarnpkg.com/@react-spring/shared/-/shared-9.7.2.tgz#b8485617bdcc9f6348b245922051fb534e07c566" + integrity sha512-6U9qkno+9DxlH5nSltnPs+kU6tYKf0bPLURX2te13aGel8YqgcpFYp5Av8DcN2x3sukinAsmzHUS/FRsdZMMBA== + dependencies: + "@react-spring/rafz" "~9.7.2" + "@react-spring/types" "~9.7.2" + +"@react-spring/types@~9.7.2": + version "9.7.2" + resolved "https://registry.yarnpkg.com/@react-spring/types/-/types-9.7.2.tgz#e04dd72755d88b0e3163ba143ecd8ba78b68a5b0" + integrity sha512-GEflx2Ex/TKVMHq5g5MxQDNNPNhqg+4Db9m7+vGTm8ttZiyga7YQUF24shgRNebKIjahqCuei16SZga8h1pe4g== + +"@react-spring/web@^9.7.2": + version "9.7.2" + resolved "https://registry.yarnpkg.com/@react-spring/web/-/web-9.7.2.tgz#76e53dd24033764c3062f9927f88b0f3194688d4" + integrity sha512-7qNc7/5KShu2D05x7o2Ols2nUE7mCKfKLaY2Ix70xPMfTle1sZisoQMBFgV9w/fSLZlHZHV9P0uWJqEXQnbV4Q== + dependencies: + "@react-spring/animated" "~9.7.2" + "@react-spring/core" "~9.7.2" + "@react-spring/shared" "~9.7.2" + "@react-spring/types" "~9.7.2" + "@rollup/plugin-babel@^6.0.3": version "6.0.3" resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-6.0.3.tgz#07ccde15de278c581673034ad6accdb4a153dfeb" @@ -6699,6 +6745,86 @@ dependencies: "@types/node" "*" +"@types/d3-array@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-3.0.4.tgz#44eebe40be57476cad6a0cd6a85b0f57d54185a2" + integrity sha512-nwvEkG9vYOc0Ic7G7kwgviY4AQlTfYGIZ0fqB7CQHXGyYM6nO7kJh5EguSNA3jfh4rq7Sb7eMVq8isuvg2/miQ== + +"@types/d3-cloud@1.2.5": + version "1.2.5" + resolved "https://registry.yarnpkg.com/@types/d3-cloud/-/d3-cloud-1.2.5.tgz#0300bedc826aacd505ae6c41c5f8c4ab75c45135" + integrity sha512-vEIER9DsEBUOdpRiwCh3n1qE+cV6h4e1LhxhY2sLt+m8LPNAIkOOhTlqk0JDiBwD+ZPM8ynFAOU3AuPuVYBFBA== + dependencies: + "@types/d3" "^3" + +"@types/d3-color@^1": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-1.4.2.tgz#944f281d04a0f06e134ea96adbb68303515b2784" + integrity sha512-fYtiVLBYy7VQX+Kx7wU/uOIkGQn8aAEY8oWMoyja3N4dLd8Yf6XgSIR/4yWvMuveNOH5VShnqCgRqqh/UNanBA== + +"@types/d3-geo@^1.11.1": + version "1.12.4" + resolved "https://registry.yarnpkg.com/@types/d3-geo/-/d3-geo-1.12.4.tgz#7fbd90b6fdb25e34ce4f557c0de73360d662850f" + integrity sha512-lNDaAuOaML6w2d1XE0Txr5YOXLBQSF1q2IU6eXh/u1TTPQSm2Ah+TMIub1+CIMq8J/7DOzi5Cr8/yHqjNvqLKA== + dependencies: + "@types/geojson" "*" + +"@types/d3-hierarchy@^1.1.6": + version "1.1.8" + resolved "https://registry.yarnpkg.com/@types/d3-hierarchy/-/d3-hierarchy-1.1.8.tgz#50657f420d565a06c0b950a4b82eee0a369f2dea" + integrity sha512-AbStKxNyWiMDQPGDguG2Kuhlq1Sv539pZSxYbx4UZeYkutpPwXCcgyiRrlV4YH64nIOsKx7XVnOMy9O7rJsXkg== + +"@types/d3-interpolate@^1.3.1": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-1.4.2.tgz#88902a205f682773a517612299a44699285eed7b" + integrity sha512-ylycts6llFf8yAEs1tXzx2loxxzDZHseuhPokrqKprTQSTcD3JbJI1omZP1rphsELZO3Q+of3ff0ZS7+O6yVzg== + dependencies: + "@types/d3-color" "^1" + +"@types/d3-path@^1", "@types/d3-path@^1.0.8": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-1.0.9.tgz#73526b150d14cd96e701597cbf346cfd1fd4a58c" + integrity sha512-NaIeSIBiFgSC6IGUBjZWcscUJEq7vpVu7KthHN8eieTV9d9MqkSOZLH4chq1PmcKy06PNe3axLeKmRIyxJ+PZQ== + +"@types/d3-random@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@types/d3-random/-/d3-random-2.2.1.tgz#551edbb71cb317dea2cf9c76ebe059d311eefacb" + integrity sha512-5vvxn6//poNeOxt1ZwC7QU//dG9QqABjy1T7fP/xmFHY95GnaOw3yABf29hiu5SR1Oo34XcpyHFbzod+vemQjA== + +"@types/d3-scale@^3.3.0": + version "3.3.2" + resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-3.3.2.tgz#18c94e90f4f1c6b1ee14a70f14bfca2bd1c61d06" + integrity sha512-gGqr7x1ost9px3FvIfUMi5XA/F/yAf4UkUDtdQhpH92XCT0Oa7zkkRzY61gPVJq+DxpHn/btouw5ohWkbBsCzQ== + dependencies: + "@types/d3-time" "^2" + +"@types/d3-shape@^1.3.1": + version "1.3.8" + resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-1.3.8.tgz#c3c15ec7436b4ce24e38de517586850f1fea8e89" + integrity sha512-gqfnMz6Fd5H6GOLYixOZP/xlrMtJms9BaS+6oWxTKHNqPGZ93BkWWupQSCYm6YHqx6h9wjRupuJb90bun6ZaYg== + dependencies: + "@types/d3-path" "^1" + +"@types/d3-time-format@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/d3-time-format/-/d3-time-format-4.0.0.tgz#ee7b6e798f8deb2d9640675f8811d0253aaa1946" + integrity sha512-yjfBUe6DJBsDin2BMIulhSHmr5qNR5Pxs17+oW4DoVPyVIXZ+m6bs7j1UVKP08Emv6jRmYrYqxYzO63mQxy1rw== + +"@types/d3-time@^2", "@types/d3-time@^2.0.0": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-2.1.1.tgz#743fdc821c81f86537cbfece07093ac39b4bc342" + integrity sha512-9MVYlmIgmRR31C5b4FVSWtuMmBHh2mOWQYfl7XAYOa8dsnb7iEmUmRSWSFgXFtkjxO65d7hTUHQC+RhR/9IWFg== + +"@types/d3-voronoi@^1.1.9": + version "1.1.9" + resolved "https://registry.yarnpkg.com/@types/d3-voronoi/-/d3-voronoi-1.1.9.tgz#7bbc210818a3a5c5e0bafb051420df206617c9e5" + integrity sha512-DExNQkaHd1F3dFPvGA/Aw2NGyjMln6E9QzsiqOcBgnE+VInYnFBHBBySbZQts6z6xD+5jTfKCP7M4OqMyVjdwQ== + +"@types/d3@^3": + version "3.5.47" + resolved "https://registry.yarnpkg.com/@types/d3/-/d3-3.5.47.tgz#b81042fcb0195c583fc037bc857d161469a7d175" + integrity sha512-VkWIQoZXLFdcBGe5pdBKJmTU3fmpXvo/KV6ixvTzOMl1yJ2hbTXpfvsziag0kcaerPDwas2T0vxojwQG3YwivQ== + "@types/detect-port@^1.3.0": version "1.3.2" resolved "https://registry.yarnpkg.com/@types/detect-port/-/detect-port-1.3.2.tgz#8c06a975e472803b931ee73740aeebd0a2eb27ae" @@ -6768,6 +6894,11 @@ dependencies: "@types/node" "*" +"@types/geojson@*": + version "7946.0.10" + resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.10.tgz#6dfbf5ea17142f7f9a043809f1cd4c448cb68249" + integrity sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA== + "@types/glob@^7.1.3": version "7.2.0" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" @@ -6849,6 +6980,11 @@ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.191.tgz#09511e7f7cba275acd8b419ddac8da9a6a79e2fa" integrity sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ== +"@types/lodash@^4.14.172": + version "4.14.194" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.194.tgz#b71eb6f7a0ff11bff59fc987134a093029258a76" + integrity sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g== + "@types/long@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9" @@ -6952,7 +7088,7 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== -"@types/react-dom@18.0.11", "@types/react-dom@^18.0.11": +"@types/react-dom@*", "@types/react-dom@18.0.11", "@types/react-dom@^18.0.11": version "18.0.11" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.11.tgz#321351c1459bc9ca3d216aefc8a167beec334e33" integrity sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw== @@ -7202,6 +7338,417 @@ "@urql/core" ">=2.3.1" wonka "^4.0.14" +"@use-gesture/core@10.2.26": + version "10.2.26" + resolved "https://registry.yarnpkg.com/@use-gesture/core/-/core-10.2.26.tgz#c2fc4aa7d36cee7319a98a898b0698c66b01663e" + integrity sha512-NyFpQ3iID9iFBROXyyvU1D0NK+t+dP+WAVByhCvqHUenpxLD2NlRLVRpoK3XGGwksr6mU3PvZ2Nm4q0q+gLJPA== + +"@use-gesture/react@^10.0.0-beta.22": + version "10.2.26" + resolved "https://registry.yarnpkg.com/@use-gesture/react/-/react-10.2.26.tgz#593549fed30ebcac71cfd197993eaede0795c098" + integrity sha512-0QhaE5mhaQbFlip4MX7n1nwCX8gax6Da1LsP2fZ/BU6xW9zyEmV6NX7DPelDxq1rr2NiBJh30vx9RIp80YeA/A== + dependencies: + "@use-gesture/core" "10.2.26" + +"@visx/annotation@2.18.0": + version "2.18.0" + resolved "https://registry.yarnpkg.com/@visx/annotation/-/annotation-2.18.0.tgz#6fe29e3bd33606d58fb63603d01c7a4a1bf36561" + integrity sha512-dEuZ4jlyJQ0dJ/tOhmP9bJP+GTw7/2EnmIKms1z/icoD3rCYA9bLjHq9J/3mNzvMkw/2+whTC/cxpBZyXUeLXA== + dependencies: + "@types/react" "*" + "@visx/drag" "2.17.0" + "@visx/group" "2.17.0" + "@visx/point" "2.17.0" + "@visx/shape" "2.18.0" + "@visx/text" "2.17.0" + classnames "^2.3.1" + prop-types "^15.5.10" + react-use-measure "^2.0.4" + +"@visx/axis@2.18.0": + version "2.18.0" + resolved "https://registry.yarnpkg.com/@visx/axis/-/axis-2.18.0.tgz#9175e9d969df420592082b1ea64c16422377b389" + integrity sha512-iBMObSKHOHDZbuVXsdVLmAjLE5jCN1Ls3XI57v3yuf+qZ327mdPSliSOyOxhvRdaNDYPLSQj+P1nKan+04wJiQ== + dependencies: + "@types/react" "*" + "@visx/group" "2.17.0" + "@visx/point" "2.17.0" + "@visx/scale" "2.18.0" + "@visx/shape" "2.18.0" + "@visx/text" "2.17.0" + classnames "^2.3.1" + prop-types "^15.6.0" + +"@visx/bounds@2.17.0": + version "2.17.0" + resolved "https://registry.yarnpkg.com/@visx/bounds/-/bounds-2.17.0.tgz#2585be71bc82032ad3e1456b34b2f2c17ad34e69" + integrity sha512-XsoyTAyCm+DZbrPgP3IZFZAcNqBmXFBLSep04TqnrEA3hf16GxIzcpaGe+hAVhPg5yzBdjc7tLk6s0h5F44niA== + dependencies: + "@types/react" "*" + "@types/react-dom" "*" + prop-types "^15.5.10" + +"@visx/brush@2.18.0": + version "2.18.0" + resolved "https://registry.yarnpkg.com/@visx/brush/-/brush-2.18.0.tgz#847bab691166a0ced187d49c1459a80845925d28" + integrity sha512-9hTi2h/rq+wGtGW8ntkOjh52TWl5S8IngApcegWH2jljOY++1LLQOXBXj62MO1n/RSfH45EOPS4M+fBRU/JAZA== + dependencies: + "@visx/drag" "2.17.0" + "@visx/event" "2.17.0" + "@visx/group" "2.17.0" + "@visx/scale" "2.18.0" + "@visx/shape" "2.18.0" + classnames "^2.3.1" + prop-types "^15.6.1" + +"@visx/clip-path@2.17.0": + version "2.17.0" + resolved "https://registry.yarnpkg.com/@visx/clip-path/-/clip-path-2.17.0.tgz#25156ec56d074635601c60b1f5dec45dc7e52e15" + integrity sha512-kxSWJEmycPDdM+Nj8ka9k1jy/fCs1DmmA6tVE0QmEnaKChqwTWvX8ugb2I+7Ijb349JzLjLYB1vRBGCv2L60pQ== + dependencies: + "@types/react" "*" + prop-types "^15.5.10" + +"@visx/curve@2.17.0": + version "2.17.0" + resolved "https://registry.yarnpkg.com/@visx/curve/-/curve-2.17.0.tgz#9b4c87dd0d10a62a0f85d5a72e4c0400316df9bf" + integrity sha512-8Fw2ZalgYbpeoelLqTOmMs/wD8maSKsKS9rRIwmHZ0O0XxY8iG9oVYbD4CLWzf/uFWCY6+qofk4J1g9BWQSXJQ== + dependencies: + "@types/d3-shape" "^1.3.1" + d3-shape "^1.0.6" + +"@visx/drag@2.17.0": + version "2.17.0" + resolved "https://registry.yarnpkg.com/@visx/drag/-/drag-2.17.0.tgz#22e8e06d7dfe9e9527e7e1d4dd5ceb0195898c2b" + integrity sha512-k6PNOmL9Q1jiz+sCzxiV+Ue41EOU597WBPEZQd9baL08OQlFsYLxT95OpqQvZwlU1aHHr3hXxg4W6LtUCcUrNQ== + dependencies: + "@types/react" "*" + "@visx/event" "2.17.0" + "@visx/point" "2.17.0" + prop-types "^15.5.10" + +"@visx/event@2.17.0": + version "2.17.0" + resolved "https://registry.yarnpkg.com/@visx/event/-/event-2.17.0.tgz#220c7674505e0d7a55f36bce9575482a7fa7dc23" + integrity sha512-fg2UWo89RgKgWWnnqI+i7EF8Ry+3CdMHTND4lo4DyJvcZZUCOwhxCHMQ4/PHW0EAUfxI51nGadcE1BcEVR5zWw== + dependencies: + "@types/react" "*" + "@visx/point" "2.17.0" + +"@visx/geo@2.17.0": + version "2.17.0" + resolved "https://registry.yarnpkg.com/@visx/geo/-/geo-2.17.0.tgz#69866342375364b53882d4f5114e3adfb6317c9c" + integrity sha512-/MXXXxy5XDmwGLuRQwHxazaL1k2iymayVjmHu32vi+P7G/wahGqvWfwkdbw5CKnOMuPeEeM40CvEWQY8H6VXxg== + dependencies: + "@types/d3-geo" "^1.11.1" + "@types/geojson" "*" + "@types/react" "*" + "@visx/group" "2.17.0" + classnames "^2.3.1" + d3-geo "^1.11.3" + prop-types "^15.5.10" + +"@visx/glyph@2.17.0": + version "2.17.0" + resolved "https://registry.yarnpkg.com/@visx/glyph/-/glyph-2.17.0.tgz#1e10c2223db45d106b1526f744981431f895a2c4" + integrity sha512-/EnygQrlgxqH/dOV2jIAgis7mb18GOvnF2ZF/nPWvSKCetObqeQnQZFmjzYS3S2leW/nNpOFXj5dSWBU07LhjA== + dependencies: + "@types/d3-shape" "^1.3.1" + "@types/react" "*" + "@visx/group" "2.17.0" + classnames "^2.3.1" + d3-shape "^1.2.0" + prop-types "^15.6.2" + +"@visx/gradient@2.17.0": + version "2.17.0" + resolved "https://registry.yarnpkg.com/@visx/gradient/-/gradient-2.17.0.tgz#8c1113f66703b48ee2d4fc064d7ff6dfc701094c" + integrity sha512-3vyMzSR5iSo8+nKOx+bQZpFXqFGVzCrRbuStxTH4Ag0KFATOYnjCsypjD+gc2DEVzkarVGy0V9kRfFIH09r8Fg== + dependencies: + "@types/react" "*" + prop-types "^15.5.7" + +"@visx/grid@2.18.0": + version "2.18.0" + resolved "https://registry.yarnpkg.com/@visx/grid/-/grid-2.18.0.tgz#ae68e975d4b203a626ddba3a39d67a135816d6be" + integrity sha512-bmOowI5QA0R1KgNKxj5y+Belj5MbUz+RRW2BxTsXa7NbDV6IsA7H4l+kj3DDldRi7Q5SVm9zpfwWXNIBAhiFdA== + dependencies: + "@types/react" "*" + "@visx/curve" "2.17.0" + "@visx/group" "2.17.0" + "@visx/point" "2.17.0" + "@visx/scale" "2.18.0" + "@visx/shape" "2.18.0" + classnames "^2.3.1" + prop-types "^15.6.2" + +"@visx/group@2.17.0": + version "2.17.0" + resolved "https://registry.yarnpkg.com/@visx/group/-/group-2.17.0.tgz#b349fd6507e56fcb43d0b067d728df4ab329ca2e" + integrity sha512-60Y2dIKRh3cp/Drpq//wM067ZNrnCcvFCXufPgIihv0Ix8O7oMsYxu3ch4XUMjks+U2IAZQr5Dnc+C9sTQFkhw== + dependencies: + "@types/react" "*" + classnames "^2.3.1" + prop-types "^15.6.2" + +"@visx/heatmap@2.17.0": + version "2.17.0" + resolved "https://registry.yarnpkg.com/@visx/heatmap/-/heatmap-2.17.0.tgz#10ae00a48d37c3f1cdc9a224bd5caf5e285e5c31" + integrity sha512-BHQrd9hOIzoRLEk8DK3H2Vc4K7GjN6uHeJCghSW352OxhNga+5SpW4nHyoZxIdQLtl1m5bniGaypjQKlRcBCOQ== + dependencies: + "@types/react" "*" + "@visx/group" "2.17.0" + classnames "^2.3.1" + prop-types "^15.6.1" + +"@visx/hierarchy@2.17.0": + version "2.17.0" + resolved "https://registry.yarnpkg.com/@visx/hierarchy/-/hierarchy-2.17.0.tgz#1ec1a4e236f13685a7c3dd76d04a3d8db7b83502" + integrity sha512-5JYrS0JHl66JnhkVPv1XMkBnl8vBakODSZqR8Tf2VxmcZitG2W4tEUNulApBznSqYHuT49YsNxlgAER/I8FZjg== + dependencies: + "@types/d3-hierarchy" "^1.1.6" + "@types/react" "*" + "@visx/group" "2.17.0" + classnames "^2.3.1" + d3-hierarchy "^1.1.4" + prop-types "^15.6.1" + +"@visx/legend@2.18.0": + version "2.18.0" + resolved "https://registry.yarnpkg.com/@visx/legend/-/legend-2.18.0.tgz#1358ec29cb628ef9594ca5f34e91771536f9205b" + integrity sha512-x6RfW6NOV+I9bIx45MQlCIxDR89KdA0Y4rPrVFDdq9KSf+DICaIQw97ksGsixxQwEuiRfqGTtM6F/PXCfEx/zQ== + dependencies: + "@types/react" "*" + "@visx/group" "2.17.0" + "@visx/scale" "2.18.0" + classnames "^2.3.1" + prop-types "^15.5.10" + +"@visx/marker@2.18.0": + version "2.18.0" + resolved "https://registry.yarnpkg.com/@visx/marker/-/marker-2.18.0.tgz#1be8216cd6412b88163713759712e782962a8c5d" + integrity sha512-29qEbw4SRbKD1HpKpHbou0lsu7Mfvl7a+K/M/U99/CSwLnKaLJ5zaZ1hG+sDZ5rW9efPKef1bFjqgWqgjZG46w== + dependencies: + "@types/react" "*" + "@visx/group" "2.17.0" + "@visx/shape" "2.18.0" + classnames "^2.3.1" + prop-types "^15.6.2" + +"@visx/mock-data@2.17.0": + version "2.17.0" + resolved "https://registry.yarnpkg.com/@visx/mock-data/-/mock-data-2.17.0.tgz#55146962abfb388faf3a5d6775a67c45e83f6dbd" + integrity sha512-l+9tcJAZ+H5mtXaGbHUqgmo1b3Hcq+k6aIWmZt6VGgvPBFK3Rn68BORP8My+OA/CgMG3/ZNJBhJxLKxNN5Hkjw== + dependencies: + "@types/d3-random" "^2.2.0" + d3-random "^2.2.2" + +"@visx/network@2.17.0": + version "2.17.0" + resolved "https://registry.yarnpkg.com/@visx/network/-/network-2.17.0.tgz#d5273ab303392860157067be9b3505baa9a3a527" + integrity sha512-TlUCeSnFaGetzai3CiCG5n3DULfTKMsle6Cx9EoX4o/Hz4LsUsCb1lyQLz/3oKwxOyN/787vuMBUXqg16ygBOQ== + dependencies: + "@types/react" "*" + "@visx/group" "2.17.0" + classnames "^2.3.1" + prop-types "^15.6.2" + +"@visx/pattern@2.17.0": + version "2.17.0" + resolved "https://registry.yarnpkg.com/@visx/pattern/-/pattern-2.17.0.tgz#c00e7f80fa3d9100046d7480222679c8d92d9ae0" + integrity sha512-Mt1BXj3eQA+/6SeyxKEZvEUs43N4RHrnoISoQYctVJ+H8EcgfRyQZnxQRDqmY++YTW+VfXyJEGVU4Ix8Yzd1tA== + dependencies: + "@types/react" "*" + classnames "^2.3.1" + prop-types "^15.5.10" + +"@visx/point@2.17.0": + version "2.17.0" + resolved "https://registry.yarnpkg.com/@visx/point/-/point-2.17.0.tgz#c11f1efee5241bcd612a29f3b3099cb435c9604e" + integrity sha512-fUdGQBLGaSVbFTbQ6k+1nPisbqYjTjAdo9FhlwLd3W3uyXN/39Sx2z3N2579sVNBDzmCKdYNQIU0HC+/3Vqo6w== + +"@visx/react-spring@2.18.0": + version "2.18.0" + resolved "https://registry.yarnpkg.com/@visx/react-spring/-/react-spring-2.18.0.tgz#c19c8f64213dae9d62147ae1f99321f6c63c1c91" + integrity sha512-tTLqddFAlNZc7QvB7aWp4mC6z6NYbrTEU3/OyBplqNUwaI1W5S0se3fYf6xOxC88EbNoqCC7805ym2XoznknoQ== + dependencies: + "@types/react" "*" + "@visx/axis" "2.18.0" + "@visx/grid" "2.18.0" + "@visx/scale" "2.18.0" + "@visx/text" "2.17.0" + classnames "^2.3.1" + prop-types "^15.6.2" + +"@visx/responsive@2.17.0": + version "2.17.0" + resolved "https://registry.yarnpkg.com/@visx/responsive/-/responsive-2.17.0.tgz#8a31f016a270234bfecf25fb066f30d19784ddc7" + integrity sha512-3dY2shGbQnoknIRv3Vfnwsy3ZA8Q5Q/rYnTLiokWChYRfNC8NMPoX9mprEeb/gMAxtKjaLn3zcCgd8R+eetxIQ== + dependencies: + "@juggle/resize-observer" "^3.3.1" + "@types/lodash" "^4.14.172" + "@types/react" "*" + lodash "^4.17.21" + prop-types "^15.6.1" + +"@visx/scale@2.18.0": + version "2.18.0" + resolved "https://registry.yarnpkg.com/@visx/scale/-/scale-2.18.0.tgz#b78054e68ac8de49f0abeea0c60bb0bd14dec492" + integrity sha512-clH8HFblMlCuHvUjGRwenvbY1w9YXHU9fPl91Vbtd5bdM9xAN0Lo2+cgV46cvaX3YpnyVb4oNhlbPCBu3h6Rhw== + dependencies: + "@types/d3-interpolate" "^1.3.1" + "@types/d3-scale" "^3.3.0" + "@types/d3-time" "^2.0.0" + d3-interpolate "^1.4.0" + d3-scale "^3.3.0" + d3-time "^2.1.1" + +"@visx/shape@2.18.0": + version "2.18.0" + resolved "https://registry.yarnpkg.com/@visx/shape/-/shape-2.18.0.tgz#0d7202ca9e722ed9360e1b76f6de7b2748511d2a" + integrity sha512-kVSEjnzswQMyFDa/IXE7K+WsAkl91xK6A4W6MbGfcUhfQn+AP0GorvotW7HZGjkIlbmuLl14+vRktDo5jqS/og== + dependencies: + "@types/d3-path" "^1.0.8" + "@types/d3-shape" "^1.3.1" + "@types/lodash" "^4.14.172" + "@types/react" "*" + "@visx/curve" "2.17.0" + "@visx/group" "2.17.0" + "@visx/scale" "2.18.0" + classnames "^2.3.1" + d3-path "^1.0.5" + d3-shape "^1.2.0" + lodash "^4.17.21" + prop-types "^15.5.10" + +"@visx/text@2.17.0": + version "2.17.0" + resolved "https://registry.yarnpkg.com/@visx/text/-/text-2.17.0.tgz#e65aa8a202ce9cfdcbd898bb0afd6253ccea6a40" + integrity sha512-Eu6b8SMI+LU4O6H4l/QhCa7c4GtDTQO6jhSYuU70pdTST1Bm74nImPGekG2xDW3uxaLlkb8fDpvXag0Z7v+vlQ== + dependencies: + "@types/lodash" "^4.14.172" + "@types/react" "*" + classnames "^2.3.1" + lodash "^4.17.21" + prop-types "^15.7.2" + reduce-css-calc "^1.3.0" + +"@visx/threshold@2.18.0": + version "2.18.0" + resolved "https://registry.yarnpkg.com/@visx/threshold/-/threshold-2.18.0.tgz#7c41e1c16fac845645fa547f1ca85e5f2136bc24" + integrity sha512-pD+7XQuh8ZwHQBEriMJD1xk9G86HokuJ6E34aYxfDLJgPuVxHYjtzRHc9lLDCMiexA4enY1FyQf9L2ruTkszmw== + dependencies: + "@types/react" "*" + "@visx/clip-path" "2.17.0" + "@visx/shape" "2.18.0" + classnames "^2.3.1" + prop-types "^15.5.10" + +"@visx/tooltip@2.17.0": + version "2.17.0" + resolved "https://registry.yarnpkg.com/@visx/tooltip/-/tooltip-2.17.0.tgz#e5e39a62795d2f6c7d2a1472e7af092005374106" + integrity sha512-+dMHURP9NqSFZLomMUnoVYjRs+I2qcOw1yYvLtTp/4GUAFRMSUJoSJeuLwng1VBIgCEB95xuQ95NgGID4qzPxA== + dependencies: + "@types/react" "*" + "@visx/bounds" "2.17.0" + classnames "^2.3.1" + prop-types "^15.5.10" + react-use-measure "^2.0.4" + +"@visx/visx@^2.18.0": + version "2.18.0" + resolved "https://registry.yarnpkg.com/@visx/visx/-/visx-2.18.0.tgz#a4b23a8883856470672edae023fc079e9f8410cb" + integrity sha512-PGpe1haqBXriEVnCHwnGhd0E0yinA3bKnMKf6PE/Ud8pOi3vpfeWxHO3jnrpZrC+mP+yG8JrsevBsgTCYaVG8A== + dependencies: + "@visx/annotation" "2.18.0" + "@visx/axis" "2.18.0" + "@visx/bounds" "2.17.0" + "@visx/brush" "2.18.0" + "@visx/clip-path" "2.17.0" + "@visx/curve" "2.17.0" + "@visx/drag" "2.17.0" + "@visx/event" "2.17.0" + "@visx/geo" "2.17.0" + "@visx/glyph" "2.17.0" + "@visx/gradient" "2.17.0" + "@visx/grid" "2.18.0" + "@visx/group" "2.17.0" + "@visx/heatmap" "2.17.0" + "@visx/hierarchy" "2.17.0" + "@visx/legend" "2.18.0" + "@visx/marker" "2.18.0" + "@visx/mock-data" "2.17.0" + "@visx/network" "2.17.0" + "@visx/pattern" "2.17.0" + "@visx/point" "2.17.0" + "@visx/responsive" "2.17.0" + "@visx/scale" "2.18.0" + "@visx/shape" "2.18.0" + "@visx/text" "2.17.0" + "@visx/threshold" "2.18.0" + "@visx/tooltip" "2.17.0" + "@visx/voronoi" "2.17.0" + "@visx/wordcloud" "2.17.0" + "@visx/xychart" "2.18.0" + "@visx/zoom" "2.17.0" + +"@visx/voronoi@2.17.0": + version "2.17.0" + resolved "https://registry.yarnpkg.com/@visx/voronoi/-/voronoi-2.17.0.tgz#4c79cd200453654fd3d030a4fe599e84da9ea065" + integrity sha512-enwuidtUPntdEcMZ2PyGXaFFP87KX8YYd/pCXQ6TQ6hJfnkMe3hlwLs5skv8gijz1oHy9PkESVqgrFPb25IICA== + dependencies: + "@types/d3-voronoi" "^1.1.9" + "@types/react" "*" + classnames "^2.3.1" + d3-voronoi "^1.1.2" + prop-types "^15.6.1" + +"@visx/wordcloud@2.17.0": + version "2.17.0" + resolved "https://registry.yarnpkg.com/@visx/wordcloud/-/wordcloud-2.17.0.tgz#5fe8e484baaf1abc944b5d4b93667e2e51cde4e7" + integrity sha512-HLatkmBlbHERC+ANuZMLMzP7PiGYtX1NPyQVzEjacsBMsQEruSFDG8P7c5xrsNTIQM1+k8KMkitADvN4iPxftw== + dependencies: + "@types/d3-cloud" "1.2.5" + "@visx/group" "2.17.0" + d3-cloud "^1.2.5" + +"@visx/xychart@2.18.0": + version "2.18.0" + resolved "https://registry.yarnpkg.com/@visx/xychart/-/xychart-2.18.0.tgz#db87846d54f1537e4b8ddcd89a02970ae3a38642" + integrity sha512-IMCyuoZT4ky/CthtmJMyyB6nyLa1jdgW3XBx3UPCqWrQVkOH38tHNVFTHEgLkL0TyRKroK82F+JWD3yrc1B2Xw== + dependencies: + "@types/lodash" "^4.14.172" + "@types/react" "*" + "@visx/annotation" "2.18.0" + "@visx/axis" "2.18.0" + "@visx/event" "2.17.0" + "@visx/glyph" "2.17.0" + "@visx/grid" "2.18.0" + "@visx/react-spring" "2.18.0" + "@visx/responsive" "2.17.0" + "@visx/scale" "2.18.0" + "@visx/shape" "2.18.0" + "@visx/text" "2.17.0" + "@visx/tooltip" "2.17.0" + "@visx/voronoi" "2.17.0" + classnames "^2.3.1" + d3-array "^2.6.0" + d3-interpolate-path "2.2.1" + d3-shape "^2.0.0" + lodash "^4.17.21" + mitt "^2.1.0" + prop-types "^15.6.2" + +"@visx/zoom@2.17.0": + version "2.17.0" + resolved "https://registry.yarnpkg.com/@visx/zoom/-/zoom-2.17.0.tgz#e7c0184ce372fca45825e71e472b5445de230468" + integrity sha512-C/FxGzzV3X05+1wgKoHnsfNma5wy17DwThEhUK3/wo8nc7Fsb7dtuQn3HOzVpuqa52LbscUBJFi2Rxv79VykQQ== + dependencies: + "@types/react" "*" + "@use-gesture/react" "^10.0.0-beta.22" + "@visx/event" "2.17.0" + prop-types "^15.6.2" + "@vitejs/plugin-react-swc@^3.2.0": version "3.2.0" resolved "https://registry.yarnpkg.com/@vitejs/plugin-react-swc/-/plugin-react-swc-3.2.0.tgz#7c4f6e116a296c27f680d05750f9dbf798cf7709" @@ -7900,6 +8447,11 @@ babel-preset-fbjs@^3.4.0: "@babel/plugin-transform-template-literals" "^7.0.0" babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" +balanced-match@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + integrity sha512-STw03mQKnGUYtoNjmowo4F2cRmIIxYEGiMsjjwla/u5P1lxadj/05WkNaFjNiKTgJkj8KiXbgAiRTmcQRwQNtg== + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -8427,6 +8979,11 @@ class-variance-authority@^0.6.0: dependencies: clsx "1.2.1" +classnames@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" + integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== + clean-css@^5.2.2: version "5.3.2" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.2.tgz#70ecc7d4d4114921f5d298349ff86a31a9975224" @@ -9013,6 +9570,156 @@ csv@^5.5.0: csv-stringify "^5.6.5" stream-transform "^2.1.3" +d3-array@1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f" + integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw== + +d3-array@2, d3-array@^2.3.0, d3-array@^2.6.0: + version "2.12.1" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-2.12.1.tgz#e20b41aafcdffdf5d50928004ececf815a465e81" + integrity sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ== + dependencies: + internmap "^1.0.0" + +"d3-array@2 - 3", d3-array@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.3.tgz#39f1f4954e4a09ff69ac597c2d61906b04e84740" + integrity sha512-JRHwbQQ84XuAESWhvIPaUV4/1UYTBOLiOPGWqgFDHZS1D5QN9c57FbH3QpEnQMYiOXNzKUQyGTZf+EVO7RT5TQ== + dependencies: + internmap "1 - 2" + +d3-cloud@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/d3-cloud/-/d3-cloud-1.2.5.tgz#3e91564f2d27fba47fcc7d812eb5081ea24c603d" + integrity sha512-4s2hXZgvs0CoUIw31oBAGrHt9Kt/7P9Ik5HIVzISFiWkD0Ga2VLAuO/emO/z1tYIpE7KG2smB4PhMPfFMJpahw== + dependencies: + d3-dispatch "^1.0.3" + +d3-color@1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.4.1.tgz#c52002bf8846ada4424d55d97982fef26eb3bc8a" + integrity sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q== + +"d3-color@1 - 2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-2.0.0.tgz#8d625cab42ed9b8f601a1760a389f7ea9189d62e" + integrity sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ== + +d3-dispatch@^1.0.3: + version "1.0.6" + resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.6.tgz#00d37bcee4dd8cd97729dd893a0ac29caaba5d58" + integrity sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA== + +"d3-format@1 - 2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-2.0.0.tgz#a10bcc0f986c372b729ba447382413aabf5b0767" + integrity sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA== + +d3-geo@^1.11.3: + version "1.12.1" + resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-1.12.1.tgz#7fc2ab7414b72e59fbcbd603e80d9adc029b035f" + integrity sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg== + dependencies: + d3-array "1" + +d3-hierarchy@^1.1.4: + version "1.1.9" + resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz#2f6bee24caaea43f8dc37545fa01628559647a83" + integrity sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ== + +d3-interpolate-path@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/d3-interpolate-path/-/d3-interpolate-path-2.2.1.tgz#fd8ff20a90aff3f380bcd1c15305e7b531e55d07" + integrity sha512-6qLLh/KJVzls0XtMsMpcxhqMhgVEN7VIbR/6YGZe2qlS8KDgyyVB20XcmGnDyB051HcefQXM/Tppa9vcANEA4Q== + +"d3-interpolate@1.2.0 - 2": + version "2.0.1" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-2.0.1.tgz#98be499cfb8a3b94d4ff616900501a64abc91163" + integrity sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ== + dependencies: + d3-color "1 - 2" + +d3-interpolate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.4.0.tgz#526e79e2d80daa383f9e0c1c1c7dcc0f0583e987" + integrity sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA== + dependencies: + d3-color "1" + +d3-path@1, d3-path@^1.0.5: + version "1.0.9" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf" + integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== + +"d3-path@1 - 2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-2.0.0.tgz#55d86ac131a0548adae241eebfb56b4582dd09d8" + integrity sha512-ZwZQxKhBnv9yHaiWd6ZU4x5BtCQ7pXszEV9CU6kRgwIQVQGLMv1oiL4M+MK/n79sYzsj+gcgpPQSctJUsLN7fA== + +d3-random@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-2.2.2.tgz#5eebd209ef4e45a2b362b019c1fb21c2c98cbb6e" + integrity sha512-0D9P8TRj6qDAtHhRQn6EfdOtHMfsUWanl3yb/84C4DqpZ+VsgfI5iTVRNRbELCfNvRfpMr8OrqqUTQ6ANGCijw== + +d3-scale@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-3.3.0.tgz#28c600b29f47e5b9cd2df9749c206727966203f3" + integrity sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ== + dependencies: + d3-array "^2.3.0" + d3-format "1 - 2" + d3-interpolate "1.2.0 - 2" + d3-time "^2.1.1" + d3-time-format "2 - 3" + +d3-shape@^1.0.6, d3-shape@^1.2.0: + version "1.3.7" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7" + integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== + dependencies: + d3-path "1" + +d3-shape@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-2.1.0.tgz#3b6a82ccafbc45de55b57fcf956c584ded3b666f" + integrity sha512-PnjUqfM2PpskbSLTJvAzp2Wv4CZsnAgTfcVRTwW03QR3MkXF8Uo7B1y/lWkAsmbKwuecto++4NlsYcvYpXpTHA== + dependencies: + d3-path "1 - 2" + +"d3-time-format@2 - 3": + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-3.0.0.tgz#df8056c83659e01f20ac5da5fdeae7c08d5f1bb6" + integrity sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag== + dependencies: + d3-time "1 - 2" + +d3-time-format@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a" + integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== + dependencies: + d3-time "1 - 3" + +"d3-time@1 - 2", d3-time@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-2.1.1.tgz#e9d8a8a88691f4548e68ca085e5ff956724a6682" + integrity sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ== + dependencies: + d3-array "2" + +"d3-time@1 - 3": + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7" + integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== + dependencies: + d3-array "2 - 3" + +d3-voronoi@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/d3-voronoi/-/d3-voronoi-1.1.4.tgz#dd3c78d7653d2bb359284ae478645d95944c8297" + integrity sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg== + dag-map@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/dag-map/-/dag-map-1.0.2.tgz#e8379f041000ed561fc515475c1ed2c85eece8d7" @@ -9051,6 +9758,11 @@ dayjs@^1.8.15: resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2" integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== +debounce@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" + integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== + debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -11892,6 +12604,16 @@ internal-slot@^1.0.5: has "^1.0.3" side-channel "^1.0.4" +"internmap@1 - 2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" + integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== + +internmap@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/internmap/-/internmap-1.0.1.tgz#0017cc8a3b99605f0302f2b198d272e015e5df95" + integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw== + interpret@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" @@ -13500,6 +14222,11 @@ markdown-to-jsx@^7.1.8: resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-7.2.0.tgz#e7b46b65955f6a04d48a753acd55874a14bdda4b" integrity sha512-3l4/Bigjm4bEqjCR6Xr+d4DtM1X6vvtGsMGSjJYyep8RjjIvcWtrXBS8Wbfe1/P+atKNMccpsraESIaWVplzVg== +math-expression-evaluator@^1.2.14: + version "1.4.0" + resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.4.0.tgz#3d66031117fbb7b9715ea6c9c68c2cd2eebd37e2" + integrity sha512-4vRUvPyxdO8cWULGTh9dZWL2tZK6LDBvj+OGHBER7poH9Qdt7kXEoj20wiz4lQUbUXQZFjPbe5mVDo9nutizCw== + md5-file@^3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/md5-file/-/md5-file-3.2.3.tgz#f9bceb941eca2214a4c0727f5e700314e770f06f" @@ -14069,6 +14796,11 @@ minizlib@^2.1.1: minipass "^3.0.0" yallist "^4.0.0" +mitt@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mitt/-/mitt-2.1.0.tgz#f740577c23176c6205b121b2973514eade1b2230" + integrity sha512-ILj2TpLiysu2wkBbWjAmww7TkZb65aiQO+DkVdUTBpBXq+MHYiETENkKFMtsJZX1Lf4pe4QOrTSjIfUwN5lRdg== + mixin-deep@^1.2.0: version "1.3.2" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" @@ -15363,7 +16095,7 @@ prompts@^2.3.2, prompts@^2.4.0: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@^15.5.10, prop-types@^15.5.7, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -15788,6 +16520,13 @@ react-style-singleton@^2.2.1: invariant "^2.2.4" tslib "^2.0.0" +react-use-measure@^2.0.4: + version "2.1.1" + resolved "https://registry.yarnpkg.com/react-use-measure/-/react-use-measure-2.1.1.tgz#5824537f4ee01c9469c45d5f7a8446177c6cc4ba" + integrity sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig== + dependencies: + debounce "^1.2.1" + react@18.2.0, react@^18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" @@ -15940,6 +16679,22 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" +reduce-css-calc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" + integrity sha512-0dVfwYVOlf/LBA2ec4OwQ6p3X9mYxn/wOl2xTcLwjnPYrkgEfPx3VI4eGCH3rQLlPISG5v9I9bkZosKsNRTRKA== + dependencies: + balanced-match "^0.4.2" + math-expression-evaluator "^1.2.14" + reduce-function-call "^1.0.1" + +reduce-function-call@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.3.tgz#60350f7fb252c0a67eb10fd4694d16909971300f" + integrity sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ== + dependencies: + balanced-match "^1.0.0" + reforest@^0.12.1: version "0.12.3" resolved "https://registry.yarnpkg.com/reforest/-/reforest-0.12.3.tgz#1c2d9fb5fb2d6870ce077c75eccddb59c3a6bd36"