flexlayout-react 0.8.6 → 0.8.8
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/ChangeLog.txt +9 -0
- package/README.md +49 -0
- package/declarations/Rect.d.ts +2 -0
- package/declarations/view/Layout.d.ts +1 -1
- package/dist/flexlayout.js +6 -6
- package/dist/flexlayout_min.js +1 -1
- package/lib/Rect.js +6 -0
- package/lib/Rect.js.map +1 -1
- package/lib/view/BorderTabSet.js +5 -6
- package/lib/view/BorderTabSet.js.map +1 -1
- package/lib/view/Layout.js +1 -1
- package/lib/view/PopupMenu.js +14 -1
- package/lib/view/PopupMenu.js.map +1 -1
- package/lib/view/TabOverflowHook.js +55 -52
- package/lib/view/TabOverflowHook.js.map +1 -1
- package/lib/view/TabSet.js +4 -4
- package/lib/view/TabSet.js.map +1 -1
- package/package.json +1 -2
- package/src/Rect.ts +8 -0
- package/src/view/BorderTabSet.tsx +5 -6
- package/src/view/Layout.tsx +1 -1
- package/src/view/PopupMenu.tsx +18 -0
- package/src/view/TabOverflowHook.tsx +63 -60
- package/src/view/TabSet.tsx +4 -4
- package/style/_base.scss +1 -0
- package/style/_themes.scss +3 -6
- package/style/combined.css +4 -6
- package/style/combined.css.map +1 -1
- package/style/dark.css +705 -704
- package/style/dark.css.map +1 -1
- package/style/gray.css +708 -707
- package/style/gray.css.map +1 -1
- package/style/light.css +682 -681
- package/style/light.css.map +1 -1
- package/style/rounded.css +4 -6
- package/style/rounded.css.map +1 -1
- package/style/underline.css +711 -710
- package/style/underline.css.map +1 -1
|
@@ -11,7 +11,6 @@ import { useTabOverflow } from "./TabOverflowHook";
|
|
|
11
11
|
import { Orientation } from "../Orientation";
|
|
12
12
|
import { CLASSES } from "../Types";
|
|
13
13
|
import { isAuxMouseEvent } from "./Utils";
|
|
14
|
-
import { Rect } from "../Rect";
|
|
15
14
|
|
|
16
15
|
/** @internal */
|
|
17
16
|
export interface IBorderTabSetProps {
|
|
@@ -33,10 +32,10 @@ export const BorderTabSet = (props: IBorderTabSetProps) => {
|
|
|
33
32
|
const icons = layout.getIcons();
|
|
34
33
|
|
|
35
34
|
React.useLayoutEffect(() => {
|
|
36
|
-
border.setTabHeaderRect(
|
|
35
|
+
border.setTabHeaderRect(layout.getBoundingClientRect(selfRef.current!));
|
|
37
36
|
});
|
|
38
37
|
|
|
39
|
-
const { selfRef, userControlledPositionRef, onScroll, onScrollPointerDown, hiddenTabs, onMouseWheel,
|
|
38
|
+
const { selfRef, userControlledPositionRef, onScroll, onScrollPointerDown, hiddenTabs, onMouseWheel, isDockStickyButtons, isShowHiddenTabs } =
|
|
40
39
|
useTabOverflow(layout, border, Orientation.flip(border.getOrientation()), tabStripInnerRef, miniScrollRef,
|
|
41
40
|
layout.getClassName(CLASSES.FLEXLAYOUT__BORDER_BUTTON)
|
|
42
41
|
);
|
|
@@ -133,7 +132,7 @@ export const BorderTabSet = (props: IBorderTabSetProps) => {
|
|
|
133
132
|
}
|
|
134
133
|
|
|
135
134
|
if (stickyButtons.length > 0) {
|
|
136
|
-
if (
|
|
135
|
+
if (isDockStickyButtons) {
|
|
137
136
|
buttons = [...stickyButtons, ...buttons];
|
|
138
137
|
} else {
|
|
139
138
|
tabButtons.push(<div
|
|
@@ -148,7 +147,7 @@ export const BorderTabSet = (props: IBorderTabSetProps) => {
|
|
|
148
147
|
}
|
|
149
148
|
}
|
|
150
149
|
|
|
151
|
-
if (
|
|
150
|
+
if (isShowHiddenTabs) {
|
|
152
151
|
const overflowTitle = layout.i18nName(I18nLabel.Overflow_Menu_Tooltip);
|
|
153
152
|
let overflowContent;
|
|
154
153
|
if (typeof icons.more === "function") {
|
|
@@ -158,7 +157,7 @@ export const BorderTabSet = (props: IBorderTabSetProps) => {
|
|
|
158
157
|
} else {
|
|
159
158
|
overflowContent = (<>
|
|
160
159
|
{icons.more}
|
|
161
|
-
<div className={cm(CLASSES.FLEXLAYOUT__TAB_BUTTON_OVERFLOW_COUNT)}>{hiddenTabs.length}</div>
|
|
160
|
+
<div className={cm(CLASSES.FLEXLAYOUT__TAB_BUTTON_OVERFLOW_COUNT)}>{hiddenTabs.length>0?hiddenTabs.length: ""}</div>
|
|
162
161
|
</>);
|
|
163
162
|
}
|
|
164
163
|
buttons.splice(Math.min(renderState.overflowPosition, buttons.length), 0,
|
package/src/view/Layout.tsx
CHANGED
|
@@ -1228,7 +1228,7 @@ export class LayoutInternal extends React.Component<ILayoutInternalProps, ILayou
|
|
|
1228
1228
|
// *************************** End Drag Drop *************************************
|
|
1229
1229
|
}
|
|
1230
1230
|
|
|
1231
|
-
export const FlexLayoutVersion = "0.8.
|
|
1231
|
+
export const FlexLayoutVersion = "0.8.8";
|
|
1232
1232
|
|
|
1233
1233
|
export type DragRectRenderCallback = (
|
|
1234
1234
|
content: React.ReactNode | undefined,
|
package/src/view/PopupMenu.tsx
CHANGED
|
@@ -5,6 +5,7 @@ import { LayoutInternal } from "./Layout";
|
|
|
5
5
|
import { TabButtonStamp } from "./TabButtonStamp";
|
|
6
6
|
import { TabSetNode } from "../model/TabSetNode";
|
|
7
7
|
import { BorderNode } from "../model/BorderNode";
|
|
8
|
+
import { useEffect, useRef } from "react";
|
|
8
9
|
|
|
9
10
|
/** @internal */
|
|
10
11
|
export function showPopup(
|
|
@@ -86,6 +87,14 @@ interface IPopupMenuProps {
|
|
|
86
87
|
/** @internal */
|
|
87
88
|
const PopupMenu = (props: IPopupMenuProps) => {
|
|
88
89
|
const { parentNode, items, onHide, onSelect, classNameMapper, layout } = props;
|
|
90
|
+
const divRef = useRef<HTMLDivElement>(null);
|
|
91
|
+
|
|
92
|
+
useEffect(() => {
|
|
93
|
+
// Set focus when the component mounts
|
|
94
|
+
if (divRef.current) {
|
|
95
|
+
divRef.current.focus();
|
|
96
|
+
}
|
|
97
|
+
}, []);
|
|
89
98
|
|
|
90
99
|
const onItemClick = (item: { index: number; node: TabNode }, event: React.MouseEvent<HTMLElement, MouseEvent>) => {
|
|
91
100
|
onSelect(item);
|
|
@@ -106,6 +115,12 @@ const PopupMenu = (props: IPopupMenuProps) => {
|
|
|
106
115
|
layout.clearDragMain();
|
|
107
116
|
};
|
|
108
117
|
|
|
118
|
+
const handleKeyDown = (event: React.KeyboardEvent) => {
|
|
119
|
+
if (event.key === "Escape") {
|
|
120
|
+
onHide();
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
|
|
109
124
|
const itemElements = items.map((item, i) => {
|
|
110
125
|
let classes = classNameMapper(CLASSES.FLEXLAYOUT__POPUP_MENU_ITEM);
|
|
111
126
|
if (parentNode.getSelected() === item.index) {
|
|
@@ -131,6 +146,9 @@ const PopupMenu = (props: IPopupMenuProps) => {
|
|
|
131
146
|
|
|
132
147
|
return (
|
|
133
148
|
<div className={classNameMapper(CLASSES.FLEXLAYOUT__POPUP_MENU)}
|
|
149
|
+
ref={divRef}
|
|
150
|
+
tabIndex={0} // Make div focusable
|
|
151
|
+
onKeyDown={handleKeyDown}
|
|
134
152
|
data-layout-path="/popup-menu"
|
|
135
153
|
>
|
|
136
154
|
{itemElements}
|
|
@@ -5,6 +5,7 @@ import { Orientation } from "../Orientation";
|
|
|
5
5
|
import { LayoutInternal } from "./Layout";
|
|
6
6
|
import { TabNode } from "../model/TabNode";
|
|
7
7
|
import { startDrag } from "./Utils";
|
|
8
|
+
import { Rect } from "../Rect";
|
|
8
9
|
|
|
9
10
|
/** @internal */
|
|
10
11
|
export const useTabOverflow = (
|
|
@@ -16,47 +17,66 @@ export const useTabOverflow = (
|
|
|
16
17
|
tabClassName: string
|
|
17
18
|
) => {
|
|
18
19
|
const [hiddenTabs, setHiddenTabs] = React.useState<number[]>([]);
|
|
19
|
-
const [
|
|
20
|
+
const [isShowHiddenTabs, setShowHiddenTabs] = React.useState<boolean>(false);
|
|
21
|
+
const [isDockStickyButtons, setDockStickyButtons] = React.useState<boolean>(false);
|
|
20
22
|
|
|
21
23
|
const selfRef = React.useRef<HTMLDivElement | null>(null);
|
|
22
24
|
const userControlledPositionRef = React.useRef<boolean>(false);
|
|
23
25
|
const updateHiddenTabsTimerRef = React.useRef<NodeJS.Timeout | undefined>(undefined);
|
|
24
26
|
const hiddenTabsRef = React.useRef<number[]>([]);
|
|
25
27
|
const thumbInternalPos = React.useRef<number>(0);
|
|
28
|
+
const repositioningRef = React.useRef<boolean>(false);
|
|
26
29
|
hiddenTabsRef.current = hiddenTabs;
|
|
27
30
|
|
|
28
31
|
// if node changes (new model) then reset scroll to 0
|
|
29
|
-
React.
|
|
32
|
+
React.useLayoutEffect(() => {
|
|
30
33
|
if (tabStripRef.current) {
|
|
31
34
|
setScrollPosition(0);
|
|
32
35
|
}
|
|
33
36
|
}, [node]);
|
|
34
|
-
|
|
37
|
+
|
|
35
38
|
// if selected node or tabset/border rectangle change then unset usercontrolled (so selected tab will be kept in view)
|
|
36
|
-
React.
|
|
39
|
+
React.useLayoutEffect(() => {
|
|
37
40
|
userControlledPositionRef.current = false;
|
|
38
41
|
}, [node.getSelectedNode(), node.getRect().width, node.getRect().height]);
|
|
39
42
|
|
|
40
|
-
React.
|
|
43
|
+
React.useLayoutEffect(() => {
|
|
41
44
|
checkForOverflow(); // if tabs + sticky buttons length > scroll area => move sticky buttons to right buttons
|
|
42
45
|
|
|
43
|
-
if (
|
|
44
|
-
|
|
45
|
-
if (selectedTab) {
|
|
46
|
-
selectedTab.scrollIntoView();
|
|
47
|
-
}
|
|
46
|
+
if (userControlledPositionRef.current === false) {
|
|
47
|
+
scrollIntoView();
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
-
updateHiddenTabs();
|
|
51
50
|
updateScrollMetrics();
|
|
51
|
+
updateHiddenTabs();
|
|
52
52
|
});
|
|
53
53
|
|
|
54
|
+
function scrollIntoView() {
|
|
55
|
+
const selectedTabNode = node.getSelectedNode() as TabNode;
|
|
56
|
+
if (selectedTabNode && tabStripRef.current) {
|
|
57
|
+
const stripRect = layout.getBoundingClientRect(tabStripRef.current);
|
|
58
|
+
const selectedRect = selectedTabNode.getTabRect()!;
|
|
59
|
+
|
|
60
|
+
let shift = getNear(stripRect) - getNear(selectedRect);
|
|
61
|
+
if (shift > 0 || getSize(selectedRect) > getSize(stripRect)) {
|
|
62
|
+
setScrollPosition(getScrollPosition(tabStripRef.current) - shift);
|
|
63
|
+
repositioningRef.current = true; // prevent onScroll setting userControlledPosition
|
|
64
|
+
} else {
|
|
65
|
+
shift = getFar(selectedRect) - getFar(stripRect);
|
|
66
|
+
if (shift > 0) {
|
|
67
|
+
setScrollPosition(getScrollPosition(tabStripRef.current) + shift);
|
|
68
|
+
repositioningRef.current = true;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
54
74
|
const updateScrollMetrics = () => {
|
|
55
75
|
if (tabStripRef.current && miniScrollRef.current) {
|
|
56
76
|
const t = tabStripRef.current;
|
|
57
77
|
const s = miniScrollRef.current;
|
|
58
78
|
|
|
59
|
-
const size =
|
|
79
|
+
const size = getElementSize(t);
|
|
60
80
|
const scrollSize = getScrollSize(t);
|
|
61
81
|
const position = getScrollPosition(t);
|
|
62
82
|
|
|
@@ -67,7 +87,7 @@ export const useTabOverflow = (
|
|
|
67
87
|
adjust = 20 - thumbSize;
|
|
68
88
|
thumbSize = 20;
|
|
69
89
|
}
|
|
70
|
-
const thumbPos = position * (size - adjust) / scrollSize;
|
|
90
|
+
const thumbPos = position * (size - adjust) / scrollSize;
|
|
71
91
|
if (orientation === Orientation.HORZ) {
|
|
72
92
|
s.style.width = thumbSize + "px";
|
|
73
93
|
s.style.left = thumbPos + "px";
|
|
@@ -89,6 +109,13 @@ export const useTabOverflow = (
|
|
|
89
109
|
}
|
|
90
110
|
|
|
91
111
|
const updateHiddenTabs = () => {
|
|
112
|
+
const newHiddenTabs = findHiddenTabs();
|
|
113
|
+
const showHidden = newHiddenTabs.length > 0;
|
|
114
|
+
|
|
115
|
+
if (showHidden !== isShowHiddenTabs) {
|
|
116
|
+
setShowHiddenTabs(showHidden);
|
|
117
|
+
}
|
|
118
|
+
|
|
92
119
|
if (updateHiddenTabsTimerRef.current === undefined) {
|
|
93
120
|
// throttle updates to prevent Maximum update depth exceeded error
|
|
94
121
|
updateHiddenTabsTimerRef.current = setTimeout(() => {
|
|
@@ -102,25 +129,11 @@ export const useTabOverflow = (
|
|
|
102
129
|
}
|
|
103
130
|
}
|
|
104
131
|
|
|
105
|
-
const updateTabRects = () => {
|
|
106
|
-
if (tabStripRef.current) {
|
|
107
|
-
const tabContainer = tabStripRef.current.firstElementChild!;
|
|
108
|
-
|
|
109
|
-
const nodeChildren = node.getChildren();
|
|
110
|
-
let i = 0;
|
|
111
|
-
Array.from(tabContainer.children).forEach((child) => {
|
|
112
|
-
if (child.classList.contains(tabClassName)) {
|
|
113
|
-
const childNode = nodeChildren[i] as TabNode;
|
|
114
|
-
childNode.setTabRect(layout.getBoundingClientRect(child as HTMLElement));
|
|
115
|
-
i++;
|
|
116
|
-
}
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
132
|
const onScroll = () => {
|
|
122
|
-
|
|
123
|
-
|
|
133
|
+
if (!repositioningRef.current){
|
|
134
|
+
userControlledPositionRef.current=true;
|
|
135
|
+
}
|
|
136
|
+
repositioningRef.current = false;
|
|
124
137
|
updateScrollMetrics()
|
|
125
138
|
updateHiddenTabs();
|
|
126
139
|
};
|
|
@@ -134,7 +147,6 @@ export const useTabOverflow = (
|
|
|
134
147
|
} else {
|
|
135
148
|
thumbInternalPos.current = event.clientY - r.y;
|
|
136
149
|
}
|
|
137
|
-
userControlledPositionRef.current = true;
|
|
138
150
|
startDrag(event.currentTarget.ownerDocument, event, onDragMove, onDragEnd, onDragCancel);
|
|
139
151
|
}
|
|
140
152
|
|
|
@@ -142,9 +154,9 @@ export const useTabOverflow = (
|
|
|
142
154
|
if (tabStripRef.current && miniScrollRef.current) {
|
|
143
155
|
const t = tabStripRef.current;
|
|
144
156
|
const s = miniScrollRef.current;
|
|
145
|
-
const size =
|
|
157
|
+
const size = getElementSize(t);
|
|
146
158
|
const scrollSize = getScrollSize(t);
|
|
147
|
-
const thumbSize =
|
|
159
|
+
const thumbSize = getElementSize(s);
|
|
148
160
|
|
|
149
161
|
const r = t.getBoundingClientRect()!;
|
|
150
162
|
let thumb = 0;
|
|
@@ -168,29 +180,15 @@ export const useTabOverflow = (
|
|
|
168
180
|
const onDragCancel = () => {
|
|
169
181
|
}
|
|
170
182
|
|
|
171
|
-
const findSelectedTab: () => Element | undefined = () => {
|
|
172
|
-
let found: Element | undefined = undefined;
|
|
173
|
-
if (tabStripRef.current) {
|
|
174
|
-
const tabContainer = tabStripRef.current.firstElementChild!;
|
|
175
|
-
|
|
176
|
-
Array.from(tabContainer.children).forEach((child) => {
|
|
177
|
-
if (child.classList.contains(tabClassName + "--selected")) {
|
|
178
|
-
found = child;
|
|
179
|
-
}
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
return found;
|
|
183
|
-
};
|
|
184
|
-
|
|
185
183
|
const checkForOverflow = () => {
|
|
186
184
|
if (tabStripRef.current) {
|
|
187
185
|
const strip = tabStripRef.current;
|
|
188
186
|
const tabContainer = strip.firstElementChild!;
|
|
189
187
|
|
|
190
|
-
const offset =
|
|
191
|
-
const dock = (
|
|
192
|
-
if (dock !==
|
|
193
|
-
|
|
188
|
+
const offset = isDockStickyButtons ? 10 : 0; // prevents flashing, after sticky buttons docked set, must be 10 pixels smaller before unsetting
|
|
189
|
+
const dock = (getElementSize(tabContainer) + offset) > getElementSize(tabStripRef.current);
|
|
190
|
+
if (dock !== isDockStickyButtons) {
|
|
191
|
+
setDockStickyButtons(dock);
|
|
194
192
|
}
|
|
195
193
|
}
|
|
196
194
|
}
|
|
@@ -233,12 +231,9 @@ export const useTabOverflow = (
|
|
|
233
231
|
delta *= 40;
|
|
234
232
|
}
|
|
235
233
|
const newPos = getScrollPosition(tabStripRef.current) - delta;
|
|
236
|
-
const maxScroll = getScrollSize(tabStripRef.current) -
|
|
234
|
+
const maxScroll = getScrollSize(tabStripRef.current) - getElementSize(tabStripRef.current);
|
|
237
235
|
const p = Math.max(0, Math.min(maxScroll, newPos));
|
|
238
236
|
setScrollPosition(p);
|
|
239
|
-
updateTabRects();
|
|
240
|
-
updateHiddenTabs();
|
|
241
|
-
userControlledPositionRef.current = true;
|
|
242
237
|
event.stopPropagation();
|
|
243
238
|
}
|
|
244
239
|
}
|
|
@@ -246,7 +241,7 @@ export const useTabOverflow = (
|
|
|
246
241
|
|
|
247
242
|
// orientation helpers:
|
|
248
243
|
|
|
249
|
-
const getNear = (rect: DOMRect) => {
|
|
244
|
+
const getNear = (rect: DOMRect | Rect) => {
|
|
250
245
|
if (orientation === Orientation.HORZ) {
|
|
251
246
|
return rect.x;
|
|
252
247
|
} else {
|
|
@@ -254,7 +249,7 @@ export const useTabOverflow = (
|
|
|
254
249
|
}
|
|
255
250
|
};
|
|
256
251
|
|
|
257
|
-
const getFar = (rect: DOMRect) => {
|
|
252
|
+
const getFar = (rect: DOMRect | Rect) => {
|
|
258
253
|
if (orientation === Orientation.HORZ) {
|
|
259
254
|
return rect.right;
|
|
260
255
|
} else {
|
|
@@ -262,7 +257,7 @@ export const useTabOverflow = (
|
|
|
262
257
|
}
|
|
263
258
|
};
|
|
264
259
|
|
|
265
|
-
const
|
|
260
|
+
const getElementSize = (elm: Element) => {
|
|
266
261
|
if (orientation === Orientation.HORZ) {
|
|
267
262
|
return elm.clientWidth;
|
|
268
263
|
} else {
|
|
@@ -270,6 +265,14 @@ export const useTabOverflow = (
|
|
|
270
265
|
}
|
|
271
266
|
}
|
|
272
267
|
|
|
268
|
+
const getSize = (rect: DOMRect | Rect) => {
|
|
269
|
+
if (orientation === Orientation.HORZ) {
|
|
270
|
+
return rect.width;
|
|
271
|
+
} else {
|
|
272
|
+
return rect.height;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
273
276
|
const getScrollSize = (elm: Element) => {
|
|
274
277
|
if (orientation === Orientation.HORZ) {
|
|
275
278
|
return elm.scrollWidth;
|
|
@@ -294,7 +297,7 @@ export const useTabOverflow = (
|
|
|
294
297
|
}
|
|
295
298
|
}
|
|
296
299
|
|
|
297
|
-
return { selfRef, userControlledPositionRef, onScroll, onScrollPointerDown, hiddenTabs, onMouseWheel,
|
|
300
|
+
return { selfRef, userControlledPositionRef, onScroll, onScrollPointerDown, hiddenTabs, onMouseWheel, isDockStickyButtons, isShowHiddenTabs };
|
|
298
301
|
};
|
|
299
302
|
|
|
300
303
|
function arraysEqual(arr1: number[], arr2: number[]) {
|
package/src/view/TabSet.tsx
CHANGED
|
@@ -51,7 +51,7 @@ export const TabSet = (props: ITabSetProps) => {
|
|
|
51
51
|
});
|
|
52
52
|
|
|
53
53
|
// this must be after the useEffect, so the node rect is already set (else window popin will not position tabs correctly)
|
|
54
|
-
const { selfRef, userControlledPositionRef, onScroll, onScrollPointerDown, hiddenTabs, onMouseWheel,
|
|
54
|
+
const { selfRef, userControlledPositionRef, onScroll, onScrollPointerDown, hiddenTabs, onMouseWheel, isDockStickyButtons, isShowHiddenTabs } =
|
|
55
55
|
useTabOverflow(layout, node, Orientation.HORZ, tabStripInnerRef, miniScrollRef,
|
|
56
56
|
layout.getClassName(CLASSES.FLEXLAYOUT__TAB_BUTTON));
|
|
57
57
|
|
|
@@ -186,7 +186,7 @@ export const TabSet = (props: ITabSetProps) => {
|
|
|
186
186
|
}
|
|
187
187
|
|
|
188
188
|
if (stickyButtons.length > 0) {
|
|
189
|
-
if (!node.isEnableTabWrap() && (
|
|
189
|
+
if (!node.isEnableTabWrap() && (isDockStickyButtons || isTabStretch)) {
|
|
190
190
|
buttons = [...stickyButtons, ...buttons];
|
|
191
191
|
} else {
|
|
192
192
|
tabs.push(<div
|
|
@@ -202,7 +202,7 @@ export const TabSet = (props: ITabSetProps) => {
|
|
|
202
202
|
}
|
|
203
203
|
|
|
204
204
|
if (!node.isEnableTabWrap()) {
|
|
205
|
-
if (
|
|
205
|
+
if (isShowHiddenTabs) {
|
|
206
206
|
const overflowTitle = layout.i18nName(I18nLabel.Overflow_Menu_Tooltip);
|
|
207
207
|
let overflowContent;
|
|
208
208
|
if (typeof icons.more === "function") {
|
|
@@ -211,7 +211,7 @@ export const TabSet = (props: ITabSetProps) => {
|
|
|
211
211
|
} else {
|
|
212
212
|
overflowContent = (<>
|
|
213
213
|
{icons.more}
|
|
214
|
-
<div className={cm(CLASSES.FLEXLAYOUT__TAB_BUTTON_OVERFLOW_COUNT)}>{hiddenTabs.length}</div>
|
|
214
|
+
<div className={cm(CLASSES.FLEXLAYOUT__TAB_BUTTON_OVERFLOW_COUNT)}>{hiddenTabs.length>0?hiddenTabs.length: ""}</div>
|
|
215
215
|
</>);
|
|
216
216
|
}
|
|
217
217
|
buttons.splice(Math.min(renderState.overflowPosition, buttons.length), 0,
|
package/style/_base.scss
CHANGED
package/style/_themes.scss
CHANGED
|
@@ -559,9 +559,9 @@
|
|
|
559
559
|
--color-border-tab-unselected: gray;
|
|
560
560
|
--color-border-tab-unselected-background: #d3d4e745;
|
|
561
561
|
|
|
562
|
-
--color-splitter:
|
|
563
|
-
--color-splitter-hover: var(--color-
|
|
564
|
-
--color-splitter-drag: var(--color-
|
|
562
|
+
--color-splitter: var(--color-background);
|
|
563
|
+
--color-splitter-hover: var(--color-2);
|
|
564
|
+
--color-splitter-drag: var(--color-2);
|
|
565
565
|
|
|
566
566
|
--color-drag-rect-border: #ccc;
|
|
567
567
|
--color-drag-rect-background: var(--color-5);
|
|
@@ -642,8 +642,5 @@
|
|
|
642
642
|
background-color: var(--color-3);
|
|
643
643
|
}
|
|
644
644
|
|
|
645
|
-
&__splitter {
|
|
646
|
-
background-color: transparent;
|
|
647
|
-
}
|
|
648
645
|
}
|
|
649
646
|
}
|
package/style/combined.css
CHANGED
|
@@ -267,9 +267,9 @@
|
|
|
267
267
|
--color-border-tab-selected-background: var(--color-2);
|
|
268
268
|
--color-border-tab-unselected: gray;
|
|
269
269
|
--color-border-tab-unselected-background: #d3d4e745;
|
|
270
|
-
--color-splitter:
|
|
271
|
-
--color-splitter-hover: var(--color-
|
|
272
|
-
--color-splitter-drag: var(--color-
|
|
270
|
+
--color-splitter: var(--color-background);
|
|
271
|
+
--color-splitter-hover: var(--color-2);
|
|
272
|
+
--color-splitter-drag: var(--color-2);
|
|
273
273
|
--color-drag-rect-border: #ccc;
|
|
274
274
|
--color-drag-rect-background: var(--color-5);
|
|
275
275
|
--color-drag-rect: var(--color-text);
|
|
@@ -356,6 +356,7 @@
|
|
|
356
356
|
background-color: var(--color-splitter-hover);
|
|
357
357
|
transition: background-color ease-in 0.1s;
|
|
358
358
|
transition-delay: 0.05s;
|
|
359
|
+
border-radius: 5px;
|
|
359
360
|
}
|
|
360
361
|
}
|
|
361
362
|
.flexlayout__splitter_drag {
|
|
@@ -1048,8 +1049,5 @@
|
|
|
1048
1049
|
.flexlayout__theme_rounded .flexlayout__border_button_trailing:hover {
|
|
1049
1050
|
background-color: var(--color-3);
|
|
1050
1051
|
}
|
|
1051
|
-
.flexlayout__theme_rounded .flexlayout__splitter {
|
|
1052
|
-
background-color: transparent;
|
|
1053
|
-
}
|
|
1054
1052
|
|
|
1055
1053
|
/*# sourceMappingURL=combined.css.map */
|
package/style/combined.css.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sourceRoot":"","sources":["_themes.scss","_base.scss","combined.scss"],"names":[],"mappings":"AAqBQ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;;;AA+BJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;;;AA2DJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;;;AAgEJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EAEA;;;AAmEJ;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EAEA;EAEA;;;ACvjBR;AAAA;AAAA;AAII;EAnBJ;EACA;EACA;EACA;EACA;EAiBQ;EACA;;AAEA;EAxBR;EACA;EACA;EACA;EACA;EAsBY;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAGJ;EAtCR;EACA;EACA;EACA;EAqCY;EACA;;AAIR;EA7CJ;EACA;EACA;EACA;EA4CQ;;AAGJ;EAlDJ;EACA;EACA;EACA;EAiDQ;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;IACI;IACA;IACA;;;AAOR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;;AAIR;EACI;EACA;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;
|
|
1
|
+
{"version":3,"sourceRoot":"","sources":["_themes.scss","_base.scss","combined.scss"],"names":[],"mappings":"AAqBQ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;;;AA+BJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;;;AA2DJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;;;AAgEJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EAEA;;;AAmEJ;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EAEA;EAEA;;;ACvjBR;AAAA;AAAA;AAII;EAnBJ;EACA;EACA;EACA;EACA;EAiBQ;EACA;;AAEA;EAxBR;EACA;EACA;EACA;EACA;EAsBY;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAGJ;EAtCR;EACA;EACA;EACA;EAqCY;EACA;;AAIR;EA7CJ;EACA;EACA;EACA;EA4CQ;;AAGJ;EAlDJ;EACA;EACA;EACA;EAiDQ;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;IACI;IACA;IACA;IACA;;;AAOR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;;AAIR;EACI;EACA;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EAzJJ;EACA;EACA;EACA;EAwJQ;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EA1KR;EACA;EACA;EACA;EAyKY;EACA;EACA;;AAGJ;EACI;;AAGJ;EArLR;EACA;EACA;EACA;EAoLY;EACA;EACA;;AAGJ;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAKJ;EAEI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;AAGJ;EAEI;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAMhB;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EAEA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;IACI;;;AAKZ;EACI;EACA;;AAGJ;EACI;IACI;;;AAIR;EACI;EACA;;AASJ;EACI;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;;AAGJ;EACI;EACA;EACA;;AAEA;EACI;;AAQR;EACI;IACI;;;AAIR;EACI;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAIR;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;IACI;;;AAaZ;EACI;EACA;EACA;EACA;;AAKZ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;;AAKZ;EACI;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;AAGJ;EACI;IAEI;;;AAIR;EACI;EACA;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;EACA;EACA;;AAUJ;EACI;IACI;;;AAIR;EACI;;AAIR;EACI;EACA;EACA;;AAEA;EAEI;EACA;EACA;;AAGJ;EAEI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;IACI;;;AAMR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAYhB;EACI;EACA;;AAEA;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAIR;EACI;IACI;;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKJ;EACI;;AAGJ;EAtrBR;EACA;EACA;EACA;EACA;;AAurBI;EA3rBJ;EACA;EACA;EACA;EACA;EAyrBQ;EACA;;AAGJ;EACI;EACA;;AAOJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEA;EACI;IACI;IACA;;;;AAMpB;ACxtBA;AFmEA;AAAA;AAAA;;;AE/DA;AFiKA;AAAA;AAAA;;AAIQ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;;;AE3LZ;AF2RA;AAAA;AAAA;;AAIQ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;;;AEzTZ;AF8ZA;AAAA;AAAA;;AAKQ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EAEI;EACA;EACA;;AAGJ;EACI;;;AE/bZ;AFkiBA;AAAA;AAAA;;AAIQ;EACI;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;;AAGJ;EAEI;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI","file":"combined.css"}
|