zudoku 0.13.6 → 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 (255) hide show
  1. package/dist/app/main.js +1 -1
  2. package/dist/app/main.js.map +1 -1
  3. package/dist/lib/plugins/api-keys/CreateApiKey.js +1 -1
  4. package/dist/lib/plugins/api-keys/CreateApiKey.js.map +1 -1
  5. package/dist/lib/plugins/openapi/Sidecar.js +2 -2
  6. package/dist/lib/plugins/openapi/playground/Playground.js +1 -1
  7. package/dist/lib/plugins/openapi/playground/Playground.js.map +1 -1
  8. package/dist/lib/plugins/openapi/playground/PlaygroundDialog.js +1 -1
  9. package/dist/lib/plugins/openapi/playground/PlaygroundDialog.js.map +1 -1
  10. package/dist/lib/ui/Accordion.d.ts +7 -0
  11. package/dist/lib/ui/Accordion.js +14 -0
  12. package/dist/lib/ui/Accordion.js.map +1 -0
  13. package/dist/lib/ui/Alert.d.ts +8 -0
  14. package/dist/lib/ui/Alert.js +23 -0
  15. package/dist/lib/ui/Alert.js.map +1 -0
  16. package/dist/lib/ui/AlertDialog.d.ts +20 -0
  17. package/dist/lib/ui/AlertDialog.js +27 -0
  18. package/dist/lib/ui/AlertDialog.js.map +1 -0
  19. package/dist/lib/ui/AspectRatio.d.ts +3 -0
  20. package/dist/lib/ui/AspectRatio.js +4 -0
  21. package/dist/lib/ui/AspectRatio.js.map +1 -0
  22. package/dist/lib/ui/Badge.d.ts +9 -0
  23. package/dist/lib/ui/Badge.js +21 -0
  24. package/dist/lib/ui/Badge.js.map +1 -0
  25. package/dist/lib/ui/Breadcrumb.d.ts +19 -0
  26. package/dist/lib/ui/Breadcrumb.js +24 -0
  27. package/dist/lib/ui/Breadcrumb.js.map +1 -0
  28. package/dist/lib/ui/Button.d.ts +1 -2
  29. package/dist/lib/ui/Button.js +1 -1
  30. package/dist/lib/ui/Button.js.map +1 -1
  31. package/dist/lib/ui/Carousel.d.ts +18 -0
  32. package/dist/lib/ui/Carousel.js +99 -0
  33. package/dist/lib/ui/Carousel.js.map +1 -0
  34. package/dist/lib/ui/Checkbox.d.ts +4 -0
  35. package/dist/lib/ui/Checkbox.js +9 -0
  36. package/dist/lib/ui/Checkbox.js.map +1 -0
  37. package/dist/lib/ui/Collapsible.d.ts +5 -0
  38. package/dist/lib/ui/Collapsible.js +6 -0
  39. package/dist/lib/ui/Collapsible.js.map +1 -0
  40. package/dist/lib/{components → ui}/Dialog.js +2 -2
  41. package/dist/lib/ui/Dialog.js.map +1 -0
  42. package/dist/lib/ui/Form.d.ts +23 -0
  43. package/dist/lib/ui/Form.js +63 -0
  44. package/dist/lib/ui/Form.js.map +1 -0
  45. package/dist/lib/ui/HoverCard.d.ts +6 -0
  46. package/dist/lib/ui/HoverCard.js +10 -0
  47. package/dist/lib/ui/HoverCard.js.map +1 -0
  48. package/dist/lib/ui/Label.d.ts +5 -0
  49. package/dist/lib/ui/Label.js +10 -0
  50. package/dist/lib/ui/Label.js.map +1 -0
  51. package/dist/lib/ui/Pagination.d.ts +28 -0
  52. package/dist/lib/ui/Pagination.js +24 -0
  53. package/dist/lib/ui/Pagination.js.map +1 -0
  54. package/dist/lib/ui/Popover.d.ts +6 -0
  55. package/dist/lib/ui/Popover.js +10 -0
  56. package/dist/lib/ui/Popover.js.map +1 -0
  57. package/dist/lib/ui/Progress.d.ts +4 -0
  58. package/dist/lib/ui/Progress.js +8 -0
  59. package/dist/lib/ui/Progress.js.map +1 -0
  60. package/dist/lib/ui/RadioGroup.d.ts +5 -0
  61. package/dist/lib/ui/RadioGroup.js +15 -0
  62. package/dist/lib/ui/RadioGroup.js.map +1 -0
  63. package/dist/lib/ui/ScrollArea.d.ts +5 -0
  64. package/dist/lib/ui/ScrollArea.js +12 -0
  65. package/dist/lib/ui/ScrollArea.js.map +1 -0
  66. package/dist/lib/ui/Select.js.map +1 -0
  67. package/dist/lib/ui/Skeleton.d.ts +2 -0
  68. package/dist/lib/ui/Skeleton.js +7 -0
  69. package/dist/lib/ui/Skeleton.js.map +1 -0
  70. package/dist/lib/ui/Slider.d.ts +4 -0
  71. package/dist/lib/ui/Slider.js +8 -0
  72. package/dist/lib/ui/Slider.js.map +1 -0
  73. package/dist/lib/ui/Switch.d.ts +4 -0
  74. package/dist/lib/ui/Switch.js +8 -0
  75. package/dist/lib/ui/Switch.js.map +1 -0
  76. package/dist/lib/ui/Textarea.d.ts +4 -0
  77. package/dist/lib/ui/Textarea.js +9 -0
  78. package/dist/lib/ui/Textarea.js.map +1 -0
  79. package/dist/lib/ui/Toggle.d.ts +12 -0
  80. package/dist/lib/ui/Toggle.js +26 -0
  81. package/dist/lib/ui/Toggle.js.map +1 -0
  82. package/dist/lib/ui/ToggleGroup.d.ts +12 -0
  83. package/dist/lib/ui/ToggleGroup.js +21 -0
  84. package/dist/lib/ui/ToggleGroup.js.map +1 -0
  85. package/dist/lib/ui/Tooltip.d.ts +7 -0
  86. package/dist/lib/ui/Tooltip.js +11 -0
  87. package/dist/lib/ui/Tooltip.js.map +1 -0
  88. package/dist/vite/plugin-component.js +17 -7
  89. package/dist/vite/plugin-component.js.map +1 -1
  90. package/lib/{AuthenticationPlugin-tBvLKsFg.js → AuthenticationPlugin-Bpdes0cJ.js} +2 -2
  91. package/lib/{AuthenticationPlugin-tBvLKsFg.js.map → AuthenticationPlugin-Bpdes0cJ.js.map} +1 -1
  92. package/lib/{CategoryHeading-D2WS6sRI.js → CategoryHeading-Bb9dqxD3.js} +4 -4
  93. package/lib/{CategoryHeading-D2WS6sRI.js.map → CategoryHeading-Bb9dqxD3.js.map} +1 -1
  94. package/lib/{DeveloperHint-CRiZjqd2.js → DeveloperHint-DHdLXGHA.js} +2 -2
  95. package/lib/{DeveloperHint-CRiZjqd2.js.map → DeveloperHint-DHdLXGHA.js.map} +1 -1
  96. package/lib/{Markdown-DM4zv3MA.js → Markdown-1BO9EA_X.js} +4265 -6650
  97. package/lib/Markdown-1BO9EA_X.js.map +1 -0
  98. package/lib/{MdxPage-tWI_P8wP.js → MdxPage-BEOcOICU.js} +26 -25
  99. package/lib/{MdxPage-tWI_P8wP.js.map → MdxPage-BEOcOICU.js.map} +1 -1
  100. package/lib/{OperationList-Cd3lue0b.js → OperationList-Cea2Yt8e.js} +131 -127
  101. package/lib/{OperationList-Cd3lue0b.js.map → OperationList-Cea2Yt8e.js.map} +1 -1
  102. package/lib/{Route-DI0Y0pIV.js → Route-BHT-onwf.js} +2 -2
  103. package/lib/{Route-DI0Y0pIV.js.map → Route-BHT-onwf.js.map} +1 -1
  104. package/lib/Select-m1aXZGAP.js +223 -0
  105. package/lib/Select-m1aXZGAP.js.map +1 -0
  106. package/lib/{SlotletProvider-CBqY8mp6.js → SlotletProvider-CPfsBw39.js} +4 -4
  107. package/lib/{SlotletProvider-CBqY8mp6.js.map → SlotletProvider-CPfsBw39.js.map} +1 -1
  108. package/lib/Spinner-C6zroowC.js +40 -0
  109. package/lib/Spinner-C6zroowC.js.map +1 -0
  110. package/lib/StaggeredRender-DDHSzQKE.js +17 -0
  111. package/lib/StaggeredRender-DDHSzQKE.js.map +1 -0
  112. package/lib/{ZudokuContext-DEoP3GGJ.js → ZudokuContext-D1D8Anlj.js} +19 -19
  113. package/lib/{ZudokuContext-DEoP3GGJ.js.map → ZudokuContext-D1D8Anlj.js.map} +1 -1
  114. package/lib/cn-BmFQLtkS.js +2279 -0
  115. package/lib/cn-BmFQLtkS.js.map +1 -0
  116. package/lib/hook-JSRuxV1P.js +229 -0
  117. package/lib/hook-JSRuxV1P.js.map +1 -0
  118. package/lib/index-BuAyrJe3.js +46 -0
  119. package/lib/index-BuAyrJe3.js.map +1 -0
  120. package/lib/{index-Bs9roz8y.js → index-Cj-F-4ME.js} +1203 -1428
  121. package/lib/index-Cj-F-4ME.js.map +1 -0
  122. package/lib/index.esm-C5mr_sKO.js +1193 -0
  123. package/lib/index.esm-C5mr_sKO.js.map +1 -0
  124. package/lib/ui/Accordion.js +47 -0
  125. package/lib/ui/Accordion.js.map +1 -0
  126. package/lib/ui/Alert.js +51 -0
  127. package/lib/ui/Alert.js.map +1 -0
  128. package/lib/ui/AlertDialog.js +114 -0
  129. package/lib/ui/AlertDialog.js.map +1 -0
  130. package/lib/ui/AspectRatio.js +6 -0
  131. package/lib/ui/AspectRatio.js.map +1 -0
  132. package/lib/ui/Badge.js +27 -0
  133. package/lib/ui/Badge.js.map +1 -0
  134. package/lib/ui/Breadcrumb.js +94 -0
  135. package/lib/ui/Breadcrumb.js.map +1 -0
  136. package/lib/ui/Button.js +49 -0
  137. package/lib/ui/Button.js.map +1 -0
  138. package/lib/ui/Callout.js +77 -0
  139. package/lib/ui/Callout.js.map +1 -0
  140. package/lib/ui/Card.js +62 -0
  141. package/lib/ui/Card.js.map +1 -0
  142. package/lib/ui/Carousel.js +1410 -0
  143. package/lib/ui/Carousel.js.map +1 -0
  144. package/lib/ui/Checkbox.js +28 -0
  145. package/lib/ui/Checkbox.js.map +1 -0
  146. package/lib/ui/Collapsible.js +8 -0
  147. package/lib/ui/Collapsible.js.map +1 -0
  148. package/lib/ui/Dialog.js +101 -0
  149. package/lib/ui/Dialog.js.map +1 -0
  150. package/lib/ui/Drawer.js +1153 -0
  151. package/lib/ui/Drawer.js.map +1 -0
  152. package/lib/ui/DropdownMenu.js +145 -0
  153. package/lib/ui/DropdownMenu.js.map +1 -0
  154. package/lib/ui/Form.js +95 -0
  155. package/lib/ui/Form.js.map +1 -0
  156. package/lib/ui/HoverCard.js +24 -0
  157. package/lib/ui/HoverCard.js.map +1 -0
  158. package/lib/ui/Input.js +22 -0
  159. package/lib/ui/Input.js.map +1 -0
  160. package/lib/ui/Label.js +20 -0
  161. package/lib/ui/Label.js.map +1 -0
  162. package/lib/ui/Note.js +51 -0
  163. package/lib/ui/Note.js.map +1 -0
  164. package/lib/ui/Pagination.js +106 -0
  165. package/lib/ui/Pagination.js.map +1 -0
  166. package/lib/ui/Popover.js +24 -0
  167. package/lib/ui/Popover.js.map +1 -0
  168. package/lib/ui/Progress.js +27 -0
  169. package/lib/ui/Progress.js.map +1 -0
  170. package/lib/ui/RadioGroup.js +32 -0
  171. package/lib/ui/RadioGroup.js.map +1 -0
  172. package/lib/ui/ScrollArea.js +39 -0
  173. package/lib/ui/ScrollArea.js.map +1 -0
  174. package/lib/ui/Select.js +122 -0
  175. package/lib/ui/Select.js.map +1 -0
  176. package/lib/ui/Skeleton.js +18 -0
  177. package/lib/ui/Skeleton.js.map +1 -0
  178. package/lib/ui/Slider.js +24 -0
  179. package/lib/ui/Slider.js.map +1 -0
  180. package/lib/ui/Switch.js +28 -0
  181. package/lib/ui/Switch.js.map +1 -0
  182. package/lib/ui/Tabs.js +47 -0
  183. package/lib/ui/Tabs.js.map +1 -0
  184. package/lib/ui/Textarea.js +21 -0
  185. package/lib/ui/Textarea.js.map +1 -0
  186. package/lib/ui/Toggle.js +38 -0
  187. package/lib/ui/Toggle.js.map +1 -0
  188. package/lib/ui/ToggleGroup.js +42 -0
  189. package/lib/ui/ToggleGroup.js.map +1 -0
  190. package/lib/ui/Tooltip.js +24 -0
  191. package/lib/ui/Tooltip.js.map +1 -0
  192. package/lib/{utils-G5XSiZc9.js → utils-B2yoT99j.js} +61 -61
  193. package/lib/{utils-G5XSiZc9.js.map → utils-B2yoT99j.js.map} +1 -1
  194. package/lib/zudoku.auth-clerk.js +1 -1
  195. package/lib/zudoku.auth-openid.js +2 -2
  196. package/lib/zudoku.components.js +847 -2844
  197. package/lib/zudoku.components.js.map +1 -1
  198. package/lib/zudoku.plugin-api-keys.js +22 -19
  199. package/lib/zudoku.plugin-api-keys.js.map +1 -1
  200. package/lib/zudoku.plugin-custom-pages.js +14 -13
  201. package/lib/zudoku.plugin-custom-pages.js.map +1 -1
  202. package/lib/zudoku.plugin-markdown.js +1 -1
  203. package/lib/zudoku.plugin-openapi.js +6 -5
  204. package/lib/zudoku.plugin-openapi.js.map +1 -1
  205. package/package.json +28 -6
  206. package/src/app/main.tsx +1 -1
  207. package/src/lib/plugins/api-keys/CreateApiKey.tsx +2 -2
  208. package/src/lib/plugins/openapi/Sidecar.tsx +2 -2
  209. package/src/lib/plugins/openapi/playground/Playground.tsx +3 -3
  210. package/src/lib/plugins/openapi/playground/PlaygroundDialog.tsx +1 -1
  211. package/src/lib/ui/Accordion.tsx +56 -0
  212. package/src/lib/ui/Alert.tsx +59 -0
  213. package/src/lib/ui/AlertDialog.tsx +139 -0
  214. package/src/lib/ui/AspectRatio.tsx +5 -0
  215. package/src/lib/ui/Badge.tsx +36 -0
  216. package/src/lib/ui/Breadcrumb.tsx +115 -0
  217. package/src/lib/ui/Button.tsx +1 -1
  218. package/src/lib/ui/Carousel.tsx +260 -0
  219. package/src/lib/ui/Checkbox.tsx +28 -0
  220. package/src/lib/ui/Collapsible.tsx +9 -0
  221. package/src/lib/{components → ui}/Dialog.tsx +4 -3
  222. package/src/lib/ui/Form.tsx +177 -0
  223. package/src/lib/ui/HoverCard.tsx +27 -0
  224. package/src/lib/ui/Label.tsx +24 -0
  225. package/src/lib/ui/Pagination.tsx +117 -0
  226. package/src/lib/ui/Popover.tsx +29 -0
  227. package/src/lib/ui/Progress.tsx +26 -0
  228. package/src/lib/ui/RadioGroup.tsx +42 -0
  229. package/src/lib/ui/ScrollArea.tsx +46 -0
  230. package/src/lib/ui/Skeleton.tsx +15 -0
  231. package/src/lib/ui/Slider.tsx +26 -0
  232. package/src/lib/ui/Switch.tsx +27 -0
  233. package/src/lib/ui/Textarea.tsx +23 -0
  234. package/src/lib/ui/Toggle.tsx +43 -0
  235. package/src/lib/ui/ToggleGroup.tsx +59 -0
  236. package/src/lib/ui/Tooltip.tsx +28 -0
  237. package/dist/internal.d.ts +0 -1
  238. package/dist/internal.js +0 -2
  239. package/dist/internal.js.map +0 -1
  240. package/dist/lib/components/Dialog.js.map +0 -1
  241. package/dist/lib/components/Select.js.map +0 -1
  242. package/lib/Input-CO-1DOZa.js +0 -2229
  243. package/lib/Input-CO-1DOZa.js.map +0 -1
  244. package/lib/Markdown-DM4zv3MA.js.map +0 -1
  245. package/lib/Spinner-DFQhPMBl.js +0 -505
  246. package/lib/Spinner-DFQhPMBl.js.map +0 -1
  247. package/lib/index-Bs9roz8y.js.map +0 -1
  248. package/lib/index-CBr6BM_4.js +0 -2867
  249. package/lib/index-CBr6BM_4.js.map +0 -1
  250. package/lib/index-UUT9q9f9.js +0 -124
  251. package/lib/index-UUT9q9f9.js.map +0 -1
  252. /package/dist/lib/{components → ui}/Dialog.d.ts +0 -0
  253. /package/dist/lib/{components → ui}/Select.d.ts +0 -0
  254. /package/dist/lib/{components → ui}/Select.js +0 -0
  255. /package/src/lib/{components → ui}/Select.tsx +0 -0
