@alfalab/core-components-tabs 8.5.0 → 8.5.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.
Files changed (144) hide show
  1. package/collapsible/index.js +2 -1
  2. package/components/primary-tablist/Component.collapsible.js +6 -4
  3. package/components/primary-tablist/Component.desktop.js +2 -1
  4. package/components/primary-tablist/Component.js +2 -1
  5. package/components/primary-tablist/Component.mobile.js +3 -2
  6. package/components/primary-tablist/Component.responsive.js +2 -1
  7. package/components/primary-tablist/index.css +30 -30
  8. package/components/primary-tablist/mobile.css +33 -33
  9. package/components/scroll-controls/Component.js +1 -1
  10. package/components/scroll-controls/index.css +14 -14
  11. package/components/scrollable-container/Component.js +1 -1
  12. package/components/scrollable-container/index.css +6 -6
  13. package/components/secondary-tablist/Component.desktop.js +2 -1
  14. package/components/secondary-tablist/Component.js +1 -0
  15. package/components/secondary-tablist/Component.mobile.js +3 -2
  16. package/components/secondary-tablist/Component.responsive.js +2 -1
  17. package/components/secondary-tablist/index.css +11 -11
  18. package/components/secondary-tablist/mobile.css +13 -13
  19. package/components/tab/Component.js +1 -1
  20. package/components/tab/index.css +3 -3
  21. package/components/tabs/Component.collapsible.js +2 -1
  22. package/components/tabs/Component.desktop.js +3 -2
  23. package/components/tabs/Component.js +2 -1
  24. package/components/tabs/Component.mobile.js +3 -2
  25. package/components/tabs/Component.responsive.js +3 -2
  26. package/cssm/collapsible/index.js +1 -0
  27. package/cssm/components/primary-tablist/Component.collapsible.js +5 -3
  28. package/cssm/components/primary-tablist/Component.desktop.js +1 -0
  29. package/cssm/components/primary-tablist/Component.js +2 -1
  30. package/cssm/components/primary-tablist/Component.mobile.js +1 -0
  31. package/cssm/components/primary-tablist/Component.responsive.js +1 -0
  32. package/cssm/components/secondary-tablist/Component.desktop.js +1 -0
  33. package/cssm/components/secondary-tablist/Component.js +1 -0
  34. package/cssm/components/secondary-tablist/Component.mobile.js +1 -0
  35. package/cssm/components/secondary-tablist/Component.responsive.js +1 -0
  36. package/cssm/components/tabs/Component.collapsible.js +1 -0
  37. package/cssm/components/tabs/Component.desktop.js +1 -0
  38. package/cssm/components/tabs/Component.js +2 -1
  39. package/cssm/components/tabs/Component.mobile.js +1 -0
  40. package/cssm/components/tabs/Component.responsive.js +1 -0
  41. package/cssm/desktop/index.js +1 -0
  42. package/cssm/hooks/use-tablist-titles.d.ts +2 -1
  43. package/cssm/hooks/use-tablist-titles.js +1 -0
  44. package/cssm/hooks/use-tabs.d.ts +2 -1
  45. package/cssm/hooks/use-tabs.js +17 -6
  46. package/cssm/index.js +1 -0
  47. package/cssm/mobile/index.js +1 -0
  48. package/cssm/shared/index.js +1 -0
  49. package/cssm/typings.d.ts +6 -1
  50. package/desktop/index.js +3 -2
  51. package/esm/collapsible/index.js +2 -1
  52. package/esm/components/primary-tablist/Component.collapsible.js +7 -5
  53. package/esm/components/primary-tablist/Component.desktop.js +2 -1
  54. package/esm/components/primary-tablist/Component.js +2 -1
  55. package/esm/components/primary-tablist/Component.mobile.js +3 -2
  56. package/esm/components/primary-tablist/Component.responsive.js +2 -1
  57. package/esm/components/primary-tablist/index.css +30 -30
  58. package/esm/components/primary-tablist/mobile.css +33 -33
  59. package/esm/components/scroll-controls/Component.js +1 -1
  60. package/esm/components/scroll-controls/index.css +14 -14
  61. package/esm/components/scrollable-container/Component.js +1 -1
  62. package/esm/components/scrollable-container/index.css +6 -6
  63. package/esm/components/secondary-tablist/Component.desktop.js +2 -1
  64. package/esm/components/secondary-tablist/Component.js +1 -0
  65. package/esm/components/secondary-tablist/Component.mobile.js +3 -2
  66. package/esm/components/secondary-tablist/Component.responsive.js +2 -1
  67. package/esm/components/secondary-tablist/index.css +11 -11
  68. package/esm/components/secondary-tablist/mobile.css +13 -13
  69. package/esm/components/tab/Component.js +1 -1
  70. package/esm/components/tab/index.css +3 -3
  71. package/esm/components/tabs/Component.collapsible.js +2 -1
  72. package/esm/components/tabs/Component.desktop.js +3 -2
  73. package/esm/components/tabs/Component.js +2 -1
  74. package/esm/components/tabs/Component.mobile.js +3 -2
  75. package/esm/components/tabs/Component.responsive.js +3 -2
  76. package/esm/desktop/index.js +3 -2
  77. package/esm/hooks/use-tablist-titles.d.ts +2 -1
  78. package/esm/hooks/use-tablist-titles.js +1 -0
  79. package/esm/hooks/use-tabs.d.ts +2 -1
  80. package/esm/hooks/use-tabs.js +13 -6
  81. package/esm/index.js +3 -2
  82. package/esm/index.module-1e961bec.js +4 -0
  83. package/esm/index.module-b07a0a20.js +4 -0
  84. package/esm/mobile/index.js +3 -2
  85. package/esm/shared/index.js +1 -0
  86. package/esm/typings.d.ts +6 -1
  87. package/hooks/use-tablist-titles.d.ts +2 -1
  88. package/hooks/use-tablist-titles.js +1 -0
  89. package/hooks/use-tabs.d.ts +2 -1
  90. package/hooks/use-tabs.js +17 -6
  91. package/index.js +3 -2
  92. package/index.module-6c875fed.js +6 -0
  93. package/index.module-dcd338c3.js +6 -0
  94. package/mobile/index.js +3 -2
  95. package/modern/collapsible/index.js +2 -1
  96. package/modern/components/primary-tablist/Component.collapsible.js +5 -4
  97. package/modern/components/primary-tablist/Component.desktop.js +2 -1
  98. package/modern/components/primary-tablist/Component.js +2 -1
  99. package/modern/components/primary-tablist/Component.mobile.js +3 -2
  100. package/modern/components/primary-tablist/Component.responsive.js +2 -1
  101. package/modern/components/primary-tablist/index.css +30 -30
  102. package/modern/components/primary-tablist/mobile.css +33 -33
  103. package/modern/components/scroll-controls/Component.js +1 -1
  104. package/modern/components/scroll-controls/index.css +14 -14
  105. package/modern/components/scrollable-container/Component.js +1 -1
  106. package/modern/components/scrollable-container/index.css +6 -6
  107. package/modern/components/secondary-tablist/Component.desktop.js +2 -1
  108. package/modern/components/secondary-tablist/Component.js +1 -0
  109. package/modern/components/secondary-tablist/Component.mobile.js +3 -2
  110. package/modern/components/secondary-tablist/Component.responsive.js +2 -1
  111. package/modern/components/secondary-tablist/index.css +11 -11
  112. package/modern/components/secondary-tablist/mobile.css +13 -13
  113. package/modern/components/tab/Component.js +1 -1
  114. package/modern/components/tab/index.css +3 -3
  115. package/modern/components/tabs/Component.collapsible.js +2 -1
  116. package/modern/components/tabs/Component.desktop.js +3 -2
  117. package/modern/components/tabs/Component.js +2 -1
  118. package/modern/components/tabs/Component.mobile.js +3 -2
  119. package/modern/components/tabs/Component.responsive.js +3 -2
  120. package/modern/desktop/index.js +3 -2
  121. package/modern/hooks/use-tablist-titles.d.ts +2 -1
  122. package/modern/hooks/use-tablist-titles.js +1 -0
  123. package/modern/hooks/use-tabs.d.ts +2 -1
  124. package/modern/hooks/use-tabs.js +13 -6
  125. package/modern/index.js +3 -2
  126. package/modern/index.module-11a3c51b.js +4 -0
  127. package/modern/index.module-b0eb0617.js +4 -0
  128. package/modern/mobile/index.js +3 -2
  129. package/modern/shared/index.js +1 -0
  130. package/modern/typings.d.ts +6 -1
  131. package/package.json +5 -5
  132. package/shared/index.js +1 -0
  133. package/src/components/primary-tablist/Component.collapsible.tsx +22 -12
  134. package/src/components/primary-tablist/Component.tsx +1 -1
  135. package/src/components/tabs/Component.tsx +2 -0
  136. package/src/hooks/use-tabs.tsx +23 -6
  137. package/src/typings.ts +7 -1
  138. package/typings.d.ts +6 -1
  139. package/esm/index.module-77f20a83.js +0 -4
  140. package/esm/index.module-b2867cef.js +0 -4
  141. package/index.module-269f7642.js +0 -6
  142. package/index.module-3e51b518.js +0 -6
  143. package/modern/index.module-2ee1459e.js +0 -4
  144. package/modern/index.module-5572b7e8.js +0 -4
