zudoku 0.64.1 → 0.65.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (402) hide show
  1. package/dist/app/main.d.ts +91 -1
  2. package/dist/app/main.js +5 -1
  3. package/dist/app/main.js.map +1 -1
  4. package/dist/config/config.d.ts +15 -46
  5. package/dist/config/validators/InputNavigationSchema.d.ts +61 -61
  6. package/dist/config/validators/NavigationSchema.js +2 -4
  7. package/dist/config/validators/NavigationSchema.js.map +1 -1
  8. package/dist/config/validators/ProtectedRoutesSchema.d.ts +1 -1
  9. package/dist/config/validators/validate.d.ts +158 -2
  10. package/dist/config/validators/validate.js +37 -0
  11. package/dist/config/validators/validate.js.map +1 -1
  12. package/dist/config/validators/validate.test.js +43 -0
  13. package/dist/config/validators/validate.test.js.map +1 -1
  14. package/dist/flat-config.d.ts +22 -0
  15. package/dist/lib/auth/issuer.js +3 -0
  16. package/dist/lib/auth/issuer.js.map +1 -1
  17. package/dist/lib/authentication/authentication.d.ts +1 -1
  18. package/dist/lib/authentication/providers/auth0.js +6 -1
  19. package/dist/lib/authentication/providers/auth0.js.map +1 -1
  20. package/dist/lib/authentication/providers/firebase.d.ts +4 -0
  21. package/dist/lib/authentication/providers/firebase.js +215 -0
  22. package/dist/lib/authentication/providers/firebase.js.map +1 -0
  23. package/dist/lib/authentication/providers/supabase.js +1 -6
  24. package/dist/lib/authentication/providers/supabase.js.map +1 -1
  25. package/dist/lib/authentication/ui/ZudokuAuthUi.d.ts +24 -0
  26. package/dist/lib/authentication/ui/ZudokuAuthUi.js +124 -0
  27. package/dist/lib/authentication/ui/ZudokuAuthUi.js.map +1 -0
  28. package/dist/lib/authentication/ui/icons/Apple.d.ts +3 -0
  29. package/dist/lib/authentication/ui/icons/Apple.js +4 -0
  30. package/dist/lib/authentication/ui/icons/Apple.js.map +1 -0
  31. package/dist/lib/authentication/ui/icons/Facebook.d.ts +3 -0
  32. package/dist/lib/authentication/ui/icons/Facebook.js +4 -0
  33. package/dist/lib/authentication/ui/icons/Facebook.js.map +1 -0
  34. package/dist/lib/authentication/ui/icons/Github.d.ts +3 -0
  35. package/dist/lib/authentication/ui/icons/Github.js +4 -0
  36. package/dist/lib/authentication/ui/icons/Github.js.map +1 -0
  37. package/dist/lib/authentication/ui/icons/Google.d.ts +3 -0
  38. package/dist/lib/authentication/ui/icons/Google.js +4 -0
  39. package/dist/lib/authentication/ui/icons/Google.js.map +1 -0
  40. package/dist/lib/authentication/ui/icons/Microsoft.d.ts +3 -0
  41. package/dist/lib/authentication/ui/icons/Microsoft.js +4 -0
  42. package/dist/lib/authentication/ui/icons/Microsoft.js.map +1 -0
  43. package/dist/lib/authentication/ui/icons/X.d.ts +3 -0
  44. package/dist/lib/authentication/ui/icons/X.js +4 -0
  45. package/dist/lib/authentication/ui/icons/X.js.map +1 -0
  46. package/dist/lib/components/Autocomplete.d.ts +3 -1
  47. package/dist/lib/components/Autocomplete.js +6 -2
  48. package/dist/lib/components/Autocomplete.js.map +1 -1
  49. package/dist/lib/components/Heading.d.ts +1 -1
  50. package/dist/lib/components/Layout.js +3 -2
  51. package/dist/lib/components/Layout.js.map +1 -1
  52. package/dist/lib/components/navigation/NavigationItem.js +2 -2
  53. package/dist/lib/components/navigation/NavigationItem.js.map +1 -1
  54. package/dist/lib/core/RouteGuard.js +6 -6
  55. package/dist/lib/core/RouteGuard.js.map +1 -1
  56. package/dist/lib/errors/ErrorAlert.js +1 -1
  57. package/dist/lib/errors/RouterError.d.ts +3 -1
  58. package/dist/lib/errors/RouterError.js +3 -2
  59. package/dist/lib/errors/RouterError.js.map +1 -1
  60. package/dist/lib/oas/parser/index.js +7 -3
  61. package/dist/lib/oas/parser/index.js.map +1 -1
  62. package/dist/lib/plugins/api-keys/ProtectedRoute.js +4 -1
  63. package/dist/lib/plugins/api-keys/ProtectedRoute.js.map +1 -1
  64. package/dist/lib/plugins/openapi/CollapsibleCode.d.ts +1 -0
  65. package/dist/lib/plugins/openapi/CollapsibleCode.js +2 -1
  66. package/dist/lib/plugins/openapi/CollapsibleCode.js.map +1 -1
  67. package/dist/lib/plugins/openapi/GeneratedExampleSidecarBox.d.ts +5 -0
  68. package/dist/lib/plugins/openapi/GeneratedExampleSidecarBox.js +10 -0
  69. package/dist/lib/plugins/openapi/GeneratedExampleSidecarBox.js.map +1 -0
  70. package/dist/lib/plugins/openapi/OperationList.js +5 -1
  71. package/dist/lib/plugins/openapi/OperationList.js.map +1 -1
  72. package/dist/lib/plugins/openapi/OperationListItem.d.ts +2 -1
  73. package/dist/lib/plugins/openapi/OperationListItem.js +3 -2
  74. package/dist/lib/plugins/openapi/OperationListItem.js.map +1 -1
  75. package/dist/lib/plugins/openapi/ParameterList.js +7 -4
  76. package/dist/lib/plugins/openapi/ParameterList.js.map +1 -1
  77. package/dist/lib/plugins/openapi/ParameterListItem.js +17 -6
  78. package/dist/lib/plugins/openapi/ParameterListItem.js.map +1 -1
  79. package/dist/lib/plugins/openapi/RequestBodySidecarBox.d.ts +9 -2
  80. package/dist/lib/plugins/openapi/RequestBodySidecarBox.js +5 -2
  81. package/dist/lib/plugins/openapi/RequestBodySidecarBox.js.map +1 -1
  82. package/dist/lib/plugins/openapi/ResponsesSidecarBox.d.ts +3 -2
  83. package/dist/lib/plugins/openapi/ResponsesSidecarBox.js +25 -4
  84. package/dist/lib/plugins/openapi/ResponsesSidecarBox.js.map +1 -1
  85. package/dist/lib/plugins/openapi/Sidecar.d.ts +2 -2
  86. package/dist/lib/plugins/openapi/Sidecar.js +53 -26
  87. package/dist/lib/plugins/openapi/Sidecar.js.map +1 -1
  88. package/dist/lib/plugins/openapi/SidecarBox.js +4 -4
  89. package/dist/lib/plugins/openapi/SidecarBox.js.map +1 -1
  90. package/dist/lib/plugins/openapi/SidecarExamples.d.ts +9 -2
  91. package/dist/lib/plugins/openapi/SidecarExamples.js +24 -43
  92. package/dist/lib/plugins/openapi/SidecarExamples.js.map +1 -1
  93. package/dist/lib/plugins/openapi/components/ConstValue.js +1 -1
  94. package/dist/lib/plugins/openapi/components/ConstValue.js.map +1 -1
  95. package/dist/lib/plugins/openapi/components/EnumValues.js +1 -1
  96. package/dist/lib/plugins/openapi/components/EnumValues.js.map +1 -1
  97. package/dist/lib/plugins/openapi/components/NonHighlightedCode.d.ts +4 -0
  98. package/dist/lib/plugins/openapi/components/NonHighlightedCode.js +5 -0
  99. package/dist/lib/plugins/openapi/components/NonHighlightedCode.js.map +1 -0
  100. package/dist/lib/plugins/openapi/components/ResponseContent.js +5 -6
  101. package/dist/lib/plugins/openapi/components/ResponseContent.js.map +1 -1
  102. package/dist/lib/plugins/openapi/interfaces.d.ts +13 -0
  103. package/dist/lib/plugins/openapi/playground/BodyPanel.js +67 -15
  104. package/dist/lib/plugins/openapi/playground/BodyPanel.js.map +1 -1
  105. package/dist/lib/plugins/openapi/playground/CollapsibleHeader.js +2 -2
  106. package/dist/lib/plugins/openapi/playground/CollapsibleHeader.js.map +1 -1
  107. package/dist/lib/plugins/openapi/playground/ExamplesDropdown.js +1 -1
  108. package/dist/lib/plugins/openapi/playground/ExamplesDropdown.js.map +1 -1
  109. package/dist/lib/plugins/openapi/playground/Headers.js +23 -83
  110. package/dist/lib/plugins/openapi/playground/Headers.js.map +1 -1
  111. package/dist/lib/plugins/openapi/playground/ParamsGrid.d.ts +10 -2
  112. package/dist/lib/plugins/openapi/playground/ParamsGrid.js +8 -1
  113. package/dist/lib/plugins/openapi/playground/ParamsGrid.js.map +1 -1
  114. package/dist/lib/plugins/openapi/playground/PathParams.js +2 -3
  115. package/dist/lib/plugins/openapi/playground/PathParams.js.map +1 -1
  116. package/dist/lib/plugins/openapi/playground/Playground.d.ts +7 -0
  117. package/dist/lib/plugins/openapi/playground/Playground.js +56 -28
  118. package/dist/lib/plugins/openapi/playground/Playground.js.map +1 -1
  119. package/dist/lib/plugins/openapi/playground/PlaygroundDialog.js +3 -2
  120. package/dist/lib/plugins/openapi/playground/PlaygroundDialog.js.map +1 -1
  121. package/dist/lib/plugins/openapi/playground/QueryParams.js +16 -40
  122. package/dist/lib/plugins/openapi/playground/QueryParams.js.map +1 -1
  123. package/dist/lib/plugins/openapi/playground/request-panel/MultipartField.d.ts +8 -0
  124. package/dist/lib/plugins/openapi/playground/request-panel/MultipartField.js +19 -0
  125. package/dist/lib/plugins/openapi/playground/request-panel/MultipartField.js.map +1 -0
  126. package/dist/lib/plugins/openapi/playground/request-panel/UrlQueryParams.js +1 -1
  127. package/dist/lib/plugins/openapi/playground/request-panel/UrlQueryParams.js.map +1 -1
  128. package/dist/lib/plugins/openapi/playground/request-panel/fieldManager/useKeyValueFieldManager.test.d.ts +1 -0
  129. package/dist/lib/plugins/openapi/playground/request-panel/fieldManager/useKeyValueFieldManager.test.js +540 -0
  130. package/dist/lib/plugins/openapi/playground/request-panel/fieldManager/useKeyValueFieldManager.test.js.map +1 -0
  131. package/dist/lib/plugins/openapi/playground/request-panel/useKeyValueFieldManager.d.ts +40 -0
  132. package/dist/lib/plugins/openapi/playground/request-panel/useKeyValueFieldManager.js +205 -0
  133. package/dist/lib/plugins/openapi/playground/request-panel/useKeyValueFieldManager.js.map +1 -0
  134. package/dist/lib/plugins/openapi/playground/result-panel/ResponseTab.js +2 -2
  135. package/dist/lib/plugins/openapi/playground/result-panel/ResponseTab.js.map +1 -1
  136. package/dist/lib/plugins/openapi/schema/SchemaExampleAndDefault.js +1 -1
  137. package/dist/lib/plugins/openapi/schema/SchemaExampleAndDefault.js.map +1 -1
  138. package/dist/lib/plugins/openapi/schema/SchemaPropertyItem.js +17 -8
  139. package/dist/lib/plugins/openapi/schema/SchemaPropertyItem.js.map +1 -1
  140. package/dist/lib/plugins/openapi/schema/SchemaView.d.ts +1 -1
  141. package/dist/lib/plugins/openapi/schema/SchemaView.js +20 -13
  142. package/dist/lib/plugins/openapi/schema/SchemaView.js.map +1 -1
  143. package/dist/lib/plugins/openapi/schema/UnionView.js +2 -5
  144. package/dist/lib/plugins/openapi/schema/UnionView.js.map +1 -1
  145. package/dist/lib/plugins/openapi/schema/union-helpers.js +0 -1
  146. package/dist/lib/plugins/openapi/schema/union-helpers.js.map +1 -1
  147. package/dist/lib/plugins/openapi/util/generateSchemaExample.js +5 -14
  148. package/dist/lib/plugins/openapi/util/generateSchemaExample.js.map +1 -1
  149. package/dist/lib/ui/Badge.d.ts +3 -3
  150. package/dist/lib/ui/Badge.js +9 -7
  151. package/dist/lib/ui/Badge.js.map +1 -1
  152. package/dist/lib/ui/Button.d.ts +1 -1
  153. package/dist/lib/ui/Button.js +1 -0
  154. package/dist/lib/ui/Button.js.map +1 -1
  155. package/dist/lib/ui/Checkbox.d.ts +2 -2
  156. package/dist/lib/ui/Checkbox.js +4 -4
  157. package/dist/lib/ui/Checkbox.js.map +1 -1
  158. package/dist/lib/ui/CodeBlock.d.ts +0 -1
  159. package/dist/lib/ui/CodeBlock.js +1 -1
  160. package/dist/lib/ui/CodeBlock.js.map +1 -1
  161. package/dist/lib/ui/Collapsible.d.ts +4 -4
  162. package/dist/lib/ui/Collapsible.js +11 -4
  163. package/dist/lib/ui/Collapsible.js.map +1 -1
  164. package/dist/lib/ui/Command.d.ts +3 -3
  165. package/dist/lib/ui/EmbeddedCodeBlock.d.ts +0 -1
  166. package/dist/lib/ui/EmbeddedCodeBlock.js +3 -2
  167. package/dist/lib/ui/EmbeddedCodeBlock.js.map +1 -1
  168. package/dist/lib/ui/Frame.d.ts +8 -0
  169. package/dist/lib/ui/Frame.js +22 -0
  170. package/dist/lib/ui/Frame.js.map +1 -0
  171. package/dist/lib/ui/Item.d.ts +23 -0
  172. package/dist/lib/ui/Item.js +67 -0
  173. package/dist/lib/ui/Item.js.map +1 -0
  174. package/dist/lib/ui/NativeSelect.d.ts +5 -0
  175. package/dist/lib/ui/NativeSelect.js +14 -0
  176. package/dist/lib/ui/NativeSelect.js.map +1 -0
  177. package/dist/lib/ui/Select.d.ts +13 -11
  178. package/dist/lib/ui/Select.js +34 -23
  179. package/dist/lib/ui/Select.js.map +1 -1
  180. package/dist/lib/ui/Separator.d.ts +4 -0
  181. package/dist/lib/ui/Separator.js +8 -0
  182. package/dist/lib/ui/Separator.js.map +1 -0
  183. package/dist/lib/ui/Tooltip.d.ts +7 -7
  184. package/dist/lib/ui/Tooltip.js +16 -10
  185. package/dist/lib/ui/Tooltip.js.map +1 -1
  186. package/dist/lib/util/createVariantComponent.d.ts +5 -2
  187. package/dist/lib/util/createVariantComponent.js +5 -2
  188. package/dist/lib/util/createVariantComponent.js.map +1 -1
  189. package/dist/lib/util/flattenAllOf.d.ts +4 -0
  190. package/dist/lib/util/flattenAllOf.js +65 -0
  191. package/dist/lib/util/flattenAllOf.js.map +1 -0
  192. package/dist/lib/util/flattenAllOf.test.d.ts +1 -0
  193. package/dist/lib/util/flattenAllOf.test.js +532 -0
  194. package/dist/lib/util/flattenAllOf.test.js.map +1 -0
  195. package/dist/lib/util/readFrontmatter.d.ts +6 -0
  196. package/dist/lib/util/readFrontmatter.js +12 -0
  197. package/dist/lib/util/readFrontmatter.js.map +1 -0
  198. package/dist/vite/api/SchemaManager.js +6 -18
  199. package/dist/vite/api/SchemaManager.js.map +1 -1
  200. package/dist/vite/mdx/remark-last-modified.js +57 -3
  201. package/dist/vite/mdx/remark-last-modified.js.map +1 -1
  202. package/dist/vite/plugin-api.js +2 -2
  203. package/dist/vite/plugin-api.js.map +1 -1
  204. package/dist/vite/plugin-frontmatter.js +3 -5
  205. package/dist/vite/plugin-frontmatter.js.map +1 -1
  206. package/dist/vite/plugin-markdown-export.js +3 -4
  207. package/dist/vite/plugin-markdown-export.js.map +1 -1
  208. package/dist/vite/plugin-theme.js +10 -1
  209. package/dist/vite/plugin-theme.js.map +1 -1
  210. package/lib/{Button-DmS4u8Lj.js → Button-B3ucvvQw.js} +7 -6
  211. package/lib/Button-B3ucvvQw.js.map +1 -0
  212. package/lib/{ErrorAlert-DE3Sf66a.js → ErrorAlert-BOVgwTRP.js} +2832 -2857
  213. package/lib/ErrorAlert-BOVgwTRP.js.map +1 -0
  214. package/lib/{MdxPage-DZfeC0QY.js → MdxPage-CBYFyqUs.js} +6 -6
  215. package/lib/{MdxPage-DZfeC0QY.js.map → MdxPage-CBYFyqUs.js.map} +1 -1
  216. package/lib/{OAuthErrorPage-BycMozgn.js → OAuthErrorPage-DlTYnbLO.js} +4 -4
  217. package/lib/{OAuthErrorPage-BycMozgn.js.map → OAuthErrorPage-DlTYnbLO.js.map} +1 -1
  218. package/lib/{OasProvider-1XEOsIiW.js → OasProvider-DIPAQ79S.js} +2 -2
  219. package/lib/{OasProvider-1XEOsIiW.js.map → OasProvider-DIPAQ79S.js.map} +1 -1
  220. package/lib/OperationList-BOTFIfda.js +5688 -0
  221. package/lib/OperationList-BOTFIfda.js.map +1 -0
  222. package/lib/{Pagination-CJszmeSA.js → Pagination-BOZ9Pxcw.js} +2 -2
  223. package/lib/{Pagination-CJszmeSA.js.map → Pagination-BOZ9Pxcw.js.map} +1 -1
  224. package/lib/RouteGuard-Brz95MSt.js +77 -0
  225. package/lib/RouteGuard-Brz95MSt.js.map +1 -0
  226. package/lib/RouterError-DQS_bMwf.js +42 -0
  227. package/lib/RouterError-DQS_bMwf.js.map +1 -0
  228. package/lib/{SchemaList-qOHkDzSz.js → SchemaList-Bu95q_q2.js} +7 -7
  229. package/lib/{SchemaList-qOHkDzSz.js.map → SchemaList-Bu95q_q2.js.map} +1 -1
  230. package/lib/SchemaView-CaxK_HV4.js +586 -0
  231. package/lib/SchemaView-CaxK_HV4.js.map +1 -0
  232. package/lib/Select-DFRCS31-.js +399 -0
  233. package/lib/Select-DFRCS31-.js.map +1 -0
  234. package/lib/{SignUp-6SGx9Yyq.js → SignUp-CfB278ao.js} +2 -2
  235. package/lib/{SignUp-6SGx9Yyq.js.map → SignUp-CfB278ao.js.map} +1 -1
  236. package/lib/{SyntaxHighlight-zvlnSnHB.js → SyntaxHighlight-C19vH0V_.js} +525 -509
  237. package/lib/SyntaxHighlight-C19vH0V_.js.map +1 -0
  238. package/lib/{Toc-Da9yp7lo.js → Toc-DQIqdghO.js} +2 -2
  239. package/lib/{Toc-Da9yp7lo.js.map → Toc-DQIqdghO.js.map} +1 -1
  240. package/lib/{circular-CSSuz-LS.js → circular-B-_VyILZ.js} +6360 -5953
  241. package/lib/circular-B-_VyILZ.js.map +1 -0
  242. package/lib/{createServer-CLbcVLbK.js → createServer-C5lXk4ba.js} +4732 -4273
  243. package/lib/createServer-C5lXk4ba.js.map +1 -0
  244. package/lib/{errors-CuGgh3hf.js → errors-DqoyOKev.js} +2 -2
  245. package/lib/{errors-CuGgh3hf.js.map → errors-DqoyOKev.js.map} +1 -1
  246. package/lib/index-B7yD7ZUk.js +3680 -0
  247. package/lib/index-B7yD7ZUk.js.map +1 -0
  248. package/lib/{index-rYHsvtTo.js → index-BG79m3lF.js} +2 -2
  249. package/lib/{index-rYHsvtTo.js.map → index-BG79m3lF.js.map} +1 -1
  250. package/lib/{index-B1rmok4X.js → index-DHDtI9H5.js} +3 -3
  251. package/lib/{index-B1rmok4X.js.map → index-DHDtI9H5.js.map} +1 -1
  252. package/lib/ui/ActionButton.js +1 -1
  253. package/lib/ui/Badge.js +27 -13
  254. package/lib/ui/Badge.js.map +1 -1
  255. package/lib/ui/Button.js +6 -5
  256. package/lib/ui/Button.js.map +1 -1
  257. package/lib/ui/Checkbox.js +29 -26
  258. package/lib/ui/Checkbox.js.map +1 -1
  259. package/lib/ui/CodeBlock.js +7 -7
  260. package/lib/ui/CodeBlock.js.map +1 -1
  261. package/lib/ui/Collapsible.js +32 -5
  262. package/lib/ui/Collapsible.js.map +1 -1
  263. package/lib/ui/EmbeddedCodeBlock.js +26 -25
  264. package/lib/ui/EmbeddedCodeBlock.js.map +1 -1
  265. package/lib/ui/Frame.js +81 -0
  266. package/lib/ui/Frame.js.map +1 -0
  267. package/lib/ui/Item.js +188 -0
  268. package/lib/ui/Item.js.map +1 -0
  269. package/lib/ui/NativeSelect.js +57 -0
  270. package/lib/ui/NativeSelect.js.map +1 -0
  271. package/lib/ui/Select.js +166 -116
  272. package/lib/ui/Select.js.map +1 -1
  273. package/lib/ui/Separator.js +27 -0
  274. package/lib/ui/Separator.js.map +1 -0
  275. package/lib/ui/SyntaxHighlight.js +1 -1
  276. package/lib/ui/Tabs.js +10 -10
  277. package/lib/ui/Tooltip.js +55 -28
  278. package/lib/ui/Tooltip.js.map +1 -1
  279. package/lib/zudoku.__internal.js +345 -345
  280. package/lib/zudoku.__internal.js.map +1 -1
  281. package/lib/zudoku.auth-auth0.js +7 -7
  282. package/lib/zudoku.auth-auth0.js.map +1 -1
  283. package/lib/zudoku.auth-azureb2c.js +3 -3
  284. package/lib/zudoku.auth-clerk.js +1 -1
  285. package/lib/zudoku.auth-openid.js +3 -3
  286. package/lib/zudoku.auth-supabase.js +30 -33
  287. package/lib/zudoku.auth-supabase.js.map +1 -1
  288. package/lib/zudoku.components.js +2 -2
  289. package/lib/zudoku.plugin-api-catalog.js +3 -3
  290. package/lib/zudoku.plugin-api-keys.js +5 -5
  291. package/lib/zudoku.plugin-api-keys.js.map +1 -1
  292. package/lib/zudoku.plugin-markdown.js +1 -1
  293. package/lib/zudoku.plugin-openapi.js +1 -1
  294. package/lib/zudoku.plugin-search-pagefind.js +2 -2
  295. package/package.json +18 -13
  296. package/src/app/main.css +1 -1
  297. package/src/app/main.tsx +5 -1
  298. package/src/lib/auth/issuer.ts +3 -0
  299. package/src/lib/authentication/authentication.ts +1 -1
  300. package/src/lib/authentication/providers/auth0.tsx +6 -1
  301. package/src/lib/authentication/providers/firebase.tsx +284 -0
  302. package/src/lib/authentication/providers/supabase.tsx +2 -7
  303. package/src/lib/authentication/ui/ZudokuAuthUi.tsx +335 -0
  304. package/src/lib/authentication/ui/icons/Apple.tsx +10 -0
  305. package/src/lib/authentication/ui/icons/Facebook.tsx +15 -0
  306. package/src/lib/authentication/ui/icons/Github.tsx +16 -0
  307. package/src/lib/authentication/ui/icons/Google.tsx +16 -0
  308. package/src/lib/authentication/ui/icons/Microsoft.tsx +12 -0
  309. package/src/lib/authentication/ui/icons/X.tsx +10 -0
  310. package/src/lib/components/Autocomplete.tsx +11 -2
  311. package/src/lib/components/Layout.tsx +3 -2
  312. package/src/lib/components/navigation/NavigationItem.tsx +7 -20
  313. package/src/lib/core/RouteGuard.tsx +8 -8
  314. package/src/lib/errors/ErrorAlert.tsx +1 -1
  315. package/src/lib/errors/RouterError.tsx +7 -2
  316. package/src/lib/oas/parser/index.ts +8 -3
  317. package/src/lib/plugins/api-keys/ProtectedRoute.tsx +11 -7
  318. package/src/lib/plugins/openapi/CollapsibleCode.tsx +5 -3
  319. package/src/lib/plugins/openapi/GeneratedExampleSidecarBox.tsx +52 -0
  320. package/src/lib/plugins/openapi/OperationList.tsx +7 -0
  321. package/src/lib/plugins/openapi/OperationListItem.tsx +10 -7
  322. package/src/lib/plugins/openapi/ParameterList.tsx +37 -23
  323. package/src/lib/plugins/openapi/ParameterListItem.tsx +105 -54
  324. package/src/lib/plugins/openapi/RequestBodySidecarBox.tsx +48 -7
  325. package/src/lib/plugins/openapi/ResponsesSidecarBox.tsx +81 -33
  326. package/src/lib/plugins/openapi/Sidecar.tsx +129 -65
  327. package/src/lib/plugins/openapi/SidecarBox.tsx +26 -4
  328. package/src/lib/plugins/openapi/SidecarExamples.tsx +91 -79
  329. package/src/lib/plugins/openapi/components/ConstValue.tsx +1 -1
  330. package/src/lib/plugins/openapi/components/EnumValues.tsx +2 -2
  331. package/src/lib/plugins/openapi/components/NonHighlightedCode.tsx +22 -0
  332. package/src/lib/plugins/openapi/components/ResponseContent.tsx +63 -53
  333. package/src/lib/plugins/openapi/interfaces.ts +12 -0
  334. package/src/lib/plugins/openapi/playground/BodyPanel.tsx +246 -30
  335. package/src/lib/plugins/openapi/playground/CollapsibleHeader.tsx +10 -6
  336. package/src/lib/plugins/openapi/playground/ExamplesDropdown.tsx +3 -2
  337. package/src/lib/plugins/openapi/playground/Headers.tsx +103 -219
  338. package/src/lib/plugins/openapi/playground/ParamsGrid.tsx +33 -1
  339. package/src/lib/plugins/openapi/playground/PathParams.tsx +26 -34
  340. package/src/lib/plugins/openapi/playground/Playground.tsx +73 -35
  341. package/src/lib/plugins/openapi/playground/PlaygroundDialog.tsx +9 -30
  342. package/src/lib/plugins/openapi/playground/QueryParams.tsx +82 -136
  343. package/src/lib/plugins/openapi/playground/request-panel/MultipartField.tsx +91 -0
  344. package/src/lib/plugins/openapi/playground/request-panel/UrlQueryParams.tsx +1 -1
  345. package/src/lib/plugins/openapi/playground/request-panel/fieldManager/useKeyValueFieldManager.test.tsx +872 -0
  346. package/src/lib/plugins/openapi/playground/request-panel/useKeyValueFieldManager.ts +349 -0
  347. package/src/lib/plugins/openapi/playground/result-panel/ResponseTab.tsx +2 -6
  348. package/src/lib/plugins/openapi/schema/SchemaExampleAndDefault.tsx +1 -1
  349. package/src/lib/plugins/openapi/schema/SchemaPropertyItem.tsx +89 -55
  350. package/src/lib/plugins/openapi/schema/SchemaView.tsx +82 -53
  351. package/src/lib/plugins/openapi/schema/UnionView.tsx +6 -17
  352. package/src/lib/plugins/openapi/schema/union-helpers.ts +0 -1
  353. package/src/lib/plugins/openapi/util/generateSchemaExample.ts +5 -15
  354. package/src/lib/ui/Badge.tsx +21 -12
  355. package/src/lib/ui/Button.tsx +1 -0
  356. package/src/lib/ui/Checkbox.tsx +23 -24
  357. package/src/lib/ui/CodeBlock.tsx +3 -4
  358. package/src/lib/ui/Collapsible.tsx +26 -4
  359. package/src/lib/ui/EmbeddedCodeBlock.tsx +21 -19
  360. package/src/lib/ui/Frame.tsx +81 -0
  361. package/src/lib/ui/Item.tsx +192 -0
  362. package/src/lib/ui/NativeSelect.tsx +47 -0
  363. package/src/lib/ui/Select.tsx +153 -126
  364. package/src/lib/ui/Separator.tsx +25 -0
  365. package/src/lib/ui/Tooltip.tsx +54 -32
  366. package/src/lib/util/createVariantComponent.tsx +31 -5
  367. package/src/lib/util/flattenAllOf.test.ts +637 -0
  368. package/src/lib/util/flattenAllOf.ts +101 -0
  369. package/src/lib/util/readFrontmatter.ts +13 -0
  370. package/dist/lib/plugins/openapi/playground/InlineInput.d.ts +0 -4
  371. package/dist/lib/plugins/openapi/playground/InlineInput.js +0 -3
  372. package/dist/lib/plugins/openapi/playground/InlineInput.js.map +0 -1
  373. package/dist/lib/plugins/openapi/schema/AllOfGroup/AllOfGroupConnector.d.ts +0 -5
  374. package/dist/lib/plugins/openapi/schema/AllOfGroup/AllOfGroupConnector.js +0 -7
  375. package/dist/lib/plugins/openapi/schema/AllOfGroup/AllOfGroupConnector.js.map +0 -1
  376. package/dist/lib/plugins/openapi/schema/AllOfGroup/AllOfGroupItem.d.ts +0 -4
  377. package/dist/lib/plugins/openapi/schema/AllOfGroup/AllOfGroupItem.js +0 -10
  378. package/dist/lib/plugins/openapi/schema/AllOfGroup/AllOfGroupItem.js.map +0 -1
  379. package/dist/lib/plugins/openapi/schema/AllOfGroup/AllOfGroupView.d.ts +0 -5
  380. package/dist/lib/plugins/openapi/schema/AllOfGroup/AllOfGroupView.js +0 -16
  381. package/dist/lib/plugins/openapi/schema/AllOfGroup/AllOfGroupView.js.map +0 -1
  382. package/lib/Button-DmS4u8Lj.js.map +0 -1
  383. package/lib/ErrorAlert-DE3Sf66a.js.map +0 -1
  384. package/lib/OperationList-DCJw6wXL.js +0 -5450
  385. package/lib/OperationList-DCJw6wXL.js.map +0 -1
  386. package/lib/RouteGuard-DhU3LRr1.js +0 -81
  387. package/lib/RouteGuard-DhU3LRr1.js.map +0 -1
  388. package/lib/RouterError-VDLnrFqF.js +0 -41
  389. package/lib/RouterError-VDLnrFqF.js.map +0 -1
  390. package/lib/SchemaView-D3hm65cc.js +0 -458
  391. package/lib/SchemaView-D3hm65cc.js.map +0 -1
  392. package/lib/Select-C1DeCqKv.js +0 -372
  393. package/lib/Select-C1DeCqKv.js.map +0 -1
  394. package/lib/SyntaxHighlight-zvlnSnHB.js.map +0 -1
  395. package/lib/circular-CSSuz-LS.js.map +0 -1
  396. package/lib/createServer-CLbcVLbK.js.map +0 -1
  397. package/lib/index-RNAxx6IF.js +0 -3364
  398. package/lib/index-RNAxx6IF.js.map +0 -1
  399. package/src/lib/plugins/openapi/playground/InlineInput.tsx +0 -6
  400. package/src/lib/plugins/openapi/schema/AllOfGroup/AllOfGroupConnector.tsx +0 -36
  401. package/src/lib/plugins/openapi/schema/AllOfGroup/AllOfGroupItem.tsx +0 -25
  402. package/src/lib/plugins/openapi/schema/AllOfGroup/AllOfGroupView.tsx +0 -42
