@redocly/theme 0.63.0-next.5 → 0.63.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/lib/components/Accordion/variables.js +2 -2
  2. package/lib/components/Catalog/Catalog.js +114 -50
  3. package/lib/components/Catalog/CatalogAvatar.d.ts +5 -0
  4. package/lib/components/Catalog/CatalogAvatar.js +92 -0
  5. package/lib/components/Catalog/CatalogCardView/CatalogCard.js +26 -7
  6. package/lib/components/Catalog/CatalogCardView/CatalogCardView.js +10 -2
  7. package/lib/components/Catalog/CatalogEntity/CatalogEntity.js +17 -17
  8. package/lib/components/Catalog/CatalogEntity/CatalogEntityGraph/CatalogEntityRelationsLinkedNode.js +4 -20
  9. package/lib/components/Catalog/CatalogEntity/CatalogEntityGraph/CatalogEntityRelationsNodeContent.d.ts +7 -0
  10. package/lib/components/Catalog/CatalogEntity/CatalogEntityGraph/CatalogEntityRelationsNodeContent.js +53 -0
  11. package/lib/components/Catalog/CatalogEntity/CatalogEntityGraph/CatalogEntityRelationsRootNode.js +3 -17
  12. package/lib/components/Catalog/CatalogEntity/CatalogEntityHistory/CatalogEntityHistoryButton.js +30 -9
  13. package/lib/components/Catalog/CatalogEntity/CatalogEntityHistory/CatalogEntityHistorySidebar.js +16 -3
  14. package/lib/components/Catalog/CatalogEntity/CatalogEntityHistory/CatalogEntityVersionItem.js +8 -4
  15. package/lib/components/Catalog/CatalogEntity/CatalogEntityProperties/CatalogEntityProperties.js +11 -5
  16. package/lib/components/Catalog/CatalogEntity/CatalogEntityProperties/DomainsProperty.js +1 -1
  17. package/lib/components/Catalog/CatalogEntity/CatalogEntityProperties/OwnersProperty.js +1 -1
  18. package/lib/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityApiDescriptionRelations.js +1 -1
  19. package/lib/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityRelationsTable.js +4 -1
  20. package/lib/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityRelationsTableContent.js +7 -2
  21. package/lib/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityTeamRelations.js +1 -1
  22. package/lib/components/Catalog/CatalogEntity/CatalogEntitySchema.js +1 -1
  23. package/lib/components/Catalog/CatalogFilter/CatalogFilterCheckboxes.js +1 -1
  24. package/lib/components/Catalog/CatalogFilter/CatalogFilterContent.d.ts +4 -2
  25. package/lib/components/Catalog/CatalogFilter/CatalogFilterContent.js +25 -8
  26. package/lib/components/Catalog/CatalogMobileFiltersPanel/CatalogMobileFiltersPanel.d.ts +7 -0
  27. package/lib/components/Catalog/CatalogMobileFiltersPanel/CatalogMobileFiltersPanel.js +24 -0
  28. package/lib/components/Catalog/CatalogMobileFiltersPanel/CatalogMobileFiltersPanelHeader.d.ts +6 -0
  29. package/lib/components/Catalog/CatalogMobileFiltersPanel/CatalogMobileFiltersPanelHeader.js +26 -0
  30. package/lib/components/Catalog/CatalogMobileFiltersPanel/CatalogMobileFiltersPanelOverlay.d.ts +7 -0
  31. package/lib/components/Catalog/CatalogMobileFiltersPanel/CatalogMobileFiltersPanelOverlay.js +30 -0
  32. package/lib/components/Catalog/CatalogMobileTopBar/CatalogMobileTopBar.d.ts +13 -0
  33. package/lib/components/Catalog/CatalogMobileTopBar/CatalogMobileTopBar.js +30 -0
  34. package/lib/components/Catalog/CatalogMobileTopBar/CatalogMobileTopBarControls.d.ts +11 -0
  35. package/lib/components/Catalog/CatalogMobileTopBar/CatalogMobileTopBarControls.js +21 -0
  36. package/lib/components/Catalog/CatalogMobileTopBar/CatalogMobileTopBarFiltersButton.d.ts +7 -0
  37. package/lib/components/Catalog/CatalogMobileTopBar/CatalogMobileTopBarFiltersButton.js +25 -0
  38. package/lib/components/Catalog/CatalogPageDescription.js +0 -6
  39. package/lib/components/Catalog/CatalogSelector.d.ts +0 -1
  40. package/lib/components/Catalog/CatalogSelector.js +50 -16
  41. package/lib/components/Catalog/CatalogTableView/CatalogTableView.d.ts +2 -1
  42. package/lib/components/Catalog/CatalogTableView/CatalogTableView.js +20 -5
  43. package/lib/components/Catalog/CatalogTableView/CatalogUserEntityCell.js +2 -23
  44. package/lib/components/Catalog/CatalogTagsWithTooltip.d.ts +2 -1
  45. package/lib/components/Catalog/CatalogTagsWithTooltip.js +14 -6
  46. package/lib/components/Catalog/variables.js +78 -36
  47. package/lib/components/Filter/variables.js +1 -1
  48. package/lib/components/LoadMore/LoadMore.js +1 -0
  49. package/lib/components/PageActions/PageActions.js +1 -2
  50. package/lib/components/UserMenu/UserMenu.js +1 -3
  51. package/lib/core/hooks/index.d.ts +1 -0
  52. package/lib/core/hooks/index.js +1 -0
  53. package/lib/core/hooks/use-is-truncated.d.ts +1 -0
  54. package/lib/core/hooks/use-is-truncated.js +19 -0
  55. package/lib/core/hooks/use-tabs.d.ts +1 -1
  56. package/lib/core/hooks/use-tabs.js +30 -17
  57. package/lib/core/types/l10n.d.ts +1 -1
  58. package/lib/core/utils/custom-catalog-options-casing.d.ts +15 -0
  59. package/lib/core/utils/custom-catalog-options-casing.js +32 -0
  60. package/lib/core/utils/index.d.ts +1 -0
  61. package/lib/core/utils/index.js +1 -0
  62. package/lib/markdoc/components/MarkdocExample/MarkdocExample.js +2 -2
  63. package/lib/markdoc/components/Tabs/Tabs.d.ts +1 -2
  64. package/lib/markdoc/components/Tabs/Tabs.js +9 -22
  65. package/package.json +4 -4
  66. package/src/components/Accordion/variables.ts +2 -2
  67. package/src/components/Catalog/Catalog.tsx +157 -95
  68. package/src/components/Catalog/CatalogAvatar.tsx +68 -0
  69. package/src/components/Catalog/CatalogCardView/CatalogCard.tsx +29 -5
  70. package/src/components/Catalog/CatalogCardView/CatalogCardView.tsx +10 -2
  71. package/src/components/Catalog/CatalogEntity/CatalogEntity.tsx +17 -17
  72. package/src/components/Catalog/CatalogEntity/CatalogEntityGraph/CatalogEntityRelationsLinkedNode.tsx +4 -21
  73. package/src/components/Catalog/CatalogEntity/CatalogEntityGraph/CatalogEntityRelationsNodeContent.tsx +82 -0
  74. package/src/components/Catalog/CatalogEntity/CatalogEntityGraph/CatalogEntityRelationsRootNode.tsx +4 -22
  75. package/src/components/Catalog/CatalogEntity/CatalogEntityHistory/CatalogEntityHistoryButton.tsx +39 -10
  76. package/src/components/Catalog/CatalogEntity/CatalogEntityHistory/CatalogEntityHistorySidebar.tsx +19 -3
  77. package/src/components/Catalog/CatalogEntity/CatalogEntityHistory/CatalogEntityVersionItem.tsx +8 -4
  78. package/src/components/Catalog/CatalogEntity/CatalogEntityProperties/CatalogEntityProperties.tsx +12 -10
  79. package/src/components/Catalog/CatalogEntity/CatalogEntityProperties/DomainsProperty.tsx +5 -1
  80. package/src/components/Catalog/CatalogEntity/CatalogEntityProperties/OwnersProperty.tsx +1 -0
  81. package/src/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityApiDescriptionRelations.tsx +1 -1
  82. package/src/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityRelationsTable.tsx +6 -2
  83. package/src/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityRelationsTableContent.tsx +10 -2
  84. package/src/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityTeamRelations.tsx +1 -1
  85. package/src/components/Catalog/CatalogEntity/CatalogEntitySchema.tsx +1 -1
  86. package/src/components/Catalog/CatalogFilter/CatalogFilterCheckboxes.tsx +1 -1
  87. package/src/components/Catalog/CatalogFilter/CatalogFilterContent.tsx +30 -6
  88. package/src/components/Catalog/CatalogMobileFiltersPanel/CatalogMobileFiltersPanel.tsx +31 -0
  89. package/src/components/Catalog/CatalogMobileFiltersPanel/CatalogMobileFiltersPanelHeader.tsx +34 -0
  90. package/src/components/Catalog/CatalogMobileFiltersPanel/CatalogMobileFiltersPanelOverlay.tsx +40 -0
  91. package/src/components/Catalog/CatalogMobileTopBar/CatalogMobileTopBar.tsx +54 -0
  92. package/src/components/Catalog/CatalogMobileTopBar/CatalogMobileTopBarControls.tsx +34 -0
  93. package/src/components/Catalog/CatalogMobileTopBar/CatalogMobileTopBarFiltersButton.tsx +39 -0
  94. package/src/components/Catalog/CatalogPageDescription.tsx +0 -6
  95. package/src/components/Catalog/CatalogSelector.tsx +23 -21
  96. package/src/components/Catalog/CatalogTableView/CatalogTableView.tsx +37 -6
  97. package/src/components/Catalog/CatalogTableView/CatalogUserEntityCell.tsx +2 -26
  98. package/src/components/Catalog/CatalogTagsWithTooltip.tsx +24 -9
  99. package/src/components/Catalog/variables.ts +78 -36
  100. package/src/components/Filter/variables.ts +1 -1
  101. package/src/components/LoadMore/LoadMore.tsx +1 -0
  102. package/src/components/PageActions/PageActions.tsx +1 -2
  103. package/src/components/UserMenu/UserMenu.tsx +1 -3
  104. package/src/core/hooks/code-walkthrough/use-code-walkthrough.ts +1 -1
  105. package/src/core/hooks/index.ts +1 -0
  106. package/src/core/hooks/use-is-truncated.ts +20 -0
  107. package/src/core/hooks/use-tabs.ts +40 -21
  108. package/src/core/types/l10n.ts +2 -0
  109. package/src/core/utils/custom-catalog-options-casing.ts +29 -0
  110. package/src/core/utils/index.ts +1 -0
  111. package/src/markdoc/components/MarkdocExample/MarkdocExample.tsx +2 -6
  112. package/src/markdoc/components/Tabs/Tabs.tsx +4 -37
