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

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 (61) hide show
  1. package/lib/components/Buttons/ConnectMCPButton.js +43 -14
  2. package/lib/components/MCP/McpConnectionTabs.d.ts +7 -0
  3. package/lib/components/MCP/McpConnectionTabs.js +151 -0
  4. package/lib/components/Markdown/Markdown.js +1 -1
  5. package/lib/core/constants/accordion.d.ts +3 -0
  6. package/lib/core/constants/accordion.js +7 -0
  7. package/lib/core/constants/index.d.ts +1 -0
  8. package/lib/core/constants/index.js +1 -0
  9. package/lib/core/constants/mcp.d.ts +2 -0
  10. package/lib/core/constants/mcp.js +8 -1
  11. package/lib/core/hooks/use-active-section-id.js +3 -1
  12. package/lib/core/hooks/use-connect-mcp-button.d.ts +1 -1
  13. package/lib/core/hooks/use-connect-mcp-button.js +16 -13
  14. package/lib/core/styles/global.js +46 -39
  15. package/lib/core/types/catalog.d.ts +2 -0
  16. package/lib/core/types/l10n.d.ts +1 -1
  17. package/lib/core/types/mcp.d.ts +1 -1
  18. package/lib/core/utils/mcp.d.ts +5 -0
  19. package/lib/core/utils/mcp.js +35 -0
  20. package/lib/icons/CodexIcon/CodexIcon.d.ts +25 -0
  21. package/lib/icons/CodexIcon/CodexIcon.js +22 -0
  22. package/lib/layouts/McpNotAllowed.js +5 -3
  23. package/lib/markdoc/components/Accordion/Accordion.d.ts +9 -0
  24. package/lib/markdoc/components/Accordion/Accordion.js +132 -0
  25. package/lib/markdoc/components/Accordion/AccordionGroup.d.ts +5 -0
  26. package/lib/markdoc/components/Accordion/AccordionGroup.js +29 -0
  27. package/lib/markdoc/components/Accordion/variables.d.ts +1 -0
  28. package/lib/markdoc/components/Accordion/variables.js +40 -0
  29. package/lib/markdoc/components/default.d.ts +2 -0
  30. package/lib/markdoc/components/default.js +2 -0
  31. package/lib/markdoc/default.d.ts +4 -0
  32. package/lib/markdoc/default.js +4 -0
  33. package/lib/markdoc/tags/accordion-group.d.ts +2 -0
  34. package/lib/markdoc/tags/accordion-group.js +10 -0
  35. package/lib/markdoc/tags/accordion.d.ts +2 -0
  36. package/lib/markdoc/tags/accordion.js +14 -0
  37. package/lib/markdoc/tags/connect-mcp.js +2 -1
  38. package/package.json +2 -2
  39. package/src/components/Buttons/ConnectMCPButton.tsx +44 -14
  40. package/src/components/MCP/McpConnectionTabs.tsx +263 -0
  41. package/src/components/Markdown/Markdown.tsx +2 -1
  42. package/src/core/constants/accordion.ts +4 -0
  43. package/src/core/constants/index.ts +1 -0
  44. package/src/core/constants/mcp.ts +10 -0
  45. package/src/core/hooks/use-active-section-id.ts +3 -1
  46. package/src/core/hooks/use-connect-mcp-button.ts +23 -15
  47. package/src/core/styles/global.ts +8 -1
  48. package/src/core/types/catalog.ts +3 -0
  49. package/src/core/types/l10n.ts +17 -0
  50. package/src/core/types/mcp.ts +1 -1
  51. package/src/core/utils/mcp.ts +39 -0
  52. package/src/icons/CodexIcon/CodexIcon.tsx +23 -0
  53. package/src/layouts/McpNotAllowed.tsx +4 -2
  54. package/src/markdoc/components/Accordion/Accordion.tsx +128 -0
  55. package/src/markdoc/components/Accordion/AccordionGroup.tsx +41 -0
  56. package/src/markdoc/components/Accordion/variables.ts +37 -0
  57. package/src/markdoc/components/default.ts +2 -0
  58. package/src/markdoc/default.ts +4 -0
  59. package/src/markdoc/tags/accordion-group.ts +8 -0
  60. package/src/markdoc/tags/accordion.ts +12 -0
  61. package/src/markdoc/tags/connect-mcp.ts +3 -1
