@lukoweb/apitogo 0.1.24 → 0.1.37

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 (477) hide show
  1. package/README.md +92 -0
  2. package/cli.js +13 -13
  3. package/client.d.ts +8 -8
  4. package/dist/cli/cli.js +1117 -624
  5. package/dist/declarations/config/config.d.ts +4 -0
  6. package/dist/declarations/config/loader.d.ts +2 -0
  7. package/dist/declarations/config/resolve-modules.d.ts +34 -0
  8. package/dist/declarations/config/validators/InputNavigationSchema.d.ts +7 -7
  9. package/dist/declarations/config/validators/ModulesSchema.d.ts +417 -0
  10. package/dist/declarations/config/validators/ZudokuConfig.d.ts +123 -4
  11. package/dist/declarations/index.d.ts +3 -1
  12. package/dist/declarations/lib/authentication/components/ProductionUnlockPage.d.ts +1 -0
  13. package/dist/declarations/lib/authentication/hook.d.ts +3 -19
  14. package/dist/declarations/lib/authentication/providers/dev-portal-constants.d.ts +16 -0
  15. package/dist/declarations/lib/authentication/providers/dev-portal-utils.d.ts +9 -0
  16. package/dist/declarations/lib/authentication/providers/dev-portal.d.ts +39 -0
  17. package/dist/declarations/lib/authentication/state.d.ts +12 -26
  18. package/dist/declarations/lib/components/LandingLayout.d.ts +4 -0
  19. package/dist/declarations/lib/components/index.d.ts +2 -0
  20. package/dist/declarations/lib/plugins/api-keys/index.d.ts +2 -1
  21. package/dist/flat-config.d.ts +209 -24
  22. package/docs/components/alert.mdx +130 -0
  23. package/docs/components/badge.mdx +70 -0
  24. package/docs/components/button.mdx +132 -0
  25. package/docs/components/callout.mdx +112 -0
  26. package/docs/components/card.mdx +104 -0
  27. package/docs/components/checkbox.mdx +72 -0
  28. package/docs/components/client-only.mdx +79 -0
  29. package/docs/components/code-tabs.mdx +179 -0
  30. package/docs/components/dialog.mdx +167 -0
  31. package/docs/components/head.mdx +200 -0
  32. package/docs/components/icons.mdx +27 -0
  33. package/docs/components/input.mdx +96 -0
  34. package/docs/components/label.mdx +86 -0
  35. package/docs/components/link.mdx +242 -0
  36. package/docs/components/markdown.mdx +151 -0
  37. package/docs/components/mermaid.mdx +81 -0
  38. package/docs/components/playground.mdx +87 -0
  39. package/docs/components/secret.mdx +79 -0
  40. package/docs/components/select.mdx +176 -0
  41. package/docs/components/shadcn.mdx +73 -0
  42. package/docs/components/slider.mdx +108 -0
  43. package/docs/components/slot.mdx +119 -0
  44. package/docs/components/stepper.mdx +138 -0
  45. package/docs/components/switch.mdx +96 -0
  46. package/docs/components/syntax-highlight.mdx +602 -0
  47. package/docs/components/textarea.mdx +78 -0
  48. package/docs/components/tooltip.mdx +195 -0
  49. package/docs/components/typography.mdx +61 -0
  50. package/docs/concepts/auth-provider-api-identities.md +109 -0
  51. package/docs/configuration/ai-assistants.md +65 -0
  52. package/docs/configuration/api-catalog.md +109 -0
  53. package/docs/configuration/api-reference.md +397 -0
  54. package/docs/configuration/authentication-auth0.md +174 -0
  55. package/docs/configuration/authentication-azure-ad.md +238 -0
  56. package/docs/configuration/authentication-clerk.md +110 -0
  57. package/docs/configuration/authentication-firebase.md +62 -0
  58. package/docs/configuration/authentication-pingfederate.md +136 -0
  59. package/docs/configuration/authentication-supabase.md +226 -0
  60. package/docs/configuration/authentication.md +231 -0
  61. package/docs/configuration/build-configuration.mdx +147 -0
  62. package/docs/configuration/docs.md +282 -0
  63. package/docs/configuration/footer.mdx +214 -0
  64. package/docs/configuration/llms.md +90 -0
  65. package/docs/configuration/make-config.mdx +90 -0
  66. package/docs/configuration/navigation.mdx +422 -0
  67. package/docs/configuration/overview.md +380 -0
  68. package/docs/configuration/protected-routes.md +150 -0
  69. package/docs/configuration/search.md +163 -0
  70. package/docs/configuration/sentry.mdx +44 -0
  71. package/docs/configuration/site.md +124 -0
  72. package/docs/configuration/slots.mdx +125 -0
  73. package/docs/configuration/vite-config.md +18 -0
  74. package/docs/custom-plugins.md +285 -0
  75. package/docs/customization/colors-theme.mdx +276 -0
  76. package/docs/customization/fonts.md +110 -0
  77. package/docs/deploy/apache-nginx.md +41 -0
  78. package/docs/deploy/apitogo.md +139 -0
  79. package/docs/deploy/cloudflare-pages.md +75 -0
  80. package/docs/deploy/direct-upload.md +18 -0
  81. package/docs/deploy/github-pages.md +50 -0
  82. package/docs/deploy/vercel.md +103 -0
  83. package/docs/deployment.md +21 -0
  84. package/docs/extending/events.md +124 -0
  85. package/docs/guides/custom-pages.md +106 -0
  86. package/docs/guides/environment-variables.md +99 -0
  87. package/docs/guides/managing-api-keys-and-identities.md +172 -0
  88. package/docs/guides/mermaid.mdx +70 -0
  89. package/docs/guides/navigation-migration.md +87 -0
  90. package/docs/guides/navigation-rules.mdx +203 -0
  91. package/docs/guides/processors.mdx +234 -0
  92. package/docs/guides/static-files.md +55 -0
  93. package/docs/guides/transforming-examples.md +156 -0
  94. package/docs/guides/using-multiple-apis.md +87 -0
  95. package/docs/markdown/admonitions.md +128 -0
  96. package/docs/markdown/code-blocks.md +196 -0
  97. package/docs/markdown/frontmatter.md +173 -0
  98. package/docs/markdown/mdx.md +68 -0
  99. package/docs/markdown/overview.md +275 -0
  100. package/docs/plugins.md +5 -0
  101. package/docs/quickstart.md +87 -0
  102. package/docs/writing.mdx +72 -0
  103. package/package.json +170 -116
  104. package/src/app/ZuploBuildConfig.ts +36 -36
  105. package/src/app/defaultTheme.css +77 -77
  106. package/src/app/demo-cdn.html +37 -37
  107. package/src/app/demo.html +21 -21
  108. package/src/app/demo.tsx +77 -77
  109. package/src/app/entry.client.tsx +118 -118
  110. package/src/app/entry.server.tsx +160 -160
  111. package/src/app/env.ts +40 -40
  112. package/src/app/font.geist.css +73 -73
  113. package/src/app/main.css +390 -390
  114. package/src/app/main.tsx +8 -1
  115. package/src/app/polyfills.ts +47 -47
  116. package/src/app/processRoutes.tsx +51 -25
  117. package/src/app/sentry.ts +24 -24
  118. package/src/app/standalone.html +23 -23
  119. package/src/app/standalone.tsx +60 -60
  120. package/src/app/utils/createRedirectRoutes.ts +11 -11
  121. package/src/config/config.ts +32 -0
  122. package/src/config/create-plugin.ts +71 -71
  123. package/src/config/file-exists.ts +6 -6
  124. package/src/config/loader.ts +11 -1
  125. package/src/config/resolve-modules.ts +260 -0
  126. package/src/config/validators/BuildSchema.ts +95 -95
  127. package/src/config/validators/HeaderNavigationSchema.ts +41 -41
  128. package/src/config/validators/InputNavigationSchema.test-d.ts +178 -178
  129. package/src/config/validators/InputNavigationSchema.ts +206 -206
  130. package/src/config/validators/ModulesSchema.ts +312 -0
  131. package/src/config/validators/ProtectedRoutesSchema.ts +35 -35
  132. package/src/config/validators/ZudokuConfig.ts +766 -729
  133. package/src/config/validators/auth.ts +3 -3
  134. package/src/config/validators/reason-codes.ts +7 -7
  135. package/src/env.d.ts +11 -11
  136. package/src/index.ts +31 -0
  137. package/src/lib/MissingIcon.tsx +22 -22
  138. package/src/lib/assets/language-icons/bun.tsx +50 -50
  139. package/src/lib/assets/language-icons/c.tsx +31 -31
  140. package/src/lib/assets/language-icons/commonlisp.tsx +22 -22
  141. package/src/lib/assets/language-icons/cpp.tsx +35 -35
  142. package/src/lib/assets/language-icons/csharp.tsx +35 -35
  143. package/src/lib/assets/language-icons/css.tsx +36 -36
  144. package/src/lib/assets/language-icons/dart.tsx +39 -39
  145. package/src/lib/assets/language-icons/elixir.tsx +19 -19
  146. package/src/lib/assets/language-icons/go.tsx +19 -19
  147. package/src/lib/assets/language-icons/graphql.tsx +19 -19
  148. package/src/lib/assets/language-icons/html.tsx +24 -24
  149. package/src/lib/assets/language-icons/java.tsx +35 -35
  150. package/src/lib/assets/language-icons/javascript.tsx +11 -11
  151. package/src/lib/assets/language-icons/json.tsx +19 -19
  152. package/src/lib/assets/language-icons/kotlin.tsx +30 -30
  153. package/src/lib/assets/language-icons/markdown.tsx +19 -19
  154. package/src/lib/assets/language-icons/mdx.tsx +23 -23
  155. package/src/lib/assets/language-icons/npm.tsx +15 -15
  156. package/src/lib/assets/language-icons/objectivec.tsx +23 -23
  157. package/src/lib/assets/language-icons/ocaml.tsx +34 -34
  158. package/src/lib/assets/language-icons/php.tsx +19 -19
  159. package/src/lib/assets/language-icons/pnpm.tsx +32 -32
  160. package/src/lib/assets/language-icons/powershell.tsx +27 -27
  161. package/src/lib/assets/language-icons/python.tsx +23 -23
  162. package/src/lib/assets/language-icons/react.tsx +21 -21
  163. package/src/lib/assets/language-icons/ruby.tsx +19 -19
  164. package/src/lib/assets/language-icons/rust.tsx +19 -19
  165. package/src/lib/assets/language-icons/scala.tsx +19 -19
  166. package/src/lib/assets/language-icons/shell.tsx +19 -19
  167. package/src/lib/assets/language-icons/swift.tsx +19 -19
  168. package/src/lib/assets/language-icons/toml.tsx +23 -23
  169. package/src/lib/assets/language-icons/typescript.tsx +23 -23
  170. package/src/lib/assets/language-icons/xml.tsx +19 -19
  171. package/src/lib/assets/language-icons/yaml.tsx +23 -23
  172. package/src/lib/assets/language-icons/yarn.tsx +17 -17
  173. package/src/lib/assets/language-icons/zig.tsx +32 -32
  174. package/src/lib/auth/issuer.ts +34 -31
  175. package/src/lib/authentication/AuthenticationPlugin.tsx +33 -33
  176. package/src/lib/authentication/authentication.ts +48 -48
  177. package/src/lib/authentication/components/OAuthErrorPage.tsx +197 -197
  178. package/src/lib/authentication/components/ProductionUnlockPage.tsx +27 -0
  179. package/src/lib/authentication/components/SignOut.tsx +15 -15
  180. package/src/lib/authentication/constants.ts +1 -1
  181. package/src/lib/authentication/errors.ts +34 -34
  182. package/src/lib/authentication/hook.ts +141 -139
  183. package/src/lib/authentication/providers/auth0.tsx +91 -91
  184. package/src/lib/authentication/providers/azureb2c.tsx +223 -223
  185. package/src/lib/authentication/providers/dev-portal-constants.ts +21 -0
  186. package/src/lib/authentication/providers/dev-portal-utils.ts +107 -0
  187. package/src/lib/authentication/providers/dev-portal.tsx +270 -0
  188. package/src/lib/authentication/providers/firebase.tsx +486 -486
  189. package/src/lib/authentication/providers/openid.tsx +516 -516
  190. package/src/lib/authentication/providers/supabase.tsx +412 -412
  191. package/src/lib/authentication/providers/util.ts +26 -26
  192. package/src/lib/authentication/state.ts +179 -91
  193. package/src/lib/authentication/ui/icons/Apple.tsx +10 -10
  194. package/src/lib/authentication/ui/icons/Facebook.tsx +15 -15
  195. package/src/lib/authentication/ui/icons/Github.tsx +16 -16
  196. package/src/lib/authentication/ui/icons/Google.tsx +16 -16
  197. package/src/lib/authentication/ui/icons/Microsoft.tsx +12 -12
  198. package/src/lib/authentication/ui/icons/X.tsx +10 -10
  199. package/src/lib/authentication/utils/relativeRedirectUrl.ts +16 -16
  200. package/src/lib/components/AnchorLink.tsx +24 -24
  201. package/src/lib/components/Banner.tsx +52 -52
  202. package/src/lib/components/Bootstrap.tsx +77 -77
  203. package/src/lib/components/BuildCheck.tsx +87 -87
  204. package/src/lib/components/CategoryHeading.tsx +19 -19
  205. package/src/lib/components/ClientOnly.tsx +19 -19
  206. package/src/lib/components/ErrorPage.tsx +26 -26
  207. package/src/lib/components/Footer.tsx +140 -140
  208. package/src/lib/components/Framed.tsx +51 -51
  209. package/src/lib/components/Header.tsx +11 -3
  210. package/src/lib/components/HeaderNavigation.tsx +148 -148
  211. package/src/lib/components/Heading.tsx +84 -84
  212. package/src/lib/components/InlineCode.tsx +15 -15
  213. package/src/lib/components/LandingLayout.tsx +21 -0
  214. package/src/lib/components/LanguageIcon.tsx +199 -199
  215. package/src/lib/components/Markdown.tsx +55 -55
  216. package/src/lib/components/Meta.tsx +46 -46
  217. package/src/lib/components/MobileTopNavigation.tsx +11 -3
  218. package/src/lib/components/NotFoundPage.tsx +37 -37
  219. package/src/lib/components/PageProgress.tsx +28 -28
  220. package/src/lib/components/PagefindSearchMeta.tsx +14 -14
  221. package/src/lib/components/Pagination.tsx +44 -44
  222. package/src/lib/components/PathRenderer.tsx +61 -61
  223. package/src/lib/components/PluginHeads.tsx +17 -17
  224. package/src/lib/components/Search.tsx +70 -70
  225. package/src/lib/components/Slot.tsx +64 -64
  226. package/src/lib/components/Spinner.tsx +5 -5
  227. package/src/lib/components/StatusPage.tsx +96 -96
  228. package/src/lib/components/ThemeSwitch.tsx +49 -49
  229. package/src/lib/components/Typography.tsx +12 -12
  230. package/src/lib/components/Zudoku.tsx +106 -106
  231. package/src/lib/components/cache.ts +27 -27
  232. package/src/lib/components/context/RenderContext.ts +11 -11
  233. package/src/lib/components/context/RouterEventsEmitter.tsx +19 -19
  234. package/src/lib/components/context/SlotProvider.tsx +149 -149
  235. package/src/lib/components/context/ViewportAnchorContext.tsx +137 -137
  236. package/src/lib/components/context/ZudokuContext.ts +140 -140
  237. package/src/lib/components/context/ZudokuProvider.tsx +22 -22
  238. package/src/lib/components/context/ZudokuReactContext.tsx +17 -17
  239. package/src/lib/components/index.ts +2 -0
  240. package/src/lib/components/navigation/Navigation.tsx +51 -51
  241. package/src/lib/components/navigation/NavigationBadge.tsx +48 -48
  242. package/src/lib/components/navigation/NavigationFilterContext.tsx +28 -28
  243. package/src/lib/components/navigation/NavigationWrapper.tsx +49 -49
  244. package/src/lib/components/navigation/Toc.tsx +137 -137
  245. package/src/lib/components/navigation/ZudokuLogo.tsx +25 -25
  246. package/src/lib/components/navigation/ZuploLogo.tsx +14 -14
  247. package/src/lib/components/navigation/utils.ts +234 -234
  248. package/src/lib/core/RouteGuard.tsx +11 -1
  249. package/src/lib/core/ZudokuContext.ts +271 -271
  250. package/src/lib/core/plugins.ts +138 -138
  251. package/src/lib/core/react-query.ts +1 -1
  252. package/src/lib/core/router.ts +1 -1
  253. package/src/lib/core/transform-config.ts +67 -67
  254. package/src/lib/demo/DemoAnnouncement.tsx +17 -17
  255. package/src/lib/errors/ErrorAlert.tsx +28 -28
  256. package/src/lib/errors/RouterError.tsx +18 -18
  257. package/src/lib/errors/ServerError.tsx +5 -5
  258. package/src/lib/errors/TopLevelError.tsx +6 -6
  259. package/src/lib/hooks/index.ts +13 -13
  260. package/src/lib/hooks/useEvent.ts +41 -41
  261. package/src/lib/hooks/useHighlighter.ts +15 -15
  262. package/src/lib/hooks/useHotkey.ts +70 -70
  263. package/src/lib/icons.ts +2 -2
  264. package/src/lib/navigation/applyRules.ts +127 -127
  265. package/src/lib/navigation/pathMatcher.ts +81 -81
  266. package/src/lib/oas/graphql/circular.ts +69 -69
  267. package/src/lib/oas/graphql/constants.ts +2 -2
  268. package/src/lib/oas/graphql/index.ts +791 -791
  269. package/src/lib/oas/parser/dereference/index.ts +84 -84
  270. package/src/lib/oas/parser/dereference/resolveRef.ts +32 -32
  271. package/src/lib/oas/parser/index.ts +129 -129
  272. package/src/lib/oas/parser/schemas/v3.0.json +1489 -1489
  273. package/src/lib/oas/parser/schemas/v3.1.json +1298 -1298
  274. package/src/lib/oas/parser/upgrade/index.ts +174 -174
  275. package/src/lib/plugins/api-catalog/index.tsx +119 -119
  276. package/src/lib/plugins/api-keys/ProtectedRoute.tsx +33 -33
  277. package/src/lib/plugins/api-keys/index.tsx +274 -272
  278. package/src/lib/plugins/api-keys/settings/ApiKeyList.tsx +67 -67
  279. package/src/lib/plugins/custom-pages/index.tsx +32 -32
  280. package/src/lib/plugins/markdown/assets/ChatGPTLogo.tsx +11 -11
  281. package/src/lib/plugins/markdown/assets/ClaudeLogo.tsx +19 -19
  282. package/src/lib/plugins/markdown/index.tsx +62 -62
  283. package/src/lib/plugins/openapi/ColorizedParam.tsx +115 -115
  284. package/src/lib/plugins/openapi/Endpoint.tsx +85 -85
  285. package/src/lib/plugins/openapi/MCPEndpoint.tsx +273 -273
  286. package/src/lib/plugins/openapi/OasProvider.tsx +74 -74
  287. package/src/lib/plugins/openapi/OperationList.tsx +275 -275
  288. package/src/lib/plugins/openapi/ParamInfos.tsx +96 -96
  289. package/src/lib/plugins/openapi/ParameterList.tsx +53 -53
  290. package/src/lib/plugins/openapi/ParameterListItem.tsx +161 -161
  291. package/src/lib/plugins/openapi/PlaygroundDialogWrapper.tsx +67 -67
  292. package/src/lib/plugins/openapi/SidecarBox.tsx +57 -57
  293. package/src/lib/plugins/openapi/SimpleSelect.tsx +46 -46
  294. package/src/lib/plugins/openapi/client/GraphQLClient.tsx +73 -73
  295. package/src/lib/plugins/openapi/client/GraphQLContext.tsx +16 -16
  296. package/src/lib/plugins/openapi/client/createServer.ts +35 -35
  297. package/src/lib/plugins/openapi/client/useCreateQuery.ts +44 -44
  298. package/src/lib/plugins/openapi/components/ConstValue.tsx +24 -24
  299. package/src/lib/plugins/openapi/components/NonHighlightedCode.tsx +22 -22
  300. package/src/lib/plugins/openapi/components/SelectOnClick.tsx +29 -29
  301. package/src/lib/plugins/openapi/context.tsx +16 -16
  302. package/src/lib/plugins/openapi/graphql/fragment-masking.ts +104 -104
  303. package/src/lib/plugins/openapi/graphql/gql.ts +95 -95
  304. package/src/lib/plugins/openapi/graphql/graphql.ts +835 -835
  305. package/src/lib/plugins/openapi/graphql/index.ts +2 -2
  306. package/src/lib/plugins/openapi/index.tsx +221 -221
  307. package/src/lib/plugins/openapi/interfaces.ts +100 -100
  308. package/src/lib/plugins/openapi/playground/Headers.tsx +6 -6
  309. package/src/lib/plugins/openapi/playground/PathParams.tsx +53 -53
  310. package/src/lib/plugins/openapi/playground/Spinner.tsx +87 -87
  311. package/src/lib/plugins/openapi/playground/createUrl.ts +25 -25
  312. package/src/lib/plugins/openapi/playground/fileUtils.ts +36 -36
  313. package/src/lib/plugins/openapi/playground/rememberedIdentity.ts +26 -26
  314. package/src/lib/plugins/openapi/playground/request-panel/UrlPath.tsx +31 -31
  315. package/src/lib/plugins/openapi/playground/request-panel/UrlQueryParams.tsx +29 -29
  316. package/src/lib/plugins/openapi/playground/request-panel/useKeyValueFieldManager.ts +340 -340
  317. package/src/lib/plugins/openapi/playground/result-panel/ResponseStatusBar.tsx +117 -117
  318. package/src/lib/plugins/openapi/playground/result-panel/convertToTypes.ts +36 -36
  319. package/src/lib/plugins/openapi/playground/serializeQueryParams.ts +125 -125
  320. package/src/lib/plugins/openapi/playground/useRememberSkipLoginDialog.tsx +23 -23
  321. package/src/lib/plugins/openapi/processors/removeExtensions.ts +29 -29
  322. package/src/lib/plugins/openapi/processors/removeParameters.ts +103 -103
  323. package/src/lib/plugins/openapi/processors/removePaths.ts +57 -57
  324. package/src/lib/plugins/openapi/processors/traverse.ts +1 -1
  325. package/src/lib/plugins/openapi/schema/SchemaExampleAndDefault.tsx +39 -39
  326. package/src/lib/plugins/openapi/schema/UnionView.tsx +132 -132
  327. package/src/lib/plugins/openapi/schema/union-helpers.ts +123 -123
  328. package/src/lib/plugins/openapi/schema/utils.ts +49 -49
  329. package/src/lib/plugins/openapi/state.ts +36 -36
  330. package/src/lib/plugins/openapi/util/buildTagCategories.ts +54 -54
  331. package/src/lib/plugins/openapi/util/createHttpSnippet.ts +135 -135
  332. package/src/lib/plugins/openapi/util/createNavigationCategory.tsx +39 -39
  333. package/src/lib/plugins/openapi/util/generateSchemaExample.ts +191 -191
  334. package/src/lib/plugins/openapi/util/getRoutes.tsx +265 -265
  335. package/src/lib/plugins/openapi/util/methodColorMap.tsx +11 -11
  336. package/src/lib/plugins/openapi/util/methodToColor.ts +27 -27
  337. package/src/lib/plugins/openapi/util/sanitizeMarkdownForMetatag.tsx +32 -32
  338. package/src/lib/plugins/openapi/util/useWarmupSchema.ts +23 -23
  339. package/src/lib/plugins/search-inkeep/index.tsx +108 -108
  340. package/src/lib/plugins/search-inkeep/inkeep.ts +24 -24
  341. package/src/lib/plugins/search-pagefind/get-results.tsx +74 -74
  342. package/src/lib/plugins/search-pagefind/index.tsx +21 -21
  343. package/src/lib/plugins/search-pagefind/types.ts +118 -118
  344. package/src/lib/shiki-constants.ts +24 -24
  345. package/src/lib/testing/index.tsx +146 -146
  346. package/src/lib/ui/Accordion.tsx +55 -55
  347. package/src/lib/ui/Alert.tsx +84 -84
  348. package/src/lib/ui/AlertDialog.tsx +195 -195
  349. package/src/lib/ui/AspectRatio.tsx +5 -5
  350. package/src/lib/ui/Badge.tsx +48 -48
  351. package/src/lib/ui/Breadcrumb.tsx +115 -115
  352. package/src/lib/ui/Button.tsx +65 -65
  353. package/src/lib/ui/ButtonGroup.tsx +80 -80
  354. package/src/lib/ui/Callout.tsx +113 -113
  355. package/src/lib/ui/Card.tsx +95 -95
  356. package/src/lib/ui/Carousel.tsx +259 -259
  357. package/src/lib/ui/Checkbox.tsx +28 -28
  358. package/src/lib/ui/CodeBlock.tsx +92 -92
  359. package/src/lib/ui/CodeTabPanel.tsx +13 -13
  360. package/src/lib/ui/CodeTabs.tsx +161 -161
  361. package/src/lib/ui/Collapsible.tsx +31 -31
  362. package/src/lib/ui/Dialog.tsx +138 -138
  363. package/src/lib/ui/DismissibleAlert.tsx +74 -74
  364. package/src/lib/ui/Drawer.tsx +121 -121
  365. package/src/lib/ui/DropdownMenu.tsx +254 -254
  366. package/src/lib/ui/EmbeddedCodeBlock.tsx +99 -99
  367. package/src/lib/ui/Form.tsx +176 -176
  368. package/src/lib/ui/Frame.tsx +81 -81
  369. package/src/lib/ui/HoverCard.tsx +26 -26
  370. package/src/lib/ui/Input.tsx +23 -23
  371. package/src/lib/ui/InputGroup.tsx +168 -168
  372. package/src/lib/ui/Item.tsx +213 -213
  373. package/src/lib/ui/Kbd.tsx +28 -28
  374. package/src/lib/ui/Label.tsx +23 -23
  375. package/src/lib/ui/NativeSelect.tsx +48 -48
  376. package/src/lib/ui/NavigationMenu.tsx +169 -169
  377. package/src/lib/ui/Pagination.tsx +115 -115
  378. package/src/lib/ui/Popover.tsx +28 -28
  379. package/src/lib/ui/Progress.tsx +25 -25
  380. package/src/lib/ui/RadioGroup.tsx +41 -41
  381. package/src/lib/ui/ReactComponentDoc.tsx +68 -68
  382. package/src/lib/ui/ScrollArea.tsx +45 -45
  383. package/src/lib/ui/Secret.tsx +133 -133
  384. package/src/lib/ui/Select.tsx +184 -184
  385. package/src/lib/ui/Separator.tsx +25 -25
  386. package/src/lib/ui/Skeleton.tsx +15 -15
  387. package/src/lib/ui/Slider.tsx +25 -25
  388. package/src/lib/ui/Stepper.tsx +8 -8
  389. package/src/lib/ui/Switch.tsx +26 -26
  390. package/src/lib/ui/SyntaxHighlight.tsx +54 -54
  391. package/src/lib/ui/Tabs.tsx +52 -52
  392. package/src/lib/ui/Textarea.tsx +22 -22
  393. package/src/lib/ui/Toggle.tsx +42 -42
  394. package/src/lib/ui/ToggleGroup.tsx +58 -58
  395. package/src/lib/ui/Tooltip.tsx +65 -65
  396. package/src/lib/ui/Value.tsx +42 -42
  397. package/src/lib/ui/util.tsx +8 -8
  398. package/src/lib/util/cn.ts +6 -6
  399. package/src/lib/util/createVariantComponent.tsx +61 -61
  400. package/src/lib/util/ensureArray.ts +3 -3
  401. package/src/lib/util/flattenAllOf.ts +72 -72
  402. package/src/lib/util/flattenAllOfProcessor.ts +74 -74
  403. package/src/lib/util/hastToJsx.tsx +67 -67
  404. package/src/lib/util/humanFileSize.ts +15 -15
  405. package/src/lib/util/invariant.ts +52 -52
  406. package/src/lib/util/joinUrl.ts +60 -60
  407. package/src/lib/util/logInit.ts +9 -9
  408. package/src/lib/util/objectEntries.ts +5 -5
  409. package/src/lib/util/os.ts +18 -18
  410. package/src/lib/util/pastellize.ts +25 -25
  411. package/src/lib/util/problemJson.ts +63 -63
  412. package/src/lib/util/readFrontmatter.ts +14 -14
  413. package/src/lib/util/renderIf.ts +4 -4
  414. package/src/lib/util/scrollIntoViewIfNeeded.ts +18 -18
  415. package/src/lib/util/slugify.ts +21 -21
  416. package/src/lib/util/syncZustandState.ts +22 -22
  417. package/src/lib/util/traverse.ts +70 -70
  418. package/src/lib/util/types.ts +7 -7
  419. package/src/lib/util/url.ts +18 -18
  420. package/src/lib/util/useCopyToClipboard.ts +17 -17
  421. package/src/lib/util/useExposedProps.tsx +27 -27
  422. package/src/lib/util/useIsomorphicLayoutEffect.ts +6 -6
  423. package/src/lib/util/useLatest.ts +18 -18
  424. package/src/lib/util/useOnScreen.ts +34 -34
  425. package/src/lib/util/useScrollToAnchor.ts +70 -70
  426. package/src/lib/util/useScrollToTop.ts +18 -18
  427. package/src/types.d.ts +57 -53
  428. package/src/vite/api/SchemaManager.ts +371 -371
  429. package/src/vite/api/schema-codegen.ts +163 -163
  430. package/src/vite/config.ts +5 -1
  431. package/src/vite/css/collect.ts +42 -42
  432. package/src/vite/css/plugin.ts +105 -105
  433. package/src/vite/debug.ts +18 -18
  434. package/src/vite/dev-portal-env.ts +93 -0
  435. package/src/vite/html.ts +54 -54
  436. package/src/vite/index.ts +2 -2
  437. package/src/vite/mdx/rehype-extract-toc-with-jsx-export.ts +19 -19
  438. package/src/vite/mdx/rehype-extract-toc-with-jsx.ts +70 -70
  439. package/src/vite/mdx/remark-code-tabs.ts +47 -47
  440. package/src/vite/mdx/remark-inject-filepath.ts +13 -13
  441. package/src/vite/mdx/remark-last-modified.ts +103 -103
  442. package/src/vite/mdx/remark-link-rewrite.ts +23 -23
  443. package/src/vite/mdx/remark-normalize-image-url.ts +15 -15
  444. package/src/vite/mdx/remark-static-generation.ts +149 -149
  445. package/src/vite/mdx/utils.ts +32 -32
  446. package/src/vite/output.ts +261 -261
  447. package/src/vite/package-root.ts +12 -12
  448. package/src/vite/pagefind-dev-index.ts +100 -100
  449. package/src/vite/plugin-api-keys.ts +6 -1
  450. package/src/vite/plugin-api.ts +4 -1
  451. package/src/vite/plugin-auth.ts +5 -1
  452. package/src/vite/plugin-component.ts +1 -1
  453. package/src/vite/plugin-config-reload.ts +49 -49
  454. package/src/vite/plugin-doc-metadata.ts +45 -45
  455. package/src/vite/plugin-docs.ts +4 -1
  456. package/src/vite/plugin-metadata.ts +30 -30
  457. package/src/vite/plugin-modules.ts +144 -0
  458. package/src/vite/plugin-shiki-register.ts +97 -97
  459. package/src/vite/plugin-theme.ts +399 -399
  460. package/src/vite/plugin.ts +2 -0
  461. package/src/vite/prerender/utils.ts +76 -76
  462. package/src/vite/prerender/worker.ts +118 -118
  463. package/src/vite/reporter.ts +34 -34
  464. package/src/vite/shadcn-registry.ts +48 -48
  465. package/src/vite/sitemap.ts +78 -78
  466. package/src/vite/ssr-templates/cloudflare.ts +19 -19
  467. package/src/vite/ssr-templates/node.ts +25 -25
  468. package/src/vite/ssr-templates/vercel.ts +22 -22
  469. package/src/vite/zuplo.ts +30 -30
  470. package/src/vite-env.d.ts +6 -6
  471. package/src/zuplo/enrich-with-zuplo-mcp.ts +168 -168
  472. package/src/zuplo/enrich-with-zuplo.ts +256 -256
  473. package/src/zuplo/policy-types.ts +46 -46
  474. package/src/zuplo/with-zuplo-processors.ts +36 -36
  475. package/src/zuplo/with-zuplo.ts +14 -14
  476. package/LICENSE.md +0 -18
  477. package/dist/declarations/lib/components/navigation/ZudokuLogo.d.ts +0 -6