@@ -1,4 +1,4 @@
1
- /* hash: evptj */
1
+ /* hash: 19flh */
2
2
  :root {
3
3
  }/* deprecated */:root { /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
4
4
  }:root { /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
@@ -51,30 +51,30 @@
51
51
 
52
52
  /* size xl */
53
53
  --secondary-tablist-xl-gaps: var(--gap-m);
54
- }.tabs__component_14u7v {
54
+ }.tabs__component_1du2s {
55
55
  position: relative;
56
56
  display: inline-flex;
57
- }.tabs__fullWidthScroll_14u7v {
57
+ }.tabs__fullWidthScroll_1du2s {
58
58
  margin: 0 var(--gap-m);
59
- }.tabs__container_14u7v {
59
+ }.tabs__container_1du2s {
60
60
  overflow: hidden;
61
61
 
62
62
  /* focus-outline fix */
63
63
  margin: var(--gap-2xs-neg) 0 var(--gap-2xs-neg) var(--gap-2xs-neg);
64
64
  padding: var(--gap-2xs) 0 var(--gap-2xs) var(--gap-2xs);
65
- }.tabs__title_14u7v {
65
+ }.tabs__title_1du2s {
66
66
  white-space: nowrap;
67
- }/* sizes */.tabs__xxs_14u7v .tabs__title_14u7v + .tabs__title_14u7v {
67
+ }/* sizes */.tabs__xxs_1du2s .tabs__title_1du2s + .tabs__title_1du2s {
68
68
  margin-left: var(--secondary-tablist-xxs-gaps);
69
- }.tabs__xs_14u7v .tabs__title_14u7v + .tabs__title_14u7v {
69
+ }.tabs__xs_1du2s .tabs__title_1du2s + .tabs__title_1du2s {
70
70
  margin-left: var(--secondary-tablist-xs-gaps);
71
- }.tabs__s_14u7v .tabs__title_14u7v + .tabs__title_14u7v {
71
+ }.tabs__s_1du2s .tabs__title_1du2s + .tabs__title_1du2s {
72
72
  margin-left: var(--secondary-tablist-s-gaps);
73
- }.tabs__m_14u7v .tabs__title_14u7v + .tabs__title_14u7v {
73
+ }.tabs__m_1du2s .tabs__title_1du2s + .tabs__title_1du2s {
74
74
  margin-left: var(--secondary-tablist-m-gaps);
75
- }.tabs__l_14u7v .tabs__title_14u7v + .tabs__title_14u7v {
75
+ }.tabs__l_1du2s .tabs__title_1du2s + .tabs__title_1du2s {
76
76
  margin-left: var(--secondary-tablist-l-gaps);
77
- }.tabs__xl_14u7v .tabs__title_14u7v + .tabs__title_14u7v {
77
+ }.tabs__xl_1du2s .tabs__title_1du2s + .tabs__title_1du2s {
78
78
  margin-left: var(--secondary-tablist-xl-gaps);
79
79
  } :root {
80
80
  --color-dark-indigo: #0b1f35;
@@ -1637,7 +1637,7 @@
1637
1637
 
1638
1638
  /* size xl */
1639
1639
  --secondary-tablist-xl-gaps: var(--gap-m);
1640
- } .tabs__title_19or5 {
1641
- } .tabs__mobile_19or5 .tabs__title_19or5 + .tabs__title_19or5 {
1640
+ } .tabs__title_1kd50 {
1641
+ } .tabs__mobile_1kd50 .tabs__title_1kd50 + .tabs__title_1kd50 {
1642
1642
  margin-left: var(--secondary-tablist-mobile-gaps);
1643
1643
  }
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import cn from 'classnames';
3
3
 