@@ -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
+ `;
@@ -5,6 +5,7 @@ import type { JSX } from 'react';
5
5
 
6
6
  import { useThemeHooks } from '@redocly/theme/core/hooks';
7
7
  import { ConnectMCPButton } from '@redocly/theme/components/Buttons/ConnectMCPButton';
8
+ import { McpConnectionTabs } from '@redocly/theme/components/MCP/McpConnectionTabs';
8
9
 
9
10
  export default function McpNotAllowed(): JSX.Element {
10
11
  const { useTranslate } = useThemeHooks();
@@ -14,17 +15,18 @@ export default function McpNotAllowed(): JSX.Element {
14
15
  <NotAllowedWrapper data-component-name="layouts/McpNotAllowed">
15
16
  <StatusText>405</StatusText>
16
17
  <Title data-translation-key="page.mcpNotAllowed.title">
17
- {translate('page.mcpNotAllowed.title', 'Method not allowed')}
18
+ {translate('page.mcpNotAllowed.title', 'Connect to the MCP server')}
18
19
  </Title>
19
20
  <Description data-translation-key="page.mcpNotAllowed.description">
20
21
  {translate(
21
22
  'page.mcpNotAllowed.description',
22
- 'To use this MCP server, register it in your MCP Client (for example: VS Code, Cursor, or Claude Code).',
23
+ 'To use this MCP server, register it in your MCP client (for example: VS Code, Cursor, or Claude Code).',
23
24
  )}
24
25
  </Description>
25
26
  <ButtonWrapper>
26
27
  <ConnectMCPButton alignment="start" />
27
28
  </ButtonWrapper>
29
+ <McpConnectionTabs />
28
30
  </NotAllowedWrapper>
29
31
  );
30
32
  }
@@ -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
+ `;
@@ -1,3 +1,5 @@
1
+ export * from '@redocly/theme/markdoc/components/Accordion/Accordion';
2
+ export * from '@redocly/theme/markdoc/components/Accordion/AccordionGroup';
1
3
  export * from '@redocly/theme/markdoc/components/Admonition/Admonition';
2
4
  export * from '@redocly/theme/markdoc/components/InlineSvg/InlineSvg';
3
5
  export * from '@redocly/theme/markdoc/components/MarkdocExample/MarkdocExample';
@@ -8,6 +8,8 @@ export * from '@redocly/theme/markdoc/attributes/svg-content';
8
8
  /* Components */
9
9
  export * as components from '@redocly/theme/markdoc/components/default';
10
10
  /* Tags */
11
+ import { accordion } from '@redocly/theme/markdoc/tags/accordion';
12
+ import { accordionGroup } from '@redocly/theme/markdoc/tags/accordion-group';
11
13
  import { admonition } from '@redocly/theme/markdoc/tags/admonition';
12
14
  import { html } from '@redocly/theme/markdoc/tags/html';
13
15
  import { markdocExample } from '@redocly/theme/markdoc/tags/markdoc-example';
@@ -33,6 +35,8 @@ import { loginButton } from '@redocly/theme/markdoc/tags/login-button';
33
35
  import { diagram } from '@redocly/theme/markdoc/tags/diagram';
34
36
 
35
37
  export const tags = {
38
+ [accordion.tagName]: accordion.schema,
39
+ [accordionGroup.tagName]: accordionGroup.schema,
36
40
  [admonition.tagName]: admonition.schema,
37
41
  [debug.tagName]: debug.schema,
38
42
  [html.tagName]: html.schema,
@@ -0,0 +1,8 @@
1
+ import type { MarkdocSchemaWrapper } from '@redocly/theme/markdoc/tags/types';
2
+
3
+ export const accordionGroup: MarkdocSchemaWrapper = {
4
+ schema: {
5
+ render: 'AccordionGroup',
6
+ },
7
+ tagName: 'accordion-group',
8
+ };
@@ -0,0 +1,12 @@
1
+ import type { MarkdocSchemaWrapper } from '@redocly/theme/markdoc/tags/types';
2
+
3
+ export const accordion: MarkdocSchemaWrapper = {
4
+ schema: {
5
+ render: 'Accordion',
6
+ attributes: {
7
+ title: { type: String, required: true },
8
+ expanded: { type: Boolean, default: false },
9
+ },
10
+ },
11
+ tagName: 'accordion',
12
+ };
@@ -1,5 +1,7 @@
1
1
  import type { MarkdocSchemaWrapper } from '@redocly/theme/markdoc/tags/types';
2
2
 
3
+ import { DEFAULT_MCP_OPTIONS } from '@redocly/theme/core/constants';
4
+
3
5
  export const connectMcp: MarkdocSchemaWrapper = {
4
6
  schema: {
5
7
  render: 'ConnectMCP',
@@ -16,7 +18,7 @@ export const connectMcp: MarkdocSchemaWrapper = {
16
18
  },
17
19
  options: {
18
20
  type: Array,
19
- default: ['cursor', 'vscode', 'copy'],
21
+ default: DEFAULT_MCP_OPTIONS,
20
22
  },
21
23
  },
22
24
  selfClosing: true,