Caleb Fahlgren commited on
Commit
08cd799
·
1 Parent(s): 6b6f639

add duckdb wasm, shadcn chart with hf growth each month

Browse files
app/page.tsx CHANGED
@@ -1,12 +1,99 @@
1
- import Link from "next/link"
2
 
3
- import { siteConfig } from "@/config/site"
4
- import { buttonVariants } from "@/components/ui/button"
 
5
 
6
  export default function IndexPage() {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
  return (
8
  <section className="container grid items-center gap-6 pb-8 pt-6 md:py-10">
9
-
 
 
 
 
 
 
 
10
  </section>
11
  )
12
  }
 
1
+ "use client"
2
 
3
+ import { AreaChartStacked, ChartDataPoint } from "@/components/area-chart"
4
+ import { useEffect, useState } from 'react'
5
+ import * as duckdb from '@duckdb/duckdb-wasm'
6
 
7
  export default function IndexPage() {
8
+ const [db, setDb] = useState<duckdb.AsyncDuckDB | null>(null)
9
+ const [chartData, setChartData] = useState<ChartDataPoint[]>([])
10
+
11
+ useEffect(() => {
12
+ const initDB = async () => {
13
+ const CDN_BASE = `https://cdn.jsdelivr.net/npm/@duckdb/duckdb-wasm@next`
14
+
15
+ const JSDELIVR_BUNDLES = {
16
+ mvp: {
17
+ mainModule: `${CDN_BASE}/dist/duckdb-mvp.wasm`,
18
+ mainWorker: `${CDN_BASE}/dist/duckdb-browser-mvp.worker.js`
19
+ },
20
+ eh: {
21
+ mainModule: `${CDN_BASE}/dist/duckdb-eh.wasm`,
22
+ mainWorker: `${CDN_BASE}/dist/duckdb-browser-eh.worker.js`
23
+ }
24
+ }
25
+
26
+ const bundle = await duckdb.selectBundle(JSDELIVR_BUNDLES)
27
+ const worker_url = URL.createObjectURL(
28
+ new Blob([`importScripts("${bundle.mainWorker}");`], { type: 'text/javascript' })
29
+ )
30
+
31
+ const worker = new Worker(worker_url)
32
+ const logger = new duckdb.ConsoleLogger()
33
+ const db = new duckdb.AsyncDuckDB(logger, worker)
34
+ await db.instantiate(bundle.mainModule)
35
+
36
+ const conn = await db.connect()
37
+
38
+ // create views from hf parquet files
39
+ await conn.query(`
40
+ CREATE VIEW models AS SELECT * FROM read_parquet('https://huggingface.co/datasets/cfahlgren1/hub-stats/resolve/refs%2Fconvert%2Fparquet/models/train/0000.parquet?download=true');
41
+ CREATE VIEW datasets AS SELECT * FROM read_parquet('https://huggingface.co/datasets/cfahlgren1/hub-stats/resolve/refs%2Fconvert%2Fparquet/datasets/train/0000.parquet?download=true');
42
+ CREATE VIEW spaces AS SELECT * FROM read_parquet('https://huggingface.co/datasets/cfahlgren1/hub-stats/resolve/refs%2Fconvert%2Fparquet/spaces/train/0000.parquet?download=true');
43
+ `)
44
+
45
+ setDb(db)
46
+ await fetchChartData(db)
47
+ }
48
+
49
+ initDB()
50
+ }, [])
51
+
52
+ const fetchChartData = async (db: duckdb.AsyncDuckDB) => {
53
+ const conn = await db.connect()
54
+
55
+ const result = await conn.query(`
56
+ WITH all_data AS (
57
+ SELECT DATE_TRUNC('month', CAST(createdAt AS DATE)) AS month, 'model' AS type FROM models
58
+ UNION ALL
59
+ SELECT DATE_TRUNC('month', CAST(createdAt AS DATE)) AS month, 'dataset' AS type FROM datasets
60
+ UNION ALL
61
+ SELECT DATE_TRUNC('month', CAST(createdAt AS DATE)) AS month, 'space' AS type FROM spaces
62
+ )
63
+ SELECT
64
+ month,
65
+ COUNT(*) FILTER (WHERE type = 'model') AS models,
66
+ COUNT(*) FILTER (WHERE type = 'dataset') AS datasets,
67
+ COUNT(*) FILTER (WHERE type = 'space') AS spaces
68
+ FROM all_data
69
+ GROUP BY month
70
+ ORDER BY month
71
+ `)
72
+
73
+ const data: ChartDataPoint[] = result.toArray().map(row => ({
74
+ month: new Date(row.month),
75
+ models: Number(row.models),
76
+ datasets: Number(row.datasets),
77
+ spaces: Number(row.spaces)
78
+ }))
79
+
80
+ console.log(data)
81
+
82
+ await conn.close()
83
+
84
+ setChartData(data)
85
+ }
86
+
87
  return (
88
  <section className="container grid items-center gap-6 pb-8 pt-6 md:py-10">
89
+ <div className="flex flex-col gap-4">
90
+ <h1 className="text-3xl text-center font-extrabold leading-tight tracking-tighter md:text-4xl">
91
+ Hugging Face Hub Stats
92
+ </h1>
93
+ </div>
94
+ <div className="flex flex-col gap-4 max-w-6xl mt-10 w-full mx-auto">
95
+ {chartData.length > 0 ? <AreaChartStacked data={chartData} /> : <p>Loading...</p>}
96
+ </div>
97
  </section>
98
  )
99
  }
