zudoku 0.0.0-f40ea27 → 0.0.0-f42e3678

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 (420) hide show
  1. package/README.md +2 -2
  2. package/dist/app/demo.js +16 -1
  3. package/dist/app/demo.js.map +1 -1
  4. package/dist/app/main.js +3 -9
  5. package/dist/app/main.js.map +1 -1
  6. package/dist/cli/build/handler.js +9 -1
  7. package/dist/cli/build/handler.js.map +1 -1
  8. package/dist/config/config.d.ts +1 -0
  9. package/dist/config/loader.js +2 -5
  10. package/dist/config/loader.js.map +1 -1
  11. package/dist/config/validators/BuildSchema.js +5 -0
  12. package/dist/config/validators/BuildSchema.js.map +1 -1
  13. package/dist/config/validators/InputNavigationSchema.d.ts +254 -163
  14. package/dist/config/validators/InputNavigationSchema.js +4 -4
  15. package/dist/config/validators/InputNavigationSchema.js.map +1 -1
  16. package/dist/config/validators/InputNavigationSchema.test-d.js +0 -1
  17. package/dist/config/validators/InputNavigationSchema.test-d.js.map +1 -1
  18. package/dist/config/validators/NavigationSchema.js +3 -2
  19. package/dist/config/validators/NavigationSchema.js.map +1 -1
  20. package/dist/config/validators/ProtectedRoutesSchema.d.ts +12 -0
  21. package/dist/config/validators/ProtectedRoutesSchema.js +19 -0
  22. package/dist/config/validators/ProtectedRoutesSchema.js.map +1 -0
  23. package/dist/config/validators/icon-types.d.ts +1 -1
  24. package/dist/config/validators/icon-types.js +16 -0
  25. package/dist/config/validators/icon-types.js.map +1 -1
  26. package/dist/config/validators/validate.d.ts +36 -20
  27. package/dist/config/validators/validate.js +18 -4
  28. package/dist/config/validators/validate.js.map +1 -1
  29. package/dist/config/validators/validate.test.js +65 -2
  30. package/dist/config/validators/validate.test.js.map +1 -1
  31. package/dist/flat-config.d.ts +8 -6
  32. package/dist/lib/authentication/authentication.d.ts +2 -0
  33. package/dist/lib/authentication/components/CallbackHandler.js +11 -9
  34. package/dist/lib/authentication/components/CallbackHandler.js.map +1 -1
  35. package/dist/lib/authentication/components/OAuthErrorPage.d.ts +3 -0
  36. package/dist/lib/authentication/components/OAuthErrorPage.js +99 -0
  37. package/dist/lib/authentication/components/OAuthErrorPage.js.map +1 -0
  38. package/dist/lib/authentication/components/SignIn.js +4 -3
  39. package/dist/lib/authentication/components/SignIn.js.map +1 -1
  40. package/dist/lib/authentication/errors.d.ts +6 -12
  41. package/dist/lib/authentication/errors.js +2 -1
  42. package/dist/lib/authentication/errors.js.map +1 -1
  43. package/dist/lib/authentication/hook.d.ts +1 -0
  44. package/dist/lib/authentication/hook.js.map +1 -1
  45. package/dist/lib/authentication/providers/azureb2c.js +4 -2
  46. package/dist/lib/authentication/providers/azureb2c.js.map +1 -1
  47. package/dist/lib/authentication/providers/clerk.js +4 -2
  48. package/dist/lib/authentication/providers/clerk.js.map +1 -1
  49. package/dist/lib/authentication/providers/openid.d.ts +4 -2
  50. package/dist/lib/authentication/providers/openid.js +14 -6
  51. package/dist/lib/authentication/providers/openid.js.map +1 -1
  52. package/dist/lib/components/Banner.js +1 -1
  53. package/dist/lib/components/Banner.js.map +1 -1
  54. package/dist/lib/components/CategoryHeading.js +1 -1
  55. package/dist/lib/components/CategoryHeading.js.map +1 -1
  56. package/dist/lib/components/Header.js +1 -1
  57. package/dist/lib/components/Header.js.map +1 -1
  58. package/dist/lib/components/Heading.js +1 -1
  59. package/dist/lib/components/Heading.js.map +1 -1
  60. package/dist/lib/components/Markdown.js +2 -2
  61. package/dist/lib/components/Markdown.js.map +1 -1
  62. package/dist/lib/components/MobileTopNavigation.js +11 -6
  63. package/dist/lib/components/MobileTopNavigation.js.map +1 -1
  64. package/dist/lib/components/NotFoundPage.js +1 -1
  65. package/dist/lib/components/NotFoundPage.js.map +1 -1
  66. package/dist/lib/components/Pagination.js +1 -1
  67. package/dist/lib/components/Pagination.js.map +1 -1
  68. package/dist/lib/components/StatusPage.js +4 -0
  69. package/dist/lib/components/StatusPage.js.map +1 -1
  70. package/dist/lib/components/TopNavigation.d.ts +5 -0
  71. package/dist/lib/components/TopNavigation.js +20 -15
  72. package/dist/lib/components/TopNavigation.js.map +1 -1
  73. package/dist/lib/components/Typography.d.ts +1 -1
  74. package/dist/lib/components/Typography.js +1 -1
  75. package/dist/lib/components/Typography.js.map +1 -1
  76. package/dist/lib/components/context/ZudokuContext.js +21 -13
  77. package/dist/lib/components/context/ZudokuContext.js.map +1 -1
  78. package/dist/lib/components/navigation/NavigationItem.d.ts +1 -1
  79. package/dist/lib/components/navigation/NavigationItem.js +8 -1
  80. package/dist/lib/components/navigation/NavigationItem.js.map +1 -1
  81. package/dist/lib/components/navigation/NavigationWrapper.js +1 -1
  82. package/dist/lib/components/navigation/NavigationWrapper.js.map +1 -1
  83. package/dist/lib/components/navigation/utils.d.ts +3 -1
  84. package/dist/lib/components/navigation/utils.js +6 -3
  85. package/dist/lib/components/navigation/utils.js.map +1 -1
  86. package/dist/lib/core/RouteGuard.js +9 -9
  87. package/dist/lib/core/RouteGuard.js.map +1 -1
  88. package/dist/lib/core/ZudokuContext.d.ts +5 -2
  89. package/dist/lib/core/ZudokuContext.js +27 -2
  90. package/dist/lib/core/ZudokuContext.js.map +1 -1
  91. package/dist/lib/core/plugins.d.ts +2 -1
  92. package/dist/lib/core/plugins.js.map +1 -1
  93. package/dist/lib/errors/ErrorAlert.js +1 -1
  94. package/dist/lib/errors/ErrorAlert.js.map +1 -1
  95. package/dist/lib/plugins/api-keys/CreateApiKey.js +7 -3
  96. package/dist/lib/plugins/api-keys/CreateApiKey.js.map +1 -1
  97. package/dist/lib/plugins/api-keys/SettingsApiKeys.js +6 -4
  98. package/dist/lib/plugins/api-keys/SettingsApiKeys.js.map +1 -1
  99. package/dist/lib/plugins/api-keys/index.d.ts +1 -0
  100. package/dist/lib/plugins/api-keys/index.js +4 -8
  101. package/dist/lib/plugins/api-keys/index.js.map +1 -1
  102. package/dist/lib/plugins/markdown/MdxPage.js +4 -3
  103. package/dist/lib/plugins/markdown/MdxPage.js.map +1 -1
  104. package/dist/lib/plugins/openapi/OperationList.js +2 -1
  105. package/dist/lib/plugins/openapi/OperationList.js.map +1 -1
  106. package/dist/lib/plugins/openapi/Sidecar.js +1 -1
  107. package/dist/lib/plugins/openapi/Sidecar.js.map +1 -1
  108. package/dist/lib/plugins/openapi/SidecarExamples.js +1 -1
  109. package/dist/lib/plugins/openapi/SidecarExamples.js.map +1 -1
  110. package/dist/lib/plugins/openapi/graphql/gql.d.ts +1 -1
  111. package/dist/lib/plugins/openapi/graphql/gql.js +1 -1
  112. package/dist/lib/plugins/openapi/graphql/gql.js.map +1 -1
  113. package/dist/lib/plugins/openapi/graphql/graphql.d.ts +1 -0
  114. package/dist/lib/plugins/openapi/graphql/graphql.js +1 -0
  115. package/dist/lib/plugins/openapi/graphql/graphql.js.map +1 -1
  116. package/dist/lib/plugins/openapi/index.js +43 -11
  117. package/dist/lib/plugins/openapi/index.js.map +1 -1
  118. package/dist/lib/plugins/openapi/playground/PathParams.js +1 -1
  119. package/dist/lib/plugins/openapi/playground/PathParams.js.map +1 -1
  120. package/dist/lib/plugins/openapi/playground/Playground.js +4 -2
  121. package/dist/lib/plugins/openapi/playground/Playground.js.map +1 -1
  122. package/dist/lib/plugins/search-inkeep/index.d.ts +5 -22
  123. package/dist/lib/plugins/search-inkeep/index.js +35 -29
  124. package/dist/lib/plugins/search-inkeep/index.js.map +1 -1
  125. package/dist/lib/plugins/search-inkeep/inkeep.d.ts +5 -21
  126. package/dist/lib/plugins/search-inkeep/inkeep.js +10 -19
  127. package/dist/lib/plugins/search-inkeep/inkeep.js.map +1 -1
  128. package/dist/lib/plugins/search-pagefind/PagefindSearch.js +1 -1
  129. package/dist/lib/plugins/search-pagefind/PagefindSearch.js.map +1 -1
  130. package/dist/lib/plugins/search-pagefind/ResultList.d.ts +1 -1
  131. package/dist/lib/plugins/search-pagefind/ResultList.js +12 -5
  132. package/dist/lib/plugins/search-pagefind/ResultList.js.map +1 -1
  133. package/dist/lib/ui/ActionButton.js +1 -1
  134. package/dist/lib/ui/ActionButton.js.map +1 -1
  135. package/dist/lib/ui/Alert.d.ts +1 -1
  136. package/dist/lib/ui/Badge.d.ts +1 -1
  137. package/dist/lib/ui/Button.d.ts +2 -2
  138. package/dist/lib/ui/CodeBlock.js +1 -1
  139. package/dist/lib/ui/CodeBlock.js.map +1 -1
  140. package/dist/lib/ui/Command.d.ts +1 -1
  141. package/dist/lib/ui/EmbeddedCodeBlock.js +1 -1
  142. package/dist/lib/ui/EmbeddedCodeBlock.js.map +1 -1
  143. package/dist/lib/util/invariant.d.ts +6 -5
  144. package/dist/lib/util/invariant.js +1 -1
  145. package/dist/lib/util/invariant.js.map +1 -1
  146. package/dist/vite/build.js +7 -1
  147. package/dist/vite/build.js.map +1 -1
  148. package/dist/vite/dev-server.js +9 -1
  149. package/dist/vite/dev-server.js.map +1 -1
  150. package/dist/vite/mdx/remark-last-modified.js +1 -28
  151. package/dist/vite/mdx/remark-last-modified.js.map +1 -1
  152. package/dist/vite/plugin-docs.js +20 -13
  153. package/dist/vite/plugin-docs.js.map +1 -1
  154. package/dist/vite/plugin-mdx.js +2 -3
  155. package/dist/vite/plugin-mdx.js.map +1 -1
  156. package/dist/vite/plugin-theme.js +88 -49
  157. package/dist/vite/plugin-theme.js.map +1 -1
  158. package/dist/vite/plugin-theme.test.js +25 -4
  159. package/dist/vite/plugin-theme.test.js.map +1 -1
  160. package/dist/vite/prerender/worker.js +5 -1
  161. package/dist/vite/prerender/worker.js.map +1 -1
  162. package/dist/vite/shadcn-registry.d.ts +8 -8
  163. package/lib/{Button-BE9IVkWV.js → Button-B3o-2Xdf.js} +2 -2
  164. package/lib/{Button-BE9IVkWV.js.map → Button-B3o-2Xdf.js.map} +1 -1
  165. package/lib/{Card-DPhGbYUM.js → Card-CMDQUPM4.js} +2 -2
  166. package/lib/{Card-DPhGbYUM.js.map → Card-CMDQUPM4.js.map} +1 -1
  167. package/lib/ClientOnly-E7hGysn1.js.map +1 -1
  168. package/lib/{CodeBlock-DAKxs_Tu.js → CodeBlock-B-G0eKtw.js} +3 -3
  169. package/lib/{CodeBlock-DAKxs_Tu.js.map → CodeBlock-B-G0eKtw.js.map} +1 -1
  170. package/lib/{Command-xsbs2uhf.js → Command-BYukybsa.js} +3 -3
  171. package/lib/{Command-xsbs2uhf.js.map → Command-BYukybsa.js.map} +1 -1
  172. package/lib/{Dialog-CiIdyz6a.js → Dialog-u9Uz9sTt.js} +5 -5
  173. package/lib/{Dialog-CiIdyz6a.js.map → Dialog-u9Uz9sTt.js.map} +1 -1
  174. package/lib/{Drawer-BzkOKwgC.js → Drawer-DJ05s2pH.js} +86 -86
  175. package/lib/{Drawer-BzkOKwgC.js.map → Drawer-DJ05s2pH.js.map} +1 -1
  176. package/lib/{MdxPage-swXPJ0gf.js → MdxPage-Bsko6_kb.js} +34 -34
  177. package/lib/MdxPage-Bsko6_kb.js.map +1 -0
  178. package/lib/OAuthErrorPage-DJzGiIBt.js +150 -0
  179. package/lib/OAuthErrorPage-DJzGiIBt.js.map +1 -0
  180. package/lib/{OasProvider-CDAM3TB1.js → OasProvider-DQQRt3oS.js} +3 -3
  181. package/lib/{OasProvider-CDAM3TB1.js.map → OasProvider-DQQRt3oS.js.map} +1 -1
  182. package/lib/{OperationList-C9Hb9ql8.js → OperationList-DpmkHf26.js} +212 -210
  183. package/lib/OperationList-DpmkHf26.js.map +1 -0
  184. package/lib/{Pagination-VGlgeCmS.js → Pagination-kqFNgtnI.js} +10 -9
  185. package/lib/Pagination-kqFNgtnI.js.map +1 -0
  186. package/lib/{RouteGuard-CbKd7_9h.js → RouteGuard-0wPUKdxJ.js} +166 -165
  187. package/lib/{RouteGuard-CbKd7_9h.js.map → RouteGuard-0wPUKdxJ.js.map} +1 -1
  188. package/lib/{SchemaList-BAbh1BXO.js → SchemaList-DS-pMd6B.js} +9 -9
  189. package/lib/{SchemaList-BAbh1BXO.js.map → SchemaList-DS-pMd6B.js.map} +1 -1
  190. package/lib/{SchemaView-C2Io712T.js → SchemaView-BnN6WHjw.js} +6 -6
  191. package/lib/{SchemaView-C2Io712T.js.map → SchemaView-BnN6WHjw.js.map} +1 -1
  192. package/lib/Select-BmTTKNPp.js +273 -0
  193. package/lib/Select-BmTTKNPp.js.map +1 -0
  194. package/lib/SignUp-BwOSCD-6.js +56 -0
  195. package/lib/SignUp-BwOSCD-6.js.map +1 -0
  196. package/lib/{Slot-DwZlQ-vX.js → Slot-DAyXieeZ.js} +1634 -1643
  197. package/lib/Slot-DAyXieeZ.js.map +1 -0
  198. package/lib/Spinner-mNLZ6awP.js.map +1 -1
  199. package/lib/{SyntaxHighlight-CrjhGEwT.js → SyntaxHighlight-BMKR4pl6.js} +757 -757
  200. package/lib/SyntaxHighlight-BMKR4pl6.js.map +1 -0
  201. package/lib/{Toc-WCmwFkX-.js → Toc-BKDRCQzU.js} +3 -3
  202. package/lib/{Toc-WCmwFkX-.js.map → Toc-BKDRCQzU.js.map} +1 -1
  203. package/lib/ZudokuContext-CLl5w57E.js +1278 -0
  204. package/lib/ZudokuContext-CLl5w57E.js.map +1 -0
  205. package/lib/{chunk-DQRVZFIR-DHK7_Ilc.js → chunk-QMGIS6GS-CEOk3lro.js} +3 -3
  206. package/lib/chunk-QMGIS6GS-CEOk3lro.js.map +1 -0
  207. package/lib/{circular-B42RaanD.js → circular-8GWQDvCW.js} +2 -2
  208. package/lib/{circular-B42RaanD.js.map → circular-8GWQDvCW.js.map} +1 -1
  209. package/lib/{cn-wvCW-ho6.js → cn-dYga0KKN.js} +2 -2
  210. package/lib/cn-dYga0KKN.js.map +1 -0
  211. package/lib/{createServer-BKFsRuuk.js → createServer-BsezSzvV.js} +3398 -3552
  212. package/lib/createServer-BsezSzvV.js.map +1 -0
  213. package/lib/errors-Cs7hKmdL.js +45 -0
  214. package/lib/errors-Cs7hKmdL.js.map +1 -0
  215. package/lib/hook-DbUCLQNg.js +247 -0
  216. package/lib/hook-DbUCLQNg.js.map +1 -0
  217. package/lib/index-A5Qdwj1B.js +4081 -0
  218. package/lib/index-A5Qdwj1B.js.map +1 -0
  219. package/lib/{index-B6Re5_cx.js → index-Bg7Js3jB.js} +873 -951
  220. package/lib/index-Bg7Js3jB.js.map +1 -0
  221. package/lib/{index-CcV90rin.js → index-BkW9tJ6j.js} +2 -2
  222. package/lib/{index-CcV90rin.js.map → index-BkW9tJ6j.js.map} +1 -1
  223. package/lib/index-Bm35Tkgf.js +107 -0
  224. package/lib/index-Bm35Tkgf.js.map +1 -0
  225. package/lib/index-CrcNWbel.js.map +1 -1
  226. package/lib/index-DI5SPFK9.js.map +1 -1
  227. package/lib/index-DmNq2fbN.js.map +1 -1
  228. package/lib/index.esm-CdzlRw50.js +1254 -0
  229. package/lib/index.esm-CdzlRw50.js.map +1 -0
  230. package/lib/{invariant-DAFpPywt.js → invariant-Bm-FVUQE.js} +2 -6
  231. package/lib/invariant-Bm-FVUQE.js.map +1 -0
  232. package/lib/jsx-runtime-C5mzlN2N.js.map +1 -1
  233. package/lib/processors/removeExtensions.js.map +1 -1
  234. package/lib/processors/removeParameters.js.map +1 -1
  235. package/lib/processors/removePaths.js.map +1 -1
  236. package/lib/processors/traverse.js.map +1 -1
  237. package/lib/ui/Accordion.js +1 -1
  238. package/lib/ui/Accordion.js.map +1 -1
  239. package/lib/ui/ActionButton.js +10 -10
  240. package/lib/ui/ActionButton.js.map +1 -1
  241. package/lib/ui/Alert.js +1 -1
  242. package/lib/ui/Alert.js.map +1 -1
  243. package/lib/ui/AlertDialog.js +1 -1
  244. package/lib/ui/AlertDialog.js.map +1 -1
  245. package/lib/ui/Badge.js +1 -1
  246. package/lib/ui/Badge.js.map +1 -1
  247. package/lib/ui/Breadcrumb.js +1 -1
  248. package/lib/ui/Breadcrumb.js.map +1 -1
  249. package/lib/ui/Button.js +1 -1
  250. package/lib/ui/Button.js.map +1 -1
  251. package/lib/ui/Callout.js +1 -1
  252. package/lib/ui/Callout.js.map +1 -1
  253. package/lib/ui/Card.js +1 -1
  254. package/lib/ui/Card.js.map +1 -1
  255. package/lib/ui/Carousel.js +1 -1
  256. package/lib/ui/Carousel.js.map +1 -1
  257. package/lib/ui/Checkbox.js +1 -1
  258. package/lib/ui/Checkbox.js.map +1 -1
  259. package/lib/ui/CodeBlock.js +2 -2
  260. package/lib/ui/Command.js +2 -2
  261. package/lib/ui/Command.js.map +1 -1
  262. package/lib/ui/Dialog.js +1 -1
  263. package/lib/ui/Dialog.js.map +1 -1
  264. package/lib/ui/Drawer.js +2 -2
  265. package/lib/ui/DropdownMenu.js +1 -1
  266. package/lib/ui/DropdownMenu.js.map +1 -1
  267. package/lib/ui/EmbeddedCodeBlock.js +2 -2
  268. package/lib/ui/EmbeddedCodeBlock.js.map +1 -1
  269. package/lib/ui/Form.js +2 -2
  270. package/lib/ui/Form.js.map +1 -1
  271. package/lib/ui/HoverCard.js +1 -1
  272. package/lib/ui/HoverCard.js.map +1 -1
  273. package/lib/ui/Input.js +1 -1
  274. package/lib/ui/Input.js.map +1 -1
  275. package/lib/ui/Label.js +1 -1
  276. package/lib/ui/Label.js.map +1 -1
  277. package/lib/ui/Pagination.js +1 -1
  278. package/lib/ui/Pagination.js.map +1 -1
  279. package/lib/ui/Popover.js +1 -1
  280. package/lib/ui/Popover.js.map +1 -1
  281. package/lib/ui/Progress.js +1 -1
  282. package/lib/ui/Progress.js.map +1 -1
  283. package/lib/ui/RadioGroup.js +1 -1
  284. package/lib/ui/RadioGroup.js.map +1 -1
  285. package/lib/ui/ScrollArea.js +1 -1
  286. package/lib/ui/ScrollArea.js.map +1 -1
  287. package/lib/ui/Select.js +1 -1
  288. package/lib/ui/Select.js.map +1 -1
  289. package/lib/ui/Skeleton.js +1 -1
  290. package/lib/ui/Skeleton.js.map +1 -1
  291. package/lib/ui/Slider.js +1 -1
  292. package/lib/ui/Slider.js.map +1 -1
  293. package/lib/ui/Stepper.js.map +1 -1
  294. package/lib/ui/Switch.js +1 -1
  295. package/lib/ui/Switch.js.map +1 -1
  296. package/lib/ui/SyntaxHighlight.js +4 -4
  297. package/lib/ui/Tabs.js +1 -1
  298. package/lib/ui/Tabs.js.map +1 -1
  299. package/lib/ui/Textarea.js +1 -1
  300. package/lib/ui/Textarea.js.map +1 -1
  301. package/lib/ui/Toggle.js +1 -1
  302. package/lib/ui/Toggle.js.map +1 -1
  303. package/lib/ui/ToggleGroup.js +1 -1
  304. package/lib/ui/ToggleGroup.js.map +1 -1
  305. package/lib/ui/Tooltip.js +1 -1
  306. package/lib/ui/Tooltip.js.map +1 -1
  307. package/lib/ui/util.js +1 -1
  308. package/lib/{useExposedProps-BIYjecPD.js → useExposedProps-KcgXHKeE.js} +2 -2
  309. package/lib/{useExposedProps-BIYjecPD.js.map → useExposedProps-KcgXHKeE.js.map} +1 -1
  310. package/lib/zudoku.auth-auth0.js +1 -1
  311. package/lib/zudoku.auth-auth0.js.map +1 -1
  312. package/lib/zudoku.auth-azureb2c.js +46 -9883
  313. package/lib/zudoku.auth-azureb2c.js.map +1 -1
  314. package/lib/zudoku.auth-clerk.js +25 -22
  315. package/lib/zudoku.auth-clerk.js.map +1 -1
  316. package/lib/zudoku.auth-openid.js +249 -231
  317. package/lib/zudoku.auth-openid.js.map +1 -1
  318. package/lib/zudoku.auth-supabase.js +97 -0
  319. package/lib/zudoku.auth-supabase.js.map +1 -0
  320. package/lib/zudoku.components.js +30 -29
  321. package/lib/zudoku.components.js.map +1 -1
  322. package/lib/zudoku.hooks.js +17 -16
  323. package/lib/zudoku.hooks.js.map +1 -1
  324. package/lib/zudoku.icons.js.map +1 -1
  325. package/lib/zudoku.plugin-api-catalog.js +26 -25
  326. package/lib/zudoku.plugin-api-catalog.js.map +1 -1
  327. package/lib/zudoku.plugin-api-keys.js +428 -299
  328. package/lib/zudoku.plugin-api-keys.js.map +1 -1
  329. package/lib/zudoku.plugin-custom-pages.js +1 -1
  330. package/lib/zudoku.plugin-custom-pages.js.map +1 -1
  331. package/lib/zudoku.plugin-markdown.js +1 -1
  332. package/lib/zudoku.plugin-markdown.js.map +1 -1
  333. package/lib/zudoku.plugin-openapi.js +7 -6
  334. package/lib/zudoku.plugin-openapi.js.map +1 -1
  335. package/lib/zudoku.plugin-redirect.js +1 -1
  336. package/lib/zudoku.plugin-redirect.js.map +1 -1
  337. package/lib/zudoku.plugin-search-inkeep.js +54 -57
  338. package/lib/zudoku.plugin-search-inkeep.js.map +1 -1
  339. package/lib/zudoku.plugin-search-pagefind.js +123 -118
  340. package/lib/zudoku.plugin-search-pagefind.js.map +1 -1
  341. package/lib/zudoku.plugins.js.map +1 -1
  342. package/package.json +34 -33
  343. package/src/app/demo.tsx +19 -2
  344. package/src/app/main.css +26 -5
  345. package/src/app/main.tsx +6 -14
  346. package/src/lib/authentication/authentication.ts +2 -2
  347. package/src/lib/authentication/components/CallbackHandler.tsx +22 -15
  348. package/src/lib/authentication/components/OAuthErrorPage.tsx +171 -0
  349. package/src/lib/authentication/components/SignIn.tsx +5 -12
  350. package/src/lib/authentication/errors.ts +27 -13
  351. package/src/lib/authentication/hook.ts +2 -0
  352. package/src/lib/authentication/providers/azureb2c.tsx +8 -3
  353. package/src/lib/authentication/providers/clerk.tsx +4 -1
  354. package/src/lib/authentication/providers/openid.tsx +30 -5
  355. package/src/lib/components/Banner.tsx +0 -1
  356. package/src/lib/components/CategoryHeading.tsx +4 -1
  357. package/src/lib/components/Header.tsx +5 -2
  358. package/src/lib/components/Heading.tsx +1 -1
  359. package/src/lib/components/Markdown.tsx +3 -3
  360. package/src/lib/components/MobileTopNavigation.tsx +60 -8
  361. package/src/lib/components/NotFoundPage.tsx +3 -2
  362. package/src/lib/components/Pagination.tsx +1 -0
  363. package/src/lib/components/StatusPage.tsx +5 -0
  364. package/src/lib/components/TopNavigation.tsx +34 -18
  365. package/src/lib/components/Typography.tsx +1 -1
  366. package/src/lib/components/context/ZudokuContext.ts +25 -18
  367. package/src/lib/components/navigation/NavigationItem.tsx +9 -1
  368. package/src/lib/components/navigation/NavigationWrapper.tsx +4 -1
  369. package/src/lib/components/navigation/utils.ts +9 -3
  370. package/src/lib/core/RouteGuard.tsx +13 -13
  371. package/src/lib/core/ZudokuContext.ts +40 -5
  372. package/src/lib/core/plugins.ts +2 -1
  373. package/src/lib/errors/ErrorAlert.tsx +5 -7
  374. package/src/lib/plugins/api-keys/CreateApiKey.tsx +12 -1
  375. package/src/lib/plugins/api-keys/SettingsApiKeys.tsx +37 -13
  376. package/src/lib/plugins/api-keys/index.tsx +8 -9
  377. package/src/lib/plugins/markdown/MdxPage.tsx +4 -3
  378. package/src/lib/plugins/openapi/OperationList.tsx +4 -2
  379. package/src/lib/plugins/openapi/Sidecar.tsx +1 -1
  380. package/src/lib/plugins/openapi/SidecarExamples.tsx +1 -1
  381. package/src/lib/plugins/openapi/graphql/gql.ts +3 -3
  382. package/src/lib/plugins/openapi/graphql/graphql.ts +2 -0
  383. package/src/lib/plugins/openapi/index.tsx +67 -17
  384. package/src/lib/plugins/openapi/playground/PathParams.tsx +1 -1
  385. package/src/lib/plugins/openapi/playground/Playground.tsx +8 -2
  386. package/src/lib/plugins/search-inkeep/index.tsx +54 -58
  387. package/src/lib/plugins/search-inkeep/inkeep.ts +19 -21
  388. package/src/lib/plugins/search-pagefind/PagefindSearch.tsx +1 -0
  389. package/src/lib/plugins/search-pagefind/ResultList.tsx +13 -4
  390. package/src/lib/ui/ActionButton.tsx +3 -1
  391. package/src/lib/ui/Alert.tsx +1 -1
  392. package/src/lib/ui/CodeBlock.tsx +1 -1
  393. package/src/lib/ui/EmbeddedCodeBlock.tsx +1 -1
  394. package/src/lib/util/invariant.ts +7 -5
  395. package/lib/Alert-CT_ViLrJ.js +0 -161
  396. package/lib/Alert-CT_ViLrJ.js.map +0 -1
  397. package/lib/MdxPage-swXPJ0gf.js.map +0 -1
  398. package/lib/OperationList-C9Hb9ql8.js.map +0 -1
  399. package/lib/Pagination-VGlgeCmS.js.map +0 -1
  400. package/lib/SignUp-5RUdVhnq.js +0 -63
  401. package/lib/SignUp-5RUdVhnq.js.map +0 -1
  402. package/lib/Slot-DwZlQ-vX.js.map +0 -1
  403. package/lib/SyntaxHighlight-CrjhGEwT.js.map +0 -1
  404. package/lib/chunk-DQRVZFIR-DHK7_Ilc.js.map +0 -1
  405. package/lib/clerk-BDZ31hjU.js +0 -25190
  406. package/lib/clerk-BDZ31hjU.js.map +0 -1
  407. package/lib/cn-wvCW-ho6.js.map +0 -1
  408. package/lib/createServer-BKFsRuuk.js.map +0 -1
  409. package/lib/errors-CF2X_x5o.js +0 -78
  410. package/lib/errors-CF2X_x5o.js.map +0 -1
  411. package/lib/hook-Bd0yS8M0.js +0 -1503
  412. package/lib/hook-Bd0yS8M0.js.map +0 -1
  413. package/lib/index-B6Re5_cx.js.map +0 -1
  414. package/lib/index-CLy1XyH0.js +0 -3919
  415. package/lib/index-CLy1XyH0.js.map +0 -1
  416. package/lib/index-ClhS5TxS.js +0 -107
  417. package/lib/index-ClhS5TxS.js.map +0 -1
  418. package/lib/index.esm-Cp4wkyud.js +0 -1236
  419. package/lib/index.esm-Cp4wkyud.js.map +0 -1
  420. package/lib/invariant-DAFpPywt.js.map +0 -1