@@ -0,0 +1,82 @@
1
+ import React from 'react';
2
+ import styled from 'styled-components';
3
+
4
+ import { CatalogEntityIcon } from '@redocly/theme/components/Catalog/CatalogEntityIcon';
5
+ import { customCatalogOptionsCasing } from '@redocly/theme/core/utils';
6
+
7
+ export type CatalogEntityRelationsNodeContentProps = {
8
+ entityType: string;
9
+ label: string;
10
+ isRoot: boolean;
11
+ };
12
+
13
+ export function CatalogEntityRelationsNodeContent({
14
+ entityType,
15
+ label,
16
+ isRoot,
17
+ }: CatalogEntityRelationsNodeContentProps): React.ReactElement {
18
+ const formattedEntityType = customCatalogOptionsCasing(entityType);
19
+
20
+ return (
21
+ <CatalogEntityRelationsNodeContentWrapper
22
+ isRoot={isRoot}
23
+ data-component-name="Catalog/CatalogEntity/CatalogEntityGraph/CatalogEntityRelationsNodeContent"
24
+ >
25
+ <CatalogEntityRelationsNodeTypeRow isRoot={isRoot}>
26
+ {isRoot ? (
27
+ <CatalogEntityIcon
28
+ entityType={entityType}
29
+ forceColor="var(--catalog-entity-relations-node-root-icon-color)"
30
+ />
31
+ ) : (
32
+ <CatalogEntityIcon entityType={entityType} defaultColor={false} />
33
+ )}
34
+ <span>{formattedEntityType}</span>
35
+ </CatalogEntityRelationsNodeTypeRow>
36
+ <CatalogEntityRelationsNodeLabelRow isRoot={isRoot}>
37
+ {label}
38
+ </CatalogEntityRelationsNodeLabelRow>
39
+ </CatalogEntityRelationsNodeContentWrapper>
40
+ );
41
+ }
42
+
43
+ const CatalogEntityRelationsNodeTypeRow = styled.div<{ isRoot: boolean }>`
44
+ display: flex;
45
+ align-items: center;
46
+ gap: var(--catalog-entity-relations-node-gap);
47
+ line-height: var(--line-height-sm);
48
+ font-size: var(--font-size-sm);
49
+ color: ${({ isRoot }) =>
50
+ isRoot
51
+ ? 'var(--catalog-entity-relations-node-root-text-color)'
52
+ : 'var(--text-color-description)'};
53
+ `;
54
+
55
+ const CatalogEntityRelationsNodeLabelRow = styled.div<{ isRoot: boolean }>`
56
+ display: flex;
57
+ align-items: center;
58
+ gap: var(--catalog-entity-relations-node-gap);
59
+ line-height: var(--line-height-lg);
60
+ font-size: var(--font-size-lg);
61
+ color: ${({ isRoot }) =>
62
+ isRoot ? 'var(--catalog-entity-relations-node-root-text-color)' : 'var(--text-color-primary)'};
63
+ `;
64
+
65
+ const CatalogEntityRelationsNodeContentWrapper = styled.div<{ isRoot: boolean }>`
66
+ display: flex;
67
+ flex-direction: column;
68
+ align-items: flex-start;
69
+ gap: var(--catalog-entity-relations-node-gap);
70
+ padding: var(--catalog-entity-relations-node-padding);
71
+ border-radius: var(--catalog-entity-relations-node-border-radius);
72
+ font-style: normal;
73
+ font-weight: var(--catalog-entity-relations-node-font-weight);
74
+ background: ${({ isRoot }) =>
75
+ isRoot
76
+ ? 'var(--catalog-entity-relations-node-root-bg-color)'
77
+ : 'var(--catalog-entity-relations-node-bg-color)'};
78
+ border: ${({ isRoot }) =>
79
+ isRoot
80
+ ? 'none'
81
+ : `var(--catalog-entity-relations-node-border-width) var(--catalog-entity-relations-node-border-style) var(--catalog-entity-relations-node-border-color)`};
82
+ `;
@@ -1,9 +1,8 @@
1
1
  import React from 'react';
