@redocly/theme 0.57.0-next.3 → 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 (105) 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 -28
  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/Catalog/CatalogEntity/CatalogEntity.js +1 -35
  12. package/lib/components/CatalogClassic/CatalogClassicActions.js +1 -1
  13. package/lib/components/CatalogClassic/CatalogClassicCard.js +1 -1
  14. package/lib/components/CatalogClassic/CatalogClassicInfoBlock.js +1 -1
  15. package/lib/components/CodeBlock/CodeBlockControls.js +1 -4
  16. package/lib/components/Feedback/Feedback.js +1 -1
  17. package/lib/components/Feedback/ReportDialog.js +1 -1
  18. package/lib/components/Filter/FilterCheckboxes.js +1 -1
  19. package/lib/components/Footer/FooterItem.js +1 -1
  20. package/lib/components/LanguagePicker/LanguagePicker.js +1 -4
  21. package/lib/components/Logo/Logo.js +1 -1
  22. package/lib/components/Menu/MenuItem.js +3 -6
  23. package/lib/components/Navbar/Navbar.js +2 -2
  24. package/lib/components/Navbar/NavbarItem.js +1 -1
  25. package/lib/components/Search/SearchDialog.js +9 -15
  26. package/lib/components/Search/SearchInput.js +1 -1
  27. package/lib/components/Search/SearchRecent.js +1 -1
  28. package/lib/components/SidebarActions/SidebarActions.js +3 -3
  29. package/lib/components/Switch/Switch.d.ts +4 -1
  30. package/lib/components/Switch/Switch.js +12 -3
  31. package/lib/components/TableOfContent/TableOfContent.js +1 -1
  32. package/lib/components/UserMenu/LoginButton.js +1 -1
  33. package/lib/components/UserMenu/LogoutMenuItem.js +1 -1
  34. package/lib/core/constants/breadcrumb.d.ts +1 -0
  35. package/lib/core/constants/breadcrumb.js +5 -0
  36. package/lib/core/constants/index.d.ts +1 -0
  37. package/lib/core/constants/index.js +1 -0
  38. package/lib/core/hooks/__mocks__/use-theme-hooks.d.ts +1 -0
  39. package/lib/core/hooks/__mocks__/use-theme-hooks.js +2 -1
  40. package/lib/core/hooks/search/use-search-dialog.js +2 -2
  41. package/lib/core/hooks/use-color-switcher.js +1 -4
  42. package/lib/core/hooks/use-page-actions.js +26 -8
  43. package/lib/core/hooks/use-product-picker.js +1 -1
  44. package/lib/core/hooks/use-telemetry-fallback.d.ts +60 -0
  45. package/lib/core/hooks/use-telemetry-fallback.js +66 -0
  46. package/lib/core/hooks/use-theme-hooks.js +4 -2
  47. package/lib/core/types/hooks.d.ts +7 -5
  48. package/lib/core/types/index.d.ts +0 -1
  49. package/lib/core/types/index.js +0 -1
  50. package/lib/core/utils/text-trimmer.js +1 -1
  51. package/lib/markdoc/components/CodeWalkthrough/CodeFilters.js +2 -2
  52. package/lib/markdoc/components/CodeWalkthrough/CodePanel.js +1 -0
  53. package/lib/markdoc/components/CodeWalkthrough/CodeToggle.js +1 -1
  54. package/lib/markdoc/components/CodeWalkthrough/CodeWalkthrough.js +7 -8
  55. package/lib/markdoc/tags/img.js +1 -0
  56. package/package.json +3 -3
  57. package/src/components/Breadcrumbs/Breadcrumb.tsx +75 -34
  58. package/src/components/Breadcrumbs/BreadcrumbDropdown.tsx +170 -0
  59. package/src/components/Breadcrumbs/BreadcrumbIcon.tsx +30 -0
  60. package/src/components/Breadcrumbs/Breadcrumbs.tsx +112 -32
  61. package/src/components/Breadcrumbs/variables.ts +16 -4
  62. package/src/components/Buttons/EditPageButton.tsx +1 -1
  63. package/src/components/Catalog/CatalogCardView/CatalogCard.tsx +1 -1
  64. package/src/components/Catalog/CatalogEntity/CatalogEntity.tsx +4 -76
  65. package/src/components/CatalogClassic/CatalogClassicActions.tsx +1 -1
  66. package/src/components/CatalogClassic/CatalogClassicCard.tsx +1 -1
  67. package/src/components/CatalogClassic/CatalogClassicInfoBlock.tsx +1 -3
  68. package/src/components/CodeBlock/CodeBlockControls.tsx +1 -4
  69. package/src/components/Feedback/Feedback.tsx +1 -1
  70. package/src/components/Feedback/ReportDialog.tsx +1 -1
  71. package/src/components/Filter/FilterCheckboxes.tsx +1 -1
  72. package/src/components/Footer/FooterItem.tsx +1 -1
  73. package/src/components/LanguagePicker/LanguagePicker.tsx +1 -4
  74. package/src/components/Logo/Logo.tsx +1 -1
  75. package/src/components/Menu/MenuItem.tsx +3 -6
  76. package/src/components/Navbar/Navbar.tsx +2 -2
  77. package/src/components/Navbar/NavbarItem.tsx +1 -3
  78. package/src/components/Search/SearchDialog.tsx +9 -15
  79. package/src/components/Search/SearchInput.tsx +1 -1
  80. package/src/components/Search/SearchRecent.tsx +1 -1
  81. package/src/components/SidebarActions/SidebarActions.tsx +3 -3
  82. package/src/components/Switch/Switch.tsx +34 -3
  83. package/src/components/TableOfContent/TableOfContent.tsx +1 -1
  84. package/src/components/UserMenu/LoginButton.tsx +1 -1
  85. package/src/components/UserMenu/LogoutMenuItem.tsx +1 -1
  86. package/src/core/constants/breadcrumb.ts +1 -0
  87. package/src/core/constants/index.ts +1 -0
  88. package/src/core/hooks/__mocks__/use-theme-hooks.ts +2 -1
  89. package/src/core/hooks/search/use-search-dialog.ts +2 -2
  90. package/src/core/hooks/use-color-switcher.ts +1 -4
  91. package/src/core/hooks/use-page-actions.ts +42 -7
  92. package/src/core/hooks/use-product-picker.ts +1 -1
  93. package/src/core/hooks/use-telemetry-fallback.ts +61 -0
  94. package/src/core/hooks/use-theme-hooks.ts +4 -2
  95. package/src/core/types/hooks.ts +15 -5
  96. package/src/core/types/index.ts +0 -1
  97. package/src/core/utils/text-trimmer.ts +1 -1
  98. package/src/markdoc/components/CodeWalkthrough/CodeFilters.tsx +2 -2
  99. package/src/markdoc/components/CodeWalkthrough/CodePanel.tsx +1 -0
  100. package/src/markdoc/components/CodeWalkthrough/CodeToggle.tsx +5 -1
  101. package/src/markdoc/components/CodeWalkthrough/CodeWalkthrough.tsx +7 -8
  102. package/src/markdoc/tags/img.ts +1 -0
  103. package/lib/core/types/telemetry.d.ts +0 -17
  104. package/lib/core/types/telemetry.js +0 -3
  105. package/src/core/types/telemetry.ts +0 -28
