@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.
Files changed (60) hide show
  1. package/lib/components/Breadcrumbs/Breadcrumb.d.ts +2 -1
  2. package/lib/components/Breadcrumbs/Breadcrumb.js +70 -22
  3. package/lib/components/Breadcrumbs/BreadcrumbDropdown.d.ts +14 -0
  4. package/lib/components/Breadcrumbs/BreadcrumbDropdown.js +138 -0
  5. package/lib/components/Breadcrumbs/BreadcrumbIcon.d.ts +7 -0
  6. package/lib/components/Breadcrumbs/BreadcrumbIcon.js +23 -0
  7. package/lib/components/Breadcrumbs/Breadcrumbs.js +68 -25
  8. package/lib/components/Breadcrumbs/variables.js +16 -4
  9. package/lib/components/Buttons/EditPageButton.js +1 -1
  10. package/lib/components/Catalog/CatalogCardView/CatalogCard.js +1 -1
  11. package/lib/components/CatalogClassic/CatalogClassicActions.js +1 -1
  12. package/lib/components/CatalogClassic/CatalogClassicCard.js +1 -1
  13. package/lib/components/Feedback/ReportDialog.js +1 -1
  14. package/lib/components/Footer/FooterItem.js +1 -1
  15. package/lib/components/Logo/Logo.js +1 -1
  16. package/lib/components/Navbar/Navbar.js +2 -2
  17. package/lib/components/Search/SearchInput.js +1 -1
  18. package/lib/components/Search/SearchRecent.js +1 -1
  19. package/lib/components/SidebarActions/SidebarActions.js +3 -3
  20. package/lib/components/TableOfContent/TableOfContent.js +1 -1
  21. package/lib/components/UserMenu/LoginButton.js +1 -1
  22. package/lib/components/UserMenu/LogoutMenuItem.js +1 -1
  23. package/lib/core/constants/breadcrumb.d.ts +1 -0
  24. package/lib/core/constants/breadcrumb.js +5 -0
  25. package/lib/core/constants/index.d.ts +1 -0
  26. package/lib/core/constants/index.js +1 -0
  27. package/lib/core/hooks/__mocks__/use-theme-hooks.js +1 -1
  28. package/lib/core/hooks/use-page-actions.js +26 -8
  29. package/lib/core/hooks/use-theme-hooks.js +2 -1
  30. package/lib/core/types/hooks.d.ts +5 -1
  31. package/lib/core/utils/text-trimmer.js +1 -1
  32. package/lib/markdoc/tags/img.js +1 -0
  33. package/package.json +2 -2
  34. package/src/components/Breadcrumbs/Breadcrumb.tsx +75 -34
  35. package/src/components/Breadcrumbs/BreadcrumbDropdown.tsx +170 -0
  36. package/src/components/Breadcrumbs/BreadcrumbIcon.tsx +30 -0
  37. package/src/components/Breadcrumbs/Breadcrumbs.tsx +112 -29
  38. package/src/components/Breadcrumbs/variables.ts +16 -4
  39. package/src/components/Buttons/EditPageButton.tsx +1 -1
  40. package/src/components/Catalog/CatalogCardView/CatalogCard.tsx +1 -1
  41. package/src/components/CatalogClassic/CatalogClassicActions.tsx +1 -1
  42. package/src/components/CatalogClassic/CatalogClassicCard.tsx +1 -1
  43. package/src/components/Feedback/ReportDialog.tsx +1 -1
  44. package/src/components/Footer/FooterItem.tsx +1 -1
  45. package/src/components/Logo/Logo.tsx +1 -1
  46. package/src/components/Navbar/Navbar.tsx +2 -2
  47. package/src/components/Search/SearchInput.tsx +1 -1
  48. package/src/components/Search/SearchRecent.tsx +1 -1
  49. package/src/components/SidebarActions/SidebarActions.tsx +3 -3
  50. package/src/components/TableOfContent/TableOfContent.tsx +1 -1
  51. package/src/components/UserMenu/LoginButton.tsx +1 -1
  52. package/src/components/UserMenu/LogoutMenuItem.tsx +1 -1
  53. package/src/core/constants/breadcrumb.ts +1 -0
  54. package/src/core/constants/index.ts +1 -0
  55. package/src/core/hooks/__mocks__/use-theme-hooks.ts +1 -1
  56. package/src/core/hooks/use-page-actions.ts +42 -7
  57. package/src/core/hooks/use-theme-hooks.ts +2 -1
  58. package/src/core/types/hooks.ts +5 -1
  59. package/src/core/utils/text-trimmer.ts +1 -1
  60. 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 = __importDefault(require("styled-components"));
31
+ const styled_components_1 = __importStar(require("styled-components"));
9
32
  const Link_1 = require("../../components/Link/Link");
