Repository: jupyterlab-contrib/jupyterlab-favorites (language: python)

Issue:
Make compatible with Jupyterlab 4
Fixes https://github.com/jupyterlab-contrib/jupyterlab-favorites/issues/14

These changes will not be compatible with Jupyterlab<4

I'm not sure how you want to proceed. Happy to just leave this MR open and continue to maintain it until there is an official release of Jupyterlab 4.0


Discussion / hints:
[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/mctoohey/jupyterlab-favorites/master?urlpath=lab) :point_left: Launch a binder notebook on branch _mctoohey/jupyterlab-favorites/master_
Thanks @mctoohey - typically I'll wait for JupyterLab 4.0.0-beta that will have API frozen before merging an upgrade in the main branch.
@fcollonval Can we look to merge this in now that Jupyterlab 4.0 has been release? The test_isolated step is failing due to what I believe to be a bug in jupyterlab.browser_check. I will open a PR in that repo for that issue.
Was able to fix the failing test by switching from `--no-chrome-check` to `--no-browser-check` which is functional the same.
Thanks @mctoohey 

If it is ok with you I'll build on top of this PR to modernize the code and fix the CI.
Super excited to see this almost done, really appreciate it! 
@fcollonval Is the extension ready for a pypi release with these changes? I have not been able to get a local install to complete. 
Thanks @fcollonval, same question as @kevinjohncutler here. Any plan regarding the pypi release?

Fix patch:
diff --git a/package.json b/package.json
index 7ebcd26..66065cd 100644
--- a/package.json
+++ b/package.json
@@ -80,6 +80,7 @@
         "@lumino/algorithm": "^2.0.0",
         "@lumino/commands": "^2.0.1",
         "@lumino/coreutils": "^2.0.1",
+        "@lumino/polling": "^2.0.0",
         "@lumino/signaling": "^2.0.0",
         "@lumino/widgets": "^2.0.1"
     },
diff --git a/schema/favorites.json b/schema/favorites.json
index 11746ae..7929381 100644
--- a/schema/favorites.json
+++ b/schema/favorites.json
@@ -1,38 +1,68 @@
 {
+  "additionalProperties": false,
+  "definitions": {
+    "favorite": {
+      "properties": {
+        "contentType": {
+          "type": "string"
+        },
+        "default": {
+          "type": "boolean"
+        },
+        "hidden": {
+          "type": "boolean"
+        },
+        "iconLabel": {
+          "type": "string"
+        },
+        "name": {
+          "type": "string"
+        },
+        "path": {
+          "type": "string"
+        },
+        "root": {
+          "type": "string"
+        }
+      },
+      "required": ["root", "path"],
+      "type": "object"
+    }
+  },
+  "description": "Favorites settings.",
+  "jupyter.lab.menus": {
+    "context": [
+      {
+        "command": "jupyterlab-favorites:remove-favorite",
+        "rank": 0,
+        "selector": ".jp-Favorites-item"
+      },
+      {
+        "command": "jupyterlab-favorites:add-or-remove-favorite",
+        "rank": 3,
+        "selector": ".jp-DirListing-item[data-isdir]"
+      }
+    ]
+  },
   "jupyter.lab.setting-icon": "jupyterlab-favorites:filledStar",
   "jupyter.lab.setting-icon-label": "Favorites",
-  "title": "Favorites",
-  "description": "Favorites settings.",
-  "type": "object",
-  "additionalProperties": false,
   "properties": {
     "favorites": {
-      "title": "Favorites",
+      "default": [],
       "description": "The list of favorites.",
-      "items": { "$ref": "#/definitions/favorite" },
-      "type": "array",
-      "default": []
+      "items": {
+        "$ref": "#/definitions/favorite"
+      },
+      "title": "Favorites",
+      "type": "array"
     },
     "showWidget": {
-      "title": "Show Widget",
+      "default": true,
       "description": "Toggles the favorites widget above the filebrowser breadcrumbs.",
-      "type": "boolean",
-      "default": true
+      "title": "Show Widget",
+      "type": "boolean"
     }
   },
-  "definitions": {
-    "favorite": {
-      "properties": {
-        "root": { "type": "string" },
-        "path": { "type": "string" },
-        "contentType": { "type": "string" },
-        "iconLabel": { "type": "string" },
-        "name": { "type": "string" },
-        "default": { "type": "boolean" },
-        "hidden": { "type": "boolean" }
-      },
-      "required": ["root", "path"],
-      "type": "object"
-    }
-  }
+  "title": "Favorites",
+  "type": "object"
 }
diff --git a/src/components.tsx b/src/components.tsx
index dc06e56..1274f16 100644
--- a/src/components.tsx
+++ b/src/components.tsx
@@ -55,12 +55,6 @@ const FAVORITE_ITEM_TEXT_CLASS = 'jp-Favorites-itemText';
  */
 const FILEBROWSER_HEADER_CLASS = 'jp-FileBrowser-header';
 
