@redocly/theme 0.59.0-next.4 → 0.59.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -7
- package/lib/components/Buttons/AIAssistantButton.js +1 -5
- package/lib/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityApiDescriptionRelations.js +1 -1
- package/lib/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityTeamRelations.js +1 -1
- package/lib/components/Catalog/CatalogTagsWithTooltip.js +1 -1
- package/lib/components/Dropdown/Dropdown.d.ts +2 -16
- package/lib/components/Dropdown/Dropdown.js +5 -5
- package/lib/components/Menu/MenuItem.js +1 -1
- package/lib/components/Navbar/NavbarItem.js +3 -3
- package/lib/components/OpenApiDocs/hooks/AdditionalOverviewInfo.d.ts +1 -0
- package/lib/components/OpenApiDocs/hooks/AdditionalOverviewInfo.js +11 -0
- package/lib/components/OpenApiDocs/hooks/AfterOpenApiDescription.d.ts +1 -0
- package/lib/components/OpenApiDocs/hooks/AfterOpenApiDescription.js +5 -0
- package/lib/components/Search/FilterFields/SearchFilterFieldTags.js +2 -1
- package/lib/components/Search/SearchAiConversationInput.d.ts +1 -2
- package/lib/components/Search/SearchAiConversationInput.js +3 -11
- package/lib/components/Search/SearchDialog.js +3 -15
- package/lib/components/Search/SearchGroups.js +2 -2
- package/lib/components/Search/variables.js +1 -5
- package/lib/components/Select/SelectInput.js +1 -1
- package/lib/components/Select/variables.js +2 -2
- package/lib/components/Tag/Tag.d.ts +1 -2
- package/lib/components/Tag/Tag.js +17 -66
- package/lib/components/Tag/variables.dark.js +36 -135
- package/lib/components/Tag/variables.js +61 -78
- package/lib/core/constants/search.d.ts +4 -5
- package/lib/core/constants/search.js +5 -4
- package/lib/core/hooks/use-page-actions.d.ts +1 -1
- package/lib/core/hooks/use-page-actions.js +24 -1
- package/lib/core/hooks/use-tabs.d.ts +2 -3
- package/lib/core/hooks/use-tabs.js +57 -115
- package/lib/core/hooks/use-telemetry-fallback.d.ts +0 -1
- package/lib/core/hooks/use-telemetry-fallback.js +0 -1
- package/lib/core/types/hooks.d.ts +2 -2
- package/lib/ext/process-scorecard.d.ts +5 -0
- package/lib/ext/process-scorecard.js +11 -0
- package/lib/icons/AiStarsIcon/AiStarsIcon.js +2 -11
- package/lib/icons/RedoclyIcon/RedoclyIcon.js +7 -4
- package/lib/index.d.ts +2 -0
- package/lib/index.js +2 -0
- package/lib/markdoc/components/Tabs/TabList.d.ts +1 -3
- package/lib/markdoc/components/Tabs/TabList.js +47 -197
- package/lib/markdoc/components/Tabs/Tabs.d.ts +1 -2
- package/lib/markdoc/components/Tabs/Tabs.js +12 -57
- package/package.json +5 -5
- package/src/components/Buttons/AIAssistantButton.tsx +1 -5
- package/src/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityApiDescriptionRelations.tsx +1 -1
- package/src/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityTeamRelations.tsx +1 -1
- package/src/components/Catalog/CatalogTagsWithTooltip.tsx +5 -1
- package/src/components/Dropdown/Dropdown.tsx +79 -84
- package/src/components/Menu/MenuItem.tsx +0 -1
- package/src/components/Navbar/NavbarItem.tsx +5 -6
- package/src/components/OpenApiDocs/hooks/AdditionalOverviewInfo.tsx +9 -0
- package/src/components/OpenApiDocs/hooks/AfterOpenApiDescription.tsx +1 -0
- package/src/components/Search/FilterFields/SearchFilterFieldTags.tsx +3 -3
- package/src/components/Search/SearchAiConversationInput.tsx +2 -12
- package/src/components/Search/SearchDialog.tsx +3 -15
- package/src/components/Search/SearchGroups.tsx +0 -2
- package/src/components/Search/variables.ts +1 -5
- package/src/components/Select/SelectInput.tsx +0 -1
- package/src/components/Select/variables.ts +2 -2
- package/src/components/Tag/Tag.tsx +19 -35
- package/src/components/Tag/variables.dark.ts +36 -135
- package/src/components/Tag/variables.ts +61 -78
- package/src/core/constants/search.ts +4 -8
- package/src/core/hooks/use-page-actions.ts +33 -2
- package/src/core/hooks/use-tabs.ts +86 -168
- package/src/core/hooks/use-telemetry-fallback.ts +0 -1
- package/src/core/types/hooks.ts +1 -5
- package/src/ext/process-scorecard.ts +13 -0
- package/src/icons/AiStarsIcon/AiStarsIcon.tsx +2 -11
- package/src/icons/RedoclyIcon/RedoclyIcon.tsx +22 -4
- package/src/index.ts +2 -0
- package/src/markdoc/components/Tabs/TabList.tsx +105 -312
- package/src/markdoc/components/Tabs/Tabs.tsx +11 -136
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, {
|
|
1
|
+
import React, { useEffect, useRef } from 'react';
|
|
2
2
|
import styled, { css } from 'styled-components';
|
|
3
3
|
|
|
4
4
|
import type { JSX } from 'react';
|
|
@@ -17,140 +17,6 @@ type TabListProps = {
|
|
|
17
17
|
size: TabsSize;
|
|
18
18
|
activeTab: string;
|
|
19
19
|
onTabChange: (tab: string) => void;
|
|
20
|
-
containerRef: React.RefObject<HTMLUListElement | null>;
|
|
21
|
-
onReadyChange?: (isReady: boolean) => void;
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
type UseHighlightBarAnimationProps = {
|
|
25
|
-
childrenArray: React.ReactElement<TabItemProps>[];
|
|
26
|
-
activeTab: string;
|
|
27
|
-
tabsContainerRef: React.RefObject<HTMLElement | null>;
|
|
28
|
-
visibleTabs: number[];
|
|
29
|
-
overflowTabs: number[];
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Calculates optimal dropdown position relative to viewport to ensure visibility.
|
|
34
|
-
* Positions below the button by default, but moves above if insufficient space.
|
|
35
|
-
* Adjusts horizontal position to prevent overflow off screen edges.
|
|
36
|
-
*/
|
|
37
|
-
const calculateDropdownPosition = (
|
|
38
|
-
buttonRect: DOMRect,
|
|
39
|
-
dropdownRect: DOMRect,
|
|
40
|
-
): { top: number; left: number } => {
|
|
41
|
-
const gap = 4;
|
|
42
|
-
const margin = 16;
|
|
43
|
-
const spaceBelow = window.innerHeight - buttonRect.bottom;
|
|
44
|
-
const spaceAbove = buttonRect.top;
|
|
45
|
-
|
|
46
|
-
// Position below button, or above if dropdown doesn't fit below
|
|
47
|
-
const top =
|
|
48
|
-
spaceBelow < dropdownRect.height + gap && spaceAbove > spaceBelow
|
|
49
|
-
? buttonRect.top - gap
|
|
50
|
-
: buttonRect.bottom + gap;
|
|
51
|
-
|
|
52
|
-
// Align with button left edge, adjust if overflows screen
|
|
53
|
-
const idealLeft = buttonRect.left;
|
|
54
|
-
const rightEdge = idealLeft + dropdownRect.width;
|
|
55
|
-
const overflowsRight = rightEdge > window.innerWidth - margin;
|
|
56
|
-
|
|
57
|
-
const left = overflowsRight
|
|
58
|
-
? window.innerWidth - dropdownRect.width - margin
|
|
59
|
-
: Math.max(margin, idealLeft);
|
|
60
|
-
|
|
61
|
-
return { top, left };
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Manages dropdown positioning and updates on scroll/resize events for TabList.
|
|
66
|
-
*/
|
|
67
|
-
const useDropdownPosition = (
|
|
68
|
-
hasOverflow: boolean,
|
|
69
|
-
dropdownRef: React.RefObject<HTMLDivElement | null>,
|
|
70
|
-
) => {
|
|
71
|
-
const [dropdownPosition, setDropdownPosition] = useState<{ top?: number; left?: number }>({});
|
|
72
|
-
const [isDropdownOpen, setIsDropdownOpen] = useState(false);
|
|
73
|
-
|
|
74
|
-
const updateDropdownPosition = useCallback(() => {
|
|
75
|
-
if (!dropdownRef.current) return;
|
|
76
|
-
|
|
77
|
-
const button = dropdownRef.current.querySelector('button');
|
|
78
|
-
const dropdownMenu = dropdownRef.current.querySelector('div:last-child');
|
|
79
|
-
if (!button || !dropdownMenu) return;
|
|
80
|
-
|
|
81
|
-
const buttonRect = button.getBoundingClientRect();
|
|
82
|
-
const dropdownRect = (dropdownMenu as HTMLElement).getBoundingClientRect();
|
|
83
|
-
|
|
84
|
-
const position = calculateDropdownPosition(buttonRect, dropdownRect);
|
|
85
|
-
setDropdownPosition(position);
|
|
86
|
-
}, [dropdownRef]);
|
|
87
|
-
|
|
88
|
-
// Track when dropdown menu appears and recalculate position
|
|
89
|
-
useEffect(() => {
|
|
90
|
-
if (!hasOverflow || !isDropdownOpen || !dropdownRef.current) return;
|
|
91
|
-
|
|
92
|
-
const dropdownMenu = dropdownRef.current.querySelector('div:last-child') as HTMLElement;
|
|
93
|
-
if (!dropdownMenu) return;
|
|
94
|
-
|
|
95
|
-
// ResizeObserver tracks both initial render and size changes
|
|
96
|
-
const resizeObserver = new ResizeObserver(() => {
|
|
97
|
-
updateDropdownPosition();
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
resizeObserver.observe(dropdownMenu);
|
|
101
|
-
|
|
102
|
-
return () => resizeObserver.disconnect();
|
|
103
|
-
}, [hasOverflow, isDropdownOpen, dropdownRef, updateDropdownPosition]);
|
|
104
|
-
|
|
105
|
-
// Update position on scroll/resize
|
|
106
|
-
useEffect(() => {
|
|
107
|
-
if (!hasOverflow || !isDropdownOpen) return;
|
|
108
|
-
|
|
109
|
-
window.addEventListener('scroll', updateDropdownPosition, true);
|
|
110
|
-
window.addEventListener('resize', updateDropdownPosition);
|
|
111
|
-
|
|
112
|
-
return () => {
|
|
113
|
-
window.removeEventListener('scroll', updateDropdownPosition, true);
|
|
114
|
-
window.removeEventListener('resize', updateDropdownPosition);
|
|
115
|
-
};
|
|
116
|
-
}, [hasOverflow, isDropdownOpen, updateDropdownPosition]);
|
|
117
|
-
|
|
118
|
-
return {
|
|
119
|
-
dropdownPosition,
|
|
120
|
-
isDropdownOpen,
|
|
121
|
-
setIsDropdownOpen,
|
|
122
|
-
setDropdownPosition,
|
|
123
|
-
updateDropdownPosition,
|
|
124
|
-
};
|
|
125
|
-
};
|
|
126
|
-
|
|
127
|
-
const renderTab = (
|
|
128
|
-
child: React.ReactElement<TabItemProps>,
|
|
129
|
-
index: number,
|
|
130
|
-
size: TabsSize,
|
|
131
|
-
setTabRef: (element: HTMLButtonElement | null, index: number) => void,
|
|
132
|
-
handleKeyboard: (event: React.KeyboardEvent, index: number) => void,
|
|
133
|
-
onTabClick: (labelOrIndex: string | number) => void,
|
|
134
|
-
) => {
|
|
135
|
-
const { label, icon } = child.props;
|
|
136
|
-
const tabId = getTabId(label, index);
|
|
137
|
-
|
|
138
|
-
return (
|
|
139
|
-
<Tab
|
|
140
|
-
key={`key-${tabId}`}
|
|
141
|
-
tabId={tabId}
|
|
142
|
-
label={label}
|
|
143
|
-
icon={icon}
|
|
144
|
-
size={size}
|
|
145
|
-
disabled={child.props.disable}
|
|
146
|
-
setRef={(el: HTMLButtonElement | null) => setTabRef(el, index)}
|
|
147
|
-
onKeyDown={(event) => handleKeyboard(event, index)}
|
|
148
|
-
onClick={() => {
|
|
149
|
-
child.props.onClick?.();
|
|
150
|
-
onTabClick(label);
|
|
151
|
-
}}
|
|
152
|
-
/>
|
|
153
|
-
);
|
|
154
20
|
};
|
|
155
21
|
|
|
156
22
|
export function TabList({
|
|
@@ -158,119 +24,106 @@ export function TabList({
|
|
|
158
24
|
size,
|
|
159
25
|
activeTab,
|
|
160
26
|
onTabChange,
|
|
161
|
-
containerRef,
|
|
162
|
-
onReadyChange,
|
|
163
27
|
}: TabListProps): JSX.Element {
|
|
164
|
-
const
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
useEffect(() => {
|
|
175
|
-
onReadyChange?.(isReady);
|
|
176
|
-
}, [isReady, onReadyChange]);
|
|
28
|
+
const tabsContainerRef = useRef<HTMLUListElement>(null);
|
|
29
|
+
|
|
30
|
+
const { allTabsHidden, overflowTabs, visibleTabs, handleKeyboard, onTabClick, setTabRef } =
|
|
31
|
+
useTabs({
|
|
32
|
+
activeTab,
|
|
33
|
+
onTabChange,
|
|
34
|
+
containerRef: tabsContainerRef,
|
|
35
|
+
totalTabs: childrenArray.length,
|
|
36
|
+
});
|
|
177
37
|
|
|
178
38
|
const { highlightStyle } = useHighlightBarAnimation({
|
|
179
39
|
activeTab,
|
|
180
40
|
childrenArray,
|
|
181
41
|
overflowTabs,
|
|
182
|
-
tabsContainerRef
|
|
42
|
+
tabsContainerRef,
|
|
183
43
|
visibleTabs,
|
|
184
44
|
});
|
|
185
45
|
|
|
186
|
-
const hasOverflow = overflowTabs.length > 0;
|
|
187
|
-
const isMoreActive =
|
|
188
|
-
hasOverflow &&
|
|
189
|
-
overflowTabs.some((i) => childrenArray[i] && activeTab === childrenArray[i].props.label);
|
|
190
|
-
|
|
191
|
-
// Show as selector when no visible tabs (all tabs in dropdown)
|
|
192
|
-
const showAsSelector = visibleTabs.length === 0 && hasOverflow;
|
|
193
|
-
|
|
194
|
-
const { dropdownPosition, setIsDropdownOpen, setDropdownPosition } = useDropdownPosition(
|
|
195
|
-
hasOverflow,
|
|
196
|
-
dropdownRef,
|
|
197
|
-
);
|
|
198
|
-
|
|
199
46
|
return (
|
|
200
|
-
<TabListContainer role="tablist" ref={
|
|
47
|
+
<TabListContainer role="tablist" ref={tabsContainerRef}>
|
|
201
48
|
<HighlightBar size={size} style={highlightStyle}>
|
|
202
49
|
<div />
|
|
203
50
|
</HighlightBar>
|
|
204
|
-
|
|
205
51
|
{childrenArray.map((child, index) => {
|
|
206
|
-
|
|
207
|
-
const
|
|
208
|
-
|
|
209
|
-
return
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
onClickCapture={() => {
|
|
223
|
-
setIsDropdownOpen(true);
|
|
52
|
+
if (!visibleTabs.includes(index)) return null;
|
|
53
|
+
const { label, icon } = child.props;
|
|
54
|
+
const tabId = getTabId(label, index);
|
|
55
|
+
return (
|
|
56
|
+
<Tab
|
|
57
|
+
key={`key-${tabId}`}
|
|
58
|
+
tabId={tabId}
|
|
59
|
+
label={label}
|
|
60
|
+
icon={icon}
|
|
61
|
+
size={size}
|
|
62
|
+
disabled={child.props.disable}
|
|
63
|
+
setRef={(el: HTMLButtonElement | null) => setTabRef(el, index)}
|
|
64
|
+
onKeyDown={(event) => handleKeyboard(event, index)}
|
|
65
|
+
onClick={() => {
|
|
66
|
+
child.props.onClick?.();
|
|
67
|
+
onTabClick(label);
|
|
224
68
|
}}
|
|
69
|
+
/>
|
|
70
|
+
);
|
|
71
|
+
})}
|
|
72
|
+
<TabItem
|
|
73
|
+
size={size}
|
|
74
|
+
active={overflowTabs.some((index) => activeTab === childrenArray[index].props.label)}
|
|
75
|
+
tabIndex={0}
|
|
76
|
+
>
|
|
77
|
+
{overflowTabs.length > 0 && (
|
|
78
|
+
<Dropdown
|
|
79
|
+
trigger={
|
|
80
|
+
<TabButtonLink
|
|
81
|
+
size={size}
|
|
82
|
+
className={
|
|
83
|
+
overflowTabs.some((index) => activeTab === childrenArray[index].props.label)
|
|
84
|
+
? 'active'
|
|
85
|
+
: undefined
|
|
86
|
+
}
|
|
87
|
+
>
|
|
88
|
+
{allTabsHidden ? activeTab : 'More'}
|
|
89
|
+
</TabButtonLink>
|
|
90
|
+
}
|
|
91
|
+
alignment="start"
|
|
92
|
+
withArrow={true}
|
|
225
93
|
>
|
|
226
|
-
<
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
const { label } = child.props;
|
|
249
|
-
const tabId = getTabId(label, index);
|
|
250
|
-
|
|
251
|
-
return (
|
|
252
|
-
<DropdownMenuItem
|
|
253
|
-
key={`more-${tabId}`}
|
|
254
|
-
active={activeTab === label}
|
|
255
|
-
onAction={() => {
|
|
256
|
-
child.props.onClick?.();
|
|
257
|
-
onTabClick(index);
|
|
258
|
-
}}
|
|
259
|
-
disabled={child.props.disable}
|
|
260
|
-
>
|
|
261
|
-
{label}
|
|
262
|
-
</DropdownMenuItem>
|
|
263
|
-
);
|
|
264
|
-
})}
|
|
265
|
-
</DropdownMenu>
|
|
266
|
-
</FixedPositionDropdown>
|
|
267
|
-
</DropdownWrapper>
|
|
268
|
-
</TabItem>
|
|
269
|
-
)}
|
|
94
|
+
<DropdownMenu>
|
|
95
|
+
{overflowTabs.map((index) => {
|
|
96
|
+
const { label } = childrenArray[index].props;
|
|
97
|
+
const tabId = getTabId(label, index);
|
|
98
|
+
return (
|
|
99
|
+
<DropdownMenuItem
|
|
100
|
+
key={`more-${tabId}`}
|
|
101
|
+
active={activeTab === label}
|
|
102
|
+
onAction={() => {
|
|
103
|
+
childrenArray[index].props.onClick?.();
|
|
104
|
+
onTabClick(index);
|
|
105
|
+
}}
|
|
106
|
+
disabled={childrenArray[index].props.disable}
|
|
107
|
+
>
|
|
108
|
+
{label}
|
|
109
|
+
</DropdownMenuItem>
|
|
110
|
+
);
|
|
111
|
+
})}
|
|
112
|
+
</DropdownMenu>
|
|
113
|
+
</Dropdown>
|
|
114
|
+
)}
|
|
115
|
+
</TabItem>
|
|
270
116
|
</TabListContainer>
|
|
271
117
|
);
|
|
272
118
|
}
|
|
273
119
|
|
|
120
|
+
type UseHighlightBarAnimationProps = {
|
|
121
|
+
childrenArray: React.ReactElement<TabItemProps>[];
|
|
122
|
+
activeTab: string;
|
|
123
|
+
tabsContainerRef: React.RefObject<HTMLElement | null>;
|
|
124
|
+
visibleTabs: number[];
|
|
125
|
+
overflowTabs: number[];
|
|
126
|
+
};
|
|
274
127
|
const useHighlightBarAnimation = (props: UseHighlightBarAnimationProps) => {
|
|
275
128
|
const { childrenArray, activeTab, tabsContainerRef, visibleTabs, overflowTabs } = props;
|
|
276
129
|
|
|
@@ -288,39 +141,35 @@ const useHighlightBarAnimation = (props: UseHighlightBarAnimationProps) => {
|
|
|
288
141
|
return;
|
|
289
142
|
}
|
|
290
143
|
|
|
291
|
-
|
|
144
|
+
const activeTabElement: HTMLElement | null = container.querySelector(
|
|
145
|
+
`[data-label="${activeTab}"]`,
|
|
146
|
+
);
|
|
147
|
+
if (!activeTabElement) return;
|
|
148
|
+
|
|
292
149
|
container.querySelectorAll('[data-label]').forEach((el) => {
|
|
293
150
|
el.classList.remove('active');
|
|
294
151
|
});
|
|
295
152
|
|
|
296
|
-
|
|
153
|
+
const { offsetLeft, offsetWidth } = activeTabElement;
|
|
154
|
+
|
|
155
|
+
if (visibleTabs.includes(activeIndex)) {
|
|
156
|
+
activeTabElement.classList.add('active');
|
|
157
|
+
setHighlightStyle({ left: offsetLeft, width: offsetWidth });
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
|
|
297
161
|
if (overflowTabs.includes(activeIndex)) {
|
|
298
162
|
const moreButton = container.querySelector('button');
|
|
299
163
|
if (!moreButton) return;
|
|
300
164
|
|
|
301
165
|
const moreButtonRect = moreButton.getBoundingClientRect();
|
|
302
166
|
const containerRect = container.getBoundingClientRect();
|
|
303
|
-
|
|
304
167
|
setHighlightStyle({
|
|
305
168
|
left: moreButtonRect.left - containerRect.left,
|
|
306
169
|
width: moreButtonRect.width,
|
|
307
170
|
});
|
|
308
171
|
return;
|
|
309
172
|
}
|
|
310
|
-
|
|
311
|
-
// Active tab is visible, find its element
|
|
312
|
-
const activeTabElement: HTMLElement | null = container.querySelector(
|
|
313
|
-
`[data-label="${activeTab}"]`,
|
|
314
|
-
);
|
|
315
|
-
if (!activeTabElement) return;
|
|
316
|
-
|
|
317
|
-
const { offsetLeft, offsetWidth } = activeTabElement;
|
|
318
|
-
|
|
319
|
-
if (visibleTabs.includes(activeIndex)) {
|
|
320
|
-
activeTabElement.classList.add('active');
|
|
321
|
-
setHighlightStyle({ left: offsetLeft, width: offsetWidth });
|
|
322
|
-
return;
|
|
323
|
-
}
|
|
324
173
|
}, [activeTab, childrenArray, visibleTabs, overflowTabs, tabsContainerRef]);
|
|
325
174
|
|
|
326
175
|
return { highlightStyle };
|
|
@@ -332,11 +181,15 @@ export const TabListContainer = styled.ul`
|
|
|
332
181
|
gap: var(--md-tabs-gap);
|
|
333
182
|
width: 100%;
|
|
334
183
|
min-width: 0;
|
|
184
|
+
position: relative;
|
|
335
185
|
|
|
336
186
|
&::before {
|
|
337
187
|
content: '';
|
|
338
188
|
position: absolute;
|
|
339
|
-
|
|
189
|
+
top: 0px;
|
|
190
|
+
left: 0px;
|
|
191
|
+
right: 0px;
|
|
192
|
+
bottom: 0px;
|
|
340
193
|
border: var(--md-tabs-border);
|
|
341
194
|
border-width: var(--md-tabs-border-width);
|
|
342
195
|
pointer-events: none;
|
|
@@ -344,17 +197,11 @@ export const TabListContainer = styled.ul`
|
|
|
344
197
|
|
|
345
198
|
&& {
|
|
346
199
|
padding: var(--md-tabs-padding);
|
|
200
|
+
margin-block-end: 0;
|
|
347
201
|
margin: 0;
|
|
348
202
|
|
|
349
203
|
& > li {
|
|
350
|
-
margin-bottom:
|
|
351
|
-
flex-shrink: 0;
|
|
352
|
-
|
|
353
|
-
&.dropdown-tab {
|
|
354
|
-
flex-shrink: 1;
|
|
355
|
-
min-width: 0;
|
|
356
|
-
max-width: 100%;
|
|
357
|
-
}
|
|
204
|
+
margin-bottom: 0px;
|
|
358
205
|
}
|
|
359
206
|
}
|
|
360
207
|
`;
|
|
@@ -365,7 +212,7 @@ export const TabItem = styled.li<{ active?: boolean; size: TabsSize; tabIndex?:
|
|
|
365
212
|
cursor: pointer;
|
|
366
213
|
align-items: center;
|
|
367
214
|
padding: var(--md-tabs-tab-wrapper-padding);
|
|
368
|
-
z-index:
|
|
215
|
+
z-index: 1;
|
|
369
216
|
|
|
370
217
|
${({ active, size }) =>
|
|
371
218
|
active
|
|
@@ -404,51 +251,6 @@ export const TabItem = styled.li<{ active?: boolean; size: TabsSize; tabIndex?:
|
|
|
404
251
|
}
|
|
405
252
|
`;
|
|
406
253
|
|
|
407
|
-
const DropdownWrapper = styled.div.attrs<{ $top?: number; $left?: number }>((props) => ({
|
|
408
|
-
style: {
|
|
409
|
-
...(props.$top !== undefined && { '--dropdown-top': `${props.$top}px` }),
|
|
410
|
-
...(props.$left !== undefined && { '--dropdown-left': `${props.$left}px` }),
|
|
411
|
-
},
|
|
412
|
-
}))<{ $top?: number; $left?: number }>`
|
|
413
|
-
position: static;
|
|
414
|
-
z-index: var(--z-index-raised);
|
|
415
|
-
width: 100%;
|
|
416
|
-
min-width: 0;
|
|
417
|
-
`;
|
|
418
|
-
|
|
419
|
-
const FixedPositionDropdown = styled(Dropdown)`
|
|
420
|
-
position: static;
|
|
421
|
-
width: 100%;
|
|
422
|
-
min-width: 0;
|
|
423
|
-
|
|
424
|
-
> div:first-child {
|
|
425
|
-
width: 100%;
|
|
426
|
-
min-width: 0;
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
> div:last-child {
|
|
430
|
-
position: fixed;
|
|
431
|
-
top: var(--dropdown-top, 0);
|
|
432
|
-
left: var(--dropdown-left, 0);
|
|
433
|
-
right: auto;
|
|
434
|
-
bottom: auto;
|
|
435
|
-
transform: none;
|
|
436
|
-
padding-top: 0;
|
|
437
|
-
max-width: min(400px, calc(100vw - 32px));
|
|
438
|
-
max-height: calc(100vh - var(--dropdown-top, 0) - 32px);
|
|
439
|
-
overflow-y: auto;
|
|
440
|
-
z-index: var(--z-index-raised);
|
|
441
|
-
|
|
442
|
-
ul {
|
|
443
|
-
li {
|
|
444
|
-
overflow: hidden;
|
|
445
|
-
text-overflow: ellipsis;
|
|
446
|
-
white-space: nowrap;
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
|
-
`;
|
|
451
|
-
|
|
452
254
|
const HighlightBar = styled.div<{ size: TabsSize }>`
|
|
453
255
|
position: absolute;
|
|
454
256
|
top: 0;
|
|
@@ -469,20 +271,11 @@ const HighlightBar = styled.div<{ size: TabsSize }>`
|
|
|
469
271
|
}
|
|
470
272
|
`;
|
|
471
273
|
|
|
472
|
-
const TabButtonText = styled.span`
|
|
473
|
-
overflow: hidden;
|
|
474
|
-
text-overflow: ellipsis;
|
|
475
|
-
white-space: nowrap;
|
|
476
|
-
flex: 1;
|
|
477
|
-
min-width: 0;
|
|
478
|
-
`;
|
|
479
|
-
|
|
480
274
|
export const TabButtonLink = styled(Button)`
|
|
481
275
|
color: var(--md-tabs-tab-text-color);
|
|
482
276
|
font-family: var(--md-tabs-tab-font-family);
|
|
483
277
|
font-style: var(--md-tabs-tab-font-style);
|
|
484
278
|
background-color: var(--md-tabs-tab-bg-color);
|
|
485
|
-
width: 100%;
|
|
486
279
|
|
|
487
280
|
transition:
|
|
488
281
|
background-color 300ms ease-in-out,
|
|
@@ -502,9 +295,9 @@ export const TabButtonLink = styled(Button)`
|
|
|
502
295
|
|
|
503
296
|
&.active {
|
|
504
297
|
color: var(--md-tabs-active-tab-text-color);
|
|
298
|
+
font-size: var(--md-tabs-${({ size }) => size}-active-tab-font-size);
|
|
505
299
|
font-family: var(--md-tabs-active-tab-font-family);
|
|
506
300
|
font-style: var(--md-tabs-active-tab-font-style);
|
|
507
|
-
font-size: var(--md-tabs-${({ size }) => size}-active-tab-font-size);
|
|
508
301
|
font-weight: var(--md-tabs-${({ size }) => size}-active-tab-font-weight);
|
|
509
302
|
line-height: var(--md-tabs-${({ size }) => size}-active-tab-line-height);
|
|
510
303
|
background-color: var(--md-tabs-active-tab-bg-color);
|
|
@@ -514,12 +307,12 @@ export const TabButtonLink = styled(Button)`
|
|
|
514
307
|
|
|
515
308
|
&:hover {
|
|
516
309
|
color: var(--md-tabs-hover-tab-text-color);
|
|
310
|
+
font-size: var(--md-tabs-${({ size }) => size}-hover-tab-font-size);
|
|
517
311
|
font-family: var(--md-tabs-hover-tab-font-family);
|
|
518
312
|
font-style: var(--md-tabs-hover-tab-font-style);
|
|
519
|
-
font-size: var(--md-tabs-${({ size }) => size}-hover-tab-font-size);
|
|
520
313
|
font-weight: var(--md-tabs-${({ size }) => size}-hover-tab-font-weight);
|
|
521
|
-
line-height: var(--md-tabs-${({ size }) => size}-hover-tab-line-height);
|
|
522
314
|
background-color: var(--md-tabs-hover-tab-bg-color);
|
|
315
|
+
line-height: var(--md-tabs-${({ size }) => size}-hover-tab-line-height);
|
|
523
316
|
border-radius: var(--md-tabs-${({ size }) => size}-hover-tab-border-radius);
|
|
524
317
|
padding: var(--md-tabs-${({ size }) => size}-hover-tab-padding);
|
|
525
318
|
}
|