@redocly/theme 0.58.0 → 0.59.0-next.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 (33) hide show
  1. package/lib/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityApiDescriptionRelations.js +1 -1
  2. package/lib/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityTeamRelations.js +1 -1
  3. package/lib/components/Panel/variables.js +1 -0
  4. package/lib/components/Tag/Tag.d.ts +3 -2
  5. package/lib/components/Tag/Tag.js +21 -5
  6. package/lib/components/Tag/variables.dark.js +135 -0
  7. package/lib/components/Tag/variables.js +120 -58
  8. package/lib/core/hooks/use-tabs.d.ts +11 -6
  9. package/lib/core/hooks/use-tabs.js +117 -207
  10. package/lib/core/utils/index.d.ts +1 -0
  11. package/lib/core/utils/index.js +1 -0
  12. package/lib/core/utils/tabs.d.ts +1 -0
  13. package/lib/core/utils/tabs.js +8 -0
  14. package/lib/markdoc/components/Tabs/Tab.js +1 -1
  15. package/lib/markdoc/components/Tabs/TabList.d.ts +2 -14
  16. package/lib/markdoc/components/Tabs/TabList.js +63 -16
  17. package/lib/markdoc/components/Tabs/Tabs.d.ts +2 -2
  18. package/lib/markdoc/components/Tabs/Tabs.js +11 -87
  19. package/lib/markdoc/tags/tabs.js +5 -0
  20. package/package.json +3 -3
  21. package/src/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityApiDescriptionRelations.tsx +1 -1
  22. package/src/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityTeamRelations.tsx +1 -1
  23. package/src/components/Panel/variables.ts +1 -0
  24. package/src/components/Tag/Tag.tsx +33 -8
  25. package/src/components/Tag/variables.dark.ts +135 -0
  26. package/src/components/Tag/variables.ts +120 -58
  27. package/src/core/hooks/use-tabs.ts +160 -238
  28. package/src/core/utils/index.ts +1 -0
  29. package/src/core/utils/tabs.ts +4 -0
  30. package/src/markdoc/components/Tabs/Tab.tsx +1 -0
  31. package/src/markdoc/components/Tabs/TabList.tsx +84 -30
  32. package/src/markdoc/components/Tabs/Tabs.tsx +12 -125
  33. package/src/markdoc/tags/tabs.ts +5 -0
@@ -22,101 +22,35 @@ var __importStar = (this && this.__importStar) || function (mod) {
22
22
  __setModuleDefault(result, mod);
23
23
  return result;
24
24
  };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
25
28
  Object.defineProperty(exports, "__esModule", { value: true });
26
29
  exports.TabContent = exports.TabsSize = void 0;
27
30
  exports.Tabs = Tabs;
28
31
  const react_1 = __importStar(require("react"));
29
- const styled_components_1 = __importStar(require("styled-components"));
32
+ const styled_components_1 = __importDefault(require("styled-components"));
30
33
  const hooks_1 = require("../../../core/hooks");
31
34
  const TabList_1 = require("../../../markdoc/components/Tabs/TabList");
35
+ const utils_1 = require("../../../core/utils");
32
36
  var TabsSize;
33
37
  (function (TabsSize) {
34
38
  TabsSize["SMALL"] = "small";
35
39
  TabsSize["MEDIUM"] = "medium";
36
40
  })(TabsSize || (exports.TabsSize = TabsSize = {}));