-/**
- * The class name for the node containing the FileBrowser BreadCrumbs favorite icon.  This node
- * is also responsible for click actions on the icon.
- */
-const FAVORITE_ITEM_PINNER_CLASS = 'jp-Favorites-pinner';
-
 /**
  * The class name for the the BreadCrumbs favorite icon.
  * This icon is overlaid on top of the FileBrowser content via CSS.
@@ -113,29 +107,35 @@ const FavoriteComponent = (props: types.FavoriteComponentProps) => {
   );
 };
 
-const FavoritesBreadCrumbs: React.FunctionComponent<
+export const FavoritesBreadCrumbs: React.FunctionComponent<
   types.IFavoritesBreadCrumbProps
 > = (props: types.IFavoritesBreadCrumbProps): JSX.Element | null => {
-  if (props.currentPath) {
-    const FavoriteIcon = getFavoritesIcon(
-      props.manager.hasFavorite(props.currentPath)
-    );
-    return (
-      <div
-        className={FAVORITE_ITEM_PINNER_CLASS}
-        title={getPinnerActionDescription(
-          props.manager.hasFavorite(props.currentPath)
-        )}
-        onClick={e => props.handleClick(props.currentPath)}
-      >
-        <FavoriteIcon.react
-          className={FAVORITE_BREADCRUMB_ICON_CLASS}
-          tag="span"
-        />
-      </div>
-    );
+  const currentPath = props.currentPath;
+  if (!currentPath) {
+    return null;
   }
-  return null;
+  return (
+    <UseSignal
+      signal={props.manager.favoritesChanged}
+      initialSender={props.manager}
+    >
+      {manager => {
+        const isFavorite = manager?.hasFavorite(currentPath) ?? false;
+        const icon = getFavoritesIcon(isFavorite);
+        return (
+          <button
+            className="jp-ToolbarButtonComponent"
+            title={getPinnerActionDescription(isFavorite)}
+            onClick={e => {
+              props.handleClick(currentPath);
+            }}
+          >
+            <icon.react className={FAVORITE_BREADCRUMB_ICON_CLASS} tag="span" />
+          </button>
+        );
+      }}
+    </UseSignal>
+  );
 };
 
 export class FavoritesWidget extends ReactWidget {
@@ -155,21 +155,6 @@ export class FavoritesWidget extends ReactWidget {
     });
   }
 
-  handlePinnerClick(path: string): void {
-    const shouldRemove = this.manager.hasFavorite(path);
-    if (shouldRemove) {
-      this.manager.removeFavorite(path);
-    } else {
-      const favorite = {
-        root: this.manager.serverRoot,
-        contentType: 'directory',
-        iconLabel: folderIcon.name,
-        path
-      } as IFavorites.Favorite;
-      this.manager.addFavorite(favorite);
-    }
-  }
-
   render(): JSX.Element {
     return (
       <UseSignal
@@ -205,19 +190,6 @@ export class FavoritesWidget extends ReactWidget {
                 )
               }
             </UseSignal>
-            <UseSignal
-              signal={this.pathChanged}
-              initialSender={this}
-              initialArgs={this.filebrowser.model.path}
-            >
-              {(widget?: FavoritesWidget, currentPath?: string) => (
-                <FavoritesBreadCrumbs
-                  currentPath={currentPath!}
-                  handleClick={widget!.handlePinnerClick}
-                  manager={widget!.manager}
-                />
-              )}
-            </UseSignal>
           </div>
         )}
       </UseSignal>
diff --git a/src/index.ts b/src/index.tsx
similarity index 52%
rename from src/index.ts
rename to src/index.tsx
index 498e939..d4a8896 100644
--- a/src/index.ts
+++ b/src/index.tsx
@@ -2,16 +2,18 @@ import {
   JupyterFrontEnd,
   JupyterFrontEndPlugin
 } from '@jupyterlab/application';
+import { PageConfig } from '@jupyterlab/coreutils';
 import {
   IDefaultFileBrowser,
   IFileBrowserFactory
 } from '@jupyterlab/filebrowser';
 import { IMainMenu } from '@jupyterlab/mainmenu';
-import { ContentsManager } from '@jupyterlab/services';
 import { ISettingRegistry } from '@jupyterlab/settingregistry';
-import { toArray } from '@lumino/algorithm';
-import { Menu, PanelLayout } from '@lumino/widgets';
-import { FavoritesWidget } from './components';
+import { ReactWidget, UseSignal, folderIcon } from '@jupyterlab/ui-components';
+import { Throttler } from '@lumino/polling';
+import { Menu, PanelLayout, Widget } from '@lumino/widgets';
+import React from 'react';
+import { FavoritesBreadCrumbs, FavoritesWidget } from './components';
 import { starIcon } from './icons';
 import { FavoritesManager } from './manager';
 import { IFavorites, PluginIDs, CommandIDs } from './token';
@@ -20,11 +22,16 @@ import {
   getPinnerActionDescription,
   mergePaths
 } from './utils';
-import { PageConfig } from '@jupyterlab/coreutils';
 
 export { IFavorites } from './token';
 
-const TOOLBAR_CLASS = 'jp-FileBrowser-toolbar';
+const BREADCRUMBS_CLASS = 'jp-FileBrowser-crumbs';
+
+/**
+ * The class name for the node containing the FileBrowser BreadCrumbs favorite icon.  This node
+ * is also responsible for click actions on the icon.
+ */
+const FAVORITE_ITEM_PINNER_CLASS = 'jp-Favorites-pinner';
 
 /**
  * Initialization data for the jupyterlab-favorites extension.
@@ -32,37 +39,92 @@ const TOOLBAR_CLASS = 'jp-FileBrowser-toolbar';
 const favorites: JupyterFrontEndPlugin<IFavorites> = {
   id: PluginIDs.favorites,
   autoStart: true,
-  requires: [IDefaultFileBrowser, IFileBrowserFactory, ISettingRegistry],
+  requires: [IFileBrowserFactory, ISettingRegistry],
   provides: IFavorites,
-  optional: [IMainMenu],
+  optional: [IDefaultFileBrowser, IMainMenu],
   activate: (
     app: JupyterFrontEnd,
-    filebrowser: IDefaultFileBrowser,
     factory: IFileBrowserFactory,
     settingsRegistry: ISettingRegistry,
-    mainMenu: IMainMenu
+    filebrowser: IDefaultFileBrowser | null,
+    mainMenu: IMainMenu | null
   ): IFavorites => {
     console.log('JupyterLab extension jupyterlab-favorites is activated!');
     const docRegistry = app.docRegistry;
-    const layout = filebrowser.layout as PanelLayout;
     const { commands, serviceManager } = app;
     const favoritesManager = new FavoritesManager(
       PageConfig.getOption('serverRoot') || 'Jupyter Server Root',
       commands,
       settingsRegistry,
-      serviceManager.contents as ContentsManager
+      serviceManager.contents
     );
     favoritesManager.init();
-    const favoritesWidget = new FavoritesWidget(favoritesManager, filebrowser);
-    // Insert the Favorites widget contents at the top of the FileBrowser area under the toolbar
-    let insertIndex = 0;
-    layout.widgets.forEach((widget, index) => {
-      if (widget.node.className.includes(TOOLBAR_CLASS)) {
-        insertIndex = index + 1;
-        return; // no reason to continue to iterate once the className is found
+
+    if (filebrowser) {
+      const favoritesWidget = new FavoritesWidget(
+        favoritesManager,
+        filebrowser
+      );
+      const layout = filebrowser.layout as PanelLayout;
+      layout.insertWidget(0, favoritesWidget);
+
+      const breadcrumbs = filebrowser.node.querySelector(
+        `.${BREADCRUMBS_CLASS}`
+      );
+      if (breadcrumbs) {
+        const initializeBreadcrumbsIcon = () => {
+          if (!breadcrumbs.isConnected) {
+            return;
+          }
+          filebrowser.model.pathChanged.disconnect(initializeBreadcrumbsIcon);
+          const favoriteIcon = ReactWidget.create(
+            <UseSignal
+              signal={filebrowser.model.pathChanged}
+              initialSender={filebrowser.model}
+            >
+              {model => (
+                <FavoritesBreadCrumbs
+                  currentPath={model?.path || ''}
+                  manager={favoritesManager}
+                  handleClick={(path: string) => {
+                    const shouldRemove = favoritesManager.hasFavorite(path);
+                    if (shouldRemove) {
+                      favoritesManager.removeFavorite(path);
+                    } else {
+                      const favorite = {
+                        root: favoritesManager.serverRoot,
+                        contentType: 'directory',
+                        iconLabel: folderIcon.name,
+                        path
+                      } as IFavorites.Favorite;
+                      favoritesManager.addFavorite(favorite);
+                    }
+                  }}
+                ></FavoritesBreadCrumbs>
+              )}
+            </UseSignal>
+          );
+          favoriteIcon.addClass(FAVORITE_ITEM_PINNER_CLASS);
+          Widget.attach(favoriteIcon, breadcrumbs as HTMLElement);
+          const throttler = new Throttler(() => {
+            breadcrumbs.insertAdjacentElement('beforeend', favoriteIcon.node);
+          });
+          const observer = new MutationObserver(() => {
+            throttler.invoke();
+          });
+
+          observer.observe(breadcrumbs, { childList: true });
+
+          filebrowser.disposed.connect(() => {
+            throttler.dispose();
+            observer.disconnect();
+          });
+        };
+
+        filebrowser.model.pathChanged.connect(initializeBreadcrumbsIcon);
+        initializeBreadcrumbsIcon();
       }
-    });
-    layout.insertWidget(insertIndex, favoritesWidget);
+    }
 
     // Context Menu commands
     const getSelectedItems = () => {
@@ -70,9 +132,10 @@ const favorites: JupyterFrontEndPlugin<IFavorites> = {
       if (!widget) {
         return [];
       }
-      return toArray(widget.selectedItems());
+      return Array.from(widget.selectedItems());
     };
     const { tracker } = factory;
+
     commands.addCommand(CommandIDs.addOrRemoveFavorite, {
       execute: () => {
         const selectedItems = getSelectedItems();
@@ -109,11 +172,7 @@ const favorites: JupyterFrontEndPlugin<IFavorites> = {
         return getPinnerActionDescription(showRemove);
       }
     });
-    app.contextMenu.addItem({
-      command: CommandIDs.addOrRemoveFavorite,
-      selector: '.jp-DirListing-item[data-isdir]',
-      rank: 3
-    });
+
     commands.addCommand(CommandIDs.removeFavorite, {
       execute: () => {
         const contextNode: HTMLElement = app.contextMenuHitTest(node =>
@@ -129,11 +188,7 @@ const favorites: JupyterFrontEndPlugin<IFavorites> = {
       icon: starIcon,
       label: 'Remove Favorite'
     });
-    app.contextMenu.addItem({
-      command: CommandIDs.removeFavorite,
-      selector: '.jp-Favorites-item',
-      rank: 0
-    });
+
     // Main Menu
     if (mainMenu) {
       mainMenu.fileMenu.addGroup(
@@ -145,45 +200,45 @@ const favorites: JupyterFrontEndPlugin<IFavorites> = {
         ],
         1
       );
-    }
-    // Try to merge with existing Group 1
-    try {
-      const groups = (mainMenu.fileMenu as any)._ranks;
-      let numRankOneGroups = 0;
-      let openGroupIndex = -1;
-      for (let i = 0; i < groups.length; i++) {
-        const group = groups[i];
-        if (group.rank === 1) {
-          numRankOneGroups += 1;
-          if (openGroupIndex < 0) {
-            openGroupIndex = i;
+      // Try to merge with existing Group 1
+      try {
+        const groups = (mainMenu.fileMenu as any)._ranks;
+        let numRankOneGroups = 0;
+        let openGroupIndex = -1;
+        for (let i = 0; i < groups.length; i++) {
+          const group = groups[i];
+          if (group.rank === 1) {
+            numRankOneGroups += 1;
+            if (openGroupIndex < 0) {
+              openGroupIndex = i;
+            }
           }
         }
-      }
-      if (numRankOneGroups === 2) {
-        const openGroup = groups[openGroupIndex];
-        openGroup.size = openGroup.size + 1;
-        groups.splice(openGroupIndex + 1, 1);
-        const fileMenu = (mainMenu.fileMenu as any).menu;
-        const fileMenuItems = fileMenu._items;
-        let removeSeparators = false;
-        for (let i = fileMenuItems.length - 1; i > 0; i--) {
-          const fileMenuItem = fileMenuItems[i];
-          if (fileMenuItem.command === 'filebrowser:open-path') {
-            break;
-          }
-          if (removeSeparators && fileMenuItem.type === 'separator') {
-            fileMenu.removeItemAt(i);
-          } else if (fileMenuItem.type === 'submenu') {
-            const label = fileMenuItem.submenu.title.label;
-            if (label === 'Favorites') {
-              removeSeparators = true;
+        if (numRankOneGroups === 2) {
+          const openGroup = groups[openGroupIndex];
+          openGroup.size = openGroup.size + 1;
+          groups.splice(openGroupIndex + 1, 1);
+          const fileMenu = (mainMenu.fileMenu as any).menu;
+          const fileMenuItems = fileMenu._items;
+          let removeSeparators = false;
+          for (let i = fileMenuItems.length - 1; i > 0; i--) {
+            const fileMenuItem = fileMenuItems[i];
+            if (fileMenuItem.command === 'filebrowser:open-path') {
+              break;
+            }
+            if (removeSeparators && fileMenuItem.type === 'separator') {
+              fileMenu.removeItemAt(i);
+            } else if (fileMenuItem.type === 'submenu') {
+              const label = fileMenuItem.submenu.title.label;
+              if (label === 'Favorites') {
+                removeSeparators = true;
+              }
             }
           }
         }
+      } catch (e) {
+        console.log(e);
       }
-    } catch (e) {
-      console.log(e);
     }
     // Commands
     commands.addCommand(CommandIDs.openFavorite, {
diff --git a/src/manager.ts b/src/manager.ts
index e1973bd..6c5db9b 100644
--- a/src/manager.ts
+++ b/src/manager.ts
@@ -2,7 +2,7 @@ import { Menu } from '@lumino/widgets';
 import { Signal } from '@lumino/signaling';
 import { ISettingRegistry } from '@jupyterlab/settingregistry';
 import { CommandRegistry } from '@lumino/commands';
-import { ContentsManager } from '@jupyterlab/services';
+import { Contents } from '@jupyterlab/services';
 import { IFavorites, SettingIDs, CommandIDs } from './token';
 import { getName } from './utils';
 
@@ -15,7 +15,7 @@ export class FavoritesManager {
     serverRoot: string,
     commands: CommandRegistry,
     settings: ISettingRegistry,
-    contents: ContentsManager
+    contents: Contents.IManager
   ) {
     this._showWidget = true;
     this._serverRoot = serverRoot;
@@ -211,7 +211,7 @@ export class FavoritesManager {
 
   private _settingsRegistry: ISettingRegistry;
   private _commandRegistry: CommandRegistry;
-  private _contentsManager: ContentsManager;
+  private _contentsManager: Contents.IManager;
   private _favorites: IFavorites.Favorite[] = [];
   private _serverRoot: string;
   private _showWidget = false;
diff --git a/style/base.css b/style/base.css
index 1bf327b..16e7777 100644
--- a/style/base.css
+++ b/style/base.css
@@ -1,15 +1,8 @@
 .jp-Favorites-pinner {
-  position: absolute;
-  right: 6px;
-  bottom: -59px;
+  float: right;
   cursor: pointer;
 }
 
-/* Increase the right margin from 12px to allow room for pinner */
-.jp-BreadCrumbs.jp-FileBrowser-crumbs {
-  margin: 4px 26px 4px 12px;
-}
-
 .jp-Favorites-BreadCrumbs-Icon svg {
   border-radius: var(--jp-border-radius);
   cursor: pointer;
diff --git a/yarn.lock b/yarn.lock
index e0c2e20..08af28e 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -194,6 +194,7 @@ __metadata:
     "@lumino/algorithm": ^2.0.0
     "@lumino/commands": ^2.0.1
     "@lumino/coreutils": ^2.0.1
+    "@lumino/polling": ^2.0.0
     "@lumino/signaling": ^2.0.0
     "@lumino/widgets": ^2.0.1
     "@types/json-schema": ^7.0.11
@@ -765,7 +766,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@lumino/polling@npm:^2.1.2":
+"@lumino/polling@npm:^2.0.0, @lumino/polling@npm:^2.1.2":
   version: 2.1.2
   resolution: "@lumino/polling@npm:2.1.2"
   dependencies:


Test patch:
diff --git a/ui-tests/package.json b/ui-tests/package.json
index 8b1bc1f..a326fce 100644
--- a/ui-tests/package.json
+++ b/ui-tests/package.json
@@ -9,7 +9,7 @@
     "test:update": "jlpm playwright test --update-snapshots"
   },
   "devDependencies": {
-    "@jupyterlab/galata": "^5.0.5",
+    "@jupyterlab/galata": "^5.0.6",
     "@playwright/test": "^1.37.0"
   }
 }
