@redocly/theme 0.67.0-next.3 → 0.67.0-next.5

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 (83) hide show
  1. package/lib/components/Breadcrumbs/BreadcrumbDropdown.d.ts +2 -1
  2. package/lib/components/Breadcrumbs/BreadcrumbDropdown.js +9 -10
  3. package/lib/components/Breadcrumbs/Breadcrumbs.js +5 -22
  4. package/lib/components/Buttons/AIAssistantButton.js +2 -6
  5. package/lib/components/Buttons/EditPageButton.js +2 -1
  6. package/lib/components/Catalog/CatalogCardView/CatalogCard.js +1 -1
  7. package/lib/components/CatalogClassic/CatalogClassicActions.js +3 -1
  8. package/lib/components/CatalogClassic/CatalogClassicCard.js +1 -1
  9. package/lib/components/CatalogClassic/CatalogClassicInfoBlock.js +2 -1
  10. package/lib/components/Dropdown/Dropdown.d.ts +2 -0
  11. package/lib/components/Dropdown/Dropdown.js +8 -2
  12. package/lib/components/Feedback/ReportDialog.js +4 -1
  13. package/lib/components/Filter/FilterCheckboxes.js +3 -1
  14. package/lib/components/Footer/FooterItem.js +1 -1
  15. package/lib/components/LanguagePicker/LanguagePicker.js +3 -1
  16. package/lib/components/Logo/Logo.js +2 -1
  17. package/lib/components/Menu/MenuContainer.js +1 -0
  18. package/lib/components/Menu/MenuItem.js +21 -7
  19. package/lib/components/Navbar/Navbar.js +6 -2
  20. package/lib/components/Navbar/NavbarItem.js +3 -1
  21. package/lib/components/Search/SearchAiMessage.js +23 -5
  22. package/lib/components/Search/SearchDialog.js +5 -33
  23. package/lib/components/Search/SearchInput.js +4 -1
  24. package/lib/components/Search/SearchRecent.js +3 -1
  25. package/lib/components/SidebarActions/SidebarActions.js +10 -3
  26. package/lib/components/TableOfContent/TableOfContent.js +1 -1
  27. package/lib/components/UserMenu/LoginButton.js +2 -1
  28. package/lib/components/UserMenu/LogoutMenuItem.js +2 -1
  29. package/lib/core/hooks/search/use-search-dialog.js +7 -2
  30. package/lib/core/hooks/use-banner-telemetry.js +2 -11
  31. package/lib/core/hooks/use-color-switcher.js +2 -1
  32. package/lib/core/hooks/use-page-actions.js +12 -21
  33. package/lib/core/hooks/use-product-picker.js +14 -4
  34. package/lib/core/hooks/use-telemetry-fallback.d.ts +45 -37
  35. package/lib/core/hooks/use-telemetry-fallback.js +47 -39
  36. package/lib/core/types/search.d.ts +2 -1
  37. package/lib/core/types/search.js +1 -0
  38. package/lib/core/utils/index.d.ts +2 -0
  39. package/lib/core/utils/index.js +2 -0
  40. package/lib/core/utils/telemetry/generate-before-after-context.d.ts +37 -0
  41. package/lib/core/utils/telemetry/generate-before-after-context.js +32 -0
  42. package/lib/core/utils/telemetry/generate-resource-urn.d.ts +7 -0
  43. package/lib/core/utils/telemetry/generate-resource-urn.js +13 -0
  44. package/lib/core/utils/telemetry/get-base-data-attributes.d.ts +14 -0
  45. package/lib/core/utils/telemetry/get-base-data-attributes.js +17 -0
  46. package/package.json +3 -3
  47. package/src/components/Breadcrumbs/BreadcrumbDropdown.tsx +18 -4
  48. package/src/components/Breadcrumbs/Breadcrumbs.tsx +5 -6
  49. package/src/components/Buttons/AIAssistantButton.tsx +2 -3
  50. package/src/components/Buttons/EditPageButton.tsx +4 -1
  51. package/src/components/Catalog/CatalogCardView/CatalogCard.tsx +2 -2
  52. package/src/components/CatalogClassic/CatalogClassicActions.tsx +4 -2
  53. package/src/components/CatalogClassic/CatalogClassicCard.tsx +9 -2
  54. package/src/components/CatalogClassic/CatalogClassicInfoBlock.tsx +2 -1
  55. package/src/components/Dropdown/Dropdown.tsx +8 -1
  56. package/src/components/Feedback/ReportDialog.tsx +4 -1
  57. package/src/components/Filter/FilterCheckboxes.tsx +4 -2
  58. package/src/components/Footer/FooterItem.tsx +4 -2
  59. package/src/components/LanguagePicker/LanguagePicker.tsx +9 -2
  60. package/src/components/Logo/Logo.tsx +7 -1
  61. package/src/components/Menu/MenuContainer.tsx +1 -0
  62. package/src/components/Menu/MenuItem.tsx +35 -4
  63. package/src/components/Navbar/Navbar.tsx +7 -3
  64. package/src/components/Navbar/NavbarItem.tsx +7 -1
  65. package/src/components/Search/SearchAiMessage.tsx +25 -5
  66. package/src/components/Search/SearchDialog.tsx +6 -13
  67. package/src/components/Search/SearchInput.tsx +4 -1
  68. package/src/components/Search/SearchRecent.tsx +4 -2
  69. package/src/components/SidebarActions/SidebarActions.tsx +10 -3
  70. package/src/components/TableOfContent/TableOfContent.tsx +7 -2
  71. package/src/components/UserMenu/LoginButton.tsx +4 -1
  72. package/src/components/UserMenu/LogoutMenuItem.tsx +2 -1
  73. package/src/core/hooks/search/use-search-dialog.ts +13 -2
  74. package/src/core/hooks/use-banner-telemetry.ts +5 -4
  75. package/src/core/hooks/use-color-switcher.ts +7 -1
  76. package/src/core/hooks/use-page-actions.ts +17 -28
  77. package/src/core/hooks/use-product-picker.ts +19 -5
  78. package/src/core/hooks/use-telemetry-fallback.ts +47 -39
  79. package/src/core/types/search.ts +1 -0
  80. package/src/core/utils/index.ts +2 -0
  81. package/src/core/utils/telemetry/generate-before-after-context.ts +59 -0
  82. package/src/core/utils/telemetry/generate-resource-urn.ts +9 -0
  83. package/src/core/utils/telemetry/get-base-data-attributes.ts +27 -0
