@konopskidev/ui 0.0.0-stage → 0.1.1

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 (280) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +182 -2
  3. package/dist/components/ui/accordion.d.ts +8 -0
  4. package/dist/components/ui/accordion.d.ts.map +1 -0
  5. package/dist/components/ui/accordion.js +55 -0
  6. package/dist/components/ui/accordion.js.map +1 -0
  7. package/dist/components/ui/alert-dialog.d.ts +19 -0
  8. package/dist/components/ui/alert-dialog.d.ts.map +1 -0
  9. package/dist/components/ui/alert-dialog.js +101 -0
  10. package/dist/components/ui/alert-dialog.js.map +1 -0
  11. package/dist/components/ui/alert.d.ts +11 -0
  12. package/dist/components/ui/alert.d.ts.map +1 -0
  13. package/dist/components/ui/alert.js +44 -0
  14. package/dist/components/ui/alert.js.map +1 -0
  15. package/dist/components/ui/aspect-ratio.d.ts +4 -0
  16. package/dist/components/ui/aspect-ratio.d.ts.map +1 -0
  17. package/dist/components/ui/aspect-ratio.js +14 -0
  18. package/dist/components/ui/aspect-ratio.js.map +1 -0
  19. package/dist/components/ui/attachment.d.ts +25 -0
  20. package/dist/components/ui/attachment.d.ts.map +1 -0
  21. package/dist/components/ui/attachment.js +102 -0
  22. package/dist/components/ui/attachment.js.map +1 -0
  23. package/dist/components/ui/avatar.d.ts +12 -0
  24. package/dist/components/ui/avatar.d.ts.map +1 -0
  25. package/dist/components/ui/avatar.js +51 -0
  26. package/dist/components/ui/avatar.js.map +1 -0
  27. package/dist/components/ui/badge.d.ts +10 -0
  28. package/dist/components/ui/badge.d.ts.map +1 -0
  29. package/dist/components/ui/badge.js +29 -0
  30. package/dist/components/ui/badge.js.map +1 -0
  31. package/dist/components/ui/breadcrumb.d.ts +12 -0
  32. package/dist/components/ui/breadcrumb.d.ts.map +1 -0
  33. package/dist/components/ui/breadcrumb.js +72 -0
  34. package/dist/components/ui/breadcrumb.js.map +1 -0
  35. package/dist/components/ui/bubble.d.ts +18 -0
  36. package/dist/components/ui/bubble.d.ts.map +1 -0
  37. package/dist/components/ui/bubble.js +73 -0
  38. package/dist/components/ui/bubble.js.map +1 -0
  39. package/dist/components/ui/button-group.d.ts +12 -0
  40. package/dist/components/ui/button-group.d.ts.map +1 -0
  41. package/dist/components/ui/button-group.js +40 -0
  42. package/dist/components/ui/button-group.js.map +1 -0
  43. package/dist/components/ui/button.d.ts +22 -0
  44. package/dist/components/ui/button.d.ts.map +1 -0
  45. package/dist/components/ui/button.js +61 -0
  46. package/dist/components/ui/button.js.map +1 -0
  47. package/dist/components/ui/calendar.d.ts +11 -0
  48. package/dist/components/ui/calendar.d.ts.map +1 -0
  49. package/dist/components/ui/calendar.js +111 -0
  50. package/dist/components/ui/calendar.js.map +1 -0
  51. package/dist/components/ui/card.d.ts +26 -0
  52. package/dist/components/ui/card.d.ts.map +1 -0
  53. package/dist/components/ui/card.js +76 -0
  54. package/dist/components/ui/card.js.map +1 -0
  55. package/dist/components/ui/carousel.d.ts +29 -0
  56. package/dist/components/ui/carousel.d.ts.map +1 -0
  57. package/dist/components/ui/carousel.js +132 -0
  58. package/dist/components/ui/carousel.js.map +1 -0
  59. package/dist/components/ui/chart.d.ts +45 -0
  60. package/dist/components/ui/chart.d.ts.map +1 -0
  61. package/dist/components/ui/chart.js +151 -0
  62. package/dist/components/ui/chart.js.map +1 -0
  63. package/dist/components/ui/checkbox.d.ts +5 -0
  64. package/dist/components/ui/checkbox.d.ts.map +1 -0
  65. package/dist/components/ui/checkbox.js +21 -0
  66. package/dist/components/ui/checkbox.js.map +1 -0
  67. package/dist/components/ui/code-block.d.ts +27 -0
  68. package/dist/components/ui/code-block.d.ts.map +1 -0
  69. package/dist/components/ui/code-block.js +123 -0
  70. package/dist/components/ui/code-block.js.map +1 -0
  71. package/dist/components/ui/collapsible.d.ts +6 -0
  72. package/dist/components/ui/collapsible.d.ts.map +1 -0
  73. package/dist/components/ui/collapsible.js +26 -0
  74. package/dist/components/ui/collapsible.js.map +1 -0
  75. package/dist/components/ui/combobox.d.ts +25 -0
  76. package/dist/components/ui/combobox.d.ts.map +1 -0
  77. package/dist/components/ui/combobox.js +174 -0
  78. package/dist/components/ui/combobox.js.map +1 -0
  79. package/dist/components/ui/command.d.ts +19 -0
  80. package/dist/components/ui/command.d.ts.map +1 -0
  81. package/dist/components/ui/command.js +90 -0
  82. package/dist/components/ui/command.js.map +1 -0
  83. package/dist/components/ui/context-menu.d.ts +32 -0
  84. package/dist/components/ui/context-menu.d.ts.map +1 -0
  85. package/dist/components/ui/context-menu.js +125 -0
  86. package/dist/components/ui/context-menu.js.map +1 -0
  87. package/dist/components/ui/dialog.d.ts +18 -0
  88. package/dist/components/ui/dialog.d.ts.map +1 -0
  89. package/dist/components/ui/dialog.js +98 -0
  90. package/dist/components/ui/dialog.js.map +1 -0
  91. package/dist/components/ui/direction.d.ts +12 -0
  92. package/dist/components/ui/direction.d.ts.map +1 -0
  93. package/dist/components/ui/direction.js +16 -0
  94. package/dist/components/ui/direction.js.map +1 -0
  95. package/dist/components/ui/drawer.d.ts +14 -0
  96. package/dist/components/ui/drawer.d.ts.map +1 -0
  97. package/dist/components/ui/drawer.js +78 -0
  98. package/dist/components/ui/drawer.js.map +1 -0
  99. package/dist/components/ui/dropdown-menu.d.ts +30 -0
  100. package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
  101. package/dist/components/ui/dropdown-menu.js +130 -0
  102. package/dist/components/ui/dropdown-menu.js.map +1 -0
  103. package/dist/components/ui/empty.d.ts +12 -0
  104. package/dist/components/ui/empty.d.ts.map +1 -0
  105. package/dist/components/ui/empty.js +60 -0
  106. package/dist/components/ui/empty.js.map +1 -0
  107. package/dist/components/ui/field.d.ts +25 -0
  108. package/dist/components/ui/field.d.ts.map +1 -0
  109. package/dist/components/ui/field.js +112 -0
  110. package/dist/components/ui/field.js.map +1 -0
  111. package/dist/components/ui/hover-card.d.ts +7 -0
  112. package/dist/components/ui/hover-card.d.ts.map +1 -0
  113. package/dist/components/ui/hover-card.js +32 -0
  114. package/dist/components/ui/hover-card.js.map +1 -0
  115. package/dist/components/ui/input-group.d.ts +17 -0
  116. package/dist/components/ui/input-group.d.ts.map +1 -0
  117. package/dist/components/ui/input-group.js +79 -0
  118. package/dist/components/ui/input-group.js.map +1 -0
  119. package/dist/components/ui/input-otp.d.ts +12 -0
  120. package/dist/components/ui/input-otp.d.ts.map +1 -0
  121. package/dist/components/ui/input-otp.js +49 -0
  122. package/dist/components/ui/input-otp.js.map +1 -0
  123. package/dist/components/ui/input.d.ts +11 -0
  124. package/dist/components/ui/input.d.ts.map +1 -0
  125. package/dist/components/ui/input.js +25 -0
  126. package/dist/components/ui/input.js.map +1 -0
  127. package/dist/components/ui/item.d.ts +24 -0
  128. package/dist/components/ui/item.d.ts.map +1 -0
  129. package/dist/components/ui/item.js +121 -0
  130. package/dist/components/ui/item.js.map +1 -0
  131. package/dist/components/ui/kbd.d.ts +4 -0
  132. package/dist/components/ui/kbd.d.ts.map +1 -0
  133. package/dist/components/ui/kbd.js +20 -0
  134. package/dist/components/ui/kbd.js.map +1 -0
  135. package/dist/components/ui/label.d.ts +5 -0
  136. package/dist/components/ui/label.d.ts.map +1 -0
  137. package/dist/components/ui/label.js +15 -0
  138. package/dist/components/ui/label.js.map +1 -0
  139. package/dist/components/ui/marker.d.ts +12 -0
  140. package/dist/components/ui/marker.d.ts.map +1 -0
  141. package/dist/components/ui/marker.js +41 -0
  142. package/dist/components/ui/marker.js.map +1 -0
  143. package/dist/components/ui/menubar.d.ts +31 -0
  144. package/dist/components/ui/menubar.d.ts.map +1 -0
  145. package/dist/components/ui/menubar.js +137 -0
  146. package/dist/components/ui/menubar.js.map +1 -0
  147. package/dist/components/ui/message-scroller.d.ts +11 -0
  148. package/dist/components/ui/message-scroller.d.ts.map +1 -0
  149. package/dist/components/ui/message-scroller.js +61 -0
  150. package/dist/components/ui/message-scroller.js.map +1 -0
  151. package/dist/components/ui/message.d.ts +11 -0
  152. package/dist/components/ui/message.d.ts.map +1 -0
  153. package/dist/components/ui/message.js +50 -0
  154. package/dist/components/ui/message.js.map +1 -0
  155. package/dist/components/ui/native-select.d.ts +9 -0
  156. package/dist/components/ui/native-select.d.ts.map +1 -0
  157. package/dist/components/ui/native-select.js +39 -0
  158. package/dist/components/ui/native-select.js.map +1 -0
  159. package/dist/components/ui/navigation-menu.d.ts +15 -0
  160. package/dist/components/ui/navigation-menu.d.ts.map +1 -0
  161. package/dist/components/ui/navigation-menu.js +81 -0
  162. package/dist/components/ui/navigation-menu.js.map +1 -0
  163. package/dist/components/ui/pagination.d.ts +18 -0
  164. package/dist/components/ui/pagination.d.ts.map +1 -0
  165. package/dist/components/ui/pagination.js +81 -0
  166. package/dist/components/ui/pagination.js.map +1 -0
  167. package/dist/components/ui/popover.d.ts +11 -0
  168. package/dist/components/ui/popover.d.ts.map +1 -0
  169. package/dist/components/ui/popover.js +56 -0
  170. package/dist/components/ui/popover.js.map +1 -0
  171. package/dist/components/ui/progress.d.ts +5 -0
  172. package/dist/components/ui/progress.d.ts.map +1 -0
  173. package/dist/components/ui/progress.js +23 -0
  174. package/dist/components/ui/progress.js.map +1 -0
  175. package/dist/components/ui/questionnaire.d.ts +20 -0
  176. package/dist/components/ui/questionnaire.d.ts.map +1 -0
  177. package/dist/components/ui/questionnaire.js +172 -0
  178. package/dist/components/ui/questionnaire.js.map +1 -0
  179. package/dist/components/ui/radio-group.d.ts +6 -0
  180. package/dist/components/ui/radio-group.d.ts.map +1 -0
  181. package/dist/components/ui/radio-group.js +27 -0
  182. package/dist/components/ui/radio-group.js.map +1 -0
  183. package/dist/components/ui/resizable.d.ts +8 -0
  184. package/dist/components/ui/resizable.d.ts.map +1 -0
  185. package/dist/components/ui/resizable.js +30 -0
  186. package/dist/components/ui/resizable.js.map +1 -0
  187. package/dist/components/ui/scroll-area.d.ts +6 -0
  188. package/dist/components/ui/scroll-area.d.ts.map +1 -0
  189. package/dist/components/ui/scroll-area.js +38 -0
  190. package/dist/components/ui/scroll-area.js.map +1 -0
  191. package/dist/components/ui/select.d.ts +16 -0
  192. package/dist/components/ui/select.d.ts.map +1 -0
  193. package/dist/components/ui/select.js +102 -0
  194. package/dist/components/ui/select.js.map +1 -0
  195. package/dist/components/ui/separator.d.ts +5 -0
  196. package/dist/components/ui/separator.d.ts.map +1 -0
  197. package/dist/components/ui/separator.js +17 -0
  198. package/dist/components/ui/separator.js.map +1 -0
  199. package/dist/components/ui/sheet.d.ts +15 -0
  200. package/dist/components/ui/sheet.d.ts.map +1 -0
  201. package/dist/components/ui/sheet.js +90 -0
  202. package/dist/components/ui/sheet.js.map +1 -0
  203. package/dist/components/ui/sidebar.d.ts +70 -0
  204. package/dist/components/ui/sidebar.d.ts.map +1 -0
  205. package/dist/components/ui/sidebar.js +380 -0
  206. package/dist/components/ui/sidebar.js.map +1 -0
  207. package/dist/components/ui/skeleton.d.ts +3 -0
  208. package/dist/components/ui/skeleton.d.ts.map +1 -0
  209. package/dist/components/ui/skeleton.js +13 -0
  210. package/dist/components/ui/skeleton.js.map +1 -0
  211. package/dist/components/ui/slider.d.ts +8 -0
  212. package/dist/components/ui/slider.d.ts.map +1 -0
  213. package/dist/components/ui/slider.js +40 -0
  214. package/dist/components/ui/slider.js.map +1 -0
  215. package/dist/components/ui/sonner.d.ts +14 -0
  216. package/dist/components/ui/sonner.d.ts.map +1 -0
  217. package/dist/components/ui/sonner.js +35 -0
  218. package/dist/components/ui/sonner.js.map +1 -0
  219. package/dist/components/ui/spinner.d.ts +3 -0
  220. package/dist/components/ui/spinner.d.ts.map +1 -0
  221. package/dist/components/ui/spinner.js +16 -0
  222. package/dist/components/ui/spinner.js.map +1 -0
  223. package/dist/components/ui/switch.d.ts +7 -0
  224. package/dist/components/ui/switch.d.ts.map +1 -0
  225. package/dist/components/ui/switch.js +22 -0
  226. package/dist/components/ui/switch.js.map +1 -0
  227. package/dist/components/ui/table.d.ts +11 -0
  228. package/dist/components/ui/table.d.ts.map +1 -0
  229. package/dist/components/ui/table.js +67 -0
  230. package/dist/components/ui/table.js.map +1 -0
  231. package/dist/components/ui/tabs.d.ts +12 -0
  232. package/dist/components/ui/tabs.d.ts.map +1 -0
  233. package/dist/components/ui/tabs.js +48 -0
  234. package/dist/components/ui/tabs.js.map +1 -0
  235. package/dist/components/ui/textarea.d.ts +10 -0
  236. package/dist/components/ui/textarea.d.ts.map +1 -0
  237. package/dist/components/ui/textarea.js +37 -0
  238. package/dist/components/ui/textarea.js.map +1 -0
  239. package/dist/components/ui/toggle-group.d.ts +11 -0
  240. package/dist/components/ui/toggle-group.d.ts.map +1 -0
  241. package/dist/components/ui/toggle-group.js +53 -0
  242. package/dist/components/ui/toggle-group.js.map +1 -0
  243. package/dist/components/ui/toggle.d.ts +10 -0
  244. package/dist/components/ui/toggle.d.ts.map +1 -0
  245. package/dist/components/ui/toggle.js +37 -0
  246. package/dist/components/ui/toggle.js.map +1 -0
  247. package/dist/components/ui/tooltip.d.ts +8 -0
  248. package/dist/components/ui/tooltip.d.ts.map +1 -0
  249. package/dist/components/ui/tooltip.js +38 -0
  250. package/dist/components/ui/tooltip.js.map +1 -0
  251. package/dist/components/ui/trace.d.ts +19 -0
  252. package/dist/components/ui/trace.d.ts.map +1 -0
  253. package/dist/components/ui/trace.js +76 -0
  254. package/dist/components/ui/trace.js.map +1 -0
  255. package/dist/hooks/use-highlighted-code.d.ts +3 -0
  256. package/dist/hooks/use-highlighted-code.d.ts.map +1 -0
  257. package/dist/hooks/use-mobile.d.ts +2 -0
  258. package/dist/hooks/use-mobile.d.ts.map +1 -0
  259. package/dist/hooks/use-mobile.js +22 -0
  260. package/dist/hooks/use-mobile.js.map +1 -0
  261. package/dist/index.d.ts +74 -0
  262. package/dist/index.d.ts.map +1 -0
  263. package/dist/index.js +67 -0
  264. package/dist/lib/get-placeholder.d.ts +6 -0
  265. package/dist/lib/get-placeholder.d.ts.map +1 -0
  266. package/dist/lib/get-placeholder.js +12 -0
  267. package/dist/lib/get-placeholder.js.map +1 -0
  268. package/dist/lib/highlighter.d.ts +10 -0
  269. package/dist/lib/highlighter.d.ts.map +1 -0
  270. package/dist/lib/utils.d.ts +9 -0
  271. package/dist/lib/utils.d.ts.map +1 -0
  272. package/dist/lib/utils.js +1 -0
  273. package/package.json +148 -3
  274. package/src/styles/base.css +70 -0
  275. package/src/styles/globals.css +33 -0
  276. package/src/styles/prose.css +105 -0
  277. package/src/styles/theme.css +108 -0
  278. package/src/styles/tokens.css +129 -0
  279. package/src/styles/utilities.css +57 -0
  280. package/src/styles/variants.css +649 -0