@@ -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,28 +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;
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,
75
+ totalBreadcrumbs: breadcrumbs.length,
76
+ }) }, "..."),
77
+ react_1.default.createElement(BreadcrumbSeparator, null, "/")));
78
+ }
21
79
  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.send({
24
- type: 'breadcrumb.clicked',
25
- payload: {
26
- link: breadcrumb.link,
27
- position: idx + 1,
28
- totalBreadcrumbs: breadcrumbs.length,
29
- },
30
- });
31
- } }),
32
- isLast ? null : react_1.default.createElement("span", null, "/")));
80
+ renderBreadcrumb(breadcrumb, idx, isLast),
81
+ isLast ? null : react_1.default.createElement(BreadcrumbSeparator, null, "/")));
33
82
  })));
34
83
  }
35
84
  const BreadcrumbsWrapper = styled_components_1.default.div `
@@ -39,17 +88,8 @@ const BreadcrumbsWrapper = styled_components_1.default.div `
39
88
  color: var(--breadcrumbs-text-color);
40
89
  font-size: var(--breadcrumbs-font-size);
41
90
  flex-wrap: wrap;
42
-
43
- > div {
44
- padding: var(--breadcrumbs-padding);
45
- }
46
-
47
- > span {
48
- padding: var(--breadcrumbs-gap);
49
- }
50
-
51
- @media print {
52
- display: none;
53
- }
91
+ `;
92
+ const BreadcrumbSeparator = styled_components_1.default.span `
93
+ padding: var(--breadcrumbs-padding);
54
94
  `;
55
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.send({ type: 'edit_page_link.clicked' }) },
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.send({ type: 'catalog_item.clicked' });
25
+ telemetry.sendCatalogItemClickedMessage();
26
26
  } },
27
27
  react_1.default.createElement(CardContent, null,
28
28
  react_1.default.createElement(CardHeader, null,
@@ -8,18 +8,13 @@ const react_1 = __importDefault(require("react"));
8
8
  const styled_components_1 = __importDefault(require("styled-components"));
9
9
  const react_router_dom_1 = require("react-router-dom");
10
10
  const utils_1 = require("../../../core/utils");
11
- const ArrowLeftIcon_1 = require("../../../icons/ArrowLeftIcon/ArrowLeftIcon");
12
11
  const CatalogPageDescription_1 = require("../../../components/Catalog/CatalogPageDescription");
13
12
  const CatalogEntityProperties_1 = require("../../../components/Catalog/CatalogEntity/CatalogEntityProperties/CatalogEntityProperties");
14
13
  const CatalogEntityMetadata_1 = require("../../../components/Catalog/CatalogEntity/CatalogEntityMetadata");
15
14
  const CatalogEntityLinks_1 = require("../../../components/Catalog/CatalogEntity/CatalogEntityLinks");
16
15
  const Breadcrumbs_1 = require("../../../components/Breadcrumbs/Breadcrumbs");
17
- const Sidebar_1 = require("../../../components/Sidebar/Sidebar");
18
- const Menu_1 = require("../../../components/Menu/Menu");
19
- const Button_1 = require("../../../components/Button/Button");
20
16
  const CatalogEntityRelations_1 = require("../../../components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityRelations");
21
17
  const hooks_1 = require("../../../core/hooks");
22
- const SidebarActions_1 = require("../../../components/SidebarActions/SidebarActions");
23
18
  const CatalogEntitySchema_1 = require("../../../components/Catalog/CatalogEntity/CatalogEntitySchema");
24
19
  const CatalogEntityMethodAndPath_1 = require("../../../components/Catalog/CatalogEntity/CatalogEntityMethodAndPath");
25
20
  const CatalogEntityRelationsGraph_lazy_1 = require("../../../components/Catalog/CatalogEntity/CatalogEntityGraph/CatalogEntityRelationsGraph.lazy");
@@ -39,22 +34,8 @@ function CatalogEntity({ entity, entitiesCatalogConfig, catalogConfig, initialRe
39
34
  const { translate } = useTranslate();
40
35
  const linkToMainCatalog = `catalogs/${catalogConfig.slug}`;
41
36
  const linkToMainCatalogLabel = translate(catalogConfig.titleTranslationKey);
42
- const { layout, collapsedSidebar, onChangeViewClick, onChangeCollapseSidebarClick, searchQuery, setSearchQuery, } = useCatalog();
43
- const { pathname } = (0, react_router_dom_1.useLocation)();
44
- const linkBase = `${linkToMainCatalog}/entities/${entity.key}`;
45
- const menuItemDefs = [
46
- { label: 'Overview', path: linkBase, end: true },
47
- { label: 'Relations Graph', path: `${linkBase}/relations-graph`, end: true },
48
- ];
49
- const sidebarMenuItems = menuItemDefs.map(({ label, path, end }) => ({
50
- label,
51
- link: path,
52
- active: Boolean((0, react_router_dom_1.matchPath)({ path: `/${path}`, end }, pathname)),
53
- items: [],
54
- hasActiveSubItem: false,
55
- }));
37
+ const { searchQuery, setSearchQuery } = useCatalog();
56
38
  return (react_1.default.createElement(CatalogPageWrapper, { "data-component-name": "Catalog/CatalogEntity/CatalogEntity" },
57
- react_1.default.createElement(CatalogSidebar, { collapsed: collapsedSidebar, header: react_1.default.createElement(BackLink, { icon: react_1.default.createElement(ArrowLeftIcon_1.ArrowLeftIcon, null), iconPosition: "left", variant: "ghost", size: "medium", "data-component-name": "Sidebar/BackButton", to: linkToMainCatalog }, collapsedSidebar ? ('') : (react_1.default.createElement("div", { "data-translation-key": "sidebar.menu.backLabel" }, translate('sidebar.menu.backLabel')))), menu: react_1.default.createElement(Menu_1.Menu, { items: sidebarMenuItems }), footer: react_1.default.createElement(SidebarActions_1.SidebarActions, { layout: layout, collapsedSidebar: collapsedSidebar, isApiDocs: false, onChangeViewClick: onChangeViewClick, onChangeCollapseSidebarClick: onChangeCollapseSidebarClick }) }),
58
39
  react_1.default.createElement(CatalogPageContent, null,
59
40
  react_1.default.createElement(Breadcrumbs_1.Breadcrumbs, { additionalBreadcrumbs: [
60
41
  { label: linkToMainCatalogLabel, link: linkToMainCatalog },
@@ -113,14 +94,6 @@ const CatalogPageContent = styled_components_1.default.main `
113
94
  padding: var(--catalog-page-padding);
