Interface Customization#
Multiple elements in the JupyterLab interface are customizable to display new elements or hide default ones.
Layout#
The JupyterLab layout has two modes: the simple mode (or single document mode) and the default
mode (or multiple documents mode). In both modes, the widgets are attached in one of the four
area: the left
or right
sidebars, the main
dock panel area or the down
area.
The default positions of widgets can be overridden through the settings based on the type of widgets. The setting to modify is the layout one in section JupyterLab Shell.
The available widget types and their default area is listed below
Type |
multiple |
single |
---|---|---|
Console |
main |
main |
CSVTable |
main |
main |
TSVTable |
main |
main |
Editor |
main |
main |
HTML Viewer |
main |
main |
Image |
main |
main |
Image (Text) |
main |
main |
JSON |
main |
main |
Markdown Preview |
main |
main |
Notebook |
main |
main |
Cloned Output |
main |
down |
Linked Console |
main |
down |
Inspector |
main |
down |
main |
main |
|
Terminal |
main |
main |
VDOM |
main |
main |
Vega-Lite4 |
main |
main |
Vega5 |
main |
main |
Settings |
main |
main |
Advanced Settings |
main |
main |
Licenses |
main |
main |
Debugger |
right |
right |
Debugger Variables |
main |
main |
Debugger Sources |
main |
main |
Property Inspector |
right |
right |
Extension Manager |
left |
left |
File Browser |
left |
left |
Sessions and Tabs |
left |
left |
Table of Contents |
left |
left |
Log Console |
down |
down |
"layout": {
"single": {
"Linked Console": { "area": "down" },
"Inspector": { "area": "down" },
"Cloned Output": { "area": "down" },
// Add new terminals in the down area in simple mode
"Terminal": { "area": "down" }
},
"multiple": {
// Add new terminals in the right sidebar in default mode
"Terminal": { "area": "right" }
}
}
The above example will result in the following changes:

(Before Change) Default terminal position in “multiple” (default) mode#

(After Change) Customized terminal position in “multiple” (default) mode#
Toolbars#
Lots of toolbars are customizable. Here is a mapping of the customizable toolbars and the associated setting.
Cell: Cell Toolbar -> toolbar
CSV Viewer: CSV Viewer -> toolbar
File Browser: File Browser Widget -> toolbar
HTML Viewer: HTML Viewer -> toolbar
Notebook panel: Notebook Panel -> toolbar
Text Editor: Text Editor -> toolbar
TSV Viewer: TSV Viewer -> toolbar
Those settings are accessible through the interactive Settings Editor. But you may find more comfortable to use the Advanced Settings Editor (accessible by clicking on JSON Settings Editor button in the top right corner of the Settings Editor).
Your toolbar
customization will be merged with the default menu bar definition (this
is a different behavior as the other settings that are overriding the default settings).
So to remove a default item, you will need to disable it. To do that, you will need
to set the toolbar item disabled
attribute to true
; an item is uniquely identified
by its name
attribute.
"toolbar": [
// Disable the restart and run all button
{
"name": "restart-and-run",
"disabled": true
},
// Add a new button to clear all cell outputs
{
"name": "clear-all-outputs",
"command": "notebook:clear-all-cell-outputs"
}
]
The above example for the notebook panel, will results in the following changes:

Default notebook toolbar#

Customized notebook toolbar#
A toolbar is defined by a list of items. Each item must have an unique name
. That
name will create a toolbar item if it is associated with a special widget (e.g. the
cell type toolbar selector). Otherwise it will require a command
that will be triggered
when clicking on a toolbar button (see the available Commands list).
The items are sorted by their rank
.
Note
If you want to more advanced customization please refer to the Toolbar item definition.
Custom CSS#
Applying Custom CSS#
To apply custom CSS, you can add a /custom/custom.css
file in the
jupyter config
directory. You can find the path, ~/.jupyter
, to
this directory by running jupyter --paths
. There you can create a
folder named custom
and create a custom.css
file within the
folder.
Custom CSS is not loaded by default. In the jupyter configuration directory, the
~/.jupyter/custom/custom.css
file will not be loaded unless the the application is
initialized with the --custom-css
flag (LabApp.custom_css config).
Jupyter Styling#
You can use a custom CSS file to modify default Jupyter styling.
/* Modify Jupyter Styles */
.lm-BoxPanel-child,
.jp-FileBrowser-Panel,
.lm-StackedPanel-child,
.jp-FileBrowser-toolbar {
background-color: #aecad4 !important;
}
#top-panel-wrapper,
#jp-top-bar {
background-color: #aecad4 !important;
}
#menu-panel-wrapper,
#jp-MainMenu,
#menu-panel {
background-color: #aecad4 !important;
}
.jp-NotebookPanel-toolbar {
background-color: #aecad4 !important;
}
.lm-MenuBar-content {
color: #02484d;
}
.lm-TabBar-content,
.jp-DirListing-content,
.lm-MenuBar-content {
font-size: small;
}

Markdown#
Another potential application for custom CSS is styling markdown.
/* Styling Markdown */
/* Headings */
h1,
h2 {
font-family: Impact, Charcoal, sans-serif;
font-weight: bold;
text-shadow: 2px 2px 4px #000;
}
h1 {
font-size: 22px;
margin-bottom: 40px;
color: #10929e;
text-decoration: underline;
}
h2 {
font-size: 48px;
margin-bottom: 32px;
color: #76b4be;
text-transform: uppercase;
}
/* Block Quotes */
blockquote {
font-family: Georgia, serif;
font-size: 16px;
color: #19085c;
border-left: 8px solid #effffc;
background-color: #eafcff;
padding: 20px;
}
/* Lists */
ul,
ol {
font-family: Verdana, Geneva, sans-serif;
font-size: 18px;
color: #333;
margin-bottom: 24px;
}