components/area-chart.tsx ADDED
@@ -0,0 +1,118 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use client"
2
+
3
+ import { Area, AreaChart, CartesianGrid, XAxis } from "recharts"
4
+
5
+ import {
6
+ Card,
7
+ CardContent,
8
+ CardDescription,
9
+ CardHeader,
10
+ CardTitle,
11
+ } from "@/components/ui/card"
12
+ import {
13
+ ChartConfig,
14
+ ChartContainer,
15
+ ChartLegend,
16
+ ChartLegendContent,
17
+ ChartTooltip,
18
+ ChartTooltipContent,
19
+ } from "@/components/ui/chart"
20
+
21
+ export interface ChartDataPoint {
22
+ month: Date;
23
+ models: number;
24
+ datasets: number;
25
+ spaces: number;
26
+ }
27
+
28
+ interface AreaChartStackedProps {
29
+ data: ChartDataPoint[];
30
+ }
31
+
32
+ const chartConfig = {
33
+ models: {
34
+ label: "Models",
35
+ color: "hsl(0, 70%, 70%)", // Light red
36
+ },
37
+ datasets: {
38
+ label: "Datasets",
39
+ color: "hsl(120, 70%, 40%)", // Darker green
40
+ },
41
+ spaces: {
42
+ label: "Spaces",
43
+ color: "hsl(210, 70%, 70%)", // Light blue
44
+ },
45
+ } satisfies ChartConfig
46
+
47
+ export function AreaChartStacked({ data }: AreaChartStackedProps) {
48
+ const sortedData = [...data].sort((a, b) => a.month.getTime() - b.month.getTime());
49
+
50
+ return (
51
+ <Card>
52
+ <CardHeader>
53
+ <CardTitle>Hugging Face Hub Growth</CardTitle>
54
+ <CardDescription>
55
+ Monthly creation trends for models, datasets, and spaces
56
+ </CardDescription>
57
+ </CardHeader>
58
+ <CardContent>
59
+ <ChartContainer config={chartConfig}>
60
+ <AreaChart
61
+ accessibilityLayer
62
+ data={sortedData}
63
+ margin={{
64
+ left: 12,
65
+ right: 12,
66
+ }}
67
+ >
68
+ <CartesianGrid vertical={false} />
69
+ <XAxis
70
+ dataKey="month"
71
+ tickLine={false}
72
+ axisLine={false}
73
+ tickMargin={8}
74
+ tickFormatter={(value) => {
75
+ const date = new Date(value);
76
+ return date.toLocaleString('default', { month: 'short', year: 'numeric' });
77
+ }}
78
+ />
79
+ <ChartTooltip
80
+ cursor={true}
81
+ content={
82
+ <ChartTooltipContent
83
+ indicator="line"
84
+ hideLabel
85
+ />
86
+ }
87
+ />
88
+ <Area
89
+ dataKey="spaces"
90
+ type="natural"
91
+ fill="hsl(210, 70%, 70%)"
92
+ fillOpacity={0.4}
93
+ stroke="hsl(210, 70%, 70%)"
94
+ stackId="a"
95
+ />
96
+ <Area
97
+ dataKey="datasets"
98
+ type="natural"
99
+ fill="hsl(120, 70%, 40%)"
100
+ fillOpacity={0.2}
101
+ stroke="hsl(120, 70%, 40%)"
102
+ stackId="a"
103
+ />
104
+ <Area
105
+ dataKey="models"
106
+ type="natural"
107
+ fill="hsl(0, 70%, 70%)"
108
+ fillOpacity={0.4}
109
+ stroke="hsl(0, 70%, 70%)"
110
+ stackId="a"
111
+ />
112
+ <ChartLegend content={<ChartLegendContent />} />
113
+ </AreaChart>
114
+ </ChartContainer>
115
+ </CardContent>
116
+ </Card>
117
+ )
118
+ }
components/ui/card.tsx ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import * as React from "react"
2
+
3
+ import { cn } from "@/lib/utils"
4
+
5
+ const Card = React.forwardRef<
6
+ HTMLDivElement,
7
+ React.HTMLAttributes<HTMLDivElement>
8
+ >(({ className, ...props }, ref) => (
9
+ <div
10
+ ref={ref}
11
+ className={cn(
12
+ "rounded-lg border bg-card text-card-foreground shadow-sm",
13
+ className
14
+ )}
15
+ {...props}
16
+ />
17
+ ))
18
+ Card.displayName = "Card"
19
+
20
+ const CardHeader = React.forwardRef<
21
+ HTMLDivElement,
22
+ React.HTMLAttributes<HTMLDivElement>
23
+ >(({ className, ...props }, ref) => (
24
+ <div
25
+ ref={ref}
26
+ className={cn("flex flex-col space-y-1.5 p-6", className)}
27
+ {...props}
28
+ />
29
+ ))
30
+ CardHeader.displayName = "CardHeader"
31
+
32
+ const CardTitle = React.forwardRef<
33
+ HTMLParagraphElement,
34
+ React.HTMLAttributes<HTMLHeadingElement>
35
+ >(({ className, ...props }, ref) => (
36
+ <h3
37
+ ref={ref}
38
+ className={cn(
39
+ "text-2xl font-semibold leading-none tracking-tight",
40
+ className
41
+ )}
42
+ {...props}
43
+ />
44
+ ))
45
+ CardTitle.displayName = "CardTitle"
46
+
47
+ const CardDescription = React.forwardRef<
48
+ HTMLParagraphElement,
49
+ React.HTMLAttributes<HTMLParagraphElement>
50
+ >(({ className, ...props }, ref) => (
51
+ <p
52
+ ref={ref}
53
+ className={cn("text-sm text-muted-foreground", className)}
54
+ {...props}
55
+ />
56
+ ))
57
+ CardDescription.displayName = "CardDescription"
58
+
59
+ const CardContent = React.forwardRef<
60
+ HTMLDivElement,
61
+ React.HTMLAttributes<HTMLDivElement>
62
+ >(({ className, ...props }, ref) => (
63
+ <div ref={ref} className={cn("p-6 pt-0", className)} {...props} />
64
+ ))
65
+ CardContent.displayName = "CardContent"
66
+
67
+ const CardFooter = React.forwardRef<
68
+ HTMLDivElement,
69
+ React.HTMLAttributes<HTMLDivElement>
70
+ >(({ className, ...props }, ref) => (
71
+ <div
72
+ ref={ref}
73
+ className={cn("flex items-center p-6 pt-0", className)}
74
+ {...props}
75
+ />
76
+ ))
77
+ CardFooter.displayName = "CardFooter"
78
+
79
+ export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }
components/ui/chart.tsx ADDED
@@ -0,0 +1,363 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import * as React from "react"
2
+ import * as RechartsPrimitive from "recharts"
3
+
4
+ import { cn } from "@/lib/utils"
5
+
6
+ // Format: { THEME_NAME: CSS_SELECTOR }
7
+ const THEMES = { light: "", dark: ".dark" } as const
8
+
9
+ export type ChartConfig = {
10
+ [k in string]: {
11
+ label?: React.ReactNode
12
+ icon?: React.ComponentType
13
+ } & (
14
+ | { color?: string; theme?: never }
15
+ | { color?: never; theme: Record<keyof typeof THEMES, string> }
16
+ )
17
+ }
18
+
19
+ type ChartContextProps = {
20
+ config: ChartConfig
21
+ }
22
+
23
+ const ChartContext = React.createContext<ChartContextProps | null>(null)
24
+
25
+ function useChart() {
26
+ const context = React.useContext(ChartContext)
27
+
28
+ if (!context) {
29
+ throw new Error("useChart must be used within a <ChartContainer />")
30
+ }
31
+
32
+ return context
33
+ }
34
+
35
+ const ChartContainer = React.forwardRef<
36
+ HTMLDivElement,
37
+ React.ComponentProps<"div"> & {
38
+ config: ChartConfig
39
+ children: React.ComponentProps<
40
+ typeof RechartsPrimitive.ResponsiveContainer
41
+ >["children"]
42
+ }
43
+ >(({ id, className, children, config, ...props }, ref) => {
44
+ const uniqueId = React.useId()
45
+ const chartId = `chart-${id || uniqueId.replace(/:/g, "")}`
46
+
47
+ return (
48
+ <ChartContext.Provider value={{ config }}>
49
+ <div
50
+ data-chart={chartId}
51
+ ref={ref}
52
+ className={cn(
53
+ "flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-none [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-sector]:outline-none [&_.recharts-surface]:outline-none",
54
+ className
55
+ )}
56
+ {...props}
57
+ >
58
+ <ChartStyle id={chartId} config={config} />
59
+ <RechartsPrimitive.ResponsiveContainer>
60
+ {children}
61
+ </RechartsPrimitive.ResponsiveContainer>
62
+ </div>
63
+ </ChartContext.Provider>
64
+ )
65
+ })
66
+ ChartContainer.displayName = "Chart"
67
+
68
+ const ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {
69
+ const colorConfig = Object.entries(config).filter(
70
+ ([_, config]) => config.theme || config.color
71
+ )
72
+
73
+ if (!colorConfig.length) {
74
+ return null
75
+ }
76
+
77
+ return (
78
+ <style
79
+ dangerouslySetInnerHTML={{
80
+ __html: Object.entries(THEMES)
81
+ .map(
82
+ ([theme, prefix]) => `
83
+ ${prefix} [data-chart=${id}] {
84
+ ${colorConfig
85
+ .map(([key, itemConfig]) => {
86
+ const color =
87
+ itemConfig.theme?.[theme as keyof typeof itemConfig.theme] ||
88
+ itemConfig.color
89
+ return color ? ` --color-${key}: ${color};` : null
90
+ })
91
+ .join("\n")}
92
+ }
93
+ `
94
+ )
95
+ .join("\n"),
96
+ }}
97
+ />
98
+ )
99
+ }
100
+
101
+ const ChartTooltip = RechartsPrimitive.Tooltip
102
+
103
+ const ChartTooltipContent = React.forwardRef<
104
+ HTMLDivElement,
105
+ React.ComponentProps<typeof RechartsPrimitive.Tooltip> &
106
+ React.ComponentProps<"div"> & {
107
+ hideLabel?: boolean
108
+ hideIndicator?: boolean
109
+ indicator?: "line" | "dot" | "dashed"
110
+ nameKey?: string
111
+ labelKey?: string
112
+ }
113
+ >(
114
+ (
115
+ {
116
+ active,
117
+ payload,
118
+ className,
119
+ indicator = "dot",
120
+ hideLabel = false,
121
+ hideIndicator = false,
122
+ label,
123
+ labelFormatter,
124
+ labelClassName,
125
+ formatter,
126
+ color,
127
+ nameKey,
128
+ labelKey,
129
+ },
130
+ ref
131
+ ) => {
132
+ const { config } = useChart()
133
+
134
+ const tooltipLabel = React.useMemo(() => {
135
+ if (hideLabel || !payload?.length) {
136
+ return null
137
+ }
138
+
139
+ const [item] = payload
140
+ const key = `${labelKey || item.dataKey || item.name || "value"}`
141
+ const itemConfig = getPayloadConfigFromPayload(config, item, key)
142
+ const value =
143
+ !labelKey && typeof label === "string"
144
+ ? config[label as keyof typeof config]?.label || label
145
+ : itemConfig?.label
146
+
147
+ if (labelFormatter) {
148
+ return (
149
+ <div className={cn("font-medium", labelClassName)}>
150
+ {labelFormatter(value, payload)}
151
+ </div>
152
+ )
153
+ }
154
+
155
+ if (!value) {
156
+ return null
157
+ }
158
+
159
+ return <div className={cn("font-medium", labelClassName)}>{value}</div>
160
+ }, [
161
+ label,
162
+ labelFormatter,
163
+ payload,
164
+ hideLabel,
165
+ labelClassName,
166
+ config,
167
+ labelKey,
168
+ ])
169
+
170
+ if (!active || !payload?.length) {
171
+ return null
172
+ }
173
+
174
+ const nestLabel = payload.length === 1 && indicator !== "dot"
175
+
176
+ return (
177
+ <div
178
+ ref={ref}
179
+ className={cn(
180
+ "grid min-w-[8rem] items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl",
181
+ className
182
+ )}
183
+ >
184
+ {!nestLabel ? tooltipLabel : null}
185
+ <div className="grid gap-1.5">
186
+ {payload.map((item, index) => {
187
+ const key = `${nameKey || item.name || item.dataKey || "value"}`
188
+ const itemConfig = getPayloadConfigFromPayload(config, item, key)
189
+ const indicatorColor = color || item.payload.fill || item.color
190
+
191
+ return (
192
+ <div
193
+ key={item.dataKey}
194
+ className={cn(
195
+ "flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground",
196
+ indicator === "dot" && "items-center"
197
+ )}
198
+ >
199
+ {formatter && item?.value !== undefined && item.name ? (
200
+ formatter(item.value, item.name, item, index, item.payload)
201
+ ) : (
202
+ <>
203
+ {itemConfig?.icon ? (
204
+ <itemConfig.icon />
205
+ ) : (
206
+ !hideIndicator && (
207
+ <div
208
+ className={cn(
209
+ "shrink-0 rounded-[2px] border-[--color-border] bg-[--color-bg]",
210
+ {
211
+ "h-2.5 w-2.5": indicator === "dot",
212
+ "w-1": indicator === "line",
213
+ "w-0 border-[1.5px] border-dashed bg-transparent":
214
+ indicator === "dashed",
215
+ "my-0.5": nestLabel && indicator === "dashed",
216
+ }
217
+ )}
218
+ style={
219
+ {
220
+ "--color-bg": indicatorColor,
221
+ "--color-border": indicatorColor,
222
+ } as React.CSSProperties
223
+ }
224
+ />
225
+ )
226
+ )}
227
+ <div
228
+ className={cn(
229
+ "flex flex-1 justify-between leading-none",
230
+ nestLabel ? "items-end" : "items-center"
231
+ )}
232
+ >
233
+ <div className="grid gap-1.5">
234
+ {nestLabel ? tooltipLabel : null}
235
+ <span className="text-muted-foreground">
236
+ {itemConfig?.label || item.name}
237
+ </span>
238
+ </div>
239
+ {item.value && (
240
+ <span className="font-mono font-medium tabular-nums text-foreground">
241
+ {item.value.toLocaleString()}
242
+ </span>
243
+ )}
244
+ </div>
245
+ </>
246
+ )}
247
+ </div>
248
+ )
249
+ })}
250
+ </div>
251
+ </div>
252
+ )
253
+ }
254
+ )
255
+ ChartTooltipContent.displayName = "ChartTooltip"
256
+
257
+ const ChartLegend = RechartsPrimitive.Legend
258
+
259
+ const ChartLegendContent = React.forwardRef<
260
+ HTMLDivElement,
261
+ React.ComponentProps<"div"> &
262
+ Pick<RechartsPrimitive.LegendProps, "payload" | "verticalAlign"> & {
263
+ hideIcon?: boolean
264
+ nameKey?: string
265
+ }
266
+ >(
267
+ (
268
+ { className, hideIcon = false, payload, verticalAlign = "bottom", nameKey },
269
+ ref
270
+ ) => {
271
+ const { config } = useChart()
272
+
273
+ if (!payload?.length) {
274
+ return null
275
+ }
276
+
277
+ return (
278
+ <div
279
+ ref={ref}
280
+ className={cn(
281
+ "flex items-center justify-center gap-4",
282
+ verticalAlign === "top" ? "pb-3" : "pt-3",
283
+ className
284
+ )}
285
+ >
286
+ {payload.map((item) => {
287
+ const key = `${nameKey || item.dataKey || "value"}`
288
+ const itemConfig = getPayloadConfigFromPayload(config, item, key)
289
+
290
+ return (
291
+ <div
292
+ key={item.value}
293
+ className={cn(
294
+ "flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground"
295
+ )}
296
+ >
297
+ {itemConfig?.icon && !hideIcon ? (
298
+ <itemConfig.icon />
299
+ ) : (
300
+ <div
301
+ className="h-2 w-2 shrink-0 rounded-[2px]"
302
+ style={{
303
+ backgroundColor: item.color,
304
+ }}
305
+ />
306
+ )}
307
+ {itemConfig?.label}
308
+ </div>
309
+ )
310
+ })}
311
+ </div>
312
+ )
313
+ }
314
+ )
315
+ ChartLegendContent.displayName = "ChartLegend"
316
+
317
+ // Helper to extract item config from a payload.
318
+ function getPayloadConfigFromPayload(
319
+ config: ChartConfig,
320
+ payload: unknown,
321
+ key: string
322
+ ) {
323
+ if (typeof payload !== "object" || payload === null) {
324
+ return undefined
325
+ }
326
+
327
+ const payloadPayload =
328
+ "payload" in payload &&
329
+ typeof payload.payload === "object" &&
330
+ payload.payload !== null
331
+ ? payload.payload
332
+ : undefined
333
+
334
+ let configLabelKey: string = key
335
+
336
+ if (
337
+ key in payload &&
338
+ typeof payload[key as keyof typeof payload] === "string"
339
+ ) {
340
+ configLabelKey = payload[key as keyof typeof payload] as string
341
+ } else if (
342
+ payloadPayload &&
343
+ key in payloadPayload &&
344
+ typeof payloadPayload[key as keyof typeof payloadPayload] === "string"
345
+ ) {
346
+ configLabelKey = payloadPayload[
347
+ key as keyof typeof payloadPayload
348
+ ] as string
349
+ }
350
+
351
+ return configLabelKey in config
352
+ ? config[configLabelKey]
353
+ : config[key as keyof typeof config]
354
+ }
355
+
356
+ export {
357
+ ChartContainer,
358
+ ChartTooltip,
359
+ ChartTooltipContent,
360
+ ChartLegend,
361
+ ChartLegendContent,
362
+ ChartStyle,
363
+ }
package-lock.json CHANGED
@@ -8,14 +8,16 @@
8
  "name": "next-template",
