@redocly/theme 0.59.0-next.2 → 0.59.0-rc.1

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 (53) 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/Catalog/CatalogTagsWithTooltip.js +1 -1
  4. package/lib/components/Dropdown/Dropdown.d.ts +2 -16
  5. package/lib/components/Dropdown/Dropdown.js +5 -5
  6. package/lib/components/Menu/MenuItem.js +1 -1
  7. package/lib/components/OpenApiDocs/hooks/AdditionalOverviewInfo.d.ts +1 -0
  8. package/lib/components/OpenApiDocs/hooks/AdditionalOverviewInfo.js +11 -0
  9. package/lib/components/OpenApiDocs/hooks/AfterOpenApiDescription.d.ts +1 -0
  10. package/lib/components/OpenApiDocs/hooks/AfterOpenApiDescription.js +5 -0
  11. package/lib/components/Search/SearchAiConversationInput.d.ts +1 -2
  12. package/lib/components/Search/SearchAiConversationInput.js +3 -11
  13. package/lib/components/Search/SearchDialog.js +3 -6
  14. package/lib/components/Search/variables.js +1 -5
  15. package/lib/components/Select/variables.js +2 -2
  16. package/lib/components/Tag/Tag.js +4 -4
  17. package/lib/core/constants/search.d.ts +4 -5
  18. package/lib/core/constants/search.js +5 -4
  19. package/lib/core/hooks/use-tabs.d.ts +2 -3
  20. package/lib/core/hooks/use-tabs.js +57 -115
  21. package/lib/core/types/hooks.d.ts +2 -2
  22. package/lib/ext/process-scorecard.d.ts +5 -0
  23. package/lib/ext/process-scorecard.js +11 -0
  24. package/lib/icons/AiStarsIcon/AiStarsIcon.js +2 -11
  25. package/lib/icons/RedoclyIcon/RedoclyIcon.js +7 -4
  26. package/lib/index.d.ts +2 -0
  27. package/lib/index.js +2 -0
  28. package/lib/markdoc/components/Tabs/TabList.d.ts +1 -3
  29. package/lib/markdoc/components/Tabs/TabList.js +47 -197
  30. package/lib/markdoc/components/Tabs/Tabs.d.ts +1 -2
  31. package/lib/markdoc/components/Tabs/Tabs.js +12 -57
  32. package/package.json +3 -3
  33. package/src/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityApiDescriptionRelations.tsx +1 -1
  34. package/src/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityTeamRelations.tsx +1 -1
  35. package/src/components/Catalog/CatalogTagsWithTooltip.tsx +5 -1
  36. package/src/components/Dropdown/Dropdown.tsx +79 -84
  37. package/src/components/Menu/MenuItem.tsx +0 -1
  38. package/src/components/OpenApiDocs/hooks/AdditionalOverviewInfo.tsx +9 -0
  39. package/src/components/OpenApiDocs/hooks/AfterOpenApiDescription.tsx +1 -0
  40. package/src/components/Search/SearchAiConversationInput.tsx +2 -12
  41. package/src/components/Search/SearchDialog.tsx +3 -6
  42. package/src/components/Search/variables.ts +1 -5
  43. package/src/components/Select/variables.ts +2 -2
  44. package/src/components/Tag/Tag.tsx +6 -6
  45. package/src/core/constants/search.ts +4 -8
  46. package/src/core/hooks/use-tabs.ts +86 -168
  47. package/src/core/types/hooks.ts +1 -5
  48. package/src/ext/process-scorecard.ts +13 -0
  49. package/src/icons/AiStarsIcon/AiStarsIcon.tsx +2 -11
  50. package/src/icons/RedoclyIcon/RedoclyIcon.tsx +22 -4
  51. package/src/index.ts +2 -0
  52. package/src/markdoc/components/Tabs/TabList.tsx +105 -312
  53. package/src/markdoc/components/Tabs/Tabs.tsx +11 -136
@@ -1,4 +1,4 @@
1
- import React, { useState, useRef, useEffect, useCallback } from '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 dropdownRef = useRef<HTMLDivElement>(null);
165
- const totalTabs = childrenArray.length;
166
-
167
- const { overflowTabs, visibleTabs, handleKeyboard, onTabClick, setTabRef, isReady } = useTabs({
168
- activeTab,
169
- onTabChange,
170
- containerRef,
171
- totalTabs,
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: containerRef,
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={containerRef}>
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
- // Show all tabs before ready (for measurement), then only visible ones
207
- const shouldRender = !isReady || visibleTabs.includes(index);
208
- if (!shouldRender) return null;
209
- return renderTab(child, index, size, setTabRef, handleKeyboard, onTabClick);
210
- })}
211
-
212
- {hasOverflow && (
213
- <TabItem
214
- size={size}
215
- active={isMoreActive || showAsSelector}
216
- tabIndex={0}
217
- className="dropdown-tab"
218
- >
219
- <DropdownWrapper
220
- $top={dropdownPosition.top}
221
- $left={dropdownPosition.left}
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
- <FixedPositionDropdown
227
- ref={dropdownRef}
228
- trigger={
229
- <TabButtonLink
230
- size={size}
231
- className={isMoreActive || showAsSelector ? 'active' : undefined}
232
- >
233
- {showAsSelector ? <TabButtonText>{activeTab}</TabButtonText> : 'More'}
234
- </TabButtonLink>
235
- }
236
- alignment="start"
237
- withArrow
238
- onClose={() => {
239
- setIsDropdownOpen(false);
240
- setDropdownPosition({});
241
- }}
242
- >
243
- <DropdownMenu>
244
- {overflowTabs.map((index) => {
245
- const child = childrenArray[index];
246
- if (!child) return null;
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
- // Remove active class from all tabs first
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
- // Check if active tab is in overflow first
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
- inset: 0;
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: 0;
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: var(--z-index-surface);
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
  }