@redocly/theme 0.69.0-next.0 → 0.69.0-next.10

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 (293) hide show
  1. package/lib/components/Accordion/Accordion.js +5 -1
  2. package/lib/components/Accordion/variables.js +1 -1
  3. package/lib/components/Admonition/Admonition.d.ts +1 -1
  4. package/lib/components/Admonition/Admonition.js +1 -1
  5. package/lib/components/Admonition/variables.dark.js +2 -2
  6. package/lib/components/Admonition/variables.js +10 -10
  7. package/lib/components/Badge/Badge.d.ts +3 -1
  8. package/lib/components/Badge/Badge.js +7 -2
  9. package/lib/components/Banner/variables.dark.js +2 -0
  10. package/lib/components/Banner/variables.js +3 -1
  11. package/lib/components/Breadcrumbs/Breadcrumb.js +1 -1
  12. package/lib/components/Breadcrumbs/variables.js +1 -1
  13. package/lib/components/Button/ButtonGroup.d.ts +3 -5
  14. package/lib/components/Button/ButtonGroup.js +25 -5
  15. package/lib/components/Button/variables.js +27 -4
  16. package/lib/components/Buttons/ConnectMCPButton.js +39 -123
  17. package/lib/components/Buttons/CopyButton.js +12 -1
  18. package/lib/components/Buttons/variables.d.ts +0 -1
  19. package/lib/components/Buttons/variables.js +3 -44
  20. package/lib/components/Catalog/CatalogEntities.js +1 -0
  21. package/lib/components/Catalog/CatalogEntity/CatalogEntityLinks.js +1 -1
  22. package/lib/components/Catalog/CatalogEntity/CatalogEntityMetadata.js +1 -1
  23. package/lib/components/Catalog/CatalogEntity/CatalogEntityMethodAndPath.js +1 -1
  24. package/lib/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityRelations.js +5 -3
  25. package/lib/components/Catalog/CatalogEntity/CatalogEntitySchema.js +1 -1
  26. package/lib/components/Catalog/CatalogFilter/CatalogFilterSelect.js +1 -0
  27. package/lib/components/Catalog/CatalogViewModeToggle.d.ts +1 -1
  28. package/lib/components/Catalog/CatalogViewModeToggle.js +2 -43
  29. package/lib/components/Catalog/variables.js +5 -5
  30. package/lib/components/CatalogClassic/variables.js +2 -2
  31. package/lib/components/CodeBlock/CodeBlock.js +2 -1
  32. package/lib/components/CodeBlock/CodeBlockContainer.js +1 -0
  33. package/lib/components/Dropdown/Dropdown.d.ts +10 -20
  34. package/lib/components/Dropdown/Dropdown.js +13 -2
  35. package/lib/components/Dropdown/DropdownMenuItemContent.d.ts +9 -0
  36. package/lib/components/Dropdown/DropdownMenuItemContent.js +56 -0
  37. package/lib/components/Dropdown/variables.js +19 -2
  38. package/lib/components/Feedback/Mood.js +18 -14
  39. package/lib/components/Feedback/Rating.js +18 -13
  40. package/lib/components/Feedback/Scale.js +27 -22
  41. package/lib/components/Feedback/Sentiment.js +17 -13
  42. package/lib/components/Filter/FilterInput.js +4 -2
  43. package/lib/components/Filter/FilterSelect.js +1 -0
  44. package/lib/components/Filter/variables.js +2 -2
  45. package/lib/components/Image/variables.js +5 -3
  46. package/lib/components/JsonViewer/Helpers.js +12 -42
  47. package/lib/components/LanguagePicker/variables.js +1 -1
  48. package/lib/components/MCP/McpConnectionTabs.d.ts +7 -0
  49. package/lib/components/MCP/McpConnectionTabs.js +151 -0
  50. package/lib/components/Markdown/Markdown.js +1 -1
  51. package/lib/components/Markdown/styles/base-table.js +8 -0
  52. package/lib/components/Markdown/variables.js +1 -1
  53. package/lib/components/Menu/MenuItem.js +1 -1
  54. package/lib/components/Menu/variables.js +1 -1
  55. package/lib/components/Navbar/variables.js +1 -1
  56. package/lib/components/PageActions/PageActions.js +4 -6
  57. package/lib/components/PageActions/PageActionsMenuItem.d.ts +4 -4
  58. package/lib/components/PageActions/PageActionsMenuItem.js +27 -43
  59. package/lib/components/Panel/Panel.js +5 -1
  60. package/lib/components/Panel/variables.js +1 -1
  61. package/lib/components/Product/variables.js +2 -1
  62. package/lib/components/ReplayGate/ReplayGate.d.ts +1 -0
  63. package/lib/components/Search/FilterFields/SearchFilterFieldSelect.js +22 -32
  64. package/lib/components/Search/SearchAiDialog.js +4 -1
  65. package/lib/components/Search/SearchAiMessage.js +1 -1
  66. package/lib/components/Search/SearchAiNegativeFeedbackForm.js +2 -2
  67. package/lib/components/Search/SearchDialog.js +2 -2
  68. package/lib/components/Search/SearchItem.js +6 -3
  69. package/lib/components/Search/SearchRecent.js +1 -0
  70. package/lib/components/Search/SearchSuggestedPages.js +1 -0
  71. package/lib/components/Search/variables.js +9 -5
  72. package/lib/components/Segmented/Segmented.js +3 -3
  73. package/lib/components/Select/Select.js +30 -23
  74. package/lib/components/Select/variables.js +3 -3
  75. package/lib/components/Sidebar/Sidebar.js +2 -38
  76. package/lib/components/SplitButton/SplitButton.d.ts +21 -0
  77. package/lib/components/SplitButton/SplitButton.js +37 -0
  78. package/lib/components/Switch/variables.dark.js +2 -2
  79. package/lib/components/Switch/variables.js +2 -2
  80. package/lib/components/Tag/variables.js +2 -2
  81. package/lib/components/Tags/variables.js +1 -1
  82. package/lib/components/Toast/variables.js +1 -1
  83. package/lib/components/Tooltip/AnchorTooltip.js +2 -2
  84. package/lib/components/Tooltip/JsTooltip.js +2 -2
  85. package/lib/components/UserMenu/variables.js +1 -1
  86. package/lib/core/constants/accordion.d.ts +3 -0
  87. package/lib/core/constants/accordion.js +7 -0
  88. package/lib/core/constants/index.d.ts +1 -0
  89. package/lib/core/constants/index.js +1 -0
  90. package/lib/core/constants/mcp.d.ts +4 -0
  91. package/lib/core/constants/mcp.js +10 -1
  92. package/lib/core/constants/search.js +2 -2
  93. package/lib/core/contexts/PageActionsContext.d.ts +5 -0
  94. package/lib/core/contexts/PageActionsContext.js +10 -0
  95. package/lib/core/contexts/index.d.ts +1 -0
  96. package/lib/core/contexts/index.js +1 -0
  97. package/lib/core/hooks/code-walkthrough/use-code-walkthrough-controls.js +5 -17
  98. package/lib/core/hooks/code-walkthrough/use-code-walkthrough-steps.js +1 -0
  99. package/lib/core/hooks/menu/use-menu-item-expanded.js +1 -0
  100. package/lib/core/hooks/use-active-heading.js +59 -15
  101. package/lib/core/hooks/use-active-section-id.js +3 -1
  102. package/lib/core/hooks/use-connect-mcp-button.d.ts +1 -1
  103. package/lib/core/hooks/use-connect-mcp-button.js +16 -13
  104. package/lib/core/hooks/use-control.js +3 -0
  105. package/lib/core/hooks/use-local-state.js +1 -0
  106. package/lib/core/hooks/use-mcp-config.d.ts +2 -0
  107. package/lib/core/hooks/use-mcp-config.js +14 -4
  108. package/lib/core/hooks/use-mobile-menu.js +10 -2
  109. package/lib/core/styles/global.js +56 -49
  110. package/lib/core/styles/palette.js +2 -0
  111. package/lib/core/types/button-group.d.ts +2 -0
  112. package/lib/core/types/button-group.js +3 -0
  113. package/lib/core/types/catalog.d.ts +2 -4
  114. package/lib/core/types/common.d.ts +2 -0
  115. package/lib/core/types/hooks.d.ts +1 -0
  116. package/lib/core/types/index.d.ts +1 -0
  117. package/lib/core/types/l10n.d.ts +1 -1
  118. package/lib/core/types/mcp.d.ts +1 -1
  119. package/lib/core/utils/RenderWithLink.d.ts +2 -0
  120. package/lib/core/utils/RenderWithLink.js +20 -0
  121. package/lib/core/utils/index.d.ts +1 -0
  122. package/lib/core/utils/index.js +1 -0
  123. package/lib/core/utils/mcp.d.ts +5 -0
  124. package/lib/core/utils/mcp.js +35 -0
  125. package/lib/icons/CodexIcon/CodexIcon.d.ts +25 -0
  126. package/lib/icons/CodexIcon/CodexIcon.js +22 -0
  127. package/lib/icons/LinkIcon/LinkIcon.js +1 -1
  128. package/lib/index.d.ts +2 -0
  129. package/lib/index.js +2 -0
  130. package/lib/layouts/McpNotAllowed.js +10 -10
  131. package/lib/markdoc/components/Accordion/Accordion.d.ts +9 -0
  132. package/lib/markdoc/components/Accordion/Accordion.js +132 -0
  133. package/lib/markdoc/components/Accordion/AccordionGroup.d.ts +5 -0
  134. package/lib/markdoc/components/Accordion/AccordionGroup.js +29 -0
  135. package/lib/markdoc/components/Accordion/variables.d.ts +1 -0
  136. package/lib/markdoc/components/Accordion/variables.js +40 -0
  137. package/lib/markdoc/components/Cards/Card.d.ts +8 -1
  138. package/lib/markdoc/components/Cards/Card.js +55 -16
  139. package/lib/markdoc/components/Cards/CardBadge.d.ts +9 -0
  140. package/lib/markdoc/components/Cards/CardBadge.js +30 -0
  141. package/lib/markdoc/components/Cards/CardIcon.d.ts +5 -4
  142. package/lib/markdoc/components/Cards/CardIcon.js +6 -3
  143. package/lib/markdoc/components/Cards/variables.dark.js +32 -0
  144. package/lib/markdoc/components/Cards/variables.js +81 -7
  145. package/lib/markdoc/components/CodeWalkthrough/CodePanel.js +1 -0
  146. package/lib/markdoc/components/CodeWalkthrough/CodeStep.js +1 -1
  147. package/lib/markdoc/components/CodeWalkthrough/variables.js +2 -1
  148. package/lib/markdoc/components/Heading/Heading.js +5 -2
  149. package/lib/markdoc/components/Tabs/TabList.js +6 -2
  150. package/lib/markdoc/components/Tabs/Tabs.js +4 -2
  151. package/lib/markdoc/components/Tabs/variables.js +4 -4
  152. package/lib/markdoc/components/default.d.ts +2 -0
  153. package/lib/markdoc/components/default.js +2 -0
  154. package/lib/markdoc/default.d.ts +4 -0
  155. package/lib/markdoc/default.js +4 -0
  156. package/lib/markdoc/tags/accordion-group.d.ts +2 -0
  157. package/lib/markdoc/tags/accordion-group.js +10 -0
  158. package/lib/markdoc/tags/accordion.d.ts +2 -0
  159. package/lib/markdoc/tags/accordion.js +14 -0
  160. package/lib/markdoc/tags/admonition.js +1 -1
  161. package/lib/markdoc/tags/card.js +14 -0
  162. package/lib/markdoc/tags/connect-mcp.js +2 -1
  163. package/package.json +19 -10
  164. package/src/components/Accordion/Accordion.tsx +7 -3
  165. package/src/components/Accordion/variables.ts +1 -1
  166. package/src/components/Admonition/Admonition.tsx +2 -2
  167. package/src/components/Admonition/variables.dark.ts +2 -2
  168. package/src/components/Admonition/variables.ts +10 -10
  169. package/src/components/Badge/Badge.tsx +16 -2
  170. package/src/components/Banner/variables.dark.ts +2 -0
  171. package/src/components/Banner/variables.ts +3 -1
  172. package/src/components/Breadcrumbs/Breadcrumb.tsx +1 -1
  173. package/src/components/Breadcrumbs/variables.ts +1 -1
  174. package/src/components/Button/ButtonGroup.tsx +28 -10
  175. package/src/components/Button/variables.ts +27 -4
  176. package/src/components/Buttons/ConnectMCPButton.tsx +88 -145
  177. package/src/components/Buttons/CopyButton.tsx +14 -2
  178. package/src/components/Buttons/variables.ts +2 -44
  179. package/src/components/Catalog/CatalogEntities.tsx +1 -0
  180. package/src/components/Catalog/CatalogEntity/CatalogEntityLinks.tsx +1 -1
  181. package/src/components/Catalog/CatalogEntity/CatalogEntityMetadata.tsx +1 -1
  182. package/src/components/Catalog/CatalogEntity/CatalogEntityMethodAndPath.tsx +1 -1
  183. package/src/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityRelations.tsx +6 -4
  184. package/src/components/Catalog/CatalogEntity/CatalogEntitySchema.tsx +1 -1
  185. package/src/components/Catalog/CatalogFilter/CatalogFilterSelect.tsx +1 -0
  186. package/src/components/Catalog/CatalogViewModeToggle.tsx +2 -17
  187. package/src/components/Catalog/variables.ts +5 -5
  188. package/src/components/CatalogClassic/variables.ts +2 -2
  189. package/src/components/CodeBlock/CodeBlock.tsx +2 -1
  190. package/src/components/CodeBlock/CodeBlockContainer.tsx +1 -0
  191. package/src/components/Dropdown/Dropdown.tsx +25 -4
  192. package/src/components/Dropdown/DropdownMenuItemContent.tsx +72 -0
  193. package/src/components/Dropdown/variables.ts +19 -2
  194. package/src/components/Feedback/Mood.tsx +22 -15
  195. package/src/components/Feedback/Rating.tsx +22 -14
  196. package/src/components/Feedback/Scale.tsx +40 -32
  197. package/src/components/Feedback/Sentiment.tsx +21 -14
  198. package/src/components/Filter/FilterInput.tsx +5 -3
  199. package/src/components/Filter/FilterSelect.tsx +1 -0
  200. package/src/components/Filter/variables.ts +2 -2
  201. package/src/components/Image/variables.ts +5 -3
  202. package/src/components/JsonViewer/Helpers.tsx +13 -9
  203. package/src/components/LanguagePicker/variables.ts +1 -1
  204. package/src/components/MCP/McpConnectionTabs.tsx +263 -0
  205. package/src/components/Markdown/Markdown.tsx +2 -1
  206. package/src/components/Markdown/styles/base-table.ts +8 -0
  207. package/src/components/Markdown/variables.ts +1 -1
  208. package/src/components/Menu/MenuItem.tsx +2 -2
  209. package/src/components/Menu/variables.ts +1 -1
  210. package/src/components/Navbar/variables.ts +1 -1
  211. package/src/components/PageActions/PageActions.tsx +22 -23
  212. package/src/components/PageActions/PageActionsMenuItem.tsx +41 -55
  213. package/src/components/Panel/Panel.tsx +7 -3
  214. package/src/components/Panel/variables.ts +1 -1
  215. package/src/components/Product/variables.ts +2 -1
  216. package/src/components/ReplayGate/ReplayGate.tsx +3 -0
  217. package/src/components/Search/FilterFields/SearchFilterFieldSelect.tsx +32 -40
  218. package/src/components/Search/SearchAiDialog.tsx +4 -1
  219. package/src/components/Search/SearchAiMessage.tsx +1 -1
  220. package/src/components/Search/SearchAiNegativeFeedbackForm.tsx +2 -2
  221. package/src/components/Search/SearchDialog.tsx +2 -2
  222. package/src/components/Search/SearchItem.tsx +7 -1
  223. package/src/components/Search/SearchRecent.tsx +1 -0
  224. package/src/components/Search/SearchSuggestedPages.tsx +1 -0
  225. package/src/components/Search/variables.ts +9 -5
  226. package/src/components/Segmented/Segmented.tsx +6 -3
  227. package/src/components/Select/Select.tsx +36 -22
  228. package/src/components/Select/variables.ts +3 -3
  229. package/src/components/Sidebar/Sidebar.tsx +2 -6
  230. package/src/components/SplitButton/SplitButton.tsx +95 -0
  231. package/src/components/Switch/variables.dark.ts +2 -2
  232. package/src/components/Switch/variables.ts +2 -2
  233. package/src/components/Tag/variables.ts +2 -2
  234. package/src/components/Tags/variables.ts +1 -1
  235. package/src/components/Toast/variables.ts +1 -1
  236. package/src/components/Tooltip/AnchorTooltip.tsx +2 -2
  237. package/src/components/Tooltip/JsTooltip.tsx +2 -2
  238. package/src/components/UserMenu/variables.ts +1 -1
  239. package/src/core/constants/accordion.ts +4 -0
  240. package/src/core/constants/index.ts +1 -0
  241. package/src/core/constants/mcp.ts +14 -0
  242. package/src/core/constants/search.ts +2 -2
  243. package/src/core/contexts/PageActionsContext.tsx +7 -0
  244. package/src/core/contexts/index.ts +1 -0
  245. package/src/core/hooks/code-walkthrough/use-code-walkthrough-controls.ts +6 -20
  246. package/src/core/hooks/code-walkthrough/use-code-walkthrough-steps.ts +1 -0
  247. package/src/core/hooks/menu/use-menu-item-expanded.ts +1 -0
  248. package/src/core/hooks/use-active-heading.ts +79 -15
  249. package/src/core/hooks/use-active-section-id.ts +3 -1
  250. package/src/core/hooks/use-connect-mcp-button.ts +23 -15
  251. package/src/core/hooks/use-control.ts +5 -1
  252. package/src/core/hooks/use-local-state.ts +1 -0
  253. package/src/core/hooks/use-mcp-config.ts +15 -4
  254. package/src/core/hooks/use-mobile-menu.ts +11 -3
  255. package/src/core/openapi/index.ts +1 -1
  256. package/src/core/styles/global.ts +19 -12
  257. package/src/core/styles/palette.ts +2 -0
  258. package/src/core/types/button-group.ts +2 -0
  259. package/src/core/types/catalog.ts +2 -4
  260. package/src/core/types/common.ts +3 -0
  261. package/src/core/types/hooks.ts +1 -0
  262. package/src/core/types/index.ts +1 -0
  263. package/src/core/types/l10n.ts +29 -1
  264. package/src/core/types/mcp.ts +1 -1
  265. package/src/core/utils/RenderWithLink.tsx +19 -0
  266. package/src/core/utils/index.ts +1 -0
  267. package/src/core/utils/mcp.ts +39 -0
  268. package/src/icons/CodexIcon/CodexIcon.tsx +23 -0
  269. package/src/icons/LinkIcon/LinkIcon.tsx +1 -1
  270. package/src/index.ts +2 -0
  271. package/src/layouts/McpNotAllowed.tsx +37 -11
  272. package/src/markdoc/components/Accordion/Accordion.tsx +128 -0
  273. package/src/markdoc/components/Accordion/AccordionGroup.tsx +41 -0
  274. package/src/markdoc/components/Accordion/variables.ts +37 -0
  275. package/src/markdoc/components/Cards/Card.tsx +79 -14
  276. package/src/markdoc/components/Cards/CardBadge.tsx +39 -0
  277. package/src/markdoc/components/Cards/CardIcon.tsx +16 -5
  278. package/src/markdoc/components/Cards/variables.dark.ts +32 -0
  279. package/src/markdoc/components/Cards/variables.ts +81 -7
  280. package/src/markdoc/components/CodeWalkthrough/CodePanel.tsx +1 -0
  281. package/src/markdoc/components/CodeWalkthrough/CodeStep.tsx +1 -1
  282. package/src/markdoc/components/CodeWalkthrough/variables.ts +2 -1
  283. package/src/markdoc/components/Heading/Heading.tsx +7 -4
  284. package/src/markdoc/components/Tabs/TabList.tsx +6 -2
  285. package/src/markdoc/components/Tabs/Tabs.tsx +4 -2
  286. package/src/markdoc/components/Tabs/variables.ts +4 -4
  287. package/src/markdoc/components/default.ts +2 -0
  288. package/src/markdoc/default.ts +4 -0
  289. package/src/markdoc/tags/accordion-group.ts +8 -0
  290. package/src/markdoc/tags/accordion.ts +12 -0
  291. package/src/markdoc/tags/admonition.ts +1 -1
  292. package/src/markdoc/tags/card.ts +14 -0
  293. package/src/markdoc/tags/connect-mcp.ts +3 -1
