zudoku 0.13.5 → 0.13.7

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 (286) hide show
  1. package/dist/app/main.js +1 -1
  2. package/dist/app/main.js.map +1 -1
  3. package/dist/lib/authentication/components/CallbackHandler.js +21 -31
  4. package/dist/lib/authentication/components/CallbackHandler.js.map +1 -1
  5. package/dist/lib/errors/ErrorAlert.d.ts +1 -1
  6. package/dist/lib/errors/ErrorAlert.js +8 -3
  7. package/dist/lib/errors/ErrorAlert.js.map +1 -1
  8. package/dist/lib/plugins/api-keys/CreateApiKey.js +1 -1
  9. package/dist/lib/plugins/api-keys/CreateApiKey.js.map +1 -1
  10. package/dist/lib/plugins/openapi/Sidecar.js +2 -2
  11. package/dist/lib/plugins/openapi/playground/Playground.js +1 -1
  12. package/dist/lib/plugins/openapi/playground/Playground.js.map +1 -1
  13. package/dist/lib/plugins/openapi/playground/PlaygroundDialog.js +1 -1
  14. package/dist/lib/plugins/openapi/playground/PlaygroundDialog.js.map +1 -1
  15. package/dist/lib/ui/Accordion.d.ts +7 -0
  16. package/dist/lib/ui/Accordion.js +14 -0
  17. package/dist/lib/ui/Accordion.js.map +1 -0
  18. package/dist/lib/ui/Alert.d.ts +8 -0
  19. package/dist/lib/ui/Alert.js +23 -0
  20. package/dist/lib/ui/Alert.js.map +1 -0
  21. package/dist/lib/ui/AlertDialog.d.ts +20 -0
  22. package/dist/lib/ui/AlertDialog.js +27 -0
  23. package/dist/lib/ui/AlertDialog.js.map +1 -0
  24. package/dist/lib/ui/AspectRatio.d.ts +3 -0
  25. package/dist/lib/ui/AspectRatio.js +4 -0
  26. package/dist/lib/ui/AspectRatio.js.map +1 -0
  27. package/dist/lib/ui/Badge.d.ts +9 -0
  28. package/dist/lib/ui/Badge.js +21 -0
  29. package/dist/lib/ui/Badge.js.map +1 -0
  30. package/dist/lib/ui/Breadcrumb.d.ts +19 -0
  31. package/dist/lib/ui/Breadcrumb.js +24 -0
  32. package/dist/lib/ui/Breadcrumb.js.map +1 -0
  33. package/dist/lib/ui/Button.d.ts +1 -2
  34. package/dist/lib/ui/Button.js +1 -1
  35. package/dist/lib/ui/Button.js.map +1 -1
  36. package/dist/lib/ui/Carousel.d.ts +18 -0
  37. package/dist/lib/ui/Carousel.js +99 -0
  38. package/dist/lib/ui/Carousel.js.map +1 -0
  39. package/dist/lib/ui/Checkbox.d.ts +4 -0
  40. package/dist/lib/ui/Checkbox.js +9 -0
  41. package/dist/lib/ui/Checkbox.js.map +1 -0
  42. package/dist/lib/ui/Collapsible.d.ts +5 -0
  43. package/dist/lib/ui/Collapsible.js +6 -0
  44. package/dist/lib/ui/Collapsible.js.map +1 -0
  45. package/dist/lib/{components → ui}/Dialog.js +2 -2
  46. package/dist/lib/ui/Dialog.js.map +1 -0
  47. package/dist/lib/ui/Form.d.ts +23 -0
  48. package/dist/lib/ui/Form.js +63 -0
  49. package/dist/lib/ui/Form.js.map +1 -0
  50. package/dist/lib/ui/HoverCard.d.ts +6 -0
  51. package/dist/lib/ui/HoverCard.js +10 -0
  52. package/dist/lib/ui/HoverCard.js.map +1 -0
  53. package/dist/lib/ui/Label.d.ts +5 -0
  54. package/dist/lib/ui/Label.js +10 -0
  55. package/dist/lib/ui/Label.js.map +1 -0
  56. package/dist/lib/ui/Pagination.d.ts +28 -0
  57. package/dist/lib/ui/Pagination.js +24 -0
  58. package/dist/lib/ui/Pagination.js.map +1 -0
  59. package/dist/lib/ui/Popover.d.ts +6 -0
  60. package/dist/lib/ui/Popover.js +10 -0
  61. package/dist/lib/ui/Popover.js.map +1 -0
  62. package/dist/lib/ui/Progress.d.ts +4 -0
  63. package/dist/lib/ui/Progress.js +8 -0
  64. package/dist/lib/ui/Progress.js.map +1 -0
  65. package/dist/lib/ui/RadioGroup.d.ts +5 -0
  66. package/dist/lib/ui/RadioGroup.js +15 -0
  67. package/dist/lib/ui/RadioGroup.js.map +1 -0
  68. package/dist/lib/ui/ScrollArea.d.ts +5 -0
  69. package/dist/lib/ui/ScrollArea.js +12 -0
  70. package/dist/lib/ui/ScrollArea.js.map +1 -0
  71. package/dist/lib/ui/Select.js.map +1 -0
  72. package/dist/lib/ui/Skeleton.d.ts +2 -0
  73. package/dist/lib/ui/Skeleton.js +7 -0
  74. package/dist/lib/ui/Skeleton.js.map +1 -0
  75. package/dist/lib/ui/Slider.d.ts +4 -0
  76. package/dist/lib/ui/Slider.js +8 -0
  77. package/dist/lib/ui/Slider.js.map +1 -0
  78. package/dist/lib/ui/Switch.d.ts +4 -0
  79. package/dist/lib/ui/Switch.js +8 -0
  80. package/dist/lib/ui/Switch.js.map +1 -0
  81. package/dist/lib/ui/Textarea.d.ts +4 -0
  82. package/dist/lib/ui/Textarea.js +9 -0
  83. package/dist/lib/ui/Textarea.js.map +1 -0
  84. package/dist/lib/ui/Toggle.d.ts +12 -0
  85. package/dist/lib/ui/Toggle.js +26 -0
  86. package/dist/lib/ui/Toggle.js.map +1 -0
  87. package/dist/lib/ui/ToggleGroup.d.ts +12 -0
  88. package/dist/lib/ui/ToggleGroup.js +21 -0
  89. package/dist/lib/ui/ToggleGroup.js.map +1 -0
  90. package/dist/lib/ui/Tooltip.d.ts +7 -0
  91. package/dist/lib/ui/Tooltip.js +11 -0
  92. package/dist/lib/ui/Tooltip.js.map +1 -0
  93. package/dist/lib/util/invariant.d.ts +9 -0
  94. package/dist/lib/util/invariant.js +7 -3
  95. package/dist/lib/util/invariant.js.map +1 -1
  96. package/dist/vite/plugin-component.js +17 -7
  97. package/dist/vite/plugin-component.js.map +1 -1
  98. package/lib/{AuthenticationPlugin-D1nhROkO.js → AuthenticationPlugin-Bpdes0cJ.js} +3 -3
  99. package/lib/{AuthenticationPlugin-D1nhROkO.js.map → AuthenticationPlugin-Bpdes0cJ.js.map} +1 -1
  100. package/lib/{CategoryHeading-B7TlPvuN.js → CategoryHeading-Bb9dqxD3.js} +4 -4
  101. package/lib/{CategoryHeading-B7TlPvuN.js.map → CategoryHeading-Bb9dqxD3.js.map} +1 -1
  102. package/lib/{DeveloperHint-B_QCCafl.js → DeveloperHint-DHdLXGHA.js} +2 -2
  103. package/lib/{DeveloperHint-B_QCCafl.js.map → DeveloperHint-DHdLXGHA.js.map} +1 -1
  104. package/lib/{Markdown-Y__eLG0x.js → Markdown-1BO9EA_X.js} +4265 -6649
  105. package/lib/Markdown-1BO9EA_X.js.map +1 -0
  106. package/lib/{MdxPage-B4FcPIi5.js → MdxPage-BEOcOICU.js} +28 -27
  107. package/lib/{MdxPage-B4FcPIi5.js.map → MdxPage-BEOcOICU.js.map} +1 -1
  108. package/lib/{OperationList-C2jKCTwZ.js → OperationList-Cea2Yt8e.js} +131 -128
  109. package/lib/{OperationList-C2jKCTwZ.js.map → OperationList-Cea2Yt8e.js.map} +1 -1
  110. package/lib/{Route-DWXcQzRK.js → Route-BHT-onwf.js} +3 -3
  111. package/lib/{Route-DWXcQzRK.js.map → Route-BHT-onwf.js.map} +1 -1
  112. package/lib/Select-m1aXZGAP.js +223 -0
  113. package/lib/Select-m1aXZGAP.js.map +1 -0
  114. package/lib/SlotletProvider-CPfsBw39.js +241 -0
  115. package/lib/SlotletProvider-CPfsBw39.js.map +1 -0
  116. package/lib/Spinner-C6zroowC.js +40 -0
  117. package/lib/Spinner-C6zroowC.js.map +1 -0
  118. package/lib/StaggeredRender-DDHSzQKE.js +17 -0
  119. package/lib/StaggeredRender-DDHSzQKE.js.map +1 -0
  120. package/lib/{ZudokuContext-MRoel6bS.js → ZudokuContext-D1D8Anlj.js} +20 -20
  121. package/lib/{ZudokuContext-MRoel6bS.js.map → ZudokuContext-D1D8Anlj.js.map} +1 -1
  122. package/lib/_commonjsHelpers-BkfeUUK-.js +29 -0
  123. package/lib/_commonjsHelpers-BkfeUUK-.js.map +1 -0
  124. package/lib/cn-BmFQLtkS.js +2279 -0
  125. package/lib/cn-BmFQLtkS.js.map +1 -0
  126. package/lib/hook-JSRuxV1P.js +229 -0
  127. package/lib/hook-JSRuxV1P.js.map +1 -0
  128. package/lib/index-Bn6Lc9tq.js +9 -0
  129. package/lib/{index-DJqnphbT.js.map → index-Bn6Lc9tq.js.map} +1 -1
  130. package/lib/index-BuAyrJe3.js +46 -0
  131. package/lib/index-BuAyrJe3.js.map +1 -0
  132. package/lib/{index-DFN92YJN.js → index-CRo94sKK.js} +5 -4
  133. package/lib/{index-DFN92YJN.js.map → index-CRo94sKK.js.map} +1 -1
  134. package/lib/{index-Dso_b0di.js → index-Cj-F-4ME.js} +1207 -1424
  135. package/lib/index-Cj-F-4ME.js.map +1 -0
  136. package/lib/{index-D06ATMgg.js → index-LNp6rxyU.js} +2 -2
  137. package/lib/{index-D06ATMgg.js.map → index-LNp6rxyU.js.map} +1 -1
  138. package/lib/index.esm-C5mr_sKO.js +1193 -0
  139. package/lib/index.esm-C5mr_sKO.js.map +1 -0
  140. package/lib/invariant-Caa8-XvF.js +26 -0
  141. package/lib/invariant-Caa8-XvF.js.map +1 -0
  142. package/lib/ui/Accordion.js +47 -0
  143. package/lib/ui/Accordion.js.map +1 -0
  144. package/lib/ui/Alert.js +51 -0
  145. package/lib/ui/Alert.js.map +1 -0
  146. package/lib/ui/AlertDialog.js +114 -0
  147. package/lib/ui/AlertDialog.js.map +1 -0
  148. package/lib/ui/AspectRatio.js +6 -0
  149. package/lib/ui/AspectRatio.js.map +1 -0
  150. package/lib/ui/Badge.js +27 -0
  151. package/lib/ui/Badge.js.map +1 -0
  152. package/lib/ui/Breadcrumb.js +94 -0
  153. package/lib/ui/Breadcrumb.js.map +1 -0
  154. package/lib/ui/Button.js +49 -0
  155. package/lib/ui/Button.js.map +1 -0
  156. package/lib/ui/Callout.js +77 -0
  157. package/lib/ui/Callout.js.map +1 -0
  158. package/lib/ui/Card.js +62 -0
  159. package/lib/ui/Card.js.map +1 -0
  160. package/lib/ui/Carousel.js +1410 -0
  161. package/lib/ui/Carousel.js.map +1 -0
  162. package/lib/ui/Checkbox.js +28 -0
  163. package/lib/ui/Checkbox.js.map +1 -0
  164. package/lib/ui/Collapsible.js +8 -0
  165. package/lib/ui/Collapsible.js.map +1 -0
  166. package/lib/ui/Dialog.js +101 -0
  167. package/lib/ui/Dialog.js.map +1 -0
  168. package/lib/ui/Drawer.js +1153 -0
  169. package/lib/ui/Drawer.js.map +1 -0
  170. package/lib/ui/DropdownMenu.js +145 -0
  171. package/lib/ui/DropdownMenu.js.map +1 -0
  172. package/lib/ui/Form.js +95 -0
  173. package/lib/ui/Form.js.map +1 -0
  174. package/lib/ui/HoverCard.js +24 -0
  175. package/lib/ui/HoverCard.js.map +1 -0
  176. package/lib/ui/Input.js +22 -0
  177. package/lib/ui/Input.js.map +1 -0
  178. package/lib/ui/Label.js +20 -0
  179. package/lib/ui/Label.js.map +1 -0
  180. package/lib/ui/Note.js +51 -0
  181. package/lib/ui/Note.js.map +1 -0
  182. package/lib/ui/Pagination.js +106 -0
  183. package/lib/ui/Pagination.js.map +1 -0
  184. package/lib/ui/Popover.js +24 -0
  185. package/lib/ui/Popover.js.map +1 -0
  186. package/lib/ui/Progress.js +27 -0
  187. package/lib/ui/Progress.js.map +1 -0
  188. package/lib/ui/RadioGroup.js +32 -0
  189. package/lib/ui/RadioGroup.js.map +1 -0
  190. package/lib/ui/ScrollArea.js +39 -0
  191. package/lib/ui/ScrollArea.js.map +1 -0
  192. package/lib/ui/Select.js +122 -0
  193. package/lib/ui/Select.js.map +1 -0
  194. package/lib/ui/Skeleton.js +18 -0
  195. package/lib/ui/Skeleton.js.map +1 -0
  196. package/lib/ui/Slider.js +24 -0
  197. package/lib/ui/Slider.js.map +1 -0
  198. package/lib/ui/Switch.js +28 -0
  199. package/lib/ui/Switch.js.map +1 -0
  200. package/lib/ui/Tabs.js +47 -0
  201. package/lib/ui/Tabs.js.map +1 -0
  202. package/lib/ui/Textarea.js +21 -0
  203. package/lib/ui/Textarea.js.map +1 -0
  204. package/lib/ui/Toggle.js +38 -0
  205. package/lib/ui/Toggle.js.map +1 -0
  206. package/lib/ui/ToggleGroup.js +42 -0
  207. package/lib/ui/ToggleGroup.js.map +1 -0
  208. package/lib/ui/Tooltip.js +24 -0
  209. package/lib/ui/Tooltip.js.map +1 -0
  210. package/lib/{useExposedProps-BWwxa-Hg.js → useExposedProps-B9K-9GTc.js} +2 -2
  211. package/lib/{useExposedProps-BWwxa-Hg.js.map → useExposedProps-B9K-9GTc.js.map} +1 -1
  212. package/lib/{utils-C8S3st2k.js → utils-B2yoT99j.js} +63 -63
  213. package/lib/{utils-C8S3st2k.js.map → utils-B2yoT99j.js.map} +1 -1
  214. package/lib/zudoku.auth-clerk.js +1 -1
  215. package/lib/zudoku.auth-openid.js +477 -483
  216. package/lib/zudoku.auth-openid.js.map +1 -1
  217. package/lib/zudoku.components.js +847 -2845
  218. package/lib/zudoku.components.js.map +1 -1
  219. package/lib/zudoku.openapi-worker.js +2 -2
  220. package/lib/zudoku.plugin-api-keys.js +68 -75
  221. package/lib/zudoku.plugin-api-keys.js.map +1 -1
  222. package/lib/zudoku.plugin-custom-pages.js +14 -13
  223. package/lib/zudoku.plugin-custom-pages.js.map +1 -1
  224. package/lib/zudoku.plugin-markdown.js +1 -1
  225. package/lib/zudoku.plugin-openapi.js +6 -6
  226. package/package.json +28 -6
  227. package/src/app/main.tsx +1 -1
  228. package/src/lib/authentication/components/CallbackHandler.tsx +20 -51
  229. package/src/lib/errors/ErrorAlert.tsx +18 -5
  230. package/src/lib/plugins/api-keys/CreateApiKey.tsx +2 -2
  231. package/src/lib/plugins/openapi/Sidecar.tsx +2 -2
  232. package/src/lib/plugins/openapi/playground/Playground.tsx +3 -3
  233. package/src/lib/plugins/openapi/playground/PlaygroundDialog.tsx +1 -1
  234. package/src/lib/ui/Accordion.tsx +56 -0
  235. package/src/lib/ui/Alert.tsx +59 -0
  236. package/src/lib/ui/AlertDialog.tsx +139 -0
  237. package/src/lib/ui/AspectRatio.tsx +5 -0
  238. package/src/lib/ui/Badge.tsx +36 -0
  239. package/src/lib/ui/Breadcrumb.tsx +115 -0
  240. package/src/lib/ui/Button.tsx +1 -1
  241. package/src/lib/ui/Carousel.tsx +260 -0
  242. package/src/lib/ui/Checkbox.tsx +28 -0
  243. package/src/lib/ui/Collapsible.tsx +9 -0
  244. package/src/lib/{components → ui}/Dialog.tsx +4 -3
  245. package/src/lib/ui/Form.tsx +177 -0
  246. package/src/lib/ui/HoverCard.tsx +27 -0
  247. package/src/lib/ui/Label.tsx +24 -0
  248. package/src/lib/ui/Pagination.tsx +117 -0
  249. package/src/lib/ui/Popover.tsx +29 -0
  250. package/src/lib/ui/Progress.tsx +26 -0
  251. package/src/lib/ui/RadioGroup.tsx +42 -0
  252. package/src/lib/ui/ScrollArea.tsx +46 -0
  253. package/src/lib/ui/Skeleton.tsx +15 -0
  254. package/src/lib/ui/Slider.tsx +26 -0
  255. package/src/lib/ui/Switch.tsx +27 -0
  256. package/src/lib/ui/Textarea.tsx +23 -0
  257. package/src/lib/ui/Toggle.tsx +43 -0
  258. package/src/lib/ui/ToggleGroup.tsx +59 -0
  259. package/src/lib/ui/Tooltip.tsx +28 -0
  260. package/src/lib/util/invariant.ts +15 -3
  261. package/dist/internal.d.ts +0 -1
  262. package/dist/internal.js +0 -2
  263. package/dist/internal.js.map +0 -1
  264. package/dist/lib/components/Dialog.js.map +0 -1
  265. package/dist/lib/components/Select.js.map +0 -1
  266. package/lib/ErrorPage-DqqAV1dr.js +0 -16
  267. package/lib/ErrorPage-DqqAV1dr.js.map +0 -1
  268. package/lib/Input-DrR6P3mq.js +0 -2229
  269. package/lib/Input-DrR6P3mq.js.map +0 -1
  270. package/lib/Markdown-Y__eLG0x.js.map +0 -1
  271. package/lib/SidebarBadge-C0iWtji9.js +0 -503
  272. package/lib/SidebarBadge-C0iWtji9.js.map +0 -1
  273. package/lib/SlotletProvider-DmqWiVFt.js +0 -239
  274. package/lib/SlotletProvider-DmqWiVFt.js.map +0 -1
  275. package/lib/Spinner-3cQDBVGr.js +0 -7
  276. package/lib/Spinner-3cQDBVGr.js.map +0 -1
  277. package/lib/index-Ch8VO_uX.js +0 -2867
  278. package/lib/index-Ch8VO_uX.js.map +0 -1
  279. package/lib/index-DJqnphbT.js +0 -35
  280. package/lib/index-Dso_b0di.js.map +0 -1
  281. package/lib/index-bYAqbdYl.js +0 -124
  282. package/lib/index-bYAqbdYl.js.map +0 -1
  283. /package/dist/lib/{components → ui}/Dialog.d.ts +0 -0
  284. /package/dist/lib/{components → ui}/Select.d.ts +0 -0
  285. /package/dist/lib/{components → ui}/Select.js +0 -0
  286. /package/src/lib/{components → ui}/Select.tsx +0 -0