10
- function Breadcrumb({ label, link, isActive, onClick }) {
11
- return (react_1.default.createElement(BreadcrumbWrapper, { "data-component-name": "Breadcrumbs/Breadcrumb", isLink: link != null, isActive: isActive, onClick: onClick }, link ? (react_1.default.createElement(BreadcrumbLink, { to: link }, label)) : (react_1.default.createElement(BreadcrumbText, null, label))));
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 BreadcrumbText = styled_components_1.default.div `
14
- cursor: default;
15
- `;
16
- const BreadcrumbWrapper = styled_components_1.default.div `
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
- ${(props) => props.isLink &&
20
- `
21
- &:hover {
22
- text-decoration: var(--breadcrumbs-text-decoration-hover);
23
- }
24
- `}
55
+ &:hover {
56
+ background-color: var(--breadcrumbs-background-color-hover);
57
+ }
25
58
 
26
- ${(props) => props.isActive &&
27
- `
28
- color: var(--breadcrumbs-text-color-active);
29
- `}
59
+ &:focus {
60
+ box-shadow: var(--breadcrumbs-box-shadow-focus);
61
+ outline: none;
62
+ }
30
63
  `;
31
- const BreadcrumbLink = (0, styled_components_1.default)(Link_1.Link) `
32
- text-decoration: none;
33
- color: var(--breadcrumbs-text-color);
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
- &:visited {
36
- color: var(--breadcrumbs-text-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,7 @@
1
+ import type { JSX } from 'react';
2
+ type BreadcrumbIconProps = {
3
+ icon?: string;
4
+ className?: string;
5
+ };
6
+ export declare function BreadcrumbIcon({ icon, className }: BreadcrumbIconProps): JSX.Element | null;
7
+ export {};
@@ -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
- return (react_1.default.createElement(BreadcrumbsWrapper, { "data-component-name": "Breadcrumbs/Breadcrumbs", className: props.className }, breadcrumbs.map((breadcrumb, idx) => {
20
- const isLast = idx === breadcrumbs.length - 1;
21
- return (react_1.default.createElement(react_1.default.Fragment, { key: idx },
22
- react_1.default.createElement(Breadcrumb_1.Breadcrumb, { link: breadcrumb.link, label: breadcrumb.label, isActive: isLast, onClick: () => {
23
- telemetry.sendBreadcrumbClickedMessage({
24
- link: breadcrumb.link,
25
- position: idx + 1,
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
- isLast ? null : react_1.default.createElement("span", null, "/")));
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
- > div {
41
- padding: var(--breadcrumbs-padding);
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-decoration-hover: underline; // @presenter TextDecoration
14
- --breadcrumbs-padding: 0; // @presenter Spacing
15
- --breadcrumbs-gap: var(--spacing-xs);
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(undefined) },
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(undefined);
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(undefined);
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(undefined) },
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(undefined);
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(undefined), "data-translation-key": item.labelTranslationKey },
23
+ return (react_1.default.createElement(FooterItemWrapper, { className: className, "data-component-name": "Footer/FooterItem", iconsOnly: iconsOnly, item: item }, item.type === 'separator' ? (react_1.default.createElement(FooterSeparator, { "data-translation-key": item.labelTranslationKey }, translate(item.labelTranslationKey, item.label))) : (react_1.default.createElement(FooterLink, { to: item.link, external: item.external, target: item.target, "data-testid": item.label, onClick: () => 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(undefined) }, image)) : (image)));
31
+ return (react_1.default.createElement(LogoWrapper, Object.assign({ "data-component-name": "Logo/Logo", className: className }, otherProps), config.link ? (react_1.default.createElement(Link_1.Link, { to: config.link, onClick: () => 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(undefined);
48
+ telemetry.sendMobileMenuButtonCloseClickedMessage();
49
49
  }
50
50
  : () => {
51
51
  openMobileMenu();
52
- telemetry.sendMobileMenuButtonOpenClickedMessage(undefined);
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(undefined);
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(undefined);
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(undefined);
24
+ telemetry.sendSidebarItemExpandedMessage();
25
25
  }
26
26
  else {
27
- telemetry.sendSidebarItemCollapsedMessage(undefined);
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(undefined);
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(undefined);
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(undefined), "data-testid": "login-btn", extraClass: className, variant: "primary", size: "medium" }, translate('userMenu.login', 'Login'))));
15
+ react_1.default.createElement(Button_1.Button, { "data-translation-key": "userMenu.login", to: href, onClick: () => 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(undefined);
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;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BREADCRUMB_MAX_LENGTH = void 0;
4
+ exports.BREADCRUMB_MAX_LENGTH = 25;
5
+ //# sourceMappingURL=breadcrumb.js.map
@@ -3,3 +3,4 @@ export * from './environments';
3
3
  export * from './code-walkthrough';
4
4
  export * from './search';
5
5
  export * from './catalog';
6
+ export * from './breadcrumb';
@@ -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