@jupyterlab/application 4.6.0-alpha.5 → 4.6.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/dockpanel.d.ts +40 -0
- package/lib/dockpanel.js +231 -0
- package/lib/dockpanel.js.map +1 -0
- package/lib/frontend.js +1 -0
- package/lib/frontend.js.map +1 -1
- package/lib/index.d.ts +2 -1
- package/lib/index.js.map +1 -1
- package/lib/lab.js +1 -0
- package/lib/lab.js.map +1 -1
- package/lib/layoutrestorer.js +7 -0
- package/lib/layoutrestorer.js.map +1 -1
- package/lib/mimerenderers.js +1 -0
- package/lib/mimerenderers.js.map +1 -1
- package/lib/shell.d.ts +61 -4
- package/lib/shell.js +350 -41
- package/lib/shell.js.map +1 -1
- package/lib/status.d.ts +1 -1
- package/lib/status.js +0 -2
- package/lib/status.js.map +1 -1
- package/lib/tokens.d.ts +2 -2
- package/lib/tokens.js +0 -2
- package/lib/tokens.js.map +1 -1
- package/lib/utils.js +1 -0
- package/lib/utils.js.map +1 -1
- package/package.json +13 -13
- package/src/dockpanel.ts +267 -0
- package/src/frontend.ts +1 -0
- package/src/index.ts +2 -5
- package/src/lab.ts +1 -0
- package/src/layoutrestorer.ts +13 -0
- package/src/mimerenderers.ts +1 -0
- package/src/shell.ts +438 -40
- package/src/status.ts +1 -2
- package/src/tokens.ts +2 -3
- package/src/utils.ts +1 -0
- package/style/buttons.css +12 -4
- package/style/dockpanel.css +5 -1
- package/style/menus.css +10 -2
- package/style/scrollbar.css +69 -28
- package/style/sidepanel.css +162 -19
- package/style/tabs.css +5 -7
package/src/status.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
// Copyright (c) Jupyter Development Team.
|
|
2
2
|
// Distributed under the terms of the Modified BSD License.
|
|
3
|
-
|
|
4
3
|
import type { IDisposable } from '@lumino/disposable';
|
|
5
4
|
import { DisposableDelegate } from '@lumino/disposable';
|
|
6
5
|
import type { ISignal } from '@lumino/signaling';
|
|
@@ -15,7 +14,7 @@ export class LabStatus implements ILabStatus {
|
|
|
15
14
|
/**
|
|
16
15
|
* Construct a new status object.
|
|
17
16
|
*/
|
|
18
|
-
constructor(app: JupyterFrontEnd
|
|
17
|
+
constructor(app: JupyterFrontEnd) {
|
|
19
18
|
this._busySignal = new Signal(app);
|
|
20
19
|
this._dirtySignal = new Signal(app);
|
|
21
20
|
}
|
package/src/tokens.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
// Copyright (c) Jupyter Development Team.
|
|
2
2
|
// Distributed under the terms of the Modified BSD License.
|
|
3
|
-
|
|
4
3
|
import type { ServerConnection, ServiceManager } from '@jupyterlab/services';
|
|
5
4
|
import type { ITranslator } from '@jupyterlab/translation';
|
|
6
5
|
import type { CommandRegistry } from '@lumino/commands';
|
|
@@ -52,12 +51,12 @@ export interface ILabStatus {
|
|
|
52
51
|
/**
|
|
53
52
|
* A signal for when application changes its busy status.
|
|
54
53
|
*/
|
|
55
|
-
readonly busySignal: ISignal<JupyterFrontEnd
|
|
54
|
+
readonly busySignal: ISignal<JupyterFrontEnd, boolean>;
|
|
56
55
|
|
|
57
56
|
/**
|
|
58
57
|
* A signal for when application changes its dirty status.
|
|
59
58
|
*/
|
|
60
|
-
readonly dirtySignal: ISignal<JupyterFrontEnd
|
|
59
|
+
readonly dirtySignal: ISignal<JupyterFrontEnd, boolean>;
|
|
61
60
|
|
|
62
61
|
/**
|
|
63
62
|
* Whether the application is busy.
|
package/src/utils.ts
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Copyright (c) Jupyter Development Team.
|
|
3
3
|
* Distributed under the terms of the Modified BSD License.
|
|
4
4
|
*/
|
|
5
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
5
6
|
|
|
6
7
|
import { SemanticCommand } from '@jupyterlab/apputils';
|
|
7
8
|
import type { TranslationBundle } from '@jupyterlab/translation';
|
package/style/buttons.css
CHANGED
|
@@ -23,7 +23,9 @@
|
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
.jp-ThemedContainer button:focus-visible {
|
|
26
|
-
outline:
|
|
26
|
+
outline-width: var(--jp-focus-outline-width);
|
|
27
|
+
outline-color: var(--jp-focus-outline-color);
|
|
28
|
+
outline-style: solid;
|
|
27
29
|
outline-offset: -1px;
|
|
28
30
|
}
|
|
29
31
|
|
|
@@ -42,7 +44,9 @@ button.jp-mod-styled.jp-mod-accept:active {
|
|
|
42
44
|
}
|
|
43
45
|
|
|
44
46
|
button.jp-mod-styled.jp-mod-accept:focus-visible {
|
|
45
|
-
outline:
|
|
47
|
+
outline-width: var(--jp-focus-outline-width);
|
|
48
|
+
outline-color: var(--jp-accept-color-active, var(--jp-focus-outline-color));
|
|
49
|
+
outline-style: solid;
|
|
46
50
|
}
|
|
47
51
|
|
|
48
52
|
button.jp-mod-styled.jp-mod-reject {
|
|
@@ -60,7 +64,9 @@ button.jp-mod-styled.jp-mod-reject:active {
|
|
|
60
64
|
}
|
|
61
65
|
|
|
62
66
|
button.jp-mod-styled.jp-mod-reject:focus-visible {
|
|
63
|
-
outline:
|
|
67
|
+
outline-width: var(--jp-focus-outline-width);
|
|
68
|
+
outline-color: var(--jp-reject-color-active, var(--md-grey-700, #616161));
|
|
69
|
+
outline-style: solid;
|
|
64
70
|
}
|
|
65
71
|
|
|
66
72
|
button.jp-mod-styled.jp-mod-warn {
|
|
@@ -78,7 +84,9 @@ button.jp-mod-styled.jp-mod-warn:active {
|
|
|
78
84
|
}
|
|
79
85
|
|
|
80
86
|
button.jp-mod-styled.jp-mod-warn:focus-visible {
|
|
81
|
-
outline:
|
|
87
|
+
outline-width: var(--jp-focus-outline-width);
|
|
88
|
+
outline-color: var(--jp-warn-color-active, var(--md-red-700, #d32f2f));
|
|
89
|
+
outline-style: solid;
|
|
82
90
|
}
|
|
83
91
|
|
|
84
92
|
.jp-Button-flat {
|
package/style/dockpanel.css
CHANGED
|
@@ -13,12 +13,16 @@
|
|
|
13
13
|
|
|
14
14
|
.lm-DockPanel-widget,
|
|
15
15
|
.lm-TabPanel-stackedPanel {
|
|
16
|
-
background: var(--jp-layout-color0);
|
|
17
16
|
border-left: var(--jp-border-width) solid var(--jp-border-color1);
|
|
18
17
|
border-right: var(--jp-border-width) solid var(--jp-border-color1);
|
|
19
18
|
border-bottom: var(--jp-border-width) solid var(--jp-border-color1);
|
|
20
19
|
}
|
|
21
20
|
|
|
21
|
+
:where(.lm-DockPanel-widget),
|
|
22
|
+
.lm-TabPanel-stackedPanel {
|
|
23
|
+
background: var(--jp-layout-color0);
|
|
24
|
+
}
|
|
25
|
+
|
|
22
26
|
.lm-DockPanel-overlay {
|
|
23
27
|
background: rgba(33, 150, 243, 0.1);
|
|
24
28
|
border: var(--jp-border-width) dashed var(--jp-brand-color1);
|
package/style/menus.css
CHANGED
|
@@ -85,18 +85,26 @@
|
|
|
85
85
|
}
|
|
86
86
|
|
|
87
87
|
.lm-MenuBar:focus-visible {
|
|
88
|
-
outline:
|
|
88
|
+
outline-width: var(--jp-focus-outline-width);
|
|
89
|
+
outline-color: var(--jp-accept-color-active, var(--jp-focus-outline-color));
|
|
90
|
+
outline-style: solid;
|
|
89
91
|
outline-offset: -1px;
|
|
90
92
|
}
|
|
91
93
|
|
|
92
94
|
.lm-MenuBar-menu:focus-visible,
|
|
93
|
-
.lm-MenuBar-item:focus-visible,
|
|
94
95
|
.lm-Menu-item:focus-visible {
|
|
95
96
|
outline: unset;
|
|
96
97
|
outline-offset: unset;
|
|
97
98
|
-moz-outline-radius: unset;
|
|
98
99
|
}
|
|
99
100
|
|
|
101
|
+
.lm-MenuBar-item:focus-visible {
|
|
102
|
+
outline-width: var(--jp-focus-outline-width);
|
|
103
|
+
outline-color: var(--jp-focus-outline-color);
|
|
104
|
+
outline-style: solid;
|
|
105
|
+
outline-offset: -2px;
|
|
106
|
+
}
|
|
107
|
+
|
|
100
108
|
.lm-MenuBar-item.lm-mod-active {
|
|
101
109
|
background: var(--jp-layout-color2);
|
|
102
110
|
}
|
package/style/scrollbar.css
CHANGED
|
@@ -52,90 +52,131 @@
|
|
|
52
52
|
|
|
53
53
|
/*
|
|
54
54
|
* Lumino
|
|
55
|
+
*
|
|
56
|
+
* The Lumino scrollbar (used by every DataGrid — CSV viewer, Debugger
|
|
57
|
+
* Variables panel, …) is themed via the shared scrollbar variables.
|
|
58
|
+
* Fallbacks equal the previous hardcoded values, so themes that do not
|
|
59
|
+
* define `--jp-scrollbar-*` (the default light theme) are unchanged at
|
|
60
|
+
* rest. Hover/active blend towards `--jp-ui-font-color1` (dark in the
|
|
61
|
+
* light theme, light in the dark themes) with `color-mix` so the
|
|
62
|
+
* feedback stays visible in every theme. See issue #18797.
|
|
55
63
|
*/
|
|
56
|
-
/* stylelint-disable declaration-property-value-allowed-list */
|
|
57
64
|
.lm-ScrollBar[data-orientation='horizontal'] {
|
|
58
65
|
min-height: 16px;
|
|
59
66
|
max-height: 16px;
|
|
60
67
|
min-width: 45px;
|
|
61
|
-
border-top: 1px solid
|
|
68
|
+
border-top: 1px solid var(--jp-border-color1);
|
|
62
69
|
}
|
|
63
70
|
|
|
64
71
|
.lm-ScrollBar[data-orientation='vertical'] {
|
|
65
72
|
min-width: 16px;
|
|
66
73
|
max-width: 16px;
|
|
67
74
|
min-height: 45px;
|
|
68
|
-
border-left: 1px solid
|
|
75
|
+
border-left: 1px solid var(--jp-border-color1);
|
|
69
76
|
}
|
|
70
77
|
|
|
71
78
|
.lm-ScrollBar-button {
|
|
72
|
-
|
|
73
|
-
background-
|
|
79
|
+
position: relative;
|
|
80
|
+
background-color: var(--jp-scrollbar-background-color, #f0f0f0);
|
|
74
81
|
min-height: 15px;
|
|
75
82
|
max-height: 15px;
|
|
76
83
|
min-width: 15px;
|
|
77
84
|
max-width: 15px;
|
|
78
85
|
}
|
|
79
86
|
|
|
87
|
+
/*
|
|
88
|
+
* The caret SVGs have a fixed fill, so render them as a theme-aware
|
|
89
|
+
* mask tinted with --jp-ui-font-color1 (light in the dark themes, dark
|
|
90
|
+
* in the light theme) rather than a fixed-colour background image, so
|
|
91
|
+
* the arrows keep enough contrast in every theme.
|
|
92
|
+
*/
|
|
93
|
+
.lm-ScrollBar-button::before {
|
|
94
|
+
content: '';
|
|
95
|
+
position: absolute;
|
|
96
|
+
inset: 0;
|
|
97
|
+
background-color: var(--jp-ui-font-color1);
|
|
98
|
+
-webkit-mask-position: center;
|
|
99
|
+
mask-position: center;
|
|
100
|
+
-webkit-mask-repeat: no-repeat;
|
|
101
|
+
mask-repeat: no-repeat;
|
|
102
|
+
-webkit-mask-size: 17px;
|
|
103
|
+
mask-size: 17px;
|
|
104
|
+
}
|
|
105
|
+
|
|
80
106
|
.lm-ScrollBar-button:hover {
|
|
81
|
-
background-color:
|
|
107
|
+
background-color: color-mix(
|
|
108
|
+
in srgb,
|
|
109
|
+
var(--jp-scrollbar-background-color, #f0f0f0) 86%,
|
|
110
|
+
var(--jp-ui-font-color1) 14%
|
|
111
|
+
);
|
|
82
112
|
}
|
|
83
113
|
|
|
84
114
|
.lm-ScrollBar-button.lm-mod-active {
|
|
85
|
-
background-color:
|
|
115
|
+
background-color: color-mix(
|
|
116
|
+
in srgb,
|
|
117
|
+
var(--jp-scrollbar-background-color, #f0f0f0) 74%,
|
|
118
|
+
var(--jp-ui-font-color1) 26%
|
|
119
|
+
);
|
|
86
120
|
}
|
|
87
121
|
|
|
88
122
|
.lm-ScrollBar-track {
|
|
89
|
-
background: #f0f0f0;
|
|
123
|
+
background: var(--jp-scrollbar-background-color, #f0f0f0);
|
|
90
124
|
}
|
|
91
125
|
|
|
92
126
|
.lm-ScrollBar-thumb {
|
|
93
|
-
background:
|
|
127
|
+
background: rgb(var(--jp-scrollbar-thumb-color, 205, 205, 205));
|
|
94
128
|
}
|
|
95
129
|
|
|
96
130
|
.lm-ScrollBar-thumb:hover {
|
|
97
|
-
background:
|
|
131
|
+
background: color-mix(
|
|
132
|
+
in srgb,
|
|
133
|
+
rgb(var(--jp-scrollbar-thumb-color, 205, 205, 205)) 78%,
|
|
134
|
+
var(--jp-ui-font-color1) 22%
|
|
135
|
+
);
|
|
98
136
|
}
|
|
99
137
|
|
|
100
138
|
.lm-ScrollBar-thumb.lm-mod-active {
|
|
101
|
-
background:
|
|
139
|
+
background: color-mix(
|
|
140
|
+
in srgb,
|
|
141
|
+
rgb(var(--jp-scrollbar-thumb-color, 205, 205, 205)) 62%,
|
|
142
|
+
var(--jp-ui-font-color1) 38%
|
|
143
|
+
);
|
|
102
144
|
}
|
|
103
145
|
|
|
104
146
|
.lm-ScrollBar[data-orientation='horizontal'] .lm-ScrollBar-thumb {
|
|
105
147
|
height: 100%;
|
|
106
148
|
min-width: 15px;
|
|
107
|
-
border-left: 1px solid
|
|
108
|
-
border-right: 1px solid
|
|
149
|
+
border-left: 1px solid var(--jp-border-color1);
|
|
150
|
+
border-right: 1px solid var(--jp-border-color1);
|
|
109
151
|
}
|
|
110
152
|
|
|
111
153
|
.lm-ScrollBar[data-orientation='vertical'] .lm-ScrollBar-thumb {
|
|
112
154
|
width: 100%;
|
|
113
155
|
min-height: 15px;
|
|
114
|
-
border-top: 1px solid
|
|
115
|
-
border-bottom: 1px solid
|
|
156
|
+
border-top: 1px solid var(--jp-border-color1);
|
|
157
|
+
border-bottom: 1px solid var(--jp-border-color1);
|
|
116
158
|
}
|
|
117
|
-
/* stylelint-enable declaration-property-value-allowed-list */
|
|
118
159
|
|
|
119
160
|
.lm-ScrollBar[data-orientation='horizontal']
|
|
120
|
-
.lm-ScrollBar-button[data-action='decrement'] {
|
|
121
|
-
|
|
122
|
-
|
|
161
|
+
.lm-ScrollBar-button[data-action='decrement']::before {
|
|
162
|
+
-webkit-mask-image: var(--jp-icon-caret-left);
|
|
163
|
+
mask-image: var(--jp-icon-caret-left);
|
|
123
164
|
}
|
|
124
165
|
|
|
125
166
|
.lm-ScrollBar[data-orientation='horizontal']
|
|
126
|
-
.lm-ScrollBar-button[data-action='increment'] {
|
|
127
|
-
|
|
128
|
-
|
|
167
|
+
.lm-ScrollBar-button[data-action='increment']::before {
|
|
168
|
+
-webkit-mask-image: var(--jp-icon-caret-right);
|
|
169
|
+
mask-image: var(--jp-icon-caret-right);
|
|
129
170
|
}
|
|
130
171
|
|
|
131
172
|
.lm-ScrollBar[data-orientation='vertical']
|
|
132
|
-
.lm-ScrollBar-button[data-action='decrement'] {
|
|
133
|
-
|
|
134
|
-
|
|
173
|
+
.lm-ScrollBar-button[data-action='decrement']::before {
|
|
174
|
+
-webkit-mask-image: var(--jp-icon-caret-up);
|
|
175
|
+
mask-image: var(--jp-icon-caret-up);
|
|
135
176
|
}
|
|
136
177
|
|
|
137
178
|
.lm-ScrollBar[data-orientation='vertical']
|
|
138
|
-
.lm-ScrollBar-button[data-action='increment'] {
|
|
139
|
-
|
|
140
|
-
|
|
179
|
+
.lm-ScrollBar-button[data-action='increment']::before {
|
|
180
|
+
-webkit-mask-image: var(--jp-icon-caret-down);
|
|
181
|
+
mask-image: var(--jp-icon-caret-down);
|
|
141
182
|
}
|
package/style/sidepanel.css
CHANGED
|
@@ -9,6 +9,15 @@
|
|
|
9
9
|
|
|
10
10
|
:root {
|
|
11
11
|
--jp-private-sidebar-tab-width: 32px;
|
|
12
|
+
--jp-private-sidebar-tab-horizontal-height: 28px;
|
|
13
|
+
--jp-private-sidebar-tab-horizontal-scrollbar-height: 4px;
|
|
14
|
+
--jp-private-sidebar-tab-horizontal-padding: 16px;
|
|
15
|
+
|
|
16
|
+
/* Icon (20px, see `.jp-SideBar-tabIcon`) + horizontal padding on both
|
|
17
|
+
sides — below this a horizontal tab clips its icon. */
|
|
18
|
+
--jp-private-sidebar-tab-horizontal-min-width: calc(
|
|
19
|
+
20px + 2 * var(--jp-private-sidebar-tab-horizontal-padding)
|
|
20
|
+
);
|
|
12
21
|
}
|
|
13
22
|
|
|
14
23
|
/*-----------------------------------------------------------------------------
|
|
@@ -29,13 +38,26 @@
|
|
|
29
38
|
overflow: visible;
|
|
30
39
|
}
|
|
31
40
|
|
|
32
|
-
.jp-SideBar.lm-TabBar {
|
|
41
|
+
.jp-SideBar.lm-TabBar[data-orientation='vertical'] {
|
|
33
42
|
min-width: calc(var(--jp-private-sidebar-tab-width) + var(--jp-border-width));
|
|
34
43
|
max-width: calc(var(--jp-private-sidebar-tab-width) + var(--jp-border-width));
|
|
35
44
|
display: block;
|
|
36
45
|
}
|
|
37
46
|
|
|
38
|
-
.jp-SideBar
|
|
47
|
+
.jp-SideBar.lm-TabBar[data-orientation='horizontal'] {
|
|
48
|
+
min-height: calc(
|
|
49
|
+
var(--jp-private-sidebar-tab-horizontal-height) +
|
|
50
|
+
var(--jp-private-sidebar-tab-horizontal-scrollbar-height) +
|
|
51
|
+
var(--jp-border-width)
|
|
52
|
+
);
|
|
53
|
+
max-height: calc(
|
|
54
|
+
var(--jp-private-sidebar-tab-horizontal-height) +
|
|
55
|
+
var(--jp-private-sidebar-tab-horizontal-scrollbar-height) +
|
|
56
|
+
var(--jp-border-width)
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.jp-SideBar[data-orientation='vertical'] .lm-TabBar-content {
|
|
39
61
|
margin: 0;
|
|
40
62
|
padding: 0;
|
|
41
63
|
display: flex;
|
|
@@ -44,7 +66,46 @@
|
|
|
44
66
|
height: var(--jp-private-sidebar-tab-width);
|
|
45
67
|
}
|
|
46
68
|
|
|
47
|
-
.jp-SideBar .lm-TabBar-
|
|
69
|
+
.jp-SideBar[data-orientation='horizontal'] .lm-TabBar-content {
|
|
70
|
+
margin: 0;
|
|
71
|
+
padding: 0;
|
|
72
|
+
display: flex;
|
|
73
|
+
align-items: stretch;
|
|
74
|
+
list-style-type: none;
|
|
75
|
+
height: 100%;
|
|
76
|
+
width: 100%;
|
|
77
|
+
|
|
78
|
+
/* Scroll horizontally on overflow with the same tiny scrollbar styling used
|
|
79
|
+
elsewhere in the application. Reserve the gutter to avoid shifting tabs
|
|
80
|
+
when the scrollbar appears. */
|
|
81
|
+
overflow-x: auto;
|
|
82
|
+
overflow-y: hidden;
|
|
83
|
+
scrollbar-color: rgba(var(--jp-scrollbar-thumb-color), 0.5) transparent;
|
|
84
|
+
scrollbar-gutter: stable;
|
|
85
|
+
scrollbar-width: thin;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.jp-SideBar[data-orientation='horizontal']
|
|
89
|
+
.lm-TabBar-content::-webkit-scrollbar,
|
|
90
|
+
.jp-SideBar[data-orientation='horizontal']
|
|
91
|
+
.lm-TabBar-content::-webkit-scrollbar-corner {
|
|
92
|
+
background-color: transparent;
|
|
93
|
+
height: var(--jp-private-sidebar-tab-horizontal-scrollbar-height);
|
|
94
|
+
width: var(--jp-private-sidebar-tab-horizontal-scrollbar-height);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.jp-SideBar[data-orientation='horizontal']
|
|
98
|
+
.lm-TabBar-content::-webkit-scrollbar-thumb {
|
|
99
|
+
background: rgba(var(--jp-scrollbar-thumb-color), 0.5);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.jp-SideBar[data-orientation='horizontal']
|
|
103
|
+
.lm-TabBar-content::-webkit-scrollbar-track:horizontal {
|
|
104
|
+
border-left: 0 solid transparent;
|
|
105
|
+
border-right: 0 solid transparent;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.jp-SideBar[data-orientation='vertical'] .lm-TabBar-tab {
|
|
48
109
|
padding: 16px 0;
|
|
49
110
|
border: none;
|
|
50
111
|
overflow: visible;
|
|
@@ -52,9 +113,23 @@
|
|
|
52
113
|
position: relative;
|
|
53
114
|
}
|
|
54
115
|
|
|
116
|
+
.jp-SideBar[data-orientation='horizontal'] .lm-TabBar-tab {
|
|
117
|
+
padding: 0 var(--jp-private-sidebar-tab-horizontal-padding);
|
|
118
|
+
border: none;
|
|
119
|
+
overflow: visible;
|
|
120
|
+
flex-direction: row;
|
|
121
|
+
align-items: center;
|
|
122
|
+
position: relative;
|
|
123
|
+
|
|
124
|
+
/* Floor at icon + padding so tabs can't shrink to clip the icon;
|
|
125
|
+
beyond that, overflow scroll on `.lm-TabBar-content` takes over. */
|
|
126
|
+
min-width: var(--jp-private-sidebar-tab-horizontal-min-width);
|
|
127
|
+
}
|
|
128
|
+
|
|
55
129
|
.jp-SideBar .lm-TabBar-tab:focus-visible {
|
|
56
|
-
|
|
57
|
-
outline:
|
|
130
|
+
outline-color: var(--jp-focus-outline-color);
|
|
131
|
+
outline-width: var(--jp-focus-outline-width);
|
|
132
|
+
outline-style: solid;
|
|
58
133
|
outline-offset: -3px;
|
|
59
134
|
}
|
|
60
135
|
|
|
@@ -84,10 +159,14 @@
|
|
|
84
159
|
background-position: center;
|
|
85
160
|
}
|
|
86
161
|
|
|
87
|
-
.jp-SideBar .lm-TabBar-tabLabel {
|
|
162
|
+
.jp-SideBar[data-orientation='vertical'] .lm-TabBar-tabLabel {
|
|
88
163
|
line-height: var(--jp-private-sidebar-tab-width);
|
|
89
164
|
}
|
|
90
165
|
|
|
166
|
+
.jp-SideBar[data-orientation='horizontal'] .lm-TabBar-tabLabel {
|
|
167
|
+
line-height: var(--jp-private-sidebar-tab-horizontal-height);
|
|
168
|
+
}
|
|
169
|
+
|
|
91
170
|
.jp-SideBar .lm-TabBar-tab:hover:not(.lm-mod-current),
|
|
92
171
|
#jp-down-stack .lm-TabBar-tab:hover:not(.lm-mod-current) {
|
|
93
172
|
background: var(--jp-layout-color1);
|
|
@@ -108,23 +187,53 @@
|
|
|
108
187
|
|
|
109
188
|
/* stylelint-disable selector-max-class */
|
|
110
189
|
|
|
111
|
-
.jp-SideBar.lm-TabBar
|
|
190
|
+
.jp-SideBar.lm-TabBar[data-orientation='vertical']
|
|
191
|
+
.lm-TabBar-tab
|
|
192
|
+
+ .lm-TabBar-tab {
|
|
112
193
|
border-top: var(--jp-border-width) solid var(--jp-layout-color2);
|
|
113
194
|
}
|
|
114
195
|
|
|
115
|
-
.jp-SideBar.lm-TabBar
|
|
196
|
+
.jp-SideBar.lm-TabBar[data-orientation='vertical']
|
|
197
|
+
.lm-TabBar-tab.lm-mod-current
|
|
198
|
+
+ .lm-TabBar-tab {
|
|
116
199
|
border-top: var(--jp-border-width) solid var(--jp-border-color0);
|
|
117
200
|
}
|
|
118
201
|
|
|
119
|
-
.jp-SideBar.lm-TabBar
|
|
202
|
+
.jp-SideBar.lm-TabBar[data-orientation='vertical']
|
|
203
|
+
.lm-TabBar-tab
|
|
204
|
+
+ .lm-TabBar-tab.lm-mod-current {
|
|
120
205
|
border-top: var(--jp-border-width) solid var(--jp-border-color0);
|
|
121
206
|
}
|
|
122
207
|
|
|
123
|
-
.jp-SideBar.lm-TabBar
|
|
208
|
+
.jp-SideBar.lm-TabBar[data-orientation='vertical']
|
|
209
|
+
.lm-TabBar-tab.lm-mod-current:last-child {
|
|
124
210
|
border-bottom: var(--jp-border-width) solid var(--jp-border-color0);
|
|
125
211
|
}
|
|
126
212
|
|
|
127
|
-
.jp-SideBar.lm-TabBar
|
|
213
|
+
.jp-SideBar.lm-TabBar[data-orientation='horizontal']
|
|
214
|
+
.lm-TabBar-tab
|
|
215
|
+
+ .lm-TabBar-tab {
|
|
216
|
+
border-left: var(--jp-border-width) solid var(--jp-layout-color2);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
.jp-SideBar.lm-TabBar[data-orientation='horizontal']
|
|
220
|
+
.lm-TabBar-tab.lm-mod-current
|
|
221
|
+
+ .lm-TabBar-tab {
|
|
222
|
+
border-left: var(--jp-border-width) solid var(--jp-border-color0);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
.jp-SideBar.lm-TabBar[data-orientation='horizontal']
|
|
226
|
+
.lm-TabBar-tab
|
|
227
|
+
+ .lm-TabBar-tab.lm-mod-current {
|
|
228
|
+
border-left: var(--jp-border-width) solid var(--jp-border-color0);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
.jp-SideBar.lm-TabBar[data-orientation='horizontal']
|
|
232
|
+
.lm-TabBar-tab.lm-mod-current:last-child {
|
|
233
|
+
border-right: var(--jp-border-width) solid var(--jp-border-color0);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
.jp-SideBar.lm-TabBar[data-orientation='vertical'] .lm-TabBar-tabLabel {
|
|
128
237
|
writing-mode: vertical-rl;
|
|
129
238
|
}
|
|
130
239
|
|
|
@@ -172,6 +281,48 @@
|
|
|
172
281
|
border-left: var(--jp-border-width) solid var(--jp-border-color0);
|
|
173
282
|
}
|
|
174
283
|
|
|
284
|
+
/* Top / Bottom (horizontal activity bar) */
|
|
285
|
+
|
|
286
|
+
.jp-SideBar.lm-TabBar[data-side='top'] .lm-TabBar-content,
|
|
287
|
+
.jp-SideBar.lm-TabBar[data-side='bottom'] .lm-TabBar-content {
|
|
288
|
+
align-items: stretch;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
.jp-SideBar.lm-TabBar[data-side='top'] {
|
|
292
|
+
border-bottom: var(--jp-border-width) solid var(--jp-border-color0);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
.jp-SideBar.lm-TabBar[data-side='bottom'] {
|
|
296
|
+
border-top: var(--jp-border-width) solid var(--jp-border-color0);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
.jp-SideBar.lm-TabBar[data-side='top'] .lm-TabBar-tab.lm-mod-current::after,
|
|
300
|
+
.jp-SideBar.lm-TabBar[data-side='bottom'] .lm-TabBar-tab.lm-mod-current::after {
|
|
301
|
+
/* Reset side-mode override; use the default tab borders. */
|
|
302
|
+
display: none;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/* Side area wrapper */
|
|
306
|
+
|
|
307
|
+
.jp-SideArea {
|
|
308
|
+
/* The side area wrapper holds the activity bar (when in top/bottom mode)
|
|
309
|
+
and the stacked panel. */
|
|
310
|
+
background: var(--jp-layout-color1);
|
|
311
|
+
|
|
312
|
+
/* Floor so the splitter can't be dragged to zero and lose the area.
|
|
313
|
+
The stack panel children already enforce this in 'side' mode; setting
|
|
314
|
+
it on the wrapper also covers 'top'/'bottom'. */
|
|
315
|
+
min-width: var(--jp-sidebar-min-width);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
.jp-SideArea[data-side='left'] {
|
|
319
|
+
border-right: var(--jp-border-width) solid var(--jp-border-color1);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
.jp-SideArea[data-side='right'] {
|
|
323
|
+
border-left: var(--jp-border-width) solid var(--jp-border-color1);
|
|
324
|
+
}
|
|
325
|
+
|
|
175
326
|
/* Down */
|
|
176
327
|
|
|
177
328
|
/* Borders */
|
|
@@ -207,14 +358,6 @@
|
|
|
207
358
|
background-color: var(--jp-layout-color1);
|
|
208
359
|
}
|
|
209
360
|
|
|
210
|
-
#jp-right-stack {
|
|
211
|
-
border-left: var(--jp-border-width) solid var(--jp-border-color1);
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
#jp-left-stack {
|
|
215
|
-
border-right: var(--jp-border-width) solid var(--jp-border-color1);
|
|
216
|
-
}
|
|
217
|
-
|
|
218
361
|
#jp-down-stack > .lm-TabPanel-stackedPanel {
|
|
219
362
|
border: none;
|
|
220
363
|
}
|
package/style/tabs.css
CHANGED
|
@@ -63,17 +63,15 @@
|
|
|
63
63
|
.lm-DockPanel-tabBar .lm-TabBar-tab:focus-visible,
|
|
64
64
|
.lm-DockPanel-tabBar .lm-TabBar-addButton:focus-visible,
|
|
65
65
|
.lm-TabPanel-tabBar .lm-TabBar-tab:focus-visible {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
box-shadow: 0 0 0 1px inset var(--accent-fill-focus);
|
|
71
|
-
outline: none;
|
|
66
|
+
outline-width: var(--jp-focus-outline-width);
|
|
67
|
+
outline-color: var(--jp-focus-outline-color);
|
|
68
|
+
outline-style: solid;
|
|
69
|
+
outline-offset: calc(-1 * var(--jp-focus-outline-width));
|
|
72
70
|
}
|
|
73
71
|
|
|
74
72
|
.lm-DockPanel-tabBar .lm-TabBar-tab:not(.lm-mod-current):focus-visible::after,
|
|
75
73
|
.lm-TabPanel-tabBar .lm-TabBar-tab:not(.lm-mod-current):focus-visible::after {
|
|
76
|
-
border-bottom-color: var(--
|
|
74
|
+
border-bottom-color: var(--jp-focus-outline-color);
|
|
77
75
|
}
|
|
78
76
|
|
|
79
77
|
.lm-DockPanel-tabBar .lm-TabBar-tab:hover:not(.lm-mod-current),
|