@@ -212,10 +212,8 @@ export type BffCatalogEntityList = BffCatalogList<BffCatalogEntity>;
212
212
  export type BffCatalogRelatedEntityList = BffCatalogList<BffCatalogRelatedEntity>;
213
213
 
214
214
  export type Page = {
215
- endCursor: string | null;
216
- startCursor: string | null;
217
- hasNextPage: boolean;
218
- hasPrevPage: boolean;
215
+ nextPage: string | null;
216
+ previousPage: string | null;
219
217
  limit: number;
220
218
  total: number;
221
219
  };
@@ -1,5 +1,8 @@
1
+ import type React from 'react';
1
2
  import { DEFAULT_COLOR_MODES } from '../constants';
2
3
 
3
4
  export type Plural<T extends string> = `${T}s`;
4
5
 
5
6
  export type ColorMode = (typeof DEFAULT_COLOR_MODES)[keyof typeof DEFAULT_COLOR_MODES];
7
+
8
+ export type RenderableChildren<Context> = React.ReactNode | ((context: Context) => React.ReactNode);
@@ -143,6 +143,7 @@ export type ThemeHooks = {
143
143
  docs: {
144
144
  enabled: boolean;
145
145
  name?: string;
146
+ publicEndpoint?: boolean;
146
147
  };
147
148
  };
