@redocly/theme 0.57.0-next.4 → 0.57.0-next.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/components/Breadcrumbs/Breadcrumb.d.ts +2 -1
- package/lib/components/Breadcrumbs/Breadcrumb.js +70 -22
- package/lib/components/Breadcrumbs/BreadcrumbDropdown.d.ts +14 -0
- package/lib/components/Breadcrumbs/BreadcrumbDropdown.js +138 -0
- package/lib/components/Breadcrumbs/BreadcrumbIcon.d.ts +7 -0
- package/lib/components/Breadcrumbs/BreadcrumbIcon.js +23 -0
- package/lib/components/Breadcrumbs/Breadcrumbs.js +68 -25
- package/lib/components/Breadcrumbs/variables.js +16 -4
- package/lib/components/Buttons/EditPageButton.js +1 -1
- package/lib/components/Catalog/CatalogCardView/CatalogCard.js +1 -1
- package/lib/components/CatalogClassic/CatalogClassicActions.js +1 -1
- package/lib/components/CatalogClassic/CatalogClassicCard.js +1 -1
- package/lib/components/Feedback/ReportDialog.js +1 -1
- package/lib/components/Footer/FooterItem.js +1 -1
- package/lib/components/Logo/Logo.js +1 -1
- package/lib/components/Navbar/Navbar.js +2 -2
- package/lib/components/Search/SearchInput.js +1 -1
- package/lib/components/Search/SearchRecent.js +1 -1
- package/lib/components/SidebarActions/SidebarActions.js +3 -3
- package/lib/components/TableOfContent/TableOfContent.js +1 -1
- package/lib/components/UserMenu/LoginButton.js +1 -1
- package/lib/components/UserMenu/LogoutMenuItem.js +1 -1
- package/lib/core/constants/breadcrumb.d.ts +1 -0
- package/lib/core/constants/breadcrumb.js +5 -0
- package/lib/core/constants/index.d.ts +1 -0
- package/lib/core/constants/index.js +1 -0
- package/lib/core/hooks/__mocks__/use-theme-hooks.js +1 -1
- package/lib/core/hooks/use-page-actions.js +26 -8
- package/lib/core/hooks/use-theme-hooks.js +2 -1
- package/lib/core/types/hooks.d.ts +5 -1
- package/lib/core/utils/text-trimmer.js +1 -1
- package/lib/markdoc/tags/img.js +1 -0
- package/package.json +2 -2
- package/src/components/Breadcrumbs/Breadcrumb.tsx +75 -34
- package/src/components/Breadcrumbs/BreadcrumbDropdown.tsx +170 -0
- package/src/components/Breadcrumbs/BreadcrumbIcon.tsx +30 -0
- package/src/components/Breadcrumbs/Breadcrumbs.tsx +112 -29
- package/src/components/Breadcrumbs/variables.ts +16 -4
- package/src/components/Buttons/EditPageButton.tsx +1 -1
- package/src/components/Catalog/CatalogCardView/CatalogCard.tsx +1 -1
- package/src/components/CatalogClassic/CatalogClassicActions.tsx +1 -1
- package/src/components/CatalogClassic/CatalogClassicCard.tsx +1 -1
- package/src/components/Feedback/ReportDialog.tsx +1 -1
- package/src/components/Footer/FooterItem.tsx +1 -1
- package/src/components/Logo/Logo.tsx +1 -1
- package/src/components/Navbar/Navbar.tsx +2 -2
- package/src/components/Search/SearchInput.tsx +1 -1
- package/src/components/Search/SearchRecent.tsx +1 -1
- package/src/components/SidebarActions/SidebarActions.tsx +3 -3
- package/src/components/TableOfContent/TableOfContent.tsx +1 -1
- package/src/components/UserMenu/LoginButton.tsx +1 -1
- package/src/components/UserMenu/LogoutMenuItem.tsx +1 -1
- package/src/core/constants/breadcrumb.ts +1 -0
- package/src/core/constants/index.ts +1 -0
- package/src/core/hooks/__mocks__/use-theme-hooks.ts +1 -1
- package/src/core/hooks/use-page-actions.ts +42 -7
- package/src/core/hooks/use-theme-hooks.ts +2 -1
- package/src/core/types/hooks.ts +5 -1
- package/src/core/utils/text-trimmer.ts +1 -1
- package/src/markdoc/tags/img.ts +1 -0
|
@@ -4,6 +4,7 @@ type BreadcrumbProps = {
|
|
|
4
4
|
link?: string;
|
|
5
5
|
isActive: boolean;
|
|
6
6
|
onClick?: () => void;
|
|
7
|
+
icon?: string;
|
|
7
8
|
};
|
|
8
|
-
export declare function Breadcrumb({ label, link, isActive, onClick }: BreadcrumbProps): JSX.Element;
|
|
9
|
+
export declare function Breadcrumb({ label, link, isActive, onClick, icon }: BreadcrumbProps): JSX.Element;
|
|
9
10
|
export {};
|
|
@@ -1,39 +1,87 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
2
25
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
27
|
};
|
|
5
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
29
|
exports.Breadcrumb = Breadcrumb;
|
|
7
30
|
const react_1 = __importDefault(require("react"));
|
|
8
|
-
const styled_components_1 =
|
|
31
|
+
const styled_components_1 = __importStar(require("styled-components"));
|
|
9
32
|
const Link_1 = require("../../components/Link/Link");
|
|
10
|
-
|
|
11
|
-
|
|
33
|
+
const Tooltip_1 = require("../../components/Tooltip/Tooltip");
|
|
34
|
+
const BreadcrumbIcon_1 = require("../../components/Breadcrumbs/BreadcrumbIcon");
|
|
35
|
+
const utils_1 = require("../../core/utils");
|
|
36
|
+
const constants_1 = require("../../core/constants");
|
|
37
|
+
function Breadcrumb({ label, link, isActive, onClick, icon }) {
|
|
38
|
+
const isTruncated = label.length > constants_1.BREADCRUMB_MAX_LENGTH;
|
|
39
|
+
const displayLabel = (0, utils_1.trimText)(label, constants_1.BREADCRUMB_MAX_LENGTH);
|
|
40
|
+
const content = (react_1.default.createElement(react_1.default.Fragment, null,
|
|
41
|
+
react_1.default.createElement(BreadcrumbIcon_1.BreadcrumbIcon, { icon: icon }),
|
|
42
|
+
displayLabel));
|
|
43
|
+
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));
|
|
44
|
+
return isTruncated ? (react_1.default.createElement(Tooltip_1.TooltipComponent, { tip: label, placement: "bottom", width: "max-content" }, breadcrumbContent)) : (breadcrumbContent);
|
|
12
45
|
}
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
46
|
+
const baseBreadcrumbStyles = `
|
|
47
|
+
display: flex;
|
|
48
|
+
align-items: center;
|
|
49
|
+
gap: var(--breadcrumbs-gap);
|
|
50
|
+
padding: var(--breadcrumb-padding);
|
|
17
51
|
border-radius: var(--border-radius);
|
|
52
|
+
color: var(--breadcrumbs-text-color);
|
|
53
|
+
text-decoration: none;
|
|
18
54
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
text-decoration: var(--breadcrumbs-text-decoration-hover);
|
|
23
|
-
}
|
|
24
|
-
`}
|
|
55
|
+
&:hover {
|
|
56
|
+
background-color: var(--breadcrumbs-background-color-hover);
|
|
57
|
+
}
|
|
25
58
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
59
|
+
&:focus {
|
|
60
|
+
box-shadow: var(--breadcrumbs-box-shadow-focus);
|
|
61
|
+
outline: none;
|
|
62
|
+
}
|
|
30
63
|
`;
|
|
31
|
-
const
|
|
32
|
-
text-
|
|
33
|
-
|
|
64
|
+
const activeColorStyles = (0, styled_components_1.css) `
|
|
65
|
+
color: var(--breadcrumbs-text-color-active);
|
|
66
|
+
`;
|
|
67
|
+
const BreadcrumbWrapper = styled_components_1.default.div `
|
|
68
|
+
${baseBreadcrumbStyles}
|
|
69
|
+
|
|
70
|
+
${(props) => props.$isActive && activeColorStyles}
|
|
71
|
+
cursor: default;
|
|
72
|
+
pointer-events: none;
|
|
73
|
+
|
|
74
|
+
&:focus {
|
|
75
|
+
box-shadow: none;
|
|
76
|
+
outline: none;
|
|
77
|
+
}
|
|
34
78
|
|
|
35
|
-
&:
|
|
36
|
-
color:
|
|
79
|
+
&:hover {
|
|
80
|
+
background-color: transparent;
|
|
37
81
|
}
|
|
38
82
|
`;
|
|
83
|
+
const BreadcrumbLink = (0, styled_components_1.default)(Link_1.Link) `
|
|
84
|
+
${baseBreadcrumbStyles}
|
|
85
|
+
${(props) => props.$isActive && activeColorStyles}
|
|
86
|
+
`;
|
|
39
87
|
//# sourceMappingURL=Breadcrumb.js.map
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { BreadcrumbItem } from '@redocly/config';
|
|
3
|
+
import type { JSX } from 'react';
|
|
4
|
+
type BreadcrumbDropdownProps = {
|
|
5
|
+
children?: React.ReactNode;
|
|
6
|
+
label: string;
|
|
7
|
+
items: (BreadcrumbItem & {
|
|
8
|
+
isActive?: boolean;
|
|
9
|
+
})[];
|
|
10
|
+
onItemClick?: (item: BreadcrumbItem, index: number) => void;
|
|
11
|
+
className?: string;
|
|
12
|
+
};
|
|
13
|
+
export declare function BreadcrumbDropdown({ children, label, items, onItemClick, className, }: BreadcrumbDropdownProps): JSX.Element | null;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.BreadcrumbDropdown = BreadcrumbDropdown;
|
|
30
|
+
const react_1 = __importDefault(require("react"));
|
|
31
|
+
const styled_components_1 = __importStar(require("styled-components"));
|
|
32
|
+
const hooks_1 = require("../../core/hooks");
|
|
33
|
+
const Dropdown_1 = require("../../components/Dropdown/Dropdown");
|
|
34
|
+
const DropdownMenu_1 = require("../../components/Dropdown/DropdownMenu");
|
|
35
|
+
const DropdownMenuItem_1 = require("../../components/Dropdown/DropdownMenuItem");
|
|
36
|
+
const Tooltip_1 = require("../../components/Tooltip/Tooltip");
|
|
37
|
+
const GenericIcon_1 = require("../../icons/GenericIcon/GenericIcon");
|
|
38
|
+
const constants_1 = require("../../core/constants");
|
|
39
|
+
const BreadcrumbIcon_1 = require("../../components/Breadcrumbs/BreadcrumbIcon");
|
|
40
|
+
function BreadcrumbDropdown({ children, label, items, onItemClick, className, }) {
|
|
41
|
+
const { useTelemetry, useTranslate } = (0, hooks_1.useThemeHooks)();
|
|
42
|
+
const telemetry = useTelemetry();
|
|
43
|
+
const { translate } = useTranslate();
|
|
44
|
+
if (!items || items.length === 0) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
const isTruncated = label.length > constants_1.BREADCRUMB_MAX_LENGTH;
|
|
48
|
+
const triggerContent = isTruncated ? (react_1.default.createElement(Tooltip_1.TooltipComponent, { tip: label, placement: "bottom", width: "max-content" },
|
|
49
|
+
react_1.default.createElement(TriggerContentWrapper, null, children))) : (children);
|
|
50
|
+
const trigger = react_1.default.createElement(StyledDropdownTrigger, null, triggerContent);
|
|
51
|
+
return (react_1.default.createElement(BreadcrumbDropdownWrapper, { "data-component-name": "Breadcrumbs/BreadcrumbDropdown", className: className, "data-testid": "breadcrumb-dropdown" },
|
|
52
|
+
react_1.default.createElement(Dropdown_1.Dropdown, { trigger: trigger, closeOnClick: true },
|
|
53
|
+
react_1.default.createElement(DropdownMenu_1.DropdownMenu, null, items.map((item, index) => {
|
|
54
|
+
const isActive = Boolean(item === null || item === void 0 ? void 0 : item.isActive);
|
|
55
|
+
const hasLink = Boolean(item.link);
|
|
56
|
+
const translatedLabel = translate(item.labelTranslationKey, item.label);
|
|
57
|
+
return (react_1.default.createElement(StyledDropdownMenuItem, { key: index, onAction: () => {
|
|
58
|
+
onItemClick === null || onItemClick === void 0 ? void 0 : onItemClick(item, index);
|
|
59
|
+
telemetry.sendBreadcrumbClickedMessage({
|
|
60
|
+
link: item.link,
|
|
61
|
+
position: index + 1,
|
|
62
|
+
totalBreadcrumbs: items.length,
|
|
63
|
+
});
|
|
64
|
+
}, "$hasLink": hasLink, to: item.link, dataAttributes: !hasLink ? { 'aria-disabled': 'true' } : {} },
|
|
65
|
+
react_1.default.createElement(DropdownContent, { "$isActive": isActive },
|
|
66
|
+
react_1.default.createElement(BreadcrumbIcon_1.BreadcrumbIcon, { icon: item.icon }),
|
|
67
|
+
react_1.default.createElement(DropdownLabel, null, translatedLabel),
|
|
68
|
+
isActive && (react_1.default.createElement(ActiveIcon, null,
|
|
69
|
+
react_1.default.createElement(GenericIcon_1.GenericIcon, { icon: "check" }))))));
|
|
70
|
+
})))));
|
|
71
|
+
}
|
|
72
|
+
const BreadcrumbDropdownWrapper = styled_components_1.default.div `
|
|
73
|
+
display: inline-flex;
|
|
74
|
+
align-items: center;
|
|
75
|
+
`;
|
|
76
|
+
const StyledDropdownTrigger = styled_components_1.default.button `
|
|
77
|
+
display: flex;
|
|
78
|
+
align-items: center;
|
|
79
|
+
gap: var(--breadcrumbs-gap);
|
|
80
|
+
border: none;
|
|
81
|
+
background: none;
|
|
82
|
+
border-radius: var(--breadcrumbs-border-radius);
|
|
83
|
+
color: var(--breadcrumbs-text-color);
|
|
84
|
+
cursor: pointer;
|
|
85
|
+
font-size: var(--breadcrumbs-font-size);
|
|
86
|
+
|
|
87
|
+
&:hover {
|
|
88
|
+
background-color: var(--breadcrumbs-background-color-hover);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
&:focus {
|
|
92
|
+
box-shadow: var(--breadcrumbs-box-shadow-focus);
|
|
93
|
+
outline: none;
|
|
94
|
+
}
|
|
95
|
+
`;
|
|
96
|
+
const StyledDropdownMenuItem = (0, styled_components_1.default)(DropdownMenuItem_1.DropdownMenuItem) `
|
|
97
|
+
cursor: ${(props) => (props.$hasLink ? 'pointer' : 'default')};
|
|
98
|
+
|
|
99
|
+
${(props) => !props.$hasLink &&
|
|
100
|
+
(0, styled_components_1.css) `
|
|
101
|
+
&:focus,
|
|
102
|
+
&:focus-visible {
|
|
103
|
+
outline: none;
|
|
104
|
+
box-shadow: none;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
&:hover {
|
|
108
|
+
background-color: transparent;
|
|
109
|
+
color: inherit;
|
|
110
|
+
}
|
|
111
|
+
`}
|
|
112
|
+
`;
|
|
113
|
+
const TriggerContentWrapper = styled_components_1.default.span `
|
|
114
|
+
display: flex;
|
|
115
|
+
align-items: center;
|
|
116
|
+
gap: var(--breadcrumbs-gap);
|
|
117
|
+
`;
|
|
118
|
+
const DropdownContent = styled_components_1.default.div `
|
|
119
|
+
display: flex;
|
|
120
|
+
align-items: center;
|
|
121
|
+
gap: var(--breadcrumbs-gap);
|
|
122
|
+
padding: var(--breadcrumb-padding);
|
|
123
|
+
color: ${(props) => (props.$isActive ? 'var(--breadcrumbs-text-color-active)' : 'inherit')};
|
|
124
|
+
font-weight: ${(props) => props.$isActive ? 'var(--breadcrumbs-font-weight-active)' : 'inherit'};
|
|
125
|
+
`;
|
|
126
|
+
const DropdownLabel = styled_components_1.default.span `
|
|
127
|
+
color: inherit;
|
|
128
|
+
`;
|
|
129
|
+
const ActiveIcon = styled_components_1.default.span `
|
|
130
|
+
position: absolute;
|
|
131
|
+
left: var(--breadcrumb-dropdown-active-icon-position);
|
|
132
|
+
display: inline-flex;
|
|
133
|
+
align-items: center;
|
|
134
|
+
color: inherit;
|
|
135
|
+
width: var(--breadcrumbs-icon-size);
|
|
136
|
+
height: var(--breadcrumbs-icon-size);
|
|
137
|
+
`;
|
|
138
|
+
//# sourceMappingURL=BreadcrumbDropdown.js.map
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.BreadcrumbIcon = BreadcrumbIcon;
|
|
7
|
+
const react_1 = __importDefault(require("react"));
|
|
8
|
+
const styled_components_1 = __importDefault(require("styled-components"));
|
|
9
|
+
const GenericIcon_1 = require("../../icons/GenericIcon/GenericIcon");
|
|
10
|
+
function BreadcrumbIcon({ icon, className }) {
|
|
11
|
+
if (!icon) {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
return (react_1.default.createElement(BreadcrumbIconWrapper, { "data-component-name": "Breadcrumbs/BreadcrumbIcon", className: className },
|
|
15
|
+
react_1.default.createElement(GenericIcon_1.GenericIcon, { icon: icon, size: "var(--breadcrumbs-icon-size)" })));
|
|
16
|
+
}
|
|
17
|
+
const BreadcrumbIconWrapper = styled_components_1.default.span `
|
|
18
|
+
display: inline-flex;
|
|
19
|
+
align-items: center;
|
|
20
|
+
width: var(--breadcrumbs-icon-size);
|
|
21
|
+
justify-content: center;
|
|
22
|
+
`;
|
|
23
|
+
//# sourceMappingURL=BreadcrumbIcon.js.map
|
|
@@ -8,25 +8,77 @@ const react_1 = __importDefault(require("react"));
|
|
|
8
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
|
+
const BreadcrumbDropdown_1 = require("../../components/Breadcrumbs/BreadcrumbDropdown");
|
|
12
|
+
const BreadcrumbIcon_1 = require("../../components/Breadcrumbs/BreadcrumbIcon");
|
|
13
|
+
const utils_1 = require("../../core/utils");
|
|
14
|
+
const constants_1 = require("../../core/constants");
|
|
15
|
+
const GenericIcon_1 = require("../../icons/GenericIcon/GenericIcon");
|
|
11
16
|
function Breadcrumbs(props) {
|
|
12
|
-
const { useBreadcrumbs, useTelemetry } = (0, hooks_1.useThemeHooks)();
|
|
13
|
-
const fileBreadcrumbs = useBreadcrumbs();
|
|
14
|
-
const breadcrumbs = [...fileBreadcrumbs, ...(props.additionalBreadcrumbs || [])];
|
|
17
|
+
const { useBreadcrumbs, useTelemetry, useTranslate } = (0, hooks_1.useThemeHooks)();
|
|
18
|
+
const { breadcrumbs: fileBreadcrumbs, currentItemSiblings } = useBreadcrumbs();
|
|
15
19
|
const telemetry = useTelemetry();
|
|
20
|
+
const { translate } = useTranslate();
|
|
21
|
+
const breadcrumbs = react_1.default.useMemo(() => {
|
|
22
|
+
var _a;
|
|
23
|
+
const extra = (_a = props.additionalBreadcrumbs) !== null && _a !== void 0 ? _a : [];
|
|
24
|
+
return [...(fileBreadcrumbs || []), ...extra];
|
|
25
|
+
}, [fileBreadcrumbs, props.additionalBreadcrumbs]);
|
|
26
|
+
const shouldCollapse = breadcrumbs.length > 4;
|
|
27
|
+
const isInDropdown = (index, total, collapsed) => collapsed && index > 0 && index < total - 2;
|
|
28
|
+
const items = react_1.default.useMemo(() => {
|
|
29
|
+
const total = breadcrumbs.length;
|
|
30
|
+
return breadcrumbs.map((b, i) => ({
|
|
31
|
+
breadcrumb: b,
|
|
32
|
+
idx: i,
|
|
33
|
+
isLast: i === total - 1,
|
|
34
|
+
inDropdown: isInDropdown(i, total, shouldCollapse),
|
|
35
|
+
}));
|
|
36
|
+
}, [breadcrumbs, shouldCollapse]);
|
|
16
37
|
if (breadcrumbs.length === 0) {
|
|
17
38
|
return null;
|
|
18
39
|
}
|
|
19
|
-
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
40
|
+
const renderBreadcrumb = (breadcrumb, idx, isActive) => {
|
|
41
|
+
const isParentOfActive = idx === breadcrumbs.length - 2 && currentItemSiblings && currentItemSiblings.length > 0;
|
|
42
|
+
if (isParentOfActive) {
|
|
43
|
+
const currentActiveBreadcrumb = breadcrumbs[breadcrumbs.length - 1];
|
|
44
|
+
const siblingsWithActive = [
|
|
45
|
+
Object.assign(Object.assign({}, currentActiveBreadcrumb), { isActive: true }),
|
|
46
|
+
...currentItemSiblings,
|
|
47
|
+
];
|
|
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
|
+
link: item.link,
|
|
51
|
+
position: itemIdx + 1,
|
|
52
|
+
totalBreadcrumbs: siblingsWithActive.length,
|
|
53
|
+
}) },
|
|
54
|
+
react_1.default.createElement(BreadcrumbIcon_1.BreadcrumbIcon, { icon: breadcrumb.icon }),
|
|
55
|
+
(0, utils_1.trimText)(translatedLabel, constants_1.BREADCRUMB_MAX_LENGTH),
|
|
56
|
+
react_1.default.createElement(GenericIcon_1.GenericIcon, { icon: "chevron-down" })));
|
|
57
|
+
}
|
|
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
|
+
link: breadcrumb.link,
|
|
60
|
+
position: idx + 1,
|
|
61
|
+
totalBreadcrumbs: breadcrumbs.length,
|
|
62
|
+
}) }));
|
|
63
|
+
};
|
|
64
|
+
return (react_1.default.createElement(BreadcrumbsWrapper, { "data-component-name": "Breadcrumbs/Breadcrumbs", className: props.className }, items.map(({ breadcrumb, idx, isLast, inDropdown }) => {
|
|
65
|
+
if (inDropdown)
|
|
66
|
+
return null;
|
|
67
|
+
if (shouldCollapse && idx === 0) {
|
|
68
|
+
const collapsedBreadcrumbs = breadcrumbs.slice(1, -2);
|
|
69
|
+
return (react_1.default.createElement(react_1.default.Fragment, { key: idx },
|
|
70
|
+
renderBreadcrumb(breadcrumb, idx, isLast),
|
|
71
|
+
react_1.default.createElement(BreadcrumbSeparator, null, "/"),
|
|
72
|
+
react_1.default.createElement(BreadcrumbDropdown_1.BreadcrumbDropdown, { label: "...", items: collapsedBreadcrumbs, onItemClick: (item, itemIdx) => telemetry.sendBreadcrumbClickedMessage({
|
|
73
|
+
link: item.link,
|
|
74
|
+
position: itemIdx + 1,
|
|
26
75
|
totalBreadcrumbs: breadcrumbs.length,
|
|
27
|
-
})
|
|
28
|
-
|
|
29
|
-
|
|
76
|
+
}) }, "..."),
|
|
77
|
+
react_1.default.createElement(BreadcrumbSeparator, null, "/")));
|
|
78
|
+
}
|
|
79
|
+
return (react_1.default.createElement(react_1.default.Fragment, { key: idx },
|
|
80
|
+
renderBreadcrumb(breadcrumb, idx, isLast),
|
|
81
|
+
isLast ? null : react_1.default.createElement(BreadcrumbSeparator, null, "/")));
|
|
30
82
|
})));
|
|
31
83
|
}
|
|
32
84
|
const BreadcrumbsWrapper = styled_components_1.default.div `
|
|
@@ -36,17 +88,8 @@ const BreadcrumbsWrapper = styled_components_1.default.div `
|
|
|
36
88
|
color: var(--breadcrumbs-text-color);
|
|
37
89
|
font-size: var(--breadcrumbs-font-size);
|
|
38
90
|
flex-wrap: wrap;
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
> span {
|
|
45
|
-
padding: var(--breadcrumbs-gap);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
@media print {
|
|
49
|
-
display: none;
|
|
50
|
-
}
|
|
91
|
+
`;
|
|
92
|
+
const BreadcrumbSeparator = styled_components_1.default.span `
|
|
93
|
+
padding: var(--breadcrumbs-padding);
|
|
51
94
|
`;
|
|
52
95
|
//# sourceMappingURL=Breadcrumbs.js.map
|
|
@@ -8,12 +8,24 @@ exports.breadcrumbs = (0, styled_components_1.css) `
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
--breadcrumbs-text-color: var(--text-color-description); // @presenter Color
|
|
11
|
-
--breadcrumbs-font-size: var(--font-size-base); // @presenter FontSize
|
|
12
11
|
--breadcrumbs-text-color-active: var(--text-color-primary); // @presenter Color
|
|
13
|
-
--breadcrumbs-text-
|
|
14
|
-
|
|
15
|
-
--breadcrumbs-
|
|
12
|
+
--breadcrumbs-text-color-border-hover: var(--color-info-border-hover); // @presenter Color
|
|
13
|
+
|
|
14
|
+
--breadcrumbs-font-size: var(--font-size-base); // @presenter FontSize
|
|
15
|
+
--breadcrumbs-icon-size: var(--font-size-base); // @presenter FontSize
|
|
16
|
+
--breadcrumbs-font-weight-active: var(--font-weight-medium); // @presenter FontWeight
|
|
17
|
+
|
|
18
|
+
--breadcrumbs-border-radius: var(--border-radius); // @presenter BorderRadius
|
|
19
|
+
--breadcrumbs-gap: var(--spacing-xxs); // @presenter Spacing
|
|
20
|
+
|
|
21
|
+
--breadcrumbs-padding: 2px var(--spacing-xs); // @presenter Spacing
|
|
16
22
|
--breadcrumbs-margin-bottom: var(--spacing-lg); // @presenter Spacing
|
|
23
|
+
--breadcrumbs-background-color-hover: var(--color-hover-base); // @presenter Color
|
|
24
|
+
--breadcrumbs-background-color-focus: var(--color-info-border-hover); // @presenter Color
|
|
25
|
+
--breadcrumbs-box-shadow-focus: 0 0 0 1px var(--breadcrumbs-background-color-focus); // @presenter Color
|
|
26
|
+
|
|
27
|
+
--breadcrumb-padding: var(--spacing-xxs); // @presenter Spacing
|
|
28
|
+
--breadcrumb-dropdown-active-icon-position: var(--spacing-xs); // @presenter Spacing
|
|
17
29
|
|
|
18
30
|
// @tokens End
|
|
19
31
|
`;
|
|
@@ -13,7 +13,7 @@ function EditPageButton({ to }) {
|
|
|
13
13
|
const { useTranslate, useTelemetry } = (0, hooks_1.useThemeHooks)();
|
|
14
14
|
const { translate } = useTranslate();
|
|
15
15
|
const telemetry = useTelemetry();
|
|
16
|
-
return (react_1.default.createElement(EditPageButtonWrapper, { "data-component-name": "Buttons/EditPageButton", target: "_blank", to: to, onClick: () => telemetry.sendEditPageLinkClickedMessage(
|
|
16
|
+
return (react_1.default.createElement(EditPageButtonWrapper, { "data-component-name": "Buttons/EditPageButton", target: "_blank", to: to, onClick: () => telemetry.sendEditPageLinkClickedMessage() },
|
|
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
|
}
|
|
@@ -22,7 +22,7 @@ function CatalogCard({ entity, catalogConfig }) {
|
|
|
22
22
|
const pathPrefix = (0, utils_1.getPathPrefix)();
|
|
23
23
|
return (react_1.default.createElement(CatalogCardWrapper, { "data-component-name": "Catalog/CatalogCardView/CatalogCard", onClick: () => {
|
|
24
24
|
window.location.assign(`${pathPrefix}/catalogs/${catalogConfig.slug}/entities/${entity.key}`);
|
|
25
|
-
telemetry.sendCatalogItemClickedMessage(
|
|
25
|
+
telemetry.sendCatalogItemClickedMessage();
|
|
26
26
|
} },
|
|
27
27
|
react_1.default.createElement(CardContent, null,
|
|
28
28
|
react_1.default.createElement(CardHeader, null,
|
|
@@ -51,7 +51,7 @@ function CatalogClassicActions(props) {
|
|
|
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.sendCatalogActionsButtonClickedMessage(
|
|
54
|
+
telemetry.sendCatalogActionsButtonClickedMessage();
|
|
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
|
}
|
|
@@ -54,7 +54,7 @@ function CatalogClassicCard({ item }) {
|
|
|
54
54
|
const { useTelemetry } = (0, hooks_1.useThemeHooks)();
|
|
55
55
|
const telemetry = useTelemetry();
|
|
56
56
|
return (React.createElement(Link_1.Link, { key: item.docsLink || item.link, to: item.docsLink || item.link },
|
|
57
|
-
React.createElement(StyledCard, { "data-component-name": "CatalogClassic/CatalogClassicCard", onClick: () => telemetry.sendCatalogItemClickedMessage(
|
|
57
|
+
React.createElement(StyledCard, { "data-component-name": "CatalogClassic/CatalogClassicCard", onClick: () => telemetry.sendCatalogItemClickedMessage() },
|
|
58
58
|
React.createElement(CardContent, null,
|
|
59
59
|
React.createElement(CardTitleWrapper, null,
|
|
60
60
|
React.createElement(CardTitle, null,
|
|
@@ -34,7 +34,7 @@ function ReportDialog({ location, settings, onSubmit, onCancel, submitFeedback,
|
|
|
34
34
|
path: pathname,
|
|
35
35
|
lang,
|
|
36
36
|
});
|
|
37
|
-
telemetry.sendCodeSnippetReportedMessage(
|
|
37
|
+
telemetry.sendCodeSnippetReportedMessage();
|
|
38
38
|
onSubmit();
|
|
39
39
|
}), isDialog: true, onCancel: onCancel }))));
|
|
40
40
|
}
|
|
@@ -20,7 +20,7 @@ function FooterItem({ item, iconsOnly, className }) {
|
|
|
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.sendFooterItemClickedMessage(
|
|
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.sendFooterItemClickedMessage(), "data-translation-key": item.labelTranslationKey },
|
|
24
24
|
hasIcon ? (react_1.default.createElement(FooterLinkIcon, { iconsOnly: iconsOnly },
|
|
25
25
|
react_1.default.createElement(GenericIcon_1.GenericIcon, { icon: item.icon, srcSet: item.srcSet }))) : null,
|
|
26
26
|
!iconWithoutLabel ? translate(item.labelTranslationKey, item.label) : null,
|
|
@@ -28,7 +28,7 @@ function Logo(_a) {
|
|
|
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.sendLogoClickedMessage(
|
|
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.sendLogoClickedMessage() }, image)) : (image)));
|
|
32
32
|
}
|
|
33
33
|
const LogoWrapper = styled_components_1.default.div `
|
|
34
34
|
max-width: var(--logo-max-width);
|
|
@@ -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.sendMobileMenuButtonCloseClickedMessage(
|
|
48
|
+
telemetry.sendMobileMenuButtonCloseClickedMessage();
|
|
49
49
|
}
|
|
50
50
|
: () => {
|
|
51
51
|
openMobileMenu();
|
|
52
|
-
telemetry.sendMobileMenuButtonOpenClickedMessage(
|
|
52
|
+
telemetry.sendMobileMenuButtonOpenClickedMessage();
|
|
53
53
|
}, icon: isOpen ? react_1.default.createElement(CloseIcon_1.CloseIcon, null) : react_1.default.createElement(MenuIcon_1.MenuIcon, null), "aria-label": isOpen ? 'Close menu button' : 'Open menu button' }),
|
|
54
54
|
hideUserMenu ? null : react_1.default.createElement(UserMenu_1.UserMenu, null))));
|
|
55
55
|
}
|
|
@@ -27,7 +27,7 @@ function SearchInput({ placeholder, value, onChange, isLoading, showReturnButton
|
|
|
27
27
|
const handleOnReset = () => {
|
|
28
28
|
onChange('');
|
|
29
29
|
addSearchHistoryItem(value);
|
|
30
|
-
telemetry.sendSearchInputResetButtonClickedMessage(
|
|
30
|
+
telemetry.sendSearchInputResetButtonClickedMessage();
|
|
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" })),
|
|
@@ -44,7 +44,7 @@ function SearchRecent({ onSelect, className }) {
|
|
|
44
44
|
const handleOnRemove = (e, item) => {
|
|
45
45
|
e.stopPropagation();
|
|
46
46
|
removeSearchHistoryItem(item);
|
|
47
|
-
telemetry.sendSearchRecentRemoveButtonClickedMessage(
|
|
47
|
+
telemetry.sendSearchRecentRemoveButtonClickedMessage();
|
|
48
48
|
};
|
|
49
49
|
const handleKeyDown = (e, item, index) => {
|
|
50
50
|
if (e.key === 'Enter') {
|
|
@@ -21,10 +21,10 @@ const SidebarActions = ({ layout, hideCollapseSidebarButton = false, collapsedSi
|
|
|
21
21
|
!hideCollapseSidebarButton && (react_1.default.createElement(Button_1.Button, { onClick: () => {
|
|
22
22
|
onChangeCollapseSidebarClick();
|
|
23
23
|
if (collapsedSidebar) {
|
|
24
|
-
telemetry.sendSidebarItemExpandedMessage(
|
|
24
|
+
telemetry.sendSidebarItemExpandedMessage();
|
|
25
25
|
}
|
|
26
26
|
else {
|
|
27
|
-
telemetry.sendSidebarItemCollapsedMessage(
|
|
27
|
+
telemetry.sendSidebarItemCollapsedMessage();
|
|
28
28
|
}
|
|
29
29
|
}, title: collapsedSidebar
|
|
30
30
|
? translate('sidebar.actions.show', 'Show sidebar')
|
|
@@ -32,7 +32,7 @@ const SidebarActions = ({ layout, hideCollapseSidebarButton = false, collapsedSi
|
|
|
32
32
|
isApiDocs && (react_1.default.createElement(styled_1.ControlsWrapChangeLayoutButtons, { isCollapsed: collapsedSidebar },
|
|
33
33
|
react_1.default.createElement(ChangeViewButton_1.ChangeViewButton, { collapsedSidebar: collapsedSidebar, layout: layout, onClick: () => {
|
|
34
34
|
onChangeViewClick();
|
|
35
|
-
telemetry.sendChangeLayoutButtonClickedMessage(
|
|
35
|
+
telemetry.sendChangeLayoutButtonClickedMessage();
|
|
36
36
|
} }))),
|
|
37
37
|
!collapsedSidebar && requestAccessButton));
|
|
38
38
|
};
|
|
@@ -55,7 +55,7 @@ function TableOfContent(props) {
|
|
|
55
55
|
const href = '#' + heading.id;
|
|
56
56
|
return (React.createElement(TableOfContentMenuItem, { key: href + idx, href: href, depth: heading.depth - leastDepth + 1 || 0, className: activeHeading === heading.id ? 'active' : '', dangerouslySetInnerHTML: { __html: heading.value || '' }, "data-testid": `toc-${heading.value}`, onClick: (e) => {
|
|
57
57
|
e.preventDefault();
|
|
58
|
-
telemetry.sendTocItemClickedMessage(
|
|
58
|
+
telemetry.sendTocItemClickedMessage();
|
|
59
59
|
handleHeadingClick(heading.id);
|
|
60
60
|
} }));
|
|
61
61
|
}))));
|
|
@@ -12,6 +12,6 @@ function LoginButton({ href, className }) {
|
|
|
12
12
|
const { translate } = useTranslate();
|
|
13
13
|
const telemetry = useTelemetry();
|
|
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.sendLoginButtonClickedMessage(
|
|
15
|
+
react_1.default.createElement(Button_1.Button, { "data-translation-key": "userMenu.login", to: href, onClick: () => telemetry.sendLoginButtonClickedMessage(), "data-testid": "login-btn", extraClass: className, variant: "primary", size: "medium" }, translate('userMenu.login', 'Login'))));
|
|
16
16
|
}
|
|
17
17
|
//# sourceMappingURL=LoginButton.js.map
|
|
@@ -14,7 +14,7 @@ function LogoutMenuItem({ iconOnly, className }) {
|
|
|
14
14
|
const telemetry = useTelemetry();
|
|
15
15
|
const { translate } = useTranslate();
|
|
16
16
|
const handleClick = () => {
|
|
17
|
-
telemetry.sendLogoutMenuItemClickedMessage(
|
|
17
|
+
telemetry.sendLogoutMenuItemClickedMessage();
|
|
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')));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const BREADCRUMB_MAX_LENGTH = 25;
|
|
@@ -19,4 +19,5 @@ __exportStar(require("./environments"), exports);
|
|
|
19
19
|
__exportStar(require("./code-walkthrough"), exports);
|
|
20
20
|
__exportStar(require("./search"), exports);
|
|
21
21
|
__exportStar(require("./catalog"), exports);
|
|
22
|
+
__exportStar(require("./breadcrumb"), exports);
|
|
22
23
|
//# sourceMappingURL=index.js.map
|