9
  "version": "0.0.2",
10
  "dependencies": {
 
11
  "@radix-ui/react-slot": "^1.0.2",
12
  "class-variance-authority": "^0.4.0",
13
  "clsx": "^1.2.1",
14
- "lucide-react": "0.105.0-alpha.4",
15
  "next": "^13.4.8",
16
  "next-themes": "^0.2.1",
17
  "react": "^18.2.0",
18
  "react-dom": "^18.2.0",
 
19
  "sharp": "^0.31.3",
20
  "tailwind-merge": "^1.13.2",
21
  "tailwindcss-animate": "^1.0.6"
@@ -38,6 +40,26 @@
38
  "typescript": "^4.9.5"
39
  }
40
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41
  "node_modules/@alloc/quick-lru": {
42
  "version": "5.2.0",
43
  "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
@@ -306,6 +328,17 @@
306
  "node": ">=6.0.0"
307
  }
308
  },
 
 
 
 
 
 
 
 
 
 
 
309
  "node_modules/@babel/template": {
310
  "version": "7.24.7",
311
  "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz",
@@ -355,6 +388,14 @@
355
  "node": ">=6.9.0"
356
  }
357
  },
 
 
 
 
 
 
 
 
358
  "node_modules/@eslint-community/eslint-utils": {
359
  "version": "4.4.0",
360
  "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
@@ -805,6 +846,70 @@
805
  "tslib": "^2.4.0"
806
  }
807
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
808
  "node_modules/@types/json5": {
809
  "version": "0.0.29",
810
  "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
@@ -817,6 +922,11 @@
817
  "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==",
818
  "dev": true
819
  },
 
 
 
 
 
820
  "node_modules/@types/prop-types": {
821
  "version": "15.7.12",
822
  "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz",
@@ -1035,6 +1145,31 @@
1035
  "node": ">= 8"
1036
  }