@@ -1,16 +1,19 @@
1
1
  import { j as e } from "./jsx-runtime-B6kdoens.js";
2
- import { S as m, R as g } from "./SlotletProvider-CBqY8mp6.js";
2
+ import { S as m, R as f } from "./SlotletProvider-CPfsBw39.js";
3
3
  import { i as c } from "./invariant-Caa8-XvF.js";
4
- import { u as f, a as d, I as j, S as v, b, c as w, d as k, e as K, f as x } from "./Input-CO-1DOZa.js";
5
- import { a as N, L as u, O as I } from "./index-CRo94sKK.js";
6
- import { u as h, a as S, b as A } from "./ZudokuContext-DEoP3GGJ.js";
7
- import { B as l, f as C } from "./index-CBr6BM_4.js";
8
- import { D as E } from "./DeveloperHint-CRiZjqd2.js";
4
+ import { u as d, S as g, a as j, b as v, c as w, d as b, e as x } from "./Select-m1aXZGAP.js";
5
+ import { a as k } from "./index.esm-C5mr_sKO.js";
6
+ import { a as K, L as u, O as N } from "./index-CRo94sKK.js";
7
+ import { u as h, a as I, e as S } from "./ZudokuContext-D1D8Anlj.js";
8
+ import { Button as l } from "./ui/Button.js";
9
+ import { Input as A } from "./ui/Input.js";
10
+ import { u as C } from "./hook-JSRuxV1P.js";
11
+ import { D as E } from "./DeveloperHint-DHdLXGHA.js";
9
12
  import { RotateCwIcon as P, TrashIcon as D, EyeOffIcon as R, EyeIcon as q, CheckIcon as O, CopyIcon as z } from "lucide-react";
