flexlayout-react 0.6.6 → 0.6.9

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.
@@ -274,7 +274,10 @@ export class TabSetNode extends Node implements IDraggable, IDropTarget {
274
274
  const outlineRect = this._tabHeaderRect;
275
275
  dropInfo = new DropInfo(this, outlineRect!, dockLocation, -1, CLASSES.FLEXLAYOUT__OUTLINE_RECT);
276
276
  } else if (this._contentRect!.contains(x, y)) {
277
- const dockLocation = DockLocation.getLocation(this._contentRect!, x, y);
277
+ let dockLocation = DockLocation.CENTER;
278
+ if (this._model.getMaximizedTabset() === undefined) {
279
+ dockLocation = DockLocation.getLocation(this._contentRect!, x, y);
280
+ }
278
281
  const outlineRect = dockLocation.getDockRect(this._rect);
279
282
  dropInfo = new DropInfo(this, outlineRect, dockLocation, -1, CLASSES.FLEXLAYOUT__OUTLINE_RECT);
280
283
  } else if (this._tabHeaderRect != null && this._tabHeaderRect.contains(x, y)) {
@@ -97,6 +97,10 @@ export const BorderTabSet = (props: IBorderTabSetProps) => {
97
97
  icons={icons}
98
98
  />
99
99
  );
100
+ tabs.push(
101
+ <div key={"divider" + i} className={cm(CLASSES.FLEXLAYOUT__BORDER_TAB_DIVIDER)}></div>
102
+ );
103
+
100
104
  };
101
105
 