1037
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1038
  "node_modules/arg": {
1039
  "version": "5.0.2",
1040
  "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
@@ -1055,6 +1190,14 @@
1055
  "deep-equal": "^2.0.5"
1056
  }
1057
  },
 
 
 
 
 
 
 
 
1058
  "node_modules/array-buffer-byte-length": {
1059
  "version": "1.0.1",
1060
  "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz",
@@ -1491,6 +1634,84 @@
1491
  "node": ">=4"
1492
  }
1493
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1494
  "node_modules/chokidar": {
1495
  "version": "3.6.0",
1496
  "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
@@ -1610,6 +1831,50 @@
1610
  "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
1611
  "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
1612
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1613
  "node_modules/commander": {
1614
  "version": "4.1.1",
1615
  "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
@@ -1657,8 +1922,117 @@
1657
  "node_modules/csstype": {
1658
  "version": "3.1.3",
1659
  "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
1660
- "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
1661
- "devOptional": true
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1662
  },
1663
  "node_modules/damerau-levenshtein": {
1664
  "version": "1.0.8",
@@ -1734,6 +2108,11 @@
1734
  }
1735
  }
1736
  },
 
 
 
 
 
1737
  "node_modules/decompress-response": {
1738
  "version": "6.0.0",
1739
  "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
@@ -1870,6 +2249,15 @@
1870
  "node": ">=6.0.0"
1871
  }
1872
  },
 
 
 
 
 
 
 
 
 
1873
  "node_modules/eastasianwidth": {
1874
  "version": "0.2.0",
1875
  "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
@@ -2625,6 +3013,11 @@
2625
  "node": ">=0.10.0"
2626
  }
2627
  },
 
 
 
 
 
2628
  "node_modules/expand-template": {
2629
  "version": "2.0.3",
2630
  "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
@@ -2639,6 +3032,14 @@
2639
  "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
2640
  "dev": true
2641
  },
 
 
 
 
 
 
 
 
2642
  "node_modules/fast-glob": {
2643
  "version": "3.3.2",
2644
  "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
@@ -2708,6 +3109,17 @@
2708
  "node": ">=8"
2709
  }
2710
  },
 
 
 
 
 
 
 
 
 
 
 
2711
  "node_modules/find-up": {
2712
  "version": "5.0.0",
2713
  "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
@@ -2738,6 +3150,11 @@
2738
  "node": "^10.12.0 || >=12.0.0"
2739
  }
2740
  },
 
 
 
 
 
2741
  "node_modules/flatted": {
2742
  "version": "3.3.1",
2743
  "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
@@ -3163,6 +3580,14 @@
3163
  "node": ">= 0.4"
3164
  }
3165
  },
 
 
 
 
 
 
 
 
3166
  "node_modules/is-arguments": {
3167
  "version": "1.1.1",
3168
  "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
@@ -3629,6 +4054,14 @@
3629
  "node": ">=4"
3630
  }
3631
  },
 
 
 
 
 
 
 
 
3632
  "node_modules/json-buffer": {
3633
  "version": "3.0.1",
3634
  "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
@@ -3742,6 +4175,21 @@
3742
  "url": "https://github.com/sponsors/sindresorhus"
3743
  }
3744
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3745
  "node_modules/lodash.clone": {
3746
  "version": "4.5.0",
3747
  "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz",
@@ -4222,6 +4670,17 @@
4222
  "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz",
4223
  "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw=="
4224
  },
 
 
 
 
 
 
 
 
 
 
 
4225
  "node_modules/parent-module": {
4226
  "version": "1.0.1",
4227
  "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -4535,7 +4994,6 @@
4535
  "version": "15.8.1",
4536
  "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
4537
  "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
4538
- "dev": true,
4539
  "dependencies": {
4540
  "loose-envify": "^1.4.0",
4541
  "object-assign": "^4.1.1",
@@ -4627,8 +5085,36 @@
4627
  "node_modules/react-is": {
4628
  "version": "16.13.1",
4629
  "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
4630
- "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
4631
- "dev": true
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4632
  },
4633
  "node_modules/read-cache": {
4634
  "version": "1.0.0",
@@ -4662,6 +5148,44 @@
4662
  "node": ">=8.10.0"
4663
  }
4664
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4665
  "node_modules/reflect.getprototypeof": {
4666
  "version": "1.0.6",
4667
  "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz",
@@ -4683,6 +5207,11 @@
4683
  "url": "https://github.com/sponsors/ljharb"
4684
  }
4685
  },
 
 
 
 
 
4686
  "node_modules/regexp.prototype.flags": {
4687
  "version": "1.5.2",
4688
  "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz",
@@ -4701,6 +5230,14 @@
4701
  "url": "https://github.com/sponsors/ljharb"
4702
  }
4703
  },
 
 
 
 
 
 
 
 
4704
  "node_modules/resolve": {
4705
  "version": "1.22.8",
4706
  "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
@@ -5037,6 +5574,14 @@
5037
  "node": ">= 0.4"
5038
  }
5039
  },
 
 
 
 
 
 
 
 
5040
  "node_modules/streamsearch": {
5041
  "version": "1.1.0",
5042
  "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
@@ -5359,6 +5904,42 @@
5359
  "url": "https://github.com/sponsors/ljharb"
5360
  }
5361
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5362
  "node_modules/tailwind-merge": {
5363
  "version": "1.14.0",
5364
  "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-1.14.0.tgz",
@@ -5463,6 +6044,11 @@
5463
  "node": ">=0.8"
5464
  }
5465
  },
 
 
 
 
 
5466
  "node_modules/to-fast-properties": {
5467
  "version": "2.0.0",
5468
  "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
@@ -5659,6 +6245,14 @@
5659
  "node": ">=4.2.0"
5660
  }
5661
  },
 
 
 
 
 
 
 
 
5662
  "node_modules/unbox-primitive": {
5663
  "version": "1.0.2",
5664
  "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
@@ -5718,6 +6312,27 @@
5718
  "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
5719
  "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
5720
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5721
  "node_modules/watchpack": {
5722
  "version": "2.4.0",
5723
  "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
@@ -5832,6 +6447,14 @@
5832
  "node": ">=0.10.0"
5833
  }
5834
  },
 
 
 
 
 
 
 
 
5835
  "node_modules/wrap-ansi": {
5836
  "version": "8.1.0",
5837
  "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
 
8
  "name": "next-template",
9
  "version": "0.0.2",
10
  "dependencies": {
11
+ "@duckdb/duckdb-wasm": "^1.28.1-dev106.0",
12
  "@radix-ui/react-slot": "^1.0.2",
13
  "class-variance-authority": "^0.4.0",
14
  "clsx": "^1.2.1",
15
+ "lucide-react": "^0.105.0-alpha.4",
16
  "next": "^13.4.8",
17
  "next-themes": "^0.2.1",
18
  "react": "^18.2.0",
19
  "react-dom": "^18.2.0",
20
+ "recharts": "^2.12.7",
21
  "sharp": "^0.31.3",
22
  "tailwind-merge": "^1.13.2",
23
  "tailwindcss-animate": "^1.0.6"
 
40
  "typescript": "^4.9.5"
41
  }
42
  },
43
+ "node_modules/@75lb/deep-merge": {
44
+ "version": "1.1.1",
45
+ "resolved": "https://registry.npmjs.org/@75lb/deep-merge/-/deep-merge-1.1.1.tgz",
46
+ "integrity": "sha512-xvgv6pkMGBA6GwdyJbNAnDmfAIR/DfWhrj9jgWh3TY7gRm3KO46x/GPjRg6wJ0nOepwqrNxFfojebh0Df4h4Tw==",
47
+ "dependencies": {
48
+ "lodash.assignwith": "^4.2.0",
49
+ "typical": "^7.1.1"
50
+ },
51
+ "engines": {
52
+ "node": ">=12.17"
53
+ }
54
+ },
55
+ "node_modules/@75lb/deep-merge/node_modules/typical": {
56
+ "version": "7.1.1",
57
+ "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz",
58
+ "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==",
59
+ "engines": {
60
+ "node": ">=12.17"
61
+ }
62
+ },
63
  "node_modules/@alloc/quick-lru": {
64
  "version": "5.2.0",
65
  "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
 
328
  "node": ">=6.0.0"
329
  }
330
  },