@@ -65,7 +65,7 @@ function TableOfContent(props) {
65
65
  const href = '#' + heading.id;
66
66
  return (React.createElement(TableOfContentMenuItem, { key: href + idx, href: href, $depth: heading.depth - leastDepth + 1 || 0, className: activeHeading === heading.id ? 'active' : '', dangerouslySetInnerHTML: { __html: heading.value || '' }, "data-testid": `toc-${heading.value}`, onClick: (e) => {
67
67
  e.preventDefault();
68
- telemetry.sendTocItemClickedMessage();
68
+ telemetry.sendTocItemClickedMessage([(0, utils_1.getBaseDataAttributes)('tocItem', 'toc')]);
69
69
  handleHeadingClick(heading.id);
70
70
  } }));
71
71
  }))));
@@ -7,12 +7,13 @@ exports.LoginButton = LoginButton;
7
7
  const react_1 = __importDefault(require("react"));
8
8
  const hooks_1 = require("../../core/hooks");
9
9
  const Button_1 = require("../../components/Button/Button");
10
+ const utils_1 = require("../../core/utils");
10
11
  function LoginButton({ href, className, variant = 'primary', size = 'medium', label, labelTranslationKey = 'userMenu.login', 'data-component-name': componentName = 'UserMenu/LoginButton', }) {
11
12
  const { useTranslate, useTelemetry } = (0, hooks_1.useThemeHooks)();
12
13
  const { translate } = useTranslate();
13
14
  const telemetry = useTelemetry();
14
15
  const buttonLabel = label || translate(labelTranslationKey, 'Login');
15
16
  return (react_1.default.createElement("span", { "data-component-name": componentName, className: className },
16
- react_1.default.createElement(Button_1.Button, { "data-translation-key": label ? undefined : labelTranslationKey, to: href, languageInsensitive: true, onClick: () => telemetry.sendLoginButtonClickedMessage(), "data-testid": "login-btn", extraClass: className, variant: variant, size: size }, buttonLabel)));
17
+ react_1.default.createElement(Button_1.Button, { "data-translation-key": label ? undefined : labelTranslationKey, to: href, languageInsensitive: true, onClick: () => telemetry.sendLoginClickedMessage([(0, utils_1.getBaseDataAttributes)('login', 'button')]), "data-testid": "login-btn", extraClass: className, variant: variant, size: size }, buttonLabel)));
17
18
  }
18
19
  //# sourceMappingURL=LoginButton.js.map
@@ -8,13 +8,14 @@ const react_1 = __importDefault(require("react"));
8
8
  const hooks_1 = require("../../core/hooks");
9
9
  const LogoutIcon_1 = require("../../icons/LogoutIcon/LogoutIcon");
10
10
  const DropdownMenuItem_1 = require("../../components/Dropdown/DropdownMenuItem");