@@ -1,22 +1,23 @@
1
1
  import { useMemo, useState, useTransition } from "react";
2
2
  import { useSearchParams } from "react-router";
3
3
  import { useZudoku } from "zudoku/hooks";
4
+ import { Badge } from "zudoku/ui/Badge.js";
5
+ import { NativeSelect, NativeSelectOption } from "zudoku/ui/NativeSelect.js";
6
+ import { SyntaxHighlight } from "zudoku/ui/SyntaxHighlight.js";
4
7
  import { useAuthState } from "../../authentication/state.js";
5
8
  import { PathRenderer } from "../../components/PathRenderer.js";
6
- import type { SchemaObject } from "../../oas/parser/index.js";
7
- import { SyntaxHighlight } from "../../ui/SyntaxHighlight.js";
8
9
  import { cn } from "../../util/cn.js";
9
10
  import { useOnScreen } from "../../util/useOnScreen.js";
10
- import { CollapsibleCode } from "./CollapsibleCode.js";
11
11
  import { ColorizedParam } from "./ColorizedParam.js";
12
+ import { NonHighlightedCode } from "./components/NonHighlightedCode.js";
12
13
  import { useOasConfig } from "./context.js";
14
+ import { GeneratedExampleSidecarBox } from "./GeneratedExampleSidecarBox.js";
13
15
  import type { OperationsFragmentFragment } from "./graphql/graphql.js";
