File size: 3,358 Bytes
32e1a9b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
"use client"

import { Area, AreaChart, CartesianGrid, XAxis } from "recharts"

import {
  Card,
  CardContent,
  CardDescription,
  CardHeader,
  CardTitle,
} from "@/components/ui/card"
import {
  ChartConfig,
  ChartContainer,
  ChartLegend,
  ChartLegendContent,
  ChartTooltip,
  ChartTooltipContent,
} from "@/components/ui/chart"

export interface ChartDataPoint {
  month: Date
  models: number
  datasets: number
  spaces: number
}

interface AreaChartStackedProps {
  data: ChartDataPoint[]
}

const chartConfig = {
  models: {
    label: "Models",
    color: "hsl(var(--chart-1))",
  },
  datasets: {
    label: "Datasets",
    color: "hsl(var(--chart-2))",
  },
  spaces: {
    label: "Spaces",
    color: "hsl(var(--chart-3))",
  },
} satisfies ChartConfig

export function AreaChartStacked({ data }: AreaChartStackedProps) {
  const sortedData = [...data].sort(
    (a, b) => a.month.getTime() - b.month.getTime()
  )

  return (
    <Card className="bg-[var(--card-background)]">
      <CardHeader>
        <CardTitle className="text-[var(--card-text)]">
          Hugging Face Hub Growth Each Month
        </CardTitle>
        <CardDescription className="text-[var(--card-text)]">
          Monthly creation trends for models, datasets, and spaces
        </CardDescription>
      </CardHeader>
      <CardContent>
        {data.length > 0 ? (
          <ChartContainer config={chartConfig}>
            <AreaChart
              accessibilityLayer
              data={sortedData}
              margin={{
                left: 12,
                right: 12,
              }}
            >
              <CartesianGrid vertical={false} />
              <XAxis
                dataKey="month"
                tickLine={false}
                axisLine={false}
                tickMargin={8}
                tickFormatter={(value) => {
                  const date = new Date(value)
                  return date.toLocaleString("default", {
                    month: "short",
                    year: "numeric",
                  })
                }}
              />
              <ChartTooltip
                cursor={true}
                content={<ChartTooltipContent indicator="line" hideLabel />}
              />
              <Area
                dataKey="spaces"
                type="natural"
                fill="hsl(var(--chart-3))"
                fillOpacity={0.4}
                stroke="hsl(var(--chart-3))"
                stackId="a"
              />
              <Area
                dataKey="datasets"
                type="natural"
                fill="hsl(var(--chart-2))"
                fillOpacity={0.2}
                stroke="hsl(var(--chart-2))"
                stackId="a"
              />
              <Area
                dataKey="models"
                type="natural"
                fill="hsl(var(--chart-1))"
                fillOpacity={0.4}
                stroke="hsl(var(--chart-1))"
                stackId="a"
              />
              <ChartLegend
                content={<ChartLegendContent className="text-white" />}
              />
            </AreaChart>
          </ChartContainer>
        ) : (
          <div className="flex items-center justify-center h-[300px] text-[var(--card-text)]">
            Loading...
          </div>
        )}
      </CardContent>
    </Card>
  )
}