2
2
  import { Handle, Position } from '@xyflow/react';
3
- import styled from 'styled-components';
4
3
 
5
- import { CatalogEntityIcon } from '@redocly/theme/components/Catalog/CatalogEntityIcon';
6
4
  import { GraphHandleType } from '@redocly/theme/core/constants/catalog';
5
+ import { CatalogEntityRelationsNodeContent } from '@redocly/theme/components/Catalog/CatalogEntity/CatalogEntityGraph/CatalogEntityRelationsNodeContent';
7
6
 
8
7
  export type CatalogEntityRelationsRootNodeProps = {
9
8
  label: string;
@@ -17,33 +16,16 @@ export function CatalogEntityRelationsRootNode({
17
16
  className,
18
17
  }: CatalogEntityRelationsRootNodeProps): React.ReactElement {
19
18
  return (
20
- <RelationsRootNodeWrapper
19
+ <div
21
20
  className={className}
22
21
  data-component-name="Catalog/CatalogEntity/CatalogEntityGraph/CatalogEntityRelationsRootNode"
23
22
  >
24
- <CatalogEntityIcon
25
- entityType={entityType}
26
- forceColor="var(--catalog-entity-relations-node-root-icon-color)"
27
- />
28
- <div>{label}</div>
23
+ <CatalogEntityRelationsNodeContent entityType={entityType} label={label} isRoot={true} />
29
24
  <Handle
30
25
  type={GraphHandleType.Source}
31
26
  position={Position.Bottom}
32
27
  id={GraphHandleType.Source}
33
28
  />
34
- </RelationsRootNodeWrapper>
29
+ </div>
35
30
  );
36
31
  }
37
-
38
- const RelationsRootNodeWrapper = styled.div`
39
- display: flex;
40
- align-items: center;
41
- gap: var(--catalog-entity-relations-node-gap);
42
- padding: var(--catalog-entity-relations-node-padding);
43
- border-radius: var(--catalog-entity-relations-node-border-radius);
44
- font-style: normal;
45
- font-weight: var(--catalog-entity-relations-node-font-weight-root);
46
- background: var(--catalog-entity-relations-node-root-bg-color);
47
- color: var(--catalog-entity-relations-node-root-text-color);
48
- border: none;
49
- `;
@@ -5,6 +5,8 @@ import { RecentlyViewedIcon } from '@redocly/theme/icons/RecentlyViewedIcon/Rece
5
5
  import { CheckmarkOutlineIcon } from '@redocly/theme/icons/CheckmarkOutlineIcon/CheckmarkOutlineIcon';
6
6
  import { useThemeHooks } from '@redocly/theme/core/hooks';
7
7
  import { VERSION_NOT_SPECIFIED } from '@redocly/theme/core/constants';
8
+ import { Tooltip } from '@redocly/theme/components/Tooltip/Tooltip';
9
+ import { useIsTruncated } from '@redocly/theme/core/hooks';
8
10
 
9
11
  export type CatalogHistoryButtonProps = {
10
12
  version: string | null;
@@ -18,6 +20,7 @@ export function CatalogEntityHistoryButton({
18
20
  const [label, setLabel] = useState(version === VERSION_NOT_SPECIFIED ? null : version);
19
21
  const { useTranslate } = useThemeHooks();
20
22
  const { translate } = useTranslate();
23
+ const [labelRef, isLabelTruncated] = useIsTruncated<HTMLSpanElement>(label);
21
24
 
22
25
  const handleClose = useCallback(
23
26
  (e: CustomEvent): void => {
@@ -57,10 +60,19 @@ export function CatalogEntityHistoryButton({
57
60
  <HistoryContent>
58
61
  <HistoryText>{translate('catalog.history.button.label', 'Version history')}</HistoryText>
59
62
  {label && (
60
- <VersionPill>
61
- <CheckmarkIcon />
62
- <span>{label}</span>
63
- </VersionPill>
63
+ <Tooltip
64
+ tip={label}
65
+ placement="bottom"
66
+ arrowPosition="left"
67
+ disabled={!isLabelTruncated}
68
+ >
69
+ <VersionPillWrapper>
70
+ <VersionPill>
71
+ <CheckmarkIcon />
72
+ <span ref={labelRef}>{label}</span>
73
+ </VersionPill>
74
+ </VersionPillWrapper>
75
+ </Tooltip>
64
76
  )}
65
77
  </HistoryContent>
66
78
  </HistoryItem>
@@ -69,7 +81,7 @@ export function CatalogEntityHistoryButton({
69
81
  }
70
82
 
71
83
  const CatalogHistoryButtonWrapper = styled.div`
72
- width: 100%;
84
+ width: var(--catalog-history-button-width);
73
85
  `;
74
86
 
75
87
  const Separator = styled.div`
@@ -88,7 +100,7 @@ const HistoryItem = styled.button`
88
100
  gap: var(--catalog-history-item-gap);
89
101
  padding: var(--catalog-history-item-padding);
90
102
  margin-bottom: var(--catalog-history-item-margin-bottom);
91
- width: 100%;
103
+ width: var(--catalog-history-button-item-width);
92
104
  border-radius: var(--catalog-history-item-border-radius);
93
105
  cursor: pointer;
94
106
  transition: background-color 0.2s ease;
@@ -100,19 +112,29 @@ const HistoryItem = styled.button`
100
112
 
101
113
  const HistoryContent = styled.div`
102
114
  display: flex;
115
+ flex-wrap: wrap;
103
116
  align-items: center;
104
117
  justify-content: space-between;
105
118
  flex: 1;
106
119
  gap: var(--catalog-history-item-gap);
120
+ min-width: 0;
121
+ max-width: var(--catalog-history-content-max-width);
107
122
  `;
108
123
 
109
124
  const HistoryText = styled.span`
125
+ flex: 0 0 auto;
110
126
  font-family: var(--catalog-history-text-font-family);
111
127
  font-size: var(--catalog-history-text-font-size);
112
128
  font-weight: var(--catalog-history-text-font-weight);
113
129
  line-height: var(--catalog-history-text-line-height);
114
130
  color: var(--catalog-history-text-color);
115
- flex: 1;
131
+ white-space: nowrap;
132
+ `;
133
+
134
+ const VersionPillWrapper = styled.div`
135
+ flex: 0 1 auto;
136
+ min-width: 0;
137
+ max-width: var(--catalog-history-content-max-width);
116
138
  `;
117
139
 
118
140
  const HistoryIcon = styled(RecentlyViewedIcon)`
@@ -125,23 +147,30 @@ const VersionPill = styled.div`
125
147
  display: flex;
126
148
  align-items: center;
127
149
  gap: var(--catalog-history-pill-gap);
128
- padding: var(--catalog-history-pill-padding-vertical)
129
- var(--catalog-history-pill-padding-horizontal);
150
+ padding: var(--catalog-history-pill-padding-vertical) var(--catalog-history-pill-padding-horizontal);
130
151
  border: 1px solid var(--catalog-history-pill-border-color);
131
152
  border-radius: var(--catalog-history-pill-border-radius);
132
153
  background-color: transparent;
133
- flex-shrink: 0;
154
+ min-width: 0;
155
+ max-width: 100%;
134
156
 
135
157
  span {
136
158
  font-family: var(--catalog-history-pill-font-family);
137
159
  font-size: var(--catalog-history-pill-font-size);
138
160
  line-height: var(--catalog-history-pill-line-height);
139
161
  color: var(--catalog-history-pill-text-color);
162
+ overflow: hidden;
163
+ text-overflow: ellipsis;
164
+ white-space: nowrap;
165
+ min-width: 0;
140
166
  }
141
167
  `;
142
168
 
143
169
  const CheckmarkIcon = styled(CheckmarkOutlineIcon)`
144
170
  width: var(--catalog-history-pill-icon-size);
145
171
  height: var(--catalog-history-pill-icon-size);
172
+ min-width: var(--catalog-history-pill-icon-size);
173
+ min-height: var(--catalog-history-pill-icon-size);
174
+ flex-shrink: 0;
146
175
  color: var(--catalog-history-pill-icon-color);
147
176
  `;
@@ -8,6 +8,7 @@ import { MenuContainer } from '@redocly/theme/components/Menu/MenuContainer';
8
8
  import { transformRevisionsToVersionHistory } from '@redocly/theme/core/utils';
9
9
  import { DEFAULT_LOCALE_PLACEHOLDER } from '@redocly/theme/core/constants';
10
10
  import { CatalogEntityVersionItem } from '@redocly/theme/components/Catalog/CatalogEntity/CatalogEntityHistory/CatalogEntityVersionItem';
11
+ import { RecentlyViewedIcon } from '@redocly/theme/icons/RecentlyViewedIcon/RecentlyViewedIcon';
11
12
 
12
13
  export type CatalogHistorySidebarProps = {
13
14
  entityKey: string;
@@ -100,7 +101,10 @@ export function CatalogEntityHistorySidebar({
100
101
  return (
101
102
  <SidebarOverlay className={className} data-component-name="Catalog/CatalogHistorySidebar">
102
103
  <SidebarHeader>
103
- <HeaderTitle>{translate('catalog.history.sidebar.title', 'Version history')}</HeaderTitle>
104
+ <HeaderWrapper>
105
+ <HistoryIcon />
106
+ <HeaderTitle>{translate('catalog.history.sidebar.title', 'Version history')}</HeaderTitle>
107
+ </HeaderWrapper>
104
108
  <CloseButton
105
109
  onClick={handleClose}
106
110
  aria-label={translate('catalog.history.sidebar.close', 'Close version history')}
@@ -128,10 +132,10 @@ export function CatalogEntityHistorySidebar({
128
132
 
129
133
  const SidebarOverlay = styled.div`
130
134
  position: fixed;
131
- top: calc(var(--navbar-height) + var(--banner-height, 0));
135
+ top: calc(var(--navbar-height) + var(--banner-height));
132
136
  left: 0;
133
137
  width: var(--sidebar-width);
134
- height: calc(100vh - var(--navbar-height) - var(--banner-height, 0));
138
+ height: calc(100vh - var(--navbar-height) - var(--banner-height));
135
139
  background-color: var(--catalog-history-sidebar-bg-color);
136
140
  border-right: 1px solid var(--catalog-history-sidebar-border-color);
137
141
  display: flex;
@@ -181,3 +185,15 @@ const VersionList = styled.ul`
181
185
  padding: var(--catalog-history-sidebar-content-padding);
182
186
  margin-top: var(--catalog-history-sidebar-content-margin-top);
183
187
  `;
188
+
189
+ const HistoryIcon = styled(RecentlyViewedIcon)`
190
+ width: var(--catalog-history-icon-size);
191
+ height: var(--catalog-history-icon-size);
192
+ flex-shrink: 0;
193
+ `;
194
+
195
+ const HeaderWrapper = styled.div`
196
+ display: flex;
197
+ align-items: center;
198
+ gap: var(--spacing-xs);
199
+ `;
@@ -54,8 +54,8 @@ export function CatalogEntityVersionItem({
54
54
  const singleRevisionLink = buildRevisionUrl(basePath, group.singleRevisionDate, group.version);
55
55
 
56
56
  const versionTitle = isNotSpecifiedVersion
57
- ? `${translate('catalog.history.version.label', 'Version')}: ${translate('catalog.history.version.notSpecified', 'not specified')}`
58
- : `${translate('catalog.history.version.label', 'Version')}: ${group.version}`;
57
+ ? `${translate('catalog.history.version.label', 'Version')}:\u00a0${translate('catalog.history.version.notSpecified', 'not specified')}`
58
+ : `${translate('catalog.history.version.label', 'Version')}:\u00a0${group.version}`;
59
59
 
60
60
  const versionButton = (
61
61
  <VersionButton
@@ -80,11 +80,12 @@ export function CatalogEntityVersionItem({
80
80
  <Tag
81
81
  color="grey"
82
82
  borderless
83
- textTransform="none"
83
+ textTransform="lowercase"
84
84
  style={{
85
85
  fontSize: 'var(--font-size-xs)',
86
86
  borderRadius: 'var(--catalog-history-sidebar-version-tag-border-radius)',
87
87
  flexShrink: 0,
88
+ marginLeft: 'var(--spacing-xxs)',
88
89
  }}
89
90
  >
90
91
  {translate('catalog.history.version.default', 'default')}
@@ -216,6 +217,8 @@ const VersionTitle = styled.span`
216
217
  color: var(--catalog-history-sidebar-version-title-color);
217
218
  flex-shrink: 1;
218
219
  min-width: 0;
220
+ overflow-wrap: break-word;
221
+ word-break: break-word;
219
222
  `;
220
223
 
221
224
  const VersionDate = styled.span`
@@ -239,6 +242,7 @@ const RevisionsList = styled.ul`
239
242
  margin: 0;
240
243
  padding: 0;
241
244
  padding-left: var(--catalog-history-sidebar-revisions-padding-left);
245
+ padding-bottom: var(--catalog-history-sidebar-revisions-padding-bottom);
242
246
  position: relative;
243
247
 
244
248
  &::before {
@@ -246,7 +250,7 @@ const RevisionsList = styled.ul`
246
250
  position: absolute;
247
251
  left: 22px;
248
252
  top: 0;
249
- bottom: 0;
253
+ bottom: var(--catalog-history-sidebar-revisions-padding-bottom);
250
254
  width: 1px;
251
255
  background-color: var(
252
256
  --catalog-history-sidebar-revision-line-color,
@@ -10,6 +10,7 @@ import { DomainsProperty } from '@redocly/theme/components/Catalog/CatalogEntity
10
10
  import { OwnersProperty } from '@redocly/theme/components/Catalog/CatalogEntity/CatalogEntityProperties/OwnersProperty';
11
11
  import { ContactProperty } from '@redocly/theme/components/Catalog/CatalogEntity/CatalogEntityProperties/ContactProperty';
12
12
  import { FormatProperty } from '@redocly/theme/components/Catalog/CatalogEntity/CatalogEntityProperties/FormatProperty';
13
+ import { breakpoints } from '@redocly/theme/core';
13
14
 
14
15
  type PropertyRenderer = {
15
16
  key: string;
@@ -67,15 +68,8 @@ export type CatalogEntityPropertiesProps = {
67
68
  export function CatalogEntityProperties({ entity }: CatalogEntityPropertiesProps): JSX.Element {
68
69
  const renderers = propertyRenderers.filter((renderer) => renderer.condition(entity));
69
70
 
70
- const gridTemplateColumns = [1, 2, 4].includes(renderers.length)
71
- ? 'repeat(2, 1fr)'
72
- : 'repeat(3, 1fr)';
73
-
74
71
  return (
75
- <CatalogEntityPropertiesGridWrapper
76
- data-component-name="Catalog/CatalogEntity/CatalogEntityProperties/CatalogEntityProperties"
77
- gridTemplateColumns={gridTemplateColumns}
78
- >
72
+ <CatalogEntityPropertiesGridWrapper data-component-name="Catalog/CatalogEntity/CatalogEntityProperties/CatalogEntityProperties">
79
73
  {renderers.map((renderer) => (
80
74
  <renderer.component key={renderer.key + entity.id} entity={entity} />
81
75
  ))}
@@ -83,8 +77,16 @@ export function CatalogEntityProperties({ entity }: CatalogEntityPropertiesProps
83
77
  );
84
78
  }
85
79
 
86
- const CatalogEntityPropertiesGridWrapper = styled.div<{ gridTemplateColumns: string }>`
80
+ const CatalogEntityPropertiesGridWrapper = styled.div`
87
81
  display: grid;
88
- grid-template-columns: ${({ gridTemplateColumns }) => gridTemplateColumns};
89
82
  gap: var(--spacing-base);
83
+ grid-template-columns: 1fr;
84
+
85
+ @media screen and (min-width: ${breakpoints.small}) {
86
+ grid-template-columns: repeat(2, 1fr);
87
+ }
88
+
89
+ @media screen and (min-width: ${breakpoints.max}) {
90
+ grid-template-columns: repeat(3, 1fr);
91
+ }
90
92
  `;
@@ -28,7 +28,11 @@ export function DomainsProperty({ entity }: DomainsPropertyProps): JSX.Element {
28
28
  content={
29
29
  <>
30
30
  {domains?.map((domain) => (
31
- <Tag key={domain?.id} style={{ backgroundColor: 'var(--bg-color)' }}>
31
+ <Tag
32
+ key={domain?.id}
33
+ style={{ backgroundColor: 'var(--bg-color)' }}
34
+ variant="outline"
35
+ >
32
36
  <GraphIcon />
33
37
  {domain?.title}
34
38
  </Tag>
@@ -34,6 +34,7 @@ export function OwnersProperty({ entity }: OwnersPropertyProps): JSX.Element {
34
34
  backgroundColor: 'var(--bg-color)',
35
35
  borderRadius: 'var(--border-radius-xl)',
36
36
  }}
37
+ variant="outline"
37
38
  >
38
39
  {owner?.title}
39
40
  </Tag>
@@ -51,7 +51,7 @@ export function CatalogEntityApiDescriptionRelations({
51
51
  }: CatalogEntityApiDescriptionRelationsProps): JSX.Element {
52
52
  return (
53
53
  <div data-component-name="Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityApiDescriptionRelations">
54
- <Tabs key={entity.id} forceReady={relations.length > 0} size={TabsSize.MEDIUM}>
54
+ <Tabs key={entity.id} size={TabsSize.MEDIUM}>
55
55
  <TabItem
56
56
  label="Operations"
57
57
  icon={<MoleculesIcon />}
@@ -79,7 +79,7 @@ export function CatalogEntityRelationsTable({
79
79
  };
80
80
 
81
81
  return (
82
- <div data-component-name="Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityRelationsTable">
82
+ <CatalogEntityRelationsTableWrapper data-component-name="Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityRelationsTable">
83
83
  {heading && <Heading>{heading}</Heading>}
84
84
  <CatalogActionsRow
85
85
  searchQuery={searchQuery}
@@ -103,10 +103,14 @@ export function CatalogEntityRelationsTable({
103
103
  listType={listType}
104
104
  onRowClick={onRowClick}
105
105
  />
106
- </div>
106
+ </CatalogEntityRelationsTableWrapper>
107
107
  );
108
108
  }
109
109
 
110
+ const CatalogEntityRelationsTableWrapper = styled.div`
111
+ min-width: 0;
112
+ `;
113
+
110
114
  const Heading = styled.h2`
111
115
  margin: var(--spacing-base) 0;
112
116
  font-size: var(--font-size-md);
@@ -1,4 +1,5 @@
1
1
  import React, { JSX } from 'react';
2
+ import styled from 'styled-components';
2
3
 
3
4
  import type { CatalogEntityConfig, EntitiesCatalogConfig } from '@redocly/config';
4
5
  import type { ListType } from '@redocly/theme/core/types';
@@ -48,7 +49,7 @@ export function CatalogEntityRelationsTableContent({
48
49
  onRowClick,
49
50
  }: CatalogEntityRelationsTableContentProps): JSX.Element {
50
51
  return (
51
- <div data-component-name="Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityRelationsTableContent">
52
+ <TableContentWrapper data-component-name="Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityRelationsTableContent">
52
53
  <HighlightContext.Provider value={[searchQuery]}>
53
54
  {relations.length > 0 ? (
54
55
  <CatalogTableView
@@ -62,6 +63,7 @@ export function CatalogEntityRelationsTableContent({
62
63
  isColumnSorted={isColumnSorted}
63
64
  style={{ marginTop: 0 }}
64
65
  onRowClick={onRowClick}
66
+ contentMinWidth={TABLE_SCROLL_MIN_WIDTH_PX}
65
67
  />
66
68
  ) : (
67
69
  <CatalogEntitiesEmptyState listType={listType} />
@@ -76,6 +78,12 @@ export function CatalogEntityRelationsTableContent({
76
78
  label={query.isFetchingNextPage ? 'Loading...' : 'Load More'}
77
79
  />
78
80
  )}
79
- </div>
81
+ </TableContentWrapper>
80
82
  );
81
83
  }
84
+
85
+ const TABLE_SCROLL_MIN_WIDTH_PX = 608;
86
+
87
+ const TableContentWrapper = styled.div`
88
+ min-width: 0; /* Constrain width so table overflow-x scroll works inside tabs */
89
+ `;
@@ -79,7 +79,7 @@ export function CatalogEntityTeamRelations({
79
79
  }: CatalogEntityTeamRelationsProps): JSX.Element {
80
80
  return (
81
81
  <div data-component-name="Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityTeamRelations">
82
- <Tabs forceReady={relations.length > 0} size={TabsSize.MEDIUM}>
82
+ <Tabs size={TabsSize.MEDIUM}>
83
83
  <TabItem label="Members" icon={<PeopleIcon />} onClick={() => setFilter('type:user')}>
84
84
  <CatalogEntityRelationsTable
85
85
  key="members-table"
@@ -122,7 +122,7 @@ const SplitViewWrapper = styled.div`
122
122
  const SchemaSampleWrapper = styled.div`
123
123
  flex: 1;
124
124
  position: sticky;
125
- top: calc(var(--navbar-height) + var(--spacing-md));
125
+ top: calc(var(--navbar-height) + var(--banner-height) + var(--spacing-md));
126
126
  align-self: flex-start;
127
127
  padding-top: var(--spacing-sm);
128
128
  `;
@@ -173,5 +173,5 @@ const FilterCheckboxOption = styled(FilterOption)`
173
173
  `;
174
174
 
175
175
  const FilterSearchWrapper = styled.div`
176
- padding: var(--filter-content-search-padding);
176
+ padding-bottom: var(--spacing-xs);
177
177
  `;
@@ -1,13 +1,14 @@
1
1
  import React from 'react';
2
2
  import styled from 'styled-components';
3
3
 
4
- import type { JSX } from 'react';
4
+ import type { JSX, ReactNode } from 'react';
5
5
  import type { ResolvedFilter } from '@redocly/theme/core/types';
6
6
  import type { RedoclyConfig } from '@redocly/theme/config';
7
7
 
8
8
  import { useThemeHooks } from '@redocly/theme/core/hooks';
9
9
  import { Button } from '@redocly/theme/components/Button/Button';
10
10
  import { CatalogFilter } from '@redocly/theme/components/Catalog/CatalogFilter/CatalogFilter';
11
+ import { breakpoints } from '@redocly/theme/core/utils';
11
12
  import { isFromToSelectedOptions } from '@redocly/theme/core/utils';
12
13
 
13
14
  export type CatalogFilterContentProps = {
@@ -18,6 +19,8 @@ export type CatalogFilterContentProps = {
18
19
  | NonNullable<RedoclyConfig['catalog']>[string]['filterValuesCasing']
19
20
  | ((str: string) => string);
20
21
  showCounter?: boolean;
22
+ catalogSelector?: ReactNode;
23
+ searchInput?: ReactNode;
21
24
  className?: string;
22
25
  };
23
26
 
@@ -27,6 +30,8 @@ export function CatalogFilterContent({
27
30
  filterTerm,
28
31
  filterValuesCasing,
29
32
  showCounter = true,
33
+ catalogSelector,
34
+ searchInput,
30
35
  className,
31
36
  }: CatalogFilterContentProps): JSX.Element | null {
32
37
  const { useTranslate } = useThemeHooks();
@@ -50,7 +55,7 @@ export function CatalogFilterContent({
50
55
  onClear();
51
56
  };
52
57
 
53
- if (!filters.length) {
58
+ if (!filters.length && !catalogSelector) {
54
59
  return null;
55
60
  }
56
61
 
@@ -64,12 +69,16 @@ export function CatalogFilterContent({
64
69
  {translate('catalog.filters.title', 'Filters')}
65
70
  </FiltersTitle>
66
71
  {hasActiveFilters ? (
67
- <Button size="medium" tone="danger" variant="ghost" onClick={handleClearAll}>
72
+ <Button size="medium" variant="ghost" onClick={handleClearAll}>
68
73
  {translate('catalog.filters.clearAll', 'Clear filters')}
69
74
  </Button>
70
75
  ) : null}
71
76
  </FiltersHeader>
77
+ {searchInput ? <FiltersSearchWrapper>{searchInput}</FiltersSearchWrapper> : null}
72
78
  <FilterItems>
79
+ {catalogSelector ? (
80
+ <CatalogSelectorItemWrapper>{catalogSelector}</CatalogSelectorItemWrapper>
81
+ ) : null}
73
82
  {filters.map((filter, idx) => (
74
83
  <CatalogFilter
75
84
  filter={filter}
@@ -91,8 +100,7 @@ const CatalogFilterContentWrapper = styled.div`
91
100
 
92
101
  const FiltersHeader = styled.div`
93
102
  display: flex;
94
- padding: var(--filter-content-header-padding-vertical)
95
- var(--filter-content-header-padding-horizontal);
103
+ padding: var(--catalog-filter-content-header-padding);
96
104
  `;
97
105
 
98
106
  const FiltersTitle = styled.div`
@@ -102,9 +110,25 @@ const FiltersTitle = styled.div`
102
110
  line-height: var(--filter-content-title-line-height);
103
111
  `;
104
112
 
113
+ const CatalogSelectorItemWrapper = styled.div`
114
+ padding: var(--filter-group-padding);
115
+ display: flex;
116
+ flex-direction: column;
117
+ gap: var(--filter-group-gap);
118
+ border-bottom: 1px solid var(--catalog-table-border-color);
119
+ `;
120
+
121
+ const FiltersSearchWrapper = styled.div`
122
+ padding: 0 var(--spacing-base) var(--spacing-base) var(--spacing-base);
123
+
124
+ @media screen and (min-width: ${breakpoints.medium}) {
125
+ display: none;
126
+ }
127
+ `;
128
+
105
129
  const FilterItems = styled.div`
106
130
  height: 100%;
107
131
  display: flex;
108
132
  flex-direction: column;
109
- border-top: 1px solid var(--border-color-secondary);
133
+ border-top: 1px solid var(--catalog-table-border-color);
110
134
  `;
@@ -0,0 +1,31 @@
1
+ import React, { JSX } from 'react';
2
+ import styled from 'styled-components';
3
+
4
+ import { CatalogMobileFiltersPanelHeader } from '@redocly/theme/components/Catalog/CatalogMobileFiltersPanel/CatalogMobileFiltersPanelHeader';
5
+
6
+ type CatalogMobileFiltersPanelProps = {
7
+ setMobileFiltersPanelOpen: (open: boolean) => void;
8
+ filterContent: React.ReactNode;
9
+ };
10
+
11
+ export function CatalogMobileFiltersPanel({
12
+ setMobileFiltersPanelOpen,
13
+ filterContent,
14
+ }: CatalogMobileFiltersPanelProps): JSX.Element {
15
+ return (
16
+ <CatalogMobileFiltersPanelWrapper>
17
+ <CatalogMobileFiltersPanelHeader setMobileFiltersPanelOpen={setMobileFiltersPanelOpen} />
18
+ {filterContent}
19
+ </CatalogMobileFiltersPanelWrapper>
20
+ );
21
+ }
22
+
23
+ const CatalogMobileFiltersPanelWrapper = styled.div`
24
+ width: 100%;
25
+ max-height: calc(100vh - var(--navbar-height) - var(--banner-height));
26
+ overflow-y: auto;
27
+ background: var(--sidebar-bg-color);
28
+ display: flex;
29
+ flex-direction: column;
30
+ height: 100%;
31
+ `;