@@ -1,5 +1,6 @@
1
1
  import logger from "loglevel";
2
2
  import * as oauth from "oauth4webapi";
3
+ import { ErrorBoundary } from "react-error-boundary";
3
4
  import { type OpenIDAuthenticationConfig } from "../../../config/config.js";
4
5
  import { ClientOnly } from "../../components/ClientOnly.js";
5
6
  import { joinUrl } from "../../util/joinUrl.js";
@@ -9,6 +10,7 @@ import {
9
10
  } from "../authentication.js";
10
11
  import { CoreAuthenticationPlugin } from "../AuthenticationPlugin.js";
11
12
  import { CallbackHandler } from "../components/CallbackHandler.js";
13
+ import { OAuthErrorPage } from "../components/OAuthErrorPage.js";
12
14
  import { AuthorizationError, OAuthAuthorizationError } from "../errors.js";
13
15
  import { useAuthState, type UserProfile } from "../state.js";
14
16
 
@@ -113,25 +115,41 @@ export class OpenIDAuthenticationProvider
113
115
  });
114
116
  }
115
117
 
116
- async signUp({ redirectTo }: { redirectTo?: string } = {}) {
118
+ async signUp({
119
+ redirectTo,
120
+ replace = false,
121
+ }: {
122
+ redirectTo?: string;
123
+ replace?: boolean;
124
+ } = {}) {
117
125
  return this.authorize({
118
126
  redirectTo: this.redirectToAfterSignUp ?? redirectTo ?? "/",
127
+ replace,
119
128
  isSignUp: true,
120
129
  });
121
130
  }
122
131
 
123
- async signIn({ redirectTo }: { redirectTo?: string } = {}) {
132
+ async signIn({
133
+ redirectTo,
134
+ replace = false,
135
+ }: {
136
+ redirectTo?: string;
137
+ replace?: boolean;
138
+ } = {}) {
124
139
  return this.authorize({
125
140
  redirectTo: this.redirectToAfterSignIn ?? redirectTo ?? "/",
141
+ replace,
126
142
  });
127
143
  }
128
144
 
129
145
  private async authorize({
130
146
  redirectTo,
131
147
  isSignUp = false,
148
+ replace = false,
132
149
  }: {
133
150
  redirectTo: string;
134
151
  isSignUp?: boolean;
152
+ replace?: boolean;
135
153
  }): Promise<void> {
136
154
  const code_challenge_method = "S256";
137
155
  const authorizationServer = await this.getAuthServer();
@@ -187,8 +205,11 @@ export class OpenIDAuthenticationProvider
187
205
  sessionStorage.setItem(STATE_KEY, state);
188
206
  authorizationUrl.searchParams.set("state", state);
189
207
 
190
- // now redirect the user to authorizationUrl.href
191
- location.href = authorizationUrl.href;
208
+ if (replace) {
209
+ location.replace(authorizationUrl.href);
210
+ } else {
211
+ location.href = authorizationUrl.href;
212
+ }
192
213
  }
193
214
 
194
215
  async getAccessToken(): Promise<string> {
@@ -423,7 +444,11 @@ export class OpenIDAuthenticationProvider
423
444
  path: OPENID_CALLBACK_PATH,
424
445
  element: (
425
446
  <ClientOnly>
426
- <CallbackHandler handleCallback={this.handleCallback} />
447
+ <ErrorBoundary
448
+ fallbackRender={({ error }) => <OAuthErrorPage error={error} />}
449
+ >
450
+ <CallbackHandler handleCallback={this.handleCallback} />
451
+ </ErrorBoundary>
427
452
  </ClientOnly>
428
453
  ),
429
454
  },
@@ -34,7 +34,6 @@ export const Banner = () => {
34
34
  "relative text-primary-foreground text-sm font-medium px-4 py-2 flex gap-2 items-center lg:h-(--banner-height)",
35
35
  mappedColor,
36
36
  )}
37
- data-pagefind-ignore="all"
38
37
  style={style}
39
38
  >
40
39
  <div className="w-full">{page.banner.message}</div>
@@ -9,7 +9,10 @@ export const CategoryHeading = ({
9
9
  className?: string;
10
10
  }) => {
11
11
  return (
12
- <div className={cx("text-sm font-semibold text-primary mb-2", className)}>
12
+ <div
13
+ className={cx("text-sm font-semibold text-primary mb-2", className)}
14
+ data-pagefind-ignore="all"
15
+ >
13
16
  {children}
14
17
  </div>
15
18
  );
@@ -81,13 +81,16 @@ export const Header = memo(function HeaderInner() {
81
81
  const borderBottom = "inset-shadow-[0_-1px_0_0_var(--border)]";
82
82
 
83
83
  return (
84
- <header className="sticky lg:top-0 z-10 bg-background/80 backdrop-blur w-full">
84
+ <header
85
+ className="sticky lg:top-0 z-10 bg-background/80 backdrop-blur w-full"
86
+ data-pagefind-ignore="all"
87
+ >
85
88
  <Banner />
86
89
  <div className={cn(borderBottom, "relative")}>
87
90
  <PageProgress />
88
91
  <div className="max-w-screen-2xl mx-auto flex items-center justify-between h-(--top-header-height) px-4 lg:px-8 border-transparent">
89
92
  <div className="flex">
90
- <Link to="/">
93
+ <Link to={site?.logo?.href ?? "/"}>
91
94
  <div className="flex items-center gap-3.5">
92
95
  {site?.logo && (
93
96
  <>
@@ -66,7 +66,7 @@ export const Heading = ({
66
66
  return (
67
67
  <Component
68
68
  className={heading({
69
- className: cn(className, "flex items-center gap-[0.33em]"),
69
+ className: cn("flex items-center gap-[0.33em]", className),
70
70
  level,
71
71
  })}
72
72
  ref={registerNavigationAnchor ? ref : undefined}
@@ -1,5 +1,5 @@
1
1
  import { memo, useMemo } from "react";
2
- import { MarkdownHooks, type Components } from "react-markdown";
2
+ import ReactMarkdown, { type Components } from "react-markdown";
3
3
  import rehypeRaw from "rehype-raw";
4
4
  import remarkGfm from "remark-gfm";
5
5
  import { createConfiguredShikiRehypePlugins } from "../shiki.js";
@@ -35,13 +35,13 @@ export const Markdown = memo(
35
35
 
36
36
  return (
37
37
  <Typography className={className}>
38
- <MarkdownHooks
38
+ <ReactMarkdown
39
39
  remarkPlugins={remarkPlugins}
40
40
  rehypePlugins={rehypePlugins}
41
41
  components={mdComponents}
42
42
  >
43
43
  {content}
44
- </MarkdownHooks>
44
+ </ReactMarkdown>
45
45
  </Typography>
46
46
  );
47
47
  },
@@ -1,6 +1,7 @@
1
1
  import { VisuallyHidden } from "@radix-ui/react-visually-hidden";
2
2
  import { MenuIcon } from "lucide-react";
3
- import { useState } from "react";
3
+ import { Fragment, useState } from "react";
4
+ import { Skeleton } from "zudoku/ui/Skeleton.js";
4
5
  import { useAuth } from "../authentication/hook.js";
5
6
  import {
6
7
  Drawer,
@@ -8,6 +9,7 @@ import {
8
9
  DrawerTitle,
9
10
  DrawerTrigger,
10
11
  } from "../ui/Drawer.js";
12
+ import { ClientOnly } from "./ClientOnly.js";
11
13
  import { useZudoku } from "./context/ZudokuContext.js";
12
14
  import { PoweredByZudoku } from "./navigation/PoweredByZudoku.js";
13
15
  import { isHiddenItem } from "./navigation/utils.js";
@@ -15,14 +17,18 @@ import { PageProgress } from "./PageProgress.js";
15
17
  import { Search } from "./Search.js";
16
18
  import { Slot } from "./Slot.js";
17
19
  import { ThemeSwitch } from "./ThemeSwitch.js";
18
- import { TopNavItem } from "./TopNavigation.js";
20
+ import { TopNavItem, TopNavLink } from "./TopNavigation.js";
19
21
 
20
22
  export const MobileTopNavigation = () => {
21
- const { navigation, options } = useZudoku();
22
- const { isAuthenticated } = useAuth();
23
+ const context = useZudoku();
24
+ const authState = useAuth();
25
+
26
+ const { navigation, options, getProfileMenuItems } = context;
27
+ const { isAuthenticated, profile, isAuthEnabled } = authState;
23
28
  const [drawerOpen, setDrawerOpen] = useState(false);
24
29
 
25
- const filteredItems = navigation.filter(isHiddenItem(isAuthenticated));
30
+ const accountItems = getProfileMenuItems();
31
+ const filteredItems = navigation.filter(isHiddenItem(authState, context));
26
32
 
27
33
  return (
28
34
  <Drawer
@@ -50,9 +56,36 @@ export const MobileTopNavigation = () => {
50
56
  <li className="empty:hidden">
51
57
  <Slot.Target name="top-navigation-side" />
52
58
  </li>
53
- <li>
54
- <ThemeSwitch />
55
- </li>
59
+
60
+ {isAuthEnabled && (
61
+ <ClientOnly
62
+ fallback={<Skeleton className="rounded-sm h-5 w-24 mr-4" />}
63
+ >
64
+ {!isAuthenticated ? (
65
+ <li>
66
+ <TopNavLink
67
+ to="/signin"
68
+ onClick={() => setDrawerOpen(false)}
69
+ >
70
+ Login
71
+ </TopNavLink>
72
+ </li>
73
+ ) : (
74
+ Object.values(getProfileMenuItems()).length > 0 && (
75
+ <Fragment>
76
+ <li>
77
+ {profile?.name ? `${profile.name}` : "My Account"}
78
+ {profile?.email && (
79
+ <div className="font-normal text-muted-foreground">
80
+ {profile.email}
81
+ </div>
82
+ )}
83
+ </li>
84
+ </Fragment>
85
+ )
86
+ )}
87
+ </ClientOnly>
88
+ )}
56
89
  {filteredItems.map((item) => (
57
90
  <li key={item.label}>
58
91
  <button type="button" onClick={() => setDrawerOpen(false)}>
@@ -60,6 +93,25 @@ export const MobileTopNavigation = () => {
60
93
  </button>
61
94
  </li>
62
95
  ))}
96
+ {isAuthEnabled && isAuthenticated && accountItems.length > 0 && (
97
+ <ClientOnly
98
+ fallback={<Skeleton className="rounded-sm h-5 w-24 mr-4" />}
99
+ >
100
+ {accountItems.map((i) => (
101
+ <li key={i.label}>
102
+ <TopNavLink
103
+ to={i.path ?? ""}
104
+ onClick={() => setDrawerOpen(false)}
105
+ >
106
+ {i.label}
107
+ </TopNavLink>
108
+ </li>
109
+ ))}
110
+ </ClientOnly>
111
+ )}
112
+ <li>
113
+ <ThemeSwitch />
114
+ </li>
63
115
  </ul>
64
116
  </div>
65
117
  {options.site?.showPoweredBy !== false && (
@@ -18,9 +18,10 @@ export const NotFoundPage = () => {
18
18
  <DeveloperHint>
19
19
  Start by adding a file at{" "}
20
20
  <code>
21
- {"{PROJECT_ROOT}"}/{params["*"]}.mdx
21
+ {"{DOCUMENT_ROOT}"}/{params["*"]}.mdx
22
22
  </code>{" "}
23
- and add some content to make this error go away.
23
+ and add some content to make this error go away. By default{" "}
24
+ <code>DOCUMENT_ROOT</code> is the `pages` directory.
24
25
  </DeveloperHint>
25
26
  <p>
26
27
  It seems that the page you are looking for does not exist or may have
@@ -22,6 +22,7 @@ export const Pagination = ({
22
22
  prev ? "justify-between" : "justify-end",
23
23
  className,
24
24
  )}
25
+ data-pagefind-ignore="all"
25
26
  >
26
27
  {prev && (
27
28
  <Button variant="ghost" asChild>
@@ -1,5 +1,6 @@
1
1
  import type { ReactNode } from "react";
2
2
  import { ErrorPage } from "./ErrorPage.js";
3
+ import { NotFoundPage } from "./NotFoundPage.js";
3
4
 
4
5
  type StatusPageProps = {
5
6
  statusCode: number;
@@ -79,6 +80,10 @@ const getDefaultContent = (
79
80
  };
80
81
 
81
82
  export const StatusPage = ({ statusCode, message }: StatusPageProps) => {
83
+ if (statusCode === 404) {
84
+ return <NotFoundPage />;
85
+ }
86
+
82
87
  const defaultContent = getDefaultContent(statusCode);
83
88
 
84
89
  return (
@@ -1,7 +1,7 @@
1
1
  import { cx } from "class-variance-authority";
2
2
  import { deepEqual } from "fast-equals";
3
3
  import { Suspense } from "react";
4
- import { NavLink } from "react-router";
4
+ import { NavLink, type NavLinkProps } from "react-router";
5
5
  import { type NavigationItem } from "../../config/validators/NavigationSchema.js";
6
6
  import { useAuth } from "../authentication/hook.js";
7
7
  import { joinUrl } from "../util/joinUrl.js";
@@ -10,10 +10,10 @@ import { isHiddenItem, traverseNavigationItem } from "./navigation/utils.js";
10
10
  import { Slot } from "./Slot.js";
11
11
 
12
12
  export const TopNavigation = () => {
13
- const { navigation } = useZudoku();
14
- const { isAuthenticated } = useAuth();
15
-
16
- const filteredItems = navigation.filter(isHiddenItem(isAuthenticated));
13
+ const context = useZudoku();
14
+ const { navigation } = context;
15
+ const auth = useAuth();
16
+ const filteredItems = navigation.filter(isHiddenItem(auth, context));
17
17
 
18
18
  if (filteredItems.length === 0 || import.meta.env.MODE === "standalone") {
19
19
  return <style>{`:root { --top-nav-height: 0px; }`}</style>;
@@ -62,37 +62,53 @@ const getPathForItem = (item: NavigationItem): string => {
62
62
  }
63
63
  };
64
64
 
65
- export const TopNavItem = (item: NavigationItem) => {
66
- const currentNav = useCurrentNavigation();
67
- const isActiveTopNavItem = deepEqual(currentNav.topNavItem, item);
68
-
69
- const path = getPathForItem(item);
70
-
65
+ export const TopNavLink = ({
66
+ isActive,
67
+ children,
68
+ ...props
69
+ }: {
70
+ isActive?: boolean;
71
+ children: React.ReactNode;
72
+ } & NavLinkProps) => {
71
73
  return (
72
- // We don't use isActive here because it has to be inside the navigation,
73
- // the top nav id doesn't necessarily start with the navigation id
74
74
  <NavLink
75
75
  viewTransition
76
- to={path}
77
76
  className={({ isActive: isActiveNavLink, isPending }) => {
78
- const isActive = isActiveNavLink || isActiveTopNavItem;
77
+ const isActiveReal = isActiveNavLink || isActive;
79
78
  return cx(
80
79
  "flex items-center gap-2 lg:py-3.5 font-medium -mb-px transition duration-150 delay-75 relative",
81
- isActive || isPending
80
+ isActiveReal || isPending
82
81
  ? [
83
82
  "text-foreground",
84
83
  // underline with view transition animation
85
84
  "after:content-[''] after:absolute after:bottom-0 after:left-0 after:right-0",
86
85
  "after:h-0.5 after:bg-primary",
87
- isActive && "after:[view-transition-name:top-nav-underline]",
86
+ isActiveReal &&
87
+ "after:[view-transition-name:top-nav-underline]",
88
88
  isPending && "after:bg-primary/25",
89
89
  ]
90
90
  : "text-foreground/75 hover:text-foreground",
91
91
  );
92
92
  }}
93
+ {...props}
93
94
  >
95
+ {children}
96
+ </NavLink>
97
+ );
98
+ };
99
+
100
+ export const TopNavItem = (item: NavigationItem) => {
101
+ const currentNav = useCurrentNavigation();
102
+ const isActiveTopNavItem = deepEqual(currentNav.topNavItem, item);
103
+
104
+ const path = getPathForItem(item);
105
+
106
+ return (
107
+ // We don't use isActive here because it has to be inside the navigation,
108
+ // the top nav id doesn't necessarily start with the navigation id
109
+ <TopNavLink to={path} isActive={isActiveTopNavItem}>
94
110
  {item.icon && <item.icon size={16} className="align-[-0.125em]" />}
95
111
  {item.label}
96
- </NavLink>
112
+ </TopNavLink>
97
113
  );
98
114
  };
@@ -1,7 +1,7 @@
1
1
  import { cn } from "../util/cn.js";
2
2
 
3
3
  // other styles are defined in main.css .prose
4
- export const ProseClasses = "prose dark:prose-invert prose-neutral";
4
+ export const ProseClasses = "prose dark:prose-invert prose-neutral typography";
5
5
 
6
6
  export const Typography = ({
7
7
  children,
@@ -2,7 +2,6 @@ import { useQuery, useSuspenseQuery } from "@tanstack/react-query";
2
2
  import { createContext, useContext } from "react";
3
3
  import { matchPath, useLocation } from "react-router";
4
4
  import { type NavigationItem } from "../../../config/validators/NavigationSchema.js";
5
- import { useAuth } from "../../authentication/hook.js";
6
5
  import type { ZudokuContext } from "../../core/ZudokuContext.js";
7
6
  import { joinUrl } from "../../util/joinUrl.js";
8
7
  import { CACHE_KEYS } from "../cache.js";
@@ -45,14 +44,28 @@ const getItemPath = (item: NavigationItem) => {
45
44
  return undefined;
46
45
  }
47
46
  };
47
+
48
+ const extractAllPaths = (items: NavigationItem[]) => {
49
+ const paths = new Set<string>();
50
+
51
+ const collectPaths = (items: NavigationItem[]) => {
52
+ for (const item of items) {
53
+ const itemPath = getItemPath(item)?.split("?").at(0)?.split("#").at(0);
54
+
55
+ if (itemPath) paths.add(itemPath);
56
+ if (item.type === "category") {
57
+ collectPaths(item.items);
58
+ }
59
+ }
60
+ };
61
+ collectPaths(items);
62
+
63
+ return [...paths];
64
+ };
65
+
48
66
  export const useCurrentNavigation = () => {
49
- const { getPluginNavigation, navigation, options } = useZudoku();
67
+ const { getPluginNavigation, navigation } = useZudoku();
50
68
  const location = useLocation();
51
- const auth = useAuth();
52
-
53
- const isProtectedRoute = options.protectedRoutes?.some((route) =>
54
- matchPath(route, location.pathname),
55
- );
56
69
 
57
70
  const navItem = traverseNavigation(navigation, (item, parentCategories) => {
58
71
  if (getItemPath(item) === location.pathname) {
@@ -67,12 +80,8 @@ export const useCurrentNavigation = () => {
67
80
 
68
81
  let topNavItem = navItem;
69
82
  if (!navItem && data.length > 0) {
70
- // Extract base paths from plugin navigation items
71
- const pluginBasePaths = data.flatMap((item) => {
72
- return getItemPath(item)?.split("?").at(0)?.split("#").at(0) ?? [];
73
- });
83
+ const pluginBasePaths = extractAllPaths(data);
74
84
 
75
- // Find top-level nav item that matches any plugin base path
76
85
  topNavItem = navigation
77
86
  .flatMap((item) => {
78
87
  const itemPath = getItemPath(item);
@@ -88,13 +97,11 @@ export const useCurrentNavigation = () => {
88
97
  })?.item;
89
98
  }
90
99
 
91
- const hasNavigation =
92
- auth.isAuthEnabled && !auth.isAuthenticated && isProtectedRoute;
93
-
94
100
  return {
95
- navigation: hasNavigation
96
- ? []
97
- : [...(navItem?.type === "category" ? navItem.items : []), ...data],
101
+ navigation: [
102
+ ...(navItem?.type === "category" ? navItem.items : []),
103
+ ...data,
104
+ ],
98
105
  topNavItem,
99
106
  };
100
107
  };
@@ -9,13 +9,15 @@ import {
9
9
  TooltipTrigger,
10
10
  } from "zudoku/ui/Tooltip.js";
11
11
  import type { NavigationItem as NavigationItemType } from "../../../config/validators/NavigationSchema.js";
12
+ import { useAuth } from "../../authentication/hook.js";
12
13
  import { cn } from "../../util/cn.js";
13
14
  import { joinUrl } from "../../util/joinUrl.js";
14
15
  import { AnchorLink } from "../AnchorLink.js";
15
16
  import { useViewportAnchor } from "../context/ViewportAnchorContext.js";
17
+ import { useZudoku } from "../context/ZudokuContext.js";
16
18
  import { NavigationBadge } from "./NavigationBadge.js";
17
19
  import { NavigationCategory } from "./NavigationCategory.js";
18
- import { navigationListItem } from "./utils.js";
20
+ import { isHiddenItem, navigationListItem } from "./utils.js";
19
21
 
20
22
  const TruncatedLabel = ({
21
23
  label,
@@ -74,6 +76,12 @@ export const NavigationItem = ({
74
76
  }) => {
75
77
  const location = useLocation();
76
78
  const { activeAnchor } = useViewportAnchor();
79
+ const auth = useAuth();
80
+ const context = useZudoku();
81
+
82
+ if (!isHiddenItem(auth, context)(item)) {
83
+ return null;
84
+ }
77
85
 
78
86
  switch (item.type) {
79
87
  case "category":
@@ -19,7 +19,10 @@ export const NavigationWrapper = ({
19
19
  }, []);
20
20
 
21
21
  return (
22
- <div className="grid sticky top-(--header-height) lg:h-[calc(100vh-var(--header-height))] grid-rows-[1fr_min-content] border-r">
22
+ <div
23
+ className="grid sticky top-(--header-height) lg:h-[calc(100vh-var(--header-height))] grid-rows-[1fr_min-content] border-r"
24
+ data-pagefind-ignore="all"
25
+ >
23
26
  <nav
24
27
  ref={navRef}
25
28
  className={cn(
@@ -4,6 +4,8 @@ import type {
4
4
  NavigationCategory,
5
5
  NavigationItem,
6
6
  } from "../../../config/validators/NavigationSchema.js";
7
+ import type { UseAuthReturn } from "../../authentication/hook.js";
8
+ import type { ZudokuContext } from "../../core/ZudokuContext.js";
7
9
  import { joinUrl } from "../../util/joinUrl.js";
8
10
  import { useCurrentNavigation } from "../context/ZudokuContext.js";
9
11
 
@@ -133,14 +135,18 @@ export const navigationListItem = cva(
133
135
  );
134
136
 
135
137
  export const isHiddenItem =
136
- (isAuthenticated?: boolean) =>
138
+ (auth: UseAuthReturn, context: ZudokuContext) =>
137
139
  (item: NavigationItem): boolean => {
140
+ if (typeof item.display === "function") {
141
+ return item.display({ context, auth });
142
+ }
143
+
138
144
  if (item.display === "hide") return false;
139
145
  if (!item.label) return false;
140
146
 
141
147
  return (
142
- (item.display === "auth" && isAuthenticated) ||
143
- (item.display === "anon" && !isAuthenticated) ||
148
+ (item.display === "auth" && auth.isAuthenticated) ||
149
+ (item.display === "anon" && !auth.isAuthenticated) ||
144
150
  !item.display ||
145
151
  item.display === "always"
146
152
  );
@@ -24,14 +24,18 @@ export const RouteGuard = () => {
24
24
  const location = useLocation();
25
25
  const latestPath = useLatest(location.pathname);
26
26
  const shouldBypass = use(BypassProtectedRoutesContext);
27
+ const { protectedRoutes } = zudoku.options;
27
28
 
28
- const { protectedRoutes = [] } = zudoku.options;
29
+ const authCheckFn =
30
+ !shouldBypass && protectedRoutes
31
+ ? Object.entries(protectedRoutes).find(([path]) =>
32
+ matchPath({ path, end: true }, location.pathname),
33
+ )?.[1]
34
+ : undefined;
29
35
 
30
- const isProtected =
31
- !shouldBypass &&
32
- protectedRoutes.some((path) =>
33
- matchPath({ path, end: true }, location.pathname),
34
- );
36
+ const isProtectedRoute = authCheckFn !== undefined;
37
+ const needsToSignIn =
38
+ isProtectedRoute && !authCheckFn({ auth, context: zudoku });
35
39
 
36
40
  useQuery({
37
41
  queryKey: ["login-redirect"],
@@ -42,14 +46,10 @@ export const RouteGuard = () => {
42
46
  });
43
47
  return true;
44
48
  },
45
- enabled:
46
- typeof window !== "undefined" &&
47
- isProtected &&
48
- !auth.isPending &&
49
- !auth.isAuthenticated,
49
+ enabled: typeof window !== "undefined" && needsToSignIn && !auth.isPending,
50
50
  });
51
51
 
52
- if (isProtected && !auth.isAuthenticated) {
52
+ if (needsToSignIn) {
53
53
  return (
54
54
  <Dialog
55
55
  open={true}
@@ -71,7 +71,7 @@ export const RouteGuard = () => {
71
71
  );
72
72
  }
73
73
 
74
- if (isProtected && !auth.isAuthEnabled) {
74
+ if (isProtectedRoute && !auth.isAuthEnabled) {
75
75
  throw new ZudokuError("Authentication is not enabled", {
76
76
  title: "Authentication is not enabled",
77
77
  developerHint: