@multicomma/arkcn 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/README.md +78 -0
  2. package/bin/arkcn.mjs +78 -0
  3. package/cli/commands.mjs +251 -0
  4. package/cli/project.mjs +168 -0
  5. package/cli/registry.mjs +50 -0
  6. package/cli/ui.mjs +46 -0
  7. package/mcp/server.mjs +149 -0
  8. package/package.json +201 -0
  9. package/registry/base.css +680 -0
  10. package/registry/index.json +1833 -0
  11. package/registry/items/accordion.json +18 -0
  12. package/registry/items/activity-feed.json +18 -0
  13. package/registry/items/alert-dialog.json +18 -0
  14. package/registry/items/alert.json +17 -0
  15. package/registry/items/angle-slider.json +17 -0
  16. package/registry/items/app-shell.json +28 -0
  17. package/registry/items/aspect-ratio.json +13 -0
  18. package/registry/items/attachment.json +19 -0
  19. package/registry/items/avatar.json +17 -0
  20. package/registry/items/badge.json +18 -0
  21. package/registry/items/breadcrumb.json +18 -0
  22. package/registry/items/bubble.json +18 -0
  23. package/registry/items/button-group.json +19 -0
  24. package/registry/items/button.json +18 -0
  25. package/registry/items/calendar.json +19 -0
  26. package/registry/items/canvas.json +24 -0
  27. package/registry/items/card.json +15 -0
  28. package/registry/items/carousel.json +19 -0
  29. package/registry/items/cascader.json +23 -0
  30. package/registry/items/chart.json +17 -0
  31. package/registry/items/chat.json +23 -0
  32. package/registry/items/checkbox.json +18 -0
  33. package/registry/items/clipboard.json +19 -0
  34. package/registry/items/collapsible.json +15 -0
  35. package/registry/items/color-picker.json +19 -0
  36. package/registry/items/combobox.json +20 -0
  37. package/registry/items/command.json +21 -0
  38. package/registry/items/comment-thread.json +25 -0
  39. package/registry/items/context-menu.json +18 -0
  40. package/registry/items/controllable.json +14 -0
  41. package/registry/items/data-grid.json +24 -0
  42. package/registry/items/data-table-adapter.json +14 -0
  43. package/registry/items/data-table.json +32 -0
  44. package/registry/items/date-input.json +17 -0
  45. package/registry/items/dialog.json +19 -0
  46. package/registry/items/direction.json +13 -0
  47. package/registry/items/drag-preview.json +16 -0
  48. package/registry/items/drawer.json +18 -0
  49. package/registry/items/dropdown-menu.json +18 -0
  50. package/registry/items/editable.json +17 -0
  51. package/registry/items/empty.json +17 -0
  52. package/registry/items/field.json +19 -0
  53. package/registry/items/file-upload.json +19 -0
  54. package/registry/items/floating-panel.json +19 -0
  55. package/registry/items/floating-toolbar.json +16 -0
  56. package/registry/items/form.json +14 -0
  57. package/registry/items/format.json +15 -0
  58. package/registry/items/gantt.json +22 -0
  59. package/registry/items/history.json +14 -0
  60. package/registry/items/hotkeys.json +18 -0
  61. package/registry/items/hover-card.json +17 -0
  62. package/registry/items/image-cropper.json +17 -0
  63. package/registry/items/input-group.json +20 -0
  64. package/registry/items/input-otp.json +18 -0
  65. package/registry/items/input.json +15 -0
  66. package/registry/items/item.json +19 -0
  67. package/registry/items/json-tree-view.json +17 -0
  68. package/registry/items/kanban.json +26 -0
  69. package/registry/items/kbd.json +15 -0
  70. package/registry/items/label.json +15 -0
  71. package/registry/items/live-region.json +16 -0
  72. package/registry/items/marker.json +18 -0
  73. package/registry/items/marquee.json +17 -0
  74. package/registry/items/menubar.json +19 -0
  75. package/registry/items/message.json +15 -0
  76. package/registry/items/navigation-menu.json +19 -0
  77. package/registry/items/node-graph.json +22 -0
  78. package/registry/items/number-input.json +18 -0
  79. package/registry/items/pagination.json +18 -0
  80. package/registry/items/password-input.json +18 -0
  81. package/registry/items/popconfirm.json +20 -0
  82. package/registry/items/popover.json +18 -0
  83. package/registry/items/progress.json +17 -0
  84. package/registry/items/qr-code.json +17 -0
  85. package/registry/items/query-builder.json +23 -0
  86. package/registry/items/radio-group.json +17 -0
  87. package/registry/items/rating-group.json +18 -0
  88. package/registry/items/resizable.json +17 -0
  89. package/registry/items/rich-text-editor.json +37 -0
  90. package/registry/items/row-layout.json +15 -0
  91. package/registry/items/scheduler.json +23 -0
  92. package/registry/items/scroll-area.json +17 -0
  93. package/registry/items/segment-group.json +17 -0
  94. package/registry/items/select.json +19 -0
  95. package/registry/items/separator.json +15 -0
  96. package/registry/items/sheet.json +19 -0
  97. package/registry/items/sidebar.json +27 -0
  98. package/registry/items/signature-pad.json +19 -0
  99. package/registry/items/skeleton.json +15 -0
  100. package/registry/items/slider.json +17 -0
  101. package/registry/items/sonner.json +17 -0
  102. package/registry/items/spinner.json +17 -0
  103. package/registry/items/steps.json +19 -0
  104. package/registry/items/swap.json +17 -0
  105. package/registry/items/switch.json +17 -0
  106. package/registry/items/table.json +16 -0
  107. package/registry/items/tabs.json +18 -0
  108. package/registry/items/tags-input.json +18 -0
  109. package/registry/items/textarea.json +15 -0
  110. package/registry/items/time.json +14 -0
  111. package/registry/items/timer.json +18 -0
  112. package/registry/items/toc.json +17 -0
  113. package/registry/items/toggle-group.json +19 -0
  114. package/registry/items/toggle.json +18 -0
  115. package/registry/items/tooltip.json +17 -0
  116. package/registry/items/tour.json +19 -0
  117. package/registry/items/transfer-list.json +24 -0
  118. package/registry/items/tree-select.json +24 -0
  119. package/registry/items/tree-view.json +18 -0
  120. package/registry/items/use-mobile.json +13 -0
  121. package/registry/items/utils.json +17 -0
  122. package/registry/items/virtual-list.json +16 -0
  123. package/src/components/ui/accordion.tsx +111 -0
  124. package/src/components/ui/activity-feed.tsx +228 -0
  125. package/src/components/ui/alert-dialog.tsx +204 -0
  126. package/src/components/ui/alert.tsx +55 -0
  127. package/src/components/ui/angle-slider.tsx +117 -0
  128. package/src/components/ui/app-shell.tsx +985 -0
  129. package/src/components/ui/aspect-ratio.tsx +35 -0
  130. package/src/components/ui/attachment.tsx +193 -0
  131. package/src/components/ui/avatar.tsx +94 -0
  132. package/src/components/ui/badge.tsx +45 -0
  133. package/src/components/ui/breadcrumb.tsx +93 -0
  134. package/src/components/ui/bubble.tsx +119 -0
  135. package/src/components/ui/button-group.tsx +79 -0
  136. package/src/components/ui/button.tsx +65 -0
  137. package/src/components/ui/calendar.tsx +172 -0
  138. package/src/components/ui/canvas.tsx +723 -0
  139. package/src/components/ui/card.tsx +69 -0
  140. package/src/components/ui/carousel.tsx +228 -0
  141. package/src/components/ui/cascader.tsx +754 -0
  142. package/src/components/ui/chart.tsx +303 -0
  143. package/src/components/ui/chat.tsx +544 -0
  144. package/src/components/ui/checkbox.tsx +94 -0
  145. package/src/components/ui/clipboard.tsx +94 -0
  146. package/src/components/ui/collapsible.tsx +32 -0
  147. package/src/components/ui/color-picker.tsx +441 -0
  148. package/src/components/ui/combobox.tsx +400 -0
  149. package/src/components/ui/command.tsx +292 -0
  150. package/src/components/ui/comment-thread.tsx +923 -0
  151. package/src/components/ui/context-menu.tsx +331 -0
  152. package/src/components/ui/data-grid.tsx +1227 -0
  153. package/src/components/ui/data-table.tsx +993 -0
  154. package/src/components/ui/date-input.tsx +103 -0
  155. package/src/components/ui/dialog.tsx +159 -0
  156. package/src/components/ui/direction.tsx +32 -0
  157. package/src/components/ui/drawer.tsx +200 -0
  158. package/src/components/ui/dropdown-menu.tsx +329 -0
  159. package/src/components/ui/editable.tsx +90 -0
  160. package/src/components/ui/empty.tsx +86 -0
  161. package/src/components/ui/field.tsx +218 -0
  162. package/src/components/ui/file-upload.tsx +204 -0
  163. package/src/components/ui/floating-panel.tsx +199 -0
  164. package/src/components/ui/floating-toolbar.tsx +79 -0
  165. package/src/components/ui/format.tsx +22 -0
  166. package/src/components/ui/gantt.tsx +950 -0
  167. package/src/components/ui/hotkeys.tsx +340 -0
  168. package/src/components/ui/hover-card.tsx +83 -0
  169. package/src/components/ui/image-cropper.tsx +100 -0
  170. package/src/components/ui/input-group.tsx +133 -0
  171. package/src/components/ui/input-otp.tsx +82 -0
  172. package/src/components/ui/input.tsx +18 -0
  173. package/src/components/ui/item.tsx +174 -0
  174. package/src/components/ui/json-tree-view.tsx +37 -0
  175. package/src/components/ui/kanban.tsx +884 -0
  176. package/src/components/ui/kbd.tsx +20 -0
  177. package/src/components/ui/label.tsx +30 -0
  178. package/src/components/ui/live-region.tsx +54 -0
  179. package/src/components/ui/marker.tsx +66 -0
  180. package/src/components/ui/marquee.tsx +61 -0
  181. package/src/components/ui/menubar.tsx +456 -0
  182. package/src/components/ui/message.tsx +74 -0
  183. package/src/components/ui/navigation-menu.tsx +202 -0
  184. package/src/components/ui/node-graph.tsx +1723 -0
  185. package/src/components/ui/number-input.tsx +148 -0
  186. package/src/components/ui/pagination.tsx +88 -0
  187. package/src/components/ui/password-input.tsx +104 -0
  188. package/src/components/ui/popconfirm.tsx +149 -0
  189. package/src/components/ui/popover.tsx +126 -0
  190. package/src/components/ui/progress.tsx +114 -0
  191. package/src/components/ui/qr-code.tsx +51 -0
  192. package/src/components/ui/query-builder.tsx +938 -0
  193. package/src/components/ui/radio-group.tsx +108 -0
  194. package/src/components/ui/rating-group.tsx +91 -0
  195. package/src/components/ui/resizable.tsx +41 -0
  196. package/src/components/ui/rich-text-editor.tsx +845 -0
  197. package/src/components/ui/scheduler.tsx +1164 -0
  198. package/src/components/ui/scroll-area.tsx +82 -0
  199. package/src/components/ui/segment-group.tsx +95 -0
  200. package/src/components/ui/select.tsx +354 -0
  201. package/src/components/ui/separator.tsx +32 -0
  202. package/src/components/ui/sheet.tsx +130 -0
  203. package/src/components/ui/sidebar.tsx +665 -0
  204. package/src/components/ui/signature-pad.tsx +112 -0
  205. package/src/components/ui/skeleton.tsx +7 -0
  206. package/src/components/ui/slider.tsx +183 -0
  207. package/src/components/ui/sonner.tsx +37 -0
  208. package/src/components/ui/spinner.tsx +16 -0
  209. package/src/components/ui/steps.tsx +152 -0
  210. package/src/components/ui/swap.tsx +33 -0
  211. package/src/components/ui/switch.tsx +83 -0
  212. package/src/components/ui/table.tsx +72 -0
  213. package/src/components/ui/tabs.tsx +100 -0
  214. package/src/components/ui/tags-input.tsx +153 -0
  215. package/src/components/ui/textarea.tsx +17 -0
  216. package/src/components/ui/timer.tsx +67 -0
  217. package/src/components/ui/toc.tsx +64 -0
  218. package/src/components/ui/toggle-group.tsx +89 -0
  219. package/src/components/ui/toggle.tsx +46 -0
  220. package/src/components/ui/tooltip.tsx +113 -0
  221. package/src/components/ui/tour.tsx +168 -0
  222. package/src/components/ui/transfer-list.tsx +700 -0
  223. package/src/components/ui/tree-select.tsx +638 -0
  224. package/src/components/ui/tree-view.tsx +217 -0
  225. package/src/components/ui/virtual-list.tsx +343 -0
  226. package/src/hooks/use-mobile.ts +19 -0
  227. package/src/lib/controllable.ts +31 -0
  228. package/src/lib/data-table-adapter.ts +67 -0
  229. package/src/lib/drag-preview.ts +39 -0
  230. package/src/lib/form.ts +39 -0
  231. package/src/lib/history.ts +55 -0
  232. package/src/lib/row-layout.ts +81 -0
  233. package/src/lib/table.ts +483 -0
  234. package/src/lib/time.ts +37 -0
  235. package/src/lib/utils.ts +6 -0
  236. package/src/styles/arkcn.css +764 -0
  237. package/src/styles/index.css +3 -0