331
+ "node_modules/@babel/runtime": {
332
+ "version": "7.24.8",
333
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz",
334
+ "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==",
335
+ "dependencies": {
336
+ "regenerator-runtime": "^0.14.0"
337
+ },
338
+ "engines": {
339
+ "node": ">=6.9.0"
340
+ }
341
+ },
342
  "node_modules/@babel/template": {
343
  "version": "7.24.7",
344
  "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz",
 
388
  "node": ">=6.9.0"
389
  }
390
  },
391
+ "node_modules/@duckdb/duckdb-wasm": {
392
+ "version": "1.28.1-dev106.0",
393
+ "resolved": "https://registry.npmjs.org/@duckdb/duckdb-wasm/-/duckdb-wasm-1.28.1-dev106.0.tgz",
394
+ "integrity": "sha512-HcA9q/Yq1t8nAIg2rl8DmOTjKy1tAHSdBGHlCcWAm5StsfAjcm+f0STBEH3hmWPk0qEtOJF30OR+GfeyUOP+hA==",
395
+ "dependencies": {
396
+ "apache-arrow": "^14.0.1"
397
+ }
398
+ },
399
  "node_modules/@eslint-community/eslint-utils": {
400
  "version": "4.4.0",
401
  "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
 
846
  "tslib": "^2.4.0"
847
  }
848
  },
849
+ "node_modules/@types/command-line-args": {
850
+ "version": "5.2.0",
851
+ "resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.0.tgz",
852
+ "integrity": "sha512-UuKzKpJJ/Ief6ufIaIzr3A/0XnluX7RvFgwkV89Yzvm77wCh1kFaFmqN8XEnGcN62EuHdedQjEMb8mYxFLGPyA=="
853
+ },
854
+ "node_modules/@types/command-line-usage": {
855
+ "version": "5.0.2",
856
+ "resolved": "https://registry.npmjs.org/@types/command-line-usage/-/command-line-usage-5.0.2.tgz",
857
+ "integrity": "sha512-n7RlEEJ+4x4TS7ZQddTmNSxP+zziEG0TNsMfiRIxcIVXt71ENJ9ojeXmGO3wPoTdn7pJcU2xc3CJYMktNT6DPg=="
858
+ },
859
+ "node_modules/@types/d3-array": {
860
+ "version": "3.2.1",
861
+ "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz",
862
+ "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg=="
863
+ },
864
+ "node_modules/@types/d3-color": {
865
+ "version": "3.1.3",
866
+ "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz",
867
+ "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A=="
868
+ },
869
+ "node_modules/@types/d3-ease": {
870
+ "version": "3.0.2",
871
+ "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz",
872
+ "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA=="
873
+ },
874
+ "node_modules/@types/d3-interpolate": {
875
+ "version": "3.0.4",
876
+ "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz",
877
+ "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==",
878
+ "dependencies": {
879
+ "@types/d3-color": "*"
880
+ }
881
+ },
882
+ "node_modules/@types/d3-path": {
883
+ "version": "3.1.0",
884
+ "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz",
885
+ "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ=="
886
+ },
887
+ "node_modules/@types/d3-scale": {
888
+ "version": "4.0.8",
889
+ "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz",
890
+ "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==",
891
+ "dependencies": {
892
+ "@types/d3-time": "*"
893
+ }
894
+ },
895
+ "node_modules/@types/d3-shape": {
896
+ "version": "3.1.6",
897
+ "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz",
898
+ "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==",
899
+ "dependencies": {
900
+ "@types/d3-path": "*"
901
+ }
902
+ },
903
+ "node_modules/@types/d3-time": {
904
+ "version": "3.0.3",
905
+ "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz",
906
+ "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw=="
907
+ },
908
+ "node_modules/@types/d3-timer": {
909
+ "version": "3.0.2",
910
+ "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz",
911
+ "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw=="
912
+ },
913
  "node_modules/@types/json5": {
914
  "version": "0.0.29",
915
  "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
 
922
  "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==",
923
  "dev": true
924
  },
925
+ "node_modules/@types/pad-left": {
926
+ "version": "2.1.1",
927
+ "resolved": "https://registry.npmjs.org/@types/pad-left/-/pad-left-2.1.1.tgz",
928
+ "integrity": "sha512-Xd22WCRBydkGSApl5Bw0PhAOHKSVjNL3E3AwzKaps96IMraPqy5BvZIsBVK6JLwdybUzjHnuWVwpDd0JjTfHXA=="
929
+ },
930
  "node_modules/@types/prop-types": {
931
  "version": "15.7.12",
932
  "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz",
 
1145
  "node": ">= 8"
1146
  }
1147
  },
1148
+ "node_modules/apache-arrow": {
1149
+ "version": "14.0.2",
1150
+ "resolved": "https://registry.npmjs.org/apache-arrow/-/apache-arrow-14.0.2.tgz",
1151
+ "integrity": "sha512-EBO2xJN36/XoY81nhLcwCJgFwkboDZeyNQ+OPsG7bCoQjc2BT0aTyH/MR6SrL+LirSNz+cYqjGRlupMMlP1aEg==",
1152
+ "dependencies": {
1153
+ "@types/command-line-args": "5.2.0",
1154
+ "@types/command-line-usage": "5.0.2",
1155
+ "@types/node": "20.3.0",
1156
+ "@types/pad-left": "2.1.1",
1157
+ "command-line-args": "5.2.1",
1158
+ "command-line-usage": "7.0.1",
1159
+ "flatbuffers": "23.5.26",
1160
+ "json-bignum": "^0.0.3",
1161
+ "pad-left": "^2.1.0",
1162
+ "tslib": "^2.5.3"
1163
+ },
1164
+ "bin": {
1165
+ "arrow2csv": "bin/arrow2csv.js"
1166
+ }
1167
+ },
1168
+ "node_modules/apache-arrow/node_modules/@types/node": {
1169
+ "version": "20.3.0",
1170
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.0.tgz",
1171
+ "integrity": "sha512-cumHmIAf6On83X7yP+LrsEyUOf/YlociZelmpRYaGFydoaPdxdt80MAbu6vWerQT2COCp2nPvHdsbD7tHn/YlQ=="
1172
+ },
1173
  "node_modules/arg": {
1174
  "version": "5.0.2",
1175
  "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
 
1190
  "deep-equal": "^2.0.5"
1191
  }
1192
  },
1193
+ "node_modules/array-back": {
1194
+ "version": "3.1.0",
1195
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz",
1196
+ "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==",
1197
+ "engines": {
1198
+ "node": ">=6"
1199
+ }
1200
+ },
1201
  "node_modules/array-buffer-byte-length": {
1202
  "version": "1.0.1",
1203
  "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz",
 
1634
  "node": ">=4"
1635
  }
1636
  },
1637
+ "node_modules/chalk-template": {
1638
+ "version": "0.4.0",
1639
+ "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz",
1640
+ "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==",
1641
+ "dependencies": {
1642
+ "chalk": "^4.1.2"
1643
+ },
1644
+ "engines": {
1645
+ "node": ">=12"
1646
+ },
1647
+ "funding": {
1648
+ "url": "https://github.com/chalk/chalk-template?sponsor=1"
1649
+ }
1650
+ },
1651
+ "node_modules/chalk-template/node_modules/ansi-styles": {
1652
+ "version": "4.3.0",
1653
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
1654
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
1655
+ "dependencies": {
1656
+ "color-convert": "^2.0.1"
1657
+ },
1658
+ "engines": {
1659
+ "node": ">=8"
1660
+ },
1661
+ "funding": {
1662
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
1663
+ }
1664
+ },
1665
+ "node_modules/chalk-template/node_modules/chalk": {
1666
+ "version": "4.1.2",
1667
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
1668
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
1669
+ "dependencies": {
1670
+ "ansi-styles": "^4.1.0",
1671
+ "supports-color": "^7.1.0"
1672
+ },
1673
+ "engines": {
1674
+ "node": ">=10"
1675
+ },
1676
+ "funding": {
1677
+ "url": "https://github.com/chalk/chalk?sponsor=1"
1678
+ }
1679
+ },
1680
+ "node_modules/chalk-template/node_modules/color-convert": {
1681
+ "version": "2.0.1",
1682
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
1683
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
1684
+ "dependencies": {
1685
+ "color-name": "~1.1.4"
1686
+ },
1687
+ "engines": {
1688
+ "node": ">=7.0.0"
1689
+ }
1690
+ },
1691
+ "node_modules/chalk-template/node_modules/color-name": {
1692
+ "version": "1.1.4",
1693
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
1694
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
1695
+ },
1696
+ "node_modules/chalk-template/node_modules/has-flag": {
1697
+ "version": "4.0.0",
1698
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
1699
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
1700
+ "engines": {
1701
+ "node": ">=8"
1702
+ }
1703
+ },
1704
+ "node_modules/chalk-template/node_modules/supports-color": {
1705
+ "version": "7.2.0",
1706
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
1707
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
1708
+ "dependencies": {
1709
+ "has-flag": "^4.0.0"
1710
+ },
1711
+ "engines": {
1712
+ "node": ">=8"
1713
+ }
1714
+ },
1715
  "node_modules/chokidar": {
1716
  "version": "3.6.0",
1717
  "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
 
1831
  "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
1832
  "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
1833
  },