114
95
  }
115
96
  `;
116
- const CatalogSidebar = (0, styled_components_1.default)(Sidebar_1.Sidebar) `
117
- display: none;
118
-
119
- @media screen and (min-width: ${utils_1.breakpoints.medium}) {
120
- display: flex;
121
- }
122
- --menu-container-padding-top: 0;
123
- `;
124
97
  const CatalogEntityPageWrapper = styled_components_1.default.div `
125
98
  display: flex;
126
99
  flex-direction: column;
@@ -138,11 +111,4 @@ const CatalogTwoColumnsSection = styled_components_1.default.section `
138
111
  gap: 24px;
139
112
  align-items: start;
140
113
  `;
141
- const BackLink = (0, styled_components_1.default)(Button_1.Button) `
142
- padding: var(--spacing-unit) 0;
143
- height: calc(var(--line-height-base) + var(--spacing-unit) * 2);
144
- justify-content: flex-start;
145
- width: 100%;
146
- margin-bottom: 0px;
147
- `;
148
114
  //# sourceMappingURL=CatalogEntity.js.map
@@ -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.send({ type: 'catalog_actions_button.clicked' });
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.send({ type: 'catalog_item.clicked' }) },
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,
@@ -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.send({ type: 'scorecard_link.clicked', payload: { action: 'click' } }), withStatusDot: true, statusDotColor: `var(${colorVariable})` }, level)));
24
+ react_1.default.createElement(Tag_1.Tag, { onClick: () => telemetry.sendScorecardLinkClickedMessage({ action: 'click' }), withStatusDot: true, statusDotColor: `var(${colorVariable})` }, level)));
25
25
  }
