@lukoweb/apitogo 0.1.23 → 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,37 +1,37 @@
1
- import { UnlinkIcon } from "lucide-react";
2
- import { Link, useParams } from "react-router";
3
- import { CategoryHeading } from "./CategoryHeading.js";
4
- import { DeveloperHint } from "./DeveloperHint.js";
5
- import { Heading } from "./Heading.js";
6
- import { Typography } from "./Typography.js";
7
-
8
- export const NotFoundPage = () => {
9
- const params = useParams();
10
-
11
- return (
12
- <Typography
13
- className="h-full pt-(--padding-content-top)"
14
- data-pagefind-ignore="all"
15
- >
16
- <CategoryHeading>404</CategoryHeading>
17
- <Heading level={1} className="flex gap-3.5 items-center">
18
- Page not found
19
- <UnlinkIcon size={24} />
20
- </Heading>
21
- <DeveloperHint>
22
- Start by adding a file at{" "}
23
- <code>
24
- {"{DOCUMENT_ROOT}"}/{params["*"]}.mdx
25
- </code>{" "}
26
- and add some content to make this error go away. By default{" "}
27
- <code>DOCUMENT_ROOT</code> is the `pages` directory.
28
- </DeveloperHint>
29
- <p>
30
- It seems that the page you are looking for does not exist or may have
31
- been moved. Please check the URL for any typos or use the navigation
32
- menu to find the correct page.
33
- </p>
34
- <Link to="/">Go back home</Link>
35
- </Typography>
36
- );
37
- };
1
+ import { UnlinkIcon } from "lucide-react";
2
+ import { Link, useParams } from "react-router";
3
+ import { CategoryHeading } from "./CategoryHeading.js";
4
+ import { DeveloperHint } from "./DeveloperHint.js";
5
+ import { Heading } from "./Heading.js";
6
+ import { Typography } from "./Typography.js";
7
+
8
+ export const NotFoundPage = () => {
9
+ const params = useParams();
10
+
11
+ return (
12
+ <Typography
13
+ className="h-full pt-(--padding-content-top)"
14
+ data-pagefind-ignore="all"
15
+ >
16
+ <CategoryHeading>404</CategoryHeading>
17
+ <Heading level={1} className="flex gap-3.5 items-center">
18
+ Page not found
19
+ <UnlinkIcon size={24} />
20
+ </Heading>
21
+ <DeveloperHint>
22
+ Start by adding a file at{" "}
23
+ <code>
24
+ {"{DOCUMENT_ROOT}"}/{params["*"]}.mdx
25
+ </code>{" "}
26
+ and add some content to make this error go away. By default{" "}
27
+ <code>DOCUMENT_ROOT</code> is the `pages` directory.
28
+ </DeveloperHint>
29
+ <p>
30
+ It seems that the page you are looking for does not exist or may have
31
+ been moved. Please check the URL for any typos or use the navigation
32
+ menu to find the correct page.
33
+ </p>
34
+ <Link to="/">Go back home</Link>
35
+ </Typography>
36
+ );
37
+ };
@@ -1,28 +1,28 @@
1
- import { useNProgress } from "@tanem/react-nprogress";
2
- import { useEffect, useState } from "react";
3
- import { useNavigation } from "react-router";
4
-
5
- export const PageProgress = () => {
6
- const navigation = useNavigation();
7
- const isNavigating = navigation.state === "loading";
8
- // delay the animation to avoid flickering
9
- const [isAnimating, setIsAnimating] = useState(false);
10
-
11
- useEffect(() => {
12
- const timer = setTimeout(() => setIsAnimating(isNavigating), 200);
13
-
14
- return () => clearTimeout(timer);
15
- }, [isNavigating]);
16
-
17
- const { isFinished, progress } = useNProgress({ isAnimating });
18
-
19
- return (
20
- <div
21
- className="absolute w-0 left-0 right-0 bottom-[-1px] h-[2px] bg-primary transition-all duration-300 ease-in-out"
22
- style={{
23
- opacity: isFinished ? 0 : 1,
24
- width: isFinished ? 0 : `${progress * 100}%`,
25
- }}
26
- />
27
- );
28
- };
1
+ import { useNProgress } from "@tanem/react-nprogress";
2
+ import { useEffect, useState } from "react";
3
+ import { useNavigation } from "react-router";
4
+
5
+ export const PageProgress = () => {
6
+ const navigation = useNavigation();
7
+ const isNavigating = navigation.state === "loading";
8
+ // delay the animation to avoid flickering
9
+ const [isAnimating, setIsAnimating] = useState(false);
10
+
11
+ useEffect(() => {
12
+ const timer = setTimeout(() => setIsAnimating(isNavigating), 200);
13
+
14
+ return () => clearTimeout(timer);
15
+ }, [isNavigating]);
16
+
17
+ const { isFinished, progress } = useNProgress({ isAnimating });
18
+
19
+ return (
20
+ <div
21
+ className="absolute w-0 left-0 right-0 bottom-[-1px] h-[2px] bg-primary transition-all duration-300 ease-in-out"
22
+ style={{
23
+ opacity: isFinished ? 0 : 1,
24
+ width: isFinished ? 0 : `${progress * 100}%`,
25
+ }}
26
+ />
27
+ );
28
+ };
@@ -1,14 +1,14 @@
1
- import type { PropsWithChildren } from "react";
2
-
3
- /**
4
- * Adds metadata to be captured by Pagefind for search results.
5
- * Content is visually hidden but indexed by the search engine.
6
- */
7
- export const PagefindSearchMeta = ({
8
- name,
9
- children,
10
- }: PropsWithChildren<{ name?: string }>) => (
11
- <span data-pagefind-meta={name} className="sr-only">
12
- {children}
13
- </span>
14
- );
1
+ import type { PropsWithChildren } from "react";
2
+
3
+ /**
4
+ * Adds metadata to be captured by Pagefind for search results.
5
+ * Content is visually hidden but indexed by the search engine.
6
+ */
7
+ export const PagefindSearchMeta = ({
8
+ name,
9
+ children,
10
+ }: PropsWithChildren<{ name?: string }>) => (
11
+ <span data-pagefind-meta={name} className="sr-only">
12
+ {children}
13
+ </span>
14
+ );
@@ -1,44 +1,44 @@
1
- import { ArrowLeftIcon, ArrowRightIcon } from "lucide-react";
2
- import { Link } from "react-router";
3
- import { cn } from "../util/cn.js";
4
- import { Button } from "./index.js";
5
-
6
- export const Pagination = ({
7
- prev,
8
- next,
9
- className,
10
- }: {
11
- prev: { to: string; label: string } | undefined;
12
- next: { to: string; label: string } | undefined;
13
- className?: string;
14
- }) => {
15
- const linkClass =
16
- "group min-w-0 transition-all p-5 space-x-1 rtl:space-x-reverse hover:text-foreground";
17
- return (
18
- <div
19
- className={cn(
20
- "flex flex-wrap gap-2 -mx-4 text-muted-foreground font-semibold",
21
- prev ? "justify-between" : "justify-end",
22
- className,
23
- )}
24
- data-pagefind-ignore="all"
25
- >
26
- {prev && (
27
- <Button variant="ghost" className="min-w-0 max-w-full" asChild>
28
- <Link to={prev.to} relative="path" className={linkClass}>
29
- <ArrowLeftIcon size={14} strokeWidth={2.5} />
30
- <span className="text-lg truncate">{prev.label}</span>
31
- </Link>
32
- </Button>
33
- )}
34
- {next && (
35
- <Button variant="ghost" className="ms-auto min-w-0 max-w-full" asChild>
36
- <Link to={next.to} relative="path" className={linkClass}>
37
- <span className="text-lg truncate">{next.label}</span>
38
- <ArrowRightIcon size={14} strokeWidth={2.5} />
39
- </Link>
40
- </Button>
41
- )}
42
- </div>
43
- );
44
- };
1
+ import { ArrowLeftIcon, ArrowRightIcon } from "lucide-react";
2
+ import { Link } from "react-router";
3
+ import { cn } from "../util/cn.js";
4
+ import { Button } from "./index.js";
5
+
6
+ export const Pagination = ({
7
+ prev,
8
+ next,
9
+ className,
10
+ }: {
11
+ prev: { to: string; label: string } | undefined;
12
+ next: { to: string; label: string } | undefined;
13
+ className?: string;
14
+ }) => {
15
+ const linkClass =
16
+ "group min-w-0 transition-all p-5 space-x-1 rtl:space-x-reverse hover:text-foreground";
17
+ return (
18
+ <div
19
+ className={cn(
20
+ "flex flex-wrap gap-2 -mx-4 text-muted-foreground font-semibold",
21
+ prev ? "justify-between" : "justify-end",
22
+ className,
23
+ )}
24
+ data-pagefind-ignore="all"
25
+ >
26
+ {prev && (
27
+ <Button variant="ghost" className="min-w-0 max-w-full" asChild>
28
+ <Link to={prev.to} relative="path" className={linkClass}>
29
+ <ArrowLeftIcon size={14} strokeWidth={2.5} />
30
+ <span className="text-lg truncate">{prev.label}</span>
31
+ </Link>
32
+ </Button>
33
+ )}
34
+ {next && (
35
+ <Button variant="ghost" className="ms-auto min-w-0 max-w-full" asChild>
36
+ <Link to={next.to} relative="path" className={linkClass}>
37
+ <span className="text-lg truncate">{next.label}</span>
38
+ <ArrowRightIcon size={14} strokeWidth={2.5} />
39
+ </Link>
40
+ </Button>
41
+ )}
42
+ </div>
43
+ );
44
+ };
@@ -1,61 +1,61 @@
1
- import { Fragment, type ReactNode } from "react";
2
-
3
- type PathParamProps = {
4
- name: string;
5
- index: number;
6
- originalValue?: string;
7
- };
8
-
9
- export const PathRenderer = ({
10
- path,
11
- renderParam,
12
- }: {
13
- path: string;
14
- renderParam: (props: PathParamProps) => ReactNode;
15
- }) => {
16
- let paramIndex = 0;
17
- return path.split("/").map((part, i, arr) => {
18
- const matches = Array.from(part.matchAll(/{([^}]+)}/g));
19
- const elements: ReactNode[] = [];
20
- let lastIndex = 0;
21
-
22
- matches.forEach((match) => {
23
- const [originalValue, name] = match;
24
- if (!name) return;
25
- const startIndex = match.index;
26
-
27
- if (startIndex > lastIndex) {
28
- elements.push(
29
- <Fragment key={`text-${lastIndex}-${startIndex}`}>
30
- {part.slice(lastIndex, startIndex)}
31
- </Fragment>,
32
- );
33
- }
34
-
35
- elements.push(
36
- <Fragment key={`param-${name}`}>
37
- {renderParam({ name, originalValue, index: paramIndex++ })}
38
- </Fragment>,
39
- );
40
-
41
- lastIndex = startIndex + originalValue.length;
42
- });
43
-
44
- if (lastIndex < part.length) {
45
- elements.push(
46
- <Fragment key={`text-${lastIndex}-${part.length}`}>
47
- {part.slice(lastIndex)}
48
- </Fragment>,
49
- );
50
- }
51
-
52
- return (
53
- // biome-ignore lint/suspicious/noArrayIndexKey: index should be stable
54
- <Fragment key={`${part}-${i}`}>
55
- {elements}
56
- {i < arr.length - 1 && "/"}
57
- <wbr />
58
- </Fragment>
59
- );
60
- });
61
- };
1
+ import { Fragment, type ReactNode } from "react";
2
+
3
+ type PathParamProps = {
4
+ name: string;
5
+ index: number;
6
+ originalValue?: string;
7
+ };
8
+
9
+ export const PathRenderer = ({
10
+ path,
11
+ renderParam,
12
+ }: {
13
+ path: string;
14
+ renderParam: (props: PathParamProps) => ReactNode;
15
+ }) => {
16
+ let paramIndex = 0;
17
+ return path.split("/").map((part, i, arr) => {
18
+ const matches = Array.from(part.matchAll(/{([^}]+)}/g));
19
+ const elements: ReactNode[] = [];
20
+ let lastIndex = 0;
21
+
22
+ matches.forEach((match) => {
23
+ const [originalValue, name] = match;
24
+ if (!name) return;
25
+ const startIndex = match.index;
26
+
27
+ if (startIndex > lastIndex) {
28
+ elements.push(
29
+ <Fragment key={`text-${lastIndex}-${startIndex}`}>
30
+ {part.slice(lastIndex, startIndex)}
31
+ </Fragment>,
32
+ );
33
+ }
34
+
35
+ elements.push(
36
+ <Fragment key={`param-${name}`}>
37
+ {renderParam({ name, originalValue, index: paramIndex++ })}
38
+ </Fragment>,
39
+ );
40
+
41
+ lastIndex = startIndex + originalValue.length;
42
+ });
43
+
44
+ if (lastIndex < part.length) {
45
+ elements.push(
46
+ <Fragment key={`text-${lastIndex}-${part.length}`}>
47
+ {part.slice(lastIndex)}
48
+ </Fragment>,
49
+ );
50
+ }
51
+
52
+ return (
53
+ // biome-ignore lint/suspicious/noArrayIndexKey: index should be stable
54
+ <Fragment key={`${part}-${i}`}>
55
+ {elements}
56
+ {i < arr.length - 1 && "/"}
57
+ <wbr />
58
+ </Fragment>
59
+ );
60
+ });
61
+ };
@@ -1,17 +1,17 @@
1
- import { Helmet } from "@zudoku/react-helmet-async";
2
- import type { Location } from "react-router";
3
- import { hasHead, type ApitogoPlugin } from "../core/plugins.js";
4
-
5
- export const PluginHeads = ({
6
- plugins,
7
- location,
8
- }: {
9
- plugins: ApitogoPlugin[];
10
- location: Location;
11
- }) =>
12
- plugins
13
- .flatMap((plugin) =>
14
- hasHead(plugin) ? (plugin.getHead?.({ location }) ?? []) : [],
15
- )
16
- // biome-ignore lint/suspicious/noArrayIndexKey: No stable key available
17
- .map((entry, i) => <Helmet key={i}>{entry}</Helmet>);
1
+ import { Helmet } from "@zudoku/react-helmet-async";
2
+ import type { Location } from "react-router";
3
+ import { hasHead, type ApitogoPlugin } from "../core/plugins.js";
4
+
5
+ export const PluginHeads = ({
6
+ plugins,
7
+ location,
8
+ }: {
9
+ plugins: ApitogoPlugin[];
10
+ location: Location;
11
+ }) =>
12
+ plugins
13
+ .flatMap((plugin) =>
14
+ hasHead(plugin) ? (plugin.getHead?.({ location }) ?? []) : [],
15
+ )
16
+ // biome-ignore lint/suspicious/noArrayIndexKey: No stable key available
17
+ .map((entry, i) => <Helmet key={i}>{entry}</Helmet>);
@@ -1,70 +1,70 @@
1
- import { SearchIcon } from "lucide-react";
2
- import { Suspense, useCallback, useEffect, useState } from "react";
3
- import { isSearchPlugin } from "../core/plugins.js";
4
- import { focusRing } from "../ui/util.js";
5
- import { cn } from "../util/cn.js";
6
- import { getOS } from "../util/os.js";
7
- import { ClientOnly } from "./ClientOnly.js";
8
- import { useZudoku } from "./context/ZudokuContext.js";
9
-
10
- export const Search = ({ className }: { className?: string }) => {
11
- const ctx = useZudoku();
12
- const [isOpen, setIsOpen] = useState(false);
13
- const onOpen = useCallback(() => setIsOpen(true), []);
14
- const onClose = useCallback(() => setIsOpen(false), []);
15
-
16
- useEffect(() => {
17
- if (isOpen) {
18
- return;
19
- }
20
-
21
- function onKeyDown(event: KeyboardEvent) {
22
- if (event.key === "k" && (event.metaKey || event.ctrlKey)) {
23
- event.preventDefault();
24
- setIsOpen(true);
25
- }
26
- }
27
-
28
- window.addEventListener("keydown", onKeyDown);
29
-
30
- return () => {
31
- window.removeEventListener("keydown", onKeyDown);
32
- };
33
- }, [isOpen]);
34
-
35
- const searchPlugin = ctx.options.plugins?.find(isSearchPlugin);
36
-
37
- if (!searchPlugin) return null;
38
-
39
- return (
40
- <div className={className}>
41
- <button
42
- type="button"
43
- onClick={onOpen}
44
- className={cn(
45
- "relative w-full md:w-56 flex items-center border bg-clip-padding h-8 rounded-lg px-3 pr-14 text-sm transition-all",
46
- "border-input text-muted-foreground bg-background hover:bg-muted/50 hover:text-foreground shadow-xs",
47
- focusRing,
48
- )}
49
- >
50
- <div className="flex items-center gap-2">
51
- <SearchIcon size={14} />
52
- Search
53
- </div>
54
- <ClientOnly>
55
- <KbdShortcut />
56
- </ClientOnly>
57
- </button>
58
- <Suspense>{searchPlugin.renderSearch({ isOpen, onClose })}</Suspense>
59
- </div>
60
- );
61
- };
62
-
63
- const KbdShortcut = () => {
64
- const os = getOS();
65
- return (
66
- <kbd className="hidden md:flex absolute inset-e-1.5 h-5 select-none items-center gap-0.5 rounded-sm border bg-muted px-1.5 font-mono text-xs font-medium">
67
- {os === "apple" ? <span className="text-base">⌘</span> : "CTRL+"}K
68
- </kbd>
69
- );
70
- };
1
+ import { SearchIcon } from "lucide-react";
2
+ import { Suspense, useCallback, useEffect, useState } from "react";
3
+ import { isSearchPlugin } from "../core/plugins.js";
4
+ import { focusRing } from "../ui/util.js";
5
+ import { cn } from "../util/cn.js";
6
+ import { getOS } from "../util/os.js";
7
+ import { ClientOnly } from "./ClientOnly.js";
8
+ import { useZudoku } from "./context/ZudokuContext.js";
9
+
10
+ export const Search = ({ className }: { className?: string }) => {
11
+ const ctx = useZudoku();
12
+ const [isOpen, setIsOpen] = useState(false);
13
+ const onOpen = useCallback(() => setIsOpen(true), []);
14
+ const onClose = useCallback(() => setIsOpen(false), []);
15
+
16
+ useEffect(() => {
17
+ if (isOpen) {
18
+ return;
19
+ }
20
+
21
+ function onKeyDown(event: KeyboardEvent) {
22
+ if (event.key === "k" && (event.metaKey || event.ctrlKey)) {
23
+ event.preventDefault();
24
+ setIsOpen(true);
25
+ }
26
+ }
27
+
28
+ window.addEventListener("keydown", onKeyDown);
29
+
30
+ return () => {
31
+ window.removeEventListener("keydown", onKeyDown);
32
+ };
33
+ }, [isOpen]);
34
+
35
+ const searchPlugin = ctx.options.plugins?.find(isSearchPlugin);
36
+
37
+ if (!searchPlugin) return null;
38
+
39
+ return (
40
+ <div className={className}>
41
+ <button
42
+ type="button"
43
+ onClick={onOpen}
44
+ className={cn(
45
+ "relative w-full md:w-56 flex items-center border bg-clip-padding h-8 rounded-lg px-3 pr-14 text-sm transition-all",
46
+ "border-input text-muted-foreground bg-background hover:bg-muted/50 hover:text-foreground shadow-xs",
47
+ focusRing,
48
+ )}
49
+ >
50
+ <div className="flex items-center gap-2">
51
+ <SearchIcon size={14} />
52
+ Search
53
+ </div>
54
+ <ClientOnly>
55
+ <KbdShortcut />
56
+ </ClientOnly>
57
+ </button>
58
+ <Suspense>{searchPlugin.renderSearch({ isOpen, onClose })}</Suspense>
59
+ </div>
60
+ );
61
+ };
62
+
63
+ const KbdShortcut = () => {
64
+ const os = getOS();
65
+ return (
66
+ <kbd className="hidden md:flex absolute inset-e-1.5 h-5 select-none items-center gap-0.5 rounded-sm border bg-muted px-1.5 font-mono text-xs font-medium">
67
+ {os === "apple" ? <span className="text-base">⌘</span> : "CTRL+"}K
68
+ </kbd>
69
+ );
70
+ };