4
- const styles = {"component":"tabs__component_1q0ar","hidden":"tabs__hidden_1q0ar"};
4
+ const styles = {"component":"tabs__component_fie4e","hidden":"tabs__hidden_fie4e"};
5
5
  require('./index.css')
6
6
 
7
7
  const Tab = ({ children, hidden, className, disabled, dataTestId }) => children ? (React.createElement("div", { className: cn(styles.component, {
@@ -1,8 +1,8 @@
1
- /* hash: 1ga89 */
2
- .tabs__component_1q0ar {
1
+ /* hash: 1rzgq */
2
+ .tabs__component_fie4e {
3
3
  outline: none;
4
4
  }
5
5
 
6
- .tabs__hidden_1q0ar {
6
+ .tabs__hidden_fie4e {
7
7
  display: none;
8
8
  }
@@ -11,10 +11,11 @@ import '../../hooks/use-collapsible-elements.js';
11
11
  import '@juggle/resize-observer';
12
12
  import '@alfalab/hooks';
13
13
  import '../../hooks/use-tabs.js';
14
+ import 'react-merge-refs';
14
15
  import '@alfalab/core-components-shared/modern';
15
16
  import '../../synthetic-events.js';
16
17
  import '../title/Component.js';
17
- import '../../index.module-2ee1459e.js';
18
+ import '../../index.module-b0eb0617.js';
18
19
 
19
20
  const TabsCollapsible = ({ ...restProps }) => (React.createElement(Tabs, { TabList: CollapsiblePrimaryTabList, ...restProps }));
20
21
 
@@ -8,6 +8,7 @@ import 'classnames';
8
8
  import '@alfalab/core-components-keyboard-focusable/modern';
9
9
  import '@alfalab/core-components-shared/modern';
10
10
  import '../../hooks/use-tabs.js';
11
+ import 'react-merge-refs';
11
12
  import '../scrollable-container/Component.js';
12
13
  import 'compute-scroll-into-view';
13
14
  import '../scroll-controls/Component.js';
@@ -17,10 +18,10 @@ import '@alfalab/icons-glyph/ChevronLeftMIcon';
17
18
  import '@alfalab/icons-glyph/ChevronRightMIcon';
18
19
  import '../scroll-controls/utils.js';
19
20
  import '../title/Component.js';
20
- import '../../index.module-2ee1459e.js';
21
+ import '../../index.module-b0eb0617.js';
21
22
  import '@alfalab/core-components-tag/modern/desktop';
22
23
  import '../secondary-tablist/Component.js';
23
- import '../../index.module-5572b7e8.js';
24
+ import '../../index.module-11a3c51b.js';
24
25
 
25
26
  const views = {
26
27
  primary: PrimaryTabListDesktop,
@@ -2,7 +2,7 @@ import React, { cloneElement } from 'react';
2
2
 
3
3
  const Tabs = ({ TabList, className, containerClassName, size, defaultMatchMediaValue, children, selectedId, scrollable, collapsedTabsIds, fullWidthScroll = false, keepMounted = false, dataTestId, onChange, breakpoint = 1024, tagShape, tagView, }) => {
4
4
  const tabsArray = React.Children.toArray(children);
5
- const titles = tabsArray.map(({ props: { title, id, rightAddons, disabled, hidden, toggleClassName, dataTestId: toggleTestId, }, }) => ({
5
+ const titles = tabsArray.map(({ props: { title, id, rightAddons, disabled, hidden, toggleClassName, dataTestId: toggleTestId, toggleRef, }, }) => ({
6
6
  title,
7
7
  id,
8
8
  disabled,
@@ -10,6 +10,7 @@ const Tabs = ({ TabList, className, containerClassName, size, defaultMatchMediaV
10
10
  hidden,
11
11
  toggleClassName,
12
12
  dataTestId: toggleTestId,
13
+ toggleRef,
13
14
  }));
14
15
  const tabs = tabsArray.filter((tab) => tab.props.id === selectedId || tab.props.keepMounted || keepMounted);
15
16
  return (React.createElement("div", { className: className },
@@ -8,6 +8,7 @@ import '@juggle/resize-observer';
8
8
  import '@alfalab/core-components-keyboard-focusable/modern';
9
9
  import '@alfalab/core-components-shared/modern';
10
10
  import '../../hooks/use-tabs.js';
11
+ import 'react-merge-refs';
11
12
  import '../scrollable-container/Component.js';
12
13
  import 'compute-scroll-into-view';
13
14
  import '../scroll-controls/Component.js';
@@ -17,10 +18,10 @@ import '@alfalab/icons-glyph/ChevronLeftMIcon';
17
18
  import '@alfalab/icons-glyph/ChevronRightMIcon';
18
19
  import '../scroll-controls/utils.js';
19
20
  import '../title/Component.js';
20
- import '../../index.module-2ee1459e.js';
21
+ import '../../index.module-b0eb0617.js';
21
22
  import '@alfalab/core-components-tag/modern/mobile';
22
23
  import '../secondary-tablist/Component.js';
23
- import '../../index.module-5572b7e8.js';
24
+ import '../../index.module-11a3c51b.js';
24
25
 
25
26
  const views = {
26
27
  primary: PrimaryTabListMobile,
@@ -10,6 +10,7 @@ import 'classnames';
10
10
  import '@alfalab/core-components-keyboard-focusable/modern';
11
11
  import '@alfalab/core-components-shared/modern';
12
12
  import '../../hooks/use-tabs.js';
13
+ import 'react-merge-refs';
13
14
  import '../scrollable-container/Component.js';
14
15
  import 'compute-scroll-into-view';
15
16
  import '../scroll-controls/Component.js';
@@ -19,12 +20,12 @@ import '@alfalab/icons-glyph/ChevronLeftMIcon';
19
20
  import '@alfalab/icons-glyph/ChevronRightMIcon';
20
21
  import '../scroll-controls/utils.js';
21
22
  import '../title/Component.js';
22
- import '../../index.module-2ee1459e.js';
23
+ import '../../index.module-b0eb0617.js';
23
24
  import '../primary-tablist/Component.mobile.js';
24
25
  import '../secondary-tablist/Component.desktop.js';
25
26
  import '@alfalab/core-components-tag/modern/desktop';
26
27
  import '../secondary-tablist/Component.js';
27
- import '../../index.module-5572b7e8.js';
28
+ import '../../index.module-11a3c51b.js';
28
29
  import '../secondary-tablist/Component.mobile.js';
29
30
  import '@alfalab/core-components-tag/modern/mobile';
30
31
 
@@ -9,6 +9,7 @@ import 'classnames';
9
9
  import '@alfalab/core-components-keyboard-focusable/modern';
10
10
  import '@alfalab/core-components-shared/modern';
11
11
  import '../hooks/use-tabs.js';
12
+ import 'react-merge-refs';
12
13
  import '../components/scrollable-container/Component.js';
13
14
  import 'compute-scroll-into-view';
14
15
  import '../components/scroll-controls/Component.js';
@@ -18,8 +19,8 @@ import '@alfalab/icons-glyph/ChevronLeftMIcon';
18
19
  import '@alfalab/icons-glyph/ChevronRightMIcon';
19
20
  import '../components/scroll-controls/utils.js';
20
21
  import '../components/title/Component.js';
21
- import '../index.module-2ee1459e.js';
22
+ import '../index.module-b0eb0617.js';
22
23
  import '@alfalab/core-components-tag/modern/desktop';
23
24
  import '../components/secondary-tablist/Component.js';
24
- import '../index.module-5572b7e8.js';
25
+ import '../index.module-11a3c51b.js';
25
26
  import '../components/tabs/Component.js';
@@ -13,6 +13,7 @@ declare const useTablistTitles: ({ titles, selectedId, collapsedTabsIds, breakpo
13
13
  hidden?: boolean | undefined;
14
14
  toggleClassName?: string | undefined;
15
15
  dataTestId?: string | undefined;
16
+ toggleRef?: import("react").Ref<HTMLDivElement> | undefined;
16
17
  }[];
17
18
  selectedTab: HTMLButtonElement | null;
18
19
  focusedTab: HTMLButtonElement | null;
@@ -23,7 +24,7 @@ declare const useTablistTitles: ({ titles, selectedId, collapsedTabsIds, breakpo
23
24
  selected: boolean;
24
25
  'data-test-id': string | undefined;
25
26
  disabled: boolean | undefined;
26
- ref: (node: HTMLButtonElement) => void;
27
+ ref: (instance: HTMLElement | null) => void;
27
28
  onKeyDown: (event: import("react").KeyboardEvent<HTMLButtonElement>) => void;
28
29
  onClick: (event?: import("react").MouseEvent<Element, MouseEvent> | undefined) => void;
29
30
  };
@@ -4,6 +4,7 @@ import { useCollapsibleElements } from './use-collapsible-elements.js';
4
4
  import { useTabs } from './use-tabs.js';
5
5
  import '@juggle/resize-observer';
6
6
  import '@alfalab/hooks';
7
+ import 'react-merge-refs';
7
8
  import '@alfalab/core-components-shared/modern';
8
9
 
9
10
  const useTablistTitles = ({ titles = [], selectedId, collapsedTabsIds, breakpoint, onChange, defaultMatchMediaValue, }) => {
@@ -1,3 +1,4 @@
1
+ /// <reference types="react" />
1
2
  import { KeyboardEvent, MouseEvent, MutableRefObject } from 'react';
2
3
  import { UseTabsProps } from "../typings";
3
4
  declare function useTabs({ titles, selectedId, onChange }: UseTabsProps): {
@@ -8,7 +9,7 @@ declare function useTabs({ titles, selectedId, onChange }: UseTabsProps): {
8
9
  selected: boolean;
9
10
  'data-test-id': string | undefined;
10
11
  disabled: boolean | undefined;
11
- ref: (node: HTMLButtonElement) => void;
12
+ ref: (instance: HTMLElement | null) => void;
12
13
  onKeyDown: (event: KeyboardEvent<HTMLButtonElement>) => void;
13
14
  onClick: (event?: MouseEvent) => void;
14
15
  };
@@ -1,4 +1,5 @@
1
1
  import { useState, useRef, useCallback } from 'react';
2
+ import mergeRefs from 'react-merge-refs';
2
3
  import { getDataTestId } from '@alfalab/core-components-shared/modern';
3
4
 
4
5
  function useTabs({ titles = [], selectedId, onChange }) {
@@ -69,6 +70,17 @@ function useTabs({ titles = [], selectedId, onChange }) {
69
70
  const getTabListItemProps = (index, outerRef) => {
70
71
  const item = titles[index];
71
72
  const itemSelected = item.id === selectedId;
73
+ const refs = [
74
+ (node) => {
75
+ // eslint-disable-next-line no-param-reassign
76
+ if (outerRef)
77
+ outerRef.current = node;
78
+ handleItemRef(node, item, index);
79
+ },
80
+ ];
81
+ if (item.toggleRef) {
82
+ refs.push(item.toggleRef);
83
+ }
72
84
  return {
73
85
  role: 'tab',
74
86
  tabIndex: itemSelected ? 0 : -1,
@@ -76,12 +88,7 @@ function useTabs({ titles = [], selectedId, onChange }) {
76
88
  selected: itemSelected,
77
89
  'data-test-id': getDataTestId(item.dataTestId, 'toggle'),
78
90
  disabled: item.disabled,
79
- ref: (node) => {
80
- // eslint-disable-next-line no-param-reassign
81
- if (outerRef)
82
- outerRef.current = node;
83
- handleItemRef(node, item, index);
84
- },
91
+ ref: mergeRefs(refs),
85
92
  onKeyDown: handleKeyDown,
86
93
  onClick: (event) => handleItemClick(event, item),
87
94
  };
package/modern/index.js CHANGED
@@ -11,6 +11,7 @@ import 'classnames';
11
11
  import '@alfalab/core-components-keyboard-focusable/modern';
12
12
  import '@alfalab/core-components-shared/modern';
13
13
  import './hooks/use-tabs.js';
14
+ import 'react-merge-refs';
14
15
  import './components/scrollable-container/Component.js';
15
16
  import 'compute-scroll-into-view';
16
17
  import './components/scroll-controls/Component.js';
@@ -20,12 +21,12 @@ import '@alfalab/icons-glyph/ChevronLeftMIcon';
20
21
  import '@alfalab/icons-glyph/ChevronRightMIcon';
21
22
  import './components/scroll-controls/utils.js';
22
23
  import './components/title/Component.js';
23
- import './index.module-2ee1459e.js';
24
+ import './index.module-b0eb0617.js';
24
25
  import './components/primary-tablist/Component.mobile.js';
25
26
  import './components/secondary-tablist/Component.desktop.js';
26
27
  import '@alfalab/core-components-tag/modern/desktop';
27
28
  import './components/secondary-tablist/Component.js';
28
- import './index.module-5572b7e8.js';
29
+ import './index.module-11a3c51b.js';
29
30
  import './components/secondary-tablist/Component.mobile.js';
30
31
  import '@alfalab/core-components-tag/modern/mobile';
31
32
  import './components/tabs/Component.js';
@@ -0,0 +1,4 @@
1
+ const commonStyles = {"component":"tabs__component_1du2s","fullWidthScroll":"tabs__fullWidthScroll_1du2s","container":"tabs__container_1du2s","title":"tabs__title_1du2s","xxs":"tabs__xxs_1du2s","xs":"tabs__xs_1du2s","s":"tabs__s_1du2s","m":"tabs__m_1du2s","l":"tabs__l_1du2s","xl":"tabs__xl_1du2s"};
2
+ require('./components/secondary-tablist/index.css')
3
+
4
+ export { commonStyles as c };
@@ -0,0 +1,4 @@
1
+ const styles = {"component":"tabs__component_18t44","fullWidthScroll":"tabs__fullWidthScroll_18t44","container":"tabs__container_18t44","title":"tabs__title_18t44","disabled":"tabs__disabled_18t44","focused":"tabs__focused_18t44","collapsed":"tabs__collapsed_18t44","selected":"tabs__selected_18t44","line":"tabs__line_18t44","option":"tabs__option_18t44","s":"tabs__s_18t44","xs":"tabs__xs_18t44","xxs":"tabs__xxs_18t44","pickerWrapper":"tabs__pickerWrapper_18t44","m":"tabs__m_18t44","l":"tabs__l_18t44","xl":"tabs__xl_18t44","rightAddons":"tabs__rightAddons_18t44"};
2
+ require('./components/primary-tablist/index.css')
3
+
4
+ export { styles as s };
@@ -9,6 +9,7 @@ import '@juggle/resize-observer';
9
9
  import '@alfalab/core-components-keyboard-focusable/modern';
10
10
  import '@alfalab/core-components-shared/modern';
11
11
  import '../hooks/use-tabs.js';
12
+ import 'react-merge-refs';
12
13
  import '../components/scrollable-container/Component.js';
13
14
  import 'compute-scroll-into-view';
14
15
  import '../components/scroll-controls/Component.js';
@@ -18,8 +19,8 @@ import '@alfalab/icons-glyph/ChevronLeftMIcon';
18
19
  import '@alfalab/icons-glyph/ChevronRightMIcon';
19
20
  import '../components/scroll-controls/utils.js';
20
21
  import '../components/title/Component.js';
21
- import '../index.module-2ee1459e.js';
22
+ import '../index.module-b0eb0617.js';
22
23
  import '@alfalab/core-components-tag/modern/mobile';
23
24
  import '../components/secondary-tablist/Component.js';
24
- import '../index.module-5572b7e8.js';
25
+ import '../index.module-11a3c51b.js';
25
26
  import '../components/tabs/Component.js';
@@ -10,6 +10,7 @@ import '@alfalab/core-components-icon-button/modern';
10
10
  import '@alfalab/icons-glyph/ChevronLeftMIcon';
11
11
  import '@alfalab/icons-glyph/ChevronRightMIcon';
12
12
  import '../components/scroll-controls/utils.js';
13
+ import 'react-merge-refs';
13
14
  import '@alfalab/core-components-shared/modern';
14
15
  import '@juggle/resize-observer';
15
16
  import '@alfalab/hooks';
@@ -1,4 +1,4 @@
1
- import { FC, MouseEvent, ReactElement, ReactNode } from 'react';
1
+ import { FC, MouseEvent, ReactElement, ReactNode, Ref } from 'react';
2
2
  import { TagProps } from "@alfalab/core-components-tag";
3
3
  type SelectedId = string | number;
4
4
  type TabsProps = {
@@ -119,6 +119,10 @@ type TabProps = {
119
119
  * Идентификатор для систем автоматизированного тестирования
120
120
  */
121
121
  dataTestId?: string;
122
+ /**
123
+ * Реф для кнопки переключения таба
124
+ */
125
+ toggleRef?: Ref<HTMLDivElement>;
122
126
  };
123
127
  type TabListTitle = {
124
128
  title: string;
@@ -130,6 +134,7 @@ type TabListTitle = {
130
134
  selected?: boolean;
131
135
  collapsed?: boolean;
132
136
  dataTestId?: string;
137
+ toggleRef?: Ref<HTMLDivElement>;
133
138
  };
134
139
  type TabListProps = Pick<TabsProps, 'className' | 'containerClassName' | 'size' | 'defaultMatchMediaValue' | 'selectedId' | 'scrollable' | 'collapsedTabsIds' | 'onChange' | 'dataTestId' | 'fullWidthScroll' | 'tagShape' | 'tagView'> & {
135
140
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alfalab/core-components-tabs",
3
- "version": "8.5.0",
3
+ "version": "8.5.2",
4
4
  "description": "Tabs components",
5
5
  "keywords": [],
6
6
  "license": "MIT",
@@ -16,12 +16,12 @@
16
16
  "dependencies": {
17
17
  "@alfalab/core-components-keyboard-focusable": "^4.1.0",
18
18
  "@alfalab/core-components-tag": "^8.0.1",
19
- "@alfalab/core-components-picker-button": "^11.5.0",
20
- "@alfalab/core-components-badge": "^5.5.0",
19
+ "@alfalab/core-components-picker-button": "^11.5.2",
20
+ "@alfalab/core-components-badge": "^5.5.1",
21
21
  "@alfalab/core-components-mq": "^4.2.0",
22
22
  "@alfalab/hooks": "^1.13.0",
23
- "@alfalab/core-components-shared": "^0.9.0",
24
- "@alfalab/core-components-icon-button": "^6.5.0",
23
+ "@alfalab/core-components-shared": "^0.9.1",
24
+ "@alfalab/core-components-icon-button": "^6.5.1",
25
25
  "@alfalab/icons-glyph": "^2.139.0",
26
26
  "classnames": "^2.3.1",
27
27
  "compute-scroll-into-view": "^3.1.0",
package/shared/index.js CHANGED
@@ -15,6 +15,7 @@ require('@alfalab/core-components-icon-button');
15
15
  require('@alfalab/icons-glyph/ChevronLeftMIcon');
16
16
  require('@alfalab/icons-glyph/ChevronRightMIcon');
17
17
  require('../components/scroll-controls/utils.js');
18
+ require('react-merge-refs');
18
19
  require('@alfalab/core-components-shared');
19
20
  require('@juggle/resize-observer');
20
21
  require('@alfalab/hooks');
@@ -1,4 +1,4 @@
1
- import React, { useEffect, useMemo, useRef } from 'react';
1
+ import React, { Ref, useEffect, useMemo, useRef } from 'react';
2
2
  import cn from 'classnames';
3
3
 
4
4
  import { Badge } from '@alfalab/core-components-badge';
@@ -49,17 +49,27 @@ export const CollapsiblePrimaryTabList = ({
49
49
 
50
50
  const collapsedOptions = useMemo(
51
51
  () =>
52
- tablistTitles.reduce<PickerButtonDesktopProps['options']>((options, title) => {
53
- if (title.collapsed) {
54
- options.push({
55
- key: title.title,
56
- value: title.id,
57
- content: <Title {...title} styles={styles} isOption={true} />,
58
- });
59
- }
52
+ tablistTitles.reduce<PickerButtonDesktopProps['options']>(
53
+ (options, { toggleRef, ...title }) => {
54
+ if (title.collapsed) {
55
+ options.push({
56
+ key: title.title,
57
+ value: title.id,
58
+ content: (
59
+ <Title
60
+ {...title}
61
+ ref={toggleRef as Ref<HTMLButtonElement>}
62
+ styles={styles}
63
+ isOption={true}
64
+ />
65
+ ),
66
+ });
67
+ }
60
68
 
61
- return options;
62
- }, []),
69
+ return options;
70
+ },
71
+ [],
72
+ ),
63
73
  [tablistTitles],
64
74
  );
65
75
 
@@ -86,7 +96,7 @@ export const CollapsiblePrimaryTabList = ({
86
96
  [styles.fullWidthScroll]: fullWidthScroll,
87
97
  })}
88
98
  >
89
- {tablistTitles.map(({ dataTestId: _, ...restTitleProps }, index) => (
99
+ {tablistTitles.map(({ dataTestId: _, toggleRef: __, ...restTitleProps }, index) => (
90
100
  <KeyboardFocusable key={restTitleProps.id}>
91
101
  {(ref, focused) => (
92
102
  <Title
@@ -59,7 +59,7 @@ export const PrimaryTabList = ({
59
59
  [styles.fullWidthScroll]: fullWidthScroll,
60
60
  })}
61
61
  >
62
- {titles.map(({ dataTestId: _, ...restTitleProps }, index) => (
62
+ {titles.map(({ dataTestId: _, toggleRef: __, ...restTitleProps }, index) => (
63
63
  <KeyboardFocusable key={restTitleProps.id}>
64
64
  {(ref, focused) => (
65
65
  <Title
@@ -31,6 +31,7 @@ export const Tabs = ({
31
31
  hidden,
32
32
  toggleClassName,
33
33
  dataTestId: toggleTestId,
34
+ toggleRef,
34
35
  },
35
36
  }) => ({
36
37
  title,
@@ -40,6 +41,7 @@ export const Tabs = ({
40
41
  hidden,
41
42
  toggleClassName,
42
43
  dataTestId: toggleTestId,
44
+ toggleRef,
43
45
  }),
44
46
  );
45
47
 
@@ -1,4 +1,13 @@
1
- import { KeyboardEvent, MouseEvent, MutableRefObject, useCallback, useRef, useState } from 'react';
1
+ import {
2
+ KeyboardEvent,
3
+ MouseEvent,
4
+ MutableRefObject,
5
+ Ref,
6
+ useCallback,
7
+ useRef,
8
+ useState,
9
+ } from 'react';
10
+ import mergeRefs from 'react-merge-refs';
2
11
 
3
12
  import { getDataTestId } from '@alfalab/core-components-shared';
4
13
 
@@ -104,6 +113,18 @@ export function useTabs({ titles = [], selectedId, onChange }: UseTabsProps) {
104
113
  const item = titles[index];
105
114
  const itemSelected = item.id === selectedId;
106
115
 
116
+ const refs: Array<Ref<HTMLElement>> = [
117
+ (node: HTMLButtonElement) => {
118
+ // eslint-disable-next-line no-param-reassign
119
+ if (outerRef) outerRef.current = node;
120
+ handleItemRef(node, item, index);
121
+ },
122
+ ];
123
+
124
+ if (item.toggleRef) {
125
+ refs.push(item.toggleRef);
126
+ }
127
+
107
128
  return {
108
129
  role: 'tab',
109
130
  tabIndex: itemSelected ? 0 : -1,
@@ -111,11 +132,7 @@ export function useTabs({ titles = [], selectedId, onChange }: UseTabsProps) {
111
132
  selected: itemSelected,
112
133
  'data-test-id': getDataTestId(item.dataTestId, 'toggle'),
113
134
  disabled: item.disabled,
114
- ref: (node: HTMLButtonElement) => {
115
- // eslint-disable-next-line no-param-reassign
116
- if (outerRef) outerRef.current = node;
117
- handleItemRef(node, item, index);
118
- },
135
+ ref: mergeRefs(refs),
119
136
  onKeyDown: handleKeyDown,
120
137
  onClick: (event?: MouseEvent) => handleItemClick(event as MouseEvent, item),
121
138
  };
package/src/typings.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { FC, MouseEvent, ReactElement, ReactNode } from 'react';
1
+ import { FC, MouseEvent, ReactElement, ReactNode, Ref } from 'react';
2
2
 
3
3
  import { TagProps } from '@alfalab/core-components-tag';
4
4
 
@@ -147,6 +147,11 @@ export type TabProps = {
147
147
  * Идентификатор для систем автоматизированного тестирования
148
148
  */
149
149
  dataTestId?: string;
150
+
151
+ /**
152
+ * Реф для кнопки переключения таба
153
+ */
154
+ toggleRef?: Ref<HTMLDivElement>;
150
155
  };
151
156
 
152
157
  export type TabListTitle = {
@@ -159,6 +164,7 @@ export type TabListTitle = {
159
164
  selected?: boolean;
160
165
  collapsed?: boolean;
161
166
  dataTestId?: string;
167
+ toggleRef?: Ref<HTMLDivElement>;
162
168
  };
163
169
 
164
170
  export type TabListProps = Pick<
package/typings.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { FC, MouseEvent, ReactElement, ReactNode } from 'react';
1
+ import { FC, MouseEvent, ReactElement, ReactNode, Ref } from 'react';
2
2
  import { TagProps } from "@alfalab/core-components-tag";
3
3
  type SelectedId = string | number;
4
4
  type TabsProps = {
@@ -119,6 +119,10 @@ type TabProps = {
119
119
  * Идентификатор для систем автоматизированного тестирования
120
120
  */
121
121
  dataTestId?: string;
122
+ /**
123
+ * Реф для кнопки переключения таба
124
+ */
125
+ toggleRef?: Ref<HTMLDivElement>;
122
126
  };
123
127
  type TabListTitle = {
124
128
  title: string;
@@ -130,6 +134,7 @@ type TabListTitle = {
130
134
  selected?: boolean;
131
135
  collapsed?: boolean;
132
136
  dataTestId?: string;
137
+ toggleRef?: Ref<HTMLDivElement>;
133
138
  };
134
139
  type TabListProps = Pick<TabsProps, 'className' | 'containerClassName' | 'size' | 'defaultMatchMediaValue' | 'selectedId' | 'scrollable' | 'collapsedTabsIds' | 'onChange' | 'dataTestId' | 'fullWidthScroll' | 'tagShape' | 'tagView'> & {
135
140
  /**
@@ -1,4 +0,0 @@
1
- var commonStyles = {"component":"tabs__component_14u7v","fullWidthScroll":"tabs__fullWidthScroll_14u7v","container":"tabs__container_14u7v","title":"tabs__title_14u7v","xxs":"tabs__xxs_14u7v","xs":"tabs__xs_14u7v","s":"tabs__s_14u7v","m":"tabs__m_14u7v","l":"tabs__l_14u7v","xl":"tabs__xl_14u7v"};
2
- require('./components/secondary-tablist/index.css')
3
-
4
- export { commonStyles as c };
@@ -1,4 +0,0 @@
1
- var styles = {"component":"tabs__component_fqd0f","fullWidthScroll":"tabs__fullWidthScroll_fqd0f","container":"tabs__container_fqd0f","title":"tabs__title_fqd0f","disabled":"tabs__disabled_fqd0f","focused":"tabs__focused_fqd0f","collapsed":"tabs__collapsed_fqd0f","selected":"tabs__selected_fqd0f","line":"tabs__line_fqd0f","option":"tabs__option_fqd0f","s":"tabs__s_fqd0f","xs":"tabs__xs_fqd0f","xxs":"tabs__xxs_fqd0f","pickerWrapper":"tabs__pickerWrapper_fqd0f","m":"tabs__m_fqd0f","l":"tabs__l_fqd0f","xl":"tabs__xl_fqd0f","rightAddons":"tabs__rightAddons_fqd0f"};
2
- require('./components/primary-tablist/index.css')
3
-
4
- export { styles as s };
@@ -1,6 +0,0 @@
1
- 'use strict';
2
-
3
- var commonStyles = {"component":"tabs__component_14u7v","fullWidthScroll":"tabs__fullWidthScroll_14u7v","container":"tabs__container_14u7v","title":"tabs__title_14u7v","xxs":"tabs__xxs_14u7v","xs":"tabs__xs_14u7v","s":"tabs__s_14u7v","m":"tabs__m_14u7v","l":"tabs__l_14u7v","xl":"tabs__xl_14u7v"};
4
- require('./components/secondary-tablist/index.css')
5
-
6
- exports.commonStyles = commonStyles;
@@ -1,6 +0,0 @@
1
- 'use strict';
2
-
3
- var styles = {"component":"tabs__component_fqd0f","fullWidthScroll":"tabs__fullWidthScroll_fqd0f","container":"tabs__container_fqd0f","title":"tabs__title_fqd0f","disabled":"tabs__disabled_fqd0f","focused":"tabs__focused_fqd0f","collapsed":"tabs__collapsed_fqd0f","selected":"tabs__selected_fqd0f","line":"tabs__line_fqd0f","option":"tabs__option_fqd0f","s":"tabs__s_fqd0f","xs":"tabs__xs_fqd0f","xxs":"tabs__xxs_fqd0f","pickerWrapper":"tabs__pickerWrapper_fqd0f","m":"tabs__m_fqd0f","l":"tabs__l_fqd0f","xl":"tabs__xl_fqd0f","rightAddons":"tabs__rightAddons_fqd0f"};
4
- require('./components/primary-tablist/index.css')
5
-
6
- exports.styles = styles;
@@ -1,4 +0,0 @@
1
- const styles = {"component":"tabs__component_fqd0f","fullWidthScroll":"tabs__fullWidthScroll_fqd0f","container":"tabs__container_fqd0f","title":"tabs__title_fqd0f","disabled":"tabs__disabled_fqd0f","focused":"tabs__focused_fqd0f","collapsed":"tabs__collapsed_fqd0f","selected":"tabs__selected_fqd0f","line":"tabs__line_fqd0f","option":"tabs__option_fqd0f","s":"tabs__s_fqd0f","xs":"tabs__xs_fqd0f","xxs":"tabs__xxs_fqd0f","pickerWrapper":"tabs__pickerWrapper_fqd0f","m":"tabs__m_fqd0f","l":"tabs__l_fqd0f","xl":"tabs__xl_fqd0f","rightAddons":"tabs__rightAddons_fqd0f"};
2
- require('./components/primary-tablist/index.css')
3
-
4
- export { styles as s };
@@ -1,4 +0,0 @@
1
- const commonStyles = {"component":"tabs__component_14u7v","fullWidthScroll":"tabs__fullWidthScroll_14u7v","container":"tabs__container_14u7v","title":"tabs__title_14u7v","xxs":"tabs__xxs_14u7v","xs":"tabs__xs_14u7v","s":"tabs__s_14u7v","m":"tabs__m_14u7v","l":"tabs__l_14u7v","xl":"tabs__xl_14u7v"};
2
- require('./components/secondary-tablist/index.css')
3
-
4
- export { commonStyles as c };