@redocly/theme 0.62.0-next.5 → 0.62.0-next.7
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/Banner/Banner.js +19 -1
- package/lib/components/Banner/variables.js +1 -0
- package/lib/components/Breadcrumbs/Breadcrumb.js +1 -1
- package/lib/components/Breadcrumbs/BreadcrumbDropdown.js +9 -6
- package/lib/components/Breadcrumbs/Breadcrumbs.js +24 -15
- package/lib/components/Buttons/AIAssistantButton.js +6 -3
- package/lib/components/Catalog/CatalogEntities.js +10 -8
- package/lib/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityRelationsTable.js +13 -11
- package/lib/components/Catalog/CatalogEntity/CatalogEntitySchema.js +7 -5
- package/lib/components/Catalog/CatalogFilter/CatalogFilterCheckboxes.js +9 -7
- package/lib/components/Catalog/CatalogTagsWithTooltip.js +1 -1
- package/lib/components/CatalogClassic/CatalogClassicInfoBlock.js +1 -1
- package/lib/components/CodeBlock/CodeBlockControls.js +8 -6
- package/lib/components/Filter/FilterCheckboxes.js +1 -1
- package/lib/components/LanguagePicker/LanguagePicker.js +1 -1
- package/lib/components/Markdown/Markdown.js +2 -2
- package/lib/components/Menu/MenuItem.js +7 -4
- package/lib/components/Navbar/NavbarItem.js +1 -1
- package/lib/components/Search/SearchAiMessage.js +8 -5
- package/lib/components/Search/SearchDialog.js +37 -22
- package/lib/components/Tooltip/Tooltip.d.ts +2 -3
- package/lib/components/Tooltip/Tooltip.js +66 -113
- package/lib/components/Tooltip/variables.dark.js +4 -0
- package/lib/components/Tooltip/variables.js +3 -3
- package/lib/core/hooks/search/use-search-dialog.js +2 -2
- package/lib/core/hooks/use-color-switcher.js +3 -1
- package/lib/core/hooks/use-outside-click.d.ts +3 -1
- package/lib/core/hooks/use-outside-click.js +8 -4
- package/lib/core/hooks/use-page-actions.js +15 -5
- package/lib/core/hooks/use-product-picker.js +1 -1
- package/lib/markdoc/components/Cards/Card.js +1 -0
- package/lib/markdoc/components/Heading/Heading.js +34 -2
- package/package.json +4 -4
- package/src/components/Banner/Banner.tsx +23 -1
- package/src/components/Banner/variables.ts +1 -0
- package/src/components/Breadcrumbs/Breadcrumb.tsx +3 -3
- package/src/components/Breadcrumbs/BreadcrumbDropdown.tsx +11 -8
- package/src/components/Breadcrumbs/Breadcrumbs.tsx +24 -15
- package/src/components/Buttons/AIAssistantButton.tsx +6 -3
- package/src/components/Catalog/CatalogEntities.tsx +10 -8
- package/src/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityRelationsTable.tsx +13 -11
- package/src/components/Catalog/CatalogEntity/CatalogEntitySchema.tsx +7 -5
- package/src/components/Catalog/CatalogFilter/CatalogFilterCheckboxes.tsx +9 -7
- package/src/components/Catalog/CatalogTagsWithTooltip.tsx +3 -3
- package/src/components/CatalogClassic/CatalogClassicInfoBlock.tsx +3 -1
- package/src/components/CodeBlock/CodeBlockControls.tsx +16 -10
- package/src/components/Filter/FilterCheckboxes.tsx +1 -1
- package/src/components/LanguagePicker/LanguagePicker.tsx +1 -1
- package/src/components/Markdown/Markdown.tsx +2 -2
- package/src/components/Menu/MenuItem.tsx +7 -4
- package/src/components/Navbar/NavbarItem.tsx +3 -1
- package/src/components/Search/SearchAiMessage.tsx +8 -5
- package/src/components/Search/SearchDialog.tsx +37 -22
- package/src/components/Tooltip/Tooltip.tsx +77 -120
- package/src/components/Tooltip/variables.dark.ts +4 -0
- package/src/components/Tooltip/variables.ts +3 -3
- package/src/core/hooks/search/use-search-dialog.ts +2 -2
- package/src/core/hooks/use-color-switcher.ts +3 -1
- package/src/core/hooks/use-outside-click.ts +16 -5
- package/src/core/hooks/use-page-actions.ts +30 -20
- package/src/core/hooks/use-product-picker.ts +1 -1
- package/src/markdoc/components/Cards/Card.tsx +1 -0
- package/src/markdoc/components/Heading/Heading.tsx +46 -4
- package/lib/components/Tooltip/TooltipWrapper.d.ts +0 -12
- package/lib/components/Tooltip/TooltipWrapper.js +0 -34
- package/src/components/Tooltip/TooltipWrapper.tsx +0 -70
|
@@ -37,9 +37,11 @@ exports.Banner = Banner;
|
|
|
37
37
|
const react_1 = __importStar(require("react"));
|
|
38
38
|
const styled_components_1 = __importStar(require("styled-components"));
|
|
39
39
|
const hooks_1 = require("../../core/hooks");
|
|
40
|
+
const utils_1 = require("../../core/utils");
|
|
40
41
|
const Markdown_1 = require("../../components/Markdown/Markdown");
|
|
41
42
|
const CloseIcon_1 = require("../../icons/CloseIcon/CloseIcon");
|
|
42
43
|
const Button_1 = require("../../components/Button/Button");
|
|
44
|
+
const ANIMATION_DURATION = 0.4;
|
|
43
45
|
function setBannerHeight(height) {
|
|
44
46
|
document.documentElement.style.setProperty('--banner-height', `${height}px`);
|
|
45
47
|
}
|
|
@@ -86,6 +88,22 @@ function Banner({ className }) {
|
|
|
86
88
|
setBannerHeight(height);
|
|
87
89
|
};
|
|
88
90
|
updateHeight();
|
|
91
|
+
if (window.location.hash) {
|
|
92
|
+
setTimeout(() => {
|
|
93
|
+
var _a;
|
|
94
|
+
const hash = window.location.hash;
|
|
95
|
+
const el = document.getElementById(hash.slice(1));
|
|
96
|
+
if (el) {
|
|
97
|
+
const navbar = (0, utils_1.getNavbarElement)();
|
|
98
|
+
const navbarHeight = (_a = navbar === null || navbar === void 0 ? void 0 : navbar.getBoundingClientRect().height) !== null && _a !== void 0 ? _a : 0;
|
|
99
|
+
const elementTop = el.getBoundingClientRect().top + window.scrollY;
|
|
100
|
+
const scrollPosition = elementTop - navbarHeight;
|
|
101
|
+
if (Math.abs(window.scrollY - scrollPosition) > 1) {
|
|
102
|
+
window.scrollTo({ top: scrollPosition });
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}, ANIMATION_DURATION * 1000 + 100);
|
|
106
|
+
}
|
|
89
107
|
const resizeObserver = new ResizeObserver(updateHeight);
|
|
90
108
|
resizeObserver.observe(bannerElement);
|
|
91
109
|
return () => {
|
|
@@ -148,7 +166,7 @@ const BannerWrapper = styled_components_1.default.div `
|
|
|
148
166
|
width: 100%;
|
|
149
167
|
z-index: var(--z-index-overlay);
|
|
150
168
|
transform: ${({ $isVisible }) => ($isVisible ? 'translateY(0)' : 'translateY(-100%)')};
|
|
151
|
-
transition: transform
|
|
169
|
+
transition: transform ${ANIMATION_DURATION}s ease-out;
|
|
152
170
|
${({ $color }) => $color &&
|
|
153
171
|
(0, styled_components_1.css) `
|
|
154
172
|
background-color: var(--banner-${$color}-bg-color);
|
|
@@ -6,6 +6,7 @@ exports.banner = (0, styled_components_1.css) `
|
|
|
6
6
|
/**
|
|
7
7
|
* @tokens Banner
|
|
8
8
|
*/
|
|
9
|
+
--banner-height: 0px; /* default 0px so calc formulas work on page load */
|
|
9
10
|
--banner-button-size: 22px;
|
|
10
11
|
--banner-button-padding: 3px; // @presenter Spacing
|
|
11
12
|
--banner-button-font-size: var(--font-size-base);
|
|
@@ -51,7 +51,7 @@ function Breadcrumb({ label, link, isActive, onClick, icon }) {
|
|
|
51
51
|
react_1.default.createElement(BreadcrumbIcon_1.BreadcrumbIcon, { icon: icon }),
|
|
52
52
|
displayLabel));
|
|
53
53
|
const breadcrumbContent = link ? (react_1.default.createElement(BreadcrumbLink, { "data-component-name": "Breadcrumbs/BreadcrumbLink", to: link, onClick: onClick, "$isActive": isActive }, content)) : (react_1.default.createElement(BreadcrumbWrapper, { "data-component-name": "Breadcrumbs/BreadcrumbWrapper", "$isActive": isActive, onClick: onClick, tabIndex: -1 }, content));
|
|
54
|
-
return isTruncated ? (react_1.default.createElement(Tooltip_1.
|
|
54
|
+
return isTruncated ? (react_1.default.createElement(Tooltip_1.Tooltip, { tip: label, placement: "bottom" }, breadcrumbContent)) : (breadcrumbContent);
|
|
55
55
|
}
|
|
56
56
|
const baseBreadcrumbStyles = `
|
|
57
57
|
display: flex;
|
|
@@ -55,7 +55,7 @@ function BreadcrumbDropdown({ children, label, items, onItemClick, className, })
|
|
|
55
55
|
return null;
|
|
56
56
|
}
|
|
57
57
|
const isTruncated = label.length > constants_1.BREADCRUMB_MAX_LENGTH;
|
|
58
|
-
const triggerContent = isTruncated ? (react_1.default.createElement(Tooltip_1.
|
|
58
|
+
const triggerContent = isTruncated ? (react_1.default.createElement(Tooltip_1.Tooltip, { tip: label, placement: "bottom" },
|
|
59
59
|
react_1.default.createElement(TriggerContentWrapper, null, children))) : (children);
|
|
60
60
|
const trigger = react_1.default.createElement(StyledDropdownTrigger, null, triggerContent);
|
|
61
61
|
return (react_1.default.createElement(BreadcrumbDropdownWrapper, { "data-component-name": "Breadcrumbs/BreadcrumbDropdown", className: className, "data-testid": "breadcrumb-dropdown" },
|
|
@@ -66,11 +66,14 @@ function BreadcrumbDropdown({ children, label, items, onItemClick, className, })
|
|
|
66
66
|
const translatedLabel = translate(item.labelTranslationKey, item.label);
|
|
67
67
|
return (react_1.default.createElement(StyledDropdownMenuItem, { key: index, onAction: () => {
|
|
68
68
|
onItemClick === null || onItemClick === void 0 ? void 0 : onItemClick(item, index);
|
|
69
|
-
telemetry.sendBreadcrumbClickedMessage(
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
69
|
+
telemetry.sendBreadcrumbClickedMessage([
|
|
70
|
+
{
|
|
71
|
+
object: 'breadcrumb',
|
|
72
|
+
link: item.link,
|
|
73
|
+
position: index + 1,
|
|
74
|
+
totalBreadcrumbs: items.length,
|
|
75
|
+
},
|
|
76
|
+
]);
|
|
74
77
|
}, "$hasLink": hasLink, to: item.link, dataAttributes: !hasLink ? { 'aria-disabled': 'true' } : {} },
|
|
75
78
|
react_1.default.createElement(DropdownContent, { "$isActive": isActive },
|
|
76
79
|
react_1.default.createElement(BreadcrumbIcon_1.BreadcrumbIcon, { icon: item.icon }),
|
|
@@ -46,20 +46,26 @@ function Breadcrumbs(props) {
|
|
|
46
46
|
...currentItemSiblings,
|
|
47
47
|
];
|
|
48
48
|
const translatedLabel = translate(breadcrumb.labelTranslationKey, breadcrumb.label);
|
|
49
|
-
return (react_1.default.createElement(BreadcrumbDropdown_1.BreadcrumbDropdown, { label: translatedLabel, items: siblingsWithActive, onItemClick: (item, itemIdx) => telemetry.sendBreadcrumbClickedMessage(
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
49
|
+
return (react_1.default.createElement(BreadcrumbDropdown_1.BreadcrumbDropdown, { label: translatedLabel, items: siblingsWithActive, onItemClick: (item, itemIdx) => telemetry.sendBreadcrumbClickedMessage([
|
|
50
|
+
{
|
|
51
|
+
object: 'breadcrumb',
|
|
52
|
+
link: item.link,
|
|
53
|
+
position: itemIdx + 1,
|
|
54
|
+
totalBreadcrumbs: siblingsWithActive.length,
|
|
55
|
+
},
|
|
56
|
+
]) },
|
|
54
57
|
react_1.default.createElement(BreadcrumbIcon_1.BreadcrumbIcon, { icon: breadcrumb.icon }),
|
|
55
58
|
(0, utils_1.trimText)(translatedLabel, constants_1.BREADCRUMB_MAX_LENGTH),
|
|
56
59
|
react_1.default.createElement(GenericIcon_1.GenericIcon, { icon: "chevron-down" })));
|
|
57
60
|
}
|
|
58
|
-
return (react_1.default.createElement(Breadcrumb_1.Breadcrumb, { link: breadcrumb.link, label: translate(breadcrumb.labelTranslationKey, breadcrumb.label), isActive: isActive, icon: breadcrumb.icon, onClick: () => telemetry.sendBreadcrumbClickedMessage(
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
61
|
+
return (react_1.default.createElement(Breadcrumb_1.Breadcrumb, { link: breadcrumb.link, label: translate(breadcrumb.labelTranslationKey, breadcrumb.label), isActive: isActive, icon: breadcrumb.icon, onClick: () => telemetry.sendBreadcrumbClickedMessage([
|
|
62
|
+
{
|
|
63
|
+
object: 'breadcrumb',
|
|
64
|
+
link: breadcrumb.link,
|
|
65
|
+
position: idx + 1,
|
|
66
|
+
totalBreadcrumbs: breadcrumbs.length,
|
|
67
|
+
},
|
|
68
|
+
]) }));
|
|
63
69
|
};
|
|
64
70
|
return (react_1.default.createElement(BreadcrumbsWrapper, { "data-component-name": "Breadcrumbs/Breadcrumbs", className: props.className }, items.map(({ breadcrumb, idx, isLast, inDropdown }) => {
|
|
65
71
|
if (inDropdown)
|
|
@@ -69,11 +75,14 @@ function Breadcrumbs(props) {
|
|
|
69
75
|
return (react_1.default.createElement(react_1.default.Fragment, { key: idx },
|
|
70
76
|
renderBreadcrumb(breadcrumb, idx, isLast),
|
|
71
77
|
react_1.default.createElement(BreadcrumbSeparator, null, "/"),
|
|
72
|
-
react_1.default.createElement(BreadcrumbDropdown_1.BreadcrumbDropdown, { label: "...", items: collapsedBreadcrumbs, onItemClick: (item, itemIdx) => telemetry.sendBreadcrumbClickedMessage(
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
78
|
+
react_1.default.createElement(BreadcrumbDropdown_1.BreadcrumbDropdown, { label: "...", items: collapsedBreadcrumbs, onItemClick: (item, itemIdx) => telemetry.sendBreadcrumbClickedMessage([
|
|
79
|
+
{
|
|
80
|
+
object: 'breadcrumb',
|
|
81
|
+
link: item.link,
|
|
82
|
+
position: itemIdx + 1,
|
|
83
|
+
totalBreadcrumbs: breadcrumbs.length,
|
|
84
|
+
},
|
|
85
|
+
]) }, "..."),
|
|
77
86
|
react_1.default.createElement(BreadcrumbSeparator, null, "/")));
|
|
78
87
|
}
|
|
79
88
|
return (react_1.default.createElement(react_1.default.Fragment, { key: idx },
|
|
@@ -86,9 +86,12 @@ function AIAssistantButton() {
|
|
|
86
86
|
const text = translate('aiAssistant.trigger', 'Ask AI');
|
|
87
87
|
const handleOpen = () => {
|
|
88
88
|
setIsOpen(true);
|
|
89
|
-
telemetry.sendSearchAiOpenedMessage(
|
|
90
|
-
|
|
91
|
-
|
|
89
|
+
telemetry.sendSearchAiOpenedMessage([
|
|
90
|
+
{
|
|
91
|
+
object: 'search',
|
|
92
|
+
method: 'ai_trigger_button',
|
|
93
|
+
},
|
|
94
|
+
]);
|
|
92
95
|
};
|
|
93
96
|
const handleClose = () => {
|
|
94
97
|
setIsOpen(false);
|
|
@@ -64,14 +64,16 @@ function CatalogEntities(props) {
|
|
|
64
64
|
}, props.initialEntitiesList);
|
|
65
65
|
const onRowClick = (entity) => {
|
|
66
66
|
if (searchQuery) {
|
|
67
|
-
telemetry.sendCatalogEntitiesListSearchResultClickedMessage(
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
67
|
+
telemetry.sendCatalogEntitiesListSearchResultClickedMessage([
|
|
68
|
+
{
|
|
69
|
+
id: entity.id,
|
|
70
|
+
object: 'catalog_entity',
|
|
71
|
+
uri: getEntityDetailsLink(entity),
|
|
72
|
+
query: searchQuery,
|
|
73
|
+
entityKey: entity.key,
|
|
74
|
+
entityType: entity.type,
|
|
75
|
+
},
|
|
76
|
+
]);
|
|
75
77
|
}
|
|
76
78
|
};
|
|
77
79
|
const shouldShowLoadMore = query.hasNextPage ||
|
package/lib/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityRelationsTable.js
CHANGED
|
@@ -19,17 +19,19 @@ function CatalogEntityRelationsTable({ entity, entitiesCatalogConfig, catalogCon
|
|
|
19
19
|
});
|
|
20
20
|
const onRowClick = (relatedEntity) => {
|
|
21
21
|
if (searchQuery) {
|
|
22
|
-
telemetry.sendCatalogEntitiesRelatedEntitiesListSearchResultClickMessage(
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
22
|
+
telemetry.sendCatalogEntitiesRelatedEntitiesListSearchResultClickMessage([
|
|
23
|
+
{
|
|
24
|
+
id: relatedEntity.id,
|
|
25
|
+
object: 'catalog_entity',
|
|
26
|
+
uri: getEntityDetailsLink(relatedEntity),
|
|
27
|
+
query: searchQuery,
|
|
28
|
+
entityKey: entity.key,
|
|
29
|
+
entityType: entity.type,
|
|
30
|
+
relationType: constants_1.reverseRelationMap[relatedEntity.relationType],
|
|
31
|
+
relatedEntityKey: relatedEntity.key,
|
|
32
|
+
relatedEntityType: relatedEntity.type,
|
|
33
|
+
},
|
|
34
|
+
]);
|
|
33
35
|
}
|
|
34
36
|
};
|
|
35
37
|
return (react_1.default.createElement("div", { "data-component-name": "Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityRelationsTable" },
|
|
@@ -58,11 +58,13 @@ function CatalogEntitySchema({ entity, relatedEntity, catalogConfig, RedocSchema
|
|
|
58
58
|
return (react_1.default.createElement(MetadataWrapper, { "data-component-name": "Catalog/CatalogEntity/CatalogEntityMetadata" },
|
|
59
59
|
react_1.default.createElement(HeaderWrapper, null,
|
|
60
60
|
react_1.default.createElement(Heading, null, translate('catalog.entity.schema.title')),
|
|
61
|
-
!isGraphql && (react_1.default.createElement(CopyButton_1.CopyButton, { data: rawSchema, buttonText: "Copy Schema", type: "compound", variant: "secondary", iconPosition: "right", size: "medium", onCopyClick: () => telemetry.sendCatalogEntitiesCopyDataSchemaClickedMessage(
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
61
|
+
!isGraphql && (react_1.default.createElement(CopyButton_1.CopyButton, { data: rawSchema, buttonText: "Copy Schema", type: "compound", variant: "secondary", iconPosition: "right", size: "medium", onCopyClick: () => telemetry.sendCatalogEntitiesCopyDataSchemaClickedMessage([
|
|
62
|
+
{
|
|
63
|
+
id: entity.id,
|
|
64
|
+
object: 'catalog_entity',
|
|
65
|
+
uri: getEntityDetailsLink(entity),
|
|
66
|
+
},
|
|
67
|
+
]) }))),
|
|
66
68
|
react_1.default.createElement(SplitViewWrapper, null,
|
|
67
69
|
react_1.default.createElement(SchemaContentWrapper, null, isGraphql && graphqlSDL && GraphqlTypeRenderer ? (react_1.default.createElement(GraphqlTypeRenderer, { sdl: graphqlSDL, typeName: entity.title })) : (react_1.default.createElement(StoreProvider, { definition: definition },
|
|
68
70
|
react_1.default.createElement(RedocSchema, { schema: parsedSchema })))),
|
|
@@ -103,13 +103,15 @@ function CatalogFilterCheckboxes({ filter, filterValuesCasing, showCounter = tru
|
|
|
103
103
|
const id = 'filter--' + filter.property + '--' + value;
|
|
104
104
|
return (react_1.default.createElement(FilterCheckboxOption, { key: id, role: "link", onClick: () => {
|
|
105
105
|
filter.toggleOption(value);
|
|
106
|
-
telemetry.sendCatalogEntitiesFilterCheckboxToggledMessage(
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
106
|
+
telemetry.sendCatalogEntitiesFilterCheckboxToggledMessage([
|
|
107
|
+
{
|
|
108
|
+
id: filter.property + '--' + value,
|
|
109
|
+
object: 'checkbox',
|
|
110
|
+
uri: window.location.href,
|
|
111
|
+
category: filter.property,
|
|
112
|
+
value: value,
|
|
113
|
+
},
|
|
114
|
+
]);
|
|
113
115
|
} },
|
|
114
116
|
react_1.default.createElement(CheckboxIcon_1.CheckboxIcon, { checked: filter.selectedOptions instanceof Set
|
|
115
117
|
? filter.selectedOptions.has(value) ||
|
|
@@ -27,7 +27,7 @@ function CatalogTagsWithTooltip({ items, itemsToShow = 1, showPlaceholder = true
|
|
|
27
27
|
}
|
|
28
28
|
const displayedItems = items.slice(0, itemsToShow);
|
|
29
29
|
const remainingCount = items.length - itemsToShow;
|
|
30
|
-
return (react_1.default.createElement(Tooltip_1.
|
|
30
|
+
return (react_1.default.createElement(Tooltip_1.Tooltip, { tip: items.join(', '), placement: "bottom", className: "catalog", width: "400px" },
|
|
31
31
|
react_1.default.createElement(CatalogTagsWrapper, { "data-component-name": "Catalog/CatalogTagsWithTooltip" },
|
|
32
32
|
displayedItems.map((item, index) => (react_1.default.createElement(Tag_1.Tag, Object.assign({ key: `${item}-${index}` }, tagProps, { textTransform: "none", maxLength: constants_1.CATALOG_TAG_MAX_LENGTH }),
|
|
33
33
|
react_1.default.createElement(CatalogHighlight_1.CatalogHighlight, null, item)))),
|
|
@@ -21,7 +21,7 @@ function ScorecardBadge(props) {
|
|
|
21
21
|
const { useTelemetry } = (0, hooks_1.useThemeHooks)();
|
|
22
22
|
const telemetry = useTelemetry();
|
|
23
23
|
return (react_1.default.createElement(Link_1.Link, { to: slug },
|
|
24
|
-
react_1.default.createElement(Tag_1.Tag, { onClick: () => telemetry.sendScorecardLinkClickedMessage({ action: 'click' }), withStatusDot: true, statusDotColor: `var(${colorVariable})` }, level)));
|
|
24
|
+
react_1.default.createElement(Tag_1.Tag, { onClick: () => telemetry.sendScorecardLinkClickedMessage([{ object: 'link', action: 'click' }]), withStatusDot: true, statusDotColor: `var(${colorVariable})` }, level)));
|
|
25
25
|
}
|
|
26
26
|
const CatalogInfoBlockWrapper = styled_components_1.default.div `
|
|
27
27
|
position: relative;
|
|
@@ -8,7 +8,7 @@ const react_1 = __importDefault(require("react"));
|
|
|
8
8
|
const styled_components_1 = __importDefault(require("styled-components"));
|
|
9
9
|
const CodeBlockTabs_1 = require("../../components/CodeBlock/CodeBlockTabs");
|
|
10
10
|
const CopyButton_1 = require("../../components/Buttons/CopyButton");
|
|
11
|
-
const
|
|
11
|
+
const Tooltip_1 = require("../../components/Tooltip/Tooltip");
|
|
12
12
|
const hooks_1 = require("../../core/hooks");
|
|
13
13
|
const DeselectIcon_1 = require("../../icons/DeselectIcon/DeselectIcon");
|
|
14
14
|
const MaximizeIcon_1 = require("../../icons/MaximizeIcon/MaximizeIcon");
|
|
@@ -38,15 +38,15 @@ function CodeBlockControls({ children, className, title, controls, tabs, dropdow
|
|
|
38
38
|
tabs && react_1.default.createElement(CodeBlockTabs_1.CodeBlockTabs, { tabs: tabs }),
|
|
39
39
|
react_1.default.createElement(ControlsWrapper, null,
|
|
40
40
|
dropdown && react_1.default.createElement(CodeBlockDropdown_1.CodeBlockDropdown, Object.assign({}, dropdown)),
|
|
41
|
-
report && !report.hidden && !((_a = report === null || report === void 0 ? void 0 : report.props) === null || _a === void 0 ? void 0 : _a.hide) ? (react_1.default.createElement(
|
|
41
|
+
report && !report.hidden && !((_a = report === null || report === void 0 ? void 0 : report.props) === null || _a === void 0 ? void 0 : _a.hide) ? (react_1.default.createElement(Tooltip_1.Tooltip, { tip: translate('codeSnippet.report.tooltipText', 'Report a problem'), placement: "top", arrowPosition: "right" },
|
|
42
42
|
react_1.default.createElement(ControlButton, Object.assign({ variant: "text", size: "small", "data-testid": "report-button", icon: controlsType === 'icon' ? react_1.default.createElement(WarningSquareIcon_1.WarningSquareIcon, { size: "18px" }) : undefined }, report.props), controlsType != 'icon' && (((_b = report.props) === null || _b === void 0 ? void 0 : _b.buttonText) || 'Report')))) : null,
|
|
43
|
-
expand && !((_c = codeSnippet === null || codeSnippet === void 0 ? void 0 : codeSnippet.expand) === null || _c === void 0 ? void 0 : _c.hide) ? (react_1.default.createElement(
|
|
43
|
+
expand && !((_c = codeSnippet === null || codeSnippet === void 0 ? void 0 : codeSnippet.expand) === null || _c === void 0 ? void 0 : _c.hide) ? (react_1.default.createElement(Tooltip_1.Tooltip, { tip: translate('codeSnippet.expand.tooltipText', 'Expand all'), placement: "top", arrowPosition: "right" },
|
|
44
44
|
react_1.default.createElement(ControlButton, { variant: "text", size: "small", "data-testid": "expand-all", icon: controlsType === 'icon' ? react_1.default.createElement(MaximizeIcon_1.MaximizeIcon, null) : undefined, onClick: expand === null || expand === void 0 ? void 0 : expand.onClick }, controlsType !== 'icon' && ((expand === null || expand === void 0 ? void 0 : expand.label) || 'Expand all')))) : null,
|
|
45
|
-
collapse && !((_d = codeSnippet === null || codeSnippet === void 0 ? void 0 : codeSnippet.collapse) === null || _d === void 0 ? void 0 : _d.hide) ? (react_1.default.createElement(
|
|
45
|
+
collapse && !((_d = codeSnippet === null || codeSnippet === void 0 ? void 0 : codeSnippet.collapse) === null || _d === void 0 ? void 0 : _d.hide) ? (react_1.default.createElement(Tooltip_1.Tooltip, { tip: translate('codeSnippet.collapse.tooltipText', 'Collapse all'), placement: "top", arrowPosition: "right" },
|
|
46
46
|
react_1.default.createElement(ControlButton, { variant: "text", size: "small", "data-testid": "collapse-all", icon: controlsType === 'icon' ? react_1.default.createElement(MinimizeIcon_1.MinimizeIcon, null) : undefined, onClick: collapse === null || collapse === void 0 ? void 0 : collapse.onClick }, controlsType !== 'icon' && ((expand === null || expand === void 0 ? void 0 : expand.label) || 'Collapse all')))) : null,
|
|
47
47
|
select ? (react_1.default.createElement(ControlButton, { variant: "text", size: "small", "data-testid": "select-all", icon: controlsType === 'icon' ? react_1.default.createElement(SelectIcon_1.SelectIcon, null) : undefined, onClick: select === null || select === void 0 ? void 0 : select.onClick }, controlsType !== 'icon' && (select === null || select === void 0 ? void 0 : select.label) ? select.label : 'Select all')) : null,
|
|
48
48
|
deselect ? (react_1.default.createElement(ControlButton, { variant: "text", size: "small", "data-testid": "clear-all", icon: controlsType === 'icon' ? react_1.default.createElement(DeselectIcon_1.DeselectIcon, null) : undefined, onClick: deselect === null || deselect === void 0 ? void 0 : deselect.onClick }, controlsType !== 'icon' && (deselect === null || deselect === void 0 ? void 0 : deselect.label) ? deselect.label : 'Clear all')) : null,
|
|
49
|
-
copy && !((_e = codeSnippet === null || codeSnippet === void 0 ? void 0 : codeSnippet.copy) === null || _e === void 0 ? void 0 : _e.hide) ? (react_1.default.createElement(
|
|
49
|
+
copy && !((_e = codeSnippet === null || codeSnippet === void 0 ? void 0 : codeSnippet.copy) === null || _e === void 0 ? void 0 : _e.hide) ? (react_1.default.createElement(Tooltip_1.Tooltip, { tip: translate('codeSnippet.copy.tooltipText', 'Copy to clipboard'), placement: "top", arrowPosition: "right" },
|
|
50
50
|
react_1.default.createElement(StyledCopyButton, { data: copy.data, "data-source": copy.dataSource, "data-hash": copy.dataHash, type: controlsType, toasterPlacement: copy.toasterPlacement, toasterDuration: copy.toasterDuration, buttonText: copy.label, onCopyClick: () => {
|
|
51
51
|
var _a;
|
|
52
52
|
// If there already is a click handler, events should be handled there, cause they pass additional data
|
|
@@ -54,7 +54,9 @@ function CodeBlockControls({ children, className, title, controls, tabs, dropdow
|
|
|
54
54
|
(_a = copy === null || copy === void 0 ? void 0 : copy.onClick) === null || _a === void 0 ? void 0 : _a.call(copy);
|
|
55
55
|
}
|
|
56
56
|
else {
|
|
57
|
-
telemetry.sendCopyCodeSnippetClickedMessage(
|
|
57
|
+
telemetry.sendCopyCodeSnippetClickedMessage([
|
|
58
|
+
{ object: 'code_snippet', snippetType: 'copy' },
|
|
59
|
+
]);
|
|
58
60
|
}
|
|
59
61
|
} }))) : null))) : null;
|
|
60
62
|
return children || controls ? (react_1.default.createElement(ContainerWrapper, { "data-component-name": "CodeBlock/CodeBlockControls", className: className, "$isEmptyTitle": isEmptyTitle }, children ? children : defaultControls)) : null;
|
|
@@ -24,7 +24,7 @@ function FilterCheckboxes({ filter, filterValuesCasing, showCounter = true, }) {
|
|
|
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.sendFilterCheckboxToggledMessage({ id });
|
|
27
|
+
telemetry.sendFilterCheckboxToggledMessage([{ object: 'checkbox', id }]);
|
|
28
28
|
} },
|
|
29
29
|
react_1.default.createElement(CheckboxIcon_1.CheckboxIcon, { checked: filter.selectedOptions instanceof Set
|
|
30
30
|
? filter.selectedOptions.has(value) ||
|
|
@@ -26,7 +26,7 @@ function LanguagePicker(props) {
|
|
|
26
26
|
onAction: () => {
|
|
27
27
|
setLocale(locale.code);
|
|
28
28
|
props.onChangeLanguage(locale.code);
|
|
29
|
-
telemetry.sendLanguagePickerLocaleChangedMessage({ locale: locale.code });
|
|
29
|
+
telemetry.sendLanguagePickerLocaleChangedMessage([{ object: 'locale', locale: locale.code }]);
|
|
30
30
|
},
|
|
31
31
|
active: locale.code === currentLocale.code,
|
|
32
32
|
suffix: locale.code === currentLocale.code && react_1.default.createElement(CheckmarkIcon_1.CheckmarkIcon, null),
|
|
@@ -77,7 +77,7 @@ exports.Markdown = styled_components_1.default.main.attrs(({ className }) => ({
|
|
|
77
77
|
${links_1.markdownLinksCss}
|
|
78
78
|
|
|
79
79
|
a[name], [id] {
|
|
80
|
-
scroll-margin-top: var(--navbar-height);
|
|
80
|
+
scroll-margin-top: calc(var(--navbar-height) + var(--banner-height));
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
img,
|
|
@@ -95,7 +95,7 @@ exports.Markdown = styled_components_1.default.main.attrs(({ className }) => ({
|
|
|
95
95
|
font-family: var(--heading-font-family);
|
|
96
96
|
position: relative;
|
|
97
97
|
|
|
98
|
-
scroll-margin-top: var(--navbar-height);
|
|
98
|
+
scroll-margin-top: calc(var(--navbar-height) + var(--banner-height));
|
|
99
99
|
}
|
|
100
100
|
|
|
101
101
|
strong {
|
|
@@ -65,10 +65,13 @@ function MenuItem(props) {
|
|
|
65
65
|
const hasChevron = isNested && !isDrilldown;
|
|
66
66
|
const hasHttpTag = !!item.httpVerb || type === constants_1.MenuItemType.Operation;
|
|
67
67
|
const handleOnClick = () => {
|
|
68
|
-
telemetry.sendSidebarItemClickedMessage(
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
68
|
+
telemetry.sendSidebarItemClickedMessage([
|
|
69
|
+
{
|
|
70
|
+
object: 'sidebar_item',
|
|
71
|
+
label: item.label,
|
|
72
|
+
type: item.type === 'link' || item.type === 'group' ? item.type : undefined,
|
|
73
|
+
},
|
|
74
|
+
]);
|
|
72
75
|
onClick === null || onClick === void 0 ? void 0 : onClick();
|
|
73
76
|
if (isNested) {
|
|
74
77
|
handleExpand();
|
|
@@ -27,7 +27,7 @@ function NavbarItem({ navItem, className }) {
|
|
|
27
27
|
const normalizedPath = (item.link ? (0, utils_1.removeTrailingSlash)(item.link) : item.link) || '';
|
|
28
28
|
const pathWithPathPrefix = (0, utils_1.withPathPrefix)((0, utils_1.getPathnameForLocale)(normalizedPath, defaultLocale, currentLocale, locales));
|
|
29
29
|
const isActive = (0, utils_1.removeTrailingSlash)(pathname) === (0, utils_1.removeTrailingSlash)(pathWithPathPrefix);
|
|
30
|
-
const itemContent = (react_1.default.createElement(NavbarMenuItem, { as: item.link ? Link_1.Link : undefined, active: isActive, className: className, onClick: () => telemetry.sendNavbarMenuItemClickedMessage({ type: item.type }), external: item.external, target: item.target, to: item.link },
|
|
30
|
+
const itemContent = (react_1.default.createElement(NavbarMenuItem, { as: item.link ? Link_1.Link : undefined, active: isActive, className: className, onClick: () => telemetry.sendNavbarMenuItemClickedMessage([{ object: 'menu_item', type: item.type }]), external: item.external, target: item.target, to: item.link },
|
|
31
31
|
react_1.default.createElement(NavbarIcon, { icon: item.icon, srcSet: item.srcSet }),
|
|
32
32
|
react_1.default.createElement(NavbarLabel, { "data-translation-key": item.labelTranslationKey }, translate(item.labelTranslationKey, item.label)),
|
|
33
33
|
item.external ? react_1.default.createElement(ExternalLinkIcon, { size: "10px" }) : null));
|
|
@@ -64,11 +64,14 @@ function SearchAiMessageComponent({ role, content, isThinking, resources, classN
|
|
|
64
64
|
if (!messageId)
|
|
65
65
|
return;
|
|
66
66
|
try {
|
|
67
|
-
telemetry.sendSearchAIFeedbackMessage(
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
67
|
+
telemetry.sendSearchAIFeedbackMessage([
|
|
68
|
+
{
|
|
69
|
+
object: 'feedback',
|
|
70
|
+
feedback: feedbackValue,
|
|
71
|
+
messageId,
|
|
72
|
+
reason: dislikeReason,
|
|
73
|
+
},
|
|
74
|
+
]);
|
|
72
75
|
}
|
|
73
76
|
catch (error) {
|
|
74
77
|
console.error('Error sending feedback', error);
|
|
@@ -134,14 +134,17 @@ function SearchDialog({ onClose, className, initialMode = 'search', }) {
|
|
|
134
134
|
}
|
|
135
135
|
return (react_1.default.createElement(SearchItem_1.SearchItem, { key: `${index}-${item.document.id}`, item: item, product: itemProduct, innerRef: innerRef, onClick: () => {
|
|
136
136
|
addSearchHistoryItem(query);
|
|
137
|
-
telemetry.sendSearchResultClickedMessage(
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
137
|
+
telemetry.sendSearchResultClickedMessage([
|
|
138
|
+
{
|
|
139
|
+
object: 'search',
|
|
140
|
+
query: query,
|
|
141
|
+
url: item.document.url,
|
|
142
|
+
totalResults: results.length.toString(),
|
|
143
|
+
index: index.toString(),
|
|
144
|
+
searchEngine: mode,
|
|
145
|
+
searchSessionId,
|
|
146
|
+
},
|
|
147
|
+
]);
|
|
145
148
|
onClose();
|
|
146
149
|
} }));
|
|
147
150
|
}, [onClose, product, products, addSearchHistoryItem, query, telemetry, mode, searchSessionId]);
|
|
@@ -189,9 +192,12 @@ function SearchDialog({ onClose, className, initialMode = 'search', }) {
|
|
|
189
192
|
if (query.trim()) {
|
|
190
193
|
aiSearch.askQuestion(query);
|
|
191
194
|
}
|
|
192
|
-
telemetry.sendSearchAiOpenedMessage(
|
|
193
|
-
|
|
194
|
-
|
|
195
|
+
telemetry.sendSearchAiOpenedMessage([
|
|
196
|
+
{
|
|
197
|
+
object: 'search',
|
|
198
|
+
method: 'ai_search_button',
|
|
199
|
+
},
|
|
200
|
+
]);
|
|
195
201
|
} }, translate('search.ai.button', 'Search with AI'))) : null,
|
|
196
202
|
showSearchFilterButton && (react_1.default.createElement(SearchFilterToggleButton, { icon: react_1.default.createElement(SettingsIcon_1.SettingsIcon, null), onClick: onFilterToggle })))))) : (react_1.default.createElement(AiDialogHeaderWrapper, null,
|
|
197
203
|
initialMode === 'ai-dialog' ? (react_1.default.createElement(AiDialogHeaderTitle, null,
|
|
@@ -219,18 +225,24 @@ function SearchDialog({ onClose, className, initialMode = 'search', }) {
|
|
|
219
225
|
if (query.trim()) {
|
|
220
226
|
aiSearch.askQuestion(query);
|
|
221
227
|
}
|
|
222
|
-
telemetry.sendSearchAiOpenedMessage(
|
|
223
|
-
|
|
224
|
-
|
|
228
|
+
telemetry.sendSearchAiOpenedMessage([
|
|
229
|
+
{
|
|
230
|
+
object: 'search',
|
|
231
|
+
method: 'ai_search_input',
|
|
232
|
+
},
|
|
233
|
+
]);
|
|
225
234
|
}, onKeyDown: (e) => {
|
|
226
235
|
if (e.key === 'Enter') {
|
|
227
236
|
setMode('ai-dialog');
|
|
228
237
|
if (query.trim()) {
|
|
229
238
|
aiSearch.askQuestion(query);
|
|
230
239
|
}
|
|
231
|
-
telemetry.sendSearchAiOpenedMessage(
|
|
232
|
-
|
|
233
|
-
|
|
240
|
+
telemetry.sendSearchAiOpenedMessage([
|
|
241
|
+
{
|
|
242
|
+
object: 'search',
|
|
243
|
+
method: 'ai_search_input',
|
|
244
|
+
},
|
|
245
|
+
]);
|
|
234
246
|
}
|
|
235
247
|
}, ref: aiQueryRef, tabIndex: 0, role: "option", "aria-selected": "true" },
|
|
236
248
|
react_1.default.createElement(AiStarsIcon_1.AiStarsIcon, { style: { flexShrink: 0 }, color: "var(--search-ai-icon-color)", size: "36px", background: "var(--search-ai-icon-bg-color)", margin: "0 var(--spacing-md) 0 0", borderRadius: "var(--border-radius-lg)" }),
|
|
@@ -264,11 +276,14 @@ function SearchDialog({ onClose, className, initialMode = 'search', }) {
|
|
|
264
276
|
translate('search.loading', 'Loading...'))) : (react_1.default.createElement(SearchMessage, { "data-translation-key": "search.noResults" },
|
|
265
277
|
react_1.default.createElement("b", null, translate('search.noResults.title', 'No results'))))) : (react_1.default.createElement(react_1.default.Fragment, null,
|
|
266
278
|
react_1.default.createElement(SearchRecent_1.SearchRecent, { onSelect: (query, index) => {
|
|
267
|
-
telemetry.sendSearchRecentClickedMessage(
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
279
|
+
telemetry.sendSearchRecentClickedMessage([
|
|
280
|
+
{
|
|
281
|
+
object: 'search',
|
|
282
|
+
query,
|
|
283
|
+
index: index.toString(),
|
|
284
|
+
searchSessionId,
|
|
285
|
+
},
|
|
286
|
+
]);
|
|
272
287
|
setQuery(query);
|
|
273
288
|
focusSearchInput();
|
|
274
289
|
} }),
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import type {
|
|
2
|
+
import type { ReactNode } from 'react';
|
|
3
3
|
export type TooltipProps = {
|
|
4
4
|
tip: string | ReactNode;
|
|
5
5
|
isOpen?: boolean;
|
|
@@ -9,7 +9,6 @@ export type TooltipProps = {
|
|
|
9
9
|
width?: string;
|
|
10
10
|
dataTestId?: string;
|
|
11
11
|
disabled?: boolean;
|
|
12
|
-
arrowPosition?: '
|
|
12
|
+
arrowPosition?: 'left' | 'right' | 'center';
|
|
13
13
|
};
|
|
14
|
-
export declare function TooltipComponent({ children, isOpen, tip, withArrow, placement, className, width, dataTestId, disabled, arrowPosition, }: PropsWithChildren<TooltipProps>): JSX.Element;
|
|
15
14
|
export declare const Tooltip: React.NamedExoticComponent<React.PropsWithChildren<TooltipProps>>;
|