1834
+ "node_modules/command-line-args": {
1835
+ "version": "5.2.1",
1836
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz",
1837
+ "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==",
1838
+ "dependencies": {
1839
+ "array-back": "^3.1.0",
1840
+ "find-replace": "^3.0.0",
1841
+ "lodash.camelcase": "^4.3.0",
1842
+ "typical": "^4.0.0"
1843
+ },
1844
+ "engines": {
1845
+ "node": ">=4.0.0"
1846
+ }
1847
+ },
1848
+ "node_modules/command-line-usage": {
1849
+ "version": "7.0.1",
1850
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.1.tgz",
1851
+ "integrity": "sha512-NCyznE//MuTjwi3y84QVUGEOT+P5oto1e1Pk/jFPVdPPfsG03qpTIl3yw6etR+v73d0lXsoojRpvbru2sqePxQ==",
1852
+ "dependencies": {
1853
+ "array-back": "^6.2.2",
1854
+ "chalk-template": "^0.4.0",
1855
+ "table-layout": "^3.0.0",
1856
+ "typical": "^7.1.1"
1857
+ },
1858
+ "engines": {
1859
+ "node": ">=12.20.0"
1860
+ }
1861
+ },
1862
+ "node_modules/command-line-usage/node_modules/array-back": {
1863
+ "version": "6.2.2",
1864
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz",
1865
+ "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==",
1866
+ "engines": {
1867
+ "node": ">=12.17"
1868
+ }
1869
+ },
1870
+ "node_modules/command-line-usage/node_modules/typical": {
1871
+ "version": "7.1.1",
1872
+ "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz",
1873
+ "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==",
1874
+ "engines": {
1875
+ "node": ">=12.17"
1876
+ }
1877
+ },
1878
  "node_modules/commander": {
1879
  "version": "4.1.1",
1880
  "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
 
1922
  "node_modules/csstype": {
1923
  "version": "3.1.3",
1924
  "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
1925
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
1926
+ },
1927
+ "node_modules/d3-array": {
1928
+ "version": "3.2.4",
1929
+ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz",
1930
+ "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==",
1931
+ "dependencies": {
1932
+ "internmap": "1 - 2"
1933
+ },
1934
+ "engines": {
1935
+ "node": ">=12"
1936
+ }
1937
+ },
1938
+ "node_modules/d3-color": {
1939
+ "version": "3.1.0",
1940
+ "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
1941
+ "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==",
1942
+ "engines": {
1943
+ "node": ">=12"
1944
+ }
1945
+ },
1946
+ "node_modules/d3-ease": {
1947
+ "version": "3.0.1",
1948
+ "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
1949
+ "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==",
1950
+ "engines": {
1951
+ "node": ">=12"
1952
+ }
1953
+ },
1954
+ "node_modules/d3-format": {
1955
+ "version": "3.1.0",
1956
+ "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz",
1957
+ "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==",
1958
+ "engines": {
1959
+ "node": ">=12"
1960
+ }
1961
+ },
1962
+ "node_modules/d3-interpolate": {
1963
+ "version": "3.0.1",
1964
+ "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
1965
+ "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
1966
+ "dependencies": {
1967
+ "d3-color": "1 - 3"
1968
+ },
1969
+ "engines": {
1970
+ "node": ">=12"
1971
+ }
1972
+ },
1973
+ "node_modules/d3-path": {
1974
+ "version": "3.1.0",
1975
+ "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz",
1976
+ "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==",
1977
+ "engines": {
1978
+ "node": ">=12"
1979
+ }
1980
+ },
1981
+ "node_modules/d3-scale": {
1982
+ "version": "4.0.2",
1983
+ "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",
1984
+ "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
1985
+ "dependencies": {
1986
+ "d3-array": "2.10.0 - 3",
1987
+ "d3-format": "1 - 3",
1988
+ "d3-interpolate": "1.2.0 - 3",
1989
+ "d3-time": "2.1.1 - 3",
1990
+ "d3-time-format": "2 - 4"
1991
+ },
1992
+ "engines": {
1993
+ "node": ">=12"
1994
+ }
1995
+ },
1996
+ "node_modules/d3-shape": {
1997
+ "version": "3.2.0",
1998
+ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz",
1999
+ "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==",
2000
+ "dependencies": {
2001
+ "d3-path": "^3.1.0"
2002
+ },
2003
+ "engines": {
2004
+ "node": ">=12"
2005
+ }
2006
+ },
2007
+ "node_modules/d3-time": {
2008
+ "version": "3.1.0",
2009
+ "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz",
2010
+ "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",
2011
+ "dependencies": {
2012
+ "d3-array": "2 - 3"
2013
+ },
2014
+ "engines": {
2015
+ "node": ">=12"
2016
+ }
2017
+ },
2018
+ "node_modules/d3-time-format": {
2019
+ "version": "4.1.0",
2020
+ "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",
2021
+ "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
2022
+ "dependencies": {
2023
+ "d3-time": "1 - 3"
2024
+ },
2025
+ "engines": {
2026
+ "node": ">=12"
2027
+ }
2028
+ },
2029
+ "node_modules/d3-timer": {
2030
+ "version": "3.0.1",
2031
+ "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
2032
+ "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==",
2033
+ "engines": {
2034
+ "node": ">=12"
2035
+ }
2036
  },
2037
  "node_modules/damerau-levenshtein": {
2038
  "version": "1.0.8",
 
2108
  }
2109
  }
2110
  },
2111
+ "node_modules/decimal.js-light": {
2112
+ "version": "2.5.1",
2113
+ "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz",
2114
+ "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg=="
2115
+ },
2116
  "node_modules/decompress-response": {
2117
  "version": "6.0.0",
2118
  "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
 
2249
  "node": ">=6.0.0"
2250
  }
2251
  },
2252
+ "node_modules/dom-helpers": {
2253
+ "version": "5.2.1",
2254
+ "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
2255
+ "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
2256
+ "dependencies": {
2257
+ "@babel/runtime": "^7.8.7",
2258
+ "csstype": "^3.0.2"
2259
+ }
2260
+ },
2261
  "node_modules/eastasianwidth": {
2262
  "version": "0.2.0",
2263
  "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
 
3013
  "node": ">=0.10.0"
3014
  }
3015
  },
3016
+ "node_modules/eventemitter3": {
3017
+ "version": "4.0.7",
3018
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
3019
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="
3020
+ },
3021
  "node_modules/expand-template": {
3022
  "version": "2.0.3",
3023
  "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
 
3032
  "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
3033
  "dev": true
3034
  },
3035
+ "node_modules/fast-equals": {
3036
+ "version": "5.0.1",
3037
+ "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.0.1.tgz",
3038
+ "integrity": "sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==",
3039
+ "engines": {
3040
+ "node": ">=6.0.0"
3041
+ }
3042
+ },
3043
  "node_modules/fast-glob": {
3044
  "version": "3.3.2",
3045
  "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
 
3109
  "node": ">=8"
3110
  }
3111
  },
3112
+ "node_modules/find-replace": {
3113
+ "version": "3.0.0",
3114
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz",
3115
+ "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==",
3116
+ "dependencies": {
3117
+ "array-back": "^3.0.1"
3118
+ },
3119
+ "engines": {
3120
+ "node": ">=4.0.0"
3121
+ }
3122
+ },
3123
  "node_modules/find-up": {
3124
  "version": "5.0.0",
3125
  "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
 
3150
  "node": "^10.12.0 || >=12.0.0"
3151
  }
3152
  },
3153
+ "node_modules/flatbuffers": {
3154
+ "version": "23.5.26",
3155
+ "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-23.5.26.tgz",
3156
+ "integrity": "sha512-vE+SI9vrJDwi1oETtTIFldC/o9GsVKRM+s6EL0nQgxXlYV1Vc4Tk30hj4xGICftInKQKj1F3up2n8UbIVobISQ=="
3157
+ },
3158
  "node_modules/flatted": {
3159
  "version": "3.3.1",
3160
  "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
 
3580
  "node": ">= 0.4"
3581
  }
