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
@@ -0,0 +1,349 @@
1
+ import {
2
+ type ComponentPropsWithoutRef,
3
+ type KeyboardEvent,
4
+ startTransition,
5
+ useCallback,
6
+ useEffect,
7
+ useRef,
8
+ } from "react";
9
+ import type {
10
+ Control,
11
+ FieldArrayPath,
12
+ FieldArrayWithId,
13
+ FieldValues,
14
+ PathValue,
15
+ } from "react-hook-form";
16
+ import { useFieldArray, useFormContext } from "react-hook-form";
17
+
18
+ export type Value =
19
+ | string
20
+ | number
21
+ | readonly string[]
22
+ | File
23
+ | boolean
24
+ | undefined;
25
+
26
+ export type KeyValueField = {
27
+ name: string;
28
+ value: Value;
29
+ active: boolean;
30
+ };
31
+
32
+ export type KeyValueFieldManagerOptions<
33
+ TFormData extends FieldValues,
34
+ TName extends FieldArrayPath<TFormData>,
35
+ T extends KeyValueField = PathValue<TFormData, TName>[number],
36
+ > = {
37
+ control: Control<TFormData>;
38
+ name: TName;
39
+ defaultValue: T;
40
+ isEmpty?: (item: T) => boolean;
41
+ shouldSetActive?: (item: T) => boolean;
42
+ };
43
+
44
+ export type CheckboxProps = {
45
+ checked: boolean;
46
+ disabled?: boolean;
47
+ onCheckedChange: (checked: boolean) => void;
48
+ };
49
+
50
+ export type RemoveButtonProps = { onClick: () => void; disabled?: boolean };
51
+
52
+ type SetValueFn = (
53
+ index: number,
54
+ field: keyof KeyValueField,
55
+ value: Value,
56
+ options?: { focus?: "next" | "previous" },
57
+ ) => void;
58
+
59
+ type GetValueFn = (index: number, field: keyof KeyValueField) => Value;
60
+
61
+ export type UseKeyValueFieldManagerReturn<TFormData extends FieldValues> = {
62
+ fields: FieldArrayWithId<TFormData>[];
63
+ getNameInputProps: GetInputPropsFn;
64
+ getValueInputProps: GetInputPropsFn;
65
+ getCheckboxProps: (index: number) => CheckboxProps;
66
+ getRemoveButtonProps: (index: number) => RemoveButtonProps;
67
+ setValue: SetValueFn;
68
+ getValue: GetValueFn;
69
+ };
70
+
71
+ type GetInputPropsFn = (index: number) => ComponentPropsWithoutRef<"input">;
72
+
73
+ export const useKeyValueFieldManager = <
74
+ TFormData extends FieldValues,
75
+ TName extends FieldArrayPath<TFormData>,
76
+ T extends KeyValueField = PathValue<TFormData, TName>[number],
77
+ >(
78
+ options: KeyValueFieldManagerOptions<TFormData, TName>,
79
+ ): UseKeyValueFieldManagerReturn<TFormData> => {
80
+ const {
81
+ control,
82
+ name,
83
+ defaultValue,
84
+ isEmpty: customIsEmpty,
85
+ shouldSetActive: customShouldSetActive,
86
+ } = options;
87
+ const {
88
+ setValue: internalSetValue,
89
+ watch,
90
+ setFocus,
91
+ register,
92
+ } = useFormContext();
93
+ const { fields, append, remove } = useFieldArray({ control, name });
94
+ const watchedFields = watch(name) as T[];
95
+ const lastEditedIndexRef = useRef(-1);
96
+ const prevLengthRef = useRef(-1);
97
+
98
+ const setValue = useCallback<SetValueFn>(
99
+ (index, field, value, options) => {
100
+ if (field === "value" || field === "name") {
101
+ lastEditedIndexRef.current = index;
102
+ }
103
+
104
+ // biome-ignore lint/suspicious/noExplicitAny: Can't infer the type of the value here
105
+ internalSetValue(`${name}.${index}.${field}`, value as any);
106
+
107
+ if (options?.focus === "next") {
108
+ setFocus(
109
+ field === "name"
110
+ ? `${name}.${index}.value`
111
+ : `${name}.${index + 1}.name`,
112
+ );
113
+ } else if (options?.focus === "previous") {
114
+ setFocus(
115
+ field === "name"
116
+ ? `${name}.${index - 1}.value`
117
+ : `${name}.${index}.name`,
118
+ );
119
+ }
120
+ },
121
+ [name, internalSetValue, setFocus],
122
+ );
123
+
124
+ const isEmpty = useCallback(
125
+ (item: T) => {
126
+ if (customIsEmpty) return customIsEmpty(item);
127
+ return !item.name && !item.value;
128
+ },
129
+ [customIsEmpty],
130
+ );
131
+
132
+ const shouldSetActive = useCallback(
133
+ (item: T) => {
134
+ if (customShouldSetActive) return customShouldSetActive(item);
135
+ return Boolean(item.name || item.value);
136
+ },
137
+ [customShouldSetActive],
138
+ );
139
+
140
+ // Handle auto append/remove of rows
141
+ useEffect(() => {
142
+ if (!watchedFields) return;
143
+
144
+ // Prevents double-appending in Strict Mode
145
+ if (prevLengthRef.current === -1) {
146
+ prevLengthRef.current = watchedFields.length;
147
+
148
+ if (watchedFields.length === 0) {
149
+ // biome-ignore lint/suspicious/noExplicitAny: Generic field array type
150
+ append(defaultValue as any, {
151
+ shouldFocus: false,
152
+ });
153
+ }
154
+ return;
155
+ }
156
+
157
+ prevLengthRef.current = watchedFields.length;
158
+
159
+ // If no fields, append one
160
+ if (watchedFields.length === 0) {
161
+ // biome-ignore lint/suspicious/noExplicitAny: Generic field array type
162
+ append(defaultValue as any, {
163
+ shouldFocus: false,
164
+ });
165
+ return;
166
+ }
167
+
168
+ // Auto-remove empty fields (except the last one, keep at least one)
169
+ if (watchedFields.length > 1) {
170
+ const emptyIndices: number[] = [];
171
+
172
+ // Check all fields except the last one
173
+ for (let i = 0; i < watchedFields.length - 1; i++) {
174
+ const field = watchedFields[i];
175
+ if (field && isEmpty(field) && !shouldSetActive(field)) {
176
+ emptyIndices.push(i);
177
+ }
178
+ }
179
+
180
+ // Remove from highest index to lowest to avoid index shifting
181
+ if (emptyIndices.length > 0) {
182
+ const lowestRemovedIndex = emptyIndices[0];
183
+
184
+ if (lowestRemovedIndex === undefined) return;
185
+
186
+ for (let i = emptyIndices.length - 1; i >= 0; i--) {
187
+ const indexToRemove = emptyIndices[i];
188
+ if (indexToRemove !== undefined) {
189
+ remove(indexToRemove);
190
+ }
191
+ }
192
+
193
+ // If we just edited this field, focus the name field at the same index
194
+ // (which now contains what was the next row), or previous row if needed
195
+ if (lastEditedIndexRef.current === lowestRemovedIndex) {
196
+ const newLength = watchedFields.length - emptyIndices.length;
197
+
198
+ if (lowestRemovedIndex < newLength) {
199
+ // Next row moved into this position, focus its name field
200
+ setFocus(`${name}.${lowestRemovedIndex}.name`);
201
+ } else if (lowestRemovedIndex > 0) {
202
+ // Removed row was at the end, focus previous row's name
203
+ setFocus(`${name}.${lowestRemovedIndex - 1}.name`);
204
+ } else {
205
+ setFocus(`${name}.0.name`);
206
+ }
207
+ }
208
+ lastEditedIndexRef.current = -1;
209
+ }
210
+ }
211
+
212
+ // If last field has content, append empty one
213
+ const lastField = watchedFields[watchedFields.length - 1];
214
+ if (lastField && !isEmpty(lastField)) {
215
+ // biome-ignore lint/suspicious/noExplicitAny: Generic field array type
216
+ append(defaultValue as any, {
217
+ shouldFocus: false,
218
+ });
219
+ }
220
+ }, [
221
+ watchedFields,
222
+ append,
223
+ remove,
224
+ defaultValue,
225
+ isEmpty,
226
+ name,
227
+ setFocus,
228
+ shouldSetActive,
229
+ ]);
230
+
231
+ // Auto set active state of row checkbox
232
+ useEffect(() => {
233
+ if (!watchedFields) return;
234
+
235
+ const updates: Array<() => void> = [];
236
+
237
+ for (let i = 0; i < watchedFields.length; i++) {
238
+ const field = watchedFields[i];
239
+ if (!field) continue;
240
+
241
+ const shouldBeActive = shouldSetActive(field);
242
+ if (field.active === shouldBeActive) continue;
243
+
244
+ updates.push(() => setValue(i, "active", shouldBeActive));
245
+ }
246
+
247
+ if (updates.length === 0) return;
248
+
249
+ startTransition(() => updates.forEach((update) => update()));
250
+ }, [watchedFields, shouldSetActive, setValue]);
251
+
252
+ const isFieldEmpty = useCallback(
253
+ (index: number) => {
254
+ const field = watchedFields?.[index];
255
+ return field ? isEmpty(field) : true;
256
+ },
257
+ [watchedFields, isEmpty],
258
+ );
259
+
260
+ const createKeyDownHandler = useCallback(
261
+ (index: number, field: "name" | "value") => {
262
+ const next =
263
+ field === "name"
264
+ ? `${name}.${index}.value`
265
+ : `${name}.${index + 1}.name`;
266
+
267
+ const previous =
268
+ field === "name"
269
+ ? `${name}.${index - 1}.value`
270
+ : `${name}.${index}.name`;
271
+ const canNavigatePrevious = field === "value" || index > 0;
272
+
273
+ return (e: KeyboardEvent<HTMLInputElement>) => {
274
+ if (!(e.target instanceof HTMLInputElement)) return;
275
+
276
+ const isAtStart = e.target.selectionStart === 0;
277
+ const isAtEnd = e.target.selectionStart === e.target.value.length;
278
+ const isEmpty = !e.target.value;
279
+
280
+ if (e.key === "Enter") {
281
+ setFocus(next);
282
+ } else if (e.key === "Backspace" && isEmpty && canNavigatePrevious) {
283
+ e.preventDefault();
284
+ setFocus(previous);
285
+ } else if (e.key === "ArrowLeft" && isAtStart && canNavigatePrevious) {
286
+ e.preventDefault();
287
+ setFocus(previous);
288
+ } else if (e.key === "ArrowRight" && isAtEnd) {
289
+ e.preventDefault();
290
+ setFocus(next);
291
+ }
292
+ };
293
+ },
294
+ [name, setFocus],
295
+ );
296
+
297
+ const getNameInputProps = useCallback<GetInputPropsFn>(
298
+ (index) => ({
299
+ ...register(`${name}.${index}.name`),
300
+ onChange: (e) => setValue(index, "name", e.target.value),
301
+ onKeyDown: createKeyDownHandler(index, "name"),
302
+ }),
303
+ [register, name, setValue, createKeyDownHandler],
304
+ );
305
+
306
+ const getValueInputProps = useCallback<GetInputPropsFn>(
307
+ (index) => ({
308
+ ...register(`${name}.${index}.value`),
309
+ onChange: (e) => setValue(index, "value", e.target.value),
310
+ onKeyDown: createKeyDownHandler(index, "value"),
311
+ }),
312
+ [register, name, setValue, createKeyDownHandler],
313
+ );
314
+
315
+ const getCheckboxProps = useCallback<(index: number) => CheckboxProps>(
316
+ (index) => ({
317
+ ...register(`${name}.${index}.active`),
318
+ checked: watch(`${name}.${index}.active`) ?? false,
319
+ disabled: isFieldEmpty(index),
320
+ onCheckedChange: (checked: boolean) => {
321
+ setValue(index, "active", checked === true);
322
+ },
323
+ }),
324
+ [name, register, isFieldEmpty, watch, setValue],
325
+ );
326
+
327
+ const getValue = useCallback<GetValueFn>(
328
+ (index, field) => watchedFields?.[index]?.[field],
329
+ [watchedFields],
330
+ );
331
+
332
+ const getRemoveButtonProps = useCallback(
333
+ (index: number) => ({
334
+ onClick: () => remove(index),
335
+ disabled: index === fields.length - 1,
336
+ }),
337
+ [remove, fields.length],
338
+ );
339
+
340
+ return {
341
+ fields,
342
+ getNameInputProps,
343
+ getValueInputProps,
344
+ getCheckboxProps,
345
+ getRemoveButtonProps,
346
+ setValue,
347
+ getValue,
348
+ };
349
+ };
@@ -184,9 +184,7 @@ export const ResponseTab = ({
184
184
  <Collapsible defaultOpen>
185
185
  <CollapsibleHeaderTrigger>
186
186
  <CornerDownRightIcon size={14} />
187
- <CollapsibleHeader className="col-span-2">
188
- Request Headers
189
- </CollapsibleHeader>
187
+ <CollapsibleHeader>Request Headers</CollapsibleHeader>
190
188
  </CollapsibleHeaderTrigger>
191
189
  <CollapsibleContent>
192
190
  <div className="grid grid-cols-[2fr_3fr] gap-x-6 text-sm">
@@ -231,9 +229,7 @@ export const ResponseTab = ({
231
229
  <Collapsible defaultOpen>
232
230
  <CollapsibleHeaderTrigger>
233
231
  <CornerDownLeftIcon size={14} />
234
- <CollapsibleHeader className="col-span-2">
235
- Response Headers
236
- </CollapsibleHeader>
232
+ <CollapsibleHeader>Response Headers</CollapsibleHeader>
237
233
  </CollapsibleHeaderTrigger>
238
234
  <CollapsibleContent>
239
235
  <div className="grid grid-cols-[2fr_3fr] gap-x-6 text-sm">
@@ -12,7 +12,7 @@ export const SchemaExampleAndDefault = ({
12
12
  if (example === undefined && defaultValue === undefined) return null;
13
13
 
14
14
  return (
15
- <div className="flex flex-col gap-1 text-xs">
15
+ <div className="flex flex-col gap-1">
16
16
  {example !== undefined && (
17
17
  <div>
18
18
  <span className="text-muted-foreground">Example: </span>
@@ -1,15 +1,15 @@
1
1
  import * as Collapsible from "@radix-ui/react-collapsible";
2
2
  import { MinusIcon, PlusIcon, RefreshCcwDotIcon } from "lucide-react";
3
3
  import { useState } from "react";
4
+ import { Item, ItemActions, ItemContent, ItemTitle } from "zudoku/ui/Item.js";
4
5
  import { InlineCode } from "../../../components/InlineCode.js";
5
6
  import { Markdown } from "../../../components/Markdown.js";
6
7
  import type { SchemaObject } from "../../../oas/parser/index.js";
7
8
  import { Button } from "../../../ui/Button.js";
9
+ import { cn } from "../../../util/cn.js";
8
10
  import { ConstValue } from "../components/ConstValue.js";
9
11
  import { EnumValues } from "../components/EnumValues.js";
10
- import { SelectOnClick } from "../components/SelectOnClick.js";
11
12
  import { ParamInfos } from "../ParamInfos.js";
12
- import { AllOfGroupView } from "./AllOfGroup/AllOfGroupView.js";
13
13
  import { SchemaExampleAndDefault } from "./SchemaExampleAndDefault.js";
14
14
  import { SchemaView } from "./SchemaView.js";
15
15
  import {
@@ -22,7 +22,7 @@ import {
22
22
 
23
23
  const RecursiveIndicator = ({ circularProp }: { circularProp?: string }) => (
24
24
  <InlineCode
25
- className="inline-flex items-center gap-1.5 italic text-xs translate-y-0.5"
25
+ className="inline-flex items-center gap-1.5 text-xs translate-y-0.5"
26
26
  selectOnClick={false}
27
27
  >
28
28
  <RefreshCcwDotIcon size={13} />
@@ -47,18 +47,26 @@ export const SchemaPropertyItem = ({
47
47
 
48
48
  if (isCircularRef(schema)) {
49
49
  return (
50
- <li className="p-4 bg-border/20 hover:bg-border/30">
51
- <div className="flex flex-col gap-2.5 justify-between text-sm">
52
- <div className="space-x-2 rtl:space-x-reverse">
53
- <code>{name}</code>
50
+ <Item>
51
+ <ItemContent className="gap-y-2">
52
+ <div>
53
+ <ItemTitle className="inline me-2">
54
+ <code>{name}</code>
55
+ </ItemTitle>
54
56
  <ParamInfos
57
+ className="inline"
55
58
  schema={schema}
56
- extraItems={[<RecursiveIndicator key="circular-ref" />]}
59
+ extraItems={[
60
+ group !== "optional" && (
61
+ <span className="text-primary">required</span>
62
+ ),
63
+ <RecursiveIndicator key="circular-ref" />,
64
+ ]}
57
65
  />
58
66
  </div>
59
67
  <SchemaExampleAndDefault schema={schema} />
60
- </div>
61
- </li>
68
+ </ItemContent>
69
+ </Item>
62
70
  );
63
71
  }
64
72
 
@@ -74,14 +82,34 @@ export const SchemaPropertyItem = ({
74
82
  !isArrayCircularRef(schema),
75
83
  );
76
84
 
85
+ const shouldRenderDescription = Boolean(
86
+ schema.description ||
87
+ ("items" in schema && schema.items?.enum) ||
88
+ schema.const ||
89
+ schema.enum ||
90
+ schema.example !== undefined ||
91
+ schema.default !== undefined,
92
+ );
93
+
77
94
  return (
78
- <li className="p-4 bg-border/20 hover:bg-border/30">
79
- <div className="flex flex-col gap-2.5 justify-between text-sm">
80
- <div className="space-x-2 rtl:space-x-reverse">
81
- <SelectOnClick asChild>
82
- <code>{name}</code>
83
- </SelectOnClick>
95
+ <Item>
96
+ <ItemContent className="gap-y-2">
97
+ <div>
98
+ <ItemTitle className="inline me-2">
99
+ {isCollapsible ? (
100
+ <button
101
+ onClick={() => setIsOpen(!isOpen)}
102
+ type="button"
103
+ className="hover:underline"
104
+ >
105
+ <code>{name}</code>
106
+ </button>
107
+ ) : (
108
+ <code>{name}</code>
109
+ )}
110
+ </ItemTitle>
84
111
  <ParamInfos
112
+ className="inline"
85
113
  schema={schema}
86
114
  extraItems={[
87
115
  group !== "optional" && (
@@ -95,47 +123,53 @@ export const SchemaPropertyItem = ({
95
123
  ]}
96
124
  />
97
125
  </div>
98
- {schema.description && (
99
- <Markdown
100
- className="text-sm leading-normal"
101
- content={schema.description}
102
- />
103
- )}
104
- {schema.type === "array" && "items" in schema && schema.items.enum && (
105
- <EnumValues values={schema.items.enum} />
126
+ {shouldRenderDescription && (
127
+ <div className="flex flex-col gap-1.5">
128
+ {schema.description && (
129
+ <Markdown className="prose-sm" content={schema.description} />
130
+ )}
131
+ {"items" in schema && schema.items?.enum && (
132
+ <EnumValues values={schema.items.enum} />
133
+ )}
134
+ {schema.const && <ConstValue schema={schema} hideDescription />}
135
+ {schema.enum && <EnumValues values={schema.enum} />}
136
+ <SchemaExampleAndDefault schema={schema} />
137
+ </div>
106
138
  )}
107
- {schema.const && <ConstValue schema={schema} hideDescription />}
108
- {schema.enum && <EnumValues values={schema.enum} />}
109
- <SchemaExampleAndDefault schema={schema} />
139
+ </ItemContent>
110
140
 
111
- {isCollapsible && (
112
- <Collapsible.Root
113
- defaultOpen={defaultOpen}
114
- open={isOpen}
115
- onOpenChange={() => setIsOpen(!isOpen)}
141
+ {isCollapsible && showCollapseButton && (
142
+ <ItemActions className="self-start">
143
+ <Button
144
+ variant="ghost"
145
+ size="icon"
146
+ className="rounded-full"
147
+ onClick={() => setIsOpen(!isOpen)}
148
+ aria-label="Toggle properties"
116
149
  >
117
- {showCollapseButton && (
118
- <Collapsible.Trigger asChild>
119
- <Button variant="expand" size="sm">
120
- {isOpen ? <MinusIcon size={12} /> : <PlusIcon size={12} />}
121
- {!isOpen ? "Show properties" : "Hide properties"}
122
- </Button>
123
- </Collapsible.Trigger>
124
- )}
125
- <Collapsible.Content>
126
- <div className="mt-2">
127
- {schema.allOf ? (
128
- <AllOfGroupView schema={schema} />
129
- ) : schema.anyOf || schema.oneOf || schema.type === "object" ? (
130
- <SchemaView schema={schema} />
131
- ) : isArrayType(schema) && "items" in schema ? (
132
- <SchemaView schema={schema.items} />
133
- ) : null}
134
- </div>
135
- </Collapsible.Content>
136
- </Collapsible.Root>
137
- )}
138
- </div>
139
- </li>
150
+ {isOpen ? <MinusIcon size={16} /> : <PlusIcon size={16} />}
151
+ </Button>
152
+ </ItemActions>
153
+ )}
154
+
155
+ {isCollapsible && (
156
+ <Collapsible.Root
157
+ defaultOpen={defaultOpen}
158
+ open={isOpen}
159
+ onOpenChange={setIsOpen}
160
+ className={cn("w-full", !isOpen && "contents")}
161
+ >
162
+ <Collapsible.Content asChild>
163
+ <ItemContent>
164
+ {schema.anyOf || schema.oneOf || schema.type === "object" ? (
165
+ <SchemaView schema={schema} />
166
+ ) : isArrayType(schema) && "items" in schema ? (
167
+ <SchemaView schema={schema.items} />
168
+ ) : null}
169
+ </ItemContent>
170
+ </Collapsible.Content>
171
+ </Collapsible.Root>
172
+ )}
173
+ </Item>
140
174
  );
141
175
  };