flexlayout-react 0.7.15 → 0.8.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 (252) hide show
  1. package/ChangeLog.txt +23 -0
  2. package/README.md +157 -330
  3. package/Screenshot_light.png +0 -0
  4. package/Screenshot_rounded.png +0 -0
  5. package/declarations/Attribute.d.ts +1 -1
  6. package/declarations/AttributeDefinitions.d.ts +1 -1
  7. package/declarations/DockLocation.d.ts +12 -12
  8. package/declarations/DropInfo.d.ts +12 -12
  9. package/declarations/I18nLabel.d.ts +12 -14
  10. package/declarations/Orientation.d.ts +7 -7
  11. package/declarations/PopupMenu.d.ts +1 -1
  12. package/declarations/Rect.d.ts +41 -28
  13. package/declarations/Types.d.ts +95 -79
  14. package/declarations/examples/demo/Utils.d.ts +4 -0
  15. package/declarations/index.d.ts +21 -22
  16. package/declarations/model/Action.d.ts +5 -5
  17. package/declarations/model/Actions.d.ts +127 -110
  18. package/declarations/model/BorderNode.d.ts +30 -34
  19. package/declarations/model/BorderSet.d.ts +3 -4
  20. package/declarations/model/ICloseType.d.ts +5 -5
  21. package/declarations/model/IDraggable.d.ts +2 -2
  22. package/declarations/model/IDropTarget.d.ts +2 -2
  23. package/declarations/model/IJsonModel.d.ts +811 -149
  24. package/declarations/model/LayoutWindow.d.ts +28 -0
  25. package/declarations/model/Model.d.ts +91 -86
  26. package/declarations/model/Node.d.ts +17 -17
  27. package/declarations/model/RowNode.d.ts +10 -11
  28. package/declarations/model/TabNode.d.ts +44 -37
  29. package/declarations/model/TabSetNode.d.ts +44 -41
  30. package/declarations/model/Utils.d.ts +1 -1
  31. package/declarations/model/WindowLayout.d.ts +24 -0
  32. package/declarations/src/Attribute.d.ts +1 -0
  33. package/declarations/src/AttributeDefinitions.d.ts +1 -0
  34. package/declarations/src/DockLocation.d.ts +12 -0
  35. package/declarations/src/DropInfo.d.ts +12 -0
  36. package/declarations/src/I18nLabel.d.ts +10 -0
  37. package/declarations/src/Orientation.d.ts +7 -0
  38. package/declarations/src/PopupMenu.d.ts +1 -0
  39. package/declarations/src/Rect.d.ts +31 -0
  40. package/declarations/src/Types.d.ts +92 -0
  41. package/declarations/src/index.d.ts +20 -0
  42. package/declarations/src/model/Action.d.ts +5 -0
  43. package/declarations/src/model/Actions.d.ts +110 -0
  44. package/declarations/src/model/BorderNode.d.ts +28 -0
  45. package/declarations/src/model/BorderSet.d.ts +3 -0
  46. package/declarations/src/model/ICloseType.d.ts +5 -0
  47. package/declarations/src/model/IDraggable.d.ts +2 -0
  48. package/declarations/src/model/IDropTarget.d.ts +2 -0
  49. package/declarations/src/model/IJsonModel.d.ts +153 -0
  50. package/declarations/src/model/Model.d.ts +98 -0
  51. package/declarations/src/model/Node.d.ts +16 -0
  52. package/declarations/src/model/RowNode.d.ts +11 -0
  53. package/declarations/src/model/TabNode.d.ts +36 -0
  54. package/declarations/src/model/TabSetNode.d.ts +37 -0
  55. package/declarations/src/model/Utils.d.ts +1 -0
  56. package/declarations/src/view/BorderButton.d.ts +1 -0
  57. package/declarations/src/view/BorderTab.d.ts +2 -0
  58. package/declarations/src/view/BorderTabSet.d.ts +1 -0
  59. package/declarations/src/view/DragContainer.d.ts +1 -0
  60. package/declarations/src/view/ErrorBoundary.d.ts +1 -0
  61. package/declarations/src/view/FloatingWindow.d.ts +1 -0
  62. package/declarations/src/view/Icons.d.ts +7 -0
  63. package/declarations/src/view/Layout.d.ts +113 -0
  64. package/declarations/src/view/Overlay.d.ts +1 -0
  65. package/declarations/src/view/PopupMenu.d.ts +1 -0
  66. package/declarations/src/view/Row.d.ts +1 -0
  67. package/declarations/src/view/Splitter.d.ts +1 -0
  68. package/declarations/src/view/Tab.d.ts +1 -0
  69. package/declarations/src/view/TabButton.d.ts +1 -0
  70. package/declarations/src/view/TabButtonStamp.d.ts +1 -0
  71. package/declarations/src/view/TabOverflowHook.d.ts +1 -0
  72. package/declarations/src/view/TabSet.d.ts +1 -0
  73. package/declarations/src/view/Utils.d.ts +4 -0
  74. package/declarations/view/BorderButton.d.ts +1 -1
  75. package/declarations/view/BorderTab.d.ts +2 -0
  76. package/declarations/view/BorderTabSet.d.ts +1 -1
  77. package/declarations/view/DragContainer.d.ts +1 -0
  78. package/declarations/view/ErrorBoundary.d.ts +1 -1
  79. package/declarations/view/ExtendedResizeObserver.d.ts +23 -0
  80. package/declarations/view/FloatingWindow.d.ts +1 -1
  81. package/declarations/view/Icons.d.ts +8 -7
  82. package/declarations/view/Layout.d.ts +139 -161
  83. package/declarations/view/Overlay.d.ts +1 -0
  84. package/declarations/view/PopoutWindow.d.ts +1 -0
  85. package/declarations/view/PopupMenu.d.ts +1 -0
  86. package/declarations/view/Row.d.ts +1 -0
  87. package/declarations/view/SizeTracker.d.ts +10 -0
  88. package/declarations/view/Splitter.d.ts +1 -1
  89. package/declarations/view/Tab.d.ts +1 -1
  90. package/declarations/view/TabButton.d.ts +1 -1
  91. package/declarations/view/TabButtonStamp.d.ts +1 -1
  92. package/declarations/view/TabOverflowHook.d.ts +1 -1
  93. package/declarations/view/TabSet.d.ts +1 -1
  94. package/declarations/view/Utils.d.ts +11 -1
  95. package/dist/bundles/demo.js +232052 -0
  96. package/dist/bundles/demo.js.map +1 -0
  97. package/dist/flexlayout.js +122 -92
  98. package/dist/flexlayout_min.js +1 -1
  99. package/lib/Attribute.js +42 -31
  100. package/lib/Attribute.js.map +1 -1
  101. package/lib/AttributeDefinitions.js +131 -108
  102. package/lib/AttributeDefinitions.js.map +1 -1
  103. package/lib/DockLocation.js +120 -124
  104. package/lib/DockLocation.js.map +1 -1
  105. package/lib/DropInfo.js +9 -13
  106. package/lib/DropInfo.js.map +1 -1
  107. package/lib/I18nLabel.js +13 -18
  108. package/lib/I18nLabel.js.map +1 -1
  109. package/lib/Orientation.js +22 -26
  110. package/lib/Orientation.js.map +1 -1
  111. package/lib/Rect.js +104 -72
  112. package/lib/Rect.js.map +1 -1
  113. package/lib/Types.js +96 -83
  114. package/lib/Types.js.map +1 -1
  115. package/lib/index.js +21 -38
  116. package/lib/index.js.map +1 -1
  117. package/lib/model/Action.js +6 -10
  118. package/lib/model/Action.js.map +1 -1
  119. package/lib/model/Actions.js +169 -155
  120. package/lib/model/Actions.js.map +1 -1
  121. package/lib/model/BorderNode.js +385 -406
  122. package/lib/model/BorderNode.js.map +1 -1
  123. package/lib/model/BorderSet.js +66 -121
  124. package/lib/model/BorderSet.js.map +1 -1
  125. package/lib/model/ICloseType.js +6 -9
  126. package/lib/model/ICloseType.js.map +1 -1
  127. package/lib/model/IDraggable.js +1 -2
  128. package/lib/model/IDropTarget.js +1 -2
  129. package/lib/model/IJsonModel.js +1 -2
  130. package/lib/model/LayoutWindow.js +83 -0
  131. package/lib/model/LayoutWindow.js.map +1 -0
  132. package/lib/model/Model.js +614 -496
  133. package/lib/model/Model.js.map +1 -1
  134. package/lib/model/Node.js +217 -228
  135. package/lib/model/Node.js.map +1 -1
  136. package/lib/model/RowNode.js +491 -504
  137. package/lib/model/RowNode.js.map +1 -1
  138. package/lib/model/TabNode.js +289 -184
  139. package/lib/model/TabNode.js.map +1 -1
  140. package/lib/model/TabSetNode.js +457 -446
  141. package/lib/model/TabSetNode.js.map +1 -1
  142. package/lib/model/Utils.js +47 -82
  143. package/lib/model/Utils.js.map +1 -1
  144. package/lib/view/BorderButton.js +124 -138
  145. package/lib/view/BorderButton.js.map +1 -1
  146. package/lib/view/BorderTab.js +47 -0
  147. package/lib/view/BorderTab.js.map +1 -0
  148. package/lib/view/BorderTabSet.js +134 -128
  149. package/lib/view/BorderTabSet.js.map +1 -1
  150. package/lib/view/DragContainer.js +16 -0
  151. package/lib/view/DragContainer.js.map +1 -0
  152. package/lib/view/ErrorBoundary.js +23 -27
  153. package/lib/view/ErrorBoundary.js.map +1 -1
  154. package/lib/view/Icons.js +40 -45
  155. package/lib/view/Icons.js.map +1 -1
  156. package/lib/view/Layout.js +918 -907
  157. package/lib/view/Layout.js.map +1 -1
  158. package/lib/view/Overlay.js +9 -0
  159. package/lib/view/Overlay.js.map +1 -0
  160. package/lib/view/PopoutWindow.js +129 -0
  161. package/lib/view/PopoutWindow.js.map +1 -0
  162. package/lib/view/PopupMenu.js +71 -0
  163. package/lib/view/PopupMenu.js.map +1 -0
  164. package/lib/view/Row.js +45 -0
  165. package/lib/view/Row.js.map +1 -0
  166. package/lib/view/SizeTracker.js +11 -0
  167. package/lib/view/SizeTracker.js.map +1 -0
  168. package/lib/view/Splitter.js +191 -147
  169. package/lib/view/Splitter.js.map +1 -1
  170. package/lib/view/Tab.js +86 -60
  171. package/lib/view/Tab.js.map +1 -1
  172. package/lib/view/TabButton.js +122 -135
  173. package/lib/view/TabButton.js.map +1 -1
  174. package/lib/view/TabButtonStamp.js +16 -21
  175. package/lib/view/TabButtonStamp.js.map +1 -1
  176. package/lib/view/TabOverflowHook.js +150 -149
  177. package/lib/view/TabOverflowHook.js.map +1 -1
  178. package/lib/view/TabSet.js +267 -234
  179. package/lib/view/TabSet.js.map +1 -1
  180. package/lib/view/Utils.js +126 -68
  181. package/lib/view/Utils.js.map +1 -1
  182. package/package.json +36 -30
  183. package/src/Attribute.ts +23 -0
  184. package/src/AttributeDefinitions.ts +38 -15
  185. package/src/DockLocation.ts +13 -13
  186. package/src/I18nLabel.ts +7 -9
  187. package/src/Rect.ts +53 -1
  188. package/src/Types.ts +16 -0
  189. package/src/index.ts +1 -2
  190. package/src/model/Actions.ts +49 -29
  191. package/src/model/BorderNode.ts +208 -214
  192. package/src/model/BorderSet.ts +42 -91
  193. package/src/model/IJsonModel.ts +883 -103
  194. package/src/model/LayoutWindow.ts +121 -0
  195. package/src/model/Model.ts +488 -366
  196. package/src/model/Node.ts +98 -111
  197. package/src/model/RowNode.ts +323 -319
  198. package/src/model/TabNode.ts +294 -110
  199. package/src/model/TabSetNode.ts +300 -242
  200. package/src/model/Utils.ts +6 -32
  201. package/src/view/BorderButton.tsx +32 -52
  202. package/src/view/BorderTab.tsx +70 -0
  203. package/src/view/BorderTabSet.tsx +64 -52
  204. package/src/view/DragContainer.tsx +32 -0
  205. package/src/view/Icons.tsx +6 -0
  206. package/src/view/Layout.tsx +1051 -1046
  207. package/src/view/Overlay.tsx +22 -0
  208. package/src/view/PopoutWindow.tsx +152 -0
  209. package/src/{PopupMenu.tsx → view/PopupMenu.tsx} +36 -31
  210. package/src/view/Row.tsx +68 -0
  211. package/src/view/SizeTracker.tsx +20 -0
  212. package/src/view/Splitter.tsx +167 -112
  213. package/src/view/Tab.tsx +76 -42
  214. package/src/view/TabButton.tsx +36 -55
  215. package/src/view/TabButtonStamp.tsx +5 -9
  216. package/src/view/TabOverflowHook.tsx +14 -9
  217. package/src/view/TabSet.tsx +217 -176
  218. package/src/view/Utils.tsx +119 -39
  219. package/style/_base.scss +140 -34
  220. package/style/dark.css +685 -580
  221. package/style/dark.css.map +1 -1
  222. package/style/dark.scss +3 -1
  223. package/style/gray.css +668 -563
  224. package/style/gray.css.map +1 -1
  225. package/style/gray.scss +2 -0
  226. package/style/light.css +669 -564
  227. package/style/light.css.map +1 -1
  228. package/style/light.scss +4 -2
  229. package/style/rounded.css +697 -0
  230. package/style/rounded.css.map +1 -0
  231. package/style/rounded.scss +194 -0
  232. package/style/underline.css +690 -585
  233. package/style/underline.css.map +1 -1
  234. package/style/underline.scss +2 -0
  235. package/cypress.config.ts +0 -16
  236. package/lib/DragDrop.js +0 -316
  237. package/lib/DragDrop.js.map +0 -1
  238. package/lib/PopupMenu.js +0 -68
  239. package/lib/PopupMenu.js.map +0 -1
  240. package/lib/model/SplitterNode.js +0 -72
  241. package/lib/model/SplitterNode.js.map +0 -1
  242. package/lib/view/FloatingWindow.js +0 -123
  243. package/lib/view/FloatingWindow.js.map +0 -1
  244. package/lib/view/FloatingWindowTab.js +0 -19
  245. package/lib/view/FloatingWindowTab.js.map +0 -1
  246. package/lib/view/TabFloating.js +0 -66
  247. package/lib/view/TabFloating.js.map +0 -1
  248. package/src/DragDrop.ts +0 -392
  249. package/src/model/SplitterNode.ts +0 -78
  250. package/src/view/FloatingWindow.tsx +0 -140
  251. package/src/view/FloatingWindowTab.tsx +0 -29
  252. package/src/view/TabFloating.tsx +0 -101