@@ -0,0 +1,260 @@
1
+ import useEmblaCarousel, {
2
+ type UseEmblaCarouselType,
3
+ } from "embla-carousel-react";
4
+ import { ArrowLeft, ArrowRight } from "lucide-react";
5
+ import * as React from "react";
6
+
7
+ import { cn } from "../util/cn.js";
8
+ import { Button } from "./Button.js";
9
+
10
+ type CarouselApi = UseEmblaCarouselType[1];
11
+ type UseCarouselParameters = Parameters<typeof useEmblaCarousel>;
12
+ type CarouselOptions = UseCarouselParameters[0];
13
+ type CarouselPlugin = UseCarouselParameters[1];
14
+
15
+ type CarouselProps = {
16
+ opts?: CarouselOptions;
17
+ plugins?: CarouselPlugin;
18
+ orientation?: "horizontal" | "vertical";
19
+ setApi?: (api: CarouselApi) => void;
20
+ };
21
+
22
+ type CarouselContextProps = {
23
+ carouselRef: ReturnType<typeof useEmblaCarousel>[0];
24
+ api: ReturnType<typeof useEmblaCarousel>[1];
25
+ scrollPrev: () => void;
26
+ scrollNext: () => void;
27
+ canScrollPrev: boolean;
28
+ canScrollNext: boolean;
29
+ } & CarouselProps;
30
+
31
+ const CarouselContext = React.createContext<CarouselContextProps | null>(null);
32
+
33
+ function useCarousel() {
34
+ const context = React.useContext(CarouselContext);
35
+
36
+ if (!context) {
37
+ throw new Error("useCarousel must be used within a <Carousel />");
38
+ }
39
+
40
+ return context;
41
+ }
42
+
43
+ const Carousel = React.forwardRef<
44
+ HTMLDivElement,
45
+ React.HTMLAttributes<HTMLDivElement> & CarouselProps
46
+ >(
47
+ (
48
+ {
49
+ orientation = "horizontal",
50
+ opts,
51
+ setApi,
52
+ plugins,
53
+ className,
54
+ children,
55
+ ...props
56
+ },
57
+ ref,
58
+ ) => {
59
+ const [carouselRef, api] = useEmblaCarousel(
60
+ {
61
+ ...opts,
62
+ axis: orientation === "horizontal" ? "x" : "y",
63
+ },
64
+ plugins,
65
+ );
66
+ const [canScrollPrev, setCanScrollPrev] = React.useState(false);
67
+ const [canScrollNext, setCanScrollNext] = React.useState(false);
68
+
69
+ const onSelect = React.useCallback((api: CarouselApi) => {
70
+ if (!api) {
71
+ return;
72
+ }
73
+
74
+ setCanScrollPrev(api.canScrollPrev());
75
+ setCanScrollNext(api.canScrollNext());
76
+ }, []);
77
+
78
+ const scrollPrev = React.useCallback(() => {
79
+ api?.scrollPrev();
80
+ }, [api]);
81
+
82
+ const scrollNext = React.useCallback(() => {
83
+ api?.scrollNext();
84
+ }, [api]);
85
+
86
+ const handleKeyDown = React.useCallback(
87
+ (event: React.KeyboardEvent<HTMLDivElement>) => {
88
+ if (event.key === "ArrowLeft") {
89
+ event.preventDefault();
90
+ scrollPrev();
91
+ } else if (event.key === "ArrowRight") {
92
+ event.preventDefault();
93
+ scrollNext();
94
+ }
95
+ },
96
+ [scrollPrev, scrollNext],
97
+ );
98
+
99
+ React.useEffect(() => {
100
+ if (!api || !setApi) {
101
+ return;
102
+ }
103
+
104
+ setApi(api);
105
+ }, [api, setApi]);
106
+
107
+ React.useEffect(() => {
108
+ if (!api) {
109
+ return;
110
+ }
111
+
112
+ onSelect(api);
113
+ api.on("reInit", onSelect);
114
+ api.on("select", onSelect);
115
+
116
+ return () => {
117
+ api.off("select", onSelect);
118
+ };
119
+ }, [api, onSelect]);
120
+
121
+ return (
122
+ <CarouselContext.Provider
123
+ value={{
124
+ carouselRef,
125
+ api: api,
126
+ opts,
127
+ orientation:
128
+ orientation || (opts?.axis === "y" ? "vertical" : "horizontal"),
129
+ scrollPrev,
130
+ scrollNext,
131
+ canScrollPrev,
132
+ canScrollNext,
133
+ }}
134
+ >
135
+ <div
136
+ ref={ref}
137
+ onKeyDownCapture={handleKeyDown}
138
+ className={cn("relative", className)}
139
+ role="region"
140
+ aria-roledescription="carousel"
141
+ {...props}
142
+ >
143
+ {children}
144
+ </div>
145
+ </CarouselContext.Provider>
146
+ );
147
+ },
148
+ );
149
+ Carousel.displayName = "Carousel";
150
+
151
+ const CarouselContent = React.forwardRef<
152
+ HTMLDivElement,
153
+ React.HTMLAttributes<HTMLDivElement>
154
+ >(({ className, ...props }, ref) => {
155
+ const { carouselRef, orientation } = useCarousel();
156
+
157
+ return (
158
+ <div ref={carouselRef} className="overflow-hidden">
159
+ <div
160
+ ref={ref}
161
+ className={cn(
162
+ "flex",
163
+ orientation === "horizontal" ? "-ml-4" : "-mt-4 flex-col",
164
+ className,
165
+ )}
166
+ {...props}
167
+ />
168
+ </div>
169
+ );
170
+ });
171
+ CarouselContent.displayName = "CarouselContent";
172
+
173
+ const CarouselItem = React.forwardRef<
174
+ HTMLDivElement,
175
+ React.HTMLAttributes<HTMLDivElement>
176
+ >(({ className, ...props }, ref) => {
177
+ const { orientation } = useCarousel();
178
+
179
+ return (
180
+ <div
181
+ ref={ref}
182
+ role="group"
183
+ aria-roledescription="slide"
184
+ className={cn(
185
+ "min-w-0 shrink-0 grow-0 basis-full",
186
+ orientation === "horizontal" ? "pl-4" : "pt-4",
187
+ className,
188
+ )}
189
+ {...props}
190
+ />
191
+ );
192
+ });
193
+ CarouselItem.displayName = "CarouselItem";
194
+
195
+ const CarouselPrevious = React.forwardRef<
196
+ HTMLButtonElement,
197
+ React.ComponentProps<typeof Button>
198
+ >(({ className, variant = "outline", size = "icon", ...props }, ref) => {
199
+ const { orientation, scrollPrev, canScrollPrev } = useCarousel();
200
+
201
+ return (
202
+ <Button
203
+ ref={ref}
204
+ variant={variant}
205
+ size={size}
206
+ className={cn(
207
+ "absolute h-8 w-8 rounded-full",
208
+ orientation === "horizontal"
209
+ ? "-left-12 top-1/2 -translate-y-1/2"
210
+ : "-top-12 left-1/2 -translate-x-1/2 rotate-90",
211
+ className,
212
+ )}
213
+ disabled={!canScrollPrev}
214
+ onClick={scrollPrev}
215
+ {...props}
216
+ >
217
+ <ArrowLeft className="h-4 w-4" />
218
+ <span className="sr-only">Previous slide</span>
219
+ </Button>
220
+ );
221
+ });
222
+ CarouselPrevious.displayName = "CarouselPrevious";
223
+
224
+ const CarouselNext = React.forwardRef<
225
+ HTMLButtonElement,
226
+ React.ComponentProps<typeof Button>
227
+ >(({ className, variant = "outline", size = "icon", ...props }, ref) => {
228
+ const { orientation, scrollNext, canScrollNext } = useCarousel();
229
+
230
+ return (
231
+ <Button
232
+ ref={ref}
233
+ variant={variant}
234
+ size={size}
235
+ className={cn(
236
+ "absolute h-8 w-8 rounded-full",
237
+ orientation === "horizontal"
238
+ ? "-right-12 top-1/2 -translate-y-1/2"
239
+ : "-bottom-12 left-1/2 -translate-x-1/2 rotate-90",
240
+ className,
241
+ )}
242
+ disabled={!canScrollNext}
243
+ onClick={scrollNext}
244
+ {...props}
245
+ >
246
+ <ArrowRight className="h-4 w-4" />
247
+ <span className="sr-only">Next slide</span>
248
+ </Button>
249
+ );
250
+ });
251
+ CarouselNext.displayName = "CarouselNext";
252
+
253
+ export {
254
+ Carousel,
255
+ CarouselContent,
256
+ CarouselItem,
257
+ CarouselNext,
258
+ CarouselPrevious,
259
+ type CarouselApi,
260
+ };
@@ -0,0 +1,28 @@
1
+ import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
2
+ import { Check } from "lucide-react";
3
+ import * as React from "react";
4
+
5
+ import { cn } from "../util/cn.js";
6
+
7
+ const Checkbox = React.forwardRef<
8
+ React.ElementRef<typeof CheckboxPrimitive.Root>,
9
+ React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>
10
+ >(({ className, ...props }, ref) => (
11
+ <CheckboxPrimitive.Root
12
+ ref={ref}
13
+ className={cn(
14
+ "peer h-4 w-4 shrink-0 rounded-sm border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground",
15
+ className,
16
+ )}
17
+ {...props}
18
+ >
19
+ <CheckboxPrimitive.Indicator
20
+ className={cn("flex items-center justify-center text-current")}
21
+ >
22
+ <Check className="h-4 w-4" />
23
+ </CheckboxPrimitive.Indicator>
24
+ </CheckboxPrimitive.Root>
25
+ ));
26
+ Checkbox.displayName = CheckboxPrimitive.Root.displayName;
27
+
28
+ export { Checkbox };
@@ -0,0 +1,9 @@
1
+ import * as CollapsiblePrimitive from "@radix-ui/react-collapsible";
2
+
3
+ const Collapsible = CollapsiblePrimitive.Root;
4
+
5
+ const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger;
6
+
7
+ const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent;
8
+
9
+ export { Collapsible, CollapsibleContent, CollapsibleTrigger };
@@ -1,6 +1,7 @@
1
1
  import * as DialogPrimitive from "@radix-ui/react-dialog";
