@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.
- package/lib/components/Breadcrumbs/Breadcrumbs.js +9 -6
- package/lib/components/Buttons/EditPageButton.js +3 -3
- package/lib/components/CatalogClassic/CatalogClassicActions.js +3 -3
- package/lib/components/CatalogClassic/CatalogClassicCard.js +17 -4
- package/lib/components/CatalogClassic/CatalogClassicInfoBlock.js +3 -3
- package/lib/components/CatalogClassic/CatalogClassicVirtualizedGroups.js +19 -25
- package/lib/components/Feedback/ReportDialog.js +3 -3
- package/lib/components/Filter/FilterCheckboxes.js +3 -3
- package/lib/components/Footer/FooterItem.js +3 -3
- package/lib/components/LanguagePicker/LanguagePicker.js +6 -3
- package/lib/components/Logo/Logo.js +3 -3
- package/lib/components/Menu/MenuItem.js +9 -4
- package/lib/components/Navbar/Navbar.js +5 -5
- package/lib/components/Navbar/NavbarItem.js +3 -3
- package/lib/components/Search/SearchInput.js +3 -3
- package/lib/components/Search/SearchRecent.js +3 -3
- package/lib/components/SidebarActions/SidebarActions.js +5 -7
- package/lib/components/TableOfContent/TableOfContent.js +3 -3
- package/lib/components/UserMenu/LoginButton.js +3 -3
- package/lib/components/UserMenu/LogoutMenuItem.js +3 -3
- package/lib/core/hooks/search/use-search-dialog.js +4 -4
- package/lib/core/hooks/use-color-switcher.js +6 -3
- package/lib/core/hooks/use-product-picker.js +3 -3
- package/lib/core/types/hooks.d.ts +1 -1
- package/lib/core/types/l10n.d.ts +1 -1
- package/lib/core/types/search.d.ts +6 -0
- package/package.json +3 -3
- package/src/components/Breadcrumbs/Breadcrumbs.tsx +9 -6
- package/src/components/Buttons/EditPageButton.tsx +3 -3
- package/src/components/CatalogClassic/CatalogClassicActions.tsx +3 -3
- package/src/components/CatalogClassic/CatalogClassicCard.tsx +19 -4
- package/src/components/CatalogClassic/CatalogClassicInfoBlock.tsx +5 -3
- package/src/components/CatalogClassic/CatalogClassicVirtualizedGroups.tsx +23 -29
- package/src/components/Feedback/ReportDialog.tsx +3 -3
- package/src/components/Filter/FilterCheckboxes.tsx +3 -3
- package/src/components/Footer/FooterItem.tsx +3 -3
- package/src/components/LanguagePicker/LanguagePicker.tsx +6 -3
- package/src/components/Logo/Logo.tsx +3 -3
- package/src/components/Menu/MenuItem.tsx +9 -3
- package/src/components/Navbar/Navbar.tsx +5 -5
- package/src/components/Navbar/NavbarItem.tsx +5 -3
- package/src/components/Search/SearchInput.tsx +3 -3
- package/src/components/Search/SearchRecent.tsx +3 -3
- package/src/components/SidebarActions/SidebarActions.tsx +5 -5
- package/src/components/TableOfContent/TableOfContent.tsx +3 -3
- package/src/components/UserMenu/LoginButton.tsx +3 -3
- package/src/components/UserMenu/LogoutMenuItem.tsx +3 -3
- package/src/core/hooks/search/use-search-dialog.ts +4 -4
- package/src/core/hooks/use-color-switcher.ts +6 -3
- package/src/core/hooks/use-product-picker.ts +3 -3
- package/src/core/types/hooks.ts +1 -40
- package/src/core/types/l10n.ts +3 -1
- 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,
|
|
13
|
-
const
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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,
|
|
13
|
+
const { useTranslate, useOtelTelemetry } = (0, hooks_1.useThemeHooks)();
|
|
14
14
|
const { translate } = useTranslate();
|
|
15
|
-
const
|
|
16
|
-
return (react_1.default.createElement(EditPageButtonWrapper, { "data-component-name": "Buttons/EditPageButton", target: "_blank", to: to, onClick: () =>
|
|
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,
|
|
48
|
+
const { useTranslate, useOtelTelemetry } = (0, hooks_1.useThemeHooks)();
|
|
49
49
|
const { translate } = useTranslate();
|
|
50
|
-
const
|
|
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
|
-
|
|
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 {
|
|
42
|
-
const
|
|
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: () =>
|
|
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 {
|
|
22
|
-
const
|
|
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: () =>
|
|
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.
|
|
48
|
-
|
|
49
|
-
|
|
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(
|
|
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
|
|
152
|
+
const SSRGridRow = styled_components_1.default.div `
|
|
149
153
|
width: 100%;
|
|
150
|
-
display:
|
|
151
|
-
|
|
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
|
|
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 {
|
|
24
|
+
const { useOtelTelemetry } = (0, hooks_1.useThemeHooks)();
|
|
25
25
|
const { pathname } = (0, react_router_dom_1.useLocation)();
|
|
26
|
-
const
|
|
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
|
-
|
|
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,
|
|
18
|
+
const { useTranslate, useOtelTelemetry } = (0, hooks_1.useThemeHooks)();
|
|
19
19
|
const { translate } = useTranslate();
|
|
20
|
-
const
|
|
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
|
-
|
|
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,
|
|
16
|
-
const
|
|
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: () =>
|
|
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 {
|
|
19
|
-
const
|
|
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
|
-
|
|
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 {
|
|
26
|
-
const
|
|
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: () =>
|
|
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,
|
|
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
|
|
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
|
-
|
|
58
|
-
|
|
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,
|
|
24
|
+
const { isOpen, closeMobileMenu, openMobileMenu } = (0, hooks_1.useMobileMenu)(false);
|
|
25
25
|
const themeConfig = (0, hooks_1.useThemeConfig)();
|
|
26
|
-
const { useL10n,
|
|
26
|
+
const { useL10n, useOtelTelemetry } = (0, hooks_1.useThemeHooks)();
|
|
27
27
|
const { changeLanguage } = useL10n();
|
|
28
|
-
const
|
|
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
|
-
|
|
48
|
+
otelTelemetry.send({ type: 'mobile_menu_button_close.clicked' });
|
|
49
49
|
}
|
|
50
50
|
: () => {
|
|
51
51
|
openMobileMenu();
|
|
52
|
-
|
|
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,
|
|
42
|
+
const { useTranslate, useL10nConfig, useOtelTelemetry } = (0, hooks_1.useThemeHooks)();
|
|
43
43
|
const { translate } = useTranslate();
|
|
44
44
|
const { defaultLocale, currentLocale, locales } = useL10nConfig();
|
|
45
|
-
const
|
|
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: () =>
|
|
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 {
|
|
16
|
+
const { useOtelTelemetry } = (0, hooks_1.useThemeHooks)();
|
|
17
17
|
const { addSearchHistoryItem } = (0, hooks_1.useRecentSearches)();
|
|
18
|
-
const
|
|
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
|
-
|
|
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,
|
|
39
|
+
const { useTranslate, useOtelTelemetry } = (0, hooks_1.useThemeHooks)();
|
|
40
40
|
const { translate } = useTranslate();
|
|
41
|
-
const
|
|
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
|
-
|
|
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 {
|
|
17
|
+
const { useOtelTelemetry, useTranslate } = (0, hooks_1.useThemeHooks)();
|
|
18
18
|
const { translate } = useTranslate();
|
|
19
|
-
const
|
|
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
|
-
|
|
24
|
+
otelTelemetry.send({ type: 'sidebar.item_expanded' });
|
|
26
25
|
}
|
|
27
26
|
else {
|
|
28
|
-
|
|
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
|
-
|
|
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,
|
|
36
|
+
const { useTranslate, useOtelTelemetry } = (0, hooks_1.useThemeHooks)();
|
|
37
37
|
const { translate } = useTranslate();
|
|
38
|
-
const
|
|
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: () =>
|
|
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,
|
|
11
|
+
const { useTranslate, useOtelTelemetry } = (0, hooks_1.useThemeHooks)();
|
|
12
12
|
const { translate } = useTranslate();
|
|
13
|
-
const
|
|
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: () =>
|
|
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,
|
|
12
|
+
const { useTranslate, useOtelTelemetry, useUserMenu } = (0, hooks_1.useThemeHooks)();
|
|
13
13
|
const { handleLogout } = useUserMenu();
|
|
14
|
-
const
|
|
14
|
+
const otelTelemetry = useOtelTelemetry();
|
|
15
15
|
const { translate } = useTranslate();
|
|
16
16
|
const handleClick = () => {
|
|
17
|
-
|
|
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 {
|
|
17
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
9
|
-
const
|
|
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
|
-
|
|
30
|
+
otelTelemetry.send({
|
|
31
|
+
type: 'color_mode.switched',
|
|
32
|
+
payload: { from: activeColorMode, to: newMode },
|
|
33
|
+
});
|
|
31
34
|
setActiveColorMode(newMode);
|
|
32
35
|
};
|
|
33
36
|
return {
|