10
13
  import { useState as p } from "react";
11
- import { a as T } from "./Markdown-DM4zv3MA.js";
14
+ import { c as T } from "./cn-BmFQLtkS.js";
12
15
  const F = ({ service: t }) => {
13
- const s = h(), r = N(), n = f({
16
+ const s = h(), r = K(), n = k({
14
17
  defaultValues: {
15
18
  expiresOn: "30"
16
19
  }
@@ -34,16 +37,16 @@ const F = ({ service: t }) => {
34
37
  onSubmit: n.handleSubmit((a) => o.mutate(a)),
35
38
  children: /* @__PURE__ */ e.jsxs("div", { className: "flex gap-2 flex-col", children: [
36
39
  "Note",
37
- /* @__PURE__ */ e.jsx(j, { ...n.register("description") }),
40
+ /* @__PURE__ */ e.jsx(A, { ...n.register("description") }),
38
41
  "Expiration",
39
42
  /* @__PURE__ */ e.jsxs(
40
- v,
43
+ g,
41
44
  {
42
45
  onValueChange: (a) => n.setValue("expiresOn", a),
43
46
  defaultValue: n.getValues("expiresOn"),
44
47
  children: [
45
- /* @__PURE__ */ e.jsx(b, { children: /* @__PURE__ */ e.jsx(w, {}) }),
46
- /* @__PURE__ */ e.jsx(k, { children: /* @__PURE__ */ e.jsxs(K, { children: [
48
+ /* @__PURE__ */ e.jsx(j, { children: /* @__PURE__ */ e.jsx(v, {}) }),
49
+ /* @__PURE__ */ e.jsx(w, { children: /* @__PURE__ */ e.jsxs(b, { children: [
47
50
  [7, 30, 60, 90].map((a) => /* @__PURE__ */ e.jsxs(x, { value: String(a), children: [
48
51
  a,
49
52
  " days"
@@ -66,7 +69,7 @@ const F = ({ service: t }) => {
66
69
  return s.setDate(s.getDate() + t), s.toISOString();
67
70
  }, V = () => {
68
71
  const t = C();
69
- return t.isAuthEnabled && t.isPending ? null : t.isAuthenticated ? /* @__PURE__ */ e.jsx(I, {}) : t.isAuthEnabled ? /* @__PURE__ */ e.jsxs("div", { className: "flex flex-col justify-center gap-2 items-center h-1/2", children: [
72
+ return t.isAuthEnabled && t.isPending ? null : t.isAuthenticated ? /* @__PURE__ */ e.jsx(N, {}) : t.isAuthEnabled ? /* @__PURE__ */ e.jsxs("div", { className: "flex flex-col justify-center gap-2 items-center h-1/2", children: [
70
73
  "Please login first to view this page",
71
74
  /* @__PURE__ */ e.jsx(l, { onClick: () => t.login(), children: "Login" })
72
75
  ] }) : /* @__PURE__ */ e.jsx("div", { className: "flex flex-col justify-center gap-2 items-center h-1/2", children: /* @__PURE__ */ e.jsxs(E, { className: "max-w-[600px]", children: [
@@ -75,7 +78,7 @@ const F = ({ service: t }) => {
75
78
  "."
76
79
  ] }) });
77
80
  }, M = ({ service: t }) => {
78
- const s = h(), r = S(), { data: n } = A({
81
+ const s = h(), r = I(), { data: n } = S({
79
82
  queryFn: () => t.getKeys(s),
80
83
  queryKey: ["api-keys"],
81
84
  retry: !1
@@ -196,7 +199,7 @@ const F = ({ service: t }) => {
196
199
  }
197
200
  )
198
201
  ] });
199
- }, Q = "https://zudoku-rewiringamerica-main-ef9c9c0.d2.zuplo.dev", B = (t) => ({
202
+ }, Q = "https://zudoku-rewiringamerica-main-ef9c9c0.d2.zuplo.dev", G = (t) => ({
200
203
  deleteKey: async (s, r) => {
201
204
  const n = new Request(t + `/v1/developer/api-keys/${s}`, {
202
205
  method: "DELETE"
@@ -233,8 +236,8 @@ const F = ({ service: t }) => {
233
236
  const n = await fetch(r);
234
237
  return c(n.ok, "Failed to fetch API keys"), await n.json();
235
238
  }
236
- }), se = (t) => {
237
- const s = "endpoint" in t ? t.endpoint : Q, r = "getKeys" in t ? t : B(s);
239
+ }), re = (t) => {
240
+ const s = "endpoint" in t ? t.endpoint : Q, r = "getKeys" in t ? t : G(s);
238
241
  return {
239
242
  getProfileMenuItems: () => [
240
243
  {
@@ -256,7 +259,7 @@ const F = ({ service: t }) => {
256
259
  getRoutes: () => [
257
260
  {
258
261
  element: /* @__PURE__ */ e.jsx(V, {}),
259
- errorElement: /* @__PURE__ */ e.jsx(g, {}),
262
+ errorElement: /* @__PURE__ */ e.jsx(f, {}),
260
263
  children: [
261
264
  {
262
265
  path: "/settings/api-keys",
@@ -272,6 +275,6 @@ const F = ({ service: t }) => {
272
275
  };
273
276
  };
274
277
  export {
275
- se as apiKeyPlugin
278
+ re as apiKeyPlugin
276
279
  };
277
280
  //# sourceMappingURL=zudoku.plugin-api-keys.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"zudoku.plugin-api-keys.js","sources":["../src/lib/plugins/api-keys/CreateApiKey.tsx","../src/lib/plugins/api-keys/ProtectedRoute.tsx","../src/lib/plugins/api-keys/SettingsApiKeys.tsx","../src/lib/plugins/api-keys/index.tsx"],"sourcesContent":["import { useMutation } from \"@tanstack/react-query\";\nimport { useForm } from \"react-hook-form\";\nimport { Link, useNavigate } from \"react-router-dom\";\nimport { useZudoku } from \"../../components/context/ZudokuContext.js\";\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../components/Select.js\";\nimport { Button } from \"../../ui/Button.js\";\nimport { Input } from \"../../ui/Input.js\";\nimport { ApiKeyService } from \"./index.js\";\n\ntype CreateApiKey = { description: string; expiresOn?: string };\n\nexport const CreateApiKey = ({ service }: { service: ApiKeyService }) => {\n const context = useZudoku();\n const navigate = useNavigate();\n const form = useForm<CreateApiKey>({\n defaultValues: {\n expiresOn: \"30\",\n },\n });\n const createKeyMutation = useMutation({\n mutationFn: ({ description, expiresOn }: CreateApiKey) => {\n if (!service.createKey) {\n throw new Error(\"deleteKey not implemented\");\n }\n\n const expiresOnDate =\n expiresOn !== \"never\" ? addDaysToDate(Number(expiresOn)) : undefined;\n\n return service.createKey(\n { description: description, expiresOn: expiresOnDate },\n context,\n );\n },\n onSuccess: () => navigate(\"/settings/api-keys/\"),\n });\n\n if (!service.createKey) {\n return null;\n }\n\n return (\n <div className=\"max-w-screen-lg pt-[--padding-content-top] pb-[--padding-content-bottom]\">\n <div className=\"flex justify-between mb-4 border-b pb-1\">\n <h1 className=\"font-medium text-2xl\">New API Key</h1>\n </div>\n <form\n onSubmit={form.handleSubmit((data) => createKeyMutation.mutate(data))}\n >\n <div className=\"flex gap-2 flex-col\">\n Note\n <Input {...form.register(\"description\")} />\n Expiration\n <Select\n onValueChange={(value) => form.setValue(\"expiresOn\", value)}\n defaultValue={form.getValues(\"expiresOn\")}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectGroup>\n {[7, 30, 60, 90].map((option) => (\n <SelectItem value={String(option)} key={option}>\n {option} days\n </SelectItem>\n ))}\n <SelectItem value=\"never\">Never</SelectItem>\n </SelectGroup>\n </SelectContent>\n </Select>\n <div className=\"flex gap-2\">\n <Button>Generate Key</Button>\n <Button variant=\"outline\" asChild>\n <Link to=\"/settings/api-keys/\">Cancel</Link>\n </Button>\n </div>\n </div>\n </form>\n </div>\n );\n};\n\nconst addDaysToDate = (days: number): string => {\n const date = new Date();\n date.setDate(date.getDate() + days);\n return date.toISOString();\n};\n","import { Outlet } from \"react-router-dom\";\nimport { useAuth } from \"../../authentication/hook.js\";\nimport { DeveloperHint } from \"../../components/DeveloperHint.js\";\nimport { Button } from \"../../ui/Button.js\";\n\nexport const ProtectedRoute = () => {\n const auth = useAuth();\n\n // TODO: should we suspend here somehow?\n if (auth.isAuthEnabled && auth.isPending) {\n return null;\n }\n\n return auth.isAuthenticated ? (\n <Outlet />\n ) : !auth.isAuthEnabled ? (\n <div className=\"flex flex-col justify-center gap-2 items-center h-1/2\">\n <DeveloperHint className=\"max-w-[600px]\">\n Authentication needs to be enabled for API keys to work. Enable it in\n your Zudoku configuration under <code>authentication</code>.\n </DeveloperHint>\n </div>\n ) : (\n <div className=\"flex flex-col justify-center gap-2 items-center h-1/2\">\n Please login first to view this page\n <Button onClick={() => auth.login()}>Login</Button>\n </div>\n );\n};\n","import {\n useMutation,\n useQueryClient,\n useSuspenseQuery,\n} from \"@tanstack/react-query\";\nimport {\n CheckIcon,\n CopyIcon,\n EyeIcon,\n EyeOffIcon,\n RotateCwIcon,\n TrashIcon,\n} from \"lucide-react\";\nimport { useState } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { useZudoku } from \"../../components/context/ZudokuContext.js\";\nimport { Slotlet } from \"../../components/SlotletProvider.js\";\nimport { Button } from \"../../ui/Button.js\";\nimport { cn } from \"../../util/cn.js\";\nimport { ApiKeyService } from \"./index.js\";\n\nexport const SettingsApiKeys = ({ service }: { service: ApiKeyService }) => {\n const context = useZudoku();\n const queryClient = useQueryClient();\n const { data } = useSuspenseQuery({\n queryFn: () => service.getKeys(context),\n queryKey: [\"api-keys\"],\n retry: false,\n });\n\n const deleteKeyMutation = useMutation({\n mutationFn: (id: string) => {\n if (!service.deleteKey) {\n throw new Error(\"deleteKey not implemented\");\n }\n\n return service.deleteKey(id, context);\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [\"api-keys\"] });\n },\n });\n\n const rollKeyMutation = useMutation({\n mutationFn: (id: string) => {\n if (!service.rollKey) {\n throw new Error(\"rollKey not implemented\");\n }\n\n return service.rollKey(id, context);\n },\n onSuccess: () => queryClient.invalidateQueries({ queryKey: [\"api-keys\"] }),\n });\n\n return (\n <div className=\"max-w-screen-lg h-full pt-[--padding-content-top] pb-[--padding-content-bottom]\">\n <Slotlet name=\"api-keys-list-page\" />\n\n <div className=\"flex justify-between mb-4 border-b pb-3\">\n <h1 className=\"font-medium text-2xl\">API Keys</h1>\n {service.createKey && (\n <Button asChild>\n <Link to=\"/settings/api-keys/new\">Create API Key</Link>\n </Button>\n )}\n </div>\n\n <Slotlet name=\"api-keys-list-page-before-keys\" />\n\n {data.length === 0 ? (\n <div className=\"flex flex-col justify-center gap-4 items-center p-8 border rounded bg-muted/30 text-muted-foreground\">\n <p className=\"text-center\">\n No API keys created yet.\n <br />\n Get started and create your first key.\n </p>\n {service.createKey && (\n <Button asChild variant=\"outline\">\n <Link to=\"/settings/api-keys/new\">Create API Key</Link>\n </Button>\n )}\n </div>\n ) : (\n <ul\n className={cn(\n \"grid grid-cols-1 rounded border divide-y divide-border\",\n \"lg:grid-cols-[minmax(250px,min-content)_1fr_min-content]\",\n )}\n >\n {data.map((key) => (\n <li\n className=\"p-5 grid grid-cols-subgrid col-span-full gap-2 items-center\"\n key={key.id}\n >\n <div className=\"flex flex-col gap-1 text-sm\">\n {key.description ?? key.id}\n <div className=\"text-muted-foreground text-xs\">\n {key.createdOn && (\n <div>\n Created on {new Date(key.createdOn).toLocaleDateString()}\n </div>\n )}\n {key.expiresOn && (\n <div>\n Expires on {new Date(key.expiresOn).toLocaleDateString()}\n </div>\n )}\n </div>\n </div>\n <div className=\"items-center flex lg:justify-center\">\n <RevealApiKey apiKey={key.key} />\n </div>\n <div className=\"flex gap-2\">\n {service.rollKey && (\n <Button\n size=\"icon\"\n title=\"Roll this key\"\n variant=\"ghost\"\n onClick={() => {\n if (!confirm(\"Do you want to roll this key?\")) {\n return;\n }\n\n rollKeyMutation.mutate(key.id);\n }}\n >\n <RotateCwIcon size={16} />\n </Button>\n )}\n {service.deleteKey && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => {\n if (!confirm(\"Do you want to delete this key?\")) {\n return;\n }\n\n deleteKeyMutation.mutate(key.id);\n }}\n disabled={deleteKeyMutation.isPending}\n >\n <TrashIcon size={16} />\n </Button>\n )}\n </div>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n};\n\nconst RevealApiKey = ({ apiKey }: { apiKey: string }) => {\n const [revealed, setRevealed] = useState(false);\n const [copied, setCopied] = useState(false);\n\n return (\n <div className=\"flex gap-2 items-center text-sm\">\n <div className=\"border rounded bg-gray-100 dark:bg-gray-950 p-1 font-mono truncate h-9 items-center flex px-2\">\n {revealed ? apiKey : \"•\".repeat(apiKey.length)}\n </div>\n <Button\n variant=\"outline\"\n onClick={() => setRevealed((prev) => !prev)}\n size=\"icon\"\n >\n {revealed ? <EyeOffIcon size={16} /> : <EyeIcon size={16} />}\n </Button>\n <Button\n variant=\"outline\"\n onClick={() => {\n void navigator.clipboard.writeText(apiKey).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n }}\n size=\"icon\"\n >\n {copied ? <CheckIcon size={16} /> : <CopyIcon size={16} />}\n </Button>\n </div>\n );\n};\n","import { type RouteObject } from \"react-router-dom\";\nimport { DevPortalContext } from \"../../core/DevPortalContext.js\";\nimport {\n type ApiIdentityPlugin,\n type DevPortalPlugin,\n ProfileMenuPlugin,\n} from \"../../core/plugins.js\";\nimport { RouterError } from \"../../errors/RouterError.js\";\nimport invariant from \"../../util/invariant.js\";\nimport { CreateApiKey } from \"./CreateApiKey.js\";\nimport { ProtectedRoute } from \"./ProtectedRoute.js\";\nimport { SettingsApiKeys } from \"./SettingsApiKeys.js\";\n\nconst DEFAULT_API_KEY_ENDPOINT =\n \"https://zudoku-rewiringamerica-main-ef9c9c0.d2.zuplo.dev\";\n\nexport type ApiKeyService = {\n getKeys: (context: DevPortalContext) => Promise<ApiKey[]>;\n rollKey?: (id: string, context: DevPortalContext) => Promise<void>;\n deleteKey?: (id: string, context: DevPortalContext) => Promise<void>;\n updateKeyDescription?: (\n apiKey: { id: string; description: string },\n context: DevPortalContext,\n ) => Promise<void>;\n getUsage?: (apiKeys: string[], context: DevPortalContext) => Promise<void>;\n createKey?: (\n apiKey: { description: string; expiresOn?: string },\n context: DevPortalContext,\n ) => Promise<void>;\n};\n\nexport type GetApiKeysOptions = ApiKeyService | { endpoint: string } | object;\n\nexport type ApiKeyPluginOptions = object & GetApiKeysOptions;\n\nexport interface ApiKey {\n id: string;\n description?: string;\n createdOn?: string;\n updatedOn?: string;\n expiresOn?: string;\n key: string;\n}\n\nconst createDefaultHandler = (endpoint: string): ApiKeyService => {\n return {\n deleteKey: async (id, context) => {\n const request = new Request(endpoint + `/v1/developer/api-keys/${id}`, {\n method: \"DELETE\",\n });\n\n await context.signRequest(request);\n\n const response = await fetch(request);\n invariant(response.ok, \"Failed to delete API key\");\n },\n rollKey: async (id, context) => {\n const response = await fetch(\n await context.signRequest(\n new Request(endpoint + `/v1/developer/api-keys/${id}/key`, {\n method: \"DELETE\",\n }),\n ),\n );\n invariant(response.ok, \"Failed to delete API key\");\n },\n createKey: async (apiKey, context) => {\n const request = new Request(endpoint + `/v1/developer/api-keys`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(apiKey),\n });\n\n await context.signRequest(request);\n\n const response = await fetch(request);\n invariant(response.ok, \"Failed to create API key\");\n },\n getKeys: async (context) => {\n const request = new Request(endpoint + `/v1/developer/api-keys`);\n\n await context.signRequest(request);\n\n const keys = await fetch(request);\n invariant(keys.ok, \"Failed to fetch API keys\");\n\n return await keys.json();\n },\n };\n};\n\nexport const apiKeyPlugin = (\n options: ApiKeyPluginOptions,\n): DevPortalPlugin & ApiIdentityPlugin & ProfileMenuPlugin => {\n const endpoint =\n \"endpoint\" in options ? options.endpoint : DEFAULT_API_KEY_ENDPOINT;\n\n const service =\n \"getKeys\" in options ? options : createDefaultHandler(endpoint);\n\n return {\n getProfileMenuItems: () => [\n {\n label: \"API Keys\",\n path: \"/settings/api-keys\",\n },\n ],\n getIdentities: async (context) => {\n try {\n const keys = await service.getKeys(context);\n\n return keys.map((key) => ({\n authorizeRequest: (request) => {\n request.headers.set(\"Authorization\", `Bearer ${key.key}`);\n return request;\n },\n id: key.id,\n label: key.description ?? key.id,\n }));\n } catch {\n return [];\n }\n },\n getRoutes: (): RouteObject[] => {\n // TODO: Make lazy\n return [\n {\n element: <ProtectedRoute />,\n errorElement: <RouterError />,\n children: [\n {\n path: \"/settings/api-keys\",\n element: <SettingsApiKeys service={service} />,\n },\n {\n path: \"/settings/api-keys/new\",\n element: <CreateApiKey service={service} />,\n },\n ],\n },\n ];\n },\n };\n};\n"],"names":["CreateApiKey","service","context","useZudoku","navigate","useNavigate","form","useForm","createKeyMutation","useMutation","description","expiresOn","expiresOnDate","addDaysToDate","jsxs","jsx","data","Input","Select","value","SelectTrigger","SelectValue","SelectContent","SelectGroup","option","SelectItem","Button","Link","days","date","ProtectedRoute","auth","useAuth","Outlet","DeveloperHint","SettingsApiKeys","queryClient","useQueryClient","useSuspenseQuery","deleteKeyMutation","id","rollKeyMutation","Slotlet","cn","key","RevealApiKey","RotateCwIcon","TrashIcon","apiKey","revealed","setRevealed","useState","copied","setCopied","prev","EyeOffIcon","EyeIcon","CheckIcon","CopyIcon","DEFAULT_API_KEY_ENDPOINT","createDefaultHandler","endpoint","request","response","invariant","keys","apiKeyPlugin","options","RouterError"],"mappings":"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"}
1
+ {"version":3,"file":"zudoku.plugin-api-keys.js","sources":["../src/lib/plugins/api-keys/CreateApiKey.tsx","../src/lib/plugins/api-keys/ProtectedRoute.tsx","../src/lib/plugins/api-keys/SettingsApiKeys.tsx","../src/lib/plugins/api-keys/index.tsx"],"sourcesContent":["import { useMutation } from \"@tanstack/react-query\";\nimport { useForm } from \"react-hook-form\";\nimport { Link, useNavigate } from \"react-router-dom\";\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"zudoku/ui/Select.js\";\nimport { useZudoku } from \"../../components/context/ZudokuContext.js\";\nimport { Button } from \"../../ui/Button.js\";\nimport { Input } from \"../../ui/Input.js\";\nimport { ApiKeyService } from \"./index.js\";\n\ntype CreateApiKey = { description: string; expiresOn?: string };\n\nexport const CreateApiKey = ({ service }: { service: ApiKeyService }) => {\n const context = useZudoku();\n const navigate = useNavigate();\n const form = useForm<CreateApiKey>({\n defaultValues: {\n expiresOn: \"30\",\n },\n });\n const createKeyMutation = useMutation({\n mutationFn: ({ description, expiresOn }: CreateApiKey) => {\n if (!service.createKey) {\n throw new Error(\"deleteKey not implemented\");\n }\n\n const expiresOnDate =\n expiresOn !== \"never\" ? addDaysToDate(Number(expiresOn)) : undefined;\n\n return service.createKey(\n { description: description, expiresOn: expiresOnDate },\n context,\n );\n },\n onSuccess: () => navigate(\"/settings/api-keys/\"),\n });\n\n if (!service.createKey) {\n return null;\n }\n\n return (\n <div className=\"max-w-screen-lg pt-[--padding-content-top] pb-[--padding-content-bottom]\">\n <div className=\"flex justify-between mb-4 border-b pb-1\">\n <h1 className=\"font-medium text-2xl\">New API Key</h1>\n </div>\n <form\n onSubmit={form.handleSubmit((data) => createKeyMutation.mutate(data))}\n >\n <div className=\"flex gap-2 flex-col\">\n Note\n <Input {...form.register(\"description\")} />\n Expiration\n <Select\n onValueChange={(value) => form.setValue(\"expiresOn\", value)}\n defaultValue={form.getValues(\"expiresOn\")}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectGroup>\n {[7, 30, 60, 90].map((option) => (\n <SelectItem value={String(option)} key={option}>\n {option} days\n </SelectItem>\n ))}\n <SelectItem value=\"never\">Never</SelectItem>\n </SelectGroup>\n </SelectContent>\n </Select>\n <div className=\"flex gap-2\">\n <Button>Generate Key</Button>\n <Button variant=\"outline\" asChild>\n <Link to=\"/settings/api-keys/\">Cancel</Link>\n </Button>\n </div>\n </div>\n </form>\n </div>\n );\n};\n\nconst addDaysToDate = (days: number): string => {\n const date = new Date();\n date.setDate(date.getDate() + days);\n return date.toISOString();\n};\n","import { Outlet } from \"react-router-dom\";\nimport { useAuth } from \"../../authentication/hook.js\";\nimport { DeveloperHint } from \"../../components/DeveloperHint.js\";\nimport { Button } from \"../../ui/Button.js\";\n\nexport const ProtectedRoute = () => {\n const auth = useAuth();\n\n // TODO: should we suspend here somehow?\n if (auth.isAuthEnabled && auth.isPending) {\n return null;\n }\n\n return auth.isAuthenticated ? (\n <Outlet />\n ) : !auth.isAuthEnabled ? (\n <div className=\"flex flex-col justify-center gap-2 items-center h-1/2\">\n <DeveloperHint className=\"max-w-[600px]\">\n Authentication needs to be enabled for API keys to work. Enable it in\n your Zudoku configuration under <code>authentication</code>.\n </DeveloperHint>\n </div>\n ) : (\n <div className=\"flex flex-col justify-center gap-2 items-center h-1/2\">\n Please login first to view this page\n <Button onClick={() => auth.login()}>Login</Button>\n </div>\n );\n};\n","import {\n useMutation,\n useQueryClient,\n useSuspenseQuery,\n} from \"@tanstack/react-query\";\nimport {\n CheckIcon,\n CopyIcon,\n EyeIcon,\n EyeOffIcon,\n RotateCwIcon,\n TrashIcon,\n} from \"lucide-react\";\nimport { useState } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { useZudoku } from \"../../components/context/ZudokuContext.js\";\nimport { Slotlet } from \"../../components/SlotletProvider.js\";\nimport { Button } from \"../../ui/Button.js\";\nimport { cn } from \"../../util/cn.js\";\nimport { ApiKeyService } from \"./index.js\";\n\nexport const SettingsApiKeys = ({ service }: { service: ApiKeyService }) => {\n const context = useZudoku();\n const queryClient = useQueryClient();\n const { data } = useSuspenseQuery({\n queryFn: () => service.getKeys(context),\n queryKey: [\"api-keys\"],\n retry: false,\n });\n\n const deleteKeyMutation = useMutation({\n mutationFn: (id: string) => {\n if (!service.deleteKey) {\n throw new Error(\"deleteKey not implemented\");\n }\n\n return service.deleteKey(id, context);\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [\"api-keys\"] });\n },\n });\n\n const rollKeyMutation = useMutation({\n mutationFn: (id: string) => {\n if (!service.rollKey) {\n throw new Error(\"rollKey not implemented\");\n }\n\n return service.rollKey(id, context);\n },\n onSuccess: () => queryClient.invalidateQueries({ queryKey: [\"api-keys\"] }),\n });\n\n return (\n <div className=\"max-w-screen-lg h-full pt-[--padding-content-top] pb-[--padding-content-bottom]\">\n <Slotlet name=\"api-keys-list-page\" />\n\n <div className=\"flex justify-between mb-4 border-b pb-3\">\n <h1 className=\"font-medium text-2xl\">API Keys</h1>\n {service.createKey && (\n <Button asChild>\n <Link to=\"/settings/api-keys/new\">Create API Key</Link>\n </Button>\n )}\n </div>\n\n <Slotlet name=\"api-keys-list-page-before-keys\" />\n\n {data.length === 0 ? (\n <div className=\"flex flex-col justify-center gap-4 items-center p-8 border rounded bg-muted/30 text-muted-foreground\">\n <p className=\"text-center\">\n No API keys created yet.\n <br />\n Get started and create your first key.\n </p>\n {service.createKey && (\n <Button asChild variant=\"outline\">\n <Link to=\"/settings/api-keys/new\">Create API Key</Link>\n </Button>\n )}\n </div>\n ) : (\n <ul\n className={cn(\n \"grid grid-cols-1 rounded border divide-y divide-border\",\n \"lg:grid-cols-[minmax(250px,min-content)_1fr_min-content]\",\n )}\n >\n {data.map((key) => (\n <li\n className=\"p-5 grid grid-cols-subgrid col-span-full gap-2 items-center\"\n key={key.id}\n >\n <div className=\"flex flex-col gap-1 text-sm\">\n {key.description ?? key.id}\n <div className=\"text-muted-foreground text-xs\">\n {key.createdOn && (\n <div>\n Created on {new Date(key.createdOn).toLocaleDateString()}\n </div>\n )}\n {key.expiresOn && (\n <div>\n Expires on {new Date(key.expiresOn).toLocaleDateString()}\n </div>\n )}\n </div>\n </div>\n <div className=\"items-center flex lg:justify-center\">\n <RevealApiKey apiKey={key.key} />\n </div>\n <div className=\"flex gap-2\">\n {service.rollKey && (\n <Button\n size=\"icon\"\n title=\"Roll this key\"\n variant=\"ghost\"\n onClick={() => {\n if (!confirm(\"Do you want to roll this key?\")) {\n return;\n }\n\n rollKeyMutation.mutate(key.id);\n }}\n >\n <RotateCwIcon size={16} />\n </Button>\n )}\n {service.deleteKey && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => {\n if (!confirm(\"Do you want to delete this key?\")) {\n return;\n }\n\n deleteKeyMutation.mutate(key.id);\n }}\n disabled={deleteKeyMutation.isPending}\n >\n <TrashIcon size={16} />\n </Button>\n )}\n </div>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n};\n\nconst RevealApiKey = ({ apiKey }: { apiKey: string }) => {\n const [revealed, setRevealed] = useState(false);\n const [copied, setCopied] = useState(false);\n\n return (\n <div className=\"flex gap-2 items-center text-sm\">\n <div className=\"border rounded bg-gray-100 dark:bg-gray-950 p-1 font-mono truncate h-9 items-center flex px-2\">\n {revealed ? apiKey : \"•\".repeat(apiKey.length)}\n </div>\n <Button\n variant=\"outline\"\n onClick={() => setRevealed((prev) => !prev)}\n size=\"icon\"\n >\n {revealed ? <EyeOffIcon size={16} /> : <EyeIcon size={16} />}\n </Button>\n <Button\n variant=\"outline\"\n onClick={() => {\n void navigator.clipboard.writeText(apiKey).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n }}\n size=\"icon\"\n >\n {copied ? <CheckIcon size={16} /> : <CopyIcon size={16} />}\n </Button>\n </div>\n );\n};\n","import { type RouteObject } from \"react-router-dom\";\nimport { DevPortalContext } from \"../../core/DevPortalContext.js\";\nimport {\n type ApiIdentityPlugin,\n type DevPortalPlugin,\n ProfileMenuPlugin,\n} from \"../../core/plugins.js\";\nimport { RouterError } from \"../../errors/RouterError.js\";\nimport invariant from \"../../util/invariant.js\";\nimport { CreateApiKey } from \"./CreateApiKey.js\";\nimport { ProtectedRoute } from \"./ProtectedRoute.js\";\nimport { SettingsApiKeys } from \"./SettingsApiKeys.js\";\n\nconst DEFAULT_API_KEY_ENDPOINT =\n \"https://zudoku-rewiringamerica-main-ef9c9c0.d2.zuplo.dev\";\n\nexport type ApiKeyService = {\n getKeys: (context: DevPortalContext) => Promise<ApiKey[]>;\n rollKey?: (id: string, context: DevPortalContext) => Promise<void>;\n deleteKey?: (id: string, context: DevPortalContext) => Promise<void>;\n updateKeyDescription?: (\n apiKey: { id: string; description: string },\n context: DevPortalContext,\n ) => Promise<void>;\n getUsage?: (apiKeys: string[], context: DevPortalContext) => Promise<void>;\n createKey?: (\n apiKey: { description: string; expiresOn?: string },\n context: DevPortalContext,\n ) => Promise<void>;\n};\n\nexport type GetApiKeysOptions = ApiKeyService | { endpoint: string } | object;\n\nexport type ApiKeyPluginOptions = object & GetApiKeysOptions;\n\nexport interface ApiKey {\n id: string;\n description?: string;\n createdOn?: string;\n updatedOn?: string;\n expiresOn?: string;\n key: string;\n}\n\nconst createDefaultHandler = (endpoint: string): ApiKeyService => {\n return {\n deleteKey: async (id, context) => {\n const request = new Request(endpoint + `/v1/developer/api-keys/${id}`, {\n method: \"DELETE\",\n });\n\n await context.signRequest(request);\n\n const response = await fetch(request);\n invariant(response.ok, \"Failed to delete API key\");\n },\n rollKey: async (id, context) => {\n const response = await fetch(\n await context.signRequest(\n new Request(endpoint + `/v1/developer/api-keys/${id}/key`, {\n method: \"DELETE\",\n }),\n ),\n );\n invariant(response.ok, \"Failed to delete API key\");\n },\n createKey: async (apiKey, context) => {\n const request = new Request(endpoint + `/v1/developer/api-keys`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(apiKey),\n });\n\n await context.signRequest(request);\n\n const response = await fetch(request);\n invariant(response.ok, \"Failed to create API key\");\n },\n getKeys: async (context) => {\n const request = new Request(endpoint + `/v1/developer/api-keys`);\n\n await context.signRequest(request);\n\n const keys = await fetch(request);\n invariant(keys.ok, \"Failed to fetch API keys\");\n\n return await keys.json();\n },\n };\n};\n\nexport const apiKeyPlugin = (\n options: ApiKeyPluginOptions,\n): DevPortalPlugin & ApiIdentityPlugin & ProfileMenuPlugin => {\n const endpoint =\n \"endpoint\" in options ? options.endpoint : DEFAULT_API_KEY_ENDPOINT;\n\n const service =\n \"getKeys\" in options ? options : createDefaultHandler(endpoint);\n\n return {\n getProfileMenuItems: () => [\n {\n label: \"API Keys\",\n path: \"/settings/api-keys\",\n },\n ],\n getIdentities: async (context) => {\n try {\n const keys = await service.getKeys(context);\n\n return keys.map((key) => ({\n authorizeRequest: (request) => {\n request.headers.set(\"Authorization\", `Bearer ${key.key}`);\n return request;\n },\n id: key.id,\n label: key.description ?? key.id,\n }));\n } catch {\n return [];\n }\n },\n getRoutes: (): RouteObject[] => {\n // TODO: Make lazy\n return [\n {\n element: <ProtectedRoute />,\n errorElement: <RouterError />,\n children: [\n {\n path: \"/settings/api-keys\",\n element: <SettingsApiKeys service={service} />,\n },\n {\n path: \"/settings/api-keys/new\",\n element: <CreateApiKey service={service} />,\n },\n ],\n },\n ];\n },\n };\n};\n"],"names":["CreateApiKey","service","context","useZudoku","navigate","useNavigate","form","useForm","createKeyMutation","useMutation","description","expiresOn","expiresOnDate","addDaysToDate","jsxs","jsx","data","Input","Select","value","SelectTrigger","SelectValue","SelectContent","SelectGroup","option","SelectItem","Button","Link","days","date","ProtectedRoute","auth","useAuth","Outlet","DeveloperHint","SettingsApiKeys","queryClient","useQueryClient","useSuspenseQuery","deleteKeyMutation","id","rollKeyMutation","Slotlet","cn","key","RevealApiKey","RotateCwIcon","TrashIcon","apiKey","revealed","setRevealed","useState","copied","setCopied","prev","EyeOffIcon","EyeIcon","CheckIcon","CopyIcon","DEFAULT_API_KEY_ENDPOINT","createDefaultHandler","endpoint","request","response","invariant","keys","apiKeyPlugin","options","RouterError"],"mappings":"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"}
@@ -1,21 +1,22 @@
1
- import { j as o } from "./jsx-runtime-B6kdoens.js";
1
+ import { j as e } from "./jsx-runtime-B6kdoens.js";
2
2
  import a from "react";
3
- import { a as n, P as u } from "./Markdown-DM4zv3MA.js";
4
- import { u as c } from "./useExposedProps-B9K-9GTc.js";
3
+ import { P as n } from "./Markdown-1BO9EA_X.js";
4
+ import { c } from "./cn-BmFQLtkS.js";
5
+ import { u } from "./useExposedProps-B9K-9GTc.js";
5
6
  const l = ({
6
- element: t,
7
- render: s,
8
- prose: e = !0
7
+ element: s,
8
+ render: t,
9
+ prose: o = !0
9
10
  }) => {
10
- const r = c(), m = s ? a.createElement(s, r) : t;
11
- return /* @__PURE__ */ o.jsx("div", { className: n(e && u, "max-w-full"), children: m });
12
- }, f = (t) => ({
13
- getRoutes: () => t.map(({ path: s, ...e }) => ({
14
- path: s,
15
- element: /* @__PURE__ */ o.jsx(l, { ...e })
11
+ const r = u(), m = t ? a.createElement(t, r) : s;
12
+ return /* @__PURE__ */ e.jsx("div", { className: c(o && n, "max-w-full"), children: m });
13
+ }, g = (s) => ({
14
+ getRoutes: () => s.map(({ path: t, ...o }) => ({
15
+ path: t,
16
+ element: /* @__PURE__ */ e.jsx(l, { ...o })
16
17
  }))
17
18
  });
18
19
  export {
19
- f as customPagesPlugin
20
+ g as customPagesPlugin
20
21
  };
21
22
  //# sourceMappingURL=zudoku.plugin-custom-pages.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"zudoku.plugin-custom-pages.js","sources":["../src/lib/plugins/custom-pages/CustomPage.tsx","../src/lib/plugins/custom-pages/index.tsx"],"sourcesContent":["import React from \"react\";\nimport { ProseClasses } from \"../../components/Markdown.js\";\nimport { cn } from \"../../util/cn.js\";\nimport { useExposedProps } from \"../../util/useExposedProps.js\";\nimport type { CustomPageConfig } from \"./index.js\";\n\nexport const CustomPage = ({\n element,\n render,\n prose = true,\n}: Omit<CustomPageConfig, \"path\">) => {\n const slotletProps = useExposedProps();\n const content = render ? React.createElement(render, slotletProps) : element;\n\n return (\n <div className={cn(prose && ProseClasses, \"max-w-full\")}>{content}</div>\n );\n};\n","import { type ComponentType, type ReactNode } from \"react\";\nimport type { RouteObject } from \"react-router-dom\";\nimport { type ExposedComponentProps } from \"../../components/SlotletProvider.js\";\nimport type { DevPortalPlugin, NavigationPlugin } from \"../../core/plugins.js\";\nimport { CustomPage } from \"./CustomPage.js\";\n\nexport type CustomPageConfig = {\n path: string;\n prose?: boolean;\n element?: ReactNode;\n render?: ComponentType<ExposedComponentProps>;\n};\n\nexport const customPagesPlugin = (\n config: CustomPageConfig[],\n): DevPortalPlugin & NavigationPlugin => {\n return {\n getRoutes: (): RouteObject[] =>\n config.map(({ path, ...props }) => ({\n path,\n element: <CustomPage {...props} />,\n })),\n };\n};\n"],"names":["CustomPage","element","render","prose","slotletProps","useExposedProps","content","React","jsx","cn","ProseClasses","customPagesPlugin","config","path","props"],"mappings":";;;;AAMO,MAAMA,IAAa,CAAC;AAAA,EACzB,SAAAC;AAAA,EACA,QAAAC;AAAA,EACA,OAAAC,IAAQ;AACV,MAAsC;AACpC,QAAMC,IAAeC,KACfC,IAAUJ,IAASK,EAAM,cAAcL,GAAQE,CAAY,IAAIH;AAGnE,SAAAO,gBAAAA,MAAC,SAAI,WAAWC,EAAGN,KAASO,GAAc,YAAY,GAAI,UAAQJ,EAAA,CAAA;AAEtE,GCJaK,IAAoB,CAC/BC,OAEO;AAAA,EACL,WAAW,MACTA,EAAO,IAAI,CAAC,EAAE,MAAAC,GAAM,GAAGC,SAAa;AAAA,IAClC,MAAAD;AAAA,IACA,SAASL,gBAAAA,EAAAA,IAACR,GAAY,EAAA,GAAGc,EAAO,CAAA;AAAA,EAAA,EAChC;AAAA;"}
1
+ {"version":3,"file":"zudoku.plugin-custom-pages.js","sources":["../src/lib/plugins/custom-pages/CustomPage.tsx","../src/lib/plugins/custom-pages/index.tsx"],"sourcesContent":["import React from \"react\";\nimport { ProseClasses } from \"../../components/Markdown.js\";\nimport { cn } from \"../../util/cn.js\";\nimport { useExposedProps } from \"../../util/useExposedProps.js\";\nimport type { CustomPageConfig } from \"./index.js\";\n\nexport const CustomPage = ({\n element,\n render,\n prose = true,\n}: Omit<CustomPageConfig, \"path\">) => {\n const slotletProps = useExposedProps();\n const content = render ? React.createElement(render, slotletProps) : element;\n\n return (\n <div className={cn(prose && ProseClasses, \"max-w-full\")}>{content}</div>\n );\n};\n","import { type ComponentType, type ReactNode } from \"react\";\nimport type { RouteObject } from \"react-router-dom\";\nimport { type ExposedComponentProps } from \"../../components/SlotletProvider.js\";\nimport type { DevPortalPlugin, NavigationPlugin } from \"../../core/plugins.js\";\nimport { CustomPage } from \"./CustomPage.js\";\n\nexport type CustomPageConfig = {\n path: string;\n prose?: boolean;\n element?: ReactNode;\n render?: ComponentType<ExposedComponentProps>;\n};\n\nexport const customPagesPlugin = (\n config: CustomPageConfig[],\n): DevPortalPlugin & NavigationPlugin => {\n return {\n getRoutes: (): RouteObject[] =>\n config.map(({ path, ...props }) => ({\n path,\n element: <CustomPage {...props} />,\n })),\n };\n};\n"],"names":["CustomPage","element","render","prose","slotletProps","useExposedProps","content","React","jsx","cn","ProseClasses","customPagesPlugin","config","path","props"],"mappings":";;;;;AAMO,MAAMA,IAAa,CAAC;AAAA,EACzB,SAAAC;AAAA,EACA,QAAAC;AAAA,EACA,OAAAC,IAAQ;AACV,MAAsC;AACpC,QAAMC,IAAeC,KACfC,IAAUJ,IAASK,EAAM,cAAcL,GAAQE,CAAY,IAAIH;AAGnE,SAAAO,gBAAAA,MAAC,SAAI,WAAWC,EAAGN,KAASO,GAAc,YAAY,GAAI,UAAQJ,EAAA,CAAA;AAEtE,GCJaK,IAAoB,CAC/BC,OAEO;AAAA,EACL,WAAW,MACTA,EAAO,IAAI,CAAC,EAAE,MAAAC,GAAM,GAAGC,SAAa;AAAA,IAClC,MAAAD;AAAA,IACA,SAASL,gBAAAA,EAAAA,IAACR,GAAY,EAAA,GAAGc,EAAO,CAAA;AAAA,EAAA,EAChC;AAAA;"}
@@ -6,7 +6,7 @@ const x = (t, e, n) => Object.entries(t).flatMap(([a, p]) => {
6
6
  return s ? {
7
7
  path: s,
8
8
  lazy: async () => {
9
- const { MdxPage: i } = await import("./MdxPage-tWI_P8wP.js"), { default: m, ...l } = await p();
9
+ const { MdxPage: i } = await import("./MdxPage-BEOcOICU.js"), { default: m, ...l } = await p();
10
10
  return {
11
11
  element: /* @__PURE__ */ u.jsx(
12
12
  i,
@@ -1,15 +1,16 @@
1
1
  import "./jsx-runtime-B6kdoens.js";
2
- import { o as s } from "./index-Bs9roz8y.js";
3
- import "./ZudokuContext-DEoP3GGJ.js";
2
+ import { o as u } from "./index-Cj-F-4ME.js";
3
+ import "./ZudokuContext-D1D8Anlj.js";
4
4
  import "lucide-react";
5
5
  import "zudoku/openapi-worker";
6
- import "./index-CBr6BM_4.js";
7
- import "./Markdown-DM4zv3MA.js";
6
+ import "./hook-JSRuxV1P.js";
7
+ import "./Markdown-1BO9EA_X.js";
8
+ import "./ui/Button.js";
8
9
  import "./joinPath-B7kNnUX4.js";
9
10
  import "./urql-core-KJnLL26g.js";
10
11
  import "./router-BsfSoK2j.js";
11
12
  import "./index-CRo94sKK.js";
12
13
  export {
13
- s as openApiPlugin
14
+ u as openApiPlugin
14
15
  };
15
16
  //# sourceMappingURL=zudoku.plugin-openapi.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"zudoku.plugin-openapi.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;"}
1
+ {"version":3,"file":"zudoku.plugin-openapi.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zudoku",
3
- "version": "0.13.6",
3
+ "version": "0.13.7",
4
4
  "type": "module",
5
5
  "homepage": "https://zudoku.dev",
6
6
  "repository": {
@@ -27,12 +27,17 @@
27
27
  "import": "./dist/index.js",
28
28
  "types": "./dist/index.d.ts"
29
29
  },
30
+ "./ui/*": {
31
+ "import": "./lib/ui/*.js",
32
+ "types": "./dist/lib/ui/*.d.ts"
33
+ },
34
+ "./ui/*.js": {
35
+ "import": "./lib/ui/*.js",
36
+ "types": "./dist/lib/ui/*.d.ts"
37
+ },
30
38
  "./client": {
31
39
  "types": "./client.d.ts"
32
40
  },
33
- "./internal": {
34
- "import": "./dist/internal.js"
35
- },
36
41
  "./auth/clerk": {
37
42
  "import": "./lib/zudoku.auth-clerk.js",
38
43
  "types": "./dist/lib/authentication/providers/clerk.d.ts"
@@ -101,16 +106,32 @@
101
106
  "@envelop/core": "5.0.2",
102
107
  "@graphql-typed-document-node/core": "3.2.0",
103
108
  "@hiogawa/vite-plugin-ssr-css": "0.0.1",
109
+ "@hookform/resolvers": "3.9.1",
104
110
  "@lekoarts/rehype-meta-as-attributes": "3.0.1",
105
111
  "@mdx-js/react": "3.0.1",
106
112
  "@mdx-js/rollup": "3.0.1",
107
113
  "@pothos/core": "3.41.0",
114
+ "@radix-ui/react-accordion": "1.2.1",
115
+ "@radix-ui/react-alert-dialog": "1.1.2",
116
+ "@radix-ui/react-aspect-ratio": "1.1.0",
117
+ "@radix-ui/react-checkbox": "1.1.2",
108
118
  "@radix-ui/react-collapsible": "1.1.1",
109
119
  "@radix-ui/react-dialog": "1.1.2",
110
120
  "@radix-ui/react-dropdown-menu": "2.1.2",
121
+ "@radix-ui/react-hover-card": "1.1.2",
122
+ "@radix-ui/react-label": "2.1.0",
123
+ "@radix-ui/react-popover": "1.1.2",
124
+ "@radix-ui/react-progress": "1.1.0",
125
+ "@radix-ui/react-radio-group": "1.2.1",
126
+ "@radix-ui/react-scroll-area": "1.2.0",
111
127
  "@radix-ui/react-select": "2.1.2",
128
+ "@radix-ui/react-slider": "1.2.1",
112
129
  "@radix-ui/react-slot": "1.1.0",
130
+ "@radix-ui/react-switch": "1.1.1",
113
131
  "@radix-ui/react-tabs": "1.1.1",
132
+ "@radix-ui/react-toggle": "1.1.0",
133
+ "@radix-ui/react-toggle-group": "1.1.0",
134
+ "@radix-ui/react-tooltip": "1.1.3",
114
135
  "@radix-ui/react-visually-hidden": "1",
115
136
  "@sentry/node": "8.34.0",
116
137
  "@sindresorhus/slugify": "2.2.1",
@@ -127,6 +148,7 @@
127
148
  "class-variance-authority": "0.7.0",
128
149
  "clsx": "2.1.1",
129
150
  "dotenv": "16.4.5",
151
+ "embla-carousel-react": "8.3.1",
130
152
  "express": "4.21.1",
131
153
  "glob": "11.0.0",
132
154
  "graphql": "16.9.0",
@@ -186,9 +208,9 @@
186
208
  "@types/react-is": "18.3.0",
187
209
  "@types/semver": "7.5.8",
188
210
  "@types/yargs": "17.0.33",
189
- "rollup-plugin-visualizer": "5.12.0",
190
211
  "react": "18.3.1",
191
212
  "react-dom": "18.3.1",
213
+ "rollup-plugin-visualizer": "5.12.0",
192
214
  "typescript": "5.6.3"
193
215
  },
194
216
  "peerDependencies": {
@@ -201,7 +223,7 @@
201
223
  },
202
224
  "scripts": {
203
225
  "build": "tsc --project tsconfig.json",
204
- "build:vite": "vite build && pnpm run hack:fix-worker-paths lib",
226
+ "build:vite": "vite build",
205
227
  "build:standalone:vite": "vite build --mode standalone --config vite.standalone.config.ts",
206
228
  "build:standalone:html": "cp ./src/app/standalone.html ./standalone/standalone.html && cp ./src/app/demo.html ./standalone/demo.html && cp ./src/app/demo-cdn.html ./standalone/index.html",
207
229
  "hack:fix-worker-paths": "node ./scripts/hack-worker.mjs",
package/src/app/main.tsx CHANGED
@@ -9,10 +9,10 @@ import { configuredSearchPlugin } from "virtual:zudoku-search-plugin";
9
9
  import { configuredSidebar } from "virtual:zudoku-sidebar";
10
10
  import "virtual:zudoku-theme.css";
11
11
  import { DevPortal, Layout, RouterError } from "zudoku/components";
12
- import { isNavigationPlugin } from "zudoku/internal";
13
12
  import type { ZudokuConfig } from "../config/config.js";
14
13
  import { traverseSidebar } from "../lib/components/navigation/utils.js";
15
14
  import type { ZudokuContextOptions } from "../lib/core/DevPortalContext.js";
15
+ import { isNavigationPlugin } from "../lib/core/plugins.js";
16
16
  import { joinPath } from "../lib/util/joinPath.js";
17
17
 
18
18
  export const convertZudokuConfigToOptions = (
@@ -1,7 +1,6 @@
1
1
  import { useMutation } from "@tanstack/react-query";
2
2
  import { useForm } from "react-hook-form";
3
3
  import { Link, useNavigate } from "react-router-dom";
4
- import { useZudoku } from "../../components/context/ZudokuContext.js";
5
4
  import {
6
5
  Select,
7
6
  SelectContent,
@@ -9,7 +8,8 @@ import {
9
8
  SelectItem,
10
9
  SelectTrigger,
11
10
  SelectValue,
12
- } from "../../components/Select.js";
11
+ } from "zudoku/ui/Select.js";
12
+ import { useZudoku } from "../../components/context/ZudokuContext.js";
13
13
  import { Button } from "../../ui/Button.js";
14
14
  import { Input } from "../../ui/Input.js";
15
15
  import { ApiKeyService } from "./index.js";
@@ -216,13 +216,13 @@ export const Sidecar = ({
216
216
  }}
217
217
  options={[
218
218
  { value: "shell", label: "cURL" },
219
- { value: "js", label: "Javascript" },
219
+ { value: "js", label: "JavaScript" },
220
220
  { value: "python", label: "Python" },
221
221
  { value: "java", label: "Java" },
222
222
  { value: "go", label: "Go" },
223
223
  { value: "csharp", label: "C#" },
224
224
  { value: "kotlin", label: "Kotlin" },
225
- { value: "objc", label: "Objective C" },
225
+ { value: "objc", label: "Objective-C" },
226
226
  { value: "php", label: "PHP" },
227
227
  { value: "ruby", label: "Ruby" },
228
228
  { value: "swift", label: "Swift" },
@@ -1,15 +1,15 @@
1
1
  import { useMutation } from "@tanstack/react-query";
2
2
  import { Fragment, useEffect, useRef, useTransition } from "react";
3
3
  import { FormProvider, useForm } from "react-hook-form";
4
- import { useSelectedServerStore } from "../../../authentication/state.js";
5
- import { useApiIdentities } from "../../../components/context/ZudokuContext.js";
6
4
  import {
7
5
  Select,
8
6
  SelectContent,
9
7
  SelectItem,
10
8
  SelectTrigger,
11
9
  SelectValue,
12
- } from "../../../components/Select.js";
10
+ } from "zudoku/ui/Select.js";
11
+ import { useSelectedServerStore } from "../../../authentication/state.js";
12
+ import { useApiIdentities } from "../../../components/context/ZudokuContext.js";
13
13
  import { Spinner } from "../../../components/Spinner.js";
14
14
  import { Button } from "../../../ui/Button.js";
15
15
  import { Callout } from "../../../ui/Callout.js";
@@ -5,7 +5,7 @@ import {
5
5
  DialogContent,
6
6
  DialogTitle,
7
7
  DialogTrigger,
8
- } from "../../../components/Dialog.js";
8
+ } from "zudoku/ui/Dialog.js";
9
9
  import { Playground, type PlaygroundContentProps } from "./Playground.js";
10
10
 
11
11
  export type PlaygroundDialogProps = PropsWithChildren<PlaygroundContentProps>;
@@ -0,0 +1,56 @@
1
+ import * as AccordionPrimitive from "@radix-ui/react-accordion";
2
+ import { ChevronDown } from "lucide-react";
3
+ import * as React from "react";
4
+
5
+ import { cn } from "../util/cn.js";
6
+
7
+ const Accordion = AccordionPrimitive.Root;
8
+
9
+ const AccordionItem = React.forwardRef<
10
+ React.ElementRef<typeof AccordionPrimitive.Item>,
11
+ React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>
12
+ >(({ className, ...props }, ref) => (
13
+ <AccordionPrimitive.Item
14
+ ref={ref}
15
+ className={cn("border-b", className)}
16
+ {...props}
17
+ />
18
+ ));
19
+ AccordionItem.displayName = "AccordionItem";
20
+
21
+ const AccordionTrigger = React.forwardRef<
22
+ React.ElementRef<typeof AccordionPrimitive.Trigger>,
23
+ React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>
24
+ >(({ className, children, ...props }, ref) => (
25
+ <AccordionPrimitive.Header className="flex">
26
+ <AccordionPrimitive.Trigger
27
+ ref={ref}
28
+ className={cn(
29
+ "flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180",
30
+ className,
31
+ )}
32
+ {...props}
33
+ >
34
+ {children}
35
+ <ChevronDown className="h-4 w-4 shrink-0 transition-transform duration-200" />
36
+ </AccordionPrimitive.Trigger>
37
+ </AccordionPrimitive.Header>
38
+ ));
39
+ AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;
40
+
41
+ const AccordionContent = React.forwardRef<
42
+ React.ElementRef<typeof AccordionPrimitive.Content>,
43
+ React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>
44
+ >(({ className, children, ...props }, ref) => (
45
+ <AccordionPrimitive.Content
46
+ ref={ref}
47
+ className="overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down"
48
+ {...props}
49
+ >
50
+ <div className={cn("pb-4 pt-0", className)}>{children}</div>
51
+ </AccordionPrimitive.Content>
52
+ ));
53
+
54
+ AccordionContent.displayName = AccordionPrimitive.Content.displayName;
55
+
56
+ export { Accordion, AccordionContent, AccordionItem, AccordionTrigger };
@@ -0,0 +1,59 @@
1
+ import { cva, type VariantProps } from "class-variance-authority";
2
+ import * as React from "react";
3
+
4
+ import { cn } from "../util/cn.js";
5
+
6
+ const alertVariants = cva(
7
+ "relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground",
8
+ {
9
+ variants: {
10
+ variant: {
11
+ default: "bg-background text-foreground",
12
+ destructive:
13
+ "border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive",
14
+ },
15
+ },
16
+ defaultVariants: {
17
+ variant: "default",
18
+ },
19
+ },
20
+ );
21
+
22
+ const Alert = React.forwardRef<
23
+ HTMLDivElement,
24
+ React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>
25
+ >(({ className, variant, ...props }, ref) => (
26
+ <div
27
+ ref={ref}
28
+ role="alert"
29
+ className={cn(alertVariants({ variant }), className)}
30
+ {...props}
31
+ />
32
+ ));
33
+ Alert.displayName = "Alert";
34
+
35
+ const AlertTitle = React.forwardRef<
36
+ HTMLParagraphElement,
37
+ React.HTMLAttributes<HTMLHeadingElement>
38
+ >(({ className, ...props }, ref) => (
39
+ <h5
40
+ ref={ref}
41
+ className={cn("mb-1 font-medium leading-none tracking-tight", className)}
42
+ {...props}
43
+ />
44
+ ));
45
+ AlertTitle.displayName = "AlertTitle";
46
+
47
+ const AlertDescription = React.forwardRef<
48
+ HTMLParagraphElement,
49
+ React.HTMLAttributes<HTMLParagraphElement>
50
+ >(({ className, ...props }, ref) => (
51
+ <div
52
+ ref={ref}
53
+ className={cn("text-sm [&_p]:leading-relaxed", className)}
54
+ {...props}
55
+ />
56
+ ));
57
+ AlertDescription.displayName = "AlertDescription";
58
+
59
+ export { Alert, AlertDescription, AlertTitle };