@@ -1,26 +1,26 @@
1
- export const getClerkFrontendApi = (publishableKey: string) => {
2
- // Split by underscore and get the base64 encoded part (3rd segment)
3
- const parts = publishableKey.split("_");
4
- if (parts.length !== 3 || !parts[2]) {
5
- throw new Error("Invalid Clerk publishable key");
6
- }
7
-
8
- let decoded: string;
9
- try {
10
- decoded = atob(parts[2]);
11
- } catch {
12
- throw new Error("Failed to decode publishable key");
13
- }
14
-
15
- if (!decoded.endsWith("$")) {
16
- throw new Error("Invalid Clerk publishable key");
17
- }
18
-
19
- const frontendApi = decoded.slice(0, -1);
20
-
21
- if (frontendApi.includes("$") || !frontendApi.includes(".")) {
22
- throw new Error("Invalid Clerk publishable key");
23
- }
24
-
25
- return frontendApi;
26
- };
1
+ export const getClerkFrontendApi = (publishableKey: string) => {
2
+ // Split by underscore and get the base64 encoded part (3rd segment)
3
+ const parts = publishableKey.split("_");
4
+ if (parts.length !== 3 || !parts[2]) {
5
+ throw new Error("Invalid Clerk publishable key");
6
+ }
7
+
8
+ let decoded: string;
9
+ try {
10
+ decoded = atob(parts[2]);
11
+ } catch {
12
+ throw new Error("Failed to decode publishable key");
13
+ }
14
+
15
+ if (!decoded.endsWith("$")) {
16
+ throw new Error("Invalid Clerk publishable key");
17
+ }
18
+
19
+ const frontendApi = decoded.slice(0, -1);
20
+
21
+ if (frontendApi.includes("$") || !frontendApi.includes(".")) {
22
+ throw new Error("Invalid Clerk publishable key");
23
+ }
24
+
25
+ return frontendApi;
26
+ };
@@ -1,91 +1,179 @@
1
- import { create } from "zustand";
2
- import { createJSONStorage, persist } from "zustand/middleware";
3
- import { syncZustandState } from "../util/syncZustandState.js";
4
-
5
- /**
6
- * Registry interface for provider-specific data types.
7
- * Providers augment this via declaration merging:
8
- *
9
- * ```ts
10
- * declare module "../state.js" {
11
- * interface ProviderDataRegistry {
12
- * myProvider: MyProviderData;
13
- * }
14
- * }
15
- * ```
16
- */
17
- // biome-ignore lint/suspicious/noEmptyInterface: Intended to be augmented via declaration merging by auth providers
18
- export interface ProviderDataRegistry {}
19
-
20
- export type ProviderData = [keyof ProviderDataRegistry] extends [never]
21
- ? unknown
22
- : ProviderDataRegistry[keyof ProviderDataRegistry];
23
-
24
- export interface AuthState {
25
- isAuthenticated: boolean;
26
- isPending: boolean;
27
- profile: UserProfile | null;
28
- providerData: ProviderData | null;
29
- setAuthenticationPending: () => void;
30
- setLoggedOut: () => void;
31
- setLoggedIn: (args: {
32
- profile: UserProfile;
33
- providerData: ProviderData;
34
- }) => void;
35
- }
36
-
37
- export const authState = create<AuthState>()(
38
- persist(
39
- (set) => ({
40
- isAuthenticated: false,
41
- isPending: true,
42
- profile: null,
43
- providerData: null,
44
- setAuthenticationPending: () =>
45
- set(() => ({
46
- isAuthenticated: false,
47
- isPending: false,
48
- profile: null,
49
- providerData: null,
50
- })),
51
- setLoggedOut: () =>
52
- set(() => ({
53
- isAuthenticated: false,
54
- isPending: false,
55
- profile: null,
56
- providerData: null,
57
- })),
58
- setLoggedIn: ({ profile, providerData }) =>
59
- set(() => ({
60
- isAuthenticated: true,
61
- isPending: false,
62
- profile,
63
- providerData,
64
- })),
65
- }),
66
- {
67
- merge: (persistedState, currentState) => {
68
- return {
69
- ...currentState,
70
- isPending: false,
71
- ...(typeof persistedState === "object" ? persistedState : {}),
72
- };
73
- },
74
- name: "auth-state",
75
- storage: createJSONStorage(() => localStorage),
76
- },
77
- ),
78
- );
79
-
80
- syncZustandState(authState);
81
-
82
- export const useAuthState = authState;
83
-
84
- export interface UserProfile {
85
- sub: string;
86
- email: string | undefined;
87
- emailVerified: boolean;
88
- name: string | undefined;
89
- pictureUrl: string | undefined;
90
- [key: string]: string | boolean | undefined;
91
- }
1
+ import { create } from "zustand";
2
+ import { createJSONStorage, persist } from "zustand/middleware";
3
+ import { syncZustandState } from "../util/syncZustandState.js";
4
+
5
+ /**
6
+ * Registry interface for provider-specific data types.
7
+ * Providers augment this via declaration merging:
8
+ *
9
+ * ```ts
10
+ * declare module "../state.js" {
11
+ * interface ProviderDataRegistry {
12
+ * myProvider: MyProviderData;
13
+ * }
14
+ * }
15
+ * ```
16
+ */
17
+ // biome-ignore lint/suspicious/noEmptyInterface: Intended to be augmented via declaration merging by auth providers
18
+ export interface ProviderDataRegistry {}
19
+
20
+ export type ProviderData = [keyof ProviderDataRegistry] extends [never]
21
+ ? unknown
22
+ : ProviderDataRegistry[keyof ProviderDataRegistry];
23
+
24
+ export type AuthMode = "live" | "preview";
25
+
26
+ export interface AuthState {
27
+ isAuthenticated: boolean;
28
+ isPending: boolean;
29
+ profile: UserProfile | null;
30
+ providerData: ProviderData | null;
31
+ /** False when dev-portal backend is unavailable (local preview). Defaults true. */
32
+ isBackendAvailable: boolean;
33
+ /** Live when backend auth is reachable; preview otherwise. */
34
+ authMode: AuthMode;
35
+ setAuthenticationPending: () => void;
36
+ setLoggedOut: () => void;
37
+ setLoggedIn: (args: {
38
+ profile: UserProfile;
39
+ providerData: ProviderData;
40
+ }) => void;
41
+ }
42
+
43
+ type AuthStateStore = ReturnType<typeof createAuthStateStore>;
44
+
45
+ /**
46
+ * Vite SSR/dev can load authentication modules more than once (app + plugins),
47
+ * which would otherwise create duplicate Zustand stores. The header would read
48
+ * one store while dev-portal auth writes another.
49
+ */
50
+ declare global {
51
+ var __APITOGO_AUTH_STATE: AuthStateStore | undefined;
52
+ }
53
+
54
+ function createAuthStateStore(): AuthStateStore {
55
+ return create<AuthState>()(
56
+ persist(
57
+ (set) => ({
58
+ isAuthenticated: false,
59
+ isPending: true,
60
+ profile: null,
61
+ providerData: null,
62
+ isBackendAvailable: true,
63
+ authMode: "live",
64
+ setAuthenticationPending: () =>
65
+ set(() => ({
66
+ isAuthenticated: false,
67
+ isPending: false,
68
+ profile: null,
69
+ providerData: null,
70
+ isBackendAvailable: true,
71
+ authMode: "live",
72
+ })),
73
+ setLoggedOut: () =>
74
+ set(() => ({
75
+ isAuthenticated: false,
76
+ isPending: false,
77
+ profile: null,
78
+ providerData: null,
79
+ isBackendAvailable: true,
80
+ authMode: "live",
81
+ })),
82
+ setLoggedIn: ({ profile, providerData }) =>
83
+ set(() => ({
84
+ isAuthenticated: true,
85
+ isPending: false,
86
+ profile,
87
+ providerData,
88
+ })),
89
+ }),
90
+ {
91
+ version: 1,
92
+ migrate: (persistedState, version) => {
93
+ const persisted =
94
+ typeof persistedState === "object" && persistedState !== null
95
+ ? (persistedState as Partial<AuthState>)
96
+ : {};
97
+
98
+ // v0 stored full auth identity in localStorage; keep only backend metadata.
99
+ if (version === 0) {
100
+ return {
101
+ isBackendAvailable: persisted.isBackendAvailable,
102
+ authMode: persisted.authMode,
103
+ };
104
+ }
105
+
106
+ return persisted;
107
+ },
108
+ merge: (persistedState, currentState) => {
109
+ const persisted =
110
+ typeof persistedState === "object" && persistedState !== null
111
+ ? (persistedState as Partial<AuthState>)
112
+ : {};
113
+
114
+ // Cookie/session auth is refreshed from the backend on load. Do not
115
+ // restore identity fields from localStorage or OIDC return looks logged out.
116
+ return {
117
+ ...currentState,
118
+ isPending: false,
119
+ isAuthenticated: currentState.isAuthenticated,
120
+ profile: currentState.profile,
121
+ providerData: currentState.providerData,
122
+ isBackendAvailable:
123
+ persisted.isBackendAvailable ?? currentState.isBackendAvailable,
124
+ authMode: persisted.authMode ?? currentState.authMode,
125
+ };
126
+ },
127
+ partialize: (state) => ({
128
+ isBackendAvailable: state.isBackendAvailable,
129
+ authMode: state.authMode,
130
+ }),
131
+ name: "auth-state",
132
+ storage: createJSONStorage(() => localStorage),
133
+ },
134
+ ),
135
+ );
136
+ }
137
+
138
+ globalThis.__APITOGO_AUTH_STATE ??= createAuthStateStore();
139
+
140
+ export const authState = globalThis.__APITOGO_AUTH_STATE;
141
+
142
+ syncZustandState(authState);
143
+
144
+ export const useAuthState = authState;
145
+
146
+ /** Wait until persisted auth metadata has rehydrated from localStorage. */
147
+ export const waitForAuthStateHydration = (): Promise<void> => {
148
+ if (typeof window === "undefined") {
149
+ return Promise.resolve();
150
+ }
151
+
152
+ const { persist } = useAuthState;
153
+
154
+ return new Promise((resolve) => {
155
+ const finish = () => {
156
+ // Let hydration merge flush before /auth/me refresh runs.
157
+ queueMicrotask(resolve);
158
+ };
159
+
160
+ if (persist.hasHydrated()) {
161
+ finish();
162
+ return;
163
+ }
164
+
165
+ const unsubscribe = persist.onFinishHydration(() => {
166
+ unsubscribe();
167
+ finish();
168
+ });
169
+ });
170
+ };
171
+
172
+ export interface UserProfile {
173
+ sub: string;
174
+ email: string | undefined;
175
+ emailVerified: boolean;
176
+ name: string | undefined;
177
+ pictureUrl: string | undefined;
178
+ [key: string]: string | boolean | undefined;
179
+ }
@@ -1,10 +1,10 @@
1
- import type { SVGProps } from "react";
2
-
3
- const AppleIcon = (props: SVGProps<SVGSVGElement>) => (
4
- <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" {...props}>
5
- <title>{"Apple"}</title>
6
- <path d="M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04-2.04.027-3.91 1.183-4.961 3.014-2.117 3.675-.546 9.103 1.519 12.09 1.013 1.454 2.208 3.09 3.792 3.039 1.52-.065 2.09-.987 3.935-.987 1.831 0 2.35.987 3.96.948 1.637-.026 2.676-1.48 3.676-2.948 1.156-1.688 1.636-3.325 1.662-3.415-.039-.013-3.182-1.221-3.22-4.857-.026-3.04 2.48-4.494 2.597-4.559-1.429-2.09-3.623-2.324-4.39-2.376-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83-1.207.052-2.662.805-3.532 1.818-.78.896-1.454 2.338-1.273 3.714 1.338.104 2.715-.688 3.559-1.701" />
7
- </svg>
8
- );
9
-
10
- export default AppleIcon;
1
+ import type { SVGProps } from "react";
2
+
3
+ const AppleIcon = (props: SVGProps<SVGSVGElement>) => (
4
+ <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" {...props}>
5
+ <title>{"Apple"}</title>
6
+ <path d="M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04-2.04.027-3.91 1.183-4.961 3.014-2.117 3.675-.546 9.103 1.519 12.09 1.013 1.454 2.208 3.09 3.792 3.039 1.52-.065 2.09-.987 3.935-.987 1.831 0 2.35.987 3.96.948 1.637-.026 2.676-1.48 3.676-2.948 1.156-1.688 1.636-3.325 1.662-3.415-.039-.013-3.182-1.221-3.22-4.857-.026-3.04 2.48-4.494 2.597-4.559-1.429-2.09-3.623-2.324-4.39-2.376-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83-1.207.052-2.662.805-3.532 1.818-.78.896-1.454 2.338-1.273 3.714 1.338.104 2.715-.688 3.559-1.701" />
7
+ </svg>
8
+ );
9
+
10
+ export default AppleIcon;
@@ -1,15 +1,15 @@
1
- import type { SVGProps } from "react";
2
-
3
- const FacebookIcon = (props: SVGProps<SVGSVGElement>) => (
4
- <svg
5
- fill="#0866FF"
6
- viewBox="0 0 24 24"
7
- xmlns="http://www.w3.org/2000/svg"
8
- {...props}
9
- >
10
- <title>{"Facebook"}</title>
11
- <path d="M9.101 23.691v-7.98H6.627v-3.667h2.474v-1.58c0-4.085 1.848-5.978 5.858-5.978.401 0 .955.042 1.468.103a8.68 8.68 0 0 1 1.141.195v3.325a8.623 8.623 0 0 0-.653-.036 26.805 26.805 0 0 0-.733-.009c-.707 0-1.259.096-1.675.309a1.686 1.686 0 0 0-.679.622c-.258.42-.374.995-.374 1.752v1.297h3.919l-.386 2.103-.287 1.564h-3.246v8.245C19.396 23.238 24 18.179 24 12.044c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.628 3.874 10.35 9.101 11.647Z" />
12
- </svg>
13
- );
14
-
15
- export default FacebookIcon;
1
+ import type { SVGProps } from "react";
2
+
3
+ const FacebookIcon = (props: SVGProps<SVGSVGElement>) => (
4
+ <svg
5
+ fill="#0866FF"
6
+ viewBox="0 0 24 24"
7
+ xmlns="http://www.w3.org/2000/svg"
8
+ {...props}
9
+ >
10
+ <title>{"Facebook"}</title>
11
+ <path d="M9.101 23.691v-7.98H6.627v-3.667h2.474v-1.58c0-4.085 1.848-5.978 5.858-5.978.401 0 .955.042 1.468.103a8.68 8.68 0 0 1 1.141.195v3.325a8.623 8.623 0 0 0-.653-.036 26.805 26.805 0 0 0-.733-.009c-.707 0-1.259.096-1.675.309a1.686 1.686 0 0 0-.679.622c-.258.42-.374.995-.374 1.752v1.297h3.919l-.386 2.103-.287 1.564h-3.246v8.245C19.396 23.238 24 18.179 24 12.044c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.628 3.874 10.35 9.101 11.647Z" />
12
+ </svg>
13
+ );
14
+
15
+ export default FacebookIcon;
@@ -1,16 +1,16 @@
1
- import type { SVGProps } from "react";
2
-
3
- const GithubIcon = (props: SVGProps<SVGSVGElement>) => (
4
- <svg
5
- viewBox="0 0 24 24"
6
- xmlns="http://www.w3.org/2000/svg"
7
- width="1em"
8
- height="1em"
9
- {...props}
10
- >
11
- <title>{"GitHub"}</title>
12
- <path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12" />
13
- </svg>
14
- );
15
-
16
- export default GithubIcon;
1
+ import type { SVGProps } from "react";
2
+
3
+ const GithubIcon = (props: SVGProps<SVGSVGElement>) => (
4
+ <svg
5
+ viewBox="0 0 24 24"
6
+ xmlns="http://www.w3.org/2000/svg"
7
+ width="1em"
8
+ height="1em"
9
+ {...props}
10
+ >
11
+ <title>{"GitHub"}</title>
12
+ <path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12" />
13
+ </svg>
14
+ );
15
+
16
+ export default GithubIcon;
@@ -1,16 +1,16 @@
1
- import type { SVGProps } from "react";
2
-
3
- const GoogleIcon = (props: SVGProps<SVGSVGElement>) => (
4
- <svg
5
- viewBox="0 0 24 24"
6
- xmlns="http://www.w3.org/2000/svg"
7
- width="1em"
8
- height="1em"
9
- {...props}
10
- >
11
- <title>{"Google"}</title>
12
- <path d="M12.48 10.92v3.28h7.84c-.24 1.84-.853 3.187-1.787 4.133-1.147 1.147-2.933 2.4-6.053 2.4-4.827 0-8.6-3.893-8.6-8.72s3.773-8.72 8.6-8.72c2.6 0 4.507 1.027 5.907 2.347l2.307-2.307C18.747 1.44 16.133 0 12.48 0 5.867 0 .307 5.387.307 12s5.56 12 12.173 12c3.573 0 6.267-1.173 8.373-3.36 2.16-2.16 2.84-5.213 2.84-7.667 0-.76-.053-1.467-.173-2.053H12.48z" />
13
- </svg>
14
- );
15
-
16
- export default GoogleIcon;
1
+ import type { SVGProps } from "react";
2
+
3
+ const GoogleIcon = (props: SVGProps<SVGSVGElement>) => (
4
+ <svg
5
+ viewBox="0 0 24 24"
6
+ xmlns="http://www.w3.org/2000/svg"
7
+ width="1em"
8
+ height="1em"
9
+ {...props}
10
+ >
11
+ <title>{"Google"}</title>
12
+ <path d="M12.48 10.92v3.28h7.84c-.24 1.84-.853 3.187-1.787 4.133-1.147 1.147-2.933 2.4-6.053 2.4-4.827 0-8.6-3.893-8.6-8.72s3.773-8.72 8.6-8.72c2.6 0 4.507 1.027 5.907 2.347l2.307-2.307C18.747 1.44 16.133 0 12.48 0 5.867 0 .307 5.387.307 12s5.56 12 12.173 12c3.573 0 6.267-1.173 8.373-3.36 2.16-2.16 2.84-5.213 2.84-7.667 0-.76-.053-1.467-.173-2.053H12.48z" />
13
+ </svg>
14
+ );
15
+
16
+ export default GoogleIcon;
@@ -1,12 +1,12 @@
1
- import type { SVGProps } from "react";
2
-
3
- const MicrosoftIcon = (props: SVGProps<SVGSVGElement>) => (
4
- <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" {...props}>
5
- <path fill="#f25022" d="M1 1h9v9H1z" />
6
- <path fill="#00a4ef" d="M1 11h9v9H1z" />
7
- <path fill="#7fba00" d="M11 1h9v9h-9z" />
8
- <path fill="#ffb900" d="M11 11h9v9h-9z" />
9
- </svg>
10
- );
11
-
12
- export default MicrosoftIcon;
1
+ import type { SVGProps } from "react";
2
+
3
+ const MicrosoftIcon = (props: SVGProps<SVGSVGElement>) => (
4
+ <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" {...props}>
5
+ <path fill="#f25022" d="M1 1h9v9H1z" />
6
+ <path fill="#00a4ef" d="M1 11h9v9H1z" />
7
+ <path fill="#7fba00" d="M11 1h9v9h-9z" />
8
+ <path fill="#ffb900" d="M11 11h9v9h-9z" />
9
+ </svg>
10
+ );
11
+
12
+ export default MicrosoftIcon;
@@ -1,10 +1,10 @@
1
- import type { SVGProps } from "react";
2
-
3
- const XIcon = (props: SVGProps<SVGSVGElement>) => (
4
- <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" {...props}>
5
- <title>{"X"}</title>
6
- <path d="M14.234 10.162 22.977 0h-2.072l-7.591 8.824L7.251 0H.258l9.168 13.343L.258 24H2.33l8.016-9.318L16.749 24h6.993zm-2.837 3.299-.929-1.329L3.076 1.56h3.182l5.965 8.532.929 1.329 7.754 11.09h-3.182z" />
7
- </svg>
8
- );
9
-
10
- export default XIcon;
1
+ import type { SVGProps } from "react";
2
+
3
+ const XIcon = (props: SVGProps<SVGSVGElement>) => (
4
+ <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" {...props}>
5
+ <title>{"X"}</title>
6
+ <path d="M14.234 10.162 22.977 0h-2.072l-7.591 8.824L7.251 0H.258l9.168 13.343L.258 24H2.33l8.016-9.318L16.749 24h6.993zm-2.837 3.299-.929-1.329L3.076 1.56h3.182l5.965 8.532.929 1.329 7.754 11.09h-3.182z" />
7
+ </svg>
8
+ );
9
+
10
+ export default XIcon;
@@ -1,16 +1,16 @@
1
- import { joinUrl } from "../../util/joinUrl.js";
2
-
3
- export const getRelativeRedirectUrl = (redirectTo?: string | null) => {
4
- if (!redirectTo) {
5
- return "/";
6
- }
7
-
8
- if (typeof window === "undefined") {
9
- return redirectTo;
10
- }
11
-
12
- return redirectTo.replace(
13
- joinUrl(window.location.origin, import.meta.env.BASE_URL),
14
- "",
15
- );
16
- };
1
+ import { joinUrl } from "../../util/joinUrl.js";
2
+
3
+ export const getRelativeRedirectUrl = (redirectTo?: string | null) => {
4
+ if (!redirectTo) {
5
+ return "/";
6
+ }
7
+
8
+ if (typeof window === "undefined") {
9
+ return redirectTo;
10
+ }
11
+
12
+ return redirectTo.replace(
13
+ joinUrl(window.location.origin, import.meta.env.BASE_URL),
14
+ "",
15
+ );
16
+ };
@@ -1,24 +1,24 @@
1
- import type { MouseEvent } from "react";
2
- import { NavLink, type NavLinkProps, useHref, useLocation } from "react-router";
3
- import { useScrollToHash } from "../util/useScrollToAnchor.js";
4
-
5
- /**
6
- * Link that scrolls to anchor even if the hash is already set in the URL.
7
- */
8
- export const AnchorLink = (props: NavLinkProps) => {
9
- const location = useLocation();
10
- const scrollToHash = useScrollToHash();
11
- const href = useHref(props.to);
12
- const [pathname, hash] = href.split("#");
13
-
14
- const handleClick = (event: MouseEvent<HTMLAnchorElement>) => {
15
- props.onClick?.(event);
16
- if (hash !== location.hash.slice(1) || pathname !== location.pathname)
17
- return;
18
-
19
- event.preventDefault();
20
- scrollToHash(hash);
21
- };
22
-
23
- return <NavLink {...props} onClick={handleClick} />;
24
- };
1
+ import type { MouseEvent } from "react";
2
+ import { NavLink, type NavLinkProps, useHref, useLocation } from "react-router";
3
+ import { useScrollToHash } from "../util/useScrollToAnchor.js";
4
+
5
+ /**
6
+ * Link that scrolls to anchor even if the hash is already set in the URL.
7
+ */
8
+ export const AnchorLink = (props: NavLinkProps) => {
9
+ const location = useLocation();
10
+ const scrollToHash = useScrollToHash();
11
+ const href = useHref(props.to);
12
+ const [pathname, hash] = href.split("#");
13
+
14
+ const handleClick = (event: MouseEvent<HTMLAnchorElement>) => {
15
+ props.onClick?.(event);
16
+ if (hash !== location.hash.slice(1) || pathname !== location.pathname)
17
+ return;
18
+
19
+ event.preventDefault();
20
+ scrollToHash(hash);
21
+ };
22
+
23
+ return <NavLink {...props} onClick={handleClick} />;
24
+ };