37
- function Tabs({ children, className, size, forceReady = false, initialTab: propInitialTab, }) {
41
+ function Tabs({ id, children, className, size, initialTab: propInitialTab, }) {
38
42
  var _a, _b;
39
43
  const [childrenArray, setChildrenArray] = (0, react_1.useState)(react_1.default.Children.toArray(children));
44
+ const initialTab = (_b = propInitialTab !== null && propInitialTab !== void 0 ? propInitialTab : (_a = childrenArray[0]) === null || _a === void 0 ? void 0 : _a.props.label) !== null && _b !== void 0 ? _b : '';
45
+ const { activeTab, setActiveTab } = (0, hooks_1.useActiveTab)({ tabsId: id, initialTab });
40
46
  (0, react_1.useEffect)(() => {
41
47
  setChildrenArray(react_1.default.Children.toArray(children));
42
48
  }, [children]);
43
- const tabsContainerRef = (0, react_1.useRef)(null);
44
- const [isAnimating, setIsAnimating] = (0, react_1.useState)(false);
45
- const defaultInitialTab = (_b = (_a = childrenArray[0]) === null || _a === void 0 ? void 0 : _a.props.label) !== null && _b !== void 0 ? _b : '';
46
- const initialTab = propInitialTab !== null && propInitialTab !== void 0 ? propInitialTab : defaultInitialTab;
47
- const { activeTab, setTabRef, onTabClick, handleKeyboard, getTabId, visibleTabs, overflowTabs, ready, allTabsHidden, } = (0, hooks_1.useTabs)({
48
- initialTab,
49
- totalTabs: childrenArray.length,
50
- containerRef: tabsContainerRef,
51
- });
52
- const [prevTab, setPrevTab] = react_1.default.useState(initialTab);
53
- const [highlightStyle, setHighlightStyle] = react_1.default.useState({
54
- left: 0,
55
- width: 0,
56
- });
57
- (0, react_1.useEffect)(() => {
58
- setPrevTab(activeTab);
59
- setIsAnimating(true);
60
- const activeIndex = childrenArray.findIndex((child) => child.props.label === activeTab);
61
- const container = tabsContainerRef.current;
62
- if (container) {
63
- container.querySelectorAll('[data-label]').forEach((el) => {
64
- el.classList.remove('active');
65
- });
66
- container.getBoundingClientRect();
67
- requestAnimationFrame(() => {
68
- if (activeIndex >= 0) {
69
- let activeTabElement = null;
70
- let startPosition = { left: 0, width: 0 };
71
- if (visibleTabs.includes(activeIndex)) {
72
- activeTabElement = container.querySelector(`[data-label="${activeTab}"]`);
73
- }
74
- else if (overflowTabs.includes(activeIndex)) {
75
- const moreButton = container.querySelector('button');
76
- if (moreButton) {
77
- const moreButtonRect = moreButton.getBoundingClientRect();
78
- const containerRect = container.getBoundingClientRect();
79
- startPosition = {
80
- left: moreButtonRect.left - containerRect.left,
81
- width: moreButtonRect.width,
82
- };
83
- }
84
- }
85
- if (activeTabElement) {
86
- const { offsetLeft, offsetWidth } = activeTabElement;
87
- if (overflowTabs.includes(activeIndex)) {
88
- setHighlightStyle(startPosition);
89
- requestAnimationFrame(() => {
90
- setHighlightStyle({ left: offsetLeft, width: offsetWidth });
91
- });
92
- }
93
- else {
94
- setHighlightStyle({ left: offsetLeft, width: offsetWidth });
95
- }
96
- if (visibleTabs.includes(activeIndex)) {
97
- activeTabElement === null || activeTabElement === void 0 ? void 0 : activeTabElement.classList.add('active');
98
- }
99
- return () => {
100
- container.querySelectorAll('[data-label]').forEach((el) => {
101
- el.classList.remove('active');
102
- });
103
- };
104
- }
105
- }
106
- setHighlightStyle({ left: 0, width: 0 });
107
- setIsAnimating(false);
108
- });
109
- }
110
- else {
111
- setHighlightStyle({ left: 0, width: 0 });
112
- setIsAnimating(false);
113
- }
114
- }, [activeTab, prevTab, childrenArray, visibleTabs, overflowTabs]);
115
- return (react_1.default.createElement(TabsContainer, { "data-component-name": "Markdoc/Tabs/Tabs", className: className, isReady: ready || forceReady },
116
- react_1.default.createElement(TabList_1.TabList, { size: size, childrenArray: childrenArray, overflowTabs: overflowTabs, setTabRef: setTabRef, onTabClick: onTabClick, handleKeyboard: handleKeyboard, getTabId: getTabId, activeTab: activeTab, isAnimating: isAnimating, highlightStyle: highlightStyle, visibleTabs: visibleTabs, allTabsHidden: allTabsHidden, tabsContainerRef: tabsContainerRef }),
49
+ return (react_1.default.createElement(TabsContainer, { "data-component-name": "Markdoc/Tabs/Tabs", className: className, key: id },
50
+ react_1.default.createElement(TabList_1.TabList, { size: size, childrenArray: childrenArray, activeTab: activeTab, onTabChange: setActiveTab }),
117
51
  childrenArray.map((child, index) => {
118
52
  const { label } = child.props;
119
- const tabId = getTabId(label, index);
53
+ const tabId = (0, utils_1.getTabId)(label, index);
120
54
  return label === activeTab ? (react_1.default.createElement(exports.TabContent, { key: `content-${tabId}`, id: `panel-${tabId}`, "aria-labelledby": `tab-${tabId}`, tabIndex: 0, role: "tabpanel" }, child.props.children)) : null;
121
55
  })));
122
56
  }
@@ -132,16 +66,6 @@ const TabsContainer = styled_components_1.default.div `
132
66
  padding: var(--md-tabs-container-padding);
133
67
  border: var(--md-tabs-container-border);
134
68
 
135
- ${({ isReady }) => !isReady
136
- ? (0, styled_components_1.css) `
137
- visibility: hidden;
138
- overflow: hidden;
139
- `
140
- : (0, styled_components_1.css) `
141
- visibility: visible;
142
- overflow: visible;
143
- `}
144
-
145
69
  ol[class^='Tabs__TabList'] {
146
70
  margin: 0;
147
71
  padding: 0;
@@ -22,6 +22,11 @@ exports.tabs = {
22
22
  return new markdoc_1.default.Tag('Tabs', attributes, tabsContent);
23
23
  },
24
24
  attributes: {
25
+ /*
26
+ A unique persistent identifier assigned to a component.
27
+ This value is used as a key for the query parameter that stores the active tab to enable deep linking.
28
+ */
29
+ id: { type: String },
25
30
  size: { type: String, matches: ['small', 'medium'], default: 'medium' },
26
31
  },
27
32
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@redocly/theme",
3
- "version": "0.58.0",
3
+ "version": "0.59.0-next.0",
4
4
  "description": "Shared UI components lib",
5
5
  "keywords": [
6
6
  "theme",
@@ -87,8 +87,8 @@
87
87
  "openapi-sampler": "1.6.1",
88
88
  "react-calendar": "5.1.0",
89
89
  "react-date-picker": "11.0.0",
90
- "@redocly/realm-asyncapi-sdk": "0.4.0",
91
- "@redocly/config": "0.35.1"
90
+ "@redocly/config": "0.35.1",
91
+ "@redocly/realm-asyncapi-sdk": "0.5.0-next.0"
92
92
  },
93
93
  "scripts": {
94
94
  "watch": "tsc -p tsconfig.build.json && (concurrently \"tsc -w -p tsconfig.build.json\" \"tsc-alias -w -p tsconfig.build.json\")",
@@ -46,7 +46,7 @@ export function CatalogEntityApiDescriptionRelations({
46
46
  }: CatalogEntityApiDescriptionRelationsProps): JSX.Element {
47
47
  return (
48
48
  <div data-component-name="Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityApiDescriptionRelations">
49
- <Tabs key={entity.id} forceReady={relations.length > 0} size={TabsSize.MEDIUM}>
49
+ <Tabs key={entity.id} size={TabsSize.MEDIUM}>
50
50
  <TabItem
51
51
  label="Operations"
52
52
  icon={<MoleculesIcon />}
@@ -74,7 +74,7 @@ export function CatalogEntityTeamRelations({
74
74
  }: CatalogEntityTeamRelationsProps): JSX.Element {
75
75
  return (
76
76
  <div data-component-name="Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityTeamRelations">
77
- <Tabs forceReady={relations.length > 0} size={TabsSize.MEDIUM}>
77
+ <Tabs size={TabsSize.MEDIUM}>
78
78
  <TabItem label="Members" icon={<PeopleIcon />} onClick={() => setFilter('type:user')}>
79
79
  <CatalogEntityRelationsTable
80
80
  key="members-table"
@@ -329,6 +329,7 @@ export const apiReferencePanels = css`
329
329
  .panel-language-list,
330
330
  .panel-overview,
331
331
  .panel-download,
332
+ .panel-mcp-overview,
332
333
  .panel-servers-list,
333
334
  .panel-request-samples,
334
335
  .panel-response-samples,
@@ -26,13 +26,16 @@ type Color =
26
26
  | 'green'
27
27
  | 'blue'
28
28
  | 'grey'
29
- | 'gold'
30
- | 'cyan'
29
+ | 'turquoise'
31
30
  | 'magenta'
32
31
  | 'purple'
33
- | 'lime'
34
- | 'geekblue'
35
- | 'yellow';
32
+ | 'carrot'
33
+ | 'raspberry'
34
+ | 'orange'
35
+ | 'grass'
36
+ | 'persian-green'
37
+ | 'sky'
38
+ | 'blueberry';
36
39
 
37
40
  export type TagProps = {
38
41
  className?: string;
@@ -52,6 +55,7 @@ export type TagProps = {
52
55
  onClose?: (event: React.MouseEvent) => void;
53
56
  maxLength?: number;
54
57
  textTransform?: 'uppercase' | 'lowercase' | 'capitalize' | 'none';
58
+ variant?: 'outline' | 'filled';
55
59
  };
56
60
 
57
61
  export function Tag({
@@ -70,6 +74,7 @@ export function Tag({
70
74
  statusDotColor = 'var(--tag-status-dot-color-default)',
71
75
  maxLength,
72
76
  textTransform,
77
+ variant = 'filled',
73
78
  ...otherProps
74
79
  }: TagProps): JSX.Element {
75
80
  const truncateText = (text: string, maxLen: number): string => {
@@ -146,6 +151,7 @@ export function Tag({
146
151
  onKeyDown={onKeyDown}
147
152
  hasCloseButton={closable}
148
153
  textTransform={textTransform}
154
+ variant={variant}
149
155
  {...otherProps}
150
156
  >
151
157
  {withStatusDot ? <StatusDot color={statusDotColor} /> : icon ? icon : null}
@@ -221,12 +227,31 @@ const TagWrapper = styled.div.attrs(({ className, color, size }: TagProps) => ({
221
227
  `text-transform: ${textTransform ? `${textTransform}` : 'var(--tag-text-transform)'};`}
222
228
 
223
229
  color: var(--tag-color);
224
- background-color: var(--tag-bg-color);
225
- ${({ borderless }) =>
230
+ background-color: ${({ variant }) =>
231
+ variant === 'filled' ? 'var(--tag-bg-color)' : 'transparent'};
232
+ ${({ borderless, variant }) =>
226
233
  borderless
227
234
  ? ''
228
- : 'border: var(--tag-border-width) var(--tag-border-style) var(--tag-border-color);'}
235
+ : `border: var(--tag-border-width) var(--tag-border-style) ${variant === 'filled' ? 'transparent' : 'var(--tag-border-color)'};`}
229
236
  border-radius: var(--tag-border-radius);
237
+
238
+ svg {
239
+ width: var(--tag-icon-width);
240
+ height: var(--tag-icon-height);
241
+ }
242
+
243
+ &:hover {
244
+ background-color: ${({ variant }) =>
245
+ variant === 'filled' ? 'var(--tag-bg-color-hover)' : 'transparent'};
246
+ border-color: ${({ variant }) =>
247
+ variant === 'outline' ? 'var(--tag-border-color-hover)' : 'transparent'};
248
+ }
249
+
250
+ &:focus-visible {
251
+ outline: 1px solid var(--tag-border-color-focused);
252
+ outline-offset: 2px;
253
+ border-radius: var(--tag-border-radius-focused);
254
+ }
230
255
  `;
231
256
 
232
257
  const StatusDot = styled.div<{ color: string }>`
@@ -1,6 +1,9 @@
1
1
  import { css } from 'styled-components';
2
2
 
3
3
  export const tagDarkMode = css`
4
+ --tag-border-color-focused: var(--color-blue-8); // @presenter Color
5
+ --tag-badge-border-color: var(--border-color-secondary);
6
+
4
7
  --tag-operation-color-delete: #fa82a2; // @presenter Color
5
8
  --tag-operation-bg-color-delete: #77214C; // @presenter Color
6
9
 
@@ -39,6 +42,138 @@ export const tagDarkMode = css`
39
42
  .tag-draft,
40
43
  .tag-schema,
41
44
  .tag-default {
45
+ --tag-color: var(--color-warm-grey-8); // @presenter Color
42
46
  --tag-bg-color: var(--color-warm-grey-4); // @presenter Color
47
+ --tag-bg-color-hover: var(--color-warm-grey-5); // @presenter Color
48
+ }
49
+
50
+ .tag-red {
51
+ --tag-color: var(--color-red-7); // @presenter Color
52
+ --tag-bg-color: var(--color-red-1); // @presenter Color
53
+ --tag-border-color: var(--color-red-8); // @presenter Color
54
+ --tag-border-color-hover: var(--color-red-6); // @presenter Color
55
+ }
56
+
57
+ .tag-green {
58
+ --tag-color: var(--color-green-6); // @presenter Color
59
+ --tag-bg-color: var(--color-green-1); // @presenter Color
60
+ --tag-border-color: var(--color-green-3); // @presenter Color
61
+ --tag-border-color-hover: var(--color-green-4); // @presenter Color
62
+ --tag-bg-color-hover: var(--color-green-2); // @presenter Color
63
+ }
64
+
65
+ .tag-blue {
66
+ --tag-color: var(--color-blue-7); // @presenter Color
67
+ --tag-bg-color: var(--color-blue-1); // @presenter Color
68
+ --tag-border-color-hover: var(--color-blue-5); // @presenter Color
69
+ --tag-bg-color-hover: var(--color-blue-2); // @presenter Color
70
+ }
71
+
72
+ .tag-magenta,
73
+ .tag-hook {
74
+ --tag-color: var(--color-magenta-4); // @presenter Color
75
+ --tag-bg-color: var(--color-magenta-1); // @presenter Color
76
+ --tag-bg-color-hover: var(--color-magenta-2); // @presenter Color
77
+ }
78
+
79
+ .tag-purple,
80
+ .tag-head {
81
+ --tag-color: var(--color-purple-7); // @presenter Color
82
+ --tag-bg-color: var(--color-purple-1); // @presenter Color
83
+ --tag-bg-color-hover: var(--color-purple-2); // @presenter Color
84
+ --tag-border-color-hover: var(--color-purple-5); // @presenter Color
85
+ }
86
+
87
+ .tag-carrot {
88
+ --tag-color: var(--color-carrot-6); // @presenter Color
89
+ --tag-bg-color: var(--color-carrot-1); // @presenter Color
90
+ --tag-bg-color-hover: var(--color-carrot-2); // @presenter Color
91
+ --tag-border-color: var(--color-carrot-4); // @presenter Color
92
+ }
93
+
94
+ .tag-raspberry {
95
+ --tag-color: var(--color-raspberry-7); // @presenter Color
96
+ --tag-bg-color: var(--color-raspberry-1); // @presenter Color
97
+ --tag-bg-color-hover: var(--color-raspberry-2); // @presenter Color
98
+ }
99
+
100
+ .tag-orange {
101
+ --tag-color: var(--color-orange-7); // @presenter Color
102
+ --tag-bg-color: var(--color-orange-1); // @presenter Color
103
+ --tag-bg-color-hover: var(--color-orange-2); // @presenter Color
104
+ --tag-border-color: var(--color-orange-3); // @presenter Color
105
+ --tag-border-color-hover: var(--color-orange-5); // @presenter Color
106
+ }
107
+
108
+ .tag-grass {
109
+ --tag-bg-color: var(--color-grass-1); // @presenter Color
110
+ --tag-bg-color-hover: var(--color-grass-2); // @presenter Color
111
+ --tag-color: var(--color-grass-7); // @presenter Color
112
+ --tag-border-color: var(--color-grass-3); // @presenter Color
113
+ --tag-border-color-hover: var(--color-grass-5); // @presenter Color
114
+ }
115
+
116
+ .tag-persian-green {
117
+ --tag-color: var(--color-persian-green-7); // @presenter Color
118
+ --tag-bg-color: var(--color-persian-green-1); // @presenter Color
119
+ --tag-bg-color-hover: var(--color-persian-green-2); // @presenter Color
120
+ --tag-border-color: var(--color-persian-green-3); // @presenter Color
121
+ --tag-border-color-hover: var(--color-persian-green-5); // @presenter Color
122
+ }
123
+
124
+ .tag-turquoise,
125
+ .tag-option {
126
+ --tag-color: var(--color-turquoise-6); // @presenter Color
127
+ --tag-bg-color: var(--color-turquoise-1); // @presenter Color
128
+ --tag-bg-color-hover: var(--color-turquoise-2); // @presenter Color
129
+ --tag-border-color: var(--color-turquoise-4); // @presenter Color
130
+ }
131
+
132
+ .tag-sky {
133
+ --tag-color: var(--color-sky-6); // @presenter Color
134
+ --tag-bg-color: var(--color-sky-1); // @presenter Color
135
+ --tag-border-color: var(--color-sky-4); // @presenter Color
136
+ --tag-bg-color-hover: var(--color-sky-2); // @presenter Color
137
+ }
138
+
139
+ .tag-blueberry {
140
+ --tag-color: var(--color-blueberry-7); // @presenter Color
141
+ --tag-bg-color: var(--color-blueberry-1); // @presenter Color
142
+ --tag-border-color-hover: var(--color-blueberry-5); // @presenter Color
143
+ --tag-bg-color-hover: var(--color-blueberry-2); // @presenter Color
144
+ }
145
+
146
+ .tag-warning,
147
+ .tag-deprecated {
148
+ --tag-color: var(--color-warning-active); // @presenter Color
149
+ --tag-bg-color: var(--color-warning-bg); // @presenter Color
150
+ --tag-bg-color-hover: var(--color-warning-bg-hover); // @presenter Color
151
+ }
152
+
153
+ .tag-processing,
154
+ .tag-info {
155
+ --tag-color: var(--color-info-active); // @presenter Color
156
+ --tag-bg-color: var(--color-info-bg); // @presenter Color
157
+ --tag-bg-color-hover: var(--color-info-bg-hover); // @presenter Color
158
+ }
159
+
160
+ .tag-error,
161
+ .tag-declined {
162
+ --tag-color: var(--color-error-active); // @presenter Color
163
+ --tag-bg-color: var(--color-error-bg); // @presenter Color
164
+ --tag-bg-color-hover: var(--color-error-bg-hover); // @presenter Color
165
+ }
166
+
167
+ .tag-success,
168
+ .tag-approved {
169
+ --tag-color: var(--color-success-active); // @presenter Color
170
+ --tag-bg-color: var(--color-success-bg); // @presenter Color
171
+ --tag-bg-color-hover: var(--color-success-bg-hover); // @presenter Color
172
+ }
173
+
174
+ .tag-link {
175
+ --tag-color: var(--color-info-active); // @presenter Color
176
+ --tag-bg-color: var(--color-info-bg); // @presenter Color
177
+ --tag-bg-color-hover: var(--color-info-bg-hover); // @presenter Color
43
178
  }
44
179
  `;