26
26
  const CatalogInfoBlockWrapper = styled_components_1.default.div `
27
27
  position: relative;
@@ -54,10 +54,7 @@ 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.send({
58
- type: 'openapi_docs.copy_code_snippet.clicked',
59
- payload: { snippetType: 'copy' },
60
- });
57
+ telemetry.sendCopyCodeSnippetClickedMessage({ snippetType: 'copy' });
61
58
  }
62
59
  } }))) : null))) : null;
63
60
  return children || controls ? (react_1.default.createElement(ContainerWrapper, { "data-component-name": "CodeBlock/CodeBlockControls", className: className, "$isEmptyTitle": isEmptyTitle }, children ? children : defaultControls)) : null;
@@ -64,7 +64,7 @@ function Feedback(props) {
64
64
  return (React.createElement(FeedbackWrapper, { "data-component-name": "Feedback/Feedback" },
65
65
  React.createElement(FeedbackComponent, { settings: settings, onSubmit: (values) => {
66
66
  submitFeedback({ type, values, path });
67
- telemetry.send({ type: 'feedback.sent', payload: { feedbackType: type } });
67
+ telemetry.sendFeedbackMessage({ feedbackType: type });
68
68
  } })));
69
69
  };
70
70
  return React.createElement(React.Fragment, { key: pathname }, renderFeedbackComponent());
@@ -34,7 +34,7 @@ function ReportDialog({ location, settings, onSubmit, onCancel, submitFeedback,
34
34
  path: pathname,
35
35
  lang,
36
36
  });
37
- telemetry.send({ type: 'code_snippet.reported' });
37
+ telemetry.sendCodeSnippetReportedMessage();
38
38
  onSubmit();
39
39
  }), isDialog: true, onCancel: onCancel }))));
40
40
  }
@@ -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.send({ type: 'filter_checkbox.toggled', payload: { id } });
27
+ telemetry.sendFilterCheckboxToggledMessage({ id });
28
28
  } },
29
29
  react_1.default.createElement(CheckboxIcon_1.CheckboxIcon, { checked: filter.selectedOptions instanceof Set
30
30
  ? filter.selectedOptions.has(value) ||
@@ -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.send({ type: 'footer_item.clicked' }), "data-translation-key": item.labelTranslationKey },
23
+ return (react_1.default.createElement(FooterItemWrapper, { className: className, "data-component-name": "Footer/FooterItem", iconsOnly: iconsOnly, item: item }, item.type === 'separator' ? (react_1.default.createElement(FooterSeparator, { "data-translation-key": item.labelTranslationKey }, translate(item.labelTranslationKey, item.label))) : (react_1.default.createElement(FooterLink, { to: item.link, external: item.external, target: item.target, "data-testid": item.label, onClick: () => 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,