3582
  },
3583
+ "node_modules/internmap": {
3584
+ "version": "2.0.3",
3585
+ "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
3586
+ "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==",
3587
+ "engines": {
3588
+ "node": ">=12"
3589
+ }
3590
+ },
3591
  "node_modules/is-arguments": {
3592
  "version": "1.1.1",
3593
  "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
 
4054
  "node": ">=4"
4055
  }
4056
  },
4057
+ "node_modules/json-bignum": {
4058
+ "version": "0.0.3",
4059
+ "resolved": "https://registry.npmjs.org/json-bignum/-/json-bignum-0.0.3.tgz",
4060
+ "integrity": "sha512-2WHyXj3OfHSgNyuzDbSxI1w2jgw5gkWSWhS7Qg4bWXx1nLk3jnbwfUeS0PSba3IzpTUWdHxBieELUzXRjQB2zg==",
4061
+ "engines": {
4062
+ "node": ">=0.8"
4063
+ }
4064
+ },
4065
  "node_modules/json-buffer": {
4066
  "version": "3.0.1",
4067
  "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
 
4175
  "url": "https://github.com/sponsors/sindresorhus"
4176
  }
4177
  },
4178
+ "node_modules/lodash": {
4179
+ "version": "4.17.21",
4180
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
4181
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
4182
+ },
4183
+ "node_modules/lodash.assignwith": {
4184
+ "version": "4.2.0",
4185
+ "resolved": "https://registry.npmjs.org/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz",
4186
+ "integrity": "sha512-ZznplvbvtjK2gMvnQ1BR/zqPFZmS6jbK4p+6Up4xcRYA7yMIwxHCfbTcrYxXKzzqLsQ05eJPVznEW3tuwV7k1g=="
4187
+ },
4188
+ "node_modules/lodash.camelcase": {
4189
+ "version": "4.3.0",
4190
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
4191
+ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
4192
+ },
4193
  "node_modules/lodash.clone": {
4194
  "version": "4.5.0",
4195
  "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz",
 
4670
  "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz",
4671
  "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw=="
4672
  },
4673
+ "node_modules/pad-left": {
4674
+ "version": "2.1.0",
4675
+ "resolved": "https://registry.npmjs.org/pad-left/-/pad-left-2.1.0.tgz",
4676
+ "integrity": "sha512-HJxs9K9AztdIQIAIa/OIazRAUW/L6B9hbQDxO4X07roW3eo9XqZc2ur9bn1StH9CnbbI9EgvejHQX7CBpCF1QA==",
4677
+ "dependencies": {
4678
+ "repeat-string": "^1.5.4"
4679
+ },
4680
+ "engines": {
4681
+ "node": ">=0.10.0"
4682
+ }
4683
+ },
4684
  "node_modules/parent-module": {
4685
  "version": "1.0.1",
4686
  "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
 
4994
  "version": "15.8.1",
4995
  "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
4996
  "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
 
4997
  "dependencies": {
4998
  "loose-envify": "^1.4.0",
4999
  "object-assign": "^4.1.1",
 
5085
  "node_modules/react-is": {
5086
  "version": "16.13.1",
5087
  "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
5088
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
5089
+ },
5090
+ "node_modules/react-smooth": {
5091
+ "version": "4.0.1",
5092
+ "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.1.tgz",
5093
+ "integrity": "sha512-OE4hm7XqR0jNOq3Qmk9mFLyd6p2+j6bvbPJ7qlB7+oo0eNcL2l7WQzG6MBnT3EXY6xzkLMUBec3AfewJdA0J8w==",
5094
+ "dependencies": {
5095
+ "fast-equals": "^5.0.1",
5096
+ "prop-types": "^15.8.1",
5097
+ "react-transition-group": "^4.4.5"
5098
+ },
5099
+ "peerDependencies": {
5100
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
5101
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
5102
+ }
5103
+ },
5104
+ "node_modules/react-transition-group": {
5105
+ "version": "4.4.5",
5106
+ "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
5107
+ "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
5108
+ "dependencies": {
5109
+ "@babel/runtime": "^7.5.5",
5110
+ "dom-helpers": "^5.0.1",
5111
+ "loose-envify": "^1.4.0",
5112
+ "prop-types": "^15.6.2"
5113
+ },
5114
+ "peerDependencies": {
5115
+ "react": ">=16.6.0",
5116
+ "react-dom": ">=16.6.0"
5117
+ }
5118
  },
5119
  "node_modules/read-cache": {
5120
  "version": "1.0.0",
 
5148
  "node": ">=8.10.0"
5149
  }
5150
  },
5151
+ "node_modules/recharts": {
5152
+ "version": "2.12.7",
5153
+ "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.12.7.tgz",
5154
+ "integrity": "sha512-hlLJMhPQfv4/3NBSAyq3gzGg4h2v69RJh6KU7b3pXYNNAELs9kEoXOjbkxdXpALqKBoVmVptGfLpxdaVYqjmXQ==",
5155
+ "dependencies": {
5156
+ "clsx": "^2.0.0",
5157
+ "eventemitter3": "^4.0.1",
5158
+ "lodash": "^4.17.21",
5159
+ "react-is": "^16.10.2",
5160
+ "react-smooth": "^4.0.0",
5161
+ "recharts-scale": "^0.4.4",
5162
+ "tiny-invariant": "^1.3.1",
5163
+ "victory-vendor": "^36.6.8"
5164
+ },
5165
+ "engines": {
5166
+ "node": ">=14"
5167
+ },
5168
+ "peerDependencies": {
5169
+ "react": "^16.0.0 || ^17.0.0 || ^18.0.0",
5170
+ "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0"
5171
+ }
5172
+ },
5173
+ "node_modules/recharts-scale": {
5174
+ "version": "0.4.5",
5175
+ "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz",
5176
+ "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==",
5177
+ "dependencies": {
5178
+ "decimal.js-light": "^2.4.1"
5179
+ }
5180
+ },
5181
+ "node_modules/recharts/node_modules/clsx": {
5182
+ "version": "2.1.1",
5183
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
5184
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
5185
+ "engines": {
5186
+ "node": ">=6"
5187
+ }
5188
+ },
5189
  "node_modules/reflect.getprototypeof": {
5190
  "version": "1.0.6",
5191
  "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz",
 
5207
  "url": "https://github.com/sponsors/ljharb"
5208
  }
5209
  },
5210
+ "node_modules/regenerator-runtime": {
5211
+ "version": "0.14.1",
5212
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
5213
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
5214
+ },
5215
  "node_modules/regexp.prototype.flags": {
5216
  "version": "1.5.2",
5217
  "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz",
 
5230
  "url": "https://github.com/sponsors/ljharb"
5231
  }
5232
  },
5233
+ "node_modules/repeat-string": {
5234
+ "version": "1.6.1",
5235
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
5236
+ "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==",
5237
+ "engines": {
5238
+ "node": ">=0.10"
5239
+ }
5240
+ },
5241
  "node_modules/resolve": {
5242
  "version": "1.22.8",
5243
  "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
 
5574
  "node": ">= 0.4"
5575
  }
5576
  },
5577
+ "node_modules/stream-read-all": {
5578
+ "version": "3.0.1",
5579
+ "resolved": "https://registry.npmjs.org/stream-read-all/-/stream-read-all-3.0.1.tgz",
5580
+ "integrity": "sha512-EWZT9XOceBPlVJRrYcykW8jyRSZYbkb/0ZK36uLEmoWVO5gxBOnntNTseNzfREsqxqdfEGQrD8SXQ3QWbBmq8A==",
5581
+ "engines": {
5582
+ "node": ">=10"
5583
+ }
5584
+ },
5585
  "node_modules/streamsearch": {
5586
  "version": "1.1.0",
5587
  "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
 
5904
  "url": "https://github.com/sponsors/ljharb"
5905
  }
5906
  },