@@ -0,0 +1,151 @@
1
+ "use client";
2
+ "use client";
3
+ import { cn } from "cn";
4
+ import * as React from "react";
5
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
+ import * as RechartsPrimitive from "recharts";
7
+ // src/components/ui/chart.tsx
8
+ var THEMES = {
9
+ light: "",
10
+ dark: ".dark"
11
+ };
12
+ var INITIAL_DIMENSION = {
13
+ width: 320,
14
+ height: 200
15
+ };
16
+ var ChartContext = React.createContext(null);
17
+ function useChart() {
18
+ const context = React.useContext(ChartContext);
19
+ if (!context) throw new Error("useChart must be used within a <ChartContainer />");
20
+ return context;
21
+ }
22
+ function ChartContainer({ id, className, children, config, initialDimension = INITIAL_DIMENSION, ...props }) {
23
+ const uniqueId = React.useId();
24
+ const chartId = `chart-${id ?? uniqueId.replace(/:/g, "")}`;
25
+ return /* @__PURE__ */ jsx(ChartContext.Provider, {
26
+ value: { config },
27
+ children: /* @__PURE__ */ jsxs("div", {
28
+ "data-slot": "chart",
29
+ "data-chart": chartId,
30
+ className: cn("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", className),
31
+ ...props,
32
+ children: [/* @__PURE__ */ jsx(ChartStyle, {
33
+ id: chartId,
34
+ config
35
+ }), /* @__PURE__ */ jsx(RechartsPrimitive.ResponsiveContainer, {
36
+ initialDimension,
37
+ children
38
+ })]
39
+ })
40
+ });
41
+ }
42
+ var ChartStyle = ({ id, config }) => {
43
+ const colorConfig = Object.entries(config).filter(([, config]) => config.theme ?? config.color);
44
+ if (!colorConfig.length) return null;
45
+ return /* @__PURE__ */ jsx("style", { dangerouslySetInnerHTML: { __html: Object.entries(THEMES).map(([theme, prefix]) => `
46
+ ${prefix} [data-chart=${id}] {
47
+ ${colorConfig.map(([key, itemConfig]) => {
48
+ const color = itemConfig.theme?.[theme] ?? itemConfig.color;
49
+ return color ? ` --color-${key}: ${color};` : null;
50
+ }).join("\n")}
51
+ }
52
+ `).join("\n") } });
53
+ };
54
+ var ChartTooltip = RechartsPrimitive.Tooltip;
55
+ function ChartTooltipContent({ active, payload, className, indicator = "dot", hideLabel = false, hideIndicator = false, label, labelFormatter, labelClassName, formatter, color, nameKey, labelKey }) {
56
+ const { config } = useChart();
57
+ const tooltipLabel = React.useMemo(() => {
58
+ if (hideLabel || !payload?.length) return null;
59
+ const [item] = payload;
60
+ const key = `${labelKey ?? item?.dataKey ?? item?.name ?? "value"}`;
61
+ const itemConfig = getPayloadConfigFromPayload(config, item, key);
62
+ const value = !labelKey && typeof label === "string" ? config[label]?.label ?? label : itemConfig?.label;
63
+ if (labelFormatter) return /* @__PURE__ */ jsx("div", {
64
+ className: cn("font-medium", labelClassName),
65
+ children: labelFormatter(value, payload)
66
+ });
67
+ if (!value) return null;
68
+ return /* @__PURE__ */ jsx("div", {
69
+ className: cn("font-medium", labelClassName),
70
+ children: value
71
+ });
72
+ }, [
73
+ label,
74
+ labelFormatter,
75
+ payload,
76
+ hideLabel,
77
+ labelClassName,
78
+ config,
79
+ labelKey
80
+ ]);
81
+ if (!active || !payload?.length) return null;
82
+ const nestLabel = payload.length === 1 && indicator !== "dot";
83
+ return /* @__PURE__ */ jsxs("div", {
84
+ className: cn("grid min-w-32 items-start gap-1.5 rounded-sm border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-lg", className),
85
+ children: [!nestLabel ? tooltipLabel : null, /* @__PURE__ */ jsx("div", {
86
+ className: "grid gap-1.5",
87
+ children: payload.filter((item) => item.type !== "none").map((item, index) => {
88
+ const key = `${nameKey ?? item.name ?? item.dataKey ?? "value"}`;
89
+ const itemConfig = getPayloadConfigFromPayload(config, item, key);
90
+ const indicatorColor = color ?? item.payload?.fill ?? item.color;
91
+ return /* @__PURE__ */ jsx("div", {
92
+ className: cn("flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground", indicator === "dot" && "items-center"),
93
+ children: formatter && item?.value !== void 0 && item.name ? formatter(item.value, item.name, item, index, item.payload) : /* @__PURE__ */ jsxs(Fragment, { children: [itemConfig?.icon ? /* @__PURE__ */ jsx(itemConfig.icon, {}) : !hideIndicator && /* @__PURE__ */ jsx("div", {
94
+ className: cn("shrink-0 rounded-sm border-(--color-border) bg-(--color-bg)", {
95
+ "h-2.5 w-2.5": indicator === "dot",
96
+ "w-1": indicator === "line",
97
+ "w-0 border-[1.5px] border-dashed bg-transparent": indicator === "dashed",
98
+ "my-0.5": nestLabel && indicator === "dashed"
99
+ }),
100
+ style: {
101
+ "--color-bg": indicatorColor,
102
+ "--color-border": indicatorColor
103
+ }
104
+ }), /* @__PURE__ */ jsxs("div", {
105
+ className: cn("flex flex-1 justify-between leading-none", nestLabel ? "items-end" : "items-center"),
106
+ children: [/* @__PURE__ */ jsxs("div", {
107
+ className: "grid gap-1.5",
108
+ children: [nestLabel ? tooltipLabel : null, /* @__PURE__ */ jsx("span", {
109
+ className: "text-muted-foreground",
110
+ children: itemConfig?.label ?? item.name
111
+ })]
112
+ }), item.value != null && /* @__PURE__ */ jsx("span", {
113
+ className: "font-mono font-medium text-foreground tabular-nums",
114
+ children: typeof item.value === "number" ? item.value.toLocaleString() : String(item.value)
115
+ })]
116
+ })] })
117
+ }, index);
118
+ })
119
+ })]
120
+ });
121
+ }
122
+ var ChartLegend = RechartsPrimitive.Legend;
123
+ function ChartLegendContent({ className, hideIcon = false, payload, verticalAlign = "bottom", nameKey }) {
124
+ const { config } = useChart();
125
+ if (!payload?.length) return null;
126
+ return /* @__PURE__ */ jsx("div", {
127
+ className: cn("flex items-center justify-center gap-4", verticalAlign === "top" ? "pb-3" : "pt-3", className),
128
+ children: payload.filter((item) => item.type !== "none").map((item, index) => {
129
+ const key = `${nameKey ?? item.dataKey ?? "value"}`;
130
+ const itemConfig = getPayloadConfigFromPayload(config, item, key);
131
+ return /* @__PURE__ */ jsxs("div", {
132
+ className: cn("flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground"),
133
+ children: [itemConfig?.icon && !hideIcon ? /* @__PURE__ */ jsx(itemConfig.icon, {}) : /* @__PURE__ */ jsx("div", {
134
+ className: "h-2 w-2 shrink-0 rounded-sm",
135
+ style: { backgroundColor: item.color }
136
+ }), itemConfig?.label]
137
+ }, index);
138
+ })
139
+ });
140
+ }
141
+ function getPayloadConfigFromPayload(config, payload, key) {
142
+ if (typeof payload !== "object" || payload === null) return;
143
+ const payloadPayload = "payload" in payload && typeof payload.payload === "object" && payload.payload !== null ? payload.payload : void 0;
144
+ let configLabelKey = key;
145
+ if (key in payload && typeof payload[key] === "string") configLabelKey = payload[key];
146
+ else if (payloadPayload && key in payloadPayload && typeof payloadPayload[key] === "string") configLabelKey = payloadPayload[key];
147
+ return configLabelKey in config ? config[configLabelKey] : config[key];
148
+ }
149
+ export { ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent };
150
+
151
+ //# sourceMappingURL=chart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart.js","names":["_Fragment"],"sources":["../../../src/components/ui/chart.tsx"],"sourcesContent":["'use client';\n\nimport { cn } from 'cn';\nimport * as React from 'react';\nimport * as RechartsPrimitive from 'recharts';\n\nimport type { TooltipValueType } from 'recharts';\n\n// Format: { THEME_NAME: CSS_SELECTOR }\nconst THEMES = { light: '', dark: '.dark' } as const;\n\nconst INITIAL_DIMENSION = { width: 320, height: 200 } as const;\ntype TooltipNameType = number | string;\n\nexport type ChartConfig = Record<\n string,\n {\n label?: React.ReactNode;\n icon?: React.ComponentType;\n } & (\n | { color?: string; theme?: never }\n | { color?: never; theme: Record<keyof typeof THEMES, string> }\n )\n>;\n\ntype ChartContextProps = {\n config: ChartConfig;\n};\n\nconst ChartContext = React.createContext<ChartContextProps | null>(null);\n\nfunction useChart() {\n const context = React.useContext(ChartContext);\n\n if (!context) {\n throw new Error('useChart must be used within a <ChartContainer />');\n }\n\n return context;\n}\n\nfunction ChartContainer({\n id,\n className,\n children,\n config,\n initialDimension = INITIAL_DIMENSION,\n ...props\n}: React.ComponentProps<'div'> & {\n config: ChartConfig;\n children: React.ComponentProps<typeof RechartsPrimitive.ResponsiveContainer>['children'];\n initialDimension?: {\n width: number;\n height: number;\n };\n}) {\n const uniqueId = React.useId();\n const chartId = `chart-${id ?? uniqueId.replace(/:/g, '')}`;\n\n return (\n <ChartContext.Provider value={{ config }}>\n <div\n data-slot=\"chart\"\n data-chart={chartId}\n className={cn(\n \"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\",\n className,\n )}\n {...props}\n >\n <ChartStyle id={chartId} config={config} />\n <RechartsPrimitive.ResponsiveContainer initialDimension={initialDimension}>\n {children}\n </RechartsPrimitive.ResponsiveContainer>\n </div>\n </ChartContext.Provider>\n );\n}\n\nconst ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {\n const colorConfig = Object.entries(config).filter(([, config]) => config.theme ?? config.color);\n\n if (!colorConfig.length) {\n return null;\n }\n\n return (\n <style\n dangerouslySetInnerHTML={{\n __html: Object.entries(THEMES)\n .map(\n ([theme, prefix]) => `\n${prefix} [data-chart=${id}] {\n${colorConfig\n .map(([key, itemConfig]) => {\n const color = itemConfig.theme?.[theme as keyof typeof itemConfig.theme] ?? itemConfig.color;\n return color ? ` --color-${key}: ${color};` : null;\n })\n .join('\\n')}\n}\n`,\n )\n .join('\\n'),\n }}\n />\n );\n};\n\nconst ChartTooltip = RechartsPrimitive.Tooltip;\n\nfunction ChartTooltipContent({\n active,\n payload,\n className,\n indicator = 'dot',\n hideLabel = false,\n hideIndicator = false,\n label,\n labelFormatter,\n labelClassName,\n formatter,\n color,\n nameKey,\n labelKey,\n}: React.ComponentProps<typeof RechartsPrimitive.Tooltip> &\n React.ComponentProps<'div'> & {\n hideLabel?: boolean;\n hideIndicator?: boolean;\n indicator?: 'line' | 'dot' | 'dashed';\n nameKey?: string;\n labelKey?: string;\n } & Omit<\n RechartsPrimitive.DefaultTooltipContentProps<TooltipValueType, TooltipNameType>,\n 'accessibilityLayer'\n >) {\n const { config } = useChart();\n\n const tooltipLabel = React.useMemo(() => {\n if (hideLabel || !payload?.length) {\n return null;\n }\n\n const [item] = payload;\n const key = `${labelKey ?? item?.dataKey ?? item?.name ?? 'value'}`;\n const itemConfig = getPayloadConfigFromPayload(config, item, key);\n const value =\n !labelKey && typeof label === 'string' ? (config[label]?.label ?? label) : itemConfig?.label;\n\n if (labelFormatter) {\n return (\n <div className={cn('font-medium', labelClassName)}>{labelFormatter(value, payload)}</div>\n );\n }\n\n if (!value) {\n return null;\n }\n\n return <div className={cn('font-medium', labelClassName)}>{value}</div>;\n }, [label, labelFormatter, payload, hideLabel, labelClassName, config, labelKey]);\n\n if (!active || !payload?.length) {\n return null;\n }\n\n const nestLabel = payload.length === 1 && indicator !== 'dot';\n\n return (\n <div\n className={cn(\n 'grid min-w-32 items-start gap-1.5 rounded-sm border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-lg',\n className,\n )}\n >\n {!nestLabel ? tooltipLabel : null}\n <div className=\"grid gap-1.5\">\n {payload\n .filter((item) => item.type !== 'none')\n .map((item, index) => {\n const key = `${nameKey ?? item.name ?? item.dataKey ?? 'value'}`;\n const itemConfig = getPayloadConfigFromPayload(config, item, key);\n const indicatorColor = color ?? item.payload?.fill ?? item.color;\n\n return (\n <div\n key={index}\n className={cn(\n 'flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground',\n indicator === 'dot' && 'items-center',\n )}\n >\n {formatter && item?.value !== undefined && item.name ? (\n formatter(item.value, item.name, item, index, item.payload)\n ) : (\n <>\n {itemConfig?.icon ? (\n <itemConfig.icon />\n ) : (\n !hideIndicator && (\n <div\n className={cn(\n 'shrink-0 rounded-sm border-(--color-border) bg-(--color-bg)',\n {\n 'h-2.5 w-2.5': indicator === 'dot',\n 'w-1': indicator === 'line',\n 'w-0 border-[1.5px] border-dashed bg-transparent':\n indicator === 'dashed',\n 'my-0.5': nestLabel && indicator === 'dashed',\n },\n )}\n style={\n {\n '--color-bg': indicatorColor,\n '--color-border': indicatorColor,\n } as React.CSSProperties\n }\n />\n )\n )}\n <div\n className={cn(\n 'flex flex-1 justify-between leading-none',\n nestLabel ? 'items-end' : 'items-center',\n )}\n >\n <div className=\"grid gap-1.5\">\n {nestLabel ? tooltipLabel : null}\n <span className=\"text-muted-foreground\">\n {itemConfig?.label ?? item.name}\n </span>\n </div>\n {item.value != null && (\n <span className=\"font-mono font-medium text-foreground tabular-nums\">\n {typeof item.value === 'number'\n ? item.value.toLocaleString()\n : String(item.value)}\n </span>\n )}\n </div>\n </>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nconst ChartLegend = RechartsPrimitive.Legend;\n\nfunction ChartLegendContent({\n className,\n hideIcon = false,\n payload,\n verticalAlign = 'bottom',\n nameKey,\n}: React.ComponentProps<'div'> & {\n hideIcon?: boolean;\n nameKey?: string;\n} & RechartsPrimitive.DefaultLegendContentProps) {\n const { config } = useChart();\n\n if (!payload?.length) {\n return null;\n }\n\n return (\n <div\n className={cn(\n 'flex items-center justify-center gap-4',\n verticalAlign === 'top' ? 'pb-3' : 'pt-3',\n className,\n )}\n >\n {payload\n .filter((item) => item.type !== 'none')\n .map((item, index) => {\n const key = `${nameKey ?? item.dataKey ?? 'value'}`;\n const itemConfig = getPayloadConfigFromPayload(config, item, key);\n\n return (\n <div\n key={index}\n className={cn(\n 'flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground',\n )}\n >\n {itemConfig?.icon && !hideIcon ? (\n <itemConfig.icon />\n ) : (\n <div\n className=\"h-2 w-2 shrink-0 rounded-sm\"\n style={{\n backgroundColor: item.color,\n }}\n />\n )}\n {itemConfig?.label}\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction getPayloadConfigFromPayload(config: ChartConfig, payload: unknown, key: string) {\n if (typeof payload !== 'object' || payload === null) {\n return undefined;\n }\n\n const payloadPayload =\n 'payload' in payload && typeof payload.payload === 'object' && payload.payload !== null\n ? payload.payload\n : undefined;\n\n let configLabelKey: string = key;\n\n if (key in payload && typeof payload[key as keyof typeof payload] === 'string') {\n configLabelKey = payload[key as keyof typeof payload] as string;\n } else if (\n payloadPayload &&\n key in payloadPayload &&\n typeof payloadPayload[key as keyof typeof payloadPayload] === 'string'\n ) {\n configLabelKey = payloadPayload[key as keyof typeof payloadPayload] as string;\n }\n\n return configLabelKey in config ? config[configLabelKey] : config[key];\n}\n\nexport {\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n ChartLegend,\n ChartLegendContent,\n ChartStyle,\n};\n"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { Checkbox as CheckboxPrimitive } from 'radix-ui';
2
+ import * as React from 'react';
3
+ declare function Checkbox({ className, ...props }: React.ComponentProps<typeof CheckboxPrimitive.Root>): React.JSX.Element;
4
+ export { Checkbox };
5
+ //# sourceMappingURL=checkbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkbox.d.ts","sourceRoot":"","sources":["../../../src/components/ui/checkbox.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,MAAM,UAAU,CAAC;AACzD,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,iBAAS,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,iBAAiB,CAAC,IAAI,CAAC,qBAkB7F;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { cn } from "cn";
2
+ import { CheckIcon } from "lucide-react";
3
+ import { Checkbox } from "radix-ui";
4
+ import "react";
5
+ import { jsx } from "react/jsx-runtime";
6
+ // src/components/ui/checkbox.tsx
7
+ function Checkbox$1({ className, ...props }) {
8
+ return /* @__PURE__ */ jsx(Checkbox.Root, {
9
+ "data-slot": "checkbox",
10
+ className: cn("peer relative flex size-4 shrink-0 items-center justify-center rounded-sm border border-input focus-ring transition-colors outline-none group-has-disabled/field:opacity-50 group-has-[:focus-visible]/field-label:ring-0 group-has-[:focus-visible]/field-label:not-data-checked:border-input after:absolute after:-inset-x-3 after:-inset-y-2 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:border-primary data-checked:bg-primary data-checked:text-primary-foreground group-has-[:focus-visible]/field-label:data-checked:border-primary dark:data-checked:bg-primary", className),
11
+ ...props,
12
+ children: /* @__PURE__ */ jsx(Checkbox.Indicator, {
13
+ "data-slot": "checkbox-indicator",
14
+ className: "grid place-content-center text-current transition-none [&>svg]:size-3.5",
15
+ children: /* @__PURE__ */ jsx(CheckIcon, {})
16
+ })
17
+ });
18
+ }
19
+ export { Checkbox$1 as Checkbox };
20
+
21
+ //# sourceMappingURL=checkbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkbox.js","names":["Checkbox","CheckboxPrimitive"],"sources":["../../../src/components/ui/checkbox.tsx"],"sourcesContent":["import { cn } from 'cn';\nimport { CheckIcon } from 'lucide-react';\nimport { Checkbox as CheckboxPrimitive } from 'radix-ui';\nimport * as React from 'react';\n\nfunction Checkbox({ className, ...props }: React.ComponentProps<typeof CheckboxPrimitive.Root>) {\n return (\n <CheckboxPrimitive.Root\n data-slot=\"checkbox\"\n className={cn(\n 'peer relative flex size-4 shrink-0 items-center justify-center rounded-sm border border-input focus-ring transition-colors outline-none group-has-disabled/field:opacity-50 group-has-[:focus-visible]/field-label:ring-0 group-has-[:focus-visible]/field-label:not-data-checked:border-input after:absolute after:-inset-x-3 after:-inset-y-2 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:border-primary data-checked:bg-primary data-checked:text-primary-foreground group-has-[:focus-visible]/field-label:data-checked:border-primary dark:data-checked:bg-primary',\n className,\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className=\"grid place-content-center text-current transition-none [&>svg]:size-3.5\"\n >\n <CheckIcon />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n );\n}\n\nexport { Checkbox };\n"],"mappings":";;;;;;AAKA,SAASA,WAAS,EAAE,WAAW,GAAG,SAA8D;CAC9F,OACE,oBAACC,SAAkB,MAAnB;EACE,aAAU;EACV,WAAW,GACT,yxBACA,SACF;EACA,GAAI;EAEJ,UAAA,oBAACA,SAAkB,WAAnB;GACE,aAAU;GACV,WAAU;GAEV,UAAA,oBAAC,WAAD,CAAY,CAAA;EACe,CAAA;CACP,CAAA;AAE5B"}
@@ -0,0 +1,27 @@
1
+ import { type VariantProps } from 'class-variance-authority';
2
+ import * as React from 'react';
3
+ import { Button } from './button.js';
4
+ declare const codeBlockVariants: (props?: ({
5
+ variant?: "default" | "destructive" | null | undefined;
6
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
+ declare function CodeBlock({ className, variant, size, ...props }: React.ComponentProps<'div'> & VariantProps<typeof codeBlockVariants> & {
8
+ size?: 'default' | 'sm';
9
+ }): React.JSX.Element;
10
+ declare function CodeBlockHeader({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
11
+ declare function CodeBlockTitle({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
12
+ declare function CodeBlockActions({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
13
+ declare function CodeBlockCopyButton({ value, variant, size, className, onClick, ...props }: React.ComponentProps<typeof Button> & {
14
+ value: string;
15
+ }): React.JSX.Element;
16
+ declare function CodeBlockContent({ className, children, style, wrap, lineNumbers, startLine, ...props }: React.ComponentProps<'pre'> & {
17
+ wrap?: boolean;
18
+ lineNumbers?: boolean;
19
+ startLine?: number;
20
+ }): React.JSX.Element;
21
+ declare const codeBlockLineVariants: (props?: ({
22
+ variant?: "default" | "added" | "removed" | "highlighted" | null | undefined;
23
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
24
+ declare function CodeBlockLine({ className, variant, children, ...props }: React.ComponentProps<'span'> & VariantProps<typeof codeBlockLineVariants>): React.JSX.Element;
25
+ declare function CodeBlockFooter({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
26
+ export { CodeBlock, CodeBlockHeader, CodeBlockTitle, CodeBlockActions, CodeBlockCopyButton, CodeBlockContent, CodeBlockLine, CodeBlockFooter, };
27
+ //# sourceMappingURL=code-block.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-block.d.ts","sourceRoot":"","sources":["../../../src/components/ui/code-block.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGlE,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,QAAA,MAAM,iBAAiB;;8EActB,CAAC;AAEF,iBAAS,SAAS,CAAC,EACjB,SAAS,EACT,OAAmB,EACnB,IAAgB,EAChB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAC5B,YAAY,CAAC,OAAO,iBAAiB,CAAC,GAAG;IAAE,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI,CAAA;CAAE,qBAUrE;AAED,iBAAS,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAW5E;AAED,iBAAS,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAW3E;AAED,iBAAS,gBAAgB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAW7E;AAED,iBAAS,mBAAmB,CAAC,EAC3B,KAAK,EACL,OAAiB,EACjB,IAAgB,EAChB,SAAS,EACT,OAAO,EACP,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,MAAM,CAAC,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,qBAqCzD;AAED,iBAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,QAAQ,EACR,KAAK,EACL,IAAY,EACZ,WAAmB,EACnB,SAAa,EACb,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,qBA4BA;AAED,QAAA,MAAM,qBAAqB;;8EAe1B,CAAC;AAEF,iBAAS,aAAa,CAAC,EACrB,SAAS,EACT,OAAmB,EACnB,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC,OAAO,qBAAqB,CAAC,qBAoB3E;AAED,iBAAS,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAW5E;AAED,OAAO,EACL,SAAS,EACT,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,aAAa,EACb,eAAe,GAChB,CAAC"}
@@ -0,0 +1,123 @@
1
+ import { Button } from "./button.js";
2
+ import { cn } from "cn";
3
+ import { CheckIcon, CopyIcon } from "lucide-react";
4
+ import * as React from "react";
5
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
+ import { cva } from "class-variance-authority";
7
+ // src/components/ui/code-block.tsx
8
+ var codeBlockVariants = cva("group/code-block relative flex w-full min-w-0 flex-col overflow-hidden rounded-sm text-sm has-[>[data-slot=code-block-content]:focus-visible]:ring-3 has-[>[data-slot=code-block-content]:focus-visible]:ring-ring/50 data-[size=sm]:text-xs", {
9
+ variants: { variant: {
10
+ default: "border border-input text-foreground has-[>[data-slot=code-block-content]:focus-visible]:border-ring dark:bg-input/30",
11
+ destructive: "border border-destructive/30 text-destructive dark:border-destructive/40"
12
+ } },
13
+ defaultVariants: { variant: "default" }
14
+ });
15
+ function CodeBlock({ className, variant = "default", size = "default", ...props }) {
16
+ return /* @__PURE__ */ jsx("div", {
17
+ "data-slot": "code-block",
18
+ "data-variant": variant,
19
+ "data-size": size,
20
+ className: cn(codeBlockVariants({ variant }), className),
21
+ ...props
22
+ });
23
+ }
24
+ function CodeBlockHeader({ className, ...props }) {
25
+ return /* @__PURE__ */ jsx("div", {
26
+ "data-slot": "code-block-header",
27
+ className: cn("flex min-w-0 shrink-0 items-center gap-2 px-3 pt-3 text-muted-foreground group-data-[size=sm]/code-block:px-2.5 group-data-[size=sm]/code-block:pt-2.5 group-data-[variant=destructive]/code-block:text-destructive *:has-[>[data-slot=code-block-title]]:min-w-0", className),
28
+ ...props
29
+ });
30
+ }
31
+ function CodeBlockTitle({ className, ...props }) {
32
+ return /* @__PURE__ */ jsx("div", {
33
+ "data-slot": "code-block-title",
34
+ className: cn("min-w-0 truncate font-sans text-sm font-medium text-foreground group-data-[size=sm]/code-block:text-xs group-data-[variant=destructive]/code-block:text-destructive [&_svg]:pointer-events-none [&_svg]:inline-block [&_svg]:align-middle [&_svg:not([class*='size-'])]:size-3.5 *:[svg]:me-1.5", className),
35
+ ...props
36
+ });
37
+ }
38
+ function CodeBlockActions({ className, ...props }) {
39
+ return /* @__PURE__ */ jsx("div", {
40
+ "data-slot": "code-block-actions",
41
+ className: cn("-my-1 ms-auto -me-1.5 flex shrink-0 items-center gap-1 [[data-slot=code-block]>&]:absolute [[data-slot=code-block]>&]:end-2 [[data-slot=code-block]>&]:top-2 [[data-slot=code-block]>&]:z-10 [[data-slot=code-block]>&]:m-0 [[data-slot=code-block]>&]:opacity-0 [[data-slot=code-block]>&]:transition-opacity [[data-slot=code-block]>&]:group-focus-within/code-block:opacity-100 [[data-slot=code-block]>&]:group-hover/code-block:opacity-100 group-data-[size=sm]/code-block:[[data-slot=code-block]>&]:end-1.5 group-data-[size=sm]/code-block:[[data-slot=code-block]>&]:top-1.5 [[data-slot=code-block]>&]:pointer-coarse:opacity-100 [[data-slot=code-block]>&]:*:[button]:bg-background [[data-slot=code-block]>&]:*:[button]:ring-1 [[data-slot=code-block]>&]:*:[button]:ring-foreground/10", className),
42
+ ...props
43
+ });
44
+ }
45
+ function CodeBlockCopyButton({ value, variant = "ghost", size = "icon-xs", className, onClick, ...props }) {
46
+ const [copied, setCopied] = React.useState(false);
47
+ React.useEffect(() => {
48
+ if (!copied) return;
49
+ const timeout = setTimeout(() => setCopied(false), 2e3);
50
+ return () => clearTimeout(timeout);
51
+ }, [copied]);
52
+ return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(Button, {
53
+ "data-slot": "code-block-copy-button",
54
+ "data-copied": copied || void 0,
55
+ variant,
56
+ size,
57
+ "aria-label": copied ? "Copied" : "Copy",
58
+ className: cn(className),
59
+ onClick: (event) => {
60
+ onClick?.(event);
61
+ navigator.clipboard.writeText(value).then(() => setCopied(true)).catch(() => {});
62
+ },
63
+ ...props,
64
+ children: copied ? /* @__PURE__ */ jsx(CheckIcon, {}) : /* @__PURE__ */ jsx(CopyIcon, {})
65
+ }), /* @__PURE__ */ jsx("span", {
66
+ "aria-live": "polite",
67
+ className: "sr-only",
68
+ children: copied ? "Copied" : ""
69
+ })] });
70
+ }
71
+ function CodeBlockContent({ className, children, style, wrap = false, lineNumbers = false, startLine = 1, ...props }) {
72
+ return /* @__PURE__ */ jsx("pre", {
73
+ "data-slot": "code-block-content",
74
+ "data-wrap": wrap || void 0,
75
+ "data-numbered": lineNumbers || void 0,
76
+ dir: "ltr",
77
+ tabIndex: 0,
78
+ style: {
79
+ counterReset: `line ${startLine - 1}`,
80
+ ...style
81
+ },
82
+ className: cn("min-h-0 min-w-0 scroll-fade-x scrollbar-thin overflow-auto px-3 py-3 text-start font-mono leading-relaxed outline-none group-has-data-[slot=code-block-footer]/code-block:pb-2 group-has-data-[slot=code-block-header]/code-block:pt-2 group-data-[size=sm]/code-block:px-2.5 group-data-[size=sm]/code-block:py-2.5 group-data-[size=sm]/code-block:group-has-data-[slot=code-block-header]/code-block:pt-1.5 data-wrap:scroll-fade-y data-wrap:wrap-break-word data-wrap:whitespace-pre-wrap", className),
83
+ ...props,
84
+ children: /* @__PURE__ */ jsx("code", {
85
+ "data-slot": "code-block-code",
86
+ className: "grid min-h-lh min-w-max content-start in-data-numbered:grid-cols-[auto_1fr] in-data-wrap:min-w-0",
87
+ children: lineNumbers && typeof children === "string" ? children.replace(/\n$/, "").split("\n").map((line, index) => /* @__PURE__ */ jsx(CodeBlockLine, { children: line }, index)) : children
88
+ })
89
+ });
90
+ }
91
+ var codeBlockLineVariants = cva("relative -mx-3 block min-h-lh px-3 group-data-[size=sm]/code-block:-mx-2.5 group-data-[size=sm]/code-block:px-2.5 before:min-w-6 before:text-end before:text-muted-foreground after:absolute after:start-1 after:top-0 after:text-muted-foreground after:select-none in-data-numbered:col-span-2 in-data-numbered:grid in-data-numbered:grid-cols-subgrid in-data-numbered:gap-x-3 in-data-numbered:[counter-increment:line] in-data-numbered:before:content-[counter(line)] in-data-numbered:before:select-none in-data-numbered:supports-[content:counter(line)_/_'']:before:content-[counter(line)_/_'']", {
92
+ variants: { variant: {
93
+ default: "",
94
+ added: "bg-muted after:content-['+']",
95
+ removed: "bg-destructive/10 after:text-destructive after:content-['−']",
96
+ highlighted: "bg-muted"
97
+ } },
98
+ defaultVariants: { variant: "default" }
99
+ });
100
+ function CodeBlockLine({ className, variant = "default", children, ...props }) {
101
+ const empty = children === void 0 || children === null || children === "" || Array.isArray(children) && children.length === 0;
102
+ return /* @__PURE__ */ jsx("span", {
103
+ "data-slot": "code-block-line",
104
+ "data-variant": variant,
105
+ className: cn(codeBlockLineVariants({ variant }), className),
106
+ ...props,
107
+ children: /* @__PURE__ */ jsx("span", {
108
+ "data-slot": "code-block-line-content",
109
+ className: "min-w-0",
110
+ children: empty ? "\n" : children
111
+ })
112
+ });
113
+ }
114
+ function CodeBlockFooter({ className, ...props }) {
115
+ return /* @__PURE__ */ jsx("div", {
116
+ "data-slot": "code-block-footer",
117
+ className: cn("flex min-w-0 shrink-0 items-center gap-2 px-3 pb-3 text-muted-foreground group-data-[size=sm]/code-block:px-2.5 group-data-[size=sm]/code-block:pb-2.5", className),
118
+ ...props
119
+ });
120
+ }
121
+ export { CodeBlock, CodeBlockActions, CodeBlockContent, CodeBlockCopyButton, CodeBlockFooter, CodeBlockHeader, CodeBlockLine, CodeBlockTitle };
122
+
123
+ //# sourceMappingURL=code-block.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-block.js","names":["_Fragment"],"sources":["../../../src/components/ui/code-block.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from 'cn';\nimport { CheckIcon, CopyIcon } from 'lucide-react';\nimport * as React from 'react';\n\nimport { Button } from './button';\n\nconst codeBlockVariants = cva(\n 'group/code-block relative flex w-full min-w-0 flex-col overflow-hidden rounded-sm text-sm has-[>[data-slot=code-block-content]:focus-visible]:ring-3 has-[>[data-slot=code-block-content]:focus-visible]:ring-ring/50 data-[size=sm]:text-xs',\n {\n variants: {\n variant: {\n default:\n 'border border-input text-foreground has-[>[data-slot=code-block-content]:focus-visible]:border-ring dark:bg-input/30',\n destructive: 'border border-destructive/30 text-destructive dark:border-destructive/40',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n);\n\nfunction CodeBlock({\n className,\n variant = 'default',\n size = 'default',\n ...props\n}: React.ComponentProps<'div'> &\n VariantProps<typeof codeBlockVariants> & { size?: 'default' | 'sm' }) {\n return (\n <div\n data-slot=\"code-block\"\n data-variant={variant}\n data-size={size}\n className={cn(codeBlockVariants({ variant }), className)}\n {...props}\n />\n );\n}\n\nfunction CodeBlockHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"code-block-header\"\n className={cn(\n 'flex min-w-0 shrink-0 items-center gap-2 px-3 pt-3 text-muted-foreground group-data-[size=sm]/code-block:px-2.5 group-data-[size=sm]/code-block:pt-2.5 group-data-[variant=destructive]/code-block:text-destructive *:has-[>[data-slot=code-block-title]]:min-w-0',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CodeBlockTitle({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"code-block-title\"\n className={cn(\n \"min-w-0 truncate font-sans text-sm font-medium text-foreground group-data-[size=sm]/code-block:text-xs group-data-[variant=destructive]/code-block:text-destructive [&_svg]:pointer-events-none [&_svg]:inline-block [&_svg]:align-middle [&_svg:not([class*='size-'])]:size-3.5 *:[svg]:me-1.5\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CodeBlockActions({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"code-block-actions\"\n className={cn(\n '-my-1 ms-auto -me-1.5 flex shrink-0 items-center gap-1 [[data-slot=code-block]>&]:absolute [[data-slot=code-block]>&]:end-2 [[data-slot=code-block]>&]:top-2 [[data-slot=code-block]>&]:z-10 [[data-slot=code-block]>&]:m-0 [[data-slot=code-block]>&]:opacity-0 [[data-slot=code-block]>&]:transition-opacity [[data-slot=code-block]>&]:group-focus-within/code-block:opacity-100 [[data-slot=code-block]>&]:group-hover/code-block:opacity-100 group-data-[size=sm]/code-block:[[data-slot=code-block]>&]:end-1.5 group-data-[size=sm]/code-block:[[data-slot=code-block]>&]:top-1.5 [[data-slot=code-block]>&]:pointer-coarse:opacity-100 [[data-slot=code-block]>&]:*:[button]:bg-background [[data-slot=code-block]>&]:*:[button]:ring-1 [[data-slot=code-block]>&]:*:[button]:ring-foreground/10',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CodeBlockCopyButton({\n value,\n variant = 'ghost',\n size = 'icon-xs',\n className,\n onClick,\n ...props\n}: React.ComponentProps<typeof Button> & { value: string }) {\n const [copied, setCopied] = React.useState(false);\n\n React.useEffect(() => {\n if (!copied) {\n return;\n }\n\n const timeout = setTimeout(() => setCopied(false), 2000);\n return () => clearTimeout(timeout);\n }, [copied]);\n\n return (\n <>\n <Button\n data-slot=\"code-block-copy-button\"\n data-copied={copied || undefined}\n variant={variant}\n size={size}\n aria-label={copied ? 'Copied' : 'Copy'}\n className={cn(className)}\n onClick={(event) => {\n onClick?.(event);\n navigator.clipboard\n .writeText(value)\n .then(() => setCopied(true))\n .catch(() => {});\n }}\n {...props}\n >\n {copied ? <CheckIcon /> : <CopyIcon />}\n </Button>\n <span aria-live=\"polite\" className=\"sr-only\">\n {copied ? 'Copied' : ''}\n </span>\n </>\n );\n}\n\nfunction CodeBlockContent({\n className,\n children,\n style,\n wrap = false,\n lineNumbers = false,\n startLine = 1,\n ...props\n}: React.ComponentProps<'pre'> & {\n wrap?: boolean;\n lineNumbers?: boolean;\n startLine?: number;\n}) {\n return (\n <pre\n data-slot=\"code-block-content\"\n data-wrap={wrap || undefined}\n data-numbered={lineNumbers || undefined}\n dir=\"ltr\"\n tabIndex={0}\n style={{ counterReset: `line ${startLine - 1}`, ...style }}\n className={cn(\n 'min-h-0 min-w-0 scroll-fade-x scrollbar-thin overflow-auto px-3 py-3 text-start font-mono leading-relaxed outline-none group-has-data-[slot=code-block-footer]/code-block:pb-2 group-has-data-[slot=code-block-header]/code-block:pt-2 group-data-[size=sm]/code-block:px-2.5 group-data-[size=sm]/code-block:py-2.5 group-data-[size=sm]/code-block:group-has-data-[slot=code-block-header]/code-block:pt-1.5 data-wrap:scroll-fade-y data-wrap:wrap-break-word data-wrap:whitespace-pre-wrap',\n className,\n )}\n {...props}\n >\n <code\n data-slot=\"code-block-code\"\n className=\"grid min-h-lh min-w-max content-start in-data-numbered:grid-cols-[auto_1fr] in-data-wrap:min-w-0\"\n >\n {lineNumbers && typeof children === 'string'\n ? children\n .replace(/\\n$/, '')\n .split('\\n')\n .map((line, index) => <CodeBlockLine key={index}>{line}</CodeBlockLine>)\n : children}\n </code>\n </pre>\n );\n}\n\nconst codeBlockLineVariants = cva(\n \"relative -mx-3 block min-h-lh px-3 group-data-[size=sm]/code-block:-mx-2.5 group-data-[size=sm]/code-block:px-2.5 before:min-w-6 before:text-end before:text-muted-foreground after:absolute after:start-1 after:top-0 after:text-muted-foreground after:select-none in-data-numbered:col-span-2 in-data-numbered:grid in-data-numbered:grid-cols-subgrid in-data-numbered:gap-x-3 in-data-numbered:[counter-increment:line] in-data-numbered:before:content-[counter(line)] in-data-numbered:before:select-none in-data-numbered:supports-[content:counter(line)_/_'']:before:content-[counter(line)_/_'']\",\n {\n variants: {\n variant: {\n default: '',\n added: \"bg-muted after:content-['+']\",\n removed: \"bg-destructive/10 after:text-destructive after:content-['−']\",\n highlighted: 'bg-muted',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n);\n\nfunction CodeBlockLine({\n className,\n variant = 'default',\n children,\n ...props\n}: React.ComponentProps<'span'> & VariantProps<typeof codeBlockLineVariants>) {\n // An empty line holds a newline so copying a selection keeps blank lines.\n const empty =\n children === undefined ||\n children === null ||\n children === '' ||\n (Array.isArray(children) && children.length === 0);\n\n return (\n <span\n data-slot=\"code-block-line\"\n data-variant={variant}\n className={cn(codeBlockLineVariants({ variant }), className)}\n {...props}\n >\n <span data-slot=\"code-block-line-content\" className=\"min-w-0\">\n {empty ? '\\n' : children}\n </span>\n </span>\n );\n}\n\nfunction CodeBlockFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"code-block-footer\"\n className={cn(\n 'flex min-w-0 shrink-0 items-center gap-2 px-3 pb-3 text-muted-foreground group-data-[size=sm]/code-block:px-2.5 group-data-[size=sm]/code-block:pb-2.5',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n CodeBlock,\n CodeBlockHeader,\n CodeBlockTitle,\n CodeBlockActions,\n CodeBlockCopyButton,\n CodeBlockContent,\n CodeBlockLine,\n CodeBlockFooter,\n};\n"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Collapsible as CollapsiblePrimitive } from 'radix-ui';
2
+ declare function Collapsible({ ...props }: React.ComponentProps<typeof CollapsiblePrimitive.Root>): import("react").JSX.Element;
3
+ declare function CollapsibleTrigger({ ...props }: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleTrigger>): import("react").JSX.Element;
4
+ declare function CollapsibleContent({ ...props }: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleContent>): import("react").JSX.Element;
5
+ export { Collapsible, CollapsibleTrigger, CollapsibleContent };
6
+ //# sourceMappingURL=collapsible.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collapsible.d.ts","sourceRoot":"","sources":["../../../src/components/ui/collapsible.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,IAAI,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAE/D,iBAAS,WAAW,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,IAAI,CAAC,+BAExF;AAED,iBAAS,kBAAkB,CAAC,EAC1B,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,kBAAkB,CAAC,+BAEtE;AAED,iBAAS,kBAAkB,CAAC,EAC1B,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,kBAAkB,CAAC,+BAEtE;AAED,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,26 @@
1
+ "use client";
2
+ "use client";
3
+ import { Collapsible } from "radix-ui";
4
+ import { jsx } from "react/jsx-runtime";
5
+ // src/components/ui/collapsible.tsx
6
+ function Collapsible$1({ ...props }) {
7
+ return /* @__PURE__ */ jsx(Collapsible.Root, {
8
+ "data-slot": "collapsible",
9
+ ...props
10
+ });
11
+ }
12
+ function CollapsibleTrigger({ ...props }) {
13
+ return /* @__PURE__ */ jsx(Collapsible.CollapsibleTrigger, {
14
+ "data-slot": "collapsible-trigger",
15
+ ...props
16
+ });
17
+ }
18
+ function CollapsibleContent({ ...props }) {
19
+ return /* @__PURE__ */ jsx(Collapsible.CollapsibleContent, {
20
+ "data-slot": "collapsible-content",
21
+ ...props
22
+ });
23
+ }
24
+ export { Collapsible$1 as Collapsible, CollapsibleContent, CollapsibleTrigger };
25
+
26
+ //# sourceMappingURL=collapsible.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collapsible.js","names":["Collapsible","CollapsiblePrimitive"],"sources":["../../../src/components/ui/collapsible.tsx"],"sourcesContent":["'use client';\n\nimport { Collapsible as CollapsiblePrimitive } from 'radix-ui';\n\nfunction Collapsible({ ...props }: React.ComponentProps<typeof CollapsiblePrimitive.Root>) {\n return <CollapsiblePrimitive.Root data-slot=\"collapsible\" {...props} />;\n}\n\nfunction CollapsibleTrigger({\n ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleTrigger>) {\n return <CollapsiblePrimitive.CollapsibleTrigger data-slot=\"collapsible-trigger\" {...props} />;\n}\n\nfunction CollapsibleContent({\n ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleContent>) {\n return <CollapsiblePrimitive.CollapsibleContent data-slot=\"collapsible-content\" {...props} />;\n}\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent };\n"],"mappings":";;;;;AAKE,SAAO,cAAA,EAAA,GAACC,SAAAA;CAA0B,OAAU,oBAAA,YAAA,MAAA;EAAc,aAAI;EAAQ,GAAA;CACxE,CAAA;AAEA;AAGE,SAAO,mBAACA,EAAAA,GAAAA,SAAqB;CAAmB,OAAU,oBAAA,YAAA,oBAAA;EAAsB,aAAI;EAAQ,GAAA;CAC9F,CAAA;AAEA;AAGE,SAAO,mBAACA,EAAAA,GAAAA,SAAqB;CAAmB,OAAU,oBAAA,YAAA,oBAAA;EAAsB,aAAI;EAAQ,GAAA;CAC9F,CAAA"}
@@ -0,0 +1,25 @@
1
+ import { Combobox as ComboboxPrimitive } from '@base-ui/react';
2
+ import * as React from 'react';
3
+ declare const Combobox: typeof ComboboxPrimitive.Root;
4
+ declare function ComboboxValue({ ...props }: ComboboxPrimitive.Value.Props): React.JSX.Element;
5
+ declare function ComboboxTrigger({ className, children, 'aria-label': ariaLabel, ...props }: ComboboxPrimitive.Trigger.Props): React.JSX.Element;
6
+ declare function ComboboxInput({ className, children, disabled, showTrigger, showClear, ...props }: ComboboxPrimitive.Input.Props & {
7
+ showTrigger?: boolean;
8
+ showClear?: boolean;
9
+ }): React.JSX.Element;
10
+ declare function ComboboxContent({ className, side, sideOffset, align, alignOffset, anchor, ...props }: ComboboxPrimitive.Popup.Props & Pick<ComboboxPrimitive.Positioner.Props, 'side' | 'align' | 'sideOffset' | 'alignOffset' | 'anchor'>): React.JSX.Element;
11
+ declare function ComboboxList({ className, ...props }: ComboboxPrimitive.List.Props): React.JSX.Element;
12
+ declare function ComboboxItem({ className, children, ...props }: ComboboxPrimitive.Item.Props): React.JSX.Element;
13
+ declare function ComboboxGroup({ className, ...props }: ComboboxPrimitive.Group.Props): React.JSX.Element;
14
+ declare function ComboboxLabel({ className, ...props }: ComboboxPrimitive.GroupLabel.Props): React.JSX.Element;
15
+ declare function ComboboxCollection({ ...props }: ComboboxPrimitive.Collection.Props): React.JSX.Element;
16
+ declare function ComboboxEmpty({ className, ...props }: ComboboxPrimitive.Empty.Props): React.JSX.Element;
17
+ declare function ComboboxSeparator({ className, ...props }: ComboboxPrimitive.Separator.Props): React.JSX.Element;
18
+ declare function ComboboxChips({ className, ...props }: React.ComponentPropsWithRef<typeof ComboboxPrimitive.Chips> & ComboboxPrimitive.Chips.Props): React.JSX.Element;
19
+ declare function ComboboxChip({ className, children, showRemove, ...props }: ComboboxPrimitive.Chip.Props & {
20
+ showRemove?: boolean;
21
+ }): React.JSX.Element;
22
+ declare function ComboboxChipsInput({ className, ...props }: ComboboxPrimitive.Input.Props): React.JSX.Element;
23
+ declare function useComboboxAnchor(): React.RefObject<HTMLDivElement | null>;
24
+ export { Combobox, ComboboxInput, ComboboxContent, ComboboxList, ComboboxItem, ComboboxGroup, ComboboxLabel, ComboboxCollection, ComboboxEmpty, ComboboxSeparator, ComboboxChips, ComboboxChip, ComboboxChipsInput, ComboboxTrigger, ComboboxValue, useComboboxAnchor, };
25
+ //# sourceMappingURL=combobox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combobox.d.ts","sourceRoot":"","sources":["../../../src/components/ui/combobox.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAG/D,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,QAAA,MAAM,QAAQ,+BAAyB,CAAC;AAExC,iBAAS,aAAa,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,iBAAiB,CAAC,KAAK,CAAC,KAAK,qBAEjE;AAED,iBAAS,eAAe,CAAC,EACvB,SAAS,EACT,QAAQ,EACR,YAAY,EAAE,SAA0B,EACxC,GAAG,KAAK,EACT,EAAE,iBAAiB,CAAC,OAAO,CAAC,KAAK,qBAYjC;AAoBD,iBAAS,aAAa,CAAC,EACrB,SAAS,EACT,QAAQ,EACR,QAAgB,EAChB,WAAkB,EAClB,SAAiB,EACjB,GAAG,KAAK,EACT,EAAE,iBAAiB,CAAC,KAAK,CAAC,KAAK,GAAG;IACjC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,qBAsBA;AAED,iBAAS,eAAe,CAAC,EACvB,SAAS,EACT,IAAe,EACf,UAAc,EACd,KAAe,EACf,WAAe,EACf,MAAM,EACN,GAAG,KAAK,EACT,EAAE,iBAAiB,CAAC,KAAK,CAAC,KAAK,GAC9B,IAAI,CACF,iBAAiB,CAAC,UAAU,CAAC,KAAK,EAClC,MAAM,GAAG,OAAO,GAAG,YAAY,GAAG,aAAa,GAAG,QAAQ,CAC3D,qBAuBF;AAED,iBAAS,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,iBAAiB,CAAC,IAAI,CAAC,KAAK,qBAW1E;AAED,iBAAS,YAAY,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,iBAAiB,CAAC,IAAI,CAAC,KAAK,qBAoBpF;AAED,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,iBAAiB,CAAC,KAAK,CAAC,KAAK,qBAI5E;AAED,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,iBAAiB,CAAC,UAAU,CAAC,KAAK,qBAQjF;AAED,iBAAS,kBAAkB,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,iBAAiB,CAAC,UAAU,CAAC,KAAK,qBAE3E;AAED,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,iBAAiB,CAAC,KAAK,CAAC,KAAK,qBAW5E;AAED,iBAAS,iBAAiB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,iBAAiB,CAAC,SAAS,CAAC,KAAK,qBAQpF;AAED,iBAAS,aAAa,CAAC,EACrB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,qBAAqB,CAAC,OAAO,iBAAiB,CAAC,KAAK,CAAC,GAAG,iBAAiB,CAAC,KAAK,CAAC,KAAK,qBAW7F;AAED,iBAAS,YAAY,CAAC,EACpB,SAAS,EACT,QAAQ,EACR,UAAiB,EACjB,GAAG,KAAK,EACT,EAAE,iBAAiB,CAAC,IAAI,CAAC,KAAK,GAAG;IAChC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,qBAsBA;AAED,iBAAS,kBAAkB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,iBAAiB,CAAC,KAAK,CAAC,KAAK,qBAQjF;AAED,iBAAS,iBAAiB,2CAEzB;AAED,OAAO,EACL,QAAQ,EACR,aAAa,EACb,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,iBAAiB,GAClB,CAAC"}