14
16
  import { graphql } from "./graphql/index.js";
15
17
  import { PlaygroundDialogWrapper } from "./PlaygroundDialogWrapper.js";
16
18
  import { RequestBodySidecarBox } from "./RequestBodySidecarBox.js";
17
19
  import { ResponsesSidecarBox } from "./ResponsesSidecarBox.js";
18
20
  import * as SidecarBox from "./SidecarBox.js";
19
- import { SimpleSelect } from "./SimpleSelect.js";
20
21
  import { createHttpSnippet, getConverted } from "./util/createHttpSnippet.js";
21
22
  import { generateSchemaExample } from "./util/generateSchemaExample.js";
22
23
  import { methodForColor } from "./util/methodToColor.js";
@@ -49,13 +50,13 @@ const EXAMPLE_LANGUAGES = [
49
50
  export const Sidecar = ({
50
51
  operation,
51
52
  selectedResponse,
52
- onSelectResponse,
53
53
  globalSelectedServer,
54
+ shouldLazyHighlight,
54
55
  }: {
55
56
  operation: OperationsFragmentFragment;
56
57
  selectedResponse?: string;
57
- onSelectResponse: (response: string) => void;
58
58
  globalSelectedServer?: string;
59
+ shouldLazyHighlight?: boolean;
59
60
  }) => {
60
61
  const { options } = useOasConfig();
61
62
  const auth = useAuthState();
@@ -65,13 +66,18 @@ export const Sidecar = ({
65
66
 
66
67
  const [searchParams, setSearchParams] = useSearchParams();
67
68
  const [, startTransition] = useTransition();
68
- const [selectedExample, setSelectedExample] = useState<unknown>();
69
69
 
70
- const selectedLang =
70
+ const supportedLanguages = options?.supportedLanguages ?? EXAMPLE_LANGUAGES;
71
+
72
+ const preferredLang =
71
73
  searchParams.get("lang") ?? options?.examplesLanguage ?? "shell";
72
74
 
73
- const requestBodyContent = operation.requestBody?.content;
75
+ const selectedLang =
76
+ supportedLanguages.find((lang) => lang.value === preferredLang)?.value ??
77
+ supportedLanguages.at(0)?.value ??
78
+ "shell";
74
79
 
80
+ const requestBodyContent = operation.requestBody?.content;
75
81
  const transformedRequestBodyContent =
76
82
  requestBodyContent && options?.transformExamples
77
83
  ? options.transformExamples({
@@ -83,6 +89,27 @@ export const Sidecar = ({
83
89
  })
84
90
  : requestBodyContent;
85
91
 
92
+ const [selectedRequestExample, setSelectedRequestExample] = useState<{
93
+ contentTypeIndex: number;
94
+ exampleIndex: number;
95
+ }>({
96
+ contentTypeIndex: 0,
97
+ exampleIndex: 0,
98
+ });
99
+
100
+ const selectedContent = transformedRequestBodyContent?.at(
101
+ selectedRequestExample.contentTypeIndex,
102
+ );
103
+ const currentExample = selectedContent?.examples?.at(
104
+ selectedRequestExample.exampleIndex,
105
+ );
106
+
107
+ const currentExampleCode = currentExample
108
+ ? (currentExample?.value ?? currentExample)
109
+ : selectedContent?.schema
110
+ ? generateSchemaExample(selectedContent?.schema)
111
+ : undefined;
112
+
86
113
  const path = (
87
114
  <PathRenderer
88
115
  path={operation.path}
@@ -90,6 +117,7 @@ export const Sidecar = ({
90
117
  <ColorizedParam
91
118
  name={name}
92
119
  backgroundOpacity="0"
120
+ className="py-px px-0.5"
93
121
  // same as in `ParameterListItem`
94
122
  slug={`${operation.slug}-${name}`}
95
123
  >
@@ -104,34 +132,40 @@ export const Sidecar = ({
104
132
  const selectedServer =
105
133
  globalSelectedServer || operation.servers.at(0)?.url || "";
106
134
 
107
- const code = useMemo(() => {
108
- const exampleBody =
109
- selectedExample ??
110
- (transformedRequestBodyContent?.[0]?.schema
111
- ? generateSchemaExample(
112
- transformedRequestBodyContent[0].schema as SchemaObject,
113
- )
114
- : undefined);
135
+ const httpSnippetCode = useMemo<string | undefined>(() => {
136
+ const converted = options?.generateCodeSnippet?.({
137
+ selectedLang,
138
+ selectedServer,
139
+ context,
140
+ operation,
141
+ example: currentExampleCode,
142
+ auth,
143
+ });
144
+
145
+ if (converted) return converted;
115
146
 
116
147
  const snippet = createHttpSnippet({
117
148
  operation,
118
149
  selectedServer,
119
- exampleBody: exampleBody
150
+ exampleBody: currentExampleCode
120
151
  ? {
121
152
  mimeType: "application/json",
122
- text: JSON.stringify(exampleBody, null, 2),
153
+ text: JSON.stringify(currentExampleCode, null, 2),
123
154
  }
124
155
  : { mimeType: "application/json" },
125
156
  });
126
157
 
127
158
  return getConverted(snippet, selectedLang);
128
159
  }, [
129
- selectedExample,
130
- transformedRequestBodyContent,
160
+ currentExampleCode,
131
161
  operation,
132
162
  selectedServer,
133
163
  selectedLang,
164
+ options,
165
+ auth,
166
+ context,
134
167
  ]);
168
+
135
169
  const [ref, isOnScreen] = useOnScreen({ rootMargin: "200px 0px 200px 0px" });
136
170
 
137
171
  const showPlayground =
@@ -142,47 +176,34 @@ export const Sidecar = ({
142
176
  operation.extensions["x-zudoku-playground-enabled"] === undefined &&
143
177
  !options?.disablePlayground));
144
178
 
179
+ const hasResponseExamples = operation.responses.some((response) =>
180
+ response.content?.some((content) => (content.examples?.length ?? 0) > 0),
181
+ );
182
+
145
183
  return (
146
184
  <aside
147
185
  ref={ref}
148
- className="flex flex-col overflow-hidden sticky top-(--scroll-padding) gap-4"
186
+ className="flex flex-col sticky top-(--scroll-padding) gap-4"
149
187
  data-pagefind-ignore="all"
150
188
  >
151
189
  <SidecarBox.Root>
152
- <SidecarBox.Head className="flex justify-between items-center flex-nowrap py-2.5 gap-2 text-xs">
153
- <span className="font-mono break-words leading-6">
154
- <span className={cn("font-semibold", methodTextColor)}>
155
- {operation.method.toUpperCase()}
190
+ <SidecarBox.Head className="py-1.5">
191
+ <div className="flex items-center flex-wrap gap-2 justify-between w-full">
192
+ <span className="font-mono wrap-break-word leading-6 space-x-1">
193
+ <Badge
194
+ variant="outline"
195
+ className={cn(
196
+ methodTextColor,
197
+ "px-1.5 rounded-md border-none bg-current/7 dark:bg-current/15",
198
+ )}
199
+ >
200
+ {operation.method.toUpperCase()}
201
+ </Badge>
202
+ {path}
156
203
  </span>
157
- &nbsp;
158
- {path}
159
- </span>
160
- {showPlayground && (
161
- <PlaygroundDialogWrapper
162
- servers={operation.servers.map((server) => server.url)}
163
- operation={operation}
164
- examples={requestBodyContent ?? undefined}
165
- />
166
- )}
167
- </SidecarBox.Head>
168
- {isOnScreen && (
169
- <>
170
- <SidecarBox.Body className="p-0">
171
- <CollapsibleCode>
172
- <SyntaxHighlight
173
- embedded
174
- language={selectedLang}
175
- noBackground
176
- className="[--scrollbar-color:gray] rounded-none text-xs max-h-[500px]"
177
- // biome-ignore lint/style/noNonNullAssertion: code is guaranteed to be defined
178
- code={code!}
179
- />
180
- </CollapsibleCode>
181
- </SidecarBox.Body>
182
- <SidecarBox.Footer className="flex items-center text-xs gap-2 justify-end py-2.5">
183
- <span>Show example in</span>
184
- <SimpleSelect
185
- className="self-start max-w-[150px]"
204
+ <div className="flex items-center gap-1">
205
+ <NativeSelect
206
+ className="py-0.5 h-fit max-w-32 truncate bg-background"
186
207
  value={selectedLang}
187
208
  onChange={(e) => {
188
209
  startTransition(() => {
@@ -192,22 +213,65 @@ export const Sidecar = ({
192
213
  });
193
214
  });
194
215
  }}
195
- options={EXAMPLE_LANGUAGES}
196
- />
197
- </SidecarBox.Footer>
198
- </>
199
- )}
216
+ >
217
+ {supportedLanguages.map((language) => (
218
+ <NativeSelectOption
219
+ key={language.value}
220
+ value={language.value}
221
+ >
222
+ {language.label}
223
+ </NativeSelectOption>
224
+ ))}
225
+ </NativeSelect>
226
+ {showPlayground && (
227
+ <PlaygroundDialogWrapper
228
+ servers={operation.servers.map((server) => server.url)}
229
+ operation={operation}
230
+ examples={requestBodyContent ?? undefined}
231
+ />
232
+ )}
233
+ </div>
234
+ </div>
235
+ </SidecarBox.Head>
236
+ <SidecarBox.Body>
237
+ {shouldLazyHighlight && !isOnScreen ? (
238
+ <NonHighlightedCode code={httpSnippetCode ?? ""} />
239
+ ) : (
240
+ <SyntaxHighlight
241
+ embedded
242
+ language={selectedLang}
243
+ className="[--scrollbar-color:gray] rounded-none text-xs max-h-[200px]"
244
+ // biome-ignore lint/style/noNonNullAssertion: code is guaranteed to be defined
245
+ code={httpSnippetCode!}
246
+ />
247
+ )}
248
+ </SidecarBox.Body>
200
249
  </SidecarBox.Root>
201
- {isOnScreen && transformedRequestBodyContent && (
250
+
251
+ {transformedRequestBodyContent && currentExample ? (
202
252
  <RequestBodySidecarBox
203
253
  content={transformedRequestBodyContent}
204
- onExampleChange={setSelectedExample}
254
+ onExampleChange={(selected) => {
255
+ setSelectedRequestExample(selected);
256
+ }}
257
+ selectedContentIndex={selectedRequestExample.contentTypeIndex}
258
+ selectedExampleIndex={selectedRequestExample.exampleIndex}
259
+ isOnScreen={isOnScreen}
260
+ shouldLazyHighlight={shouldLazyHighlight}
205
261
  />
206
- )}
207
- {isOnScreen && operation.responses.length > 0 && (
262
+ ) : transformedRequestBodyContent && currentExampleCode ? (
263
+ <GeneratedExampleSidecarBox
264
+ isOnScreen={isOnScreen}
265
+ shouldLazyHighlight={shouldLazyHighlight}
266
+ code={JSON.stringify(currentExampleCode, null, 2)}
267
+ />
268
+ ) : null}
269
+
270
+ {hasResponseExamples && (
208
271
  <ResponsesSidecarBox
272
+ isOnScreen={isOnScreen}
273
+ shouldLazyHighlight={shouldLazyHighlight}
209
274
  selectedResponse={selectedResponse}
210
- onSelectResponse={onSelectResponse}
211
275
  responses={operation.responses.map((response) => ({
212
276
  ...response,
213
277
  content:
@@ -7,7 +7,12 @@ type BaseComponentProps<T = unknown> = PropsWithChildren<
7
7
 
8
8
  export const Root = ({ children, className }: BaseComponentProps) => (
9
9
  <div
10
- className={cn("rounded-xl overflow-hidden border border-border", className)}
10
+ data-slot="sidecar-box-root"
11
+ className={cn(
12
+ "relative text-xs flex min-w-0 flex-col rounded-xl border bg-muted/50 bg-clip-padding",
13
+ "before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-xl)-1px)] before:shadow-[0_1px_2px_1px_--theme(--color-black/4%)] after:pointer-events-none after:absolute after:-inset-[5px] after:-z-1 after:rounded-[calc(var(--radius-xl)+4px)] after:border after:border-border/50 after:bg-clip-padding **:data-[slot=particle-wrapper]:w-full **:data-[slot=particle-wrapper]:max-w-64 lg:col-span-1 dark:after:bg-background/72",
14
+ className,
15
+ )}
11
16
  >
12
17
  {children}
13
18
  </div>
@@ -15,8 +20,9 @@ export const Root = ({ children, className }: BaseComponentProps) => (
15
20
 
16
21
  export const Head = ({ children, className }: BaseComponentProps) => (
17
22
  <div
23
+ data-slot="sidecar-box-head"
18
24
  className={cn(
19
- "border-b bg-muted dark:bg-transparent text-card-foreground p-3 py-2.5",
25
+ "flex items-center gap-3 rounded-b-xl p-2.5 data-[slot=head]:rounded-b-none",
20
26
  className,
21
27
  )}
22
28
  >
@@ -25,11 +31,27 @@ export const Head = ({ children, className }: BaseComponentProps) => (
25
31
  );
26
32
 
27
33
  export const Body = ({ children, className }: BaseComponentProps) => (
28
- <div className={cn("bg-card overflow-auto p-2", className)}>{children}</div>
34
+ <div
35
+ data-slot="sidecar-box-body"
36
+ className={cn(
37
+ "overflow-auto -m-px flex min-w-0 flex-1 flex-col overflow-x-auto rounded-t-xl border bg-background",
38
+ "rounded-b last:rounded-b-xl",
39
+ "before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-xl)-1px)] dark:before:shadow-[0_-1px_--theme(--color-white/8%)]",
40
+ className,
41
+ )}
42
+ >
43
+ {children}
44
+ </div>
29
45
  );
30
46
 
31
47
  export const Footer = ({ children, className }: BaseComponentProps) => (
32
- <div className={cn("border-t bg-muted dark:bg-transparent p-3", className)}>
48
+ <div
49
+ data-slot="sidecar-box-footer"
50
+ className={cn(
51
+ "p-2 rounded-b-xl data-[slot=sidecar-box-footer]:rounded-b-none",
52
+ className,
53
+ )}
54
+ >
33
55
  {children}
34
56
  </div>
35
57
  );
@@ -1,14 +1,13 @@
1
- import { useEffect, useMemo, useState } from "react";
2
- import type { SchemaObject } from "../../oas/parser/index.js";
1
+ import { ExternalLinkIcon } from "lucide-react";
2
+ import { Badge } from "zudoku/ui/Badge.js";
3
+ import { NativeSelect, NativeSelectOption } from "zudoku/ui/NativeSelect.js";
3
4
  import { SyntaxHighlight } from "../../ui/SyntaxHighlight.js";
4
- import { CollapsibleCode } from "./CollapsibleCode.js";
5
+ import { NonHighlightedCode } from "./components/NonHighlightedCode.js";
5
6
  import type { MediaTypeObject } from "./graphql/graphql.js";
6
7
  import * as SidecarBox from "./SidecarBox.js";
7
- import { SimpleSelect } from "./SimpleSelect.js";
8
- import { generateSchemaExample } from "./util/generateSchemaExample.js";
9
8
 
10
- const formatForDisplay = (value: unknown): string => {
11
- if (value == null) return "No example";
9
+ const formatForDisplay = (value: unknown): string | undefined => {
10
+ if (value == null) return;
12
11
  if (typeof value === "string") return value.trim();
13
12
  return JSON.stringify(value, null, 2);
14
13
  };
@@ -35,72 +34,64 @@ const getLanguage = (mediaType?: string): string => {
35
34
  export type SidecarExamplesProps = {
36
35
  content: MediaTypeObject[];
37
36
  description?: string;
38
- onExampleChange?: (example: unknown) => void;
37
+ selectedContentIndex: number;
38
+ selectedExampleIndex: number;
39
+ onExampleChange?: ({
40
+ contentTypeIndex,
41
+ exampleIndex,
42
+ }: {
43
+ contentTypeIndex: number;
44
+ exampleIndex: number;
45
+ }) => void;
46
+ isOnScreen: boolean;
47
+ shouldLazyHighlight?: boolean;
39
48
  };
40
49
 
41
50
  export const SidecarExamples = ({
42
51
  content,
43
52
  description,
44
53
  onExampleChange,
54
+ selectedContentIndex,
55
+ selectedExampleIndex,
56
+ isOnScreen,
57
+ shouldLazyHighlight,
45
58
  }: SidecarExamplesProps) => {
46
- const [selectedContentTypeIndex, setSelectedContentTypeIndex] = useState(0);
47
- const [selectedExampleIndex, setSelectedExampleIndex] = useState(0);
48
-
49
- // Get the effective content (handle single item array case)
50
- const effectiveContent =
51
- Array.isArray(content) && content.length === 1
52
- ? content[0]
53
- : content[selectedContentTypeIndex];
54
-
55
59
  // Get example value, with fallback to schema-generated example
56
- const examples = effectiveContent?.examples ?? [];
57
- const selectedExample = examples[selectedExampleIndex];
58
-
59
- const exampleValue = useMemo(() => {
60
- if (selectedExample) {
61
- // If it's a wrapped example with a value field, use that
62
- return "value" in selectedExample
63
- ? selectedExample.value
64
- : selectedExample;
65
- } else if (effectiveContent?.schema) {
66
- // No example provided, generate one from schema
67
- return generateSchemaExample(effectiveContent.schema as SchemaObject);
68
- }
69
- }, [selectedExample, effectiveContent?.schema]);
70
-
71
- useEffect(() => {
72
- if (!exampleValue) return;
73
-
74
- onExampleChange?.(exampleValue);
75
- }, [exampleValue, onExampleChange]);
60
+ const selectedContent = content[selectedContentIndex];
61
+ const examples = selectedContent?.examples ?? [];
62
+ const selectedExample = examples?.[selectedExampleIndex];
76
63
 
77
- const formattedExample = formatForDisplay(exampleValue);
78
- const language = getLanguage(effectiveContent?.mediaType);
64
+ const formattedExample = formatForDisplay(selectedExample?.value);
65
+ const language = getLanguage(selectedContent?.mediaType);
79
66
 
80
67
  return (
81
68
  <>
82
69
  <SidecarBox.Body className="p-0">
83
70
  {selectedExample?.externalValue ? (
84
- <div className="p-2">
71
+ <div className="p-4">
85
72
  <a
86
73
  href={selectedExample.externalValue}
87
74
  target="_blank"
88
75
  rel="noopener noreferrer"
89
76
  className="text-xs text-primary hover:underline"
90
77
  >
91
- View External Example
78
+ View External Example
79
+ <ExternalLinkIcon className="size-3 inline-block ms-1 align-[-0.125em]" />
92
80
  </a>
93
81
  </div>
82
+ ) : shouldLazyHighlight && !isOnScreen && formattedExample ? (
83
+ <NonHighlightedCode code={formattedExample} />
84
+ ) : formattedExample ? (
85
+ <SyntaxHighlight
86
+ embedded
87
+ language={language}
88
+ className="[--scrollbar-color:gray] rounded-none max-h-[200px] text-xs overflow-auto"
89
+ code={formattedExample}
90
+ />
94
91
  ) : (
95
- <CollapsibleCode>
96
- <SyntaxHighlight
97
- embedded
98
- language={language}
99
- noBackground
100
- className="[--scrollbar-color:gray] rounded-none text-xs max-h-[500px]"
101
- code={formattedExample}
102
- />
103
- </CollapsibleCode>
92
+ <div className="grid place-items-center text-xs text-muted-foreground min-h-18">
93
+ No example specified for this content type
94
+ </div>
104
95
  )}
105
96
  {selectedExample?.description && (
106
97
  <div className="border-t text-xs px-3 py-1.5 text-muted-foreground">
@@ -108,51 +99,72 @@ export const SidecarExamples = ({
108
99
  </div>
109
100
  )}
110
101
  </SidecarBox.Body>
111
- <SidecarBox.Footer className="text-xs p-0 divide-y divide-border">
102
+ <SidecarBox.Footer className="text-xs">
112
103
  {description && (
113
- <div className="text-muted-foreground text-xs px-3 py-2">
104
+ <div className="text-muted-foreground text-xs px-1 py-2">
114
105
  {description}
115
106
  </div>
116
107
  )}
117
108
  {(examples.length !== 0 || content.length !== 0) && (
118
- <div className="flex items-center gap-2 justify-between min-w-0 px-3 py-2">
119
- <div className="flex items-center gap-2 min-w-0">
109
+ <div className="flex items-center gap-2 justify-between min-w-0">
110
+ <div className="flex items-center gap-2 flex-wrap">
120
111
  {content.length > 1 ? (
121
- <SimpleSelect
122
- className="max-w-[200px]"
123
- value={selectedContentTypeIndex.toString()}
112
+ <NativeSelect
113
+ className="text-xs h-fit py-1 truncate bg-background"
114
+ value={selectedContentIndex.toString()}
124
115
  onChange={(e) =>
125
- setSelectedContentTypeIndex(Number(e.target.value))
116
+ onExampleChange?.({
117
+ contentTypeIndex: Number(e.target.value),
118
+ exampleIndex: 0,
119
+ })
126
120
  }
127
- options={content.map((c, index) => ({
128
- value: index.toString(),
129
- label: c.mediaType,
130
- }))}
131
- />
121
+ >
122
+ {content.map((c, index) => (
123
+ <NativeSelectOption
124
+ key={c.mediaType}
125
+ value={index.toString()}
126
+ >
127
+ {c.mediaType}
128
+ </NativeSelectOption>
129
+ ))}
130
+ </NativeSelect>
132
131
  ) : (
133
- <span className="font-mono text-[11px]">
132
+ <Badge
133
+ className="text-[11px] font-mono font-normal"
134
+ variant="outline"
135
+ >
134
136
  {content[0]?.mediaType}
135
- </span>
137
+ </Badge>
136
138
  )}
137
139
  </div>
138
140
  {examples.length > 1 && (
139
- <div className="flex items-center gap-1">
140
- <SimpleSelect
141
- className="max-w-[180px]"
142
- value={selectedExampleIndex.toString()}
143
- onChange={(e) =>
144
- setSelectedExampleIndex(Number(e.target.value))
145
- }
146
- options={examples.map((example, index) => ({
147
- value: index.toString(),
148
- label:
141
+ <NativeSelect
142
+ className="text-xs h-fit py-1 truncate bg-background"
143
+ value={selectedExampleIndex.toString()}
144
+ onChange={(e) =>
145
+ onExampleChange?.({
146
+ contentTypeIndex: selectedContentIndex,
147
+ exampleIndex: Number(e.target.value),
148
+ })
149
+ }
150
+ >
151
+ {examples.map((example, index) => (
152
+ <NativeSelectOption
153
+ key={
149
154
  example.summary ||
150
155
  example.name ||
151
156
  example.description ||
152
- `Example ${index + 1}`,
153
- }))}
154
- />
155
- </div>
157
+ `Example ${index + 1}`
158
+ }
159
+ value={index.toString()}
160
+ >
161
+ {example.summary ||
162
+ example.name ||
163
+ example.description ||
164
+ `Example ${index + 1}`}
165
+ </NativeSelectOption>
166
+ ))}
167
+ </NativeSelect>
156
168
  )}
157
169
  </div>
158
170
  )}
@@ -9,7 +9,7 @@ export const ConstValue = ({
9
9
  hideDescription?: boolean;
10
10
  }) => {
11
11
  return (
12
- <div className="flex flex-col gap-1 text-xs">
12
+ <div className="flex flex-col gap-1">
13
13
  <div>
14
14
  <span className="text-muted-foreground">Const value: </span>
15
15
  <SelectOnClick className="border rounded px-1 font-mono">
@@ -22,8 +22,8 @@ export const EnumValues = ({
22
22
  shouldCollapse && !isOpen ? values.slice(0, maxVisibleValues) : values;
23
23
 
24
24
  return (
25
- <div className={cn("flex flex-wrap gap-1.5 text-xs", className)}>
26
- <span className="text-muted-foreground">Enum values: </span>
25
+ <div className={cn("flex flex-wrap gap-1.5", className)}>
26
+ <span className="text-muted-foreground">Enum values:</span>
27
27
  {visibleValues.map((value) => (
28
28
  <div key={value}>
29
29
  <SelectOnClick className="border rounded-sm px-1 font-mono">
@@ -0,0 +1,22 @@
1
+ import { cn } from "../../../util/cn.js";
2
+ import { OverflowOverlay } from "../CollapsibleCode.js";
3
+
4
+ export const NonHighlightedCode = ({
5
+ code,
6
+ className,
7
+ }: {
8
+ code: string;
9
+ className?: string;
10
+ }) => (
11
+ <pre
12
+ className={cn(
13
+ "relative text-(--shiki-light) dark:text-(--shiki-dark) p-2 text-xs font-mono max-h-[250px] leading-4.5 bg-(--shiki-light-bg) dark:bg-(--shiki-dark-bg) overflow-hidden",
14
+ className,
15
+ )}
16
+ >
17
+ <code>
18
+ {code.split("\n").length > 13 && <OverflowOverlay />}
19
+ {code}
20
+ </code>
21
+ </pre>
22
+ );