@redocly/theme 0.59.0-rc.1 → 0.59.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 (195) hide show
  1. package/LICENSE +7 -1
  2. package/lib/components/Buttons/AIAssistantButton.js +6 -2
  3. package/lib/components/Buttons/ConnectMCPButton.d.ts +8 -0
  4. package/lib/components/Buttons/ConnectMCPButton.js +145 -0
  5. package/lib/components/Buttons/variables.d.ts +1 -0
  6. package/lib/components/Buttons/variables.js +42 -2
  7. package/lib/components/Catalog/CatalogEntity/CatalogEntityInfoBar.js +1 -0
  8. package/lib/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityApiDescriptionRelations.js +1 -1
  9. package/lib/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityTeamRelations.js +1 -1
  10. package/lib/components/Catalog/CatalogEntityIcon.js +2 -1
  11. package/lib/components/Catalog/CatalogFilter/CatalogFilter.js +4 -0
  12. package/lib/components/Catalog/CatalogTagsWithTooltip.js +1 -1
  13. package/lib/components/Catalog/variables.js +1 -1
  14. package/lib/components/Dropdown/Dropdown.d.ts +16 -2
  15. package/lib/components/Dropdown/Dropdown.js +5 -5
  16. package/lib/components/Menu/MenuItem.js +1 -1
  17. package/lib/components/Navbar/NavbarItem.js +3 -3
  18. package/lib/components/PageActions/PageActions.js +4 -1
  19. package/lib/components/PageActions/variables.js +2 -0
  20. package/lib/components/Search/FilterFields/SearchFilterFieldTags.js +1 -2
  21. package/lib/components/Search/SearchAiActionButtons.d.ts +10 -0
  22. package/lib/components/Search/SearchAiActionButtons.js +43 -0
  23. package/lib/components/Search/SearchAiConversationInput.d.ts +3 -1
  24. package/lib/components/Search/SearchAiConversationInput.js +39 -7
  25. package/lib/components/Search/SearchAiDialog.d.ts +3 -6
  26. package/lib/components/Search/SearchAiDialog.js +20 -9
  27. package/lib/components/Search/SearchAiMessage.d.ts +9 -5
  28. package/lib/components/Search/SearchAiMessage.js +146 -22
  29. package/lib/components/Search/SearchAiNegativeFeedbackForm.d.ts +8 -0
  30. package/lib/components/Search/SearchAiNegativeFeedbackForm.js +169 -0
  31. package/lib/components/Search/SearchDialog.js +36 -5
  32. package/lib/components/Search/SearchGroups.js +2 -2
  33. package/lib/components/Search/variables.js +36 -64
  34. package/lib/components/Segmented/Segmented.d.ts +1 -8
  35. package/lib/components/Segmented/Segmented.js +3 -1
  36. package/lib/components/Select/SelectInput.js +1 -1
  37. package/lib/components/Select/variables.js +2 -2
  38. package/lib/components/Tag/Tag.d.ts +2 -1
  39. package/lib/components/Tag/Tag.js +66 -17
  40. package/lib/components/Tag/variables.dark.js +135 -36
  41. package/lib/components/Tag/variables.js +78 -61
  42. package/lib/core/constants/index.d.ts +1 -0
  43. package/lib/core/constants/index.js +1 -0
  44. package/lib/core/constants/mcp.d.ts +1 -0
  45. package/lib/core/constants/mcp.js +5 -0
  46. package/lib/core/constants/search.d.ts +5 -4
  47. package/lib/core/constants/search.js +4 -5
  48. package/lib/core/hooks/index.d.ts +3 -0
  49. package/lib/core/hooks/index.js +3 -0
  50. package/lib/core/hooks/menu/use-nested-menu.js +1 -1
  51. package/lib/core/hooks/search/use-feedback-tooltip.d.ts +6 -0
  52. package/lib/core/hooks/search/use-feedback-tooltip.js +26 -0
  53. package/lib/core/hooks/use-connect-mcp-button.d.ts +13 -0
  54. package/lib/core/hooks/use-connect-mcp-button.js +50 -0
  55. package/lib/core/hooks/use-mcp-config.d.ts +9 -0
  56. package/lib/core/hooks/use-mcp-config.js +27 -0
  57. package/lib/core/hooks/use-page-actions.d.ts +1 -1
  58. package/lib/core/hooks/use-page-actions.js +98 -95
  59. package/lib/core/hooks/use-product-picker.js +2 -1
  60. package/lib/core/hooks/use-tabs.d.ts +3 -2
  61. package/lib/core/hooks/use-tabs.js +115 -57
  62. package/lib/core/hooks/use-telemetry-fallback.d.ts +10 -8
  63. package/lib/core/hooks/use-telemetry-fallback.js +10 -8
  64. package/lib/core/openapi/index.d.ts +1 -0
  65. package/lib/core/styles/dark.js +4 -0
  66. package/lib/core/styles/global.js +5 -0
  67. package/lib/core/types/hooks.d.ts +2 -2
  68. package/lib/core/types/index.d.ts +1 -0
  69. package/lib/core/types/index.js +1 -0
  70. package/lib/core/types/l10n.d.ts +1 -1
  71. package/lib/core/types/mcp.d.ts +6 -0
  72. package/lib/core/types/mcp.js +3 -0
  73. package/lib/core/types/search.d.ts +11 -4
  74. package/lib/core/types/search.js +6 -0
  75. package/lib/core/types/segmented.d.ts +12 -0
  76. package/lib/core/types/segmented.js +3 -0
  77. package/lib/core/utils/frontmatter-translate.d.ts +6 -0
  78. package/lib/core/utils/frontmatter-translate.js +14 -0
  79. package/lib/core/utils/index.d.ts +2 -0
  80. package/lib/core/utils/index.js +2 -0
  81. package/lib/core/utils/mcp.d.ts +2 -0
  82. package/lib/core/utils/mcp.js +31 -0
  83. package/lib/icons/AiStarsGradientIcon/AiStarsGradientIcon.js +44 -4
  84. package/lib/icons/AiStarsIcon/AiStarsIcon.js +11 -2
  85. package/lib/icons/ConnectIcon/ConnectIcon.d.ts +9 -0
  86. package/lib/icons/ConnectIcon/ConnectIcon.js +17 -0
  87. package/lib/icons/CubeIcon/CubeIcon.d.ts +9 -0
  88. package/lib/icons/CubeIcon/CubeIcon.js +17 -0
  89. package/lib/icons/HashtagIcon/HashtagIcon.d.ts +9 -0
  90. package/lib/icons/HashtagIcon/HashtagIcon.js +22 -0
  91. package/lib/icons/RedoclyIcon/RedoclyIcon.js +4 -7
  92. package/lib/icons/ThumbDownFilledIcon/ThumbDownFilledIcon.d.ts +9 -0
  93. package/lib/icons/ThumbDownFilledIcon/ThumbDownFilledIcon.js +34 -0
  94. package/lib/icons/ThumbUpFilledIcon/ThumbUpFilledIcon.d.ts +9 -0
  95. package/lib/icons/ThumbUpFilledIcon/ThumbUpFilledIcon.js +34 -0
  96. package/lib/icons/VSCodeIcon/VSCodeIcon.d.ts +9 -0
  97. package/lib/icons/VSCodeIcon/VSCodeIcon.js +17 -0
  98. package/lib/index.d.ts +1 -2
  99. package/lib/index.js +1 -2
  100. package/lib/markdoc/components/Cards/Card.js +1 -28
  101. package/lib/markdoc/components/ConnectMCP/ConnectMCP.d.ts +8 -0
  102. package/lib/markdoc/components/ConnectMCP/ConnectMCP.js +19 -0
  103. package/lib/markdoc/components/Tabs/TabList.d.ts +3 -1
  104. package/lib/markdoc/components/Tabs/TabList.js +197 -47
  105. package/lib/markdoc/components/Tabs/Tabs.d.ts +2 -1
  106. package/lib/markdoc/components/Tabs/Tabs.js +57 -12
  107. package/lib/markdoc/components/default.d.ts +1 -0
  108. package/lib/markdoc/components/default.js +1 -0
  109. package/lib/markdoc/default.d.ts +6 -0
  110. package/lib/markdoc/default.js +2 -0
  111. package/lib/markdoc/tags/card.js +0 -1
  112. package/lib/markdoc/tags/connect-mcp.d.ts +2 -0
  113. package/lib/markdoc/tags/connect-mcp.js +27 -0
  114. package/package.json +6 -6
  115. package/src/components/Buttons/AIAssistantButton.tsx +6 -2
  116. package/src/components/Buttons/ConnectMCPButton.tsx +180 -0
  117. package/src/components/Buttons/variables.ts +42 -1
  118. package/src/components/Catalog/CatalogEntity/CatalogEntityInfoBar.tsx +1 -0
  119. package/src/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityApiDescriptionRelations.tsx +1 -1
  120. package/src/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityTeamRelations.tsx +1 -1
  121. package/src/components/Catalog/CatalogEntityIcon.tsx +2 -1
  122. package/src/components/Catalog/CatalogFilter/CatalogFilter.tsx +5 -0
  123. package/src/components/Catalog/CatalogTagsWithTooltip.tsx +1 -5
  124. package/src/components/Catalog/variables.ts +1 -1
  125. package/src/components/Dropdown/Dropdown.tsx +84 -79
  126. package/src/components/Menu/MenuItem.tsx +1 -0
  127. package/src/components/Navbar/NavbarItem.tsx +6 -5
  128. package/src/components/PageActions/PageActions.tsx +5 -1
  129. package/src/components/PageActions/variables.ts +2 -0
  130. package/src/components/Search/FilterFields/SearchFilterFieldTags.tsx +3 -3
  131. package/src/components/Search/SearchAiActionButtons.tsx +76 -0
  132. package/src/components/Search/SearchAiConversationInput.tsx +61 -18
  133. package/src/components/Search/SearchAiDialog.tsx +52 -23
  134. package/src/components/Search/SearchAiMessage.tsx +172 -43
  135. package/src/components/Search/SearchAiNegativeFeedbackForm.tsx +210 -0
  136. package/src/components/Search/SearchDialog.tsx +49 -13
  137. package/src/components/Search/SearchGroups.tsx +2 -0
  138. package/src/components/Search/variables.ts +36 -64
  139. package/src/components/Segmented/Segmented.tsx +15 -20
  140. package/src/components/Select/SelectInput.tsx +1 -0
  141. package/src/components/Select/variables.ts +2 -2
  142. package/src/components/Tag/Tag.tsx +35 -19
  143. package/src/components/Tag/variables.dark.ts +135 -36
  144. package/src/components/Tag/variables.ts +78 -61
  145. package/src/core/constants/index.ts +1 -0
  146. package/src/core/constants/mcp.ts +1 -0
  147. package/src/core/constants/search.ts +8 -4
  148. package/src/core/hooks/index.ts +3 -0
  149. package/src/core/hooks/menu/use-nested-menu.ts +2 -2
  150. package/src/core/hooks/search/use-feedback-tooltip.ts +32 -0
  151. package/src/core/hooks/use-connect-mcp-button.ts +79 -0
  152. package/src/core/hooks/use-mcp-config.ts +43 -0
  153. package/src/core/hooks/use-page-actions.ts +148 -126
  154. package/src/core/hooks/use-product-picker.ts +2 -1
  155. package/src/core/hooks/use-tabs.ts +168 -86
  156. package/src/core/hooks/use-telemetry-fallback.ts +10 -8
  157. package/src/core/openapi/index.ts +1 -0
  158. package/src/core/styles/dark.ts +4 -0
  159. package/src/core/styles/global.ts +6 -1
  160. package/src/core/types/hooks.ts +5 -1
  161. package/src/core/types/index.ts +1 -0
  162. package/src/core/types/l10n.ts +13 -0
  163. package/src/core/types/mcp.ts +8 -0
  164. package/src/core/types/search.ts +13 -4
  165. package/src/core/types/segmented.ts +14 -0
  166. package/src/core/utils/frontmatter-translate.ts +9 -0
  167. package/src/core/utils/index.ts +2 -0
  168. package/src/core/utils/mcp.ts +34 -0
  169. package/src/icons/AiStarsGradientIcon/AiStarsGradientIcon.tsx +13 -4
  170. package/src/icons/AiStarsIcon/AiStarsIcon.tsx +11 -2
  171. package/src/icons/ConnectIcon/ConnectIcon.tsx +27 -0
  172. package/src/icons/CubeIcon/CubeIcon.tsx +27 -0
  173. package/src/icons/HashtagIcon/HashtagIcon.tsx +23 -0
  174. package/src/icons/RedoclyIcon/RedoclyIcon.tsx +4 -22
  175. package/src/icons/ThumbDownFilledIcon/ThumbDownFilledIcon.tsx +38 -0
  176. package/src/icons/ThumbUpFilledIcon/ThumbUpFilledIcon.tsx +35 -0
  177. package/src/icons/VSCodeIcon/VSCodeIcon.tsx +29 -0
  178. package/src/index.ts +1 -2
  179. package/src/markdoc/components/Cards/Card.tsx +1 -28
  180. package/src/markdoc/components/ConnectMCP/ConnectMCP.tsx +28 -0
  181. package/src/markdoc/components/Tabs/TabList.tsx +312 -105
  182. package/src/markdoc/components/Tabs/Tabs.tsx +136 -11
  183. package/src/markdoc/components/default.ts +1 -0
  184. package/src/markdoc/default.ts +2 -0
  185. package/src/markdoc/tags/card.ts +0 -1
  186. package/src/markdoc/tags/connect-mcp.ts +25 -0
  187. package/lib/components/OpenApiDocs/hooks/AdditionalOverviewInfo.d.ts +0 -1
  188. package/lib/components/OpenApiDocs/hooks/AdditionalOverviewInfo.js +0 -11
  189. package/lib/components/OpenApiDocs/hooks/AfterOpenApiDescription.d.ts +0 -1
  190. package/lib/components/OpenApiDocs/hooks/AfterOpenApiDescription.js +0 -5
  191. package/lib/ext/process-scorecard.d.ts +0 -5
  192. package/lib/ext/process-scorecard.js +0 -11
  193. package/src/components/OpenApiDocs/hooks/AdditionalOverviewInfo.tsx +0 -9
  194. package/src/components/OpenApiDocs/hooks/AfterOpenApiDescription.tsx +0 -1
  195. package/src/ext/process-scorecard.ts +0 -13
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import type { IconProps } from '../../icons/types';
3
+ export declare const ThumbUpFilledIcon: import("styled-components").StyledComponent<(props: IconProps) => React.JSX.Element, any, {
4
+ 'data-component-name': string;
5
+ } & {
6
+ color?: string;
7
+ size?: string;
8
+ className?: string;
9
+ } & React.SVGProps<SVGSVGElement>, "data-component-name">;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ var __rest = (this && this.__rest) || function (s, e) {
3
+ var t = {};
4
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
+ t[p] = s[p];
6
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
+ t[p[i]] = s[p[i]];
10
+ }
11
+ return t;
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.ThumbUpFilledIcon = void 0;
18
+ const react_1 = __importDefault(require("react"));
19
+ const styled_components_1 = __importDefault(require("styled-components"));
20
+ const utils_1 = require("../../core/utils");
21
+ const Icon = (props) => {
22
+ const { color } = props, restProps = __rest(props, ["color"]);
23
+ return (react_1.default.createElement("svg", Object.assign({ width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, restProps),
24
+ react_1.default.createElement("path", { d: "M3.0625 7H0.875V13.125H3.0625V7Z", fill: (0, utils_1.getCssColorVariable)(color) || '#DCDDE5' }),
25
+ react_1.default.createElement("path", { d: "M10.0625 13.125H3.9375V6.64882L5.26846 4.65229L5.63828 2.06382C5.66886 1.85567 5.77308 1.66539 5.932 1.52753C6.09092 1.38967 6.29402 1.31338 6.5044 1.3125H6.5625C6.91048 1.31288 7.2441 1.45129 7.49016 1.69734C7.73621 1.9434 7.87462 2.27702 7.875 2.625V5.25H11.375C11.839 5.25052 12.2838 5.43506 12.6119 5.76314C12.9399 6.09121 13.1245 6.53603 13.125 7V10.0625C13.1241 10.8744 12.8012 11.6529 12.227 12.227C11.6529 12.8012 10.8744 13.1241 10.0625 13.125Z", fill: (0, utils_1.getCssColorVariable)(color) || '#DCDDE5' })));
26
+ };
27
+ exports.ThumbUpFilledIcon = (0, styled_components_1.default)(Icon).attrs(() => ({
28
+ 'data-component-name': 'icons/ThumbUpFilledIcon/ThumbUpFilledIcon',
29
+ })) `
30
+ height: ${({ size }) => size || '14px'};
31
+ width: ${({ size }) => size || '14px'};
32
+ color: ${({ color }) => color && (0, utils_1.getCssColorVariable)(color)};
33
+ `;
34
+ //# sourceMappingURL=ThumbUpFilledIcon.js.map
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import type { IconProps } from '../../icons/types';
3
+ export declare const VSCodeIcon: import("styled-components").StyledComponent<(props: IconProps) => React.JSX.Element, any, {
4
+ 'data-component-name': string;
5
+ } & {
6
+ color?: string;
7
+ size?: string;
8
+ className?: string;
9
+ } & React.SVGProps<SVGSVGElement>, "data-component-name">;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.VSCodeIcon = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const styled_components_1 = __importDefault(require("styled-components"));
9
+ const Icon = (props) => (react_1.default.createElement("svg", Object.assign({ width: "16", height: "16", viewBox: "0 0 100 100", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, props),
10
+ react_1.default.createElement("path", { clipRule: "evenodd", d: "m70.9119 99.3171c1.575.6136 3.3709.5743 4.9606-.1907l20.5883-9.9067c2.1634-1.041 3.5392-3.2305 3.5392-5.6325v-67.1739c0-2.402-1.3757-4.5915-3.5391-5.6325l-20.5884-9.907044c-2.0863-1.003885-4.5279-.757996-6.359.573194-.2615.19016-.5107.40248-.7445.63646l-39.4139 35.95809-17.1679-13.0319c-1.5982-1.2131-3.83357-1.1137-5.31787.2365l-5.5063 5.0088c-1.815582 1.6515-1.817663 4.5078-.0045 6.1621l14.88857 13.5831-14.88857 13.5831c-1.813163 1.6542-1.811082 4.5106.0045 6.1621l5.5063 5.0088c1.4843 1.3502 3.71967 1.4496 5.31787.2364l17.1679-13.0318 39.4139 35.958c.6235.6239 1.3556 1.0937 2.1429 1.4004zm4.1033-72.0182-29.9061 22.7012 29.9061 22.7011z", fill: "currentColor", fillRule: "evenodd" })));
11
+ exports.VSCodeIcon = (0, styled_components_1.default)(Icon).attrs(() => ({
12
+ 'data-component-name': 'icons/VSCodeIcon/VSCodeIcon',
13
+ })) `
14
+ height: ${({ size }) => size || '16px'};
15
+ width: ${({ size }) => size || '16px'};
16
+ `;
17
+ //# sourceMappingURL=VSCodeIcon.js.map
package/lib/index.d.ts CHANGED
@@ -78,11 +78,9 @@ export * from './components/UserMenu/UserMenuMobile';
78
78
  export * from './components/Sidebar/Sidebar';
79
79
  export * from './components/OpenApiDocs/hooks/AfterOpenApiOperation';
80
80
  export * from './components/OpenApiDocs/hooks/AfterOpenApiTitle';
81
- export * from './components/OpenApiDocs/hooks/AfterOpenApiDescription';
82
81
  export * from './components/OpenApiDocs/hooks/BeforeOpenApiOperation';
83
82
  export * from './components/OpenApiDocs/hooks/OpenApiFooter';
84
83
  export * from './components/OpenApiDocs/hooks/OpenApiHeader';
85
- export * from './components/OpenApiDocs/hooks/AdditionalOverviewInfo';
86
84
  export * from './components/SidebarActions/ChangeViewButton';
87
85
  export * from './components/SidebarActions/SidebarActions';
88
86
  export * from './components/SidebarActions/styled';
@@ -263,6 +261,7 @@ export * from './icons/RedoclyIcon/RedoclyIcon';
263
261
  export * from './icons/WorkflowHierarchyIcon/WorkflowHierarchyIcon';
264
262
  export * from './icons/GenericIcon/GenericIcon';
265
263
  export * from './icons/ShareIcon/ShareIcon';
264
+ export * from './icons/HashtagIcon/HashtagIcon';
266
265
  export * from './layouts/RootLayout';
267
266
  export * from './layouts/PageLayout';
268
267
  export * from './layouts/NotFound';
package/lib/index.js CHANGED
@@ -131,11 +131,9 @@ __exportStar(require("./components/Sidebar/Sidebar"), exports);
131
131
  /* OpenApiDocs */
132
132
  __exportStar(require("./components/OpenApiDocs/hooks/AfterOpenApiOperation"), exports);
133
133
  __exportStar(require("./components/OpenApiDocs/hooks/AfterOpenApiTitle"), exports);
134
- __exportStar(require("./components/OpenApiDocs/hooks/AfterOpenApiDescription"), exports);
135
134
  __exportStar(require("./components/OpenApiDocs/hooks/BeforeOpenApiOperation"), exports);
136
135
  __exportStar(require("./components/OpenApiDocs/hooks/OpenApiFooter"), exports);
137
136
  __exportStar(require("./components/OpenApiDocs/hooks/OpenApiHeader"), exports);
138
- __exportStar(require("./components/OpenApiDocs/hooks/AdditionalOverviewInfo"), exports);
139
137
  /* SidebarActions */
140
138
  __exportStar(require("./components/SidebarActions/ChangeViewButton"), exports);
141
139
  __exportStar(require("./components/SidebarActions/SidebarActions"), exports);
@@ -326,6 +324,7 @@ __exportStar(require("./icons/RedoclyIcon/RedoclyIcon"), exports);
326
324
  __exportStar(require("./icons/WorkflowHierarchyIcon/WorkflowHierarchyIcon"), exports);
327
325
  __exportStar(require("./icons/GenericIcon/GenericIcon"), exports);
328
326
  __exportStar(require("./icons/ShareIcon/ShareIcon"), exports);
327
+ __exportStar(require("./icons/HashtagIcon/HashtagIcon"), exports);
329
328
  /* Layouts */
330
329
  __exportStar(require("./layouts/RootLayout"), exports);
331
330
  __exportStar(require("./layouts/PageLayout"), exports);
@@ -43,6 +43,7 @@ const ContentWrapper = styled_components_1.default.div `
43
43
  flex-direction: column;
44
44
  flex-shrink: 1;
45
45
  gap: var(--card-content-gap);
46
+ width: 100%;
46
47
  `;
47
48
  const Title = styled_components_1.default.h3 `
48
49
  margin: var(--card-title-margin);
@@ -82,28 +83,6 @@ const Body = styled_components_1.default.div `
82
83
  > *:last-child {
83
84
  margin-bottom: 0;
84
85
  }
85
-
86
- /* Icon link styles */
87
- & a {
88
- display: inline-flex;
89
- align-items: center;
90
- line-height: 1;
91
-
92
- & svg {
93
- width: 1.2em;
94
- height: 1.2em;
95
- margin-right: 0.25em;
96
- vertical-align: middle;
97
-
98
- & g {
99
- fill: var(--link-color-primary);
100
- }
101
- }
102
- }
103
-
104
- & a:visited > span > svg > g {
105
- fill: var(--link-color-visited);
106
- }
107
86
  `;
108
87
  const CardWrapper = styled_components_1.default.div.attrs(({ $isCardLink, $variant }) => ({
109
88
  className: getCardWrapperClass($isCardLink, $variant),
@@ -149,12 +128,6 @@ const CardWrapper = styled_components_1.default.div.attrs(({ $isCardLink, $varia
149
128
  }
150
129
  }
151
130
  }
152
-
153
- && ul {
154
- list-style: none;
155
- padding-left: 0;
156
- margin: var(--spacing-xs) 0;
157
- }
158
131
  `;
159
132
  const getCardWrapperClass = ($isCardLink, $variant) => {
160
133
  let classes = [];
@@ -0,0 +1,8 @@
1
+ import type { JSX } from 'react';
2
+ import type { MCPOption } from '../../../core/types';
3
+ export type ConnectMCPProps = {
4
+ placement?: 'top' | 'bottom';
5
+ alignment?: 'start' | 'end';
6
+ options?: MCPOption[];
7
+ };
8
+ export declare function ConnectMCP({ placement, alignment, options, }: ConnectMCPProps): JSX.Element | null;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ConnectMCP = ConnectMCP;
7
+ const react_1 = __importDefault(require("react"));
8
+ const ConnectMCPButton_1 = require("../../../components/Buttons/ConnectMCPButton");
9
+ const hooks_1 = require("../../../core/hooks");
10
+ function ConnectMCP({ placement = 'bottom', alignment = 'start', options, }) {
11
+ var _a, _b, _c;
12
+ const themeConfig = (0, hooks_1.useThemeConfig)();
13
+ const isMcpDisabled = ((_a = themeConfig.mcp) === null || _a === void 0 ? void 0 : _a.hide) || ((_c = (_b = themeConfig.mcp) === null || _b === void 0 ? void 0 : _b.docs) === null || _c === void 0 ? void 0 : _c.hide);
14
+ if (isMcpDisabled) {
15
+ return null;
16
+ }
17
+ return react_1.default.createElement(ConnectMCPButton_1.ConnectMCPButton, { placement: placement, alignment: alignment, options: options });
18
+ }
19
+ //# sourceMappingURL=ConnectMCP.js.map
@@ -6,8 +6,10 @@ type TabListProps = {
6
6
  size: TabsSize;
7
7
  activeTab: string;
8
8
  onTabChange: (tab: string) => void;
9
+ containerRef: React.RefObject<HTMLUListElement | null>;
10
+ onReadyChange?: (isReady: boolean) => void;
9
11
  };
10
- export declare function TabList({ childrenArray, size, activeTab, onTabChange, }: TabListProps): JSX.Element;
12
+ export declare function TabList({ childrenArray, size, activeTab, onTabChange, containerRef, onReadyChange, }: TabListProps): JSX.Element;
11
13
  export declare const TabListContainer: import("styled-components").StyledComponent<"ul", any, {}, never>;
12
14
  export declare const TabItem: import("styled-components").StyledComponent<"li", any, {
13
15
  active?: boolean;
@@ -44,47 +44,144 @@ const DropdownMenuItem_1 = require("../../../components/Dropdown/DropdownMenuIte
44
44
  const Button_1 = require("../../../components/Button/Button");
45
45
  const hooks_1 = require("../../../core/hooks");
46
46
  const utils_1 = require("../../../core/utils");
47
- function TabList({ childrenArray, size, activeTab, onTabChange, }) {
48
- const tabsContainerRef = (0, react_1.useRef)(null);
49
- const { allTabsHidden, overflowTabs, visibleTabs, handleKeyboard, onTabClick, setTabRef } = (0, hooks_1.useTabs)({
47
+ /**
48
+ * Calculates optimal dropdown position relative to viewport to ensure visibility.
49
+ * Positions below the button by default, but moves above if insufficient space.
50
+ * Adjusts horizontal position to prevent overflow off screen edges.
51
+ */
52
+ const calculateDropdownPosition = (buttonRect, dropdownRect) => {
53
+ const gap = 4;
54
+ const margin = 16;
55
+ const spaceBelow = window.innerHeight - buttonRect.bottom;
56
+ const spaceAbove = buttonRect.top;
57
+ // Position below button, or above if dropdown doesn't fit below
58
+ const top = spaceBelow < dropdownRect.height + gap && spaceAbove > spaceBelow
59
+ ? buttonRect.top - gap
60
+ : buttonRect.bottom + gap;
61
+ // Align with button left edge, adjust if overflows screen
62
+ const idealLeft = buttonRect.left;
63
+ const rightEdge = idealLeft + dropdownRect.width;
64
+ const overflowsRight = rightEdge > window.innerWidth - margin;
65
+ const left = overflowsRight
66
+ ? window.innerWidth - dropdownRect.width - margin
67
+ : Math.max(margin, idealLeft);
68
+ return { top, left };
69
+ };
70
+ /**
71
+ * Manages dropdown positioning and updates on scroll/resize events for TabList.
72
+ */
73
+ const useDropdownPosition = (hasOverflow, dropdownRef) => {
74
+ const [dropdownPosition, setDropdownPosition] = (0, react_1.useState)({});
75
+ const [isDropdownOpen, setIsDropdownOpen] = (0, react_1.useState)(false);
76
+ const updateDropdownPosition = (0, react_1.useCallback)(() => {
77
+ if (!dropdownRef.current)
78
+ return;
79
+ const button = dropdownRef.current.querySelector('button');
80
+ const dropdownMenu = dropdownRef.current.querySelector('div:last-child');
81
+ if (!button || !dropdownMenu)
82
+ return;
83
+ const buttonRect = button.getBoundingClientRect();
84
+ const dropdownRect = dropdownMenu.getBoundingClientRect();
85
+ const position = calculateDropdownPosition(buttonRect, dropdownRect);
86
+ setDropdownPosition(position);
87
+ }, [dropdownRef]);
88
+ // Track when dropdown menu appears and recalculate position
89
+ (0, react_1.useEffect)(() => {
90
+ if (!hasOverflow || !isDropdownOpen || !dropdownRef.current)
91
+ return;
92
+ const dropdownMenu = dropdownRef.current.querySelector('div:last-child');
93
+ if (!dropdownMenu)
94
+ return;
95
+ // ResizeObserver tracks both initial render and size changes
96
+ const resizeObserver = new ResizeObserver(() => {
97
+ updateDropdownPosition();
98
+ });
99
+ resizeObserver.observe(dropdownMenu);
100
+ return () => resizeObserver.disconnect();
101
+ }, [hasOverflow, isDropdownOpen, dropdownRef, updateDropdownPosition]);
102
+ // Update position on scroll/resize
103
+ (0, react_1.useEffect)(() => {
104
+ if (!hasOverflow || !isDropdownOpen)
105
+ return;
106
+ window.addEventListener('scroll', updateDropdownPosition, true);
107
+ window.addEventListener('resize', updateDropdownPosition);
108
+ return () => {
109
+ window.removeEventListener('scroll', updateDropdownPosition, true);
110
+ window.removeEventListener('resize', updateDropdownPosition);
111
+ };
112
+ }, [hasOverflow, isDropdownOpen, updateDropdownPosition]);
113
+ return {
114
+ dropdownPosition,
115
+ isDropdownOpen,
116
+ setIsDropdownOpen,
117
+ setDropdownPosition,
118
+ updateDropdownPosition,
119
+ };
120
+ };
121
+ const renderTab = (child, index, size, setTabRef, handleKeyboard, onTabClick) => {
122
+ const { label, icon } = child.props;
123
+ const tabId = (0, utils_1.getTabId)(label, index);
124
+ return (react_1.default.createElement(Tab_1.Tab, { key: `key-${tabId}`, tabId: tabId, label: label, icon: icon, size: size, disabled: child.props.disable, setRef: (el) => setTabRef(el, index), onKeyDown: (event) => handleKeyboard(event, index), onClick: () => {
125
+ var _a, _b;
126
+ (_b = (_a = child.props).onClick) === null || _b === void 0 ? void 0 : _b.call(_a);
127
+ onTabClick(label);
128
+ } }));
129
+ };
130
+ function TabList({ childrenArray, size, activeTab, onTabChange, containerRef, onReadyChange, }) {
131
+ const dropdownRef = (0, react_1.useRef)(null);
132
+ const totalTabs = childrenArray.length;
133
+ const { overflowTabs, visibleTabs, handleKeyboard, onTabClick, setTabRef, isReady } = (0, hooks_1.useTabs)({
50
134
  activeTab,
51
135
  onTabChange,
52
- containerRef: tabsContainerRef,
53
- totalTabs: childrenArray.length,
136
+ containerRef,
137
+ totalTabs,
54
138
  });
139
+ (0, react_1.useEffect)(() => {
140
+ onReadyChange === null || onReadyChange === void 0 ? void 0 : onReadyChange(isReady);
141
+ }, [isReady, onReadyChange]);
55
142
  const { highlightStyle } = useHighlightBarAnimation({
56
143
  activeTab,
57
144
  childrenArray,
58
145
  overflowTabs,
59
- tabsContainerRef,
146
+ tabsContainerRef: containerRef,
60
147
  visibleTabs,
61
148
  });
62
- return (react_1.default.createElement(exports.TabListContainer, { role: "tablist", ref: tabsContainerRef },
149
+ const hasOverflow = overflowTabs.length > 0;
150
+ const isMoreActive = hasOverflow &&
151
+ overflowTabs.some((i) => childrenArray[i] && activeTab === childrenArray[i].props.label);
152
+ // Show as selector when no visible tabs (all tabs in dropdown)
153
+ const showAsSelector = visibleTabs.length === 0 && hasOverflow;
154
+ const { dropdownPosition, setIsDropdownOpen, setDropdownPosition } = useDropdownPosition(hasOverflow, dropdownRef);
155
+ return (react_1.default.createElement(exports.TabListContainer, { role: "tablist", ref: containerRef },
63
156
  react_1.default.createElement(HighlightBar, { size: size, style: highlightStyle },
64
157
  react_1.default.createElement("div", null)),
65
158
  childrenArray.map((child, index) => {
66
- if (!visibleTabs.includes(index))
159
+ // Show all tabs before ready (for measurement), then only visible ones
160
+ const shouldRender = !isReady || visibleTabs.includes(index);
161
+ if (!shouldRender)
67
162
  return null;
68
- const { label, icon } = child.props;
69
- const tabId = (0, utils_1.getTabId)(label, index);
70
- return (react_1.default.createElement(Tab_1.Tab, { key: `key-${tabId}`, tabId: tabId, label: label, icon: icon, size: size, disabled: child.props.disable, setRef: (el) => setTabRef(el, index), onKeyDown: (event) => handleKeyboard(event, index), onClick: () => {
71
- var _a, _b;
72
- (_b = (_a = child.props).onClick) === null || _b === void 0 ? void 0 : _b.call(_a);
73
- onTabClick(label);
74
- } }));
163
+ return renderTab(child, index, size, setTabRef, handleKeyboard, onTabClick);
75
164
  }),
76
- react_1.default.createElement(exports.TabItem, { size: size, active: overflowTabs.some((index) => activeTab === childrenArray[index].props.label), tabIndex: 0 }, overflowTabs.length > 0 && (react_1.default.createElement(Dropdown_1.Dropdown, { trigger: react_1.default.createElement(exports.TabButtonLink, { size: size, className: overflowTabs.some((index) => activeTab === childrenArray[index].props.label)
77
- ? 'active'
78
- : undefined }, allTabsHidden ? activeTab : 'More'), alignment: "start", withArrow: true },
79
- react_1.default.createElement(DropdownMenu_1.DropdownMenu, null, overflowTabs.map((index) => {
80
- const { label } = childrenArray[index].props;
81
- const tabId = (0, utils_1.getTabId)(label, index);
82
- return (react_1.default.createElement(DropdownMenuItem_1.DropdownMenuItem, { key: `more-${tabId}`, active: activeTab === label, onAction: () => {
83
- var _a, _b;
84
- (_b = (_a = childrenArray[index].props).onClick) === null || _b === void 0 ? void 0 : _b.call(_a);
85
- onTabClick(index);
86
- }, disabled: childrenArray[index].props.disable }, label));
87
- })))))));
165
+ hasOverflow && (react_1.default.createElement(exports.TabItem, { size: size, active: isMoreActive || showAsSelector, tabIndex: 0, className: "dropdown-tab" },
166
+ react_1.default.createElement(DropdownWrapper, { "$top": dropdownPosition.top, "$left": dropdownPosition.left, onClickCapture: () => {
167
+ setIsDropdownOpen(true);
168
+ } },
169
+ react_1.default.createElement(FixedPositionDropdown, { ref: dropdownRef, trigger: react_1.default.createElement(exports.TabButtonLink, { size: size, className: isMoreActive || showAsSelector ? 'active' : undefined }, showAsSelector ? react_1.default.createElement(TabButtonText, null, activeTab) : 'More'), alignment: "start", withArrow: true, onClose: () => {
170
+ setIsDropdownOpen(false);
171
+ setDropdownPosition({});
172
+ } },
173
+ react_1.default.createElement(DropdownMenu_1.DropdownMenu, null, overflowTabs.map((index) => {
174
+ const child = childrenArray[index];
175
+ if (!child)
176
+ return null;
177
+ const { label } = child.props;
178
+ const tabId = (0, utils_1.getTabId)(label, index);
179
+ return (react_1.default.createElement(DropdownMenuItem_1.DropdownMenuItem, { key: `more-${tabId}`, active: activeTab === label, onAction: () => {
180
+ var _a, _b;
181
+ (_b = (_a = child.props).onClick) === null || _b === void 0 ? void 0 : _b.call(_a);
182
+ onTabClick(index);
183
+ }, disabled: child.props.disable }, label));
184
+ }))))))));
88
185
  }
89
186
  const useHighlightBarAnimation = (props) => {
90
187
  const { childrenArray, activeTab, tabsContainerRef, visibleTabs, overflowTabs } = props;
@@ -99,18 +196,11 @@ const useHighlightBarAnimation = (props) => {
99
196
  setHighlightStyle({ left: 0, width: 0 });
100
197
  return;
101
198
  }
102
- const activeTabElement = container.querySelector(`[data-label="${activeTab}"]`);
103
- if (!activeTabElement)
104
- return;
199
+ // Remove active class from all tabs first
105
200
  container.querySelectorAll('[data-label]').forEach((el) => {
106
201
  el.classList.remove('active');
107
202
  });
108
- const { offsetLeft, offsetWidth } = activeTabElement;
109
- if (visibleTabs.includes(activeIndex)) {
110
- activeTabElement.classList.add('active');
111
- setHighlightStyle({ left: offsetLeft, width: offsetWidth });
112
- return;
113
- }
203
+ // Check if active tab is in overflow first
114
204
  if (overflowTabs.includes(activeIndex)) {
115
205
  const moreButton = container.querySelector('button');
116
206
  if (!moreButton)
@@ -123,6 +213,16 @@ const useHighlightBarAnimation = (props) => {
123
213
  });
124
214
  return;
125
215
  }
216
+ // Active tab is visible, find its element
217
+ const activeTabElement = container.querySelector(`[data-label="${activeTab}"]`);
218
+ if (!activeTabElement)
219
+ return;
220
+ const { offsetLeft, offsetWidth } = activeTabElement;
221
+ if (visibleTabs.includes(activeIndex)) {
222
+ activeTabElement.classList.add('active');
223
+ setHighlightStyle({ left: offsetLeft, width: offsetWidth });
224
+ return;
225
+ }
126
226
  }, [activeTab, childrenArray, visibleTabs, overflowTabs, tabsContainerRef]);
127
227
  return { highlightStyle };
128
228
  };
@@ -132,15 +232,11 @@ exports.TabListContainer = styled_components_1.default.ul `
132
232
  gap: var(--md-tabs-gap);
133
233
  width: 100%;
134
234
  min-width: 0;
135
- position: relative;
136
235
 
137
236
  &::before {
138
237
  content: '';
139
238
  position: absolute;
140
- top: 0px;
141
- left: 0px;
142
- right: 0px;
143
- bottom: 0px;
239
+ inset: 0;
144
240
  border: var(--md-tabs-border);
145
241
  border-width: var(--md-tabs-border-width);
146
242
  pointer-events: none;
@@ -148,11 +244,17 @@ exports.TabListContainer = styled_components_1.default.ul `
148
244
 
149
245
  && {
150
246
  padding: var(--md-tabs-padding);
151
- margin-block-end: 0;
152
247
  margin: 0;
153
248
 
154
249
  & > li {
155
- margin-bottom: 0px;
250
+ margin-bottom: 0;
251
+ flex-shrink: 0;
252
+
253
+ &.dropdown-tab {
254
+ flex-shrink: 1;
255
+ min-width: 0;
256
+ max-width: 100%;
257
+ }
156
258
  }
157
259
  }
158
260
  `;
@@ -162,7 +264,7 @@ exports.TabItem = styled_components_1.default.li `
162
264
  cursor: pointer;
163
265
  align-items: center;
164
266
  padding: var(--md-tabs-tab-wrapper-padding);
165
- z-index: 1;
267
+ z-index: var(--z-index-surface);
166
268
 
167
269
  ${({ active, size }) => active
168
270
  ? (0, styled_components_1.css) `
@@ -199,6 +301,46 @@ exports.TabItem = styled_components_1.default.li `
199
301
  }
200
302
  }
201
303
  `;
304
+ const DropdownWrapper = styled_components_1.default.div.attrs((props) => ({
305
+ style: Object.assign(Object.assign({}, (props.$top !== undefined && { '--dropdown-top': `${props.$top}px` })), (props.$left !== undefined && { '--dropdown-left': `${props.$left}px` })),
306
+ })) `
307
+ position: static;
308
+ z-index: var(--z-index-raised);
309
+ width: 100%;
310
+ min-width: 0;
311
+ `;
312
+ const FixedPositionDropdown = (0, styled_components_1.default)(Dropdown_1.Dropdown) `
313
+ position: static;
314
+ width: 100%;
315
+ min-width: 0;
316
+
317
+ > div:first-child {
318
+ width: 100%;
319
+ min-width: 0;
320
+ }
321
+
322
+ > div:last-child {
323
+ position: fixed;
324
+ top: var(--dropdown-top, 0);
325
+ left: var(--dropdown-left, 0);
326
+ right: auto;
327
+ bottom: auto;
328
+ transform: none;
329
+ padding-top: 0;
330
+ max-width: min(400px, calc(100vw - 32px));
331
+ max-height: calc(100vh - var(--dropdown-top, 0) - 32px);
332
+ overflow-y: auto;
333
+ z-index: var(--z-index-raised);
334
+
335
+ ul {
336
+ li {
337
+ overflow: hidden;
338
+ text-overflow: ellipsis;
339
+ white-space: nowrap;
340
+ }
341
+ }
342
+ }
343
+ `;
202
344
  const HighlightBar = styled_components_1.default.div `
203
345
  position: absolute;
204
346
  top: 0;
@@ -218,11 +360,19 @@ const HighlightBar = styled_components_1.default.div `
218
360
  border-radius: var(--md-tabs-${({ size }) => size}-active-tab-border-radius);
219
361
  }
220
362
  `;
363
+ const TabButtonText = styled_components_1.default.span `
364
+ overflow: hidden;
365
+ text-overflow: ellipsis;
366
+ white-space: nowrap;
367
+ flex: 1;
368
+ min-width: 0;
369
+ `;
221
370
  exports.TabButtonLink = (0, styled_components_1.default)(Button_1.Button) `
222
371
  color: var(--md-tabs-tab-text-color);
223
372
  font-family: var(--md-tabs-tab-font-family);
224
373
  font-style: var(--md-tabs-tab-font-style);
225
374
  background-color: var(--md-tabs-tab-bg-color);
375
+ width: 100%;
226
376
 
227
377
  transition:
228
378
  background-color 300ms ease-in-out,
@@ -241,9 +391,9 @@ exports.TabButtonLink = (0, styled_components_1.default)(Button_1.Button) `
241
391
 
242
392
  &.active {
243
393
  color: var(--md-tabs-active-tab-text-color);
244
- font-size: var(--md-tabs-${({ size }) => size}-active-tab-font-size);
245
394
  font-family: var(--md-tabs-active-tab-font-family);
246
395
  font-style: var(--md-tabs-active-tab-font-style);
396
+ font-size: var(--md-tabs-${({ size }) => size}-active-tab-font-size);
247
397
  font-weight: var(--md-tabs-${({ size }) => size}-active-tab-font-weight);
248
398
  line-height: var(--md-tabs-${({ size }) => size}-active-tab-line-height);
249
399
  background-color: var(--md-tabs-active-tab-bg-color);
@@ -253,12 +403,12 @@ exports.TabButtonLink = (0, styled_components_1.default)(Button_1.Button) `
253
403
 
254
404
  &:hover {
255
405
  color: var(--md-tabs-hover-tab-text-color);
256
- font-size: var(--md-tabs-${({ size }) => size}-hover-tab-font-size);
257
406
  font-family: var(--md-tabs-hover-tab-font-family);
258
407
  font-style: var(--md-tabs-hover-tab-font-style);
408
+ font-size: var(--md-tabs-${({ size }) => size}-hover-tab-font-size);
259
409
  font-weight: var(--md-tabs-${({ size }) => size}-hover-tab-font-weight);
260
- background-color: var(--md-tabs-hover-tab-bg-color);
261
410
  line-height: var(--md-tabs-${({ size }) => size}-hover-tab-line-height);
411
+ background-color: var(--md-tabs-hover-tab-bg-color);
262
412
  border-radius: var(--md-tabs-${({ size }) => size}-hover-tab-border-radius);
263
413
  padding: var(--md-tabs-${({ size }) => size}-hover-tab-padding);
264
414
  }
@@ -17,7 +17,8 @@ type TabsProps = {
17
17
  className?: string;
18
18
  size: TabsSize;
19
19
  initialTab?: string;
20
+ forceReady?: boolean;
20
21
  };
21
- export declare function Tabs({ id, children, className, size, initialTab: propInitialTab, }: TabsProps): JSX.Element;
22
+ export declare function Tabs({ id, children, className, size, initialTab: propInitialTab, forceReady, }: TabsProps): JSX.Element;
22
23
  export declare const TabContent: import("styled-components").StyledComponent<"div", any, {}, never>;
23
24
  export {};