102
106
  for (let i = 0; i < border.getChildren().length; i++) {
@@ -39,6 +39,7 @@ export type ShowOverflowMenuCallback = (
39
39
  items: { index: number; node: TabNode }[],
40
40
  onSelect: (item: { index: number; node: TabNode }) => void,
41
41
  ) => void;
42
+ export type TabSetPlaceHolderCallback = (node: TabSetNode) => React.ReactNode;
42
43
 
43
44
  export interface ILayoutProps {
44
45
  model: Model;
@@ -83,6 +84,7 @@ export interface ILayoutProps {
83
84
  onContextMenu?: NodeMouseEvent;
84
85
  onAuxMouseClick?: NodeMouseEvent;
85
86
  onShowOverflowMenu?: ShowOverflowMenuCallback;
87
+ onTabSetPlaceHolder?: TabSetPlaceHolderCallback;
86
88
  }
87
89
  export interface IFontValues {
88
90
  size?: string;
@@ -93,6 +95,7 @@ export interface IFontValues {
93
95
 
94
96
  export interface ITabSetRenderValues {
95
97
  headerContent?: React.ReactNode;
98
+ centerContent?: React.ReactNode;
96
99
  stickyButtons: React.ReactNode[];
97
100
  buttons: React.ReactNode[];
98
101
  headerButtons: React.ReactNode[];
@@ -187,6 +190,7 @@ export interface ILayoutCallbacks {
187
190
  showPortal: (portal: React.ReactNode, portalDiv: HTMLDivElement) => void;
188
191
  hidePortal: () => void;
189
192
  getShowOverflowMenu(): ShowOverflowMenuCallback | undefined;
193
+ getTabSetPlaceHolderCallback() : TabSetPlaceHolderCallback | undefined;
190
194
  }
191
195
 
192
196
  // Popout windows work in latest browsers based on webkit (Chrome, Opera, Safari, latest Edge) and Firefox. They do
@@ -829,7 +833,7 @@ export class Layout extends React.Component<ILayoutProps, ILayoutState> {
829
833
  onClick?: (event: Event) => void,
830
834
  onDoubleClick?: (event: Event) => void
831
835
  ) => {
832
- if (this.props.model.getMaximizedTabset() !== undefined || !allowDrag) {
836
+ if (!allowDrag) {
833
837
  DragDrop.instance.startDrag(event, undefined, undefined, undefined, undefined, onClick, onDoubleClick, this.currentDocument, this.selfRef.current!);
834
838
  } else {
835
839
  this.dragNode = node;
@@ -907,7 +911,9 @@ export class Layout extends React.Component<ILayoutProps, ILayoutState> {
907
911
  rootdiv.appendChild(this.dragDiv);
908
912
  }
909
913
  // add edge indicators
910
- this.showEdges(rootdiv);
914
+ if (this.props.model.getMaximizedTabset() === undefined) {
915
+ this.showEdges(rootdiv);
916
+ }
911
917
 
912
918
  if (this.dragNode !== undefined && this.dragNode instanceof TabNode && this.dragNode.getTabRect() !== undefined) {
913
919
  this.dragNode.getTabRect()!.positionElement(this.outlineDiv);
@@ -1235,6 +1241,11 @@ export class Layout extends React.Component<ILayoutProps, ILayoutState> {
1235
1241
  getShowOverflowMenu() {
1236
1242
  return this.props.onShowOverflowMenu;
1237
1243
  }
1244
+
1245
+ /** @internal */
1246
+ getTabSetPlaceHolderCallback() {
1247
+ return this.props.onTabSetPlaceHolder;
1248
+ }
1238
1249
  /** @internal */
1239
1250
  showContextMenu(node: TabNode | TabSetNode | BorderNode, event: React.MouseEvent<HTMLElement, MouseEvent>) {
1240
1251
  if (this.props.onContextMenu) {
@@ -67,7 +67,11 @@ export const TabSet = (props: ITabSetProps) => {
67
67
  layout.doAction(Actions.setActiveTabset(node.getId()));
68
68
  if (!layout.getEditingTab()) {
69
69
  const message = layout.i18nName(I18nLabel.Move_Tabset, name);
70
- layout.dragStart(event, message, node, node.isEnableDrag(), (event2: Event) => undefined, onDoubleClick);
70
+ if (node.getModel().getMaximizedTabset() !== undefined) {
71
+ layout.dragStart(event, message, node, false, (event2: Event) => undefined, onDoubleClick);
72
+ } else {
73
+ layout.dragStart(event, message, node, node.isEnableDrag(), (event2: Event) => undefined, onDoubleClick);
74
+ }
71
75
  }
72
76
  }
73
77
  };
@@ -141,8 +145,10 @@ export const TabSet = (props: ITabSetProps) => {
141
145
  iconFactory={iconFactory}
142
146
  titleFactory={titleFactory}
143
147
  icons={icons}
144
- />
145
- );
148
+ />);
149
+ tabs.push(
150
+ <div key={"divider" + i} className={cm(CLASSES.FLEXLAYOUT__TABSET_TAB_DIVIDER)}></div>
151
+ );
146
152
  }
147
153
  }
148
154
 
@@ -327,12 +333,6 @@ export const TabSet = (props: ITabSetProps) => {
327
333
  }
328
334
 
329
335
  const tabStripStyle: { [key: string]: string } = { height: node.getTabStripHeight() + "px" };
330
- if (node.getTabLocation() === "top") {
331
- const top = showHeader ? node.getHeaderHeight() + "px" : "0px";
332
- tabStripStyle["top"] = top;
333
- } else {
334
- tabStripStyle["bottom"] = "0px";
335
- }
336
336
  tabStrip = (
337
337
  <div className={tabStripClasses} style={tabStripStyle}
338
338
  data-layout-path={path + "/tabstrip"}
@@ -355,6 +355,25 @@ export const TabSet = (props: ITabSetProps) => {
355
355
 
356
356
  style = layout.styleFont(style);
357
357
 
358
+ var placeHolder: React.ReactNode = undefined;
359
+ if (node.getChildren().length === 0) {
360
+ const placeHolderCallback = layout.getTabSetPlaceHolderCallback();
361
+ if (placeHolderCallback) {
362
+ placeHolder = placeHolderCallback(node);
363
+ }
364
+ }
365
+
366
+ const center = <div className={cm(CLASSES.FLEXLAYOUT__TABSET_CONTENT)}>
367
+ {placeHolder}
368
+ </div>
369
+
370
+ var content;
371
+ if (node.getTabLocation() === "top") {
372
+ content = <>{header}{tabStrip}{center}</>;
373
+ } else {
374
+ content = <>{header}{center}{tabStrip}</>;
375
+ }
376
+
358
377
  return (
359
378
  <div ref={selfRef}
360
379
  dir="ltr"
@@ -362,8 +381,7 @@ export const TabSet = (props: ITabSetProps) => {
362
381
  style={style}
363
382
  className={cm(CLASSES.FLEXLAYOUT__TABSET)}
364
383
  onWheel={onMouseWheel}>
365
- {header}
366
- {tabStrip}
384
+ {content}
367
385
  </div>
368
386
  );
369
387
  };
package/style/_base.scss CHANGED
@@ -8,32 +8,17 @@
8
8
 
9
9
  .flexlayout {
10
10
  &__layout {
11
- --color-text: #{$color_text};
12
- --color-background: #{$color_background};
13
- --color-base: #{$color_base};
14
- --color-1: #{$color_1};
15
- --color-2: #{$color_2};
16
- --color-3: #{$color_3};
17
- --color-4: #{$color_4};
18
- --color-5: #{$color_5};
19
- --color-6: #{$color_6};
20
- --color-drag1: #{$color_drag1};
21
- --color-drag2: #{$color_drag2};
22
- --color-drag1-background: #{$color_drag1_background};
23
- --color-drag2-background: #{$color_drag2_background};
24
-
25
- --font-size: #{$font-size};
26
- --font-family: #{$font-family};
27
-
28
11
  @include absoluteFill;
29
12
  overflow: hidden;
30
13
  }
31
14
 
32
15
  &__splitter {
16
+ background-color: var(--color-splitter);
33
17
  @include splitter_mixin;
34
18
 
35
19
  @media (hover: hover) {
36
20
  &:hover {
21
+ background-color: var(--color-splitter-hover);
37
22
  transition: background-color ease-in .1s;
38
23
  transition-delay: 0.05s;
39
24
  @include splitter_hover_mixin;
@@ -45,6 +30,7 @@
45
30
  }
46
31
  &_drag {
47
32
  z-index: 1000;
33
+ background-color: var(--color-splitter-drag);
48
34
  @include splitter_drag_mixin;
49
35
  }
50
36
  &_extra {
@@ -75,17 +61,17 @@
75
61
  position: absolute;
76
62
  z-index: 1000;
77
63
  box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2);
78
- background-color: gray;
64
+ background-color: var(--color-edge-marker);
79
65
  pointer-events: none;
80
66
  }
81
67
 
82
68
  &__drag_rect {
83
69
  position: absolute;
84
70
  cursor: move;
85
- color: var(--color-text);
86
- background-color: var(--color-1);
87
- border: 2px solid var(--color-4);
88
- box-shadow: inset 0 0 60px rgba(0, 0, 0, 0.3);
71
+ color: var(--color-drag-rect);
72
+ background-color: var(--color-drag-rect-background);
73
+ border: 2px solid var(--color-drag-rect-border);
74
+ // box-shadow: inset 0 0 60px rgba(0, 0, 0, 0.3);
89
75
  border-radius: 5px;
90
76
  z-index: 1000;
91
77
  box-sizing: border-box;
@@ -96,31 +82,43 @@
96
82
  justify-content: center;
97
83
  flex-direction: column;
98
84
  overflow: hidden;
99
- padding: 0.5em 1em;
85
+ padding: 0.3em 1em;
100
86
  word-wrap: break-word;
101
87
  font-size: var(--font-size);
102
88
  font-family: var(--font-family);
103
89
  }
104
90
 
105
91
  &__tabset {
92
+ display: flex;
93
+ flex-direction: column;
106
94
  overflow: hidden;
107
- background-color: var(--color-1);
95
+ background-color: var(--color-tabset-background);
108
96
  box-sizing: border-box;
109
97
  font-size: var(--font-size);
110
98
  font-family: var(--font-family);
111
99
  @include tabset_mixin;
112
100
 
101
+ &_tab_divider {
102
+ width: 4px;
103
+ @include tabset_tab_divider_mixin;
104
+ }
105
+
106
+ &_content {
107
+ display: flex;
108
+ flex-grow: 1;
109
+ align-items: center;
110
+ justify-content: center;
111
+ }
112
+
113
113
  &_header {
114
114
  // tabset header bar
115
- position: absolute;
116
115
  display: flex;
117
116
  align-items: center;
118
- left: 0;
119
- right: 0;
120
117
  padding: 3px 3px 3px 5px;
121
118
  box-sizing: border-box;
122
- border-bottom: 1px solid var(--color-3);
123
- color: var(--color-text);
119
+ border-bottom: 1px solid var(--color-tabset-divider-line);
120
+ color: var(--color-tabset-header);
121
+ background-color: var(--color-tabset-header-background);
124
122
  @include tabset_header_mixin;
125
123
 
126
124
  &_content {
@@ -132,21 +130,18 @@
132
130
  &_outer {
133
131
  // tabset tabbar outer
134
132
  box-sizing: border-box;
135
- background-color: var(--color-1);
136
- position: absolute;
137
- left: 0;
138
- right: 0;
133
+ background-color: var(--color-tabset-background);
139
134
  overflow: hidden;
140
135
  display: flex;
141
136
  @include tabset_tabbar_mixin;
142
137
  }
143
138
 
144
139
  &_outer_top {
145
- border-bottom: 1px solid var(--color-3);
140
+ border-bottom: 1px solid var(--color-tabset-divider-line);
146
141
  }
147
142
 
148
143
  &_outer_bottom {
149
- border-top: 1px solid var(--color-3);
144
+ border-top: 1px solid var(--color-tabset-divider-line);
150
145
  }
151
146
 
152
147
  &_inner {
@@ -159,7 +154,6 @@
159
154
 
160
155
  &_tab_container {
161
156
  display: flex;
162
- gap: 4px;
163
157
  padding-left: 4px;
164
158
  padding-right: 4px;
165
159
  box-sizing: border-box;
@@ -179,10 +173,12 @@
179
173
  }
180
174
 
181
175
  &-selected {
176
+ background-color: var(--color-tabset-background-selected);
182
177
  @include tabset_selected_mixin;
183
178
  }
184
179
 
185
180
  &-maximized {
181
+ background-color: var(--color-tabset-background-maximized);
186
182
  @include tabset_maximized_mixin;
187
183
  }
188
184
  }
@@ -199,8 +195,8 @@
199
195
  overflow: auto;
200
196
  position: absolute;
201
197
  box-sizing: border-box;
202
- color: var(--color-text);
203
198
  background-color: var(--color-background);
199
+ color: var(--color-text);
204
200
 
205
201
  &_button {
206
202
  display: flex;
@@ -213,15 +209,21 @@
213
209
  @include tab_button_mixin;
214
210
 
215
211
  &--selected {
212
+ background-color:var(--color-tab-selected-background);
213
+ color:var(--color-tab-selected);
216
214
  @include tab_button_selected_mixin;
217
215
  }
218
216
  @media (hover: hover) {
219
217
  &:hover {
218
+ background-color:var(--color-tab-selected-background);
219
+ color:var(--color-tab-selected);
220
220
  @include tab_button_hovered_mixin;
221
221
  }
222
222
  }
223
223
 
224
224
  &--unselected {
225
+ background-color:var(--color-tab-unselected-background);
226
+ color:var(--color-tab-unselected);
225
227
  @include tab_button_unselected_mixin;
226
228
  }
227
229
 
@@ -245,8 +247,8 @@
245
247
  border: none;
246
248
  font-family: var(--font-family);
247
249
  font-size: var(--font-size);
248
- color: var(--color-text);
249
- background-color: var(--color-5);
250
+ color: var(--color-tab-textbox);
251
+ background-color: var(--color-tab-textbox-background);
250
252
  border: 1px inset var(--color-1);
251
253
  border-radius: 3px;
252
254
  width: 10em;
@@ -282,7 +284,7 @@
282
284
  display: flex;
283
285
  align-items: center;
284
286
  border: none;
285
- color: gray;
287
+ color: var(--color-overflow);
286
288
  font-size: inherit;
287
289
  background-color: transparent;
288
290
  }
@@ -365,26 +367,28 @@
365
367
  display: flex;
366
368
  font-size: var(--font-size);
367
369
  font-family: var(--font-family);
370
+ color: var(--color-border);
371
+ background-color: var(--color-border-background);
368
372
  @include border_mixin;
369
373
 
370
374
  &_top {
371
- border-bottom: 1px solid var(--color-3);
375
+ border-bottom: 1px solid var(--color-border-divider-line);
372
376
  align-items: center;
373
377
  }
374
378
 
375
379
  &_bottom {
376
- border-top: 1px solid var(--color-3);
380
+ border-top: 1px solid var(--color-border-divider-line);
377
381
  align-items: center;
378
382
  }
379
383
 
380
384
  &_left {
381
- border-right: 1px solid var(--color-3);
385
+ border-right: 1px solid var(--color-border-divider-line);
382
386
  align-content: center;
383
387
  flex-direction: column;
384
388
  }
385
389
 
386
390
  &_right {
387
- border-left: 1px solid var(--color-3);
391
+ border-left: 1px solid var(--color-border-divider-line);
388
392
  align-content: center;
389
393
  flex-direction: column;
390
394
  }
@@ -399,7 +403,6 @@
399
403
  &_tab_container {
400
404
  white-space: nowrap;
401
405
  display: flex;
402
- gap: 4px;
403
406
  padding-left: 2px;
404
407
  padding-right: 2px;
405
408
  box-sizing: border-box;
@@ -420,6 +423,11 @@
420
423
  }
421
424
  }
422
425
 
426
+ &_tab_divider {
427
+ width: 4px;
428
+ @include border_tab_divider_mixin;
429
+ }
430
+
423
431
  &_button {
424
432
  display: flex;
425
433
  gap: 0.3em;
@@ -432,15 +440,21 @@
432
440
  @include border_button_mixin;
433
441
 
434
442
  &--selected {
443
+ background-color: var(--color-border-tab-selected-background);
444
+ color: var(--color-border-tab-selected);
435
445
  @include border_button_selected_mixin;
436
446
  }
437
447
  @media (hover: hover) {
438
448
  &:hover {
449
+ background-color: var(--color-border-tab-selected-background);
450
+ color: var(--color-border-tab-selected);
439
451
  @include border_button_hovered_mixin;
440
452
  }
441
453
  }
442
454
 
443
455
  &--unselected {
456
+ background-color: var(--color-border-tab-unselected-background);
457
+ color: var(--color-border-tab-unselected);
444
458
  @include border_button_unselected_mixin;
445
459
  }
446
460
 
@@ -513,7 +527,7 @@
513
527
  display: flex;
514
528
  align-items: center;
515
529
  border: none;
516
- color: gray;
530
+ color: var(--color-overflow);
517
531
  font-size: inherit;
518
532
  background-color: transparent;
519
533
  }
@@ -548,9 +562,9 @@
548
562
 
549
563
  &_container {
550
564
  box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.15);
551
- border: 1px solid var(--color-6);
552
- color: var(--color-text);
553
- background: var(--color-background);
565
+ border: 1px solid var(--color-popup-border);
566
+ color: var(--color-popup-unselected);
567
+ background: var(--color-popup-unselected-background);
554
568
  border-radius: 3px;
555
569
  position: absolute;
556
570
  z-index: 1000;