2
- import { XIcon } from "lucide-react";
2
+ import { X } from "lucide-react";
3
3
  import * as React from "react";
4
+
4
5
  import { cn } from "../util/cn.js";
5
6
 
6
7
  const Dialog = DialogPrimitive.Root;
@@ -35,14 +36,14 @@ const DialogContent = React.forwardRef<
35
36
  <DialogPrimitive.Content
36
37
  ref={ref}
37
38
  className={cn(
38
- "fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg border-border",
39
+ "fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",
39
40
  className,
40
41
  )}
41
42
  {...props}
42
43
  >
43
44
  {children}
44
45
  <DialogPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground">
45
- <XIcon className="h-4 w-4" />
46
+ <X className="h-4 w-4" />
46
47
  <span className="sr-only">Close</span>
47
48
  </DialogPrimitive.Close>
48
49
  </DialogPrimitive.Content>
@@ -0,0 +1,177 @@
1
+ import * as LabelPrimitive from "@radix-ui/react-label";
2
+ import { Slot } from "@radix-ui/react-slot";
3
+ import * as React from "react";
4
+ import {
5
+ Controller,
6
+ ControllerProps,
7
+ FieldPath,
8
+ FieldValues,
9
+ FormProvider,
10
+ useFormContext,
11
+ } from "react-hook-form";
12
+
13
+ import { cn } from "../util/cn.js";
14
+ import { Label } from "./Label.js";
15
+
16
+ const Form = FormProvider;
17
+
18
+ type FormFieldContextValue<
19
+ TFieldValues extends FieldValues = FieldValues,
20
+ TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
21
+ > = {
22
+ name: TName;
23
+ };
24
+
25
+ const FormFieldContext = React.createContext<FormFieldContextValue>(
26
+ {} as FormFieldContextValue,
27
+ );
28
+
29
+ const FormField = <
30
+ TFieldValues extends FieldValues = FieldValues,
31
+ TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
32
+ >({
33
+ ...props
34
+ }: ControllerProps<TFieldValues, TName>) => {
35
+ return (
36
+ <FormFieldContext.Provider value={{ name: props.name }}>
37
+ <Controller {...props} />
38
+ </FormFieldContext.Provider>
39
+ );
40
+ };
41
+
42
+ const useFormField = () => {
43
+ const fieldContext = React.useContext(FormFieldContext);
44
+ const itemContext = React.useContext(FormItemContext);
45
+ const { getFieldState, formState } = useFormContext();
46
+
47
+ const fieldState = getFieldState(fieldContext.name, formState);
48
+
49
+ if (!fieldContext) {
50
+ throw new Error("useFormField should be used within <FormField>");
51
+ }
52
+
53
+ const { id } = itemContext;
54
+
55
+ return {
56
+ id,
57
+ name: fieldContext.name,
58
+ formItemId: `${id}-form-item`,
59
+ formDescriptionId: `${id}-form-item-description`,
60
+ formMessageId: `${id}-form-item-message`,
61
+ ...fieldState,
62
+ };
63
+ };
64
+
65
+ type FormItemContextValue = {
66
+ id: string;
67
+ };
68
+
69
+ const FormItemContext = React.createContext<FormItemContextValue>(
70
+ {} as FormItemContextValue,
71
+ );
72
+
73
+ const FormItem = React.forwardRef<
74
+ HTMLDivElement,
75
+ React.HTMLAttributes<HTMLDivElement>
76
+ >(({ className, ...props }, ref) => {
77
+ const id = React.useId();
78
+
79
+ return (
80
+ <FormItemContext.Provider value={{ id }}>
81
+ <div ref={ref} className={cn("space-y-2", className)} {...props} />
82
+ </FormItemContext.Provider>
83
+ );
84
+ });
85
+ FormItem.displayName = "FormItem";
86
+
87
+ const FormLabel = React.forwardRef<
88
+ React.ElementRef<typeof LabelPrimitive.Root>,
89
+ React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root>
90
+ >(({ className, ...props }, ref) => {
91
+ const { error, formItemId } = useFormField();
92
+
93
+ return (
94
+ <Label
95
+ ref={ref}
96
+ className={cn(error && "text-destructive", className)}
97
+ htmlFor={formItemId}
98
+ {...props}
99
+ />
100
+ );
101
+ });
102
+ FormLabel.displayName = "FormLabel";
103
+
104
+ const FormControl = React.forwardRef<
105
+ React.ElementRef<typeof Slot>,
106
+ React.ComponentPropsWithoutRef<typeof Slot>
107
+ >(({ ...props }, ref) => {
108
+ const { error, formItemId, formDescriptionId, formMessageId } =
109
+ useFormField();
110
+
111
+ return (
112
+ <Slot
113
+ ref={ref}
114
+ id={formItemId}
115
+ aria-describedby={
116
+ !error
117
+ ? `${formDescriptionId}`
118
+ : `${formDescriptionId} ${formMessageId}`
119
+ }
120
+ aria-invalid={!!error}
121
+ {...props}
122
+ />
123
+ );
124
+ });
125
+ FormControl.displayName = "FormControl";
126
+
127
+ const FormDescription = React.forwardRef<
128
+ HTMLParagraphElement,
129
+ React.HTMLAttributes<HTMLParagraphElement>
130
+ >(({ className, ...props }, ref) => {
131
+ const { formDescriptionId } = useFormField();
132
+
133
+ return (
134
+ <p
135
+ ref={ref}
136
+ id={formDescriptionId}
137
+ className={cn("text-sm text-muted-foreground", className)}
138
+ {...props}
139
+ />
140
+ );
141
+ });
142
+ FormDescription.displayName = "FormDescription";
143
+
144
+ const FormMessage = React.forwardRef<
145
+ HTMLParagraphElement,
146
+ React.HTMLAttributes<HTMLParagraphElement>
147
+ >(({ className, children, ...props }, ref) => {
148
+ const { error, formMessageId } = useFormField();
149
+ const body = error ? String(error.message) : children;
150
+
151
+ if (!body) {
152
+ return null;
153
+ }
154
+
155
+ return (
156
+ <p
157
+ ref={ref}
158
+ id={formMessageId}
159
+ className={cn("text-sm font-medium text-destructive", className)}
160
+ {...props}
161
+ >
162
+ {body}
163
+ </p>
164
+ );
165
+ });
166
+ FormMessage.displayName = "FormMessage";
167
+
168
+ export {
169
+ Form,
170
+ FormControl,
171
+ FormDescription,
172
+ FormField,
173
+ FormItem,
174
+ FormLabel,
175
+ FormMessage,
176
+ useFormField,
177
+ };
@@ -0,0 +1,27 @@
1
+ import * as HoverCardPrimitive from "@radix-ui/react-hover-card";
2
+ import * as React from "react";
3
+
4
+ import { cn } from "../util/cn.js";
5
+
6
+ const HoverCard = HoverCardPrimitive.Root;
7
+
8
+ const HoverCardTrigger = HoverCardPrimitive.Trigger;
9
+
10
+ const HoverCardContent = React.forwardRef<
11
+ React.ElementRef<typeof HoverCardPrimitive.Content>,
12
+ React.ComponentPropsWithoutRef<typeof HoverCardPrimitive.Content>
13
+ >(({ className, align = "center", sideOffset = 4, ...props }, ref) => (
14
+ <HoverCardPrimitive.Content
15
+ ref={ref}
16
+ align={align}
17
+ sideOffset={sideOffset}
18
+ className={cn(
19
+ "z-50 w-64 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
20
+ className,
21
+ )}
22
+ {...props}
23
+ />
24
+ ));
25
+ HoverCardContent.displayName = HoverCardPrimitive.Content.displayName;
26
+
27
+ export { HoverCard, HoverCardContent, HoverCardTrigger };
@@ -0,0 +1,24 @@
1
+ import * as LabelPrimitive from "@radix-ui/react-label";
2
+ import { cva, type VariantProps } from "class-variance-authority";
3
+ import * as React from "react";
4
+
5
+ import { cn } from "../util/cn.js";
6
+
7
+ const labelVariants = cva(
8
+ "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",
9
+ );
10
+
11
+ const Label = React.forwardRef<
12
+ React.ElementRef<typeof LabelPrimitive.Root>,
13
+ React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &
14
+ VariantProps<typeof labelVariants>
15
+ >(({ className, ...props }, ref) => (
16
+ <LabelPrimitive.Root
17
+ ref={ref}
18
+ className={cn(labelVariants(), className)}
19
+ {...props}
20
+ />
21
+ ));
22
+ Label.displayName = LabelPrimitive.Root.displayName;
23
+
24
+ export { Label };
@@ -0,0 +1,117 @@
1
+ import { ChevronLeft, ChevronRight, MoreHorizontal } from "lucide-react";
2
+ import * as React from "react";
3
+
4
+ import { cn } from "../util/cn.js";
5
+ import { ButtonProps, buttonVariants } from "./Button.js";
6
+
7
+ const Pagination = ({ className, ...props }: React.ComponentProps<"nav">) => (
8
+ <nav
9
+ role="navigation"
10
+ aria-label="pagination"
11
+ className={cn("mx-auto flex w-full justify-center", className)}
12
+ {...props}
13
+ />
14
+ );
15
+ Pagination.displayName = "Pagination";
16
+
17
+ const PaginationContent = React.forwardRef<
18
+ HTMLUListElement,
19
+ React.ComponentProps<"ul">
20
+ >(({ className, ...props }, ref) => (
21
+ <ul
22
+ ref={ref}
23
+ className={cn("flex flex-row items-center gap-1", className)}
24
+ {...props}
25
+ />
26
+ ));
27
+ PaginationContent.displayName = "PaginationContent";
28
+
29
+ const PaginationItem = React.forwardRef<
30
+ HTMLLIElement,
31
+ React.ComponentProps<"li">
32
+ >(({ className, ...props }, ref) => (
33
+ <li ref={ref} className={cn("", className)} {...props} />
34
+ ));
35
+ PaginationItem.displayName = "PaginationItem";
36
+
37
+ type PaginationLinkProps = {
38
+ isActive?: boolean;
39
+ } & Pick<ButtonProps, "size"> &
40
+ React.ComponentProps<"a">;
41
+
42
+ const PaginationLink = ({
43
+ className,
44
+ isActive,
45
+ size = "icon",
46
+ ...props
47
+ }: PaginationLinkProps) => (
48
+ <a
49
+ aria-current={isActive ? "page" : undefined}
50
+ className={cn(
51
+ buttonVariants({
52
+ variant: isActive ? "outline" : "ghost",
53
+ size,
54
+ }),
55
+ className,
56
+ )}
57
+ {...props}
58
+ />
59
+ );
60
+ PaginationLink.displayName = "PaginationLink";
61
+
62
+ const PaginationPrevious = ({
63
+ className,
64
+ ...props
65
+ }: React.ComponentProps<typeof PaginationLink>) => (
66
+ <PaginationLink
67
+ aria-label="Go to previous page"
68
+ size="default"
69
+ className={cn("gap-1 pl-2.5", className)}
70
+ {...props}
71
+ >
72
+ <ChevronLeft className="h-4 w-4" />
73
+ <span>Previous</span>
74
+ </PaginationLink>
75
+ );
76
+ PaginationPrevious.displayName = "PaginationPrevious";
77
+
78
+ const PaginationNext = ({
79
+ className,
80
+ ...props
81
+ }: React.ComponentProps<typeof PaginationLink>) => (
82
+ <PaginationLink
83
+ aria-label="Go to next page"
84
+ size="default"
85
+ className={cn("gap-1 pr-2.5", className)}
86
+ {...props}
87
+ >
88
+ <span>Next</span>
89
+ <ChevronRight className="h-4 w-4" />
90
+ </PaginationLink>
91
+ );
92
+ PaginationNext.displayName = "PaginationNext";
93
+
94
+ const PaginationEllipsis = ({
95
+ className,
96
+ ...props
97
+ }: React.ComponentProps<"span">) => (
98
+ <span
99
+ aria-hidden
100
+ className={cn("flex h-9 w-9 items-center justify-center", className)}
101
+ {...props}
102
+ >
103
+ <MoreHorizontal className="h-4 w-4" />
104
+ <span className="sr-only">More pages</span>
105
+ </span>
106
+ );
107
+ PaginationEllipsis.displayName = "PaginationEllipsis";
108
+
109
+ export {
110
+ Pagination,
111
+ PaginationContent,
112
+ PaginationEllipsis,
113
+ PaginationItem,
114
+ PaginationLink,
115
+ PaginationNext,
116
+ PaginationPrevious,
117
+ };
@@ -0,0 +1,29 @@
1
+ import * as PopoverPrimitive from "@radix-ui/react-popover";
2
+ import * as React from "react";
3
+
4
+ import { cn } from "../util/cn.js";
5
+
6
+ const Popover = PopoverPrimitive.Root;
7
+
8
+ const PopoverTrigger = PopoverPrimitive.Trigger;
9
+
10
+ const PopoverContent = React.forwardRef<
11
+ React.ElementRef<typeof PopoverPrimitive.Content>,
12
+ React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>
13
+ >(({ className, align = "center", sideOffset = 4, ...props }, ref) => (
14
+ <PopoverPrimitive.Portal>
15
+ <PopoverPrimitive.Content
16
+ ref={ref}
17
+ align={align}
18
+ sideOffset={sideOffset}
19
+ className={cn(
20
+ "z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
21
+ className,
22
+ )}
23
+ {...props}
24
+ />
25
+ </PopoverPrimitive.Portal>
26
+ ));
27
+ PopoverContent.displayName = PopoverPrimitive.Content.displayName;
28
+
29
+ export { Popover, PopoverContent, PopoverTrigger };