Skip to content

Commit 2c77f8d

Browse files
committedJan 12, 2022
feat(website): create new demo charts for the homepage
1 parent 1867b60 commit 2c77f8d

18 files changed

+644
-0
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import React from 'react'
2+
import { Bar } from '@nivo/bar'
3+
import { generateCountriesData } from '@nivo/generators'
4+
import { useHomeTheme } from './theme'
5+
import { dimensions } from './dimensions'
6+
7+
export const HomeBarDemo = ({ isHorizontal = false }: { isHorizontal: boolean }) => {
8+
const { colors, nivoTheme } = useHomeTheme()
9+
const data = isHorizontal
10+
? generateCountriesData(['hot dogs', 'burgers', 'sandwich', 'kebab', 'fries', 'donut'], {
11+
size: 9,
12+
})
13+
: generateCountriesData(['hot dogs', 'burgers', 'sandwich'], {
14+
size: 11,
15+
})
16+
17+
const keys = isHorizontal
18+
? ['hot dogs', 'burgers', 'sandwich', 'kebab', 'fries', 'donut']
19+
: ['hot dogs', 'burgers', 'sandwich']
20+
21+
return (
22+
<div id={`bar-${isHorizontal ? 'horizontal' : 'vertical'}`}>
23+
<Bar
24+
width={dimensions.width}
25+
height={dimensions.height}
26+
margin={dimensions.margin}
27+
data={data}
28+
indexBy="country"
29+
keys={keys}
30+
layout={isHorizontal ? 'horizontal' : 'vertical'}
31+
groupMode={isHorizontal ? 'stacked' : 'grouped'}
32+
padding={0.1}
33+
colors={colors}
34+
borderWidth={1}
35+
borderColor={colors[3]}
36+
theme={nivoTheme}
37+
enableGridX
38+
enableGridY
39+
enableLabel={false}
40+
animate={false}
41+
isInteractive={false}
42+
axisLeft={null}
43+
axisBottom={null}
44+
/>
45+
</div>
46+
)
47+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import React from 'react'
2+
import styled from 'styled-components'
3+
import { generateDayCounts } from '@nivo/generators'
4+
import { Calendar } from '@nivo/calendar'
5+
import { useHomeTheme } from './theme'
6+
import { dimensions } from './dimensions'
7+
8+
const calendarFrom = new Date(2015, 3, 1)
9+
const calendarTo = new Date(2017, 5, 1)
10+
const calendarData = generateDayCounts(calendarFrom, calendarTo)
11+
12+
export const HomeCalendarDemo = () => {
13+
const { colors, nivoTheme } = useHomeTheme()
14+
15+
return (
16+
<Container id="calendar">
17+
<Calendar
18+
width={dimensions.width}
19+
height={dimensions.height}
20+
margin={dimensions.margin}
21+
from={calendarFrom}
22+
to={calendarTo}
23+
data={calendarData}
24+
dayBorderWidth={1}
25+
yearSpacing={60}
26+
emptyColor={colors[1]}
27+
dayBorderColor={colors[3]}
28+
monthBorderColor={colors[3]}
29+
colors={[colors[0], colors[2]]}
30+
isInteractive={false}
31+
theme={nivoTheme}
32+
/>
33+
</Container>
34+
)
35+
}
36+
37+
const Container = styled.div`
38+
svg text {
39+
display: none;
40+
}
41+
`
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import React, { useMemo } from 'react'
2+
import { generateChordData } from '@nivo/generators'
3+
import { ChordCanvas } from '@nivo/chord'
4+
import { useHomeTheme } from './theme'
5+
import { dimensions } from './dimensions'
6+
7+
export const HomeChordDemo = () => {
8+
const { colors, nivoTheme } = useHomeTheme()
9+
const { matrix, keys } = useMemo(() => generateChordData({ size: 7 }), [])
10+
11+
return (
12+
<div id="chord">
13+
<ChordCanvas
14+
width={dimensions.width}
15+
height={dimensions.height}
16+
margin={dimensions.margin}
17+
data={matrix}
18+
keys={keys}
19+
colors={colors}
20+
padAngle={0.04}
21+
innerRadiusRatio={0.9}
22+
enableLabel={false}
23+
isInteractive={false}
24+
animate={false}
25+
arcBorderWidth={1}
26+
arcBorderColor={colors[3]}
27+
ribbonBorderWidth={1}
28+
ribbonBorderColor={colors[3]}
29+
theme={nivoTheme}
30+
/>
31+
</div>
32+
)
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import React, { useMemo } from 'react'
2+
import { generateLibTree } from '@nivo/generators'
3+
import { CirclePacking } from '@nivo/circle-packing'
4+
import { useHomeTheme } from './theme'
5+
import { dimensions } from './dimensions'
6+
7+
export const HomeCirclePackingDemo = () => {
8+
const { reversedColors, nivoTheme } = useHomeTheme()
9+
const data = useMemo(() => generateLibTree(), [])
10+
11+
return (
12+
<div id="circle-packing">
13+
<CirclePacking
14+
width={dimensions.width}
15+
height={dimensions.height}
16+
margin={dimensions.margin}
17+
data={data}
18+
id="name"
19+
value="loc"
20+
colors={reversedColors}
21+
colorBy="depth"
22+
childColor="noinherit"
23+
padding={1}
24+
enableLabels={false}
25+
animate={false}
26+
isInteractive={false}
27+
theme={nivoTheme}
28+
/>
29+
</div>
30+
)
31+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import React from 'react'
2+
import { generateDrinkStats } from '@nivo/generators'
3+
import { Line } from '@nivo/line'
4+
import { useHomeTheme } from './theme'
5+
import { dimensions } from './dimensions'
6+
7+
export const HomeLineDemo = () => {
8+
const { colors, nivoTheme } = useHomeTheme()
9+
10+
return (
11+
<div id="line">
12+
<Line
13+
width={dimensions.width}
14+
height={dimensions.height}
15+
margin={{ top: 10, bottom: 15, left: 24, right: 10 }}
16+
data={generateDrinkStats(12)}
17+
yScale={{ type: 'linear', stacked: true }}
18+
lineWidth={4}
19+
curve="monotoneX"
20+
theme={nivoTheme}
21+
colors={colors}
22+
animate={false}
23+
isInteractive={false}
24+
pointSize={16}
25+
axisLeft={null}
26+
axisBottom={null}
27+
/>
28+
</div>
29+
)
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import React, { useMemo } from 'react'
2+
import { generateProgrammingLanguageStats } from '@nivo/generators'
3+
import { Pie } from '@nivo/pie'
4+
import { useHomeTheme } from './theme'
5+
import { dimensions } from './dimensions'
6+
7+
export const HomePieDemo = () => {
8+
const { colors, nivoTheme } = useHomeTheme()
9+
const data = useMemo(
10+
() =>
11+
generateProgrammingLanguageStats(true, 12).map(d => ({
12+
id: d.label,
13+
...d,
14+
})),
15+
[]
16+
)
17+
18+
return (
19+
<div id="pie">
20+
<Pie
21+
width={dimensions.width}
22+
height={dimensions.height}
23+
margin={dimensions.margin}
24+
data={data}
25+
innerRadius={0.6}
26+
enableArcLabels={false}
27+
enableArcLinkLabels={false}
28+
colors={colors}
29+
borderWidth={1}
30+
borderColor={colors[3]}
31+
animate={false}
32+
isInteractive={false}
33+
theme={nivoTheme}
34+
/>
35+
</div>
36+
)
37+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import React, { useMemo } from 'react'
2+
import styled from 'styled-components'
3+
import { generateWinesTastes } from '@nivo/generators'
4+
import { Radar } from '@nivo/radar'
5+
import { useHomeTheme } from './theme'
6+
import { dimensions } from './dimensions'
7+
8+
export const HomeRadarDemo = () => {
9+
const { colors, nivoTheme } = useHomeTheme()
10+
const data = useMemo(() => generateWinesTastes(), [])
11+
12+
return (
13+
<Container id="radar">
14+
<Radar
15+
{...data}
16+
width={dimensions.width}
17+
height={dimensions.height}
18+
indexBy="taste"
19+
margin={dimensions.margin}
20+
theme={nivoTheme}
21+
colors={colors}
22+
curve="linearClosed"
23+
dotSize={7}
24+
dotBorderWidth={1}
25+
dotBorderColor={colors[1]}
26+
enableDotLabel={false}
27+
animate={false}
28+
isInteractive={false}
29+
/>
30+
</Container>
31+
)
32+
}
33+
34+
const Container = styled.div`
35+
svg text {
36+
display: none;
37+
}
38+
`
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import React from 'react'
2+
import { generateSankeyData } from '@nivo/generators'
3+
import { Sankey } from '@nivo/sankey'
4+
import { useHomeTheme } from './theme'
5+
import { dimensions } from './dimensions'
6+
7+
export const HomeSankeyDemo = () => {
8+
const { colors, nivoTheme } = useHomeTheme()
9+
10+
return (
11+
<div id="sankey">
12+
<Sankey
13+
width={dimensions.width}
14+
height={dimensions.height}
15+
margin={dimensions.margin}
16+
data={generateSankeyData({ nodeCount: 11, maxIterations: 2 })}
17+
theme={nivoTheme}
18+
colors={colors}
19+
animate={false}
20+
isInteractive={false}
21+
enableLabels={false}
22+
nodeBorderColor={{ from: 'color' }}
23+
nodeOpacity={1}
24+
nodeThickness={12}
25+
nodeInnerPadding={2}
26+
nodeSpacing={20}
27+
nodeBorderWidth={0}
28+
linkOpacity={0.6}
29+
linkBlendMode="normal"
30+
linkContract={1}
31+
labelTextColor={{ from: 'color' }}
32+
/>
33+
</div>
34+
)
35+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import React from 'react'
2+
import range from 'lodash/range'
3+
import random from 'lodash/random'
4+
import { Stream } from '@nivo/stream'
5+
import { useHomeTheme } from './theme'
6+
import { dimensions } from './dimensions'
7+
8+
const streamDataLayerCount = 5
9+
const generateStreamData = () =>
10+
range(16).map(() =>
11+
range(streamDataLayerCount).reduce((acc, i) => {
12+
acc[i] = random(10, 200)
13+
return acc
14+
}, {})
15+
)
16+
17+
export const HomeStreamDemo = () => {
18+
const { reversedColors, nivoTheme } = useHomeTheme()
19+
20+
return (
21+
<div id="stream">
22+
<Stream
23+
width={dimensions.width}
24+
height={dimensions.height}
25+
data={generateStreamData()}
26+
margin={dimensions.margin}
27+
keys={range(streamDataLayerCount)}
28+
theme={nivoTheme}
29+
colors={reversedColors}
30+
animate={false}
31+
isInteractive={false}
32+
enableGridX
33+
axisLeft={null}
34+
axisBottom={null}
35+
offsetType="silhouette"
36+
/>
37+
</div>
38+
)
39+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import React, { useMemo } from 'react'
2+
import { generateLibTree } from '@nivo/generators'
3+
import { Sunburst } from '@nivo/sunburst'
4+
import { useHomeTheme } from './theme'
5+
import { dimensions } from './dimensions'
6+
7+
export const HomeSunburstDemo = () => {
8+
const { colors, nivoTheme } = useHomeTheme()
9+
const data = useMemo(() => generateLibTree(), [])
10+
11+
return (
12+
<div id="sunburst">
13+
<Sunburst
14+
width={dimensions.width}
15+
height={dimensions.height}
16+
margin={dimensions.margin}
17+
data={data}
18+
id="name"
19+
value="loc"
20+
animate={false}
21+
isInteractive={false}
22+
colors={colors}
23+
borderColor={colors[3]}
24+
theme={nivoTheme}
25+
/>
26+
</div>
27+
)
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import React, { useMemo } from 'react'
2+
import { generateSwarmPlotData } from '@nivo/generators'
3+
import { SwarmPlot } from '@nivo/swarmplot'
4+
import { useHomeTheme } from './theme'
5+
import { dimensions } from './dimensions'
6+
7+
export const HomeSwarmPlotDemo = () => {
8+
const { colors, reversedColors, nivoTheme } = useHomeTheme()
9+
const data = useMemo(() => generateSwarmPlotData(['thing'], { min: 50, max: 50 }), [])
10+
11+
return (
12+
<div id="swarmplot">
13+
<SwarmPlot
14+
width={dimensions.width}
15+
height={dimensions.height}
16+
margin={{
17+
...dimensions.margin,
18+
left: dimensions.margin.left * 3,
19+
right: dimensions.margin.right * 3,
20+
}}
21+
data={data.data}
22+
groups={data.groups}
23+
groupBy="group"
24+
id="id"
25+
value="price"
26+
layout="horizontal"
27+
valueScale={{
28+
type: 'linear',
29+
min: 0,
30+
max: 500,
31+
}}
32+
size={{
33+
key: 'volume',
34+
values: [4, 20],
35+
sizes: [10, 60],
36+
}}
37+
theme={nivoTheme}
38+
colors={reversedColors}
39+
borderWidth={1}
40+
borderColor={colors[3]}
41+
spacing={3}
42+
enableGridY={false}
43+
colorBy="id"
44+
animate={false}
45+
isInteractive={false}
46+
axisTop={null}
47+
axisRight={null}
48+
axisBottom={null}
49+
axisLeft={null}
50+
/>
51+
</div>
52+
)
53+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import React, { useMemo } from 'react'
2+
import { generateLibTree } from '@nivo/generators'
3+
import { TreeMap } from '@nivo/treemap'
4+
import { useHomeTheme } from './theme'
5+
import { dimensions } from './dimensions'
6+
7+
export const HomeTreeMapDemo = () => {
8+
const { colors, nivoTheme } = useHomeTheme()
9+
const data = useMemo(() => generateLibTree(), [])
10+
11+
return (
12+
<div id="treemap">
13+
<TreeMap
14+
width={dimensions.width}
15+
height={dimensions.height}
16+
margin={dimensions.margin}
17+
data={data}
18+
identity="name"
19+
value="loc"
20+
valueFormat=".02s"
21+
tile="squarify"
22+
colors={colors}
23+
leavesOnly={true}
24+
borderWidth={1}
25+
borderColor={colors[3]}
26+
outerPadding={0}
27+
innerPadding={0}
28+
nodeOpacity={1}
29+
animate={false}
30+
isInteractive={false}
31+
enableLabel={false}
32+
labelTextColor={colors[1]}
33+
theme={nivoTheme}
34+
/>
35+
</div>
36+
)
37+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import React from 'react'
2+
import range from 'lodash/range'
3+
import { Voronoi } from '@nivo/voronoi'
4+
import { useHomeTheme } from './theme'
5+
import { dimensions } from './dimensions'
6+
7+
const voronoi = {
8+
xDomain: [0, 400],
9+
yDomain: [0, 300],
10+
}
11+
voronoi.data = range(80).map(id => ({
12+
id,
13+
x: Math.random() * voronoi.xDomain[1],
14+
y: Math.random() * voronoi.yDomain[1],
15+
}))
16+
17+
export const HomeVoronoiDemo = () => {
18+
const { colors, nivoTheme } = useHomeTheme()
19+
20+
return (
21+
<div id="voronoi">
22+
<Voronoi
23+
width={dimensions.width}
24+
height={dimensions.height}
25+
margin={dimensions.margin}
26+
data={voronoi.data}
27+
xDomain={voronoi.xDomain}
28+
yDomain={voronoi.yDomain}
29+
enableLinks={true}
30+
linkLineColor={colors[2]}
31+
cellLineColor={colors[3]}
32+
cellLineWidth={2}
33+
enablePoints={true}
34+
pointSize={12}
35+
pointColor={colors[3]}
36+
isInteractive={false}
37+
animate={false}
38+
theme={nivoTheme}
39+
/>
40+
</div>
41+
)
42+
}
+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
export const dimensions = {
2+
width: 600,
3+
height: 400,
4+
margin: {
5+
top: 20,
6+
right: 20,
7+
bottom: 20,
8+
left: 20,
9+
},
10+
}

‎website/src/components/home/index.ts

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
export * from './HomeBarDemo'
2+
export * from './HomeCalendarDemo'
3+
export * from './HomeChordDemo'
4+
export * from './HomeCirclePackingDemo'
5+
export * from './HomeLineDemo'
6+
export * from './HomePieDemo'
7+
export * from './HomeRadarDemo'
8+
export * from './HomeSankeyDemo'
9+
export * from './HomeStreamDemo'
10+
export * from './HomeSunburstDemo'
11+
export * from './HomeSwarmPlotDemo'
12+
export * from './HomeTreeMapDemo'
13+
export * from './HomeVoronoiDemo'

‎website/src/components/home/theme.ts

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { useMemo } from 'react'
2+
import { useTheme } from 'styled-components'
3+
4+
export const useHomeTheme = () => {
5+
const theme = useTheme()
6+
7+
const { colors, reversedColors } = useMemo(() => {
8+
const _colors: string[] = theme.colors.coloredRange.slice(1)
9+
const _reversedColors = [..._colors].reverse()
10+
11+
return { colors: _colors, reversedColors: _reversedColors }
12+
}, [theme])
13+
14+
const nivoTheme = useMemo(() => {
15+
return {
16+
axis: {
17+
ticks: {
18+
line: {
19+
stroke: theme.colors.coloredRange[4],
20+
},
21+
text: {
22+
fill: theme.colors.coloredRange[4],
23+
fontSize: 9,
24+
},
25+
},
26+
},
27+
grid: {
28+
line: {
29+
stroke: theme.colors.coloredRange[4],
30+
strokeWidth: 2,
31+
strokeDasharray: '5,8',
32+
},
33+
},
34+
labels: {
35+
text: {
36+
fill: theme.colors.coloredRange[4],
37+
},
38+
},
39+
}
40+
}, [theme])
41+
42+
return {
43+
colors,
44+
reversedColors,
45+
nivoTheme,
46+
}
47+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import React from 'react'
2+
import styled from 'styled-components'
3+
import {
4+
HomeBarDemo,
5+
HomeCalendarDemo,
6+
HomeChordDemo,
7+
HomeCirclePackingDemo,
8+
HomeLineDemo,
9+
HomePieDemo,
10+
HomeRadarDemo,
11+
HomeSankeyDemo,
12+
HomeStreamDemo,
13+
HomeSunburstDemo,
14+
HomeSwarmPlotDemo,
15+
HomeTreeMapDemo,
16+
HomeVoronoiDemo,
17+
} from '../../components/home'
18+
19+
const HomepageDemosPage = () => (
20+
<Container>
21+
<div>
22+
<HomeBarDemo isHorizontal={false} />
23+
</div>
24+
<div>
25+
<HomeBarDemo isHorizontal={true} />
26+
</div>
27+
<div>
28+
<HomeCalendarDemo />
29+
</div>
30+
<div>
31+
<HomeChordDemo />
32+
</div>
33+
<div>
34+
<HomeCirclePackingDemo />
35+
</div>
36+
<div>
37+
<HomeLineDemo />
38+
</div>
39+
<div>
40+
<HomePieDemo />
41+
</div>
42+
<div>
43+
<HomeRadarDemo />
44+
</div>
45+
<div>
46+
<HomeSankeyDemo />
47+
</div>
48+
<div>
49+
<HomeStreamDemo />
50+
</div>
51+
<div>
52+
<HomeSunburstDemo />
53+
</div>
54+
<div>
55+
<HomeSwarmPlotDemo />
56+
</div>
57+
<div>
58+
<HomeTreeMapDemo />
59+
</div>
60+
<div>
61+
<HomeVoronoiDemo />
62+
</div>
63+
</Container>
64+
)
65+
66+
const Container = styled.div`
67+
background: ${({ theme }) => theme.colors.coloredRange[2]};
68+
// background: transparent;
69+
display: flex;
70+
flex-wrap: wrap;
71+
72+
& > * {
73+
width: 300px;
74+
height: 200px;
75+
}
76+
77+
& > * > * {
78+
transform-origin: top left;
79+
transform: scale3d(0.5, 0.5, 1);
80+
}
81+
`
82+
83+
export default HomepageDemosPage

0 commit comments

Comments
 (0)
Please sign in to comment.