@@ -3,43 +3,49 @@ import { I18nLabel } from "../I18nLabel";
3
3
  import { Actions } from "../model/Actions";
4
4
  import { TabNode } from "../model/TabNode";
5
5
  import { TabSetNode } from "../model/TabSetNode";
6
- import { Rect } from "../Rect";
7
- import { IconFactory, IIcons, ILayoutCallbacks, TitleFactory } from "./Layout";
6
+ import { LayoutInternal } from "./Layout";
8
7
  import { ICloseType } from "../model/ICloseType";
9
8
  import { CLASSES } from "../Types";
10
9
  import { getRenderStateEx, isAuxMouseEvent } from "./Utils";
11
10
 
12
11
  /** @internal */
13
12
  export interface ITabButtonProps {
14
- layout: ILayoutCallbacks;
13
+ layout: LayoutInternal;
15
14
  node: TabNode;
16
15
  selected: boolean;
17
- iconFactory?: IconFactory;
18
- titleFactory?: TitleFactory;
19
- icons: IIcons;
20
16
  path: string;
21
17
  }
22
18
 
23
19
  /** @internal */
24
20
  export const TabButton = (props: ITabButtonProps) => {
25
- const { layout, node, selected, iconFactory, titleFactory, icons, path } = props;
21
+ const { layout, node, selected, path } = props;
26
22
  const selfRef = React.useRef<HTMLDivElement | null>(null);
27
23
  const contentRef = React.useRef<HTMLInputElement | null>(null);
24
+ const icons = layout.getIcons();
28
25
 
29
- const onMouseDown = (event: React.MouseEvent<HTMLDivElement, MouseEvent> | React.TouchEvent<HTMLDivElement>) => {
30
-
31
- if (!isAuxMouseEvent(event) && !layout.getEditingTab()) {
32
- layout.dragStart(event, undefined, node, node.isEnableDrag(), onClick, onDoubleClick);
26
+ React.useLayoutEffect(() => {
27
+ node.setTabRect(layout.getBoundingClientRect(selfRef.current!));
28
+ if (layout.getEditingTab() === node) {
29
+ (contentRef.current! as HTMLInputElement).select();
33
30
  }
31
+ });
32
+
33
+ const onDragStart = (event: React.DragEvent<HTMLElement>) => {
34
+ event.stopPropagation(); // prevent starting a tabset drag as well
35
+ layout.setDragNode(event.nativeEvent, node as TabNode);
36
+ };
37
+
38
+ const onDragEnd = (event: React.DragEvent<HTMLElement>) => {
39
+ layout.clearDragMain();
34
40
  };
35
41
 
36
- const onAuxMouseClick = (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => {
42
+ const onAuxMouseClick = (event: React.MouseEvent<HTMLElement, MouseEvent>) => {
37
43
  if (isAuxMouseEvent(event)) {
38
44
  layout.auxMouseClick(node, event);
39
- }
45
+ }
40
46
  };
41
47
 
42
- const onContextMenu = (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => {
48
+ const onContextMenu = (event: React.MouseEvent<HTMLElement, MouseEvent>) => {
43
49
  layout.showContextMenu(node, event);
44
50
  };
45
51
 
@@ -47,22 +53,21 @@ export const TabButton = (props: ITabButtonProps) => {
47
53
  layout.doAction(Actions.selectTab(node.getId()));
48
54
  };
49
55
 
50
- const onDoubleClick = (event: Event) => {
56
+ const onDoubleClick = (event: React.MouseEvent<HTMLElement>) => {
51
57
  if (node.isEnableRename()) {
52
58
  onRename();
59
+ event.stopPropagation();
53
60
  }
54
61
  };
55
62
 
56
63
  const onRename = () => {
57
64
  layout.setEditingTab(node);
58
- layout.getCurrentDocument()!.body.addEventListener("mousedown", onEndEdit);
59
- layout.getCurrentDocument()!.body.addEventListener("touchstart", onEndEdit);
65
+ layout.getCurrentDocument()!.body.addEventListener("pointerdown", onEndEdit);
60
66
  };
61
67
 
62
68
  const onEndEdit = (event: Event) => {
63
69
  if (event.target !== contentRef.current!) {
64
- layout.getCurrentDocument()!.body.removeEventListener("mousedown", onEndEdit);
65
- layout.getCurrentDocument()!.body.removeEventListener("touchstart", onEndEdit);
70
+ layout.getCurrentDocument()!.body.removeEventListener("pointerdown", onEndEdit);
66
71
  layout.setEditingTab(undefined);
67
72
  }
68
73
  };
@@ -81,7 +86,7 @@ export const TabButton = (props: ITabButtonProps) => {
81
86
  return false;
82
87
  };
83
88
 
84
- const onClose = (event: React.MouseEvent<HTMLDivElement>) => {
89
+ const onClose = (event: React.MouseEvent<HTMLElement>) => {
85
90
  if (isClosable()) {
86
91
  layout.doAction(Actions.deleteTab(node.getId()));
87
92
  } else {
@@ -89,35 +94,11 @@ export const TabButton = (props: ITabButtonProps) => {
89
94
  }
90
95
  };
91
96
 
92
- const onCloseMouseDown = (event: React.MouseEvent<HTMLDivElement> | React.TouchEvent<HTMLDivElement>) => {
97
+ const onClosePointerDown = (event: React.PointerEvent<HTMLElement>) => {
93
98
  event.stopPropagation();
94
99
  };
95
100
 
96
- React.useLayoutEffect(() => {
97
- updateRect();
98
- if (layout.getEditingTab() === node) {
99
- (contentRef.current! as HTMLInputElement).select();
100
- }
101
- });
102
-
103
- const updateRect = () => {
104
- // record position of tab in node
105
- const layoutRect = layout.getDomRect();
106
- const r = selfRef.current?.getBoundingClientRect();
107
- if (r && layoutRect) {
108
- node._setTabRect(
109
- new Rect(
110
- r.left - layoutRect.left,
111
- r.top - layoutRect.top,
112
- r.width,
113
- r.height
114
- )
115
- );
116
- }
117
- };
118
-
119
- const onTextBoxMouseDown = (event: React.MouseEvent<HTMLInputElement> | React.TouchEvent<HTMLInputElement>) => {
120
- // console.log("onTextBoxMouseDown");
101
+ const onTextBoxPointerDown = (event: React.PointerEvent<HTMLInputElement>) => {
121
102
  event.stopPropagation();
122
103
  };
123
104
 
@@ -152,7 +133,7 @@ export const TabButton = (props: ITabButtonProps) => {
152
133
  classNames += " " + node.getClassName();
153
134
  }
154
135
 
155
- const renderState = getRenderStateEx(layout, node, iconFactory, titleFactory);
136
+ const renderState = getRenderStateEx(layout, node);
156
137
 
157
138
  let content = renderState.content ? (
158
139
  <div className={cm(CLASSES.FLEXLAYOUT__TAB_BUTTON_CONTENT)}>
@@ -174,8 +155,7 @@ export const TabButton = (props: ITabButtonProps) => {
174
155
  autoFocus={true}
175
156
  defaultValue={node.getName()}
176
157
  onKeyDown={onTextBoxKeyPress}
177
- onMouseDown={onTextBoxMouseDown}
178
- onTouchStart={onTextBoxMouseDown}
158
+ onPointerDown={onTextBoxPointerDown}
179
159
  />
180
160
  );
181
161
  }
@@ -188,9 +168,8 @@ export const TabButton = (props: ITabButtonProps) => {
188
168
  data-layout-path={path + "/button/close"}
189
169
  title={closeTitle}
190
170
  className={cm(CLASSES.FLEXLAYOUT__TAB_BUTTON_TRAILING)}
191
- onMouseDown={onCloseMouseDown}
192
- onClick={onClose}
193
- onTouchStart={onCloseMouseDown}>
171
+ onPointerDown={onClosePointerDown}
172
+ onClick={onClose}>
194
173
  {(typeof icons.close === "function") ? icons.close(node) : icons.close}
195
174
  </div>
196
175
  );
@@ -201,12 +180,14 @@ export const TabButton = (props: ITabButtonProps) => {
201
180
  ref={selfRef}
202
181
  data-layout-path={path}
203
182
  className={classNames}
204
- onMouseDown={onMouseDown}
205
- onClick={onAuxMouseClick}
183
+ onClick={onClick}
206
184
  onAuxClick={onAuxMouseClick}
207
185
  onContextMenu={onContextMenu}
208
- onTouchStart={onMouseDown}
209
186
  title={node.getHelpText()}
187
+ draggable={true}
188
+ onDragStart={onDragStart}
189
+ onDragEnd={onDragEnd}
190
+ onDoubleClick={onDoubleClick}
210
191
  >
211
192
  {leading}
212
193
  {content}
@@ -1,33 +1,30 @@
1
1
  import * as React from "react";
2
2
  import { TabNode } from "../model/TabNode";
3
- import { IconFactory, ILayoutCallbacks, TitleFactory } from "./Layout";
3
+ import { LayoutInternal } from "./Layout";
4
4
  import { CLASSES } from "../Types";
5
5
  import { getRenderStateEx } from "./Utils";
6
6
 
7
7
  /** @internal */
8
8
  export interface ITabButtonStampProps {
9
9
  node: TabNode;
10
- layout: ILayoutCallbacks;
11
- iconFactory?: IconFactory;
12
- titleFactory?: TitleFactory;
10
+ layout: LayoutInternal;
13
11
  }
14
12
 
15
13
  /** @internal */
16
14
  export const TabButtonStamp = (props: ITabButtonStampProps) => {
17
- const { layout, node, iconFactory, titleFactory } = props;
18
- const selfRef = React.useRef<HTMLDivElement | null>(null);
15
+ const { layout, node } = props;
19
16
 
20
17
  const cm = layout.getClassName;
21
18
 
22
19
  let classNames = cm(CLASSES.FLEXLAYOUT__TAB_BUTTON_STAMP);
23
20
 
24
- const renderState = getRenderStateEx(layout, node, iconFactory, titleFactory);
21
+ const renderState = getRenderStateEx(layout, node);
25
22
 
26
23
  let content = renderState.content ? (
27
24
  <div className={cm(CLASSES.FLEXLAYOUT__TAB_BUTTON_CONTENT)}>
28
25
  {renderState.content}
29
26
  </div>)
30
- : node._getNameForOverflowMenu();
27
+ : node.getNameForOverflowMenu();
31
28
 
32
29
  const leading = renderState.leading ? (
33
30
  <div className={cm(CLASSES.FLEXLAYOUT__TAB_BUTTON_LEADING)}>
@@ -36,7 +33,6 @@ export const TabButtonStamp = (props: ITabButtonStampProps) => {
36
33
 
37
34
  return (
38
35
  <div
39
- ref={selfRef}
40
36
  className={classNames}
41
37
  title={node.getHelpText()}
42
38
  >
@@ -9,12 +9,12 @@ import { Orientation } from "../Orientation";
9
9
  export const useTabOverflow = (
10
10
  node: TabSetNode | BorderNode,
11
11
  orientation: Orientation,
12
- toolbarRef: React.MutableRefObject<HTMLDivElement | null>,
13
- stickyButtonsRef: React.MutableRefObject<HTMLDivElement | null>
12
+ toolbarRef: React.MutableRefObject<HTMLElement | null>,
13
+ stickyButtonsRef: React.MutableRefObject<HTMLElement | null>
14
14
  ) => {
15
15
  const firstRender = React.useRef<boolean>(true);
16
16
  const tabsTruncated = React.useRef<boolean>(false);
17
- const lastRect = React.useRef<Rect>(new Rect(0, 0, 0, 0));
17
+ const lastRect = React.useRef<Rect>(Rect.empty());
18
18
  const selfRef = React.useRef<HTMLDivElement | null>(null);
19
19
 
20
20
  const [position, setPosition] = React.useState<number>(0);
@@ -28,10 +28,13 @@ export const useTabOverflow = (
28
28
  }, [node.getSelectedNode(), node.getRect().width, node.getRect().height]);
29
29
 
30
30
  React.useLayoutEffect(() => {
31
- updateVisibleTabs();
31
+ const nodeRect = node instanceof TabSetNode ? node.getRect() : (node as BorderNode).getTabHeaderRect()!;
32
+ if (nodeRect.width > 0 && nodeRect.height > 0) {
33
+ updateVisibleTabs();
34
+ }
32
35
  });
33
36
 
34
- const instance = selfRef.current;
37
+ const instance = toolbarRef.current;
35
38
  React.useEffect(() => {
36
39
  if (!instance) {
37
40
  return;
@@ -109,10 +112,12 @@ export const useTabOverflow = (
109
112
  // when selected tab is larger than available space then align left
110
113
  if (getSize(selectedRect) + 2 * tabMargin >= endPos - getNear(nodeRect)) {
111
114
  shiftPos = getNear(nodeRect) - selectedStart;
115
+ // console.log("shiftPos1", shiftPos, getNear(nodeRect), selectedStart);
112
116
  } else {
113
117
  if (selectedEnd > endPos || selectedStart < getNear(nodeRect)) {
114
118
  if (selectedStart < getNear(nodeRect)) {
115
119
  shiftPos = getNear(nodeRect) - selectedStart;
120
+ // console.log("shiftPos2", shiftPos, getNear(nodeRect), selectedStart);
116
121
  }
117
122
  // use second if statement to prevent tab moving back then forwards if not enough space for single tab
118
123
  if (selectedEnd + shiftPos > endPos) {
@@ -124,6 +129,7 @@ export const useTabOverflow = (
124
129
 
125
130
  const extraSpace = Math.max(0, endPos - (getFar(lastChild.getTabRect()!) + tabMargin + shiftPos));
126
131
  const newPosition = Math.min(0, position + shiftPos + extraSpace);
132
+ // console.log("newPosition", newPosition, position, shiftPos, extraSpace);
127
133
 
128
134
  // find hidden tabs
129
135
  const diff = newPosition - position;
@@ -135,12 +141,11 @@ export const useTabOverflow = (
135
141
  }
136
142
  }
137
143
 
138
- if (hidden.length > 0) {
139
- tabsTruncated.current = true;
140
- }
144
+ tabsTruncated.current = hidden.length > 0;
141
145
 
142
146
  firstRender.current = false; // need to do a second render
143
147
  setHiddenTabs(hidden);
148
+ // console.log(newPosition);
144
149
  setPosition(newPosition);
145
150
  }
146
151
  } else {
@@ -148,7 +153,7 @@ export const useTabOverflow = (
148
153
  }
149
154
  };
150
155
 
151
- const onMouseWheel = (event: React.WheelEvent<HTMLDivElement>) => {
156
+ const onMouseWheel = (event: React.WheelEvent<HTMLElement>) => {
152
157
  let delta = 0;
153
158
  if (Math.abs(event.deltaX) > Math.abs(event.deltaY)) {
154
159
  delta = -event.deltaX;