5907
+ "node_modules/table-layout": {
5908
+ "version": "3.0.2",
5909
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-3.0.2.tgz",
5910
+ "integrity": "sha512-rpyNZYRw+/C+dYkcQ3Pr+rLxW4CfHpXjPDnG7lYhdRoUcZTUt+KEsX+94RGp/aVp/MQU35JCITv2T/beY4m+hw==",
5911
+ "dependencies": {
5912
+ "@75lb/deep-merge": "^1.1.1",
5913
+ "array-back": "^6.2.2",
5914
+ "command-line-args": "^5.2.1",
5915
+ "command-line-usage": "^7.0.0",
5916
+ "stream-read-all": "^3.0.1",
5917
+ "typical": "^7.1.1",
5918
+ "wordwrapjs": "^5.1.0"
5919
+ },
5920
+ "bin": {
5921
+ "table-layout": "bin/cli.js"
5922
+ },
5923
+ "engines": {
5924
+ "node": ">=12.17"
5925
+ }
5926
+ },
5927
+ "node_modules/table-layout/node_modules/array-back": {
5928
+ "version": "6.2.2",
5929
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz",
5930
+ "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==",
5931
+ "engines": {
5932
+ "node": ">=12.17"
5933
+ }
5934
+ },
5935
+ "node_modules/table-layout/node_modules/typical": {
5936
+ "version": "7.1.1",
5937
+ "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz",
5938
+ "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==",
5939
+ "engines": {
5940
+ "node": ">=12.17"
5941
+ }
5942
+ },
5943
  "node_modules/tailwind-merge": {
5944
  "version": "1.14.0",
5945
  "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-1.14.0.tgz",
 
6044
  "node": ">=0.8"
6045
  }
6046
  },
6047
+ "node_modules/tiny-invariant": {
6048
+ "version": "1.3.3",
6049
+ "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz",
6050
+ "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="
6051
+ },
6052
  "node_modules/to-fast-properties": {
6053
  "version": "2.0.0",
6054
  "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
 
6245
  "node": ">=4.2.0"
6246
  }
6247
  },
6248
+ "node_modules/typical": {
6249
+ "version": "4.0.0",
6250
+ "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz",
6251
+ "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==",
6252
+ "engines": {
6253
+ "node": ">=8"
6254
+ }
6255
+ },
6256
  "node_modules/unbox-primitive": {
6257
  "version": "1.0.2",
6258
  "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
 
6312
  "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
6313
  "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
6314
  },
6315
+ "node_modules/victory-vendor": {
6316
+ "version": "36.9.2",
6317
+ "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz",
6318
+ "integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==",
6319
+ "dependencies": {
6320
+ "@types/d3-array": "^3.0.3",
6321
+ "@types/d3-ease": "^3.0.0",
6322
+ "@types/d3-interpolate": "^3.0.1",
6323
+ "@types/d3-scale": "^4.0.2",
6324
+ "@types/d3-shape": "^3.1.0",
6325
+ "@types/d3-time": "^3.0.0",
6326
+ "@types/d3-timer": "^3.0.0",
6327
+ "d3-array": "^3.1.6",
6328
+ "d3-ease": "^3.0.1",
6329
+ "d3-interpolate": "^3.0.1",
6330
+ "d3-scale": "^4.0.2",
6331
+ "d3-shape": "^3.1.0",
6332
+ "d3-time": "^3.0.0",
6333
+ "d3-timer": "^3.0.1"
6334
+ }
6335
+ },
6336
  "node_modules/watchpack": {
6337
  "version": "2.4.0",
6338
  "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
 
6447
  "node": ">=0.10.0"
6448
  }
6449
  },
6450
+ "node_modules/wordwrapjs": {
6451
+ "version": "5.1.0",
6452
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.0.tgz",
6453
+ "integrity": "sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==",
6454
+ "engines": {
6455
+ "node": ">=12.17"
6456
+ }
6457
+ },
6458
  "node_modules/wrap-ansi": {
6459
  "version": "8.1.0",
6460
  "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
package.json CHANGED
@@ -14,14 +14,16 @@
14
  "format:check": "prettier --check \"**/*.{ts,tsx,mdx}\" --cache"
15
  },
16
  "dependencies": {
 
17
  "@radix-ui/react-slot": "^1.0.2",
18
  "class-variance-authority": "^0.4.0",
19
  "clsx": "^1.2.1",
20
- "lucide-react": "0.105.0-alpha.4",
21
  "next": "^13.4.8",
22
  "next-themes": "^0.2.1",
23
  "react": "^18.2.0",
24
  "react-dom": "^18.2.0",
 
25
  "sharp": "^0.31.3",
26
  "tailwind-merge": "^1.13.2",
27
  "tailwindcss-animate": "^1.0.6"
 
14
  "format:check": "prettier --check \"**/*.{ts,tsx,mdx}\" --cache"
15
  },
16
  "dependencies": {
17
+ "@duckdb/duckdb-wasm": "^1.28.1-dev106.0",
18
  "@radix-ui/react-slot": "^1.0.2",
19
  "class-variance-authority": "^0.4.0",
20
  "clsx": "^1.2.1",
21
+ "lucide-react": "^0.105.0-alpha.4",
22
  "next": "^13.4.8",
23
  "next-themes": "^0.2.1",
24
  "react": "^18.2.0",
25
  "react-dom": "^18.2.0",
26
+ "recharts": "^2.12.7",
27
  "sharp": "^0.31.3",
28
  "tailwind-merge": "^1.13.2",
29
  "tailwindcss-animate": "^1.0.6"
styles/globals.css CHANGED
@@ -2,6 +2,64 @@
2
  @tailwind components;
3
  @tailwind utilities;
4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  @layer base {
6
  :root {
7
  --background: 0 0% 100%;
@@ -74,8 +132,9 @@
74
  * {
75
  @apply border-border;
76
  }
 
77
  body {
78
  @apply bg-background text-foreground;
79
  font-feature-settings: "rlig" 1, "calt" 1;
80
  }
81
- }
 
2
  @tailwind components;
3
  @tailwind utilities;
4
 
5
+ @layer base {
6
+ :root {
7
+ --background: 0 0% 100%;
8
+ --foreground: 240 10% 3.9%;
9
+ --card: 0 0% 100%;
10
+ --card-foreground: 240 10% 3.9%;
11
+ --popover: 0 0% 100%;
12
+ --popover-foreground: 240 10% 3.9%;
13
+ --primary: 240 5.9% 10%;
14
+ --primary-foreground: 0 0% 98%;
15
+ --secondary: 240 4.8% 95.9%;
16
+ --secondary-foreground: 240 5.9% 10%;
17
+ --muted: 240 4.8% 95.9%;
18
+ --muted-foreground: 240 3.8% 46.1%;
19
+ --accent: 240 4.8% 95.9%;
20
+ --accent-foreground: 240 5.9% 10%;
21
+ --destructive: 0 84.2% 60.2%;
22
+ --destructive-foreground: 0 0% 98%;
23
+ --border: 240 5.9% 90%;
24
+ --input: 240 5.9% 90%;
25
+ --ring: 240 10% 3.9%;
26
+ --chart-1: 12 76% 61%;
27
+ --chart-2: 173 58% 39%;
28
+ --chart-3: 197 37% 24%;
29
+ --chart-4: 43 74% 66%;
30
+ --chart-5: 27 87% 67%;
31
+ }
32
+
33
+ .dark {
34
+ --background: 240 10% 3.9%;
35
+ --foreground: 0 0% 98%;
36
+ --card: 240 10% 3.9%;
37
+ --card-foreground: 0 0% 98%;
38
+ --popover: 240 10% 3.9%;
39
+ --popover-foreground: 0 0% 98%;
40
+ --primary: 0 0% 98%;
41
+ --primary-foreground: 240 5.9% 10%;
42
+ --secondary: 240 3.7% 15.9%;
43
+ --secondary-foreground: 0 0% 98%;
44
+ --muted: 240 3.7% 15.9%;
45
+ --muted-foreground: 240 5% 64.9%;
46
+ --accent: 240 3.7% 15.9%;
47
+ --accent-foreground: 0 0% 98%;
48
+ --destructive: 0 62.8% 30.6%;
49
+ --destructive-foreground: 0 0% 98%;
50
+ --border: 240 3.7% 15.9%;
51
+ --input: 240 3.7% 15.9%;
52
+ --ring: 240 4.9% 83.9%;
53
+ --chart-1: 220 70% 50%;
54
+ --chart-2: 160 60% 45%;
55
+ --chart-3: 30 80% 55%;
56
+ --chart-4: 280 65% 60%;
57
+ --chart-5: 340 75% 55%;
58
+ }
59
+ }
60
+
61
+
62
+
63
  @layer base {
64
  :root {
65
  --background: 0 0% 100%;
 
132
  * {
133
  @apply border-border;
134
  }
135
+
136
  body {
137
  @apply bg-background text-foreground;
138
  font-feature-settings: "rlig" 1, "calt" 1;
139
  }
140
+ }