zudoku 0.45.1 → 0.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (532) hide show
  1. package/dist/app/main.js +4 -23
  2. package/dist/app/main.js.map +1 -1
  3. package/dist/config/config.d.ts +2 -2
  4. package/dist/config/file-exists.d.ts +1 -0
  5. package/dist/config/file-exists.js +5 -0
  6. package/dist/config/file-exists.js.map +1 -0
  7. package/dist/config/loader.d.ts +19 -4
  8. package/dist/config/loader.js +94 -14
  9. package/dist/config/loader.js.map +1 -1
  10. package/dist/config/validators/validate.d.ts +3536 -743
  11. package/dist/config/validators/validate.js +396 -11
  12. package/dist/config/validators/validate.js.map +1 -1
  13. package/dist/index.d.ts +4 -2
  14. package/dist/index.js +2 -0
  15. package/dist/index.js.map +1 -1
  16. package/dist/lib/authentication/AuthenticationPlugin.d.ts +7 -2
  17. package/dist/lib/authentication/AuthenticationPlugin.js +13 -1
  18. package/dist/lib/authentication/AuthenticationPlugin.js.map +1 -1
  19. package/dist/lib/authentication/authentication.d.ts +2 -4
  20. package/dist/lib/authentication/providers/auth0.js.map +1 -1
  21. package/dist/lib/authentication/providers/clerk.js +62 -43
  22. package/dist/lib/authentication/providers/clerk.js.map +1 -1
  23. package/dist/lib/authentication/providers/openid.d.ts +7 -12
  24. package/dist/lib/authentication/providers/openid.js +11 -22
  25. package/dist/lib/authentication/providers/openid.js.map +1 -1
  26. package/dist/lib/authentication/providers/supabase.js +3 -5
  27. package/dist/lib/authentication/providers/supabase.js.map +1 -1
  28. package/dist/lib/components/Autocomplete.js +1 -1
  29. package/dist/lib/components/Banner.js +1 -1
  30. package/dist/lib/components/Banner.js.map +1 -1
  31. package/dist/lib/components/ErrorPage.js +1 -1
  32. package/dist/lib/components/Footer.js +3 -3
  33. package/dist/lib/components/Footer.js.map +1 -1
  34. package/dist/lib/components/Header.js +16 -8
  35. package/dist/lib/components/Header.js.map +1 -1
  36. package/dist/lib/components/Heading.js +6 -1
  37. package/dist/lib/components/Heading.js.map +1 -1
  38. package/dist/lib/components/InlineCode.js +1 -1
  39. package/dist/lib/components/InlineCode.js.map +1 -1
  40. package/dist/lib/components/Layout.js +2 -2
  41. package/dist/lib/components/Layout.js.map +1 -1
  42. package/dist/lib/components/Main.js +2 -2
  43. package/dist/lib/components/Main.js.map +1 -1
  44. package/dist/lib/components/Markdown.js +8 -3
  45. package/dist/lib/components/Markdown.js.map +1 -1
  46. package/dist/lib/components/MobileTopNavigation.js +3 -2
  47. package/dist/lib/components/MobileTopNavigation.js.map +1 -1
  48. package/dist/lib/components/NotFoundPage.js +1 -1
  49. package/dist/lib/components/Pagination.js +1 -1
  50. package/dist/lib/components/Pagination.js.map +1 -1
  51. package/dist/lib/components/Search.js +1 -1
  52. package/dist/lib/components/Search.js.map +1 -1
  53. package/dist/lib/components/Slot.d.ts +17 -0
  54. package/dist/lib/components/Slot.js +24 -0
  55. package/dist/lib/components/Slot.js.map +1 -0
  56. package/dist/lib/components/Slot.test.js +168 -0
  57. package/dist/lib/components/Slot.test.js.map +1 -0
  58. package/dist/lib/components/TopNavigation.d.ts +1 -4
  59. package/dist/lib/components/TopNavigation.js +3 -11
  60. package/dist/lib/components/TopNavigation.js.map +1 -1
  61. package/dist/lib/components/Zudoku.js +2 -2
  62. package/dist/lib/components/Zudoku.js.map +1 -1
  63. package/dist/lib/components/context/SlotProvider.d.ts +26 -0
  64. package/dist/lib/components/context/SlotProvider.js +83 -0
  65. package/dist/lib/components/context/SlotProvider.js.map +1 -0
  66. package/dist/lib/components/context/ZudokuContext.d.ts +1 -1
  67. package/dist/lib/components/context/ZudokuProvider.js +2 -1
  68. package/dist/lib/components/context/ZudokuProvider.js.map +1 -1
  69. package/dist/lib/components/index.d.ts +29 -23
  70. package/dist/lib/components/index.js +13 -7
  71. package/dist/lib/components/index.js.map +1 -1
  72. package/dist/lib/components/navigation/PoweredByZudoku.js +1 -1
  73. package/dist/lib/components/navigation/Sidebar.js +3 -3
  74. package/dist/lib/components/navigation/Sidebar.js.map +1 -1
  75. package/dist/lib/components/navigation/SidebarBadge.js +1 -1
  76. package/dist/lib/components/navigation/SidebarBadge.js.map +1 -1
  77. package/dist/lib/components/navigation/SidebarCategory.js +3 -3
  78. package/dist/lib/components/navigation/SidebarCategory.js.map +1 -1
  79. package/dist/lib/components/navigation/SidebarItem.d.ts +0 -5
  80. package/dist/lib/components/navigation/SidebarItem.js +19 -23
  81. package/dist/lib/components/navigation/SidebarItem.js.map +1 -1
  82. package/dist/lib/components/navigation/SidebarWrapper.js +1 -1
  83. package/dist/lib/components/navigation/Toc.js +1 -1
  84. package/dist/lib/components/navigation/Toc.js.map +1 -1
  85. package/dist/lib/components/navigation/utils.d.ts +8 -0
  86. package/dist/lib/components/navigation/utils.js +34 -6
  87. package/dist/lib/components/navigation/utils.js.map +1 -1
  88. package/dist/lib/core/ZudokuContext.d.ts +12 -8
  89. package/dist/lib/core/ZudokuContext.js +6 -5
  90. package/dist/lib/core/ZudokuContext.js.map +1 -1
  91. package/dist/lib/core/plugins.d.ts +5 -2
  92. package/dist/lib/core/plugins.js +1 -0
  93. package/dist/lib/core/plugins.js.map +1 -1
  94. package/dist/lib/errors/ErrorAlert.js +1 -1
  95. package/dist/lib/hooks/index.d.ts +19 -0
  96. package/dist/lib/hooks/index.js +11 -0
  97. package/dist/lib/hooks/index.js.map +1 -1
  98. package/dist/lib/plugins/api-catalog/Catalog.js +1 -1
  99. package/dist/lib/plugins/api-keys/CreateApiKey.d.ts +3 -2
  100. package/dist/lib/plugins/api-keys/CreateApiKey.js +8 -4
  101. package/dist/lib/plugins/api-keys/CreateApiKey.js.map +1 -1
  102. package/dist/lib/plugins/api-keys/SettingsApiKeys.d.ts +1 -1
  103. package/dist/lib/plugins/api-keys/SettingsApiKeys.js +54 -23
  104. package/dist/lib/plugins/api-keys/SettingsApiKeys.js.map +1 -1
  105. package/dist/lib/plugins/api-keys/index.d.ts +18 -9
  106. package/dist/lib/plugins/api-keys/index.js +49 -34
  107. package/dist/lib/plugins/api-keys/index.js.map +1 -1
  108. package/dist/lib/plugins/custom-pages/index.d.ts +1 -1
  109. package/dist/lib/plugins/markdown/MdxPage.js +1 -1
  110. package/dist/lib/plugins/markdown/MdxPage.js.map +1 -1
  111. package/dist/lib/plugins/markdown/index.d.ts +1 -1
  112. package/dist/lib/plugins/markdown/resolver.d.ts +1 -1
  113. package/dist/lib/plugins/markdown/resolver.js.map +1 -1
  114. package/dist/lib/plugins/openapi/CollapsibleCode.js +1 -1
  115. package/dist/lib/plugins/openapi/ColorizedParam.js +1 -1
  116. package/dist/lib/plugins/openapi/ColorizedParam.js.map +1 -1
  117. package/dist/lib/plugins/openapi/OperationList.js +1 -1
  118. package/dist/lib/plugins/openapi/OperationList.js.map +1 -1
  119. package/dist/lib/plugins/openapi/OperationListItem.js +2 -3
  120. package/dist/lib/plugins/openapi/OperationListItem.js.map +1 -1
  121. package/dist/lib/plugins/openapi/PlaygroundDialogWrapper.js +5 -1
  122. package/dist/lib/plugins/openapi/PlaygroundDialogWrapper.js.map +1 -1
  123. package/dist/lib/plugins/openapi/ResponsesSidecarBox.d.ts +2 -4
  124. package/dist/lib/plugins/openapi/ResponsesSidecarBox.js +1 -4
  125. package/dist/lib/plugins/openapi/ResponsesSidecarBox.js.map +1 -1
  126. package/dist/lib/plugins/openapi/SchemaList.js +6 -5
  127. package/dist/lib/plugins/openapi/SchemaList.js.map +1 -1
  128. package/dist/lib/plugins/openapi/Sidecar.js +1 -1
  129. package/dist/lib/plugins/openapi/SidecarExamples.js +8 -0
  130. package/dist/lib/plugins/openapi/SidecarExamples.js.map +1 -1
  131. package/dist/lib/plugins/openapi/components/EnumValues.js +1 -1
  132. package/dist/lib/plugins/openapi/components/EnumValues.js.map +1 -1
  133. package/dist/lib/plugins/openapi/components/ResponseContent.d.ts +12 -0
  134. package/dist/lib/plugins/openapi/components/ResponseContent.js +21 -0
  135. package/dist/lib/plugins/openapi/components/ResponseContent.js.map +1 -0
  136. package/dist/lib/plugins/openapi/playground/Playground.js +2 -0
  137. package/dist/lib/plugins/openapi/playground/Playground.js.map +1 -1
  138. package/dist/lib/plugins/openapi/playground/PlaygroundDialog.js +1 -1
  139. package/dist/lib/plugins/openapi/playground/SubmitButton.js +7 -10
  140. package/dist/lib/plugins/openapi/playground/SubmitButton.js.map +1 -1
  141. package/dist/lib/plugins/openapi/schema/SchemaExampleAndDefault.js +2 -2
  142. package/dist/lib/plugins/openapi/schema/SchemaExampleAndDefault.js.map +1 -1
  143. package/dist/lib/plugins/openapi/schema/SchemaView.d.ts +2 -1
  144. package/dist/lib/plugins/openapi/schema/SchemaView.js +3 -3
  145. package/dist/lib/plugins/openapi/schema/SchemaView.js.map +1 -1
  146. package/dist/lib/plugins/redirect/index.d.ts +1 -1
  147. package/dist/lib/ui/Badge.d.ts +2 -2
  148. package/dist/lib/ui/Badge.js +1 -1
  149. package/dist/lib/ui/Badge.js.map +1 -1
  150. package/dist/lib/ui/Button.d.ts +2 -2
  151. package/dist/lib/ui/Button.js +8 -6
  152. package/dist/lib/ui/Button.js.map +1 -1
  153. package/dist/lib/ui/Callout.js +1 -1
  154. package/dist/lib/ui/Callout.js.map +1 -1
  155. package/dist/lib/ui/Card.js +1 -1
  156. package/dist/lib/ui/Checkbox.js +1 -1
  157. package/dist/lib/ui/Checkbox.js.map +1 -1
  158. package/dist/lib/ui/Command.d.ts +2 -2
  159. package/dist/lib/ui/Command.js +3 -3
  160. package/dist/lib/ui/Command.js.map +1 -1
  161. package/dist/lib/ui/Dialog.js +1 -1
  162. package/dist/lib/ui/Dialog.js.map +1 -1
  163. package/dist/lib/ui/DropdownMenu.js +4 -4
  164. package/dist/lib/ui/DropdownMenu.js.map +1 -1
  165. package/dist/lib/ui/HoverCard.js +1 -1
  166. package/dist/lib/ui/HoverCard.js.map +1 -1
  167. package/dist/lib/ui/Input.js +1 -1
  168. package/dist/lib/ui/Input.js.map +1 -1
  169. package/dist/lib/ui/Popover.js +1 -1
  170. package/dist/lib/ui/Popover.js.map +1 -1
  171. package/dist/lib/ui/RadioGroup.js +1 -1
  172. package/dist/lib/ui/RadioGroup.js.map +1 -1
  173. package/dist/lib/ui/Select.js +2 -2
  174. package/dist/lib/ui/Select.js.map +1 -1
  175. package/dist/lib/ui/Slider.js +1 -1
  176. package/dist/lib/ui/Slider.js.map +1 -1
  177. package/dist/lib/ui/Switch.js +1 -1
  178. package/dist/lib/ui/Switch.js.map +1 -1
  179. package/dist/lib/ui/Tabs.js +2 -2
  180. package/dist/lib/ui/Tabs.js.map +1 -1
  181. package/dist/lib/ui/Textarea.js +1 -1
  182. package/dist/lib/ui/Textarea.js.map +1 -1
  183. package/dist/lib/ui/Toggle.js +1 -1
  184. package/dist/lib/ui/Toggle.js.map +1 -1
  185. package/dist/lib/ui/Tooltip.d.ts +2 -1
  186. package/dist/lib/ui/Tooltip.js +2 -1
  187. package/dist/lib/ui/Tooltip.js.map +1 -1
  188. package/dist/lib/util/useExposedProps.d.ts +8 -1
  189. package/dist/lib/util/useExposedProps.js.map +1 -1
  190. package/dist/vite/api/SchemaManager.js +16 -1
  191. package/dist/vite/api/SchemaManager.js.map +1 -1
  192. package/dist/vite/build.js +44 -6
  193. package/dist/vite/build.js.map +1 -1
  194. package/dist/vite/config.d.ts +2 -9
  195. package/dist/vite/config.js +6 -95
  196. package/dist/vite/config.js.map +1 -1
  197. package/dist/vite/config.test.js +1 -1
  198. package/dist/vite/config.test.js.map +1 -1
  199. package/dist/vite/css/plugin.d.ts +1 -2
  200. package/dist/vite/css/plugin.js +3 -2
  201. package/dist/vite/css/plugin.js.map +1 -1
  202. package/dist/vite/dev-server.d.ts +0 -1
  203. package/dist/vite/dev-server.js +10 -12
  204. package/dist/vite/dev-server.js.map +1 -1
  205. package/dist/vite/html.d.ts +2 -2
  206. package/dist/vite/html.js +5 -2
  207. package/dist/vite/html.js.map +1 -1
  208. package/dist/vite/plugin-api-keys.d.ts +1 -2
  209. package/dist/vite/plugin-api-keys.js +9 -3
  210. package/dist/vite/plugin-api-keys.js.map +1 -1
  211. package/dist/vite/plugin-api.d.ts +1 -2
  212. package/dist/vite/plugin-api.js +5 -4
  213. package/dist/vite/plugin-api.js.map +1 -1
  214. package/dist/vite/plugin-auth.d.ts +1 -2
  215. package/dist/vite/plugin-auth.js +3 -2
  216. package/dist/vite/plugin-auth.js.map +1 -1
  217. package/dist/vite/plugin-component.d.ts +1 -2
  218. package/dist/vite/plugin-component.js +3 -2
  219. package/dist/vite/plugin-component.js.map +1 -1
  220. package/dist/vite/plugin-config-reload.d.ts +1 -2
  221. package/dist/vite/plugin-config-reload.js +21 -22
  222. package/dist/vite/plugin-config-reload.js.map +1 -1
  223. package/dist/vite/plugin-config.d.ts +1 -2
  224. package/dist/vite/plugin-config.js +4 -3
  225. package/dist/vite/plugin-config.js.map +1 -1
  226. package/dist/vite/plugin-configure-tailwind.d.ts +2 -0
  227. package/dist/vite/plugin-configure-tailwind.js +38 -0
  228. package/dist/vite/plugin-configure-tailwind.js.map +1 -0
  229. package/dist/vite/plugin-custom-pages.d.ts +1 -2
  230. package/dist/vite/plugin-custom-pages.js +3 -2
  231. package/dist/vite/plugin-custom-pages.js.map +1 -1
  232. package/dist/vite/plugin-docs.d.ts +1 -2
  233. package/dist/vite/plugin-docs.js +4 -3
  234. package/dist/vite/plugin-docs.js.map +1 -1
  235. package/dist/vite/plugin-frontmatter.d.ts +1 -2
  236. package/dist/vite/plugin-frontmatter.js +3 -2
  237. package/dist/vite/plugin-frontmatter.js.map +1 -1
  238. package/dist/vite/plugin-mdx.d.ts +1 -2
  239. package/dist/vite/plugin-mdx.js +3 -2
  240. package/dist/vite/plugin-mdx.js.map +1 -1
  241. package/dist/vite/plugin-redirect.d.ts +1 -2
  242. package/dist/vite/plugin-redirect.js +3 -2
  243. package/dist/vite/plugin-redirect.js.map +1 -1
  244. package/dist/vite/plugin-search.d.ts +1 -2
  245. package/dist/vite/plugin-search.js +3 -2
  246. package/dist/vite/plugin-search.js.map +1 -1
  247. package/dist/vite/plugin-shiki-register.d.ts +1 -2
  248. package/dist/vite/plugin-shiki-register.js +2 -1
  249. package/dist/vite/plugin-shiki-register.js.map +1 -1
  250. package/dist/vite/plugin-sidebar.d.ts +1 -2
  251. package/dist/vite/plugin-sidebar.js +3 -2
  252. package/dist/vite/plugin-sidebar.js.map +1 -1
  253. package/dist/vite/plugin-theme-css.d.ts +1 -2
  254. package/dist/vite/plugin-theme-css.js +20 -60
  255. package/dist/vite/plugin-theme-css.js.map +1 -1
  256. package/dist/vite/plugin.d.ts +1 -2
  257. package/dist/vite/plugin.js +22 -21
  258. package/dist/vite/plugin.js.map +1 -1
  259. package/dist/vite/sitemap.d.ts +1 -1
  260. package/dist/zuplo/with-zuplo.d.ts +2 -2
  261. package/dist/zuplo/with-zuplo.js.map +1 -1
  262. package/lib/Button-BE9IVkWV.js +51 -0
  263. package/lib/Button-BE9IVkWV.js.map +1 -0
  264. package/lib/{Callout-XadUe37J.js → Callout-BkgOUkoZ.js} +9 -8
  265. package/lib/Callout-BkgOUkoZ.js.map +1 -0
  266. package/lib/{Card-BlCYNw5W.js → Card-DPhGbYUM.js} +3 -3
  267. package/lib/{Card-BlCYNw5W.js.map → Card-DPhGbYUM.js.map} +1 -1
  268. package/lib/{CategoryHeading-DZi-Szor.js → CategoryHeading-Cu2RwgjC.js} +2 -2
  269. package/lib/{CategoryHeading-DZi-Szor.js.map → CategoryHeading-Cu2RwgjC.js.map} +1 -1
  270. package/lib/{Dialog-CNf2oWXG.js → Dialog-Du6WMcIA.js} +8 -7
  271. package/lib/Dialog-Du6WMcIA.js.map +1 -0
  272. package/lib/{Drawer-BPBxzel2.js → Drawer-BzkOKwgC.js} +2 -2
  273. package/lib/{Drawer-BPBxzel2.js.map → Drawer-BzkOKwgC.js.map} +1 -1
  274. package/lib/Markdown-BRAyzyUJ.js +15348 -0
  275. package/lib/Markdown-BRAyzyUJ.js.map +1 -0
  276. package/lib/{MdxPage-tTTaDsLc.js → MdxPage-B3v1BSKr.js} +11 -11
  277. package/lib/MdxPage-B3v1BSKr.js.map +1 -0
  278. package/lib/{OasProvider-DalHQixM.js → OasProvider-5jrFuhVk.js} +3 -3
  279. package/lib/{OasProvider-DalHQixM.js.map → OasProvider-5jrFuhVk.js.map} +1 -1
  280. package/lib/{OperationList-BB09ENaq.js → OperationList-BmoMLQPO.js} +1039 -1005
  281. package/lib/OperationList-BmoMLQPO.js.map +1 -0
  282. package/lib/Pagination-Cr0fWZS3.js +36 -0
  283. package/lib/Pagination-Cr0fWZS3.js.map +1 -0
  284. package/lib/RouteGuard-PrSVLbSr.js +55 -0
  285. package/lib/RouteGuard-PrSVLbSr.js.map +1 -0
  286. package/lib/{SchemaList-BH9bgMRw.js → SchemaList-B4riYLoP.js} +61 -47
  287. package/lib/SchemaList-B4riYLoP.js.map +1 -0
  288. package/lib/{SchemaView-BsB7EFRl.js → SchemaView-CPZ6RgsF.js} +100 -95
  289. package/lib/SchemaView-CPZ6RgsF.js.map +1 -0
  290. package/lib/{AuthenticationPlugin-BTJ37DKg.js → SignUp-CWaiH0tY.js} +23 -50
  291. package/lib/SignUp-CWaiH0tY.js.map +1 -0
  292. package/lib/Slot-Bo6K4tnb.js +160 -0
  293. package/lib/Slot-Bo6K4tnb.js.map +1 -0
  294. package/lib/{SyntaxHighlight-UxOF1xNb.js → SyntaxHighlight-DedRjJNr.js} +233 -212
  295. package/lib/{SyntaxHighlight-UxOF1xNb.js.map → SyntaxHighlight-DedRjJNr.js.map} +1 -1
  296. package/lib/{Toc-Ax54Pw8S.js → Toc-lL3fzNkl.js} +5 -5
  297. package/lib/Toc-lL3fzNkl.js.map +1 -0
  298. package/lib/{circular-CZaZtOBs.js → circular-oB4auIIg.js} +2 -2
  299. package/lib/{circular-CZaZtOBs.js.map → circular-oB4auIIg.js.map} +1 -1
  300. package/lib/clsx-OuTLNxxd.js +17 -0
  301. package/lib/clsx-OuTLNxxd.js.map +1 -0
  302. package/lib/{cn-CwJPJKOE.js → cn-wvCW-ho6.js} +1015 -562
  303. package/lib/cn-wvCW-ho6.js.map +1 -0
  304. package/lib/{createServer-DmqFeMgf.js → createServer-DCB82j2t.js} +81 -81
  305. package/lib/{createServer-DmqFeMgf.js.map → createServer-DCB82j2t.js.map} +1 -1
  306. package/lib/{hook-BwOB_iZo.js → hook-DawSLaZr.js} +323 -300
  307. package/lib/hook-DawSLaZr.js.map +1 -0
  308. package/lib/{index-sS7O9W-R.js → index-BXYvD5-7.js} +868 -758
  309. package/lib/index-BXYvD5-7.js.map +1 -0
  310. package/lib/{index-Z13x6tPX.js → index-DI5SPFK9.js} +2 -2
  311. package/lib/{index-Z13x6tPX.js.map → index-DI5SPFK9.js.map} +1 -1
  312. package/lib/index-QzXzw_ra.js +24 -0
  313. package/lib/index-QzXzw_ra.js.map +1 -0
  314. package/lib/{RouteGuard-lkdEJoDV.js → index.esm-BFcSKCe-.js} +232 -281
  315. package/lib/index.esm-BFcSKCe-.js.map +1 -0
  316. package/lib/{index.esm-D2ZUREQN.js → index.esm-DSfX_eMP.js} +3 -3
  317. package/lib/{index.esm-D2ZUREQN.js.map → index.esm-DSfX_eMP.js.map} +1 -1
  318. package/lib/joinPath-B7kNnUX4.js +8 -0
  319. package/lib/joinPath-B7kNnUX4.js.map +1 -0
  320. package/lib/{mutation-CL2MCRQL.js → mutation-oxMvODNQ.js} +2 -2
  321. package/lib/{mutation-CL2MCRQL.js.map → mutation-oxMvODNQ.js.map} +1 -1
  322. package/lib/ui/Accordion.js +1 -1
  323. package/lib/ui/ActionButton.js +2 -2
  324. package/lib/ui/Alert.js +2 -2
  325. package/lib/ui/AlertDialog.js +1 -1
  326. package/lib/ui/Badge.js +3 -3
  327. package/lib/ui/Badge.js.map +1 -1
  328. package/lib/ui/Breadcrumb.js +1 -1
  329. package/lib/ui/Button.js +20 -18
  330. package/lib/ui/Button.js.map +1 -1
  331. package/lib/ui/Callout.js +6 -5
  332. package/lib/ui/Callout.js.map +1 -1
  333. package/lib/ui/Card.js +8 -8
  334. package/lib/ui/Card.js.map +1 -1
  335. package/lib/ui/Carousel.js +1 -1
  336. package/lib/ui/Checkbox.js +7 -7
  337. package/lib/ui/Checkbox.js.map +1 -1
  338. package/lib/ui/CodeBlock.js +1 -1
  339. package/lib/ui/Command.js +43 -43
  340. package/lib/ui/Command.js.map +1 -1
  341. package/lib/ui/Dialog.js +2 -2
  342. package/lib/ui/Dialog.js.map +1 -1
  343. package/lib/ui/Drawer.js +2 -2
  344. package/lib/ui/DropdownMenu.js +34 -34
  345. package/lib/ui/DropdownMenu.js.map +1 -1
  346. package/lib/ui/Form.js +2 -2
  347. package/lib/ui/HoverCard.js +5 -5
  348. package/lib/ui/HoverCard.js.map +1 -1
  349. package/lib/ui/Input.js +2 -2
  350. package/lib/ui/Input.js.map +1 -1
  351. package/lib/ui/Label.js +2 -2
  352. package/lib/ui/Pagination.js +1 -1
  353. package/lib/ui/Popover.js +2 -2
  354. package/lib/ui/Popover.js.map +1 -1
  355. package/lib/ui/Progress.js +1 -1
  356. package/lib/ui/RadioGroup.js +10 -10
  357. package/lib/ui/RadioGroup.js.map +1 -1
  358. package/lib/ui/ScrollArea.js +1 -1
  359. package/lib/ui/Select.js +31 -31
  360. package/lib/ui/Select.js.map +1 -1
  361. package/lib/ui/Skeleton.js +1 -1
  362. package/lib/ui/Slider.js +5 -5
  363. package/lib/ui/Slider.js.map +1 -1
  364. package/lib/ui/Switch.js +5 -5
  365. package/lib/ui/Switch.js.map +1 -1
  366. package/lib/ui/SyntaxHighlight.js +2 -2
  367. package/lib/ui/Tabs.js +16 -16
  368. package/lib/ui/Tabs.js.map +1 -1
  369. package/lib/ui/Textarea.js +5 -5
  370. package/lib/ui/Textarea.js.map +1 -1
  371. package/lib/ui/Toggle.js +7 -7
  372. package/lib/ui/Toggle.js.map +1 -1
  373. package/lib/ui/ToggleGroup.js +1 -1
  374. package/lib/ui/Tooltip.js +15 -8
  375. package/lib/ui/Tooltip.js.map +1 -1
  376. package/lib/ui/util.js +1 -1
  377. package/lib/useExposedProps-DG8J6ewJ.js.map +1 -1
  378. package/lib/useMutation-C_j3dA_L.js +97 -0
  379. package/lib/useMutation-C_j3dA_L.js.map +1 -0
  380. package/lib/zudoku.auth-auth0.js +1 -1
  381. package/lib/zudoku.auth-auth0.js.map +1 -1
  382. package/lib/zudoku.auth-clerk.js +99 -82
  383. package/lib/zudoku.auth-clerk.js.map +1 -1
  384. package/lib/zudoku.auth-openid.js +246 -216
  385. package/lib/zudoku.auth-openid.js.map +1 -1
  386. package/lib/zudoku.components.js +4957 -33
  387. package/lib/zudoku.components.js.map +1 -1
  388. package/lib/zudoku.hooks.js +21 -12
  389. package/lib/zudoku.hooks.js.map +1 -1
  390. package/lib/zudoku.plugin-api-catalog.js +8 -8
  391. package/lib/zudoku.plugin-api-catalog.js.map +1 -1
  392. package/lib/zudoku.plugin-api-keys.js +5022 -214
  393. package/lib/zudoku.plugin-api-keys.js.map +1 -1
  394. package/lib/zudoku.plugin-custom-pages.js +2 -2
  395. package/lib/zudoku.plugin-custom-pages.js.map +1 -1
  396. package/lib/zudoku.plugin-markdown.js +1 -1
  397. package/lib/zudoku.plugin-markdown.js.map +1 -1
  398. package/lib/zudoku.plugin-openapi.js +3 -3
  399. package/lib/zudoku.plugin-redirect.js.map +1 -1
  400. package/lib/zudoku.plugin-search-pagefind.js +5 -5
  401. package/lib/zudoku.plugins.js +7 -6
  402. package/lib/zudoku.plugins.js.map +1 -1
  403. package/package.json +15 -15
  404. package/src/app/defaultTheme.css +54 -0
  405. package/src/app/font.geist.css +73 -0
  406. package/src/app/main.css +113 -156
  407. package/src/app/main.tsx +4 -28
  408. package/src/lib/authentication/AuthenticationPlugin.tsx +18 -4
  409. package/src/lib/authentication/authentication.ts +2 -5
  410. package/src/lib/authentication/providers/auth0.tsx +8 -2
  411. package/src/lib/authentication/providers/clerk.tsx +72 -48
  412. package/src/lib/authentication/providers/openid.tsx +19 -26
  413. package/src/lib/authentication/providers/supabase.tsx +7 -7
  414. package/src/lib/components/Autocomplete.tsx +1 -1
  415. package/src/lib/components/Banner.tsx +1 -1
  416. package/src/lib/components/ErrorPage.tsx +1 -1
  417. package/src/lib/components/Footer.tsx +4 -4
  418. package/src/lib/components/Header.tsx +29 -29
  419. package/src/lib/components/Heading.tsx +9 -5
  420. package/src/lib/components/InlineCode.tsx +1 -1
  421. package/src/lib/components/Layout.tsx +3 -3
  422. package/src/lib/components/Main.tsx +4 -4
  423. package/src/lib/components/Markdown.tsx +14 -4
  424. package/src/lib/components/MobileTopNavigation.tsx +3 -2
  425. package/src/lib/components/NotFoundPage.tsx +1 -1
  426. package/src/lib/components/Pagination.tsx +3 -9
  427. package/src/lib/components/Search.tsx +1 -1
  428. package/src/lib/components/Slot.test.tsx +465 -0
  429. package/src/lib/components/Slot.tsx +64 -0
  430. package/src/lib/components/TopNavigation.tsx +5 -17
  431. package/src/lib/components/Zudoku.tsx +9 -9
  432. package/src/lib/components/context/SlotProvider.tsx +149 -0
  433. package/src/lib/components/context/ZudokuProvider.tsx +2 -1
  434. package/src/lib/components/index.ts +14 -10
  435. package/src/lib/components/navigation/PoweredByZudoku.tsx +1 -1
  436. package/src/lib/components/navigation/Sidebar.tsx +3 -3
  437. package/src/lib/components/navigation/SidebarBadge.tsx +1 -1
  438. package/src/lib/components/navigation/SidebarCategory.tsx +3 -3
  439. package/src/lib/components/navigation/SidebarItem.tsx +57 -30
  440. package/src/lib/components/navigation/SidebarWrapper.tsx +2 -2
  441. package/src/lib/components/navigation/Toc.tsx +2 -2
  442. package/src/lib/components/navigation/utils.ts +42 -6
  443. package/src/lib/core/ZudokuContext.ts +24 -12
  444. package/src/lib/core/plugins.ts +10 -2
  445. package/src/lib/errors/ErrorAlert.tsx +1 -1
  446. package/src/lib/hooks/index.ts +11 -0
  447. package/src/lib/plugins/api-catalog/Catalog.tsx +1 -1
  448. package/src/lib/plugins/api-keys/CreateApiKey.tsx +54 -42
  449. package/src/lib/plugins/api-keys/SettingsApiKeys.tsx +292 -112
  450. package/src/lib/plugins/api-keys/index.tsx +101 -55
  451. package/src/lib/plugins/custom-pages/index.tsx +1 -1
  452. package/src/lib/plugins/markdown/MdxPage.tsx +2 -2
  453. package/src/lib/plugins/markdown/index.tsx +2 -2
  454. package/src/lib/plugins/markdown/resolver.ts +4 -2
  455. package/src/lib/plugins/openapi/CollapsibleCode.tsx +1 -1
  456. package/src/lib/plugins/openapi/ColorizedParam.tsx +2 -2
  457. package/src/lib/plugins/openapi/OperationList.tsx +2 -2
  458. package/src/lib/plugins/openapi/OperationListItem.tsx +6 -34
  459. package/src/lib/plugins/openapi/PlaygroundDialogWrapper.tsx +7 -1
  460. package/src/lib/plugins/openapi/ResponsesSidecarBox.tsx +5 -16
  461. package/src/lib/plugins/openapi/SchemaList.tsx +20 -8
  462. package/src/lib/plugins/openapi/Sidecar.tsx +1 -1
  463. package/src/lib/plugins/openapi/SidecarExamples.tsx +6 -0
  464. package/src/lib/plugins/openapi/components/EnumValues.tsx +1 -1
  465. package/src/lib/plugins/openapi/components/ResponseContent.tsx +104 -0
  466. package/src/lib/plugins/openapi/playground/Playground.tsx +7 -1
  467. package/src/lib/plugins/openapi/playground/PlaygroundDialog.tsx +1 -1
  468. package/src/lib/plugins/openapi/playground/SubmitButton.tsx +24 -29
  469. package/src/lib/plugins/openapi/schema/SchemaExampleAndDefault.tsx +2 -2
  470. package/src/lib/plugins/openapi/schema/SchemaView.tsx +7 -3
  471. package/src/lib/plugins/redirect/index.tsx +1 -1
  472. package/src/lib/ui/Badge.tsx +2 -2
  473. package/src/lib/ui/Button.tsx +9 -6
  474. package/src/lib/ui/Callout.tsx +1 -0
  475. package/src/lib/ui/Card.tsx +1 -1
  476. package/src/lib/ui/Checkbox.tsx +1 -1
  477. package/src/lib/ui/Command.tsx +5 -5
  478. package/src/lib/ui/Dialog.tsx +1 -1
  479. package/src/lib/ui/DropdownMenu.tsx +4 -4
  480. package/src/lib/ui/HoverCard.tsx +1 -1
  481. package/src/lib/ui/Input.tsx +1 -1
  482. package/src/lib/ui/Popover.tsx +1 -1
  483. package/src/lib/ui/RadioGroup.tsx +1 -1
  484. package/src/lib/ui/Select.tsx +3 -3
  485. package/src/lib/ui/Slider.tsx +1 -1
  486. package/src/lib/ui/Switch.tsx +1 -1
  487. package/src/lib/ui/Tabs.tsx +2 -2
  488. package/src/lib/ui/Textarea.tsx +1 -1
  489. package/src/lib/ui/Toggle.tsx +1 -1
  490. package/src/lib/ui/Tooltip.tsx +16 -1
  491. package/src/lib/util/useExposedProps.tsx +12 -1
  492. package/dist/app/tailwind.d.ts +0 -4
  493. package/dist/app/tailwind.js +0 -97
  494. package/dist/app/tailwind.js.map +0 -1
  495. package/dist/config/common.d.ts +0 -10
  496. package/dist/config/common.js +0 -2
  497. package/dist/config/common.js.map +0 -1
  498. package/dist/config/validators/common.d.ts +0 -8001
  499. package/dist/config/validators/common.js +0 -414
  500. package/dist/config/validators/common.js.map +0 -1
  501. package/dist/lib/components/SlotletProvider.d.ts +0 -17
  502. package/dist/lib/components/SlotletProvider.js +0 -18
  503. package/dist/lib/components/SlotletProvider.js.map +0 -1
  504. package/dist/vite/plugin-docs.test.js +0 -22
  505. package/dist/vite/plugin-docs.test.js.map +0 -1
  506. package/lib/AuthenticationPlugin-BTJ37DKg.js.map +0 -1
  507. package/lib/Button-Bdk_Ij3U.js +0 -49
  508. package/lib/Button-Bdk_Ij3U.js.map +0 -1
  509. package/lib/Callout-XadUe37J.js.map +0 -1
  510. package/lib/Dialog-CNf2oWXG.js.map +0 -1
  511. package/lib/Markdown-D96AphCL.js +0 -7691
  512. package/lib/Markdown-D96AphCL.js.map +0 -1
  513. package/lib/MdxPage-tTTaDsLc.js.map +0 -1
  514. package/lib/OperationList-BB09ENaq.js.map +0 -1
  515. package/lib/Pagination-CtmnJOJi.js +0 -48
  516. package/lib/Pagination-CtmnJOJi.js.map +0 -1
  517. package/lib/RouteGuard-lkdEJoDV.js.map +0 -1
  518. package/lib/SchemaList-BH9bgMRw.js.map +0 -1
  519. package/lib/SchemaView-BsB7EFRl.js.map +0 -1
  520. package/lib/Select-HTio1oSE.js +0 -211
  521. package/lib/Select-HTio1oSE.js.map +0 -1
  522. package/lib/SlotletProvider-CTgIBRWg.js +0 -257
  523. package/lib/SlotletProvider-CTgIBRWg.js.map +0 -1
  524. package/lib/Toc-Ax54Pw8S.js.map +0 -1
  525. package/lib/cn-CwJPJKOE.js.map +0 -1
  526. package/lib/hook-BwOB_iZo.js.map +0 -1
  527. package/lib/index-BnT4-Efz.js +0 -4975
  528. package/lib/index-BnT4-Efz.js.map +0 -1
  529. package/lib/index-sS7O9W-R.js.map +0 -1
  530. package/src/app/tailwind.ts +0 -103
  531. package/src/lib/components/SlotletProvider.tsx +0 -55
  532. /package/dist/{vite/plugin-docs.test.d.ts → lib/components/Slot.test.d.ts} +0 -0
