@redocly/theme 0.54.0-next.6 → 0.54.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 (53) hide show
  1. package/lib/components/Breadcrumbs/Breadcrumbs.js +9 -6
  2. package/lib/components/Buttons/EditPageButton.js +3 -3
  3. package/lib/components/CatalogClassic/CatalogClassicActions.js +3 -3
  4. package/lib/components/CatalogClassic/CatalogClassicCard.js +17 -4
  5. package/lib/components/CatalogClassic/CatalogClassicInfoBlock.js +3 -3
  6. package/lib/components/CatalogClassic/CatalogClassicVirtualizedGroups.js +19 -25
  7. package/lib/components/Feedback/ReportDialog.js +3 -3
  8. package/lib/components/Filter/FilterCheckboxes.js +3 -3
  9. package/lib/components/Footer/FooterItem.js +3 -3
  10. package/lib/components/LanguagePicker/LanguagePicker.js +6 -3
  11. package/lib/components/Logo/Logo.js +3 -3
  12. package/lib/components/Menu/MenuItem.js +9 -4
  13. package/lib/components/Navbar/Navbar.js +5 -5
  14. package/lib/components/Navbar/NavbarItem.js +3 -3
  15. package/lib/components/Search/SearchInput.js +3 -3
  16. package/lib/components/Search/SearchRecent.js +3 -3
  17. package/lib/components/SidebarActions/SidebarActions.js +5 -7
  18. package/lib/components/TableOfContent/TableOfContent.js +3 -3
  19. package/lib/components/UserMenu/LoginButton.js +3 -3
  20. package/lib/components/UserMenu/LogoutMenuItem.js +3 -3
  21. package/lib/core/hooks/search/use-search-dialog.js +4 -4
  22. package/lib/core/hooks/use-color-switcher.js +6 -3
  23. package/lib/core/hooks/use-product-picker.js +3 -3
  24. package/lib/core/types/hooks.d.ts +1 -1
  25. package/lib/core/types/l10n.d.ts +1 -1
  26. package/lib/core/types/search.d.ts +6 -0
  27. package/package.json +3 -3
  28. package/src/components/Breadcrumbs/Breadcrumbs.tsx +9 -6
  29. package/src/components/Buttons/EditPageButton.tsx +3 -3
  30. package/src/components/CatalogClassic/CatalogClassicActions.tsx +3 -3
  31. package/src/components/CatalogClassic/CatalogClassicCard.tsx +19 -4
  32. package/src/components/CatalogClassic/CatalogClassicInfoBlock.tsx +5 -3
  33. package/src/components/CatalogClassic/CatalogClassicVirtualizedGroups.tsx +23 -29
  34. package/src/components/Feedback/ReportDialog.tsx +3 -3
  35. package/src/components/Filter/FilterCheckboxes.tsx +3 -3
  36. package/src/components/Footer/FooterItem.tsx +3 -3
  37. package/src/components/LanguagePicker/LanguagePicker.tsx +6 -3
  38. package/src/components/Logo/Logo.tsx +3 -3
  39. package/src/components/Menu/MenuItem.tsx +9 -3
  40. package/src/components/Navbar/Navbar.tsx +5 -5
  41. package/src/components/Navbar/NavbarItem.tsx +5 -3
  42. package/src/components/Search/SearchInput.tsx +3 -3
  43. package/src/components/Search/SearchRecent.tsx +3 -3
  44. package/src/components/SidebarActions/SidebarActions.tsx +5 -5
  45. package/src/components/TableOfContent/TableOfContent.tsx +3 -3
  46. package/src/components/UserMenu/LoginButton.tsx +3 -3
  47. package/src/components/UserMenu/LogoutMenuItem.tsx +3 -3
  48. package/src/core/hooks/search/use-search-dialog.ts +4 -4
  49. package/src/core/hooks/use-color-switcher.ts +6 -3
  50. package/src/core/hooks/use-product-picker.ts +3 -3
  51. package/src/core/types/hooks.ts +1 -40
  52. package/src/core/types/l10n.ts +3 -1
  53. package/src/core/types/search.ts +6 -0
@@ -9,8 +9,8 @@ const styled_components_1 = __importDefault(require("styled-components"));
9
9
  const hooks_1 = require("../../core/hooks");
10
10
  const Breadcrumb_1 = require("../../components/Breadcrumbs/Breadcrumb");
