@redocly/theme 0.59.0-rc.2 → 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.
- package/LICENSE +7 -1
- package/lib/components/Buttons/AIAssistantButton.js +6 -2
- package/lib/components/Buttons/ConnectMCPButton.d.ts +8 -0
- package/lib/components/Buttons/ConnectMCPButton.js +145 -0
- package/lib/components/Buttons/variables.d.ts +1 -0
- package/lib/components/Buttons/variables.js +42 -2
- package/lib/components/Catalog/CatalogEntity/CatalogEntityInfoBar.js +1 -0
- package/lib/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityApiDescriptionRelations.js +1 -1
- package/lib/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityTeamRelations.js +1 -1
- package/lib/components/Catalog/CatalogEntityIcon.js +2 -1
- package/lib/components/Catalog/CatalogFilter/CatalogFilter.js +4 -0
- package/lib/components/Catalog/CatalogTagsWithTooltip.js +1 -1
- package/lib/components/Catalog/variables.js +1 -1
- package/lib/components/Dropdown/Dropdown.d.ts +16 -2
- package/lib/components/Dropdown/Dropdown.js +5 -5
- package/lib/components/Menu/MenuItem.js +1 -1
- package/lib/components/Navbar/NavbarItem.js +3 -3
- package/lib/components/PageActions/PageActions.js +4 -1
- package/lib/components/PageActions/variables.js +2 -0
- package/lib/components/Search/FilterFields/SearchFilterFieldTags.js +1 -2
- package/lib/components/Search/SearchAiActionButtons.d.ts +10 -0
- package/lib/components/Search/SearchAiActionButtons.js +43 -0
- package/lib/components/Search/SearchAiConversationInput.d.ts +3 -1
- package/lib/components/Search/SearchAiConversationInput.js +39 -7
- package/lib/components/Search/SearchAiDialog.d.ts +3 -6
- package/lib/components/Search/SearchAiDialog.js +20 -9
- package/lib/components/Search/SearchAiMessage.d.ts +9 -5
- package/lib/components/Search/SearchAiMessage.js +146 -22
- package/lib/components/Search/SearchAiNegativeFeedbackForm.d.ts +8 -0
- package/lib/components/Search/SearchAiNegativeFeedbackForm.js +169 -0
- package/lib/components/Search/SearchDialog.js +36 -5
- package/lib/components/Search/SearchGroups.js +2 -2
- package/lib/components/Search/variables.js +36 -64
- package/lib/components/Segmented/Segmented.d.ts +1 -8
- package/lib/components/Segmented/Segmented.js +3 -1
- package/lib/components/Select/SelectInput.js +1 -1
- package/lib/components/Select/variables.js +2 -2
- package/lib/components/Tag/Tag.d.ts +2 -1
- package/lib/components/Tag/Tag.js +66 -17
- package/lib/components/Tag/variables.dark.js +135 -36
- package/lib/components/Tag/variables.js +78 -61
- package/lib/core/constants/index.d.ts +1 -0
- package/lib/core/constants/index.js +1 -0
- package/lib/core/constants/mcp.d.ts +1 -0
- package/lib/core/constants/mcp.js +5 -0
- package/lib/core/constants/search.d.ts +5 -4
- package/lib/core/constants/search.js +4 -5
- package/lib/core/hooks/index.d.ts +3 -0
- package/lib/core/hooks/index.js +3 -0
- package/lib/core/hooks/menu/use-nested-menu.js +1 -1
- package/lib/core/hooks/search/use-feedback-tooltip.d.ts +6 -0
- package/lib/core/hooks/search/use-feedback-tooltip.js +26 -0
- package/lib/core/hooks/use-connect-mcp-button.d.ts +13 -0
- package/lib/core/hooks/use-connect-mcp-button.js +50 -0
- package/lib/core/hooks/use-mcp-config.d.ts +9 -0
- package/lib/core/hooks/use-mcp-config.js +27 -0
- package/lib/core/hooks/use-page-actions.d.ts +1 -1
- package/lib/core/hooks/use-page-actions.js +99 -119
- package/lib/core/hooks/use-product-picker.js +2 -1
- package/lib/core/hooks/use-tabs.d.ts +3 -2
- package/lib/core/hooks/use-tabs.js +115 -57
- package/lib/core/hooks/use-telemetry-fallback.d.ts +10 -8
- package/lib/core/hooks/use-telemetry-fallback.js +10 -8
- package/lib/core/openapi/index.d.ts +1 -0
- package/lib/core/styles/dark.js +4 -0
- package/lib/core/styles/global.js +5 -0
- package/lib/core/types/hooks.d.ts +2 -2
- package/lib/core/types/index.d.ts +1 -0
- package/lib/core/types/index.js +1 -0
- package/lib/core/types/l10n.d.ts +1 -1
- package/lib/core/types/mcp.d.ts +6 -0
- package/lib/core/types/mcp.js +3 -0
- package/lib/core/types/search.d.ts +11 -4
- package/lib/core/types/search.js +6 -0
- package/lib/core/types/segmented.d.ts +12 -0
- package/lib/core/types/segmented.js +3 -0
- package/lib/core/utils/frontmatter-translate.d.ts +6 -0
- package/lib/core/utils/frontmatter-translate.js +14 -0
- package/lib/core/utils/index.d.ts +2 -0
- package/lib/core/utils/index.js +2 -0
- package/lib/core/utils/mcp.d.ts +2 -0
- package/lib/core/utils/mcp.js +31 -0
- package/lib/icons/AiStarsGradientIcon/AiStarsGradientIcon.js +44 -4
- package/lib/icons/AiStarsIcon/AiStarsIcon.js +11 -2
- package/lib/icons/ConnectIcon/ConnectIcon.d.ts +9 -0
- package/lib/icons/ConnectIcon/ConnectIcon.js +17 -0
- package/lib/icons/CubeIcon/CubeIcon.d.ts +9 -0
- package/lib/icons/CubeIcon/CubeIcon.js +17 -0
- package/lib/icons/HashtagIcon/HashtagIcon.d.ts +9 -0
- package/lib/icons/HashtagIcon/HashtagIcon.js +22 -0
- package/lib/icons/RedoclyIcon/RedoclyIcon.js +4 -7
- package/lib/icons/ThumbDownFilledIcon/ThumbDownFilledIcon.d.ts +9 -0
- package/lib/icons/ThumbDownFilledIcon/ThumbDownFilledIcon.js +34 -0
- package/lib/icons/ThumbUpFilledIcon/ThumbUpFilledIcon.d.ts +9 -0
- package/lib/icons/ThumbUpFilledIcon/ThumbUpFilledIcon.js +34 -0
- package/lib/icons/VSCodeIcon/VSCodeIcon.d.ts +9 -0
- package/lib/icons/VSCodeIcon/VSCodeIcon.js +17 -0
- package/lib/index.d.ts +1 -2
- package/lib/index.js +1 -2
- package/lib/markdoc/components/Cards/Card.js +1 -28
- package/lib/markdoc/components/ConnectMCP/ConnectMCP.d.ts +8 -0
- package/lib/markdoc/components/ConnectMCP/ConnectMCP.js +19 -0
- package/lib/markdoc/components/Tabs/TabList.d.ts +3 -1
- package/lib/markdoc/components/Tabs/TabList.js +197 -47
- package/lib/markdoc/components/Tabs/Tabs.d.ts +2 -1
- package/lib/markdoc/components/Tabs/Tabs.js +57 -12
- package/lib/markdoc/components/default.d.ts +1 -0
- package/lib/markdoc/components/default.js +1 -0
- package/lib/markdoc/default.d.ts +6 -0
- package/lib/markdoc/default.js +2 -0
- package/lib/markdoc/tags/card.js +0 -1
- package/lib/markdoc/tags/connect-mcp.d.ts +2 -0
- package/lib/markdoc/tags/connect-mcp.js +27 -0
- package/package.json +6 -6
- package/src/components/Buttons/AIAssistantButton.tsx +6 -2
- package/src/components/Buttons/ConnectMCPButton.tsx +180 -0
- package/src/components/Buttons/variables.ts +42 -1
- package/src/components/Catalog/CatalogEntity/CatalogEntityInfoBar.tsx +1 -0
- package/src/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityApiDescriptionRelations.tsx +1 -1
- package/src/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityTeamRelations.tsx +1 -1
- package/src/components/Catalog/CatalogEntityIcon.tsx +2 -1
- package/src/components/Catalog/CatalogFilter/CatalogFilter.tsx +5 -0
- package/src/components/Catalog/CatalogTagsWithTooltip.tsx +1 -5
- package/src/components/Catalog/variables.ts +1 -1
- package/src/components/Dropdown/Dropdown.tsx +84 -79
- package/src/components/Menu/MenuItem.tsx +1 -0
- package/src/components/Navbar/NavbarItem.tsx +6 -5
- package/src/components/PageActions/PageActions.tsx +5 -1
- package/src/components/PageActions/variables.ts +2 -0
- package/src/components/Search/FilterFields/SearchFilterFieldTags.tsx +3 -3
- package/src/components/Search/SearchAiActionButtons.tsx +76 -0
- package/src/components/Search/SearchAiConversationInput.tsx +61 -18
- package/src/components/Search/SearchAiDialog.tsx +52 -23
- package/src/components/Search/SearchAiMessage.tsx +172 -43
- package/src/components/Search/SearchAiNegativeFeedbackForm.tsx +210 -0
- package/src/components/Search/SearchDialog.tsx +49 -13
- package/src/components/Search/SearchGroups.tsx +2 -0
- package/src/components/Search/variables.ts +36 -64
- package/src/components/Segmented/Segmented.tsx +15 -20
- package/src/components/Select/SelectInput.tsx +1 -0
- package/src/components/Select/variables.ts +2 -2
- package/src/components/Tag/Tag.tsx +35 -19
- package/src/components/Tag/variables.dark.ts +135 -36
- package/src/components/Tag/variables.ts +78 -61
- package/src/core/constants/index.ts +1 -0
- package/src/core/constants/mcp.ts +1 -0
- package/src/core/constants/search.ts +8 -4
- package/src/core/hooks/index.ts +3 -0
- package/src/core/hooks/menu/use-nested-menu.ts +2 -2
- package/src/core/hooks/search/use-feedback-tooltip.ts +32 -0
- package/src/core/hooks/use-connect-mcp-button.ts +79 -0
- package/src/core/hooks/use-mcp-config.ts +43 -0
- package/src/core/hooks/use-page-actions.ts +141 -150
- package/src/core/hooks/use-product-picker.ts +2 -1
- package/src/core/hooks/use-tabs.ts +168 -86
- package/src/core/hooks/use-telemetry-fallback.ts +10 -8
- package/src/core/openapi/index.ts +1 -0
- package/src/core/styles/dark.ts +4 -0
- package/src/core/styles/global.ts +6 -1
- package/src/core/types/hooks.ts +5 -1
- package/src/core/types/index.ts +1 -0
- package/src/core/types/l10n.ts +13 -0
- package/src/core/types/mcp.ts +8 -0
- package/src/core/types/search.ts +13 -4
- package/src/core/types/segmented.ts +14 -0
- package/src/core/utils/frontmatter-translate.ts +9 -0
- package/src/core/utils/index.ts +2 -0
- package/src/core/utils/mcp.ts +34 -0
- package/src/icons/AiStarsGradientIcon/AiStarsGradientIcon.tsx +13 -4
- package/src/icons/AiStarsIcon/AiStarsIcon.tsx +11 -2
- package/src/icons/ConnectIcon/ConnectIcon.tsx +27 -0
- package/src/icons/CubeIcon/CubeIcon.tsx +27 -0
- package/src/icons/HashtagIcon/HashtagIcon.tsx +23 -0
- package/src/icons/RedoclyIcon/RedoclyIcon.tsx +4 -22
- package/src/icons/ThumbDownFilledIcon/ThumbDownFilledIcon.tsx +38 -0
- package/src/icons/ThumbUpFilledIcon/ThumbUpFilledIcon.tsx +35 -0
- package/src/icons/VSCodeIcon/VSCodeIcon.tsx +29 -0
- package/src/index.ts +1 -2
- package/src/markdoc/components/Cards/Card.tsx +1 -28
- package/src/markdoc/components/ConnectMCP/ConnectMCP.tsx +28 -0
- package/src/markdoc/components/Tabs/TabList.tsx +312 -105
- package/src/markdoc/components/Tabs/Tabs.tsx +136 -11
- package/src/markdoc/components/default.ts +1 -0
- package/src/markdoc/default.ts +2 -0
- package/src/markdoc/tags/card.ts +0 -1
- package/src/markdoc/tags/connect-mcp.ts +25 -0
- package/lib/components/OpenApiDocs/hooks/AdditionalOverviewInfo.d.ts +0 -1
- package/lib/components/OpenApiDocs/hooks/AdditionalOverviewInfo.js +0 -11
- package/lib/components/OpenApiDocs/hooks/AfterOpenApiDescription.d.ts +0 -1
- package/lib/components/OpenApiDocs/hooks/AfterOpenApiDescription.js +0 -5
- package/lib/ext/process-scorecard.d.ts +0 -5
- package/lib/ext/process-scorecard.js +0 -11
- package/src/components/OpenApiDocs/hooks/AdditionalOverviewInfo.tsx +0 -9
- package/src/components/OpenApiDocs/hooks/AfterOpenApiDescription.tsx +0 -1
- package/src/ext/process-scorecard.ts +0 -13
|
@@ -0,0 +1,50 @@
|
|
|
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.useConnectMCPButton = useConnectMCPButton;
|
|
7
|
+
const react_1 = require("react");
|
|
8
|
+
const lodash_debounce_1 = __importDefault(require("lodash.debounce"));
|
|
9
|
+
const use_theme_hooks_1 = require("./use-theme-hooks");
|
|
10
|
+
const use_mcp_config_1 = require("./use-mcp-config");
|
|
11
|
+
const clipboard_service_1 = require("../utils/clipboard-service");
|
|
12
|
+
const COPIED_RESET_TIMEOUT = 1000;
|
|
13
|
+
function useConnectMCPButton({ options = ['cursor', 'vscode', 'copy'], } = {}) {
|
|
14
|
+
const { useTranslate } = (0, use_theme_hooks_1.useThemeHooks)();
|
|
15
|
+
const { translate } = useTranslate();
|
|
16
|
+
const { serverName, serverUrl, cursorUrl, vscodeUrl } = (0, use_mcp_config_1.useMCPConfig)();
|
|
17
|
+
const [isCopied, setIsCopied] = (0, react_1.useState)(false);
|
|
18
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
19
|
+
const resetCopied = (0, react_1.useCallback)((0, lodash_debounce_1.default)(() => setIsCopied(false), COPIED_RESET_TIMEOUT), []);
|
|
20
|
+
const handleAction = (0, react_1.useCallback)((action) => {
|
|
21
|
+
if (action === 'copy') {
|
|
22
|
+
const config = {
|
|
23
|
+
[serverName]: {
|
|
24
|
+
url: serverUrl,
|
|
25
|
+
description: 'MCP Server',
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
clipboard_service_1.ClipboardService.copyCustom(JSON.stringify(config, null, 2));
|
|
29
|
+
setIsCopied(true);
|
|
30
|
+
resetCopied();
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const urlMap = {
|
|
34
|
+
cursor: cursorUrl,
|
|
35
|
+
vscode: vscodeUrl,
|
|
36
|
+
};
|
|
37
|
+
window.open(urlMap[action], '_blank');
|
|
38
|
+
}, [cursorUrl, vscodeUrl, serverUrl, serverName, resetCopied]);
|
|
39
|
+
const triggerButtonText = (0, react_1.useMemo)(() => translate('page.actions.connectMcp', 'Connect MCP'), [translate]);
|
|
40
|
+
const visibleOptions = (0, react_1.useMemo)(() => options.filter(Boolean), [options]);
|
|
41
|
+
return {
|
|
42
|
+
isCopied,
|
|
43
|
+
cursorUrl,
|
|
44
|
+
vscodeUrl,
|
|
45
|
+
triggerButtonText,
|
|
46
|
+
visibleOptions,
|
|
47
|
+
handleAction,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=use-connect-mcp-button.js.map
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useMCPConfig = useMCPConfig;
|
|
4
|
+
const react_1 = require("react");
|
|
5
|
+
const use_theme_config_1 = require("./use-theme-config");
|
|
6
|
+
const dom_1 = require("../utils/dom");
|
|
7
|
+
const constants_1 = require("../constants");
|
|
8
|
+
const mcp_1 = require("../utils/mcp");
|
|
9
|
+
function useMCPConfig() {
|
|
10
|
+
var _a, _b, _c, _d, _e;
|
|
11
|
+
const themeConfig = (0, use_theme_config_1.useThemeConfig)();
|
|
12
|
+
const origin = dom_1.IS_BROWSER ? window.location.origin : globalThis['SSR_HOSTNAME'];
|
|
13
|
+
const serverName = ((_b = (_a = themeConfig.mcp) === null || _a === void 0 ? void 0 : _a.docs) === null || _b === void 0 ? void 0 : _b.name) || constants_1.DEFAULT_MCP_SERVER_NAME;
|
|
14
|
+
const serverUrl = `${origin}/mcp`;
|
|
15
|
+
const isMcpDisabled = ((_c = themeConfig.mcp) === null || _c === void 0 ? void 0 : _c.hide) || ((_e = (_d = themeConfig.mcp) === null || _d === void 0 ? void 0 : _d.docs) === null || _e === void 0 ? void 0 : _e.hide) || false;
|
|
16
|
+
const cursorUrl = (0, react_1.useMemo)(() => (0, mcp_1.generateMCPDeepLink)('cursor', { serverName, url: serverUrl }), [serverName, serverUrl]);
|
|
17
|
+
const vscodeUrl = (0, react_1.useMemo)(() => (0, mcp_1.generateMCPDeepLink)('vscode', { serverName, url: serverUrl }), [serverName, serverUrl]);
|
|
18
|
+
return {
|
|
19
|
+
serverName,
|
|
20
|
+
origin,
|
|
21
|
+
serverUrl,
|
|
22
|
+
cursorUrl,
|
|
23
|
+
vscodeUrl,
|
|
24
|
+
isMcpDisabled,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=use-mcp-config.js.map
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { PageAction } from '../types';
|
|
2
|
-
export type PageActionType = 'copy' | 'view' | 'chatgpt' | 'claude' | 'mcp-cursor' | 'mcp-
|
|
2
|
+
export type PageActionType = 'copy' | 'view' | 'chatgpt' | 'claude' | 'docs-mcp-cursor' | 'docs-mcp-vscode' | 'mcp-cursor' | 'mcp-vscode';
|
|
3
3
|
export declare function usePageActions(pageSlug: string, mcpUrl?: string, actions?: PageActionType[]): PageAction[];
|
|
@@ -15,13 +15,22 @@ const CopyIcon_1 = require("../../icons/CopyIcon/CopyIcon");
|
|
|
15
15
|
const ChatGptIcon_1 = require("../../icons/ChatGptIcon/ChatGptIcon");
|
|
16
16
|
const ClaudeIcon_1 = require("../../icons/ClaudeIcon/ClaudeIcon");
|
|
17
17
|
const MarkdownFullIcon_1 = require("../../icons/MarkdownFullIcon/MarkdownFullIcon");
|
|
18
|
+
const VSCodeIcon_1 = require("../../icons/VSCodeIcon/VSCodeIcon");
|
|
19
|
+
const CursorIcon_1 = require("../../icons/CursorIcon/CursorIcon");
|
|
18
20
|
const use_theme_hooks_1 = require("./use-theme-hooks");
|
|
19
21
|
const use_theme_config_1 = require("./use-theme-config");
|
|
22
|
+
const use_mcp_config_1 = require("./use-mcp-config");
|
|
20
23
|
const clipboard_service_1 = require("../utils/clipboard-service");
|
|
21
24
|
const dom_1 = require("../utils/dom");
|
|
22
|
-
const
|
|
23
|
-
const DEFAULT_ENABLED_ACTIONS = [
|
|
24
|
-
|
|
25
|
+
const mcp_1 = require("../utils/mcp");
|
|
26
|
+
const DEFAULT_ENABLED_ACTIONS = [
|
|
27
|
+
'copy',
|
|
28
|
+
'view',
|
|
29
|
+
'chatgpt',
|
|
30
|
+
'claude',
|
|
31
|
+
'docs-mcp-cursor',
|
|
32
|
+
'docs-mcp-vscode',
|
|
33
|
+
];
|
|
25
34
|
function usePageActions(pageSlug, mcpUrl, actions) {
|
|
26
35
|
var _a, _b, _c;
|
|
27
36
|
const { useTranslate, usePageData, usePageProps, usePageSharedData } = (0, use_theme_hooks_1.useThemeHooks)();
|
|
@@ -29,144 +38,115 @@ function usePageActions(pageSlug, mcpUrl, actions) {
|
|
|
29
38
|
const themeConfig = (0, use_theme_config_1.useThemeConfig)();
|
|
30
39
|
const pageProps = usePageProps();
|
|
31
40
|
const openApiSharedData = usePageSharedData('openAPIDocsStore');
|
|
41
|
+
const mcpConfig = (0, use_mcp_config_1.useMCPConfig)();
|
|
32
42
|
const shouldHideAllActions = shouldHidePageActions(pageProps, themeConfig, (_a = openApiSharedData === null || openApiSharedData === void 0 ? void 0 : openApiSharedData.options) === null || _a === void 0 ? void 0 : _a.excludeFromSearch);
|
|
33
43
|
const { isPublic } = usePageData() || {};
|
|
44
|
+
const createMCPHandler = (0, react_1.useCallback)((clientType, requiresMcpUrl = false) => () => {
|
|
45
|
+
if (requiresMcpUrl && !mcpUrl)
|
|
46
|
+
return null;
|
|
47
|
+
if (!requiresMcpUrl && (mcpUrl || mcpConfig.isMcpDisabled))
|
|
48
|
+
return null;
|
|
49
|
+
const config = requiresMcpUrl
|
|
50
|
+
? { serverName: mcpConfig.serverName, url: mcpUrl || '' }
|
|
51
|
+
: { serverName: mcpConfig.serverName, url: mcpConfig.serverUrl || '' };
|
|
52
|
+
return createMCPAction({ clientType, mcpConfig: config, translate });
|
|
53
|
+
}, [mcpUrl, mcpConfig, translate]);
|
|
34
54
|
const result = (0, react_1.useMemo)(() => {
|
|
35
55
|
var _a, _b;
|
|
36
|
-
if (shouldHideAllActions
|
|
56
|
+
if (shouldHideAllActions) {
|
|
37
57
|
return [];
|
|
38
58
|
}
|
|
39
59
|
const origin = dom_1.IS_BROWSER ? window.location.origin : globalThis['SSR_HOSTNAME'];
|
|
40
60
|
const normalizedSlug = pageSlug.startsWith('/') ? pageSlug : '/' + pageSlug;
|
|
41
61
|
const mdPageUrl = new URL(origin + normalizedSlug + (normalizedSlug === '/' ? 'index.html.md' : '.md')).toString();
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}
|
|
61
|
-
return JSON.stringify(jsonConfig, null, 2);
|
|
62
|
-
}
|
|
63
|
-
switch (action) {
|
|
64
|
-
case 'mcp-cursor':
|
|
65
|
-
if (!mcpUrl) {
|
|
66
|
-
return null;
|
|
67
|
-
}
|
|
68
|
-
return {
|
|
69
|
-
buttonText: translate('page.actions.cursorMcpButtonText', 'Connect to Cursor'),
|
|
70
|
-
title: translate('page.actions.cursorMcpTitle', 'Connect to Cursor'),
|
|
71
|
-
description: translate('page.actions.cursorMcpDescription', 'Install MCP server on Cursor'),
|
|
72
|
-
iconComponent: CursorIcon_1.CursorIcon,
|
|
73
|
-
onClick: () => {
|
|
74
|
-
try {
|
|
75
|
-
const url = generateMCPConfig(true);
|
|
76
|
-
window.open(url, '_blank');
|
|
77
|
-
}
|
|
78
|
-
catch (error) {
|
|
79
|
-
console.error(error);
|
|
80
|
-
}
|
|
81
|
-
},
|
|
82
|
-
};
|
|
83
|
-
case 'mcp-claude':
|
|
84
|
-
if (!mcpUrl) {
|
|
85
|
-
return null;
|
|
86
|
-
}
|
|
87
|
-
return {
|
|
88
|
-
buttonText: 'Copy Claude configuration',
|
|
89
|
-
title: 'Copy Claude configuration',
|
|
90
|
-
description: 'Copy MCP configuration for Claude',
|
|
91
|
-
iconComponent: ClaudeIcon_1.ClaudeIcon,
|
|
92
|
-
onClick: () => __awaiter(this, void 0, void 0, function* () {
|
|
93
|
-
clipboard_service_1.ClipboardService.copyCustom(`claude mcp add --transport http server ${mcpUrl}`);
|
|
94
|
-
}),
|
|
95
|
-
};
|
|
96
|
-
case 'mcp-json':
|
|
97
|
-
return {
|
|
98
|
-
buttonText: 'Copy MCP configuration',
|
|
99
|
-
title: 'Copy MCP JSON configuration',
|
|
100
|
-
description: 'Copy MCP JSON configuration',
|
|
101
|
-
iconComponent: CopyIcon_1.CopyIcon,
|
|
102
|
-
onClick: () => __awaiter(this, void 0, void 0, function* () {
|
|
103
|
-
clipboard_service_1.ClipboardService.copyCustom(generateMCPConfig());
|
|
104
|
-
}),
|
|
105
|
-
};
|
|
106
|
-
case 'copy':
|
|
107
|
-
return {
|
|
108
|
-
buttonText: translate('page.actions.copyButtonText', 'Copy'),
|
|
109
|
-
title: translate('page.actions.copyTitle', 'Copy for LLM'),
|
|
110
|
-
description: translate('page.actions.copyDescription', 'Copy page as Markdown for LLMs'),
|
|
111
|
-
iconComponent: CopyIcon_1.CopyIcon,
|
|
112
|
-
onClick: () => __awaiter(this, void 0, void 0, function* () {
|
|
113
|
-
try {
|
|
114
|
-
const result = yield fetch(mdPageUrl);
|
|
115
|
-
if (result.status !== 200) {
|
|
116
|
-
throw new Error('Failed to fetch markdown content');
|
|
117
|
-
}
|
|
118
|
-
const text = yield result.text();
|
|
119
|
-
clipboard_service_1.ClipboardService.copyCustom(text);
|
|
120
|
-
}
|
|
121
|
-
catch (error) {
|
|
122
|
-
console.error(error);
|
|
123
|
-
}
|
|
124
|
-
}),
|
|
125
|
-
};
|
|
126
|
-
case 'view':
|
|
127
|
-
return {
|
|
128
|
-
buttonText: translate('page.actions.viewAsMdButtonText', 'View as Markdown'),
|
|
129
|
-
title: translate('page.actions.viewAsMdTitle', 'View as Markdown'),
|
|
130
|
-
description: translate('page.actions.viewAsMdDescription', 'Open this page as Markdown'),
|
|
131
|
-
iconComponent: MarkdownFullIcon_1.MarkdownFullIcon,
|
|
132
|
-
link: mdPageUrl,
|
|
133
|
-
};
|
|
134
|
-
case 'chatgpt':
|
|
135
|
-
if (!isPublic) {
|
|
136
|
-
return null;
|
|
62
|
+
const actionHandlers = {
|
|
63
|
+
'docs-mcp-cursor': createMCPHandler('cursor'),
|
|
64
|
+
'docs-mcp-vscode': createMCPHandler('vscode'),
|
|
65
|
+
'mcp-cursor': createMCPHandler('cursor', true),
|
|
66
|
+
'mcp-vscode': createMCPHandler('vscode', true),
|
|
67
|
+
copy: () => ({
|
|
68
|
+
buttonText: translate('page.actions.copyButtonText', 'Copy'),
|
|
69
|
+
title: translate('page.actions.copyTitle', 'Copy for LLM'),
|
|
70
|
+
description: translate('page.actions.copyDescription', 'Copy page as Markdown for LLMs'),
|
|
71
|
+
iconComponent: CopyIcon_1.CopyIcon,
|
|
72
|
+
onClick: () => __awaiter(this, void 0, void 0, function* () {
|
|
73
|
+
try {
|
|
74
|
+
const result = yield fetch(mdPageUrl);
|
|
75
|
+
if (result.status !== 200) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const text = yield result.text();
|
|
79
|
+
clipboard_service_1.ClipboardService.copyCustom(text);
|
|
137
80
|
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
title: translate('page.actions.chatGptTitle', 'Open in ChatGPT'),
|
|
141
|
-
description: translate('page.actions.chatGptDescription', 'Get insights from ChatGPT'),
|
|
142
|
-
iconComponent: ChatGptIcon_1.ChatGptIcon,
|
|
143
|
-
link: getExternalAiPromptLink('https://chat.openai.com'),
|
|
144
|
-
};
|
|
145
|
-
case 'claude':
|
|
146
|
-
if (!isPublic) {
|
|
147
|
-
return null;
|
|
81
|
+
catch (error) {
|
|
82
|
+
console.error(error);
|
|
148
83
|
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
84
|
+
}),
|
|
85
|
+
}),
|
|
86
|
+
view: () => ({
|
|
87
|
+
buttonText: translate('page.actions.viewAsMdButtonText', 'View as Markdown'),
|
|
88
|
+
title: translate('page.actions.viewAsMdTitle', 'View as Markdown'),
|
|
89
|
+
description: translate('page.actions.viewAsMdDescription', 'Open this page as Markdown'),
|
|
90
|
+
iconComponent: MarkdownFullIcon_1.MarkdownFullIcon,
|
|
91
|
+
link: mdPageUrl,
|
|
92
|
+
}),
|
|
93
|
+
chatgpt: () => {
|
|
94
|
+
if (!isPublic) {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
buttonText: translate('page.actions.chatGptButtonText', 'Open in ChatGPT'),
|
|
99
|
+
title: translate('page.actions.chatGptTitle', 'Open in ChatGPT'),
|
|
100
|
+
description: translate('page.actions.chatGptDescription', 'Get insights from ChatGPT'),
|
|
101
|
+
iconComponent: ChatGptIcon_1.ChatGptIcon,
|
|
102
|
+
link: getExternalAiPromptLink('https://chat.openai.com', mdPageUrl),
|
|
103
|
+
};
|
|
104
|
+
},
|
|
105
|
+
claude: () => {
|
|
106
|
+
if (!isPublic) {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
return {
|
|
110
|
+
buttonText: translate('page.actions.claudeButtonText', 'Open in Claude'),
|
|
111
|
+
title: translate('page.actions.claudeTitle', 'Open in Claude'),
|
|
112
|
+
description: translate('page.actions.claudeDescription', 'Get insights from Claude'),
|
|
113
|
+
iconComponent: ClaudeIcon_1.ClaudeIcon,
|
|
114
|
+
link: getExternalAiPromptLink('https://claude.ai/new', mdPageUrl),
|
|
115
|
+
};
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
return (((_b = (_a = themeConfig.navigation) === null || _a === void 0 ? void 0 : _a.actions) === null || _b === void 0 ? void 0 : _b.items) || actions || DEFAULT_ENABLED_ACTIONS)
|
|
119
|
+
.map((action) => { var _a; return (_a = actionHandlers[action]) === null || _a === void 0 ? void 0 : _a.call(actionHandlers); })
|
|
158
120
|
.filter((action) => action !== null);
|
|
159
121
|
}, [
|
|
160
122
|
shouldHideAllActions,
|
|
161
123
|
pageSlug,
|
|
162
124
|
(_c = (_b = themeConfig.navigation) === null || _b === void 0 ? void 0 : _b.actions) === null || _c === void 0 ? void 0 : _c.items,
|
|
163
125
|
actions,
|
|
164
|
-
mcpUrl,
|
|
165
126
|
translate,
|
|
166
127
|
isPublic,
|
|
128
|
+
createMCPHandler,
|
|
167
129
|
]);
|
|
168
130
|
return result;
|
|
169
131
|
}
|
|
132
|
+
function getExternalAiPromptLink(baseUrl, mdPageUrl) {
|
|
133
|
+
const externalAiPrompt = `Read ${mdPageUrl} and answer questions based on the content.`;
|
|
134
|
+
const url = new URL(baseUrl);
|
|
135
|
+
url.searchParams.set('q', externalAiPrompt);
|
|
136
|
+
return url.toString();
|
|
137
|
+
}
|
|
138
|
+
function createMCPAction({ clientType, mcpConfig, translate }) {
|
|
139
|
+
const url = (0, mcp_1.generateMCPDeepLink)(clientType, mcpConfig);
|
|
140
|
+
const sharedProps = {
|
|
141
|
+
onClick: () => {
|
|
142
|
+
window.open(url, '_blank');
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
if (clientType === 'cursor') {
|
|
146
|
+
return Object.assign(Object.assign({}, sharedProps), { buttonText: translate('page.actions.connectMcp.cursor', 'Connect to Cursor'), title: translate('page.actions.connectMcp.cursor', 'Connect to Cursor'), description: translate('page.actions.connectMcp.cursorDescription', 'Install MCP server on Cursor'), iconComponent: CursorIcon_1.CursorIcon });
|
|
147
|
+
}
|
|
148
|
+
return Object.assign(Object.assign({}, sharedProps), { buttonText: translate('page.actions.connectMcp.vscode', 'Connect to VS Code'), title: translate('page.actions.connectMcp.vscode', 'Connect to VS Code'), description: translate('page.actions.connectMcp.vscodeDescription', 'Install MCP server on VS Code'), iconComponent: VSCodeIcon_1.VSCodeIcon });
|
|
149
|
+
}
|
|
170
150
|
function shouldHidePageActions(pageProps, themeConfig, openapiExcludeFromSearch) {
|
|
171
151
|
var _a, _b, _c, _d, _e, _f;
|
|
172
152
|
// Can't use any actions if no markdown files are generated for LLMs
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.useProductPicker = useProductPicker;
|
|
4
4
|
const react_router_dom_1 = require("react-router-dom");
|
|
5
5
|
const use_theme_hooks_1 = require("./use-theme-hooks");
|
|
6
|
+
const utils_1 = require("../utils");
|
|
6
7
|
function useProductPicker() {
|
|
7
8
|
const { useCurrentProduct, useProducts, useTelemetry, useLoadAndNavigate } = (0, use_theme_hooks_1.useThemeHooks)();
|
|
8
9
|
const currentProduct = useCurrentProduct();
|
|
@@ -14,7 +15,7 @@ function useProductPicker() {
|
|
|
14
15
|
if (!product)
|
|
15
16
|
return;
|
|
16
17
|
telemetry.sendProductPickedMessage({ product: product.slug });
|
|
17
|
-
loadAndNavigate({ navigate, to: product.link });
|
|
18
|
+
loadAndNavigate({ navigate, to: (0, utils_1.withPathPrefix)(product.link) });
|
|
18
19
|
}
|
|
19
20
|
return {
|
|
20
21
|
currentProduct,
|
|
@@ -4,18 +4,19 @@ type UseTabsProps = {
|
|
|
4
4
|
totalTabs: number;
|
|
5
5
|
containerRef?: React.RefObject<HTMLElement | null>;
|
|
6
6
|
};
|
|
7
|
-
|
|
7
|
+
type UseTabsReturn = {
|
|
8
8
|
setTabRef: (element: HTMLButtonElement | null, index: number) => void;
|
|
9
9
|
onTabClick: (labelOrIndex: string | number) => void;
|
|
10
10
|
handleKeyboard: (event: React.KeyboardEvent, index: number) => void;
|
|
11
11
|
visibleTabs: number[];
|
|
12
12
|
overflowTabs: number[];
|
|
13
|
-
|
|
13
|
+
isReady: boolean;
|
|
14
14
|
};
|
|
15
15
|
type UseActiveTabProps = {
|
|
16
16
|
initialTab: string;
|
|
17
17
|
tabsId?: string;
|
|
18
18
|
};
|
|
19
|
+
export declare function useTabs({ activeTab, onTabChange, totalTabs, containerRef, }: UseTabsProps): UseTabsReturn;
|
|
19
20
|
export declare const useActiveTab: ({ initialTab, tabsId }: UseActiveTabProps) => {
|
|
20
21
|
activeTab: string;
|
|
21
22
|
setActiveTab: import("react").Dispatch<import("react").SetStateAction<string>>;
|