diff --git a/ui-tests/tests/jupyterlab_favorites.spec.ts b/ui-tests/tests/jupyterlab_favorites.spec.ts
index 4d9451e..8752111 100644
--- a/ui-tests/tests/jupyterlab_favorites.spec.ts
+++ b/ui-tests/tests/jupyterlab_favorites.spec.ts
@@ -44,8 +44,7 @@ test('should remove a favorite from widget', async ({ page }) => {
   ).toHaveCount(0);
 });
 
-// FIXME
-test.skip('should remove a favorite from breadcrumb', async ({ page }) => {
+test('should remove a favorite from breadcrumb', async ({ page }) => {
   // Set folder as favorite
   await page.getByText('Untitled Folder').click({ button: 'right' });
   await page.getByRole('menuitem', { name: 'Add Favorite' }).click();
@@ -55,6 +54,10 @@ test.skip('should remove a favorite from breadcrumb', async ({ page }) => {
 
   await page.getByTitle('Remove Favorite').click();
 
+  await expect
+    .soft(page.getByRole('button', { name: 'Add Favorite' }))
+    .toBeVisible();
+
   await expect(
     page.locator('.jp-Favorites').getByText('Untitled Folder')
   ).toHaveCount(0);
diff --git a/ui-tests/yarn.lock b/ui-tests/yarn.lock
index acc5758..0f24e2f 100644
--- a/ui-tests/yarn.lock
+++ b/ui-tests/yarn.lock
@@ -283,7 +283,7 @@ __metadata:
   version: 0.0.0-use.local
   resolution: "@jlab-enhanced/favorites-ui-tests@workspace:."
   dependencies:
-    "@jupyterlab/galata": ^5.0.5
+    "@jupyterlab/galata": ^5.0.6
     "@playwright/test": ^1.37.0
   languageName: unknown
   linkType: soft
@@ -302,20 +302,20 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@jupyterlab/application@npm:^4.0.5":
-  version: 4.0.5
-  resolution: "@jupyterlab/application@npm:4.0.5"
+"@jupyterlab/application@npm:^4.0.7":
+  version: 4.0.7
+  resolution: "@jupyterlab/application@npm:4.0.7"
   dependencies:
     "@fortawesome/fontawesome-free": ^5.12.0
-    "@jupyterlab/apputils": ^4.1.5
-    "@jupyterlab/coreutils": ^6.0.5
-    "@jupyterlab/docregistry": ^4.0.5
-    "@jupyterlab/rendermime": ^4.0.5
-    "@jupyterlab/rendermime-interfaces": ^3.8.5
-    "@jupyterlab/services": ^7.0.5
-    "@jupyterlab/statedb": ^4.0.5
-    "@jupyterlab/translation": ^4.0.5
-    "@jupyterlab/ui-components": ^4.0.5
+    "@jupyterlab/apputils": ^4.1.7
+    "@jupyterlab/coreutils": ^6.0.7
+    "@jupyterlab/docregistry": ^4.0.7
+    "@jupyterlab/rendermime": ^4.0.7
+    "@jupyterlab/rendermime-interfaces": ^3.8.7
+    "@jupyterlab/services": ^7.0.7
+    "@jupyterlab/statedb": ^4.0.7
+    "@jupyterlab/translation": ^4.0.7
+    "@jupyterlab/ui-components": ^4.0.7
     "@lumino/algorithm": ^2.0.1
     "@lumino/application": ^2.2.1
     "@lumino/commands": ^2.1.3
@@ -326,23 +326,23 @@ __metadata:
     "@lumino/properties": ^2.0.1
     "@lumino/signaling": ^2.1.2
     "@lumino/widgets": ^2.3.0
-  checksum: 532f0090016d72fd7c2366a7d6de44033ccdc9b70f0a27a13141ce673d0ebad7804c73c0c55f18ccf3e0dec5c6f7d0190ef489753c220d649c2f42d6b0c8e61f
+  checksum: 4684edfcf7dfe9724e86938cf50a45a3518650dba3535bea9d13e024dcc9cd80a5862d2c1564b6498f6f086253766c0952eded677c93ce56b8b7265d739892c4
   languageName: node
   linkType: hard
 
-"@jupyterlab/apputils@npm:^4.1.5":
-  version: 4.1.5
-  resolution: "@jupyterlab/apputils@npm:4.1.5"
+"@jupyterlab/apputils@npm:^4.1.7":
+  version: 4.1.7
+  resolution: "@jupyterlab/apputils@npm:4.1.7"
   dependencies:
-    "@jupyterlab/coreutils": ^6.0.5
-    "@jupyterlab/observables": ^5.0.5
-    "@jupyterlab/rendermime-interfaces": ^3.8.5
-    "@jupyterlab/services": ^7.0.5
-    "@jupyterlab/settingregistry": ^4.0.5
-    "@jupyterlab/statedb": ^4.0.5
-    "@jupyterlab/statusbar": ^4.0.5
-    "@jupyterlab/translation": ^4.0.5
-    "@jupyterlab/ui-components": ^4.0.5
+    "@jupyterlab/coreutils": ^6.0.7
+    "@jupyterlab/observables": ^5.0.7
+    "@jupyterlab/rendermime-interfaces": ^3.8.7
+    "@jupyterlab/services": ^7.0.7
+    "@jupyterlab/settingregistry": ^4.0.7
+    "@jupyterlab/statedb": ^4.0.7
+    "@jupyterlab/statusbar": ^4.0.7
+    "@jupyterlab/translation": ^4.0.7
+    "@jupyterlab/ui-components": ^4.0.7
     "@lumino/algorithm": ^2.0.1
     "@lumino/commands": ^2.1.3
     "@lumino/coreutils": ^2.1.2
@@ -355,46 +355,46 @@ __metadata:
     "@types/react": ^18.0.26
     react: ^18.2.0
     sanitize-html: ~2.7.3
-  checksum: b569303e8b38173de8612a3c04bac349f25c151bbb83b4f594311d679896aed37ba1467e9ff123e605c0d5400c89cf0d66fce697440ea07fff9dd4a408148e2f
+  checksum: d8a3739ea4b74244b0e14e6a9bced973cc2fc8eb645fe25d36da960e3413492c5451332f44975ba601daecbe6b1e80073f36860f65482da16e94ed24f11a5947
   languageName: node
   linkType: hard
 
-"@jupyterlab/attachments@npm:^4.0.5":
-  version: 4.0.5
-  resolution: "@jupyterlab/attachments@npm:4.0.5"
+"@jupyterlab/attachments@npm:^4.0.7":
+  version: 4.0.7
+  resolution: "@jupyterlab/attachments@npm:4.0.7"
   dependencies:
-    "@jupyterlab/nbformat": ^4.0.5
-    "@jupyterlab/observables": ^5.0.5
-    "@jupyterlab/rendermime": ^4.0.5
-    "@jupyterlab/rendermime-interfaces": ^3.8.5
+    "@jupyterlab/nbformat": ^4.0.7
+    "@jupyterlab/observables": ^5.0.7
+    "@jupyterlab/rendermime": ^4.0.7
+    "@jupyterlab/rendermime-interfaces": ^3.8.7
     "@lumino/disposable": ^2.1.2
     "@lumino/signaling": ^2.1.2
-  checksum: bb0a5dc7e830fc42824743cc817cf59a43c43b6f3979b3d6214619baf69f77bb70606241b39a92da21788348eb1144a0914e3683f0b2b8d01a530e8aeaf6f01e
+  checksum: ff118f55b8fbf08d112aef9f1f9867a6310578afacff9953af3c30205d338ed88bc44204112597bd325bc6b2eeb88e5f901187628e869853c9e9b5c2b77e4eb8
   languageName: node
   linkType: hard
 
-"@jupyterlab/cells@npm:^4.0.5":
-  version: 4.0.5
-  resolution: "@jupyterlab/cells@npm:4.0.5"
+"@jupyterlab/cells@npm:^4.0.7":
+  version: 4.0.7
+  resolution: "@jupyterlab/cells@npm:4.0.7"
   dependencies:
     "@codemirror/state": ^6.2.0
     "@codemirror/view": ^6.9.6
     "@jupyter/ydoc": ^1.0.2
-    "@jupyterlab/apputils": ^4.1.5
-    "@jupyterlab/attachments": ^4.0.5
-    "@jupyterlab/codeeditor": ^4.0.5
-    "@jupyterlab/codemirror": ^4.0.5
-    "@jupyterlab/coreutils": ^6.0.5
-    "@jupyterlab/documentsearch": ^4.0.5
-    "@jupyterlab/filebrowser": ^4.0.5
-    "@jupyterlab/nbformat": ^4.0.5
-    "@jupyterlab/observables": ^5.0.5
-    "@jupyterlab/outputarea": ^4.0.5
-    "@jupyterlab/rendermime": ^4.0.5
-    "@jupyterlab/services": ^7.0.5
-    "@jupyterlab/toc": ^6.0.5
-    "@jupyterlab/translation": ^4.0.5
-    "@jupyterlab/ui-components": ^4.0.5
+    "@jupyterlab/apputils": ^4.1.7
+    "@jupyterlab/attachments": ^4.0.7
+    "@jupyterlab/codeeditor": ^4.0.7
+    "@jupyterlab/codemirror": ^4.0.7
+    "@jupyterlab/coreutils": ^6.0.7
+    "@jupyterlab/documentsearch": ^4.0.7
+    "@jupyterlab/filebrowser": ^4.0.7
+    "@jupyterlab/nbformat": ^4.0.7
+    "@jupyterlab/observables": ^5.0.7
+    "@jupyterlab/outputarea": ^4.0.7
+    "@jupyterlab/rendermime": ^4.0.7
+    "@jupyterlab/services": ^7.0.7
+    "@jupyterlab/toc": ^6.0.7
+    "@jupyterlab/translation": ^4.0.7
+    "@jupyterlab/ui-components": ^4.0.7
     "@lumino/algorithm": ^2.0.1
     "@lumino/coreutils": ^2.1.2
     "@lumino/domutils": ^2.0.1
@@ -405,22 +405,22 @@ __metadata:
     "@lumino/virtualdom": ^2.0.1
     "@lumino/widgets": ^2.3.0
     react: ^18.2.0
-  checksum: d674a15ddf870bea876d8b40ec598bbe9ba6d59b653223b381beec7e4e1e18c1b2c623585a9edc24e186dc666d73c63c55cee76ec83f975183f17bb5a56a8573
+  checksum: 3b986c3fb734031ce998e7a67208d06b0c0892a972db1d8123767bdcc9e14109f7e79be3f116f788bcfc2194e7a5a14d5918671c9021b9de51e82ca7f0421436
   languageName: node
   linkType: hard
 
-"@jupyterlab/codeeditor@npm:^4.0.5":
-  version: 4.0.5
-  resolution: "@jupyterlab/codeeditor@npm:4.0.5"
+"@jupyterlab/codeeditor@npm:^4.0.7":
+  version: 4.0.7
+  resolution: "@jupyterlab/codeeditor@npm:4.0.7"
   dependencies:
     "@codemirror/state": ^6.2.0
     "@jupyter/ydoc": ^1.0.2
-    "@jupyterlab/coreutils": ^6.0.5
-    "@jupyterlab/nbformat": ^4.0.5
-    "@jupyterlab/observables": ^5.0.5
-    "@jupyterlab/statusbar": ^4.0.5
-    "@jupyterlab/translation": ^4.0.5
-    "@jupyterlab/ui-components": ^4.0.5
+    "@jupyterlab/coreutils": ^6.0.7
+    "@jupyterlab/nbformat": ^4.0.7
+    "@jupyterlab/observables": ^5.0.7
+    "@jupyterlab/statusbar": ^4.0.7
+    "@jupyterlab/translation": ^4.0.7
+    "@jupyterlab/ui-components": ^4.0.7
     "@lumino/coreutils": ^2.1.2
     "@lumino/disposable": ^2.1.2
     "@lumino/dragdrop": ^2.1.3
@@ -428,13 +428,13 @@ __metadata:
     "@lumino/signaling": ^2.1.2
     "@lumino/widgets": ^2.3.0
     react: ^18.2.0
-  checksum: 4bd539cd22ccf84b982b427ad921b33f0e4dd0c02980827b59bf748b30c6e85180e03357f92c2a2b54c3e086965d2458b6a5f2043160ede85f530a14300b3f00
+  checksum: d6c1c072b77f0afdc4c61ed9392297b43afa5ef0a3279e05631ead870122f9195eb9d5b6182b1ee984aa4fa7aee56051e710d601c550e43af27d43fc3397c333
   languageName: node
   linkType: hard
 
-"@jupyterlab/codemirror@npm:^4.0.5":
-  version: 4.0.5
-  resolution: "@jupyterlab/codemirror@npm:4.0.5"
+"@jupyterlab/codemirror@npm:^4.0.7":
+  version: 4.0.7
+  resolution: "@jupyterlab/codemirror@npm:4.0.7"
   dependencies:
     "@codemirror/autocomplete": ^6.5.1
     "@codemirror/commands": ^6.2.3
@@ -457,11 +457,11 @@ __metadata:
     "@codemirror/state": ^6.2.0
     "@codemirror/view": ^6.9.6
     "@jupyter/ydoc": ^1.0.2
-    "@jupyterlab/codeeditor": ^4.0.5
-    "@jupyterlab/coreutils": ^6.0.5
-    "@jupyterlab/documentsearch": ^4.0.5
-    "@jupyterlab/nbformat": ^4.0.5
-    "@jupyterlab/translation": ^4.0.5
+    "@jupyterlab/codeeditor": ^4.0.7
+    "@jupyterlab/coreutils": ^6.0.7
+    "@jupyterlab/documentsearch": ^4.0.7
+    "@jupyterlab/nbformat": ^4.0.7
+    "@jupyterlab/translation": ^4.0.7
     "@lezer/common": ^1.0.2
     "@lezer/generator": ^1.2.2
     "@lezer/highlight": ^1.1.4
@@ -470,40 +470,40 @@ __metadata:
     "@lumino/disposable": ^2.1.2
     "@lumino/signaling": ^2.1.2
     yjs: ^13.5.40
-  checksum: 840d9abd7c34ce7fb09446eff235e056e2d04da290f83380c020a9c3e2a1a27c0d3fc7ffcbd54a1f6de6325a57cc18d350d30c61a0f27d9810d8d2ec32aa5cf2
+  checksum: 8b813dc5144a5adbfd535fe4c817ba96a2c123e60999674ea60ac207fa2b7d06d34314b46bf07564b9c6ca3c21077c5ee34279a857c9191b3133a488f0bf1c22
   languageName: node
   linkType: hard
 
-"@jupyterlab/console@npm:^4.0.5":
-  version: 4.0.5
-  resolution: "@jupyterlab/console@npm:4.0.5"
+"@jupyterlab/console@npm:^4.0.7":
+  version: 4.0.7
+  resolution: "@jupyterlab/console@npm:4.0.7"
   dependencies:
     "@codemirror/state": ^6.2.0
     "@codemirror/view": ^6.9.6
     "@jupyter/ydoc": ^1.0.2
-    "@jupyterlab/apputils": ^4.1.5
-    "@jupyterlab/cells": ^4.0.5
-    "@jupyterlab/codeeditor": ^4.0.5
-    "@jupyterlab/coreutils": ^6.0.5
-    "@jupyterlab/nbformat": ^4.0.5
-    "@jupyterlab/observables": ^5.0.5
-    "@jupyterlab/rendermime": ^4.0.5
-    "@jupyterlab/services": ^7.0.5
-    "@jupyterlab/translation": ^4.0.5
-    "@jupyterlab/ui-components": ^4.0.5
+    "@jupyterlab/apputils": ^4.1.7
+    "@jupyterlab/cells": ^4.0.7
+    "@jupyterlab/codeeditor": ^4.0.7
+    "@jupyterlab/coreutils": ^6.0.7
+    "@jupyterlab/nbformat": ^4.0.7
+    "@jupyterlab/observables": ^5.0.7
+    "@jupyterlab/rendermime": ^4.0.7
+    "@jupyterlab/services": ^7.0.7
+    "@jupyterlab/translation": ^4.0.7
+    "@jupyterlab/ui-components": ^4.0.7
     "@lumino/coreutils": ^2.1.2
     "@lumino/disposable": ^2.1.2
     "@lumino/dragdrop": ^2.1.3
     "@lumino/messaging": ^2.0.1
     "@lumino/signaling": ^2.1.2
     "@lumino/widgets": ^2.3.0
-  checksum: 22837f4dc7445370c3b2e971a58403f6b71843e103d65766e9aaa63757d34c0ba04399fa826fcd13a5530dbcbe31227cd6c6766900ef88a56cbea4a84ade0da7
+  checksum: b70117300da44405a60ce8faf1627569a0954c04d516d6ff0edc7247b0e7183e8bf42425b63bb601c9db9dc04599527b68f249af7d09980eaa56d27a9d85b5a4
   languageName: node
   linkType: hard
 
-"@jupyterlab/coreutils@npm:^6.0.5":
-  version: 6.0.5
-  resolution: "@jupyterlab/coreutils@npm:6.0.5"
+"@jupyterlab/coreutils@npm:^6.0.7":
+  version: 6.0.7
+  resolution: "@jupyterlab/coreutils@npm:6.0.7"
   dependencies:
     "@lumino/coreutils": ^2.1.2
     "@lumino/disposable": ^2.1.2
@@ -511,32 +511,32 @@ __metadata:
     minimist: ~1.2.0
     path-browserify: ^1.0.0
     url-parse: ~1.5.4
-  checksum: c09be7c8f389bb7f019fb868acfc528a0bc553a7b091412b7e0bfb1d0f2c71223ada8d6972d42df25fb6f70be21ecac00703e12d1df62a44dc2a512baac54dac
+  checksum: 18a14e0bc957bf087c3de3e86c5dc7ee568027906edf5dc820d9c794af6c9dece84d0b396e837786849f9144bb156746e3d4f2e838fd023a42eee94ebeb9014f
   languageName: node
   linkType: hard
 
-"@jupyterlab/debugger@npm:^4.0.5":
-  version: 4.0.5
-  resolution: "@jupyterlab/debugger@npm:4.0.5"
+"@jupyterlab/debugger@npm:^4.0.7":
+  version: 4.0.7
+  resolution: "@jupyterlab/debugger@npm:4.0.7"
   dependencies:
     "@codemirror/state": ^6.2.0
     "@codemirror/view": ^6.9.6
     "@jupyter/ydoc": ^1.0.2
-    "@jupyterlab/application": ^4.0.5
-    "@jupyterlab/apputils": ^4.1.5
-    "@jupyterlab/cells": ^4.0.5
-    "@jupyterlab/codeeditor": ^4.0.5
-    "@jupyterlab/codemirror": ^4.0.5
-    "@jupyterlab/console": ^4.0.5
-    "@jupyterlab/coreutils": ^6.0.5
-    "@jupyterlab/docregistry": ^4.0.5
-    "@jupyterlab/fileeditor": ^4.0.5
-    "@jupyterlab/notebook": ^4.0.5
-    "@jupyterlab/observables": ^5.0.5
-    "@jupyterlab/rendermime": ^4.0.5
-    "@jupyterlab/services": ^7.0.5
-    "@jupyterlab/translation": ^4.0.5
-    "@jupyterlab/ui-components": ^4.0.5
+    "@jupyterlab/application": ^4.0.7
+    "@jupyterlab/apputils": ^4.1.7
+    "@jupyterlab/cells": ^4.0.7
+    "@jupyterlab/codeeditor": ^4.0.7
+    "@jupyterlab/codemirror": ^4.0.7
+    "@jupyterlab/console": ^4.0.7
+    "@jupyterlab/coreutils": ^6.0.7
+    "@jupyterlab/docregistry": ^4.0.7
+    "@jupyterlab/fileeditor": ^4.0.7
+    "@jupyterlab/notebook": ^4.0.7
+    "@jupyterlab/observables": ^5.0.7
+    "@jupyterlab/rendermime": ^4.0.7
+    "@jupyterlab/services": ^7.0.7
+    "@jupyterlab/translation": ^4.0.7
+    "@jupyterlab/ui-components": ^4.0.7
     "@lumino/algorithm": ^2.0.1
     "@lumino/commands": ^2.1.3
     "@lumino/coreutils": ^2.1.2
@@ -548,21 +548,21 @@ __metadata:
     "@lumino/widgets": ^2.3.0
     "@vscode/debugprotocol": ^1.51.0
     react: ^18.2.0
-  checksum: edeab0e4efa20ffcd0572efa863c988c6d4f413b22fabb139dc560fb8b31c833fc774974898af94f81d62a25c41df23b25434247ac0b180276211f322228bce4
+  checksum: c3c972a90978f6aae790e442fe7f97d6044783675e087989618f788b69f237700f75a1c1e40d9e0a34939e4f63c5f390afc96e264b002d38edfa54b8ccec244a
   languageName: node
   linkType: hard
 
-"@jupyterlab/docmanager@npm:^4.0.5":
-  version: 4.0.5
-  resolution: "@jupyterlab/docmanager@npm:4.0.5"
-  dependencies:
-    "@jupyterlab/apputils": ^4.1.5
-    "@jupyterlab/coreutils": ^6.0.5
-    "@jupyterlab/docregistry": ^4.0.5
-    "@jupyterlab/services": ^7.0.5
-    "@jupyterlab/statusbar": ^4.0.5
-    "@jupyterlab/translation": ^4.0.5
-    "@jupyterlab/ui-components": ^4.0.5
+"@jupyterlab/docmanager@npm:^4.0.7":
+  version: 4.0.7
+  resolution: "@jupyterlab/docmanager@npm:4.0.7"
+  dependencies:
+    "@jupyterlab/apputils": ^4.1.7
+    "@jupyterlab/coreutils": ^6.0.7
+    "@jupyterlab/docregistry": ^4.0.7
+    "@jupyterlab/services": ^7.0.7
+    "@jupyterlab/statusbar": ^4.0.7
+    "@jupyterlab/translation": ^4.0.7
+    "@jupyterlab/ui-components": ^4.0.7
     "@lumino/algorithm": ^2.0.1
     "@lumino/coreutils": ^2.1.2
     "@lumino/disposable": ^2.1.2
@@ -571,24 +571,24 @@ __metadata:
     "@lumino/signaling": ^2.1.2
     "@lumino/widgets": ^2.3.0
     react: ^18.2.0
-  checksum: 16627833d9d540e9569bd27e3464c6c9a5cf9f628265b5018a4f63e05f351c4891494b8c731f83bb279da3bb42d0da23cb1d1b536c0b1b4422e4f6f250377ca5
+  checksum: 4ccbcfa431563cb0cdfa12d0f1ffed107816b8bcd420de5b6dc85e6c124ff1f691e72ce421102663880dc340717bfb71bdceb25eb8fc4074e08adb58ae6ba371
   languageName: node
   linkType: hard
 
-"@jupyterlab/docregistry@npm:^4.0.5":
-  version: 4.0.5
-  resolution: "@jupyterlab/docregistry@npm:4.0.5"
+"@jupyterlab/docregistry@npm:^4.0.7":
+  version: 4.0.7
+  resolution: "@jupyterlab/docregistry@npm:4.0.7"
   dependencies:
     "@jupyter/ydoc": ^1.0.2
-    "@jupyterlab/apputils": ^4.1.5
-    "@jupyterlab/codeeditor": ^4.0.5
-    "@jupyterlab/coreutils": ^6.0.5
-    "@jupyterlab/observables": ^5.0.5
-    "@jupyterlab/rendermime": ^4.0.5
-    "@jupyterlab/rendermime-interfaces": ^3.8.5
-    "@jupyterlab/services": ^7.0.5
-    "@jupyterlab/translation": ^4.0.5
-    "@jupyterlab/ui-components": ^4.0.5
+    "@jupyterlab/apputils": ^4.1.7
+    "@jupyterlab/codeeditor": ^4.0.7
+    "@jupyterlab/coreutils": ^6.0.7
+    "@jupyterlab/observables": ^5.0.7
+    "@jupyterlab/rendermime": ^4.0.7
+    "@jupyterlab/rendermime-interfaces": ^3.8.7
+    "@jupyterlab/services": ^7.0.7
+    "@jupyterlab/translation": ^4.0.7
+    "@jupyterlab/ui-components": ^4.0.7
     "@lumino/algorithm": ^2.0.1
     "@lumino/coreutils": ^2.1.2
     "@lumino/disposable": ^2.1.2
@@ -596,17 +596,17 @@ __metadata:
     "@lumino/properties": ^2.0.1
     "@lumino/signaling": ^2.1.2
     "@lumino/widgets": ^2.3.0
-  checksum: 455286f8fbeb00f7afcc52c43830d6ab6941020338df23564591a0a59e1b2551f918a55382540983a1bf0b1bf4bdfc008b88f5acbff4a2e3c5dca6ac1dd84a6d
+  checksum: 1d420696305dc17b2e96b22bf31af2caf2b16e31529c57b824bf859c71ac5caecb5a0a00d32ebc34ca1af65f720cec2c442d786c0460da60d7f65deb402dd891
   languageName: node
   linkType: hard
 
-"@jupyterlab/documentsearch@npm:^4.0.5":
-  version: 4.0.5
-  resolution: "@jupyterlab/documentsearch@npm:4.0.5"
+"@jupyterlab/documentsearch@npm:^4.0.7":
+  version: 4.0.7
+  resolution: "@jupyterlab/documentsearch@npm:4.0.7"
   dependencies:
-    "@jupyterlab/apputils": ^4.1.5
-    "@jupyterlab/translation": ^4.0.5
-    "@jupyterlab/ui-components": ^4.0.5
+    "@jupyterlab/apputils": ^4.1.7
+    "@jupyterlab/translation": ^4.0.7
+    "@jupyterlab/ui-components": ^4.0.7
     "@lumino/coreutils": ^2.1.2
     "@lumino/disposable": ^2.1.2
     "@lumino/messaging": ^2.0.1
@@ -614,23 +614,23 @@ __metadata:
     "@lumino/signaling": ^2.1.2
     "@lumino/widgets": ^2.3.0
     react: ^18.2.0
-  checksum: d7fe83a57562e9f90555c8b938f77edff21f7204b52a7cdd4a0cd21f5382fd5a7906e5d7c2ec661802b5d9bada42f80fcaa5d129931aeac949e8655d290d9adf
+  checksum: 96f51844b22a2c8e234c85e32915a9af41a54d5bd21a49de63d37181083089c84d18265c14d7d8d5adeb460771ba044e87caafdb82fd0e805837a23d56aa2fe3
   languageName: node
   linkType: hard
 
-"@jupyterlab/filebrowser@npm:^4.0.5":
-  version: 4.0.5
-  resolution: "@jupyterlab/filebrowser@npm:4.0.5"
-  dependencies:
-    "@jupyterlab/apputils": ^4.1.5
-    "@jupyterlab/coreutils": ^6.0.5
-    "@jupyterlab/docmanager": ^4.0.5
-    "@jupyterlab/docregistry": ^4.0.5
-    "@jupyterlab/services": ^7.0.5
-    "@jupyterlab/statedb": ^4.0.5
-    "@jupyterlab/statusbar": ^4.0.5
-    "@jupyterlab/translation": ^4.0.5
-    "@jupyterlab/ui-components": ^4.0.5
+"@jupyterlab/filebrowser@npm:^4.0.7":
+  version: 4.0.7
+  resolution: "@jupyterlab/filebrowser@npm:4.0.7"
+  dependencies:
+    "@jupyterlab/apputils": ^4.1.7
+    "@jupyterlab/coreutils": ^6.0.7
+    "@jupyterlab/docmanager": ^4.0.7
+    "@jupyterlab/docregistry": ^4.0.7
+    "@jupyterlab/services": ^7.0.7
+    "@jupyterlab/statedb": ^4.0.7
+    "@jupyterlab/statusbar": ^4.0.7
+    "@jupyterlab/translation": ^4.0.7
+    "@jupyterlab/ui-components": ^4.0.7
     "@lumino/algorithm": ^2.0.1
     "@lumino/coreutils": ^2.1.2
     "@lumino/disposable": ^2.1.2
@@ -642,48 +642,48 @@ __metadata:
     "@lumino/virtualdom": ^2.0.1
     "@lumino/widgets": ^2.3.0
     react: ^18.2.0
-  checksum: f47d55cc8ff246efe65fdbf1f0fc09e227eca9bafcf0f1e45e1973612ad13e0853f1393882decddc2f1df015f11097b6d751bdbcdc255ed438adc96598b376a8
+  checksum: 586b8a07fbe0a9bb0b0cd13a9d6fb083e797831a41fc5273d70124bb2daeeeb641e6b4584fc752a4799a5961bb14acc1379fd09847ef7f38b2908516b9f254e3
   languageName: node
   linkType: hard
 
-"@jupyterlab/fileeditor@npm:^4.0.5":
-  version: 4.0.5
-  resolution: "@jupyterlab/fileeditor@npm:4.0.5"
-  dependencies:
-    "@jupyterlab/apputils": ^4.1.5
-    "@jupyterlab/codeeditor": ^4.0.5
-    "@jupyterlab/codemirror": ^4.0.5
-    "@jupyterlab/coreutils": ^6.0.5
-    "@jupyterlab/docregistry": ^4.0.5
-    "@jupyterlab/documentsearch": ^4.0.5
-    "@jupyterlab/lsp": ^4.0.5
-    "@jupyterlab/statusbar": ^4.0.5
-    "@jupyterlab/toc": ^6.0.5
-    "@jupyterlab/translation": ^4.0.5
-    "@jupyterlab/ui-components": ^4.0.5
+"@jupyterlab/fileeditor@npm:^4.0.7":
+  version: 4.0.7
+  resolution: "@jupyterlab/fileeditor@npm:4.0.7"
+  dependencies:
+    "@jupyterlab/apputils": ^4.1.7
+    "@jupyterlab/codeeditor": ^4.0.7
+    "@jupyterlab/codemirror": ^4.0.7
+    "@jupyterlab/coreutils": ^6.0.7
+    "@jupyterlab/docregistry": ^4.0.7
+    "@jupyterlab/documentsearch": ^4.0.7
+    "@jupyterlab/lsp": ^4.0.7
+    "@jupyterlab/statusbar": ^4.0.7
+    "@jupyterlab/toc": ^6.0.7
+    "@jupyterlab/translation": ^4.0.7
+    "@jupyterlab/ui-components": ^4.0.7
     "@lumino/commands": ^2.1.3
     "@lumino/coreutils": ^2.1.2
     "@lumino/messaging": ^2.0.1
     "@lumino/widgets": ^2.3.0
     react: ^18.2.0
     regexp-match-indices: ^1.0.2
-  checksum: 7598dec866704fb664223b805a3fa7db4eb6506f10b4c59a831404d1462e2d993955b259095ea7d35258bb1be9147860d261f11e48c493331bb77746807565ac
+  checksum: f5b98a599ae8acf89c8a6f7afcaa3b29025d0cd2eb2de6784cfa74149f985238227bd22d0eb5490f67c401b83634c5bdc282ee5761e4732c79104c1d77ccd7bb
   languageName: node
   linkType: hard
 
-"@jupyterlab/galata@npm:^5.0.5":
-  version: 5.0.5
-  resolution: "@jupyterlab/galata@npm:5.0.5"
+"@jupyterlab/galata@npm:^5.0.6":
+  version: 5.0.7
+  resolution: "@jupyterlab/galata@npm:5.0.7"
   dependencies:
-    "@jupyterlab/application": ^4.0.5
-    "@jupyterlab/apputils": ^4.1.5
-    "@jupyterlab/coreutils": ^6.0.5
-    "@jupyterlab/debugger": ^4.0.5
-    "@jupyterlab/docmanager": ^4.0.5
-    "@jupyterlab/nbformat": ^4.0.5
-    "@jupyterlab/notebook": ^4.0.5
-    "@jupyterlab/services": ^7.0.5
-    "@jupyterlab/settingregistry": ^4.0.5
+    "@jupyterlab/application": ^4.0.7
+    "@jupyterlab/apputils": ^4.1.7
+    "@jupyterlab/coreutils": ^6.0.7
+    "@jupyterlab/debugger": ^4.0.7
+    "@jupyterlab/docmanager": ^4.0.7
+    "@jupyterlab/nbformat": ^4.0.7
+    "@jupyterlab/notebook": ^4.0.7
+    "@jupyterlab/services": ^7.0.7
+    "@jupyterlab/settingregistry": ^4.0.7
     "@lumino/coreutils": ^2.1.2
     "@playwright/test": ^1.32.2
     "@stdlib/stats": ~0.0.13
@@ -694,20 +694,20 @@ __metadata:
     vega: ^5.20.0
     vega-lite: ^5.6.1
     vega-statistics: ^1.7.9
-  checksum: 1e3562d2e81be6e4dac9451be0f97c519ffec7869bebaa6b2ed164686c13cac28bfaca3ba3191964eb7a0f25029be86d5310e038247cc2a39ab186505e728901
+  checksum: 133da1b41eaaf5f194af95d56493bf4229845ccddde7ea7acb9295efff1c6b61ff45ddd316bd50828991cf76c6f800e22e6d934f59f00e221b94e6335b665d8f
   languageName: node
   linkType: hard
 
-"@jupyterlab/lsp@npm:^4.0.5":
-  version: 4.0.5
-  resolution: "@jupyterlab/lsp@npm:4.0.5"
-  dependencies:
-    "@jupyterlab/apputils": ^4.1.5
-    "@jupyterlab/codeeditor": ^4.0.5
-    "@jupyterlab/coreutils": ^6.0.5
-    "@jupyterlab/docregistry": ^4.0.5
-    "@jupyterlab/services": ^7.0.5
-    "@jupyterlab/translation": ^4.0.5
+"@jupyterlab/lsp@npm:^4.0.7":
+  version: 4.0.7
+  resolution: "@jupyterlab/lsp@npm:4.0.7"
+  dependencies:
+    "@jupyterlab/apputils": ^4.1.7
+    "@jupyterlab/codeeditor": ^4.0.7
+    "@jupyterlab/coreutils": ^6.0.7
+    "@jupyterlab/docregistry": ^4.0.7
+    "@jupyterlab/services": ^7.0.7
+    "@jupyterlab/translation": ^4.0.7
     "@lumino/coreutils": ^2.1.2
     "@lumino/disposable": ^2.1.2
     "@lumino/signaling": ^2.1.2
@@ -715,11 +715,11 @@ __metadata:
     vscode-jsonrpc: ^6.0.0
     vscode-languageserver-protocol: ^3.17.0
     vscode-ws-jsonrpc: ~1.0.2
-  checksum: b59d21c9df84963c354422134e525acabab7f7fe2930e4bb5b5b81edd3e8397772ce5c395bc1faa7c79cddb6bfefc9e1c41edfd939241681da483ae3238be00d
+  checksum: a038fb51648b082652850e8a7190e0b9726be3be3b478258954a7a119df78df1b97182c53a4c8e6adb3ca22dbeaf2f5a40935b916a7dccb99952ebe44e112d9c
   languageName: node
   linkType: hard
 
-"@jupyterlab/nbformat@npm:^3.0.0 || ^4.0.0-alpha.21 || ^4.0.0, @jupyterlab/nbformat@npm:^4.0.5":
+"@jupyterlab/nbformat@npm:^3.0.0 || ^4.0.0-alpha.21 || ^4.0.0":
   version: 4.0.5
   resolution: "@jupyterlab/nbformat@npm:4.0.5"
   dependencies:
@@ -728,28 +728,37 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@jupyterlab/notebook@npm:^4.0.5":
-  version: 4.0.5
-  resolution: "@jupyterlab/notebook@npm:4.0.5"
+"@jupyterlab/nbformat@npm:^4.0.7":
+  version: 4.0.7
+  resolution: "@jupyterlab/nbformat@npm:4.0.7"
+  dependencies:
+    "@lumino/coreutils": ^2.1.2
+  checksum: 32a14a6a3e6d068fa34aec385090531100170480869681156dfb510ea9154141277e678031a0df770af8ae5a0f06dc7c00570089c9187485552e1aeba5130ca8
+  languageName: node
+  linkType: hard
+
+"@jupyterlab/notebook@npm:^4.0.7":
+  version: 4.0.7
+  resolution: "@jupyterlab/notebook@npm:4.0.7"
   dependencies:
     "@jupyter/ydoc": ^1.0.2
-    "@jupyterlab/apputils": ^4.1.5
-    "@jupyterlab/cells": ^4.0.5
-    "@jupyterlab/codeeditor": ^4.0.5
-    "@jupyterlab/codemirror": ^4.0.5
-    "@jupyterlab/coreutils": ^6.0.5
-    "@jupyterlab/docregistry": ^4.0.5
-    "@jupyterlab/documentsearch": ^4.0.5
-    "@jupyterlab/lsp": ^4.0.5
-    "@jupyterlab/nbformat": ^4.0.5
-    "@jupyterlab/observables": ^5.0.5
-    "@jupyterlab/rendermime": ^4.0.5
-    "@jupyterlab/services": ^7.0.5
-    "@jupyterlab/settingregistry": ^4.0.5
-    "@jupyterlab/statusbar": ^4.0.5
-    "@jupyterlab/toc": ^6.0.5
-    "@jupyterlab/translation": ^4.0.5
-    "@jupyterlab/ui-components": ^4.0.5
+    "@jupyterlab/apputils": ^4.1.7
+    "@jupyterlab/cells": ^4.0.7
+    "@jupyterlab/codeeditor": ^4.0.7
+    "@jupyterlab/codemirror": ^4.0.7
+    "@jupyterlab/coreutils": ^6.0.7
+    "@jupyterlab/docregistry": ^4.0.7
+    "@jupyterlab/documentsearch": ^4.0.7
+    "@jupyterlab/lsp": ^4.0.7
+    "@jupyterlab/nbformat": ^4.0.7
+    "@jupyterlab/observables": ^5.0.7
+    "@jupyterlab/rendermime": ^4.0.7
+    "@jupyterlab/services": ^7.0.7
+    "@jupyterlab/settingregistry": ^4.0.7
+    "@jupyterlab/statusbar": ^4.0.7
+    "@jupyterlab/toc": ^6.0.7
+    "@jupyterlab/translation": ^4.0.7
+    "@jupyterlab/ui-components": ^4.0.7
     "@lumino/algorithm": ^2.0.1
     "@lumino/coreutils": ^2.1.2
     "@lumino/domutils": ^2.0.1
@@ -760,34 +769,34 @@ __metadata:
     "@lumino/virtualdom": ^2.0.1
     "@lumino/widgets": ^2.3.0
     react: ^18.2.0
-  checksum: c6979a1b3cc1a6e4eb82176d97bc2109f8f3bcf6b281853a6fb8d350e66fa443dcd34981d46b0aebb03356e6533956dd4ad233e6dee9198acbd62b9c6f027bcd
+  checksum: 75fe89a1c59d47cb861a66b1c36d5e22593e93b8e0f8b3195e43e79e67e87542ccc00f245f3cdbd55617f889f1f7baa0a868d6be7d8fcfdc6ccab53e93f69bf4
   languageName: node
   linkType: hard
 
-"@jupyterlab/observables@npm:^5.0.5":
-  version: 5.0.5
-  resolution: "@jupyterlab/observables@npm:5.0.5"
+"@jupyterlab/observables@npm:^5.0.7":
+  version: 5.0.7
+  resolution: "@jupyterlab/observables@npm:5.0.7"
   dependencies:
     "@lumino/algorithm": ^2.0.1
     "@lumino/coreutils": ^2.1.2
     "@lumino/disposable": ^2.1.2
     "@lumino/messaging": ^2.0.1
     "@lumino/signaling": ^2.1.2
-  checksum: e94d5a187a356f19db176d16a93e2b380c245a8bcf54eb283b405fc9a39cc937b790a0684defadd0eb103359838751d0184c23c5816c5fc36b86c90e2cbb96b9
+  checksum: 459ec3ec77a12534cd16864892d8d3af3ead32a56956daeb89ab68e16c53651c8f20021e088e5a601b214eed46398bbbaea8bc3dc23f23b2700660558fa7c317
   languageName: node
   linkType: hard
 
-"@jupyterlab/outputarea@npm:^4.0.5":
-  version: 4.0.5
-  resolution: "@jupyterlab/outputarea@npm:4.0.5"
-  dependencies:
-    "@jupyterlab/apputils": ^4.1.5
-    "@jupyterlab/nbformat": ^4.0.5
-    "@jupyterlab/observables": ^5.0.5
-    "@jupyterlab/rendermime": ^4.0.5
-    "@jupyterlab/rendermime-interfaces": ^3.8.5
-    "@jupyterlab/services": ^7.0.5
-    "@jupyterlab/translation": ^4.0.5
+"@jupyterlab/outputarea@npm:^4.0.7":
+  version: 4.0.7
+  resolution: "@jupyterlab/outputarea@npm:4.0.7"
+  dependencies:
+    "@jupyterlab/apputils": ^4.1.7
+    "@jupyterlab/nbformat": ^4.0.7
+    "@jupyterlab/observables": ^5.0.7
+    "@jupyterlab/rendermime": ^4.0.7
+    "@jupyterlab/rendermime-interfaces": ^3.8.7
+    "@jupyterlab/services": ^7.0.7
+    "@jupyterlab/translation": ^4.0.7
     "@lumino/algorithm": ^2.0.1
     "@lumino/coreutils": ^2.1.2
     "@lumino/disposable": ^2.1.2
@@ -795,65 +804,65 @@ __metadata:
     "@lumino/properties": ^2.0.1
     "@lumino/signaling": ^2.1.2
     "@lumino/widgets": ^2.3.0
-  checksum: fc7f49b09ad8104fd0ac022366877eee228beb63f237afa76e785e170cb17e9ae18a686e7ac09f5f74bf25735ebc089812ea9374cc7920f4a0a641b9d565a046
+  checksum: ea5ff9052408a117f5a74ce5c3938cda53f88d3dd227bea330cf042b69094c17d33d0b64d556f31b763bfe352bde29dc977cdaab69337159f0c9d9301e50a632
   languageName: node
   linkType: hard
 
-"@jupyterlab/rendermime-interfaces@npm:^3.8.5":
-  version: 3.8.5
-  resolution: "@jupyterlab/rendermime-interfaces@npm:3.8.5"
+"@jupyterlab/rendermime-interfaces@npm:^3.8.7":
+  version: 3.8.7
+  resolution: "@jupyterlab/rendermime-interfaces@npm:3.8.7"
   dependencies:
     "@lumino/coreutils": ^1.11.0 || ^2.1.2
     "@lumino/widgets": ^1.37.2 || ^2.3.0
-  checksum: 3824c1aa0fa4b946211fd342ff73b0ebc7722dfeaf9794a8c64740dcc53151c0e6b81468f92d83fbe9a6da75d54fe4b176bd3ec98e1a526b50bbc0f91057c1aa
+  checksum: 8095fc99f89e49ef6793e37d7864511cc182fd2260219d3fe94dc974ac34411d4daf898f237279bd5e097aea19cca04196356bf31bd774e94c77b54894baf71b
   languageName: node
   linkType: hard
 
-"@jupyterlab/rendermime@npm:^4.0.5":
-  version: 4.0.5
-  resolution: "@jupyterlab/rendermime@npm:4.0.5"
-  dependencies:
-    "@jupyterlab/apputils": ^4.1.5
-    "@jupyterlab/coreutils": ^6.0.5
-    "@jupyterlab/nbformat": ^4.0.5
-    "@jupyterlab/observables": ^5.0.5
-    "@jupyterlab/rendermime-interfaces": ^3.8.5
-    "@jupyterlab/services": ^7.0.5
-    "@jupyterlab/translation": ^4.0.5
+"@jupyterlab/rendermime@npm:^4.0.7":
+  version: 4.0.7
+  resolution: "@jupyterlab/rendermime@npm:4.0.7"
+  dependencies:
+    "@jupyterlab/apputils": ^4.1.7
+    "@jupyterlab/coreutils": ^6.0.7
+    "@jupyterlab/nbformat": ^4.0.7
+    "@jupyterlab/observables": ^5.0.7
+    "@jupyterlab/rendermime-interfaces": ^3.8.7
+    "@jupyterlab/services": ^7.0.7
+    "@jupyterlab/translation": ^4.0.7
     "@lumino/coreutils": ^2.1.2
     "@lumino/messaging": ^2.0.1
     "@lumino/signaling": ^2.1.2
     "@lumino/widgets": ^2.3.0
     lodash.escape: ^4.0.1
-  checksum: 472e25ebdee77599a90fef33402ef7c8f05d3c5266c9617805602b4e26022962e8973d55ab0b11bc24982c3aea1dc7d0b151064c822c2d1093111c17e87d1e80
+  checksum: 8e7bc7dc8d569fa8748783d0d23b716deb64af530d2f6861f6a08fe66ace5ff0d75e3cc67eb4ebb50b2089574917fe0b65da0dcf5368c3539fdb78f595560885
   languageName: node
   linkType: hard
 
-"@jupyterlab/services@npm:^7.0.5":
-  version: 7.0.5
-  resolution: "@jupyterlab/services@npm:7.0.5"
+"@jupyterlab/services@npm:^7.0.7":
+  version: 7.0.7
+  resolution: "@jupyterlab/services@npm:7.0.7"
   dependencies:
     "@jupyter/ydoc": ^1.0.2
-    "@jupyterlab/coreutils": ^6.0.5
-    "@jupyterlab/nbformat": ^4.0.5
-    "@jupyterlab/settingregistry": ^4.0.5
-    "@jupyterlab/statedb": ^4.0.5
+    "@jupyterlab/coreutils": ^6.0.7
+    "@jupyterlab/nbformat": ^4.0.7
+    "@jupyterlab/settingregistry": ^4.0.7
+    "@jupyterlab/statedb": ^4.0.7
     "@lumino/coreutils": ^2.1.2
     "@lumino/disposable": ^2.1.2
     "@lumino/polling": ^2.1.2
     "@lumino/properties": ^2.0.1
     "@lumino/signaling": ^2.1.2
     ws: ^8.11.0
-  checksum: cf4176dbb73c08e777b5e6ca26cba6ad7a142fc76ae6b46ef17ac7d8c8021f62d66e95e2ee0dbce5c33a0b2380750d440783d0398d787b8e8028920e04dd1d0b
+  checksum: 203f9e9eeab55eac9251c43d14ebaad881e8152a1337156ed7f2abbada54177237128c108f91a49f45df00226df8ba6a374d02afbd3bbd80ebb795cb5bc62e23
   languageName: node
   linkType: hard
 
-"@jupyterlab/settingregistry@npm:^4.0.5":
-  version: 4.0.5
-  resolution: "@jupyterlab/settingregistry@npm:4.0.5"
+"@jupyterlab/settingregistry@npm:^4.0.7":
+  version: 4.0.7
+  resolution: "@jupyterlab/settingregistry@npm:4.0.7"
   dependencies:
-    "@jupyterlab/nbformat": ^4.0.5
-    "@jupyterlab/statedb": ^4.0.5
+    "@jupyterlab/nbformat": ^4.0.7
+    "@jupyterlab/statedb": ^4.0.7
     "@lumino/commands": ^2.1.3
     "@lumino/coreutils": ^2.1.2
     "@lumino/disposable": ^2.1.2
@@ -863,28 +872,28 @@ __metadata:
     json5: ^2.2.3
   peerDependencies:
     react: ">=16"
-  checksum: b7d686e0f9629f25f423fbd114e598f5af2ae1cc7b683f3e236ff8c94f6d05b20e13ee4555e0eba6277b58fbcdf3c75dbcd66d4e79884b49bed649372d871540
+  checksum: f13dd888c42ccbcb1764037e94ea6b9ee6aa82a232cbb0d8b506212b9e9d5d58965215768110f83a310585482d71dfb649a7c2bbb187553d39dd1292b5919dbe
   languageName: node
   linkType: hard
 
-"@jupyterlab/statedb@npm:^4.0.5":
-  version: 4.0.5
-  resolution: "@jupyterlab/statedb@npm:4.0.5"
+"@jupyterlab/statedb@npm:^4.0.7":
+  version: 4.0.7
+  resolution: "@jupyterlab/statedb@npm:4.0.7"
   dependencies:
     "@lumino/commands": ^2.1.3
     "@lumino/coreutils": ^2.1.2
     "@lumino/disposable": ^2.1.2
     "@lumino/properties": ^2.0.1
     "@lumino/signaling": ^2.1.2
-  checksum: 8e01de74a2168d19124773fa2b72329cfb43601c702127845a4172e87ee67b1304d34f53f65a6db214d832bd8c244c333936a22e08bbf1ea02e458e245140f62
+  checksum: 4f4217fa1fceb40be8837cb450b1e66d4f6758531603c82ac277412ec43e3b94a5207bdeb74339307509a1b059ae6436d653beaff2fadfbc8136434ff0967190
   languageName: node
   linkType: hard
 
-"@jupyterlab/statusbar@npm:^4.0.5":
-  version: 4.0.5
-  resolution: "@jupyterlab/statusbar@npm:4.0.5"
+"@jupyterlab/statusbar@npm:^4.0.7":
+  version: 4.0.7
+  resolution: "@jupyterlab/statusbar@npm:4.0.7"
   dependencies:
-    "@jupyterlab/ui-components": ^4.0.5
+    "@jupyterlab/ui-components": ^4.0.7
     "@lumino/algorithm": ^2.0.1
     "@lumino/coreutils": ^2.1.2
     "@lumino/disposable": ^2.1.2
@@ -892,52 +901,52 @@ __metadata:
     "@lumino/signaling": ^2.1.2
     "@lumino/widgets": ^2.3.0
     react: ^18.2.0
-  checksum: eac3bc5cc191885fe0fb35466a015ecd8df103a38bc8fac0e2a2c0c7bc783d47e43a31679f83777c0a059091988d9dd2e191624c774fd32cb80c05f2d1166163
+  checksum: 7a2f75215789722a7b9a63548e91a1b179e8c315513d1b8741b508a58937569d723f2207bf542400674767246ad871432a09d1e87779151e43fa3749aa1ade06
   languageName: node
   linkType: hard
 
-"@jupyterlab/toc@npm:^6.0.5":
-  version: 6.0.5
-  resolution: "@jupyterlab/toc@npm:6.0.5"
+"@jupyterlab/toc@npm:^6.0.7":
+  version: 6.0.7
+  resolution: "@jupyterlab/toc@npm:6.0.7"
   dependencies:
-    "@jupyterlab/apputils": ^4.1.5
-    "@jupyterlab/coreutils": ^6.0.5
-    "@jupyterlab/docregistry": ^4.0.5
-    "@jupyterlab/observables": ^5.0.5
-    "@jupyterlab/rendermime": ^4.0.5
-    "@jupyterlab/translation": ^4.0.5
-    "@jupyterlab/ui-components": ^4.0.5
+    "@jupyterlab/apputils": ^4.1.7
+    "@jupyterlab/coreutils": ^6.0.7
+    "@jupyterlab/docregistry": ^4.0.7
+    "@jupyterlab/observables": ^5.0.7
+    "@jupyterlab/rendermime": ^4.0.7
+    "@jupyterlab/translation": ^4.0.7
+    "@jupyterlab/ui-components": ^4.0.7
     "@lumino/coreutils": ^2.1.2
     "@lumino/disposable": ^2.1.2
     "@lumino/messaging": ^2.0.1
     "@lumino/signaling": ^2.1.2
     "@lumino/widgets": ^2.3.0
     react: ^18.2.0
-  checksum: 4b688fdd2aa0d14db02394bafcbae5e0ce632681e8541ff3ca6153ba0e219dc20cb99f03ef4ac25f849b4b7b23f3e168e50a450bf952f42b0418e2e42aaeb546
+  checksum: 6d0c17f79f8d077074a20d78f81fdda010f43edd5ffa423837c90dc9edd6810f7b7445c008ff7f0b04f917e6d37d76c7817bd1b2cedda48961c3e8c0553bbc16
   languageName: node
   linkType: hard
 
-"@jupyterlab/translation@npm:^4.0.5":
-  version: 4.0.5
-  resolution: "@jupyterlab/translation@npm:4.0.5"
+"@jupyterlab/translation@npm:^4.0.7":
+  version: 4.0.7
+  resolution: "@jupyterlab/translation@npm:4.0.7"
   dependencies:
-    "@jupyterlab/coreutils": ^6.0.5
-    "@jupyterlab/rendermime-interfaces": ^3.8.5
-    "@jupyterlab/services": ^7.0.5
-    "@jupyterlab/statedb": ^4.0.5
+    "@jupyterlab/coreutils": ^6.0.7
+    "@jupyterlab/rendermime-interfaces": ^3.8.7
+    "@jupyterlab/services": ^7.0.7
+    "@jupyterlab/statedb": ^4.0.7
     "@lumino/coreutils": ^2.1.2
-  checksum: ba879b7ed27f9398f409333624f679ad4c6d02f668a832eb7ee0cc27998e17d12938192dc32cdf74eff9c1b76116215543b1218093c32717d465568794b49660
+  checksum: 15ad212d9447049f5d77d24681018efd52e61b861e73cdba4b09f4530801bdfa317c0eadde0b71016a9f45b68fbf91f723f9a63de9cbbe568c88923a9676ffab
   languageName: node
   linkType: hard
 
-"@jupyterlab/ui-components@npm:^4.0.5":
-  version: 4.0.5
-  resolution: "@jupyterlab/ui-components@npm:4.0.5"
+"@jupyterlab/ui-components@npm:^4.0.7":
+  version: 4.0.7
+  resolution: "@jupyterlab/ui-components@npm:4.0.7"
   dependencies:
-    "@jupyterlab/coreutils": ^6.0.5
-    "@jupyterlab/observables": ^5.0.5
-    "@jupyterlab/rendermime-interfaces": ^3.8.5
-    "@jupyterlab/translation": ^4.0.5
+    "@jupyterlab/coreutils": ^6.0.7
+    "@jupyterlab/observables": ^5.0.7
+    "@jupyterlab/rendermime-interfaces": ^3.8.7
+    "@jupyterlab/translation": ^4.0.7
     "@lumino/algorithm": ^2.0.1
     "@lumino/commands": ^2.1.3
     "@lumino/coreutils": ^2.1.2
@@ -955,7 +964,7 @@ __metadata:
     typestyle: ^2.0.4
   peerDependencies:
     react: ^18.2.0
-  checksum: 4dfae7b37d7e7b58b83bdc75d260126fcdabfb9fd52cc3f04e3bf3c481c8f05c3b3323953389408f793ec7ec6580fd582667a83ab906a308361f0f20f766ad7a
+  checksum: 92e722b8b4fe96a1df6644de8f955fdf48f2bf568a5aaf5f450f721659afc0ecdd9c89f833d73cbad8684849caec4316d4c6b6b0575e7da5a6c3058f5e99d03e
   languageName: node
   linkType: hard