11
11
  function Breadcrumbs(props) {
12
- const { useBreadcrumbs, useTelemetry } = (0, hooks_1.useThemeHooks)();
13
- const telemetry = useTelemetry();
12
+ const { useBreadcrumbs, useOtelTelemetry } = (0, hooks_1.useThemeHooks)();
13
+ const otelTelemetry = useOtelTelemetry();
14
14
  const breadcrumbs = useBreadcrumbs();
15
15
  if (breadcrumbs.length === 0) {
16
16
  return null;
@@ -19,10 +19,13 @@ function Breadcrumbs(props) {
19
19
  const isLast = idx === breadcrumbs.length - 1;
20
20
  return (react_1.default.createElement(react_1.default.Fragment, { key: idx },
21
21
  react_1.default.createElement(Breadcrumb_1.Breadcrumb, { link: breadcrumb.link, label: breadcrumb.label, isActive: isLast, onClick: () => {
22
- telemetry.send('breadcrumb_clicked', {
23
- link: breadcrumb.link,
24
- position: idx + 1,
25
- total_breadcrumbs: breadcrumbs.length,
22
+ otelTelemetry.send({
23
+ type: 'breadcrumb.clicked',
24
+ payload: {
25
+ link: breadcrumb.link,
26
+ position: idx + 1,
27
+ total_breadcrumbs: breadcrumbs.length,
28
+ },
26
29
  });
27
30
  } }),
28
31
  isLast ? null : react_1.default.createElement("span", null, "/")));
@@ -10,10 +10,10 @@ const hooks_1 = require("../../core/hooks");
10
10
  const EditIcon_1 = require("../../icons/EditIcon/EditIcon");
11
11
  const Link_1 = require("../../components/Link/Link");
12
12
  function EditPageButton({ to }) {
13
- const { useTranslate, useTelemetry } = (0, hooks_1.useThemeHooks)();
13
+ const { useTranslate, useOtelTelemetry } = (0, hooks_1.useThemeHooks)();
14
14
  const { translate } = useTranslate();
15
- const telemetry = useTelemetry();
16
- return (react_1.default.createElement(EditPageButtonWrapper, { "data-component-name": "Buttons/EditPageButton", target: "_blank", to: to, onClick: () => telemetry.send('edit_page_link_clicked', {}) },
15
+ const otelTelemetry = useOtelTelemetry();
16
+ return (react_1.default.createElement(EditPageButtonWrapper, { "data-component-name": "Buttons/EditPageButton", target: "_blank", to: to, onClick: () => otelTelemetry.send({ type: 'edit_page_link.clicked' }) },
17
17
  react_1.default.createElement(ButtonIcon, null),
18
18
  react_1.default.createElement(ButtonText, { "data-translation-key": "markdown.editPage.text" }, translate('markdown.editPage.text', 'Edit'))));
19
19
  }
@@ -45,13 +45,13 @@ function CatalogClassicActions(props) {
45
45
  activeFilters++;
46
46
  }
47
47
  }
48
- const { useTranslate, useTelemetry } = (0, hooks_1.useThemeHooks)();
48
+ const { useTranslate, useOtelTelemetry } = (0, hooks_1.useThemeHooks)();
49
49
  const { translate } = useTranslate();
50
- const telemetry = useTelemetry();
50
+ const otelTelemetry = useOtelTelemetry();
51
51
  return (React.createElement(CatalogActionsWrapper, { "data-component-name": "CatalogClassic/CatalogClassicActions" },
52
52
  React.createElement(Button_1.Button, { variant: "ghost", size: "small", icon: React.createElement(FilterIcon_1.FilterIcon, null), iconPosition: "left", onClick: () => {
53
53
  onOpenFilter();
54
- telemetry.send('catalog_actions_button_clicked', {});
54
+ otelTelemetry.send({ type: 'catalog_actions_button.clicked' });
55
55
  }, "data-translation-key": "catalog.filters.title" }, translate('catalog.filters.title', 'Filters')),
56
56
  activeFilters > 0 ? React.createElement(CounterTag_1.CounterTag, { borderless: true }, activeFilters) : null));
57
57
  }
@@ -36,18 +36,31 @@ const Link_1 = require("../../components/Link/Link");
36
36
  const Tag_1 = require("../../components/Tag/Tag");
37
37
  const CatalogClassicHighlight_1 = require("../../components/CatalogClassic/CatalogClassicHighlight");
38
38
  const Button_1 = require("../../components/Button/Button");
39
+ /**
40
+ * Strips HTML tags from a plain string.
41
+ */
42
+ function stripHtmlTags(text) {
43
+ if (!text)
44
+ return '';
45
+ // This regex matches:
46
+ // - Opening tags: <tagname> or <tagname attributes>
47
+ // - Closing tags: </tagname>
48
+ // - Self-closing tags: <tagname/> or <tagname attributes/>
49
+ const htmlTagRegex = /<\/?[a-zA-Z][a-zA-Z0-9]*(?:\s[^>]*)?\/?>|<[a-zA-Z][a-zA-Z0-9]*\/>/g;
50
+ return text.replace(htmlTagRegex, '').trim();
51
+ }
39
52
  function CatalogClassicCard({ item }) {
40
53
  var _a, _b;
41
- const { useTelemetry } = (0, hooks_1.useThemeHooks)();
42
- const telemetry = useTelemetry();
54
+ const { useOtelTelemetry } = (0, hooks_1.useThemeHooks)();
55
+ const otelTelemetry = useOtelTelemetry();
43
56
  return (React.createElement(Link_1.Link, { key: item.docsLink || item.link, to: item.docsLink || item.link },
44
- React.createElement(StyledCard, { "data-component-name": "CatalogClassic/CatalogClassicCard", onClick: () => telemetry.send('catalog_item_clicked', {}) },
57
+ React.createElement(StyledCard, { "data-component-name": "CatalogClassic/CatalogClassicCard", onClick: () => otelTelemetry.send({ type: 'catalog_item.clicked' }) },
45
58
  React.createElement(CardContent, null,
46
59
  React.createElement(CardTitleWrapper, null,
47
60
  React.createElement(CardTitle, null,
48
61
  React.createElement(CatalogClassicHighlight_1.CatalogClassicHighlight, null, item.title))),
49
62
  React.createElement(CardDescription, null,
50
- React.createElement(CatalogClassicHighlight_1.CatalogClassicHighlight, null, (_b = (_a = item.summary) !== null && _a !== void 0 ? _a : item.description) !== null && _b !== void 0 ? _b : ''))),
63
+ React.createElement(CatalogClassicHighlight_1.CatalogClassicHighlight, null, stripHtmlTags((_b = (_a = item.summary) !== null && _a !== void 0 ? _a : item.description) !== null && _b !== void 0 ? _b : '')))),
51
64
  React.createElement(CardFooter, null,
52
65
  React.createElement(CardTags, null,
53
66
  (item.tags || []).map((tag, index) => (React.createElement(CardTag, { key: tag + index, color: (0, utils_1.slug)(tag) },
@@ -18,10 +18,10 @@ function CatalogClassicInfoBlock(props) {
18
18
  }
19
19
  function ScorecardBadge(props) {
20
20
  const { level, slug, colorVariable } = props;
21
- const { useTelemetry } = (0, hooks_1.useThemeHooks)();
22
- const telemetry = useTelemetry();
21
+ const { useOtelTelemetry } = (0, hooks_1.useThemeHooks)();
22
+ const otelTelemetry = useOtelTelemetry();
23
23
  return (react_1.default.createElement(Link_1.Link, { to: slug },
24
- react_1.default.createElement(Tag_1.Tag, { onClick: () => telemetry.send('scorecard_link_clicked', { action: 'click' }), withStatusDot: true, statusDotColor: `var(${colorVariable})` }, level)));
24
+ react_1.default.createElement(Tag_1.Tag, { onClick: () => otelTelemetry.send({ type: 'scorecard_link.clicked', payload: { action: 'click' } }), withStatusDot: true, statusDotColor: `var(${colorVariable})` }, level)));
25
25
  }
26
26
  const CatalogInfoBlockWrapper = styled_components_1.default.div `
27
27
  position: relative;
@@ -38,19 +38,17 @@ const GAP_SIZE = 32;
38
38
  const ESTIMATED_HEADER_HEIGHT = 43;
39
39
  const ESTIMATED_CARD_HEIGHT = 194 + GAP_SIZE;
40
40
  const CARD_MIN_WIDTH_VAR = '--catalog-classic-card-min-width';
41
+ const VIRTUALIZATION_THRESHOLD = 20; // Don't virtualize below this number of items
41
42
  function CatalogClassicVirtualizedGroups({ groups, filters, filterTerm, }) {
42
43
  const [isClient, setIsClient] = (0, react_1.useState)(false);
43
44
  const [size, parentRef] = (0, hooks_1.useElementSize)({ delay: 50, detectSizes: 'width' });
44
45
  (0, react_1.useEffect)(() => {
45
46
  setIsClient(true);
46
47
  }, []);
47
- (0, react_1.useEffect)(() => {
48
- if (!size.width) {
49
- return;
50
- }
51
- virtualizer.measure();
52
- // eslint-disable-next-line react-hooks/exhaustive-deps
53
- }, [filters, filterTerm, size.width]);
48
+ const totalItemCount = (0, react_1.useMemo)(() => {
49
+ return groups.reduce((total, group) => total + group.items.length, 0);
50
+ }, [groups]);
51
+ const shouldVirtualize = totalItemCount >= VIRTUALIZATION_THRESHOLD;
54
52
  const columnCount = (0, react_1.useMemo)(() => {
55
53
  if (!size.width)
56
54
  return 4;
@@ -58,7 +56,7 @@ function CatalogClassicVirtualizedGroups({ groups, filters, filterTerm, }) {
58
56
  return Math.max(1, Math.floor((size.width + GAP_SIZE) / (cardMinWidth + GAP_SIZE)));
59
57
  }, [size.width]);
60
58
  const flatRows = (0, react_1.useMemo)(() => {
61
- if (!isClient) {
59
+ if (!shouldVirtualize || !isClient) {
62
60
  return groups.flatMap((group) => [
63
61
  {
64
62
  type: 'header',
@@ -95,7 +93,7 @@ function CatalogClassicVirtualizedGroups({ groups, filters, filterTerm, }) {
95
93
  }
96
94
  });
97
95
  return rows;
98
- }, [groups, columnCount, isClient]);
96
+ }, [groups, columnCount, isClient, shouldVirtualize]);
99
97
  const virtualizer = (0, react_virtual_1.useWindowVirtualizer)({
100
98
  count: flatRows.length,
101
99
  estimateSize: (index) => {
@@ -106,6 +104,13 @@ function CatalogClassicVirtualizedGroups({ groups, filters, filterTerm, }) {
106
104
  },
107
105
  overscan: 5,
108
106
  });
107
+ (0, react_1.useEffect)(() => {
108
+ if (!size.width || !shouldVirtualize) {
109
+ return;
110
+ }
111
+ virtualizer.measure();
112
+ // eslint-disable-next-line react-hooks/exhaustive-deps
113
+ }, [filters, filterTerm, size.width, shouldVirtualize]);
109
114
  if (!isClient) {
110
115
  return (react_1.default.createElement("div", { ref: parentRef, "data-component-name": "CatalogClassic/CatalogClassicVirtualizedGroups" },
111
116
  flatRows.slice(0, 15).map((rowData) => {
@@ -114,8 +119,7 @@ function CatalogClassicVirtualizedGroups({ groups, filters, filterTerm, }) {
114
119
  react_1.default.createElement(CatalogSeparatorLabel, null, rowData.groupTitle),
115
120
  react_1.default.createElement(CounterTag_1.CounterTag, { borderless: true }, rowData.groupCount)));
116
121
  }
117
- return (react_1.default.createElement(SSRRow, { key: rowData.key }, rowData.items.map((item) => (react_1.default.createElement(CardWrapper, { key: item.link },
118
- react_1.default.createElement(CatalogClassicCard_1.CatalogClassicCard, { item: item }))))));
122
+ return (react_1.default.createElement(SSRGridRow, { key: rowData.key }, rowData.items.map((item) => (react_1.default.createElement(CatalogClassicCard_1.CatalogClassicCard, { key: item.link, item: item })))));
119
123
  }),
120
124
  react_1.default.createElement(LoadingWrapper, null,
121
125
  react_1.default.createElement(SpinnerLoader_1.SpinnerLoader, { color: "var(--catalog-classic-description-text-color)", size: "20px" }))));
@@ -145,10 +149,10 @@ const SSRHeaderRow = styled_components_1.default.div `
145
149
  font-size: var(--catalog-classic-separator-font-size);
146
150
  font-weight: var(--catalog-classic-separator-font-weight);
147
151
  `;
148
- const SSRRow = styled_components_1.default.div `
152
+ const SSRGridRow = styled_components_1.default.div `
149
153
  width: 100%;
150
- display: flex;
151
- flex-wrap: wrap;
154
+ display: grid;
155
+ grid-template-columns: repeat(auto-fill, minmax(var(--catalog-classic-card-min-width), 1fr));
152
156
  gap: var(--catalog-classic-cards-group-gap, 32px);
153
157
  padding-bottom: var(--catalog-classic-cards-group-gap, 32px);
154
158
  `;
@@ -157,21 +161,11 @@ const HeaderRow = (0, styled_components_1.default)(SSRHeaderRow) `
157
161
  left: 0;
158
162
  will-change: transform;
159
163
  `;
160
- const GridRow = styled_components_1.default.div `
164
+ const GridRow = (0, styled_components_1.default)(SSRGridRow) `
161
165
  position: absolute;
162
166
  left: 0;
163
- width: 100%;
164
- display: grid;
165
- grid-template-columns: repeat(auto-fill, minmax(var(--catalog-classic-card-min-width), 1fr));
166
- gap: var(--catalog-classic-cards-group-gap, 32px);
167
- padding-bottom: var(--catalog-classic-cards-group-gap, 32px);
168
167
  will-change: transform;
169
168
  `;
170
- const CardWrapper = styled_components_1.default.div `
171
- flex: 1 0 var(--catalog-classic-card-min-width);
172
- max-width: 100%;
173
- min-width: var(--catalog-classic-card-min-width);
174
- `;
175
169
  const CatalogSeparatorLabel = styled_components_1.default.div `
176
170
  margin: var(--catalog-classic-separator-label-margin);
177
171
  `;
@@ -21,9 +21,9 @@ const Comment_1 = require("../../components/Feedback/Comment");
21
21
  const Portal_1 = require("../../components/Portal/Portal");
22
22
  function ReportDialog({ location, settings, onSubmit, onCancel, submitFeedback, lang, }) {
23
23
  const { label } = settings;
24
- const { useTelemetry } = (0, hooks_1.useThemeHooks)();
24
+ const { useOtelTelemetry } = (0, hooks_1.useThemeHooks)();
25
25
  const { pathname } = (0, react_router_dom_1.useLocation)();
26
- const telemetry = useTelemetry();
26
+ const otelTelemetry = useOtelTelemetry();
27
27
  return (react_1.default.createElement(Portal_1.Portal, null,
28
28
  react_1.default.createElement(ReportDialogWrapper, { className: "scroll-lock", "data-component-name": "Feedback/ReportDialog" },
29
29
  react_1.default.createElement(Comment_1.Comment, { settings: { label }, onSubmit: (value) => __awaiter(this, void 0, void 0, function* () {
@@ -34,7 +34,7 @@ function ReportDialog({ location, settings, onSubmit, onCancel, submitFeedback,
34
34
  path: pathname,
35
35
  lang,
36
36
  });
37
- telemetry.send('code_snippet_reported', {});
37
+ otelTelemetry.send({ type: 'code_snippet.reported' });
38
38
  onSubmit();
39
39
  }), isDialog: true, onCancel: onCancel }))));
40
40
  }
@@ -15,16 +15,16 @@ const CheckboxIcon_1 = require("../../icons/CheckboxIcon/CheckboxIcon");
15
15
  const CounterTag_1 = require("../../components/Tags/CounterTag");
16
16
  const utils_1 = require("../../core/utils");
17
17
  function FilterCheckboxes({ filter, filterValuesCasing }) {
18
- const { useTranslate, useTelemetry } = (0, hooks_1.useThemeHooks)();
18
+ const { useTranslate, useOtelTelemetry } = (0, hooks_1.useThemeHooks)();
19
19
  const { translate } = useTranslate();
20
- const telemetry = useTelemetry();
20
+ const otelTelemetry = useOtelTelemetry();
21
21
  return (react_1.default.createElement(FilterCheckboxesWrapper, { "data-component-name": "Filter/FilterCheckboxes" },
22
22
  react_1.default.createElement(FilterTitle_1.FilterTitle, { "data-translation-key": filter.titleTranslationKey }, translate(filter.titleTranslationKey, filter.title)),
23
23
  react_1.default.createElement(FilterOptions_1.FilterOptions, null, filter.filteredOptions.map(({ value, count }) => {
24
24
  const id = 'filter--' + filter.property + '--' + value;
25
25
  return (react_1.default.createElement(FilterCheckboxOption, { key: id, role: "link", onClick: () => {
26
26
  filter.toggleOption(value);
27
- telemetry.send('filter_checkbox_toggled', { id });
27
+ otelTelemetry.send({ type: 'filter_checkbox.toggled', payload: { id } });
28
28
  } },
29
29
  react_1.default.createElement(CheckboxIcon_1.CheckboxIcon, { checked: filter.selectedOptions.has(value) }),
30
30
  react_1.default.createElement(FilterOptionLabel_1.FilterOptionLabel, { "data-translation-key": value }, (0, utils_1.changeTextCasing)(translate(value), filterValuesCasing)),
@@ -12,15 +12,15 @@ const Link_1 = require("../../components/Link/Link");
12
12
  const Image_1 = require("../../components/Image/Image");
13
13
  const utils_1 = require("../../core/utils");
14
14
  function FooterItem({ item, iconsOnly, className }) {
15
- const { useTranslate, useTelemetry } = (0, hooks_1.useThemeHooks)();
16
- const telemetry = useTelemetry();
15
+ const { useTranslate, useOtelTelemetry } = (0, hooks_1.useThemeHooks)();
16
+ const otelTelemetry = useOtelTelemetry();
17
17
  const { translate } = useTranslate();
18
18
  if (item.type === 'error') {
19
19
  return null;
20
20
  }
21
21
  const hasIcon = Boolean(item.icon || item.srcSet);
22
22
  const iconWithoutLabel = Boolean(item.label === item.link && hasIcon);
23
- return (react_1.default.createElement(FooterItemWrapper, { className: className, "data-component-name": "Footer/FooterItem", iconsOnly: iconsOnly, item: item }, item.type === 'separator' ? (react_1.default.createElement(FooterSeparator, { "data-translation-key": item.labelTranslationKey }, translate(item.labelTranslationKey, item.label))) : (react_1.default.createElement(FooterLink, { to: item.link, external: item.external, target: item.target, "data-testid": item.label, onClick: () => telemetry.send('footer_item_clicked', {}), "data-translation-key": item.labelTranslationKey },
23
+ return (react_1.default.createElement(FooterItemWrapper, { className: className, "data-component-name": "Footer/FooterItem", iconsOnly: iconsOnly, item: item }, item.type === 'separator' ? (react_1.default.createElement(FooterSeparator, { "data-translation-key": item.labelTranslationKey }, translate(item.labelTranslationKey, item.label))) : (react_1.default.createElement(FooterLink, { to: item.link, external: item.external, target: item.target, "data-testid": item.label, onClick: () => otelTelemetry.send({ type: 'footer_item.clicked' }), "data-translation-key": item.labelTranslationKey },
24
24
  hasIcon ? (react_1.default.createElement(FooterLinkIcon, { iconsOnly: iconsOnly },
25
25
  react_1.default.createElement(Image_1.Image, { src: item.icon, srcSet: item.srcSet }))) : null,
26
26
  !iconWithoutLabel ? translate(item.labelTranslationKey, item.label) : null,
@@ -15,8 +15,8 @@ const Dropdown_1 = require("../../components/Dropdown/Dropdown");
15
15
  const CheckmarkIcon_1 = require("../../icons/CheckmarkIcon/CheckmarkIcon");
16
16
  function LanguagePicker(props) {
17
17
  const { currentLocale, locales, setLocale } = (0, hooks_1.useLanguagePicker)();
18
- const { useTelemetry } = (0, hooks_1.useThemeHooks)();
19
- const telemetry = useTelemetry();
18
+ const { useOtelTelemetry } = (0, hooks_1.useThemeHooks)();
19
+ const otelTelemetry = useOtelTelemetry();
20
20
  if (locales.length < 2 || !currentLocale) {
21
21
  return null;
22
22
  }
@@ -26,7 +26,10 @@ function LanguagePicker(props) {
26
26
  onAction: () => {
27
27
  setLocale(locale.code);
28
28
  props.onChangeLanguage(locale.code);
29
- telemetry.send('language_picker_locale_changed', { locale: locale.code });
29
+ otelTelemetry.send({
30
+ type: 'language_picker_locale.changed',
31
+ payload: { locale: locale.code },
32
+ });
30
33
  },
31
34
  active: locale.code === currentLocale.code,
32
35
  suffix: locale.code === currentLocale.code && react_1.default.createElement(CheckmarkIcon_1.CheckmarkIcon, null),
@@ -22,13 +22,13 @@ const Link_1 = require("../../components/Link/Link");
22
22
  const Image_1 = require("../../components/Image/Image");
23
23
  function Logo(_a) {
24
24
  var { config, className } = _a, otherProps = __rest(_a, ["config", "className"]);
25
- const { useTelemetry } = (0, hooks_1.useThemeHooks)();
26
- const telemetry = useTelemetry();
25
+ const { useOtelTelemetry } = (0, hooks_1.useThemeHooks)();
26
+ const otelTelemetry = useOtelTelemetry();
27
27
  if (!(config === null || config === void 0 ? void 0 : config.image) && !(config === null || config === void 0 ? void 0 : config.srcSet)) {
28
28
  return null;
29
29
  }
30
30
  const image = (react_1.default.createElement(Image_1.Image, { className: className, src: config.image, srcSet: config.srcSet, alt: config.altText }));
31
- return (react_1.default.createElement(LogoWrapper, Object.assign({ "data-component-name": "Logo/Logo", className: className }, otherProps), config.link ? (react_1.default.createElement(Link_1.Link, { to: config.link, onClick: () => telemetry.send('logo_clicked', {}) }, image)) : (image)));
31
+ return (react_1.default.createElement(LogoWrapper, Object.assign({ "data-component-name": "Logo/Logo", className: className }, otherProps), config.link ? (react_1.default.createElement(Link_1.Link, { to: config.link, onClick: () => otelTelemetry.send({ type: 'logo.clicked' }) }, image)) : (image)));
32
32
  }
33
33
  const LogoWrapper = styled_components_1.default.div `
34
34
  max-width: var(--logo-max-width);
@@ -39,7 +39,7 @@ const Badge_1 = require("../../components/Badge/Badge");
39
39
  function MenuItem(props) {
40
40
  var _a;
41
41
  const { item, depth, className, onClick } = props;
42
- const { useTranslate, useTelemetry } = (0, hooks_1.useThemeHooks)();
42
+ const { useTranslate, useOtelTelemetry } = (0, hooks_1.useThemeHooks)();
43
43
  const { translate } = useTranslate();
44
44
  const type = (0, utils_1.getMenuItemType)(item);
45
45
  const nestedMenuRef = (0, react_1.useRef)(null);
@@ -47,15 +47,20 @@ function MenuItem(props) {
47
47
  const { isExpanded, canUnmount, style, handleExpand } = (0, hooks_1.useNestedMenu)(Object.assign(Object.assign({}, props), { type,
48
48
  labelRef,
49
49
  nestedMenuRef }));
50
- const telemetry = useTelemetry();
50
+ const otelTelemetry = useOtelTelemetry();
51
51
  const isDrilldown = type === constants_1.MenuItemType.DrillDown;
52
52
  const isSeparator = type === constants_1.MenuItemType.Separator;
53
53
  const isNested = type === constants_1.MenuItemType.Group;
54
54
  const hasChevron = isNested && !isDrilldown;
55
55
  const hasHttpTag = !!item.httpVerb || type === constants_1.MenuItemType.Operation;
56
56
  const handleOnClick = () => {
57
- var _a;
58
- (_a = telemetry.send) === null || _a === void 0 ? void 0 : _a.call(telemetry, 'sidebar_item_clicked', { label: item.label, type: item.type });
57
+ otelTelemetry.send({
58
+ type: 'sidebar.item_clicked',
59
+ payload: {
60
+ label: item.label,
61
+ type: item.type === 'link' || item.type === 'group' ? item.type : undefined,
62
+ },
63
+ });
59
64
  onClick === null || onClick === void 0 ? void 0 : onClick();
60
65
  if (isNested) {
61
66
  handleExpand();
@@ -21,11 +21,11 @@ const MenuIcon_1 = require("../../icons/MenuIcon/MenuIcon");
21
21
  const CloseIcon_1 = require("../../icons/CloseIcon/CloseIcon");
22
22
  function Navbar({ className }) {
23
23
  var _a;
24
- const { isOpen, openMobileMenu, closeMobileMenu } = (0, hooks_1.useMobileMenu)(false);
24
+ const { isOpen, closeMobileMenu, openMobileMenu } = (0, hooks_1.useMobileMenu)(false);
25
25
  const themeConfig = (0, hooks_1.useThemeConfig)();
26
- const { useL10n, useTelemetry } = (0, hooks_1.useThemeHooks)();
26
+ const { useL10n, useOtelTelemetry } = (0, hooks_1.useThemeHooks)();
27
27
  const { changeLanguage } = useL10n();
28
- const telemetry = useTelemetry();
28
+ const otelTelemetry = useOtelTelemetry();
29
29
  const menu = (_a = themeConfig.navbar) === null || _a === void 0 ? void 0 : _a.items;
30
30
  const { search: searchSettings, navbar, userMenu: userMenuSettings, logo } = themeConfig;
31
31
  if (navbar === null || navbar === void 0 ? void 0 : navbar.hide) {
@@ -45,11 +45,11 @@ function Navbar({ className }) {
45
45
  react_1.default.createElement(MobileMenuButton, { variant: "text", "data-testid": "mobile-menu-button", onClick: isOpen
46
46
  ? () => {
47
47
  closeMobileMenu();
48
- telemetry.send('mobile_menu_button_close_clicked', {});
48
+ otelTelemetry.send({ type: 'mobile_menu_button_close.clicked' });
49
49
  }
50
50
  : () => {
51
51
  openMobileMenu();
52
- telemetry.send('mobile_menu_button_open_clicked', {});
52
+ otelTelemetry.send({ type: 'mobile_menu_button_open.clicked' });
53
53
  }, icon: isOpen ? react_1.default.createElement(CloseIcon_1.CloseIcon, null) : react_1.default.createElement(MenuIcon_1.MenuIcon, null) }),
54
54
  hideUserMenu ? null : react_1.default.createElement(UserMenu_1.UserMenu, null))));
55
55
  }
@@ -39,17 +39,17 @@ const Link_1 = require("../../components/Link/Link");
39
39
  const Dropdown_1 = require("../../components/Dropdown/Dropdown");
40
40
  function NavbarItem({ navItem, className }) {
41
41
  const { pathname } = (0, react_router_dom_1.useLocation)();
42
- const { useTranslate, useL10nConfig, useTelemetry } = (0, hooks_1.useThemeHooks)();
42
+ const { useTranslate, useL10nConfig, useOtelTelemetry } = (0, hooks_1.useThemeHooks)();
43
43
  const { translate } = useTranslate();
44
44
  const { defaultLocale, currentLocale, locales } = useL10nConfig();
45
- const telemetry = useTelemetry();
45
+ const otelTelemetry = useOtelTelemetry();
46
46
  if (navItem.type !== 'link' && !navItem.items)
47
47
  return null;
48
48
  const item = navItem;
49
49
  const normalizedPath = (item.link && item.link !== '/' ? (0, utils_1.removeTrailingSlash)(item.link) : item.link) || '';
50
50
  const isActive = pathname ===
51
51
  (0, utils_1.withPathPrefix)((0, utils_1.getPathnameForLocale)(normalizedPath, defaultLocale, currentLocale, locales));
52
- const itemContent = (react_1.default.createElement(NavbarMenuItem, { as: item.link ? Link_1.Link : undefined, active: isActive, className: className, onClick: () => telemetry.send('navbar_menu_item_clicked', { type: item.type }), external: item.external, target: item.target, to: item.link },
52
+ const itemContent = (react_1.default.createElement(NavbarMenuItem, { as: item.link ? Link_1.Link : undefined, active: isActive, className: className, onClick: () => otelTelemetry.send({ type: 'navbar.menu_item_clicked', payload: { type: item.type } }), external: item.external, target: item.target, to: item.link },
53
53
  react_1.default.createElement(NavbarIcon, { url: item.icon }),
54
54
  react_1.default.createElement(NavbarLabel, { "data-translation-key": item.labelTranslationKey }, translate(item.labelTranslationKey, item.label)),
55
55
  item.external ? react_1.default.createElement(ExternalLinkIcon, { size: "10px" }) : null));
@@ -13,9 +13,9 @@ const hooks_1 = require("../../core/hooks");
13
13
  const CloseFilledIcon_1 = require("../../icons/CloseFilledIcon/CloseFilledIcon");
14
14
  const ChevronLeftIcon_1 = require("../../icons/ChevronLeftIcon/ChevronLeftIcon");
15
15
  function SearchInput({ placeholder, value, onChange, isLoading, showReturnButton, inputRef, onReturn, onSubmit, className, }) {
16
- const { useTelemetry } = (0, hooks_1.useThemeHooks)();
16
+ const { useOtelTelemetry } = (0, hooks_1.useThemeHooks)();
17
17
  const { addSearchHistoryItem } = (0, hooks_1.useRecentSearches)();
18
- const telemetry = useTelemetry();
18
+ const otelTelemetry = useOtelTelemetry();
19
19
  const { onKeyDown } = (0, hooks_1.useInputKeyCommands)({
20
20
  onEnter: (event) => onSubmit === null || onSubmit === void 0 ? void 0 : onSubmit(event),
21
21
  onClear: () => addSearchHistoryItem(value),
@@ -27,7 +27,7 @@ function SearchInput({ placeholder, value, onChange, isLoading, showReturnButton
27
27
  const handleOnReset = () => {
28
28
  onChange('');
29
29
  addSearchHistoryItem(value);
30
- telemetry.send('search_input_reset_button_clicked', {});
30
+ otelTelemetry.send({ type: 'search_input_reset_button.clicked' });
31
31
  };
32
32
  return (react_1.default.createElement(SearchInputWrapper, { "data-component-name": "Search/SearchInput", className: className },
33
33
  showReturnButton ? (react_1.default.createElement(Button_1.Button, { icon: react_1.default.createElement(ChevronLeftIcon_1.ChevronLeftIcon, null), onClick: onReturn })) : value && isLoading ? (react_1.default.createElement(Spinner_1.Spinner, { size: "24px", color: "--search-input-icon-color" })) : (react_1.default.createElement(SearchIcon_1.SearchIcon, { size: "24px", color: "--search-input-icon-color" })),
@@ -36,15 +36,15 @@ const RecentlyViewedIcon_1 = require("../../icons/RecentlyViewedIcon/RecentlyVie
36
36
  const Button_1 = require("../../components/Button/Button");
37
37
  function SearchRecent({ onSelect, className }) {
38
38
  const { items, removeSearchHistoryItem } = (0, hooks_1.useRecentSearches)();
39
- const { useTranslate, useTelemetry } = (0, hooks_1.useThemeHooks)();
39
+ const { useTranslate, useOtelTelemetry } = (0, hooks_1.useThemeHooks)();
40
40
  const { translate } = useTranslate();
41
- const telemetry = useTelemetry();
41
+ const otelTelemetry = useOtelTelemetry();
42
42
  if (!items || !items.length)
43
43
  return null;
44
44
  const handleOnRemove = (e, item) => {
45
45
  e.stopPropagation();
46
46
  removeSearchHistoryItem(item);
47
- telemetry.send('search_recent_remove_button_clicked', {});
47
+ otelTelemetry.send({ type: 'search_recent_remove_button.clicked' });
48
48
  };
49
49
  const handleKeyDown = (e, item, index) => {
50
50
  if (e.key === 'Enter') {
@@ -14,27 +14,25 @@ const SidePanelCloseIcon_1 = require("../../icons/SidePanelCloseIcon/SidePanelCl
14
14
  const SidePanelOpenIcon_1 = require("../../icons/SidePanelOpenIcon/SidePanelOpenIcon");
15
15
  const styled_1 = require("../../components/SidebarActions/styled");
16
16
  const SidebarActions = ({ layout, hideCollapseSidebarButton = false, collapsedSidebar, isApiDocs, onChangeViewClick, onChangeCollapseSidebarClick, requestAccessButton, className, }) => {
17
- const { useTelemetry, useTranslate } = (0, hooks_1.useThemeHooks)();
17
+ const { useOtelTelemetry, useTranslate } = (0, hooks_1.useThemeHooks)();
18
18
  const { translate } = useTranslate();
19
- const telemetry = useTelemetry();
19
+ const otelTelemetry = useOtelTelemetry();
20
20
  return (react_1.default.createElement(styled_1.ControlsWrap, { className: className, isCollapsed: collapsedSidebar, "data-component-name": "Sidebar/SidebarActions" },
21
21
  !hideCollapseSidebarButton && (react_1.default.createElement(Button_1.Button, { onClick: () => {
22
- var _a, _b;
23
22
  onChangeCollapseSidebarClick();
24
23
  if (collapsedSidebar) {
25
- (_a = telemetry.send) === null || _a === void 0 ? void 0 : _a.call(telemetry, 'sidebar_item_expanded', {});
24
+ otelTelemetry.send({ type: 'sidebar.item_expanded' });
26
25
  }
27
26
  else {
28
- (_b = telemetry.send) === null || _b === void 0 ? void 0 : _b.call(telemetry, 'sidebar_item_collapsed', {});
27
+ otelTelemetry.send({ type: 'sidebar.item_collapsed' });
29
28
  }
30
29
  }, title: collapsedSidebar
31
30
  ? translate('sidebar.actions.show', 'Show sidebar')
32
31
  : translate('sidebar.actions.hide', 'Hide sidebar'), size: "small", variant: "outlined", icon: collapsedSidebar ? react_1.default.createElement(SidePanelOpenIcon_1.SidePanelOpenIcon, null) : react_1.default.createElement(SidePanelCloseIcon_1.SidePanelCloseIcon, null) })),
33
32
  isApiDocs && (react_1.default.createElement(styled_1.ControlsWrapChangeLayoutButtons, { isCollapsed: collapsedSidebar },
34
33
  react_1.default.createElement(ChangeViewButton_1.ChangeViewButton, { collapsedSidebar: collapsedSidebar, layout: layout, onClick: () => {
35
- var _a;
36
34
  onChangeViewClick();
37
- (_a = telemetry.send) === null || _a === void 0 ? void 0 : _a.call(telemetry, 'change_layout_button_clicked', {});
35
+ otelTelemetry.send({ type: 'change_layout_button.clicked' });
38
36
  } }))),
39
37
  !collapsedSidebar && requestAccessButton));
40
38
  };
@@ -33,9 +33,9 @@ const hooks_1 = require("../../core/hooks");
33
33
  const utils_1 = require("../../core/utils");
34
34
  function TableOfContent(props) {
35
35
  const { headings, contentWrapper, className } = props;
36
- const { useTranslate, useTelemetry } = (0, hooks_1.useThemeHooks)();
36
+ const { useTranslate, useOtelTelemetry } = (0, hooks_1.useThemeHooks)();
37
37
  const { translate } = useTranslate();
38
- const telemetry = useTelemetry();
38
+ const otelTelemetry = useOtelTelemetry();
39
39
  const sidebar = React.useRef(null);
40
40
  (0, hooks_1.useFullHeight)(sidebar);
41
41
  const { markdown: { toc = {} } = {} } = (0, hooks_1.useThemeConfig)();
@@ -54,7 +54,7 @@ function TableOfContent(props) {
54
54
  return null;
55
55
  }
56
56
  const href = '#' + heading.id;
57
- return (React.createElement(TableOfContentMenuItem, { key: href + idx, href: href, depth: heading.depth - leastDepth + 1 || 0, className: activeHeadingId === heading.id ? 'active' : '', dangerouslySetInnerHTML: { __html: heading.value || '' }, "data-testid": `toc-${heading.value}`, onClick: () => telemetry.send('toc_item_clicked', {}) }));
57
+ return (React.createElement(TableOfContentMenuItem, { key: href + idx, href: href, depth: heading.depth - leastDepth + 1 || 0, className: activeHeadingId === heading.id ? 'active' : '', dangerouslySetInnerHTML: { __html: heading.value || '' }, "data-testid": `toc-${heading.value}`, onClick: () => otelTelemetry.send({ type: 'toc_item.clicked' }) }));
58
58
  })))));
59
59
  }
60
60
  const TableOfContentMenu = styled_components_1.default.aside `
@@ -8,10 +8,10 @@ const react_1 = __importDefault(require("react"));
8
8
  const hooks_1 = require("../../core/hooks");
9
9
  const Button_1 = require("../../components/Button/Button");
10
10
  function LoginButton({ href, className }) {
11
- const { useTranslate, useTelemetry } = (0, hooks_1.useThemeHooks)();
11
+ const { useTranslate, useOtelTelemetry } = (0, hooks_1.useThemeHooks)();
12
12
  const { translate } = useTranslate();
13
- const telemetry = useTelemetry();
13
+ const otelTelemetry = useOtelTelemetry();
14
14
  return (react_1.default.createElement("div", { "data-component-name": "UserMenu/LoginButton", className: className },
15
- react_1.default.createElement(Button_1.Button, { "data-translation-key": "userMenu.login", to: href, onClick: () => telemetry.send('login_button_clicked', {}), "data-testid": "login-btn", extraClass: className, variant: "primary", size: "medium" }, translate('userMenu.login', 'Login'))));
15
+ react_1.default.createElement(Button_1.Button, { "data-translation-key": "userMenu.login", to: href, onClick: () => otelTelemetry.send({ type: 'login_button.clicked' }), "data-testid": "login-btn", extraClass: className, variant: "primary", size: "medium" }, translate('userMenu.login', 'Login'))));
16
16
  }
17
17
  //# sourceMappingURL=LoginButton.js.map
@@ -9,12 +9,12 @@ 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
11
  function LogoutMenuItem({ iconOnly, className }) {
12
- const { useTranslate, useTelemetry, useUserMenu } = (0, hooks_1.useThemeHooks)();
12
+ const { useTranslate, useOtelTelemetry, useUserMenu } = (0, hooks_1.useThemeHooks)();
13
13
  const { handleLogout } = useUserMenu();
14
- const telemetry = useTelemetry();
14
+ const otelTelemetry = useOtelTelemetry();
15
15
  const { translate } = useTranslate();
16
16
  const handleClick = () => {
17
- telemetry.send('logout_menu_item_clicked', {});
17
+ otelTelemetry.send({ type: 'logout_menu_item.clicked' });
18
18
  handleLogout();
19
19
  };
20
20
  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')));
@@ -13,15 +13,15 @@ function useSearchDialog() {
13
13
  const [isOpen, setIsOpen] = (0, react_1.useState)(false);
14
14
  const themeSettings = (0, hooks_1.useThemeConfig)();
15
15
  const location = (0, react_router_dom_1.useLocation)();
16
- const { useTelemetry } = (0, hooks_1.useThemeHooks)();
17
- const telemetry = useTelemetry();
16
+ const { useOtelTelemetry } = (0, hooks_1.useThemeHooks)();
17
+ const otelTelemetry = useOtelTelemetry();
18
18
  const keyShortcuts = (_b = (_a = themeSettings === null || themeSettings === void 0 ? void 0 : themeSettings.search) === null || _a === void 0 ? void 0 : _a.shortcuts) !== null && _b !== void 0 ? _b : ['/'];
19
19
  const hotKeys = keyShortcuts === null || keyShortcuts === void 0 ? void 0 : keyShortcuts.join(',');
20
20
  (0, react_1.useEffect)(() => {
21
21
  if (hotKeys) {
22
22
  (0, hotkeys_js_1.default)(hotKeys, (ev) => {
23
23
  setIsOpen(true);
24
- telemetry.send('search_opened', { method: 'shortcut' });
24
+ otelTelemetry.send({ type: 'search.opened', payload: { method: 'shortcut' } });
25
25
  ev.preventDefault();
26
26
  });
27
27
  return () => hotkeys_js_1.default.unbind(hotKeys);
@@ -29,7 +29,7 @@ function useSearchDialog() {
29
29
  // eslint-disable-next-line react-hooks/exhaustive-deps
30
30
  }, [hotKeys]);
31
31
  const onOpen = (0, react_1.useCallback)(function () {
32
- telemetry.send('search_opened', { method: 'click' });
32
+ otelTelemetry.send({ type: 'search.opened', payload: { method: 'click' } });
33
33
  setIsOpen(true);
34
34
  // eslint-disable-next-line react-hooks/exhaustive-deps
35
35
  }, []);
@@ -5,8 +5,8 @@ const react_1 = require("react");
5
5
  const hooks_1 = require("../../core/hooks");
6
6
  const useColorSwitcher = () => {
7
7
  const themeSettings = (0, hooks_1.useThemeConfig)();
8
- const { useTelemetry } = (0, hooks_1.useThemeHooks)();
9
- const telemetry = useTelemetry();
8
+ const { useOtelTelemetry } = (0, hooks_1.useThemeHooks)();
9
+ const otelTelemetry = useOtelTelemetry();
10
10
  const colorMode = themeSettings.colorMode;
11
11
  const modes = (colorMode === null || colorMode === void 0 ? void 0 : colorMode.modes) || ['light', 'dark'];
12
12
  const defaultColor = modes[0] || 'light';
@@ -27,7 +27,10 @@ const useColorSwitcher = () => {
27
27
  window.requestAnimationFrame(() => {
28
28
  document.documentElement.classList.remove('notransition');
29
29
  });
30
- telemetry.send('color_mode_switched', { from: activeColorMode, to: newMode });
30
+ otelTelemetry.send({
31
+ type: 'color_mode.switched',
32
+ payload: { from: activeColorMode, to: newMode },
33
+ });
31
34
  setActiveColorMode(newMode);
32
35
  };
33
36
  return {