@@ -0,0 +1,303 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import { cn } from "@/lib/utils"
5
+ import * as RechartsPrimitive from "recharts"
6
+ import type { TooltipValueType } from "recharts"
7
+
8
+ // Format: { THEME_NAME: CSS_SELECTOR }
9
+ const THEMES = { light: "", dark: ".dark" } as const
10
+
11
+ const INITIAL_DIMENSION = { width: 320, height: 200 } as const
12
+ type TooltipNameType = number | string
13
+
14
+ export type ChartConfig = Record<
15
+ string,
16
+ {
17
+ label?: React.ReactNode
18
+ icon?: React.ComponentType
19
+ } & ({ color?: string; theme?: never } | { color?: never; theme: Record<keyof typeof THEMES, string> })
20
+ >
21
+
22
+ type ChartContextProps = {
23
+ config: ChartConfig
24
+ }
25
+
26
+ const ChartContext = React.createContext<ChartContextProps | null>(null)
27
+
28
+ function useChart() {
29
+ const context = React.useContext(ChartContext)
30
+
31
+ if (!context) {
32
+ throw new Error("useChart must be used within a <ChartContainer />")
33
+ }
34
+
35
+ return context
36
+ }
37
+
38
+ function ChartContainer({
39
+ id,
40
+ className,
41
+ children,
42
+ config,
43
+ initialDimension = INITIAL_DIMENSION,
44
+ ...props
45
+ }: React.ComponentProps<"div"> & {
46
+ config: ChartConfig
47
+ children: React.ComponentProps<typeof RechartsPrimitive.ResponsiveContainer>["children"]
48
+ initialDimension?: {
49
+ width: number
50
+ height: number
51
+ }
52
+ }) {
53
+ const uniqueId = React.useId()
54
+ const chartId = `chart-${id ?? uniqueId.replace(/:/g, "")}`
55
+
56
+ return (
57
+ <ChartContext.Provider value={{ config }}>
58
+ <div
59
+ data-slot="chart"
60
+ data-chart={chartId}
61
+ className={cn(
62
+ "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-hidden [&_.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]:outline-hidden [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-surface]:outline-hidden",
63
+ className
64
+ )}
65
+ {...props}
66
+ >
67
+ <ChartStyle id={chartId} config={config} />
68
+ <RechartsPrimitive.ResponsiveContainer initialDimension={initialDimension}>
69
+ {children}
70
+ </RechartsPrimitive.ResponsiveContainer>
71
+ </div>
72
+ </ChartContext.Provider>
73
+ )
74
+ }
75
+
76
+ const ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {
77
+ const colorConfig = Object.entries(config).filter(([, config]) => config.theme ?? config.color)
78
+
79
+ if (!colorConfig.length) {
80
+ return null
81
+ }
82
+
83
+ return (
84
+ <style
85
+ dangerouslySetInnerHTML={{
86
+ __html: Object.entries(THEMES)
87
+ .map(
88
+ ([theme, prefix]) => `
89
+ ${prefix} [data-chart=${id}] {
90
+ ${colorConfig
91
+ .map(([key, itemConfig]) => {
92
+ const color = itemConfig.theme?.[theme as keyof typeof itemConfig.theme] ?? itemConfig.color
93
+ return color ? ` --color-${key}: ${color};` : null
94
+ })
95
+ .join("\n")}
96
+ }
97
+ `
98
+ )
99
+ .join("\n"),
100
+ }}
101
+ />
102
+ )
103
+ }
104
+
105
+ const ChartTooltip = RechartsPrimitive.Tooltip
106
+
107
+ function ChartTooltipContent({
108
+ active,
109
+ payload,
110
+ className,
111
+ indicator = "dot",
112
+ hideLabel = false,
113
+ hideIndicator = false,
114
+ label,
115
+ labelFormatter,
116
+ labelClassName,
117
+ formatter,
118
+ color,
119
+ nameKey,
120
+ labelKey,
121
+ }: React.ComponentProps<typeof RechartsPrimitive.Tooltip> &
122
+ React.ComponentProps<"div"> & {
123
+ hideLabel?: boolean
124
+ hideIndicator?: boolean
125
+ indicator?: "line" | "dot" | "dashed"
126
+ nameKey?: string
127
+ labelKey?: string
128
+ } & Omit<RechartsPrimitive.DefaultTooltipContentProps<TooltipValueType, TooltipNameType>, "accessibilityLayer">) {
129
+ const { config } = useChart()
130
+
131
+ const tooltipLabel = React.useMemo(() => {
132
+ if (hideLabel || !payload?.length) {
133
+ return null
134
+ }
135
+
136
+ const [item] = payload
137
+ const key = `${labelKey ?? item?.dataKey ?? item?.name ?? "value"}`
138
+ const itemConfig = getPayloadConfigFromPayload(config, item, key)
139
+ const value = !labelKey && typeof label === "string" ? (config[label]?.label ?? label) : itemConfig?.label
140
+
141
+ if (labelFormatter) {
142
+ return <div className={cn("font-medium", labelClassName)}>{labelFormatter(value, payload)}</div>
143
+ }
144
+
145
+ if (!value) {
146
+ return null
147
+ }
148
+
149
+ return <div className={cn("font-medium", labelClassName)}>{value}</div>
150
+ }, [label, labelFormatter, payload, hideLabel, labelClassName, config, labelKey])
151
+
152
+ if (!active || !payload?.length) {
153
+ return null
154
+ }
155
+
156
+ const nestLabel = payload.length === 1 && indicator !== "dot"
157
+
158
+ return (
159
+ <div
160
+ className={cn(
161
+ "grid min-w-32 items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl",
162
+ className
163
+ )}
164
+ >
165
+ {!nestLabel ? tooltipLabel : null}
166
+ <div className="grid gap-1.5">
167
+ {payload
168
+ .filter((item) => item.type !== "none")
169
+ .map((item, index) => {
170
+ const key = `${nameKey ?? item.name ?? item.dataKey ?? "value"}`
171
+ const itemConfig = getPayloadConfigFromPayload(config, item, key)
172
+ const indicatorColor = color ?? item.payload?.fill ?? item.color
173
+
174
+ return (
175
+ <div
176
+ key={index}
177
+ className={cn(
178
+ "flex w-full flex-wrap items-stretch gap-2 [&>svg]:size-2.5 [&>svg]:text-muted-foreground",
179
+ indicator === "dot" && "items-center"
180
+ )}
181
+ >
182
+ {formatter && item?.value !== undefined && item.name ? (
183
+ formatter(item.value, item.name, item, index, item.payload)
184
+ ) : (
185
+ <>
186
+ {itemConfig?.icon ? (
187
+ <itemConfig.icon />
188
+ ) : (
189
+ !hideIndicator && (
190
+ <div
191
+ className={cn("shrink-0 rounded-xs border-border bg-(--color-bg)", {
192
+ "size-2.5": indicator === "dot",
193
+ "w-1": indicator === "line",
194
+ "w-0 border-[1.5px] border-dashed bg-transparent": indicator === "dashed",
195
+ "my-0.5": nestLabel && indicator === "dashed",
196
+ })}
197
+ style={
198
+ {
199
+ "--color-bg": indicatorColor,
200
+ "--color-border": indicatorColor,
201
+ } as React.CSSProperties
202
+ }
203
+ />
204
+ )
205
+ )}
206
+ <div
207
+ className={cn(
208
+ "flex flex-1 justify-between leading-none",
209
+ nestLabel ? "items-end" : "items-center"
210
+ )}
211
+ >
212
+ <div className="grid gap-1.5">
213
+ {nestLabel ? tooltipLabel : null}
214
+ <span className="text-muted-foreground">{itemConfig?.label ?? item.name}</span>
215
+ </div>
216
+ {item.value != null && (
217
+ <span className="font-mono font-medium text-foreground tabular-nums">
218
+ {typeof item.value === "number" ? item.value.toLocaleString() : String(item.value)}
219
+ </span>
220
+ )}
221
+ </div>
222
+ </>
223
+ )}
224
+ </div>
225
+ )
226
+ })}
227
+ </div>
228
+ </div>
229
+ )
230
+ }
231
+
232
+ const ChartLegend = RechartsPrimitive.Legend
233
+
234
+ function ChartLegendContent({
235
+ className,
236
+ hideIcon = false,
237
+ payload,
238
+ verticalAlign = "bottom",
239
+ nameKey,
240
+ }: React.ComponentProps<"div"> & {
241
+ hideIcon?: boolean
242
+ nameKey?: string
243
+ } & RechartsPrimitive.DefaultLegendContentProps) {
244
+ const { config } = useChart()
245
+
246
+ if (!payload?.length) {
247
+ return null
248
+ }
249
+
250
+ return (
251
+ <div className={cn("flex items-center justify-center gap-4", verticalAlign === "top" ? "pb-3" : "pt-3", className)}>
252
+ {payload
253
+ .filter((item) => item.type !== "none")
254
+ .map((item, index) => {
255
+ const key = `${nameKey ?? item.dataKey ?? "value"}`
256
+ const itemConfig = getPayloadConfigFromPayload(config, item, key)
257
+
258
+ return (
259
+ <div key={index} className={cn("flex items-center gap-1.5 [&>svg]:size-3 [&>svg]:text-muted-foreground")}>
260
+ {itemConfig?.icon && !hideIcon ? (
261
+ <itemConfig.icon />
262
+ ) : (
263
+ <div
264
+ className="size-2 shrink-0 rounded-xs"
265
+ style={{
266
+ backgroundColor: item.color,
267
+ }}
268
+ />
269
+ )}
270
+ {itemConfig?.label}
271
+ </div>
272
+ )
273
+ })}
274
+ </div>
275
+ )
276
+ }
277
+
278
+ function getPayloadConfigFromPayload(config: ChartConfig, payload: unknown, key: string) {
279
+ if (typeof payload !== "object" || payload === null) {
280
+ return undefined
281
+ }
282
+
283
+ const payloadPayload =
284
+ "payload" in payload && typeof payload.payload === "object" && payload.payload !== null
285
+ ? payload.payload
286
+ : undefined
287
+
288
+ let configLabelKey: string = key
289
+
290
+ if (key in payload && typeof payload[key as keyof typeof payload] === "string") {
291
+ configLabelKey = payload[key as keyof typeof payload] as string
292
+ } else if (
293
+ payloadPayload &&
294
+ key in payloadPayload &&
295
+ typeof payloadPayload[key as keyof typeof payloadPayload] === "string"
296
+ ) {
297
+ configLabelKey = payloadPayload[key as keyof typeof payloadPayload] as string
298
+ }
299
+
300
+ return configLabelKey in config ? config[configLabelKey] : config[key]
301
+ }
302
+
303
+ export { ChartContainer, ChartTooltip, ChartTooltipContent, ChartLegend, ChartLegendContent, ChartStyle }