Notebooks, consoles, and text files now have access to completions for local tokens. If a text file has a running kernel associated with its path (as happens with an attached console), it also gets completions and tooltips from that kernel. (#5049)

The FileBrowser widget has a new constructor option refreshInterval , allowing the creator to customize how often the widget polls the storage backend. This can be useful to prevent rate-limiting in certain contexts. (#5048)

The application shell now gets a pair of CSS data attributes indicating the current theme, and whether it is light or dark. Extension authors can write CSS rules targeting these to have their extension UI elements respond to the application theme. For instance, to write a rule targeting whether the theme is overall light or dark, you can use [data-theme-light="true"] your-ui-class { background-color: white; } [data-theme-light="false"] your-ui-class { background-color: black; } The theme name can also be targeted by writing CSS rules for data-theme-name . (#5078)

The IThemeManager interface now exposes a signal for themeChanged , allowing extension authors to react to changes in the theme. Theme extensions must also provide a new boolean property isLight , declaring whether they are broadly light colored. This data allows third-party extensions to react better to the active application theme. (#5078)

Added a patch to update the uploads for each FileBrowserModel instantly whenever a file upload errors. Previously, the upload that erred was only being removed from uploads upon an update. This would allow the status bar component and other extensions that use the FileBrowserModel to be more precise. (#5077)

Cell IDs are now passed in the shell message as part of the cell metadata when a cell is executed. This helps in developing reactive kernels. (#5033)

The IDs of all deleted cells since the last run cell are now passed as part of the cell metadata on execution. The IDs of deleted cells since the last run cell are stored as deletedCells in NotebookModel . This helps in developing reactive kernels. (#5037)

The ToolbarButton in apputils has been refactored with an API change and now uses a React component ToolbarButtonComponent to render its children. It is now a div with a single button child, which in turn as two span elements for an icon and text label. Extensions that were using the className options should rename it as iconClassName . The className options still exists, but it used as the CSS class on the button element itself. The API changes were done to accommodate styling changes to the button. (#5117)

The Toolbar.createFromCommand function has been replaced by a dedicated ToolbarButton subclass called CommandToolbarButton , that wraps a similarly named React component. (#5117)

The design and styling of the right and left sidebars tabs has been improved to address #5054. We are now using icons to render tabs for the extensions we ship with JupyterLab and extension authors are encouraged to do the same (text labels still work). Icon based tabs can be used by removing widget.caption and adding widget.iconClass = '<youriconclass> jp-SideBar-tabIcon'; . (#5117)

The style of buttons in JupyterLab has been updated to a borderless design. (#5117)

A new series of helper CSS classes for stying SVG-based icons at different sizes has been added: jp-Icon , jp-Icon-16 , jp-Icon-18 , jp-Icon-20 .

The rank of the default sidebar widget has been updated. The main change is giving the extension manager a rank of 1000 so that it appears at the end of the default items.

Python 3.5+ is now required to use JupyterLab. Python 2 kernels can still be run within JupyterLab. (#5119)

JupyterLab now uses yarn 1.9.4 (aliased as jlpm ), which now allows uses to use Node 10+. (#5121)