11
+ const utils_1 = require("../../core/utils");
11
12
  function LogoutMenuItem({ iconOnly, className }) {
12
13
  const { useTranslate, useTelemetry, useUserMenu } = (0, hooks_1.useThemeHooks)();
13
14
  const { handleLogout } = useUserMenu();
14
15
  const telemetry = useTelemetry();
15
16
  const { translate } = useTranslate();
16
17
  const handleClick = () => {
17
- telemetry.sendLogoutMenuItemClickedMessage();
18
+ telemetry.sendLogoutClickedMessage([(0, utils_1.getBaseDataAttributes)('logoutItem', 'userMenu')]);
18
19
  handleLogout();
19
20
  };
20
21
  return (react_1.default.createElement(DropdownMenuItem_1.DropdownMenuItem, { className: className, dangerous: true, "data-component-name": "UserMenu/LogoutMenuItem", onAction: handleClick, "data-translation-key": "userMenu.logout", prefix: react_1.default.createElement(LogoutIcon_1.LogoutIcon, null), style: { width: iconOnly ? 'fit-content' : '100%' } }, iconOnly ? null : translate('userMenu.logout', 'Log out')));
@@ -10,6 +10,7 @@ const hotkeys_js_1 = __importDefault(require("hotkeys-js"));
10
10
  const use_theme_hooks_1 = require("../use-theme-hooks");
11
11
  const use_theme_config_1 = require("../use-theme-config");
12
12
  const contexts_1 = require("../../contexts");
13
+ const utils_1 = require("../../utils");
13
14
  function useSearchDialog() {
14
15
  var _a;
15
16
  var _b;
@@ -25,7 +26,9 @@ function useSearchDialog() {
25
26
  if (hotKeys) {
26
27
  (0, hotkeys_js_1.default)(hotKeys, (ev) => {
27
28
  setIsOpen(true);
28
- telemetry.sendSearchOpenedMessage([{ object: 'search', method: 'shortcut' }]);
29
+ telemetry.sendSearchOpenedMessage([
30
+ Object.assign(Object.assign({}, (0, utils_1.getBaseDataAttributes)('searchDialogId', 'search')), { method: 'shortcut' }),
31
+ ]);
29
32
  ev.preventDefault();
30
33
  });
31
34
  return () => hotkeys_js_1.default.unbind(hotKeys);
@@ -33,7 +36,9 @@ function useSearchDialog() {
33
36
  // eslint-disable-next-line react-hooks/exhaustive-deps
34
37
  }, [hotKeys]);
35
38
  const onOpen = (0, react_1.useCallback)(function () {
36
- telemetry.sendSearchOpenedMessage([{ object: 'search', method: 'click' }]);
39
+ telemetry.sendSearchOpenedMessage([
40
+ Object.assign(Object.assign({}, (0, utils_1.getBaseDataAttributes)('searchDialogId', 'search')), { method: 'click' }),
41
+ ]);
37
42
  setIsOpen(true);
38
43
  // eslint-disable-next-line react-hooks/exhaustive-deps
39
44
  }, []);
@@ -14,6 +14,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
14
14
  exports.useBannerTelemetry = useBannerTelemetry;
15
15
  const react_1 = require("react");
16
16
  const use_theme_hooks_1 = require("./use-theme-hooks");
17
+ const get_base_data_attributes_1 = require("../utils/telemetry/get-base-data-attributes");
17
18
  const noop = () => { };
18
19
  const noopLink = (_href) => { };
19
20
  function useBannerTelemetry(displayBanner) {
@@ -27,17 +28,7 @@ function useBannerTelemetry(displayBanner) {
27
28
  sendBannerLinkClickedMessage: noopLink,
28
29
  };
29
30
  }
30
- const bannerUri = 'urn:redocly:realm:ui:banner:banner-id';
31
- const payload = {
32
- id: 'banner-id',
33
- object: 'banner',
34
- uri: bannerUri,
35
- trackingId: displayBanner.trackingId,
36
- hash: displayBanner.hash,
37
- color: displayBanner.color,
38
- target: displayBanner.target,
39
- dismissible: displayBanner.dismissible,
40
- };
31
+ const payload = Object.assign(Object.assign({}, (0, get_base_data_attributes_1.getBaseDataAttributes)('bannerId', 'banner')), { trackingId: displayBanner.trackingId, hash: displayBanner.hash, color: displayBanner.color, target: displayBanner.target, dismissible: displayBanner.dismissible });
41
32
  return {
42
33
  sendBannerViewedMessage: () => {
43
34
  telemetry.sendBannerViewedMessage([payload]);
@@ -7,6 +7,7 @@ const use_theme_config_1 = require("./use-theme-config");
7
7
  const use_theme_hooks_1 = require("./use-theme-hooks");
8
8
  const use_store_1 = require("./use-store");
9
9
  const constants_1 = require("../constants");
10
+ const utils_1 = require("../utils");
10
11
  const COLOR_MODE_KEY = 'colorSchema';
11
12
  const colorModeStore = (0, use_store_1.createStore)({
12
13
  storageKey: COLOR_MODE_KEY,
@@ -36,7 +37,7 @@ const useColorSwitcher = () => {
36
37
  root.classList.remove('notransition');
37
38
  });
38
39
  telemetry.sendColorModeSwitchedMessage([
39
- { object: 'color_mode', from: activeColorMode, to: newMode },
40
+ ...(0, utils_1.generateBeforeAfterContext)('colorMode', 'button', { mode: activeColorMode }, { mode: newMode }),
40
41
  ]);
41
42
  setActiveColorMode(newMode);
42
43
  };
@@ -24,13 +24,7 @@ const clipboard_service_1 = require("../utils/clipboard-service");
24
24
  const dom_1 = require("../utils/dom");
25
25
  const mcp_1 = require("../utils/mcp");
26
26
  const urls_1 = require("../utils/urls");
27
- function createPageActionResource(pageSlug, pageUrl) {
28
- return {
29
- id: pageSlug,
30
- object: 'page',
31
- uri: pageUrl,
32
- };
33
- }
27
+ const get_base_data_attributes_1 = require("../utils/telemetry/get-base-data-attributes");
34
28
  const DEFAULT_ENABLED_ACTIONS = [
35
29
  'copy',
36
30
  'view',
@@ -55,19 +49,17 @@ function usePageActions(pageSlug, mcpUrl, actions) {
55
49
  ? { serverName: mcpConfig.serverName, url: mcpUrl || '' }
56
50
  : { serverName: mcpConfig.serverName, url: mcpConfig.serverUrl || '' };
57
51
  const isDocsMcp = !requiresMcpUrl;
58
- const origin = dom_1.IS_BROWSER ? window.location.origin : '';
59
- const pageUrl = `${origin}${pageSlug}`;
60
52
  return createMCPAction({
61
53
  clientType,
62
54
  mcpConfig: config,
63
55
  translate,
64
56
  onClickCallback: isDocsMcp
65
- ? () => telemetry.sendPageActionsButtonClickedMessage([
66
- Object.assign(Object.assign({}, createPageActionResource(pageSlug, pageUrl)), { action_type: `docs-mcp-${clientType}` }),
57
+ ? () => telemetry.sendPageActionsClickedMessage([
58
+ Object.assign(Object.assign({}, (0, get_base_data_attributes_1.getBaseDataAttributes)('pageActions', 'button')), { actionType: `docs-mcp-${clientType}` }),
67
59
  ])
68
60
  : undefined,
69
61
  });
70
- }, [mcpUrl, mcpConfig, translate, telemetry, pageSlug]);
62
+ }, [mcpUrl, mcpConfig, translate, telemetry]);
71
63
  const result = (0, react_1.useMemo)(() => {
72
64
  var _a, _b;
73
65
  var _c;
@@ -83,7 +75,6 @@ function usePageActions(pageSlug, mcpUrl, actions) {
83
75
  ? window.location.origin
84
76
  : ((_c = globalThis['SSR_HOSTNAME']) !== null && _c !== void 0 ? _c : '');
85
77
  const pathname = (0, urls_1.addTrailingSlash)(pageSlug);
86
- const pageUrl = (0, urls_1.combineUrls)(origin, pathname);
87
78
  const isRoot = (0, urls_1.withoutPathPrefix)(pathname) === '/';
88
79
  const mdPageUrl = isRoot
89
80
  ? (0, urls_1.combineUrls)(origin, pathname, 'index.html.md')
@@ -106,8 +97,8 @@ function usePageActions(pageSlug, mcpUrl, actions) {
106
97
  }
107
98
  const text = yield result.text();
108
99
  clipboard_service_1.ClipboardService.copyCustom(text);
109
- telemetry.sendPageActionsButtonClickedMessage([
110
- Object.assign(Object.assign({}, createPageActionResource(pageSlug, pageUrl)), { action_type: 'copy' }),
100
+ telemetry.sendPageActionsClickedMessage([
101
+ Object.assign(Object.assign({}, (0, get_base_data_attributes_1.getBaseDataAttributes)('pageActions', 'button')), { actionType: 'copy' }),
111
102
  ]);
112
103
  }
113
104
  catch (error) {
@@ -122,8 +113,8 @@ function usePageActions(pageSlug, mcpUrl, actions) {
122
113
  iconComponent: MarkdownFullIcon_1.MarkdownFullIcon,
123
114
  link: mdPageUrl,
124
115
  onClick: () => {
125
- telemetry.sendPageActionsButtonClickedMessage([
126
- Object.assign(Object.assign({}, createPageActionResource(pageSlug, pageUrl)), { action_type: 'view' }),
116
+ telemetry.sendPageActionsClickedMessage([
117
+ Object.assign(Object.assign({}, (0, get_base_data_attributes_1.getBaseDataAttributes)('pageActions', 'button')), { actionType: 'view' }),
127
118
  ]);
128
119
  },
129
120
  }),
@@ -136,8 +127,8 @@ function usePageActions(pageSlug, mcpUrl, actions) {
136
127
  iconComponent: ChatGptIcon_1.ChatGptIcon,
137
128
  link,
138
129
  onClick: () => {
139
- telemetry.sendPageActionsButtonClickedMessage([
140
- Object.assign(Object.assign({}, createPageActionResource(pageSlug, pageUrl)), { action_type: 'chatgpt' }),
130
+ telemetry.sendPageActionsClickedMessage([
131
+ Object.assign(Object.assign({}, (0, get_base_data_attributes_1.getBaseDataAttributes)('pageActions', 'button')), { actionType: 'chatgpt' }),
141
132
  ]);
142
133
  window.location.href = link;
143
134
  },
@@ -152,8 +143,8 @@ function usePageActions(pageSlug, mcpUrl, actions) {
152
143
  iconComponent: ClaudeIcon_1.ClaudeIcon,
153
144
  link,
154
145
  onClick: () => {
155
- telemetry.sendPageActionsButtonClickedMessage([
156
- Object.assign(Object.assign({}, createPageActionResource(pageSlug, pageUrl)), { action_type: 'claude' }),
146
+ telemetry.sendPageActionsClickedMessage([
147
+ Object.assign(Object.assign({}, (0, get_base_data_attributes_1.getBaseDataAttributes)('pageActions', 'button')), { actionType: 'claude' }),
157
148
  ]);
158
149
  window.location.href = link;
159
150
  },
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useProductPicker = useProductPicker;
4
+ const react_1 = require("react");
4
5
  const react_router_dom_1 = require("react-router-dom");
5
6
  const utils_1 = require("../../components/Product/utils");
6
7
  const use_theme_hooks_1 = require("./use-theme-hooks");
@@ -12,20 +13,29 @@ function useProductPicker() {
12
13
  const telemetry = useTelemetry();
13
14
  const navigate = (0, react_router_dom_1.useNavigate)();
14
15
  const loadAndNavigate = useLoadAndNavigate();
16
+ // An open dropdown can fire a menu item's onAction from an earlier render, so `product.link`
17
+ // may be stale (e.g. after a locale switch); resolve the live product via a ref.
18
+ const productsRef = (0, react_1.useRef)(products);
19
+ productsRef.current = products;
15
20
  function setProduct(product) {
21
+ var _a;
16
22
  if (!product)
17
23
  return;
18
- telemetry.sendProductPickedMessage([{ object: 'product', product: product.slug }]);
24
+ // match on `name` (locale-stable; link/slug are re-localized)
25
+ const freshProduct = (_a = productsRef.current.find((p) => p.name === product.name)) !== null && _a !== void 0 ? _a : product;
26
+ telemetry.sendProductPickerChangedMessage([
27
+ ...(0, utils_2.generateBeforeAfterContext)('productPicker', 'dropdown', { product: (currentProduct === null || currentProduct === void 0 ? void 0 : currentProduct.slug) || '' }, { product: freshProduct.slug }),
28
+ ]);
19
29
  if (typeof document === 'undefined')
20
30
  return;
21
- if (product.name) {
31
+ if (freshProduct.name) {
22
32
  const root = document.documentElement;
23
33
  Array.from(root.classList)
24
34
  .filter((c) => c.startsWith('product-'))
25
35
  .forEach((c) => root.classList.remove(c));
26
- root.classList.add((0, utils_1.getProductClassName)(product.name));
36
+ root.classList.add((0, utils_1.getProductClassName)(freshProduct.name));
27
37
  }
28
- loadAndNavigate({ navigate, to: (0, utils_2.withPathPrefix)(product.link) });
38
+ loadAndNavigate({ navigate, to: (0, utils_2.withPathPrefix)(freshProduct.link) });
29
39
  }
30
40
  return {
31
41
  currentProduct,
@@ -1,48 +1,59 @@
1
1
  export declare const useTelemetryFallback: () => {
2
2
  send: () => void;
3
- sendPageViewedMessage: () => void;
4
- sendPageActionsButtonClickedMessage: () => void;
5
3
  sendErrorMessage: () => void;
6
4
  sendClientErrorMessage: () => void;
5
+ sendCatalogEntitiesFilterCheckboxToggledMessage: () => void;
6
+ sendCatalogEntitiesCopyDataSchemaClickedMessage: () => void;
7
+ sendCatalogEntitiesViewModeChangedMessage: () => void;
8
+ sendCatalogEntitiesRelatedEntitiesListSearchQueryMessage: () => void;
9
+ sendCatalogEntitiesRelatedEntitiesListSearchResultClickMessage: () => void;
10
+ sendCatalogEntitiesListSearchQueryMessage: () => void;
11
+ sendCatalogEntitiesListSearchResultClickedMessage: () => void;
12
+ sendRedirectMessage: () => void;
13
+ sendCustomMessage: () => void;
14
+ sendSearchAIQueryMessage: () => void;
15
+ sendSearchAiOpenedMessage: () => void;
16
+ sendSearchAIFeedbackMessage: () => void;
17
+ sendLoginClickedMessage: () => void;
18
+ sendLoginProviderClickedMessage: () => void;
19
+ sendLogoutClickedMessage: () => void;
20
+ sendBannerViewedMessage: () => void;
21
+ sendBannerLinkClickedMessage: () => void;
22
+ sendBannerDismissedMessage: () => void;
7
23
  sendBreadcrumbClickedMessage: () => void;
8
- sendColorModeSwitchedMessage: () => void;
9
- sendSidebarItemClickedMessage: () => void;
10
- sendSidebarItemExpandedMessage: () => void;
11
- sendSidebarItemCollapsedMessage: () => void;
12
- sendChangeLayoutButtonClickedMessage: () => void;
13
- sendEditPageLinkClickedMessage: () => void;
14
- sendCodeSnippetReportedMessage: () => void;
15
- sendNavbarMenuItemClickedMessage: () => void;
16
- sendLoginButtonClickedMessage: () => void;
17
- sendLoginProviderButtonClickedMessage: () => void;
18
- sendLogoutMenuItemClickedMessage: () => void;
19
- sendLogoClickedMessage: () => void;
20
- sendTocItemClickedMessage: () => void;
24
+ sendCatalogActionsClickedMessage: () => void;
21
25
  sendCatalogFilterChangedMessage: () => void;
22
26
  sendCatalogItemClickedMessage: () => void;
23
27
  sendScorecardLinkClickedMessage: () => void;
24
- sendBackToCatalogButtonClickedMessage: () => void;
25
- sendSidebarDrilldownBackButtonClickedMessage: () => void;
28
+ sendFilterCheckboxToggledMessage: () => void;
29
+ sendFeedbackMessage: () => void;
26
30
  sendFooterItemClickedMessage: () => void;
27
- sendCatalogActionsButtonClickedMessage: () => void;
28
- sendMobileMenuButtonCloseClickedMessage: () => void;
29
- sendMobileMenuButtonOpenClickedMessage: () => void;
30
- sendSearchInputResetButtonClickedMessage: () => void;
31
- sendSearchRecentRemoveButtonClickedMessage: () => void;
31
+ sendNavbarMenuItemClickedMessage: () => void;
32
+ sendColorModeSwitchedMessage: () => void;
33
+ sendLanguagePickerChangedMessage: () => void;
34
+ sendProductPickerChangedMessage: () => void;
35
+ sendLogoClickedMessage: () => void;
36
+ sendCodeSnippetReportedMessage: () => void;
37
+ sendMobileMenuClosedMessage: () => void;
38
+ sendMobileMenuOpenedMessage: () => void;
39
+ sendPageViewedMessage: () => void;
40
+ sendPageTimeMessage: () => void;
41
+ sendPageActionsClickedMessage: () => void;
42
+ sendPageEditClickedMessage: () => void;
43
+ sendSidebarDrilldownBackClickedMessage: () => void;
44
+ sendSidebarItemClickedMessage: () => void;
45
+ sendSidebarExpandedMessage: () => void;
46
+ sendSidebarCollapsedMessage: () => void;
47
+ sendChangeLayoutClickedMessage: () => void;
48
+ sendRequestApiAccessClickedMessage: () => void;
49
+ sendVersionPickerChangedMessage: () => void;
50
+ sendSearchInputResetClickedMessage: () => void;
51
+ sendSearchResultClickedMessage: () => void;
52
+ sendSearchRecentRemoveClickedMessage: () => void;
32
53
  sendSearchRecentClickedMessage: () => void;
33
- sendRequestApiAccessButtonClickedMessage: () => void;
34
- sendVersionPickerSelectionChangeMessage: () => void;
35
- sendProductPickedMessage: () => void;
36
- sendFilterCheckboxToggledMessage: () => void;
37
- sendLanguagePickerLocaleChangedMessage: () => void;
38
54
  sendSearchOpenedMessage: () => void;
39
55
  sendSearchQueryMessage: () => void;
40
- sendSearchAiOpenedMessage: () => void;
41
- sendSearchAIQueryMessage: () => void;
42
- sendSearchAIFeedbackMessage: () => void;
43
- sendFeedbackMessage: () => void;
44
- sendSearchResultClickedMessage: () => void;
45
- sendRedirectMessage: () => void;
56
+ sendTocItemClickedMessage: () => void;
46
57
  sendOpenapiDocsMessage: () => void;
47
58
  sendCopyCodeSnippetClickedMessage: () => void;
48
59
  sendViewedMessage: () => void;
@@ -65,10 +76,7 @@ export declare const useTelemetryFallback: () => {
65
76
  sendAsyncapiDocsReferencedInClickedMessage: () => void;
66
77
  sendGraphqlDocsViewedMessage: () => void;
67
78
  sendGraphqlDocsPerformanceMetricsMessage: () => void;
79
+ sendGraphqlDocsDownloadDefinitionClickedMessage: () => void;
68
80
  sendGraphqlDocsReferencedInLinkClickedMessage: () => void;
69
81
  sendGraphqlDocsRequiredScopesModalOpenedMessage: () => void;
70
- sendGraphqlDocsDownloadDefinitionClickedMessage: () => void;
71
- sendBannerViewedMessage: () => void;
72
- sendBannerLinkClickedMessage: () => void;
73
- sendBannerDismissedMessage: () => void;
74
82
  };
@@ -1,53 +1,64 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useTelemetryFallback = void 0;
4
- // eslint-disable-next-line no-warning-comments
5
- // TODO we need to create some common way to do this.
4
+ // Fallback no-op telemetry used by `useThemeHooks` when no ThemeDataContext
5
+ // provider supplies real hooks.
6
6
  const useTelemetryFallback = () => ({
7
7
  send: () => { },
8
- sendPageViewedMessage: () => { },
9
- sendPageActionsButtonClickedMessage: () => { },
10
8
  sendErrorMessage: () => { },
11
9
  sendClientErrorMessage: () => { },
10
+ sendCatalogEntitiesFilterCheckboxToggledMessage: () => { },
11
+ sendCatalogEntitiesCopyDataSchemaClickedMessage: () => { },
12
+ sendCatalogEntitiesViewModeChangedMessage: () => { },
13
+ sendCatalogEntitiesRelatedEntitiesListSearchQueryMessage: () => { },
14
+ sendCatalogEntitiesRelatedEntitiesListSearchResultClickMessage: () => { },
15
+ sendCatalogEntitiesListSearchQueryMessage: () => { },
16
+ sendCatalogEntitiesListSearchResultClickedMessage: () => { },
17
+ sendRedirectMessage: () => { },
18
+ sendCustomMessage: () => { },
19
+ sendSearchAIQueryMessage: () => { },
20
+ sendSearchAiOpenedMessage: () => { },
21
+ sendSearchAIFeedbackMessage: () => { },
22
+ sendLoginClickedMessage: () => { },
23
+ sendLoginProviderClickedMessage: () => { },
24
+ sendLogoutClickedMessage: () => { },
25
+ sendBannerViewedMessage: () => { },
26
+ sendBannerLinkClickedMessage: () => { },
27
+ sendBannerDismissedMessage: () => { },
12
28
  sendBreadcrumbClickedMessage: () => { },
13
- sendColorModeSwitchedMessage: () => { },
14
- sendSidebarItemClickedMessage: () => { },
15
- sendSidebarItemExpandedMessage: () => { },
16
- sendSidebarItemCollapsedMessage: () => { },
17
- sendChangeLayoutButtonClickedMessage: () => { },
18
- sendEditPageLinkClickedMessage: () => { },
19
- sendCodeSnippetReportedMessage: () => { },
20
- sendNavbarMenuItemClickedMessage: () => { },
21
- sendLoginButtonClickedMessage: () => { },
22
- sendLoginProviderButtonClickedMessage: () => { },
23
- sendLogoutMenuItemClickedMessage: () => { },
24
- sendLogoClickedMessage: () => { },
25
- sendTocItemClickedMessage: () => { },
29
+ sendCatalogActionsClickedMessage: () => { },
26
30
  sendCatalogFilterChangedMessage: () => { },
27
31
  sendCatalogItemClickedMessage: () => { },
28
32
  sendScorecardLinkClickedMessage: () => { },
29
- sendBackToCatalogButtonClickedMessage: () => { },
30
- sendSidebarDrilldownBackButtonClickedMessage: () => { },
33
+ sendFilterCheckboxToggledMessage: () => { },
34
+ sendFeedbackMessage: () => { },
31
35
  sendFooterItemClickedMessage: () => { },
32
- sendCatalogActionsButtonClickedMessage: () => { },
33
- sendMobileMenuButtonCloseClickedMessage: () => { },
34
- sendMobileMenuButtonOpenClickedMessage: () => { },
35
- sendSearchInputResetButtonClickedMessage: () => { },
36
- sendSearchRecentRemoveButtonClickedMessage: () => { },
36
+ sendNavbarMenuItemClickedMessage: () => { },
37
+ sendColorModeSwitchedMessage: () => { },
38
+ sendLanguagePickerChangedMessage: () => { },
39
+ sendProductPickerChangedMessage: () => { },
40
+ sendLogoClickedMessage: () => { },
41
+ sendCodeSnippetReportedMessage: () => { },
42
+ sendMobileMenuClosedMessage: () => { },
43
+ sendMobileMenuOpenedMessage: () => { },
44
+ sendPageViewedMessage: () => { },
45
+ sendPageTimeMessage: () => { },
46
+ sendPageActionsClickedMessage: () => { },
47
+ sendPageEditClickedMessage: () => { },
48
+ sendSidebarDrilldownBackClickedMessage: () => { },
49
+ sendSidebarItemClickedMessage: () => { },
50
+ sendSidebarExpandedMessage: () => { },
51
+ sendSidebarCollapsedMessage: () => { },
52
+ sendChangeLayoutClickedMessage: () => { },
53
+ sendRequestApiAccessClickedMessage: () => { },
54
+ sendVersionPickerChangedMessage: () => { },
55
+ sendSearchInputResetClickedMessage: () => { },
56
+ sendSearchResultClickedMessage: () => { },
57
+ sendSearchRecentRemoveClickedMessage: () => { },
37
58
  sendSearchRecentClickedMessage: () => { },
38
- sendRequestApiAccessButtonClickedMessage: () => { },
39
- sendVersionPickerSelectionChangeMessage: () => { },
40
- sendProductPickedMessage: () => { },
41
- sendFilterCheckboxToggledMessage: () => { },
42
- sendLanguagePickerLocaleChangedMessage: () => { },
43
59
  sendSearchOpenedMessage: () => { },
44
60
  sendSearchQueryMessage: () => { },
45
- sendSearchAiOpenedMessage: () => { },
46
- sendSearchAIQueryMessage: () => { },
47
- sendSearchAIFeedbackMessage: () => { },
48
- sendFeedbackMessage: () => { },
49
- sendSearchResultClickedMessage: () => { },
50
- sendRedirectMessage: () => { },
61
+ sendTocItemClickedMessage: () => { },
51
62
  sendOpenapiDocsMessage: () => { },
52
63
  sendCopyCodeSnippetClickedMessage: () => { },
53
64
  sendViewedMessage: () => { },
@@ -70,12 +81,9 @@ const useTelemetryFallback = () => ({
70
81
  sendAsyncapiDocsReferencedInClickedMessage: () => { },
71
82
  sendGraphqlDocsViewedMessage: () => { },
72
83
  sendGraphqlDocsPerformanceMetricsMessage: () => { },
84
+ sendGraphqlDocsDownloadDefinitionClickedMessage: () => { },
73
85
  sendGraphqlDocsReferencedInLinkClickedMessage: () => { },
74
86
  sendGraphqlDocsRequiredScopesModalOpenedMessage: () => { },
75
- sendGraphqlDocsDownloadDefinitionClickedMessage: () => { },
76
- sendBannerViewedMessage: () => { },
77
- sendBannerLinkClickedMessage: () => { },
78
- sendBannerDismissedMessage: () => { },
79
87
  });
80
88
  exports.useTelemetryFallback = useTelemetryFallback;
81
89
  //# sourceMappingURL=use-telemetry-fallback.js.map
@@ -124,5 +124,6 @@ export declare enum ToolCallName {
124
124
  GetEndpoints = "get-endpoints",
125
125
  GetEndpointInfo = "get-endpoint-info",
126
126
  GetSecuritySchemes = "get-security-schemes",
127
- GetFullApiDescription = "get-full-api-description"
127
+ GetFullApiDescription = "get-full-api-description",
128
+ Execute = "execute"
128
129
  }
@@ -14,5 +14,6 @@ var ToolCallName;
14
14
  ToolCallName["GetEndpointInfo"] = "get-endpoint-info";
15
15
  ToolCallName["GetSecuritySchemes"] = "get-security-schemes";
16
16
  ToolCallName["GetFullApiDescription"] = "get-full-api-description";
17
+ ToolCallName["Execute"] = "execute";
17
18
  })(ToolCallName || (exports.ToolCallName = ToolCallName = {}));
18
19
  //# sourceMappingURL=search.js.map
@@ -46,3 +46,5 @@ export * from './content-segments';
46
46
  export * from './custom-catalog-options-casing';
47
47
  export * from './get-auto-dismiss-duration';
48
48
  export * from './tooltip-placement';
49
+ export * from './telemetry/get-base-data-attributes';
50
+ export * from './telemetry/generate-before-after-context';
@@ -62,4 +62,6 @@ __exportStar(require("./content-segments"), exports);
62
62
  __exportStar(require("./custom-catalog-options-casing"), exports);
63
63
  __exportStar(require("./get-auto-dismiss-duration"), exports);
64
64
  __exportStar(require("./tooltip-placement"), exports);
65
+ __exportStar(require("./telemetry/get-base-data-attributes"), exports);
66
+ __exportStar(require("./telemetry/generate-before-after-context"), exports);
65
67
  //# sourceMappingURL=index.js.map
@@ -0,0 +1,37 @@
1
+ import type { AsyncApiRealmUI } from '@redocly/realm-asyncapi-sdk';
2
+ type UITelemetryClient = AsyncApiRealmUI.Telemetry;
3
+ type UITelemetryClientMethods = {
4
+ [K in keyof UITelemetryClient]: UITelemetryClient[K] extends (...args: any) => any ? UITelemetryClient[K] : never;
5
+ };
6
+ type UITelemetryClientMethodKeys = {
7
+ [K in keyof UITelemetryClientMethods]: Parameters<UITelemetryClientMethods[K]>[0] extends readonly [any, any, ...any[]] ? K : never;
8
+ }[keyof UITelemetryClientMethods];
9
+ type EventSchemaProps<T extends UITelemetryClientMethodKeys> = Parameters<UITelemetryClientMethods[T]>[0];
10
+ type EventAfterContext<T extends UITelemetryClientMethodKeys> = EventSchemaProps<T>[0];
11
+ type EventBeforeContext<T extends UITelemetryClientMethodKeys> = EventSchemaProps<T>[1];
12
+ /**
13
+ * Builds a typed `[after, before]` tuple for Realm UI telemetry events whose AsyncAPI
14
+ * contract lists the updated state first, then the prior state (per CloudEvents styleguide).
15
+ *
16
+ * Each slice merges {@link getBaseDataAttributes} (`id`, `object`, `uri`) with the
17
+ * corresponding partial payload and sets `context` to `'after'` or `'before'`.
18
+ *
19
+ * @template T - Telemetry client method key whose `data` tuple is
20
+ * `[after, before, ...]` (for example `'sendLanguagePickerChangedMessage'`).
21
+ * @param id - Stable resource identifier passed to {@link getBaseDataAttributes}
22
+ * and included on both payloads.
23
+ * @param object - Resource kind passed to {@link getBaseDataAttributes}
24
+ * and included on both payloads (for example `'dropdown'` or `'button'`).
25
+ * @param before - Event-specific fields for the prior state, excluding `id`, `object`,
26
+ * `uri`, and `context` (filled by this helper).
27
+ * @param after - Event-specific fields for the updated state, excluding `id`, `object`,
28
+ * `uri`, and `context` (filled by this helper).
29
+ * @returns A two-tuple in send order: the fully merged after payload, then the fully
30
+ * merged before payload. Spread into the matching `send*Message` call.
31
+ */
32
+ export declare function generateBeforeAfterContext<T extends UITelemetryClientMethodKeys>(id: EventAfterContext<T>['id'], object: EventAfterContext<T>['object'], before: Omit<EventBeforeContext<T>, 'id' | 'object' | 'uri' | 'context'>, after: Omit<EventAfterContext<T>, 'id' | 'object' | 'uri' | 'context'>): [EventAfterContext<T> & {
33
+ context: 'after';
34
+ }, EventBeforeContext<T> & {
35
+ context: 'before';
36
+ }];
37
+ export {};
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateBeforeAfterContext = generateBeforeAfterContext;
4
+ const get_base_data_attributes_1 = require("./get-base-data-attributes");
5
+ /**
6
+ * Builds a typed `[after, before]` tuple for Realm UI telemetry events whose AsyncAPI
7
+ * contract lists the updated state first, then the prior state (per CloudEvents styleguide).
8
+ *
9
+ * Each slice merges {@link getBaseDataAttributes} (`id`, `object`, `uri`) with the
10
+ * corresponding partial payload and sets `context` to `'after'` or `'before'`.
11
+ *
12
+ * @template T - Telemetry client method key whose `data` tuple is
13
+ * `[after, before, ...]` (for example `'sendLanguagePickerChangedMessage'`).
14
+ * @param id - Stable resource identifier passed to {@link getBaseDataAttributes}
15
+ * and included on both payloads.
16
+ * @param object - Resource kind passed to {@link getBaseDataAttributes}
17
+ * and included on both payloads (for example `'dropdown'` or `'button'`).
18
+ * @param before - Event-specific fields for the prior state, excluding `id`, `object`,
19
+ * `uri`, and `context` (filled by this helper).
20
+ * @param after - Event-specific fields for the updated state, excluding `id`, `object`,
21
+ * `uri`, and `context` (filled by this helper).
22
+ * @returns A two-tuple in send order: the fully merged after payload, then the fully
23
+ * merged before payload. Spread into the matching `send*Message` call.
24
+ */
25
+ function generateBeforeAfterContext(id, object, before, after) {
26
+ const baseAttributes = (0, get_base_data_attributes_1.getBaseDataAttributes)(id, object);
27
+ return [
28
+ Object.assign(Object.assign(Object.assign({}, baseAttributes), { context: 'after' }), after),
29
+ Object.assign(Object.assign(Object.assign({}, baseAttributes), { context: 'before' }), before),
30
+ ];
31
+ }
32
+ //# sourceMappingURL=generate-before-after-context.js.map
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Generates a resource URN for Realm UI telemetry.
3
+ * @param object - The object type.
4
+ * @param id - The resource ID.
5
+ * @returns The resource URN.
6
+ */
7
+ export declare function generateResourceUrn<K, T, U>(object: K, id: T): U;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateResourceUrn = generateResourceUrn;
4
+ /**
5
+ * Generates a resource URN for Realm UI telemetry.
6
+ * @param object - The object type.
7
+ * @param id - The resource ID.
8
+ * @returns The resource URN.
9
+ */
10
+ function generateResourceUrn(object, id) {
11
+ return `urn:redocly:realm:ui:${object}:${id}`;
12
+ }
13
+ //# sourceMappingURL=generate-resource-urn.js.map
@@ -0,0 +1,14 @@
1
+ export type BaseDataAttributes<T, K, U> = {
2
+ /** Resource identifier (e.g. UI key, or page URL when tracking navigation). */
3
+ id: T;
4
+ /** Object kind used for telemetry categorization (e.g. `'button'`, `'page'`). */
5
+ object: K;
6
+ /** Resolved URI: the optional `url` when provided, otherwise a Realm UI resource URN. */
7
+ uri: U;
8
+ };
9
+ /**
10
+ * Builds the base fields for Realm UI telemetry payloads: `id`, `object`, and `uri`.
11
+ * When `url` is omitted, {@link generateResourceUrn} derives `uri` as
12
+ * `urn:redocly:realm:ui:{object}:{id}`.
13
+ */
14
+ export declare function getBaseDataAttributes<T, K, U>(id: T, object: K, url?: U): BaseDataAttributes<T, K, U>;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getBaseDataAttributes = getBaseDataAttributes;
4
+ const generate_resource_urn_1 = require("./generate-resource-urn");
5
+ /**
6
+ * Builds the base fields for Realm UI telemetry payloads: `id`, `object`, and `uri`.
7
+ * When `url` is omitted, {@link generateResourceUrn} derives `uri` as
8
+ * `urn:redocly:realm:ui:{object}:{id}`.
9
+ */
10
+ function getBaseDataAttributes(id, object, url) {
11
+ return {
12
+ id,
13
+ object,
14
+ uri: url !== null && url !== void 0 ? url : (0, generate_resource_urn_1.generateResourceUrn)(object, id),
15
+ };
16
+ }
17
+ //# sourceMappingURL=get-base-data-attributes.js.map