148
149
  useSidebarItems: (activeVersion?: Version | null) => {
@@ -22,3 +22,4 @@ export type * from './segmented';
22
22
  export type * from './tooltip';
23
23
  export type * from './toast';
24
24
  export type * from './link';
25
+ export type * from './button-group';
@@ -134,8 +134,28 @@ export type TranslationKey =
134
134
  | 'page.forbidden.description'
135
135
  | 'page.notFound.title'
136
136
  | 'page.notFound.description'
137
+ | 'page.apiNotFound.title'
138
+ | 'page.apiNotFound.description'
139
+ | 'page.apiNotFound.hint'
140
+ | 'page.apiNotFound.backButton'
137
141
  | 'page.mcpNotAllowed.title'
138
142
  | 'page.mcpNotAllowed.description'
143
+ | 'page.mcpNotAllowed.publicNote'
144
+ | 'page.mcpNotAllowed.publicEndpointHint'
145
+ | 'page.mcpNotAllowed.mainEndpointHint'
146
+ | 'page.mcpNotAllowed.snippets.terminal.hint'
147
+ | 'page.mcpNotAllowed.snippets.claudeCode.headline'
148
+ | 'page.mcpNotAllowed.snippets.claudeDesktop.headline'
149
+ | 'page.mcpNotAllowed.snippets.claudeDesktop.instruction'
150
+ | 'page.mcpNotAllowed.snippets.chatgptApp.headline'
151
+ | 'page.mcpNotAllowed.snippets.chatgptApp.instruction'
152
+ | 'page.mcpNotAllowed.snippets.codexCli.headline'
153
+ | 'page.mcpNotAllowed.snippets.prompt.headline'
154
+ | 'page.mcpNotAllowed.snippets.prompt.hint'
155
+ | 'page.mcpNotAllowed.snippets.json.hint'
156
+ | 'page.mcpNotAllowed.tabs.claude'
157
+ | 'page.mcpNotAllowed.tabs.chatgpt'
158
+ | 'page.mcpNotAllowed.tabs.json'
139
159
  | 'page.lastUpdated.timeago'
140
160
  | 'page.lastUpdated.on'
141
161
  | 'catalog.filters.placeholder'
@@ -271,8 +291,14 @@ export type TranslationKey =
271
291
  | 'page.actions.connectMcp.cursorDescription'
272
292
  | 'page.actions.connectMcp.vscode'
273
293
  | 'page.actions.connectMcp.vscodeDescription'
294
+ | 'page.actions.connectMcp.claudeCode'
295
+ | 'page.actions.connectMcp.claudeCodeDescription'
296
+ | 'page.actions.connectMcp.codex'
297
+ | 'page.actions.connectMcp.codexDescription'
274
298
  | 'page.actions.connectMcp.copyConfig'
275
299
  | 'page.actions.connectMcp.copyConfigDescription'
300
+ | 'page.actions.connectMcp.moreOptions'
301
+ | 'page.actions.moreActions'
276
302
  | 'openapi.download.description.title'
277
303
  | 'openapi.info.title'
278
304
  | 'openapi.info.contact.url'
@@ -280,6 +306,7 @@ export type TranslationKey =
280
306
  | 'openapi.info.license'
281
307
  | 'openapi.info.termsOfService'
282
308
  | 'openapi.info.metadata.title'
309
+ | 'graphql.info.metadata.title'
283
310
  | 'openapi.key'
284
311
  | 'openapi.value'
285
312
  | 'openapi.enum'
@@ -369,6 +396,8 @@ export type TranslationKey =
369
396
  | 'openapi.mcp.inputExample'
370
397
  | 'openapi.mcp.outputSchema'
371
398
  | 'openapi.mcp.outputExample'
399
+ | 'openapi.mcp.exampleTitle'
400
+ | 'openapi.mcp.argumentsExample'
372
401
  | 'asyncapi.download.description.title'
373
402
  | 'asyncapi.info.title'
374
403
  | 'asyncapi.info.contact.url'
@@ -449,7 +478,6 @@ export type TranslationKey =
449
478
  | 'graphql.sample'
450
479
  | 'graphql.referenced'
451
480
  | 'graphql.content.fragment'
452
- | 'button.copy.tooltipText'
453
481
  | 'button.download.tooltipText'
454
482
  | 'button.externalLink.tooltipText'
455
483
  | 'button.email.tooltipText'
@@ -1,6 +1,6 @@
1
1
  export type MCPClientType = 'cursor' | 'vscode';
2
2
 
3
- export type MCPOption = 'cursor' | 'vscode' | 'copy';
3
+ export type MCPOption = 'cursor' | 'vscode' | 'claude-code' | 'codex' | 'copy';
4
4
 
5
5
  export type McpConnectionParams = {
6
6
  serverName: string;
@@ -0,0 +1,19 @@
1
+ import React from 'react';
2
+
3
+ import type { JSX } from 'react';
4
+
5
+ // Splits a translated sentence on <link>...</link> markers and renders the
6
+ // marked phrase as an anchor, so each locale keeps its own word order.
7
+ export function renderWithLink(text: string, href: string): JSX.Element {
8
+ const [before, label, after] = text.split(/<link>|<\/link>/);
9
+ if (label === undefined) {
10
+ return <>{text}</>;
11
+ }
12
+ return (
13
+ <>
14
+ {before}
15
+ <a href={href}>{label}</a>
16
+ {after}
17
+ </>
18
+ );
19
+ }
@@ -48,3 +48,4 @@ export * from './get-auto-dismiss-duration';
48
48
  export * from './tooltip-placement';
49
49
  export * from './telemetry/get-base-data-attributes';
50
50
  export * from './telemetry/generate-before-after-context';
51
+ export * from './RenderWithLink';
@@ -32,3 +32,42 @@ export function generateMCPDeepLink(
32
32
  return generateCursorMCPDeepLink(config);
33
33
  }
34
34
  }
35
+
36
+ // Server names can contain spaces (e.g. "Docs MCP server") which break bare CLI
37
+ // arguments, so commands use a slugified form while JSON configs keep the raw name.
38
+ export function slugifyMcpServerName(name: string): string {
39
+ return name
40
+ .toLowerCase()
41
+ .replace(/[^a-z0-9_-]+/g, '-')
42
+ .replace(/^-+|-+$/g, '');
43
+ }
44
+
45
+ // Claude Desktop's config file only launches stdio commands, so remote servers
46
+ // connect through the mcp-remote bridge.
47
+ export function generateClaudeDesktopConfig(config: McpConnectionParams): string {
48
+ return JSON.stringify(
49
+ {
50
+ mcpServers: {
51
+ [slugifyMcpServerName(config.serverName)]: {
52
+ command: 'npx',
53
+ args: ['-y', 'mcp-remote', config.url],
54
+ },
55
+ },
56
+ },
57
+ null,
58
+ 2,
59
+ );
60
+ }
61
+
62
+ export function generateClaudeCodeCommand(config: McpConnectionParams): string {
63
+ return `claude mcp add --transport http ${slugifyMcpServerName(config.serverName)} ${config.url}`;
64
+ }
65
+
66
+ export function generateCodexCommand(config: McpConnectionParams): string {
67
+ return `codex mcp add ${slugifyMcpServerName(config.serverName)} --url ${config.url}`;
68
+ }
69
+
70
+ // Pasted into an AI assistant (Claude Code, Codex) so it installs the server itself.
71
+ export function generateMcpInstallPrompt(config: McpConnectionParams): string {
72
+ return `Add the MCP server "${slugifyMcpServerName(config.serverName)}" with URL ${config.url} (streamable HTTP transport) to my MCP configuration, then verify it is connected.`;
73
+ }
@@ -0,0 +1,23 @@
1
+ import React from 'react';
2
+ import styled from 'styled-components';
3
+
4
+ import type { IconProps } from '@redocly/theme/icons/types';
5
+
6
+ import { getCssColorVariable } from '@redocly/theme/core/utils';
7
+
8
+ const Icon = (props: IconProps) => (
9
+ <svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" {...props}>
10
+ <path d="M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.073zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.8956zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997z" />
11
+ </svg>
12
+ );
13
+
14
+ export const CodexIcon = styled(Icon).attrs({
15
+ 'data-component-name': 'icons/CodexIcon/CodexIcon',
16
+ })`
17
+ path {
18
+ fill: ${({ color }) => getCssColorVariable(color)};
19
+ }
20
+
21
+ height: ${({ size }) => size || '16px'};
22
+ width: ${({ size }) => size || '16px'};
23
+ `;
@@ -15,7 +15,7 @@ const Icon = (props: IconProps) => (
15
15
  {...props}
16
16
  >
17
17
  <path
18
- d="M0 4C0 1.79086 1.79086 0 4 0H16C18.2091 0 20 1.79086 20 4V16C20 18.2091 18.2091 20 16 20H4C1.79086 20 0 18.2091 0 16V4Z"
18
+ d="M0 6C0 2.68629 2.68629 0 6 0H14C17.3137 0 20 2.68629 20 6V14C20 17.3137 17.3137 20 14 20H6C2.68629 20 0 17.3137 0 14V6Z"
19
19
  fill="var(--layer-color)"
20
20
  />
21
21
  <path
package/src/index.ts CHANGED
@@ -15,6 +15,8 @@ export * from '@redocly/theme/components/Badge/Badge';
15
15
  export * from '@redocly/theme/components/Dropdown/Dropdown';
16
16
  export * from '@redocly/theme/components/Dropdown/DropdownMenu';
17
17
  export * from '@redocly/theme/components/Dropdown/DropdownMenuItem';
18
+ export * from '@redocly/theme/components/Dropdown/DropdownMenuItemContent';
19
+ export * from '@redocly/theme/components/SplitButton/SplitButton';
18
20
  export * from '@redocly/theme/components/Loaders/Loading';
19
21
  export * from '@redocly/theme/components/LoadMore/LoadMore';
20
22
  export * from '@redocly/theme/components/Link/Link';
@@ -3,28 +3,61 @@ import styled from 'styled-components';
3
3
 
4
4
  import type { JSX } from 'react';
5
5
 
6
- import { useThemeHooks } from '@redocly/theme/core/hooks';
6
+ import { useThemeHooks, useMCPConfig } from '@redocly/theme/core/hooks';
7
+ import { renderWithLink } from '@redocly/theme/core/utils';
7
8
  import { ConnectMCPButton } from '@redocly/theme/components/Buttons/ConnectMCPButton';
9
+ import { McpConnectionTabs } from '@redocly/theme/components/MCP/McpConnectionTabs';
8
10
 
9
11
  export default function McpNotAllowed(): JSX.Element {
10
12
  const { useTranslate } = useThemeHooks();
11
13
  const { translate } = useTranslate();
14
+ const { isPublicEndpointPage, alternateServerUrl } = useMCPConfig();
12
15
 
13
16
  return (
14
17
  <NotAllowedWrapper data-component-name="layouts/McpNotAllowed">
15
- <StatusText>405</StatusText>
16
18
  <Title data-translation-key="page.mcpNotAllowed.title">
17
- {translate('page.mcpNotAllowed.title', 'Method not allowed')}
19
+ {translate('page.mcpNotAllowed.title', 'Connect to the MCP server')}
18
20
  </Title>
19
21
  <Description data-translation-key="page.mcpNotAllowed.description">
20
22
  {translate(
21
23
  'page.mcpNotAllowed.description',
22
- 'To use this MCP server, register it in your MCP Client (for example: VS Code, Cursor, or Claude Code).',
24
+ 'To use this MCP server, register it in your MCP client (for example: VS Code, Cursor, or Claude Code).',
23
25
  )}
24
26
  </Description>
27
+ {isPublicEndpointPage && (
28
+ <Description data-translation-key="page.mcpNotAllowed.publicNote">
29
+ {translate(
30
+ 'page.mcpNotAllowed.publicNote',
31
+ 'This endpoint serves publicly available content only and requires no login.',
32
+ )}
33
+ </Description>
34
+ )}
35
+ {isPublicEndpointPage && alternateServerUrl && (
36
+ <Description data-translation-key="page.mcpNotAllowed.mainEndpointHint">
37
+ {renderWithLink(
38
+ translate(
39
+ 'page.mcpNotAllowed.mainEndpointHint',
40
+ 'To access content available to your account, use the <link>main MCP endpoint</link>.',
41
+ ),
42
+ alternateServerUrl,
43
+ )}
44
+ </Description>
45
+ )}
46
+ {!isPublicEndpointPage && alternateServerUrl && (
47
+ <Description data-translation-key="page.mcpNotAllowed.publicEndpointHint">
48
+ {renderWithLink(
49
+ translate(
50
+ 'page.mcpNotAllowed.publicEndpointHint',
51
+ 'To connect anonymously without an account, use the <link>public endpoint</link>.',
52
+ ),
53
+ alternateServerUrl,
54
+ )}
55
+ </Description>
56
+ )}
25
57
  <ButtonWrapper>
26
58
  <ConnectMCPButton alignment="start" />
27
59
  </ButtonWrapper>
60
+ <McpConnectionTabs />
28
61
  </NotAllowedWrapper>
29
62
  );
30
63
  }
@@ -44,13 +77,6 @@ const NotAllowedWrapper = styled.div`
44
77
  }
45
78
  `;
46
79
 
47
- const StatusText = styled.div`
48
- color: var(--page-mcp-405-status-text-color);
49
- font-size: var(--page-mcp-405-status-font-size);
50
- line-height: var(--page-mcp-405-status-line-height);
51
- font-weight: var(--page-mcp-405-status-font-weight);
52
- `;
53
-
54
80
  const Title = styled.div`
55
81
  font-size: var(--page-mcp-405-title-font-size);
56
82
  line-height: var(--page-mcp-405-title-line-height);
@@ -0,0 +1,128 @@
1
+ import React from 'react';
2
+ import styled, { keyframes } from 'styled-components';
3
+
4
+ import type { JSX, PropsWithChildren } from 'react';
5
+
6
+ import { ChevronRightIcon } from '@redocly/theme/icons/ChevronRightIcon/ChevronRightIcon';
7
+ import { ACCORDION_COMPONENT_NAME } from '@redocly/theme/core/constants';
8
+
9
+ export type AccordionProps = {
10
+ title: string;
11
+ expanded?: boolean;
12
+ className?: string;
13
+ 'data-source'?: string;
14
+ 'data-hash'?: string;
15
+ };
16
+
17
+ export function Accordion({
18
+ title,
19
+ expanded = false,
20
+ className,
21
+ children,
22
+ 'data-source': dataSource,
23
+ 'data-hash': dataHash,
24
+ }: PropsWithChildren<AccordionProps>): JSX.Element {
25
+ return (
26
+ <AccordionWrapper
27
+ className={className}
28
+ open={expanded}
29
+ data-component-name={ACCORDION_COMPONENT_NAME}
30
+ data-source={dataSource}
31
+ data-hash={dataHash}
32
+ >
33
+ <AccordionSummary>
34
+ <ChevronRightIcon
35
+ color="--md-accordion-chevron-icon-color"
36
+ size="var(--md-accordion-chevron-icon-size)"
37
+ />
38
+ {title}
39
+ </AccordionSummary>
40
+ <AccordionBody>{children}</AccordionBody>
41
+ </AccordionWrapper>
42
+ );
43
+ }
44
+
45
+ const AccordionWrapper = styled.details`
46
+ margin: var(--md-accordion-margin);
47
+ border: var(--md-accordion-border);
48
+ border-radius: var(--md-accordion-border-radius);
49
+ font-family: var(--md-accordion-font-family);
50
+ overflow: hidden;
51
+
52
+ &[open] > summary svg {
53
+ transform: rotate(90deg);
54
+ }
55
+ `;
56
+
57
+ const AccordionSummary = styled.summary`
58
+ display: flex;
59
+ align-items: center;
60
+ gap: var(--md-accordion-gap);
61
+ cursor: pointer;
62
+ list-style: none;
63
+
64
+ background-color: var(--md-accordion-header-bg-color);
65
+ color: var(--md-accordion-header-text-color);
66
+ font-weight: var(--md-accordion-header-font-weight);
67
+ font-size: var(--md-accordion-header-font-size);
68
+ line-height: var(--md-accordion-header-line-height);
69
+ padding: var(--md-accordion-header-padding);
70
+
71
+ &::-webkit-details-marker {
72
+ display: none;
73
+ }
74
+
75
+ &:hover {
76
+ background-color: var(--md-accordion-header-bg-color-hover);
77
+ }
78
+
79
+ &:focus-visible {
80
+ outline: none;
81
+ position: relative;
82
+
83
+ &::after {
84
+ content: '';
85
+ position: absolute;
86
+ inset: 2px;
87
+ border: 1px solid var(--button-border-color-focused);
88
+ border-radius: calc(var(--md-accordion-border-radius) - 2px);
89
+ pointer-events: none;
90
+ }
91
+ }
92
+
93
+ svg {
94
+ flex-shrink: 0;
95
+ transition: transform 0.15s ease-out;
96
+ }
97
+ `;
98
+
99
+ const showAccordionBody = keyframes`
100
+ 0% {
101
+ opacity: 0;
102
+ transform: translateY(-5px);
103
+ }
104
+ 100% {
105
+ opacity: 1;
106
+ transform: translateY(0);
107
+ }
108
+ `;
109
+
110
+ const AccordionBody = styled.div`
111
+ padding: var(--md-accordion-body-padding);
112
+ background-color: var(--md-accordion-body-bg-color);
113
+ color: var(--md-accordion-body-text-color);
114
+ font-size: var(--md-accordion-body-font-size);
115
+ line-height: var(--md-accordion-body-line-height);
116
+
117
+ details[open] > & {
118
+ animation: ${showAccordionBody} 0.15s ease-out;
119
+ }
120
+
121
+ > :first-child {
122
+ margin-top: 0;
123
+ }
124
+
125
+ > :last-child {
126
+ margin-bottom: 0;
127
+ }
128
+ `;
@@ -0,0 +1,41 @@
1
+ import React from 'react';
2
+ import styled from 'styled-components';
3
+
4
+ import type { JSX, PropsWithChildren } from 'react';
5
+
6
+ import { ACCORDION_GROUP_COMPONENT_NAME, ACCORDION_SELECTOR } from '@redocly/theme/core/constants';
7
+
8
+ export type AccordionGroupProps = {
9
+ className?: string;
10
+ };
11
+
12
+ export function AccordionGroup({
13
+ className,
14
+ children,
15
+ }: PropsWithChildren<AccordionGroupProps>): JSX.Element {
16
+ return (
17
+ <AccordionGroupWrapper
18
+ className={className}
19
+ data-component-name={ACCORDION_GROUP_COMPONENT_NAME}
20
+ >
21
+ {children}
22
+ </AccordionGroupWrapper>
23
+ );
24
+ }
25
+
26
+ const AccordionGroupWrapper = styled.div`
27
+ margin: var(--md-accordion-group-margin);
28
+ border: var(--md-accordion-group-border);
29
+ border-radius: var(--md-accordion-group-border-radius);
30
+ overflow: hidden;
31
+
32
+ & > ${ACCORDION_SELECTOR} {
33
+ margin: 0;
34
+ border: none;
35
+ border-radius: 0;
36
+ }
37
+
38
+ & > ${ACCORDION_SELECTOR} + ${ACCORDION_SELECTOR} {
39
+ border-top: var(--md-accordion-group-divider);
40
+ }
41
+ `;
@@ -0,0 +1,37 @@
1
+ import { css } from 'styled-components';
2
+
3
+ export const markdownAccordion = css`
4
+ /**
5
+ * @tokens Markdown Accordion
6
+ */
7
+
8
+ --md-accordion-group-margin: var(--spacing-base) 0; // @presenter Spacing
9
+ --md-accordion-group-border: 1px solid var(--border-color-secondary); // @presenter Border
10
+ --md-accordion-group-border-radius: var(--border-radius-xl); // @presenter BorderRadius
11
+ --md-accordion-group-divider: 1px solid var(--border-color-secondary); // @presenter Border
12
+
13
+ --md-accordion-margin: var(--spacing-base) 0; // @presenter Spacing
14
+ --md-accordion-border: 1px solid var(--border-color-secondary); // @presenter Border
15
+ --md-accordion-border-radius: var(--border-radius-xl); // @presenter BorderRadius
16
+ --md-accordion-gap: var(--spacing-xs); // @presenter Spacing
17
+ --md-accordion-font-family: var(--font-family-base); // @presenter FontFamily
18
+
19
+ --md-accordion-chevron-icon-color: var(--text-color-primary); // @presenter Color
20
+ --md-accordion-chevron-icon-size: 16px;
21
+
22
+ --md-accordion-header-bg-color: var(--layer-color); // @presenter Color
23
+ --md-accordion-header-bg-color-hover: var(--layer-color-hover); // @presenter Color
24
+ --md-accordion-header-text-color: var(--text-color-primary); // @presenter Color
25
+ --md-accordion-header-font-weight: var(--font-weight-semibold); // @presenter FontWeight
26
+ --md-accordion-header-line-height: var(--line-height-lg); // @presenter LineHeight
27
+ --md-accordion-header-font-size: var(--font-size-lg); // @presenter FontSize
28
+ --md-accordion-header-padding: var(--spacing-sm) var(--spacing-md); // @presenter Spacing
29
+
30
+ --md-accordion-body-bg-color: var(--bg-color); // @presenter Color
31
+ --md-accordion-body-text-color: var(--text-color-primary); // @presenter Color
32
+ --md-accordion-body-font-size: var(--font-size-base); // @presenter FontSize
33
+ --md-accordion-body-line-height: var(--line-height-base); // @presenter LineHeight
34
+ --md-accordion-body-padding: var(--spacing-sm) var(--spacing-md) var(--spacing-md); // @presenter Spacing
35
+
36
+ // @tokens End
37
+ `;