@@ -1,6 +1,8 @@
1
1
  import { useMutation, useQueryClient } from "@tanstack/react-query";
2
2
  import { useForm } from "react-hook-form";
3
- import { Link, useNavigate } from "react-router";
3
+ import { useNavigate } from "react-router";
4
+ import { ActionButton } from "zudoku/ui/ActionButton.js";
5
+ import { DialogClose, DialogFooter } from "zudoku/ui/Dialog.js";
4
6
  import {
5
7
  Select,
6
8
  SelectContent,
@@ -12,11 +14,17 @@ import {
12
14
  import { useZudoku } from "../../components/context/ZudokuContext.js";
13
15
  import { Button } from "../../ui/Button.js";
14
16
  import { Input } from "../../ui/Input.js";
15
- import { ApiKeyService } from "./index.js";
17
+ import { type ApiKeyService } from "./index.js";
16
18
 
17
- type CreateApiKey = { description: string; expiresOn?: string };
19
+ type CreateApiKey = { description?: string; expiresOn?: string };
18
20
 
19
- export const CreateApiKey = ({ service }: { service: ApiKeyService }) => {
21
+ export const CreateApiKey = ({
22
+ service,
23
+ onOpenChange,
24
+ }: {
25
+ service: ApiKeyService;
26
+ onOpenChange: (open: boolean) => void;
27
+ }) => {
20
28
  const context = useZudoku();
21
29
  const queryClient = useQueryClient();
22
30
  const navigate = useNavigate();
@@ -35,7 +43,7 @@ export const CreateApiKey = ({ service }: { service: ApiKeyService }) => {
35
43
  expiresOn !== "never" ? addDaysToDate(Number(expiresOn)) : undefined;
36
44
 
37
45
  return service.createKey(
38
- { description: description, expiresOn: expiresOnDate },
46
+ { description: description || "Secret Key", expiresOn: expiresOnDate },
39
47
  context,
40
48
  );
41
49
  },
@@ -50,44 +58,48 @@ export const CreateApiKey = ({ service }: { service: ApiKeyService }) => {
50
58
  }
51
59
 
52
60
  return (
53
- <div className="max-w-screen-lg pt-[--padding-content-top] pb-[--padding-content-bottom]">
54
- <div className="flex justify-between mb-4 border-b pb-1">
55
- <h1 className="font-medium text-2xl">New API Key</h1>
61
+ <form
62
+ onSubmit={form.handleSubmit((data) =>
63
+ createKeyMutation.mutate(
64
+ { ...data },
65
+ {
66
+ onSuccess: () => onOpenChange(false),
67
+ },
68
+ ),
69
+ )}
70
+ >
71
+ <div className="flex gap-2 flex-col text-sm font-medium">
72
+ Name
73
+ <Input {...form.register("description")} />
74
+ Expiration
75
+ <Select
76
+ onValueChange={(value) => form.setValue("expiresOn", value)}
77
+ defaultValue={form.getValues("expiresOn")}
78
+ >
79
+ <SelectTrigger>
80
+ <SelectValue />
81
+ </SelectTrigger>
82
+ <SelectContent>
83
+ <SelectGroup>
84
+ {[7, 30, 60, 90].map((option) => (
85
+ <SelectItem value={String(option)} key={option}>
86
+ {option} days
87
+ </SelectItem>
88
+ ))}
89
+ <SelectItem value="never">Never</SelectItem>
90
+ </SelectGroup>
91
+ </SelectContent>
92
+ </Select>
93
+ <DialogFooter>
94
+ <DialogClose asChild>
95
+ <Button variant="outline">Cancel</Button>
96
+ </DialogClose>
97
+ <ActionButton isPending={createKeyMutation.isPending}>
98
+ Generate Key
99
+ </ActionButton>
100
+ </DialogFooter>
56
101
  </div>
57
- <form
58
- onSubmit={form.handleSubmit((data) => createKeyMutation.mutate(data))}
59
- >
60
- <div className="flex gap-2 flex-col">
61
- Note
62
- <Input {...form.register("description")} />
63
- Expiration
64
- <Select
65
- onValueChange={(value) => form.setValue("expiresOn", value)}
66
- defaultValue={form.getValues("expiresOn")}
67
- >
68
- <SelectTrigger>
69
- <SelectValue />
70
- </SelectTrigger>
71
- <SelectContent>
72
- <SelectGroup>
73
- {[7, 30, 60, 90].map((option) => (
74
- <SelectItem value={String(option)} key={option}>
75
- {option} days
76
- </SelectItem>
77
- ))}
78
- <SelectItem value="never">Never</SelectItem>
79
- </SelectGroup>
80
- </SelectContent>
81
- </Select>
82
- <div className="flex gap-2">
83
- <Button>Generate Key</Button>
84
- <Button variant="outline" asChild>
85
- <Link to="/settings/api-keys/">Cancel</Link>
86
- </Button>
87
- </div>
88
- </div>
89
- </form>
90
- </div>
102
+ </form>
91
103
  );
92
104
  };
93
105
 
@@ -3,38 +3,57 @@ import {
3
3
  useQueryClient,
4
4
  useSuspenseQuery,
5
5
  } from "@tanstack/react-query";
6
+ import { AnimatePresence, motion } from "framer-motion";
6
7
  import {
7
8
  CheckIcon,
8
9
  CopyIcon,
9
10
  EyeIcon,
10
11
  EyeOffIcon,
12
+ LoaderPinwheelIcon,
11
13
  RotateCwIcon,
12
14
  TrashIcon,
13
15
  } from "lucide-react";
14
16
  import { useState } from "react";
15
17
  import { Link } from "react-router";
18
+ import { Card, CardHeader } from "zudoku/ui/Card.js";
19
+ import {
20
+ Dialog,
21
+ DialogClose,
22
+ DialogContent,
23
+ DialogDescription,
24
+ DialogFooter,
25
+ DialogHeader,
26
+ DialogTitle,
27
+ DialogTrigger,
28
+ } from "zudoku/ui/Dialog.js";
16
29
  import { useZudoku } from "../../components/context/ZudokuContext.js";
17
- import { Slotlet } from "../../components/SlotletProvider.js";
30
+ import { Slot } from "../../components/Slot.js";
18
31
  import { Button } from "../../ui/Button.js";
19
32
  import { cn } from "../../util/cn.js";
20
- import { ApiKeyService } from "./index.js";
33
+ import { type ApiKey, type ApiKeyService } from "./index.js";
21
34
 
22
35
  export const SettingsApiKeys = ({ service }: { service: ApiKeyService }) => {
23
36
  const context = useZudoku();
24
37
  const queryClient = useQueryClient();
25
38
  const { data } = useSuspenseQuery({
26
- queryFn: () => service.getKeys(context),
39
+ queryFn: () => service.getConsumers(context),
27
40
  queryKey: ["api-keys"],
28
41
  retry: false,
29
42
  });
30
43
 
31
44
  const deleteKeyMutation = useMutation({
32
- mutationFn: (id: string) => {
45
+ mutationFn: ({
46
+ consumerId,
47
+ keyId,
48
+ }: {
49
+ consumerId: string;
50
+ keyId: string;
51
+ }) => {
33
52
  if (!service.deleteKey) {
34
53
  throw new Error("deleteKey not implemented");
35
54
  }
36
55
 
37
- return service.deleteKey(id, context);
56
+ return service.deleteKey(consumerId, keyId, context);
38
57
  },
39
58
  onSuccess: () => {
40
59
  void queryClient.invalidateQueries({ queryKey: ["api-keys"] });
@@ -53,10 +72,10 @@ export const SettingsApiKeys = ({ service }: { service: ApiKeyService }) => {
53
72
  });
54
73
 
55
74
  return (
56
- <div className="max-w-screen-lg h-full pt-[--padding-content-top] pb-[--padding-content-bottom]">
57
- <Slotlet name="api-keys-list-page" />
75
+ <div className="max-w-screen-lg h-full pt-(--padding-content-top) pb-(--padding-content-bottom)">
76
+ <Slot.Target name="api-keys-list-page" />
58
77
 
59
- <div className="flex justify-between mb-4 border-b pb-3">
78
+ <div className="flex justify-between pb-3">
60
79
  <h1 className="font-medium text-2xl">API Keys</h1>
61
80
  {service.createKey && (
62
81
  <Button asChild>
@@ -64,122 +83,283 @@ export const SettingsApiKeys = ({ service }: { service: ApiKeyService }) => {
64
83
  </Button>
65
84
  )}
66
85
  </div>
86
+ <p>Create, manage, and monitor your API keys</p>
67
87
 
68
- <Slotlet name="api-keys-list-page-before-keys" />
69
-
70
- {data.length === 0 ? (
71
- <div className="flex flex-col justify-center gap-4 items-center p-8 border rounded bg-muted/30 text-muted-foreground">
72
- <p className="text-center">
73
- No API keys created yet.
74
- <br />
75
- Get started and create your first key.
76
- </p>
77
- {service.createKey && (
78
- <Button asChild variant="outline">
79
- <Link to="/settings/api-keys/new">Create API Key</Link>
80
- </Button>
81
- )}
82
- </div>
83
- ) : (
84
- <ul
85
- className={cn(
86
- "grid grid-cols-1 rounded border divide-y divide-border",
87
- "lg:grid-cols-[minmax(250px,min-content)_1fr_min-content]",
88
- )}
89
- >
90
- {data.map((key) => (
91
- <li
92
- className="p-5 grid grid-cols-subgrid col-span-full gap-2 items-center"
93
- key={key.id}
94
- >
95
- <div className="flex flex-col gap-1 text-sm">
96
- {key.description ?? key.id}
97
- <div className="text-muted-foreground text-xs">
98
- {key.createdOn && (
99
- <div>
100
- Created on {new Date(key.createdOn).toLocaleDateString()}
88
+ <Slot.Target name="api-keys-list-page-before-keys" />
89
+
90
+ <div className="h-8"></div>
91
+ <div className="grid grid-cols-8">
92
+ {data.length === 0 ? (
93
+ <div className="flex flex-col justify-center gap-4 items-center p-8 border rounded-sm bg-muted/30 text-muted-foreground">
94
+ <p className="text-center">
95
+ No API keys created yet.
96
+ <br />
97
+ Get started and create your first key.
98
+ </p>
99
+ {service.createKey && (
100
+ <Button asChild variant="outline">
101
+ <Link to="/settings/api-keys/new">Create API Key</Link>
102
+ </Button>
103
+ )}
104
+ </div>
105
+ ) : (
106
+ <ul
107
+ className={cn(
108
+ "grid grid-cols-1 divide-y divide-border col-span-6",
109
+ "lg:grid-cols-[1fr_min-content]",
110
+ )}
111
+ >
112
+ {data.map((consumers) => (
113
+ <Card
114
+ className="grid grid-cols-subgrid col-span-full items-center mb-4"
115
+ key={consumers.id}
116
+ >
117
+ <CardHeader className="border-b col-span-full grid-cols-subgrid grid">
118
+ <div className="flex flex-col text-sm justify-center">
119
+ <div className="font-medium text-lg">
120
+ {consumers.name ?? consumers.id}
121
+ <div className="text-muted-foreground text-xs">
122
+ {consumers.createdOn}
123
+ </div>
101
124
  </div>
102
- )}
103
- {key.expiresOn && (
104
- <div>
105
- Expires on {new Date(key.expiresOn).toLocaleDateString()}
125
+ <div className="text-muted-foreground text-xs">
126
+ {consumers.createdOn && (
127
+ <div>
128
+ Created on{" "}
129
+ {new Date(consumers.createdOn).toLocaleDateString()}
130
+ </div>
131
+ )}
132
+ {consumers.expiresOn && (
133
+ <div>
134
+ Expires on{" "}
135
+ {new Date(consumers.expiresOn).toLocaleDateString()}
136
+ </div>
137
+ )}
106
138
  </div>
107
- )}
108
- </div>
109
- </div>
110
- <div className="items-center flex lg:justify-center">
111
- <RevealApiKey apiKey={key.key} />
112
- </div>
113
- <div className="flex gap-2">
114
- {service.rollKey && (
115
- <Button
116
- size="icon"
117
- title="Roll this key"
118
- variant="ghost"
119
- onClick={() => {
120
- if (!confirm("Do you want to roll this key?")) {
121
- return;
122
- }
123
-
124
- rollKeyMutation.mutate(key.id);
125
- }}
126
- >
127
- <RotateCwIcon size={16} />
128
- </Button>
129
- )}
130
- {service.deleteKey && (
131
- <Button
132
- variant="ghost"
133
- size="icon"
134
- onClick={() => {
135
- if (!confirm("Do you want to delete this key?")) {
136
- return;
137
- }
139
+ </div>
138
140
 
139
- deleteKeyMutation.mutate(key.id);
140
- }}
141
- disabled={deleteKeyMutation.isPending}
142
- >
143
- <TrashIcon size={16} />
144
- </Button>
145
- )}
146
- </div>
147
- </li>
148
- ))}
149
- </ul>
150
- )}
141
+ <div className="flex justify-end">
142
+ {service.rollKey && (
143
+ <Dialog>
144
+ <DialogTrigger asChild>
145
+ <Button
146
+ size="icon"
147
+ title="Roll this key"
148
+ variant="ghost"
149
+ disabled={rollKeyMutation.isPending}
150
+ >
151
+ <RotateCwIcon size={16} />
152
+ </Button>
153
+ </DialogTrigger>
154
+ <DialogContent>
155
+ <DialogHeader>
156
+ <DialogTitle>Roll API Key</DialogTitle>
157
+ <DialogDescription>
158
+ Are you sure you want to roll this API key?
159
+ </DialogDescription>
160
+ </DialogHeader>
161
+ <DialogFooter>
162
+ <DialogClose asChild>
163
+ <Button variant="outline">Cancel</Button>
164
+ </DialogClose>
165
+ <DialogClose asChild>
166
+ <Button
167
+ onClick={() => {
168
+ rollKeyMutation.mutate(consumers.id);
169
+ }}
170
+ >
171
+ Roll Key
172
+ </Button>
173
+ </DialogClose>
174
+ </DialogFooter>
175
+ </DialogContent>
176
+ </Dialog>
177
+ )}
178
+ </div>
179
+ </CardHeader>
180
+ <div className="divide-y col-span-full grid-cols-subgrid grid">
181
+ <AnimatePresence>
182
+ {rollKeyMutation.isPending && (
183
+ <motion.div
184
+ className={cn(
185
+ "flex col-span-full items-center gap-2 px-6 py-1 text-xs bg-muted/30 font-medium",
186
+ )}
187
+ initial={{ opacity: 0, y: 0 }}
188
+ animate={{ opacity: 1, y: 0 }}
189
+ exit={{ opacity: 0, y: 0 }}
190
+ transition={{ duration: 0.3 }}
191
+ >
192
+ <LoaderPinwheelIcon
193
+ size={16}
194
+ className="animate-spin opacity-80"
195
+ />
196
+ Rolling key...
197
+ </motion.div>
198
+ )}
199
+ {consumers.apiKeys.map((apiKey) => (
200
+ <RevealApiKey
201
+ key={apiKey.id}
202
+ apiKey={apiKey}
203
+ onDeleteKey={() => {
204
+ deleteKeyMutation.mutate({
205
+ consumerId: consumers.id,
206
+ keyId: apiKey.id,
207
+ });
208
+ }}
209
+ />
210
+ ))}
211
+ </AnimatePresence>
212
+ </div>
213
+ </Card>
214
+ ))}
215
+ </ul>
216
+ )}
217
+ </div>
151
218
  </div>
152
219
  );
153
220
  };
154
221
 
155
- const RevealApiKey = ({ apiKey }: { apiKey: string }) => {
222
+ const getTimeAgo = (date: string) => {
223
+ const now = new Date();
224
+ const created = new Date(date);
225
+ const diffInSeconds = Math.floor((now.getTime() - created.getTime()) / 1000);
226
+
227
+ const rtf = new Intl.RelativeTimeFormat("en", { numeric: "auto" });
228
+
229
+ if (diffInSeconds < 60) return rtf.format(-diffInSeconds, "second");
230
+ if (diffInSeconds < 3600)
231
+ return rtf.format(-Math.floor(diffInSeconds / 60), "minute");
232
+ if (diffInSeconds < 86400)
233
+ return rtf.format(-Math.floor(diffInSeconds / 3600), "hour");
234
+ if (diffInSeconds < 2592000)
235
+ return rtf.format(-Math.floor(diffInSeconds / 86400), "day");
236
+ if (diffInSeconds < 31536000)
237
+ return rtf.format(-Math.floor(diffInSeconds / 2592000), "month");
238
+ return rtf.format(-Math.floor(diffInSeconds / 31536000), "year");
239
+ };
240
+
241
+ const RevealApiKey = ({
242
+ apiKey,
243
+ onDeleteKey,
244
+ }: {
245
+ apiKey: ApiKey;
246
+ onDeleteKey: () => void;
247
+ }) => {
156
248
  const [revealed, setRevealed] = useState(false);
157
249
  const [copied, setCopied] = useState(false);
158
250
 
251
+ const { key, createdOn, expiresOn } = apiKey;
252
+ const isExpired = expiresOn && new Date(expiresOn) < new Date();
253
+ const daysUntilExpiry = expiresOn
254
+ ? Math.ceil(
255
+ (new Date(expiresOn).getTime() - new Date().getTime()) /
256
+ (1000 * 60 * 60 * 24),
257
+ )
258
+ : Infinity;
259
+ const expiresSoon = daysUntilExpiry <= 7 && !isExpired;
260
+
159
261
  return (
160
- <div className="flex gap-2 items-center text-sm">
161
- <div className="border rounded bg-gray-100 dark:bg-gray-950 p-1 font-mono truncate h-9 items-center flex px-2">
162
- {revealed ? apiKey : "•".repeat(apiKey.length)}
262
+ <motion.div
263
+ className="grid col-span-full grid-cols-subgrid p-6"
264
+ initial={{ opacity: 0, y: 0 }}
265
+ animate={{ opacity: 1, y: 0 }}
266
+ exit={{ opacity: 0, y: 0 }}
267
+ transition={{ duration: 0.3 }}
268
+ >
269
+ <div className="flex flex-col gap-1">
270
+ <div className="flex gap-2 items-center text-sm border rounded-md w-fit px-1">
271
+ <div className="font-mono truncate h-9 items-center flex px-2 text-xs gap-2">
272
+ <div
273
+ className={cn(
274
+ "rounded-full w-2 h-2 bg-emerald-400 mr-2",
275
+ (expiresSoon || isExpired) && "bg-neutral-200",
276
+ )}
277
+ ></div>
278
+ <span>
279
+ <span className={revealed ? "" : "opacity-20"}>
280
+ {revealed
281
+ ? key.slice(0, -5)
282
+ : "**** ".repeat(key.slice(0, -5).length / 5) +
283
+ "*".repeat(key.slice(0, -5).length % 5)}
284
+ </span>
285
+ <span>{key.slice(-5)}</span>
286
+ </span>
287
+ </div>
288
+ <Button
289
+ variant="ghost"
290
+ onClick={() => setRevealed((prev) => !prev)}
291
+ size="icon"
292
+ >
293
+ {revealed ? <EyeOffIcon size={16} /> : <EyeIcon size={16} />}
294
+ </Button>
295
+ <Button
296
+ variant="ghost"
297
+ onClick={() => {
298
+ void navigator.clipboard.writeText(key).then(() => {
299
+ setCopied(true);
300
+ setTimeout(() => setCopied(false), 2000);
301
+ });
302
+ }}
303
+ size="icon"
304
+ >
305
+ {copied ? <CheckIcon size={16} /> : <CopyIcon size={16} />}
306
+ </Button>
307
+ </div>
308
+ <div className="flex gap-1 mt-0.5 text-nowrap">
309
+ {createdOn && (
310
+ <span className="text-xs text-muted-foreground">
311
+ Created {getTimeAgo(createdOn)}.
312
+ </span>
313
+ )}{" "}
314
+ {expiresOn && expiresSoon && (
315
+ <span className="text-xs text-primary">
316
+ Expires in {daysUntilExpiry}{" "}
317
+ {daysUntilExpiry === 1 ? "day" : "days"}.
318
+ </span>
319
+ )}
320
+ {expiresOn && isExpired && (
321
+ <span className="text-xs text-primary">
322
+ Expired{" "}
323
+ {daysUntilExpiry === 0
324
+ ? "today."
325
+ : `${daysUntilExpiry * -1} days ago.`}
326
+ </span>
327
+ )}
328
+ </div>
163
329
  </div>
164
- <Button
165
- variant="outline"
166
- onClick={() => setRevealed((prev) => !prev)}
167
- size="icon"
168
- >
169
- {revealed ? <EyeOffIcon size={16} /> : <EyeIcon size={16} />}
170
- </Button>
171
- <Button
172
- variant="outline"
173
- onClick={() => {
174
- void navigator.clipboard.writeText(apiKey).then(() => {
175
- setCopied(true);
176
- setTimeout(() => setCopied(false), 2000);
177
- });
178
- }}
179
- size="icon"
180
- >
181
- {copied ? <CheckIcon size={16} /> : <CopyIcon size={16} />}
182
- </Button>
183
- </div>
330
+ <div className="flex justify-end">
331
+ {isExpired && onDeleteKey && (
332
+ <Dialog>
333
+ <DialogTrigger asChild>
334
+ <Button variant="ghost" size="icon">
335
+ <TrashIcon size={16} />
336
+ </Button>
337
+ </DialogTrigger>
338
+ <DialogContent>
339
+ <DialogHeader>
340
+ <DialogTitle>Delete API Key</DialogTitle>
341
+ <DialogDescription>
342
+ Are you sure you want to delete this API key?
343
+ </DialogDescription>
344
+ </DialogHeader>
345
+ <DialogFooter>
346
+ <DialogClose asChild>
347
+ <Button variant="outline">Cancel</Button>
348
+ </DialogClose>
349
+ <DialogClose asChild>
350
+ <Button
351
+ onClick={() => {
352
+ onDeleteKey();
353
+ }}
354
+ >
355
+ Delete
356
+ </Button>
357
+ </DialogClose>
358
+ </DialogFooter>
359
+ </DialogContent>
360
+ </Dialog>
361
+ )}
362
+ </div>
363
+ </motion.div>
184
364
  );
185
365
  };